summaryrefslogtreecommitdiffstats
path: root/sys/compat/ndis/kern_ndis.c
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2014-10-21 07:31:21 +0000
committerhselasky <hselasky@FreeBSD.org>2014-10-21 07:31:21 +0000
commit49c137f7be5791eee8102395257cdf48b40c81f7 (patch)
treeee67959a46304c59df434799575e3820a2cc841f /sys/compat/ndis/kern_ndis.c
parentfef9d98869a5c15698b0511d8ff1044b517f1e8f (diff)
downloadFreeBSD-src-49c137f7be5791eee8102395257cdf48b40c81f7.zip
FreeBSD-src-49c137f7be5791eee8102395257cdf48b40c81f7.tar.gz
Fix multiple incorrect SYSCTL arguments in the kernel:
- Wrong integer type was specified. - Wrong or missing "access" specifier. The "access" specifier sometimes included the SYSCTL type, which it should not, except for procedural SYSCTL nodes. - Logical OR where binary OR was expected. - Properly assert the "access" argument passed to all SYSCTL macros, using the CTASSERT macro. This applies to both static- and dynamically created SYSCTLs. - Properly assert the the data type for both static and dynamic SYSCTLs. In the case of static SYSCTLs we only assert that the data pointed to by the SYSCTL data pointer has the correct size, hence there is no easy way to assert types in the C language outside a C-function. - Rewrote some code which doesn't pass a constant "access" specifier when creating dynamic SYSCTL nodes, which is now a requirement. - Updated "EXAMPLES" section in SYSCTL manual page. MFC after: 3 days Sponsored by: Mellanox Technologies
Diffstat (limited to 'sys/compat/ndis/kern_ndis.c')
-rw-r--r--sys/compat/ndis/kern_ndis.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/sys/compat/ndis/kern_ndis.c b/sys/compat/ndis/kern_ndis.c
index 21e010f..2ad1683 100644
--- a/sys/compat/ndis/kern_ndis.c
+++ b/sys/compat/ndis/kern_ndis.c
@@ -79,6 +79,7 @@ __FBSDID("$FreeBSD$");
#include <dev/if_ndis/if_ndisvar.h>
#define NDIS_DUMMY_PATH "\\\\some\\bogus\\path"
+#define NDIS_FLAG_RDONLY 1
static void ndis_status_func(ndis_handle, ndis_status, void *, uint32_t);
static void ndis_statusdone_func(ndis_handle);
@@ -326,48 +327,48 @@ ndis_create_sysctls(arg)
* We qualify as the latter.
*/
ndis_add_sysctl(sc, "Environment",
- "Windows environment", "1", CTLFLAG_RD);
+ "Windows environment", "1", NDIS_FLAG_RDONLY);
/* NDIS version should be 5.1. */
ndis_add_sysctl(sc, "NdisVersion",
- "NDIS API Version", "0x00050001", CTLFLAG_RD);
+ "NDIS API Version", "0x00050001", NDIS_FLAG_RDONLY);
/*
* Some miniport drivers rely on the existence of the SlotNumber,
* NetCfgInstanceId and DriverDesc keys.
*/
- ndis_add_sysctl(sc, "SlotNumber", "Slot Numer", "01", CTLFLAG_RD);
+ ndis_add_sysctl(sc, "SlotNumber", "Slot Numer", "01", NDIS_FLAG_RDONLY);
ndis_add_sysctl(sc, "NetCfgInstanceId", "NetCfgInstanceId",
- "{12345678-1234-5678-CAFE0-123456789ABC}", CTLFLAG_RD);
+ "{12345678-1234-5678-CAFE0-123456789ABC}", NDIS_FLAG_RDONLY);
ndis_add_sysctl(sc, "DriverDesc", "Driver Description",
- "NDIS Network Adapter", CTLFLAG_RD);
+ "NDIS Network Adapter", NDIS_FLAG_RDONLY);
/* Bus type (PCI, PCMCIA, etc...) */
sprintf(buf, "%d", (int)sc->ndis_iftype);
- ndis_add_sysctl(sc, "BusType", "Bus Type", buf, CTLFLAG_RD);
+ ndis_add_sysctl(sc, "BusType", "Bus Type", buf, NDIS_FLAG_RDONLY);
if (sc->ndis_res_io != NULL) {
sprintf(buf, "0x%lx", rman_get_start(sc->ndis_res_io));
ndis_add_sysctl(sc, "IOBaseAddress",
- "Base I/O Address", buf, CTLFLAG_RD);
+ "Base I/O Address", buf, NDIS_FLAG_RDONLY);
}
if (sc->ndis_irq != NULL) {
sprintf(buf, "%lu", rman_get_start(sc->ndis_irq));
ndis_add_sysctl(sc, "InterruptNumber",
- "Interrupt Number", buf, CTLFLAG_RD);
+ "Interrupt Number", buf, NDIS_FLAG_RDONLY);
}
return (0);
}
int
-ndis_add_sysctl(arg, key, desc, val, flag)
+ndis_add_sysctl(arg, key, desc, val, flag_rdonly)
void *arg;
char *key;
char *desc;
char *val;
- int flag;
+ int flag_rdonly;
{
struct ndis_softc *sc;
struct ndis_cfglist *cfg;
@@ -392,13 +393,21 @@ ndis_add_sysctl(arg, key, desc, val, flag)
TAILQ_INSERT_TAIL(&sc->ndis_cfglist_head, cfg, link);
- cfg->ndis_oid =
- SYSCTL_ADD_STRING(device_get_sysctl_ctx(sc->ndis_dev),
- SYSCTL_CHILDREN(device_get_sysctl_tree(sc->ndis_dev)),
- OID_AUTO, cfg->ndis_cfg.nc_cfgkey, flag,
- cfg->ndis_cfg.nc_val, sizeof(cfg->ndis_cfg.nc_val),
- cfg->ndis_cfg.nc_cfgdesc);
-
+ if (flag_rdonly != 0) {
+ cfg->ndis_oid =
+ SYSCTL_ADD_STRING(device_get_sysctl_ctx(sc->ndis_dev),
+ SYSCTL_CHILDREN(device_get_sysctl_tree(sc->ndis_dev)),
+ OID_AUTO, cfg->ndis_cfg.nc_cfgkey, CTLFLAG_RD,
+ cfg->ndis_cfg.nc_val, sizeof(cfg->ndis_cfg.nc_val),
+ cfg->ndis_cfg.nc_cfgdesc);
+ } else {
+ cfg->ndis_oid =
+ SYSCTL_ADD_STRING(device_get_sysctl_ctx(sc->ndis_dev),
+ SYSCTL_CHILDREN(device_get_sysctl_tree(sc->ndis_dev)),
+ OID_AUTO, cfg->ndis_cfg.nc_cfgkey, CTLFLAG_RW,
+ cfg->ndis_cfg.nc_val, sizeof(cfg->ndis_cfg.nc_val),
+ cfg->ndis_cfg.nc_cfgdesc);
+ }
return (0);
}
OpenPOWER on IntegriCloud