[7055] : Minor cleanup.
VOL-548: Frameio test fix. Submitted on behalf of Karthick Ramanarayanan
Change-Id: If05d89bdb027faa21dc7a8fd05d3014d6d2ad01a
diff --git a/common/frameio/frameio.py b/common/frameio/frameio.py
index 544d462..3f5bcf6 100644
--- a/common/frameio/frameio.py
+++ b/common/frameio/frameio.py
@@ -113,6 +113,7 @@
RCV_SIZE_DEFAULT = 4096
ETH_P_ALL = 0x03
RCV_TIMEOUT = 10000
+ MIN_PKT_SIZE = 60
def __init__(self, iface_name):
self.iface_name = iface_name
@@ -186,7 +187,16 @@
return sent_bytes
def send_frame(self, frame):
- return self.socket.send(frame)
+ try:
+ return self.socket.send(frame)
+ except socket.error, err:
+ if err[0] == os.errno.EINVAL:
+ if len(frame) < self.MIN_PKT_SIZE:
+ padding = '\x00' * (self.MIN_PKT_SIZE - len(frame))
+ frame = frame + padding
+ return self.socket.send(frame)
+ else:
+ raise
def up(self):
if sys.platform.startswith('darwin'):
diff --git a/tests/itests/run_as_root/test_frameio.py b/tests/itests/run_as_root/test_frameio.py
index bd8f770..ad62f98 100644
--- a/tests/itests/run_as_root/test_frameio.py
+++ b/tests/itests/run_as_root/test_frameio.py
@@ -36,7 +36,7 @@
from twisted.trial.unittest import TestCase
from common.frameio.frameio import FrameIOManager, BpfProgramFilter, \
- FrameIOPortProxy
+ FrameIOPortProxy, FrameIOPort
from common.utils.asleep import asleep
from common.utils.deferred_utils import DeferredWithTimeout, TimeOutError
@@ -45,7 +45,6 @@
class TestFrameIO(TestCase):
-
@inlineCallbacks
def make_veth_pairs_if_needed(self):
@@ -78,16 +77,18 @@
rcvd = DeferredWithTimeout()
p0 = self.mgr.open_port('veth0', none).up()
p1 = self.mgr.open_port('veth1',
- lambda p, f: rcvd.callback((p, f))).up()
+ lambda p, f: rcvd.callback((p, f))).up()
# sending to veth0 should result in receiving on veth1 and vice versa
bogus_frame = 'bogus packet'
- p0.send(bogus_frame)
+ bogus_frame_padded = bogus_frame + '\x00' * (
+ FrameIOPort.MIN_PKT_SIZE - len(bogus_frame))
+ p0.send(bogus_frame_padded)
# check that we receved packet
port, frame = yield rcvd
self.assertEqual(port, p1)
- self.assertEqual(frame, bogus_frame)
+ self.assertEqual(frame, bogus_frame_padded)
@inlineCallbacks
def test_packet_send_receive_with_filter(self):
@@ -100,7 +101,7 @@
filter=filter).up()
# sending bogus packet would not be received
- ip_packet = str(Ether()/IP(dst='123.123.123.123'))
+ ip_packet = str(Ether() / IP(dst='123.123.123.123'))
p0.send(ip_packet)
# check that we receved packet
@@ -141,6 +142,7 @@
queue.append(frame)
if len(queue1) == n and len(queue2) == n:
done.callback(None)
+
return _append
p1in = self.mgr.open_port('veth0', none).up()
@@ -175,6 +177,7 @@
queue.append(frame)
if len(queue1) == n / 2 and len(queue2) == n / 2:
done.callback(None)
+
return _append
filter = BpfProgramFilter('vlan 100')
@@ -187,7 +190,7 @@
def send_packets(port, n):
for i in xrange(n):
# packets have alternating VLAN ids 100 and 101
- pkt = Ether()/Dot1Q(vlan=100 + i % 2)
+ pkt = Ether() / Dot1Q(vlan=100 + i % 2)
port.send(str(pkt))
yield asleep(0.00001 * random.random()) # to interleave
@@ -217,24 +220,25 @@
# sending from pin1, should be received by pout1
bogus_frame = 'bogus packet'
- pin1.send(bogus_frame)
+ bogus_frame_padded = bogus_frame + '\x00' * (
+ FrameIOPort.MIN_PKT_SIZE - len(bogus_frame))
+ pin1.send(bogus_frame_padded)
port, frame = yield queue1.get()
self.assertEqual(port, pout1)
- self.assertEqual(frame, bogus_frame)
+ self.assertEqual(frame, bogus_frame_padded)
self.assertEqual(len(queue1.pending), 0)
self.assertEqual(len(queue2.pending), 0)
# sending from pin2, should be received by pout1
- bogus_frame = 'bogus packet'
- pin2.send(bogus_frame)
+ pin2.send(bogus_frame_padded)
port, frame = yield queue1.get()
self.assertEqual(port, pout1)
- self.assertEqual(frame, bogus_frame)
+ self.assertEqual(frame, bogus_frame_padded)
self.assertEqual(len(queue1.pending), 0)
self.assertEqual(len(queue2.pending), 0)
# sending from pin1, should be received by both pouts
- ip_packet = str(Ether()/IP(dst='123.123.123.123'))
+ ip_packet = str(Ether() / IP(dst='123.123.123.123'))
pin1.send(ip_packet)
port, frame = yield queue1.get()
self.assertEqual(port, pout1)
@@ -246,7 +250,7 @@
self.assertEqual(len(queue2.pending), 0)
# sending from pin2, should be received by pout1
- ip_packet = str(Ether()/IP(dst='123.123.123.123'))
+ ip_packet = str(Ether() / IP(dst='123.123.123.123'))
pin2.send(ip_packet)
port, frame = yield queue1.get()
self.assertEqual(port, pout1)
@@ -265,4 +269,5 @@
if __name__ == '__main__':
import unittest
+
unittest.main()