xref: /freebsd/usr.sbin/ppp/mp.h (revision 96c9bb21aa57081809d2c59a47106f95b5d22d9d)
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  *
2696c9bb21SBrian Somers  *	$Id: mp.h,v 1.1.2.10 1998/05/01 19:25:28 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 {
853b0f8d2eSBrian Somers     u_int32_t out;		/* next outgoing seq */
863b0f8d2eSBrian Somers     u_int32_t min_in;		/* minimum received incoming seq */
873b0f8d2eSBrian Somers     u_int32_t next_in;		/* next incoming seq to process */
883b0f8d2eSBrian Somers   } seq;
8949052c95SBrian Somers 
9049052c95SBrian Somers   struct {
9149052c95SBrian Somers     u_short mrru;		/* Max Reconstructed Receive Unit */
9249052c95SBrian Somers     unsigned shortseq : 2;	/* I want short Sequence Numbers */
93643f4904SBrian Somers     struct enddisc enddisc;	/* endpoint discriminator */
9449052c95SBrian Somers   } cfg;
9549052c95SBrian Somers 
963b0f8d2eSBrian Somers   struct mbuf *inbufs;		/* Received fragments */
973b0f8d2eSBrian Somers   struct fsm_parent fsmp;	/* Our callback functions */
9849052c95SBrian Somers   struct bundle *bundle;	/* Parent */
993b0f8d2eSBrian Somers };
1003b0f8d2eSBrian Somers 
1013b0f8d2eSBrian Somers struct mp_link {
1023b0f8d2eSBrian Somers   u_int32_t seq;		/* 12 or 24 bit incoming seq */
1033b0f8d2eSBrian Somers   int weight;			/* bytes to send with each write */
1043b0f8d2eSBrian Somers };
1053b0f8d2eSBrian Somers 
1063b0f8d2eSBrian Somers struct mp_header {
1073b0f8d2eSBrian Somers   unsigned begin : 1;
1083b0f8d2eSBrian Somers   unsigned end : 1;
1093b0f8d2eSBrian Somers   u_int32_t seq;
1103b0f8d2eSBrian Somers };
1113b0f8d2eSBrian Somers 
1121fa665f5SBrian Somers #define descriptor2mpserver(d) \
1131fa665f5SBrian Somers   ((d)->type == MPSERVER_DESCRIPTOR ? (struct mpserver *)(d) : NULL)
1141fa665f5SBrian Somers #define mpserver_IsOpen(s) ((s)->fd != -1)
1151fa665f5SBrian Somers 
1161fa665f5SBrian Somers extern void peerid_Init(struct peerid *);
1171fa665f5SBrian Somers extern int peerid_Equal(const struct peerid *, const struct peerid *);
1181fa665f5SBrian Somers extern void mpserver_Init(struct mpserver *);
1191fa665f5SBrian Somers extern int mpserver_Open(struct mpserver *, struct peerid *);
1201fa665f5SBrian Somers extern void mpserver_Close(struct mpserver *);
1213b0f8d2eSBrian Somers extern void mp_Init(struct mp *, struct bundle *);
1223b0f8d2eSBrian Somers extern void mp_linkInit(struct mp_link *);
1231fa665f5SBrian Somers extern int mp_Up(struct mp *, struct datalink *);
124673903ecSBrian Somers extern void mp_Down(struct mp *);
1253b0f8d2eSBrian Somers extern void mp_Input(struct mp *, struct mbuf *, struct physical *);
1263b0f8d2eSBrian Somers extern int mp_FillQueues(struct bundle *);
1273b0f8d2eSBrian Somers extern int mp_SetDatalinkWeight(struct cmdargs const *);
12849052c95SBrian Somers extern int mp_ShowStatus(struct cmdargs const *);
12949052c95SBrian Somers extern const char *mp_Enddisc(u_char, const char *, int);
13049052c95SBrian Somers extern int mp_SetEnddisc(struct cmdargs const *);
131