Index: src/sys/compat/ndis/subr_ndis.c =================================================================== RCS file: /home/ncvs/src/sys/compat/ndis/subr_ndis.c,v retrieving revision 1.94.2.2 diff -u -r1.94.2.2 subr_ndis.c --- src/sys/compat/ndis/subr_ndis.c 6 Nov 2005 03:52:24 -0000 1.94.2.2 +++ src/sys/compat/ndis/subr_ndis.c 16 Dec 2005 11:54:33 -0000 @@ -134,7 +134,7 @@ static void NdisOpenConfigurationKeyByName(ndis_status *, ndis_handle, unicode_string *, ndis_handle *); static ndis_status ndis_encode_parm(ndis_miniport_block *, - struct sysctl_oid *, ndis_parm_type, ndis_config_parm **); + struct sysctl_oid *, ndis_parm_type, ndis_config_parm **, int); static ndis_status ndis_decode_parm(ndis_miniport_block *, ndis_config_parm *, char *); static void NdisReadConfiguration(ndis_status *, ndis_config_parm **, @@ -545,11 +545,12 @@ } static ndis_status -ndis_encode_parm(block, oid, type, parm) +ndis_encode_parm(block, oid, type, parm, literal) ndis_miniport_block *block; struct sysctl_oid *oid; ndis_parm_type type; ndis_config_parm **parm; + int literal; { ndis_config_parm *p; ndis_parmlist_entry *np; @@ -572,7 +573,7 @@ val = strtoul((char *)oid->oid_arg1, NULL, 10); us = &p->ncp_parmdata.ncp_stringdata; p->ncp_type = ndis_parm_string; - if (val) { + if (!literal && val) { snprintf(tmp, 32, "%x", val); RtlInitAnsiString(&as, tmp); } else { @@ -674,6 +675,7 @@ struct sysctl_oid *oidp; struct sysctl_ctx_entry *e; ansi_string as; + int literal; block = (ndis_miniport_block *)cfg; sc = device_get_softc(block->nmb_physdeviceobj->do_devext); @@ -707,7 +709,11 @@ return; } - *status = ndis_encode_parm(block, oidp, type, parm); + if (ndis_strcasecmp(keystr, "NetworkAddress") == 0) + literal = TRUE; + else + literal = FALSE; + *status = ndis_encode_parm(block, oidp, type, parm, literal); RtlFreeAnsiString(&as); return; } Index: src/sys/dev/if_ndis/if_ndis.c =================================================================== RCS file: /home/ncvs/src/sys/dev/if_ndis/if_ndis.c,v retrieving revision 1.99.2.5 diff -u -r1.99.2.5 if_ndis.c --- src/sys/dev/if_ndis/if_ndis.c 6 Nov 2005 19:39:41 -0000 1.99.2.5 +++ src/sys/dev/if_ndis/if_ndis.c 16 Dec 2005 11:54:34 -0000 @@ -46,10 +46,7 @@ #include #include #include -#if __FreeBSD_version < 502113 #include -#endif - #include #include @@ -1860,6 +1857,13 @@ struct ndis_softc *sc = xsc; struct ifnet *ifp = sc->ifp; int i, len, error; + struct ifaddr *ifa; + struct sockaddr_dl *sdl; + struct ieee80211com *ic; + struct sysctl_ctx_entry *e; + struct sysctl_oid *oidp; + u_char eaddr[ETHER_ADDR_LEN]; + char eaddr_str[(ETHER_ADDR_LEN * 2) + 1]; /* * Avoid reintializing the link unnecessarily. @@ -1880,6 +1884,39 @@ /* Init our MAC address */ + ifa = ifaddr_byindex(ifp->if_index); + sdl = (struct sockaddr_dl *)ifa->ifa_addr; + bcopy(LLADDR(sdl), eaddr, ETHER_ADDR_LEN); + if (sc->ndis_80211) { + ic = &sc->ic; + IEEE80211_ADDR_COPY(ic->ic_myaddr, eaddr); + } + /* + * "NetworkAddress" value should be 12 bytes HEX. + */ + snprintf(eaddr_str, sizeof(eaddr_str), "%02x%02x%02x%02x%02x%02x", + eaddr[0], eaddr[1], eaddr[2], + eaddr[3], eaddr[4], eaddr[5]); +#if __FreeBSD_version < 502113 + TAILQ_FOREACH(e, &sc->ndis_ctx, link) { +#else + TAILQ_FOREACH(e, device_get_sysctl_ctx(sc->ndis_dev), link) { +#endif + oidp = e->entry; + if (ndis_strcasecmp(oidp->oid_name, "NetworkAddress") == 0) { + /* + * Copy the value, so NdisReadConfiguration() + * will find and use this configured value. + */ + strcpy((char *)oidp->oid_arg1, eaddr_str); + goto mac_addr_save_out; + } + } + /* Add sysctl entry for "NetworkAdress", in case it doesn't exist */ + ndis_add_sysctl(sc, "NetworkAddress", "(dynamically set key)", + eaddr_str, CTLFLAG_RW); +mac_addr_save_out: + /* Program the packet filter */ sc->ndis_filter = NDIS_PACKET_TYPE_DIRECTED;