blob: 99d42cdf9d397585ae7bb763c64db17c27ae6ca0 [file] [log] [blame]
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -05001#
2# Copyright 2018 the original author or authors.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
Matt Jeanneret2e3cb8d2019-11-16 09:22:41 -050016from __future__ import absolute_import
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050017import structlog
18from enum import Enum
William Kurkian8235c1e2019-03-05 12:58:28 -050019from voltha_protos.common_pb2 import OperStatus, AdminState
20from voltha_protos.device_pb2 import Port
21from voltha_protos.openflow_13_pb2 import OFPPF_10GB_FD
Matt Jeanneret72f96fc2019-02-11 10:53:05 -050022from pyvoltha.common.utils.nethelpers import mac_str_to_tuple
William Kurkian8235c1e2019-03-05 12:58:28 -050023from voltha_protos.logical_device_pb2 import LogicalPort
24from voltha_protos.openflow_13_pb2 import OFPPS_LIVE, OFPPF_FIBER, OFPPS_LINK_DOWN
25from voltha_protos.openflow_13_pb2 import ofp_port
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050026
27class UniType(Enum):
28 """
29 UNI Types Defined in G.988
30 """
31 PPTP = 'PhysicalPathTerminationPointEthernet'
32 VEIP = 'VirtualEthernetInterfacePoint'
33 # TODO: Add others as they become supported
34
35
36class UniPort(object):
37 """Wraps southbound-port(s) support for ONU"""
38
39 def __init__(self, handler, name, uni_id, port_no, ofp_port_no,
40 type=UniType.PPTP):
41 self.log = structlog.get_logger(device_id=handler.device_id,
42 port_no=port_no)
43 self._enabled = False
44 self._handler = handler
45 self._name = name
46 self._port = None
47 self._port_number = port_no
48 self._ofp_port_no = ofp_port_no
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050049 self._entity_id = None
50 self._mac_bridge_port_num = 0
51 self._type = type
52 self._uni_id = uni_id
53
Matt Jeanneretf4113222019-08-14 19:44:34 -040054 self._admin_state = AdminState.DISABLED
55 self._oper_status = OperStatus.DISCOVERED
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050056
57 def __str__(self):
Matt Jeanneretf4113222019-08-14 19:44:34 -040058 return "UniPort - name: {}, port_number: {}, admin_state: {}, oper_state: {}, entity_id: {}, " \
59 "mac_bridge_port_num: {}, type: {}, ofp_port: {}"\
60 .format(self.name, self.port_number, self.adminstate, self.operstatus, self.entity_id,
61 self._mac_bridge_port_num, self.type, self._ofp_port_no)
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050062
63 def __repr__(self):
64 return str(self)
65
66 @staticmethod
67 def create(handler, name, uni_id, port_no, ofp_port_no, type):
68 port = UniPort(handler, name, uni_id, port_no, ofp_port_no, type)
69 return port
70
71 def _start(self):
72 self._cancel_deferred()
73 self._admin_state = AdminState.ENABLED
Matt Jeanneretf4113222019-08-14 19:44:34 -040074 self._oper_status = OperStatus.ACTIVATING
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050075
76 def _stop(self):
77 self._cancel_deferred()
78 self._admin_state = AdminState.DISABLED
79 self._oper_status = OperStatus.UNKNOWN
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050080
81 def delete(self):
82 self.enabled = False
83 self._handler = None
84
85 def _cancel_deferred(self):
86 pass
87
88 @property
Matt Jeanneretf4113222019-08-14 19:44:34 -040089 def adminstate(self):
90 return self._admin_state
91
92 @adminstate.setter
93 def adminstate(self, value):
94 self._admin_state = value
95
96 @property
97 def operstatus(self):
98 return self._oper_status
99
100 @operstatus.setter
101 def operstatus(self, value):
102 self._oper_status = value
103
104 @property
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -0500105 def name(self):
106 return self._name
107
108 @property
109 def enabled(self):
110 return self._enabled
111
112 @enabled.setter
113 def enabled(self, value):
114 if self._enabled != value:
115 self._enabled = value
116
117 if value:
118 self._start()
119 else:
120 self._stop()
121
122 @property
123 def uni_id(self):
124 """
125 Physical prt index on ONU 0 - N
126 :return: (int) uni id
127 """
128 return self._uni_id
129
130
131 @property
132 def mac_bridge_port_num(self):
133 """
134 Port number used when creating MacBridgePortConfigurationDataFrame port number
135 :return: (int) port number
136 """
137 return self._mac_bridge_port_num
138
139 @mac_bridge_port_num.setter
140 def mac_bridge_port_num(self, value):
141 self._mac_bridge_port_num = value
142
143 @property
144 def port_number(self):
145 """
146 Physical device port number
147 :return: (int) port number
148 """
149 return self._port_number
150
151 @property
152 def entity_id(self):
153 """
154 OMCI UNI_G entity ID for port
155 """
156 return self._entity_id
157
158 @entity_id.setter
159 def entity_id(self, value):
160 assert self._entity_id is None, 'Cannot reset the Entity ID'
161 self._entity_id = value
162
163 @property
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -0500164 def type(self):
165 """
166 UNI Type used in OMCI messaging
167 :return: (UniType) One of the enumerated types
168 """
169 return self._type
170
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -0500171 def get_port(self):
172 """
173 Get the VOLTHA PORT object for this port
174 :return: VOLTHA Port object
175 """
176 self._port = Port(port_no=self.port_number,
177 label=self.port_id_name(),
178 type=Port.ETHERNET_UNI,
179 admin_state=self._admin_state,
180 oper_status=self._oper_status)
181 return self._port
182
183 def port_id_name(self):
184 return 'uni-{}'.format(self._port_number)
185