X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fdemand.c;h=289c9f8fdd57959588e65835d16cc3adf7950c6a;hp=bb6538cace93d9963459ede30e73b00b14f74e3e;hb=f1e3aa2dc7e7772d8491c6ff61e4e6d28af33d4b;hpb=a3630de20e34796f434a728bfd9cf1a961380c82 diff --git a/pppd/demand.c b/pppd/demand.c index bb6538c..289c9f8 100644 --- a/pppd/demand.c +++ b/pppd/demand.c @@ -1,23 +1,34 @@ /* * demand.c - Support routines for demand-dialling. * - * Copyright (c) 1993 The Australian National University. - * All rights reserved. + * Copyright (c) 1996-2002 Paul Mackerras. All rights reserved. * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the Australian National University. The name of the University - * may not be used to endorse or promote products derived from this - * software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 3. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Paul Mackerras + * ". + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define RCSID "$Id: demand.c,v 1.12 1999/08/13 06:46:12 paulus Exp $"; +#define RCSID "$Id: demand.c,v 1.20 2005/08/25 12:14:18 paulus Exp $" #include #include @@ -33,9 +44,7 @@ #include #include #ifdef PPP_FILTER -#include -#include -#include +#include #endif #include "pppd.h" @@ -43,7 +52,6 @@ #include "ipcp.h" #include "lcp.h" -static const char rcsid[] = RCSID; char *frame; int framelen; @@ -61,13 +69,13 @@ struct packet { struct packet *pend_q; struct packet *pend_qtail; -static int active_packet __P((unsigned char *, int)); +static int active_packet(unsigned char *, int); /* * demand_conf - configure the interface for doing dial-on-demand. */ void -demand_conf() +demand_conf(void) { int i; struct protent *protp; @@ -85,8 +93,10 @@ demand_conf() flush_flag = 0; fcs = PPP_INITFCS; - ppp_send_config(0, PPP_MRU, (u_int32_t) 0, 0, 0); - ppp_recv_config(0, PPP_MRU, (u_int32_t) 0, 0, 0); + netif_set_mtu(0, MIN(lcp_allowoptions[0].mru, PPP_MRU)); + if (ppp_send_config(0, PPP_MRU, (u_int32_t) 0, 0, 0) < 0 + || ppp_recv_config(0, PPP_MRU, (u_int32_t) 0, 0, 0) < 0) + fatal("Couldn't set up demand-dialled PPP interface: %m"); #ifdef PPP_FILTER set_filters(&pass_filter, &active_filter); @@ -106,7 +116,7 @@ demand_conf() * demand_block - set each network protocol to block further packets. */ void -demand_block() +demand_block(void) { int i; struct protent *protp; @@ -122,7 +132,7 @@ demand_block() * with an error. */ void -demand_discard() +demand_discard(void) { struct packet *pkt, *nextpkt; int i; @@ -149,7 +159,7 @@ demand_discard() * demand_unblock - set each enabled network protocol to pass packets. */ void -demand_unblock() +demand_unblock(void) { int i; struct protent *protp; @@ -203,9 +213,7 @@ static u_short fcstab[256] = { * Return value is 1 if we need to bring up the link, 0 otherwise. */ int -loop_chars(p, n) - unsigned char *p; - int n; +loop_chars(unsigned char *p, int n) { int c, rv; @@ -216,7 +224,7 @@ loop_chars(p, n) if (!escape_flag && !flush_flag && framelen > 2 && fcs == PPP_GOODFCS) { framelen -= 2; - if (loop_frame(frame, framelen)) + if (loop_frame((unsigned char *)frame, framelen)) rv = 1; } framelen = 0; @@ -255,9 +263,7 @@ loop_chars(p, n) * bring up the link. */ int -loop_frame(frame, len) - unsigned char *frame; - int len; +loop_frame(unsigned char *frame, int len) { struct packet *pkt; @@ -288,8 +294,7 @@ loop_frame(frame, len) * loopback, now that the real serial link is up. */ void -demand_rexmit(proto) - int proto; +demand_rexmit(int proto) { struct packet *pkt, *prev, *nextpkt; @@ -319,9 +324,7 @@ demand_rexmit(proto) * that is, whether it is worth bringing up the link for. */ static int -active_packet(p, len) - unsigned char *p; - int len; +active_packet(unsigned char *p, int len) { int proto, i; struct protent *protp; @@ -330,9 +333,15 @@ active_packet(p, len) return 0; proto = PPP_PROTOCOL(p); #ifdef PPP_FILTER - if (active_filter.bf_len != 0 - && bpf_filter(active_filter.bf_insns, frame, len, len) == 0) + p[0] = 1; /* outbound packet indicator */ + if ((pass_filter.bf_len != 0 + && bpf_filter(pass_filter.bf_insns, p, len, len) == 0) + || (active_filter.bf_len != 0 + && bpf_filter(active_filter.bf_insns, p, len, len) == 0)) { + p[0] = 0xff; return 0; + } + p[0] = 0xff; #endif for (i = 0; (protp = protocols[i]) != NULL; ++i) { if (protp->protocol < 0xC000 && (protp->protocol & ~0x8000) == proto) {