]> git.ozlabs.org Git - ppp.git/commitdiff
Merge branch 'send-padt-on-disconnect' of git://github.com/farnz/ppp
authorPaul Mackerras <paulus@samba.org>
Fri, 14 Aug 2015 10:32:43 +0000 (20:32 +1000)
committerPaul Mackerras <paulus@samba.org>
Fri, 14 Aug 2015 10:32:43 +0000 (20:32 +1000)
Signed-off-by: Paul Mackerras <paulus@samba.org>
pppd/ccp.c
pppd/ccp.h
pppd/ipxcp.c
pppd/options.c
pppd/plugins/Makefile.linux
pppd/plugins/rp-pppoe/plugin.c
pppd/pppd.8
pppd/sys-linux.c
pppd/utils.c
scripts/poff

index 5814f358eb44c5a4791f06b8170c69d45e7c4e9d..7d7922afcfc0b2d4178319dc903dc3c19427c1c3 100644 (file)
@@ -676,7 +676,8 @@ ccp_cilen(f)
     ccp_options *go = &ccp_gotoptions[f->unit];
 
     return (go->bsd_compress? CILEN_BSD_COMPRESS: 0)
-       + (go->deflate? CILEN_DEFLATE: 0)
+       + (go->deflate && go->deflate_correct? CILEN_DEFLATE: 0)
+       + (go->deflate && go->deflate_draft? CILEN_DEFLATE: 0)
        + (go->predictor_1? CILEN_PREDICTOR_1: 0)
        + (go->predictor_2? CILEN_PREDICTOR_2: 0)
        + (go->mppe? CILEN_MPPE: 0);
index 6f4a2fee0a2c6692b11a74318821b39b566e0bbe..76446db007c00604120f7044cc67be520ad3650c 100644 (file)
@@ -37,7 +37,7 @@ typedef struct ccp_options {
     bool predictor_2;          /* do Predictor-2? */
     bool deflate_correct;      /* use correct code for deflate? */
     bool deflate_draft;                /* use draft RFC code for deflate? */
-    bool mppe;                 /* do MPPE? */
+    u_char mppe;               /* MPPE bitfield */
     u_short bsd_bits;          /* # bits/code for BSD Compress */
     u_short deflate_size;      /* lg(window size) for Deflate */
     short method;              /* code for chosen compression method */
index 7b2343e155377120273793d3be2ce2cf28daff29..aaff10f76200fd65799edb2e45c0a506c2147933 100644 (file)
@@ -1194,7 +1194,7 @@ ipxcp_reqci(f, inp, len, reject_if_disagree)
        case IPX_ROUTER_NAME:
            if (cilen >= CILEN_NAME) {
                int name_size = cilen - CILEN_NAME;
-               if (name_size > sizeof (ho->name))
+               if (name_size >= sizeof (ho->name))
                    name_size = sizeof (ho->name) - 1;
                memset (ho->name, 0, sizeof (ho->name));
                memcpy (ho->name, p, name_size);
index f66b7657bc31c9b197b8449fa12902293fdf85d1..c06a2b4ad8ed4560501dfeb61902946c14ea7d96 100644 (file)
@@ -121,6 +121,7 @@ bool        dryrun;                 /* print out option values and exit */
 char   *domain;                /* domain name set by domain option */
 int    child_wait = 5;         /* # seconds to wait for children at exit */
 struct userenv *userenv_list;  /* user environment variables */
+int    dfl_route_metric = -1;  /* metric of the default route to set over the PPP link */
 
 #ifdef MAXOCTETS
 unsigned int  maxoctets = 0;    /* default - no limit */
@@ -299,6 +300,10 @@ option_t general_options[] = {
       "Unset user environment variable",
       OPT_A2PRINTER | OPT_NOPRINT, (void *)user_unsetprint },
 
+    { "defaultroute-metric", o_int, &dfl_route_metric,
+      "Metric to use for the default route (Linux only; -1 for default behavior)",
+      OPT_PRIV|OPT_LLIMIT|OPT_INITONLY, NULL, 0, -1 },
+
 #ifdef HAVE_MULTILINK
     { "multilink", o_bool, &multilink,
       "Enable multilink operation", OPT_PRIO | 1 },
index ab8cf50d94729168f9b3cafa2d85788ba5b63349..8a90e393a0578fd4885bfda0fabfd688735eeaf5 100644 (file)
@@ -27,7 +27,7 @@ include .depend
 endif
 
 all:   $(PLUGINS)
-       for d in $(SUBDIRS); do $(MAKE) $(MFLAGS) -C $$d all; done
+       for d in $(SUBDIRS); do $(MAKE) $(MFLAGS) -C $$d all || exit $$?; done
 
 %.so: %.c
        $(CC) -o $@ $(LDFLAGS) $(CFLAGS) $^
@@ -37,12 +37,12 @@ VERSION = $(shell awk -F '"' '/VERSION/ { print $$2; }' ../patchlevel.h)
 install: $(PLUGINS)
        $(INSTALL) -d $(LIBDIR)
        $(INSTALL) $? $(LIBDIR)
-       for d in $(SUBDIRS); do $(MAKE) $(MFLAGS) -C $$d install; done
+       for d in $(SUBDIRS); do $(MAKE) $(MFLAGS) -C $$d install || exit $$?; done
 
 clean:
        rm -f *.o *.so *.a
-       for d in $(SUBDIRS); do $(MAKE) $(MFLAGS) -C $$d clean; done
+       for d in $(SUBDIRS); do $(MAKE) $(MFLAGS) -C $$d clean || exit $$?; done
 
 depend:
        $(CPP) -M $(CFLAGS) *.c >.depend
-       for d in $(SUBDIRS); do $(MAKE) $(MFLAGS) -C $$d depend; done
+       for d in $(SUBDIRS); do $(MAKE) $(MFLAGS) -C $$d depend || exit $$?; done
index 90fb8089ad8f69590fe196cd9e9f49787809e574..c89be94250bc660203beb0a163776fddbb5d074b 100644 (file)
@@ -270,7 +270,7 @@ PPPOEDisconnectDevice(void)
     memcpy(sp.sa_addr.pppoe.dev, conn->ifName, IFNAMSIZ);
     memcpy(sp.sa_addr.pppoe.remote, conn->peerEth, ETH_ALEN);
     if (connect(conn->sessionSocket, (struct sockaddr *) &sp,
-               sizeof(struct sockaddr_pppox)) < 0)
+               sizeof(struct sockaddr_pppox)) < 0 && errno != EALREADY)
        error("Failed to disconnect PPPoE socket: %d %m", errno);
     close(conn->sessionSocket);
     if (conn->discoverySocket >= 0) {
index e2768b135273d1772e1241a322fe1116aa1587b8..c508d277df3aa5539dd3c0d94787d97f71709956 100644 (file)
@@ -121,6 +121,12 @@ the gateway, when IPCP negotiation is successfully completed.
 This entry is removed when the PPP connection is broken.  This option
 is privileged if the \fInodefaultroute\fR option has been specified.
 .TP
+.B defaultroute-metric
+Define the metric of the \fIdefaultroute\fR and only add it if there
+is no other default route with the same metric.  With the default
+value of -1, the route is only added if there is no default route at
+all.
+.TP
 .B disconnect \fIscript
 Execute the command specified by \fIscript\fR, by passing it to a
 shell, after
index e5e9baf8821ff775305a7681441634a0f1bb97c3..b4a435d2a99368bdb48316c798961f1be8f08147 100644 (file)
@@ -233,7 +233,7 @@ static int baud_rate_of (int speed);
 static void close_route_table (void);
 static int open_route_table (void);
 static int read_route_table (struct rtentry *rt);
-static int defaultroute_exists (struct rtentry *rt);
+static int defaultroute_exists (struct rtentry *rt, int metric);
 static int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr,
                           char *name, int namelen);
 static void decode_version (char *buf, int *version, int *mod, int *patch);
@@ -244,6 +244,8 @@ static int setifstate (int u, int state);
 
 extern u_char  inpacket_buf[]; /* borrowed from main.c */
 
+extern int dfl_route_metric;
+
 /*
  * SET_SA_FAMILY - set the sa_family field of a struct sockaddr,
  * if it exists.
@@ -1447,7 +1449,7 @@ static char *path_to_procfs(const char *tail)
 FILE *route_fd = (FILE *) 0;
 static char route_buffer[512];
 static int route_dev_col, route_dest_col, route_gw_col;
-static int route_flags_col, route_mask_col;
+static int route_flags_col, route_metric_col, route_mask_col;
 static int route_num_cols;
 
 static int open_route_table (void);
@@ -1490,6 +1492,7 @@ static int open_route_table (void)
     route_dest_col = 1;
     route_gw_col = 2;
     route_flags_col = 3;
+    route_metric_col = 6;
     route_mask_col = 7;
     route_num_cols = 8;
 
@@ -1550,6 +1553,7 @@ static int read_route_table(struct rtentry *rt)
     SIN_ADDR(rt->rt_genmask) = strtoul(cols[route_mask_col], NULL, 16);
 
     rt->rt_flags = (short) strtoul(cols[route_flags_col], NULL, 16);
+    rt->rt_metric = (short) strtoul(cols[route_metric_col], NULL, 10);
     rt->rt_dev   = cols[route_dev_col];
 
     return 1;
@@ -1558,9 +1562,10 @@ static int read_route_table(struct rtentry *rt)
 /********************************************************************
  *
  * defaultroute_exists - determine if there is a default route
+ * with the given metric (or negative for any)
  */
 
-static int defaultroute_exists (struct rtentry *rt)
+static int defaultroute_exists (struct rtentry *rt, int metric)
 {
     int result = 0;
 
@@ -1573,7 +1578,8 @@ static int defaultroute_exists (struct rtentry *rt)
 
        if (kernel_version > KVERSION(2,1,0) && SIN_ADDR(rt->rt_genmask) != 0)
            continue;
-       if (SIN_ADDR(rt->rt_dst) == 0L) {
+       if (SIN_ADDR(rt->rt_dst) == 0L && (metric < 0
+                                          || rt->rt_metric == metric)) {
            result = 1;
            break;
        }
@@ -1620,13 +1626,13 @@ int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
 {
     struct rtentry rt;
 
-    if (defaultroute_exists(&rt) && strcmp(rt.rt_dev, ifname) != 0) {
+    if (defaultroute_exists(&rt, dfl_route_metric) && strcmp(rt.rt_dev, ifname) != 0) {
        if (rt.rt_flags & RTF_GATEWAY)
-           error("not replacing existing default route via %I",
-                 SIN_ADDR(rt.rt_gateway));
+           error("not replacing existing default route via %I with metric %d",
+                 SIN_ADDR(rt.rt_gateway), dfl_route_metric);
        else
-           error("not replacing existing default route through %s",
-                 rt.rt_dev);
+           error("not replacing existing default route through %s with metric %d",
+                 rt.rt_dev, dfl_route_metric);
        return 0;
     }
 
@@ -1634,6 +1640,7 @@ int sifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
     SET_SA_FAMILY (rt.rt_dst, AF_INET);
 
     rt.rt_dev = ifname;
+    rt.rt_metric = dfl_route_metric + 1; /* +1 for binary compatibility */
 
     if (kernel_version > KVERSION(2,1,0)) {
        SET_SA_FAMILY (rt.rt_genmask, AF_INET);
@@ -1668,6 +1675,9 @@ int cifdefaultroute (int unit, u_int32_t ouraddr, u_int32_t gateway)
 
     rt.rt_dev = ifname;
 
+    rt.rt_dev = ifname;
+    rt.rt_metric = dfl_route_metric + 1; /* +1 for binary compatibility */
+
     if (kernel_version > KVERSION(2,1,0)) {
        SET_SA_FAMILY (rt.rt_genmask, AF_INET);
        SIN_ADDR(rt.rt_genmask) = 0L;
index 29bf970905d58ffdcba9fe68cc7c62526fc9430e..3ac1b60926d20014808dcaf708d59f6adb33ee1a 100644 (file)
@@ -625,7 +625,7 @@ print_string(p, len, printer, arg)
                printer(arg, "\\t");
                break;
            default:
-               printer(arg, "\\%.3o", c);
+               printer(arg, "\\%.3o", (unsigned char) c);
            }
        }
     }
index 3f55a7f40010db8d976d71fb454da725feef4edd..5b45d98a2b6afea557772d07949d1615c12237dd 100644 (file)
@@ -91,7 +91,7 @@ if test "$#" -eq 0 -o "$MODE" = "all" ; then
 fi
 
 # There is an argument, so kill the pppd started on that provider.
-PID=`ps axw | grep "[ /]pppd call $1" | awk '{print $1}'`
+PID=`ps axw | grep "[ /]pppd call $1" | grep -w "$1" | awk '{print $1}'`
 if test -n "$PID" ; then
     $KILL -$SIG $PID || {
         echo "$0: $KILL failed.  None ${DONE}."