diff options
author | Elza Mathew <elza.mathew@intel.com> | 2016-08-08 12:36:09 -0700 |
---|---|---|
committer | Elza Mathew <elza.mathew@intel.com> | 2016-08-08 15:14:47 -0700 |
commit | 5d7ae6ad224dab352219e3a60d40f0ed5af2be22 (patch) | |
tree | 1d9696c32ae8b1a5dbc27895fefddc359653ffb2 | |
parent | bee3dc863f8f2f23b4a35cd0838ba677451b45d7 (diff) |
[router] Link state events
This patch introduces a method to listen to link state events.
The method invokes callback functions to set the interface
flags.
Change-Id: I284bc5dd92a38c91f093d6709fb43b6b5ae57c56
Signed-off-by: Elza Mathew <elza.mathew@intel.com>
-rw-r--r-- | router/router/router.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/router/router/router.c b/router/router/router.c index 7145d29..5df86f0 100644 --- a/router/router/router.c +++ b/router/router/router.c @@ -24,6 +24,7 @@ #include <vnet/unix/tuntap.h> #include <librtnl/mapper.h> #include <vnet/ethernet/arp_packet.h> +#include <vlibmemory/api.h> enum { NEXT_UNTAPPED = 0, @@ -393,6 +394,50 @@ static void add_del_route(ns_route_t *r, int is_del) (ip4_address_t *)r->gateway, sw_if_index, 0, ~0, 0); } +struct set_flags_args { + u32 sw_if_index; + u8 flags; +}; + +static void set_interface_flags_callback(struct set_flags_args *a) +{ + vnet_sw_interface_set_flags(rm.vnet_main, a->sw_if_index, + a->flags); +} + +static void add_del_link(ns_link_t *l, int is_del) +{ + struct tap_to_iface *map = NULL; + u32 sw_if_index = ~0; + u8 flags = 0; + struct set_flags_args args; + vnet_sw_interface_t *sw = NULL; + + vec_foreach(map, rm.tap_to_iface) { + if (l->ifi.ifi_index == map->tap) { + sw_if_index = map->iface; + break; + } + } + + if (sw_if_index == ~0) + return; + + sw = vnet_get_sw_interface(rm.vnet_main, sw_if_index); + flags = sw->flags; + + if (l->ifi.ifi_flags & IFF_UP) + flags |= VNET_SW_INTERFACE_FLAG_ADMIN_UP; + else + flags &= ~VNET_SW_INTERFACE_FLAG_ADMIN_UP; + + args.sw_if_index = sw_if_index; + args.flags = flags; + + vl_api_rpc_call_main_thread(set_interface_flags_callback, + (u8 *) &args, sizeof(args)); +} + static void netns_notify_cb(void *obj, netns_type_t type, u32 flags, uword opaque) { @@ -400,6 +445,8 @@ netns_notify_cb(void *obj, netns_type_t type, u32 flags, uword opaque) add_del_addr((ns_addr_t *)obj, flags & NETNS_F_DEL); else if (type == NETNS_TYPE_ROUTE) add_del_route((ns_route_t *)obj, flags & NETNS_F_DEL); + else if (type == NETNS_TYPE_LINK) + add_del_link((ns_link_t *)obj, flags & NETNS_F_DEL); } static void insert_tap_to_iface(u32 tap, u32 iface) |