static void ipv4_csum_update(struct proto_hdr *hdr) { struct packet *pkt; uint16_t csum; if (hdr->is_csum_valid) return; if (proto_hdr_field_is_set(hdr, IP4_CSUM)) return; pkt = packet_get(hdr->pkt_id); proto_hdr_field_set_default_u16(hdr, IP4_CSUM, 0); csum = htons(calc_csum(&pkt->payload[hdr->pkt_offset], hdr->len)); proto_hdr_field_set_default_u16(hdr, IP4_CSUM, bswap_16(csum)); hdr->is_csum_valid = true; }
static void icmpv4_csum_update(struct proto_hdr *hdr) { struct packet *pkt; uint16_t csum; if (hdr->is_csum_valid) return; if (proto_hdr_field_is_set(hdr, ICMPV4_CSUM)) return; pkt = packet_get(hdr->pkt_id); proto_hdr_field_set_default_u16(hdr, ICMPV4_CSUM, 0); csum = htons(calc_csum(proto_header_ptr(hdr), pkt->len - hdr->pkt_offset)); proto_hdr_field_set_default_u16(hdr, ICMPV4_CSUM, bswap_16(csum)); hdr->is_csum_valid = true; }