X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fipv6cp.c;h=c5db5776dfbc3b08acb0093d1762fecb3dfb17ca;hb=a08a6f3080580acf856caae83fdbad40d6f1cbc7;hp=38cb22bbb5f60bf7585d5cd1c3dcfaebfc79578a;hpb=2e53641535da26bf8c3c424172758ed81d908581;p=ppp.git diff --git a/pppd/ipv6cp.c b/pppd/ipv6cp.c index 38cb22b..c5db577 100644 --- a/pppd/ipv6cp.c +++ b/pppd/ipv6cp.c @@ -1,6 +1,80 @@ /* - * ipv6cp.c - PPP IPV6 Control Protocol. - * + ipv6cp.c - PPP IPV6 Control Protocol. + Copyright (C) 1999 Tommi Komulainen + + 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 : * * @@ -21,18 +95,16 @@ * 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 + * $Id: ipv6cp.c,v 1.5 1999/09/11 12:04:22 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.5 1999/09/11 12:04:22 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,13 +305,14 @@ 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); wo->opt_remote = 1; } + ipv6cp_protent.enabled_flag = 1; return 1; } @@ -1036,7 +1112,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 +1142,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 +1202,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 +1224,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); }