|
FD.io VPP
v21.10.1-2-g0a485f517
Vector Packet Processing
|
Go to the documentation of this file.
26 #define dhcpv6_proxy_error(n,s) s,
28 #undef dhcpv6_proxy_error
31 #define foreach_dhcpv6_proxy_to_server_input_next \
32 _ (DROP, "error-drop") \
33 _ (LOOKUP, "ip6-lookup") \
34 _ (SEND_TO_CLIENT, "dhcpv6-proxy-to-client")
39 #define _(s,n) DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_##s,
70 s =
format (s,
"DHCPV6 proxy: sent to server %U",
73 s =
format (s,
"DHCPV6 proxy: sent to client from %U",
78 s =
format (s,
" original_sw_if_index: %d, sw_if_index: %d\n",
88 u32 max_header_bytes = va_arg (*args,
u32);
91 header_bytes =
sizeof (
h[0]);
92 if (max_header_bytes != 0 && header_bytes > max_header_bytes)
93 return format (s,
"dhcpv6 header truncated");
95 s =
format (s,
"DHCPV6 Proxy");
101 static ip6_address_t *
106 ip6_address_t *result = 0;
113 if ((
a->as_u8[0] & 0xe0) == 0x20 ||
114 (
a->as_u8[0] & 0xfe) == 0xfc) {
126 dst->as_u64[0] =
src->as_u64[0];
127 dst->as_u64[1] =
src->as_u64[1];
139 u32 pkts_to_server = 0, pkts_to_client = 0, pkts_no_server = 0;
140 u32 pkts_no_interface_address = 0, pkts_no_exceeding_max_hop = 0;
141 u32 pkts_no_src_address = 0;
142 u32 pkts_wrong_msg_type = 0;
143 u32 pkts_too_big = 0;
149 u32 rx_fib_idx = 0, server_fib_idx = 0;
163 u32 rx_sw_if_index = 0;
170 ip6_address_t _ia0, *ia0 = &_ia0;
173 dhcpv6_option_t *fwd_opt;
174 dhcpv6_relay_hdr_t *r1;
176 dhcpv6_int_id_t *id1;
178 dhcpv6_client_mac_t *cmac;
180 u8 client_src_mac[6];
195 u0 = (
void *) h0 - (
sizeof (*u0));
196 ip0 = (
void *) u0 - (
sizeof (*ip0));
216 next0 = DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_SEND_TO_CLIENT;
222 pkts_wrong_msg_type++;
223 error0 = DHCPV6_PROXY_ERROR_WRONG_MESSAGE_TYPE;
224 next0 = DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_DROP;
232 rx_fib_idx =
im->mfib_index_by_sw_if_index[rx_sw_if_index];
237 error0 = DHCPV6_PROXY_ERROR_NO_SERVER;
238 next0 = DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_DROP;
266 fwd_opt->length = clib_host_to_net_u16 (
len);
267 fwd_opt->option = clib_host_to_net_u16 (DHCPV6_OPTION_RELAY_MSG);
276 next0 = DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_DROP;
277 pkts_no_exceeding_max_hop++;
288 r1->link_addr.as_u64[0] = 0;
289 r1->link_addr.as_u64[1] = 0;
290 goto link_address_set;
307 error0 = DHCPV6_PROXY_ERROR_NO_INTERFACE_ADDRESS;
308 next0 = DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_DROP;
309 pkts_no_interface_address++;
318 sizeof (*vss1) +
sizeof (*cmac)) >
321 error0 = DHCPV6_PROXY_ERROR_PKT_TOO_BIG;
322 next0 = DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_DROP;
330 id1->opt.option = clib_host_to_net_u16 (DHCPV6_OPTION_INTERFACE_ID);
331 id1->opt.length = clib_host_to_net_u16 (
sizeof (rx_sw_if_index));
332 id1->int_idx = clib_host_to_net_u32 (rx_sw_if_index);
340 cmac->opt.length = clib_host_to_net_u16 (
sizeof (*cmac) -
344 (DHCPV6_OPTION_CLIENT_LINK_LAYER_ADDRESS);
345 cmac->link_type = clib_host_to_net_u16 (1);
347 u1->
length +=
sizeof (*cmac);
355 u16 type_len =
sizeof (vss1->vss_type);
361 id_len =
sizeof (vss->
vpn_id);
362 memcpy (vss1->data, vss->
vpn_id, id_len);
372 vss1->opt.option = clib_host_to_net_u16 (DHCPV6_OPTION_VSS);
373 vss1->opt.length = clib_host_to_net_u16 (type_len + id_len);
374 u1->
length += type_len + id_len +
sizeof (vss1->opt);
380 u1->
src_port = clib_host_to_net_u16 (UDP_DST_PORT_dhcpv6_to_client);
381 u1->
dst_port = clib_host_to_net_u16 (UDP_DST_PORT_dhcpv6_to_server);
384 clib_host_to_net_u16 (clib_net_to_host_u16 (fwd_opt->length) +
385 sizeof (*r1) +
sizeof (*fwd_opt) +
386 sizeof (*u1) +
sizeof (*id1) + u1->
length);
389 ip1->ip_version_traffic_class_and_flow_label = 0x60;
390 ip1->payload_length = u1->
length;
407 error0 = DHCPV6_PROXY_ERROR_NO_SRC_ADDRESS;
408 next0 = DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_DROP;
409 pkts_no_src_address++;
418 ASSERT (bogus_length == 0);
420 next0 = DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_LOOKUP;
443 DHCPV6_PROXY_ERROR_ALLOC_FAIL, 1);
462 to_next, n_left_to_next,
474 if (next0 == DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_LOOKUP)
485 to_next, n_left_to_next);
499 if (DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_LOOKUP == next0)
510 to_next, n_left_to_next,
518 DHCPV6_PROXY_ERROR_RELAY_TO_CLIENT,
521 DHCPV6_PROXY_ERROR_RELAY_TO_SERVER,
524 DHCPV6_PROXY_ERROR_NO_INTERFACE_ADDRESS,
525 pkts_no_interface_address);
527 DHCPV6_PROXY_ERROR_WRONG_MESSAGE_TYPE,
528 pkts_wrong_msg_type);
530 DHCPV6_PROXY_ERROR_NO_SRC_ADDRESS,
531 pkts_no_src_address);
533 DHCPV6_PROXY_ERROR_PKT_TOO_BIG, pkts_too_big);
540 .name =
"dhcpv6-proxy-to-server",
542 .vector_size =
sizeof (
u32),
549 #define _(s,n) [DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_##s] = n,
557 .unformat_buffer = unformat_dhcpv6_proxy_header,
584 dhcpv6_relay_hdr_t *h0;
586 ip6_address_t _ia0, *ia0 = &_ia0;
587 ip6_address_t client_address;
594 u32 original_sw_if_index = ~0;
596 u32 inner_vlan = (
u32) ~ 0;
597 u32 outer_vlan = (
u32) ~ 0;
600 dhcpv6_option_t *r0 = 0, *o;
602 u8 interface_opt_flag = 0;
603 u8 relay_msg_opt_flag = 0;
605 u32 server_fib_idx, client_fib_idx;
616 error0 = DHCPV6_PROXY_ERROR_WRONG_MESSAGE_TYPE;
630 if (HOP_COUNT_LIMIT < h0->hop_count)
635 u0 = (
void *) h0 - (
sizeof (*u0));
636 ip0 = (
void *) u0 - (
sizeof (*ip0));
649 if (DHCPV6_OPTION_INTERFACE_ID == clib_net_to_host_u16 (o->option))
651 interface_opt_flag = 1;
652 if (clib_net_to_host_u16 (o->length) == sizeof (
sw_if_index))
654 clib_net_to_host_u32 (((dhcpv6_int_id_t *) o)->int_idx);
657 error0 = DHCPV6_PROXY_ERROR_WRONG_INTERFACE_ID_OPTION;
661 if (DHCPV6_OPTION_RELAY_MSG == clib_net_to_host_u16 (o->option))
663 relay_msg_opt_flag = 1;
666 if ((relay_msg_opt_flag == 1) && (interface_opt_flag == 1))
670 clib_net_to_host_u16 (o->length));
672 (dhcpv6_option_t *) (((
uword) o) +
673 clib_net_to_host_u16 (o->length) +
677 if ((relay_msg_opt_flag == 0) || (r0 == 0))
679 error0 = DHCPV6_PROXY_ERROR_NO_RELAY_MESSAGE_OPTION;
685 error0 = DHCPV6_PROXY_ERROR_NO_CIRCUIT_ID_OPTION;
697 error0 = DHCPV6_PROXY_ERROR_NO_SERVER;
701 server_fib_idx =
im->fib_index_by_sw_if_index
707 ip0->src_address.as_u64[0] == server->
dhcp_server.ip6.as_u64[0] &&
708 ip0->src_address.as_u64[1] == server->
dhcp_server.ip6.as_u64[1])
715 error0 = DHCPV6_PROXY_ERROR_BAD_SVR_FIB_OR_ADDRESS;
742 error0 = DHCPV6_PROXY_ERROR_NO_INTERFACE_ADDRESS;
746 len = clib_net_to_host_u16 (r0->length);
750 u1->
src_port = clib_net_to_host_u16 (UDP_DST_PORT_dhcpv6_to_server);
751 u1->
dst_port = clib_net_to_host_u16 (UDP_DST_PORT_dhcpv6_to_client);
755 ip0->ip_version_traffic_class_and_flow_label & 0x00000fff;
763 ASSERT (bogus_length == 0);
793 clib_net_to_host_u16 (0x88a8) : clib_net_to_host_u16 (0x8100);
794 u32 *vlan_tag = (
u32 *) (mac0 + 1);
795 *vlan_tag = clib_host_to_net_u32 (outer_vlan);
796 if (inner_vlan != (
u32) ~ 0)
798 u32 *inner_vlan_tag = (
u32 *) (vlan_tag + 1);
799 *inner_vlan_tag = clib_host_to_net_u32 (inner_vlan);
804 mac0->
type = clib_net_to_host_u16 (0x86dd);
834 .name =
"dhcpv6-proxy-to-client",
836 .vector_size =
sizeof (
u32),
843 .unformat_buffer = unformat_dhcpv6_proxy_header,
859 clib_host_to_net_u64 (0xFF05000000000000);
864 clib_host_to_net_u64 (0xFF02000000000000);
866 clib_host_to_net_u64 (0x00010002);
876 u32 rx_table_id,
u32 server_table_id,
int is_del)
879 u32 rx_fib_index = 0;
891 return VNET_API_ERROR_INVALID_DST_ADDRESS;
894 return VNET_API_ERROR_INVALID_SRC_ADDRESS;
903 addr, server_table_id))
921 .frp_sw_if_index = 0xffffffff,
928 rx_fib_index, server_table_id))
968 int set_server = 0, set_src_address = 0;
969 u32 rx_table_id = 0, server_table_id = 0;
976 else if (
unformat (input,
"src-address %U",
979 else if (
unformat (input,
"server-fib-id %d", &server_table_id))
981 else if (
unformat (input,
"rx-fib-id %d", &rx_table_id))
989 if (is_del || (set_server && set_src_address))
994 server_table_id, is_del);
1002 case VNET_API_ERROR_INVALID_DST_ADDRESS:
1005 case VNET_API_ERROR_INVALID_SRC_ADDRESS:
1008 case VNET_API_ERROR_NO_SUCH_ENTRY:
1010 (0,
"Fib id %d: no per-fib DHCP server configured", rx_table_id);
1023 .path =
"set dhcpv6 proxy",
1024 .short_help =
"set dhcpv6 proxy [del] server <ipv6-addr> src-address <ipv6-addr> "
1025 "[server-fib-id <fib-id>] [rx-fib-id <fib-id>] ",
1040 s =
format (s,
"%=14s%=16s%s",
"RX FIB",
"Src Address",
1041 "Servers FIB,Address");
1047 s =
format (s,
"%=14u%=16U",
1087 .path =
"show dhcpv6 proxy",
1088 .short_help =
"Display dhcpv6 proxy info",
1098 u8 *vpn_ascii_id = 0;
1099 u32 oui = 0, fib_id = 0, tbl_id = ~0;
1103 if (
unformat (input,
"table %d", &tbl_id))
1105 else if (
unformat (input,
"oui %d", &oui))
1107 else if (
unformat (input,
"vpn-id %d", &fib_id))
1109 else if (
unformat (input,
"vpn-ascii-id %s", &vpn_ascii_id))
1121 vpn_ascii_id, oui, fib_id, is_del);
1126 case VNET_API_ERROR_NO_SUCH_ENTRY:
1136 .path =
"set dhcpv6 vss",
1137 .short_help =
"set dhcpv6 vss table <table-id> [oui <n> vpn-id <n> | vpn-ascii-id <text>]",
1154 .path =
"show dhcpv6 vss",
1155 .short_help =
"show dhcpv6 VSS",
1178 swif->unnumbered_sw_if_index : sw_if_index0;
1190 "No IPv6 address configured on",
1202 .path =
"show dhcpv6 link-address interface",
1203 .short_help =
"show dhcpv6 link-address interface <interface>",
static clib_error_t * dhcpv6_vss_show_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vnet_interface_main_t * im
u8 vss_type
VSS type as defined in RFC 6607: 0 for NVT ASCII VPN Identifier 1 for RFC 2685 VPN-ID of 7 octects - ...
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
struct vnet_sub_interface_t::@374 eth
static ip6_address_t * ip6_interface_first_global_or_site_address(ip6_main_t *im, u32 sw_if_index)
vnet_sw_interface_type_t type
static uword dhcpv6_proxy_to_server_input(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
static uword dhcpv6_proxy_to_client_input(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame)
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
static ip6_mfib_t * ip6_mfib_get(u32 index)
Get the FIB at the given index.
A representation of a single DHCP Server within a given VRF config.
struct vnet_sub_interface_t::@374::@375::@377 flags
static dhcp_proxy_t * dhcp_get_proxy(dhcp_proxy_main_t *dm, u32 rx_fib_index, fib_protocol_t proto)
Get the DHCP proxy server data for the FIB index.
u16 ip6_tcp_udp_icmp_compute_checksum(vlib_main_t *vm, vlib_buffer_t *p0, ip6_header_t *ip0, int *bogus_lengthp)
static vlib_buffer_t * vlib_buffer_copy(vlib_main_t *vm, vlib_buffer_t *b)
#define clib_memcpy(d, s, n)
const ip46_address_t zero_addr
#include <vnet/feature/feature.h>
nat44_ei_hairpin_src_next_t next_index
static int dhcp6_proxy_show_walk(dhcp_proxy_t *proxy, void *ctx)
static vlib_node_registration_t dhcpv6_proxy_to_server_node
(constructor) VLIB_REGISTER_NODE (dhcpv6_proxy_to_server_node)
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
static vlib_cli_command_t dhcpv6_proxy_vss_show_command
(constructor) VLIB_CLI_COMMAND (dhcpv6_proxy_vss_show_command)
u8 * vpn_ascii_id
Type 0 ASCII VPN Identifier.
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
static clib_error_t * dhcpv6_proxy_set_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vlib_node_registration_t error_drop_node
(constructor) VLIB_REGISTER_NODE (error_drop_node)
static u8 * format_dhcpv6_proxy_trace(u8 *s, va_list *args)
static vlib_cli_command_t dhcpv6_proxy_show_command
(constructor) VLIB_CLI_COMMAND (dhcpv6_proxy_show_command)
Aggregate type for a prefix.
vlib_main_t vlib_node_runtime_t * node
@ VNET_SW_INTERFACE_TYPE_SUB
u32 mfib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id, mfib_source_t src)
Get the index of the FIB for a Table-ID.
static u8 * format_dhcpv6_proxy_header_with_length(u8 *s, va_list *args)
#define clib_error_return(e, args...)
int dhcp_proxy_set_vss(fib_protocol_t proto, u32 tbl_id, u8 vss_type, u8 *vpn_ascii_id, u32 oui, u32 vpn_index, u8 is_del)
Configure/set a new VSS info.
u16 fp_len
The mask length.
static vlib_cli_command_t dhcpv6_proxy_address_show_command
(constructor) VLIB_CLI_COMMAND (dhcpv6_proxy_address_show_command)
static char * dhcpv6_proxy_error_strings[]
A DHCP proxy representation fpr per-client VRF config.
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
int dhcp_proxy_server_del(fib_protocol_t proto, u32 rx_fib_index, ip46_address_t *addr, u32 server_table_id)
Delete a DHCP proxy config.
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
dhcpv6_proxy_to_server_input_next_t
The Virtual Sub-net Selection information for a given RX FIB.
vlib_main_t vlib_node_runtime_t vlib_frame_t * from_frame
dhcp_proxy_main_t dhcp_proxy_main
Shard 4/6 instance of DHCP main.
dpo_proto_t frp_proto
The protocol of the address below.
static clib_error_t * dhcpv6_proxy_show_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vlib_frame_t * vlib_get_frame_to_node(vlib_main_t *vm, u32 to_node_index)
static clib_error_t * dhcpv6_vss_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Collection of global DHCP proxy data.
static dhcp_vss_t * dhcp_get_vss_info(dhcp_proxy_main_t *dm, u32 rx_fib_index, fib_protocol_t proto)
Get the VSS data for the FIB index.
int dhcp6_proxy_set_server(ip46_address_t *addr, ip46_address_t *src_addr, u32 rx_table_id, u32 server_table_id, int is_del)
static vlib_node_registration_t dhcpv6_proxy_to_client_node
(constructor) VLIB_REGISTER_NODE (dhcpv6_proxy_to_client_node)
static ethernet_main_t * vnet_get_ethernet_main(void)
ethernet_interface_t * interfaces
i16 current_data
signed offset in data[], pre_data[] that we are currently processing.
void vlib_put_frame_to_node(vlib_main_t *vm, u32 to_node_index, vlib_frame_t *f)
A protocol Independent FIB table.
void mfib_table_lock(u32 fib_index, fib_protocol_t proto, mfib_source_t source)
Release a reference counting lock on the table.
static void vlib_buffer_advance(vlib_buffer_t *b, word l)
Advance current data pointer by the supplied (signed!) amount.
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static clib_error_t * dhcp6_proxy_init(vlib_main_t *vm)
vnet_main_t * vnet_get_main(void)
u32 ft_table_id
Table ID (hash key) for this FIB.
vl_api_mac_address_t src_addr
static u32 vlib_get_buffer_index(vlib_main_t *vm, void *p)
Translate buffer pointer into buffer index.
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
#define ethernet_buffer_header_size(b)
Determine the size of the Ethernet headers of the current frame in the buffer.
u32 rx_fib_index
The FIB index (not the external Table-ID) in which the client is resides.
#define foreach_dhcpv6_proxy_to_server_input_next
if(node->flags &VLIB_NODE_FLAG_TRACE) vnet_interface_output_trace(vm
u32 server_fib_index
The FIB index (not the external Table-ID) in which the server is reachable.
static void vlib_node_increment_counter(vlib_main_t *vm, u32 node_index, u32 counter_index, u64 increment)
void udp_register_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u32 node_index, u8 is_ip4)
void udp_unregister_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u8 is_ip4)
@ VNET_SW_INTERFACE_FLAG_UNNUMBERED
#define VLIB_CLI_COMMAND(x,...)
void dhcp_proxy_walk(fib_protocol_t proto, dhcp_proxy_walk_fn_t fn, void *ctx)
Walk/Visit each DHCP proxy server.
@ MFIB_ENTRY_FLAG_ACCEPT_ALL_ITF
struct _vlib_node_registration vlib_node_registration_t
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
u16 current_length
Nbytes between current data and the end of this buffer.
ip46_address_t dhcp_server
The address of the DHCP server to which to relay the client's messages.
void mfib_table_unlock(u32 fib_index, fib_protocol_t proto, mfib_source_t source)
Take a reference counting lock on the table.
u32 error_drop_node_index
static void copy_ip6_address(ip6_address_t *dst, ip6_address_t *src)
@ DHCPV6_MSG_INFORMATION_REQUEST
static u8 ip46_address_is_zero(const ip46_address_t *ip46)
static vlib_cli_command_t dhcpv6_proxy_set_command
(constructor) VLIB_CLI_COMMAND (dhcpv6_proxy_set_command)
#define vlib_validate_buffer_enqueue_x1(vm, node, next_index, to_next, n_left_to_next, bi0, next0)
Finish enqueueing one buffer forward in the graph.
vlib_node_t * vlib_get_node_by_name(vlib_main_t *vm, u8 *name)
u8 vpn_id[7]
Type 1 VPN-ID.
static clib_error_t * dhcpv6_link_address_show_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
ip6_address_t * ip6_interface_first_address(ip6_main_t *im, u32 sw_if_index)
get first IPv6 interface address
format_function_t format_vnet_sw_if_index_name
unformat_function_t unformat_vnet_sw_interface
description fragment has unexpected format
vlib_put_next_frame(vm, node, next_index, 0)
fib_table_t * fib_table_get(fib_node_index_t index, fib_protocol_t proto)
Get a pointer to a FIB table.
format_function_t format_ip46_address
static_always_inline u32 vlib_buffer_get_default_data_size(vlib_main_t *vm)
#define VLIB_INIT_FUNCTION(x)
static vnet_hw_interface_t * vnet_get_sup_hw_interface(vnet_main_t *vnm, u32 sw_if_index)
static vlib_cli_command_t dhcpv6_proxy_vss_command
(constructor) VLIB_CLI_COMMAND (dhcpv6_proxy_vss_command)
A representation of a path as described by a route producer.
#define vec_foreach(var, vec)
Vector iterator.
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
static u8 * format_dhcp6_proxy_server(u8 *s, va_list *args)
static vlib_main_t * vlib_get_main(void)
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
clib_error_t *() vlib_init_function_t(struct vlib_main_t *vm)
fib_node_index_t mfib_table_entry_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, fib_rpf_id_t rpf_id, mfib_entry_flags_t entry_flags)
Add a new (with no replication) or lock an existing entry.
fib_node_index_t mfib_table_entry_path_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, const fib_route_path_t *rpath)
Add n paths to an entry (aka route) in the FIB.
@ DHCPV6_PROXY_TO_SERVER_INPUT_N_NEXT
void dhcp_vss_walk(fib_protocol_t proto, dhcp_vss_walk_fn_t fn, void *ctx)
Walk/Visit each DHCP proxy VSS.
dhcp_server_t * dhcp_servers
The set of DHCP servers to which messages are relayed.
ip46_address_t dhcp_src_address
The source address to use in relayed messaes.
int dhcp_vss_show_walk(dhcp_vss_t *vss, u32 rx_table_id, void *ctx)
Show (on CLI) a VSS config during a show walk.
int dhcp_proxy_server_add(fib_protocol_t proto, ip46_address_t *addr, ip46_address_t *src_address, u32 rx_fib_index, u32 server_table_id)
Add a new DHCP proxy server configuration.
vl_api_interface_index_t sw_if_index
#define vlib_get_next_frame(vm, node, next_index, vectors, n_vectors_left)
Get pointer to next frame vector data by (vlib_node_runtime_t, next_index).
ethernet_interface_address_t address
@ DHCPV6_RELAY_PKT_DROP_MAX_HOPS
static ip6_address_t all_dhcpv6_server_relay_agent_address
@ FIB_ROUTE_PATH_LOCAL
A for-us/local path.
void mfib_table_entry_delete(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source)
Delete a FIB entry.
static ip6_address_t all_dhcpv6_server_address
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index,...
VLIB buffer representation.
#define VLIB_REGISTER_NODE(x,...)