]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_mplsvpn.h
Merge pull request #1935 from qlyoung/doc-how-to-style
[mirror_frr.git] / bgpd / bgp_mplsvpn.h
1 /* MPLS-VPN
2 * Copyright (C) 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
3 *
4 * This file is part of GxNU Zebra.
5 *
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
9 * later version.
10 *
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #ifndef _QUAGGA_BGP_MPLSVPN_H
22 #define _QUAGGA_BGP_MPLSVPN_H
23
24 #include "bgpd/bgp_route.h"
25 #include "bgpd/bgp_rd.h"
26 #include "bgpd/bgp_zebra.h"
27
28 #define MPLS_LABEL_IS_SPECIAL(label) ((label) <= MPLS_LABEL_EXTENSION)
29 #define MPLS_LABEL_IS_NULL(label) \
30 ((label) == MPLS_LABEL_IPV4_EXPLICIT_NULL \
31 || (label) == MPLS_LABEL_IPV6_EXPLICIT_NULL \
32 || (label) == MPLS_LABEL_IMPLICIT_NULL)
33
34 #define BGP_VPNVX_HELP_STR \
35 "Address Family\n" \
36 "Address Family\n"
37
38 #define V4_HEADER \
39 " Network Next Hop Metric LocPrf Weight Path\n"
40 #define V4_HEADER_TAG " Network Next Hop In tag/Out tag\n"
41 #define V4_HEADER_OVERLAY \
42 " Network Next Hop EthTag Overlay Index RouterMac\n"
43
44 extern void bgp_mplsvpn_init(void);
45 extern int bgp_nlri_parse_vpn(struct peer *, struct attr *, struct bgp_nlri *);
46 extern u_int32_t decode_label(mpls_label_t *);
47 extern void encode_label(mpls_label_t, mpls_label_t *);
48
49 extern int argv_find_and_parse_vpnvx(struct cmd_token **argv, int argc,
50 int *index, afi_t *afi);
51 extern int bgp_show_mpls_vpn(struct vty *vty, afi_t afi, struct prefix_rd *prd,
52 enum bgp_show_type type, void *output_arg,
53 int tags, u_char use_json);
54
55 extern void vpn_leak_from_vrf_update(struct bgp *bgp_vpn, struct bgp *bgp_vrf,
56 struct bgp_info *info_vrf);
57
58 extern void vpn_leak_from_vrf_withdraw(struct bgp *bgp_vpn, struct bgp *bgp_vrf,
59 struct bgp_info *info_vrf);
60
61 extern void vpn_leak_from_vrf_withdraw_all(struct bgp *bgp_vpn,
62 struct bgp *bgp_vrf, afi_t afi);
63
64 extern void vpn_leak_from_vrf_update_all(struct bgp *bgp_vpn,
65 struct bgp *bgp_vrf, afi_t afi);
66
67 extern void vpn_leak_to_vrf_withdraw_all(struct bgp *bgp_vrf, afi_t afi);
68
69 extern void vpn_leak_to_vrf_update_all(struct bgp *bgp_vrf, struct bgp *bgp_vpn,
70 afi_t afi);
71
72 extern void vpn_leak_to_vrf_update(struct bgp *bgp_vpn,
73 struct bgp_info *info_vpn);
74
75 extern void vpn_leak_to_vrf_withdraw(struct bgp *bgp_vpn,
76 struct bgp_info *info_vpn);
77
78 extern void vpn_leak_zebra_vrf_label_update(struct bgp *bgp, afi_t afi);
79 extern void vpn_leak_zebra_vrf_label_withdraw(struct bgp *bgp, afi_t afi);
80
81 static inline int vpn_leak_to_vpn_active(struct bgp *bgp_vrf, afi_t afi,
82 const char **pmsg)
83 {
84 if (bgp_vrf->inst_type != BGP_INSTANCE_TYPE_VRF
85 && bgp_vrf->inst_type != BGP_INSTANCE_TYPE_DEFAULT) {
86
87 if (pmsg)
88 *pmsg = "source bgp instance neither vrf nor default";
89 return 0;
90 }
91
92 /* Is vrf configured to export to vpn? */
93 if (!CHECK_FLAG(bgp_vrf->af_flags[afi][SAFI_UNICAST],
94 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT)) {
95 if (pmsg)
96 *pmsg = "export not set";
97 return 0;
98 }
99
100 /* Is there an RT list set? */
101 if (!bgp_vrf->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN]) {
102 if (pmsg)
103 *pmsg = "rtlist tovpn not defined";
104 return 0;
105 }
106
107 /* Is there an RD set? */
108 if (!CHECK_FLAG(bgp_vrf->vpn_policy[afi].flags,
109 BGP_VPN_POLICY_TOVPN_RD_SET)) {
110 if (pmsg)
111 *pmsg = "rd not defined";
112 return 0;
113 }
114 return 1;
115 }
116
117 static inline int vpn_leak_from_vpn_active(struct bgp *bgp_vrf, afi_t afi,
118 const char **pmsg)
119 {
120 if (bgp_vrf->inst_type != BGP_INSTANCE_TYPE_VRF
121 && bgp_vrf->inst_type != BGP_INSTANCE_TYPE_DEFAULT) {
122
123 if (pmsg)
124 *pmsg = "destination bgp instance neither vrf nor default";
125 return 0;
126 }
127
128 /* Is vrf configured to import from vpn? */
129 if (!CHECK_FLAG(bgp_vrf->af_flags[afi][SAFI_UNICAST],
130 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT)) {
131 if (pmsg)
132 *pmsg = "import not set";
133 return 0;
134 }
135 if (!bgp_vrf->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN]) {
136 if (pmsg)
137 *pmsg = "rtlist fromvpn not defined";
138 return 0;
139 }
140 return 1;
141 }
142
143 static inline void vpn_leak_prechange(vpn_policy_direction_t direction,
144 afi_t afi, struct bgp *bgp_vpn,
145 struct bgp *bgp_vrf)
146 {
147 if ((direction == BGP_VPN_POLICY_DIR_FROMVPN) &&
148 vpn_leak_from_vpn_active(bgp_vrf, afi, NULL)) {
149
150 vpn_leak_to_vrf_withdraw_all(bgp_vrf, afi);
151 }
152 if ((direction == BGP_VPN_POLICY_DIR_TOVPN) &&
153 vpn_leak_to_vpn_active(bgp_vrf, afi, NULL)) {
154
155 vpn_leak_from_vrf_withdraw_all(bgp_vpn, bgp_vrf, afi);
156 }
157 }
158
159 static inline void vpn_leak_postchange(vpn_policy_direction_t direction,
160 afi_t afi, struct bgp *bgp_vpn,
161 struct bgp *bgp_vrf)
162 {
163 if (direction == BGP_VPN_POLICY_DIR_FROMVPN)
164 vpn_leak_to_vrf_update_all(bgp_vrf, bgp_vpn, afi);
165 if (direction == BGP_VPN_POLICY_DIR_TOVPN) {
166
167 if (bgp_vrf->vpn_policy[afi].tovpn_label !=
168 bgp_vrf->vpn_policy[afi]
169 .tovpn_zebra_vrf_label_last_sent) {
170 vpn_leak_zebra_vrf_label_update(bgp_vrf, afi);
171 }
172
173 vpn_leak_from_vrf_update_all(bgp_vpn, bgp_vrf, afi);
174 }
175 }
176
177 extern void vpn_policy_routemap_event(const char *rmap_name);
178
179 #endif /* _QUAGGA_BGP_MPLSVPN_H */