/* This check is no longer done by usbnet */ if (skb->len < dev->net->hard_header_len) return0;
header = (struct gl_header *) skb->data;
// get the packet count of the received skb
count = le32_to_cpu(header->packet_count); if (count > GL_MAX_TRANSMIT_PACKETS) {
netdev_dbg(dev->net, "genelink: invalid received packet count %u\n",
count); return0;
}
// set the current packet pointer to the first packet
packet = &header->packets;
// decrement the length for the packet count size 4 bytes
skb_pull(skb, 4);
while (count > 1) { // get the packet length
size = le32_to_cpu(packet->packet_length);
// this may be a broken packet if (size > GL_MAX_PACKET_LEN) {
netdev_dbg(dev->net, "genelink: invalid rx length %d\n",
size); return0;
}
// allocate the skb for the individual packet
gl_skb = alloc_skb(size, GFP_ATOMIC); if (gl_skb) {
// copy the packet data to the new skb
skb_put_data(gl_skb, packet->packet_data, size);
usbnet_skb_return(dev, gl_skb);
}
// advance to the next packet
packet = (struct gl_packet *)&packet->packet_data[size];
count--;
// shift the data pointer to the next gl_packet
skb_pull(skb, size + 4);
}
// skip the packet length field 4 bytes
skb_pull(skb, 4);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.