aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-plugin/src/hicn.h
blob: af23f3dde3cef07d6cb4533103490fe57a05eecd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
 * Copyright (c) 2021-2022 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __HICN_H__
#define __HICN_H__

#include <hicn/hicn.h>
#include "faces/face.h"

#include <netinet/in.h>
#include <vnet/ip/ip.h>
#include <vnet/tcp/tcp_packet.h>
#include <vnet/ip/ip6_packet.h>
#include <vnet/ip/ip4_packet.h>
#include <vnet/buffer.h>

/**
 * @file
 */

/*
 * Update CMakeLists.txt as we have to manually replace the type for
 * vppapigen
 */
typedef u8 weight_t;

#define ISV6(isv6, dov6, dov4) isv6 ? dov6 : dov4
#define HICN_IS_NAMEHASH_CACHED(b)                                            \
  (((u64) (b->opaque2)[0] != 0) || ((u64) (b->opaque2)[1] != 0))

#ifndef VLIB_BUFFER_MIN_CHAIN_SEG_SIZE
#define VLIB_BUFFER_MIN_CHAIN_SEG_SIZE (128)
#endif

#define MAX_OUT_FACES 8

/* The following is stored in the opaque2 field in the vlib_buffer_t */
typedef struct
{
  /**
   * Cached packet info
   */
  hicn_packet_buffer_t pkbuf;

  /**
   * IDs to prefetch a PIT/CS entry (4)
   */
  u32 pcs_entry_id;

  /**
   * DPO/Stategy VFT ID. This is also the DPO type (4)
   */
  dpo_type_t vft_id;

  /**
   * DPO context ID (4)
   */
  u32 dpo_ctx_id;

  /**
   * Cached packet info
   */
  u16 port;
  u16 payload_type;
  hicn_lifetime_t lifetime;

  /**
   * Ingress face (4)
   */
  hicn_face_id_t face_id;

  /**
   * hICN buffer flags (1)
   */
  u8 flags;
} hicn_buffer_t;

STATIC_ASSERT (offsetof (hicn_buffer_t, pcs_entry_id) == 24, "");
STATIC_ASSERT (offsetof (hicn_buffer_t, vft_id) == 28, "");
STATIC_ASSERT (offsetof (hicn_buffer_t, dpo_ctx_id) == 32, "");
STATIC_ASSERT (offsetof (hicn_buffer_t, port) == 36, "");
STATIC_ASSERT (offsetof (hicn_buffer_t, payload_type) == 38, "");
STATIC_ASSERT (offsetof (hicn_buffer_t, lifetime) == 40, "");
STATIC_ASSERT (offsetof (hicn_buffer_t, face_id) == 44, "");
STATIC_ASSERT (offsetof (hicn_buffer_t, flags) == 48, "");
// + name = 16+4 = 20
// opaque : u32[14] = 56
STATIC_ASSERT (sizeof (hicn_buffer_t) <=
		 STRUCT_SIZE_OF (vlib_buffer_t, opaque2),
	       "hICN buffer opaque2 meta-data too large for vlib_buffer");

always_inline hicn_buffer_t *
hicn_get_buffer (vlib_buffer_t *b0)
{
  return (hicn_buffer_t *) &(b0->opaque2[0]);
}

#if 0
always_inline u8
hicn_is_v6 (hicn_header_t *pkt_hdr)
{
  return ((pkt_hdr->v4.ip.version_ihl >> 4) != 4);
}

always_inline hicn_name_t *
hicn_buffer_get_name (vlib_buffer_t *b)
{
  return hicn_packet_get_name(&hicn_get_buffer (b)->pkbuf);
}
#endif

always_inline u8
hicn_buffer_is_v6 (vlib_buffer_t *b0)
{
  hicn_packet_format_t format =
    hicn_packet_get_format (&hicn_get_buffer (b0)->pkbuf);
  return format.l1 == IPPROTO_IPV6;
}

always_inline void
hicn_buffer_set_flags (vlib_buffer_t *b, u8 flags)
{
  hicn_buffer_t *hb = hicn_get_buffer (b);
  hb->flags |= flags;
}

always_inline hicn_lifetime_t
hicn_buffer_get_lifetime (vlib_buffer_t *b)
{
  return hicn_get_buffer (b)->lifetime;
}

always_inline hicn_payload_type_t
hicn_buffer_get_payload_type (vlib_buffer_t *b)
{
  return hicn_get_buffer (b)->payload_type;
}

#endif /* __HICN_H__ */

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables: eval: (c-set-style "gnu") End:
 */