diff options
author | Florian Westphal <fw@strlen.de> | 2020-11-02 15:22:40 +0100 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2020-11-09 12:19:31 +0100 |
commit | 2e1f821d713aa44717b38901ee80cac8e2aa0335 (patch) | |
tree | 4f9fbf0959b49a58ec5499005f68d3a74e15ddff /include/tcpopt.h | |
parent | 8f591eba561aceeef605283c693b659a708d1cd3 (diff) |
tcpopt: split tcpopt_hdr_fields into per-option enum
Currently we're limited to ten template fields in exthdr_desc struct.
Using a single enum for all tpc option fields thus won't work
indefinitely (TCPOPTHDR_FIELD_TSECR is 9) when new option templates get
added.
Fortunately we can just use one enum per tcp option to avoid this.
As a side effect this also allows to simplify the sack offset
calculations. Rather than computing that on-the-fly, just add extra
fields to the SACK template.
expr->exthdr.offset now holds the 'raw' value, filled in from the option
template. This would ease implementation of 'raw option matching'
using offset and length to load from the option.
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'include/tcpopt.h')
-rw-r--r-- | include/tcpopt.h | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/include/tcpopt.h b/include/tcpopt.h index 7f3fbb8b..667c8a77 100644 --- a/include/tcpopt.h +++ b/include/tcpopt.h @@ -33,16 +33,42 @@ enum tcpopt_kind { TCPOPT_KIND_SACK3 = 258, }; -enum tcpopt_hdr_fields { - TCPOPTHDR_FIELD_INVALID, - TCPOPTHDR_FIELD_KIND, - TCPOPTHDR_FIELD_LENGTH, - TCPOPTHDR_FIELD_SIZE, - TCPOPTHDR_FIELD_COUNT, - TCPOPTHDR_FIELD_LEFT, - TCPOPTHDR_FIELD_RIGHT, - TCPOPTHDR_FIELD_TSVAL, - TCPOPTHDR_FIELD_TSECR, +/* 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, }; extern const struct exthdr_desc *tcpopt_protocols[__TCPOPT_KIND_MAX]; |