Date: Fri, 19 Dec 2003 17:06:04 -0800 (PST) From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 44107 for review Message-ID: <200312200106.hBK164rJ075193@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=44107 Change 44107 by sam@sam_ebb on 2003/12/19 17:05:10 IFC Affected files ... .. //depot/projects/netperf+sockets/sys/compat/ndis/cfg_var.h#2 integrate .. //depot/projects/netperf+sockets/sys/compat/ndis/kern_ndis.c#2 integrate .. //depot/projects/netperf+sockets/sys/compat/ndis/ndis_var.h#2 integrate .. //depot/projects/netperf+sockets/sys/compat/ndis/ntoskrnl_var.h#2 integrate .. //depot/projects/netperf+sockets/sys/compat/ndis/subr_ndis.c#2 integrate .. //depot/projects/netperf+sockets/sys/compat/ndis/subr_ntoskrnl.c#2 integrate .. //depot/projects/netperf+sockets/sys/conf/files#4 integrate .. //depot/projects/netperf+sockets/sys/conf/majors#3 integrate .. //depot/projects/netperf+sockets/sys/dev/acpica/acpi.c#5 integrate .. //depot/projects/netperf+sockets/sys/dev/acpica/acpi_cpu.c#4 integrate .. //depot/projects/netperf+sockets/sys/dev/acpica/acpi_pci_link.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/acpica/acpi_pcib.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/ahc_eisa.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/ahc_pci.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/ahd_pci.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic7770.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic79xx.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic79xx.h#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic79xx.seq#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic79xx_inline.h#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic79xx_osm.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic79xx_osm.h#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic79xx_pci.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic7xxx.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic7xxx.h#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic7xxx.reg#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic7xxx.seq#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic7xxx_93cx6.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic7xxx_inline.h#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic7xxx_osm.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic7xxx_osm.h#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic7xxx_pci.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic_osm_lib.c#1 branch .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aic_osm_lib.h#1 branch .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aicasm/aicasm.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l#2 integrate .. //depot/projects/netperf+sockets/sys/dev/aic7xxx/aicasm/aicasm_scan.l#2 integrate .. //depot/projects/netperf+sockets/sys/dev/ata/ata-chipset.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/ata/ata-pci.h#3 integrate .. //depot/projects/netperf+sockets/sys/dev/ata/ata-queue.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/ath/if_ath.c#4 integrate .. //depot/projects/netperf+sockets/sys/dev/ath/if_athioctl.h#3 integrate .. //depot/projects/netperf+sockets/sys/dev/bktr/msp34xx.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/ciss/ciss.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/en/midway.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/firewire/sbp_targ.c#4 integrate .. //depot/projects/netperf+sockets/sys/dev/if_ndis/if_ndis.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/if_ndis/if_ndisvar.h#2 integrate .. //depot/projects/netperf+sockets/sys/dev/md/md.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/ofw/ofw_disk.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/stg/tmc18c30.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/usb/ehci_pci.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/usb/if_aue.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/usb/ohci_pci.c#3 integrate .. //depot/projects/netperf+sockets/sys/dev/usb/umass.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/usb/usbdevs#3 integrate .. //depot/projects/netperf+sockets/sys/dev/usb/usbdevs.h#3 integrate .. //depot/projects/netperf+sockets/sys/dev/usb/usbdevs_data.h#3 integrate .. //depot/projects/netperf+sockets/sys/dev/usb/uscanner.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/vinum/vinum.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/vinum/vinumconfig.c#2 integrate .. //depot/projects/netperf+sockets/sys/dev/vinum/vinumrevive.c#2 integrate .. //depot/projects/netperf+sockets/sys/fs/ntfs/ntfs_subr.c#2 integrate .. //depot/projects/netperf+sockets/sys/i386/i386/pmap.c#4 integrate .. //depot/projects/netperf+sockets/sys/i386/include/cpu.h#2 integrate .. //depot/projects/netperf+sockets/sys/ia64/ia32/ia32_signal.c#2 integrate .. //depot/projects/netperf+sockets/sys/ia64/ia64/machdep.c#4 integrate .. //depot/projects/netperf+sockets/sys/kern/kern_switch.c#3 integrate .. //depot/projects/netperf+sockets/sys/kern/sched_ule.c#5 integrate .. //depot/projects/netperf+sockets/sys/kern/subr_taskqueue.c#3 integrate .. //depot/projects/netperf+sockets/sys/kern/sysv_sem.c#3 integrate .. //depot/projects/netperf+sockets/sys/kern/uipc_mbuf.c#2 integrate .. //depot/projects/netperf+sockets/sys/kern/vfs_subr.c#3 integrate .. //depot/projects/netperf+sockets/sys/modules/crypto/Makefile#2 integrate .. //depot/projects/netperf+sockets/sys/net80211/ieee80211.h#3 integrate .. //depot/projects/netperf+sockets/sys/net80211/ieee80211_input.c#3 integrate .. //depot/projects/netperf+sockets/sys/net80211/ieee80211_ioctl.c#3 integrate .. //depot/projects/netperf+sockets/sys/net80211/ieee80211_output.c#3 integrate .. //depot/projects/netperf+sockets/sys/net80211/ieee80211_proto.c#3 integrate .. //depot/projects/netperf+sockets/sys/net80211/ieee80211_var.h#3 integrate .. //depot/projects/netperf+sockets/sys/netgraph/atm/uni/ng_uni.c#2 integrate .. //depot/projects/netperf+sockets/sys/netgraph/ng_bridge.c#3 integrate .. //depot/projects/netperf+sockets/sys/netgraph/ng_eiface.c#3 integrate .. //depot/projects/netperf+sockets/sys/netgraph/ng_eiface.h#3 integrate .. //depot/projects/netperf+sockets/sys/netgraph/ng_etf.c#3 integrate .. //depot/projects/netperf+sockets/sys/netgraph/ng_ether.c#3 integrate .. //depot/projects/netperf+sockets/sys/netgraph/ng_ether.h#2 integrate .. //depot/projects/netperf+sockets/sys/netgraph/ng_ksocket.c#2 integrate .. //depot/projects/netperf+sockets/sys/netgraph/ng_parse.c#2 integrate .. //depot/projects/netperf+sockets/sys/netgraph/ng_parse.h#3 integrate .. //depot/projects/netperf+sockets/sys/netgraph/ng_pppoe.c#2 integrate .. //depot/projects/netperf+sockets/sys/netinet/ip_fw2.c#3 integrate .. //depot/projects/netperf+sockets/sys/netinet/tcp_subr.c#5 integrate .. //depot/projects/netperf+sockets/sys/netinet6/ip6_output.c#4 integrate .. //depot/projects/netperf+sockets/sys/netipsec/ipsec_mbuf.c#2 integrate .. //depot/projects/netperf+sockets/sys/nfsserver/nfs_srvsubs.c#2 integrate .. //depot/projects/netperf+sockets/sys/opencrypto/crmbuf.c#2 delete .. //depot/projects/netperf+sockets/sys/opencrypto/cryptodev.h#2 integrate .. //depot/projects/netperf+sockets/sys/opencrypto/cryptosoft.c#2 integrate .. //depot/projects/netperf+sockets/sys/powerpc/powerpc/pmap.c#3 integrate .. //depot/projects/netperf+sockets/sys/security/mac/mac_net.c#4 integrate .. //depot/projects/netperf+sockets/sys/security/mac_biba/mac_biba.c#3 integrate .. //depot/projects/netperf+sockets/sys/security/mac_lomac/mac_lomac.c#3 integrate .. //depot/projects/netperf+sockets/sys/security/mac_mls/mac_mls.c#3 integrate .. //depot/projects/netperf+sockets/sys/security/mac_stub/mac_stub.c#3 integrate .. //depot/projects/netperf+sockets/sys/security/mac_test/mac_test.c#4 integrate .. //depot/projects/netperf+sockets/sys/sys/_null.h#2 integrate .. //depot/projects/netperf+sockets/sys/sys/mac.h#3 integrate .. //depot/projects/netperf+sockets/sys/sys/mac_policy.h#3 integrate .. //depot/projects/netperf+sockets/sys/sys/mbuf.h#3 integrate .. //depot/projects/netperf+sockets/sys/sys/param.h#3 integrate Differences ... ==== //depot/projects/netperf+sockets/sys/compat/ndis/cfg_var.h#2 (text+ko) ==== @@ -29,7 +29,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/compat/ndis/cfg_var.h,v 1.1 2003/12/11 22:34:37 wpaul Exp $ + * $FreeBSD: src/sys/compat/ndis/cfg_var.h,v 1.2 2003/12/18 03:51:21 wpaul Exp $ */ #ifndef _CFG_VAR_H_ @@ -39,6 +39,7 @@ char *nc_cfgkey; char *nc_cfgdesc; char nc_val[256]; + int nc_idx; }; typedef struct ndis_cfg ndis_cfg; ==== //depot/projects/netperf+sockets/sys/compat/ndis/kern_ndis.c#2 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.3 2003/12/12 08:54:48 wpaul Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.6 2003/12/18 03:51:21 wpaul Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -76,6 +76,7 @@ void *, uint32_t); __stdcall static void ndis_statusdone_func(ndis_handle); __stdcall static void ndis_setdone_func(ndis_handle, ndis_status); +__stdcall static void ndis_getdone_func(ndis_handle, ndis_status); __stdcall static void ndis_resetdone_func(ndis_handle, ndis_status, uint8_t); /* @@ -122,6 +123,15 @@ } __stdcall static void +ndis_getdone_func(adapter, status) + ndis_handle adapter; + ndis_status status; +{ + printf ("Query done... %x\n", status); + return; +} + +__stdcall static void ndis_resetdone_func(adapter, status, addressingreset) ndis_handle adapter; ndis_status status; @@ -204,6 +214,10 @@ while(1) { if (vals->nc_cfgkey == NULL) break; + if (vals->nc_idx != sc->ndis_devidx) { + vals++; + continue; + } SYSCTL_ADD_STRING(&sc->ndis_ctx, SYSCTL_CHILDREN(sc->ndis_tree), OID_AUTO, vals->nc_cfgkey, @@ -309,11 +323,21 @@ { struct ndis_softc *sc; ndis_handle adapter; + ndis_packet *p; __stdcall ndis_return_handler returnfunc; if (arg == NULL || packet == NULL) return; + p = packet; + + /* Decrement refcount. */ + p->np_private.npp_count--; + + /* Release packet when refcount hits zero, otherwise return. */ + if (p->np_private.npp_count) + return; + sc = arg; returnfunc = sc->ndis_chars.nmc_return_packet_func; adapter = sc->ndis_block.nmb_miniportadapterctx; @@ -439,6 +463,7 @@ priv = &p->np_private; buf = priv->npp_head; + priv->npp_count = 0; for (buf = priv->npp_head; buf != NULL; buf = buf->nb_next) { if (buf == priv->npp_head) @@ -450,25 +475,15 @@ *m0 = NULL; return(ENOBUFS); } - - /* - * Note: there's some hackery going on here. We want - * to mate the mbufs to the buffers in the NDIS packet, - * but we don't mark the mbufs with the M_EXT flag to - * indicate external storage. This is because we don't - * want anything special done to free the buffers. - * Depending on the circumstances, the caller may want - * the entire packet to be released, buffers and all, - * by calling ndis_return_packet(), or ndis_free_packet(). - * We leave it up to the caller to do the MEXTADD() to - * set up the free mechanism in the first mbuf of the - * chain. - */ if (buf->nb_bytecount > buf->nb_size) m->m_len = buf->nb_size; else m->m_len = buf->nb_bytecount; m->m_data = buf->nb_mappedsystemva; + MEXTADD(m, m->m_data, m->m_len, ndis_return_packet, + p->np_rsvd[0], 0, EXT_NDIS); + m->m_ext.ext_buf = (void *)p; /* XXX */ + priv->npp_count++; totlen += m->m_len; if (m->m_flags & MT_HEADER) *m0 = m; @@ -524,7 +539,6 @@ for (m = m0; m != NULL; m = m->m_next) { if (m->m_len == NULL) continue; - buf = malloc(sizeof(ndis_buffer), M_DEVBUF, M_NOWAIT|M_ZERO); if (buf == NULL) { ndis_free_packet(*p); @@ -651,20 +665,11 @@ if (sc->ndis_tmaps == NULL) return(ENOMEM); - sc->ndis_mbufs = malloc(sizeof(struct mbuf) * sc->ndis_maxpkts, - M_DEVBUF, M_NOWAIT|M_ZERO); - - if (sc->ndis_mbufs == NULL) { - free(sc->ndis_tmaps, M_DEVBUF); - return(ENOMEM); - } - for (i = 0; i < sc->ndis_maxpkts; i++) { error = bus_dmamap_create(sc->ndis_ttag, 0, &sc->ndis_tmaps[i]); if (error) { free(sc->ndis_tmaps, M_DEVBUF); - free(sc->ndis_mbufs, M_DEVBUF); return(ENODEV); } } @@ -677,18 +682,24 @@ void *arg; { struct ndis_softc *sc; + struct mbuf *m; + ndis_packet *p = NULL; int i; sc = arg; for (i = 0; i < sc->ndis_maxpkts; i++) { - if (sc->ndis_mbufs[i] != NULL) - m_freem(sc->ndis_mbufs[i]); + if (sc->ndis_txarray[i] != NULL) { + p = sc->ndis_txarray[i]; + m = (struct mbuf *)p->np_rsvd[1]; + if (m != NULL) + m_freem(m); + ndis_free_packet(sc->ndis_txarray[i]); + } bus_dmamap_destroy(sc->ndis_ttag, sc->ndis_tmaps[i]); } free(sc->ndis_tmaps, M_DEVBUF); - free(sc->ndis_mbufs, M_DEVBUF); bus_dma_tag_destroy(sc->ndis_ttag); @@ -1041,6 +1052,7 @@ block->nmb_signature = (void *)0xcafebabe; block->nmb_setdone_func = ndis_setdone_func; + block->nmb_querydone_func = ndis_getdone_func; block->nmb_status_func = ndis_status_func; block->nmb_statusdone_func = ndis_statusdone_func; block->nmb_resetdone_func = ndis_resetdone_func; ==== //depot/projects/netperf+sockets/sys/compat/ndis/ndis_var.h#2 (text+ko) ==== @@ -29,7 +29,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.1 2003/12/11 22:34:37 wpaul Exp $ + * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.2 2003/12/14 21:31:32 wpaul Exp $ */ #ifndef _NDIS_VAR_H_ @@ -814,14 +814,16 @@ struct ndis_packet { ndis_packet_private np_private; union { + /* For connectionless miniports. */ struct { uint8_t np_miniport_rsvd[2 * sizeof(void *)]; uint8_t np_wrapper_rsvd[2 * sizeof(void *)]; - } np_rsvd; + } np_clrsvd; + /* For de-serialized miniports */ struct { uint8_t np_miniport_rsvdex[3 * sizeof(void *)]; uint8_t np_wrapper_rsvdex[sizeof(void *)]; - } np_rsvdrx; + } np_dsrsvd; struct { uint8_t np_mac_rsvd[4 * sizeof(void *)]; } np_macrsvd; @@ -840,6 +842,9 @@ typedef struct ndis_packet ndis_packet; +/* mbuf ext type for NDIS */ +#define EXT_NDIS 0x999 + struct ndis_filterdbs { union { void *nf_ethdb; ==== //depot/projects/netperf+sockets/sys/compat/ndis/ntoskrnl_var.h#2 (text+ko) ==== @@ -29,12 +29,18 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/compat/ndis/ntoskrnl_var.h,v 1.1 2003/12/11 22:34:37 wpaul Exp $ + * $FreeBSD: src/sys/compat/ndis/ntoskrnl_var.h,v 1.3 2003/12/13 09:07:35 wpaul Exp $ */ #ifndef _NTOSKRNL_VAR_H_ #define _NTOSKRNL_VAR_H_ +/* Note: assumes x86 page size of 4K. */ +#define PAGE_SHIFT 12 +#define SPAN_PAGES(ptr, len) \ + ((uint32_t)((((uintptr_t)(ptr) & (PAGE_SIZE -1)) + \ + (len) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)) + typedef uint32_t kspin_lock; struct slist_entry { @@ -54,6 +60,13 @@ typedef union slist_header slist_header; +struct list_entry { + struct list_entry *nle_flink; + struct list_entry *nle_blink; +}; + +typedef struct list_entry list_entry; + struct general_lookaside { slist_header gl_listhead; uint16_t gl_depth; @@ -73,6 +86,7 @@ uint32_t gl_size; void *gl_allocfunc; void *gl_freefunc; + list_entry gl_listent; uint32_t gl_lasttotallocs; union { uint32_t gl_lastallocmisses; ==== //depot/projects/netperf+sockets/sys/compat/ndis/subr_ndis.c#2 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.2 2003/12/12 08:54:48 wpaul Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.7 2003/12/16 18:56:33 wpaul Exp $"); /* * This file implements a translation layer between the BSD networking @@ -61,6 +61,7 @@ #include <sys/mutex.h> #include <sys/socket.h> #include <sys/sysctl.h> +#include <sys/timespec.h> #include <net/if.h> #include <net/if_arp.h> @@ -83,6 +84,7 @@ #include <compat/ndis/pe_var.h> #include <compat/ndis/resource_var.h> +#include <compat/ndis/ntoskrnl_var.h> #include <compat/ndis/ndis_var.h> #include <compat/ndis/cfg_var.h> #include <dev/if_ndis/if_ndisvar.h> @@ -104,10 +106,18 @@ __stdcall static ndis_status ndis_setattr_ex(ndis_handle, ndis_handle, uint32_t, uint32_t, ndis_interface_type); __stdcall static void ndis_open_cfg(ndis_status *, ndis_handle *, ndis_handle); +__stdcall static void ndis_open_cfgbyidx(ndis_status *, ndis_handle, + uint32_t, ndis_unicode_string *, ndis_handle *); +__stdcall static void ndis_open_cfgbyname(ndis_status *, ndis_handle, + ndis_unicode_string *, ndis_handle *); static ndis_status ndis_encode_parm(ndis_miniport_block *, struct sysctl_oid *, ndis_parm_type, ndis_config_parm **); +static ndis_status ndis_decode_parm(ndis_miniport_block *, + ndis_config_parm *, char *); __stdcall static void ndis_read_cfg(ndis_status *, ndis_config_parm **, ndis_handle, ndis_unicode_string *, ndis_parm_type); +__stdcall static void ndis_write_cfg(ndis_status *, ndis_handle, + ndis_unicode_string *, ndis_config_parm *); __stdcall static void ndis_close_cfg(ndis_handle); __stdcall static void ndis_create_lock(ndis_spin_lock *); __stdcall static void ndis_destroy_lock(ndis_spin_lock *); @@ -182,6 +192,8 @@ __stdcall static uint8_t ndis_wait_event(ndis_event *, uint32_t); __stdcall static ndis_status ndis_unicode2ansi(ndis_ansi_string *, ndis_unicode_string *); +__stdcall static ndis_status ndis_ansi2unicode(ndis_unicode_string *, + ndis_ansi_string *); __stdcall static ndis_status ndis_assign_pcirsrc(ndis_handle, uint32_t, ndis_resource_list **); __stdcall static ndis_status ndis_register_intr(ndis_miniport_interrupt *, @@ -192,6 +204,7 @@ ndis_shutdown_handler); __stdcall static void ndis_deregister_shutdown(ndis_handle); __stdcall static uint32_t ndis_numpages(ndis_buffer *); +__stdcall static void ndis_buf_physpages(ndis_buffer *, uint32_t *); __stdcall static void ndis_query_bufoffset(ndis_buffer *, uint32_t *, uint32_t *); __stdcall static void ndis_sleep(uint32_t); @@ -207,6 +220,14 @@ ndis_list_entry *, ndis_spin_lock *); __stdcall static uint8_t ndis_sync_with_intr(ndis_miniport_interrupt *, void *, void *); +__stdcall static void ndis_time(uint64_t *); +__stdcall static void ndis_init_string(ndis_unicode_string **, char *); +__stdcall static void ndis_init_ansi_string(ndis_ansi_string *, char *); +__stdcall static void ndis_free_string(ndis_unicode_string *); +__stdcall static ndis_status ndis_remove_miniport(ndis_handle *); +__stdcall static void ndis_termwrap(ndis_handle, void *); +__stdcall static void ndis_get_devprop(ndis_handle, void *, void *, + void *, cm_resource_list *, cm_resource_list *); __stdcall static void dummy(void); @@ -306,6 +327,14 @@ return; } +__stdcall static void +ndis_termwrap(handle, syspec) + ndis_handle handle; + void *syspec; +{ + return; +} + __stdcall static ndis_status ndis_register_miniport(handle, characteristics, len) ndis_handle handle; @@ -398,6 +427,30 @@ return; } +__stdcall static void +ndis_open_cfgbyname(status, cfg, subkey, subhandle) + ndis_status *status; + ndis_handle cfg; + ndis_unicode_string *subkey; + ndis_handle *subhandle; +{ + *subhandle = cfg; + *status = NDIS_STATUS_SUCCESS; + return; +} + +__stdcall static void +ndis_open_cfgbyidx(status, cfg, idx, subkey, subhandle) + ndis_status *status; + ndis_handle cfg; + uint32_t idx; + ndis_unicode_string *subkey; + ndis_handle *subhandle; +{ + *status = NDIS_STATUS_FAILURE; + return; +} + static ndis_status ndis_encode_parm(block, oid, type, parm) ndis_miniport_block *block; @@ -502,7 +555,83 @@ return; } +static ndis_status +ndis_decode_parm(block, parm, val) + ndis_miniport_block *block; + ndis_config_parm *parm; + char *val; +{ + uint16_t *unicode; + ndis_unicode_string *ustr; + + unicode = (uint16_t *)&block->nmb_dummybuf; + + switch(parm->ncp_type) { + case ndis_parm_string: + ustr = &parm->ncp_parmdata.ncp_stringdata; + ndis_unicode_to_ascii(ustr->nus_buf, ustr->nus_len, &val); + break; + case ndis_parm_int: + sprintf(val, "%ul", parm->ncp_parmdata.ncp_intdata); + break; + case ndis_parm_hexint: + sprintf(val, "%xu", parm->ncp_parmdata.ncp_intdata); + break; + default: + return(NDIS_STATUS_FAILURE); + break; + } + return(NDIS_STATUS_SUCCESS); +} + __stdcall static void +ndis_write_cfg(status, cfg, key, parm) + ndis_status *status; + ndis_handle cfg; + ndis_unicode_string *key; + ndis_config_parm *parm; +{ + char *keystr = NULL; + ndis_miniport_block *block; + struct ndis_softc *sc; + struct sysctl_oid *oidp; + struct sysctl_ctx_entry *e; + char val[256]; + + block = (ndis_miniport_block *)cfg; + sc = (struct ndis_softc *)block->nmb_ifp; + + ndis_unicode_to_ascii(key->nus_buf, key->nus_len, &keystr); + + /* Decode the parameter into a string. */ + *status = ndis_decode_parm(block, parm, val); + if (*status != NDIS_STATUS_SUCCESS) { + free(keystr, M_DEVBUF); + return; + } + + /* See if the key already exists. */ + + TAILQ_FOREACH(e, &sc->ndis_ctx, link) { + oidp = e->entry; + if (strcmp(oidp->oid_name, keystr) == 0) { + /* Found it, set the value. */ + strcpy((char *)oidp->oid_arg1, val); + free(keystr, M_DEVBUF); + return; + } + } + + /* Not found, add a new key with the specified value. */ + ndis_add_sysctl(sc, keystr, "(dynamically set key)", + val, CTLFLAG_RW); + + free(keystr, M_DEVBUF); + *status = NDIS_STATUS_SUCCESS; + return; +} + +__stdcall static void ndis_close_cfg(cfg) ndis_handle cfg; { @@ -1583,12 +1712,37 @@ __stdcall static ndis_status ndis_unicode2ansi(dstr, sstr) - ndis_ansi_string *dstr; - ndis_unicode_string *sstr; + ndis_ansi_string *dstr; + ndis_unicode_string *sstr; +{ + if (dstr == NULL || sstr == NULL) + return(NDIS_STATUS_FAILURE); + if (ndis_unicode_to_ascii(sstr->nus_buf, + sstr->nus_len, &dstr->nas_buf)) + return(NDIS_STATUS_FAILURE); + dstr->nas_len = dstr->nas_maxlen = strlen(dstr->nas_buf); + return (NDIS_STATUS_SUCCESS); +} + +__stdcall static ndis_status +ndis_ansi2unicode(dstr, sstr) + ndis_unicode_string *dstr; + ndis_ansi_string *sstr; { - ndis_unicode_to_ascii(sstr->nus_buf, sstr->nus_len, &dstr->nas_buf); - dstr->nas_len = strlen(dstr->nas_buf); - printf ("unicode 2 ansi...\n"); + char *str; + if (dstr == NULL || sstr == NULL) + return(NDIS_STATUS_FAILURE); + str = malloc(sstr->nas_len + 1, M_DEVBUF, M_NOWAIT); + if (str == NULL) + return(NDIS_STATUS_FAILURE); + strncpy(str, sstr->nas_buf, sstr->nas_len); + *(str + sstr->nas_len) = '\0'; + if (ndis_ascii_to_unicode(str, &dstr->nus_buf)) { + free(str, M_DEVBUF); + return(NDIS_STATUS_FAILURE); + } + dstr->nus_len = dstr->nus_maxlen = sstr->nas_len * 2; + free(str, M_DEVBUF); return (NDIS_STATUS_SUCCESS); } @@ -1679,7 +1833,18 @@ ndis_numpages(buf) ndis_buffer *buf; { - return(howmany(buf->nb_bytecount, PAGE_SIZE)); + if (buf->nb_bytecount == 0) + return(1); + return(SPAN_PAGES(buf->nb_mappedsystemva, buf->nb_bytecount)); +} + +__stdcall static void +ndis_buf_physpages(buf, pages) + ndis_buffer *buf; + uint32_t *pages; +{ + *pages = ndis_numpages(buf); + return; } __stdcall static void @@ -1839,7 +2004,93 @@ return(sync(syncctx)); } +/* + * Return the number of 100 nanosecond intervals since + * January 1, 1601. (?!?!) + */ +__stdcall static void +ndis_time(tval) + uint64_t *tval; +{ + struct timespec ts; + nanotime(&ts); + *tval = (ts.tv_nsec / 100) + (ts.tv_nsec * 10000000); + *tval += 11644473600; + return; +} + +__stdcall static void +ndis_init_string(dst, src) + ndis_unicode_string **dst; + char *src; +{ + ndis_unicode_string *u; + + u = malloc(sizeof(ndis_unicode_string), M_DEVBUF, M_NOWAIT); + if (u == NULL) + return; + u->nus_buf = NULL; + if (ndis_ascii_to_unicode(src, &u->nus_buf)) { + free(u, M_DEVBUF); + return; + } + u->nus_len = u->nus_maxlen = strlen(src) * 2; + return; +} + __stdcall static void +ndis_free_string(str) + ndis_unicode_string *str; +{ + if (str == NULL) + return; + if (str->nus_buf != NULL) + free(str->nus_buf, M_DEVBUF); + free(str, M_DEVBUF); + return; +} + +__stdcall static ndis_status +ndis_remove_miniport(adapter) + ndis_handle *adapter; +{ + return(NDIS_STATUS_SUCCESS); +} + +__stdcall static void +ndis_init_ansi_string(dst, src) + ndis_ansi_string *dst; + char *src; +{ + ndis_ansi_string *a; + + a = dst; + if (a == NULL) + return; + if (src == NULL) { + a->nas_len = a->nas_maxlen = 0; + a->nas_buf = NULL; + } else { + a->nas_buf = src; + a->nas_len = a->nas_maxlen = strlen(src); + } + + return; +} + +__stdcall static void ndis_get_devprop(adapter, phydevobj, + funcdevobj, nextdevobj, resources, transresources) + ndis_handle adapter; + void *phydevobj; + void *funcdevobj; + void *nextdevobj; + cm_resource_list *resources; + cm_resource_list *transresources; +{ + return; +} + +__stdcall static void dummy() { printf ("NDIS dummy called...\n"); @@ -1847,6 +2098,18 @@ } image_patch_table ndis_functbl[] = { + { "NdisGetBufferPhysicalArraySize", (FUNC)ndis_buf_physpages }, + { "NdisMGetDeviceProperty", (FUNC)ndis_get_devprop }, + { "NdisInitAnsiString", (FUNC)ndis_init_ansi_string }, + { "NdisWriteConfiguration", (FUNC)ndis_write_cfg }, + { "NdisAnsiStringToUnicodeString", (FUNC)ndis_ansi2unicode }, + { "NdisTerminateWrapper", (FUNC)ndis_termwrap }, + { "NdisOpenConfigurationKeyByName", (FUNC)ndis_open_cfgbyname }, + { "NdisOpenConfigurationKeyByIndex", (FUNC)ndis_open_cfgbyidx }, + { "NdisMRemoveMiniport", (FUNC)ndis_remove_miniport }, + { "NdisInitializeString", (FUNC)ndis_init_string }, + { "NdisFreeString", (FUNC)ndis_free_string }, + { "NdisGetCurrentSystemTime", (FUNC)ndis_time }, { "NdisMSynchronizeWithInterrupt", (FUNC)ndis_sync_with_intr }, { "NdisMAllocateSharedMemoryAsync", (FUNC)ndis_alloc_sharedmem_async }, { "NdisInterlockedInsertHeadList", (FUNC)ndis_insert_head }, ==== //depot/projects/netperf+sockets/sys/compat/ndis/subr_ntoskrnl.c#2 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.1 2003/12/11 22:34:37 wpaul Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.3 2003/12/13 07:41:12 wpaul Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -95,8 +95,13 @@ lookaside_alloc_func *, lookaside_free_func *, uint32_t, size_t, uint32_t, uint16_t); __stdcall static void ntoskrnl_delete_nplookaside(npaged_lookaside_list *); -static slist_entry *ntoskrnl_push_slist(slist_entry *, slist_entry *); -static slist_entry *ntoskrnl_pop_slist(slist_entry *); +__stdcall static slist_entry *ntoskrnl_push_slist(/*slist_entry *, + slist_entry * */ void); +__stdcall static slist_entry *ntoskrnl_pop_slist(/*slist_entry * */ void); +__stdcall static slist_entry *ntoskrnl_push_slist_ex(/*slist_entry *, + slist_entry *,*/ kspin_lock *); +__stdcall static slist_entry *ntoskrnl_pop_slist_ex(/*slist_entry *, + kspin_lock * */void); __stdcall static void dummy(void); static struct mtx ntoskrnl_interlock; @@ -352,6 +357,8 @@ uint32_t tag; uint16_t depth; { + struct mtx *mtx; + lookaside->nll_l.gl_size = size; lookaside->nll_l.gl_tag = tag; if (allocfunc == NULL) @@ -364,6 +371,13 @@ else lookaside->nll_l.gl_freefunc = freefunc; + mtx = malloc(sizeof(struct mtx), M_DEVBUF, M_NOWAIT|M_ZERO); + if (mtx == NULL) + return; + mtx_init(mtx, "ndisnplook", "ndis lookaside lock", + MTX_DEF | MTX_RECURSE | MTX_DUPOK); + lookaside->nll_obsoletelock = (kspin_lock)mtx; + return; } @@ -371,6 +385,8 @@ ntoskrnl_delete_lookaside(lookaside) paged_lookaside_list *lookaside; { + mtx_destroy((struct mtx *)lookaside->nll_obsoletelock); + free((struct mtx *)lookaside->nll_obsoletelock, M_DEVBUF); return; } @@ -385,6 +401,8 @@ uint32_t tag; uint16_t depth; { + struct mtx *mtx; + lookaside->nll_l.gl_size = size; lookaside->nll_l.gl_tag = tag; if (allocfunc == NULL) @@ -397,6 +415,13 @@ else lookaside->nll_l.gl_freefunc = freefunc; + mtx = malloc(sizeof(struct mtx), M_DEVBUF, M_NOWAIT|M_ZERO); + if (mtx == NULL) + return; + mtx_init(mtx, "ndisnplook", "ndis lookaside lock", + MTX_DEF | MTX_RECURSE | MTX_DUPOK); + lookaside->nll_obsoletelock = (kspin_lock)mtx; + return; } @@ -404,41 +429,90 @@ ntoskrnl_delete_nplookaside(lookaside) npaged_lookaside_list *lookaside; { + mtx_destroy((struct mtx *)lookaside->nll_obsoletelock); + free((struct mtx *)lookaside->nll_obsoletelock, M_DEVBUF); return; } /* * Note: the interlocked slist push and pop routines are - * declared to be _fastcall in Windows, which means they - * use the _cdecl calling convention here. + * declared to be _fastcall in Windows. gcc 3.4 is supposed + * to have support for this calling convention, however we + * don't have that version available yet, so we kludge things + * up using some inline assembly. */ -static slist_entry * -ntoskrnl_push_slist(head, entry) - slist_entry *head; + +__stdcall static slist_entry * +ntoskrnl_push_slist(/*head, entry*/ void) +{ + slist_header *head; slist_entry *entry; -{ slist_entry *oldhead; + + __asm__("movl %%ecx, %%ecx" : "=c" (head)); + __asm__("movl %%edx, %%edx" : "=d" (entry)); + mtx_lock(&ntoskrnl_interlock); - oldhead = head->sl_next; - entry->sl_next = head->sl_next; - head->sl_next = entry; + oldhead = head->slh_list.slh_next; + entry->sl_next = head->slh_list.slh_next; + head->slh_list.slh_next = entry; mtx_unlock(&ntoskrnl_interlock); return(oldhead); } -static slist_entry * -ntoskrnl_pop_slist(head) - slist_entry *head; +__stdcall static slist_entry * +ntoskrnl_pop_slist(/*head*/ void) { + slist_header *head; slist_entry *first; + + __asm__("movl %%ecx, %%ecx" : "=c" (head)); + mtx_lock(&ntoskrnl_interlock); - first = head->sl_next; + first = head->slh_list.slh_next; if (first != NULL) - head->sl_next = first->sl_next; + head->slh_list.slh_next = first->sl_next; mtx_unlock(&ntoskrnl_interlock); return(first); } +__stdcall static slist_entry * +ntoskrnl_push_slist_ex(/*head, entry,*/ lock) + kspin_lock *lock; +{ + slist_header *head; + slist_entry *entry; + slist_entry *oldhead; + + __asm__("movl %%ecx, %%ecx" : "=c" (head)); + __asm__("movl %%edx, %%edx" : "=d" (entry)); + + mtx_lock((struct mtx *)*lock); + oldhead = head->slh_list.slh_next; + entry->sl_next = head->slh_list.slh_next; + head->slh_list.slh_next = entry; + mtx_unlock((struct mtx *)*lock); + return(oldhead); +} + +__stdcall static slist_entry * +ntoskrnl_pop_slist_ex(/*head, lock*/ void) +{ + slist_header *head; + kspin_lock *lock; + slist_entry *first; + + __asm__("movl %%ecx, %%ecx" : "=c" (head)); + __asm__("movl %%edx, %%edx" : "=d" (lock)); + + mtx_lock((struct mtx *)*lock); + first = head->slh_list.slh_next; + if (first != NULL) + head->slh_list.slh_next = first->sl_next; + mtx_unlock((struct mtx *)*lock); + return(first); +} + __stdcall static void dummy() { @@ -455,6 +529,9 @@ { "strcmp", (FUNC)strcmp }, { "strncpy", (FUNC)strncpy }, { "strcpy", (FUNC)strcpy }, + { "strlen", (FUNC)strlen }, + { "memcpy", (FUNC)memcpy }, + { "memset", (FUNC)memset }, { "IofCallDriver", (FUNC)ntoskrnl_iofcalldriver }, { "IoBuildSynchronousFsdRequest", (FUNC)ntoskrnl_iobuildsynchfsdreq }, { "KeWaitForSingleObject", (FUNC)ntoskrnl_waitforobj }, @@ -481,6 +558,8 @@ { "ExDeleteNPagedLookasideList", (FUNC)ntoskrnl_delete_nplookaside }, { "InterlockedPopEntrySList", (FUNC)ntoskrnl_pop_slist }, { "InterlockedPushEntrySList", (FUNC)ntoskrnl_push_slist }, + { "ExInterlockedPopEntrySList", (FUNC)ntoskrnl_pop_slist_ex }, + { "ExInterlockedPushEntrySList",(FUNC)ntoskrnl_push_slist_ex }, /* * This last entry is a catch-all for any function we haven't ==== //depot/projects/netperf+sockets/sys/conf/files#4 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.858 2003/12/07 04:41:11 imp Exp $ +# $FreeBSD: src/sys/conf/files,v 1.859 2003/12/15 21:49:41 bms Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -1570,7 +1570,6 @@ # crypto support >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200312200106.hBK164rJ075193>