Skip to content

Commit

Permalink
Merge pull request #886 from Igalia/yang-counters
Browse files Browse the repository at this point in the history
Unify lwAFTR and other state query around YANG
  • Loading branch information
wingo authored Aug 4, 2017
2 parents dc35b69 + 37268cc commit b152b59
Show file tree
Hide file tree
Showing 12 changed files with 158 additions and 291 deletions.
19 changes: 10 additions & 9 deletions src/apps/config/leader.lua
Original file line number Diff line number Diff line change
Expand Up @@ -470,12 +470,12 @@ function Leader:foreign_rpc_get_state (schema_name, path, format,
print_default)
path = path_mod.normalize_path(path)
local translate = self:get_translator(schema_name)
local native_state = state.show_state(self.schema_name, S.getpid(), "/")
local native_state = state.read_state(self.schema_name, S.getpid())
local foreign_state = translate.get_state(native_state)
local printer = path_printer_for_schema_by_name(
schema_name, path, false, format, print_default)
local config = printer(foreign_state, yang.string_output_file())
return { state = config }
local state = printer(foreign_state, yang.string_output_file())
return { state = state }
end
function Leader:foreign_rpc_set_config (schema_name, path, config_str)
path = path_mod.normalize_path(path)
Expand Down Expand Up @@ -558,17 +558,18 @@ end
function Leader:rpc_get_state (args)
local function getter()
if args.schema ~= self.schema_name then
return self:foreign_rpc_get_state(args.schema, args.path, args)
return self:foreign_rpc_get_state(args.schema, args.path,
args.format, args.print_default)
end
local printer = path_printer_for_schema_by_name(
self.schema_name, args.path, false, args.format, args.print_default)
local s = {}
local states = {}
for _, follower in pairs(self.followers) do
for k,v in pairs(state.show_state(self.schema_name, follower.pid, args.path)) do
s[k] = v
end
table.insert(states, state.read_state(self.schema_name, follower.pid))
end
return {state=printer(s, yang.string_output_file())}
-- FIXME: How to combine states? Add counters?
local state = printer(states[1], yang.string_output_file())
return { state = state }
end
local success, response = pcall(getter)
if success then return response else return {status=1, error=response} end
Expand Down
136 changes: 24 additions & 112 deletions src/apps/lwaftr/lwcounter.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ module(..., package.seeall)

local counter = require("core.counter")
local shm = require("core.shm")
local schema = require('lib.yang.schema')
local data = require('lib.yang.data')
local state = require('lib.yang.state')
local S = require('syscall')

-- COUNTERS
-- The lwAFTR counters all live in the same directory, and their filenames are
Expand All @@ -13,123 +17,31 @@ local shm = require("core.shm")
-- - protocol+version: "icmpv4", "icmpv6", "ipv4", "ipv6";
-- - size: "bytes", "packets".
counters_dir = "apps/lwaftr/"
-- Referenced by program/check/check.lua
counter_names = {

-- All incoming traffic.
"in-ipv4-bytes",
"in-ipv4-packets",
"in-ipv6-bytes",
"in-ipv6-packets",

-- Outgoing traffic, including internally generated ICMP error packets.
"out-ipv4-bytes",
"out-ipv4-packets",
"out-ipv6-bytes",
"out-ipv6-packets",

-- Internally generated ICMP error packets.
"out-icmpv4-bytes",
"out-icmpv4-packets",
"out-icmpv6-bytes",
"out-icmpv6-packets",

-- Hairpinned traffic.
"hairpin-ipv4-bytes",
"hairpin-ipv4-packets",

-- Dropped v4 traffic.

-- All dropped traffic on the IPv4 interface.
"drop-all-ipv4-iface-bytes",
"drop-all-ipv4-iface-packets",
-- On IPv4 link, but not IPv4.
"drop-misplaced-not-ipv4-bytes",
"drop-misplaced-not-ipv4-packets",
-- No matching destination softwire.
"drop-no-dest-softwire-ipv4-bytes",
"drop-no-dest-softwire-ipv4-packets",
-- TTL is zero.
"drop-ttl-zero-ipv4-bytes",
"drop-ttl-zero-ipv4-packets",
-- Big packets exceeding MTU, but DF (Don't Fragment) flag set.
"drop-over-mtu-but-dont-fragment-ipv4-bytes",
"drop-over-mtu-but-dont-fragment-ipv4-packets",
-- Bad checksum on ICMPv4 packets.
"drop-bad-checksum-icmpv4-bytes",
"drop-bad-checksum-icmpv4-packets",
-- Incoming ICMPv4 packets with no destination (RFC 7596 section 8.1)
"drop-in-by-rfc7596-icmpv4-bytes",
"drop-in-by-rfc7596-icmpv4-packets",
-- Policy of dropping incoming ICMPv4 packets.
"drop-in-by-policy-icmpv4-bytes",
"drop-in-by-policy-icmpv4-packets",
-- Policy of dropping outgoing ICMPv4 error packets.
-- Not counting bytes because we do not even generate the packets.
"drop-out-by-policy-icmpv4-packets",

-- Drop v6.

-- All dropped traffic on the IPv4 interface.
"drop-all-ipv6-iface-bytes",
"drop-all-ipv6-iface-packets",
-- On IPv6 link, but not IPv6.
"drop-misplaced-not-ipv6-bytes",
"drop-misplaced-not-ipv6-packets",
-- Unknown IPv6 protocol.
"drop-unknown-protocol-ipv6-bytes",
"drop-unknown-protocol-ipv6-packets",
-- No matching source softwire.
"drop-no-source-softwire-ipv6-bytes",
"drop-no-source-softwire-ipv6-packets",
-- Unknown ICMPv6 type.
"drop-unknown-protocol-icmpv6-bytes",
"drop-unknown-protocol-icmpv6-packets",
-- "Packet too big" ICMPv6 type but not code.
"drop-too-big-type-but-not-code-icmpv6-bytes",
"drop-too-big-type-but-not-code-icmpv6-packets",
-- Time-limit-exceeded, but not hop limit on ICMPv6 packet.
"drop-over-time-but-not-hop-limit-icmpv6-bytes",
"drop-over-time-but-not-hop-limit-icmpv6-packets",
-- Drop outgoing ICMPv6 error packets because of rate limit reached.
"drop-over-rate-limit-icmpv6-bytes",
"drop-over-rate-limit-icmpv6-packets",
-- Policy of dropping incoming ICMPv6 packets.
"drop-in-by-policy-icmpv6-bytes",
"drop-in-by-policy-icmpv6-packets",
-- Policy of dropping outgoing ICMPv6 error packets.
-- Not counting bytes because we do not even generate the packets.
"drop-out-by-policy-icmpv6-packets",

-- Reassembly counters
"in-ipv4-frag-needs-reassembly",
"in-ipv4-frag-reassembled",
"in-ipv4-frag-reassembly-unneeded",
"drop-ipv4-frag-disabled",
"drop-ipv4-frag-invalid-reassembly",
"drop-ipv4-frag-random-evicted",
"out-ipv4-frag",
"out-ipv4-frag-not",
"memuse-ipv4-frag-reassembly-buffer",

"in-ipv6-frag-needs-reassembly",
"in-ipv6-frag-reassembled",
"in-ipv6-frag-reassembly-unneeded",
"drop-ipv6-frag-disabled",
"drop-ipv6-frag-invalid-reassembly",
"drop-ipv6-frag-random-evicted",
"out-ipv6-frag",
"out-ipv6-frag-not",
"memuse-ipv6-frag-reassembly-buffer",
function counter_names ()
local names = {}
local schema = schema.load_schema_by_name('snabb-softwire-v2')
for k, node in pairs(schema.body['softwire-state'].body) do
if node.kind == 'leaf' then
names[k] = data.normalize_id(k)
end
end
return names
end

-- Ingress packet drops
"ingress-packet-drops",
}
function read_counters (pid)
local s = state.read_state('snabb-softwire-v2', pid or S.getpid())
local ret = {}
for k, id in pairs(counter_names()) do
ret[k] = s.softwire_state[id]
end
return ret
end

function init_counters ()
local counters = {}
for _, name in ipairs(counter_names) do
counters[name] = {counter}
for k, id in pairs(counter_names()) do
counters[k] = {counter}
end
return shm.create_frame(counters_dir, counters)
end
2 changes: 1 addition & 1 deletion src/lib/yang/data.lua
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ local function identityref_validator(bases, default_prefix, f)
end
end

local function value_parser(typ)
function value_parser(typ)
local prim = typ.primitive_type
local parse = assert(value.types[prim], prim).parse
local validate = function(val) return val end
Expand Down
Loading

0 comments on commit b152b59

Please sign in to comment.