Author: markj
Date: Sat Sep  6 04:39:26 2014
New Revision: 271185
URL: http://svnweb.freebsd.org/changeset/base/271185

Log:
  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)

Modified:
  stable/10/sys/netinet6/in6.c
  stable/10/sys/netinet6/scope6.c
  stable/10/sys/netinet6/scope6_var.h
  stable/10/usr.bin/netstat/inet6.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/netinet6/in6.c
==============================================================================
--- stable/10/sys/netinet6/in6.c        Sat Sep  6 04:33:37 2014        
(r271184)
+++ stable/10/sys/netinet6/in6.c        Sat Sep  6 04:39:26 2014        
(r271185)
@@ -293,7 +293,7 @@ in6_control(struct socket *so, u_long cm
                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 cm
                        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 cm
                        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 cm
                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 cm
                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 cm
        }
 
        default:
-               if (ifp == NULL || ifp->if_ioctl == 0) {
+               if (ifp->if_ioctl == NULL) {
                        error = EOPNOTSUPP;
                        goto out;
                }

Modified: stable/10/sys/netinet6/scope6.c
==============================================================================
--- stable/10/sys/netinet6/scope6.c     Sat Sep  6 04:33:37 2014        
(r271184)
+++ stable/10/sys/netinet6/scope6.c     Sat Sep  6 04:39:26 2014        
(r271185)
@@ -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
 #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 sco
        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 sco
        return (0);
 }
 
-
 /*
  * Get a scope of the address. Node-local, link-local, site-local or global.
  */

Modified: stable/10/sys/netinet6/scope6_var.h
==============================================================================
--- stable/10/sys/netinet6/scope6_var.h Sat Sep  6 04:33:37 2014        
(r271184)
+++ stable/10/sys/netinet6/scope6_var.h Sat Sep  6 04:39:26 2014        
(r271185)
@@ -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 *);

Modified: stable/10/usr.bin/netstat/inet6.c
==============================================================================
--- stable/10/usr.bin/netstat/inet6.c   Sat Sep  6 04:33:37 2014        
(r271184)
+++ stable/10/usr.bin/netstat/inet6.c   Sat Sep  6 04:39:26 2014        
(r271185)
@@ -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");
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to