BUG-5904 Support 2-byte AS Route Distinguisher
[bgpcep.git] / bgp / concepts / src / main / yang / bgp-types.yang
1 module bgp-types {
2     yang-version 1;
3     namespace "urn:opendaylight:params:xml:ns:yang:bgp-types";
4     prefix "bgp-t";
5
6     import ietf-inet-types { prefix inet; revision-date 2010-09-24; }
7     import network-concepts { prefix netc; revision-date 2013-11-25; }
8
9     organization "Cisco Systems, Inc.";
10     contact "Dana Kutenicsova <dkutenic@cisco.com>";
11
12     description
13         "This module contains the base concepts contained in RFC4271 and RFC4760.
14
15         Copyright (c)2013 Cisco Systems, Inc. All rights reserved.
16
17         This program and the accompanying materials are made available
18         under the terms of the Eclipse Public License v1.0 which
19         accompanies this distribution, and is available at
20         http://www.eclipse.org/legal/epl-v10.html";
21
22     revision "2013-09-19" {
23         description
24             "Initial revision.";
25         reference "RFC4271, RFC4760";
26     }
27
28     typedef bgp-origin {
29         reference "http://tools.ietf.org/html/rfc4271#section-5";
30         description "Values of BGP Origin Path Attribute.";
31         type enumeration {
32             enum igp {
33                 value 0;
34             }
35             enum egp {
36                 value 1;
37             }
38             enum incomplete {
39                 value 2;
40             }
41         }
42     }
43
44     identity address-family {
45         reference "http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml#address-family-numbers-2";
46     }
47
48     identity ipv4-address-family {
49         base address-family;
50     }
51
52     identity ipv6-address-family {
53         base address-family;
54     }
55
56     identity subsequent-address-family {
57         reference "http://tools.ietf.org/html/rfc4760#section-6";
58     }
59
60     identity unicast-subsequent-address-family {
61         reference "http://tools.ietf.org/html/rfc4760#section-6";
62
63         base subsequent-address-family;
64     }
65
66     identity mpls-labeled-vpn-subsequent-address-family {
67         reference "http://tools.ietf.org/html/rfc4760#section-6";
68
69         base subsequent-address-family;
70     }
71
72     typedef cluster-identifier {
73         reference "http://tools.ietf.org/html/rfc4456#section-8";
74         type inet:ipv4-address;
75     }
76
77     typedef short-as-number {
78         type inet:as-number {
79             range 0..65535;
80         }
81     }
82
83     typedef route-distinguisher {
84         reference "https://tools.ietf.org/html/rfc4364#section-4.2";
85         type union {
86             type rd-two-octet-as;
87             type rd-ipv4;
88             type rd-as;
89         }
90     }
91
92     typedef rd-two-octet-as {
93         type string {
94             /* 2B AS : 4B number */
95             pattern '0:'
96                 + '([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|'
97                 + '[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|'
98                 + '65[0-4][0-9][0-9]|655[0-2][0-9]|6553[0-5])'
99                 + ':'
100                 + '([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|'
101                 + '[1-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9]|'
102                 + '[1-9][0-9][0-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
103                 + '[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|[1-3][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
104                 + '4[0-1][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|42[0-8][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
105                 + '429[0-3][0-9][0-9][0-9][0-9][0-9][0-9]|4294[0-8][0-9][0-9][0-9][0-9][0-9]|'
106                 + '42949[0-5][0-9][0-9][0-9][0-9]|429496[0-6][0-9][0-9][0-9]|4294967[0-1][0-9][0-9]|'
107                 + '42949672[0-8][0-9]|429496729[0-5])';
108         }
109     }
110
111     typedef rd-ipv4 {
112         type string {
113             /* IPv4 : 2B number */
114             pattern '((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
115                 + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))'
116                 + ':'
117                 + '([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|'
118                 + '[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|'
119                 + '65[0-4][0-9][0-9]|655[0-2][0-9]|6553[0-5])';
120         }
121     }
122
123     typedef rd-as {
124         type string {
125             /* 4B AS : 2B number */
126             pattern '([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|'
127                 + '[1-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9]|'
128                 + '[1-9][0-9][0-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
129                 + '[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|[1-3][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
130                 + '4[0-1][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|42[0-8][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|'
131                 + '429[0-3][0-9][0-9][0-9][0-9][0-9][0-9]|4294[0-8][0-9][0-9][0-9][0-9][0-9]|'
132                 + '42949[0-5][0-9][0-9][0-9][0-9]|429496[0-6][0-9][0-9][0-9]|4294967[0-1][0-9][0-9]|'
133                 + '42949672[0-8][0-9]|429496729[0-5])'
134                 + ':'
135                 + '([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|'
136                 + '[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|'
137                 + '65[0-4][0-9][0-9]|655[0-2][0-9]|6553[0-5])';
138         }
139     }
140
141     grouping bgp-aggregator {
142         reference "http://tools.ietf.org/html/rfc4271#section-5.1.7";
143         description "BGP Path Attribute AGGREGATOR.";
144         leaf as-number {
145             // We are acting as a NEW speaker, so only four bytes are allowed
146             type inet:as-number;
147         }
148         leaf network-address {
149             type inet:ipv4-address;
150         }
151     }
152
153     grouping community {
154         reference "https://tools.ietf.org/html/rfc1997";
155         description "Community Path Attribute";
156         leaf as-number {
157             type inet:as-number;
158         }
159         leaf semantics {
160             type uint16;
161         }
162     }
163
164     grouping route-ipv4-extended-community {
165         reference "http://tools.ietf.org/html/rfc4360";
166         leaf global-administrator {
167             type inet:ipv4-address;
168         }
169         leaf local-administrator {
170             type uint16;
171         }
172     }
173
174     grouping link-bandwidth-extended-community {
175         reference "https://tools.ietf.org/html/draft-ietf-idr-link-bandwidth-06#section-2";
176         description
177             "The Link Bandwidth extended community is optional non-transitive";
178
179         leaf bandwidth {
180             description "Bandwidth of the link";
181             mandatory true;
182             type netc:bandwidth;
183             units "bytes per second";
184         }
185     }
186
187     grouping as-4-spec-common {
188         container as-4-specific-common {
189             leaf as-number {
190                 description "Carries a 4-octet Autonomous System (AS) number";
191                 reference "https://tools.ietf.org/html/rfc5668#section-2";
192
193                 mandatory true;
194                 type inet:as-number;
195             }
196
197             leaf local-administrator {
198                 type uint16;
199                 mandatory true;
200             }
201         }
202     }
203
204     grouping extended-community {
205         leaf transitive {
206             type boolean;
207         }
208         choice extended-community {
209             case as-specific-extended-community-case {
210                 container as-specific-extended-community {
211                     leaf global-administrator {
212                         type short-as-number;
213                     }
214                     leaf local-administrator {
215                         type binary {
216                             length "4";
217                         }
218                     }
219                 }
220             }
221             case inet4-specific-extended-community-case {
222                 container inet4-specific-extended-community {
223                     leaf global-administrator {
224                         type inet:ipv4-address;
225                     }
226                     leaf local-administrator {
227                         type binary {
228                             length "2";
229                         }
230                     }
231                 }
232             }
233             case opaque-extended-community-case {
234                 container opaque-extended-community {
235                     leaf value {
236                         type binary {
237                             length "6";
238                         }
239                     }
240                 }
241             }
242             case route-target-extended-community-case {
243                 container route-target-extended-community {
244                     leaf global-administrator {
245                         type short-as-number;
246                     }
247                     leaf local-administrator {
248                         type binary {
249                             length "4";
250                         }
251                     }
252                 }
253             }
254             case route-origin-extended-community-case {
255                 container route-origin-extended-community {
256                     leaf global-administrator {
257                         type short-as-number;
258                     }
259                     leaf local-administrator {
260                         type binary {
261                             length "4";
262                         }
263                     }
264                 }
265             }
266             case route-target-ipv4-case {
267                 container route-target-ipv4 {
268                     reference "http://tools.ietf.org/html/rfc4360#section-4";
269                     uses route-ipv4-extended-community;
270                 }
271             }
272             case route-origin-ipv4-case {
273                 container route-origin-ipv4 {
274                     reference "http://tools.ietf.org/html/rfc4360#section-5";
275                     uses route-ipv4-extended-community;
276                 }
277             }
278             case link-bandwidth-case {
279                 container link-bandwidth-extended-community {
280                     uses link-bandwidth-extended-community;
281                 }
282             }
283             case as-4-generic-spec-extended-community-case {
284                 container as-4-generic-spec-extended-community {
285                     reference "https://www.ietf.org/archive/id/draft-ietf-idr-as4octet-extcomm-generic-subtype-08.txt";
286                     uses as-4-spec-common;
287                 }
288             }
289             case as-4-route-target-extended-community-case {
290                 container as-4-route-target-extended-community {
291                     reference "https://tools.ietf.org/html/rfc5668";
292                     uses as-4-spec-common;
293                 }
294             }
295             case as-4-route-origin-extended-community-case {
296                 container as-4-route-origin-extended-community {
297                     reference "https://tools.ietf.org/html/rfc5668";
298                     uses as-4-spec-common;
299                 }
300             }
301         }
302     }
303
304     grouping next-hop {
305         choice c-next-hop {
306             case ipv4-next-hop-case {
307                 container ipv4-next-hop {
308                     reference "http://tools.ietf.org/html/rfc4271#section-5.1.3";
309                     leaf global {
310                         type inet:ipv4-address;
311                     }
312                 }
313             }
314             case ipv6-next-hop-case {
315                 container ipv6-next-hop {
316                     reference "http://tools.ietf.org/html/rfc4760#section-3";
317                     leaf global {
318                         type inet:ipv6-address;
319                     }
320                     leaf link-local {
321                         type inet:ipv6-address;
322                     }
323                 }
324             }
325         }
326     }
327
328     grouping as-path-segment {
329         reference "http://tools.ietf.org/html/rfc4271#section-5.1.2";
330         leaf-list as-sequence {
331             type inet:as-number;
332             ordered-by user;
333             max-elements "255";
334         }
335         leaf-list as-set {
336             type inet:as-number;
337         }
338     }
339 }