]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/ipv6cp.c
IPV6 update from Tommi Komulainen
[ppp.git] / pppd / ipv6cp.c
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);
 }