Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
appletalk: Fix OOPS in atalk_release().
mlx4: Fixing bad size of event queue buffer
mlx4: Fixing use after free
bonding:typo in comment
sctp: Pass __GFP_NOWARN to hash table allocation attempts.
connector: convert to synchronous netlink message processing
fib: add rtnl locking in ip_fib_net_exit
atm/solos-pci: Don't flap VCs when carrier state changes
atm/solos-pci: Don't include frame pseudo-header on transmit hex-dump
atm/solos-pci: Use VPI.VCI notation uniformly.
Atheros, atl2: Fix mem leaks in error paths of atl2_set_eeprom
netdev: fix mtu check when TSO is enabled
net/usb: Ethernet quirks for the LG-VL600 4G modem
phylib: phy_attach_direct: phy_init_hw can fail, add cleanup
bridge: mcast snooping, fix length check of snooped MLDv1/2
via-ircc: Pass PCI device pointer to dma_{alloc, free}_coherent()
via-ircc: Use pci_{get, set}_drvdata() instead of static pointer variable
net: gre: provide multicast mappings for ipv4 and ipv6
bridge: Fix compilation warning in function br_stp_recalculate_bridge_id()
net: Fix warnings caused by MAX_SKB_FRAGS change.

+543 -224
+11 -28
drivers/atm/solos-pci.c
··· 165 165 static irqreturn_t solos_irq(int irq, void *dev_id); 166 166 static struct atm_vcc* find_vcc(struct atm_dev *dev, short vpi, int vci); 167 167 static int list_vccs(int vci); 168 - static void release_vccs(struct atm_dev *dev); 169 168 static int atm_init(struct solos_card *, struct device *); 170 169 static void atm_remove(struct solos_card *); 171 170 static int send_command(struct solos_card *card, int dev, const char *buf, size_t size); ··· 383 384 /* Anything but 'Showtime' is down */ 384 385 if (strcmp(state_str, "Showtime")) { 385 386 atm_dev_signal_change(card->atmdev[port], ATM_PHY_SIG_LOST); 386 - release_vccs(card->atmdev[port]); 387 387 dev_info(&card->dev->dev, "Port %d: %s\n", port, state_str); 388 388 return 0; 389 389 } ··· 695 697 size); 696 698 } 697 699 if (atmdebug) { 698 - dev_info(&card->dev->dev, "Received: device %d\n", port); 700 + dev_info(&card->dev->dev, "Received: port %d\n", port); 699 701 dev_info(&card->dev->dev, "size: %d VPI: %d VCI: %d\n", 700 702 size, le16_to_cpu(header->vpi), 701 703 le16_to_cpu(header->vci)); ··· 708 710 le16_to_cpu(header->vci)); 709 711 if (!vcc) { 710 712 if (net_ratelimit()) 711 - dev_warn(&card->dev->dev, "Received packet for unknown VCI.VPI %d.%d on port %d\n", 712 - le16_to_cpu(header->vci), le16_to_cpu(header->vpi), 713 + dev_warn(&card->dev->dev, "Received packet for unknown VPI.VCI %d.%d on port %d\n", 714 + le16_to_cpu(header->vpi), le16_to_cpu(header->vci), 713 715 port); 714 716 continue; 715 717 } ··· 826 828 } 827 829 read_unlock(&vcc_sklist_lock); 828 830 return num_found; 829 - } 830 - 831 - static void release_vccs(struct atm_dev *dev) 832 - { 833 - int i; 834 - 835 - write_lock_irq(&vcc_sklist_lock); 836 - for (i = 0; i < VCC_HTABLE_SIZE; i++) { 837 - struct hlist_head *head = &vcc_hash[i]; 838 - struct hlist_node *node, *tmp; 839 - struct sock *s; 840 - struct atm_vcc *vcc; 841 - 842 - sk_for_each_safe(s, node, tmp, head) { 843 - vcc = atm_sk(s); 844 - if (vcc->dev == dev) { 845 - vcc_release_async(vcc, -EPIPE); 846 - sk_del_node_init(s); 847 - } 848 - } 849 - } 850 - write_unlock_irq(&vcc_sklist_lock); 851 831 } 852 832 853 833 ··· 994 1018 995 1019 /* Clean up and free oldskb now it's gone */ 996 1020 if (atmdebug) { 1021 + struct pkt_hdr *header = (void *)oldskb->data; 1022 + int size = le16_to_cpu(header->size); 1023 + 1024 + skb_pull(oldskb, sizeof(*header)); 997 1025 dev_info(&card->dev->dev, "Transmitted: port %d\n", 998 1026 port); 1027 + dev_info(&card->dev->dev, "size: %d VPI: %d VCI: %d\n", 1028 + size, le16_to_cpu(header->vpi), 1029 + le16_to_cpu(header->vci)); 999 1030 print_buffer(oldskb); 1000 1031 } 1001 1032 ··· 1245 1262 card->atmdev[i]->ci_range.vci_bits = 16; 1246 1263 card->atmdev[i]->dev_data = card; 1247 1264 card->atmdev[i]->phy_data = (void *)(unsigned long)i; 1248 - atm_dev_signal_change(card->atmdev[i], ATM_PHY_SIG_UNKNOWN); 1265 + atm_dev_signal_change(card->atmdev[i], ATM_PHY_SIG_FOUND); 1249 1266 1250 1267 skb = alloc_skb(sizeof(*header), GFP_ATOMIC); 1251 1268 if (!skb) {
+17 -41
drivers/connector/cn_queue.c
··· 31 31 #include <linux/connector.h> 32 32 #include <linux/delay.h> 33 33 34 - void cn_queue_wrapper(struct work_struct *work) 35 - { 36 - struct cn_callback_entry *cbq = 37 - container_of(work, struct cn_callback_entry, work); 38 - struct cn_callback_data *d = &cbq->data; 39 - struct cn_msg *msg = NLMSG_DATA(nlmsg_hdr(d->skb)); 40 - struct netlink_skb_parms *nsp = &NETLINK_CB(d->skb); 41 - 42 - d->callback(msg, nsp); 43 - 44 - kfree_skb(d->skb); 45 - d->skb = NULL; 46 - 47 - kfree(d->free); 48 - } 49 - 50 34 static struct cn_callback_entry * 51 - cn_queue_alloc_callback_entry(const char *name, struct cb_id *id, 35 + cn_queue_alloc_callback_entry(struct cn_queue_dev *dev, const char *name, 36 + struct cb_id *id, 52 37 void (*callback)(struct cn_msg *, struct netlink_skb_parms *)) 53 38 { 54 39 struct cn_callback_entry *cbq; ··· 44 59 return NULL; 45 60 } 46 61 62 + atomic_set(&cbq->refcnt, 1); 63 + 64 + atomic_inc(&dev->refcnt); 65 + cbq->pdev = dev; 66 + 47 67 snprintf(cbq->id.name, sizeof(cbq->id.name), "%s", name); 48 68 memcpy(&cbq->id.id, id, sizeof(struct cb_id)); 49 - cbq->data.callback = callback; 50 - 51 - INIT_WORK(&cbq->work, &cn_queue_wrapper); 69 + cbq->callback = callback; 52 70 return cbq; 53 71 } 54 72 55 - static void cn_queue_free_callback(struct cn_callback_entry *cbq) 73 + void cn_queue_release_callback(struct cn_callback_entry *cbq) 56 74 { 57 - flush_workqueue(cbq->pdev->cn_queue); 75 + if (!atomic_dec_and_test(&cbq->refcnt)) 76 + return; 77 + 78 + atomic_dec(&cbq->pdev->refcnt); 58 79 kfree(cbq); 59 80 } 60 81 ··· 76 85 struct cn_callback_entry *cbq, *__cbq; 77 86 int found = 0; 78 87 79 - cbq = cn_queue_alloc_callback_entry(name, id, callback); 88 + cbq = cn_queue_alloc_callback_entry(dev, name, id, callback); 80 89 if (!cbq) 81 90 return -ENOMEM; 82 - 83 - atomic_inc(&dev->refcnt); 84 - cbq->pdev = dev; 85 91 86 92 spin_lock_bh(&dev->queue_lock); 87 93 list_for_each_entry(__cbq, &dev->queue_list, callback_entry) { ··· 92 104 spin_unlock_bh(&dev->queue_lock); 93 105 94 106 if (found) { 95 - cn_queue_free_callback(cbq); 96 - atomic_dec(&dev->refcnt); 107 + cn_queue_release_callback(cbq); 97 108 return -EINVAL; 98 109 } 99 110 ··· 117 130 } 118 131 spin_unlock_bh(&dev->queue_lock); 119 132 120 - if (found) { 121 - cn_queue_free_callback(cbq); 122 - atomic_dec(&dev->refcnt); 123 - } 133 + if (found) 134 + cn_queue_release_callback(cbq); 124 135 } 125 136 126 137 struct cn_queue_dev *cn_queue_alloc_dev(const char *name, struct sock *nls) ··· 136 151 137 152 dev->nls = nls; 138 153 139 - dev->cn_queue = alloc_ordered_workqueue(dev->name, 0); 140 - if (!dev->cn_queue) { 141 - kfree(dev); 142 - return NULL; 143 - } 144 - 145 154 return dev; 146 155 } 147 156 148 157 void cn_queue_free_dev(struct cn_queue_dev *dev) 149 158 { 150 159 struct cn_callback_entry *cbq, *n; 151 - 152 - flush_workqueue(dev->cn_queue); 153 - destroy_workqueue(dev->cn_queue); 154 160 155 161 spin_lock_bh(&dev->queue_lock); 156 162 list_for_each_entry_safe(cbq, n, &dev->queue_list, callback_entry)
+12 -35
drivers/connector/connector.c
··· 122 122 */ 123 123 static int cn_call_callback(struct sk_buff *skb) 124 124 { 125 - struct cn_callback_entry *__cbq, *__new_cbq; 125 + struct cn_callback_entry *i, *cbq = NULL; 126 126 struct cn_dev *dev = &cdev; 127 127 struct cn_msg *msg = NLMSG_DATA(nlmsg_hdr(skb)); 128 + struct netlink_skb_parms *nsp = &NETLINK_CB(skb); 128 129 int err = -ENODEV; 129 130 130 131 spin_lock_bh(&dev->cbdev->queue_lock); 131 - list_for_each_entry(__cbq, &dev->cbdev->queue_list, callback_entry) { 132 - if (cn_cb_equal(&__cbq->id.id, &msg->id)) { 133 - if (likely(!work_pending(&__cbq->work) && 134 - __cbq->data.skb == NULL)) { 135 - __cbq->data.skb = skb; 136 - 137 - if (queue_work(dev->cbdev->cn_queue, 138 - &__cbq->work)) 139 - err = 0; 140 - else 141 - err = -EINVAL; 142 - } else { 143 - struct cn_callback_data *d; 144 - 145 - err = -ENOMEM; 146 - __new_cbq = kzalloc(sizeof(struct cn_callback_entry), GFP_ATOMIC); 147 - if (__new_cbq) { 148 - d = &__new_cbq->data; 149 - d->skb = skb; 150 - d->callback = __cbq->data.callback; 151 - d->free = __new_cbq; 152 - 153 - INIT_WORK(&__new_cbq->work, 154 - &cn_queue_wrapper); 155 - 156 - if (queue_work(dev->cbdev->cn_queue, 157 - &__new_cbq->work)) 158 - err = 0; 159 - else { 160 - kfree(__new_cbq); 161 - err = -EINVAL; 162 - } 163 - } 164 - } 132 + list_for_each_entry(i, &dev->cbdev->queue_list, callback_entry) { 133 + if (cn_cb_equal(&i->id.id, &msg->id)) { 134 + atomic_inc(&i->refcnt); 135 + cbq = i; 165 136 break; 166 137 } 167 138 } 168 139 spin_unlock_bh(&dev->cbdev->queue_lock); 140 + 141 + if (cbq != NULL) { 142 + cbq->callback(msg, nsp); 143 + kfree_skb(skb); 144 + cn_queue_release_callback(cbq); 145 + } 169 146 170 147 return err; 171 148 }
+14 -8
drivers/net/atlx/atl2.c
··· 1996 1996 if (!eeprom_buff) 1997 1997 return -ENOMEM; 1998 1998 1999 - ptr = (u32 *)eeprom_buff; 1999 + ptr = eeprom_buff; 2000 2000 2001 2001 if (eeprom->offset & 3) { 2002 2002 /* need read/modify/write of first changed EEPROM word */ 2003 2003 /* only the second byte of the word is being modified */ 2004 - if (!atl2_read_eeprom(hw, first_dword*4, &(eeprom_buff[0]))) 2005 - return -EIO; 2004 + if (!atl2_read_eeprom(hw, first_dword*4, &(eeprom_buff[0]))) { 2005 + ret_val = -EIO; 2006 + goto out; 2007 + } 2006 2008 ptr++; 2007 2009 } 2008 2010 if (((eeprom->offset + eeprom->len) & 3)) { ··· 2013 2011 * only the first byte of the word is being modified 2014 2012 */ 2015 2013 if (!atl2_read_eeprom(hw, last_dword * 4, 2016 - &(eeprom_buff[last_dword - first_dword]))) 2017 - return -EIO; 2014 + &(eeprom_buff[last_dword - first_dword]))) { 2015 + ret_val = -EIO; 2016 + goto out; 2017 + } 2018 2018 } 2019 2019 2020 2020 /* Device's eeprom is always little-endian, word addressable */ 2021 2021 memcpy(ptr, bytes, eeprom->len); 2022 2022 2023 2023 for (i = 0; i < last_dword - first_dword + 1; i++) { 2024 - if (!atl2_write_eeprom(hw, ((first_dword+i)*4), eeprom_buff[i])) 2025 - return -EIO; 2024 + if (!atl2_write_eeprom(hw, ((first_dword+i)*4), eeprom_buff[i])) { 2025 + ret_val = -EIO; 2026 + goto out; 2027 + } 2026 2028 } 2027 - 2029 + out: 2028 2030 kfree(eeprom_buff); 2029 2031 return ret_val; 2030 2032 }
+1 -1
drivers/net/bonding/bond_alb.h
··· 74 74 * packets to a Client that the Hash function 75 75 * gave this entry index. 76 76 */ 77 - u32 tx_bytes; /* Each Client acumulates the BytesTx that 77 + u32 tx_bytes; /* Each Client accumulates the BytesTx that 78 78 * were tranmitted to it, and after each 79 79 * CallBack the LoadHistory is devided 80 80 * by the balance interval
+21 -73
drivers/net/irda/via-ircc.c
··· 75 75 /* We can't guess the type of connected dongle, user *must* supply it. */ 76 76 module_param(dongle_id, int, 0); 77 77 78 - /* FIXME : we should not need this, because instances should be automatically 79 - * managed by the PCI layer. Especially that we seem to only be using the 80 - * first entry. Jean II */ 81 - /* Max 4 instances for now */ 82 - static struct via_ircc_cb *dev_self[] = { NULL, NULL, NULL, NULL }; 83 - 84 78 /* Some prototypes */ 85 - static int via_ircc_open(int i, chipio_t * info, unsigned int id); 86 - static int via_ircc_close(struct via_ircc_cb *self); 79 + static int via_ircc_open(struct pci_dev *pdev, chipio_t * info, 80 + unsigned int id); 87 81 static int via_ircc_dma_receive(struct via_ircc_cb *self); 88 82 static int via_ircc_dma_receive_complete(struct via_ircc_cb *self, 89 83 int iobase); ··· 209 215 pci_write_config_byte(pcidev,0x42,(bTmp | 0xf0)); 210 216 pci_write_config_byte(pcidev,0x5a,0xc0); 211 217 WriteLPCReg(0x28, 0x70 ); 212 - if (via_ircc_open(0, &info,0x3076) == 0) 218 + if (via_ircc_open(pcidev, &info, 0x3076) == 0) 213 219 rc=0; 214 220 } else 215 221 rc = -ENODEV; //IR not turn on ··· 248 254 info.irq=FirIRQ; 249 255 info.dma=FirDRQ1; 250 256 info.dma2=FirDRQ0; 251 - if (via_ircc_open(0, &info,0x3096) == 0) 257 + if (via_ircc_open(pcidev, &info, 0x3096) == 0) 252 258 rc=0; 253 259 } else 254 260 rc = -ENODEV; //IR not turn on !!!!! ··· 258 264 return rc; 259 265 } 260 266 261 - /* 262 - * Function via_ircc_clean () 263 - * 264 - * Close all configured chips 265 - * 266 - */ 267 - static void via_ircc_clean(void) 268 - { 269 - int i; 270 - 271 - IRDA_DEBUG(3, "%s()\n", __func__); 272 - 273 - for (i=0; i < ARRAY_SIZE(dev_self); i++) { 274 - if (dev_self[i]) 275 - via_ircc_close(dev_self[i]); 276 - } 277 - } 278 - 279 - static void __devexit via_remove_one (struct pci_dev *pdev) 280 - { 281 - IRDA_DEBUG(3, "%s()\n", __func__); 282 - 283 - /* FIXME : This is ugly. We should use pci_get_drvdata(pdev); 284 - * to get our driver instance and call directly via_ircc_close(). 285 - * See vlsi_ir for details... 286 - * Jean II */ 287 - via_ircc_clean(); 288 - 289 - /* FIXME : This should be in via_ircc_close(), because here we may 290 - * theoritically disable still configured devices :-( - Jean II */ 291 - pci_disable_device(pdev); 292 - } 293 - 294 267 static void __exit via_ircc_cleanup(void) 295 268 { 296 269 IRDA_DEBUG(3, "%s()\n", __func__); 297 - 298 - /* FIXME : This should be redundant, as pci_unregister_driver() 299 - * should call via_remove_one() on each device. 300 - * Jean II */ 301 - via_ircc_clean(); 302 270 303 271 /* Cleanup all instances of the driver */ 304 272 pci_unregister_driver (&via_driver); ··· 280 324 }; 281 325 282 326 /* 283 - * Function via_ircc_open (iobase, irq) 327 + * Function via_ircc_open(pdev, iobase, irq) 284 328 * 285 329 * Open driver instance 286 330 * 287 331 */ 288 - static __devinit int via_ircc_open(int i, chipio_t * info, unsigned int id) 332 + static __devinit int via_ircc_open(struct pci_dev *pdev, chipio_t * info, 333 + unsigned int id) 289 334 { 290 335 struct net_device *dev; 291 336 struct via_ircc_cb *self; 292 337 int err; 293 338 294 339 IRDA_DEBUG(3, "%s()\n", __func__); 295 - 296 - if (i >= ARRAY_SIZE(dev_self)) 297 - return -ENOMEM; 298 340 299 341 /* Allocate new instance of the driver */ 300 342 dev = alloc_irdadev(sizeof(struct via_ircc_cb)); ··· 303 349 self->netdev = dev; 304 350 spin_lock_init(&self->lock); 305 351 306 - /* FIXME : We should store our driver instance in the PCI layer, 307 - * using pci_set_drvdata(), not in this array. 308 - * See vlsi_ir for details... - Jean II */ 309 - /* FIXME : 'i' is always 0 (see via_init_one()) :-( - Jean II */ 310 - /* Need to store self somewhere */ 311 - dev_self[i] = self; 312 - self->index = i; 352 + pci_set_drvdata(pdev, self); 353 + 313 354 /* Initialize Resource */ 314 355 self->io.cfg_base = info->cfg_base; 315 356 self->io.fir_base = info->fir_base; ··· 363 414 364 415 /* Allocate memory if needed */ 365 416 self->rx_buff.head = 366 - dma_alloc_coherent(NULL, self->rx_buff.truesize, 417 + dma_alloc_coherent(&pdev->dev, self->rx_buff.truesize, 367 418 &self->rx_buff_dma, GFP_KERNEL); 368 419 if (self->rx_buff.head == NULL) { 369 420 err = -ENOMEM; ··· 372 423 memset(self->rx_buff.head, 0, self->rx_buff.truesize); 373 424 374 425 self->tx_buff.head = 375 - dma_alloc_coherent(NULL, self->tx_buff.truesize, 426 + dma_alloc_coherent(&pdev->dev, self->tx_buff.truesize, 376 427 &self->tx_buff_dma, GFP_KERNEL); 377 428 if (self->tx_buff.head == NULL) { 378 429 err = -ENOMEM; ··· 404 455 via_hw_init(self); 405 456 return 0; 406 457 err_out4: 407 - dma_free_coherent(NULL, self->tx_buff.truesize, 458 + dma_free_coherent(&pdev->dev, self->tx_buff.truesize, 408 459 self->tx_buff.head, self->tx_buff_dma); 409 460 err_out3: 410 - dma_free_coherent(NULL, self->rx_buff.truesize, 461 + dma_free_coherent(&pdev->dev, self->rx_buff.truesize, 411 462 self->rx_buff.head, self->rx_buff_dma); 412 463 err_out2: 413 464 release_region(self->io.fir_base, self->io.fir_ext); 414 465 err_out1: 466 + pci_set_drvdata(pdev, NULL); 415 467 free_netdev(dev); 416 - dev_self[i] = NULL; 417 468 return err; 418 469 } 419 470 420 471 /* 421 - * Function via_ircc_close (self) 472 + * Function via_remove_one(pdev) 422 473 * 423 474 * Close driver instance 424 475 * 425 476 */ 426 - static int via_ircc_close(struct via_ircc_cb *self) 477 + static void __devexit via_remove_one(struct pci_dev *pdev) 427 478 { 479 + struct via_ircc_cb *self = pci_get_drvdata(pdev); 428 480 int iobase; 429 481 430 482 IRDA_DEBUG(3, "%s()\n", __func__); 431 - 432 - IRDA_ASSERT(self != NULL, return -1;); 433 483 434 484 iobase = self->io.fir_base; 435 485 ··· 441 493 __func__, self->io.fir_base); 442 494 release_region(self->io.fir_base, self->io.fir_ext); 443 495 if (self->tx_buff.head) 444 - dma_free_coherent(NULL, self->tx_buff.truesize, 496 + dma_free_coherent(&pdev->dev, self->tx_buff.truesize, 445 497 self->tx_buff.head, self->tx_buff_dma); 446 498 if (self->rx_buff.head) 447 - dma_free_coherent(NULL, self->rx_buff.truesize, 499 + dma_free_coherent(&pdev->dev, self->rx_buff.truesize, 448 500 self->rx_buff.head, self->rx_buff_dma); 449 - dev_self[self->index] = NULL; 501 + pci_set_drvdata(pdev, NULL); 450 502 451 503 free_netdev(self->netdev); 452 504 453 - return 0; 505 + pci_disable_device(pdev); 454 506 } 455 507 456 508 /*
+3 -1
drivers/net/mlx4/eq.c
··· 603 603 } 604 604 605 605 for (i = 0; i < dev->caps.num_comp_vectors; ++i) { 606 - err = mlx4_create_eq(dev, dev->caps.num_cqs + MLX4_NUM_SPARE_EQE, 606 + err = mlx4_create_eq(dev, dev->caps.num_cqs - 607 + dev->caps.reserved_cqs + 608 + MLX4_NUM_SPARE_EQE, 607 609 (dev->flags & MLX4_FLAG_MSI_X) ? i : 0, 608 610 &priv->eq_table.eq[i]); 609 611 if (err) {
+2 -1
drivers/net/mlx4/mcg.c
··· 469 469 470 470 /*remove from list of promisc qps */ 471 471 list_del(&pqp->list); 472 - kfree(pqp); 473 472 474 473 /* set the default entry not to include the removed one */ 475 474 mailbox = mlx4_alloc_cmd_mailbox(dev); ··· 527 528 out_list: 528 529 if (back_to_list) 529 530 list_add_tail(&pqp->list, &s_steer->promisc_qps[steer]); 531 + else 532 + kfree(pqp); 530 533 out_mutex: 531 534 mutex_unlock(&priv->mcg_table.mutex); 532 535 return err;
+6 -2
drivers/net/phy/phy_device.c
··· 442 442 u32 flags, phy_interface_t interface) 443 443 { 444 444 struct device *d = &phydev->dev; 445 + int err; 445 446 446 447 /* Assume that if there is no driver, that it doesn't 447 448 * exist, and we should use the genphy driver. */ 448 449 if (NULL == d->driver) { 449 - int err; 450 450 d->driver = &genphy_driver.driver; 451 451 452 452 err = d->driver->probe(d); ··· 474 474 /* Do initial configuration here, now that 475 475 * we have certain key parameters 476 476 * (dev_flags and interface) */ 477 - return phy_init_hw(phydev); 477 + err = phy_init_hw(phydev); 478 + if (err) 479 + phy_detach(phydev); 480 + 481 + return err; 478 482 } 479 483 480 484 /**
+15
drivers/net/usb/Kconfig
··· 433 433 To compile this driver as a module, choose M here: the 434 434 module will be called sierra_net. 435 435 436 + config USB_VL600 437 + tristate "LG VL600 modem dongle" 438 + depends on USB_NET_CDCETHER 439 + select USB_ACM 440 + help 441 + Select this if you want to use an LG Electronics 4G/LTE usb modem 442 + called VL600. This driver only handles the ethernet 443 + interface exposed by the modem firmware. To establish a connection 444 + you will first need a userspace program that sends the right 445 + command to the modem through its CDC ACM port, and most 446 + likely also a DHCP client. See this thread about using the 447 + 4G modem from Verizon: 448 + 449 + http://ubuntuforums.org/showpost.php?p=10589647&postcount=17 450 + 436 451 endmenu
+1
drivers/net/usb/Makefile
··· 27 27 obj-$(CONFIG_USB_SIERRA_NET) += sierra_net.o 28 28 obj-$(CONFIG_USB_NET_CX82310_ETH) += cx82310_eth.o 29 29 obj-$(CONFIG_USB_NET_CDC_NCM) += cdc_ncm.o 30 + obj-$(CONFIG_USB_VL600) += lg-vl600.o 30 31
+15 -6
drivers/net/usb/cdc_ether.c
··· 378 378 __le32_to_cpu(speeds[1]) / 1000); 379 379 } 380 380 381 - static void cdc_status(struct usbnet *dev, struct urb *urb) 381 + void usbnet_cdc_status(struct usbnet *dev, struct urb *urb) 382 382 { 383 383 struct usb_cdc_notification *event; 384 384 ··· 418 418 break; 419 419 } 420 420 } 421 + EXPORT_SYMBOL_GPL(usbnet_cdc_status); 421 422 422 - static int cdc_bind(struct usbnet *dev, struct usb_interface *intf) 423 + int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf) 423 424 { 424 425 int status; 425 426 struct cdc_state *info = (void *) &dev->data; ··· 442 441 */ 443 442 return 0; 444 443 } 444 + EXPORT_SYMBOL_GPL(usbnet_cdc_bind); 445 445 446 446 static int cdc_manage_power(struct usbnet *dev, int on) 447 447 { ··· 454 452 .description = "CDC Ethernet Device", 455 453 .flags = FLAG_ETHER, 456 454 // .check_connect = cdc_check_connect, 457 - .bind = cdc_bind, 455 + .bind = usbnet_cdc_bind, 458 456 .unbind = usbnet_cdc_unbind, 459 - .status = cdc_status, 457 + .status = usbnet_cdc_status, 460 458 .manage_power = cdc_manage_power, 461 459 }; 462 460 463 461 static const struct driver_info mbm_info = { 464 462 .description = "Mobile Broadband Network Device", 465 463 .flags = FLAG_WWAN, 466 - .bind = cdc_bind, 464 + .bind = usbnet_cdc_bind, 467 465 .unbind = usbnet_cdc_unbind, 468 - .status = cdc_status, 466 + .status = usbnet_cdc_status, 469 467 .manage_power = cdc_manage_power, 470 468 }; 471 469 ··· 559 557 .idVendor = 0x07B4, 560 558 .idProduct = 0x0F02, /* R-1000 */ 561 559 ZAURUS_MASTER_INTERFACE, 560 + .driver_info = 0, 561 + }, 562 + 563 + /* LG Electronics VL600 wants additional headers on every frame */ 564 + { 565 + USB_DEVICE_AND_INTERFACE_INFO(0x1004, 0x61aa, USB_CLASS_COMM, 566 + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), 562 567 .driver_info = 0, 563 568 }, 564 569
+346
drivers/net/usb/lg-vl600.c
··· 1 + /* 2 + * Ethernet interface part of the LG VL600 LTE modem (4G dongle) 3 + * 4 + * Copyright (C) 2011 Intel Corporation 5 + * Author: Andrzej Zaborowski <balrogg@gmail.com> 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License as published by 9 + * the Free Software Foundation; either version 2 of the License, or 10 + * (at your option) any later version. 11 + * 12 + * This program is distributed in the hope that it will be useful, 13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 + * GNU General Public License for more details. 16 + * 17 + * You should have received a copy of the GNU General Public License 18 + * along with this program; if not, write to the Free Software 19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 + */ 21 + #include <linux/etherdevice.h> 22 + #include <linux/ethtool.h> 23 + #include <linux/mii.h> 24 + #include <linux/usb.h> 25 + #include <linux/usb/cdc.h> 26 + #include <linux/usb/usbnet.h> 27 + #include <linux/if_ether.h> 28 + #include <linux/if_arp.h> 29 + #include <linux/inetdevice.h> 30 + 31 + /* 32 + * The device has a CDC ACM port for modem control (it claims to be 33 + * CDC ACM anyway) and a CDC Ethernet port for actual network data. 34 + * It will however ignore data on both ports that is not encapsulated 35 + * in a specific way, any data returned is also encapsulated the same 36 + * way. The headers don't seem to follow any popular standard. 37 + * 38 + * This driver adds and strips these headers from the ethernet frames 39 + * sent/received from the CDC Ethernet port. The proprietary header 40 + * replaces the standard ethernet header in a packet so only actual 41 + * ethernet frames are allowed. The headers allow some form of 42 + * multiplexing by using non standard values of the .h_proto field. 43 + * Windows/Mac drivers do send a couple of such frames to the device 44 + * during initialisation, with protocol set to 0x0906 or 0x0b06 and (what 45 + * seems to be) a flag in the .dummy_flags. This doesn't seem necessary 46 + * for modem operation but can possibly be used for GPS or other funcitons. 47 + */ 48 + 49 + struct vl600_frame_hdr { 50 + __le32 len; 51 + __le32 serial; 52 + __le32 pkt_cnt; 53 + __le32 dummy_flags; 54 + __le32 dummy; 55 + __le32 magic; 56 + } __attribute__((packed)); 57 + 58 + struct vl600_pkt_hdr { 59 + __le32 dummy[2]; 60 + __le32 len; 61 + __be16 h_proto; 62 + } __attribute__((packed)); 63 + 64 + struct vl600_state { 65 + struct sk_buff *current_rx_buf; 66 + }; 67 + 68 + static int vl600_bind(struct usbnet *dev, struct usb_interface *intf) 69 + { 70 + int ret; 71 + struct vl600_state *s = kzalloc(sizeof(struct vl600_state), GFP_KERNEL); 72 + 73 + if (!s) 74 + return -ENOMEM; 75 + 76 + ret = usbnet_cdc_bind(dev, intf); 77 + if (ret) { 78 + kfree(s); 79 + return ret; 80 + } 81 + 82 + dev->driver_priv = s; 83 + 84 + /* ARP packets don't go through, but they're also of no use. The 85 + * subnet has only two hosts anyway: us and the gateway / DHCP 86 + * server (probably simulated by modem firmware or network operator) 87 + * whose address changes everytime we connect to the intarwebz and 88 + * who doesn't bother answering ARP requests either. So hardware 89 + * addresses have no meaning, the destination and the source of every 90 + * packet depend only on whether it is on the IN or OUT endpoint. */ 91 + dev->net->flags |= IFF_NOARP; 92 + 93 + return ret; 94 + } 95 + 96 + static void vl600_unbind(struct usbnet *dev, struct usb_interface *intf) 97 + { 98 + struct vl600_state *s = dev->driver_priv; 99 + 100 + if (s->current_rx_buf) 101 + dev_kfree_skb(s->current_rx_buf); 102 + 103 + kfree(s); 104 + 105 + return usbnet_cdc_unbind(dev, intf); 106 + } 107 + 108 + static int vl600_rx_fixup(struct usbnet *dev, struct sk_buff *skb) 109 + { 110 + struct vl600_frame_hdr *frame; 111 + struct vl600_pkt_hdr *packet; 112 + struct ethhdr *ethhdr; 113 + int packet_len, count; 114 + struct sk_buff *buf = skb; 115 + struct sk_buff *clone; 116 + struct vl600_state *s = dev->driver_priv; 117 + 118 + /* Frame lengths are generally 4B multiplies but every couple of 119 + * hours there's an odd number of bytes sized yet correct frame, 120 + * so don't require this. */ 121 + 122 + /* Allow a packet (or multiple packets batched together) to be 123 + * split across many frames. We don't allow a new batch to 124 + * begin in the same frame another one is ending however, and no 125 + * leading or trailing pad bytes. */ 126 + if (s->current_rx_buf) { 127 + frame = (struct vl600_frame_hdr *) s->current_rx_buf->data; 128 + if (skb->len + s->current_rx_buf->len > 129 + le32_to_cpup(&frame->len)) { 130 + netif_err(dev, ifup, dev->net, "Fragment too long\n"); 131 + dev->net->stats.rx_length_errors++; 132 + goto error; 133 + } 134 + 135 + buf = s->current_rx_buf; 136 + memcpy(skb_put(buf, skb->len), skb->data, skb->len); 137 + } else if (skb->len < 4) { 138 + netif_err(dev, ifup, dev->net, "Frame too short\n"); 139 + dev->net->stats.rx_length_errors++; 140 + goto error; 141 + } 142 + 143 + frame = (struct vl600_frame_hdr *) buf->data; 144 + /* NOTE: Should check that frame->magic == 0x53544448? 145 + * Otherwise if we receive garbage at the beginning of the frame 146 + * we may end up allocating a huge buffer and saving all the 147 + * future incoming data into it. */ 148 + 149 + if (buf->len < sizeof(*frame) || 150 + buf->len != le32_to_cpup(&frame->len)) { 151 + /* Save this fragment for later assembly */ 152 + if (s->current_rx_buf) 153 + return 0; 154 + 155 + s->current_rx_buf = skb_copy_expand(skb, 0, 156 + le32_to_cpup(&frame->len), GFP_ATOMIC); 157 + if (!s->current_rx_buf) { 158 + netif_err(dev, ifup, dev->net, "Reserving %i bytes " 159 + "for packet assembly failed.\n", 160 + le32_to_cpup(&frame->len)); 161 + dev->net->stats.rx_errors++; 162 + } 163 + 164 + return 0; 165 + } 166 + 167 + count = le32_to_cpup(&frame->pkt_cnt); 168 + 169 + skb_pull(buf, sizeof(*frame)); 170 + 171 + while (count--) { 172 + if (buf->len < sizeof(*packet)) { 173 + netif_err(dev, ifup, dev->net, "Packet too short\n"); 174 + goto error; 175 + } 176 + 177 + packet = (struct vl600_pkt_hdr *) buf->data; 178 + packet_len = sizeof(*packet) + le32_to_cpup(&packet->len); 179 + if (packet_len > buf->len) { 180 + netif_err(dev, ifup, dev->net, 181 + "Bad packet length stored in header\n"); 182 + goto error; 183 + } 184 + 185 + /* Packet header is same size as the ethernet header 186 + * (sizeof(*packet) == sizeof(*ethhdr)), additionally 187 + * the h_proto field is in the same place so we just leave it 188 + * alone and fill in the remaining fields. 189 + */ 190 + ethhdr = (struct ethhdr *) skb->data; 191 + if (be16_to_cpup(&ethhdr->h_proto) == ETH_P_ARP && 192 + buf->len > 0x26) { 193 + /* Copy the addresses from packet contents */ 194 + memcpy(ethhdr->h_source, 195 + &buf->data[sizeof(*ethhdr) + 0x8], 196 + ETH_ALEN); 197 + memcpy(ethhdr->h_dest, 198 + &buf->data[sizeof(*ethhdr) + 0x12], 199 + ETH_ALEN); 200 + } else { 201 + memset(ethhdr->h_source, 0, ETH_ALEN); 202 + memcpy(ethhdr->h_dest, dev->net->dev_addr, ETH_ALEN); 203 + } 204 + 205 + if (count) { 206 + /* Not the last packet in this batch */ 207 + clone = skb_clone(buf, GFP_ATOMIC); 208 + if (!clone) 209 + goto error; 210 + 211 + skb_trim(clone, packet_len); 212 + usbnet_skb_return(dev, clone); 213 + 214 + skb_pull(buf, (packet_len + 3) & ~3); 215 + } else { 216 + skb_trim(buf, packet_len); 217 + 218 + if (s->current_rx_buf) { 219 + usbnet_skb_return(dev, buf); 220 + s->current_rx_buf = NULL; 221 + return 0; 222 + } 223 + 224 + return 1; 225 + } 226 + } 227 + 228 + error: 229 + if (s->current_rx_buf) { 230 + dev_kfree_skb_any(s->current_rx_buf); 231 + s->current_rx_buf = NULL; 232 + } 233 + dev->net->stats.rx_errors++; 234 + return 0; 235 + } 236 + 237 + static struct sk_buff *vl600_tx_fixup(struct usbnet *dev, 238 + struct sk_buff *skb, gfp_t flags) 239 + { 240 + struct sk_buff *ret; 241 + struct vl600_frame_hdr *frame; 242 + struct vl600_pkt_hdr *packet; 243 + static uint32_t serial = 1; 244 + int orig_len = skb->len - sizeof(struct ethhdr); 245 + int full_len = (skb->len + sizeof(struct vl600_frame_hdr) + 3) & ~3; 246 + 247 + frame = (struct vl600_frame_hdr *) skb->data; 248 + if (skb->len > sizeof(*frame) && skb->len == le32_to_cpup(&frame->len)) 249 + return skb; /* Already encapsulated? */ 250 + 251 + if (skb->len < sizeof(struct ethhdr)) 252 + /* Drop, device can only deal with ethernet packets */ 253 + return NULL; 254 + 255 + if (!skb_cloned(skb)) { 256 + int headroom = skb_headroom(skb); 257 + int tailroom = skb_tailroom(skb); 258 + 259 + if (tailroom >= full_len - skb->len - sizeof(*frame) && 260 + headroom >= sizeof(*frame)) 261 + /* There's enough head and tail room */ 262 + goto encapsulate; 263 + 264 + if (headroom + tailroom + skb->len >= full_len) { 265 + /* There's enough total room, just readjust */ 266 + skb->data = memmove(skb->head + sizeof(*frame), 267 + skb->data, skb->len); 268 + skb_set_tail_pointer(skb, skb->len); 269 + goto encapsulate; 270 + } 271 + } 272 + 273 + /* Alloc a new skb with the required size */ 274 + ret = skb_copy_expand(skb, sizeof(struct vl600_frame_hdr), full_len - 275 + skb->len - sizeof(struct vl600_frame_hdr), flags); 276 + dev_kfree_skb_any(skb); 277 + if (!ret) 278 + return ret; 279 + skb = ret; 280 + 281 + encapsulate: 282 + /* Packet header is same size as ethernet packet header 283 + * (sizeof(*packet) == sizeof(struct ethhdr)), additionally the 284 + * h_proto field is in the same place so we just leave it alone and 285 + * overwrite the remaining fields. 286 + */ 287 + packet = (struct vl600_pkt_hdr *) skb->data; 288 + memset(&packet->dummy, 0, sizeof(packet->dummy)); 289 + packet->len = cpu_to_le32(orig_len); 290 + 291 + frame = (struct vl600_frame_hdr *) skb_push(skb, sizeof(*frame)); 292 + memset(frame, 0, sizeof(*frame)); 293 + frame->len = cpu_to_le32(full_len); 294 + frame->serial = cpu_to_le32(serial++); 295 + frame->pkt_cnt = cpu_to_le32(1); 296 + 297 + if (skb->len < full_len) /* Pad */ 298 + skb_put(skb, full_len - skb->len); 299 + 300 + return skb; 301 + } 302 + 303 + static const struct driver_info vl600_info = { 304 + .description = "LG VL600 modem", 305 + .flags = FLAG_ETHER | FLAG_RX_ASSEMBLE, 306 + .bind = vl600_bind, 307 + .unbind = vl600_unbind, 308 + .status = usbnet_cdc_status, 309 + .rx_fixup = vl600_rx_fixup, 310 + .tx_fixup = vl600_tx_fixup, 311 + }; 312 + 313 + static const struct usb_device_id products[] = { 314 + { 315 + USB_DEVICE_AND_INTERFACE_INFO(0x1004, 0x61aa, USB_CLASS_COMM, 316 + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), 317 + .driver_info = (unsigned long) &vl600_info, 318 + }, 319 + {}, /* End */ 320 + }; 321 + MODULE_DEVICE_TABLE(usb, products); 322 + 323 + static struct usb_driver lg_vl600_driver = { 324 + .name = "lg-vl600", 325 + .id_table = products, 326 + .probe = usbnet_probe, 327 + .disconnect = usbnet_disconnect, 328 + .suspend = usbnet_suspend, 329 + .resume = usbnet_resume, 330 + }; 331 + 332 + static int __init vl600_init(void) 333 + { 334 + return usb_register(&lg_vl600_driver); 335 + } 336 + module_init(vl600_init); 337 + 338 + static void __exit vl600_exit(void) 339 + { 340 + usb_deregister(&lg_vl600_driver); 341 + } 342 + module_exit(vl600_exit); 343 + 344 + MODULE_AUTHOR("Anrzej Zaborowski"); 345 + MODULE_DESCRIPTION("LG-VL600 modem's ethernet link"); 346 + MODULE_LICENSE("GPL");
+7 -3
drivers/net/usb/usbnet.c
··· 387 387 static inline void rx_process (struct usbnet *dev, struct sk_buff *skb) 388 388 { 389 389 if (dev->driver_info->rx_fixup && 390 - !dev->driver_info->rx_fixup (dev, skb)) 391 - goto error; 390 + !dev->driver_info->rx_fixup (dev, skb)) { 391 + /* With RX_ASSEMBLE, rx_fixup() must update counters */ 392 + if (!(dev->driver_info->flags & FLAG_RX_ASSEMBLE)) 393 + dev->net->stats.rx_errors++; 394 + goto done; 395 + } 392 396 // else network stack removes extra byte if we forced a short packet 393 397 394 398 if (skb->len) { ··· 405 401 } 406 402 407 403 netif_dbg(dev, rx_err, dev->net, "drop\n"); 408 - error: 409 404 dev->net->stats.rx_errors++; 405 + done: 410 406 skb_queue_tail(&dev->done, skb); 411 407 } 412 408
+1
include/linux/atmdev.h
··· 443 443 444 444 void vcc_insert_socket(struct sock *sk); 445 445 446 + void atm_dev_release_vccs(struct atm_dev *dev); 446 447 447 448 /* 448 449 * This is approximately the algorithm used by alloc_skb.
+3 -13
include/linux/connector.h
··· 88 88 atomic_t refcnt; 89 89 unsigned char name[CN_CBQ_NAMELEN]; 90 90 91 - struct workqueue_struct *cn_queue; 92 - 93 91 struct list_head queue_list; 94 92 spinlock_t queue_lock; 95 93 ··· 99 101 struct cb_id id; 100 102 }; 101 103 102 - struct cn_callback_data { 103 - struct sk_buff *skb; 104 - void (*callback) (struct cn_msg *, struct netlink_skb_parms *); 105 - 106 - void *free; 107 - }; 108 - 109 104 struct cn_callback_entry { 110 105 struct list_head callback_entry; 111 - struct work_struct work; 106 + atomic_t refcnt; 112 107 struct cn_queue_dev *pdev; 113 108 114 109 struct cn_callback_id id; 115 - struct cn_callback_data data; 110 + void (*callback) (struct cn_msg *, struct netlink_skb_parms *); 116 111 117 112 u32 seq, group; 118 113 }; ··· 129 138 struct cb_id *id, 130 139 void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); 131 140 void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); 141 + void cn_queue_release_callback(struct cn_callback_entry *); 132 142 133 143 struct cn_queue_dev *cn_queue_alloc_dev(const char *name, struct sock *); 134 144 void cn_queue_free_dev(struct cn_queue_dev *dev); 135 145 136 146 int cn_cb_equal(struct cb_id *, struct cb_id *); 137 - 138 - void cn_queue_wrapper(struct work_struct *work); 139 147 140 148 #endif /* __KERNEL__ */ 141 149 #endif /* __CONNECTOR_H */
+1 -1
include/linux/skbuff.h
··· 126 126 * GRO uses frags we allocate at least 16 regardless of page size. 127 127 */ 128 128 #if (65536/PAGE_SIZE + 2) < 16 129 - #define MAX_SKB_FRAGS 16 129 + #define MAX_SKB_FRAGS 16UL 130 130 #else 131 131 #define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2) 132 132 #endif
+3
include/linux/usb/usbnet.h
··· 102 102 * Affects statistic (counters) and short packet handling. 103 103 */ 104 104 #define FLAG_MULTI_PACKET 0x1000 105 + #define FLAG_RX_ASSEMBLE 0x2000 /* rx packets may span >1 frames */ 105 106 106 107 /* init device ... can sleep, or cause probe() failure */ 107 108 int (*bind)(struct usbnet *, struct usb_interface *); ··· 173 172 }; 174 173 175 174 extern int usbnet_generic_cdc_bind(struct usbnet *, struct usb_interface *); 175 + extern int usbnet_cdc_bind(struct usbnet *, struct usb_interface *); 176 176 extern void usbnet_cdc_unbind(struct usbnet *, struct usb_interface *); 177 + extern void usbnet_cdc_status(struct usbnet *, struct urb *); 177 178 178 179 /* CDC and RNDIS support the same host-chosen packet filters for IN transfers */ 179 180 #define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \
+16
include/net/if_inet6.h
··· 286 286 buf[9] = broadcast[9]; 287 287 memcpy(buf + 10, addr->s6_addr + 6, 10); 288 288 } 289 + 290 + static inline int ipv6_ipgre_mc_map(const struct in6_addr *addr, 291 + const unsigned char *broadcast, char *buf) 292 + { 293 + if ((broadcast[0] | broadcast[1] | broadcast[2] | broadcast[3]) != 0) { 294 + memcpy(buf, broadcast, 4); 295 + } else { 296 + /* v4mapped? */ 297 + if ((addr->s6_addr32[0] | addr->s6_addr32[1] | 298 + (addr->s6_addr32[2] ^ htonl(0x0000ffff))) != 0) 299 + return -EINVAL; 300 + memcpy(buf, &addr->s6_addr32[3], 4); 301 + } 302 + return 0; 303 + } 304 + 289 305 #endif 290 306 #endif
+8
include/net/ip.h
··· 339 339 buf[16] = addr & 0x0f; 340 340 } 341 341 342 + static inline void ip_ipgre_mc_map(__be32 naddr, const unsigned char *broadcast, char *buf) 343 + { 344 + if ((broadcast[0] | broadcast[1] | broadcast[2] | broadcast[3]) != 0) 345 + memcpy(buf, broadcast, 4); 346 + else 347 + memcpy(buf, &naddr, sizeof(naddr)); 348 + } 349 + 342 350 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 343 351 #include <linux/ipv6.h> 344 352 #endif
+6 -5
net/appletalk/ddp.c
··· 1051 1051 { 1052 1052 struct sock *sk = sock->sk; 1053 1053 1054 - sock_hold(sk); 1055 - lock_sock(sk); 1056 1054 if (sk) { 1055 + sock_hold(sk); 1056 + lock_sock(sk); 1057 + 1057 1058 sock_orphan(sk); 1058 1059 sock->sk = NULL; 1059 1060 atalk_destroy_socket(sk); 1060 - } 1061 - release_sock(sk); 1062 - sock_put(sk); 1063 1061 1062 + release_sock(sk); 1063 + sock_put(sk); 1064 + } 1064 1065 return 0; 1065 1066 } 1066 1067
+1
net/atm/common.c
··· 252 252 } 253 253 write_unlock_irq(&vcc_sklist_lock); 254 254 } 255 + EXPORT_SYMBOL(atm_dev_release_vccs); 255 256 256 257 static int adjust_tp(struct atm_trafprm *tp, unsigned char aal) 257 258 {
+1 -1
net/bridge/br_multicast.c
··· 1475 1475 ip6h->payload_len == 0) 1476 1476 return 0; 1477 1477 1478 - len = ntohs(ip6h->payload_len); 1478 + len = ntohs(ip6h->payload_len) + sizeof(*ip6h); 1479 1479 if (skb->len < len) 1480 1480 return -EINVAL; 1481 1481
+1 -1
net/bridge/br_stp_if.c
··· 213 213 214 214 /* user has chosen a value so keep it */ 215 215 if (br->flags & BR_SET_MAC_ADDR) 216 - return; 216 + return false; 217 217 218 218 list_for_each_entry(p, &br->port_list, list) { 219 219 if (addr == br_mac_zero ||
+22 -2
net/core/dev.c
··· 1454 1454 __net_timestamp(skb); 1455 1455 } 1456 1456 1457 + static inline bool is_skb_forwardable(struct net_device *dev, 1458 + struct sk_buff *skb) 1459 + { 1460 + unsigned int len; 1461 + 1462 + if (!(dev->flags & IFF_UP)) 1463 + return false; 1464 + 1465 + len = dev->mtu + dev->hard_header_len + VLAN_HLEN; 1466 + if (skb->len <= len) 1467 + return true; 1468 + 1469 + /* if TSO is enabled, we don't care about the length as the packet 1470 + * could be forwarded without being segmented before 1471 + */ 1472 + if (skb_is_gso(skb)) 1473 + return true; 1474 + 1475 + return false; 1476 + } 1477 + 1457 1478 /** 1458 1479 * dev_forward_skb - loopback an skb to another netif 1459 1480 * ··· 1498 1477 skb_orphan(skb); 1499 1478 nf_reset(skb); 1500 1479 1501 - if (unlikely(!(dev->flags & IFF_UP) || 1502 - (skb->len > (dev->mtu + dev->hard_header_len + VLAN_HLEN)))) { 1480 + if (unlikely(!is_skb_forwardable(dev, skb))) { 1503 1481 atomic_long_inc(&dev->rx_dropped); 1504 1482 kfree_skb(skb); 1505 1483 return NET_RX_DROP;
+3
net/ipv4/arp.c
··· 215 215 case ARPHRD_INFINIBAND: 216 216 ip_ib_mc_map(addr, dev->broadcast, haddr); 217 217 return 0; 218 + case ARPHRD_IPGRE: 219 + ip_ipgre_mc_map(addr, dev->broadcast, haddr); 220 + return 0; 218 221 default: 219 222 if (dir) { 220 223 memcpy(haddr, dev->broadcast, dev->addr_len);
+2
net/ipv4/fib_frontend.c
··· 1068 1068 fib4_rules_exit(net); 1069 1069 #endif 1070 1070 1071 + rtnl_lock(); 1071 1072 for (i = 0; i < FIB_TABLE_HASHSZ; i++) { 1072 1073 struct fib_table *tb; 1073 1074 struct hlist_head *head; ··· 1081 1080 fib_free_table(tb); 1082 1081 } 1083 1082 } 1083 + rtnl_unlock(); 1084 1084 kfree(net->ipv4.fib_table_hash); 1085 1085 } 1086 1086
+2
net/ipv6/ndisc.c
··· 341 341 case ARPHRD_INFINIBAND: 342 342 ipv6_ib_mc_map(addr, dev->broadcast, buf); 343 343 return 0; 344 + case ARPHRD_IPGRE: 345 + return ipv6_ipgre_mc_map(addr, dev->broadcast, buf); 344 346 default: 345 347 if (dir) { 346 348 memcpy(buf, dev->broadcast, dev->addr_len);
+2 -2
net/sctp/protocol.c
··· 1205 1205 if ((sctp_assoc_hashsize > (64 * 1024)) && order > 0) 1206 1206 continue; 1207 1207 sctp_assoc_hashtable = (struct sctp_hashbucket *) 1208 - __get_free_pages(GFP_ATOMIC, order); 1208 + __get_free_pages(GFP_ATOMIC|__GFP_NOWARN, order); 1209 1209 } while (!sctp_assoc_hashtable && --order > 0); 1210 1210 if (!sctp_assoc_hashtable) { 1211 1211 pr_err("Failed association hash alloc\n"); ··· 1238 1238 if ((sctp_port_hashsize > (64 * 1024)) && order > 0) 1239 1239 continue; 1240 1240 sctp_port_hashtable = (struct sctp_bind_hashbucket *) 1241 - __get_free_pages(GFP_ATOMIC, order); 1241 + __get_free_pages(GFP_ATOMIC|__GFP_NOWARN, order); 1242 1242 } while (!sctp_port_hashtable && --order > 0); 1243 1243 if (!sctp_port_hashtable) { 1244 1244 pr_err("Failed bind hash alloc\n");