Home | History | Annotate | Download | only in contrib
      1 % Tests for OpenFlow v1.0 with Scapy
      2 
      3 + Usual OFv1.0 messages
      4 
      5 = OFPTHello(), simple hello message
      6 ofm = OFPTHello()
      7 raw(ofm) == b'\x01\x00\x00\x08\x00\x00\x00\x00'
      8 
      9 = OFPTEchoRequest(), echo request
     10 ofm = OFPTEchoRequest()
     11 raw(ofm) == b'\x01\x02\x00\x08\x00\x00\x00\x00'
     12 
     13 = OFPMatch(), check wildcard completion
     14 ofm = OFPMatch(in_port=1, nw_tos=8)
     15 ofm = OFPMatch(raw(ofm))
     16 assert(ofm.wildcards1 == 0x1)
     17 ofm.wildcards2 == 0xfe
     18 
     19 = OpenFlow(), generic method test with OFPTEchoRequest()
     20 ofm = OFPTEchoRequest()
     21 s = raw(ofm)
     22 isinstance(OpenFlow(None,s)(s), OFPTEchoRequest)
     23 
     24 = OFPTFlowMod(), check codes and defaults values
     25 ofm = OFPTFlowMod(cmd='OFPFC_DELETE', out_port='CONTROLLER', flags='CHECK_OVERLAP+EMERG')
     26 assert(ofm.cmd == 3)
     27 assert(ofm.buffer_id == 0xffffffff)
     28 assert(ofm.out_port == 0xfffd)
     29 ofm.flags == 6
     30 
     31 + Complex OFv1.3 messages
     32 
     33 = OFPTFlowMod(), complex flow_mod
     34 mtc = OFPMatch(dl_vlan=10, nw_src='192.168.42.0', nw_src_mask=8)
     35 act1 = OFPATSetNwSrc(nw_addr='192.168.42.1')
     36 act2 = OFPATOutput(port='CONTROLLER')
     37 act3 = OFPATSetDlSrc(dl_addr='1a:d5:cb:4e:3c:64')
     38 ofm = OFPTFlowMod(priority=1000, match=mtc, flags='CHECK_OVERLAP', actions=[act1,act2,act3])
     39 raw(ofm)
     40 s = b'\x01\x0e\x00h\x00\x00\x00\x00\x00?\xc8\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xe8\xff\xff\xff\xff\xff\xff\x00\x02\x00\x06\x00\x08\xc0\xa8*\x01\x00\x00\x00\x08\xff\xfd\xff\xff\x00\x04\x00\x10\x1a\xd5\xcbN<d\x00\x00\x00\x00\x00\x00'
     41 raw(ofm) == s
     42 
     43 = OFPETBadRequest() containing a flow_mod with wrong table_id
     44 flowmod = OFPTFlowMod(actions=OFPATOutput(port='LOCAL'))
     45 ofm = OFPETBadRequest(errcode='OFPBRC_EPERM', data=raw(flowmod))
     46 hexdump(ofm)
     47 s = b'\x01\x01\x00\\\x00\x00\x00\x00\x00\x01\x00\x05\x01\x0e\x00P\x00\x00\x00\x00\x00?\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x08\xff\xfe\xff\xff'
     48 raw(ofm) == s
     49 
     50 = OFPTPacketIn() containing an Ethernet frame
     51 ofm = OFPTPacketIn(data=Ether()/IP()/ICMP())
     52 p = OFPTPacketIn(raw(ofm))
     53 dat = p.data
     54 assert(isinstance(dat, Ether))
     55 assert(isinstance(dat.payload, IP))
     56 isinstance(dat.payload.payload, ICMP)
     57 
     58 + Layer bindings
     59 
     60 = TCP()/OFPTStatsRequestDesc(), check default sport
     61 p = TCP()/OFPTStatsRequestDesc()
     62 p[TCP].sport == 6653
     63 
     64 = TCP()/OFPETHelloFailed(), check default dport
     65 p = TCP()/OFPETHelloFailed()
     66 p[TCP].dport == 6653
     67 
     68 = TCP()/OFPTHello() dissection, check new TCP.guess_payload_class
     69 o = TCP()/OFPTHello()
     70 p = TCP(raw(o))
     71 p[TCP].sport == 6653
     72 isinstance(p[TCP].payload, OFPTHello)
     73 
     74 = complete Ether()/IP()/TCP()/OFPTFeaturesRequest()
     75 ofm = Ether(src='00:11:22:33:44:55',dst='01:23:45:67:89:ab')/IP(src='10.0.0.7',dst='192.168.0.42')/TCP(sport=6633)/OFPTFeaturesRequest(xid=23)
     76 s = b'\x01#Eg\x89\xab\x00\x11"3DU\x08\x00E\x00\x000\x00\x01\x00\x00@\x06\xaf\xee\n\x00\x00\x07\xc0\xa8\x00*\x19\xe9\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xa9\xa4\x00\x00\x01\x05\x00\x08\x00\x00\x00\x17'
     77 assert(raw(ofm) == s)
     78 e = Ether(s)
     79 e.show2()
     80 e[OFPTFeaturesRequest].xid == 23
     81