Commit b5bdc6f9 authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso
Browse files

netfilter: nf_tables: convert pktinfo->tprot_set to flags field



Generalize boolean field to store more flags on the pktinfo structure.

Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 56fa9501
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -21,10 +21,14 @@ struct module;

#define NFT_JUMP_STACK_SIZE	16

enum {
	NFT_PKTINFO_L4PROTO	= (1 << 0),
};

struct nft_pktinfo {
	struct sk_buff			*skb;
	const struct nf_hook_state	*state;
	bool				tprot_set;
	u8				flags;
	u8				tprot;
	u16				fragoff;
	unsigned int			thoff;
@@ -75,7 +79,7 @@ static inline void nft_set_pktinfo(struct nft_pktinfo *pkt,

static inline void nft_set_pktinfo_unspec(struct nft_pktinfo *pkt)
{
	pkt->tprot_set = false;
	pkt->flags = 0;
	pkt->tprot = 0;
	pkt->thoff = 0;
	pkt->fragoff = 0;
+4 −3
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@ static inline void nft_set_pktinfo_ipv4(struct nft_pktinfo *pkt)
	struct iphdr *ip;

	ip = ip_hdr(pkt->skb);
	pkt->tprot_set = true;
	pkt->flags = NFT_PKTINFO_L4PROTO;
	pkt->tprot = ip->protocol;
	pkt->thoff = ip_hdrlen(pkt->skb);
	pkt->fragoff = ntohs(ip->frag_off) & IP_OFFSET;
@@ -36,7 +36,7 @@ static inline int __nft_set_pktinfo_ipv4_validate(struct nft_pktinfo *pkt)
	else if (len < thoff)
		return -1;

	pkt->tprot_set = true;
	pkt->flags = NFT_PKTINFO_L4PROTO;
	pkt->tprot = iph->protocol;
	pkt->thoff = thoff;
	pkt->fragoff = ntohs(iph->frag_off) & IP_OFFSET;
@@ -71,7 +71,7 @@ static inline int nft_set_pktinfo_ipv4_ingress(struct nft_pktinfo *pkt)
		goto inhdr_error;
	}

	pkt->tprot_set = true;
	pkt->flags = NFT_PKTINFO_L4PROTO;
	pkt->tprot = iph->protocol;
	pkt->thoff = thoff;
	pkt->fragoff = ntohs(iph->frag_off) & IP_OFFSET;
@@ -82,4 +82,5 @@ static inline int nft_set_pktinfo_ipv4_ingress(struct nft_pktinfo *pkt)
	__IP_INC_STATS(nft_net(pkt), IPSTATS_MIB_INHDRERRORS);
	return -1;
}

#endif
+3 −3
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ static inline void nft_set_pktinfo_ipv6(struct nft_pktinfo *pkt)
		return;
	}

	pkt->tprot_set = true;
	pkt->flags = NFT_PKTINFO_L4PROTO;
	pkt->tprot = protohdr;
	pkt->thoff = thoff;
	pkt->fragoff = frag_off;
@@ -50,7 +50,7 @@ static inline int __nft_set_pktinfo_ipv6_validate(struct nft_pktinfo *pkt)
	if (protohdr < 0)
		return -1;

	pkt->tprot_set = true;
	pkt->flags = NFT_PKTINFO_L4PROTO;
	pkt->tprot = protohdr;
	pkt->thoff = thoff;
	pkt->fragoff = frag_off;
@@ -96,7 +96,7 @@ static inline int nft_set_pktinfo_ipv6_ingress(struct nft_pktinfo *pkt)
	if (protohdr < 0)
		goto inhdr_error;

	pkt->tprot_set = true;
	pkt->flags = NFT_PKTINFO_L4PROTO;
	pkt->tprot = protohdr;
	pkt->thoff = thoff;
	pkt->fragoff = frag_off;
+1 −1
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ static bool nft_payload_fast_eval(const struct nft_expr *expr,
	if (priv->base == NFT_PAYLOAD_NETWORK_HEADER)
		ptr = skb_network_header(skb);
	else {
		if (!pkt->tprot_set)
		if (!(pkt->flags & NFT_PKTINFO_L4PROTO))
			return false;
		ptr = skb_network_header(skb) + nft_thoff(pkt);
	}
+2 −2
Original line number Diff line number Diff line
@@ -113,13 +113,13 @@ static int nf_trace_fill_pkt_info(struct sk_buff *nlskb,
	int off = skb_network_offset(skb);
	unsigned int len, nh_end;

	nh_end = pkt->tprot_set ? nft_thoff(pkt) : skb->len;
	nh_end = pkt->flags & NFT_PKTINFO_L4PROTO ? nft_thoff(pkt) : skb->len;
	len = min_t(unsigned int, nh_end - skb_network_offset(skb),
		    NFT_TRACETYPE_NETWORK_HSIZE);
	if (trace_fill_header(nlskb, NFTA_TRACE_NETWORK_HEADER, skb, off, len))
		return -1;

	if (pkt->tprot_set) {
	if (pkt->flags & NFT_PKTINFO_L4PROTO) {
		len = min_t(unsigned int, skb->len - nft_thoff(pkt),
			    NFT_TRACETYPE_TRANSPORT_HSIZE);
		if (trace_fill_header(nlskb, NFTA_TRACE_TRANSPORT_HEADER, skb,
Loading