162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef NET_COMPAT_H
362306a36Sopenharmony_ci#define NET_COMPAT_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci
662306a36Sopenharmony_cistruct sock;
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/compat.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct compat_msghdr {
1162306a36Sopenharmony_ci	compat_uptr_t	msg_name;	/* void * */
1262306a36Sopenharmony_ci	compat_int_t	msg_namelen;
1362306a36Sopenharmony_ci	compat_uptr_t	msg_iov;	/* struct compat_iovec * */
1462306a36Sopenharmony_ci	compat_size_t	msg_iovlen;
1562306a36Sopenharmony_ci	compat_uptr_t	msg_control;	/* void * */
1662306a36Sopenharmony_ci	compat_size_t	msg_controllen;
1762306a36Sopenharmony_ci	compat_uint_t	msg_flags;
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct compat_mmsghdr {
2162306a36Sopenharmony_ci	struct compat_msghdr msg_hdr;
2262306a36Sopenharmony_ci	compat_uint_t        msg_len;
2362306a36Sopenharmony_ci};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct compat_cmsghdr {
2662306a36Sopenharmony_ci	compat_size_t	cmsg_len;
2762306a36Sopenharmony_ci	compat_int_t	cmsg_level;
2862306a36Sopenharmony_ci	compat_int_t	cmsg_type;
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistruct compat_rtentry {
3262306a36Sopenharmony_ci	u32		rt_pad1;
3362306a36Sopenharmony_ci	struct sockaddr rt_dst;         /* target address               */
3462306a36Sopenharmony_ci	struct sockaddr rt_gateway;     /* gateway addr (RTF_GATEWAY)   */
3562306a36Sopenharmony_ci	struct sockaddr rt_genmask;     /* target network mask (IP)     */
3662306a36Sopenharmony_ci	unsigned short	rt_flags;
3762306a36Sopenharmony_ci	short		rt_pad2;
3862306a36Sopenharmony_ci	u32		rt_pad3;
3962306a36Sopenharmony_ci	unsigned char	rt_tos;
4062306a36Sopenharmony_ci	unsigned char	rt_class;
4162306a36Sopenharmony_ci	short		rt_pad4;
4262306a36Sopenharmony_ci	short		rt_metric;      /* +1 for binary compatibility! */
4362306a36Sopenharmony_ci	compat_uptr_t	rt_dev;         /* forcing the device at add    */
4462306a36Sopenharmony_ci	u32		rt_mtu;         /* per route MTU/Window         */
4562306a36Sopenharmony_ci	u32		rt_window;      /* Window clamping              */
4662306a36Sopenharmony_ci	unsigned short  rt_irtt;        /* Initial RTT                  */
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciint __get_compat_msghdr(struct msghdr *kmsg, struct compat_msghdr *msg,
5062306a36Sopenharmony_ci			struct sockaddr __user **save_addr);
5162306a36Sopenharmony_ciint get_compat_msghdr(struct msghdr *, struct compat_msghdr __user *,
5262306a36Sopenharmony_ci		      struct sockaddr __user **, struct iovec **);
5362306a36Sopenharmony_ciint put_cmsg_compat(struct msghdr*, int, int, int, void *);
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciint cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *,
5662306a36Sopenharmony_ci				     unsigned char *, int);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistruct compat_group_req {
5962306a36Sopenharmony_ci	__u32				 gr_interface;
6062306a36Sopenharmony_ci	struct __kernel_sockaddr_storage gr_group
6162306a36Sopenharmony_ci		__aligned(4);
6262306a36Sopenharmony_ci} __packed;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct compat_group_source_req {
6562306a36Sopenharmony_ci	__u32				 gsr_interface;
6662306a36Sopenharmony_ci	struct __kernel_sockaddr_storage gsr_group
6762306a36Sopenharmony_ci		__aligned(4);
6862306a36Sopenharmony_ci	struct __kernel_sockaddr_storage gsr_source
6962306a36Sopenharmony_ci		__aligned(4);
7062306a36Sopenharmony_ci} __packed;
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistruct compat_group_filter {
7362306a36Sopenharmony_ci	union {
7462306a36Sopenharmony_ci		struct {
7562306a36Sopenharmony_ci			__u32				 gf_interface_aux;
7662306a36Sopenharmony_ci			struct __kernel_sockaddr_storage gf_group_aux
7762306a36Sopenharmony_ci				__aligned(4);
7862306a36Sopenharmony_ci			__u32				 gf_fmode_aux;
7962306a36Sopenharmony_ci			__u32				 gf_numsrc_aux;
8062306a36Sopenharmony_ci			struct __kernel_sockaddr_storage gf_slist[1]
8162306a36Sopenharmony_ci				__aligned(4);
8262306a36Sopenharmony_ci		} __packed;
8362306a36Sopenharmony_ci		struct {
8462306a36Sopenharmony_ci			__u32				 gf_interface;
8562306a36Sopenharmony_ci			struct __kernel_sockaddr_storage gf_group
8662306a36Sopenharmony_ci				__aligned(4);
8762306a36Sopenharmony_ci			__u32				 gf_fmode;
8862306a36Sopenharmony_ci			__u32				 gf_numsrc;
8962306a36Sopenharmony_ci			struct __kernel_sockaddr_storage gf_slist_flex[]
9062306a36Sopenharmony_ci				__aligned(4);
9162306a36Sopenharmony_ci		} __packed;
9262306a36Sopenharmony_ci	};
9362306a36Sopenharmony_ci} __packed;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci#endif /* NET_COMPAT_H */
96