6aa85736627da86cd95eb062193b387631ae2c3d
[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             bit router {
420                 position 4;
421             }
422             bit v6 {
423                 position 5;
424             }
425         }
426     }
427
428     typedef isis-area-identifier {
429         reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.2";
430         type binary {
431             length "1..20";
432         }
433     }
434
435     typedef ipv4-router-identifier {
436         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.4";
437         type inet:ipv4-address;
438     }
439
440     typedef ipv6-router-identifier {
441         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.4";
442         type inet:ipv6-address;
443     }
444
445     grouping node-state {
446         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1";
447         leaf-list topology-identifier {
448             type topology-identifier;
449         }
450         leaf node-flags {
451             type node-flag-bits;
452         }
453         leaf-list isis-area-id {
454             type isis-area-identifier;
455         }
456         leaf dynamic-hostname {
457             type string;
458         }
459         leaf ipv4-router-id {
460             type ipv4-router-identifier;
461         }
462         leaf ipv6-router-id {
463             type ipv6-router-identifier;
464         }
465         container sr-sid-label {
466             uses bgp-sr:sid-label-binding;
467         }
468         container sr-capabilities {
469             uses bgp-sr:sr-capabilities;
470         }
471         container sr-algorithm {
472             uses bgp-sr:sr-algorithm;
473         }
474     }
475
476     typedef link-protection-type {
477         reference "http://tools.ietf.org/html/rfc5307#section-1.2";
478         type enumeration {
479             enum extra-traffic {
480                 value 1;
481             }
482             enum unprotected {
483                 value 2;
484             }
485             enum shared {
486                 value 4;
487             }
488             enum dedicated-1to1 {
489                 value 8;
490             }
491             enum dedicated-1plus1 {
492                 value 16;
493             }
494             enum enhanced {
495                 value 32;
496             }
497         }
498     }
499
500     // linkstate
501     typedef mpls-protocol-mask {
502         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2.2";
503         type bits {
504             bit ldp {
505                 position 0;
506             }
507             bit rsvpte {
508                 position 1;
509             }
510         }
511     }
512
513     typedef administrative-group {
514         type uint32;
515     }
516
517     grouping unreserved-bandwidth {
518         leaf priority {
519             type uint8 {
520                 range "0..7";
521             }
522         }
523         leaf bandwidth {
524             type netc:bandwidth;
525         }
526     }
527
528     grouping link-state {
529         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2";
530         leaf local-ipv4-router-id {
531             type ipv4-router-identifier;
532         }
533         leaf local-ipv6-router-id {
534             type ipv6-router-identifier;
535         }
536         leaf remote-ipv4-router-id {
537             type ipv4-router-identifier;
538         }
539         leaf remote-ipv6-router-id {
540             type ipv6-router-identifier;
541         }
542         leaf mpls-protocol {
543             type mpls-protocol-mask;
544         }
545         leaf te-metric {
546             type netc:te-metric;
547         }
548         leaf metric {
549             type netc:metric;
550         }
551         leaf-list shared-risk-link-groups {
552             type rsvp:srlg-id;
553         }
554         leaf link-name {
555             type string;
556         }
557         leaf max-link-bandwidth {
558             type netc:bandwidth;
559         }
560         leaf max-reservable-bandwidth {
561             type netc:bandwidth;
562         }
563         list unreserved-bandwidth {
564             key "priority";
565             uses unreserved-bandwidth;
566         }
567         leaf link-protection {
568             type link-protection-type;
569         }
570         leaf admin-group {
571             type administrative-group;
572         }
573         container sr-adj-id {
574             uses bgp-sr:adjacency-segment-identifier;
575         }
576         container sr-lan-adj-id {
577             uses bgp-sr:lan-adjacency-segment-identifier;
578         }
579         container peer-sid {
580             description "The SID representing the peer of the BGP session.";
581             reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-00#section-4.3";
582             uses bgp-sr:adjacency-segment-identifier;
583         }
584         container peer-set-sid {
585             description "The SID representing the group the peer is part of.";
586             reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-00#section-4.3";
587             uses bgp-sr:adjacency-segment-identifier;
588         }
589     }
590
591     typedef route-tag {
592         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.2";
593         type binary {
594             length "4";
595         }
596     }
597
598     typedef extended-route-tag {
599         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.3";
600         type binary {
601             length "8";
602         }
603     }
604
605     grouping igp-bits {
606         reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.1";
607         leaf up-down {
608             type bits {
609                 bit up-down {
610                     position 0;
611                 }
612             }
613         }
614     }
615
616     grouping prefix-state {
617         container igp-bits {
618             uses igp-bits;
619         }
620         leaf-list route-tags {
621             type route-tag;
622         }
623         leaf-list extended-tags {
624             type extended-route-tag;
625         }
626         leaf prefix-metric {
627             type netc:igp-metric;
628         }
629         leaf ospf-forwarding-address {
630             type inet:ip-address;
631         }
632         container sr-prefix {
633             uses bgp-sr:prefix-sid;
634         }
635     }
636
637     grouping linkstate-path-attribute {
638         choice link-state-attribute {
639             case node-attributes-case {
640                 container node-attributes {
641                     uses node-state;
642                 }
643             }
644             case link-attributes-case {
645                 container link-attributes {
646                     uses link-state;
647                 }
648             }
649             case prefix-attributes-case {
650                 container prefix-attributes {
651                     uses prefix-state;
652                 }
653             }
654             case te-lsp-attributes-case {
655                 description "LSP Object";
656                 reference "http://tools.ietf.org/html/draft-ietf-idr-te-lsp-distribution-03#section-2.2";
657                 container te-lsp-attributes {
658                     uses rsvp:tspec-object;
659                     uses rsvp:flow-spec-object;
660                     uses rsvp:session-attribute-object;
661                     uses rsvp:explicit-route-object;
662                     uses rsvp:secondary-explicit-route-object;
663                     uses rsvp:record-route-object;
664                     uses rsvp:secondary-record-route-object;
665                     uses rsvp:fast-reroute-object;
666                     uses rsvp:detour-object;
667                     uses rsvp:exclude-route-object;
668                     uses rsvp:lsp-attributes-object;
669                     uses rsvp:lsp-required-attributes-object;
670                     uses rsvp:protection-object;
671                     uses rsvp:association-object;
672                     uses rsvp:primary-path-route-object;
673                     uses rsvp:admin-status-object;
674                     uses rsvp:bandwidth-object;
675                     uses rsvp:metric-object;
676                 }
677             }
678         }
679     }
680
681     grouping linkstate-routes {
682         container linkstate-routes {
683             list linkstate-route {
684                 description
685                     "Link-state information entry. Due to
686                     the complexity of link-state information
687                     and YANG limitations this is the top-level
688                     object from contract perspective. It is
689                     keyed by route-key, whose format is
690                     internal to the implementation exposing
691                     this information. As an explicit example
692                     it can rely on information stored in the
693                     entry's subtree, so the subtree MUST NOT
694                     be modified by outside entities.
695                     Augmentations can attach data, but must
696                     be explicitly aware that such data, unlike
697                     the data modeled directly here, does not
698                     have any effects on keys, especially they
699                     must not impact equality tests.";
700
701                 leaf route-key {
702                     description
703                         "The sole function of this leaf
704                         to act as the key in the list.
705                         Its format does not form the
706                         API contract of this model.";
707                     type binary;
708                 }
709                 key "route-key";
710
711                 uses linkstate;
712
713                 uses bgp-rib:route {
714                     augment attributes {
715                         uses linkstate-path-attribute;
716                     }
717                 }
718             }
719         }
720     }
721
722     augment "/bgp-msg:update/bgp-msg:attributes" {
723         uses linkstate-path-attribute;
724     }
725
726     augment "/bgp-rib:application-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:loc-rib/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:adj-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:effective-rib-in/bgp-rib:tables/bgp-rib:routes" {
745         case linkstate-routes-case {
746             uses linkstate-routes;
747         }
748     }
749
750     augment "/bgp-rib:bgp-rib/bgp-rib:rib/bgp-rib:peer/bgp-rib:adj-rib-out/bgp-rib:tables/bgp-rib: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:pre-policy-rib/bmp-mon:tables/bmp-mon:routes" {
757         case linkstate-routes-case {
758             uses linkstate-routes;
759         }
760     }
761
762     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" {
763         case linkstate-routes-case {
764             uses linkstate-routes;
765         }
766     }
767
768 }