xref: /linux-6.15/include/linux/if_pppox.h (revision 17df341d)
12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /***************************************************************************
31da177e4SLinus Torvalds  * Linux PPP over X - Generic PPP transport layer sockets
41da177e4SLinus Torvalds  * Linux PPP over Ethernet (PPPoE) Socket Implementation (RFC 2516)
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  * This file supplies definitions required by the PPP over Ethernet driver
71da177e4SLinus Torvalds  * (pppox.c).  All version information wrt this file is located in pppox.c
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds #ifndef __LINUX_IF_PPPOX_H
101da177e4SLinus Torvalds #define __LINUX_IF_PPPOX_H
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds #include <linux/if.h>
131da177e4SLinus Torvalds #include <linux/netdevice.h>
141da177e4SLinus Torvalds #include <linux/ppp_channel.h>
15797659fbSArnaldo Carvalho de Melo #include <linux/skbuff.h>
16287f3a94SSimon Farnsworth #include <linux/workqueue.h>
17607ca46eSDavid Howells #include <uapi/linux/if_pppox.h>
18797659fbSArnaldo Carvalho de Melo 
pppoe_hdr(const struct sk_buff * skb)19797659fbSArnaldo Carvalho de Melo static inline struct pppoe_hdr *pppoe_hdr(const struct sk_buff *skb)
20797659fbSArnaldo Carvalho de Melo {
21d56f90a7SArnaldo Carvalho de Melo 	return (struct pppoe_hdr *)skb_network_header(skb);
22797659fbSArnaldo Carvalho de Melo }
23797659fbSArnaldo Carvalho de Melo 
241da177e4SLinus Torvalds struct pppoe_opt {
251da177e4SLinus Torvalds 	struct net_device      *dev;	  /* device associated with socket*/
266f30e186SFlorian Zumbiehl 	int			ifindex;  /* ifindex of device associated with socket */
271da177e4SLinus Torvalds 	struct pppoe_addr	pa;	  /* what this socket is bound to*/
281da177e4SLinus Torvalds 	struct sockaddr_pppox	relay;	  /* what socket data will be
291da177e4SLinus Torvalds 					     relayed to (PPPoE relaying) */
30287f3a94SSimon Farnsworth 	struct work_struct      padt_work;/* Work item for handling PADT */
311da177e4SLinus Torvalds };
321da177e4SLinus Torvalds 
3300959adeSDmitry Kozlov struct pptp_opt {
3400959adeSDmitry Kozlov 	struct pptp_addr src_addr;
3500959adeSDmitry Kozlov 	struct pptp_addr dst_addr;
3600959adeSDmitry Kozlov 	u32 ack_sent, ack_recv;
3700959adeSDmitry Kozlov 	u32 seq_sent, seq_recv;
3800959adeSDmitry Kozlov 	int ppp_flags;
3900959adeSDmitry Kozlov };
401da177e4SLinus Torvalds #include <net/sock.h>
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds struct pppox_sock {
431da177e4SLinus Torvalds 	/* struct sock must be the first member of pppox_sock */
441da177e4SLinus Torvalds 	struct sock sk;
451da177e4SLinus Torvalds 	struct ppp_channel chan;
461da177e4SLinus Torvalds 	struct pppox_sock	*next;	  /* for hash table */
471da177e4SLinus Torvalds 	union {
481da177e4SLinus Torvalds 		struct pppoe_opt pppoe;
4900959adeSDmitry Kozlov 		struct pptp_opt  pptp;
501da177e4SLinus Torvalds 	} proto;
51b963dc1dSAl Viro 	__be16			num;
521da177e4SLinus Torvalds };
531da177e4SLinus Torvalds #define pppoe_dev	proto.pppoe.dev
546f30e186SFlorian Zumbiehl #define pppoe_ifindex	proto.pppoe.ifindex
551da177e4SLinus Torvalds #define pppoe_pa	proto.pppoe.pa
561da177e4SLinus Torvalds #define pppoe_relay	proto.pppoe.relay
571da177e4SLinus Torvalds 
pppox_sk(struct sock * sk)581da177e4SLinus Torvalds static inline struct pppox_sock *pppox_sk(struct sock *sk)
591da177e4SLinus Torvalds {
601da177e4SLinus Torvalds 	return (struct pppox_sock *)sk;
611da177e4SLinus Torvalds }
621da177e4SLinus Torvalds 
sk_pppox(struct pppox_sock * po)631da177e4SLinus Torvalds static inline struct sock *sk_pppox(struct pppox_sock *po)
641da177e4SLinus Torvalds {
651da177e4SLinus Torvalds 	return (struct sock *)po;
661da177e4SLinus Torvalds }
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds struct module;
691da177e4SLinus Torvalds 
701da177e4SLinus Torvalds struct pppox_proto {
7111aa9c28SEric W. Biederman 	int		(*create)(struct net *net, struct socket *sock, int kern);
721da177e4SLinus Torvalds 	int		(*ioctl)(struct socket *sock, unsigned int cmd,
731da177e4SLinus Torvalds 				 unsigned long arg);
741da177e4SLinus Torvalds 	struct module	*owner;
751da177e4SLinus Torvalds };
761da177e4SLinus Torvalds 
77756e64a0SEric Dumazet extern int register_pppox_proto(int proto_num, const struct pppox_proto *pp);
781da177e4SLinus Torvalds extern void unregister_pppox_proto(int proto_num);
791da177e4SLinus Torvalds extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */
8017ba15fbSDavid S. Miller extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
81*055d8824SArnd Bergmann extern int pppox_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
82*055d8824SArnd Bergmann 
83*055d8824SArnd Bergmann #define PPPOEIOCSFWD32    _IOW(0xB1 ,0, compat_size_t)
841da177e4SLinus Torvalds 
851da177e4SLinus Torvalds /* PPPoX socket states */
861da177e4SLinus Torvalds enum {
871da177e4SLinus Torvalds     PPPOX_NONE		= 0,  /* initial state */
881da177e4SLinus Torvalds     PPPOX_CONNECTED	= 1,  /* connection established ==TCP_ESTABLISHED */
891da177e4SLinus Torvalds     PPPOX_BOUND		= 2,  /* bound to ppp device */
901da177e4SLinus Torvalds     PPPOX_RELAY		= 4,  /* forwarding is enabled */
911da177e4SLinus Torvalds     PPPOX_DEAD		= 16  /* dead, useless, please clean me up!*/
921da177e4SLinus Torvalds };
931da177e4SLinus Torvalds 
941da177e4SLinus Torvalds #endif /* !(__LINUX_IF_PPPOX_H) */
95