#ifndef NICO_ARP #define NICO_ARP /********************** ARP ***********************************/ action arp_reply(mac_addr_t mac_addr) { /* swap */ ipv4_addr_t ipv4_src = hdr.arp.dst_ipv4_addr; ipv4_addr_t ipv4_dst = hdr.arp.src_ipv4_addr; /* swap/add */ mac_addr_t mac_src = mac_addr; mac_addr_t mac_dst = hdr.arp.src_mac_addr; /* fill the ethernet header */ hdr.ethernet.dst_addr = mac_dst; hdr.ethernet.src_addr = mac_src; /* fill the arp header */ hdr.arp.dst_mac_addr = mac_dst; hdr.arp.src_mac_addr = mac_src; /* swapping */ hdr.arp.dst_ipv4_addr = ipv4_dst; hdr.arp.src_ipv4_addr = ipv4_src; 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; arp_reply; NoAction; } size = ICMP6_TABLE_SIZE; default_action = controller_debug_table_id(TABLE_ARP); } table v4_arp_egress { key = { hdr.arp.dst_ipv4_addr: lpm; } actions = { controller_debug_table_id; set_egress_port; NoAction; } size = ICMP6_TABLE_SIZE; default_action = controller_debug_table_id(TABLE_ARP_EGRESS); } #endif