]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_vxlan.h
Merge pull request #5288 from SumitAgarwal123/bfd_docs
[mirror_frr.git] / pimd / pim_vxlan.h
index 5ad6c7d4dad60e25480661d0b0dbe40bd688ef32..f0a66e6b77a4f4323ca872f75161f80d360ccb6e 100644 (file)
 #ifndef PIM_VXLAN_H
 #define PIM_VXLAN_H
 
+/* global timer used for miscellaneous staggered processing */
+#define PIM_VXLAN_WORK_TIME 1
+/* number of SG entries processed at one shot */
+#define PIM_VXLAN_WORK_MAX 500
+/* frequency of periodic NULL registers */
+#define PIM_VXLAN_NULL_REG_INTERVAL 60 /* seconds */
+
+#define vxlan_mlag (vxlan_info.mlag)
+
+enum pim_vxlan_sg_flags {
+       PIM_VXLAN_SGF_NONE = 0,
+       PIM_VXLAN_SGF_DEL_IN_PROG = (1 << 0),
+       PIM_VXLAN_SGF_OIF_INSTALLED = (1 << 1)
+};
+
 struct pim_vxlan_sg {
        struct pim_instance *pim;
 
        /* key */
        struct prefix_sg sg;
        char sg_str[PIM_SG_LEN];
+
+       enum pim_vxlan_sg_flags flags;
+       struct pim_upstream *up;
+       struct listnode *work_node; /* to pim_vxlan.work_list */
+
+       /* termination info (only applicable to termination XG mroutes)
+        * term_if - termination device ipmr-lo is added to the OIL
+        * as local/IGMP membership to allow termination of vxlan traffic
+        */
+       struct interface *term_oif;
+
+       /* origination info
+        * iif - lo/vrf or peerlink (on MLAG setups)
+        * peerlink_oif - added to the OIL to send encapsulated BUM traffic to
+        * the MLAG peer switch
+        */
+       struct interface *iif;
+       /* on a MLAG setup the peerlink is added as a static OIF */
+       struct interface *orig_oif;
+};
+
+enum pim_vxlan_mlag_flags {
+       PIM_VXLAN_MLAGF_NONE = 0,
+       PIM_VXLAN_MLAGF_ENABLED = (1 << 0)
+};
+
+enum pim_vxlan_mlag_role {
+       PIM_VXLAN_MLAG_ROLE_SECONDARY = 0,
+       PIM_VXLAN_MLAG_ROLE_PRIMARY
 };
 
+struct pim_vxlan_mlag {
+       enum pim_vxlan_mlag_flags flags;
+       enum pim_vxlan_mlag_role role;
+       bool peer_state;
+       /* routed interface setup on top of MLAG peerlink */
+       struct interface *peerlink_rif;
+       struct in_addr reg_addr;
+};
+
+enum pim_vxlan_flags {
+       PIM_VXLANF_NONE = 0,
+       PIM_VXLANF_WORK_INITED = (1 << 0)
+};
+
+struct pim_vxlan {
+       enum pim_vxlan_flags flags;
+
+       struct thread *work_timer;
+       struct list *work_list;
+       struct listnode *next_work;
+       int max_work_cnt;
+
+       struct pim_vxlan_mlag mlag;
+};
+
+/* zebra adds-
+ * 1. one (S, G) entry where S=local-VTEP-IP and G==BUM-mcast-grp for
+ * each BUM MDT. This is the origination entry.
+ * 2. and one (*, G) entry each MDT. This is the termination place holder.
+ *
+ * Note: This doesn't mean that only (*, G) mroutes are used for tunnel
+ * termination. (S, G) mroutes with ipmr-lo in the OIL can also be
+ * used for tunnel termiation if SPT switchover happens; however such
+ * SG entries are created by traffic and will NOT be a part of the vxlan SG
+ * database.
+ */
+static inline bool pim_vxlan_is_orig_mroute(struct pim_vxlan_sg *vxlan_sg)
+{
+       return (vxlan_sg->sg.src.s_addr != 0);
+}
+
+extern struct pim_vxlan *pim_vxlan_p;
 extern struct pim_vxlan_sg *pim_vxlan_sg_find(struct pim_instance *pim,
                                            struct prefix_sg *sg);
 extern struct pim_vxlan_sg *pim_vxlan_sg_add(struct pim_instance *pim,
                                           struct prefix_sg *sg);
 extern void pim_vxlan_sg_del(struct pim_instance *pim, struct prefix_sg *sg);
+extern void pim_vxlan_update_sg_reg_state(struct pim_instance *pim,
+               struct pim_upstream *up, bool reg_join);
+extern struct pim_interface *pim_vxlan_get_term_ifp(struct pim_instance *pim);
+extern void pim_vxlan_add_vif(struct interface *ifp);
+extern void pim_vxlan_del_vif(struct interface *ifp);
+extern void pim_vxlan_add_term_dev(struct pim_instance *pim,
+               struct interface *ifp);
+extern void pim_vxlan_del_term_dev(struct pim_instance *pim);
+extern bool pim_vxlan_get_register_src(struct pim_instance *pim,
+               struct pim_upstream *up, struct in_addr *src_p);
+extern void pim_vxlan_mlag_update(bool enable, bool peer_state, uint32_t role,
+                               struct interface *peerlink_rif,
+                               struct in_addr *reg_addr);
+extern void pim_vxlan_config_write(struct vty *vty, char *spaces, int *writes);
 
 #endif /* PIM_VXLAN_H */