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