|  | #ifndef __6LOWPAN_NHC_H | 
|  | #define __6LOWPAN_NHC_H | 
|  |  | 
|  | #include <linux/skbuff.h> | 
|  | #include <linux/rbtree.h> | 
|  | #include <linux/module.h> | 
|  |  | 
|  | #include <net/6lowpan.h> | 
|  | #include <net/ipv6.h> | 
|  |  | 
|  | /** | 
|  | * LOWPAN_NHC - helper macro to generate nh id fields and lowpan_nhc struct | 
|  | * | 
|  | * @__nhc: variable name of the lowpan_nhc struct. | 
|  | * @_name: const char * of common header compression name. | 
|  | * @_nexthdr: ipv6 nexthdr field for the header compression. | 
|  | * @_nexthdrlen: ipv6 nexthdr len for the reserved space. | 
|  | * @_idsetup: callback to setup id and mask values. | 
|  | * @_idlen: len for the next header id and mask, should be always the same. | 
|  | * @_uncompress: callback for uncompression call. | 
|  | * @_compress: callback for compression call. | 
|  | */ | 
|  | #define LOWPAN_NHC(__nhc, _name, _nexthdr,	\ | 
|  | _hdrlen, _idsetup, _idlen,	\ | 
|  | _uncompress, _compress)	\ | 
|  | static u8 __nhc##_val[_idlen];			\ | 
|  | static u8 __nhc##_mask[_idlen];			\ | 
|  | static struct lowpan_nhc __nhc = {		\ | 
|  | .name		= _name,		\ | 
|  | .nexthdr	= _nexthdr,		\ | 
|  | .nexthdrlen	= _hdrlen,		\ | 
|  | .id		= __nhc##_val,		\ | 
|  | .idmask		= __nhc##_mask,		\ | 
|  | .idlen		= _idlen,		\ | 
|  | .idsetup	= _idsetup,		\ | 
|  | .uncompress	= _uncompress,		\ | 
|  | .compress	= _compress,		\ | 
|  | } | 
|  |  | 
|  | #define module_lowpan_nhc(__nhc)		\ | 
|  | static int __init __nhc##_init(void)		\ | 
|  | {						\ | 
|  | return lowpan_nhc_add(&(__nhc));	\ | 
|  | }						\ | 
|  | module_init(__nhc##_init);			\ | 
|  | static void __exit __nhc##_exit(void)		\ | 
|  | {						\ | 
|  | lowpan_nhc_del(&(__nhc));		\ | 
|  | }						\ | 
|  | module_exit(__nhc##_exit); | 
|  |  | 
|  | /** | 
|  | * struct lowpan_nhc - hold 6lowpan next hdr compression ifnformation | 
|  | * | 
|  | * @node: holder for the rbtree. | 
|  | * @name: name of the specific next header compression | 
|  | * @nexthdr: next header value of the protocol which should be compressed. | 
|  | * @nexthdrlen: ipv6 nexthdr len for the reserved space. | 
|  | * @id: array for nhc id. Note this need to be in network byteorder. | 
|  | * @mask: array for nhc id mask. Note this need to be in network byteorder. | 
|  | * @len: the length of the next header id and mask. | 
|  | * @setup: callback to setup fill the next header id value and mask. | 
|  | * @compress: callback to do the header compression. | 
|  | * @uncompress: callback to do the header uncompression. | 
|  | */ | 
|  | struct lowpan_nhc { | 
|  | struct rb_node	node; | 
|  | const char	*name; | 
|  | const u8	nexthdr; | 
|  | const size_t	nexthdrlen; | 
|  | u8		*id; | 
|  | u8		*idmask; | 
|  | const size_t	idlen; | 
|  |  | 
|  | void		(*idsetup)(struct lowpan_nhc *nhc); | 
|  | int		(*uncompress)(struct sk_buff *skb, size_t needed); | 
|  | int		(*compress)(struct sk_buff *skb, u8 **hc_ptr); | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * lowpan_nhc_by_nexthdr - return the 6lowpan nhc by ipv6 nexthdr. | 
|  | * | 
|  | * @nexthdr: ipv6 nexthdr value. | 
|  | */ | 
|  | struct lowpan_nhc *lowpan_nhc_by_nexthdr(u8 nexthdr); | 
|  |  | 
|  | /** | 
|  | * lowpan_nhc_check_compression - checks if we support compression format. If | 
|  | *	we support the nhc by nexthdr field, the function will return 0. If we | 
|  | *	don't support the nhc by nexthdr this function will return -ENOENT. | 
|  | * | 
|  | * @skb: skb of 6LoWPAN header to read nhc and replace header. | 
|  | * @hdr: ipv6hdr to check the nexthdr value | 
|  | * @hc_ptr: pointer for 6LoWPAN header which should increment at the end of | 
|  | *	    replaced header. | 
|  | */ | 
|  | int lowpan_nhc_check_compression(struct sk_buff *skb, | 
|  | const struct ipv6hdr *hdr, u8 **hc_ptr); | 
|  |  | 
|  | /** | 
|  | * lowpan_nhc_do_compression - calling compress callback for nhc | 
|  | * | 
|  | * @skb: skb of 6LoWPAN header to read nhc and replace header. | 
|  | * @hdr: ipv6hdr to set the nexthdr value | 
|  | * @hc_ptr: pointer for 6LoWPAN header which should increment at the end of | 
|  | *	    replaced header. | 
|  | */ | 
|  | int lowpan_nhc_do_compression(struct sk_buff *skb, const struct ipv6hdr *hdr, | 
|  | u8 **hc_ptr); | 
|  |  | 
|  | /** | 
|  | * lowpan_nhc_do_uncompression - calling uncompress callback for nhc | 
|  | * | 
|  | * @nhc: 6LoWPAN nhc context, get by lowpan_nhc_by_ functions. | 
|  | * @skb: skb of 6LoWPAN header, skb->data should be pointed to nhc id value. | 
|  | * @dev: netdevice for print logging information. | 
|  | * @hdr: ipv6hdr for setting nexthdr value. | 
|  | */ | 
|  | int lowpan_nhc_do_uncompression(struct sk_buff *skb, | 
|  | const struct net_device *dev, | 
|  | struct ipv6hdr *hdr); | 
|  |  | 
|  | /** | 
|  | * lowpan_nhc_add - register a next header compression to framework | 
|  | * | 
|  | * @nhc: nhc which should be add. | 
|  | */ | 
|  | int lowpan_nhc_add(struct lowpan_nhc *nhc); | 
|  |  | 
|  | /** | 
|  | * lowpan_nhc_del - delete a next header compression from framework | 
|  | * | 
|  | * @nhc: nhc which should be delete. | 
|  | */ | 
|  | void lowpan_nhc_del(struct lowpan_nhc *nhc); | 
|  |  | 
|  | /** | 
|  | * lowpan_nhc_init - adding all default nhcs | 
|  | */ | 
|  | void lowpan_nhc_init(void); | 
|  |  | 
|  | #endif /* __6LOWPAN_NHC_H */ |