xref: /linux-6.15/include/net/inet_common.h (revision 92ef0fd5)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _INET_COMMON_H
31da177e4SLinus Torvalds #define _INET_COMMON_H
41da177e4SLinus Torvalds 
5aaa5d90bSPaolo Abeni #include <linux/indirect_call_wrapper.h>
6949d6b40SJakub Kicinski #include <linux/net.h>
7949d6b40SJakub Kicinski #include <linux/netdev_features.h>
8949d6b40SJakub Kicinski #include <linux/types.h>
9949d6b40SJakub Kicinski #include <net/sock.h>
10aaa5d90bSPaolo Abeni 
1190ddc4f0SEric Dumazet extern const struct proto_ops inet_stream_ops;
1290ddc4f0SEric Dumazet extern const struct proto_ops inet_dgram_ops;
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds /*
151da177e4SLinus Torvalds  *	INET4 prototypes used by INET6
161da177e4SLinus Torvalds  */
171da177e4SLinus Torvalds 
1877d8bf9cSArnaldo Carvalho de Melo struct msghdr;
19949d6b40SJakub Kicinski struct net;
20949d6b40SJakub Kicinski struct page;
2177d8bf9cSArnaldo Carvalho de Melo struct sock;
2277d8bf9cSArnaldo Carvalho de Melo struct sockaddr;
2377d8bf9cSArnaldo Carvalho de Melo struct socket;
2477d8bf9cSArnaldo Carvalho de Melo 
251fd51155SJoe Perches int inet_release(struct socket *sock);
261fd51155SJoe Perches int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
271da177e4SLinus Torvalds 			int addr_len, int flags);
281fd51155SJoe Perches int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
293979ad7eSWilly Tarreau 			  int addr_len, int flags, int is_sendmsg);
301fd51155SJoe Perches int inet_dgram_connect(struct socket *sock, struct sockaddr *uaddr,
311da177e4SLinus Torvalds 		       int addr_len, int flags);
32*92ef0fd5SJens Axboe int inet_accept(struct socket *sock, struct socket *newsock,
33*92ef0fd5SJens Axboe 		struct proto_accept_arg *arg);
34711bdd51SPaolo Abeni void __inet_accept(struct socket *sock, struct socket *newsock,
35711bdd51SPaolo Abeni 		   struct sock *newsk);
36e4730936SPaolo Abeni int inet_send_prepare(struct sock *sk);
371b784140SYing Xue int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size);
381d7e4538SDavid Howells void inet_splice_eof(struct socket *sock);
391b784140SYing Xue int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
401b784140SYing Xue 		 int flags);
411fd51155SJoe Perches int inet_shutdown(struct socket *sock, int how);
421fd51155SJoe Perches int inet_listen(struct socket *sock, int backlog);
4371a9a874SPaolo Abeni int __inet_listen_sk(struct sock *sk, int backlog);
441fd51155SJoe Perches void inet_sock_destruct(struct sock *sk);
451fd51155SJoe Perches int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
46e6d360ffSPaolo Abeni int inet_bind_sk(struct sock *sk, struct sockaddr *uaddr, int addr_len);
47cb0721c7SStanislav Fomichev /* Don't allocate port at this moment, defer to connect. */
48cb0721c7SStanislav Fomichev #define BIND_FORCE_ADDRESS_NO_PORT	(1 << 0)
49cb0721c7SStanislav Fomichev /* Grab and release socket lock. */
50cb0721c7SStanislav Fomichev #define BIND_WITH_LOCK			(1 << 1)
518086fbafSStanislav Fomichev /* Called from BPF program. */
528086fbafSStanislav Fomichev #define BIND_FROM_BPF			(1 << 2)
5377241217SStanislav Fomichev /* Skip CAP_NET_BIND_SERVICE check. */
5477241217SStanislav Fomichev #define BIND_NO_CAP_NET_BIND_SERVICE	(1 << 3)
553679d585SAndrey Ignatov int __inet_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
56cb0721c7SStanislav Fomichev 		u32 flags);
579b2c45d4SDenys Vlasenko int inet_getname(struct socket *sock, struct sockaddr *uaddr,
581fd51155SJoe Perches 		 int peer);
591fd51155SJoe Perches int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
601fd51155SJoe Perches int inet_ctl_sock_create(struct sock **sk, unsigned short family,
6153d3176bSChangli Gao 			 unsigned short type, unsigned char protocol,
625677242fSDenis V. Lunev 			 struct net *net);
63f4713a3dSWillem de Bruijn int inet_recv_error(struct sock *sk, struct msghdr *msg, int len,
64f4713a3dSWillem de Bruijn 		    int *addr_len);
655677242fSDenis V. Lunev 
66d4546c25SDavid Miller struct sk_buff *inet_gro_receive(struct list_head *head, struct sk_buff *skb);
67b8921ca8STom Herbert int inet_gro_complete(struct sk_buff *skb, int nhoff);
68b8921ca8STom Herbert struct sk_buff *inet_gso_segment(struct sk_buff *skb,
69b8921ca8STom Herbert 				 netdev_features_t features);
70b8921ca8STom Herbert 
inet_ctl_sock_destroy(struct sock * sk)715677242fSDenis V. Lunev static inline void inet_ctl_sock_destroy(struct sock *sk)
725677242fSDenis V. Lunev {
738fa677d2SEric Dumazet 	if (sk)
7426abe143SEric W. Biederman 		sock_release(sk->sk_socket);
755677242fSDenis V. Lunev }
763d58b5faSDenis V. Lunev 
77028e0a47SPaolo Abeni #define indirect_call_gro_receive(f2, f1, cb, head, skb)	\
78028e0a47SPaolo Abeni ({								\
79028e0a47SPaolo Abeni 	unlikely(gro_recursion_inc_test(skb)) ?			\
80028e0a47SPaolo Abeni 		NAPI_GRO_CB(skb)->flush |= 1, NULL :		\
81028e0a47SPaolo Abeni 		INDIRECT_CALL_2(cb, f2, f1, head, skb);		\
82028e0a47SPaolo Abeni })
83028e0a47SPaolo Abeni 
841da177e4SLinus Torvalds #endif
85