return 0;
}
-static struct sk_buff *android_tx_fixup(struct usbnet *dev,
- struct sk_buff *skb,
- gfp_t flags)
-{
- struct sk_buff *tx_skb;
-
- if ((unsigned long)skb->data % 4) {
- tx_skb = alloc_skb(skb->len + NET_IP_ALIGN, flags);
- if (tx_skb)
- memcpy(skb_put(tx_skb, skb->len), skb->data, skb->len);
- dev_kfree_skb_any(skb);
- } else
- tx_skb = skb;
-
- return tx_skb;
-}
-
static const struct driver_info cdc_info = {
.description = "CDC Ethernet Device",
.flags = FLAG_ETHER | FLAG_POINTTOPOINT,
.unbind = usbnet_cdc_unbind,
.status = usbnet_cdc_status,
.manage_power = cdc_manage_power,
- .tx_fixup = android_tx_fixup,
};
static const struct driver_info wwan_info = {
}
}
}
+
+//$_rbox_$_modify_$_chenzhi
+//$_rbox_$_modify_$_begin
+/* data must be 4-byte aligned */
+ length = ((unsigned long)skb->data) & 0x3;
+ if (length) {
+ if (skb_cloned(skb) ||
+ ((skb_headroom(skb) < length) &&
+ (skb_tailroom(skb) < (4-length)))) {
+ struct sk_buff *skb2;
+ /* copy skb with proper alignment */
+ skb2 = skb_copy_expand(skb, 0, 4, GFP_ATOMIC);
+ dev_kfree_skb_any(skb);
+ skb = skb2;
+ if (!skb)
+ goto drop;
+ } else {
+ /* move data inside buffer */
+ length = ((skb_headroom(skb) >= length) ? 0 : 4)-length;
+ memmove(skb->data+length, skb->data, skb->len);
+ skb_reserve(skb, length);
+ }
+ }
+//$_rbox_$_modify_$_end
length = skb->len;
if (!(urb = usb_alloc_urb (0, GFP_ATOMIC))) {