1 /* PIM support for VxLAN BUM flooding
3 * Copyright (C) 2019 Cumulus Networks, Inc.
5 * This file is part of FRR.
7 * FRR is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * FRR is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 2 of the License, or
19 * (at your option) any later version.
25 /* global timer used for miscellaneous staggered processing */
26 #define PIM_VXLAN_WORK_TIME 1
27 /* number of SG entries processed at one shot */
28 #define PIM_VXLAN_WORK_MAX 500
29 /* frequency of periodic NULL registers */
30 #define PIM_VXLAN_NULL_REG_INTERVAL 60 /* seconds */
32 #define vxlan_mlag (vxlan_info.mlag)
34 enum pim_vxlan_sg_flags
{
35 PIM_VXLAN_SGF_NONE
= 0,
36 PIM_VXLAN_SGF_DEL_IN_PROG
= (1 << 0),
37 PIM_VXLAN_SGF_OIF_INSTALLED
= (1 << 1)
41 struct pim_instance
*pim
;
45 char sg_str
[PIM_SG_LEN
];
47 enum pim_vxlan_sg_flags flags
;
48 struct pim_upstream
*up
;
49 struct listnode
*work_node
; /* to pim_vxlan.work_list */
51 /* termination info (only applicable to termination XG mroutes)
52 * term_if - termination device ipmr-lo is added to the OIL
53 * as local/IGMP membership to allow termination of vxlan traffic
55 struct interface
*term_oif
;
58 * iif - lo/vrf or peerlink (on MLAG setups)
59 * peerlink_oif - added to the OIL to send encapsulated BUM traffic to
60 * the MLAG peer switch
62 struct interface
*iif
;
63 /* on a MLAG setup the peerlink is added as a static OIF */
64 struct interface
*orig_oif
;
67 enum pim_vxlan_mlag_flags
{
68 PIM_VXLAN_MLAGF_NONE
= 0,
69 PIM_VXLAN_MLAGF_ENABLED
= (1 << 0)
72 enum pim_vxlan_mlag_role
{
73 PIM_VXLAN_MLAG_ROLE_SECONDARY
= 0,
74 PIM_VXLAN_MLAG_ROLE_PRIMARY
77 struct pim_vxlan_mlag
{
78 enum pim_vxlan_mlag_flags flags
;
79 enum pim_vxlan_mlag_role role
;
81 /* routed interface setup on top of MLAG peerlink */
82 struct interface
*peerlink_rif
;
83 struct in_addr reg_addr
;
86 enum pim_vxlan_flags
{
88 PIM_VXLANF_WORK_INITED
= (1 << 0)
92 enum pim_vxlan_flags flags
;
94 struct thread
*work_timer
;
95 struct list
*work_list
;
96 struct listnode
*next_work
;
99 struct pim_vxlan_mlag mlag
;
103 * 1. one (S, G) entry where S=local-VTEP-IP and G==BUM-mcast-grp for
104 * each BUM MDT. This is the origination entry.
105 * 2. and one (*, G) entry each MDT. This is the termination place holder.
107 * Note: This doesn't mean that only (*, G) mroutes are used for tunnel
108 * termination. (S, G) mroutes with ipmr-lo in the OIL can also be
109 * used for tunnel termiation if SPT switchover happens; however such
110 * SG entries are created by traffic and will NOT be a part of the vxlan SG
113 static inline bool pim_vxlan_is_orig_mroute(struct pim_vxlan_sg
*vxlan_sg
)
115 return (vxlan_sg
->sg
.src
.s_addr
!= 0);
118 static inline bool pim_vxlan_is_local_sip(struct pim_upstream
*up
)
120 return (up
->sg
.src
.s_addr
!= INADDR_ANY
) &&
121 up
->rpf
.source_nexthop
.interface
&&
122 if_is_loopback_or_vrf(up
->rpf
.source_nexthop
.interface
);
125 extern struct pim_vxlan
*pim_vxlan_p
;
126 extern struct pim_vxlan_sg
*pim_vxlan_sg_find(struct pim_instance
*pim
,
127 struct prefix_sg
*sg
);
128 extern struct pim_vxlan_sg
*pim_vxlan_sg_add(struct pim_instance
*pim
,
129 struct prefix_sg
*sg
);
130 extern void pim_vxlan_sg_del(struct pim_instance
*pim
, struct prefix_sg
*sg
);
131 extern void pim_vxlan_update_sg_reg_state(struct pim_instance
*pim
,
132 struct pim_upstream
*up
, bool reg_join
);
133 extern struct pim_interface
*pim_vxlan_get_term_ifp(struct pim_instance
*pim
);
134 extern void pim_vxlan_add_vif(struct interface
*ifp
);
135 extern void pim_vxlan_del_vif(struct interface
*ifp
);
136 extern void pim_vxlan_add_term_dev(struct pim_instance
*pim
,
137 struct interface
*ifp
);
138 extern void pim_vxlan_del_term_dev(struct pim_instance
*pim
);
139 extern bool pim_vxlan_get_register_src(struct pim_instance
*pim
,
140 struct pim_upstream
*up
, struct in_addr
*src_p
);
141 extern void pim_vxlan_mlag_update(bool enable
, bool peer_state
, uint32_t role
,
142 struct interface
*peerlink_rif
,
143 struct in_addr
*reg_addr
);
144 extern void pim_vxlan_config_write(struct vty
*vty
, char *spaces
, int *writes
);
146 #endif /* PIM_VXLAN_H */