Carmelo Cascone | 9ab4061 | 2017-09-19 16:31:55 +0900 | [diff] [blame] | 1 | // Copyright (c) 2017, Google Inc. |
| 2 | // |
| 3 | // P4_16 specification for IPv4 checksum verify and update. |
| 4 | // Status: WORK IN PROGRESS |
| 5 | // Note: This code has not been tested and is expected to contain bugs. |
| 6 | |
| 7 | #include "headers.p4" |
| 8 | |
| 9 | |
| 10 | control verify_checksum(in parsed_packet_t hdr, |
| 11 | inout local_metadata_t local_metadata) { |
| 12 | Checksum16() ipv4_checksum; |
| 13 | bit<16> ck; |
| 14 | apply { |
| 15 | if (hdr.ipv4_base.isValid()) { |
| 16 | ck = ipv4_checksum.get( |
| 17 | { |
| 18 | hdr.ipv4_base.version, hdr.ipv4_base.ihl, |
| 19 | hdr.ipv4_base.diffserv, hdr.ipv4_base.total_len, |
| 20 | hdr.ipv4_base.identification, hdr.ipv4_base.flags, |
| 21 | hdr.ipv4_base.frag_offset, hdr.ipv4_base.ttl, |
| 22 | hdr.ipv4_base.protocol, hdr.ipv4_base.src_addr, |
| 23 | hdr.ipv4_base.dst_addr |
| 24 | }); |
| 25 | if (hdr.ipv4_base.hdr_checksum != ck) { |
| 26 | mark_to_drop(); |
| 27 | } |
| 28 | } |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | control compute_checksum(inout parsed_packet_t hdr, |
| 33 | inout local_metadata_t local_metadata) { |
| 34 | Checksum16() ipv4_checksum; |
| 35 | apply { |
| 36 | if (hdr.ipv4_base.isValid()) { |
| 37 | hdr.ipv4_base.hdr_checksum = ipv4_checksum.get( |
| 38 | { |
| 39 | hdr.ipv4_base.version, hdr.ipv4_base.ihl, |
| 40 | hdr.ipv4_base.diffserv, hdr.ipv4_base.total_len, |
| 41 | hdr.ipv4_base.identification, hdr.ipv4_base.flags, |
| 42 | hdr.ipv4_base.frag_offset, hdr.ipv4_base.ttl, |
| 43 | hdr.ipv4_base.protocol, hdr.ipv4_base.src_addr, |
| 44 | hdr.ipv4_base.dst_addr |
| 45 | }); |
| 46 | } |
| 47 | } |
| 48 | } |