|
Lines 22-27
Link Here
|
| 22 |
#include <linux/types.h> |
22 |
#include <linux/types.h> |
| 23 |
#include <linux/string.h> |
23 |
#include <linux/string.h> |
| 24 |
#include <linux/ctype.h> |
24 |
#include <linux/ctype.h> |
|
|
25 |
#include <linux/list.h> |
| 25 |
|
26 |
|
| 26 |
#include "ndis.h" |
27 |
#include "ndis.h" |
| 27 |
#include "iw_ndis.h" |
28 |
#include "iw_ndis.h" |
|
Lines 1045-1050
Link Here
|
| 1045 |
TRACEEXIT3(return); |
1046 |
TRACEEXIT3(return); |
| 1046 |
} |
1047 |
} |
| 1047 |
|
1048 |
|
|
|
1049 |
struct virt_mem_map { |
| 1050 |
struct list_head list; |
| 1051 |
void* virt; |
| 1052 |
void* buffer; |
| 1053 |
}; |
| 1054 |
typedef struct virt_mem_map virt_mem_map; |
| 1055 |
|
| 1056 |
static LIST_HEAD(map_list); |
| 1057 |
|
| 1048 |
STDCALL void WRAP_EXPORT(NdisAllocateBufferPool) |
1058 |
STDCALL void WRAP_EXPORT(NdisAllocateBufferPool) |
| 1049 |
(NDIS_STATUS *status, void *poolhandle, UINT size) |
1059 |
(NDIS_STATUS *status, void *poolhandle, UINT size) |
| 1050 |
{ |
1060 |
{ |
|
Lines 1064-1070
Link Here
|
| 1064 |
(NDIS_STATUS *status, ndis_buffer **buffer, |
1074 |
(NDIS_STATUS *status, ndis_buffer **buffer, |
| 1065 |
void *poolhandle, void *virt, UINT len) |
1075 |
void *poolhandle, void *virt, UINT len) |
| 1066 |
{ |
1076 |
{ |
| 1067 |
ndis_buffer *buf = kmalloc(sizeof(ndis_buffer), GFP_ATOMIC); |
1077 |
struct list_head *tmp; |
|
|
1078 |
ndis_buffer *buf; |
| 1079 |
if(list_empty(&map_list)) { |
| 1080 |
goto doalloc; |
| 1081 |
} |
| 1082 |
list_for_each(tmp, &map_list){ |
| 1083 |
struct virt_mem_map* map = list_entry(tmp, struct virt_mem_map, list); |
| 1084 |
if(map->virt == virt) { |
| 1085 |
buf = (ndis_buffer*) map->buffer; |
| 1086 |
memset(buf, 0, sizeof(ndis_buffer)); |
| 1087 |
buf->startva = virt; |
| 1088 |
buf->byteoffset = 0; |
| 1089 |
buf->bytecount = len; |
| 1090 |
buf->next = NULL; |
| 1091 |
*buffer = buf; |
| 1092 |
*status = NDIS_STATUS_SUCCESS; |
| 1093 |
return; |
| 1094 |
} |
| 1095 |
} |
| 1096 |
doalloc: |
| 1097 |
buf = kmalloc(sizeof(ndis_buffer), GFP_ATOMIC); |
| 1068 |
TRACEENTER4("%s", ""); |
1098 |
TRACEENTER4("%s", ""); |
| 1069 |
if (!buf) { |
1099 |
if (!buf) { |
| 1070 |
ERROR("%s", "Couldn't allocate memory"); |
1100 |
ERROR("%s", "Couldn't allocate memory"); |
|
Lines 1080-1085
Link Here
|
| 1080 |
buf->next = NULL; |
1110 |
buf->next = NULL; |
| 1081 |
|
1111 |
|
| 1082 |
*buffer = buf; |
1112 |
*buffer = buf; |
|
|
1113 |
|
| 1114 |
{ |
| 1115 |
virt_mem_map *new_entry = kmalloc(sizeof(struct virt_mem_map), GFP_ATOMIC); |
| 1116 |
if(!new_entry) { |
| 1117 |
ERROR("%s", "Couldn't allocate memory"); |
| 1118 |
*status = NDIS_STATUS_FAILURE; |
| 1119 |
TRACEEXIT4(return); |
| 1120 |
} |
| 1121 |
INIT_LIST_HEAD(&new_entry->list); |
| 1122 |
new_entry->virt = virt; |
| 1123 |
new_entry->buffer = buf; |
| 1124 |
list_add(&new_entry->list, &map_list); |
| 1125 |
} |
| 1126 |
|
| 1083 |
|
1127 |
|
| 1084 |
DBGTRACE4("allocated buffer: %p", buf); |
1128 |
DBGTRACE4("allocated buffer: %p", buf); |
| 1085 |
*status = NDIS_STATUS_SUCCESS; |
1129 |
*status = NDIS_STATUS_SUCCESS; |
|
Lines 1089-1098
Link Here
|
| 1089 |
STDCALL void WRAP_EXPORT(NdisFreeBuffer) |
1133 |
STDCALL void WRAP_EXPORT(NdisFreeBuffer) |
| 1090 |
(ndis_buffer *buffer) |
1134 |
(ndis_buffer *buffer) |
| 1091 |
{ |
1135 |
{ |
|
|
1136 |
struct list_head *tmp; |
| 1092 |
TRACEENTER4("%p", buffer); |
1137 |
TRACEENTER4("%p", buffer); |
|
|
1138 |
if (buffer) { |
| 1139 |
list_for_each(tmp, &map_list){ |
| 1140 |
struct virt_mem_map* map = list_entry(tmp, struct virt_mem_map, list); |
| 1141 |
if(map->buffer == buffer) { |
| 1142 |
list_del(&map->list); |
| 1143 |
kfree(map->buffer); |
| 1144 |
kfree(map); |
| 1145 |
return; |
| 1146 |
} |
| 1147 |
} |
| 1093 |
|
1148 |
|
| 1094 |
if (buffer) |
1149 |
} |
| 1095 |
kfree(buffer); |
|
|
| 1096 |
TRACEEXIT4(return); |
1150 |
TRACEEXIT4(return); |
| 1097 |
} |
1151 |
} |
| 1098 |
|
1152 |
|