From 7ad31212627a043ff5dab9861a767367adf11175 Mon Sep 17 00:00:00 2001 From: structix Date: Sun, 3 Jul 2022 10:58:51 +0200 Subject: [PATCH] Add basic 2.4 --- Uebung2/basic_2_4.p4 | 255 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 Uebung2/basic_2_4.p4 diff --git a/Uebung2/basic_2_4.p4 b/Uebung2/basic_2_4.p4 new file mode 100644 index 0000000..37f7866 --- /dev/null +++ b/Uebung2/basic_2_4.p4 @@ -0,0 +1,255 @@ +/* -*- P4_16 -*- */ +#include +#include + +const bit<16> TYPE_IPV4 = 0x800; +const bit<8> protocolIPv4 = 0x04; + +/************************************************************************* +*********************** H E A D E R S *********************************** +*************************************************************************/ + +typedef bit<9> egressSpec_t; +typedef bit<48> macAddr_t; +typedef bit<32> ip4Addr_t; + +header ethernet_t { + macAddr_t dstAddr; + macAddr_t srcAddr; + bit<16> etherType; +} + +header ipv4_t { + bit<4> version; + bit<4> ihl; + bit<8> diffserv; + bit<16> totalLen; + bit<16> identification; + bit<3> flags; + bit<13> fragOffset; + bit<8> ttl; + bit<8> protocol; + bit<16> hdrChecksum; + ip4Addr_t srcAddr; + ip4Addr_t dstAddr; +} + +struct metadata { + /* empty */ +} + +struct headers { + ethernet_t ethernet; + ipv4_t tunnelheader; + ipv4_t ipv4; +} + +/************************************************************************* +*********************** P A R S E R *********************************** +*************************************************************************/ + +parser MyParser(packet_in packet, + out headers hdr, + inout metadata meta, + inout standard_metadata_t standard_metadata) { + + state start { + transition parse_ethernet; + } + + state parse_ethernet { + packet.extract(hdr.ethernet); + transition select(hdr.ethernet.etherType) { + TYPE_IPV4: parse_ipv4; + default: accept; + } + } + + state parse_ipv4 { + packet.extract(hdr.ipv4); + transition accept; + } +} + +/************************************************************************* +************ C H E C K S U M V E R I F I C A T I O N ************* +*************************************************************************/ + +control MyVerifyChecksum(inout headers hdr, inout metadata meta) { + apply { } +} + + +/************************************************************************* +************** I N G R E S S P R O C E S S I N G ******************* +*************************************************************************/ + + + +control MyIngress(inout headers hdr, + inout metadata meta, + inout standard_metadata_t standard_metadata) { + + // define Registers for sequence number: + register>(8192) nextInSequenceNumber; + register>(8192) nextOutSequenceNumber; + + // let a packet enter a tunnel + action protectionPush() { + bit<16> tempSeqNum; + const ip4Addr_t addrh1 = 0x0A000101; + const ip4Addr_t addrs1 = 0x0A010001; + const ip4Addr_t addrs3 = 0x0A030003; + + nextOutSequenceNumber.read(tempSeqNum, 0); + // add header + if (hdr.ipv4.srcAddr == addrh1) { + hdr.tunnelheader.srcAddr = addrs1; + hdr.tunnelheader.dstAddr = addrs3; + } else { + hdr.tunnelheader.srcAddr = addrs3; + hdr.tunnelheader.dstAddr = addrs1; + } + hdr.tunnelheader.version = 0x4; + hdr.tunnelheader.ihl = 0x5; + hdr.tunnelheader.diffserv = 0x00; + hdr.tunnelheader.totalLen = (hdr.ipv4.totalLen + 20); + hdr.tunnelheader.identification = tempSeqNum; + hdr.tunnelheader.flags = 0b000; + hdr.tunnelheader.fragOffset = 0b0000000000000; + hdr.tunnelheader.ttl = 0xFF; + hdr.tunnelheader.protocol = protocolIPv4; + tempSeqNum = tempSeqNum + 1; + nextOutSequenceNumber.write(0, tempSeqNum); + update_checksum( + hdr.tunnelheader.isValid(), + { hdr.tunnelheader.version, + hdr.tunnelheader.ihl, + hdr.tunnelheader.diffserv, + hdr.tunnelheader.totalLen, + hdr.tunnelheader.identification, + hdr.tunnelheader.flags, + hdr.tunnelheader.fragOffset, + hdr.tunnelheader.ttl, + hdr.tunnelheader.protocol, + hdr.tunnelheader.srcAddr, + hdr.tunnelheader.dstAddr }, + hdr.tunnelheader.hdrChecksum, + HashAlgorithm.csum16); + // clone packet + standard_metadata.egress_spec = 2; + clone(CloneType.I2E, 3); + } + + // Let the tunneled packet leave the tunnel + action protectionPop() { + bit<16> tempSeqNum; + nextInSequenceNumber.read(tempSeqNum, 0); + if (hdr.ipv4.identification == tempSeqNum) { + // remove header and forward + hdr.ipv4.setInvalid(); + // increase Sequence Number + tempSeqNum = tempSeqNum + 1; + nextInSequenceNumber.write(0, tempSeqNum); + } else { + mark_to_drop(); + } + } + + action drop() { + mark_to_drop(); + } + + action ipv4_forward(macAddr_t dstAddr, egressSpec_t port) { + standard_metadata.egress_spec = port; + hdr.ethernet.srcAddr = hdr.ethernet.dstAddr; + hdr.ethernet.dstAddr = dstAddr; + hdr.ipv4.ttl = hdr.ipv4.ttl - 1; + } + + table ipv4_lpm { + key = { + hdr.ipv4.dstAddr: lpm; + } + actions = { + ipv4_forward; + drop; + NoAction; + } + size = 1024; + default_action = drop(); + } + + + apply { + if (hdr.ipv4.isValid()) { + if (standard_metadata.ingress_port == 1) { + protectionPush(); + } else { + protectionPop(); + } + ipv4_lpm.apply(); + } + } +} + +/************************************************************************* +**************** E G R E S S P R O C E S S I N G ******************* +*************************************************************************/ + +control MyEgress(inout headers hdr, + inout metadata meta, + inout standard_metadata_t standard_metadata) { + + + apply { } +} + +/************************************************************************* +************* C H E C K S U M C O M P U T A T I O N ************** +*************************************************************************/ + +control MyComputeChecksum(inout headers hdr, inout metadata meta) { + apply { + update_checksum( + hdr.ipv4.isValid(), + { hdr.ipv4.version, + hdr.ipv4.ihl, + hdr.ipv4.diffserv, + hdr.ipv4.totalLen, + hdr.ipv4.identification, + hdr.ipv4.flags, + hdr.ipv4.fragOffset, + hdr.ipv4.ttl, + hdr.ipv4.protocol, + hdr.ipv4.srcAddr, + hdr.ipv4.dstAddr }, + hdr.ipv4.hdrChecksum, + HashAlgorithm.csum16); + } +} + +/************************************************************************* +*********************** D E P A R S E R ******************************* +*************************************************************************/ + +control MyDeparser(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.ethernet); + packet.emit(hdr.tunnelheader); + packet.emit(hdr.ipv4); + } +} + +/************************************************************************* +*********************** S W I T C H ******************************* +*************************************************************************/ + +V1Switch( +MyParser(), +MyVerifyChecksum(), +MyIngress(), +MyEgress(), +MyComputeChecksum(), +MyDeparser() +) main;