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