This project is to implement a simple version of Elastic Sketch in SIGCOMM 2018 with P4.
-
Makefile: the compiling file. Note that the program is running under the enviornment of P4 tutorial. -
receive_caida.py: using Scapy to receive CAIDA trace packets. -
receive_query.py: using Scapy to receive query packets (something like In-band Telemetry). -
s1-runtime.py: config the routing ins1, which need to seperate the flow of CAIDA trace and query. -
splitted: pcap file with 15M. -
test10P: pcap file with 10 packets, 8 packet with 1 occurence, 1 packet with 2 occurence -
test1M: pcap file with 1M. -
topology.json: topology file for mininet, the net has 4 hosts (h1,h2,h11,h22) and 1 switch (s1).h1: send CAIDA trace, usingtcpreply -i h1-eth0 -K test10Ph2: receive CAIDA trace, using./receive_caida.pyh3: send query trace, using./send_query.pyh4: receive query trace, using./receive_query.py
-
ES_heavy.p4: implement of Elastic Sketch.
Currently, I use BMV2 to run the test. The sketches is saved in extern Register. Unfortunately, P4 Runtime does
not support acquire Register state. Therefore, I use a way like In-band Telemetry (INT) to query the state of Elastic
Sketch in the P4 switch.
Another issue is that CAIDA traces do not have Ethernet packet. This is not a problem for software switch like OVS used by mininet. I can also send the packets in CAIDA traces withour adding a fake Ethernet header. Thus, when I process packets from CAIDA traces, I ignore the Ethernet header. However, everything is not OK. When I send a query packet with Scapy, I attach an Ethernet header for easy processing. This time the query packet cannot be processed using the CAIDA packet processing pipeline.
I find a wayout with the help of P4 community. P4 can parse packet based on ingress_port. So I send CAIDA packet to s1 from
port s1-eth2 (connect to h1), and send query packet to s1 from s1-eth1 (connected to h11). In deparsing phrase, I simply
send all headers (Ethernet, IPv4, ...) all to the egress_port.
I manually set the ip_protocol of query packets. If it is a query packet, it will send to s1-eth3 (connect to h22). otherwise
it will go to s1-eth4 (connect to h2).
In query packet, I manually set the ip_protocol to 63, and push the real ip_protocol to a field in IP_option.
The count value is also saved in IP_option.
got a packet
###[ Ethernet ]###
dst = ff:ff:ff:ff:ff:ff
src = 00:00:00:00:01:0b
type = 0x800
###[ IP ]###
version = 4L
ihl = 6L
tos = 0x0
len = 24
id = 1
flags =
frag = 0L
ttl = 64
proto = 63
chksum = 0xc450
src = 16.241.200.171
dst = 64.5.155.180
\options \
|###[ QUERY ]###
| copy_flag = 0L
| optclass = control
| option = 31L
| count = 2
| flow_proto= 6