xref: /openbmc/linux/include/net/mld.h (revision 89225d1ce6af3916bf32aecbe9d83f571a098588)
16e7cb837SYOSHIFUJI Hideaki #ifndef LINUX_MLD_H
26e7cb837SYOSHIFUJI Hideaki #define LINUX_MLD_H
36e7cb837SYOSHIFUJI Hideaki 
46e7cb837SYOSHIFUJI Hideaki #include <linux/in6.h>
56e7cb837SYOSHIFUJI Hideaki #include <linux/icmpv6.h>
66e7cb837SYOSHIFUJI Hideaki 
76e7cb837SYOSHIFUJI Hideaki /* MLDv1 Query/Report/Done */
86e7cb837SYOSHIFUJI Hideaki struct mld_msg {
96e7cb837SYOSHIFUJI Hideaki 	struct icmp6hdr		mld_hdr;
106e7cb837SYOSHIFUJI Hideaki 	struct in6_addr		mld_mca;
116e7cb837SYOSHIFUJI Hideaki };
126e7cb837SYOSHIFUJI Hideaki 
136e7cb837SYOSHIFUJI Hideaki #define mld_type		mld_hdr.icmp6_type
146e7cb837SYOSHIFUJI Hideaki #define mld_code		mld_hdr.icmp6_code
156e7cb837SYOSHIFUJI Hideaki #define mld_cksum		mld_hdr.icmp6_cksum
166e7cb837SYOSHIFUJI Hideaki #define mld_maxdelay		mld_hdr.icmp6_maxdelay
176e7cb837SYOSHIFUJI Hideaki #define mld_reserved		mld_hdr.icmp6_dataun.un_data16[1]
186e7cb837SYOSHIFUJI Hideaki 
196e7cb837SYOSHIFUJI Hideaki /* Multicast Listener Discovery version 2 headers */
206e7cb837SYOSHIFUJI Hideaki /* MLDv2 Report */
216e7cb837SYOSHIFUJI Hideaki struct mld2_grec {
226e7cb837SYOSHIFUJI Hideaki 	__u8		grec_type;
236e7cb837SYOSHIFUJI Hideaki 	__u8		grec_auxwords;
246e7cb837SYOSHIFUJI Hideaki 	__be16		grec_nsrcs;
256e7cb837SYOSHIFUJI Hideaki 	struct in6_addr	grec_mca;
266e7cb837SYOSHIFUJI Hideaki 	struct in6_addr	grec_src[0];
276e7cb837SYOSHIFUJI Hideaki };
286e7cb837SYOSHIFUJI Hideaki 
296e7cb837SYOSHIFUJI Hideaki struct mld2_report {
306e7cb837SYOSHIFUJI Hideaki 	struct icmp6hdr		mld2r_hdr;
316e7cb837SYOSHIFUJI Hideaki 	struct mld2_grec	mld2r_grec[0];
326e7cb837SYOSHIFUJI Hideaki };
336e7cb837SYOSHIFUJI Hideaki 
346e7cb837SYOSHIFUJI Hideaki #define mld2r_type		mld2r_hdr.icmp6_type
356e7cb837SYOSHIFUJI Hideaki #define mld2r_resv1		mld2r_hdr.icmp6_code
366e7cb837SYOSHIFUJI Hideaki #define mld2r_cksum		mld2r_hdr.icmp6_cksum
376e7cb837SYOSHIFUJI Hideaki #define mld2r_resv2		mld2r_hdr.icmp6_dataun.un_data16[0]
386e7cb837SYOSHIFUJI Hideaki #define mld2r_ngrec		mld2r_hdr.icmp6_dataun.un_data16[1]
396e7cb837SYOSHIFUJI Hideaki 
406e7cb837SYOSHIFUJI Hideaki /* MLDv2 Query */
416e7cb837SYOSHIFUJI Hideaki struct mld2_query {
426e7cb837SYOSHIFUJI Hideaki 	struct icmp6hdr		mld2q_hdr;
436e7cb837SYOSHIFUJI Hideaki 	struct in6_addr		mld2q_mca;
446e7cb837SYOSHIFUJI Hideaki #if defined(__LITTLE_ENDIAN_BITFIELD)
456e7cb837SYOSHIFUJI Hideaki 	__u8			mld2q_qrv:3,
466e7cb837SYOSHIFUJI Hideaki 				mld2q_suppress:1,
476e7cb837SYOSHIFUJI Hideaki 				mld2q_resv2:4;
486e7cb837SYOSHIFUJI Hideaki #elif defined(__BIG_ENDIAN_BITFIELD)
496e7cb837SYOSHIFUJI Hideaki 	__u8			mld2q_resv2:4,
506e7cb837SYOSHIFUJI Hideaki 				mld2q_suppress:1,
516e7cb837SYOSHIFUJI Hideaki 				mld2q_qrv:3;
526e7cb837SYOSHIFUJI Hideaki #else
536e7cb837SYOSHIFUJI Hideaki #error "Please fix <asm/byteorder.h>"
546e7cb837SYOSHIFUJI Hideaki #endif
556e7cb837SYOSHIFUJI Hideaki 	__u8			mld2q_qqic;
566e7cb837SYOSHIFUJI Hideaki 	__be16			mld2q_nsrcs;
576e7cb837SYOSHIFUJI Hideaki 	struct in6_addr		mld2q_srcs[0];
586e7cb837SYOSHIFUJI Hideaki };
596e7cb837SYOSHIFUJI Hideaki 
606e7cb837SYOSHIFUJI Hideaki #define mld2q_type		mld2q_hdr.icmp6_type
616e7cb837SYOSHIFUJI Hideaki #define mld2q_code		mld2q_hdr.icmp6_code
626e7cb837SYOSHIFUJI Hideaki #define mld2q_cksum		mld2q_hdr.icmp6_cksum
636e7cb837SYOSHIFUJI Hideaki #define mld2q_mrc		mld2q_hdr.icmp6_maxdelay
646e7cb837SYOSHIFUJI Hideaki #define mld2q_resv1		mld2q_hdr.icmp6_dataun.un_data16[1]
656e7cb837SYOSHIFUJI Hideaki 
66*89225d1cSDaniel Borkmann /* Max Response Code, TODO: transform this to use the below */
676e7cb837SYOSHIFUJI Hideaki #define MLDV2_MASK(value, nb) ((nb)>=32 ? (value) : ((1<<(nb))-1) & (value))
686e7cb837SYOSHIFUJI Hideaki #define MLDV2_EXP(thresh, nbmant, nbexp, value) \
696e7cb837SYOSHIFUJI Hideaki 	((value) < (thresh) ? (value) : \
706e7cb837SYOSHIFUJI Hideaki 	((MLDV2_MASK(value, nbmant) | (1<<(nbmant))) << \
716e7cb837SYOSHIFUJI Hideaki 	(MLDV2_MASK((value) >> (nbmant), nbexp) + (nbexp))))
726e7cb837SYOSHIFUJI Hideaki 
736e7cb837SYOSHIFUJI Hideaki #define MLDV2_MRC(value) MLDV2_EXP(0x8000, 12, 3, value)
746e7cb837SYOSHIFUJI Hideaki 
75*89225d1cSDaniel Borkmann /* RFC3810, 5.1.3. Maximum Response Code:
76*89225d1cSDaniel Borkmann  *
77*89225d1cSDaniel Borkmann  * If Maximum Response Code >= 32768, Maximum Response Code represents a
78*89225d1cSDaniel Borkmann  * floating-point value as follows:
79*89225d1cSDaniel Borkmann  *
80*89225d1cSDaniel Borkmann  *  0 1 2 3 4 5 6 7 8 9 A B C D E F
81*89225d1cSDaniel Borkmann  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
82*89225d1cSDaniel Borkmann  * |1| exp |          mant         |
83*89225d1cSDaniel Borkmann  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
84*89225d1cSDaniel Borkmann  */
85*89225d1cSDaniel Borkmann #define MLDV2_MRC_EXP(value)	(((value) >> 12) & 0x0007)
86*89225d1cSDaniel Borkmann #define MLDV2_MRC_MAN(value)	((value) & 0x0fff)
87*89225d1cSDaniel Borkmann 
88*89225d1cSDaniel Borkmann /* RFC3810, 5.1.9. QQIC (Querier's Query Interval Code):
89*89225d1cSDaniel Borkmann  *
90*89225d1cSDaniel Borkmann  * If QQIC >= 128, QQIC represents a floating-point value as follows:
91*89225d1cSDaniel Borkmann  *
92*89225d1cSDaniel Borkmann  *  0 1 2 3 4 5 6 7
93*89225d1cSDaniel Borkmann  * +-+-+-+-+-+-+-+-+
94*89225d1cSDaniel Borkmann  * |1| exp | mant  |
95*89225d1cSDaniel Borkmann  * +-+-+-+-+-+-+-+-+
96*89225d1cSDaniel Borkmann  */
97*89225d1cSDaniel Borkmann #define MLDV2_QQIC_EXP(value)	(((value) >> 4) & 0x07)
98*89225d1cSDaniel Borkmann #define MLDV2_QQIC_MAN(value)	((value) & 0x0f)
99*89225d1cSDaniel Borkmann 
1006e7cb837SYOSHIFUJI Hideaki #endif
101