fib: fib api updates
[vpp.git] / src / vnet / dhcp / dhcp6_proxy_node.c
index 2a1ac12..a253fa1 100644 (file)
@@ -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];
 
@@ -463,6 +460,7 @@ dhcpv6_proxy_to_server_input (vlib_main_t * vm,
                    {
                      dhcpv6_proxy_trace_t *tr;
 
+                     vlib_buffer_copy_trace_flag (vm, b0, ci0);
                      tr = vlib_add_trace (vm, node, c0, sizeof (*tr));
                      tr->which = 0;    /* to server */
                      tr->error = error0;
@@ -739,7 +737,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 +765,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 +838,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 +848,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 +879,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 +893,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 +917,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 */ );
        }
     }