aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/ndis/subr_ndis.c
diff options
context:
space:
mode:
authorBill Paul <wpaul@FreeBSD.org>2004-01-15 07:42:26 +0000
committerBill Paul <wpaul@FreeBSD.org>2004-01-15 07:42:26 +0000
commit70e8088cdefe25bee9fefc4304c7a5a348849d9b (patch)
tree48eab257e3227d5c26642ef1409180479f52eb7f /sys/compat/ndis/subr_ndis.c
parenta85ce5b61fb8b8d79aec9d457ee6fb9b2822e371 (diff)
downloadsrc-70e8088cdefe25bee9fefc4304c7a5a348849d9b.tar.gz
src-70e8088cdefe25bee9fefc4304c7a5a348849d9b.zip
Implement NdisCopyFromPacketToPacket() and NdisCopyFromPacketToPacketSafe().
I only have one driver that references this routine (for the 3Com 3cR990) and it never gets called, but just in case, here it is.
Notes
Notes: svn path=/head/; revision=124541
Diffstat (limited to 'sys/compat/ndis/subr_ndis.c')
-rw-r--r--sys/compat/ndis/subr_ndis.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c
index 2739ec95aab4..9b210a05eb2d 100644
--- a/sys/compat/ndis/subr_ndis.c
+++ b/sys/compat/ndis/subr_ndis.c
@@ -263,6 +263,10 @@ __stdcall static void ndis_ind_status(ndis_handle, ndis_status,
void *, uint32_t);
static void ndis_workfunc(void *, int);
__stdcall static ndis_status ndis_sched_workitem(ndis_work_item *);
+__stdcall static void ndis_pkt_to_pkt(ndis_packet *, uint32_t, uint32_t,
+ ndis_packet *, uint32_t, uint32_t *);
+__stdcall static void ndis_pkt_to_pkt_safe(ndis_packet *, uint32_t, uint32_t,
+ ndis_packet *, uint32_t, uint32_t *, uint32_t);
__stdcall static void dummy(void);
/*
@@ -2506,6 +2510,110 @@ ndis_sched_workitem(work)
}
__stdcall static void
+ndis_pkt_to_pkt(dpkt, doff, reqlen, spkt, soff, cpylen)
+ ndis_packet *dpkt;
+ uint32_t doff;
+ uint32_t reqlen;
+ ndis_packet *spkt;
+ uint32_t soff;
+ uint32_t *cpylen;
+{
+ ndis_buffer *src, *dst;
+ char *sptr, *dptr;
+ int resid, copied, len, scnt, dcnt;
+
+ *cpylen = 0;
+
+ src = spkt->np_private.npp_head;
+ dst = dpkt->np_private.npp_head;
+
+ sptr = MDL_VA(src);
+ dptr = MDL_VA(dst);
+ scnt = src->nb_bytecount;
+ dcnt = dst->nb_bytecount;
+
+ while (soff) {
+ if (src->nb_bytecount > soff) {
+ sptr += soff;
+ scnt = src->nb_bytecount - soff;
+ break;
+ }
+ soff -= src->nb_bytecount;
+ src = src->nb_next;
+ if (src == NULL)
+ return;
+ sptr = MDL_VA(src);
+ }
+
+ while (doff) {
+ if (dst->nb_bytecount > doff) {
+ dptr += doff;
+ dcnt = dst->nb_bytecount - doff;
+ break;
+ }
+ doff -= dst->nb_bytecount;
+ dst = dst->nb_next;
+ if (dst == NULL)
+ return;
+ dptr = MDL_VA(dst);
+ }
+
+ resid = reqlen;
+ copied = 0;
+
+ while(1) {
+ if (resid < scnt)
+ len = resid;
+ else
+ len = scnt;
+ if (dcnt < len)
+ len = dcnt;
+
+ bcopy(sptr, dptr, len);
+
+ copied += len;
+ resid -= len;
+ if (resid == 0)
+ break;
+
+ dcnt -= len;
+ if (dcnt == 0) {
+ dst = dst->nb_next;
+ if (dst == NULL)
+ break;
+ dptr = MDL_VA(dst);
+ dcnt = dst->nb_bytecount;
+ }
+
+ scnt -= len;
+ if (scnt == 0) {
+ src = src->nb_next;
+ if (src == NULL)
+ break;
+ sptr = MDL_VA(src);
+ scnt = src->nb_bytecount;
+ }
+ }
+
+ *cpylen = copied;
+ return;
+}
+
+__stdcall static void
+ndis_pkt_to_pkt_safe(dpkt, doff, reqlen, spkt, soff, cpylen, prio)
+ ndis_packet *dpkt;
+ uint32_t doff;
+ uint32_t reqlen;
+ ndis_packet *spkt;
+ uint32_t soff;
+ uint32_t *cpylen;
+ uint32_t prio;
+{
+ ndis_pkt_to_pkt(dpkt, doff, reqlen, spkt, soff, cpylen);
+ return;
+}
+
+__stdcall static void
dummy()
{
printf ("NDIS dummy called...\n");
@@ -2513,6 +2621,8 @@ dummy()
}
image_patch_table ndis_functbl[] = {
+ { "NdisCopyFromPacketToPacket", (FUNC)ndis_pkt_to_pkt },
+ { "NdisCopyFromPacketToPacketSafe", (FUNC)ndis_pkt_to_pkt_safe },
{ "NdisScheduleWorkItem", (FUNC)ndis_sched_workitem },
{ "NdisMIndicateStatusComplete", (FUNC)ndis_ind_statusdone },
{ "NdisMIndicateStatus", (FUNC)ndis_ind_status },