From 800013b787cfb464d674caec96163a5e66de3c71 Mon Sep 17 00:00:00 2001 From: Thomas Graf Date: Thu, 11 Nov 2010 16:02:48 +0100 Subject: [PATCH] link: Support for AF_BRIDGE address family Supports parsing of IFLA_PROTINFO returned when dumping with PF_BRIDGE --- lib/Makefile.am | 1 + lib/route/link/bridge.c | 93 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 lib/route/link/bridge.c diff --git a/lib/Makefile.am b/lib/Makefile.am index 6cfce33..c1277be 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -59,6 +59,7 @@ libnl_route_la_SOURCES = \ route/cls/ematch/meta.c \ \ route/link/api.c route/link/vlan.c \ + route/link/bridge.c \ \ route/sch/blackhole.c route/sch/cbq.c route/sch/dsmark.c \ route/sch/fifo.c route/sch/htb.c route/sch/netem.c route/sch/prio.c \ diff --git a/lib/route/link/bridge.c b/lib/route/link/bridge.c new file mode 100644 index 0000000..4e4da58 --- /dev/null +++ b/lib/route/link/bridge.c @@ -0,0 +1,93 @@ +/* + * lib/route/link/bridge.c AF_BRIDGE link oeprations + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * Copyright (c) 2010 Thomas Graf + */ + +/** + * @ingroup link + * @defgroup link_bridge Bridge Specifics + * @brief + * + * @{ + */ + +#include +#include +#include +#include +#include + +struct bridge_data +{ + uint8_t b_port_state; +}; + +static void *bridge_alloc(struct rtnl_link *link) +{ + return calloc(1, sizeof(struct bridge_data)); +} + +static void *bridge_clone(struct rtnl_link *link, void *data) +{ + struct bridge_data *bd; + + if ((bd = bridge_alloc(link))) + memcpy(bd, data, sizeof(*bd)); + + return bd; +} + +static void bridge_free(struct rtnl_link *link, void *data) +{ + free(data); +} + +static int bridge_parse_protinfo(struct rtnl_link *link, struct nlattr *attr, + void *data) +{ + struct bridge_data *bd = data; + + bd->b_port_state = nla_get_u8(attr); + + return 0; +} + +static void bridge_dump_details(struct rtnl_link *link, + struct nl_dump_params *p, void *data) +{ + struct bridge_data *bd = data; + + nl_dump(p, "port-state %u ", bd->b_port_state); +} + +static const struct nla_policy protinfo_policy = { + .type = NLA_U8, +}; + +static struct rtnl_link_af_ops bridge_ops = { + .ao_family = AF_BRIDGE, + .ao_alloc = &bridge_alloc, + .ao_clone = &bridge_clone, + .ao_free = &bridge_free, + .ao_parse_protinfo = &bridge_parse_protinfo, + .ao_dump[NL_DUMP_DETAILS] = &bridge_dump_details, + .ao_protinfo_policy = &protinfo_policy, +}; + +static void __init bridge_init(void) +{ + rtnl_link_af_register(&bridge_ops); +} + +static void __exit bridge_exit(void) +{ + rtnl_link_af_unregister(&bridge_ops); +} + +/** @} */