]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: MAC and Neighbor hash table definition
authorvivek <vivek@cumulusnetworks.com>
Mon, 15 May 2017 05:41:04 +0000 (22:41 -0700)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 12 Jul 2017 16:26:04 +0000 (12:26 -0400)
Define the MAC and Neighbor (ARP/ND) data structures. These are maintained
as hash tables against the VNI. Also, define context structures used for
performing various operations on these two tables.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
zebra/zebra_vxlan_private.h

index c33eba54e854dbdcfe1da6476cfda4e1a18ec316..6d72edcb03304a8bd6e89311e4803b20c11c8950 100644 (file)
@@ -34,6 +34,8 @@
 /* definitions */
 typedef struct zebra_vni_t_ zebra_vni_t;
 typedef struct zebra_vtep_t_ zebra_vtep_t;
+typedef struct zebra_mac_t_ zebra_mac_t;
+typedef struct zebra_neigh_t_ zebra_neigh_t;
 
 /*
  * VTEP info
@@ -71,6 +73,126 @@ struct zebra_vni_t_
 
   /* Local IP */
   struct in_addr local_vtep_ip;
+
+  /* List of local or remote MAC */
+  struct hash *mac_table;
+
+  /* List of local or remote neighbors (MAC+IP) */
+  struct hash *neigh_table;
+};
+
+/*
+ * MAC hash table.
+ *
+ * This table contains the MAC addresses pertaining to this VNI.
+ * This includes local MACs learnt on an attached VLAN that maps
+ * to this VNI as well as remote MACs learnt and installed by BGP.
+ * Local MACs will be known either on a VLAN sub-interface or
+ * on (port, VLAN); however, it is sufficient for zebra to maintain
+ * against the VNI i.e., it does not need to retain the local "port"
+ * information. The correct VNI will be obtained as zebra maintains
+ * the mapping (of VLAN to VNI).
+ */
+struct zebra_mac_t_
+{
+  /* MAC address. */
+  struct ethaddr  macaddr;
+
+  u_int32_t       flags;
+#define ZEBRA_MAC_LOCAL   0x01
+#define ZEBRA_MAC_REMOTE  0x02
+#define ZEBRA_MAC_AUTO    0x04  /* Auto created for neighbor. */
+
+  /* Local or remote info. */
+  union
+    {
+      struct
+        {
+          ifindex_t ifindex;
+          vlanid_t  vid;
+        } local;
+
+      struct in_addr r_vtep_ip;
+    } fwd_info;
+
+  u_int32_t       neigh_refcnt;
+};
+
+/*
+ * Context for MAC hash walk - used by callbacks.
+ */
+struct mac_walk_ctx
+{
+  zebra_vni_t *zvni;          /* VNI hash */
+  struct zebra_vrf *zvrf;     /* VRF - for client notification. */
+  int uninstall;              /* uninstall from kernel? */
+  int upd_client;             /* uninstall from client? */
+
+  u_int32_t flags;
+#define DEL_LOCAL_MAC                0x1
+#define DEL_REMOTE_MAC               0x2
+#define DEL_ALL_MAC                  (DEL_LOCAL_MAC | DEL_REMOTE_MAC)
+#define DEL_REMOTE_MAC_FROM_VTEP     0x4
+#define SHOW_REMOTE_MAC_FROM_VTEP    0x8
+
+  struct in_addr r_vtep_ip;   /* To walk MACs from specific VTEP */
+
+  struct vty *vty;            /* Used by VTY handlers */
+  u_int32_t  count;           /* Used by VTY handlers */
+};
+
+/*
+ * Neighbor hash table.
+ *
+ * This table contains the neighbors (IP to MAC bindings) pertaining to
+ * this VNI. This includes local neighbors learnt on the attached VLAN
+ * device that maps to this VNI as well as remote neighbors learnt and
+ * installed by BGP.
+ * Local neighbors will be known against the VLAN device (SVI); however,
+ * it is sufficient for zebra to maintain against the VNI. The correct
+ * VNI will be obtained as zebra maintains the mapping (of VLAN to VNI).
+ */
+struct zebra_neigh_t_
+{
+  /* IP address. */
+  struct ipaddr   ip;
+
+  /* MAC address. */
+  struct ethaddr  emac;
+
+  /* Underlying interface. */
+  ifindex_t ifindex;
+
+  u_int32_t       flags;
+#define ZEBRA_NEIGH_LOCAL   0x01
+#define ZEBRA_NEIGH_REMOTE  0x02
+
+  /* Remote VTEP IP - applicable only for remote neighbors. */
+  struct in_addr r_vtep_ip;
+};
+
+/*
+ * Context for neighbor hash walk - used by callbacks.
+ */
+struct neigh_walk_ctx
+{
+  zebra_vni_t *zvni;          /* VNI hash */
+  struct zebra_vrf *zvrf;     /* VRF - for client notification. */
+  int uninstall;              /* uninstall from kernel? */
+  int upd_client;             /* uninstall from client? */
+
+  u_int32_t flags;
+#define DEL_LOCAL_NEIGH              0x1
+#define DEL_REMOTE_NEIGH             0x2
+#define DEL_ALL_NEIGH                (DEL_LOCAL_NEIGH | DEL_REMOTE_NEIGH)
+#define DEL_REMOTE_NEIGH_FROM_VTEP   0x4
+#define SHOW_REMOTE_NEIGH_FROM_VTEP  0x8
+
+  struct in_addr r_vtep_ip;   /* To walk neighbors from specific VTEP */
+
+  struct vty *vty;            /* Used by VTY handlers */
+  u_int32_t  count;           /* Used by VTY handlers */
+  u_char     addr_width;      /* Used by VTY handlers */
 };
 
 #endif /* _ZEBRA_VXLAN_PRIVATE_H */