Add basic 2.4
This commit is contained in:
255
Uebung2/basic_2_4.p4
Normal file
255
Uebung2/basic_2_4.p4
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
/* -*- P4_16 -*- */
|
||||||
|
#include <core.p4>
|
||||||
|
#include <v1model.p4>
|
||||||
|
|
||||||
|
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<bit<16>>(8192) nextInSequenceNumber;
|
||||||
|
register<bit<16>>(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;
|
Reference in New Issue
Block a user