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