xref: /freebsd/usr.sbin/ppp/mp.h (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
13b0f8d2eSBrian Somers /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
31de7b4b8SPedro F. Giffuni  *
43b0f8d2eSBrian Somers  * Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
53b0f8d2eSBrian Somers  * All rights reserved.
63b0f8d2eSBrian Somers  *
73b0f8d2eSBrian Somers  * Redistribution and use in source and binary forms, with or without
83b0f8d2eSBrian Somers  * modification, are permitted provided that the following conditions
93b0f8d2eSBrian Somers  * are met:
103b0f8d2eSBrian Somers  * 1. Redistributions of source code must retain the above copyright
113b0f8d2eSBrian Somers  *    notice, this list of conditions and the following disclaimer.
123b0f8d2eSBrian Somers  * 2. Redistributions in binary form must reproduce the above copyright
133b0f8d2eSBrian Somers  *    notice, this list of conditions and the following disclaimer in the
143b0f8d2eSBrian Somers  *    documentation and/or other materials provided with the distribution.
153b0f8d2eSBrian Somers  *
163b0f8d2eSBrian Somers  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
173b0f8d2eSBrian Somers  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
183b0f8d2eSBrian Somers  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
193b0f8d2eSBrian Somers  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
203b0f8d2eSBrian Somers  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
213b0f8d2eSBrian Somers  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
223b0f8d2eSBrian Somers  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
233b0f8d2eSBrian Somers  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
243b0f8d2eSBrian Somers  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
253b0f8d2eSBrian Somers  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
263b0f8d2eSBrian Somers  * SUCH DAMAGE.
273b0f8d2eSBrian Somers  */
283b0f8d2eSBrian Somers 
292764b86aSBrian Somers struct mbuf;
302764b86aSBrian Somers struct physical;
312764b86aSBrian Somers struct bundle;
322764b86aSBrian Somers struct cmdargs;
331fa665f5SBrian Somers struct datalink;
342764b86aSBrian Somers 
3508676022SBrian Somers #define ENDDISC_NULL	0
3608676022SBrian Somers #define ENDDISC_LOCAL	1
3708676022SBrian Somers #define ENDDISC_IP	2
3808676022SBrian Somers #define ENDDISC_MAC	3
3908676022SBrian Somers #define ENDDISC_MAGIC	4
4008676022SBrian Somers #define ENDDISC_PSN	5
4108676022SBrian Somers 
421fa665f5SBrian Somers #define MP_LINKSENT	0	/* We attached the link to another ppp */
431fa665f5SBrian Somers #define MP_UP		1	/* We've started MP */
441fa665f5SBrian Somers #define MP_ADDED	2	/* We've added the link to our MP */
451fa665f5SBrian Somers #define MP_FAILED	3	/* No go */
461fa665f5SBrian Somers 
4796c9bb21SBrian Somers #define MPSERVER_CONNECTED	0
4896c9bb21SBrian Somers #define MPSERVER_LISTENING	1
4996c9bb21SBrian Somers #define MPSERVER_FAILED		2
5096c9bb21SBrian Somers 
51643f4904SBrian Somers struct enddisc {
52643f4904SBrian Somers   u_char class;
53643f4904SBrian Somers   char address[50];
54643f4904SBrian Somers   int len;
55643f4904SBrian Somers };
56643f4904SBrian Somers 
57643f4904SBrian Somers struct peerid {
58643f4904SBrian Somers   struct enddisc enddisc;	/* Peers endpoint discriminator */
5982de8666SBrian Somers   char authname[AUTHLEN];	/* Peers name (authenticated) */
60643f4904SBrian Somers };
61643f4904SBrian Somers 
621fa665f5SBrian Somers struct mpserver {
63f013f33eSBrian Somers   struct fdescriptor desc;
6496c9bb21SBrian Somers   int fd;			/* listen()ing or connect()ing here */
656f384573SBrian Somers   struct sockaddr_un socket;	/* On this socket */
666f384573SBrian Somers 
676f384573SBrian Somers   struct {
6896c9bb21SBrian Somers     struct datalink *dl;	/* Send this datalink */
696f384573SBrian Somers   } send;			/* (in UpdateSet()) */
701fa665f5SBrian Somers };
71643f4904SBrian Somers 
723b0f8d2eSBrian Somers struct mp {
733b0f8d2eSBrian Somers   struct link link;
743b0f8d2eSBrian Somers 
753b0f8d2eSBrian Somers   unsigned active : 1;
7649052c95SBrian Somers   unsigned peer_is12bit : 1;	/* 12/24bit seq nos */
7749052c95SBrian Somers   unsigned local_is12bit : 1;
7849052c95SBrian Somers   u_short peer_mrru;
7949052c95SBrian Somers   u_short local_mrru;
8049052c95SBrian Somers 
81643f4904SBrian Somers   struct peerid peer;		/* Who are we talking to */
821fa665f5SBrian Somers   struct mpserver server;	/* Our ``sharing'' socket */
833b0f8d2eSBrian Somers 
843b0f8d2eSBrian Somers   struct {
859c53a7b1SBrian Somers     u_int32_t seq;		/* next outgoing seq */
869c53a7b1SBrian Somers     int link;			/* Next link to send on */
8730949fd4SBrian Somers     int af;			/* Next address family to send */
889c53a7b1SBrian Somers   } out;
899c53a7b1SBrian Somers 
909c53a7b1SBrian Somers   struct {
913b0f8d2eSBrian Somers     u_int32_t min_in;		/* minimum received incoming seq */
923b0f8d2eSBrian Somers     u_int32_t next_in;		/* next incoming seq to process */
933b0f8d2eSBrian Somers   } seq;
9449052c95SBrian Somers 
9549052c95SBrian Somers   struct {
9649052c95SBrian Somers     u_short mrru;		/* Max Reconstructed Receive Unit */
9749052c95SBrian Somers     unsigned shortseq : 2;	/* I want short Sequence Numbers */
987063995cSBrian Somers     unsigned negenddisc : 2;	/* I want an endpoint discriminator */
99643f4904SBrian Somers     struct enddisc enddisc;	/* endpoint discriminator */
100ab2de065SBrian Somers     struct {
101ab2de065SBrian Somers       int min;			/* Lowest percent of bundle->bandwidth */
102ab2de065SBrian Somers       int max;			/* Highest percent of bundle->bandwidth out */
103ab2de065SBrian Somers       int period;		/* link->throughput sample period */
104ab2de065SBrian Somers     } autoload;
10549052c95SBrian Somers   } cfg;
10649052c95SBrian Somers 
1073b0f8d2eSBrian Somers   struct mbuf *inbufs;		/* Received fragments */
1083b0f8d2eSBrian Somers   struct fsm_parent fsmp;	/* Our callback functions */
10949052c95SBrian Somers   struct bundle *bundle;	/* Parent */
1103b0f8d2eSBrian Somers };
1113b0f8d2eSBrian Somers 
1123b0f8d2eSBrian Somers struct mp_link {
1133b0f8d2eSBrian Somers   u_int32_t seq;		/* 12 or 24 bit incoming seq */
114ab2de065SBrian Somers   unsigned bandwidth;		/* Our link bandwidth (or zero) */
1153b0f8d2eSBrian Somers };
1163b0f8d2eSBrian Somers 
1173b0f8d2eSBrian Somers struct mp_header {
1183b0f8d2eSBrian Somers   unsigned begin : 1;
1193b0f8d2eSBrian Somers   unsigned end : 1;
1203b0f8d2eSBrian Somers   u_int32_t seq;
1213b0f8d2eSBrian Somers };
1223b0f8d2eSBrian Somers 
1231fa665f5SBrian Somers #define descriptor2mpserver(d) \
1241fa665f5SBrian Somers   ((d)->type == MPSERVER_DESCRIPTOR ? (struct mpserver *)(d) : NULL)
1251fa665f5SBrian Somers #define mpserver_IsOpen(s) ((s)->fd != -1)
1261fa665f5SBrian Somers 
1271fa665f5SBrian Somers extern void peerid_Init(struct peerid *);
1281fa665f5SBrian Somers extern int peerid_Equal(const struct peerid *, const struct peerid *);
1291fa665f5SBrian Somers extern void mpserver_Init(struct mpserver *);
1301fa665f5SBrian Somers extern int mpserver_Open(struct mpserver *, struct peerid *);
1311fa665f5SBrian Somers extern void mpserver_Close(struct mpserver *);
1323b0f8d2eSBrian Somers extern void mp_Init(struct mp *, struct bundle *);
1333b0f8d2eSBrian Somers extern void mp_linkInit(struct mp_link *);
1341fa665f5SBrian Somers extern int mp_Up(struct mp *, struct datalink *);
135673903ecSBrian Somers extern void mp_Down(struct mp *);
1365d9e6103SBrian Somers extern struct mbuf *mp_Input(struct bundle *, struct link *, struct mbuf *);
13730949fd4SBrian Somers extern int mp_FillPhysicalQueues(struct bundle *);
138ab2de065SBrian Somers extern int mp_SetDatalinkBandwidth(struct cmdargs const *);
13949052c95SBrian Somers extern int mp_ShowStatus(struct cmdargs const *);
140057f1760SBrian Somers extern const char *mp_Enddisc(u_char, const char *, size_t);
14149052c95SBrian Somers extern int mp_SetEnddisc(struct cmdargs const *);
14286b1f0d7SBrian Somers extern void mp_LinkLost(struct mp *, struct datalink *);
143ab2de065SBrian Somers extern void mp_RestartAutoloadTimer(struct mp *);
144ab2de065SBrian Somers extern void mp_CheckAutoloadTimer(struct mp *);
145ab2de065SBrian Somers extern void mp_StopAutoloadTimer(struct mp *);
14630949fd4SBrian Somers extern size_t mp_QueueLen(struct mp *);
147