Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/net Modify the BRDGGIFS and BRDGRTS cmds to be more COMP...



details:   https://anonhg.NetBSD.org/src/rev/e9fcd33480b7
branches:  trunk
changeset: 338613:e9fcd33480b7
user:      matt <matt%NetBSD.org@localhost>
date:      Mon Jun 01 06:14:43 2015 +0000

description:
Modify the BRDGGIFS and BRDGRTS cmds to be more COMPAT_NETBSD32 friendly.
(XXX whitespace)

diffstat:

 sys/net/if_bridge.c    |  41 ++++++++++++++++++++++++++++-------------
 sys/net/if_bridgevar.h |  12 +++++++-----
 2 files changed, 35 insertions(+), 18 deletions(-)

diffs (166 lines):

diff -r 963e1914f7c8 -r e9fcd33480b7 sys/net/if_bridge.c
--- a/sys/net/if_bridge.c       Mon Jun 01 01:36:30 2015 +0000
+++ b/sys/net/if_bridge.c       Mon Jun 01 06:14:43 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_bridge.c,v 1.98 2015/04/16 08:54:15 ozaki-r Exp $   */
+/*     $NetBSD: if_bridge.c,v 1.99 2015/06/01 06:14:43 matt Exp $      */
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.98 2015/04/16 08:54:15 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.99 2015/06/01 06:14:43 matt Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_bridge_ipf.h"
@@ -143,6 +143,10 @@
 #include <netinet/ip_carp.h>
 #endif
 
+__CTASSERT(sizeof(struct ifbifconf) == sizeof(struct ifbaconf));
+__CTASSERT(offsetof(struct ifbifconf, ifbic_len) == offsetof(struct ifbaconf, ifbac_len));
+__CTASSERT(offsetof(struct ifbifconf, ifbic_buf) == offsetof(struct ifbaconf, ifbac_buf));
+
 /*
  * Maximum number of addresses to cache.
  */
@@ -306,6 +310,8 @@
 #define        BC_F_COPYIN             0x01    /* copy arguments in */
 #define        BC_F_COPYOUT            0x02    /* copy arguments out */
 #define        BC_F_SUSER              0x04    /* do super-user check */
+#define BC_F_XLATEIN           0x08    /* xlate arguments in */
+#define BC_F_XLATEOUT          0x10    /* xlate arguments out */
 
 static const struct bridge_control bridge_control_table[] = {
 [BRDGADD] = {bridge_ioctl_add, sizeof(struct ifbreq), BC_F_COPYIN|BC_F_SUSER},
@@ -317,8 +323,8 @@
 [BRDGSCACHE] = {bridge_ioctl_scache, sizeof(struct ifbrparam), BC_F_COPYIN|BC_F_SUSER}, 
 [BRDGGCACHE] = {bridge_ioctl_gcache, sizeof(struct ifbrparam), BC_F_COPYOUT}, 
 
-[BRDGGIFS] = {bridge_ioctl_gifs, sizeof(struct ifbifconf), BC_F_COPYIN|BC_F_COPYOUT}, 
-[BRDGRTS] = {bridge_ioctl_rts, sizeof(struct ifbaconf), BC_F_COPYIN|BC_F_COPYOUT}, 
+[OBRDGGIFS] = {bridge_ioctl_gifs, sizeof(struct ifbifconf), BC_F_COPYIN|BC_F_COPYOUT}, 
+[OBRDGRTS] = {bridge_ioctl_rts, sizeof(struct ifbaconf), BC_F_COPYIN|BC_F_COPYOUT}, 
 
 [BRDGSADDR] = {bridge_ioctl_saddr, sizeof(struct ifbareq), BC_F_COPYIN|BC_F_SUSER}, 
 
@@ -348,7 +354,10 @@
 [BRDGGFILT] = {bridge_ioctl_gfilt, sizeof(struct ifbrparam), BC_F_COPYOUT},
 [BRDGSFILT] = {bridge_ioctl_sfilt, sizeof(struct ifbrparam), BC_F_COPYIN|BC_F_SUSER},
 #endif /* BRIDGE_IPF */
+[BRDGGIFS] = {bridge_ioctl_gifs, sizeof(struct ifbifconf), BC_F_XLATEIN|BC_F_XLATEOUT},
+[BRDGRTS] = {bridge_ioctl_rts, sizeof(struct ifbaconf), BC_F_XLATEIN|BC_F_XLATEOUT},
 };
+
 static const int bridge_control_table_size = __arraycount(bridge_control_table);
 
 static LIST_HEAD(, bridge_softc) bridge_list;
@@ -621,13 +630,12 @@
        switch (cmd) {
        case SIOCGDRVSPEC:
        case SIOCSDRVSPEC:
-               if (ifd->ifd_cmd >= bridge_control_table_size) {
+               if (ifd->ifd_cmd >= bridge_control_table_size
+                   || (bc = &bridge_control_table[ifd->ifd_cmd]) == NULL) {
                        error = EINVAL;
                        return error;
                }
 
-               bc = &bridge_control_table[ifd->ifd_cmd];
-
                /* We only care about BC_F_SUSER at this point. */
                if ((bc->bc_flags & BC_F_SUSER) == 0)
                        break;
@@ -651,20 +659,21 @@
        case SIOCSDRVSPEC:
                KASSERT(bc != NULL);
                if (cmd == SIOCGDRVSPEC &&
-                   (bc->bc_flags & BC_F_COPYOUT) == 0) {
+                   (bc->bc_flags & (BC_F_COPYOUT|BC_F_XLATEOUT)) == 0) {
                        error = EINVAL;
                        break;
                }
                else if (cmd == SIOCSDRVSPEC &&
-                   (bc->bc_flags & BC_F_COPYOUT) != 0) {
+                   (bc->bc_flags & (BC_F_COPYOUT|BC_F_XLATEOUT)) != 0) {
                        error = EINVAL;
                        break;
                }
 
                /* BC_F_SUSER is checked above, before splnet(). */
 
-               if (ifd->ifd_len != bc->bc_argsize ||
-                   ifd->ifd_len > sizeof(args)) {
+               if ((bc->bc_flags & (BC_F_XLATEIN|BC_F_XLATEOUT)) == 0
+                   && (ifd->ifd_len != bc->bc_argsize
+                       || ifd->ifd_len > sizeof(args))) {
                        error = EINVAL;
                        break;
                }
@@ -674,15 +683,21 @@
                        error = copyin(ifd->ifd_data, &args, ifd->ifd_len);
                        if (error)
                                break;
+               } else if (bc->bc_flags & BC_F_XLATEIN) {
+                       args.ifbifconf.ifbic_len = ifd->ifd_len;
+                       args.ifbifconf.ifbic_buf = ifd->ifd_data;
                }
 
                error = (*bc->bc_func)(sc, &args);
                if (error)
                        break;
 
-               if (bc->bc_flags & BC_F_COPYOUT)
+               if (bc->bc_flags & BC_F_COPYOUT) {
                        error = copyout(&args, ifd->ifd_data, ifd->ifd_len);
-
+               } else if (bc->bc_flags & BC_F_XLATEOUT) {
+                       ifd->ifd_len = args.ifbifconf.ifbic_len;
+                       ifd->ifd_data = args.ifbifconf.ifbic_buf;
+               }
                break;
 
        case SIOCSIFFLAGS:
diff -r 963e1914f7c8 -r e9fcd33480b7 sys/net/if_bridgevar.h
--- a/sys/net/if_bridgevar.h    Mon Jun 01 01:36:30 2015 +0000
+++ b/sys/net/if_bridgevar.h    Mon Jun 01 06:14:43 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_bridgevar.h,v 1.23 2015/01/16 10:36:14 ozaki-r Exp $        */
+/*     $NetBSD: if_bridgevar.h,v 1.24 2015/06/01 06:14:43 matt Exp $   */
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -90,8 +90,8 @@
 #define        BRDGSIFFLGS             3       /* set member if flags (ifbreq) */
 #define        BRDGSCACHE              4       /* set cache size (ifbrparam) */
 #define        BRDGGCACHE              5       /* get cache size (ifbrparam) */
-#define        BRDGGIFS                6       /* get member list (ifbifconf) */
-#define        BRDGRTS                 7       /* get address list (ifbaconf) */
+#define        OBRDGGIFS               6       /* get member list (ifbifconf) */
+#define        OBRDGRTS                7       /* get address list (ifbaconf) */
 #define        BRDGSADDR               8       /* set static address (ifbareq) */
 #define        BRDGSTO                 9       /* set cache timeout (ifbrparam) */
 #define        BRDGGTO                 10      /* get cache timeout (ifbrparam) */
@@ -111,6 +111,9 @@
 #define BRDGGFILT              23      /* get filter flags (ifbrparam) */
 #define BRDGSFILT              24      /* set filter flags (ifbrparam) */
 
+#define        BRDGGIFS                25      /* get member list */
+#define        BRDGRTS                 26      /* get address list */
+
 /*
  * Generic bridge control request.
  */
@@ -163,8 +166,7 @@
  */
 struct ifbareq {
        char            ifba_ifsname[IFNAMSIZ]; /* member if name */
-       /*XXX: time_t */
-       long            ifba_expire;            /* address expire time */
+       time_t          ifba_expire;            /* address expire time */
        uint8_t         ifba_flags;             /* address flags */
        uint8_t         ifba_dst[ETHER_ADDR_LEN];/* destination address */
 };



Home | Main Index | Thread Index | Old Index