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