nftables/include/tcpopt.h
Florian Westphal c10464b84d exthdr: fix tcpopt_find_template to use length after mask adjustment
Unify binop handling for ipv6 extension header, ip option and tcp option
processing.

Pass the real offset and length expected, not the one used in the kernel.
This was already done for extension headers and ip options, but tcp
option parsing did not do this.

This was fine before because no existing tcp option template
had a non-byte sized member.

With mptcp addition this isn't the case anymore, subtype field is
only 4 bits wide, but tcp option delinearization passed 8bits instead.

Pass the offset and mask delta, just like ip option/ipv6 exthdr.

This makes nft show 'tcp option mptcp subtype 1' instead of
'tcp option mptcp unknown & 240 == 16'.

Signed-off-by: Florian Westphal <fw@strlen.de>
2021-12-01 14:12:59 +01:00

86 lines
1.7 KiB
C

#ifndef NFTABLES_TCPOPT_H
#define NFTABLES_TCPOPT_H
#include <proto.h>
#include <exthdr.h>
#include <statement.h>
extern struct expr *tcpopt_expr_alloc(const struct location *loc,
unsigned int kind, unsigned int field);
extern void tcpopt_init_raw(struct expr *expr, uint8_t type,
unsigned int offset, unsigned int len,
uint32_t flags);
extern bool tcpopt_find_template(struct expr *expr, unsigned int offset,
unsigned int len);
/* TCP option numbers used on wire */
enum tcpopt_kind {
TCPOPT_KIND_EOL = 0,
TCPOPT_KIND_NOP = 1,
TCPOPT_KIND_MAXSEG = 2,
TCPOPT_KIND_WINDOW = 3,
TCPOPT_KIND_SACK_PERMITTED = 4,
TCPOPT_KIND_SACK = 5,
TCPOPT_KIND_TIMESTAMP = 8,
TCPOPT_KIND_ECHO = 8,
TCPOPT_KIND_MD5SIG = 19,
TCPOPT_KIND_MPTCP = 30,
TCPOPT_KIND_FASTOPEN = 34,
__TCPOPT_KIND_MAX,
/* extra oob info, internal to nft */
TCPOPT_KIND_SACK1 = 256,
TCPOPT_KIND_SACK2 = 257,
TCPOPT_KIND_SACK3 = 258,
};
/* Internal identifiers */
enum tcpopt_common {
TCPOPT_COMMON_KIND,
TCPOPT_COMMON_LENGTH,
};
enum tcpopt_maxseg {
TCPOPT_MAXSEG_KIND,
TCPOPT_MAXSEG_LENGTH,
TCPOPT_MAXSEG_SIZE,
};
enum tcpopt_timestamp {
TCPOPT_TS_KIND,
TCPOPT_TS_LENGTH,
TCPOPT_TS_TSVAL,
TCPOPT_TS_TSECR,
};
enum tcpopt_windowscale {
TCPOPT_WINDOW_KIND,
TCPOPT_WINDOW_LENGTH,
TCPOPT_WINDOW_COUNT,
};
enum tcpopt_hdr_field_sack {
TCPOPT_SACK_KIND,
TCPOPT_SACK_LENGTH,
TCPOPT_SACK_LEFT,
TCPOPT_SACK_RIGHT,
TCPOPT_SACK_LEFT1,
TCPOPT_SACK_RIGHT1,
TCPOPT_SACK_LEFT2,
TCPOPT_SACK_RIGHT2,
TCPOPT_SACK_LEFT3,
TCPOPT_SACK_RIGHT3,
};
enum tcpopt_hdr_mptcp_common {
TCPOPT_MPTCP_KIND,
TCPOPT_MPTCP_LENGTH,
TCPOPT_MPTCP_SUBTYPE,
};
extern const struct exthdr_desc *tcpopt_protocols[__TCPOPT_KIND_MAX];
#endif /* NFTABLES_TCPOPT_H */