diff options
| author | Brian Somers <brian@FreeBSD.org> | 2001-08-14 16:05:52 +0000 |
|---|---|---|
| committer | Brian Somers <brian@FreeBSD.org> | 2001-08-14 16:05:52 +0000 |
| commit | 30949fd4b52d91188c23cb2ca0d130d89bb1678c (patch) | |
| tree | b09d46345a558a45e66b435c4386d76cf53405d3 /usr.sbin/ppp/command.c | |
| parent | 135047c346cac167948b8cbbe9529d74ef0b7dad (diff) | |
Notes
Diffstat (limited to 'usr.sbin/ppp/command.c')
| -rw-r--r-- | usr.sbin/ppp/command.c | 317 |
1 files changed, 197 insertions, 120 deletions
diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c index 84c8f0d9a598..41a4e502be9b 100644 --- a/usr.sbin/ppp/command.c +++ b/usr.sbin/ppp/command.c @@ -70,6 +70,8 @@ #include "lqr.h" #include "hdlc.h" #include "lcp.h" +#include "ncpaddr.h" +#include "ip.h" #include "ipcp.h" #ifndef NONAT #include "nat_cmd.h" @@ -88,6 +90,8 @@ #ifndef NORADIUS #include "radius.h" #endif +#include "ipv6cp.h" +#include "ncp.h" #include "bundle.h" #include "server.h" #include "prompt.h" @@ -159,7 +163,7 @@ #define NEG_MPPE 54 #define NEG_CHAP81 55 -const char Version[] = "2.3.2"; +const char Version[] = "3.0.0"; static int ShowCommand(struct cmdargs const *); static int TerminalCommand(struct cmdargs const *); @@ -454,9 +458,17 @@ command_Expand(char **nargv, int argc, char const *const *oargv, nargv[arg] = strdup(oargv[arg]); nargv[arg] = subst(nargv[arg], "HISADDR", inet_ntoa(bundle->ncp.ipcp.peer_ip)); +#ifndef NOINET6 + nargv[arg] = subst(nargv[arg], "HISADDR6", + ncpaddr_ntoa(&bundle->ncp.ipv6cp.hisaddr)); +#endif nargv[arg] = subst(nargv[arg], "AUTHNAME", bundle->cfg.auth.name); nargv[arg] = subst(nargv[arg], "INTERFACE", bundle->iface->name); nargv[arg] = subst(nargv[arg], "MYADDR", inet_ntoa(bundle->ncp.ipcp.my_ip)); +#ifndef NOINET6 + nargv[arg] = subst(nargv[arg], "MYADDR6", + ncpaddr_ntoa(&bundle->ncp.ipv6cp.myaddr)); +#endif nargv[arg] = subst(nargv[arg], "USER", bundle->ncp.mp.peer.authname); nargv[arg] = subst(nargv[arg], "PEER_ENDDISC", mp_Enddisc(bundle->ncp.mp.peer.enddisc.class, @@ -676,7 +688,7 @@ static struct cmdtab const IfaceCommands[] = "Add or change an iface address", "iface add! addr[/bits| mask] peer", (void *)1}, {"clear", NULL, IfaceClearCommand, LOCAL_AUTH, - "Clear iface address(es)", "iface clear"}, + "Clear iface address(es)", "iface clear [INET | INET6]"}, {"delete", "rm", IfaceDeleteCommand, LOCAL_AUTH, "Delete iface address", "iface delete addr", NULL}, {NULL, "rm!", IfaceDeleteCommand, LOCAL_AUTH, @@ -703,7 +715,7 @@ static struct cmdtab const Commands[] = { "Run a background command", "[!]bg command"}, {"clear", NULL, ClearCommand, LOCAL_AUTH | LOCAL_CX_OPT, "Clear throughput statistics", - "clear ipcp|physical [current|overall|peak]..."}, + "clear ipcp|ipv6cp|physical [current|overall|peak]..."}, {"clone", NULL, CloneCommand, LOCAL_AUTH | LOCAL_CX, "Clone a link", "clone newname..."}, {"close", NULL, CloseCommand, LOCAL_AUTH | LOCAL_CX_OPT, @@ -845,6 +857,10 @@ static struct cmdtab const ShowCommands[] = { "Interface status", "show iface"}, {"ipcp", NULL, ipcp_Show, LOCAL_AUTH, "IPCP status", "show ipcp"}, +#ifndef NOINET6 + {"ipv6cp", NULL, ipv6cp_Show, LOCAL_AUTH, + "IPV6CP status", "show ipv6cp"}, +#endif {"layers", NULL, link_ShowLayers, LOCAL_AUTH | LOCAL_CX_OPT, "Protocol layers", "show layers"}, {"lcp", NULL, lcp_ReportStatus, LOCAL_AUTH | LOCAL_CX, @@ -857,6 +873,8 @@ static struct cmdtab const ShowCommands[] = { "log levels", "show log"}, {"mem", NULL, mbuf_Show, LOCAL_AUTH, "mbuf allocations", "show mem"}, + {"ncp", NULL, ncp_Show, LOCAL_AUTH, + "NCP status", "show ncp"}, {"physical", NULL, physical_ShowStatus, LOCAL_AUTH | LOCAL_CX, "(low-level) link info", "show physical"}, {"mp", "multilink", mp_ShowStatus, LOCAL_AUTH, @@ -1404,43 +1422,42 @@ SetEscape(struct cmdargs const *arg) static int SetInterfaceAddr(struct cmdargs const *arg) { - struct ipcp *ipcp = &arg->bundle->ncp.ipcp; + struct ncp *ncp = &arg->bundle->ncp; + struct ncpaddr ncpaddr; const char *hisaddr; if (arg->argc > arg->argn + 4) return -1; hisaddr = NULL; - memset(&ipcp->cfg.my_range, '\0', sizeof ipcp->cfg.my_range); - memset(&ipcp->cfg.peer_range, '\0', sizeof ipcp->cfg.peer_range); - ipcp->cfg.HaveTriggerAddress = 0; - ipcp->cfg.netmask.s_addr = INADDR_ANY; - iplist_reset(&ipcp->cfg.peer_list); + memset(&ncp->ipcp.cfg.my_range, '\0', sizeof ncp->ipcp.cfg.my_range); + memset(&ncp->ipcp.cfg.peer_range, '\0', sizeof ncp->ipcp.cfg.peer_range); + ncp->ipcp.cfg.HaveTriggerAddress = 0; + ncp->ipcp.cfg.netmask.s_addr = INADDR_ANY; + iplist_reset(&ncp->ipcp.cfg.peer_list); if (arg->argc > arg->argn) { - if (!ParseAddr(ipcp, arg->argv[arg->argn], - &ipcp->cfg.my_range.ipaddr, &ipcp->cfg.my_range.mask, - &ipcp->cfg.my_range.width)) + if (!ncprange_aton(&ncp->ipcp.cfg.my_range, ncp, arg->argv[arg->argn])) return 1; if (arg->argc > arg->argn+1) { hisaddr = arg->argv[arg->argn+1]; if (arg->argc > arg->argn+2) { - ipcp->ifmask = ipcp->cfg.netmask = GetIpAddr(arg->argv[arg->argn+2]); + ncp->ipcp.ifmask = ncp->ipcp.cfg.netmask = + GetIpAddr(arg->argv[arg->argn+2]); if (arg->argc > arg->argn+3) { - ipcp->cfg.TriggerAddress = GetIpAddr(arg->argv[arg->argn+3]); - ipcp->cfg.HaveTriggerAddress = 1; + ncp->ipcp.cfg.TriggerAddress = GetIpAddr(arg->argv[arg->argn+3]); + ncp->ipcp.cfg.HaveTriggerAddress = 1; } } } } /* 0.0.0.0 means any address (0 bits) */ - if (ipcp->cfg.my_range.ipaddr.s_addr == INADDR_ANY) { - ipcp->cfg.my_range.mask.s_addr = INADDR_ANY; - ipcp->cfg.my_range.width = 0; - } - ipcp->my_ip.s_addr = ipcp->cfg.my_range.ipaddr.s_addr; - bundle_AdjustFilters(arg->bundle, &ipcp->my_ip, NULL); + ncpaddr_getip4(&ncpaddr, &ncp->ipcp.my_ip); + ncprange_getaddr(&ncp->ipcp.cfg.my_range, &ncpaddr); + if (ncp->ipcp.my_ip.s_addr == INADDR_ANY) + ncprange_setwidth(&ncp->ipcp.cfg.my_range, 0); + bundle_AdjustFilters(arg->bundle, &ncpaddr, NULL); if (hisaddr && !ipcp_UseHisaddr(arg->bundle, hisaddr, arg->bundle->phys_type.all & PHYS_AUTO)) @@ -1499,7 +1516,8 @@ SetVariable(struct cmdargs const *arg) const char *argp; struct datalink *cx = arg->cx; /* LOCAL_CX uses this */ struct link *l = command_ChooseLink(arg); /* LOCAL_CX_OPT uses this */ - struct in_addr dummyaddr, *addr; + struct in_addr *ipaddr; + struct ncpaddr ncpaddr[2]; if (arg->argc > arg->argn) argp = arg->argv[arg->argn]; @@ -1929,27 +1947,30 @@ SetVariable(struct cmdargs const *arg) case VAR_NBNS: case VAR_DNS: if (param == VAR_DNS) { - addr = arg->bundle->ncp.ipcp.cfg.ns.dns; - addr[0].s_addr = addr[1].s_addr = INADDR_NONE; + ipaddr = arg->bundle->ncp.ipcp.cfg.ns.dns; + ipaddr[0].s_addr = ipaddr[1].s_addr = INADDR_NONE; } else { - addr = arg->bundle->ncp.ipcp.cfg.ns.nbns; - addr[0].s_addr = addr[1].s_addr = INADDR_ANY; + ipaddr = arg->bundle->ncp.ipcp.cfg.ns.nbns; + ipaddr[0].s_addr = ipaddr[1].s_addr = INADDR_ANY; } if (arg->argc > arg->argn) { - ParseAddr(&arg->bundle->ncp.ipcp, arg->argv[arg->argn], - addr, &dummyaddr, &dummyint); - if (arg->argc > arg->argn+1) - ParseAddr(&arg->bundle->ncp.ipcp, arg->argv[arg->argn + 1], - addr + 1, &dummyaddr, &dummyint); + ncpaddr_aton(ncpaddr, &arg->bundle->ncp, arg->argv[arg->argn]); + if (!ncpaddr_getip4(ncpaddr, ipaddr)) + return -1; + if (arg->argc > arg->argn+1) { + ncpaddr_aton(ncpaddr + 1, &arg->bundle->ncp, arg->argv[arg->argn + 1]); + if (!ncpaddr_getip4(ncpaddr + 1, ipaddr + 1)) + return -1; + } - if (addr[0].s_addr == INADDR_ANY) { - addr[0].s_addr = addr[1].s_addr; - addr[1].s_addr = INADDR_ANY; + if (ipaddr[0].s_addr == INADDR_ANY) { + ipaddr[0] = ipaddr[1]; + ipaddr[1].s_addr = INADDR_ANY; } - if (addr[0].s_addr == INADDR_NONE) { - addr[0].s_addr = addr[1].s_addr; - addr[1].s_addr = INADDR_NONE; + if (ipaddr[0].s_addr == INADDR_NONE) { + ipaddr[0] = ipaddr[1]; + ipaddr[1].s_addr = INADDR_NONE; } } break; @@ -2011,12 +2032,12 @@ SetVariable(struct cmdargs const *arg) case VAR_SENDPIPE: long_val = atol(argp); - arg->bundle->ncp.ipcp.cfg.sendpipe = long_val; + arg->bundle->ncp.cfg.sendpipe = long_val; break; case VAR_RECVPIPE: long_val = atol(argp); - arg->bundle->ncp.ipcp.cfg.recvpipe = long_val; + arg->bundle->ncp.cfg.recvpipe = long_val; break; #ifndef NORADIUS @@ -2075,45 +2096,43 @@ SetVariable(struct cmdargs const *arg) case VAR_URGENTPORTS: if (arg->argn == arg->argc) { - ipcp_SetUrgentTOS(&arg->bundle->ncp.ipcp); - ipcp_ClearUrgentTcpPorts(&arg->bundle->ncp.ipcp); - ipcp_ClearUrgentUdpPorts(&arg->bundle->ncp.ipcp); + ncp_SetUrgentTOS(&arg->bundle->ncp); + ncp_ClearUrgentTcpPorts(&arg->bundle->ncp); + ncp_ClearUrgentUdpPorts(&arg->bundle->ncp); } else if (!strcasecmp(arg->argv[arg->argn], "udp")) { - ipcp_SetUrgentTOS(&arg->bundle->ncp.ipcp); + ncp_SetUrgentTOS(&arg->bundle->ncp); if (arg->argn == arg->argc - 1) - ipcp_ClearUrgentUdpPorts(&arg->bundle->ncp.ipcp); + ncp_ClearUrgentUdpPorts(&arg->bundle->ncp); else for (f = arg->argn + 1; f < arg->argc; f++) if (*arg->argv[f] == '+') - ipcp_AddUrgentUdpPort(&arg->bundle->ncp.ipcp, atoi(arg->argv[f] + 1)); + ncp_AddUrgentUdpPort(&arg->bundle->ncp, atoi(arg->argv[f] + 1)); else if (*arg->argv[f] == '-') - ipcp_RemoveUrgentUdpPort(&arg->bundle->ncp.ipcp, - atoi(arg->argv[f] + 1)); + ncp_RemoveUrgentUdpPort(&arg->bundle->ncp, atoi(arg->argv[f] + 1)); else { if (f == arg->argn) - ipcp_ClearUrgentUdpPorts(&arg->bundle->ncp.ipcp); - ipcp_AddUrgentUdpPort(&arg->bundle->ncp.ipcp, atoi(arg->argv[f])); + ncp_ClearUrgentUdpPorts(&arg->bundle->ncp); + ncp_AddUrgentUdpPort(&arg->bundle->ncp, atoi(arg->argv[f])); } } else if (arg->argn == arg->argc - 1 && !strcasecmp(arg->argv[arg->argn], "none")) { - ipcp_ClearUrgentTcpPorts(&arg->bundle->ncp.ipcp); - ipcp_ClearUrgentUdpPorts(&arg->bundle->ncp.ipcp); - ipcp_ClearUrgentTOS(&arg->bundle->ncp.ipcp); + ncp_ClearUrgentTcpPorts(&arg->bundle->ncp); + ncp_ClearUrgentUdpPorts(&arg->bundle->ncp); + ncp_ClearUrgentTOS(&arg->bundle->ncp); } else { - ipcp_SetUrgentTOS(&arg->bundle->ncp.ipcp); + ncp_SetUrgentTOS(&arg->bundle->ncp); first = arg->argn; if (!strcasecmp(arg->argv[first], "tcp") && ++first == arg->argc) - ipcp_ClearUrgentTcpPorts(&arg->bundle->ncp.ipcp); + ncp_ClearUrgentTcpPorts(&arg->bundle->ncp); for (f = first; f < arg->argc; f++) if (*arg->argv[f] == '+') - ipcp_AddUrgentTcpPort(&arg->bundle->ncp.ipcp, atoi(arg->argv[f] + 1)); + ncp_AddUrgentTcpPort(&arg->bundle->ncp, atoi(arg->argv[f] + 1)); else if (*arg->argv[f] == '-') - ipcp_RemoveUrgentTcpPort(&arg->bundle->ncp.ipcp, - atoi(arg->argv[f] + 1)); + ncp_RemoveUrgentTcpPort(&arg->bundle->ncp, atoi(arg->argv[f] + 1)); else { if (f == first) - ipcp_ClearUrgentTcpPorts(&arg->bundle->ncp.ipcp); - ipcp_AddUrgentTcpPort(&arg->bundle->ncp.ipcp, atoi(arg->argv[f])); + ncp_ClearUrgentTcpPorts(&arg->bundle->ncp); + ncp_AddUrgentTcpPort(&arg->bundle->ncp, atoi(arg->argv[f])); } } break; @@ -2173,7 +2192,7 @@ static struct cmdtab const SetCommands[] = { "escape characters", "set escape hex-digit ..."}, {"filter", NULL, filter_Set, LOCAL_AUTH, "packet filters", "set filter alive|dial|in|out rule-no permit|deny " - "[src_addr[/width]] [dst_addr[/width]] [tcp|udp|icmp|ospf|igmp " + "[src_addr[/width]] [dst_addr[/width]] [proto " "[src [lt|eq|gt port]] [dst [lt|eq|gt port]] [estab] [syn] [finrst]]"}, {"hangup", NULL, SetVariable, LOCAL_AUTH | LOCAL_CX, "hangup script", "set hangup chat-script", (const void *) VAR_HANGUP}, @@ -2261,73 +2280,84 @@ SetCommand(struct cmdargs const *arg) static int AddCommand(struct cmdargs const *arg) { - struct in_addr dest, gateway, netmask; - int gw, addrs; + struct ncpaddr gw; + struct ncprange dest; + struct in_addr host; + int dest_default, gw_arg, addrs; if (arg->argc != arg->argn+3 && arg->argc != arg->argn+2) return -1; addrs = 0; - if (arg->argc == arg->argn+2) { + dest_default = 0; + if (arg->argc == arg->argn + 2) { if (!strcasecmp(arg->argv[arg->argn], "default")) - dest.s_addr = netmask.s_addr = INADDR_ANY; + dest_default = 1; else { - int width; - - if (!ParseAddr(&arg->bundle->ncp.ipcp, arg->argv[arg->argn], - &dest, &netmask, &width)) + if (!ncprange_aton(&dest, &arg->bundle->ncp, arg->argv[arg->argn])) return -1; if (!strncasecmp(arg->argv[arg->argn], "MYADDR", 6)) addrs = ROUTE_DSTMYADDR; + else if (!strncasecmp(arg->argv[arg->argn], "MYADDR6", 7)) + addrs = ROUTE_DSTMYADDR6; else if (!strncasecmp(arg->argv[arg->argn], "HISADDR", 7)) addrs = ROUTE_DSTHISADDR; + else if (!strncasecmp(arg->argv[arg->argn], "HISADDR6", 8)) + addrs = ROUTE_DSTHISADDR6; else if (!strncasecmp(arg->argv[arg->argn], "DNS0", 4)) addrs = ROUTE_DSTDNS0; else if (!strncasecmp(arg->argv[arg->argn], "DNS1", 4)) addrs = ROUTE_DSTDNS1; } - gw = 1; + gw_arg = 1; } else { if (strcasecmp(arg->argv[arg->argn], "MYADDR") == 0) { addrs = ROUTE_DSTMYADDR; - dest = arg->bundle->ncp.ipcp.my_ip; + host = arg->bundle->ncp.ipcp.my_ip; } else if (strcasecmp(arg->argv[arg->argn], "HISADDR") == 0) { addrs = ROUTE_DSTHISADDR; - dest = arg->bundle->ncp.ipcp.peer_ip; + host = arg->bundle->ncp.ipcp.peer_ip; } else if (strcasecmp(arg->argv[arg->argn], "DNS0") == 0) { addrs = ROUTE_DSTDNS0; - dest = arg->bundle->ncp.ipcp.ns.dns[0]; + host = arg->bundle->ncp.ipcp.ns.dns[0]; } else if (strcasecmp(arg->argv[arg->argn], "DNS1") == 0) { addrs = ROUTE_DSTDNS1; - dest = arg->bundle->ncp.ipcp.ns.dns[1]; + host = arg->bundle->ncp.ipcp.ns.dns[1]; } else { - dest = GetIpAddr(arg->argv[arg->argn]); - if (dest.s_addr == INADDR_NONE) { + host = GetIpAddr(arg->argv[arg->argn]); + if (host.s_addr == INADDR_NONE) { log_Printf(LogWARN, "%s: Invalid destination address\n", arg->argv[arg->argn]); return -1; } } - netmask = GetIpAddr(arg->argv[arg->argn+1]); - gw = 2; + ncprange_setip4(&dest, host, GetIpAddr(arg->argv[arg->argn + 1])); + gw_arg = 2; } - if (strcasecmp(arg->argv[arg->argn+gw], "HISADDR") == 0) { - gateway = arg->bundle->ncp.ipcp.peer_ip; + if (strcasecmp(arg->argv[arg->argn + gw_arg], "HISADDR") == 0) { + ncpaddr_setip4(&gw, arg->bundle->ncp.ipcp.peer_ip); addrs |= ROUTE_GWHISADDR; +#ifndef NOINET6 + } else if (strcasecmp(arg->argv[arg->argn + gw_arg], "HISADDR6") == 0) { + ncpaddr_copy(&gw, &arg->bundle->ncp.ipv6cp.hisaddr); + addrs |= ROUTE_GWHISADDR6; +#endif } else { - gateway = GetIpAddr(arg->argv[arg->argn+gw]); - if (gateway.s_addr == INADDR_NONE) { + if (!ncpaddr_aton(&gw, &arg->bundle->ncp, arg->argv[arg->argn + gw_arg])) { log_Printf(LogWARN, "%s: Invalid gateway address\n", - arg->argv[arg->argn + gw]); + arg->argv[arg->argn + gw_arg]); return -1; } } - if (rt_Set(arg->bundle, RTM_ADD, dest, gateway, netmask, - arg->cmd->args ? 1 : 0, (addrs & ROUTE_GWHISADDR) ? 1 : 0) + if (dest_default) + ncprange_setdefault(&dest, ncpaddr_family(&gw)); + + if (rt_Set(arg->bundle, RTM_ADD, &dest, &gw, arg->cmd->args ? 1 : 0, + ((addrs & ROUTE_GWHISADDR) || (addrs & ROUTE_GWHISADDR6)) ? 1 : 0) && addrs != ROUTE_STATIC) - route_Add(&arg->bundle->ncp.ipcp.route, addrs, dest, netmask, gateway); + route_Add(&arg->bundle->ncp.route, addrs, &dest, &gw); return 0; } @@ -2335,39 +2365,43 @@ AddCommand(struct cmdargs const *arg) static int DeleteCommand(struct cmdargs const *arg) { - struct in_addr dest, none; + struct ncprange dest; int addrs; if (arg->argc == arg->argn+1) { if(strcasecmp(arg->argv[arg->argn], "all") == 0) { route_IfDelete(arg->bundle, 0); - route_DeleteAll(&arg->bundle->ncp.ipcp.route); + route_DeleteAll(&arg->bundle->ncp.route); } else { addrs = 0; if (strcasecmp(arg->argv[arg->argn], "MYADDR") == 0) { - dest = arg->bundle->ncp.ipcp.my_ip; + ncprange_setip4host(&dest, arg->bundle->ncp.ipcp.my_ip); addrs = ROUTE_DSTMYADDR; +#ifndef NOINET6 + } else if (strcasecmp(arg->argv[arg->argn], "MYADDR6") == 0) { + ncprange_sethost(&dest, &arg->bundle->ncp.ipv6cp.myaddr); + addrs = ROUTE_DSTMYADDR6; +#endif } else if (strcasecmp(arg->argv[arg->argn], "HISADDR") == 0) { - dest = arg->bundle->ncp.ipcp.peer_ip; + ncprange_setip4host(&dest, arg->bundle->ncp.ipcp.peer_ip); addrs = ROUTE_DSTHISADDR; +#ifndef NOINET6 + } else if (strcasecmp(arg->argv[arg->argn], "HISADDR6") == 0) { + ncprange_sethost(&dest, &arg->bundle->ncp.ipv6cp.hisaddr); + addrs = ROUTE_DSTHISADDR6; +#endif } else if (strcasecmp(arg->argv[arg->argn], "DNS0") == 0) { - dest = arg->bundle->ncp.ipcp.ns.dns[0]; + ncprange_setip4host(&dest, arg->bundle->ncp.ipcp.ns.dns[0]); addrs = ROUTE_DSTDNS0; } else if (strcasecmp(arg->argv[arg->argn], "DNS1") == 0) { - dest = arg->bundle->ncp.ipcp.ns.dns[1]; + ncprange_setip4host(&dest, arg->bundle->ncp.ipcp.ns.dns[1]); addrs = ROUTE_DSTDNS1; } else { - dest = GetIpAddr(arg->argv[arg->argn]); - if (dest.s_addr == INADDR_NONE) { - log_Printf(LogWARN, "%s: Invalid IP address\n", arg->argv[arg->argn]); - return -1; - } + ncprange_aton(&dest, &arg->bundle->ncp, arg->argv[arg->argn]); addrs = ROUTE_STATIC; } - none.s_addr = INADDR_ANY; - rt_Set(arg->bundle, RTM_DELETE, dest, none, none, - arg->cmd->args ? 1 : 0, 0); - route_Delete(&arg->bundle->ncp.ipcp.route, addrs, dest); + rt_Set(arg->bundle, RTM_DELETE, &dest, NULL, arg->cmd->args ? 1 : 0, 0); + route_Delete(&arg->bundle->ncp.route, addrs, &dest); } } else return -1; @@ -2685,6 +2719,12 @@ static struct cmdtab const NegotiateCommands[] = { {"iface-alias", NULL, IfaceAliasOptSet, LOCAL_AUTH, "retain interface addresses", "disable|enable", (const void *)OPT_IFACEALIAS}, +#ifndef NOINET6 + {"ipcp", NULL, OptSet, LOCAL_AUTH, "IP Network Control Protocol", + "disable|enable", (const void *)OPT_IPCP}, + {"ipv6cp", NULL, OptSet, LOCAL_AUTH, "IPv6 Network Control Protocol", + "disable|enable", (const void *)OPT_IPV6CP}, +#endif {"keep-session", NULL, OptSet, LOCAL_AUTH, "Retain device session leader", "disable|enable", (const void *)OPT_KEEPSESSION}, {"loopback", NULL, OptSet, LOCAL_AUTH, "Loop packets for local iface", @@ -2704,7 +2744,11 @@ static struct cmdtab const NegotiateCommands[] = { {"utmp", NULL, OptSet, LOCAL_AUTH, "Log connections in utmp", "disable|enable", (const void *)OPT_UTMP}, -#define OPT_MAX 11 /* accept/deny allowed below and not above */ +#ifndef NOINET6 +#define OPT_MAX 13 /* accept/deny allowed below and not above */ +#else +#define OPT_MAX 11 +#endif {"acfcomp", NULL, NegotiateSet, LOCAL_AUTH | LOCAL_CX, "Address & Control field compression", "accept|deny|disable|enable", @@ -2819,6 +2863,10 @@ ClearCommand(struct cmdargs const *arg) t = &cx->physical->link.stats.total; } else if (strcasecmp(arg->argv[arg->argn], "ipcp") == 0) t = &arg->bundle->ncp.ipcp.throughput; +#ifndef NOINET6 + else if (strcasecmp(arg->argv[arg->argn], "ipv6cp") == 0) + t = &arg->bundle->ncp.ipv6cp.throughput; +#endif else return -1; @@ -2870,65 +2918,84 @@ RunListCommand(struct cmdargs const *arg) static int IfaceAddCommand(struct cmdargs const *arg) { - int bits, n, how; - struct in_addr ifa, mask, brd; + struct ncpaddr peer, addr; + struct ncprange ifa; + struct in_addr mask; + int n, how; if (arg->argc == arg->argn + 1) { - if (!ParseAddr(NULL, arg->argv[arg->argn], &ifa, NULL, NULL)) + if (!ncprange_aton(&ifa, NULL, arg->argv[arg->argn])) return -1; - mask.s_addr = brd.s_addr = INADDR_BROADCAST; + ncpaddr_init(&peer); } else { if (arg->argc == arg->argn + 2) { - if (!ParseAddr(NULL, arg->argv[arg->argn], &ifa, &mask, &bits)) + if (!ncprange_aton(&ifa, NULL, arg->argv[arg->argn])) return -1; n = 1; } else if (arg->argc == arg->argn + 3) { - if (!ParseAddr(NULL, arg->argv[arg->argn], &ifa, NULL, NULL)) + if (!ncpaddr_aton(&addr, NULL, arg->argv[arg->argn])) return -1; - if (!ParseAddr(NULL, arg->argv[arg->argn + 1], &mask, NULL, NULL)) + if (ncpaddr_family(&addr) != AF_INET) + return -1; + ncprange_sethost(&ifa, &addr); + if (!ncpaddr_aton(&addr, NULL, arg->argv[arg->argn + 1])) + return -1; + if (!ncpaddr_getip4(&addr, &mask)) + return -1; + if (!ncprange_setip4mask(&ifa, mask)) return -1; n = 2; } else return -1; - if (!ParseAddr(NULL, arg->argv[arg->argn + n], &brd, NULL, NULL)) + if (!ncpaddr_aton(&peer, NULL, arg->argv[arg->argn + n])) return -1; + + if (ncprange_family(&ifa) != ncpaddr_family(&peer)) { + log_Printf(LogWARN, "IfaceAddCommand: src and dst address families" + " differ\n"); + return -1; + } } how = IFACE_ADD_LAST; if (arg->cmd->args) how |= IFACE_FORCE_ADD; - return !iface_inAdd(arg->bundle->iface, ifa, mask, brd, how); + return !iface_Add(arg->bundle->iface, &arg->bundle->ncp, &ifa, &peer, how); } static int IfaceDeleteCommand(struct cmdargs const *arg) { - struct in_addr ifa; + struct ncpaddr ifa; + struct in_addr ifa4; int ok; if (arg->argc != arg->argn + 1) return -1; - if (!ParseAddr(NULL, arg->argv[arg->argn], &ifa, NULL, NULL)) + if (!ncpaddr_aton(&ifa, NULL, arg->argv[arg->argn])) return -1; if (arg->bundle->ncp.ipcp.fsm.state == ST_OPENED && - arg->bundle->ncp.ipcp.my_ip.s_addr == ifa.s_addr) { + ncpaddr_getip4(&ifa, &ifa4) && + arg->bundle->ncp.ipcp.my_ip.s_addr == ifa4.s_addr) { log_Printf(LogWARN, "%s: Cannot remove active interface address\n", - inet_ntoa(ifa)); + ncpaddr_ntoa(&ifa)); return 1; } - ok = iface_inDelete(arg->bundle->iface, ifa); + ok = iface_Delete(arg->bundle->iface, &arg->bundle->ncp, &ifa); if (!ok) { if (arg->cmd->args) ok = 1; else if (arg->prompt) - prompt_Printf(arg->prompt, "%s: No such address\n", inet_ntoa(ifa)); + prompt_Printf(arg->prompt, "%s: No such interface address\n", + ncpaddr_ntoa(&ifa)); else - log_Printf(LogWARN, "%s: No such address\n", inet_ntoa(ifa)); + log_Printf(LogWARN, "%s: No such interface address\n", + ncpaddr_ntoa(&ifa)); } return !ok; @@ -2937,15 +3004,25 @@ IfaceDeleteCommand(struct cmdargs const *arg) static int IfaceClearCommand(struct cmdargs const *arg) { - int how; + int family, how; - if (arg->argc != arg->argn) + family = 0; + if (arg->argc == arg->argn + 1) { + if (strcasecmp(arg->argv[arg->argn], "inet") == 0) + family = AF_INET; +#ifndef NOINET6 + else if (strcasecmp(arg->argv[arg->argn], "inet6") == 0) + family = AF_INET6; +#endif + else + return -1; + } else if (arg->argc != arg->argn) return -1; how = arg->bundle->ncp.ipcp.fsm.state == ST_OPENED || arg->bundle->phys_type.all & PHYS_AUTO ? IFACE_CLEAR_ALIASES : IFACE_CLEAR_ALL; - iface_Clear(arg->bundle->iface, how); + iface_Clear(arg->bundle->iface, &arg->bundle->ncp, family, how); return 0; } |
