X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=vnet%2Fvnet%2Finterface.h;h=1f5dcf1600aaad10104ccd1a41253cc0c1271439;hb=ff7d642f3db5302e1fe70b6f1b9afdb4c63fa1d8;hp=7738bb6edc7ffb1c05b3ee887ed6ec53da425d36;hpb=ba868bb7898edc46ad5f8cd4925af6c8b92e7c89;p=vpp.git diff --git a/vnet/vnet/interface.h b/vnet/vnet/interface.h index 7738bb6edc7..1f5dcf1600a 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) @@ -55,6 +57,10 @@ typedef clib_error_t *(vnet_subif_add_del_function_t) (struct vnet_main_t * vnm, u32 if_index, struct vnet_sw_interface_t * template, int is_add); +/* Interface set mac address callback. */ +typedef clib_error_t *(vnet_interface_set_mac_address_function_t) + (struct vnet_hw_interface_t * hi, char *address); + typedef struct _vnet_interface_function_list_elt { struct _vnet_interface_function_list_elt *next_interface_function; @@ -151,6 +157,8 @@ typedef struct _vnet_device_class /* Do not splice vnet_interface_output_node into TX path */ u8 no_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,...) \ @@ -190,6 +198,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 @@ -200,6 +255,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; @@ -227,13 +285,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, @@ -249,6 +310,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) \ @@ -459,7 +534,8 @@ typedef enum VNET_INTERFACE_COUNTER_RX_MISS = 5, VNET_INTERFACE_COUNTER_RX_ERROR = 6, VNET_INTERFACE_COUNTER_TX_ERROR = 7, - VNET_N_SIMPLE_INTERFACE_COUNTER = 8, + VNET_INTERFACE_COUNTER_MPLS = 8, + VNET_N_SIMPLE_INTERFACE_COUNTER = 9, /* Combined counters. */ VNET_INTERFACE_COUNTER_RX = 0, VNET_INTERFACE_COUNTER_TX = 1,