X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fipv6cp.c;h=de3076f1f51bffab074c8dd49a5a9ad0bfb7a284;hp=f444348f8dcbd1dfbfb7fa5b6d8776528dbd7fd4;hb=f7ee87797ae1851c7bfb57752185b66f127326e8;hpb=820cc91b8b57e1ec52cad6a9efafa128bcda2d7e diff --git a/pppd/ipv6cp.c b/pppd/ipv6cp.c index f444348..de3076f 100644 --- a/pppd/ipv6cp.c +++ b/pppd/ipv6cp.c @@ -2,19 +2,14 @@ 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. + 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. The name of the author 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. */ /* Original version, based on RFC2023 : @@ -95,10 +90,10 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: ipv6cp.c,v 1.6 1999/09/30 19:57:45 masputra Exp $ + * $Id: ipv6cp.c,v 1.12 2001/02/22 03:15:16 paulus Exp $ */ -#define RCSID "$Id: ipv6cp.c,v 1.6 1999/09/30 19:57:45 masputra Exp $" +#define RCSID "$Id: ipv6cp.c,v 1.12 2001/02/22 03:15:16 paulus Exp $" /* * TODO: @@ -179,8 +174,8 @@ static fsm_callbacks ipv6cp_callbacks = { /* IPV6CP callback routines */ static int setifaceid __P((char **arg)); static option_t ipv6cp_option_list[] = { - { "ipv6", o_special, setifaceid, - "Set interface identifiers for IPV6" }, + { "ipv6", o_special, (void *)setifaceid, + "Set interface identifiers for IPV6", OPT_MULTIPART }, { "noipv6", o_bool, &ipv6cp_protent.enabled_flag, "Disable IPv6 and IPv6CP" }, { "-ipv6", o_bool, &ipv6cp_protent.enabled_flag, @@ -276,10 +271,11 @@ static int setifaceid(argv) char **argv; { - char *comma, *arg; + char *comma, *arg, c; ipv6cp_options *wo = &ipv6cp_wantoptions[0]; struct in6_addr addr; - + static int prio_local, prio_remote; + #define VALIDID(a) ( (((a).s6_addr32[0] == 0) && ((a).s6_addr32[1] == 0)) && \ (((a).s6_addr32[2] != 0) || ((a).s6_addr32[3] != 0)) ) @@ -291,16 +287,20 @@ setifaceid(argv) * If comma first character, then no local identifier */ if (comma != arg) { + c = *comma; *comma = '\0'; if (inet_pton(AF_INET6, arg, &addr) == 0 || !VALIDID(addr)) { option_error("Illegal interface identifier (local): %s", arg); return 0; } - - eui64_copy(addr.s6_addr32[2], wo->ourid); - wo->opt_local = 1; - *comma = ','; + + if (option_priority >= prio_local) { + eui64_copy(addr.s6_addr32[2], wo->ourid); + wo->opt_local = 1; + prio_local = option_priority; + } + *comma = c; } /* @@ -311,8 +311,11 @@ setifaceid(argv) option_error("Illegal interface identifier (remote): %s", comma); return 0; } - eui64_copy(addr.s6_addr32[2], wo->hisid); - wo->opt_remote = 1; + if (option_priority >= prio_remote) { + eui64_copy(addr.s6_addr32[2], wo->hisid); + wo->opt_remote = 1; + prio_remote = option_priority; + } } ipv6cp_protent.enabled_flag = 1; @@ -916,14 +919,14 @@ ipv6cp_reqci(f, inp, len, reject_if_disagree) orc = CONFREJ; break; } -#else - orc = CONFREJ; - break; -#endif ho->neg_vj = 1; ho->vj_protocol = cishort; break; +#else + orc = CONFREJ; + break; +#endif default: orc = CONFREJ; @@ -1120,8 +1123,8 @@ ipv6cp_up(f) return; } } - script_setenv("LLLOCAL", llv6_ntoa(go->ourid)); - script_setenv("LLREMOTE", llv6_ntoa(ho->hisid)); + script_setenv("LLLOCAL", llv6_ntoa(go->ourid), 0); + script_setenv("LLREMOTE", llv6_ntoa(ho->hisid), 0); #ifdef IPV6CP_COMP /* set tcp compression */ @@ -1203,12 +1206,6 @@ ipv6cp_up(f) np_up(f->unit, PPP_IPV6); ipv6cp_is_up = 1; - /* - * In Solaris, neighbor discovery and router advertisement are done - * automatically by in.ndpd daemon when the interface comes up or down - * and /etc/inet/ndpd.conf is configured properly - */ -#if !defined(SOL2) /* * Execute the ipv6-up script, like this: * /etc/ppp/ipv6-up interface tty speed local-LL remote-LL @@ -1217,7 +1214,6 @@ ipv6cp_up(f) ipv6cp_script_state = s_up; ipv6cp_script(_PATH_IPV6UP); } -#endif /* !defined(SOL2) */ } @@ -1264,18 +1260,11 @@ ipv6cp_down(f) #endif } - /* - * In Solaris, neighbor discovery and router advertisement are done - * automatically by in.ndpd daemon when the interface comes up or down - * and /etc/inet/ndpd.conf is configured properly - */ -#if !defined(SOL2) /* Execute the ipv6-down script */ if (ipv6cp_script_state == s_up && ipv6cp_script_pid == 0) { ipv6cp_script_state = s_down; ipv6cp_script(_PATH_IPV6DOWN); } -#endif /* !defined(SOL2) */ } @@ -1437,7 +1426,7 @@ ipv6cp_printpkt(p, plen, printer, arg) case TERMREQ: if (len > 0 && *p >= ' ' && *p < 0x7f) { printer(arg, " "); - print_string(p, len, printer, arg); + print_string((char *)p, len, printer, arg); p += len; len = 0; }