include ether type in cpu package
This commit is contained in:
parent
440782c569
commit
60a3c8d8c5
3 changed files with 13 additions and 20 deletions
|
@ -10,6 +10,7 @@ from scapy.all import sniff, get_if_list, Ether, get_if_hwaddr, sendp
|
||||||
from scapy.all import IP, Raw, IPv6, TCP, TCP_client
|
from scapy.all import IP, Raw, IPv6, TCP, TCP_client
|
||||||
from scapy.all import Ether, sniff, Packet, BitField, IntEnumField, ShortField
|
from scapy.all import Ether, sniff, Packet, BitField, IntEnumField, ShortField
|
||||||
from scapy.all import ICMPv6ND_NS
|
from scapy.all import ICMPv6ND_NS
|
||||||
|
from scapy.data import ETHER_TYPES
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
|
@ -35,7 +36,8 @@ class CpuHeader(Packet):
|
||||||
name = 'CpuPacket'
|
name = 'CpuPacket'
|
||||||
fields_desc = [
|
fields_desc = [
|
||||||
IntEnumField('task', 1, cpu_fields ),
|
IntEnumField('task', 1, cpu_fields ),
|
||||||
ShortField('ingress_port', 0)
|
ShortField('ingress_port', 0),
|
||||||
|
XShortEnumField("type", 0x9000, ETHER_TYPES)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -237,31 +239,18 @@ class L2Controller(object):
|
||||||
elif packet.type == 0x86dd:
|
elif packet.type == 0x86dd:
|
||||||
pass
|
pass
|
||||||
elif packet.type == 0x4242:
|
elif packet.type == 0x4242:
|
||||||
print("Special handling needed")
|
log.debug("CPU packet")
|
||||||
cpu_header = CpuHeader(packet.payload)
|
cpu_header = CpuHeader(packet.payload)
|
||||||
|
|
||||||
print("cpu = {} {}".format(cpu_header.__repr__(), len(cpu_header)))
|
print("cpu = {} {}".format(cpu_header.__repr__(), len(cpu_header)))
|
||||||
|
|
||||||
ether_part = pkg[Ether]
|
ether_part = pkg[Ether]
|
||||||
# read from cpu header
|
# read from cpu header
|
||||||
ether_part.type = 0x86dd
|
ether_part.type = 0x86dd
|
||||||
|
|
||||||
ether_orig = Ether(src=packet.src, dst=packet.dst, type=0x86dd)
|
ether_orig = Ether(src=packet.src, dst=packet.dst, type=0x86dd)
|
||||||
|
|
||||||
# used to find correct offset = 3
|
|
||||||
|
|
||||||
# for i in range(1, 32):
|
|
||||||
# content_orig = packet.load[i:]
|
|
||||||
# try:
|
|
||||||
# orig_packet = ether_orig / IPv6(content_orig)
|
|
||||||
# print("{}: {}".format(i, orig_packet.__repr__()))
|
|
||||||
|
|
||||||
# except Exception as e:
|
|
||||||
# pass
|
|
||||||
|
|
||||||
orig_packet = ether_orig / IPv6(packet.load[3:])
|
orig_packet = ether_orig / IPv6(packet.load[3:])
|
||||||
self.debug_print_pkg(orig_packet)
|
log.debug("o={}".format(orig_packet.__repr__()))
|
||||||
print("o={}".format(orig_packet.__repr__()))
|
|
||||||
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -114,6 +114,7 @@ header icmp_t {
|
||||||
header cpu_t {
|
header cpu_t {
|
||||||
port_t ingress_port;
|
port_t ingress_port;
|
||||||
task_t task;
|
task_t task;
|
||||||
|
bit<16> ethertype;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct headers {
|
struct headers {
|
||||||
|
@ -128,8 +129,9 @@ struct headers {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct metadata {
|
struct metadata {
|
||||||
bit<16> tcp_length;
|
port_t ingress_port;
|
||||||
task_t task;
|
task_t task;
|
||||||
|
bit<16> tcp_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -203,9 +203,11 @@ control MyEgress(inout headers hdr,
|
||||||
apply {
|
apply {
|
||||||
// ingress clone
|
// ingress clone
|
||||||
if (standard_metadata.instance_type == 1){
|
if (standard_metadata.instance_type == 1){
|
||||||
hdr.ethernet.ethertype = TYPE_CPU;
|
|
||||||
hdr.cpu.setValid();
|
hdr.cpu.setValid();
|
||||||
hdr.cpu.task = meta.task;
|
hdr.cpu.task = meta.task;
|
||||||
|
hdr.cpu.ethertype = hdr.ethernet.ethertype;
|
||||||
|
|
||||||
|
hdr.ethernet.ethertype = TYPE_CPU;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue