summaryrefslogtreecommitdiffstats
path: root/src/vnet/interface_api.c
AgeCommit message (Expand)AuthorFilesLines
2020-02-26api: improve api string safetyJakub Grajciar1-1/+1
2019-12-10api: multiple connections per processDave Barach1-1/+1
2019-11-14interface: send proper link/admin status in eventAlexander Chernavin1-4/+5
2019-11-12interface: Allow VLAN tag-rewrite on non-sub-interfaces too.Jon Loeliger1-18/+18
2019-11-07interface: shmemioerror while getting name_filter argAleksander Djuric1-3/+2
2019-10-29ethernet: VNET API to create sub-interfacesNeale Ranns1-55/+11
2019-10-09interface: dump the interface device typeMohsin Kazmi1-0/+6
2019-10-09interface: callback to manage extra MAC addressesMatthew Smith1-0/+29
2019-09-16api: autogenerate api trace print/endianOle Troan1-2/+4
2019-09-03api: enforce vla is last and fixed string typeOle Troan1-17/+13
2019-08-20api: Cleanup APIs interface.apiJakub Grajciar1-68/+102
2019-07-23api: binary api cleanupDave Barach1-0/+3
2019-06-14interface: interface dump API check validity of sw_if_indexNeale Ranns1-1/+1
2019-05-22stats: support multiple works for error countersOle Troan1-16/+0
2019-05-17Add a debug-CLI leak-checkerDave Barach1-31/+13
2019-05-03mp_safe SW_INTERFACE_DUMP, SW_INTERFACE_DETAILS, SW_INTERFACE_TAG_ADD_DEL,Steven Luong1-0/+5
2019-04-26IF: return VTR attributes for all ifs in dump APIAlexander Chernavin1-20/+20
2019-04-23API sw_interface_dump: Dump all if index is zeroVratko Polak1-2/+2
2019-04-17Make sw_interface_dump more compatible with 2.2.0Vratko Polak1-3/+1
2019-04-17api: Add to interface crud - read by sw_if_index.Paul Vinciguerra1-0/+22
2019-04-10API: Fix shared memory only action handlers.Ole Troan1-52/+69
2019-03-15Revert "API: Cleanup APIs interface.api"Ole Trøan1-64/+48
2019-03-15API: Cleanup APIs interface.apiJakub Grajciar1-48/+64
2019-03-07assign flood_class to vnet_sw_interface_t template in subif api handle functionJoe Zhou1-0/+2
2018-11-20Link speed sent as little endian across APIOle Troan1-1/+1
2018-11-08vnet: store hw interface speed in kbps instead of using flagsDamjan Marion1-2/+1
2018-10-23c11 safe string handling supportDave Barach1-7/+7
2018-09-26itf: dump interface rx-placementMohsin Kazmi1-0/+93
2018-09-24Trivial: Clean up some typos.Paul Vinciguerra1-3/+3
2018-08-24rx-placement: Add API call for interface rx-placementMohsin Kazmi1-0/+41
2018-07-20IP directed broadcastNeale Ranns1-1/+20
2018-06-11MTU: Software interface / Per-protocol MTU supportOle Troan1-2/+29
2018-05-18IP table bind allowed only if table existsNeale Ranns1-30/+6
2018-04-13Revert "MTU: Setting of MTU on software interface (instead of hardware interf...Damjan Marion1-2/+31
2018-04-13MTU: Setting of MTU on software interface (instead of hardware interface)Ole Troan1-31/+2
2018-04-04Detailed stats collection featureNeale Ranns1-8/+3
2018-03-19Interface Unicast, Multicast and Broadcast stats on the APINeale Ranns1-1/+21
2018-03-18Remove unnumbered configuration on interface deleteNeale Ranns1-37/+2
2018-03-16IPv6 ND Router discovery control plane (VPP-1095)Juraj Sloboda1-0/+32
2018-02-12Improve MTU handlingNeale Ranns1-6/+1
2018-01-11api: remove transport specific code from handlersFlorin Coras1-16/+17
2018-01-09api: refactor vlibmemoryFlorin Coras1-7/+6
2017-11-10Break up vpe.apiNeale Ranns1-1/+249
2017-10-31Fix set interface mac address API to be endian neutralJohn Lo1-9/+2
2017-10-29devices: Add binary API for set interface <interface> rx-modeSteven1-0/+29
2017-10-15Revert "Enforce FIB table creation before use"Florin Coras1-8/+35
2017-10-13Enforce FIB table creation before useNeale Ranns1-35/+8
2017-10-04Set MAC address needs the HW interface indexNeale Ranns1-1/+3
2017-10-03Repair vlib API socket serverDave Barach1-7/+11
2017-10-03Propagate duplicate IF addr add/del error up to API.Jon Loeliger1-6/+17
OOKUP_NEXT_HOP_BY_HOP] = "ip6-hop-by-hop", \ [IP6_LOOKUP_NEXT_ADD_HOP_BY_HOP] = "ip6-add-hop-by-hop", \ [IP6_LOOKUP_NEXT_POP_HOP_BY_HOP] = "ip6-pop-hop-by-hop", \ } /** * The special broadcast address (to construct a broadcast adjacency */ extern const ip46_address_t ADJ_BCAST_ADDR; /** * Forward delcartion */ struct ip_adjacency_t_; /** * @brief A function type for post-rewrite fixups on midchain adjacency */ typedef void (*adj_midchain_fixup_t) (vlib_main_t * vm, struct ip_adjacency_t_ * adj, vlib_buffer_t * b0, const void *data); /** * @brief Flags on an IP adjacency */ typedef enum adj_attr_t_ { /** * Currently a sync walk is active. Used to prevent re-entrant walking */ ADJ_ATTR_SYNC_WALK_ACTIVE = 0, /** * Packets TX through the midchain do not increment the interface * counters. This should be used when the adj is associated with an L2 * interface and that L2 interface is in a bridege domain. In that case * the packet will have traversed the interface's TX node, and hence have * been counted, before it traverses ths midchain */ ADJ_ATTR_MIDCHAIN_NO_COUNT, /** * When stacking midchains on a fib-entry extract the choice from the * load-balance returned based on an IP hash of the adj's rewrite */ ADJ_ATTR_MIDCHAIN_IP_STACK, /** * If the midchain were to stack on its FIB entry a loop would form. */ ADJ_ATTR_MIDCHAIN_LOOPED, } adj_attr_t; #define ADJ_ATTR_NAMES { \ [ADJ_ATTR_SYNC_WALK_ACTIVE] = "walk-active", \ [ADJ_ATTR_MIDCHAIN_NO_COUNT] = "midchain-no-count", \ [ADJ_ATTR_MIDCHAIN_IP_STACK] = "midchain-ip-stack", \ [ADJ_ATTR_MIDCHAIN_LOOPED] = "midchain-looped", \ } #define FOR_EACH_ADJ_ATTR(_attr) \ for (_attr = ADJ_ATTR_SYNC_WALK_ACTIVE; \ _attr <= ADJ_ATTR_MIDCHAIN_LOOPED; \ _attr++) /** * @brief Flags on an IP adjacency */ typedef enum adj_flags_t_ { ADJ_FLAG_NONE = 0, ADJ_FLAG_SYNC_WALK_ACTIVE = (1 << ADJ_ATTR_SYNC_WALK_ACTIVE), ADJ_FLAG_MIDCHAIN_NO_COUNT = (1 << ADJ_ATTR_MIDCHAIN_NO_COUNT), ADJ_FLAG_MIDCHAIN_IP_STACK = (1 << ADJ_ATTR_MIDCHAIN_IP_STACK), ADJ_FLAG_MIDCHAIN_LOOPED = (1 << ADJ_ATTR_MIDCHAIN_LOOPED), } __attribute__ ((packed)) adj_flags_t; /** * @brief Format adjacency flags */ extern u8* format_adj_flags(u8 * s, va_list * args); /** * @brief IP unicast adjacency. * @note cache aligned. * * An adjacency is a represenation of a peer on a particular link. */ typedef struct ip_adjacency_t_ { CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); /** * Linkage into the FIB node grpah. First member since this type * has 8 byte alignment requirements. */ fib_node_t ia_node; /** * Next hop after ip4-lookup. * This is not accessed in the rewrite nodes. * 1-bytes */ ip_lookup_next_t lookup_next_index; /** * link/ether-type * 1 bytes */ vnet_link_t ia_link; /** * The protocol of the neighbor/peer. i.e. the protocol with * which to interpret the 'next-hop' attirbutes of the sub-types. * 1-btyes */ fib_protocol_t ia_nh_proto; /** * Flags on the adjacency * 1-bytes */ adj_flags_t ia_flags; union { /** * IP_LOOKUP_NEXT_ARP/IP_LOOKUP_NEXT_REWRITE * * neighbour adjacency sub-type; */ struct { ip46_address_t next_hop; } nbr; /** * IP_LOOKUP_NEXT_MIDCHAIN * * A nbr adj that is also recursive. Think tunnels. * A nbr adj can transition to be of type MDICHAIN * so be sure to leave the two structs with the next_hop * fields aligned. */ struct { /** * The recursive next-hop. * This field MUST be at the same memory location as * sub_type.nbr.next_hop */ ip46_address_t next_hop; /** * The next DPO to use */ dpo_id_t next_dpo; /** * A function to perform the post-rewrite fixup */ adj_midchain_fixup_t fixup_func; /** * Fixup data passed back to the client in the fixup function */ const void *fixup_data; /** * the FIB entry this midchain resolves through. required for recursive * loop detection. */ fib_node_index_t fei; } midchain; /** * IP_LOOKUP_NEXT_GLEAN * * Glean the address to ARP for from the packet's destination. * Technically these aren't adjacencies, i.e. they are not a * representation of a peer. One day we might untangle this coupling * and use a new Glean DPO. */ struct { ip46_address_t receive_addr; } glean; } sub_type; CLIB_CACHE_LINE_ALIGN_MARK (cacheline1); /* Rewrite in second/third cache lines */ vnet_declare_rewrite (VLIB_BUFFER_PRE_DATA_SIZE); /** * more control plane members that do not fit on the first cacheline */ /** * A sorted vector of delegates */ struct adj_delegate_t_ *ia_delegates; } ip_adjacency_t; STATIC_ASSERT ((STRUCT_OFFSET_OF (ip_adjacency_t, cacheline0) == 0), "IP adjacency cachline 0 is not offset"); STATIC_ASSERT ((STRUCT_OFFSET_OF (ip_adjacency_t, cacheline1) == CLIB_CACHE_LINE_BYTES), "IP adjacency cachline 1 is more than one cachline size offset"); /** * @brief * Take a reference counting lock on the adjacency */ extern void adj_lock(adj_index_t adj_index); /** * @brief * Release a reference counting lock on the adjacency */ extern void adj_unlock(adj_index_t adj_index); /** * @brief * Add a child dependent to an adjacency. The child will * thus be informed via its registerd back-walk function * when the adjacency state changes. */ extern u32 adj_child_add(adj_index_t adj_index, fib_node_type_t type, fib_node_index_t child_index); /** * @brief * Remove a child dependent */ extern void adj_child_remove(adj_index_t adj_index, u32 sibling_index); /** * @brief Walk the Adjacencies on a given interface */ extern void adj_walk (u32 sw_if_index, adj_walk_cb_t cb, void *ctx); /** * @brief Return the link type of the adjacency */ extern vnet_link_t adj_get_link_type (adj_index_t ai); /** * @brief Return the sw interface index of the adjacency. */ extern u32 adj_get_sw_if_index (adj_index_t ai); /** * @brief Return true if the adjacency is 'UP', i.e. can be used for forwarding. * 0 is down, !0 is up. */ extern int adj_is_up (adj_index_t ai); /** * @brief Return the link type of the adjacency */ extern const u8* adj_get_rewrite (adj_index_t ai); /** * @brief Notify the adjacency subsystem that the features settings for * an interface have changed */ extern void adj_feature_update (u32 sw_if_index, u8 arc_index, u8 is_enable); /** * @brief descend the FIB graph looking for loops * * @param ai * The adj index to traverse * * @param entry_indicies) * A pointer to a vector of FIB entries already visited. */ extern int adj_recursive_loop_detect (adj_index_t ai, fib_node_index_t **entry_indicies); /** * @brief * The global adjacnecy pool. Exposed for fast/inline data-plane access */ extern ip_adjacency_t *adj_pool; /** * @brief * Adjacency packet counters */ extern vlib_combined_counter_main_t adjacency_counters; /** * @brief Global Config for enabling per-adjacency counters * This is configurable because it comes with a non-negligible * performance cost. */ extern int adj_per_adj_counters; /** * @brief * Get a pointer to an adjacency object from its index */ static inline ip_adjacency_t * adj_get (adj_index_t adj_index) { return (vec_elt_at_index(adj_pool, adj_index)); } /** * @brief Get the global configuration option for enabling per-adj counters */ static inline int adj_are_counters_enabled (void) { return (adj_per_adj_counters); } #endif