From: Paul Mackerras Date: Wed, 25 Aug 1999 04:15:52 +0000 (+0000) Subject: IPV6 update from Tommi Komulainen X-Git-Tag: ppp-2.4.7~646 X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=commitdiff_plain;h=10a68fd183c5e16e95fce56e7b292f1436b1e714 IPV6 update from Tommi Komulainen --- diff --git a/pppd/eui64.c b/pppd/eui64.c index dfceeec..2ffde13 100644 --- a/pppd/eui64.c +++ b/pppd/eui64.c @@ -1,24 +1,26 @@ /* - * eui64.c - EUI64 routines for IPv6CP. - * - * (c) 1999 Tommi Komulainen - * - * 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 + + 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" diff --git a/pppd/eui64.h b/pppd/eui64.h index 2ea42ce..b8a1c28 100644 --- a/pppd/eui64.h +++ b/pppd/eui64.h @@ -1,22 +1,24 @@ /* - * eui64.h - EUI64 routines for IPv6CP. - * - * (c) 1999 Tommi Komulainen - * - * 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 + + 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: diff --git a/pppd/ipv6cp.c b/pppd/ipv6cp.c index 38cb22b..e2055a4 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.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); } diff --git a/pppd/ipv6cp.h b/pppd/ipv6cp.h index c595851..ca360f9 100644 --- a/pppd/ipv6cp.h +++ b/pppd/ipv6cp.h @@ -1,6 +1,80 @@ /* - * ipv6cp.h - IP Control Protocol definitions. - * + ipv6cp.h - 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,11 +95,7 @@ * 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 + * $Id: ipv6cp.h,v 1.2 1999/08/25 04:15:51 paulus Exp $ */ /* diff --git a/pppd/pppd.h b/pppd/pppd.h index 8e4472b..b241e11 100644 --- a/pppd/pppd.h +++ b/pppd/pppd.h @@ -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)); diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c index fedfccc..4c40b36 100644 --- a/pppd/sys-linux.c +++ b/pppd/sys-linux.c @@ -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;