| // Routes a packet to an interface based on its IPv4 address |
| // Maintains a set of counters on the routing table |
| |
| header_type ethernet_t { |
| fields { |
| dstAddr : 48; |
| srcAddr : 48; |
| etherType : 16; |
| } |
| } |
| |
| header_type ipv4_t { |
| fields { |
| version : 4; |
| ihl : 4; |
| diffserv : 8; |
| totalLen : 16; |
| identification : 16; |
| flags : 3; |
| fragOffset : 13; |
| ttl : 8; |
| protocol : 8; |
| hdrChecksum : 16; |
| srcAddr : 32; |
| dstAddr: 32; |
| } |
| } |
| |
| parser start { |
| return parse_ethernet; |
| } |
| |
| header ethernet_t ethernet; |
| |
| parser parse_ethernet { |
| extract(ethernet); |
| return select(latest.etherType) { |
| 0x800 : parse_ipv4; |
| default: ingress; |
| } |
| } |
| |
| action nop() |
| {} |
| |
| action forward(port) |
| { |
| modify_field(standard_metadata.egress_port, port); |
| } |
| |
| header ipv4_t ipv4; |
| |
| parser parse_ipv4 { |
| extract(ipv4); |
| return ingress; |
| } |
| |
| table routing { |
| reads { |
| ipv4.dstAddr: exact; |
| } |
| actions { nop; forward; } |
| size : 512; |
| } |
| |
| counter cnt { |
| type: bytes; |
| direct: routing; |
| } |
| |
| control ingress |
| { |
| apply(routing); |
| } |