module v3po { yang-version 1; namespace "urn:opendaylight:params:xml:ns:yang:v3po"; prefix "v3po"; revision "2015-01-05" { description "Initial revision of v3po model"; } import iana-if-type { prefix "ianaift"; } import ietf-interfaces { prefix "if"; } import ietf-yang-types { prefix "yang"; } import ietf-inet-types { prefix "inet"; } import ietf-ip { prefix "ip"; } import yang-ext { prefix "ext"; } typedef bridge-domain-ref { type leafref { path "/vpp/bridge-domains/bridge-domain/name"; } description "This type is used by to reference a bridge domain table"; } typedef bridged-virtual-interface-ref { type leafref { path "/if:interfaces/if:interface/l2/bridged-virtual-interface"; } description "This type is used by to reference a bridged virtual interface"; } identity vxlan-tunnel { base if:interface-type; } identity vhost-user { base if:interface-type; } identity tap { base if:interface-type; } typedef vxlan-vni { // FIXME: should be in a vxlan-specific model description "VNI used in a VXLAN tunnel"; type uint32 { range "0..16777215"; } } typedef vhost-user-role { type enumeration { enum "server"; enum "client"; } } identity vxlan-gpe-tunnel { base if:interface-type; } typedef vxlan-gpe-vni { description "VNI used in a VXLAN-GPE tunnel"; type uint32 { range "0..16777215"; } } typedef vxlan-gpe-next-protocol { type enumeration { enum ipv4; enum ipv6; enum ethernet; enum nsh; } } grouping bridge-domain-attributes { leaf flood { type boolean; default true; description "Enable/disable L2 flooding."; } leaf forward { type boolean; default true; description "Enable/disable L2 forwarding."; } leaf learn { type boolean; default true; description "Enable/disable L2 learning."; } leaf unknown-unicast-flood { type boolean; default true; } leaf arp-termination { type boolean; default false; } } grouping tap-interface-base-attributes { leaf tap-name { type string; } } grouping tap-interface-config-attributes { leaf mac { type yang:phys-address; mandatory false; description "Mac address to be set for the tap interface. Random will be used if not configured"; } leaf device-instance { type uint32; mandatory false; description "Custom device instance. Autogenerated will be used if not configured"; } } grouping ethernet-base-attributes { leaf mtu { type uint16 { range "64..9216"; } units "octets"; default 9216; description "The size, in octets, of the largest packet that the hardware interface will send and receive."; } } grouping ethernet-state-attributes { leaf manufacturer-description { type string; config false; } leaf duplex { type enumeration { enum "half"; enum "full"; } config false; } } grouping vhost-user-interface-base-attributes { leaf socket { type string { length 1..255; } } leaf role { type vhost-user-role; default "server"; } description "vhost-user settings"; } grouping vhost-user-interface-state-attributes { leaf features { type uint64; config false; } leaf virtio-net-hdr-size { type uint32; config false; } leaf num-memory-regions { type uint32; config false; } leaf connect-error { type string; config false; } } grouping vxlan-base-attributes { // FIXME: this should be in an vxlan-specific extension leaf src { /*mandatory true;*/ type inet:ip-address; } leaf dst { /*mandatory true;*/ type inet:ip-address; } leaf vni { /*mandatory true;*/ type vxlan-vni; } leaf encap-vrf-id { type uint32; } } grouping vxlan-gpe-base-attributes { leaf local { /*mandatory true;*/ type inet:ip-address; } leaf remote { /*mandatory true;*/ type inet:ip-address; } leaf vni { /*mandatory true;*/ type vxlan-gpe-vni; } leaf next-protocol { type vxlan-gpe-next-protocol; } leaf encap-vrf-id { type uint32; } leaf decap-vrf-id { type uint32; } } grouping l2-base-attributes { description "Parameters for configuring Layer2 features on interfaces."; choice interconnection { case xconnect-based { leaf xconnect-outgoing-interface { /* Don't allow selection of this interface */ must "../../if:name != current()"; type if:interface-ref; // todo use interface-state-ref for operational data? description "L2 xconnect mode"; } } case bridge-based { leaf bridge-domain { type bridge-domain-ref; description "Interfaces in a bridge-domain forward packets to other interfaces in the same bridge-domain based on destination mac address."; } leaf split-horizon-group { when "../bridge-domain"; type uint8 { range "0..255"; } default 0; description "Interface's split-horizon group. Interfaces in the same bridge-domain and split-horizon group can not forward packets between each other. "; } leaf bridged-virtual-interface { when "../bridge-domain"; type boolean; default false; description "Interface forward packets in the bridge-domain associated with the BVI."; } } } } augment /if:interfaces/if:interface { ext:augment-identifier "vpp-interface-augmentation"; // FIXME using ietf-interfaces model for vpp interfaces makes it hard to implement because: // 1. The link between interface type and this augmentation is unclear // 2. Only this augmentation with combination of ifc type is trigger to do something for vpp, what if user only configures base interface stuff ? + We need to get leaves defined by ietf-interfaces when we are processing this augment // 3. The ietf-interfaces model does not define groupings which makes types reuse difficult container tap { when "../if:type = 'v3po:tap'"; uses tap-interface-base-attributes; uses tap-interface-config-attributes; } container ethernet { when "../if:type = 'ianaift:ethernetCsmacd'"; uses ethernet-base-attributes; } container routing { leaf vrf-id { // todo no routing info for oper, is it possible to get it from the vpp? type uint32; default 0; } } container vhost-user { when "../if:type = 'v3po:vhost-user'"; uses vhost-user-interface-base-attributes; } container vxlan { when "../if:type = 'v3po:vxlan-tunnel'"; uses vxlan-base-attributes; } container l2 { must "(not (../if:ipv4[if:enabled = 'true']/if:address/if:ip) and " + "not (../if:ipv6[if:enabled = 'true']/if:address/if:ip))"; uses l2-base-attributes; } container vxlan-gpe { when "../if:type = 'v3po:vxlan-gpe-tunnel'"; uses vxlan-gpe-base-attributes; } } container vpp { description "VPP config data"; container bridge-domains { list bridge-domain { key "name"; leaf name { type string; } uses bridge-domain-attributes; list l2-fib { key "phys-address"; leaf phys-address { type yang:phys-address; } leaf action { type enumeration { enum "forward"; enum "filter"; } mandatory true; } leaf outgoing-interface { type if:interface-ref; } } } } } augment /if:interfaces-state/if:interface { ext:augment-identifier "vpp-interface-state-augmentation"; leaf description { type string; } container tap { when "../if:type = 'v3po:tap'"; uses tap-interface-base-attributes; } container ethernet { when "../if:type = 'ianaift:ethernetCsmacd'"; uses ethernet-base-attributes; uses ethernet-state-attributes; } container vhost-user { when "../if:type = 'v3po:vhost-user'"; uses vhost-user-interface-base-attributes; uses vhost-user-interface-state-attributes; } container vxlan { when "../if:type = 'v3po:vxlan-tunnel'"; uses vxlan-base-attributes; } container vxlan-gpe { when "../if:type = 'v3po:vxlan-gpe-tunnel'"; uses vxlan-gpe-base-attributes; } container l2 { must "(not (../if:ipv4[if:enabled = 'true']/if:address/if:ip) and " + "not (../if:ipv6[if:enabled = 'true']/if:address/if:ip))"; uses l2-base-attributes; } } augment /if:interfaces-state/if:interface/if:statistics { ext:augment-identifier "vpp-interface-statistics-augmentation"; leaf in-errors-no-buf { type yang:counter64; } leaf in-errors-miss { type yang:counter64; } leaf out-discards-fifo-full { type yang:counter64; } } container vpp-state { config false; description "VPP operational data"; container bridge-domains { // FIXME: Should this live in bridge-domain.yang in a modular fashion ? list bridge-domain { key "name"; leaf name { type string; } uses bridge-domain-attributes; list interface { key "name"; leaf name { type if:interface-state-ref; } leaf split-horizon-group { type uint8; } leaf bridged-virtual-interface { type boolean; } } list l2-fib { key "phys-address"; leaf phys-address { type yang:phys-address; } leaf static-config { type boolean; } leaf outgoing-interface { when "../v3po:action = 'forward'"; type if:interface-state-ref; } leaf action { type enumeration { enum "forward"; enum "filter"; } mandatory true; } leaf bridged-virtual-interface { when "../v3po:action = 'forward'"; type boolean; } } description "bridge-domain operational data"; } } container version { leaf name { type string; } leaf build-directory { type string; } leaf build-date { type string; } leaf branch { type string; } description "vlib version info"; } } }