vni_t vni;
/* Flag for advertising gw macip */
- u_int8_t advertise_gw_macip;
+ uint8_t advertise_gw_macip;
/* Flag for advertising gw macip */
- u_int8_t advertise_subnet;
+ uint8_t advertise_subnet;
/* Corresponding VxLAN interface. */
struct interface *vxlan_if;
*/
static inline int is_l3vni_oper_up(zebra_l3vni_t *zl3vni)
{
- return (is_evpn_enabled() && zl3vni &&
- (zl3vni->vrf_id != VRF_UNKNOWN) &&
- zl3vni->vxlan_if && if_is_operative(zl3vni->vxlan_if) &&
- zl3vni->svi_if && if_is_operative(zl3vni->svi_if));
+ return (is_evpn_enabled() && zl3vni && (zl3vni->vrf_id != VRF_UNKNOWN)
+ && zl3vni->vxlan_if && if_is_operative(zl3vni->vxlan_if)
+ && zl3vni->svi_if && if_is_operative(zl3vni->svi_if));
}
static inline const char *zl3vni_state2str(zebra_l3vni_t *zl3vni)
return zl3vni->vrf_id;
}
-static inline void zl3vni_get_rmac(zebra_l3vni_t *zl3vni,
- struct ethaddr *rmac)
+static inline void zl3vni_get_rmac(zebra_l3vni_t *zl3vni, struct ethaddr *rmac)
{
if (!zl3vni)
return;
memcpy(rmac->octet, zl3vni->svi_if->hw_addr, ETH_ALEN);
}
+struct host_rb_entry {
+ RB_ENTRY(host_rb_entry) hl_entry;
+
+ struct prefix p;
+};
+
+RB_HEAD(host_rb_tree_entry, host_rb_entry);
+RB_PROTOTYPE(host_rb_tree_entry, host_rb_entry, hl_entry,
+ host_rb_entry_compare);
/*
* MAC hash table.
*
/* MAC address. */
struct ethaddr macaddr;
- u_int32_t flags;
+ uint32_t flags;
#define ZEBRA_MAC_LOCAL 0x01
#define ZEBRA_MAC_REMOTE 0x02
#define ZEBRA_MAC_AUTO 0x04 /* Auto created for neighbor. */
#define ZEBRA_MAC_STICKY 0x08 /* Static MAC */
#define ZEBRA_MAC_REMOTE_RMAC 0x10 /* remote router mac */
#define ZEBRA_MAC_DEF_GW 0x20
+/* remote VTEP advertised MAC as default GW */
+#define ZEBRA_MAC_REMOTE_DEF_GW 0x40
+#define ZEBRA_MAC_DUPLICATE 0x80
+
+ /* back pointer to zvni */
+ zebra_vni_t *zvni;
/* Local or remote info. */
union {
struct in_addr r_vtep_ip;
} fwd_info;
+ /* Mobility sequence numbers associated with this entry. */
+ uint32_t rem_seq;
+ uint32_t loc_seq;
+
/* List of neigh associated with this mac */
struct list *neigh_list;
/* list of hosts pointing to this remote RMAC */
- struct list *host_list;
+ struct host_rb_tree_entry host_rb;
+
+ /* Duplicate mac detection */
+ uint32_t dad_count;
+
+ struct thread *dad_mac_auto_recovery_timer;
+
+ struct timeval detect_start_time;
+
+ time_t dad_dup_detect_time;
};
/*
int uninstall; /* uninstall from kernel? */
int upd_client; /* uninstall from client? */
- u_int32_t flags;
+ uint32_t flags;
#define DEL_LOCAL_MAC 0x1
#define DEL_REMOTE_MAC 0x2
#define DEL_ALL_MAC (DEL_LOCAL_MAC | DEL_REMOTE_MAC)
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 */
+ uint32_t count; /* Used by VTY handlers */
struct json_object *json; /* Used for JSON Output */
+ bool print_dup; /* Used to print dup addr list */
};
struct rmac_walk_ctx {
/* Underlying interface. */
ifindex_t ifindex;
- u_int32_t flags;
+ zebra_vni_t *zvni;
+
+ uint32_t flags;
#define ZEBRA_NEIGH_LOCAL 0x01
#define ZEBRA_NEIGH_REMOTE 0x02
#define ZEBRA_NEIGH_REMOTE_NH 0x04 /* neigh entry for remote vtep */
#define ZEBRA_NEIGH_DEF_GW 0x08
+#define ZEBRA_NEIGH_ROUTER_FLAG 0x10
+#define ZEBRA_NEIGH_DUPLICATE 0x20
enum zebra_neigh_state state;
/* Remote VTEP IP - applicable only for remote neighbors. */
struct in_addr r_vtep_ip;
+ /*
+ * Mobility sequence numbers associated with this entry. The rem_seq
+ * represents the sequence number from the client (BGP) for the most
+ * recent add or update of this entry while the loc_seq represents
+ * the sequence number informed (or to be informed) by zebra to BGP
+ * for this entry.
+ */
+ uint32_t rem_seq;
+ uint32_t loc_seq;
+
/* list of hosts pointing to this remote NH entry */
- struct list *host_list;
+ struct host_rb_tree_entry host_rb;
+
+ /* Duplicate ip detection */
+ uint32_t dad_count;
+
+ struct thread *dad_ip_auto_recovery_timer;
+
+ struct timeval detect_start_time;
+
+ time_t dad_dup_detect_time;
};
/*
int uninstall; /* uninstall from kernel? */
int upd_client; /* uninstall from client? */
- u_int32_t flags;
+ uint32_t flags;
#define DEL_LOCAL_NEIGH 0x1
#define DEL_REMOTE_NEIGH 0x2
#define DEL_ALL_NEIGH (DEL_LOCAL_NEIGH | DEL_REMOTE_NEIGH)
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 */
+ uint32_t count; /* Used by VTY handlers */
+ uint8_t addr_width; /* Used by VTY handlers */
struct json_object *json; /* Used for JSON Output */
};