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