]>
Commit | Line | Data |
---|---|---|
cd1964ff DS |
1 | /* BGP carrying Label information |
2 | * Copyright (C) 2013 Cumulus Networks, Inc. | |
3 | * | |
4 | * This file is part of GNU 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 | * | |
896014f4 DL |
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 | |
cd1964ff DS |
19 | */ |
20 | ||
21 | #ifndef _BGP_LABEL_H | |
22 | #define _BGP_LABEL_H | |
23 | ||
24 | #define BGP_LABEL_BYTES 3 | |
25 | #define BGP_LABEL_BITS 24 | |
26 | #define BGP_WITHDRAW_LABEL 0x800000 | |
13b7e7f0 | 27 | #define BGP_PREVENT_VRF_2_VRF_LEAK 0xFFFFFFFE |
cd1964ff DS |
28 | |
29 | struct bgp_node; | |
30 | struct bgp_info; | |
31 | struct peer; | |
32 | ||
d62a17ae | 33 | extern void bgp_reg_dereg_for_label(struct bgp_node *rn, struct bgp_info *ri, |
34 | int reg); | |
cd1964ff | 35 | extern int bgp_parse_fec_update(void); |
9bedbb1e | 36 | extern mpls_label_t bgp_adv_label(struct bgp_node *rn, struct bgp_info *ri, |
d62a17ae | 37 | struct peer *to, afi_t afi, safi_t safi); |
cd1964ff | 38 | |
d62a17ae | 39 | extern int bgp_nlri_parse_label(struct peer *peer, struct attr *attr, |
40 | struct bgp_nlri *packet); | |
cd1964ff | 41 | |
d62a17ae | 42 | static inline int bgp_labeled_safi(safi_t safi) |
cd1964ff | 43 | { |
d62a17ae | 44 | /* NOTE: This API really says a label (tag) MAY be present. Not all EVPN |
45 | * routes will have a label. | |
46 | */ | |
47 | if ((safi == SAFI_LABELED_UNICAST) || (safi == SAFI_MPLS_VPN) | |
48 | || (safi == SAFI_EVPN)) | |
49 | return 1; | |
50 | return 0; | |
cd1964ff DS |
51 | } |
52 | ||
d62a17ae | 53 | static inline int bgp_is_withdraw_label(mpls_label_t *label) |
cd1964ff | 54 | { |
d7c0a89a | 55 | uint8_t *pkt = (uint8_t *)label; |
d62a17ae | 56 | |
57 | /* The check on pkt[2] for 0x00 or 0x02 is in case bgp_set_valid_label() | |
58 | * was called on the withdraw label */ | |
59 | if ((pkt[0] == 0x80) && (pkt[1] == 0x00) | |
60 | && ((pkt[2] == 0x00) || (pkt[2] == 0x02))) | |
61 | return 1; | |
62 | return 0; | |
cd1964ff DS |
63 | } |
64 | ||
d62a17ae | 65 | static inline int bgp_is_valid_label(mpls_label_t *label) |
cd1964ff | 66 | { |
d7c0a89a | 67 | uint8_t *t = (uint8_t *)label; |
d62a17ae | 68 | if (!t) |
69 | return 0; | |
70 | return (t[2] & 0x02); | |
cd1964ff DS |
71 | } |
72 | ||
d62a17ae | 73 | static inline void bgp_set_valid_label(mpls_label_t *label) |
cd1964ff | 74 | { |
d7c0a89a | 75 | uint8_t *t = (uint8_t *)label; |
d62a17ae | 76 | if (t) |
77 | t[2] |= 0x02; | |
cd1964ff DS |
78 | } |
79 | ||
d62a17ae | 80 | static inline void bgp_unset_valid_label(mpls_label_t *label) |
cd1964ff | 81 | { |
d7c0a89a | 82 | uint8_t *t = (uint8_t *)label; |
d62a17ae | 83 | if (t) |
84 | t[2] &= ~0x02; | |
cd1964ff DS |
85 | } |
86 | ||
d62a17ae | 87 | static inline void bgp_register_for_label(struct bgp_node *rn, |
88 | struct bgp_info *ri) | |
cd1964ff | 89 | { |
d62a17ae | 90 | bgp_reg_dereg_for_label(rn, ri, 1); |
cd1964ff DS |
91 | } |
92 | ||
d62a17ae | 93 | static inline void bgp_unregister_for_label(struct bgp_node *rn) |
cd1964ff | 94 | { |
d62a17ae | 95 | bgp_reg_dereg_for_label(rn, NULL, 0); |
cd1964ff DS |
96 | } |
97 | ||
98 | /* Label stream to value */ | |
d7c0a89a | 99 | static inline uint32_t label_pton(mpls_label_t *label) |
cd1964ff | 100 | { |
d7c0a89a | 101 | uint8_t *t = (uint8_t *)label; |
d62a17ae | 102 | return ((((unsigned int)t[0]) << 12) | (((unsigned int)t[1]) << 4) |
103 | | ((unsigned int)((t[2] & 0xF0) >> 4))); | |
cd1964ff DS |
104 | } |
105 | ||
106 | /* Encode label values */ | |
d7c0a89a | 107 | static inline void label_ntop(uint32_t l, int bos, mpls_label_t *label) |
cd1964ff | 108 | { |
d7c0a89a | 109 | uint8_t *t = (uint8_t *)label; |
d62a17ae | 110 | t[0] = ((l & 0x000FF000) >> 12); |
111 | t[1] = ((l & 0x00000FF0) >> 4); | |
112 | t[2] = ((l & 0x0000000F) << 4); | |
113 | if (bos) | |
114 | t[2] |= 0x01; | |
cd1964ff DS |
115 | } |
116 | ||
117 | /* Return BOS value of label stream */ | |
d7c0a89a | 118 | static inline uint8_t label_bos(mpls_label_t *label) |
cd1964ff | 119 | { |
d7c0a89a | 120 | uint8_t *t = (uint8_t *)label; |
d62a17ae | 121 | return (t[2] & 0x01); |
cd1964ff DS |
122 | }; |
123 | ||
124 | #endif /* _BGP_LABEL_H */ |