diff options
Diffstat (limited to 'src/vnet/ipip')
-rw-r--r-- | src/vnet/ipip/ipip.c | 66 | ||||
-rw-r--r-- | src/vnet/ipip/ipip_api.c | 53 | ||||
-rw-r--r-- | src/vnet/ipip/ipip_cli.c | 12 | ||||
-rw-r--r-- | src/vnet/ipip/node.c | 2 | ||||
-rw-r--r-- | src/vnet/ipip/sixrd.c | 12 |
5 files changed, 86 insertions, 59 deletions
diff --git a/src/vnet/ipip/ipip.c b/src/vnet/ipip/ipip.c index 5dbe85a1c5b..aaf21468d1e 100644 --- a/src/vnet/ipip/ipip.c +++ b/src/vnet/ipip/ipip.c @@ -148,7 +148,14 @@ ipip64_fixup (vlib_main_t * vm, const ip_adjacency_t * adj, vlib_buffer_t * b, ip4->length = clib_host_to_net_u16 (vlib_buffer_length_in_chain (vm, b)); tunnel_encap_fixup_6o4 (flags, ((ip6_header_t *) (ip4 + 1)), ip4); - ip4->checksum = ip4_header_checksum (ip4); + if (PREDICT_FALSE (b->flags & VNET_BUFFER_F_GSO)) + { + vnet_buffer2 (b)->outer_l3_hdr_offset = (u8 *) ip4 - b->data; + vnet_buffer_offload_flags_set (b, VNET_BUFFER_OFFLOAD_F_OUTER_IP_CKSUM | + VNET_BUFFER_OFFLOAD_F_TNL_IPIP); + } + else + ip4->checksum = ip4_header_checksum (ip4); } static void @@ -164,7 +171,14 @@ ipip44_fixup (vlib_main_t * vm, const ip_adjacency_t * adj, vlib_buffer_t * b, ip4->length = clib_host_to_net_u16 (vlib_buffer_length_in_chain (vm, b)); tunnel_encap_fixup_4o4 (flags, ip4 + 1, ip4); - ip4->checksum = ip4_header_checksum (ip4); + if (PREDICT_FALSE (b->flags & VNET_BUFFER_F_GSO)) + { + vnet_buffer2 (b)->outer_l3_hdr_offset = (u8 *) ip4 - b->data; + vnet_buffer_offload_flags_set (b, VNET_BUFFER_OFFLOAD_F_OUTER_IP_CKSUM | + VNET_BUFFER_OFFLOAD_F_TNL_IPIP); + } + else + ip4->checksum = ip4_header_checksum (ip4); } static void @@ -185,6 +199,12 @@ ipip46_fixup (vlib_main_t * vm, const ip_adjacency_t * adj, vlib_buffer_t * b, clib_host_to_net_u16 (vlib_buffer_length_in_chain (vm, b) - sizeof (*ip6)); tunnel_encap_fixup_4o6 (flags, b, ((ip4_header_t *) (ip6 + 1)), ip6); + + if (PREDICT_FALSE (b->flags & VNET_BUFFER_F_GSO)) + { + vnet_buffer2 (b)->outer_l3_hdr_offset = (u8 *) ip6 - b->data; + vnet_buffer_offload_flags_set (b, VNET_BUFFER_OFFLOAD_F_TNL_IPIP); + } } static void @@ -205,6 +225,12 @@ ipip66_fixup (vlib_main_t * vm, clib_host_to_net_u16 (vlib_buffer_length_in_chain (vm, b) - sizeof (*ip6)); tunnel_encap_fixup_6o6 (flags, ip6 + 1, ip6); + + if (PREDICT_FALSE (b->flags & VNET_BUFFER_F_GSO)) + { + vnet_buffer2 (b)->outer_l3_hdr_offset = (u8 *) ip6 - b->data; + vnet_buffer_offload_flags_set (b, VNET_BUFFER_OFFLOAD_F_TNL_IPIP); + } } static void @@ -226,6 +252,12 @@ ipipm6_fixup (vlib_main_t *vm, const ip_adjacency_t *adj, vlib_buffer_t *b, clib_host_to_net_u16 (vlib_buffer_length_in_chain (vm, b) - sizeof (*ip6)); tunnel_encap_fixup_mplso6 (flags, b, (mpls_unicast_header_t *) (ip6 + 1), ip6); + + if (PREDICT_FALSE (b->flags & VNET_BUFFER_F_GSO)) + { + vnet_buffer2 (b)->outer_l3_hdr_offset = (u8 *) ip6 - b->data; + vnet_buffer_offload_flags_set (b, VNET_BUFFER_OFFLOAD_F_TNL_IPIP); + } } static void @@ -245,7 +277,15 @@ ipipm4_fixup (vlib_main_t *vm, const ip_adjacency_t *adj, vlib_buffer_t *b, ip4->length = clib_host_to_net_u16 (vlib_buffer_length_in_chain (vm, b) - sizeof (*ip4)); tunnel_encap_fixup_mplso4 (flags, (mpls_unicast_header_t *) (ip4 + 1), ip4); - ip4->checksum = ip4_header_checksum (ip4); + + if (PREDICT_FALSE (b->flags & VNET_BUFFER_F_GSO)) + { + vnet_buffer2 (b)->outer_l3_hdr_offset = (u8 *) ip4 - b->data; + vnet_buffer_offload_flags_set (b, VNET_BUFFER_OFFLOAD_F_OUTER_IP_CKSUM | + VNET_BUFFER_OFFLOAD_F_TNL_IPIP); + } + else + ip4->checksum = ip4_header_checksum (ip4); } static void @@ -269,7 +309,6 @@ ipip_tunnel_stack (adj_index_t ai) } else { - /* *INDENT-OFF* */ fib_prefix_t dst = { .fp_len = t->transport == IPIP_TRANSPORT_IP6 ? 128 : 32, .fp_proto = (t->transport == IPIP_TRANSPORT_IP6 ? @@ -277,7 +316,6 @@ ipip_tunnel_stack (adj_index_t ai) FIB_PROTOCOL_IP4), .fp_addr = t->tunnel_dst }; - /* *INDENT-ON* */ adj_midchain_delegate_stack (ai, t->fib_index, &dst); } @@ -348,9 +386,6 @@ ipip_update_adj (vnet_main_t * vnm, u32 sw_if_index, adj_index_t ai) if (!(t->flags & TUNNEL_ENCAP_DECAP_FLAG_ENCAP_INNER_HASH)) af |= ADJ_FLAG_MIDCHAIN_IP_STACK; - if (VNET_LINK_ETHERNET == adj_get_link_type (ai)) - af |= ADJ_FLAG_MIDCHAIN_NO_COUNT; - fixup = ipip_get_fixup (t, adj_get_link_type (ai), &af); adj_nbr_midchain_update_rewrite (ai, fixup, @@ -515,7 +550,6 @@ ipip_tunnel_desc (u32 sw_if_index, return (0); } -/* *INDENT-OFF* */ VNET_DEVICE_CLASS(ipip_device_class) = { .name = "IPIP tunnel device", .format_device_name = format_ipip_tunnel_name, @@ -545,7 +579,6 @@ VNET_HW_INTERFACE_CLASS(mipip_hw_interface_class) = { .update_adjacency = mipip_update_adj, .flags = VNET_HW_INTERFACE_CLASS_FLAG_NBMA, }; -/* *INDENT-ON* */ ipip_tunnel_t * ipip_tunnel_db_find (const ipip_tunnel_key_t * key) @@ -785,16 +818,16 @@ ipip_add_tunnel (ipip_transport_t transport, gm->tunnel_index_by_sw_if_index[sw_if_index] = t_idx; if (t->transport == IPIP_TRANSPORT_IP4) - { - hi->min_packet_bytes = 64 + sizeof (ip4_header_t); - } + hi->frame_overhead = sizeof (ip4_header_t); else - { - hi->min_packet_bytes = 64 + sizeof (ip6_header_t); - } + hi->frame_overhead = sizeof (ip6_header_t); + + hi->min_frame_size = hi->frame_overhead + 64; /* Standard default ipip MTU. */ vnet_sw_interface_set_mtu (vnm, sw_if_index, 9000); + vnet_set_interface_l3_output_node (gm->vlib_main, sw_if_index, + (u8 *) "tunnel-output"); t->tunnel_src = *src; t->tunnel_dst = *dst; @@ -840,6 +873,7 @@ ipip_del_tunnel (u32 sw_if_index) teib_walk_itf (t->sw_if_index, ipip_tunnel_delete_teib_walk, t); vnet_sw_interface_set_flags (vnm, sw_if_index, 0 /* down */ ); + vnet_reset_interface_l3_output_node (gm->vlib_main, t->sw_if_index); gm->tunnel_index_by_sw_if_index[sw_if_index] = ~0; vnet_delete_hw_interface (vnm, t->hw_if_index); hash_unset (gm->instance_used, t->user_instance); diff --git a/src/vnet/ipip/ipip_api.c b/src/vnet/ipip/ipip_api.c index f44c72c3b27..2cb7bdf8dae 100644 --- a/src/vnet/ipip/ipip_api.c +++ b/src/vnet/ipip/ipip_api.c @@ -86,12 +86,10 @@ vl_api_ipip_add_tunnel_t_handler (vl_api_ipip_add_tunnel_t * mp) } out: - /* *INDENT-OFF* */ REPLY_MACRO2(VL_API_IPIP_ADD_TUNNEL_REPLY, ({ rmp->sw_if_index = ntohl(sw_if_index); })); - /* *INDENT-ON* */ } static void @@ -105,30 +103,45 @@ vl_api_ipip_del_tunnel_t_handler (vl_api_ipip_del_tunnel_t * mp) REPLY_MACRO (VL_API_IPIP_DEL_TUNNEL_REPLY); } +static vl_api_tunnel_mode_t +ipip_tunnel_mode_encode (ipip_mode_t mode) +{ + switch (mode) + { + case IPIP_MODE_P2P: + return TUNNEL_API_MODE_P2P; + case IPIP_MODE_P2MP: + return TUNNEL_API_MODE_MP; + case IPIP_MODE_6RD: + return TUNNEL_API_MODE_P2P; + default: + return TUNNEL_API_MODE_P2P; + } +} + static void send_ipip_tunnel_details (ipip_tunnel_t * t, vl_api_ipip_tunnel_dump_t * mp) { ipip_main_t *im = &ipip_main; vl_api_ipip_tunnel_details_t *rmp; bool is_ipv6 = t->transport == IPIP_TRANSPORT_IP6 ? true : false; + ip46_type_t ip_type = is_ipv6 ? IP46_TYPE_IP6 : IP46_TYPE_IP4; fib_table_t *ft; - int rv = 0; - - ft = fib_table_get (t->fib_index, (is_ipv6 ? FIB_PROTOCOL_IP6 : - FIB_PROTOCOL_IP4)); - /* *INDENT-OFF* */ - REPLY_MACRO_DETAILS2(VL_API_IPIP_TUNNEL_DETAILS, - ({ - ip_address_encode (&t->tunnel_src, IP46_TYPE_ANY, &rmp->tunnel.src); - ip_address_encode (&t->tunnel_dst, IP46_TYPE_ANY, &rmp->tunnel.dst); - rmp->tunnel.table_id = htonl (ft->ft_table_id); - rmp->tunnel.instance = htonl (t->user_instance); - rmp->tunnel.sw_if_index = htonl (t->sw_if_index); - rmp->tunnel.dscp = ip_dscp_encode(t->dscp); - rmp->tunnel.flags = tunnel_encap_decap_flags_encode(t->flags); - })); - /* *INDENT-ON* */ + ft = fib_table_get (t->fib_index, + (is_ipv6 ? FIB_PROTOCOL_IP6 : FIB_PROTOCOL_IP4)); + + REPLY_MACRO_DETAILS2 ( + VL_API_IPIP_TUNNEL_DETAILS, ({ + ip_address_encode (&t->tunnel_src, ip_type, &rmp->tunnel.src); + ip_address_encode (&t->tunnel_dst, ip_type, &rmp->tunnel.dst); + rmp->tunnel.table_id = htonl (ft->ft_table_id); + rmp->tunnel.instance = htonl (t->user_instance); + rmp->tunnel.sw_if_index = htonl (t->sw_if_index); + rmp->tunnel.dscp = ip_dscp_encode (t->dscp); + rmp->tunnel.flags = tunnel_encap_decap_flags_encode (t->flags); + rmp->tunnel.mode = ipip_tunnel_mode_encode (t->mode); + })); } static void @@ -142,12 +155,10 @@ vl_api_ipip_tunnel_dump_t_handler (vl_api_ipip_tunnel_dump_t * mp) if (sw_if_index == ~0) { - /* *INDENT-OFF* */ pool_foreach (t, im->tunnels) { send_ipip_tunnel_details(t, mp); } - /* *INDENT-ON* */ } else { @@ -186,12 +197,10 @@ vl_api_ipip_6rd_add_tunnel_t_handler (vl_api_ipip_6rd_add_tunnel_t * mp) &sixrd_tunnel_index); } - /* *INDENT-OFF* */ REPLY_MACRO2 (VL_API_IPIP_6RD_ADD_TUNNEL_REPLY, ({ rmp->sw_if_index = htonl (sixrd_tunnel_index); })); - /* *INDENT-ON* */ } static void diff --git a/src/vnet/ipip/ipip_cli.c b/src/vnet/ipip/ipip_cli.c index 1a8e8896965..606a1f53f9a 100644 --- a/src/vnet/ipip/ipip_cli.c +++ b/src/vnet/ipip/ipip_cli.c @@ -197,7 +197,6 @@ done: return error; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND(create_ipip_tunnel_command, static) = { .path = "create ipip tunnel", .short_help = "create ipip tunnel src <addr> dst <addr> [instance <n>] " @@ -209,7 +208,6 @@ VLIB_CLI_COMMAND(delete_ipip_tunnel_command, static) = { .short_help = "delete ipip tunnel sw_if_index <sw_if_index>", .function = delete_ipip_tunnel_command_fn, }; -/* *INDENT-ON* */ static u8 * format_ipip_tunnel (u8 * s, va_list * args) @@ -274,10 +272,8 @@ show_ipip_tunnel_command_fn (vlib_main_t * vm, if (ti == ~0) { - /* *INDENT-OFF* */ pool_foreach (t, gm->tunnels) {vlib_cli_output(vm, "%U", format_ipip_tunnel, t); } - /* *INDENT-ON* */ } else { @@ -290,12 +286,10 @@ show_ipip_tunnel_command_fn (vlib_main_t * vm, return 0; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND(show_ipip_tunnel_command, static) = { .path = "show ipip tunnel", .function = show_ipip_tunnel_command_fn, }; -/* *INDENT-ON* */ static u8 * format_ipip_tunnel_key (u8 * s, va_list * args) @@ -318,12 +312,10 @@ ipip_tunnel_hash_show (vlib_main_t * vm, ipip_tunnel_key_t *key; u32 index; - /* *INDENT-OFF* */ hash_foreach(key, index, im->tunnel_by_key, ({ vlib_cli_output (vm, " %U -> %d", format_ipip_tunnel_key, key, index); })); - /* *INDENT-ON* */ return NULL; } @@ -331,14 +323,12 @@ ipip_tunnel_hash_show (vlib_main_t * vm, /** * show IPSEC tunnel protection hash tables */ -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (ipip_tunnel_hash_show_node, static) = { .path = "show ipip tunnel-hash", .function = ipip_tunnel_hash_show, .short_help = "show ipip tunnel-hash", }; -/* *INDENT-ON* */ static clib_error_t * create_sixrd_tunnel_command_fn (vlib_main_t * vm, @@ -464,7 +454,6 @@ done: return error; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND(create_sixrd_tunnel_command, static) = { .path = "create 6rd tunnel", .short_help = "create 6rd tunnel ip6-pfx <ip6-pfx> ip4-pfx <ip4-pfx> " @@ -477,7 +466,6 @@ VLIB_CLI_COMMAND(delete_sixrd_tunnel_command, static) = { .short_help = "delete 6rd tunnel sw_if_index <sw_if_index>", .function = delete_sixrd_tunnel_command_fn, }; -/* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON diff --git a/src/vnet/ipip/node.c b/src/vnet/ipip/node.c index b008a21a20f..a289cc885df 100644 --- a/src/vnet/ipip/node.c +++ b/src/vnet/ipip/node.c @@ -260,7 +260,6 @@ static char *ipip_error_strings[] = { #undef _ }; -/* *INDENT-OFF* */ VLIB_REGISTER_NODE(ipip4_input_node) = { .name = "ipip4-input", /* Takes a vector of packets. */ @@ -293,7 +292,6 @@ VLIB_REGISTER_NODE(ipip6_input_node) = { .format_trace = format_ipip_rx_trace, }; -/* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON diff --git a/src/vnet/ipip/sixrd.c b/src/vnet/ipip/sixrd.c index 492b4f83260..6e0bfb042cc 100644 --- a/src/vnet/ipip/sixrd.c +++ b/src/vnet/ipip/sixrd.c @@ -250,7 +250,6 @@ sixrd_interface_admin_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags) return /* no error */ 0; } -/* *INDENT-OFF* */ VNET_HW_INTERFACE_CLASS(sixrd_hw_interface_class) = { .name = "ip6ip-6rd", .build_rewrite = sixrd_build_rewrite, @@ -265,7 +264,6 @@ VNET_DEVICE_CLASS(sixrd_device_class) = { #endif } ; -/* *INDENT-ON* */ int sixrd_add_tunnel (ip6_address_t * ip6_prefix, u8 ip6_prefix_len, @@ -325,6 +323,8 @@ sixrd_add_tunnel (ip6_address_t * ip6_prefix, u8 ip6_prefix_len, t->user_instance = t_idx; vnet_sw_interface_set_mtu (vnet_get_main (), t->sw_if_index, 1480); + vnet_set_interface_l3_output_node (gm->vlib_main, hi->sw_if_index, + (u8 *) "tunnel-output"); ipip_tunnel_db_add (t, &key); @@ -339,7 +339,6 @@ sixrd_add_tunnel (ip6_address_t * ip6_prefix, u8 ip6_prefix_len, ip6_sw_interface_enable_disable (t->sw_if_index, true); /* Create IPv6 route/adjacency */ - /* *INDENT-OFF* */ fib_prefix_t pfx6 = { .fp_proto = FIB_PROTOCOL_IP6, .fp_len = t->sixrd.ip6_prefix_len, @@ -347,7 +346,6 @@ sixrd_add_tunnel (ip6_address_t * ip6_prefix, u8 ip6_prefix_len, .ip6 = t->sixrd.ip6_prefix, }, }; - /* *INDENT-ON* */ fib_table_lock (ip6_fib_index, FIB_PROTOCOL_IP6, FIB_SOURCE_6RD); fib_table_entry_update_one_path (ip6_fib_index, &pfx6, FIB_SOURCE_6RD, @@ -384,7 +382,6 @@ sixrd_del_tunnel (u32 sw_if_index) return -1; } - /* *INDENT-OFF* */ fib_prefix_t pfx6 = { .fp_proto = FIB_PROTOCOL_IP6, .fp_len = t->sixrd.ip6_prefix_len, @@ -392,7 +389,6 @@ sixrd_del_tunnel (u32 sw_if_index) .ip6 = t->sixrd.ip6_prefix, }, }; - /* *INDENT-ON* */ fib_table_entry_path_remove (t->sixrd.ip6_fib_index, &pfx6, FIB_SOURCE_6RD, @@ -403,6 +399,7 @@ sixrd_del_tunnel (u32 sw_if_index) vnet_sw_interface_set_flags (vnet_get_main (), t->sw_if_index, 0 /* down */ ); + vnet_reset_interface_l3_output_node (gm->vlib_main, t->sw_if_index); ip6_sw_interface_enable_disable (t->sw_if_index, false); gm->tunnel_index_by_sw_if_index[t->sw_if_index] = ~0; @@ -502,7 +499,8 @@ sixrd_init (vlib_main_t * vm) sixrd_adj_delegate_type = adj_delegate_register_new_type (&sixrd_adj_delegate_vft); - sixrd_fib_node_type = fib_node_register_new_type (&sixrd_fib_node_vft); + sixrd_fib_node_type = + fib_node_register_new_type ("sixrd", &sixrd_fib_node_vft); return error; } |