X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Finterface.h;h=d42e5fda84c092547a7779dbc9c51d9cafbe61f2;hb=8b2b794ae99a2316caebceb65a5ab16f75536d6b;hp=5fbf830c01cd0eccfde4437d38b3ea9267d6ba7b;hpb=c631f2de6dd06b4cbb92bf8398839b882344fd25;p=vpp.git diff --git a/vnet/vnet/interface.h b/vnet/vnet/interface.h index 5fbf830c01c..d42e5fda84c 100644 --- a/vnet/vnet/interface.h +++ b/vnet/vnet/interface.h @@ -41,10 +41,12 @@ #define included_vnet_interface_h #include +#include struct vnet_main_t; struct vnet_hw_interface_t; struct vnet_sw_interface_t; +struct ip46_address_t; /* Interface up/down callback. */ typedef clib_error_t *(vnet_interface_function_t) @@ -59,6 +61,13 @@ typedef clib_error_t *(vnet_subif_add_del_function_t) typedef clib_error_t *(vnet_interface_set_mac_address_function_t) (struct vnet_hw_interface_t * hi, char *address); +typedef enum vnet_interface_function_priority_t_ +{ + VNET_ITF_FUNC_PRIORITY_LOW, + VNET_ITF_FUNC_PRIORITY_HIGH, +} vnet_interface_function_priority_t; +#define VNET_ITF_FUNC_N_PRIO ((vnet_interface_function_priority_t)VNET_ITF_FUNC_PRIORITY_HIGH+1) + typedef struct _vnet_interface_function_list_elt { struct _vnet_interface_function_list_elt *next_interface_function; @@ -74,8 +83,23 @@ static void __vnet_interface_function_init_##tag##_##f (void) \ { \ vnet_main_t * vnm = vnet_get_main(); \ static _vnet_interface_function_list_elt_t init_function; \ - init_function.next_interface_function = vnm->tag##_functions; \ - vnm->tag##_functions = &init_function; \ + init_function.next_interface_function = \ + vnm->tag##_functions[VNET_ITF_FUNC_PRIORITY_LOW]; \ + vnm->tag##_functions[VNET_ITF_FUNC_PRIORITY_LOW] = &init_function; \ + init_function.fp = (void *) &f; \ +} + +#define _VNET_INTERFACE_FUNCTION_DECL_PRIO(f,tag,p) \ + \ +static void __vnet_interface_function_init_##tag##_##f (void) \ + __attribute__((__constructor__)) ; \ + \ +static void __vnet_interface_function_init_##tag##_##f (void) \ +{ \ + vnet_main_t * vnm = vnet_get_main(); \ + static _vnet_interface_function_list_elt_t init_function; \ + init_function.next_interface_function = vnm->tag##_functions[p]; \ + vnm->tag##_functions[p] = &init_function; \ init_function.fp = (void *) &f; \ } @@ -83,10 +107,14 @@ static void __vnet_interface_function_init_##tag##_##f (void) \ _VNET_INTERFACE_FUNCTION_DECL(f,hw_interface_add_del) #define VNET_HW_INTERFACE_LINK_UP_DOWN_FUNCTION(f) \ _VNET_INTERFACE_FUNCTION_DECL(f,hw_interface_link_up_down) +#define VNET_HW_INTERFACE_LINK_UP_DOWN_FUNCTION_PRIO(f,p) \ + _VNET_INTERFACE_FUNCTION_DECL_PRIO(f,hw_interface_link_up_down,p) #define VNET_SW_INTERFACE_ADD_DEL_FUNCTION(f) \ _VNET_INTERFACE_FUNCTION_DECL(f,sw_interface_add_del) #define VNET_SW_INTERFACE_ADMIN_UP_DOWN_FUNCTION(f) \ _VNET_INTERFACE_FUNCTION_DECL(f,sw_interface_admin_up_down) +#define VNET_SW_INTERFACE_ADMIN_UP_DOWN_FUNCTION_PRIO(f,p) \ + _VNET_INTERFACE_FUNCTION_DECL_PRIO(f,sw_interface_admin_up_down, p) /* A class of hardware interface devices. */ typedef struct _vnet_device_class @@ -152,12 +180,11 @@ typedef struct _vnet_device_class /* Link-list of all device classes set up by constructors created below */ struct _vnet_device_class *next_class_registration; - /* Do not splice vnet_interface_output_node into TX path */ - u8 no_flatten_output_chains; + /* Splice vnet_interface_output_node into TX path */ + u8 flatten_output_chains; /* Function to set mac address. */ vnet_interface_set_mac_address_function_t *mac_addr_change_function; - } vnet_device_class_t; #define VNET_DEVICE_CLASS(x,...) \ @@ -197,6 +224,53 @@ __VA_ARGS__ vnet_device_class_t x { dev.tx_function = fn ## _multiarch_select(); } #endif +/** + * Link Type: A description of the protocol of packets on the link. + * On an ethernet link this maps directly into the ethertype. On a GRE tunnel + * it maps to the GRE-proto, etc for other lnk types. + */ +typedef enum vnet_link_t_ +{ +#if CLIB_DEBUG > 0 + VNET_LINK_IP4 = 1, +#else + VNET_LINK_IP4 = 0, +#endif + VNET_LINK_IP6, + VNET_LINK_MPLS, + VNET_LINK_ETHERNET, + VNET_LINK_ARP, +} __attribute__ ((packed)) vnet_link_t; + +#define VNET_LINKS { \ + [VNET_LINK_ETHERNET] = "ethernet", \ + [VNET_LINK_IP4] = "ipv4", \ + [VNET_LINK_IP6] = "ipv6", \ + [VNET_LINK_MPLS] = "mpls", \ + [VNET_LINK_ARP] = "arp", \ +} + +/** + * @brief Number of link types. Not part of the enum so it does not have to be included in + * switch statements + */ +#define VNET_LINK_NUM (VNET_LINK_ARP+1) + +/** + * @brief Convert a link to to an Ethertype + */ +extern vnet_l3_packet_type_t vnet_link_to_l3_proto (vnet_link_t link); + +/** + * @brief Attributes assignable to a HW interface Class. + */ +typedef enum vnet_hw_interface_class_flags_t_ +{ + /** + * @brief a point 2 point interface + */ + VNET_HW_INTERFACE_CLASS_FLAG_P2P = (1 << 0), +} vnet_hw_interface_class_flags_t; /* Layer-2 (e.g. Ethernet) interface class. */ typedef struct _vnet_hw_interface_class @@ -207,6 +281,9 @@ typedef struct _vnet_hw_interface_class /* Class name (e.g. "Ethernet"). */ char *name; + /* Flags */ + vnet_hw_interface_class_flags_t flags; + /* Function to call when hardware interface is added/deleted. */ vnet_interface_function_t *interface_add_del_function; @@ -216,6 +293,9 @@ typedef struct _vnet_hw_interface_class /* Function to call when link state changes. */ vnet_interface_function_t *link_up_down_function; + /* Function to call when link MAC changes. */ + vnet_interface_set_mac_address_function_t *mac_addr_change_function; + /* Format function to display interface name. */ format_function_t *format_interface_name; @@ -234,13 +314,16 @@ typedef struct _vnet_hw_interface_class /* Parser for packet header for e.g. rewrite string. */ unformat_function_t *unformat_header; - /* Forms adjacency for given l3 packet type and destination address. - Returns number of bytes in adjacency. */ - uword (*set_rewrite) (struct vnet_main_t * vnm, - u32 sw_if_index, - u32 l3_packet_type, - void *dst_address, - void *rewrite, uword max_rewrite_bytes); + /* Builds a rewrite string for the interface to the destination + * for the payload/link type. */ + u8 *(*build_rewrite) (struct vnet_main_t * vnm, + u32 sw_if_index, + vnet_link_t link_type, const void *dst_hw_address); + + /* Update an adjacecny added by FIB (as opposed to via the + * neighbour resolution protocol). */ + void (*update_adjacency) (struct vnet_main_t * vnm, + u32 sw_if_index, u32 adj_index); uword (*is_valid_class_for_interface) (struct vnet_main_t * vnm, u32 hw_if_index, @@ -256,6 +339,20 @@ typedef struct _vnet_hw_interface_class } vnet_hw_interface_class_t; +/** + * @brief Return a complete, zero-length (aka dummy) rewrite + */ +extern u8 *default_build_rewrite (struct vnet_main_t *vnm, + u32 sw_if_index, + vnet_link_t link_type, + const void *dst_hw_address); + +/** + * @brief Default adjacency update function + */ +extern void default_update_adjacency (struct vnet_main_t *vnm, + u32 sw_if_index, u32 adj_index); + #define VNET_HW_INTERFACE_CLASS(x,...) \ __VA_ARGS__ vnet_hw_interface_class_t x; \ static void __vnet_add_hw_interface_class_registration_##x (void) \ @@ -409,6 +506,15 @@ typedef struct } eth; } vnet_sub_interface_t; +typedef enum +{ + /* Always flood */ + VNET_FLOOD_CLASS_NORMAL, + VNET_FLOOD_CLASS_TUNNEL_MASTER, + /* Does not flood when tunnel master is in the same L2 BD */ + VNET_FLOOD_CLASS_TUNNEL_NORMAL +} vnet_flood_class_t; + /* Software-interface. This corresponds to a Ethernet VLAN, ATM vc, a tunnel, etc. Configuration (e.g. IP address) gets attached to software interface. */ @@ -443,8 +549,6 @@ typedef struct u32 link_speed; - u32 output_feature_bitmap; - union { /* VNET_SW_INTERFACE_TYPE_HARDWARE. */ @@ -453,6 +557,8 @@ typedef struct /* VNET_SW_INTERFACE_TYPE_SUB. */ vnet_sub_interface_t sub; }; + + vnet_flood_class_t flood_class; } vnet_sw_interface_t; typedef enum @@ -518,6 +624,8 @@ typedef struct u32 pcap_pkts_to_capture; uword *pcap_drop_filter_hash; + /* feature_arc_index */ + u8 output_feature_arc_index; } vnet_interface_main_t; static inline void @@ -539,30 +647,6 @@ void vnet_pcap_drop_trace_filter_add_del (u32 error_index, int is_add); int vnet_interface_name_renumber (u32 sw_if_index, u32 new_show_dev_instance); - -/* - * Output features - */ - -#define foreach_intf_output_feat \ - _(IPSEC, "ipsec-output") - -/* Feature bitmap positions */ -typedef enum -{ -#define _(sym,str) INTF_OUTPUT_FEAT_##sym, - foreach_intf_output_feat -#undef _ - INTF_OUTPUT_N_FEAT, -} intf_output_feat_t; - -/* flag that we are done with feature path */ -#define INTF_OUTPUT_FEAT_DONE INTF_OUTPUT_N_FEAT - -int vnet_interface_add_del_feature (struct vnet_main_t *vnm, vlib_main_t * vm, - u32 sw_if_index, - intf_output_feat_t feature, int is_add); - #endif /* included_vnet_interface_h */ /*