blob: e76a984642fe218ed9e63a13ce5aad95684dafa7 [file] [log] [blame]
Carmelo Cascone9ab40612017-09-19 16:31:55 +09001// 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
10control 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
32control 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}