diff options
author | Juraj Sloboda <jsloboda@cisco.com> | 2018-05-03 10:03:50 +0200 |
---|---|---|
committer | Ole Trøan <otroan@employees.org> | 2018-05-14 10:20:24 +0000 |
commit | 5257452d38a3441b5cc22c010c3c586523919433 (patch) | |
tree | bed9790d8d7f20f73f9b38a68873e079e5525194 /src/vnet/ip/ip6_neighbor.h | |
parent | 17e5cfbe8d9b1f47b18eb1a43976fe322e3987a2 (diff) |
Rework CP and DP communication in IPv6 RD (VPP-1256)
Replace binary API communication between CP and DP with
direct communication using function calls and callbacks.
Change-Id: Ib54f09062217c028e5ee0e96ae2449cf7e9224e3
Signed-off-by: Juraj Sloboda <jsloboda@cisco.com>
Diffstat (limited to 'src/vnet/ip/ip6_neighbor.h')
-rw-r--r-- | src/vnet/ip/ip6_neighbor.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/vnet/ip/ip6_neighbor.h b/src/vnet/ip/ip6_neighbor.h index 753de56072e..27d8cb27eae 100644 --- a/src/vnet/ip/ip6_neighbor.h +++ b/src/vnet/ip/ip6_neighbor.h @@ -138,6 +138,66 @@ typedef struct void ra_set_publisher_node (uword node_index, uword event_type); +typedef struct _vnet_ip6_neighbor_function_list_elt +{ + struct _vnet_ip6_neighbor_function_list_elt *next_ip6_neighbor_function; + clib_error_t *(*fp) (void *data); +} _vnet_ip6_neighbor_function_list_elt_t; + +typedef struct +{ + _vnet_ip6_neighbor_function_list_elt_t *ra_report_functions; +} ip6_neighbor_public_main_t; + +extern ip6_neighbor_public_main_t ip6_neighbor_public_main; + +#define _VNET_IP6_NEIGHBOR_FUNCTION_DECL(f,tag) \ + \ +static void __vnet_ip6_neighbor_function_init_##tag##_##f (void) \ + __attribute__((__constructor__)) ; \ + \ +static void __vnet_ip6_neighbor_function_init_##tag##_##f (void) \ +{ \ + ip6_neighbor_public_main_t * nm = &ip6_neighbor_public_main; \ + static _vnet_ip6_neighbor_function_list_elt_t init_function; \ + init_function.next_ip6_neighbor_function = nm->tag##_functions; \ + nm->tag##_functions = &init_function; \ + init_function.fp = (void *) &f; \ +} \ + \ +static void __vnet_ip6_neighbor_function_deinit_##tag##_##f (void) \ + __attribute__((__destructor__)) ; \ + \ +static void __vnet_ip6_neighbor_function_deinit_##tag##_##f (void) \ +{ \ + ip6_neighbor_public_main_t * nm = &ip6_neighbor_public_main; \ + _vnet_ip6_neighbor_function_list_elt_t *next; \ + if (nm->tag##_functions->fp == (void *) &f) \ + { \ + nm->tag##_functions = \ + nm->tag##_functions->next_ip6_neighbor_function; \ + return; \ + } \ + next = nm->tag##_functions; \ + while (next->next_ip6_neighbor_function) \ + { \ + if (next->next_ip6_neighbor_function->fp == (void *) &f) \ + { \ + next->next_ip6_neighbor_function = \ + next->next_ip6_neighbor_function->next_ip6_neighbor_function; \ + return; \ + } \ + next = next->next_ip6_neighbor_function; \ + } \ +} + +#define VNET_IP6_NEIGHBOR_RA_FUNCTION(f) \ + _VNET_IP6_NEIGHBOR_FUNCTION_DECL(f,ra_report) + +clib_error_t *call_ip6_neighbor_callbacks (void *data, + _vnet_ip6_neighbor_function_list_elt_t + * elt); + #endif /* included_ip6_neighbor_h */ /* |