IPV6 update from Tommi Komulainen
authorPaul Mackerras <paulus@samba.org>
Wed, 25 Aug 1999 04:15:52 +0000 (04:15 +0000)
committerPaul Mackerras <paulus@samba.org>
Wed, 25 Aug 1999 04:15:52 +0000 (04:15 +0000)
pppd/eui64.c
pppd/eui64.h
pppd/ipv6cp.c
pppd/ipv6cp.h
pppd/pppd.h
pppd/sys-linux.c

index dfceeecd8e3e5ad16e5a7edc3e8e716a9c6506eb..2ffde13505cb60cd426f9bf0e58a1bb1964db934 100644 (file)
@@ -1,24 +1,26 @@
 /*
- * eui64.c - EUI64 routines for IPv6CP.
- *
- * (c) 1999 Tommi Komulainen <Tommi.Komulainen@iki.fi>
- *
- * 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 Carnegie Mellon 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.
- *
- * $Id: eui64.c,v 1.2 1999/08/13 06:46:12 paulus Exp $
- */
+    eui64.c - EUI64 routines for IPv6CP.
+    Copyright (C) 1999  Tommi Komulainen <Tommi.Komulainen@iki.fi>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+
+    $Id: eui64.c,v 1.3 1999/08/25 04:15:51 paulus Exp $
+*/
 
-#define RCSID  "$Id: eui64.c,v 1.2 1999/08/13 06:46:12 paulus Exp $"
+#define RCSID  "$Id: eui64.c,v 1.3 1999/08/25 04:15:51 paulus Exp $"
 
 #include "pppd.h"
 
index 2ea42ce1e74e4156b9522776dc3777e66ca5598e..b8a1c28911e695431f1e628339543533dd136ecb 100644 (file)
@@ -1,22 +1,24 @@
 /*
- * eui64.h - EUI64 routines for IPv6CP.
- *
- * (c) 1999 Tommi Komulainen <Tommi.Komulainen@iki.fi>
- *
- * 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 Carnegie Mellon 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.
- *
- * $Id: eui64.h,v 1.1 1999/08/13 01:58:43 paulus Exp $
- */
+    eui64.h - EUI64 routines for IPv6CP.
+    Copyright (C) 1999  Tommi Komulainen <Tommi.Komulainen@iki.fi>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+    
+    $Id: eui64.h,v 1.2 1999/08/25 04:15:51 paulus Exp $
+*/
 
 /*
  * TODO:
index 38cb22bbb5f60bf7585d5cd1c3dcfaebfc79578a..e2055a445b32c77637008ed258462155511b2bb2 100644 (file)
@@ -1,6 +1,80 @@
 /*
- * ipv6cp.c - PPP IPV6 Control Protocol.
- *
+    ipv6cp.c - PPP IPV6 Control Protocol.
+    Copyright (C) 1999  Tommi Komulainen <Tommi.Komulainen@iki.fi>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*  Original version, based on RFC2023 :
+
+    Copyright (c) 1995, 1996, 1997 Francis.Dupont@inria.fr, INRIA Rocquencourt,
+    Alain.Durand@imag.fr, IMAG,
+    Jean-Luc.Richier@imag.fr, IMAG-LSR.
+
+    Copyright (c) 1998, 1999 Francis.Dupont@inria.fr, GIE DYADE,
+    Alain.Durand@imag.fr, IMAG,
+    Jean-Luc.Richier@imag.fr, IMAG-LSR.
+
+    Ce travail a été fait au sein du GIE DYADE (Groupement d'Intérêt
+    Économique ayant pour membres BULL S.A. et l'INRIA).
+
+    Ce logiciel informatique est disponible aux conditions
+    usuelles dans la recherche, c'est-à-dire qu'il peut
+    être utilisé, copié, modifié, distribué à l'unique
+    condition que ce texte soit conservé afin que
+    l'origine de ce logiciel soit reconnue.
+
+    Le nom de l'Institut National de Recherche en Informatique
+    et en Automatique (INRIA), de l'IMAG, ou d'une personne morale
+    ou physique ayant participé à l'élaboration de ce logiciel ne peut
+    être utilisé sans son accord préalable explicite.
+
+    Ce logiciel est fourni tel quel sans aucune garantie,
+    support ou responsabilité d'aucune sorte.
+    Ce logiciel est dérivé de sources d'origine
+    "University of California at Berkeley" et
+    "Digital Equipment Corporation" couvertes par des copyrights.
+
+    L'Institut d'Informatique et de Mathématiques Appliquées de Grenoble (IMAG)
+    est une fédération d'unités mixtes de recherche du CNRS, de l'Institut National
+    Polytechnique de Grenoble et de l'Université Joseph Fourier regroupant
+    sept laboratoires dont le laboratoire Logiciels, Systèmes, Réseaux (LSR).
+
+    This work has been done in the context of GIE DYADE (joint R & D venture
+    between BULL S.A. and INRIA).
+
+    This software is available with usual "research" terms
+    with the aim of retain credits of the software. 
+    Permission to use, copy, modify and distribute this software for any
+    purpose and without fee is hereby granted, provided that the above
+    copyright notice and this permission notice appear in all copies,
+    and the name of INRIA, IMAG, or any contributor not be used in advertising
+    or publicity pertaining to this material without the prior explicit
+    permission. The software is provided "as is" without any
+    warranties, support or liabilities of any kind.
+    This software is derived from source code from
+    "University of California at Berkeley" and
+    "Digital Equipment Corporation" protected by copyrights.
+
+    Grenoble's Institute of Computer Science and Applied Mathematics (IMAG)
+    is a federation of seven research units funded by the CNRS, National
+    Polytechnic Institute of Grenoble and University Joseph Fourier.
+    The research unit in Software, Systems, Networks (LSR) is member of IMAG.
+*/
+
+/*
  * Derived from :
  *
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * $Id: ipv6cp.c,v 1.3 1999/08/24 05:31:09 paulus Exp $ 
- *
- *
- * Original version by Inria (www.inria.fr)
- * Modified to match RFC2472 by Tommi Komulainen <Tommi.Komulainen@iki.fi>
+ * $Id: ipv6cp.c,v 1.4 1999/08/25 04:15:51 paulus Exp $ 
  */
 
-#define RCSID  "$Id: ipv6cp.c,v 1.3 1999/08/24 05:31:09 paulus Exp $"
+#define RCSID  "$Id: ipv6cp.c,v 1.4 1999/08/25 04:15:51 paulus Exp $"
 
 /*
  * TODO: 
  *
+ * Proxy Neighbour Discovery.
+ *
  * Better defines for selecting the ordering of
  *   interface up / set address. (currently checks for __linux__,
  *   since SVR4 && (SNI || __USLC__) didn't work properly)
@@ -104,7 +176,7 @@ static fsm_callbacks ipv6cp_callbacks = { /* IPV6CP callback routines */
 /*
  * Command-line options.
  */
-static int setifaceid __P((char *arg));
+static int setifaceid __P((char **arg));
 
 static option_t ipv6cp_option_list[] = {
     { "ipv6", o_special, setifaceid,
@@ -113,6 +185,8 @@ static option_t ipv6cp_option_list[] = {
       "Disable IPv6 and IPv6CP" },
     { "-ipv6", o_bool, &ipv6cp_protent.enabled_flag,
       "Disable IPv6 and IPv6CP" },
+    { "+ipv6", o_bool, &ipv6cp_protent.enabled_flag,
+      "Enable IPv6 and IPv6CP", 1 },
 
     { "ipv6cp-accept-local", o_bool, &ipv6cp_allowoptions[0].accept_local,
       "Accept peer's interface identifier for us", 1 },
@@ -168,7 +242,7 @@ struct protent ipv6cp_protent = {
     ipv6_active_pkt
 };
 
-static void ipv6cp_clear_addrs __P((int));
+static void ipv6cp_clear_addrs __P((int, eui64_t, eui64_t));
 static void ipv6cp_script __P((char *));
 static void ipv6cp_script_done __P((void *));
 
@@ -196,16 +270,17 @@ static pid_t ipv6cp_script_pid;
  * setifaceid - set the interface identifiers manually
  */
 static int
-setifaceid(arg)
-    char *arg;
+setifaceid(argv)
+    char **argv;
 {
-    char *comma;
+    char *comma, *arg;
     ipv6cp_options *wo = &ipv6cp_wantoptions[0];
     struct in6_addr addr;
     
 #define VALIDID(a) ( (((a).s6_addr32[0] == 0) && ((a).s6_addr32[1] == 0)) && \
                        (((a).s6_addr32[2] != 0) || ((a).s6_addr32[3] != 0)) )
     
+    arg = *argv;
     if ((comma = strchr(arg, ',')) == NULL)
        comma = arg + strlen(arg);
     
@@ -216,7 +291,7 @@ setifaceid(arg)
        *comma = '\0';
 
        if (inet_pton(AF_INET6, arg, &addr) == 0 || !VALIDID(addr)) {
-           option_error("Illegal interface identifier: %s", arg);
+           option_error("Illegal interface identifier (local): %s", arg);
            return 0;
        }
        
@@ -230,7 +305,7 @@ setifaceid(arg)
      */
     if (*comma != 0 && *++comma != '\0') {
        if (inet_pton(AF_INET6, comma, &addr) == 0 || !VALIDID(addr)) {
-           option_error("Illegal interface identifier: %s", comma);
+           option_error("Illegal interface identifier (remote): %s", comma);
            return 0;
        }
        eui64_copy(addr.s6_addr32[2], wo->hisid);
@@ -1036,7 +1111,7 @@ ipv6cp_up(f)
            if (! eui64_equals(ho->hisid, wo->hisid))
                warn("Remote LL address changed to %s", 
                     llv6_ntoa(ho->hisid));
-           ipv6cp_clear_addrs(f->unit);
+           ipv6cp_clear_addrs(f->unit, go->ourid, ho->hisid);
 
            /* Set the interface to the new addresses */
            if (!sif6addr(f->unit, go->ourid, ho->hisid)) {
@@ -1066,7 +1141,7 @@ ipv6cp_up(f)
        /* bring the interface up for IPv6 */
        if (!sifup(f->unit)) {
            if (debug)
-               warn("sif6up failed");
+               warn("sifup failed (IPV6)");
            ipv6cp_close(f->unit, "Interface configuration failed");
            return;
        }
@@ -1126,11 +1201,13 @@ ipv6cp_down(f)
     if (demand) {
        sifnpmode(f->unit, PPP_IPV6, NPMODE_QUEUE);
     } else {
-#if !defined(__linux__) && !(defined(SVR4) && (defined(SNI) || defined(__USLC)))
        sifnpmode(f->unit, PPP_IPV6, NPMODE_DROP);
+#if !defined(__linux__) && !(defined(SVR4) && (defined(SNI) || defined(__USLC)))
        sifdown(f->unit);
 #endif
-       ipv6cp_clear_addrs(f->unit);
+       ipv6cp_clear_addrs(f->unit, 
+                          ipv6cp_gotoptions[f->unit].ourid,
+                          ipv6cp_hisoptions[f->unit].hisid);
 #if defined(__linux__) || (defined(SVR4) && (defined(SNI) || defined(__USLC)))
        sifdown(f->unit);
 #endif
@@ -1146,16 +1223,14 @@ ipv6cp_down(f)
 
 /*
  * ipv6cp_clear_addrs() - clear the interface addresses, routes,
- * proxy arp entries, etc.
+ * proxy neighbour discovery entries, etc.
  */
 static void
-ipv6cp_clear_addrs(unit)
+ipv6cp_clear_addrs(unit, ourid, hisid)
     int unit;
+    eui64_t ourid;
+    eui64_t hisid;
 {
-    eui64_t ourid, hisid;
-
-    ourid = ipv6cp_gotoptions[unit].ourid;
-    hisid = ipv6cp_hisoptions[unit].hisid;
     cif6addr(unit, ourid, hisid);
 }
 
index c595851fc0ecf06f0e7849d395ba25fdb76a5aae..ca360f978661c7812e95930c2b57db2ff456f725 100644 (file)
@@ -1,6 +1,80 @@
 /*
- * ipv6cp.h - IP Control Protocol definitions.
- *
+    ipv6cp.h - PPP IPV6 Control Protocol.
+    Copyright (C) 1999  Tommi Komulainen <Tommi.Komulainen@iki.fi>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*  Original version, based on RFC2023 :
+
+    Copyright (c) 1995, 1996, 1997 Francis.Dupont@inria.fr, INRIA Rocquencourt,
+    Alain.Durand@imag.fr, IMAG,
+    Jean-Luc.Richier@imag.fr, IMAG-LSR.
+
+    Copyright (c) 1998, 1999 Francis.Dupont@inria.fr, GIE DYADE,
+    Alain.Durand@imag.fr, IMAG,
+    Jean-Luc.Richier@imag.fr, IMAG-LSR.
+
+    Ce travail a été fait au sein du GIE DYADE (Groupement d'Intérêt
+    Économique ayant pour membres BULL S.A. et l'INRIA).
+
+    Ce logiciel informatique est disponible aux conditions
+    usuelles dans la recherche, c'est-à-dire qu'il peut
+    être utilisé, copié, modifié, distribué à l'unique
+    condition que ce texte soit conservé afin que
+    l'origine de ce logiciel soit reconnue.
+
+    Le nom de l'Institut National de Recherche en Informatique
+    et en Automatique (INRIA), de l'IMAG, ou d'une personne morale
+    ou physique ayant participé à l'élaboration de ce logiciel ne peut
+    être utilisé sans son accord préalable explicite.
+
+    Ce logiciel est fourni tel quel sans aucune garantie,
+    support ou responsabilité d'aucune sorte.
+    Ce logiciel est dérivé de sources d'origine
+    "University of California at Berkeley" et
+    "Digital Equipment Corporation" couvertes par des copyrights.
+
+    L'Institut d'Informatique et de Mathématiques Appliquées de Grenoble (IMAG)
+    est une fédération d'unités mixtes de recherche du CNRS, de l'Institut National
+    Polytechnique de Grenoble et de l'Université Joseph Fourier regroupant
+    sept laboratoires dont le laboratoire Logiciels, Systèmes, Réseaux (LSR).
+
+    This work has been done in the context of GIE DYADE (joint R & D venture
+    between BULL S.A. and INRIA).
+
+    This software is available with usual "research" terms
+    with the aim of retain credits of the software. 
+    Permission to use, copy, modify and distribute this software for any
+    purpose and without fee is hereby granted, provided that the above
+    copyright notice and this permission notice appear in all copies,
+    and the name of INRIA, IMAG, or any contributor not be used in advertising
+    or publicity pertaining to this material without the prior explicit
+    permission. The software is provided "as is" without any
+    warranties, support or liabilities of any kind.
+    This software is derived from source code from
+    "University of California at Berkeley" and
+    "Digital Equipment Corporation" protected by copyrights.
+
+    Grenoble's Institute of Computer Science and Applied Mathematics (IMAG)
+    is a federation of seven research units funded by the CNRS, National
+    Polytechnic Institute of Grenoble and University Joseph Fourier.
+    The research unit in Software, Systems, Networks (LSR) is member of IMAG.
+*/
+
+/*
  * Derived from :
  *
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * $Id: ipv6cp.h,v 1.1 1999/08/13 01:58:43 paulus Exp $
- *
- *
- * Original version by Inria (www.inria.fr)
- * Modified to match RFC2472 by Tommi Komulainen <Tommi.Komulainen@iki.fi>
+ * $Id: ipv6cp.h,v 1.2 1999/08/25 04:15:51 paulus Exp $
  */
 
 /*
index 8e4472be3db7f2f61aa3c4d7c3cbd20c919afc17..b241e114ec64b0d48f46aca877c8647bf1daa476 100644 (file)
@@ -16,7 +16,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * $Id: pppd.h,v 1.45 1999/08/24 05:31:11 paulus Exp $
+ * $Id: pppd.h,v 1.46 1999/08/25 04:15:51 paulus Exp $
  */
 
 /*
@@ -43,7 +43,7 @@
 #define volatile
 #endif
 
-#if INET6
+#ifdef INET6
 #include "eui64.h"
 #endif
 
@@ -397,9 +397,7 @@ int  sifaddr __P((int, u_int32_t, u_int32_t, u_int32_t));
                                /* Configure IPv4 addresses for i/f */
 int  cifaddr __P((int, u_int32_t, u_int32_t));
                                /* Reset i/f IP addresses */
-#if INET6
-int  sif6up __P((int));                /* Configure i/f up (for IPv6) */
-int  sif6down __P((int));      /* Configure i/f down (for IPv6) */
+#ifdef INET6
 int  sif6addr __P((int, eui64_t, eui64_t));
                                /* Configure IPv6 addresses for i/f */
 int  cif6addr __P((int, eui64_t, eui64_t));
index fedfccc02f9eb3a6c4ffb8a44f97b0021710ed31..4c40b3655321b2c6a00e7bcd9b974d8a8bd87f44 100644 (file)
@@ -2117,8 +2117,8 @@ int sif6addr (int unit, eui64_t our_eui64, eui64_t his_eui64)
     /* Route to remote host */
     memset(&rt6, 0, sizeof(rt6));
     IN6_LLADDR_FROM_EUI64(rt6.rtmsg_dst, his_eui64);
-    rt6.rtmsg_flags = RTF_UP | RTF_HOST;
-    rt6.rtmsg_dst_len = 128;
+    rt6.rtmsg_flags = RTF_UP;
+    rt6.rtmsg_dst_len = 10;
     rt6.rtmsg_ifindex = ifr.ifr_ifindex;
     rt6.rtmsg_metric = 1;