Home | History | Annotate | Download | only in contrib
      1 % Tests for OpenFlow v1.3 with Scapy
      2 
      3 + Fields
      4 
      5 = GroupDescPacketListField(), check getfield
      6 remain, lst = GroupDescPacketListField(None, None, None).getfield(None, b'\x00\x10')
      7 not remain
      8 all([OFPGroupDesc in gd for gd in lst])
      9 lst[0].length == 0x0010
     10 
     11 + Usual OFv1.3 messages
     12 
     13 = OFPTHello(), hello without version bitmap
     14 ofm = OFPTHello()
     15 raw(ofm) == b'\x04\x00\x00\x08\x00\x00\x00\x00'
     16 
     17 = OFPTEchoRequest(), echo request
     18 ofm = OFPTEchoRequest()
     19 raw(ofm) == b'\x04\x02\x00\x08\x00\x00\x00\x00'
     20 
     21 = OFPMatch(), check padding
     22 ofm = OFPMatch(oxm_fields=OFBEthType(eth_type=0x86dd))
     23 assert(len(raw(ofm))%8 == 0)
     24 raw(ofm) == b'\x00\x01\x00\x0a\x80\x00\x0a\x02\x86\xdd\x00\x00\x00\x00\x00\x00'
     25 
     26 = OpenFlow(), generic method test with OFPTEchoRequest()
     27 ofm = OFPTEchoRequest()
     28 s = raw(ofm)
     29 isinstance(OpenFlow(None,s)(s), OFPTEchoRequest)
     30 
     31 = OFPTFlowMod(), check codes and defaults values
     32 ofm = OFPTFlowMod(cmd='OFPFC_DELETE', out_group='ALL', flags='CHECK_OVERLAP+NO_PKT_COUNTS')
     33 assert(ofm.cmd == 3)
     34 assert(ofm.out_port == 0xffffffff)
     35 assert(ofm.out_group == 0xfffffffc)
     36 ofm.flags == 10
     37 
     38 = OFBIPv6ExtHdrHMID(), check creation of last OXM classes
     39 assert(hasattr(OFBIPv6ExtHdr(), 'ipv6_ext_hdr_flags'))
     40 OFBIPv6ExtHdrHMID().field == 39
     41 
     42 + Complex OFv1.3 messages
     43 
     44 = OFPTFlowMod(), complex flow_mod
     45 mtc = OFPMatch(oxm_fields=OFBVLANVID(vlan_vid=10))
     46 ist1 = OFPITApplyActions(actions=[OFPATSetField(field=OFBIPv4Src(ipv4_src='192.168.10.41')),OFPATSetField(field=OFBEthSrc(eth_src='1a:d5:cb:4e:3c:64')),OFPATOutput(port='NORMAL')])
     47 ist2 = OFPITWriteActions(actions=OFPATOutput(port='CONTROLLER'))
     48 ofm = OFPTFlowMod(table_id=2, match=mtc, instructions=[ist1,ist2])
     49 hexdump(ofm)
     50 s = b'\x04\x0e\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x01\x00\x0a\x80\x00\x0c\x02\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x04\x00\x38\x00\x00\x00\x00\x00\x19\x00\x10\x80\x00\x16\x04\xc0\xa8\x0a\x29\x00\x00\x00\x00\x00\x19\x00\x10\x80\x00\x08\x06\x1a\xd5\xcb\x4e\x3c\x64\x00\x00\x00\x00\x00\x10\xff\xff\xff\xfa\xff\xff\x00\x00\x00\x00\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\xff\xff\xff\xfd\xff\xff\x00\x00\x00\x00\x00\x00'
     51 raw(ofm) == s
     52 
     53 = OFPETBadRequest() containing a flow_mod with wrong table_id
     54 flowmod = OFPTFlowMod(instructions=OFPITGotoTable(table_id=0))
     55 ofm = OFPETBadRequest(errcode='OFPBRC_BAD_TABLE_ID', data=raw(flowmod))
     56 hexdump(ofm)
     57 s = b'\x04\x01\x00L\x00\x00\x00\x00\x00\x01\x00\t\x04\x0e\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\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00'
     58 raw(ofm) == s
     59 
     60 = OFPTPacketIn() containing an Ethernet frame
     61 ofm = OFPTPacketIn(data=Ether()/IP()/ICMP())
     62 p = OFPTPacketIn(raw(ofm))
     63 dat = p.data
     64 assert(isinstance(dat, Ether))
     65 assert(isinstance(dat.payload, IP))
     66 isinstance(dat.payload.payload, ICMP)
     67 
     68 + Layer bindings
     69 
     70 = TCP()/OFPMPRequestDesc(), check default sport
     71 p = TCP()/OFPMPRequestDesc()
     72 p[TCP].sport == 6653
     73 
     74 = TCP()/OFPETHelloFailed(), check default dport
     75 p = TCP()/OFPETHelloFailed()
     76 p[TCP].dport == 6653
     77 
     78 = TCP()/OFPTHello() dissection, check new TCP.guess_payload_class
     79 o = TCP()/OFPTHello()
     80 p = TCP(raw(o))
     81 p[TCP].sport == 6653
     82 isinstance(p[TCP].payload, OFPTHello)
     83 
     84 = complete Ether()/IP()/TCP()/OFPTFeaturesRequest()
     85 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)
     86 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\xa6\xa4\x00\x00\x04\x05\x00\x08\x00\x00\x00\x17'
     87 assert(raw(ofm) == s)
     88 e = Ether(s)
     89 e.show2()
     90 e[OFPTFeaturesRequest].xid == 23
     91