diff options
author | wpaul <wpaul@FreeBSD.org> | 2003-12-25 00:40:02 +0000 |
---|---|---|
committer | wpaul <wpaul@FreeBSD.org> | 2003-12-25 00:40:02 +0000 |
commit | 385e9eaf78bb9aa940e8287c1fcf82fc01a1c958 (patch) | |
tree | 2779f32a32d35fbfd0028a3cb98cdf4aa7066c4e | |
parent | 26d06d73267a9c6f0d0d324117810e0f07dc8fee (diff) | |
download | FreeBSD-src-385e9eaf78bb9aa940e8287c1fcf82fc01a1c958.zip FreeBSD-src-385e9eaf78bb9aa940e8287c1fcf82fc01a1c958.tar.gz |
- Add stubs for Ndis*File() functions
- Fix ndis_time().
- Implement NdisGetSystemUpTime().
- Implement RtlCopyUnicodeString() and RtlUnicodeStringToAnsiString().
- In ndis_getstate_80211(), use sc->ndis_link to determine connect
status.
Submitted by: Brian Feldman <green@freebsd.org>
-rw-r--r-- | sys/compat/ndis/subr_ndis.c | 74 | ||||
-rw-r--r-- | sys/compat/ndis/subr_ntoskrnl.c | 46 | ||||
-rw-r--r-- | sys/dev/if_ndis/if_ndis.c | 6 |
3 files changed, 116 insertions, 10 deletions
diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c index 3b47fc2..4c3f837 100644 --- a/sys/compat/ndis/subr_ndis.c +++ b/sys/compat/ndis/subr_ndis.c @@ -225,6 +225,7 @@ __stdcall static ndis_list_entry *ndis_insert_tail(ndis_list_entry *, __stdcall static uint8_t ndis_sync_with_intr(ndis_miniport_interrupt *, void *, void *); __stdcall static void ndis_time(uint64_t *); +__stdcall static void ndis_uptime(uint32_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 *); @@ -236,6 +237,11 @@ __stdcall static void ndis_firstbuf(ndis_packet *, ndis_buffer **, void **, uint32_t *, uint32_t *); __stdcall static void ndis_firstbuf_safe(ndis_packet *, ndis_buffer **, void **, uint32_t *, uint32_t *, uint32_t); +__stdcall static void ndis_open_file(ndis_status *, ndis_handle *, uint32_t *, + ndis_unicode_string *, ndis_physaddr); +__stdcall static void ndis_map_file(ndis_status *, void **, ndis_handle); +__stdcall static void ndis_unmap_file(ndis_handle); +__stdcall static void ndis_close_file(ndis_handle); __stdcall static void dummy(void); @@ -2075,10 +2081,23 @@ ndis_time(tval) uint64_t *tval; { struct timespec ts; + nanotime(&ts); - *tval = (ts.tv_nsec / 100) + (ts.tv_nsec * 10000000); - *tval += 11644473600; - return; + *tval = (uint64_t)ts.tv_nsec / 100 + (uint64_t)ts.tv_sec * 10000000 + + 11644473600; +} + +/* + * Return the number of milliseconds since the system booted. + */ +__stdcall static void +ndis_uptime(tval) + uint32_t *tval; +{ + struct timespec ts; + + nanouptime(&ts); + *tval = ts.tv_nsec / 1000000 + ts.tv_sec * 1000; } __stdcall static void @@ -2189,6 +2208,50 @@ ndis_firstbuf_safe(packet, buf, firstva, firstlen, totlen, prio) ndis_firstbuf(packet, buf, firstva, firstlen, totlen); } +/* can also return NDIS_STATUS_RESOURCES/NDIS_STATUS_ERROR_READING_FILE */ +__stdcall static void +ndis_open_file(status, filehandle, filelength, filename, highestaddr) + ndis_status *status; + ndis_handle *filehandle; + uint32_t *filelength; + ndis_unicode_string *filename; + ndis_physaddr highestaddr; +{ + char *afilename = NULL; + + ndis_unicode_to_ascii(filename->nus_buf, filename->nus_len, &afilename); + printf("ndis_open_file(\"%s\", %ju)\n", afilename, + highestaddr.np_quad); + free(afilename, M_DEVBUF); + *status = NDIS_STATUS_FILE_NOT_FOUND; + return; +} + +__stdcall static void +ndis_map_file(status, mappedbuffer, filehandle) + ndis_status *status; + void **mappedbuffer; + ndis_handle filehandle; +{ + + *status = NDIS_STATUS_ALREADY_MAPPED; + return; +} + +__stdcall static void +ndis_unmap_file(filehandle) + ndis_handle filehandle; +{ + return; +} + +__stdcall static void +ndis_close_file(filehandle) + ndis_handle filehandle; +{ + return; +} + __stdcall static void dummy() { @@ -2212,6 +2275,7 @@ image_patch_table ndis_functbl[] = { { "NdisInitializeString", (FUNC)ndis_init_string }, { "NdisFreeString", (FUNC)ndis_free_string }, { "NdisGetCurrentSystemTime", (FUNC)ndis_time }, + { "NdisGetSystemUpTime", (FUNC)ndis_uptime }, { "NdisMSynchronizeWithInterrupt", (FUNC)ndis_sync_with_intr }, { "NdisMAllocateSharedMemoryAsync", (FUNC)ndis_alloc_sharedmem_async }, { "NdisInterlockedInsertHeadList", (FUNC)ndis_insert_head }, @@ -2285,6 +2349,10 @@ image_patch_table ndis_functbl[] = { { "NdisUnchainBufferAtFront", (FUNC)ndis_unchain_headbuf }, { "NdisReadPcmciaAttributeMemory", (FUNC)ndis_read_pccard_amem }, { "NdisWritePcmciaAttributeMemory", (FUNC)ndis_write_pccard_amem }, + { "NdisOpenFile", (FUNC)ndis_open_file }, + { "NdisMapFile", (FUNC)ndis_map_file }, + { "NdisUnmapFile", (FUNC)ndis_unmap_file }, + { "NdisCloseFile", (FUNC)ndis_close_file }, /* * This last entry is a catch-all for any function we haven't diff --git a/sys/compat/ndis/subr_ntoskrnl.c b/sys/compat/ndis/subr_ntoskrnl.c index e9fcb3b..48658fe 100644 --- a/sys/compat/ndis/subr_ntoskrnl.c +++ b/sys/compat/ndis/subr_ntoskrnl.c @@ -63,6 +63,10 @@ __FBSDID("$FreeBSD$"); __stdcall static uint32_t ntoskrnl_unicode_equal(ndis_unicode_string *, ndis_unicode_string *, uint32_t); +__stdcall static void ntoskrnl_unicode_copy(ndis_unicode_string *, + ndis_unicode_string *); +__stdcall static uint32_t ntoskrnl_unicode_to_ansi(ndis_ansi_string *, + ndis_unicode_string *, uint8_t); __stdcall static void *ntoskrnl_iobuildsynchfsdreq(uint32_t, void *, void *, uint32_t, uint32_t *, void *, void *); __stdcall static uint32_t ntoskrnl_iofcalldriver(void *, void *); @@ -142,8 +146,8 @@ ntoskrnl_unicode_equal(str1, str2, casesensitive) ndis_unicode_string *str2; uint32_t casesensitive; { - char *astr1 = NULL, *astr2 = NULL; - int rval = 1; + char *astr1 = NULL, *astr2 = NULL; + int rval = 1; ndis_unicode_to_ascii(str1->nus_buf, str2->nus_len, &astr1); ndis_unicode_to_ascii(str2->nus_buf, str2->nus_len, &astr2); @@ -161,6 +165,42 @@ ntoskrnl_unicode_equal(str1, str2, casesensitive) return(rval); } +__stdcall static void +ntoskrnl_unicode_copy(dest, src) + ndis_unicode_string *dest; + ndis_unicode_string *src; +{ + + if (dest->nus_maxlen >= src->nus_len) + dest->nus_len = src->nus_len; + else + dest->nus_len = dest->nus_maxlen; + memcpy(dest->nus_buf, src->nus_buf, dest->nus_len); + return; +} + +__stdcall static uint32_t +ntoskrnl_unicode_to_ansi(dest, src, allocate) + ndis_ansi_string *dest; + ndis_unicode_string *src; + uint8_t allocate; +{ + char *astr = NULL; + + if (allocate) { + ndis_unicode_to_ascii(src->nus_buf, src->nus_len, &astr); + dest->nas_buf = astr; + dest->nas_len = dest->nas_maxlen = strlen(astr); + } else { + dest->nas_len = src->nus_len / 2; /* XXX */ + if (dest->nas_maxlen < dest->nas_len) + dest->nas_len = dest->nas_maxlen; + ndis_unicode_to_ascii(src->nus_buf, dest->nas_len * 2, + &dest->nas_buf); + } + return (NDIS_STATUS_SUCCESS); +} + __stdcall static void * ntoskrnl_iobuildsynchfsdreq(func, dobj, buf, len, off, event, status) uint32_t func; @@ -523,6 +563,8 @@ dummy() image_patch_table ntoskrnl_functbl[] = { { "RtlEqualUnicodeString", (FUNC)ntoskrnl_unicode_equal }, + { "RtlCopyUnicodeString", (FUNC)ntoskrnl_unicode_copy }, + { "RtlUnicodeStringToAnsiString", (FUNC)ntoskrnl_unicode_to_ansi }, { "sprintf", (FUNC)sprintf }, { "DbgPrint", (FUNC)printf }, { "strncmp", (FUNC)strncmp }, diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c index 4ece1be..79db5e9 100644 --- a/sys/dev/if_ndis/if_ndis.c +++ b/sys/dev/if_ndis/if_ndis.c @@ -1162,11 +1162,7 @@ ndis_getstate_80211(sc) if (!(ifp->if_flags & IFF_UP)) return; - len = sizeof(arg); - rval = ndis_get_info(sc, OID_GEN_MEDIA_CONNECT_STATUS, - (void *)&arg, &len); - - if (arg == nmc_connected) + if (sc->ndis_link) ic->ic_state = IEEE80211_S_RUN; else ic->ic_state = IEEE80211_S_ASSOC; |