2 * Copyright (C) 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
4 * This file is part of GxNU Zebra.
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
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.
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
21 #ifndef _QUAGGA_BGP_MPLSVPN_H
22 #define _QUAGGA_BGP_MPLSVPN_H
24 #include "bgpd/bgp_route.h"
25 #include "bgpd/bgp_rd.h"
26 #include "bgpd/bgp_zebra.h"
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)
34 #define BGP_VPNVX_HELP_STR \
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"
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
*);
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
);
55 extern void vpn_leak_from_vrf_update(struct bgp
*bgp_vpn
, struct bgp
*bgp_vrf
,
56 struct bgp_info
*info_vrf
);
58 extern void vpn_leak_from_vrf_withdraw(struct bgp
*bgp_vpn
, struct bgp
*bgp_vrf
,
59 struct bgp_info
*info_vrf
);
61 extern void vpn_leak_from_vrf_withdraw_all(struct bgp
*bgp_vpn
,
62 struct bgp
*bgp_vrf
, afi_t afi
);
64 extern void vpn_leak_from_vrf_update_all(struct bgp
*bgp_vpn
,
65 struct bgp
*bgp_vrf
, afi_t afi
);
67 extern void vpn_leak_to_vrf_withdraw_all(struct bgp
*bgp_vrf
, afi_t afi
);
69 extern void vpn_leak_to_vrf_update_all(struct bgp
*bgp_vrf
, struct bgp
*bgp_vpn
,
72 extern void vpn_leak_to_vrf_update(struct bgp
*bgp_vpn
,
73 struct bgp_info
*info_vpn
);
75 extern void vpn_leak_to_vrf_withdraw(struct bgp
*bgp_vpn
,
76 struct bgp_info
*info_vpn
);
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
);
81 static inline int vpn_leak_to_vpn_active(struct bgp
*bgp_vrf
, afi_t afi
,
84 /* Is vrf configured to export to vpn? */
85 if (!CHECK_FLAG(bgp_vrf
->af_flags
[afi
][SAFI_UNICAST
],
86 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)) {
88 *pmsg
= "export not set";
92 /* Is there an RT list set? */
93 if (!bgp_vrf
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]) {
95 *pmsg
= "rtlist tovpn not defined";
99 /* Is there an RD set? */
100 if (!CHECK_FLAG(bgp_vrf
->vpn_policy
[afi
].flags
,
101 BGP_VPN_POLICY_TOVPN_RD_SET
)) {
103 *pmsg
= "rd not defined";
109 static inline int vpn_leak_from_vpn_active(struct bgp
*bgp_vrf
, afi_t afi
,
111 struct bgp_redist
**pred
)
113 struct bgp_redist
*red
;
115 if (bgp_vrf
->inst_type
!= BGP_INSTANCE_TYPE_VRF
116 && bgp_vrf
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
) {
119 *pmsg
= "destination bgp instance neither vrf nor default";
123 /* Hijack zebra redist bits for this route type */
124 red
= bgp_redist_lookup(bgp_vrf
, afi
, ZEBRA_ROUTE_BGP_VPN
, 0);
130 *pmsg
= "redist not set";
133 if (!bgp_vrf
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
135 *pmsg
= "rtlist fromvpn not defined";
141 static inline void vpn_leak_prechange(vpn_policy_direction_t direction
,
142 afi_t afi
, struct bgp
*bgp_vpn
,
145 if (direction
== BGP_VPN_POLICY_DIR_FROMVPN
)
146 vpn_leak_to_vrf_withdraw_all(bgp_vrf
, afi
);
147 if (direction
== BGP_VPN_POLICY_DIR_TOVPN
)
148 vpn_leak_from_vrf_withdraw_all(bgp_vpn
, bgp_vrf
, afi
);
151 static inline void vpn_leak_postchange(vpn_policy_direction_t direction
,
152 afi_t afi
, struct bgp
*bgp_vpn
,
155 if (direction
== BGP_VPN_POLICY_DIR_FROMVPN
)
156 vpn_leak_to_vrf_update_all(bgp_vrf
, bgp_vpn
, afi
);
157 if (direction
== BGP_VPN_POLICY_DIR_TOVPN
) {
159 if (bgp_vrf
->vpn_policy
[afi
].tovpn_label
160 != bgp_vrf
->vpn_policy
[afi
]
161 .tovpn_zebra_vrf_label_last_sent
) {
162 vpn_leak_zebra_vrf_label_update(bgp_vrf
, afi
);
165 vpn_leak_from_vrf_update_all(bgp_vpn
, bgp_vrf
, afi
);
167 if (direction
== BGP_VPN_POLICY_DIR_TOVPN
)
168 vpn_leak_from_vrf_update_all(bgp_vpn
, bgp_vrf
, afi
);
171 extern void vpn_policy_routemap_event(const char *rmap_name
);
173 #endif /* _QUAGGA_BGP_MPLSVPN_H */