MFC r270348:

Add some missing checks for unsupported interfaces (e.g. pflog(4)) when
handling ioctls. While here, remove duplicated checks for a NULL ifp in
in6_control(): this check is already done near the beginning of the
function.

MFC r270349:
Suppress warnings when retrieving protocol stats from interfaces that
don't support IPv6 (e.g. pflog(4)).

PR:		189117
Approved by:	re (gjb)
This commit is contained in:
markj 2014-09-06 04:39:26 +00:00
parent 27eceb3a0f
commit 5a094736fb
4 changed files with 47 additions and 26 deletions

View File

@ -293,7 +293,7 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
return (mrt6_ioctl ? mrt6_ioctl(cmd, data) : EOPNOTSUPP);
}
switch(cmd) {
switch (cmd) {
case SIOCAADDRCTL_POLICY:
case SIOCDADDRCTL_POLICY:
if (td != NULL) {
@ -365,14 +365,10 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
if (error)
return (error);
}
return (scope6_set(ifp,
(struct scope6_id *)ifr->ifr_ifru.ifru_scope_id));
/* FALLTHROUGH */
case SIOCGSCOPE6:
return (scope6_get(ifp,
(struct scope6_id *)ifr->ifr_ifru.ifru_scope_id));
case SIOCGSCOPE6DEF:
return (scope6_get_default((struct scope6_id *)
ifr->ifr_ifru.ifru_scope_id));
return (scope6_ioctl(cmd, data, ifp));
}
switch (cmd) {
@ -503,6 +499,13 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
if (error)
goto out;
}
/* FALLTHROUGH */
case SIOCGIFSTAT_IN6:
case SIOCGIFSTAT_ICMP6:
if (ifp->if_afdata[AF_INET6] == NULL) {
error = EPFNOSUPPORT;
goto out;
}
break;
case SIOCGIFADDR_IN6:
@ -578,10 +581,6 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
break;
case SIOCGIFSTAT_IN6:
if (ifp == NULL) {
error = EINVAL;
goto out;
}
COUNTER_ARRAY_COPY(((struct in6_ifextra *)
ifp->if_afdata[AF_INET6])->in6_ifstat,
&ifr->ifr_ifru.ifru_stat,
@ -589,10 +588,6 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
break;
case SIOCGIFSTAT_ICMP6:
if (ifp == NULL) {
error = EINVAL;
goto out;
}
COUNTER_ARRAY_COPY(((struct in6_ifextra *)
ifp->if_afdata[AF_INET6])->icmp6_ifstat,
&ifr->ifr_ifru.ifru_icmp6stat,
@ -825,7 +820,7 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
}
default:
if (ifp == NULL || ifp->if_ioctl == 0) {
if (ifp->if_ioctl == NULL) {
error = EOPNOTSUPP;
goto out;
}

View File

@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <sys/systm.h>
#include <sys/queue.h>
#include <sys/sysctl.h>
@ -78,6 +79,9 @@ static VNET_DEFINE(struct scope6_id, sid_default);
#define SID(ifp) \
(((struct in6_ifextra *)(ifp)->if_afdata[AF_INET6])->scope6_id)
static int scope6_get(struct ifnet *, struct scope6_id *);
static int scope6_set(struct ifnet *, struct scope6_id *);
void
scope6_init(void)
{
@ -121,6 +125,30 @@ scope6_ifdetach(struct scope6_id *sid)
}
int
scope6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp)
{
struct in6_ifreq *ifr;
if (ifp->if_afdata[AF_INET6] == NULL)
return (EPFNOSUPPORT);
ifr = (struct in6_ifreq *)data;
switch (cmd) {
case SIOCSSCOPE6:
return (scope6_set(ifp,
(struct scope6_id *)ifr->ifr_ifru.ifru_scope_id));
case SIOCGSCOPE6:
return (scope6_get(ifp,
(struct scope6_id *)ifr->ifr_ifru.ifru_scope_id));
case SIOCGSCOPE6DEF:
return (scope6_get_default(
(struct scope6_id *)ifr->ifr_ifru.ifru_scope_id));
default:
return (EOPNOTSUPP);
}
}
static int
scope6_set(struct ifnet *ifp, struct scope6_id *idlist)
{
int i;
@ -183,7 +211,7 @@ scope6_set(struct ifnet *ifp, struct scope6_id *idlist)
return (error);
}
int
static int
scope6_get(struct ifnet *ifp, struct scope6_id *idlist)
{
struct scope6_id *sid;
@ -202,7 +230,6 @@ scope6_get(struct ifnet *ifp, struct scope6_id *idlist)
return (0);
}
/*
* Get a scope of the address. Node-local, link-local, site-local or global.
*/

View File

@ -50,8 +50,7 @@ VNET_DECLARE(int, deembed_scopeid);
void scope6_init(void);
struct scope6_id *scope6_ifattach(struct ifnet *);
void scope6_ifdetach(struct scope6_id *);
int scope6_set(struct ifnet *, struct scope6_id *);
int scope6_get(struct ifnet *, struct scope6_id *);
int scope6_ioctl(u_long cmd, caddr_t data, struct ifnet *);
void scope6_setdefault(struct ifnet *);
int scope6_get_default(struct scope6_id *);
u_int32_t scope6_addr2default(struct in6_addr *);

View File

@ -540,13 +540,13 @@ ip6_ifstats(char *ifname)
}
strcpy(ifr.ifr_name, ifname);
printf("ip6 on %s:\n", ifr.ifr_name);
if (ioctl(s, SIOCGIFSTAT_IN6, (char *)&ifr) < 0) {
perror("Warning: ioctl(SIOCGIFSTAT_IN6)");
if (errno != EPFNOSUPPORT)
perror("Warning: ioctl(SIOCGIFSTAT_IN6)");
goto end;
}
printf("ip6 on %s:\n", ifr.ifr_name);
p(ifs6_in_receive, "\t%ju total input datagram%s\n");
p(ifs6_in_hdrerr, "\t%ju datagram%s with invalid header received\n");
p(ifs6_in_toobig, "\t%ju datagram%s exceeded MTU received\n");
@ -945,13 +945,13 @@ icmp6_ifstats(char *ifname)
}
strcpy(ifr.ifr_name, ifname);
printf("icmp6 on %s:\n", ifr.ifr_name);
if (ioctl(s, SIOCGIFSTAT_ICMP6, (char *)&ifr) < 0) {
perror("Warning: ioctl(SIOCGIFSTAT_ICMP6)");
if (errno != EPFNOSUPPORT)
perror("Warning: ioctl(SIOCGIFSTAT_ICMP6)");
goto end;
}
printf("icmp6 on %s:\n", ifr.ifr_name);
p(ifs6_in_msg, "\t%ju total input message%s\n");
p(ifs6_in_error, "\t%ju total input error message%s\n");
p(ifs6_in_dstunreach, "\t%ju input destination unreachable error%s\n");