Fixed incorrect prefix in uses augment.
[bgpcep.git] / bgp / linkstate / src / main / yang / bgp-linkstate.yang
1 module bgp-linkstate {
2     yang-version 1;
3     namespace "urn:opendaylight:params:xml:ns:yang:bgp-linkstate";
4     prefix "bgp-ls";
5
6     import ietf-inet-types { prefix inet; revision-date 2010-09-24; }
7     import bgp-message { prefix bgp-msg; revision-date 2013-09-19; }
8     import bgp-multiprotocol { prefix bgp-mp; revision-date 2013-09-19; }
9     import bgp-rib { prefix bgp-rib; revision-date 2013-09-25; }
10     import bgp-types { prefix bgp-t; revision-date 2013-09-19; }
11     import network-concepts { prefix netc; revision-date 2013-11-25; }
12     import rsvp { prefix rsvp; revision-date 2015-08-20; }
13     import bgp-segment-routing { prefix bgp-sr; revision-date 2015-02-06; }
14     import bgp-epe { prefix bgp-epe; revision-date 2015-06-22; }
15     import bmp-monitor { prefix bmp-mon; revision-date 2015-05-12; }
16
17     organization "Cisco Systems, Inc.";
18     contact "Dana Kutenicsova <dkutenic@cisco.com>";
19
20     description
21         "This module contains the base data model of a BGP message.
22         It rolls up the definitions contained in RFC4271
23         and draft-ietf-idr-ls-distribution-03.
24
25         Copyright (c)2013 Cisco Systems, Inc. All rights reserved.
26
27         This program and the accompanying materials are made available
28         under the terms of the Eclipse Public License v1.0 which
29         accompanies this distribution, and is available at
30         http://www.eclipse.org/legal/epl-v10.html";
31
32     revision "2015-02-10" {
33         description
34             "Updated to include segment routing.";
35     }
36
37     revision "2013-11-25" {
38         description
39             "Updated to cover network-concepts.";
40     }
41
42     revision "2013-09-18" {
43         description
44             "Initial revision.";
45         reference "draft-ietf-idr-ls-distribution-03";
46     }
47
48     identity linkstate-address-family {
49         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2";
50
51         base bgp-t:address-family;
52     }
53
54     identity linkstate-subsequent-address-family {
55         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2";
56
57         base bgp-t:subsequent-address-family;
58     }
59
60     typedef nlri-type {
61         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2";
62         type enumeration {
63             enum node {
64                 value 1;
65             }
66             enum link {
67                 value 2;
68             }
69             enum ipv4-prefix {
70                 value 3;
71             }
72             enum ipv6-prefix {
73                 value 4;
74             }
75             enum ipv4-te-lsp {
76                 reference "http://tools.ietf.org/html/draft-ietf-idr-te-lsp-distribution-03#section-4.1";
77                 value 5;
78             }
79             enum ipv6-te-lsp {
80                 reference "http://tools.ietf.org/html/draft-ietf-idr-te-lsp-distribution-03#section-4.1";
81                 value 6;
82             }
83         }
84     }
85
86     typedef protocol-id {
87         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2";
88         type enumeration {
89             enum unknown {
90                 value 0;
91             }
92             enum isis-level1 {
93                 value 1;
94             }
95             enum isis-level2 {
96                 value 2;
97             }
98             enum ospf {
99                 value 3;
100             }
101             enum direct {
102                 value 4;
103             }
104             enum static {
105                 value 5;
106             }
107             enum rsvp-te {
108                 reference "http://tools.ietf.org/html/draft-ietf-idr-te-lsp-distribution-03#section-2.1";
109                 value 6;
110             }
111             enum bgp-epe {
112                 reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-00#section-4";
113                 value 7;
114             }
115             enum segment-routing {
116                 reference "http://tools.ietf.org/html/draft-ietf-idr-te-lsp-distribution-03#section-2.1";
117                 value 8; // segment-routing protocol-id TBD by IANA
118             }
119         }
120     }
121
122     typedef ospf-route-type {
123         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.3.1";
124         type enumeration {
125             enum intra-area {
126                 value 1;
127             }
128             enum inter-area {
129                 value 2;
130             }
131             enum external1 {
132                 value 3;
133             }
134             enum external2 {
135                 value 4;
136             }
137             enum nssa1 {
138                 value 5;
139             }
140             enum nssa2 {
141                 value 6;
142             }
143         }
144     }
145
146     typedef route-distinguisher {
147         type uint64;
148     }
149
150     typedef identifier {
151         type uint64;
152     }
153
154     typedef domain-identifier {
155         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4";
156         type uint32;
157     }
158
159     typedef area-identifier {
160         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4";
161         type uint32;
162     }
163
164     typedef ipv4-interface-identifier {
165         reference "http://tools.ietf.org/html/rfc5305#section-3.2";
166         type inet:ipv4-address;
167     }
168
169     typedef ipv6-interface-identifier {
170         reference "http://tools.ietf.org/html/rfc6119#section-4.2";
171         type inet:ipv6-address;
172     }
173
174     typedef ospf-interface-identifier {
175         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4";
176         type uint32;
177     }
178
179     typedef topology-identifier {
180         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.5";
181         type uint16 {
182             range "0..4095";
183         }
184     }
185
186
187     grouping isis-router-identifier {
188         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4";
189         leaf iso-system-id {
190             type netc:iso-system-identifier;
191             mandatory true;
192         }
193     }
194
195     grouping isis-lan-identifier {
196         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4";
197         container is-is-router-identifier {
198             uses isis-router-identifier;
199         }
200         leaf psn {
201             type uint8 {
202                 range "1..255";
203             }
204             mandatory true;
205         }
206     }
207
208     grouping ospf-router-identifier {
209         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4";
210         leaf ospf-router-id {
211             type uint32;
212             mandatory true;
213         }
214     }
215
216     grouping ospf-v2-lan-identifier {
217         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4";
218         uses ospf-router-identifier;
219         leaf ipv4-address {
220             type ipv4-interface-identifier;
221             mandatory true;
222         }
223     }
224
225     grouping ospf-v3-lan-identifier {
226         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4";
227         uses ospf-router-identifier;
228         leaf lan-interface {
229             type ospf-interface-identifier;
230             mandatory true;
231         }
232     }
233
234     grouping node-identifier {
235         leaf as-number {
236             type inet:as-number;
237         }
238         leaf area-id {
239             type area-identifier;
240         }
241         leaf domain-id {
242             type domain-identifier;
243         }
244         choice c-router-identifier {
245             case isis-node-case {
246                 container isis-node {
247                     uses isis-router-identifier;
248                 }
249             }
250             case isis-pseudonode-case {
251                 container isis-pseudonode {
252                     uses isis-lan-identifier;
253                 }
254             }
255             case ospf-node-case {
256                 container ospf-node {
257                     uses ospf-router-identifier;
258                 }
259             }
260             case ospf-pseudonode-case {
261                 container ospf-pseudonode {
262                     uses ospf-v3-lan-identifier;
263                 }
264             }
265         }
266     }
267
268     grouping link-lr-identifiers {
269         reference "http://tools.ietf.org/html/rfc5307";
270         leaf link-local-identifier {
271             type uint32;
272         }
273         leaf link-remote-identifier {
274             type uint32;
275         }
276     }
277
278     grouping prefix-identifiers {
279         leaf multi-topology-id {
280             type topology-identifier;
281         }
282         leaf ospf-route-type {
283             when "../../protocol-id = 'ospf'";
284             type ospf-route-type;
285         }
286         leaf ip-reachability-information {
287             type inet:ip-prefix;
288         }
289     }
290
291     grouping link-identifier {
292         uses link-lr-identifiers;
293         leaf ipv4-interface-address {
294             type ipv4-interface-identifier;
295         }
296         leaf ipv6-interface-address {
297             type ipv6-interface-identifier;
298         }
299         leaf ipv4-neighbor-address {
300             type ipv4-interface-identifier;
301         }
302         leaf ipv6-neighbor-address {
303             type ipv6-interface-identifier;
304         }
305         leaf multi-topology-id {
306             type topology-identifier;
307         }
308     }
309
310     grouping linkstate {
311         leaf distinguisher {
312             type route-distinguisher;
313         }
314         leaf protocol-id {
315             type protocol-id;
316             mandatory true;
317         }
318         leaf identifier {
319             type identifier;
320             mandatory true;
321         }
322         choice object-type {
323             case node-case {
324                 container node-descriptors {
325                     uses node-identifier;
326                 }
327             }
328             case link-case {
329                 container local-node-descriptors {
330                     uses node-identifier;
331                     uses bgp-epe:epe-node-descriptors;
332                 }
333                 container remote-node-descriptors {
334                     uses node-identifier;
335                     uses bgp-epe:epe-node-descriptors;
336                 }
337                 container link-descriptors {
338                     uses link-identifier;
339                 }
340             }
341             case prefix-case {
342                 container advertising-node-descriptors {
343                     uses node-identifier;
344                 }
345                 container prefix-descriptors {
346                     uses prefix-identifiers;
347                 }
348             }
349             case te-lsp-case {
350                 choice address-family {
351                     case ipv4-case {
352                         leaf ipv4-tunnel-sender-address {
353                             type inet:ipv4-address;
354                             mandatory true;
355                         }
356                         leaf ipv4-tunnel-endpoint-address {
357                             type inet:ipv4-address;
358                             mandatory true;
359                         }
360                     }
361                     case ipv6-case {
362                         leaf ipv6-tunnel-sender-address {
363                             type inet:ipv6-address;
364                             mandatory true;
365                         }
366                         leaf ipv6-tunnel-endpoint-address {
367                             type inet:ipv6-address;
368                             mandatory true;
369                         }
370                     }
371                 }
372                 leaf tunnel-id {
373                     type rsvp:tunnel-id;
374                 }
375                 leaf lsp-id {
376                     type rsvp:lsp-id;
377                 }
378             }
379         }
380     }
381
382     grouping linkstate-destination {
383         list c-linkstate-destination {
384             uses linkstate;
385         }
386     }
387
388     augment "/bgp-msg:update/bgp-msg:attributes/bgp-mp:mp-reach-nlri/bgp-mp:advertized-routes/bgp-mp:destination-type" {
389         case destination-linkstate-case {
390             container destination-linkstate {
391                 uses linkstate-destination;
392             }
393         }
394     }
395
396     augment "/bgp-msg:update/bgp-msg:attributes/bgp-mp:mp-unreach-nlri/bgp-mp:withdrawn-routes/bgp-mp:destination-type" {
397         case destination-linkstate-case {
398             container destination-linkstate {
399                 uses linkstate-destination;
400             }
401         }
402     }
403
404     typedef node-flag-bits {
405         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.1";
406         type bits {
407             bit overload {
408                 position 0;
409             }
410             bit attached {
411                 position 1;
412             }
413             bit external {
414                 position 2;
415             }
416             bit abr {
417                 position 3;
418             }
419         }
420     }
421
422     typedef isis-area-identifier {
423         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.2";
424         type binary {
425             length "1..20";
426         }
427     }
428
429     typedef ipv4-router-identifier {
430         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.4";
431         type inet:ipv4-address;
432     }
433
434     typedef ipv6-router-identifier {
435         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.4";
436         type inet:ipv6-address;
437     }
438
439     grouping node-state {
440         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1";
441         leaf-list topology-identifier {
442             type topology-identifier;
443         }
444         leaf node-flags {
445             type node-flag-bits;
446         }
447         leaf-list isis-area-id {
448             type isis-area-identifier;
449         }
450         leaf dynamic-hostname {
451             type string;
452         }
453         leaf ipv4-router-id {
454             type ipv4-router-identifier;
455         }
456         leaf ipv6-router-id {
457             type ipv6-router-identifier;
458         }
459         container sr-sid-label {
460             uses bgp-sr:sid-label-binding;
461         }
462         container sr-capabilities {
463             uses bgp-sr:sr-capabilities;
464         }
465         container sr-algorithm {
466             uses bgp-sr:sr-algorithm;
467         }
468     }
469
470     typedef link-protection-type {
471         reference "http://tools.ietf.org/html/rfc5307#section-1.2";
472         type enumeration {
473             enum extra-traffic {
474                 value 1;
475             }
476             enum unprotected {
477                 value 2;
478             }
479             enum shared {
480                 value 4;
481             }
482             enum dedicated-1to1 {
483                 value 8;
484             }
485             enum dedicated-1plus1 {
486                 value 16;
487             }
488             enum enhanced {
489                 value 32;
490             }
491         }
492     }
493
494     // linkstate
495     typedef mpls-protocol-mask {
496         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2.2";
497         type bits {
498             bit ldp {
499                 position 0;
500             }
501             bit rsvpte {
502                 position 1;
503             }
504         }
505     }
506
507     typedef administrative-group {
508         type uint32;
509     }
510
511     grouping unreserved-bandwidth {
512         leaf priority {
513             type uint8 {
514                 range "0..7";
515             }
516         }
517         leaf bandwidth {
518             type netc:bandwidth;
519         }
520     }
521
522     grouping link-state {
523         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2";
524         leaf local-ipv4-router-id {
525             type ipv4-router-identifier;
526         }
527         leaf local-ipv6-router-id {
528             type ipv6-router-identifier;
529         }
530         leaf remote-ipv4-router-id {
531             type ipv4-router-identifier;
532         }
533         leaf remote-ipv6-router-id {
534             type ipv6-router-identifier;
535         }
536         leaf mpls-protocol {
537             type mpls-protocol-mask;
538         }
539         leaf te-metric {
540             type netc:te-metric;
541         }
542         leaf metric {
543             type netc:metric;
544         }
545         leaf-list shared-risk-link-groups {
546             type rsvp:srlg-id;
547         }
548         leaf link-name {
549             type string;
550         }
551         leaf max-link-bandwidth {
552             type netc:bandwidth;
553         }
554         leaf max-reservable-bandwidth {
555             type netc:bandwidth;
556         }
557         list unreserved-bandwidth {
558             key "priority";
559             uses unreserved-bandwidth;
560         }
561         leaf link-protection {
562             type link-protection-type;
563         }
564         leaf admin-group {
565             type administrative-group;
566         }
567         container sr-adj-id {
568             uses bgp-sr:adjacency-segment-identifier;
569         }
570         container sr-lan-adj-id {
571             uses bgp-sr:lan-adjacency-segment-identifier;
572         }
573         container peer-sid {
574             description "The SID representing the peer of the BGP session.";
575             reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-00#section-4.3";
576             uses bgp-sr:adjacency-segment-identifier;
577         }
578         container peer-set-sid {
579             description "The SID representing the group the peer is part of.";
580             reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-00#section-4.3";
581             uses bgp-sr:adjacency-segment-identifier;
582         }
583     }
584
585     typedef route-tag {
586         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.2";
587         type binary {
588             length "4";
589         }
590     }
591
592     typedef extended-route-tag {
593         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.3";
594         type binary {
595             length "8";
596         }
597     }
598
599     grouping igp-bits {
600         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.1";
601         leaf up-down {
602             type bits {
603                 bit up-down {
604                     position 0;
605                 }
606             }
607         }
608     }
609
610     grouping prefix-state {
611         container igp-bits {
612             uses igp-bits;
613         }
614         leaf-list route-tags {
615             type route-tag;
616         }
617         leaf-list extended-tags {
618             type extended-route-tag;
619         }
620         leaf prefix-metric {
621             type netc:igp-metric;
622         }
623         leaf ospf-forwarding-address {
624             type inet:ip-address;
625         }
626         container sr-prefix {
627             uses bgp-sr:prefix-sid;
628         }
629     }
630
631     grouping linkstate-path-attribute {
632         choice link-state-attribute {
633             case node-attributes-case {
634                 container node-attributes {
635                     uses node-state;
636                 }
637             }
638             case link-attributes-case {
639                 container link-attributes {
640                     uses link-state;
641                 }
642             }
643             case prefix-attributes-case {
644                 container prefix-attributes {
645                     uses prefix-state;
646                 }
647             }
648             case te-lsp-attributes-case {
649                 description "LSP Object";
650                 reference "http://tools.ietf.org/html/draft-ietf-idr-te-lsp-distribution-03#section-2.2";
651                 container te-lsp-attributes {
652                     uses rsvp:tspec-object;
653                     uses rsvp:flow-spec-object;
654                     uses rsvp:session-attribute-object;
655                     uses rsvp:explicit-route-object;
656                     uses rsvp:secondary-explicit-route-object;
657                     uses rsvp:record-route-object;
658                     uses rsvp:secondary-record-route-object;
659                     uses rsvp:fast-reroute-object;
660                     uses rsvp:detour-object;
661                     uses rsvp:exclude-route-object;
662                     uses rsvp:lsp-attributes-object;
663                     uses rsvp:lsp-required-attributes-object;
664                     uses rsvp:protection-object;
665                     uses rsvp:association-object;
666                     uses rsvp:primary-path-route-object;
667                     uses rsvp:admin-status-object;
668                     uses rsvp:bandwidth-object;
669                     uses rsvp:metric-object;
670                 }
671             }
672         }
673     }
674
675     grouping linkstate-routes {
676         container linkstate-routes {
677             list linkstate-route {
678                 description
679                     "Link-state information entry. Due to
680                     the complexity of link-state information
681                     and YANG limitations this is the top-level
682                     object from contract perspective. It is
683                     keyed by route-key, whose format is
684                     internal to the implementation exposing
685                     this information. As an explicit example
686                     it can rely on information stored in the
687                     entry's subtree, so the subtree MUST NOT
688                     be modified by outside entities.
689                     Augmentations can attach data, but must
690                     be explicitly aware that such data, unlike
691                     the data modeled directly here, does not
692                     have any effects on keys, especially they
693                     must not impact equality tests.";
694
695                 leaf route-key {
696                     description
697                         "The sole function of this leaf
698                         to act as the key in the list.
699                         Its format does not form the
700                         API contract of this model.";
701                     type binary;
702                 }
703                 key "route-key";
704
705                 uses linkstate;
706
707                 uses bgp-rib:route {
708                     augment attributes {
709                         uses linkstate-path-attribute;
710                     }
711                 }
712             }
713         }
714     }
715
716     augment "/bgp-msg:update/bgp-msg:attributes" {
717         uses linkstate-path-attribute;
718     }
719
720     augment "/bgp-rib:application-rib/bgp-rib:tables/bgp-rib:routes" {
721         case linkstate-routes-case {
722             uses linkstate-routes;
723         }
724     }
725
726     augment "/bgp-rib:bgp-rib/bgp-rib:rib/bgp-rib:loc-rib/bgp-rib:tables/bgp-rib:routes" {
727         case linkstate-routes-case {
728             uses linkstate-routes;
729         }
730     }
731
732     augment "/bgp-rib:bgp-rib/bgp-rib:rib/bgp-rib:peer/bgp-rib:adj-rib-in/bgp-rib:tables/bgp-rib:routes" {
733         case linkstate-routes-case {
734             uses linkstate-routes;
735         }
736     }
737
738     augment "/bgp-rib:bgp-rib/bgp-rib:rib/bgp-rib:peer/bgp-rib:effective-rib-in/bgp-rib:tables/bgp-rib:routes" {
739         case linkstate-routes-case {
740             uses linkstate-routes;
741         }
742     }
743
744     augment "/bgp-rib:bgp-rib/bgp-rib:rib/bgp-rib:peer/bgp-rib:adj-rib-out/bgp-rib:tables/bgp-rib:routes" {
745         case linkstate-routes-case {
746             uses linkstate-routes;
747         }
748     }
749
750     augment "/bmp-mon:bmp-monitor/bmp-mon:monitor/bmp-mon:router/bmp-mon:peer/bmp-mon:pre-policy-rib/bmp-mon:tables/bmp-mon:routes" {
751         case linkstate-routes-case {
752             uses linkstate-routes;
753         }
754     }
755
756     augment "/bmp-mon:bmp-monitor/bmp-mon:monitor/bmp-mon:router/bmp-mon:peer/bmp-mon:post-policy-rib/bmp-mon:tables/bmp-mon:routes" {
757         case linkstate-routes-case {
758             uses linkstate-routes;
759         }
760     }
761
762 }