#include <asm/io.h>
#include <asm/byteorder.h>
#include <asm/system.h>
+#include <asm/unaligned.h>
#undef RNDIS_PM
static rndis_params rndis_per_dev_params [RNDIS_MAX_CONFIGS];
/* Driver Version */
-static const u32 rndis_driver_version = __constant_cpu_to_le32 (1);
+static const __le32 rndis_driver_version = __constant_cpu_to_le32 (1);
/* Function Prototypes */
static int rndis_init_response (int configNr, rndis_init_msg_type *buf);
{
int retval = -ENOTSUPP;
u32 length = 0;
- u32 *tmp;
+ __le32 *tmp;
int i, count;
rndis_query_cmplt_type *resp;
DEBUG ("%s: OID_GEN_SUPPORTED_LIST\n", __FUNCTION__);
length = sizeof (oid_supported_list);
count = length / sizeof (u32);
- tmp = (u32 *) ((u8 *)resp + 24);
+ tmp = (__le32 *) ((u8 *)resp + 24);
for (i = 0; i < count; i++)
tmp[i] = cpu_to_le32 (oid_supported_list[i]);
retval = 0;
* reddite ergo quae sunt Caesaris Caesari
* et quae sunt Dei Deo!
*/
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
break;
case OID_GEN_MEDIA_SUPPORTED:
DEBUG("%s: OID_GEN_MEDIA_SUPPORTED\n", __FUNCTION__);
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr].medium);
retval = 0;
break;
DEBUG("%s: OID_GEN_MEDIA_IN_USE\n", __FUNCTION__);
length = 4;
/* one medium, one transport... (maybe you do it better) */
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr].medium);
retval = 0;
break;
DEBUG("%s: OID_GEN_MAXIMUM_FRAME_SIZE\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].dev) {
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr].dev->mtu);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
/* mandatory */
case OID_GEN_LINK_SPEED:
- DEBUG("%s: OID_GEN_LINK_SPEED\n", __FUNCTION__);
+// DEBUG("%s: OID_GEN_LINK_SPEED\n", __FUNCTION__);
length = 4;
if (rndis_per_dev_params [configNr].media_state
== NDIS_MEDIA_STATE_DISCONNECTED)
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
else
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr].speed);
retval = 0;
break;
DEBUG("%s: OID_GEN_TRANSMIT_BLOCK_SIZE\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].dev) {
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr].dev->mtu);
retval = 0;
}
DEBUG("%s: OID_GEN_RECEIVE_BLOCK_SIZE\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].dev) {
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr].dev->mtu);
retval = 0;
}
case OID_GEN_VENDOR_ID:
DEBUG("%s: OID_GEN_VENDOR_ID\n", __FUNCTION__);
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr].vendorID);
retval = 0;
break;
DEBUG("%s: OID_GEN_VENDOR_DRIVER_VERSION\n", __FUNCTION__);
length = 4;
/* Created as LE */
- *((u32 *) resp + 6) = rndis_driver_version;
+ *((__le32 *) resp + 6) = rndis_driver_version;
retval = 0;
break;
case OID_GEN_CURRENT_PACKET_FILTER:
DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER\n", __FUNCTION__);
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params[configNr].filter);
retval = 0;
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
DEBUG("%s: OID_GEN_MAXIMUM_TOTAL_SIZE\n", __FUNCTION__);
length = 4;
- *((u32 *) resp + 6) = __constant_cpu_to_le32(
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32(
RNDIS_MAX_TOTAL_SIZE);
retval = 0;
break;
case OID_GEN_MEDIA_CONNECT_STATUS:
DEBUG("%s: OID_GEN_MEDIA_CONNECT_STATUS\n", __FUNCTION__);
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.media_state);
retval = 0;
case OID_GEN_PHYSICAL_MEDIUM:
DEBUG("%s: OID_GEN_PHYSICAL_MEDIUM\n", __FUNCTION__);
length = 4;
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
break;
case OID_GEN_MAC_OPTIONS: /* from WinME */
DEBUG("%s: OID_GEN_MAC_OPTIONS\n", __FUNCTION__);
length = 4;
- *((u32 *) resp + 6) = __constant_cpu_to_le32(
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32(
NDIS_MAC_OPTION_RECEIVE_SERIALIZED
| NDIS_MAC_OPTION_FULL_DUPLEX);
retval = 0;
DEBUG("%s: OID_GEN_XMIT_OK\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr].stats->tx_packets -
rndis_per_dev_params [configNr].stats->tx_errors -
rndis_per_dev_params [configNr].stats->tx_dropped);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
DEBUG("%s: OID_GEN_RCV_OK\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr].stats->rx_packets -
rndis_per_dev_params [configNr].stats->rx_errors -
rndis_per_dev_params [configNr].stats->rx_dropped);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
DEBUG("%s: OID_GEN_XMIT_ERROR\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->tx_errors);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_RCV_ERROR:
DEBUG("%s: OID_GEN_RCV_ERROR\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->rx_errors);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_RCV_NO_BUFFER:
DEBUG("%s: OID_GEN_RCV_NO_BUFFER\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->rx_dropped);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
*/
if (rndis_per_dev_params [configNr].stats) {
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
(rndis_per_dev_params [configNr]
.stats->tx_packets -
rndis_per_dev_params [configNr]
* 123);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
/* dito */
if (rndis_per_dev_params [configNr].stats) {
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
(rndis_per_dev_params [configNr]
.stats->tx_packets -
rndis_per_dev_params [configNr]
/ 123);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_MULTICAST_BYTES_XMIT:
DEBUG("%s: OID_GEN_MULTICAST_BYTES_XMIT\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->multicast*1234);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_MULTICAST_FRAMES_XMIT:
DEBUG("%s: OID_GEN_MULTICAST_FRAMES_XMIT\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->multicast);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_BROADCAST_BYTES_XMIT:
DEBUG("%s: OID_GEN_BROADCAST_BYTES_XMIT\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->tx_packets/42*255);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_BROADCAST_FRAMES_XMIT:
DEBUG("%s: OID_GEN_BROADCAST_FRAMES_XMIT\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->tx_packets/42);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_DIRECTED_BYTES_RCV:
DEBUG("%s: OID_GEN_DIRECTED_BYTES_RCV\n", __FUNCTION__);
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
break;
case OID_GEN_DIRECTED_FRAMES_RCV:
DEBUG("%s: OID_GEN_DIRECTED_FRAMES_RCV\n", __FUNCTION__);
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
break;
case OID_GEN_MULTICAST_BYTES_RCV:
DEBUG("%s: OID_GEN_MULTICAST_BYTES_RCV\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->multicast * 1111);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_MULTICAST_FRAMES_RCV:
DEBUG("%s: OID_GEN_MULTICAST_FRAMES_RCV\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->multicast);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_BROADCAST_BYTES_RCV:
DEBUG("%s: OID_GEN_BROADCAST_BYTES_RCV\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->rx_packets/42*255);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_BROADCAST_FRAMES_RCV:
DEBUG("%s: OID_GEN_BROADCAST_FRAMES_RCV\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->rx_packets/42);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_RCV_CRC_ERROR:
DEBUG("%s: OID_GEN_RCV_CRC_ERROR\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) {
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->rx_crc_errors);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
case OID_GEN_TRANSMIT_QUEUE_LENGTH:
DEBUG("%s: OID_GEN_TRANSMIT_QUEUE_LENGTH\n", __FUNCTION__);
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
break;
#endif /* RNDIS_OPTIONAL_STATS */
length);
retval = 0;
} else {
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
DEBUG("%s: OID_802_3_MULTICAST_LIST\n", __FUNCTION__);
length = 4;
/* Multicast base address only */
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0xE0000000);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0xE0000000);
retval = 0;
break;
DEBUG("%s: OID_802_3_MAXIMUM_LIST_SIZE\n", __FUNCTION__);
length = 4;
/* Multicast base address only */
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (1);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (1);
retval = 0;
break;
if (rndis_per_dev_params [configNr].stats)
{
length = 4;
- *((u32 *) resp + 6) = cpu_to_le32 (
+ *((__le32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr]
.stats->rx_frame_errors);
retval = 0;
case OID_802_3_XMIT_ONE_COLLISION:
DEBUG("%s: OID_802_3_XMIT_ONE_COLLISION\n", __FUNCTION__);
length = 4;
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
break;
case OID_802_3_XMIT_MORE_COLLISIONS:
DEBUG("%s: OID_802_3_XMIT_MORE_COLLISIONS\n", __FUNCTION__);
length = 4;
- *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
+ *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
break;
retval = 0;
/* FIXME use these NDIS_PACKET_TYPE_* bitflags to
- * filter packets in hard_start_xmit()
- * NDIS_PACKET_TYPE_x == CDC_PACKET_TYPE_x for x in:
+ * set the cdc_filter; it's not RNDIS-specific
+ * NDIS_PACKET_TYPE_x == USB_CDC_PACKET_TYPE_x for x in:
* PROMISCUOUS, DIRECTED,
* MULTICAST, ALL_MULTICAST, BROADCAST
*/
- params->filter = cpu_to_le32p((u32 *)buf);
+ params->filter = le32_to_cpup((__le32 *)buf);
DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER %08x\n",
__FUNCTION__, params->filter);
resp->MessageLength = __constant_cpu_to_le32 (24);
resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
- if (gen_ndis_query_resp (configNr, cpu_to_le32 (buf->OID), r)) {
+ if (gen_ndis_query_resp (configNr, le32_to_cpu (buf->OID), r)) {
/* OID not supported */
resp->Status = __constant_cpu_to_le32 (
RNDIS_STATUS_NOT_SUPPORTED);
resp = (rndis_set_cmplt_type *) r->buf;
if (!resp) return -ENOMEM;
- BufLength = cpu_to_le32 (buf->InformationBufferLength);
- BufOffset = cpu_to_le32 (buf->InformationBufferOffset);
+ BufLength = le32_to_cpu (buf->InformationBufferLength);
+ BufOffset = le32_to_cpu (buf->InformationBufferOffset);
#ifdef VERBOSE
DEBUG("%s: Length: %d\n", __FUNCTION__, BufLength);
resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_SET_CMPLT);
resp->MessageLength = __constant_cpu_to_le32 (16);
resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
- if (gen_ndis_set_resp (configNr, cpu_to_le32 (buf->OID),
+ if (gen_ndis_set_resp (configNr, le32_to_cpu (buf->OID),
((u8 *) buf) + 8 + BufOffset, BufLength, r))
resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_NOT_SUPPORTED);
else resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
*/
int rndis_msg_parser (u8 configNr, u8 *buf)
{
- u32 MsgType, MsgLength, *tmp;
+ u32 MsgType, MsgLength;
+ __le32 *tmp;
struct rndis_params *params;
if (!buf)
return -ENOMEM;
- tmp = (u32 *) buf;
- MsgType = cpu_to_le32p(tmp++);
- MsgLength = cpu_to_le32p(tmp++);
+ tmp = (__le32 *) buf;
+ MsgType = le32_to_cpup(tmp++);
+ MsgLength = le32_to_cpup(tmp++);
if (configNr >= RNDIS_MAX_CONFIGS)
return -ENOTSUPP;
void rndis_add_hdr (struct sk_buff *skb)
{
- if (!skb) return;
- skb_push (skb, sizeof (struct rndis_packet_msg_type));
- memset (skb->data, 0, sizeof (struct rndis_packet_msg_type));
- *((u32 *) skb->data) = __constant_cpu_to_le32 (1);
- *((u32 *) skb->data + 1) = cpu_to_le32(skb->len);
- *((u32 *) skb->data + 2) = __constant_cpu_to_le32 (36);
- *((u32 *) skb->data + 3) = cpu_to_le32(skb->len - 44);
-
- return;
+ struct rndis_packet_msg_type *header;
+
+ if (!skb)
+ return;
+ header = (void *) skb_push (skb, sizeof *header);
+ memset (header, 0, sizeof *header);
+ header->MessageType = __constant_cpu_to_le32(REMOTE_NDIS_PACKET_MSG);
+ header->MessageLength = cpu_to_le32(skb->len);
+ header->DataOffset = __constant_cpu_to_le32 (36);
+ header->DataLength = cpu_to_le32(skb->len - sizeof *header);
}
void rndis_free_response (int configNr, u8 *buf)
return r;
}
-int rndis_rm_hdr (u8 *buf, u32 *length)
+int rndis_rm_hdr(struct sk_buff *skb)
{
- u32 i, messageLen, dataOffset, *tmp;
-
- tmp = (u32 *) buf;
+ /* tmp points to a struct rndis_packet_msg_type */
+ __le32 *tmp = (void *) skb->data;
- if (!buf || !length) return -1;
- if (cpu_to_le32p(tmp++) != 1) return -1;
-
- messageLen = cpu_to_le32p(tmp++);
- dataOffset = cpu_to_le32p(tmp++) + 8;
+ /* MessageType, MessageLength */
+ if (__constant_cpu_to_le32(REMOTE_NDIS_PACKET_MSG)
+ != get_unaligned(tmp++))
+ return -EINVAL;
+ tmp++;
+
+ /* DataOffset, DataLength */
+ if (!skb_pull(skb, le32_to_cpu(get_unaligned(tmp++))
+ + 8 /* offset of DataOffset */))
+ return -EOVERFLOW;
+ skb_trim(skb, le32_to_cpu(get_unaligned(tmp++)));
- if (messageLen < dataOffset || messageLen > *length) return -1;
-
- for (i = dataOffset; i < messageLen; i++)
- buf [i - dataOffset] = buf [i];
-
- *length = messageLen - dataOffset;
-
return 0;
}