This is an adaptation of zero_out_mutable_opts that takes three additional arguments: offset of the TLVs, a mask to locate the mutable bit in the TLV type, and the type value for single byte padding.
zero_out_mutable_opts calls the new function and sets the arguments appropriate to Hop-by-Hop and Destination Options. The function will be used to support zeroing out mutable SRH TLVs' data with the appropriate arguments for SRH TLVs. Signed-off-by: Tom Herbert <t...@quantonium.net> --- net/ipv6/ah6.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index 68b9e92..1e80157 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c @@ -102,32 +102,28 @@ static inline struct scatterlist *ah_req_sg(struct crypto_ahash *ahash, __alignof__(struct scatterlist)); } -static bool zero_out_mutable_opts(struct ipv6_opt_hdr *opthdr) +static bool __zero_out_mutable_opts(struct ipv6_opt_hdr *opthdr, int off, + unsigned char mut_bit, unsigned char pad1) { u8 *opt = (u8 *)opthdr; int len = ipv6_optlen(opthdr); - int off = 0; int optlen = 0; - off += 2; - len -= 2; + len -= off; while (len > 0) { - - switch (opt[off]) { - - case IPV6_TLV_PAD1: + if (opt[off] == pad1) { optlen = 1; - break; - default: + } else { if (len < 2) goto bad; - optlen = opt[off+1]+2; + + optlen = opt[off + 1] + 2; if (len < optlen) goto bad; - if (opt[off] & 0x20) - memset(&opt[off+2], 0, opt[off+1]); - break; + + if (opt[off] & mut_bit) + memset(&opt[off + 2], 0, opt[off + 1]); } off += optlen; @@ -140,6 +136,11 @@ static bool zero_out_mutable_opts(struct ipv6_opt_hdr *opthdr) return false; } +static bool zero_out_mutable_opts(struct ipv6_opt_hdr *opthdr) +{ + return __zero_out_mutable_opts(opthdr, 2, 0x20, IPV6_TLV_PAD1); +} + #if IS_ENABLED(CONFIG_IPV6_MIP6) /** * ipv6_rearrange_destopt - rearrange IPv6 destination options header -- 2.7.4