162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/*************************************************************************** 362306a36Sopenharmony_ci * Linux PPP over X - Generic PPP transport layer sockets 462306a36Sopenharmony_ci * Linux PPP over Ethernet (PPPoE) Socket Implementation (RFC 2516) 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * This file supplies definitions required by the PPP over Ethernet driver 762306a36Sopenharmony_ci * (pppox.c). All version information wrt this file is located in pppox.c 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#ifndef __LINUX_IF_PPPOX_H 1062306a36Sopenharmony_ci#define __LINUX_IF_PPPOX_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/if.h> 1362306a36Sopenharmony_ci#include <linux/netdevice.h> 1462306a36Sopenharmony_ci#include <linux/ppp_channel.h> 1562306a36Sopenharmony_ci#include <linux/skbuff.h> 1662306a36Sopenharmony_ci#include <linux/workqueue.h> 1762306a36Sopenharmony_ci#include <uapi/linux/if_pppox.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic inline struct pppoe_hdr *pppoe_hdr(const struct sk_buff *skb) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci return (struct pppoe_hdr *)skb_network_header(skb); 2262306a36Sopenharmony_ci} 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistruct pppoe_opt { 2562306a36Sopenharmony_ci struct net_device *dev; /* device associated with socket*/ 2662306a36Sopenharmony_ci int ifindex; /* ifindex of device associated with socket */ 2762306a36Sopenharmony_ci struct pppoe_addr pa; /* what this socket is bound to*/ 2862306a36Sopenharmony_ci struct sockaddr_pppox relay; /* what socket data will be 2962306a36Sopenharmony_ci relayed to (PPPoE relaying) */ 3062306a36Sopenharmony_ci struct work_struct padt_work;/* Work item for handling PADT */ 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistruct pptp_opt { 3462306a36Sopenharmony_ci struct pptp_addr src_addr; 3562306a36Sopenharmony_ci struct pptp_addr dst_addr; 3662306a36Sopenharmony_ci u32 ack_sent, ack_recv; 3762306a36Sopenharmony_ci u32 seq_sent, seq_recv; 3862306a36Sopenharmony_ci int ppp_flags; 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci#include <net/sock.h> 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistruct pppox_sock { 4362306a36Sopenharmony_ci /* struct sock must be the first member of pppox_sock */ 4462306a36Sopenharmony_ci struct sock sk; 4562306a36Sopenharmony_ci struct ppp_channel chan; 4662306a36Sopenharmony_ci struct pppox_sock *next; /* for hash table */ 4762306a36Sopenharmony_ci union { 4862306a36Sopenharmony_ci struct pppoe_opt pppoe; 4962306a36Sopenharmony_ci struct pptp_opt pptp; 5062306a36Sopenharmony_ci } proto; 5162306a36Sopenharmony_ci __be16 num; 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci#define pppoe_dev proto.pppoe.dev 5462306a36Sopenharmony_ci#define pppoe_ifindex proto.pppoe.ifindex 5562306a36Sopenharmony_ci#define pppoe_pa proto.pppoe.pa 5662306a36Sopenharmony_ci#define pppoe_relay proto.pppoe.relay 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic inline struct pppox_sock *pppox_sk(struct sock *sk) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci return (struct pppox_sock *)sk; 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic inline struct sock *sk_pppox(struct pppox_sock *po) 6462306a36Sopenharmony_ci{ 6562306a36Sopenharmony_ci return (struct sock *)po; 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistruct module; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistruct pppox_proto { 7162306a36Sopenharmony_ci int (*create)(struct net *net, struct socket *sock, int kern); 7262306a36Sopenharmony_ci int (*ioctl)(struct socket *sock, unsigned int cmd, 7362306a36Sopenharmony_ci unsigned long arg); 7462306a36Sopenharmony_ci struct module *owner; 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ciextern int register_pppox_proto(int proto_num, const struct pppox_proto *pp); 7862306a36Sopenharmony_ciextern void unregister_pppox_proto(int proto_num); 7962306a36Sopenharmony_ciextern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ 8062306a36Sopenharmony_ciextern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); 8162306a36Sopenharmony_ciextern int pppox_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define PPPOEIOCSFWD32 _IOW(0xB1 ,0, compat_size_t) 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/* PPPoX socket states */ 8662306a36Sopenharmony_cienum { 8762306a36Sopenharmony_ci PPPOX_NONE = 0, /* initial state */ 8862306a36Sopenharmony_ci PPPOX_CONNECTED = 1, /* connection established ==TCP_ESTABLISHED */ 8962306a36Sopenharmony_ci PPPOX_BOUND = 2, /* bound to ppp device */ 9062306a36Sopenharmony_ci PPPOX_RELAY = 4, /* forwarding is enabled */ 9162306a36Sopenharmony_ci PPPOX_DEAD = 16 /* dead, useless, please clean me up!*/ 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#endif /* !(__LINUX_IF_PPPOX_H) */ 95