netfilter: nft_inner: add geneve support
Geneve tunnel header may contain options, parse geneve header and update offset to point to the link layer header according to the opt_len field. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
@@ -783,6 +783,7 @@ enum nft_payload_csum_flags {
|
|||||||
enum nft_inner_type {
|
enum nft_inner_type {
|
||||||
NFT_INNER_UNSPEC = 0,
|
NFT_INNER_UNSPEC = 0,
|
||||||
NFT_INNER_VXLAN,
|
NFT_INNER_VXLAN,
|
||||||
|
NFT_INNER_GENEVE,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum nft_inner_flags {
|
enum nft_inner_flags {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include <linux/tcp.h>
|
#include <linux/tcp.h>
|
||||||
#include <linux/udp.h>
|
#include <linux/udp.h>
|
||||||
#include <net/gre.h>
|
#include <net/gre.h>
|
||||||
|
#include <net/geneve.h>
|
||||||
#include <net/ip.h>
|
#include <net/ip.h>
|
||||||
#include <linux/icmpv6.h>
|
#include <linux/icmpv6.h>
|
||||||
#include <linux/ip.h>
|
#include <linux/ip.h>
|
||||||
@@ -181,6 +182,22 @@ static int nft_inner_parse_tunhdr(const struct nft_inner *priv,
|
|||||||
ctx->flags |= NFT_PAYLOAD_CTX_INNER_TUN;
|
ctx->flags |= NFT_PAYLOAD_CTX_INNER_TUN;
|
||||||
*off += priv->hdrsize;
|
*off += priv->hdrsize;
|
||||||
|
|
||||||
|
switch (priv->type) {
|
||||||
|
case NFT_INNER_GENEVE: {
|
||||||
|
struct genevehdr *gnvh, _gnvh;
|
||||||
|
|
||||||
|
gnvh = skb_header_pointer(pkt->skb, pkt->inneroff,
|
||||||
|
sizeof(_gnvh), &_gnvh);
|
||||||
|
if (!gnvh)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
*off += gnvh->opt_len * 4;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user