Begin to introduce arp support

This commit is contained in:
Nico Schottelius 2019-03-31 15:48:00 +02:00
commit 07f0867175
4 changed files with 100 additions and 7 deletions

View file

@ -5,6 +5,8 @@
#include <core.p4>
#include <v1model.p4>
/**************************************** types ****************************************/
typedef bit<48> mac_addr_t;
typedef bit<32> ipv4_addr_t;
typedef bit<128> ipv6_addr_t;
@ -13,11 +15,14 @@ typedef bit<16> mcast_t;
typedef bit<16> task_t;
typedef bit<16> table_t; /* to map debug messages - 16 bit to match shortenumfield */
/**************************************** constants ****************************************/
const bit<16> TABLE_NAT64 = 1;
const bit<16> TABLE_ICMP6 = 2;
const bit<16> TABLE_V6_NETWORKS = 3;
const bit<16> TABLE_NAT46 = 4;
const bit<16> TABLE_V4_NETWORKS = 5;
const bit<16> TABLE_ARP = 6;
const bit<16> TYPE_IPV4 = 0x0800;
@ -41,6 +46,8 @@ const bit<8> ICMP6_NA = 136;
const bit<8> ICMP_ECHO_REPLY = 0;
const bit<8> ICMP_ECHO_REQUEST = 8;
const bit<16> ARP_REQUEST = 1;
const bit<16> ARP_REPLY = 2;
/* RFC4861, Section 4.6 */
const bit<8> ICMP6_NDP_OPT_SOURCE_LL = 1;
@ -58,6 +65,8 @@ const task_t TASK_CHECKSUM_ICMP6 = 5; /* data plane */
const task_t TASK_CHECKSUM_ICMP6_NA = 6; /* data plane */
const task_t TASK_CHECKSUM_ICMP = 7; /* data plane */
/**************************************** header ****************************************/
/* 48+48+16 = 112 */
header ethernet_t {
@ -154,6 +163,17 @@ header icmp_t {
bit<16> checksum;
}
header arp_t {
bit<16> hw_type;
bit<16> protocol;
bit<8> hw_size;
bit<8> protocol_size;
bit<16> opcode;
mac_addr_t src_mac_addr;
ipv4_addr_t src_ipv4_addr;
mac_addr_t dst_mac_addr;
ipv4_addr_t dst_ipv4_addr;
}
header cpu_t {
task_t task;
@ -162,6 +182,8 @@ header cpu_t {
table_t table_id;
}
/**************************************** struct ****************************************/
struct headers {
ethernet_t ethernet;
ipv4_t ipv4;
@ -175,6 +197,7 @@ struct headers {
icmp6_option_link_layer_addr_t icmp6_option_link_layer_addr;
}
struct metadata {
port_t ingress_port;
task_t task;

View file

@ -225,7 +225,7 @@ Echo or Echo Reply Message
}
/********************** ICMP6 ***********************************/
/********************** ICMP6 + NDP ***********************************/
/* old/unused action */
action icmp6_answer() {
@ -329,7 +329,36 @@ Echo or Echo Reply Message
// }
// size = NDP_TABLE_SIZE;
// default_action = NoAction;
// }
// }
/********************** ARP ***********************************/
action arp_reply(mac_addr_t mac_addr) {
ipv4_addr_t tmp = hdr.arp.src_ipv4_addr;
hdr.arp.src_mac_addr = mac_addr;
hdr.arp.src_ipv4_addr = hdr.arp.dst_ipv4_addr;
hdr.arp.dst_mac_addr = hdr.arp.src_mac_addr;
hdr.arp.dst_ipv4_addr = tmp;
hdr.arp.opcode = ARP_REPLY;
}
table v4_arp {
key = {
hdr.ethernet.dst_addr: exact;
hdr.arp.opcode: exact;
hdr.arp.dst_ipv4_addr: lpm;
}
actions = {
controller_debug_table_id;
NoAction;
}
size = ICMP6_TABLE_SIZE;
default_action = controller_debug_table_id(TABLE_ARP);
}
/********************** ROUTING (egress definiton) TABLES ***********************************/
@ -400,6 +429,7 @@ Echo or Echo Reply Message
v6_networks.apply();
exit;
}
v4_arp.apply();
v4_networks.apply(); /* regular routing, egress */
}
}