xref: /OK3568_Linux_fs/kernel/include/net/compat.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef NET_COMPAT_H
3*4882a593Smuzhiyun #define NET_COMPAT_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun struct sock;
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #if defined(CONFIG_COMPAT)
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/compat.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun struct compat_msghdr {
13*4882a593Smuzhiyun 	compat_uptr_t	msg_name;	/* void * */
14*4882a593Smuzhiyun 	compat_int_t	msg_namelen;
15*4882a593Smuzhiyun 	compat_uptr_t	msg_iov;	/* struct compat_iovec * */
16*4882a593Smuzhiyun 	compat_size_t	msg_iovlen;
17*4882a593Smuzhiyun 	compat_uptr_t	msg_control;	/* void * */
18*4882a593Smuzhiyun 	compat_size_t	msg_controllen;
19*4882a593Smuzhiyun 	compat_uint_t	msg_flags;
20*4882a593Smuzhiyun };
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun struct compat_mmsghdr {
23*4882a593Smuzhiyun 	struct compat_msghdr msg_hdr;
24*4882a593Smuzhiyun 	compat_uint_t        msg_len;
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun struct compat_cmsghdr {
28*4882a593Smuzhiyun 	compat_size_t	cmsg_len;
29*4882a593Smuzhiyun 	compat_int_t	cmsg_level;
30*4882a593Smuzhiyun 	compat_int_t	cmsg_type;
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun struct compat_rtentry {
34*4882a593Smuzhiyun 	u32		rt_pad1;
35*4882a593Smuzhiyun 	struct sockaddr rt_dst;         /* target address               */
36*4882a593Smuzhiyun 	struct sockaddr rt_gateway;     /* gateway addr (RTF_GATEWAY)   */
37*4882a593Smuzhiyun 	struct sockaddr rt_genmask;     /* target network mask (IP)     */
38*4882a593Smuzhiyun 	unsigned short	rt_flags;
39*4882a593Smuzhiyun 	short		rt_pad2;
40*4882a593Smuzhiyun 	u32		rt_pad3;
41*4882a593Smuzhiyun 	unsigned char	rt_tos;
42*4882a593Smuzhiyun 	unsigned char	rt_class;
43*4882a593Smuzhiyun 	short		rt_pad4;
44*4882a593Smuzhiyun 	short		rt_metric;      /* +1 for binary compatibility! */
45*4882a593Smuzhiyun 	compat_uptr_t	rt_dev;         /* forcing the device at add    */
46*4882a593Smuzhiyun 	u32		rt_mtu;         /* per route MTU/Window         */
47*4882a593Smuzhiyun 	u32		rt_window;      /* Window clamping              */
48*4882a593Smuzhiyun 	unsigned short  rt_irtt;        /* Initial RTT                  */
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #else /* defined(CONFIG_COMPAT) */
52*4882a593Smuzhiyun /*
53*4882a593Smuzhiyun  * To avoid compiler warnings:
54*4882a593Smuzhiyun  */
55*4882a593Smuzhiyun #define compat_msghdr	msghdr
56*4882a593Smuzhiyun #define compat_mmsghdr	mmsghdr
57*4882a593Smuzhiyun #endif /* defined(CONFIG_COMPAT) */
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun int __get_compat_msghdr(struct msghdr *kmsg, struct compat_msghdr __user *umsg,
60*4882a593Smuzhiyun 			struct sockaddr __user **save_addr, compat_uptr_t *ptr,
61*4882a593Smuzhiyun 			compat_size_t *len);
62*4882a593Smuzhiyun int get_compat_msghdr(struct msghdr *, struct compat_msghdr __user *,
63*4882a593Smuzhiyun 		      struct sockaddr __user **, struct iovec **);
64*4882a593Smuzhiyun int put_cmsg_compat(struct msghdr*, int, int, int, void *);
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *,
67*4882a593Smuzhiyun 				     unsigned char *, int);
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun struct compat_group_req {
70*4882a593Smuzhiyun 	__u32				 gr_interface;
71*4882a593Smuzhiyun 	struct __kernel_sockaddr_storage gr_group
72*4882a593Smuzhiyun 		__aligned(4);
73*4882a593Smuzhiyun } __packed;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun struct compat_group_source_req {
76*4882a593Smuzhiyun 	__u32				 gsr_interface;
77*4882a593Smuzhiyun 	struct __kernel_sockaddr_storage gsr_group
78*4882a593Smuzhiyun 		__aligned(4);
79*4882a593Smuzhiyun 	struct __kernel_sockaddr_storage gsr_source
80*4882a593Smuzhiyun 		__aligned(4);
81*4882a593Smuzhiyun } __packed;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun struct compat_group_filter {
84*4882a593Smuzhiyun 	__u32				 gf_interface;
85*4882a593Smuzhiyun 	struct __kernel_sockaddr_storage gf_group
86*4882a593Smuzhiyun 		__aligned(4);
87*4882a593Smuzhiyun 	__u32				 gf_fmode;
88*4882a593Smuzhiyun 	__u32				 gf_numsrc;
89*4882a593Smuzhiyun 	struct __kernel_sockaddr_storage gf_slist[1]
90*4882a593Smuzhiyun 		__aligned(4);
91*4882a593Smuzhiyun } __packed;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun #endif /* NET_COMPAT_H */
94