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