X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdhcp%2Fdhcp6_proxy_node.c;h=174548f24eb2d19e28f1278718e84fe38cd7e81a;hb=138c37af5291e2045075052a4db036be03be4a85;hp=5a3a99e2e5dd9ced23d88204b46f8f1a273adbff;hpb=34719e37bf820e8398ca9159725f7f4c42764aeb;p=vpp.git diff --git a/src/vnet/dhcp/dhcp6_proxy_node.c b/src/vnet/dhcp/dhcp6_proxy_node.c index 5a3a99e2e5d..174548f24eb 100644 --- a/src/vnet/dhcp/dhcp6_proxy_node.c +++ b/src/vnet/dhcp/dhcp6_proxy_node.c @@ -179,7 +179,6 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm, dhcpv6_client_mac_t *cmac; // client mac ethernet_header_t *e_h0; u8 client_src_mac[6]; - vlib_buffer_free_list_t *fl; dhcp_vss_t *vss; u8 is_solicit = 0; @@ -200,7 +199,7 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm, clib_memcpy (client_src_mac, e_h0->src_address, 6); - switch (h0->u.msg_type) + switch (h0->msg_type) { case DHCPV6_MSG_SOLICIT: case DHCPV6_MSG_REQUEST: @@ -270,7 +269,7 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm, r1->hop_count++; r1->hop_count = - (h0->u.msg_type != DHCPV6_MSG_RELAY_FORW) ? 0 : r1->hop_count; + (h0->msg_type != DHCPV6_MSG_RELAY_FORW) ? 0 : r1->hop_count; if (PREDICT_FALSE (r1->hop_count >= HOP_COUNT_LIMIT)) { @@ -282,7 +281,7 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm, /* If relay-fwd and src address is site or global unicast address */ - if (h0->u.msg_type == DHCPV6_MSG_RELAY_FORW && + if (h0->msg_type == DHCPV6_MSG_RELAY_FORW && ((ip0->src_address.as_u8[0] & 0xe0) == 0x20 || (ip0->src_address.as_u8[0] & 0xfe) == 0xfc)) { @@ -315,12 +314,9 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm, copy_ip6_address (&r1->link_addr, ia0); link_address_set: - fl = - vlib_buffer_get_free_list (vm, - vlib_buffer_get_free_list_index (b0)); if ((b0->current_length + sizeof (*id1) + sizeof (*vss1) + - sizeof (*cmac)) > fl->n_data_bytes) + sizeof (*cmac)) > vlib_buffer_get_default_data_size (vm)) { error0 = DHCPV6_PROXY_ERROR_PKT_TOO_BIG; next0 = DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_DROP; @@ -336,7 +332,7 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm, id1->int_idx = clib_host_to_net_u32 (rx_sw_if_index); u1->length = 0; - if (h0->u.msg_type != DHCPV6_MSG_RELAY_FORW) + if (h0->msg_type != DHCPV6_MSG_RELAY_FORW) { cmac = (dhcpv6_client_mac_t *) (((uword) ip1) + b0->current_length); @@ -389,7 +385,7 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm, sizeof (*r1) + sizeof (*fwd_opt) + sizeof (*u1) + sizeof (*id1) + u1->length); - memset (ip1, 0, sizeof (*ip1)); + clib_memset (ip1, 0, sizeof (*ip1)); ip1->ip_version_traffic_class_and_flow_label = 0x60; ip1->payload_length = u1->length; ip1->protocol = PROTO_UDP; @@ -423,7 +419,7 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm, next0 = DHCPV6_PROXY_TO_SERVER_INPUT_NEXT_LOOKUP; - is_solicit = (DHCPV6_MSG_SOLICIT == h0->u.msg_type); + is_solicit = (DHCPV6_MSG_SOLICIT == h0->msg_type); /* * If we have multiple servers configured and this is the @@ -440,6 +436,7 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm, u32 ci0; c0 = vlib_buffer_copy (vm, b0); + VLIB_BUFFER_TRACE_TRAJECTORY_INIT (c0); ci0 = vlib_get_buffer_index (vm, c0); server = &proxy->dhcp_servers[ii]; @@ -563,7 +560,7 @@ dhcpv6_proxy_to_client_input (vlib_main_t * vm, { u32 n_left_from, *from; - ethernet_main_t *em = ethernet_get_main (vm); + ethernet_main_t *em = vnet_get_ethernet_main (); dhcp_proxy_main_t *dm = &dhcp_proxy_main; dhcp_proxy_t *proxy; dhcp_server_t *server; @@ -739,7 +736,7 @@ dhcpv6_proxy_to_client_input (vlib_main_t * vm, } len = clib_net_to_host_u16 (r0->length); - memset (ip1, 0, sizeof (*ip1)); + clib_memset (ip1, 0, sizeof (*ip1)); copy_ip6_address (&ip1->dst_address, &client_address); u1->checksum = 0; u1->src_port = clib_net_to_host_u16 (UDP_DST_PORT_dhcpv6_to_server); @@ -767,7 +764,7 @@ dhcpv6_proxy_to_client_input (vlib_main_t * vm, hi0 = vnet_get_sup_hw_interface (vnm, original_sw_if_index); ei0 = pool_elt_at_index (em->interfaces, hi0->hw_instance); clib_memcpy (mac0->src_address, ei0->address, sizeof (ei0->address)); - memset (&mac0->dst_address, 0xff, sizeof (mac0->dst_address)); + clib_memset (&mac0->dst_address, 0xff, sizeof (mac0->dst_address)); mac0->type = (si0->type == VNET_SW_INTERFACE_TYPE_SUB) ? clib_net_to_host_u16 (0x8100) : clib_net_to_host_u16 (0x86dd); @@ -840,12 +837,6 @@ dhcp6_proxy_init (vlib_main_t * vm) all_dhcpv6_server_relay_agent_address.as_u64[1] = clib_host_to_net_u64 (0x00010002); - udp_register_dst_port (vm, UDP_DST_PORT_dhcpv6_to_client, - dhcpv6_proxy_to_client_node.index, 0 /* is_ip6 */ ); - - udp_register_dst_port (vm, UDP_DST_PORT_dhcpv6_to_server, - dhcpv6_proxy_to_server_node.index, 0 /* is_ip6 */ ); - return 0; } @@ -856,6 +847,7 @@ dhcp6_proxy_set_server (ip46_address_t * addr, ip46_address_t * src_addr, u32 rx_table_id, u32 server_table_id, int is_del) { + vlib_main_t *vm = vlib_get_main (); u32 rx_fib_index = 0; int rc = 0; @@ -886,6 +878,11 @@ dhcp6_proxy_set_server (ip46_address_t * addr, &all_dhcp_servers, MFIB_SOURCE_DHCP); mfib_table_unlock (rx_fib_index, FIB_PROTOCOL_IP6, MFIB_SOURCE_DHCP); + + udp_unregister_dst_port (vm, UDP_DST_PORT_dhcpv6_to_client, + 0 /* is_ip6 */ ); + udp_unregister_dst_port (vm, UDP_DST_PORT_dhcpv6_to_server, + 0 /* is_ip6 */ ); } } else @@ -895,16 +892,16 @@ dhcp6_proxy_set_server (ip46_address_t * addr, .frp_addr = zero_addr, .frp_sw_if_index = 0xffffffff, .frp_fib_index = ~0, - .frp_weight = 0, + .frp_weight = 1, .frp_flags = FIB_ROUTE_PATH_LOCAL, + .frp_mitf_flags = MFIB_ITF_FLAG_FORWARD, }; if (dhcp_proxy_server_add (FIB_PROTOCOL_IP6, addr, src_addr, rx_fib_index, server_table_id)) { mfib_table_entry_path_update (rx_fib_index, &all_dhcp_servers, - MFIB_SOURCE_DHCP, - &path_for_us, MFIB_ITF_FLAG_FORWARD); + MFIB_SOURCE_DHCP, &path_for_us); /* * Each interface that is enabled in this table, needs to be added * as an accepting interface, but this is not easily doable in VPP. @@ -919,6 +916,13 @@ dhcp6_proxy_set_server (ip46_address_t * addr, MFIB_RPF_ID_NONE, MFIB_ENTRY_FLAG_ACCEPT_ALL_ITF); mfib_table_lock (rx_fib_index, FIB_PROTOCOL_IP6, MFIB_SOURCE_DHCP); + + udp_register_dst_port (vm, UDP_DST_PORT_dhcpv6_to_client, + dhcpv6_proxy_to_client_node.index, + 0 /* is_ip6 */ ); + udp_register_dst_port (vm, UDP_DST_PORT_dhcpv6_to_server, + dhcpv6_proxy_to_server_node.index, + 0 /* is_ip6 */ ); } }