Adjacency layout change and move to vnet/adj
[vpp.git] / src / vnet / ip / lookup.h
index f76ddb3..662a1cc 100644 (file)
 #include <vnet/ip/ip4_packet.h>
 #include <vnet/ip/ip6_packet.h>
 #include <vnet/fib/fib_node.h>
+#include <vnet/adj/adj.h>
 #include <vnet/dpo/dpo.h>
 #include <vnet/feature/feature.h>
-#include <vnet/rewrite.h>
-
-/** @brief Common (IP4/IP6) next index stored in adjacency. */
-typedef enum
-{
-  /** Adjacency to drop this packet. */
-  IP_LOOKUP_NEXT_DROP,
-  /** Adjacency to punt this packet. */
-  IP_LOOKUP_NEXT_PUNT,
-
-  /** This packet is for one of our own IP addresses. */
-  IP_LOOKUP_NEXT_LOCAL,
-
-  /** This packet matches an "incomplete adjacency" and packets
-     need to be passed to ARP to find rewrite string for
-     this destination. */
-  IP_LOOKUP_NEXT_ARP,
-
-  /** This packet matches an "interface route" and packets
-     need to be passed to ARP to find rewrite string for
-     this destination. */
-  IP_LOOKUP_NEXT_GLEAN,
-
-  /** This packet is to be rewritten and forwarded to the next
-     processing node.  This is typically the output interface but
-     might be another node for further output processing. */
-  IP_LOOKUP_NEXT_REWRITE,
-
-  /** This packets follow a load-balance */
-  IP_LOOKUP_NEXT_LOAD_BALANCE,
-
-  /** This packets follow a mid-chain adjacency */
-  IP_LOOKUP_NEXT_MIDCHAIN,
-
-  /** This packets needs to go to ICMP error */
-  IP_LOOKUP_NEXT_ICMP_ERROR,
-
-  /** Multicast Adjacency. */
-  IP_LOOKUP_NEXT_MCAST,
-
-  IP_LOOKUP_N_NEXT,
-} ip_lookup_next_t;
-
-typedef enum
-{
-  IP4_LOOKUP_N_NEXT = IP_LOOKUP_N_NEXT,
-} ip4_lookup_next_t;
-
-typedef enum
-{
-  /* Hop-by-hop header handling */
-  IP6_LOOKUP_NEXT_HOP_BY_HOP = IP_LOOKUP_N_NEXT,
-  IP6_LOOKUP_NEXT_ADD_HOP_BY_HOP,
-  IP6_LOOKUP_NEXT_POP_HOP_BY_HOP,
-  IP6_LOOKUP_N_NEXT,
-} ip6_lookup_next_t;
-
-#define IP4_LOOKUP_NEXT_NODES {                                        \
-    [IP_LOOKUP_NEXT_DROP] = "ip4-drop",                                \
-    [IP_LOOKUP_NEXT_PUNT] = "ip4-punt",                                \
-    [IP_LOOKUP_NEXT_LOCAL] = "ip4-local",                      \
-    [IP_LOOKUP_NEXT_ARP] = "ip4-arp",                          \
-    [IP_LOOKUP_NEXT_GLEAN] = "ip4-glean",                      \
-    [IP_LOOKUP_NEXT_REWRITE] = "ip4-rewrite",                  \
-    [IP_LOOKUP_NEXT_MCAST] = "ip4-rewrite-mcast",              \
-    [IP_LOOKUP_NEXT_MIDCHAIN] = "ip4-midchain",                        \
-    [IP_LOOKUP_NEXT_LOAD_BALANCE] = "ip4-load-balance",                \
-    [IP_LOOKUP_NEXT_ICMP_ERROR] = "ip4-icmp-error",            \
-}
-
-#define IP6_LOOKUP_NEXT_NODES {                                        \
-    [IP_LOOKUP_NEXT_DROP] = "ip6-drop",                                \
-    [IP_LOOKUP_NEXT_PUNT] = "ip6-punt",                                \
-    [IP_LOOKUP_NEXT_LOCAL] = "ip6-local",                      \
-    [IP_LOOKUP_NEXT_ARP] = "ip6-discover-neighbor",            \
-    [IP_LOOKUP_NEXT_GLEAN] = "ip6-glean",                      \
-    [IP_LOOKUP_NEXT_REWRITE] = "ip6-rewrite",                  \
-    [IP_LOOKUP_NEXT_MCAST] = "ip6-rewrite-mcast",              \
-    [IP_LOOKUP_NEXT_MIDCHAIN] = "ip6-midchain",                        \
-    [IP_LOOKUP_NEXT_LOAD_BALANCE] = "ip6-load-balance",                \
-    [IP_LOOKUP_NEXT_ICMP_ERROR] = "ip6-icmp-error",            \
-    [IP6_LOOKUP_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",   \
-}
 
 /** Flow hash configuration */
 #define IP_FLOW_HASH_SRC_ADDR (1<<0)
@@ -165,129 +81,6 @@ _(reverse, IP_FLOW_HASH_REVERSE_SRC_DST)
  */
 typedef u32 flow_hash_config_t;
 
-/**
- * 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);
-
-/**
- * @brief Flags on an IP adjacency
- */
-typedef enum ip_adjacency_flags_t_
-{
-    /**
-     * Currently a sync walk is active. Used to prevent re-entrant walking
-     */
-  IP_ADJ_SYNC_WALK_ACTIVE = (1 << 0),
-} ip_adjacency_flags_t;
-
-/** @brief IP unicast adjacency.
-    @note cache aligned.
-*/
-typedef struct ip_adjacency_t_
-{
-  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
-
-  /** Number of adjecencies in block.  Greater than 1 means multipath;
-     otherwise equal to 1. */
-  u16 n_adj;
-
-  /** Next hop after ip4-lookup. */
-  union
-  {
-    ip_lookup_next_t lookup_next_index:16;
-    u16 lookup_next_index_as_int;
-  };
-
-  /** Interface address index for this local/arp adjacency. */
-  u32 if_address_index;
-
-  /*
-   * link/ether-type
-   */
-  vnet_link_t ia_link;
-  u8 ia_nh_proto;
-
-  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
-       */
-      ip46_address_t next_hop;
-      /**
-       * The node index of the tunnel's post rewrite/TX function.
-       */
-      u32 tx_function_node;
-      /**
-       * The next DPO to use
-       */
-      dpo_id_t next_dpo;
-      /**
-       * A function to perform the post-rewrite fixup
-       */
-      adj_midchain_fixup_t fixup_func;
-    } midchain;
-    /**
-     * IP_LOOKUP_NEXT_GLEAN
-     *
-     * Glean the address to ARP for from the packet's destination
-     */
-    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);
-
-  /*
-   * member not accessed in the data plane are relgated to the
-   * remaining cachelines
-   */
-  fib_node_t ia_node;
-
-  /**
-   * Flags on the adjacency
-   */
-  ip_adjacency_flags_t ia_flags;
-
-} 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");
-
 /* An all zeros address */
 extern const ip46_address_t zero_addr;