1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __6LOWPAN_NHC_H 3*4882a593Smuzhiyun #define __6LOWPAN_NHC_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/skbuff.h> 6*4882a593Smuzhiyun #include <linux/rbtree.h> 7*4882a593Smuzhiyun #include <linux/module.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <net/6lowpan.h> 10*4882a593Smuzhiyun #include <net/ipv6.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /** 13*4882a593Smuzhiyun * LOWPAN_NHC - helper macro to generate nh id fields and lowpan_nhc struct 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * @__nhc: variable name of the lowpan_nhc struct. 16*4882a593Smuzhiyun * @_name: const char * of common header compression name. 17*4882a593Smuzhiyun * @_nexthdr: ipv6 nexthdr field for the header compression. 18*4882a593Smuzhiyun * @_nexthdrlen: ipv6 nexthdr len for the reserved space. 19*4882a593Smuzhiyun * @_idsetup: callback to setup id and mask values. 20*4882a593Smuzhiyun * @_idlen: len for the next header id and mask, should be always the same. 21*4882a593Smuzhiyun * @_uncompress: callback for uncompression call. 22*4882a593Smuzhiyun * @_compress: callback for compression call. 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun #define LOWPAN_NHC(__nhc, _name, _nexthdr, \ 25*4882a593Smuzhiyun _hdrlen, _idsetup, _idlen, \ 26*4882a593Smuzhiyun _uncompress, _compress) \ 27*4882a593Smuzhiyun static u8 __nhc##_val[_idlen]; \ 28*4882a593Smuzhiyun static u8 __nhc##_mask[_idlen]; \ 29*4882a593Smuzhiyun static struct lowpan_nhc __nhc = { \ 30*4882a593Smuzhiyun .name = _name, \ 31*4882a593Smuzhiyun .nexthdr = _nexthdr, \ 32*4882a593Smuzhiyun .nexthdrlen = _hdrlen, \ 33*4882a593Smuzhiyun .id = __nhc##_val, \ 34*4882a593Smuzhiyun .idmask = __nhc##_mask, \ 35*4882a593Smuzhiyun .idlen = _idlen, \ 36*4882a593Smuzhiyun .idsetup = _idsetup, \ 37*4882a593Smuzhiyun .uncompress = _uncompress, \ 38*4882a593Smuzhiyun .compress = _compress, \ 39*4882a593Smuzhiyun } 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define module_lowpan_nhc(__nhc) \ 42*4882a593Smuzhiyun static int __init __nhc##_init(void) \ 43*4882a593Smuzhiyun { \ 44*4882a593Smuzhiyun return lowpan_nhc_add(&(__nhc)); \ 45*4882a593Smuzhiyun } \ 46*4882a593Smuzhiyun module_init(__nhc##_init); \ 47*4882a593Smuzhiyun static void __exit __nhc##_exit(void) \ 48*4882a593Smuzhiyun { \ 49*4882a593Smuzhiyun lowpan_nhc_del(&(__nhc)); \ 50*4882a593Smuzhiyun } \ 51*4882a593Smuzhiyun module_exit(__nhc##_exit); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /** 54*4882a593Smuzhiyun * struct lowpan_nhc - hold 6lowpan next hdr compression ifnformation 55*4882a593Smuzhiyun * 56*4882a593Smuzhiyun * @node: holder for the rbtree. 57*4882a593Smuzhiyun * @name: name of the specific next header compression 58*4882a593Smuzhiyun * @nexthdr: next header value of the protocol which should be compressed. 59*4882a593Smuzhiyun * @nexthdrlen: ipv6 nexthdr len for the reserved space. 60*4882a593Smuzhiyun * @id: array for nhc id. Note this need to be in network byteorder. 61*4882a593Smuzhiyun * @mask: array for nhc id mask. Note this need to be in network byteorder. 62*4882a593Smuzhiyun * @len: the length of the next header id and mask. 63*4882a593Smuzhiyun * @setup: callback to setup fill the next header id value and mask. 64*4882a593Smuzhiyun * @compress: callback to do the header compression. 65*4882a593Smuzhiyun * @uncompress: callback to do the header uncompression. 66*4882a593Smuzhiyun */ 67*4882a593Smuzhiyun struct lowpan_nhc { 68*4882a593Smuzhiyun struct rb_node node; 69*4882a593Smuzhiyun const char *name; 70*4882a593Smuzhiyun const u8 nexthdr; 71*4882a593Smuzhiyun const size_t nexthdrlen; 72*4882a593Smuzhiyun u8 *id; 73*4882a593Smuzhiyun u8 *idmask; 74*4882a593Smuzhiyun const size_t idlen; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun void (*idsetup)(struct lowpan_nhc *nhc); 77*4882a593Smuzhiyun int (*uncompress)(struct sk_buff *skb, size_t needed); 78*4882a593Smuzhiyun int (*compress)(struct sk_buff *skb, u8 **hc_ptr); 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /** 82*4882a593Smuzhiyun * lowpan_nhc_by_nexthdr - return the 6lowpan nhc by ipv6 nexthdr. 83*4882a593Smuzhiyun * 84*4882a593Smuzhiyun * @nexthdr: ipv6 nexthdr value. 85*4882a593Smuzhiyun */ 86*4882a593Smuzhiyun struct lowpan_nhc *lowpan_nhc_by_nexthdr(u8 nexthdr); 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /** 89*4882a593Smuzhiyun * lowpan_nhc_check_compression - checks if we support compression format. If 90*4882a593Smuzhiyun * we support the nhc by nexthdr field, the function will return 0. If we 91*4882a593Smuzhiyun * don't support the nhc by nexthdr this function will return -ENOENT. 92*4882a593Smuzhiyun * 93*4882a593Smuzhiyun * @skb: skb of 6LoWPAN header to read nhc and replace header. 94*4882a593Smuzhiyun * @hdr: ipv6hdr to check the nexthdr value 95*4882a593Smuzhiyun * @hc_ptr: pointer for 6LoWPAN header which should increment at the end of 96*4882a593Smuzhiyun * replaced header. 97*4882a593Smuzhiyun */ 98*4882a593Smuzhiyun int lowpan_nhc_check_compression(struct sk_buff *skb, 99*4882a593Smuzhiyun const struct ipv6hdr *hdr, u8 **hc_ptr); 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /** 102*4882a593Smuzhiyun * lowpan_nhc_do_compression - calling compress callback for nhc 103*4882a593Smuzhiyun * 104*4882a593Smuzhiyun * @skb: skb of 6LoWPAN header to read nhc and replace header. 105*4882a593Smuzhiyun * @hdr: ipv6hdr to set the nexthdr value 106*4882a593Smuzhiyun * @hc_ptr: pointer for 6LoWPAN header which should increment at the end of 107*4882a593Smuzhiyun * replaced header. 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun int lowpan_nhc_do_compression(struct sk_buff *skb, const struct ipv6hdr *hdr, 110*4882a593Smuzhiyun u8 **hc_ptr); 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /** 113*4882a593Smuzhiyun * lowpan_nhc_do_uncompression - calling uncompress callback for nhc 114*4882a593Smuzhiyun * 115*4882a593Smuzhiyun * @nhc: 6LoWPAN nhc context, get by lowpan_nhc_by_ functions. 116*4882a593Smuzhiyun * @skb: skb of 6LoWPAN header, skb->data should be pointed to nhc id value. 117*4882a593Smuzhiyun * @dev: netdevice for print logging information. 118*4882a593Smuzhiyun * @hdr: ipv6hdr for setting nexthdr value. 119*4882a593Smuzhiyun */ 120*4882a593Smuzhiyun int lowpan_nhc_do_uncompression(struct sk_buff *skb, 121*4882a593Smuzhiyun const struct net_device *dev, 122*4882a593Smuzhiyun struct ipv6hdr *hdr); 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /** 125*4882a593Smuzhiyun * lowpan_nhc_add - register a next header compression to framework 126*4882a593Smuzhiyun * 127*4882a593Smuzhiyun * @nhc: nhc which should be add. 128*4882a593Smuzhiyun */ 129*4882a593Smuzhiyun int lowpan_nhc_add(struct lowpan_nhc *nhc); 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /** 132*4882a593Smuzhiyun * lowpan_nhc_del - delete a next header compression from framework 133*4882a593Smuzhiyun * 134*4882a593Smuzhiyun * @nhc: nhc which should be delete. 135*4882a593Smuzhiyun */ 136*4882a593Smuzhiyun void lowpan_nhc_del(struct lowpan_nhc *nhc); 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun /** 139*4882a593Smuzhiyun * lowpan_nhc_init - adding all default nhcs 140*4882a593Smuzhiyun */ 141*4882a593Smuzhiyun void lowpan_nhc_init(void); 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #endif /* __6LOWPAN_NHC_H */ 144