blob: 8723749865f31dee281f148161b343beb2a088a6 [file] [log] [blame]
Mohsin Kazmif5462362021-02-23 15:55:04 +01001/*
2 * SPDX-License-Identifier: Apache-2.0
3 * Copyright(c) 2021 Cisco Systems, Inc.
4 */
5
6#ifndef included_ip_psh_cksum_h
7#define included_ip_psh_cksum_h
8
9#include <vnet/ip/ip.h>
Damjan Marionaa63bc62021-11-08 11:18:30 +000010#include <vppinfra/vector/ip_csum.h>
Mohsin Kazmif5462362021-02-23 15:55:04 +010011
12typedef struct _ip4_psh
13{
14 ip4_address_t src;
15 ip4_address_t dst;
16 u8 zero;
17 u8 proto;
18 u16 l4len;
19} ip4_psh_t;
20
21typedef struct _ip6_psh
22{
23 ip6_address_t src;
24 ip6_address_t dst;
25 u32 l4len;
26 u32 proto;
27} ip6_psh_t;
28
29STATIC_ASSERT (sizeof (ip4_psh_t) == 12, "ipv4 pseudo header is 12B");
30STATIC_ASSERT (sizeof (ip6_psh_t) == 40, "ipv6 pseudo header is 40B");
31
32static_always_inline u16
33ip4_pseudo_header_cksum (ip4_header_t *ip4)
34{
35 ip4_psh_t psh = { 0 };
36 psh.src = ip4->src_address;
37 psh.dst = ip4->dst_address;
38 psh.proto = ip4->protocol;
39 psh.l4len = clib_host_to_net_u16 (clib_net_to_host_u16 (ip4->length) -
40 sizeof (ip4_header_t));
Damjan Marionaa63bc62021-11-08 11:18:30 +000041 return ~clib_net_to_host_u16 (
42 clib_ip_csum ((u8 *) &psh, sizeof (ip4_psh_t)));
Mohsin Kazmif5462362021-02-23 15:55:04 +010043}
44
45static_always_inline u16
46ip6_pseudo_header_cksum (ip6_header_t *ip6)
47{
48 ip6_psh_t psh = { 0 };
49 psh.src = ip6->src_address;
50 psh.dst = ip6->dst_address;
51 psh.l4len = ip6->payload_length;
52 psh.proto = clib_host_to_net_u32 ((u32) ip6->protocol);
Damjan Marionaa63bc62021-11-08 11:18:30 +000053 return ~clib_net_to_host_u16 (
54 clib_ip_csum ((u8 *) &psh, sizeof (ip6_psh_t)));
Mohsin Kazmif5462362021-02-23 15:55:04 +010055}
56
57#endif /* included_ip_psh_cksum_h */