PERFORCE change 44107 for review

Sam Leffler sam at FreeBSD.org
Fri Dec 19 17:06:19 PST 2003


http://perforce.freebsd.org/chv.cgi?CH=44107

Change 44107 by sam at 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) <<<


More information about the p4-projects mailing list