mirror of
https://passt.top/passt
synced 2025-06-07 16:35:33 +02:00
util: move IP stuff from util.[ch] to ip.[ch]
Introduce ip.[ch] file to encapsulate IP protocol handling functions and structures. Modify various files to include the new header ip.h when it's needed. Signed-off-by: Laurent Vivier <lvivier@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Message-ID: <20240303135114.1023026-5-lvivier@redhat.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
e289d287c6
commit
324bd46782
17 changed files with 175 additions and 136 deletions
55
util.c
55
util.c
|
@ -32,61 +32,6 @@
|
|||
#include "packet.h"
|
||||
#include "log.h"
|
||||
|
||||
#define IPV6_NH_OPT(nh) \
|
||||
((nh) == 0 || (nh) == 43 || (nh) == 44 || (nh) == 50 || \
|
||||
(nh) == 51 || (nh) == 60 || (nh) == 135 || (nh) == 139 || \
|
||||
(nh) == 140 || (nh) == 253 || (nh) == 254)
|
||||
|
||||
/**
|
||||
* ipv6_l4hdr() - Find pointer to L4 header in IPv6 packet and extract protocol
|
||||
* @p: Packet pool, packet number @idx has IPv6 header at @offset
|
||||
* @idx: Index of packet in pool
|
||||
* @offset: Pre-calculated IPv6 header offset
|
||||
* @proto: Filled with L4 protocol number
|
||||
* @dlen: Data length (payload excluding header extensions), set on return
|
||||
*
|
||||
* Return: pointer to L4 header, NULL if not found
|
||||
*/
|
||||
char *ipv6_l4hdr(const struct pool *p, int idx, size_t offset, uint8_t *proto,
|
||||
size_t *dlen)
|
||||
{
|
||||
const struct ipv6_opt_hdr *o;
|
||||
const struct ipv6hdr *ip6h;
|
||||
char *base;
|
||||
int hdrlen;
|
||||
uint8_t nh;
|
||||
|
||||
base = packet_get(p, idx, 0, 0, NULL);
|
||||
ip6h = packet_get(p, idx, offset, sizeof(*ip6h), dlen);
|
||||
if (!ip6h)
|
||||
return NULL;
|
||||
|
||||
offset += sizeof(*ip6h);
|
||||
|
||||
nh = ip6h->nexthdr;
|
||||
if (!IPV6_NH_OPT(nh))
|
||||
goto found;
|
||||
|
||||
while ((o = packet_get_try(p, idx, offset, sizeof(*o), dlen))) {
|
||||
nh = o->nexthdr;
|
||||
hdrlen = (o->hdrlen + 1) * 8;
|
||||
|
||||
if (IPV6_NH_OPT(nh))
|
||||
offset += hdrlen;
|
||||
else
|
||||
goto found;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
||||
found:
|
||||
if (nh == 59)
|
||||
return NULL;
|
||||
|
||||
*proto = nh;
|
||||
return base + offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* sock_l4() - Create and bind socket for given L4, add to epoll list
|
||||
* @c: Execution context
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue