VOL-3202: Report UNI port capability as part of port-created RPC
Change-Id: I91a1ac60775fbe0ba1bbab287cb4c8bccc74df2e
diff --git a/python/adapters/brcm_openomci_onu/uni_port.py b/python/adapters/brcm_openomci_onu/uni_port.py
index 7094022..7bab7ca 100644
--- a/python/adapters/brcm_openomci_onu/uni_port.py
+++ b/python/adapters/brcm_openomci_onu/uni_port.py
@@ -16,8 +16,11 @@
from __future__ import absolute_import
import structlog
from enum import Enum
+from pyvoltha.common.utils.nethelpers import mac_str_to_tuple
from voltha_protos.common_pb2 import OperStatus, AdminState
from voltha_protos.device_pb2 import Port
+from voltha_protos.openflow_13_pb2 import OFPPF_1GB_FD, OFPPF_FIBER, OFPPS_LINK_DOWN, OFPPS_LIVE, ofp_port
+
class UniType(Enum):
"""
@@ -27,14 +30,17 @@
VEIP = 'VirtualEthernetInterfacePoint'
# TODO: Add others as they become supported
+
# ReservedVlan Transparent Vlan (Masked Vlan, VLAN_ANY in ONOS Flows)
RESERVED_TRANSPARENT_VLAN = 4096
+
class UniPort(object):
"""Wraps southbound-port(s) support for ONU"""
def __init__(self, handler, name, uni_id, port_no, ofp_port_no,
+ parent_port_no, device_serial_number,
type=UniType.PPTP):
self.log = structlog.get_logger(device_id=handler.device_id,
port_no=port_no)
@@ -48,13 +54,15 @@
self._mac_bridge_port_num = 0
self._type = type
self._uni_id = uni_id
+ self._parent_port_no = parent_port_no
+ self._serial_num = device_serial_number
self._admin_state = AdminState.DISABLED
self._oper_status = OperStatus.DISCOVERED
def __str__(self):
return "UniPort - name: {}, port_number: {}, admin_state: {}, oper_state: {}, entity_id: {}, " \
- "mac_bridge_port_num: {}, type: {}, ofp_port: {}"\
+ "mac_bridge_port_num: {}, type: {}, ofp_port: {}" \
.format(self.name, self.port_number, self.adminstate, self.operstatus, self.entity_id,
self._mac_bridge_port_num, self.type, self._ofp_port_no)
@@ -62,8 +70,10 @@
return str(self)
@staticmethod
- def create(handler, name, uni_id, port_no, ofp_port_no, type):
- port = UniPort(handler, name, uni_id, port_no, ofp_port_no, type)
+ def create(handler, name, uni_id, port_no, ofp_port_no,
+ parent_port_no, device_serial_number, type):
+ port = UniPort(handler, name, uni_id, port_no, ofp_port_no,
+ parent_port_no, device_serial_number, type)
return port
def _start(self):
@@ -124,7 +134,6 @@
"""
return self._uni_id
-
@property
def mac_bridge_port_num(self):
"""
@@ -165,18 +174,59 @@
"""
return self._type
+ @property
+ def parent_port_no(self):
+ """
+ Parent port number for this ONU - will be the PON port of the OLT
+ where this ONU is connected
+ """
+ return self._parent_port_no
+
+ @property
+ def serial_number(self):
+ """
+ Serial number of the ONU
+ """
+ return self._serial_num
+
def get_port(self):
"""
Get the VOLTHA PORT object for this port
:return: VOLTHA Port object
"""
+
+ cap = OFPPF_1GB_FD | OFPPF_FIBER
+
+ hw_addr = mac_str_to_tuple('08:%02x:%02x:%02x:%02x:%02x' %
+ ((self.parent_port_no >> 8 & 0xff),
+ self.parent_port_no & 0xff,
+ (self.port_number >> 16) & 0xff,
+ (self.port_number >> 8) & 0xff,
+ self.port_number & 0xff))
+
+ name = self.serial_number + '-' + str(self.mac_bridge_port_num)
+
+ ofstate = OFPPS_LINK_DOWN
+ if self.operstatus is OperStatus.ACTIVE:
+ ofstate = OFPPS_LIVE
+
self._port = Port(port_no=self.port_number,
label=self.port_id_name(),
type=Port.ETHERNET_UNI,
admin_state=self._admin_state,
- oper_status=self._oper_status)
+ oper_status=self._oper_status,
+ ofp_port=ofp_port(
+ name=name,
+ hw_addr=hw_addr,
+ config=0,
+ state=ofstate,
+ curr=cap,
+ advertised=cap,
+ peer=cap,
+ curr_speed=OFPPF_1GB_FD,
+ max_speed=OFPPF_1GB_FD
+ ))
return self._port
def port_id_name(self):
return 'uni-{}'.format(self._port_number)
-