xref: /freebsd/usr.sbin/ppp/mp.h (revision ab2de065b2604b53f8426fe493586bc3368518ef)
13b0f8d2eSBrian Somers /*-
23b0f8d2eSBrian Somers  * Copyright (c) 1998 Brian Somers <brian@Awfulhak.org>
33b0f8d2eSBrian Somers  * All rights reserved.
43b0f8d2eSBrian Somers  *
53b0f8d2eSBrian Somers  * Redistribution and use in source and binary forms, with or without
63b0f8d2eSBrian Somers  * modification, are permitted provided that the following conditions
73b0f8d2eSBrian Somers  * are met:
83b0f8d2eSBrian Somers  * 1. Redistributions of source code must retain the above copyright
93b0f8d2eSBrian Somers  *    notice, this list of conditions and the following disclaimer.
103b0f8d2eSBrian Somers  * 2. Redistributions in binary form must reproduce the above copyright
113b0f8d2eSBrian Somers  *    notice, this list of conditions and the following disclaimer in the
123b0f8d2eSBrian Somers  *    documentation and/or other materials provided with the distribution.
133b0f8d2eSBrian Somers  *
143b0f8d2eSBrian Somers  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
153b0f8d2eSBrian Somers  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
163b0f8d2eSBrian Somers  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
173b0f8d2eSBrian Somers  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
183b0f8d2eSBrian Somers  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
193b0f8d2eSBrian Somers  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
203b0f8d2eSBrian Somers  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
213b0f8d2eSBrian Somers  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
223b0f8d2eSBrian Somers  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
233b0f8d2eSBrian Somers  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
243b0f8d2eSBrian Somers  * SUCH DAMAGE.
253b0f8d2eSBrian Somers  *
26ab2de065SBrian Somers  *	$Id: mp.h,v 1.6 1999/06/09 16:54:03 brian Exp $
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 */
59643f4904SBrian Somers   char authname[50];		/* Peers name (authenticated) */
60643f4904SBrian Somers };
61643f4904SBrian Somers 
621fa665f5SBrian Somers struct mpserver {
631fa665f5SBrian Somers   struct descriptor 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 */
879c53a7b1SBrian Somers   } out;
889c53a7b1SBrian Somers 
899c53a7b1SBrian Somers   struct {
903b0f8d2eSBrian Somers     u_int32_t min_in;		/* minimum received incoming seq */
913b0f8d2eSBrian Somers     u_int32_t next_in;		/* next incoming seq to process */
923b0f8d2eSBrian Somers   } seq;
9349052c95SBrian Somers 
9449052c95SBrian Somers   struct {
9549052c95SBrian Somers     u_short mrru;		/* Max Reconstructed Receive Unit */
9649052c95SBrian Somers     unsigned shortseq : 2;	/* I want short Sequence Numbers */
977063995cSBrian Somers     unsigned negenddisc : 2;	/* I want an endpoint discriminator */
98643f4904SBrian Somers     struct enddisc enddisc;	/* endpoint discriminator */
99ab2de065SBrian Somers     struct {
100ab2de065SBrian Somers       int min;			/* Lowest percent of bundle->bandwidth */
101ab2de065SBrian Somers       int max;			/* Highest percent of bundle->bandwidth out */
102ab2de065SBrian Somers       int period;		/* link->throughput sample period */
103ab2de065SBrian Somers     } autoload;
10449052c95SBrian Somers   } cfg;
10549052c95SBrian Somers 
1063b0f8d2eSBrian Somers   struct mbuf *inbufs;		/* Received fragments */
1073b0f8d2eSBrian Somers   struct fsm_parent fsmp;	/* Our callback functions */
10849052c95SBrian Somers   struct bundle *bundle;	/* Parent */
1093b0f8d2eSBrian Somers };
1103b0f8d2eSBrian Somers 
1113b0f8d2eSBrian Somers struct mp_link {
1123b0f8d2eSBrian Somers   u_int32_t seq;		/* 12 or 24 bit incoming seq */
113ab2de065SBrian Somers   unsigned bandwidth;		/* Our link bandwidth (or zero) */
1143b0f8d2eSBrian Somers };
1153b0f8d2eSBrian Somers 
1163b0f8d2eSBrian Somers struct mp_header {
1173b0f8d2eSBrian Somers   unsigned begin : 1;
1183b0f8d2eSBrian Somers   unsigned end : 1;
1193b0f8d2eSBrian Somers   u_int32_t seq;
1203b0f8d2eSBrian Somers };
1213b0f8d2eSBrian Somers 
1221fa665f5SBrian Somers #define descriptor2mpserver(d) \
1231fa665f5SBrian Somers   ((d)->type == MPSERVER_DESCRIPTOR ? (struct mpserver *)(d) : NULL)
1241fa665f5SBrian Somers #define mpserver_IsOpen(s) ((s)->fd != -1)
1251fa665f5SBrian Somers 
1261fa665f5SBrian Somers extern void peerid_Init(struct peerid *);
1271fa665f5SBrian Somers extern int peerid_Equal(const struct peerid *, const struct peerid *);
1281fa665f5SBrian Somers extern void mpserver_Init(struct mpserver *);
1291fa665f5SBrian Somers extern int mpserver_Open(struct mpserver *, struct peerid *);
1301fa665f5SBrian Somers extern void mpserver_Close(struct mpserver *);
1313b0f8d2eSBrian Somers extern void mp_Init(struct mp *, struct bundle *);
1323b0f8d2eSBrian Somers extern void mp_linkInit(struct mp_link *);
1331fa665f5SBrian Somers extern int mp_Up(struct mp *, struct datalink *);
134673903ecSBrian Somers extern void mp_Down(struct mp *);
1355d9e6103SBrian Somers extern struct mbuf *mp_Input(struct bundle *, struct link *, struct mbuf *);
1363b0f8d2eSBrian Somers extern int mp_FillQueues(struct bundle *);
137ab2de065SBrian Somers extern int mp_SetDatalinkBandwidth(struct cmdargs const *);
13849052c95SBrian Somers extern int mp_ShowStatus(struct cmdargs const *);
13949052c95SBrian Somers extern const char *mp_Enddisc(u_char, const char *, int);
14049052c95SBrian Somers extern int mp_SetEnddisc(struct cmdargs const *);
14186b1f0d7SBrian Somers extern void mp_LinkLost(struct mp *, struct datalink *);
1426f8e9f0aSBrian Somers extern void mp_DeleteQueue(struct mp *);
143ab2de065SBrian Somers extern void mp_RestartAutoloadTimer(struct mp *);
144ab2de065SBrian Somers extern void mp_CheckAutoloadTimer(struct mp *);
145ab2de065SBrian Somers extern void mp_StopAutoloadTimer(struct mp *);
146