Several improvements to onosnet.py
Replace arping and ping with custom gratuitous arp code
Don't block forever on switch.waitConnected()
Allow backgrounding bgIperf
Change-Id: I6cb10c3c8971e29336a6c6e2deffb5231900d463
diff --git a/tools/test/topos/gratuitousArp.py b/tools/test/topos/gratuitousArp.py
new file mode 100755
index 0000000..27af1e9
--- /dev/null
+++ b/tools/test/topos/gratuitousArp.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+import sys
+import os
+import fcntl
+import socket
+from struct import pack
+
+def getIPAddress(intf):
+ #Borrowed from:
+ #http://stackoverflow.com/questions/24196932/how-can-i-get-the-ip-address-of-eth0-in-python
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ return socket.inet_ntoa(fcntl.ioctl(
+ s.fileno(),
+ 0x8915, # SIOCGIFADDR
+ pack('256s', intf[:15])
+ )[20:24])
+
+def gratuitousArp(intf, ip=None, mac=None):
+ #Adapted from:
+ #https://github.com/krig/send_arp.py/blob/master/send_arp.py
+ sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
+ try:
+ sock.bind((intf, socket.SOCK_RAW))
+ except:
+ print 'Device does not exist: %s' % intf
+ return
+
+ if not ip:
+ try:
+ ip = getIPAddress(intf)
+ except IOError:
+ print 'No IP for %s' % intf
+ return
+ packed_ip = pack('!4B', *[int(x) for x in ip.split('.')])
+
+ if mac:
+ packed_mac = pack('!6B', *[int(x,16) for x in mac.split(':')])
+ else:
+ packed_mac = sock.getsockname()[4]
+
+ bcast_mac = pack('!6B', *(0xFF,)*6)
+ zero_mac = pack('!6B', *(0x00,)*6)
+ eth_arp = pack('!H', 0x0806)
+ arp_proto = pack('!HHBBH', 0x0001, 0x0800, 0x0006, 0x0004, 0x0001)
+ arpframe = [
+ ## ETHERNET
+ # destination MAC addr
+ bcast_mac,
+ # source MAC addr
+ packed_mac,
+ # eth proto
+ eth_arp,
+
+ ## ARP
+ arp_proto,
+ # sender MAC addr
+ packed_mac,
+ # sender IP addr
+ packed_ip,
+ # target hardware addr
+ bcast_mac,
+ # target IP addr
+ packed_ip
+ ]
+
+ # send the ARP packet
+ sock.send(''.join(arpframe))
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1:
+ intfs = sys.argv[1:]
+ else:
+ intfs = os.listdir('/sys/class/net/')
+
+ for intf in intfs:
+ gratuitousArp(intf)
\ No newline at end of file