aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/ppp/command.c
diff options
context:
space:
mode:
authorBrian Somers <brian@FreeBSD.org>2001-08-14 16:05:52 +0000
committerBrian Somers <brian@FreeBSD.org>2001-08-14 16:05:52 +0000
commit30949fd4b52d91188c23cb2ca0d130d89bb1678c (patch)
treeb09d46345a558a45e66b435c4386d76cf53405d3 /usr.sbin/ppp/command.c
parent135047c346cac167948b8cbbe9529d74ef0b7dad (diff)
Notes
Diffstat (limited to 'usr.sbin/ppp/command.c')
-rw-r--r--usr.sbin/ppp/command.c317
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;
}