module msea-uni-evc-interface {

	namespace "http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-interface";
	prefix "msea-if"; //MicroSemi EdgeAssure (msea)

	import ietf-yang-types {
		prefix yang;
		revision-date 2013-07-15;
	}

	import msea-types {
		prefix msea;
		revision-date 2016-02-29;
	}

	import ietf-interfaces {
		prefix "if";
	}

	import ietf-inet-types {
		prefix inet;
	}

	import iana-if-type {
		prefix "ianaift";
	}
	
	import ietf-netconf-acm {
		prefix nacm;
	}

	organization
	"Microsemi Inc., FTD Division";

	contact
	"Web URL: http://www.microsemi.com/
	E-mail: info@microsemi.com
	Postal: Microsemi Corporation Corporate Headquarters
	One Enterprise Aliso Viejo,
	CA 92656
	U.S.A.
	Phone: +1 949 380 6100
	Fax: +1 949 215-4996";

	description
	"This YANG module is based on the MEF 40 SNMP model, for the management 
	objects for the management of User Network Interfaces (UNIs).
	It has been converted to YANG and modified slightly to suit the
	EdgeAssure SFP which has some extra constraints that are not handled by
	the original model

	Copyright 2016 Microsemi Inc.
	All rights reserved.";

	reference
	"***************************************************************************
	Reference Overview

	A number of base documents have been used to create this MIB. The following
	are the abbreviations for the baseline documents:
	[MEF 40] refers to SNMP MIB
	[MEF6.1] refers to MEF 6.1 'Ethernet Services Definitions - Phase 2',
	April 2008
	[MEF 6.1.1] refers to MEF 6.1.1 'Layer 2 Control Protocol Handling Amendment
	to MEF 6.1', January 2012
	[MEF 7.2] refers to MEF 7.2 'Carrier Ethernet Management Information Model',
	January 2013
	[MEF 10.2] refers to MEF 10.2 'Ethernet Services Attributes Phase 2',
	October 2009
	[MEF 26.1] refers to MEF 26.1 'External Network Network Interface (ENNI) -
	Phase 2', January 2012
	[Q.840.1] refers to 'ITU-T Requirements and analysis for NMS-EMS
	management interface of Ethernet over Transport and Metro Ethernet
	Network (EoT/MEN)', March 2007
	****************************************************************************";

	revision "2016-03-17" {
		description
		"Initial Version. Sean Condon - Microsemi";
		reference "MEF 6.2";
	}

	typedef MefServiceInterfaceType {
		type bits {
//      bit bUni1d1;
//      bit bUni1d2;
			bit bUni2d1 {description "Only bUni2d1 is supported by EdgeAssure 1000";}
//      bit bUni2d2;
//      bit bEnni;
//      bit bEnniVuni;
		}

		default "bUni2d1";
		description
		"A MEF Interface can be one of several types:

		bUni1d1 UNI Type 1.1 See MEF 13. Non-multiplexed UNI for services such as EPL,
		bUni1d2 UNI Type 1.2 See MEF 13. Multiplexed UNI for services such as EVPL,
		bUni2d1 UNI Type 2.1 See MEF 20 section 7
		bUni2d2 UNI Type 2.2 See MEF 20 section 7
		bEnni ENNI
		bEnniVuni VUNI on an ENNI";
		reference
		"[MEF 6.1] 6.0";
	}

	typedef l2cp-dest-mac-address {
		type string {
			pattern '01-80-[cC]2-(00-){2}[02][0-9a-fA-F]|01:80:[cC]2:(00:){2}[02][0-9a-fA-F]';
		}
		description
		"The L2CP Destination MAC address for CoS 
		Identifier type of 'l2cp' and is ignored for other types.

		Valid values are 01-80-C2-00-00-00 through 01-80-C2-00-00-0F and
		01-80-C2-00-00-20 through 01-80-C2-00-00-2F

		Values can be upper or lower case and can be separated by hyphen or colon (but not both)";
	}

	typedef l2cp-destination-address {
		type enumeration {
			enum destinationAddressOnly {
				description "L2CP selection is determined by
				MAC Destination Address only";
			}

//						enum daPlusProtocol {
//							description "L2CP selection is determined by
//								MAC Destination Address plus
//								Ethernet protocol";
//						}
//						
//						enum daPlusProtocolPlusSubtype {
//							description "L2CP selection is determined by
//							MAC Destination Address plus
//							Ethernet protocol plus subtype";
//						}
		}
	}
	
    typedef ip-address-origin {
      type enumeration {
        enum "other" {
          value 0;
          description
            "None of the following.";
        }
        enum "static" {
          value 1;
          description
            "Indicates that the address has been statically
          configured - for example, using NETCONF or a Command Line
          Interface.";
        }
        enum "dhcp" {
          value 2;
          description
            "Indicates an address that has been assigned to this
          system by a DHCP server.";
        }
        enum "link-layer" {
          value 3;
          description
            "Indicates an address created by IPv6 stateless
          autoconfiguration that embeds a link-layer address in its
          interface identifier.";
        }
        enum "random" {
          value 4;
          description
            "Indicates an address chosen by the system at

          random, e.g., an IPv4 address within 169.254/16, an
          RFC 4941 temporary address, or an RFC 7217 semantically
          opaque address.";
          reference
            "RFC 4941: Privacy Extensions for Stateless Address
            	  Autoconfiguration in IPv6
             RFC 7217: A Method for Generating Semantically Opaque
            	  Interface Identifiers with IPv6 Stateless
            	  Address Autoconfiguration (SLAAC)";

        }
      }
      description
        "The origin of an address.";
    }

    typedef neighbor-origin {
      type enumeration {
        enum "other" {
          value 0;
          description
            "None of the following.";
        }
        enum "static" {
          value 1;
          description
            "Indicates that the mapping has been statically
          configured - for example, using NETCONF or a Command Line
          Interface.";
        }
        enum "dynamic" {
          value 2;
          description
            "Indicates that the mapping has been dynamically resolved
          using, e.g., IPv4 ARP or the IPv6 Neighbor Discovery
          protocol.";
        }
      }
      description
        "The origin of a neighbor entry.";
    }
	
    feature ipv4-non-contiguous-netmasks {
      description
        "Indicates support for configuring non-contiguous
      subnet masks.";
    }

	/*** OBJECT DEFINITIONS ***/
	augment "/if:interfaces" {
		leaf l2cp-group-index { //aka mefServiceInterfaceCfgL2cpGrpIndex
			type leafref {
				path "/if:interfaces/msea-if:interface-profiles/msea-if:l2cp-group/msea-if:group-index";
			}
			description
			"This object is the index of the L2CP profile group
			(mefServiceL2cpGrpCfgIndex) associated with the current interface. A
			value of 0 indicates that no interface L2CP profile group is associated
			with the interface. The L2CP group must be the same for both interfaces";
			reference
			"[MEF 6.1] 6.0; [MEF 6.1.1] 8.0; [MEF 7.2] 6.2.1.2";

//        must "count(//if:interfaces/if:interface[msea-if:l2cp-group-index = current()]) = 2" {
//        	  error-app-tag "msea-if-must-01";
//        	  error-message "The same L2CP Group must be used on both interfaces of this device";
//          }
		}

		leaf mef-service-type { //aka mefServiceInterfaceCfgType
			type MefServiceInterfaceType;
			description
			"This object indicates the configured interface type. One
			bit in the vector can be set at one time based upon the
			possible values indicated by mefServiceInterfaceStatusType.";
			//default bUni1d1; --These defaults break the validation - not using them in Eagle
			reference
			"[MEF 6.1] 6.0; [MEF 7.2] 6.2.1.1, 6.2.1.2, 6.2.1.3";
		}

		leaf dhcp-timeout {
			type uint16 {range 0..max;}
			units seconds;
			default 0;
			description "The DHCP timeout in seconds, after which it will use fixed IP addreses
			A zero value specifies it should never timeout"; 
		}

		container zero-touch-provisioning {
			presence "When present sets this device to be configured through Zero Touch Provisioning";

			description "Setting Zero Touch Provisioning (ZTP) configures the setting up 
			of the management interface through an LLDP server
			When ZTP is active any DHCP or fixed IP address settings must not be specified.
			
			If this attribute is set during a NETCONF session it will have no effect until the
			next time the device is rebooted.";

			must "count(/if:interfaces/if:interface/msea-if:ipv4/msea-if:address) = 0" {
				error-app-tag "msea-if-must-01";
				error-message "When ZTP is specified there must not be a manually specified IP address for either interface";
			}

			must "not(/if:interfaces/if:interface[msea-if:dhcp-addressing = 'true']) " {
				error-app-tag "msea-if-must-02";
				error-message "When ZTP is specified there must not be a DHCP Specification for either interface";
			}

		}

		container interface-profiles {

			list interface-bwp-group { //aka mefServiceBwpGrpCfgEntry

				key "group-index";
				max-elements 64;
				description
				"Bandwidth profile group settings table entry.";

				leaf group-index { //aka mefServiceBwpGrpCfgIndex
					type uint8;
					description
					"Bandwidth profile group index number";
				}

				list interface-bwp { //aka mefServiceBwpCfgEntry
					key "cos-index";//Changed to cos-index (from bwp-index) based on MEP 40 6.4.2 
					unique name;
					max-elements 64;

					description
					"Bandwidth profile. This maps 1:1 with a COS instance. This object is 
					maintained here to keep the traditional layout of BWPGroup-BWP-COS, but does
					not have any other purpose in the current implementation";

					leaf cos-index { //aka mefServiceBwpCfgCosIndex
						type leafref {
							path "/if:interfaces/msea-if:interface-profiles/msea-if:interface-cos/msea-if:cos-index";
						}
						description
						"This object is the index number of the CoS ID profile
						associated with the current bandwidth profile. A value of 0 indicates
						that no CoS ID profile is associated with the bandwidth profile and the
						bandwidth profile applies to all CoS IDs.

						This index indicates a specific CoS ID profile previously configured via
						mefServiceCosCfgTable as indicated by the mefServiceCosCfgIndex object.";
						reference
						"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";

						must "current()/../../msea-if:group-index > 0" {
							error-app-tag "msea-if-must-10";
							error-message "No BWP's can be added to the Bandwidth Profile Group 0, as this index represents a special case";
						}
					}

					leaf name { //mefServiceBwpCfgIdentifier
						type string {
							length "1..45";
						}
						mandatory true;
						description
						"This object indicates the bandwidth profile identifier for the
						associated bandwidth profile index and is an arbitrary
						text string that is used to identify a bandwidth profile. Unique
						string values are chosen to uniquely identify the bandwidth
						profile.

						Octet values of 0x00 through 0x1f are illegal.

						MEF 26.1 restricts the maximum size identifiers to 45 octets.";
						reference
						"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
					}


				} //End bwp

			} //End bwp-group

			list interface-cos { //aka mefServiceCosCfgEntry
				key "cos-index";
				unique name;
				max-elements 64;
				description
				"Class of Service Identifier settings table entry.";

				leaf cos-index { //aka mefServiceCosCfgIndex
					type uint32 {
						range 1..max;
					}
					description
					"Class of Service Identifier profile index number.";
				}

				leaf name { //aka mefServiceCosCfgIdentifier
					type string {
						length 1..45;
					}

					description
					"This object indicates the Class of Service Name for the
					associated CoS profile index and is an arbitrary text string that is
					used to identify a CoS ID profile. Unique string values are chosen to
					uniquely identify the profile.

					Octet values of 0x00 through 0x1f are illegal.

					MEF 26.1 restricts the maximum size identifiers to 45 octets.";
					reference
					"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
				}

				container dscp-cos-type {
					description "Indicates that the CoS profile is associated
					with the incoming frame's DSCP field if it is an IP frame.
					If it is not an IP frame no action is taken on it";

					choice dscp-id-choice {
						case dscp-bits-list {
							leaf dscp-group-bit-list {
								type bits {
									bit dscp-0-7 {
										description "The set of DSCP identifiers from 0-7";
									}
									bit dscp-8-15 {
										description "The set of DSCP identifiers from 8-15";
									}
									bit dscp-16-23 {
										description "The set of DSCP identifiers from 16-23";
									}
									bit dscp-24-31 {
										description "The set of DSCP identifiers from 24-31";
									}
									bit dscp-32-39 {
										description "The set of DSCP identifiers from 32-39";
									}
									bit dscp-40-47 {
										description "The set of DSCP identifiers from 40-47";
									}
									bit dscp-48-55 {
										description "The set of DSCP identifiers from 48-55";
									}
									bit dscp-56-63 {
										description "The set of DSCP identifiers from 56-63";
									}
								}
							}
						}

						case dscp-0-63 {
							container dscp-0-63 {
								presence "The full set of DSCP identifiers from 0-63";
							}
						}

						case specific-values {
							leaf-list dscp-id {
								type uint16 {
									range 0..64;
								}
								ordered-by system;
								description "The set of DSCP identifiers handled by this COS";
							}
						}
						mandatory true;
//						msea:not-changeable;
					}

					choice color-specification {
						case all-green {
							container color-all-green {
								presence "Color for all specified DSCPs mapped to green";
							}
						}
						case all-yellow {
							container color-all-yellow {
								presence "Color for all specified DSCPs mapped to yellow";
							}
						}
						case all-dropped {
							container color-all-dropped {
								presence "Color for all specified DSCPs mapped to dropped";
							}
						}

						case dscp-to-color-map {
							list dscp-color {
								key dscp-id;
								ordered-by system;
								description "A list of DSCP values that apply to this COS.
								When the COS type is DSCP a subset of the values can
								be specified. Other DSCP values can be specified in
								additional COS profiles. In total the same priority
								cannot be repeated in a BWP Group";

								leaf dscp-id {
									type uint16 {
										range 0..64;
									}
								}

								leaf color {
									description "Color to apply to incoming IP frames
									with this DSCP id";

									type msea:cos-color-type;
								}
							}
						}
						default all-green;
//						msea:not-changeable;
					}
				}

				leaf outgoing-cos-value {
					type msea:priority-type;
					mandatory true;
//					msea:not-changeable;

					description
					"Used to set the egress COS to use for all ingress COS explicitly listed";
					reference
					"Edge Assure internal API";
				}
			}

			list l2cp-group { //aka mefServiceL2cpGrpCfgEntry
				key "group-index";
				max-elements 64;
				description
				"L2CP profile group settings table entry on an interface.";

				leaf group-index { //aka mefServiceL2cpGrpCfgIndex
					type uint32;
					description
					"L2CP profile group index number, indicating the specific L2CP profile 
					group";
				}

				list l2cp { //aka mefServiceL2cpCfgEntry
					key "index";
					max-elements 64;
					description
					"L2CP settings table entry on an interface or a service.";

					leaf index { //aka mefServiceL2cpCfgIndex
						type uint32;
						description
						"This object configures the L2CP index number on an interface or a 
						Service and is used to create/access a L2CP profile within a L2CP
						group.";

						must "current()/../../msea-if:group-index > 0" {
							error-app-tag "msea-if-must-11";
							error-message "No L2CP's can be added to the L2CP Group 0, as this index represents a special case";
						}
					}

					leaf handling { //aka mefServiceL2cpCfgType
						type enumeration {
							enum discard {description "The indicated L2CP is discarded";}

							enum tunnel {description "The indicated L2CP is tunneled (passed)";}

							enum peer {description "The indicated L2CP is peered with the NE";}

							//						enum passToEvc {description "the indicated L2CP is passed to the EVC for
							//							EVC processing of the L2CP. Final L2CP
							//							disposition is based the L2CP profile for
							//							the EVC to be tunneled, discarded, or peered.
							//							This value is not valid for EVC based L2CP";
							//						}
						}
						default tunnel;
//						msea:not-changeable;

						description
						"This object configures the handling of matching L2CP frames.";
						reference
						"[MEF 6.1] 6.0, 8.0; [MEF 6.1.1] 8.0; [MEF 7.2] 6.2.1.2";
					}

					leaf match-scope { //aka mefServiceL2cpCfgMatchScope
						type l2cp-destination-address;
						default destinationAddressOnly;
//						msea:not-changeable;

						description
						"This object configures the L2CP selection matching scope.";
						reference
						"[MEF 6.1] 6.0, 8.0; [MEF 6.1.1] 8.0; [MEF 7.2] 6.2.1.2";

					}

					leaf mac-address { //aka mefServiceL2cpCfgMacAddress
						type l2cp-dest-mac-address;
						mandatory true;
//						msea:not-changeable;

						description
						"This object configures the L2CP Destination MAC address.

						Valid values are 01-80-C2-00-00-00 through 01-80-C2-00-00-0F and
						01-80-C2-00-00-20 through 01-80-C2-00-00-2F";

						must "count(current()/../../msea-if:l2cp[msea-if:mac-address = current()]) <= 1" {
							error-app-tag "msea-if-must-12";
							error-message "A destination address can only appear once in an L2CP Group";
						}
					}
				} //End l2cp

			} //End l2cp-group

		} //End profiles
	} //end augment interfaces

	//
	// Augments ietf-interfaces (only of type ethernetCsmacd) with MEF Services
	//
	augment "/if:interfaces/if:interface" {
		
		//Copied IPV4 over from ietf-ip because 
		//  i) We do not want to have to include IPv6
		// ii) libnetconf only supports augmenting any container 
		//      from one file (i.e. cannot augment interface here and 
		//		also in ietf-ip.yang
		
		
	      container ipv4 {
	        presence
	          "Enables IPv4 unless the 'enabled' leaf
	        (which defaults to 'true') is set to 'false'";
	        description
	          "Parameters for the IPv4 address family.";
	        
	        leaf enabled {
	          type boolean;
	          default true;

	          description
	            "Controls whether IPv4 is enabled or disabled on this
	             interface.  When IPv4 is enabled, this interface is
	             connected to an IPv4 stack, and the interface can send
	             and receive IPv4 packets. When ZTP is configured it
				 will treat both interfaces as enabled and will ignore
				 what this value is set to";

				must "count(/if:interfaces/if:interface[if:name='eth0' or if:name='eth1']/msea-if:ipv4[msea-if:enabled = 'true']) >= 1" {
					error-app-tag "msea-if-must-20";
					error-message "At least one of the interfaces eth0 and eth1 must be enabled";
				}
	        }

	        leaf forwarding {
	          type boolean;
	          default false;
	          description
	            "Controls IPv4 packet forwarding of datagrams received by,
	          but not addressed to, this interface.  IPv4 routers
	          forward datagrams.  IPv4 hosts do not (except those
	          source-routed via the host).";
	        }

	        leaf mtu {
	          type uint16 {
	            range "68..max";
	          }
	          units "octets";
	          description
	            "The size, in octets, of the largest IPv4 packet that the
	          interface will send and receive.

	          The server may restrict the allowed values for this leaf,
	          depending on the interface's type.

	          If this leaf is not configured, the operationally used MTU
	          depends on the interface's type.";
	          reference
	            "RFC 791: Internet Protocol";

	        }

	        container address { 
	          when "not (../../msea-if:dhcp-addressing = 'true')";
	          presence "This address being present indicates the interface has been configured";
	        
	          description
	            "The configured IPv4 addresses on the interface.";
	          leaf ip {
	            type inet:ipv4-address-no-zone;
	            description
	              "The IPv4 address on the interface.";
	          }

	          choice subnet {
	            mandatory true;
	            description
	              "The subnet can be specified as a prefix-length, or,
	            if the server supports non-contiguous netmasks, as
	            a netmask.";
	            leaf prefix-length {
	              type uint8 {
	                range "0..32";
	              }
	              description
	                "The length of the subnet prefix.";
	            }
	            leaf netmask {
	              if-feature ipv4-non-contiguous-netmasks;
	              type yang:dotted-quad;
	              description
	                "The subnet specified as a netmask.";
	            }
	          }  // choice subnet
	          
	          leaf gateway {
				type inet:ipv4-address-no-zone;

				description "This will be ignored if ZTP or DHCP are configured 
				for management addressing. If unspecified then 0.0.0.0 will be used.";

	          }
	        }  // container address
	      }  // container ipv4

		

		leaf frame-format { //aka mefServiceInterfaceCfgFrameFormat
			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
			type enumeration {
				enum noTag {
					description "Indicates that all data on the interface 
					is regarded as untagged, regardless of it ingress type";
				}
				enum ctag {
					description "Ingress frames with CTAG(vlan>0) will be 
					regared as 'VLAN tagged'; with CTAG(vlan=0) as Priority; otherwise untagged";
				}
				enum stag {
					description "Ingress frames with STAG(vlan>0) will be 
					regared as 'VLAN tagged'; with STAG(vlan=0) as Priority; otherwise untagged";
				}
//          enum stagCtag { description "Indicates that service traffic identified 
//				with both an S-TAG (outer tag) and a C-TAG 
//				(inner tag)"; }
				//default noTag; --These defaults break the validation - not using them in Eagle
			}
			description
			"This object indicates the interface frame format type that the
			interface can recognize. Default is noTag";
			reference
			"[MEF 6.1] 6.0";
		} //end frame-format

		leaf interface-ingress-bwp-group-index { //aka mefServiceInterfaceCfgIngressBwpGrpIndex
			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
			type leafref {
				path "/if:interfaces/msea-if:interface-profiles/msea-if:interface-bwp-group/msea-if:group-index";
			}
			description
			"This object is the index number of the ingress bandwidth profile group
			associated with the current interface. A value of 0 indicates that no
			interface ingress bandwidth profile group is associated with the
			interface.

			This index indicates the specific bandwidth profile group previously
			configured via mefServiceBwpGrpCfgTable and mefServiceBwpCfgTable
			using this value for mefServiceBwpGrpCfgIndex. There may be multiple
			entries in mefServiceBwpCfgTable using this index, each containing
			bandwidth parameters for a different Class of Service Identifier.";
			reference
			"[MEF 6.1] 6.0; [MEF 7.2] 6.2.1.2";
		}

		leaf ce-vid-untagged { //aka mefServiceUniCfgCeVidUntagged
			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
			type msea:vlan-id-type;

//			mandatory true;
			description
			"Configures the CE VLAN ID associated with untagged and priority
			Service Frames. It allows the identification of untagged and
			priority tagged traffic with a specific CE-VLAN ID. This object
			is ignored for all to one bundling at the UNI.
			This attribute has been placed on the interface (rather than the UNI)
			as it can be defined regardless of whether a UNI exists or not";
			reference
			"[MEF 6.1] 6.0, [MEF 7.2] 6.2.1.2";
		}

		leaf ce-priority-untagged { //aka mefServiceUniCfgCePriorityUntagged
			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
			type msea:priority-type;
//			mandatory true;

			description
			"Configures the CE VLAN Priority associated with untagged Service
			Frames. It allows the assignment of a specific VLAN priority to
			untagged traffic. This object is ignored for all to one bundling
			at the UNI.
			This attribute has been placed on the interface (rather than the UNI)
			as it can be defined regardless of whether a UNI exists or not";
			reference
			"[MEF 7.2] 6.2.1.2";
		}

		leaf admittance-criteria {
			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
			type enumeration {
				enum admitAll {
					description "Admit all frames";
				}
//					enum admitPrioUntaggedOnly {description "Admit only frames that are not Priority tagged";}
//					enum admitVlanOnly {description "Admit only frames that are VLAN tagged";}
			}

//				default admitAll; 

			description "Criteria for admitting packets to this interface. 
			The Frame Format attribute to determintes how frames are tagged";
		}
		
		leaf color-aware {
		  type boolean;
		  default true;

		  description
		    "Defines whether the interface should handle color mappings. 
		    If true the color is extracted from the packet tag (DEI bit) 
		  	or for IPv4 packets, the DSCP field.
			If false the packet is always assumed to be green.";
	      reference   
			 "Edge Assure internal API";
		}
		
		leaf color-forward {
		  type boolean;
		  default true;

		  description
		    "Defines whether the interface should handle color mappings. 
		    If true color mappings defined in the interface-cos
			associated with the active interface-ingress-bwp-group will be applied";
	      reference   
			 "Edge Assure internal API";
		}
		
		leaf dhcp-addressing {
			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
			type boolean;

			description "This element can only be specified when ZTP 
			is not specified.

			If this element is not present and ZTP is not
			present then the fixed IP addresses specified at
			/if:interfaces/if:interface/msea-if:ipv4
			will be used

			This element is specified per interface";
			
			must "(not(/if:interfaces/if:interface[if:name = current()/../if:name]/msea-if:ipv4/msea-if:address) and not(/if:interfaces/msea-if:zero-touch-provisioning) and current() = 'true') or ((boolean(/if:interfaces/if:interface[if:name = current()/../if:name]/msea-if:ipv4/msea-if:address) or boolean(/if:interfaces/if:interface[if:name = current()/../if:name]/msea-if:ipv4[msea-if:enabled='false']) or (/if:interfaces/msea-if:zero-touch-provisioning)) and current() = 'false')" {
				error-app-tag "msea-if-must-21";
				error-message "When DHCP is 'true' there must be neither a fixed IP address for that interface NOR a ZTP node. When DHCP is 'false' there must be either a fixed IP address for that interface, a disabled interface OR a ZTP node";
			}

		}
	} //End augment "/if:interfaces/if:interface

		augment "/if:interfaces-state" {
			leaf mef-service-type-options { //aka mefServiceInterfaceStatusType
				type MefServiceInterfaceType;
				description
				"This object is a vector of bits that indicates the possible
				interface types that an interface can be configured to. An interface,
				for instance, can be configured to be a UNI type 1 or 2, or an ENNI.

				All the possible capabilities of an interface are indicated, one bit
				per possible type. At least one bit must be set for MEF compliant NEs.";
				reference
				"[MEF 6.1] 6.0";
			}

			leaf zero-touch-provisioning-state {
				type enumeration {
					enum complete {
						description "The device was configured through ZTP at last reboot";
					}
					enum incomplete {
						description "The device was configured through ZTP at last reboot but is not yet complete";
					}
					enum dhcp-failed {
						description "Communication with DHCP server found through ZTP failed 
								and default values were used instead.";
					}
					enum needs-reboot {
						description "ZTP was added to the configuration since last reboot";
					}
				}
				description "A read only set of attributes indicating the status of
				Zero Touch Provisioning. This only appears when ZTP is configured";
			}
		} //End augment "/if:interfaces-state

		
		augment "/if:interfaces-state/if:interface" {
			
		  container ipv4 {
			presence
			  "Present if IPv4 is enabled on this interface";
			config false;
			description
			  "Interface-specific parameters for the IPv4 address family.";
			leaf forwarding {
			  type boolean;
			  description
				"Indicates whether IPv4 packet forwarding is enabled or
			  disabled on this interface.";
			}

			leaf mtu {
			  type uint16 {
				range "68..max";
			  }
			  units "octets";
			  description
				"The size, in octets, of the largest IPv4 packet that the
			  interface will send and receive.";
			  reference
				"RFC 791: Internet Protocol";

			}

			container address {
			  description
				"The list of IPv4 addresses on the interface.";
			  leaf ip {
				type inet:ipv4-address-no-zone;
				description
				  "The IPv4 address on the interface.";
			  }

			  choice subnet {
				description
				  "The subnet can be specified as a prefix-length, or,
				if the server supports non-contiguous netmasks, as
				a netmask.";
				leaf prefix-length {
				  type uint8 {
					range "0..32";
				  }
				  description
					"The length of the subnet prefix.";
				}
				leaf netmask {
				  if-feature ipv4-non-contiguous-netmasks;
				  type yang:dotted-quad;
				  description
					"The subnet specified as a netmask.";
				}
			  }  // choice subnet

			  leaf origin {
				type ip-address-origin;
				description
				  "The origin of this address.";
			  }
			}  // list address

			leaf gateway {
				type inet:ipv4-address;
				description "The gateway IP address assigned through ZTP";
			}

			list neighbor {
			  key "ip";
			  description
				"A list of mappings from IPv4 addresses to
			  link-layer addresses.

			  This list represents the ARP Cache.";
			  reference
				"RFC 826: An Ethernet Address Resolution Protocol";

			  leaf ip {
				type inet:ipv4-address-no-zone;
				description
				  "The IPv4 address of the neighbor node.";
			  }

			  leaf link-layer-address {
				type yang:phys-address;
				description
				  "The link-layer address of the neighbor node.";
			  }

			  leaf origin {
				type neighbor-origin;
				description
				  "The origin of this neighbor entry.";
			  }
			}  // list neighbor
		  }  // container ipv4
		      
			leaf max-vc { //aka mefServiceInterfaceStatusMaxVc
				type uint32 {
					range "1..4095";
				}
				description
				"This object indicates the maximum number of EVCs that the
				interface can support.";
				reference
				"[MEF 6.1] 6.0; [MEF 7.2] 6.2.1.2";
			}

			  leaf configured-by {
				type enumeration {
					enum zero-touch-provisioning {
						description "ZTP is active and has configured this interface";
					}
					enum dhcp {
						description "Interface has been configured by a DHCP server without ZTP";
					}
					enum fixed-ipv4 {
						description "Interface has been configured manually";
					}
				}
			  }
		} //End augment "/if:interfaces-state/if:interface"


		augment "/if:interfaces-state/if:interface/if:statistics" {

			leaf ingress-undersized { //aka mefServiceInterfaceStatisticsIngressUndersized
				type yang:counter32;
				units "Ethernet frames";
				description
				"This object is incremented for each frame received
				on a NE interface that was smaller than 64 octets.

				This object defaults to '0'. ";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf ingress-oversized { //aka mefServiceInterfaceStatisticsIngressOversized
				type yang:counter32;
				units "Ethernet frames";
				description
				"This object is incremented for each frame received
				on a NE interface that was larger than the maximum MTU size.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf ingress-fragments { //aka mefServiceInterfaceStatisticsIngressFragments
				type yang:counter32;
				units "Ethernet frames";
				description
				"This object is incremented for each frame received
				on a NE interface that was less than 64 octets in length
				(excluding framing bits but including FCS octets) and had
				either a bad Frame Check Sequence (FCS) with an integral
				number of octets (FCS Error) or a bad FCS with a non-integral
				number of octets (Alignment Error).

				Note that it is entirely normal for this counter to
				increment. This is because it counts both runts (which are
						normal occurrences due to collisions) and noise hits.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf ingress-crc-alignment { //aka mefServiceInterfaceStatisticsIngressCrcAlignment
				type yang:counter32;
				units "Ethernet frames";
				description
				"This object is incremented for each frame received
				on a NE interface that was from 64 octets to the maximum MTU
				size in length, but had either a bad Frame Check Sequence (FCS)
				with an integral number of octets (FCS Error) or a bad FCS with
				a non-integral number of octets (Alignment Error).

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf ingress-invalid-vid { //aka mefServiceInterfaceStatisticsIngressInvalidVid
				type yang:counter32;
				units "Ethernet frames";
				description
				"This object is incremented for each frame received
				on a NE interface with an invalid VLAN ID.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf ingress-octets { //aka mefServiceInterfaceStatisticsIngressOctets
				type yang:counter64;
				units "octets";
				description
				"This object is incremented by the number of octets in a
				valid frame received on a NE interface.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf ingress-unicast { //aka mefServiceInterfaceStatisticsIngressUnicast
				type yang:counter64;
				units "Ethernet frames";
				description
				"This object is incremented for each valid unicast frame received
				on a NE interface.

				NEs that do not support 64 bit counters can return the
				upper half of the counter as all zeros.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf ingress-multicast { //aka mefServiceInterfaceStatisticsIngressMulticast
				type yang:counter64;
				units "Ethernet frames";
				description
				"This object is incremented for each valid multicast frame received
				on a NE interface.

				ME-NEs that do not support 64 bit counters can return the
				upper half of the counter as all zeros.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf ingress-broadcast { //aka mefServiceInterfaceStatisticsIngressBroadcast
				type yang:counter64;
				units "Ethernet frames";
				description
				"This object is incremented for each valid broadcast frame received
				on a NE interface.

				ME-NEs that do not support 64 bit counters can return the
				upper half of the counter as all zeros.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf egress-octets { //aka mefServiceInterfaceStatisticsEgressOctets
				type yang:counter64;
				units "octets";
				description
				"This object is incremented by the number of octets in a frame 
				transmitted on a NE interface.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf egress-unicast { //aka mefServiceInterfaceStatisticsEgressUnicast
				type yang:counter64;
				units "Ethernet frames";
				description
				"This object is incremented for each unicast frame transmitted on a
				NE interface.

				ME-NEs that do not support 64 bit counters can return the
				upper half of the counter as all zeros.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf egress-multicast { //aka mefServiceInterfaceStatisticsEgressMulticast
				type yang:counter64;
				units "Ethernet frames";
				description
				"This object is incremented for each multicast frame transmitted on a
				NE interface.

				ME-NEs that do not support 64 bit counters can return the
				upper half of the counter as all zeros.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}

			leaf egress-broadcast { //aka mefServiceInterfaceStatisticsEgressBroadcast
				type yang:counter64;
				units "Ethernet frames";
				description
				"This object is incremented for each broadcast frame transmitted on a
				NE interface.

				ME-NEs that do not support 64 bit counters can return the
				upper half of the counter as all zeros.

				This object defaults to '0'.";
				reference
				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
			}
		} //End augment "/if:interfaces-state/if:interface/if:statistics


		
		rpc ztp-reset-and-reboot {
//			nacm:default-deny-all;
			description
			"Request that the ZTP system should be reset and the system rebooted. 
			This can only be run when the zero-touch-provisioning element 
			already exists on the interfaces element
			
			If the zero-touch-provisioning element has been added since the last
			reboot then the reset will be pending already and will be brought
			in to effect by this reboot.";
		}
		
	} /* end of module msea-uni-evc-interface */
