]> git.proxmox.com Git - mirror_frr.git/blame - pimd/pim_vxlan.h
Merge pull request #10770 from chiragshah6/evpn_dev3
[mirror_frr.git] / pimd / pim_vxlan.h
CommitLineData
b583b035
AK
1/* PIM support for VxLAN BUM flooding
2 *
3 * Copyright (C) 2019 Cumulus Networks, Inc.
4 *
5 * This file is part of FRR.
6 *
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
10 * later version.
11 *
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.
20 */
21
22#ifndef PIM_VXLAN_H
23#define PIM_VXLAN_H
24
d889ab75
AK
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 */
31
32#define vxlan_mlag (vxlan_info.mlag)
33
62429d84
AK
34enum 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)
38};
39
b583b035
AK
40struct pim_vxlan_sg {
41 struct pim_instance *pim;
42
43 /* key */
6fff2cc6 44 pim_sgaddr sg;
b583b035 45 char sg_str[PIM_SG_LEN];
62429d84
AK
46
47 enum pim_vxlan_sg_flags flags;
48 struct pim_upstream *up;
d889ab75 49 struct listnode *work_node; /* to pim_vxlan.work_list */
62429d84
AK
50
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
54 */
55 struct interface *term_oif;
56
57 /* origination info
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
61 */
62 struct interface *iif;
63 /* on a MLAG setup the peerlink is added as a static OIF */
64 struct interface *orig_oif;
b583b035
AK
65};
66
1595f9bb
AK
67enum pim_vxlan_mlag_flags {
68 PIM_VXLAN_MLAGF_NONE = 0,
0309c55d
AK
69 PIM_VXLAN_MLAGF_ENABLED = (1 << 0),
70 PIM_VXLAN_MLAGF_DO_REG = (1 << 1)
1595f9bb
AK
71};
72
1595f9bb
AK
73struct pim_vxlan_mlag {
74 enum pim_vxlan_mlag_flags flags;
05ca004b
AK
75 /* XXX - remove this variable from here */
76 int role;
1595f9bb
AK
77 bool peer_state;
78 /* routed interface setup on top of MLAG peerlink */
79 struct interface *peerlink_rif;
80 struct in_addr reg_addr;
81};
82
d889ab75
AK
83enum pim_vxlan_flags {
84 PIM_VXLANF_NONE = 0,
85 PIM_VXLANF_WORK_INITED = (1 << 0)
86};
87
1595f9bb 88struct pim_vxlan {
d889ab75
AK
89 enum pim_vxlan_flags flags;
90
91 struct thread *work_timer;
92 struct list *work_list;
93 struct listnode *next_work;
94 int max_work_cnt;
95
1595f9bb
AK
96 struct pim_vxlan_mlag mlag;
97};
98
a513da36
AK
99/* zebra adds-
100 * 1. one (S, G) entry where S=local-VTEP-IP and G==BUM-mcast-grp for
101 * each BUM MDT. This is the origination entry.
102 * 2. and one (*, G) entry each MDT. This is the termination place holder.
103 *
104 * Note: This doesn't mean that only (*, G) mroutes are used for tunnel
105 * termination. (S, G) mroutes with ipmr-lo in the OIL can also be
106 * used for tunnel termiation if SPT switchover happens; however such
107 * SG entries are created by traffic and will NOT be a part of the vxlan SG
108 * database.
109 */
110static inline bool pim_vxlan_is_orig_mroute(struct pim_vxlan_sg *vxlan_sg)
111{
2a27f13b 112 return !pim_addr_is_any(vxlan_sg->sg.src);
a513da36
AK
113}
114
a155fed5
AK
115static inline bool pim_vxlan_is_local_sip(struct pim_upstream *up)
116{
2a27f13b
DL
117 return !pim_addr_is_any(up->sg.src) &&
118 up->rpf.source_nexthop.interface &&
119 if_is_loopback(up->rpf.source_nexthop.interface);
a155fed5
AK
120}
121
650d9ad1
AK
122static inline bool pim_vxlan_is_term_dev_cfg(struct pim_instance *pim,
123 struct interface *ifp)
124{
125 return pim->vxlan.term_if_cfg == ifp;
126}
127
f1e2901a 128extern struct pim_vxlan *pim_vxlan_p;
b583b035 129extern struct pim_vxlan_sg *pim_vxlan_sg_find(struct pim_instance *pim,
6fff2cc6 130 pim_sgaddr *sg);
b583b035 131extern struct pim_vxlan_sg *pim_vxlan_sg_add(struct pim_instance *pim,
6fff2cc6
DL
132 pim_sgaddr *sg);
133extern void pim_vxlan_sg_del(struct pim_instance *pim, pim_sgaddr *sg);
b9f3a51c
AK
134extern void pim_vxlan_update_sg_reg_state(struct pim_instance *pim,
135 struct pim_upstream *up, bool reg_join);
332087df 136extern struct pim_interface *pim_vxlan_get_term_ifp(struct pim_instance *pim);
269c1fe1
AK
137extern void pim_vxlan_add_vif(struct interface *ifp);
138extern void pim_vxlan_del_vif(struct interface *ifp);
0a2dcc1c
AK
139extern void pim_vxlan_add_term_dev(struct pim_instance *pim,
140 struct interface *ifp);
141extern void pim_vxlan_del_term_dev(struct pim_instance *pim);
48b33862
AK
142extern bool pim_vxlan_get_register_src(struct pim_instance *pim,
143 struct pim_upstream *up, struct in_addr *src_p);
144extern void pim_vxlan_mlag_update(bool enable, bool peer_state, uint32_t role,
145 struct interface *peerlink_rif,
146 struct in_addr *reg_addr);
0309c55d 147extern bool pim_vxlan_do_mlag_reg(void);
95586137
AK
148extern void pim_vxlan_inherit_mlag_flags(struct pim_instance *pim,
149 struct pim_upstream *up, bool inherit);
b583b035 150
3c582f62
DS
151/* Shutdown of PIM stop the thread */
152extern void pim_vxlan_terminate(void);
b583b035 153#endif /* PIM_VXLAN_H */