| % Tests for OpenFlow v1.3 with Scapy |
| |
| + Fields |
| |
| = GroupDescPacketListField(), check getfield |
| remain, lst = GroupDescPacketListField(None, None, None).getfield(None, b'\x00\x10') |
| not remain |
| all([OFPGroupDesc in gd for gd in lst]) |
| lst[0].length == 0x0010 |
| |
| + Usual OFv1.3 messages |
| |
| = OFPTHello(), hello without version bitmap |
| ofm = OFPTHello() |
| raw(ofm) == b'\x04\x00\x00\x08\x00\x00\x00\x00' |
| |
| = OFPTEchoRequest(), echo request |
| ofm = OFPTEchoRequest() |
| raw(ofm) == b'\x04\x02\x00\x08\x00\x00\x00\x00' |
| |
| = OFPMatch(), check padding |
| ofm = OFPMatch(oxm_fields=OFBEthType(eth_type=0x86dd)) |
| assert(len(raw(ofm))%8 == 0) |
| raw(ofm) == b'\x00\x01\x00\x0a\x80\x00\x0a\x02\x86\xdd\x00\x00\x00\x00\x00\x00' |
| |
| = OpenFlow(), generic method test with OFPTEchoRequest() |
| ofm = OFPTEchoRequest() |
| s = raw(ofm) |
| isinstance(OpenFlow(None,s)(s), OFPTEchoRequest) |
| |
| = OFPTFlowMod(), check codes and defaults values |
| ofm = OFPTFlowMod(cmd='OFPFC_DELETE', out_group='ALL', flags='CHECK_OVERLAP+NO_PKT_COUNTS') |
| assert(ofm.cmd == 3) |
| assert(ofm.out_port == 0xffffffff) |
| assert(ofm.out_group == 0xfffffffc) |
| ofm.flags == 10 |
| |
| = OFBIPv6ExtHdrHMID(), check creation of last OXM classes |
| assert(hasattr(OFBIPv6ExtHdr(), 'ipv6_ext_hdr_flags')) |
| OFBIPv6ExtHdrHMID().field == 39 |
| |
| + Complex OFv1.3 messages |
| |
| = OFPTFlowMod(), complex flow_mod |
| mtc = OFPMatch(oxm_fields=OFBVLANVID(vlan_vid=10)) |
| 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')]) |
| ist2 = OFPITWriteActions(actions=OFPATOutput(port='CONTROLLER')) |
| ofm = OFPTFlowMod(table_id=2, match=mtc, instructions=[ist1,ist2]) |
| hexdump(ofm) |
| 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' |
| raw(ofm) == s |
| |
| = OFPETBadRequest() containing a flow_mod with wrong table_id |
| flowmod = OFPTFlowMod(instructions=OFPITGotoTable(table_id=0)) |
| ofm = OFPETBadRequest(errcode='OFPBRC_BAD_TABLE_ID', data=raw(flowmod)) |
| hexdump(ofm) |
| 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' |
| raw(ofm) == s |
| |
| = OFPTPacketIn() containing an Ethernet frame |
| ofm = OFPTPacketIn(data=Ether()/IP()/ICMP()) |
| p = OFPTPacketIn(raw(ofm)) |
| dat = p.data |
| assert(isinstance(dat, Ether)) |
| assert(isinstance(dat.payload, IP)) |
| isinstance(dat.payload.payload, ICMP) |
| |
| + Layer bindings |
| |
| = TCP()/OFPMPRequestDesc(), check default sport |
| p = TCP()/OFPMPRequestDesc() |
| p[TCP].sport == 6653 |
| |
| = TCP()/OFPETHelloFailed(), check default dport |
| p = TCP()/OFPETHelloFailed() |
| p[TCP].dport == 6653 |
| |
| = TCP()/OFPTHello() dissection, check new TCP.guess_payload_class |
| o = TCP()/OFPTHello() |
| p = TCP(raw(o)) |
| p[TCP].sport == 6653 |
| isinstance(p[TCP].payload, OFPTHello) |
| |
| = complete Ether()/IP()/TCP()/OFPTFeaturesRequest() |
| 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) |
| 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' |
| assert(raw(ofm) == s) |
| e = Ether(s) |
| e.show2() |
| e[OFPTFeaturesRequest].xid == 23 |