move pkt in into openolt_packet
Change-Id: I425646b3d61ad46fcc65a5c1fbe86ca63a27bdb9
diff --git a/voltha/adapters/openolt/grpc/openolt_grpc.py b/voltha/adapters/openolt/grpc/openolt_grpc.py
index 1c47e5c..05605ee 100644
--- a/voltha/adapters/openolt/grpc/openolt_grpc.py
+++ b/voltha/adapters/openolt/grpc/openolt_grpc.py
@@ -56,7 +56,8 @@
stub = openolt_pb2_grpc.OpenoltStub(channel)
stream = stub.EnableIndication(openolt_pb2.Empty())
- topic = 'openolt.ind-{}'.format(host_and_port.split(':')[0])
+ default_topic = 'openolt.ind-{}'.format(host_and_port.split(':')[0])
+ pktin_topic = 'openolt.pktin-{}'.format(host_and_port.split(':')[0])
while True:
try:
@@ -66,11 +67,14 @@
log.warn('openolt grpc connection lost', error=e)
ind = openolt_pb2.Indication()
ind.olt_ind.oper_state = 'down'
- kafka_send_pb(topic, ind)
+ kafka_send_pb(default_topic, ind)
break
else:
log.debug("openolt grpc rx indication", indication=ind)
- kafka_send_pb(topic, ind)
+ if ind.HasField('pkt_ind'):
+ kafka_send_pb(pktin_topic, ind)
+ else:
+ kafka_send_pb(default_topic, ind)
if __name__ == '__main__':
diff --git a/voltha/adapters/openolt/openolt_device.py b/voltha/adapters/openolt/openolt_device.py
index ef94da7..eec0f2c 100644
--- a/voltha/adapters/openolt/openolt_device.py
+++ b/voltha/adapters/openolt/openolt_device.py
@@ -143,8 +143,11 @@
self.data_model.olt_create(self.device_info)
+ # FIXME
self._kadmin.delete_topics([
'voltha.pktout-{}'.format(self.data_model.logical_device_id)])
+ self._kadmin.delete_topics(['openolt.pktin-{}'.format(
+ self.host_and_port.split(':')[0])])
self._packet = OpenoltPacket(self)
self._packet.start()
diff --git a/voltha/adapters/openolt/openolt_indications.py b/voltha/adapters/openolt/openolt_indications.py
index 75f905d..fc5b32e 100644
--- a/voltha/adapters/openolt/openolt_indications.py
+++ b/voltha/adapters/openolt/openolt_indications.py
@@ -19,8 +19,6 @@
from simplejson import loads
from twisted.internet import reactor
import structlog
-from scapy.layers.l2 import Ether, Packet
-from common.frameio.frameio import hexify
from voltha.adapters.openolt.protos import openolt_pb2
from voltha.adapters.openolt.openolt_kafka_consumer import KConsumer
@@ -81,8 +79,6 @@
reactor.callFromThread(self.device.onu_indication, ind.onu_ind)
elif ind.HasField('omci_ind'):
reactor.callFromThread(self.device.omci_indication, ind.omci_ind)
- elif ind.HasField('pkt_ind'):
- self.send_packet_in(ind.pkt_ind)
elif ind.HasField('port_stats'):
reactor.callFromThread(
self.device.stats_mgr.port_statistics_indication,
@@ -96,40 +92,3 @@
self.device.alarm_mgr.process_alarms, ind.alarm_ind)
else:
self.log.warn('unknown indication type')
-
- def send_packet_in(self, pkt_indication):
- self.log.debug("packet indication",
- intf_type=pkt_indication.intf_type,
- intf_id=pkt_indication.intf_id,
- port_no=pkt_indication.port_no,
- cookie=pkt_indication.cookie,
- gemport_id=pkt_indication.gemport_id,
- flow_id=pkt_indication.flow_id)
- try:
- logical_port_num = self.device.data_model.logical_port_num(
- pkt_indication.intf_type,
- pkt_indication.intf_id,
- pkt_indication.port_no,
- pkt_indication.gemport_id)
- except ValueError:
- self.log.error('No logical port found',
- intf_type=pkt_indication.intf_type,
- intf_id=pkt_indication.intf_id,
- port_no=pkt_indication.port_no,
- gemport_id=pkt_indication.gemport_id)
- return
-
- ether_pkt = Ether(pkt_indication.pkt)
-
- if isinstance(ether_pkt, Packet):
- ether_pkt = str(ether_pkt)
-
- logical_device_id = self.device.data_model.logical_device_id
- topic = 'packet-in:' + logical_device_id
-
- self.log.debug('send-packet-in', logical_device_id=logical_device_id,
- logical_port_num=logical_port_num,
- packet=hexify(ether_pkt))
-
- self.device.data_model.adapter_agent.event_bus.publish(
- topic, (logical_port_num, str(ether_pkt)))
diff --git a/voltha/adapters/openolt/openolt_packet.py b/voltha/adapters/openolt/openolt_packet.py
index 1bc77e0..318456e 100644
--- a/voltha/adapters/openolt/openolt_packet.py
+++ b/voltha/adapters/openolt/openolt_packet.py
@@ -20,6 +20,7 @@
import structlog
from scapy.layers.l2 import Ether, Dot1Q
import binascii
+from scapy.layers.l2 import Packet
from common.frameio.frameio import hexify
from voltha.protos.openflow_13_pb2 import PacketOut
@@ -33,23 +34,35 @@
def __init__(self, device):
self.log = structlog.get_logger()
self.device = device
- self.packet_thread_handle = threading.Thread(
- target=self.packet_thread)
- self.packet_thread_handle.setDaemon(True)
+
+ self.packet_out_thread_handle = threading.Thread(
+ target=self.packet_out_thread)
+ self.packet_out_thread_handle.setDaemon(True)
+
+ self.packet_in_thread_handle = threading.Thread(
+ target=self.packet_in_thread)
+ self.packet_in_thread_handle.setDaemon(True)
def start(self):
- self.packet_thread_handle.start()
+ self.packet_out_thread_handle.start()
+ self.packet_in_thread_handle.start()
def stop(self):
pass
- def packet_thread(self):
+ def packet_out_thread(self):
self.log.debug('openolt packet-out thread starting')
- KConsumer(self.packet_process,
+ KConsumer(self.packet_out_process,
'voltha.pktout-{}'.format(
self.device.data_model.logical_device_id))
- def packet_process(self, topic, msg):
+ def packet_in_thread(self):
+ self.log.debug('openolt packet-in thread starting')
+ topic = 'openolt.pktin-{}'.format(
+ self.device.host_and_port.split(':')[0])
+ KConsumer(self.packet_in_process, topic)
+
+ def packet_out_process(self, topic, msg):
def get_port_out(opo):
for action in opo.actions:
@@ -134,3 +147,46 @@
self.log.warn('Packet-out-to-this-interface-type-not-implemented',
egress_port=egress_port,
port_type=egress_port_type)
+
+ def packet_in_process(self, topic, msg):
+
+ ind = Parse(loads(msg), openolt_pb2.Indication(),
+ ignore_unknown_fields=True)
+ assert(ind.HasField('pkt_ind'))
+ pkt_ind = ind.pkt_ind
+
+ self.log.debug("packet indication",
+ intf_type=pkt_ind.intf_type,
+ intf_id=pkt_ind.intf_id,
+ port_no=pkt_ind.port_no,
+ cookie=pkt_ind.cookie,
+ gemport_id=pkt_ind.gemport_id,
+ flow_id=pkt_ind.flow_id)
+ try:
+ logical_port_num = self.device.data_model.logical_port_num(
+ pkt_ind.intf_type,
+ pkt_ind.intf_id,
+ pkt_ind.port_no,
+ pkt_ind.gemport_id)
+ except ValueError:
+ self.log.error('No logical port found',
+ intf_type=pkt_ind.intf_type,
+ intf_id=pkt_ind.intf_id,
+ port_no=pkt_ind.port_no,
+ gemport_id=pkt_ind.gemport_id)
+ return
+
+ ether_pkt = Ether(pkt_ind.pkt)
+
+ if isinstance(ether_pkt, Packet):
+ ether_pkt = str(ether_pkt)
+
+ logical_device_id = self.device.data_model.logical_device_id
+ topic = 'packet-in:' + logical_device_id
+
+ self.log.debug('send-packet-in', logical_device_id=logical_device_id,
+ logical_port_num=logical_port_num,
+ packet=hexify(ether_pkt))
+
+ self.device.data_model.adapter_agent.event_bus.publish(
+ topic, (logical_port_num, str(ether_pkt)))