diff options
| -rw-r--r-- | arch/sparc64/kernel/irq.c | 5 | ||||
| -rw-r--r-- | arch/sparc64/kernel/pci_psycho.c | 8 | ||||
| -rw-r--r-- | arch/sparc64/kernel/traps.c | 3 | ||||
| -rw-r--r-- | drivers/net/bnx2.h | 2 | ||||
| -rw-r--r-- | drivers/net/e100.c | 4 | ||||
| -rw-r--r-- | drivers/net/e1000/e1000_hw.c | 23 | ||||
| -rw-r--r-- | drivers/net/forcedeth.c | 16 | ||||
| -rw-r--r-- | net/ipv4/udp.c | 62 | ||||
| -rw-r--r-- | net/sctp/associola.c | 9 | ||||
| -rw-r--r-- | net/sctp/output.c | 3 | ||||
| -rw-r--r-- | net/sctp/sm_make_chunk.c | 15 |
11 files changed, 97 insertions, 53 deletions
diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c index 23963882bc18..7495bc774685 100644 --- a/arch/sparc64/kernel/irq.c +++ b/arch/sparc64/kernel/irq.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | 7 | ||
| 8 | #include <linux/module.h> | 8 | #include <linux/module.h> |
| 9 | #include <linux/sched.h> | 9 | #include <linux/sched.h> |
| 10 | #include <linux/linkage.h> | ||
| 10 | #include <linux/ptrace.h> | 11 | #include <linux/ptrace.h> |
| 11 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
| 12 | #include <linux/kernel_stat.h> | 13 | #include <linux/kernel_stat.h> |
| @@ -866,7 +867,7 @@ static void kill_prom_timer(void) | |||
| 866 | : "g1", "g2"); | 867 | : "g1", "g2"); |
| 867 | } | 868 | } |
| 868 | 869 | ||
| 869 | void init_irqwork_curcpu(void) | 870 | void notrace init_irqwork_curcpu(void) |
| 870 | { | 871 | { |
| 871 | int cpu = hard_smp_processor_id(); | 872 | int cpu = hard_smp_processor_id(); |
| 872 | 873 | ||
| @@ -897,7 +898,7 @@ static void __cpuinit register_one_mondo(unsigned long paddr, unsigned long type | |||
| 897 | } | 898 | } |
| 898 | } | 899 | } |
| 899 | 900 | ||
| 900 | void __cpuinit sun4v_register_mondo_queues(int this_cpu) | 901 | void __cpuinit notrace sun4v_register_mondo_queues(int this_cpu) |
| 901 | { | 902 | { |
| 902 | struct trap_per_cpu *tb = &trap_block[this_cpu]; | 903 | struct trap_per_cpu *tb = &trap_block[this_cpu]; |
| 903 | 904 | ||
diff --git a/arch/sparc64/kernel/pci_psycho.c b/arch/sparc64/kernel/pci_psycho.c index e205ade69cfc..f85b6bebb0be 100644 --- a/arch/sparc64/kernel/pci_psycho.c +++ b/arch/sparc64/kernel/pci_psycho.c | |||
| @@ -575,7 +575,7 @@ static irqreturn_t psycho_pcierr_intr_other(struct pci_pbm_info *pbm, int is_pbm | |||
| 575 | { | 575 | { |
| 576 | unsigned long csr_reg, csr, csr_error_bits; | 576 | unsigned long csr_reg, csr, csr_error_bits; |
| 577 | irqreturn_t ret = IRQ_NONE; | 577 | irqreturn_t ret = IRQ_NONE; |
| 578 | u16 stat; | 578 | u16 stat, *addr; |
| 579 | 579 | ||
| 580 | if (is_pbm_a) { | 580 | if (is_pbm_a) { |
| 581 | csr_reg = pbm->controller_regs + PSYCHO_PCIA_CTRL; | 581 | csr_reg = pbm->controller_regs + PSYCHO_PCIA_CTRL; |
| @@ -597,7 +597,9 @@ static irqreturn_t psycho_pcierr_intr_other(struct pci_pbm_info *pbm, int is_pbm | |||
| 597 | printk("%s: PCI SERR signal asserted.\n", pbm->name); | 597 | printk("%s: PCI SERR signal asserted.\n", pbm->name); |
| 598 | ret = IRQ_HANDLED; | 598 | ret = IRQ_HANDLED; |
| 599 | } | 599 | } |
| 600 | pci_read_config_word(pbm->pci_bus->self, PCI_STATUS, &stat); | 600 | addr = psycho_pci_config_mkaddr(pbm, pbm->pci_first_busno, |
| 601 | 0, PCI_STATUS); | ||
| 602 | pci_config_read16(addr, &stat); | ||
| 601 | if (stat & (PCI_STATUS_PARITY | | 603 | if (stat & (PCI_STATUS_PARITY | |
| 602 | PCI_STATUS_SIG_TARGET_ABORT | | 604 | PCI_STATUS_SIG_TARGET_ABORT | |
| 603 | PCI_STATUS_REC_TARGET_ABORT | | 605 | PCI_STATUS_REC_TARGET_ABORT | |
| @@ -605,7 +607,7 @@ static irqreturn_t psycho_pcierr_intr_other(struct pci_pbm_info *pbm, int is_pbm | |||
| 605 | PCI_STATUS_SIG_SYSTEM_ERROR)) { | 607 | PCI_STATUS_SIG_SYSTEM_ERROR)) { |
| 606 | printk("%s: PCI bus error, PCI_STATUS[%04x]\n", | 608 | printk("%s: PCI bus error, PCI_STATUS[%04x]\n", |
| 607 | pbm->name, stat); | 609 | pbm->name, stat); |
| 608 | pci_write_config_word(pbm->pci_bus->self, PCI_STATUS, 0xffff); | 610 | pci_config_write16(addr, 0xffff); |
| 609 | ret = IRQ_HANDLED; | 611 | ret = IRQ_HANDLED; |
| 610 | } | 612 | } |
| 611 | return ret; | 613 | return ret; |
diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c index 3d924121c796..c824df13f589 100644 --- a/arch/sparc64/kernel/traps.c +++ b/arch/sparc64/kernel/traps.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 12 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
| 13 | #include <linux/linkage.h> | ||
| 13 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
| 14 | #include <linux/signal.h> | 15 | #include <linux/signal.h> |
| 15 | #include <linux/smp.h> | 16 | #include <linux/smp.h> |
| @@ -2453,7 +2454,7 @@ struct trap_per_cpu trap_block[NR_CPUS]; | |||
| 2453 | /* This can get invoked before sched_init() so play it super safe | 2454 | /* This can get invoked before sched_init() so play it super safe |
| 2454 | * and use hard_smp_processor_id(). | 2455 | * and use hard_smp_processor_id(). |
| 2455 | */ | 2456 | */ |
| 2456 | void init_cur_cpu_trap(struct thread_info *t) | 2457 | void notrace init_cur_cpu_trap(struct thread_info *t) |
| 2457 | { | 2458 | { |
| 2458 | int cpu = hard_smp_processor_id(); | 2459 | int cpu = hard_smp_processor_id(); |
| 2459 | struct trap_per_cpu *p = &trap_block[cpu]; | 2460 | struct trap_per_cpu *p = &trap_block[cpu]; |
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index c3c579f98ed0..dfacd31f7ed0 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
| @@ -6597,7 +6597,7 @@ struct flash_spec { | |||
| 6597 | 6597 | ||
| 6598 | struct bnx2_irq { | 6598 | struct bnx2_irq { |
| 6599 | irq_handler_t handler; | 6599 | irq_handler_t handler; |
| 6600 | u16 vector; | 6600 | unsigned int vector; |
| 6601 | u8 requested; | 6601 | u8 requested; |
| 6602 | char name[16]; | 6602 | char name[16]; |
| 6603 | }; | 6603 | }; |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 453115acaad2..5cf78d612c45 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
| @@ -2738,9 +2738,7 @@ static int __devinit e100_probe(struct pci_dev *pdev, | |||
| 2738 | nic->flags |= wol_magic; | 2738 | nic->flags |= wol_magic; |
| 2739 | 2739 | ||
| 2740 | /* ack any pending wake events, disable PME */ | 2740 | /* ack any pending wake events, disable PME */ |
| 2741 | err = pci_enable_wake(pdev, 0, 0); | 2741 | pci_pme_active(pdev, false); |
| 2742 | if (err) | ||
| 2743 | DPRINTK(PROBE, ERR, "Error clearing wake event\n"); | ||
| 2744 | 2742 | ||
| 2745 | strcpy(netdev->name, "eth%d"); | 2743 | strcpy(netdev->name, "eth%d"); |
| 2746 | if((err = register_netdev(netdev))) { | 2744 | if((err = register_netdev(netdev))) { |
diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c index 9d6edf3e73f9..d04eef53571e 100644 --- a/drivers/net/e1000/e1000_hw.c +++ b/drivers/net/e1000/e1000_hw.c | |||
| @@ -144,6 +144,8 @@ static s32 e1000_host_if_read_cookie(struct e1000_hw *hw, u8 *buffer); | |||
| 144 | static u8 e1000_calculate_mng_checksum(char *buffer, u32 length); | 144 | static u8 e1000_calculate_mng_checksum(char *buffer, u32 length); |
| 145 | static s32 e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex); | 145 | static s32 e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex); |
| 146 | static s32 e1000_configure_kmrn_for_1000(struct e1000_hw *hw); | 146 | static s32 e1000_configure_kmrn_for_1000(struct e1000_hw *hw); |
| 147 | static s32 e1000_do_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); | ||
| 148 | static s32 e1000_do_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); | ||
| 147 | 149 | ||
| 148 | /* IGP cable length table */ | 150 | /* IGP cable length table */ |
| 149 | static const | 151 | static const |
| @@ -168,6 +170,8 @@ u16 e1000_igp_2_cable_length_table[IGP02E1000_AGC_LENGTH_TABLE_SIZE] = | |||
| 168 | 83, 89, 95, 100, 105, 109, 113, 116, 119, 122, 124, | 170 | 83, 89, 95, 100, 105, 109, 113, 116, 119, 122, 124, |
| 169 | 104, 109, 114, 118, 121, 124}; | 171 | 104, 109, 114, 118, 121, 124}; |
| 170 | 172 | ||
| 173 | static DEFINE_SPINLOCK(e1000_eeprom_lock); | ||
| 174 | |||
| 171 | /****************************************************************************** | 175 | /****************************************************************************** |
| 172 | * Set the phy type member in the hw struct. | 176 | * Set the phy type member in the hw struct. |
| 173 | * | 177 | * |
| @@ -4904,6 +4908,15 @@ static s32 e1000_spi_eeprom_ready(struct e1000_hw *hw) | |||
| 4904 | *****************************************************************************/ | 4908 | *****************************************************************************/ |
| 4905 | s32 e1000_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) | 4909 | s32 e1000_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) |
| 4906 | { | 4910 | { |
| 4911 | s32 ret; | ||
| 4912 | spin_lock(&e1000_eeprom_lock); | ||
| 4913 | ret = e1000_do_read_eeprom(hw, offset, words, data); | ||
| 4914 | spin_unlock(&e1000_eeprom_lock); | ||
| 4915 | return ret; | ||
| 4916 | } | ||
| 4917 | |||
| 4918 | static s32 e1000_do_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) | ||
| 4919 | { | ||
| 4907 | struct e1000_eeprom_info *eeprom = &hw->eeprom; | 4920 | struct e1000_eeprom_info *eeprom = &hw->eeprom; |
| 4908 | u32 i = 0; | 4921 | u32 i = 0; |
| 4909 | 4922 | ||
| @@ -5236,6 +5249,16 @@ s32 e1000_update_eeprom_checksum(struct e1000_hw *hw) | |||
| 5236 | *****************************************************************************/ | 5249 | *****************************************************************************/ |
| 5237 | s32 e1000_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) | 5250 | s32 e1000_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) |
| 5238 | { | 5251 | { |
| 5252 | s32 ret; | ||
| 5253 | spin_lock(&e1000_eeprom_lock); | ||
| 5254 | ret = e1000_do_write_eeprom(hw, offset, words, data); | ||
| 5255 | spin_unlock(&e1000_eeprom_lock); | ||
| 5256 | return ret; | ||
| 5257 | } | ||
| 5258 | |||
| 5259 | |||
| 5260 | static s32 e1000_do_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) | ||
| 5261 | { | ||
| 5239 | struct e1000_eeprom_info *eeprom = &hw->eeprom; | 5262 | struct e1000_eeprom_info *eeprom = &hw->eeprom; |
| 5240 | s32 status = 0; | 5263 | s32 status = 0; |
| 5241 | 5264 | ||
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 0b6ecef9a849..eeb55ed2152d 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
| @@ -5643,6 +5643,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
| 5643 | dev->dev_addr[4] = (np->orig_mac[0] >> 8) & 0xff; | 5643 | dev->dev_addr[4] = (np->orig_mac[0] >> 8) & 0xff; |
| 5644 | dev->dev_addr[5] = (np->orig_mac[0] >> 0) & 0xff; | 5644 | dev->dev_addr[5] = (np->orig_mac[0] >> 0) & 0xff; |
| 5645 | writel(txreg|NVREG_TRANSMITPOLL_MAC_ADDR_REV, base + NvRegTransmitPoll); | 5645 | writel(txreg|NVREG_TRANSMITPOLL_MAC_ADDR_REV, base + NvRegTransmitPoll); |
| 5646 | printk(KERN_DEBUG "nv_probe: set workaround bit for reversed mac addr\n"); | ||
| 5646 | } | 5647 | } |
| 5647 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | 5648 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); |
| 5648 | 5649 | ||
| @@ -5890,14 +5891,12 @@ static void nv_restore_phy(struct net_device *dev) | |||
| 5890 | } | 5891 | } |
| 5891 | } | 5892 | } |
| 5892 | 5893 | ||
| 5893 | static void __devexit nv_remove(struct pci_dev *pci_dev) | 5894 | static void nv_restore_mac_addr(struct pci_dev *pci_dev) |
| 5894 | { | 5895 | { |
| 5895 | struct net_device *dev = pci_get_drvdata(pci_dev); | 5896 | struct net_device *dev = pci_get_drvdata(pci_dev); |
| 5896 | struct fe_priv *np = netdev_priv(dev); | 5897 | struct fe_priv *np = netdev_priv(dev); |
| 5897 | u8 __iomem *base = get_hwbase(dev); | 5898 | u8 __iomem *base = get_hwbase(dev); |
| 5898 | 5899 | ||
| 5899 | unregister_netdev(dev); | ||
| 5900 | |||
| 5901 | /* special op: write back the misordered MAC address - otherwise | 5900 | /* special op: write back the misordered MAC address - otherwise |
| 5902 | * the next nv_probe would see a wrong address. | 5901 | * the next nv_probe would see a wrong address. |
| 5903 | */ | 5902 | */ |
| @@ -5905,6 +5904,15 @@ static void __devexit nv_remove(struct pci_dev *pci_dev) | |||
| 5905 | writel(np->orig_mac[1], base + NvRegMacAddrB); | 5904 | writel(np->orig_mac[1], base + NvRegMacAddrB); |
| 5906 | writel(readl(base + NvRegTransmitPoll) & ~NVREG_TRANSMITPOLL_MAC_ADDR_REV, | 5905 | writel(readl(base + NvRegTransmitPoll) & ~NVREG_TRANSMITPOLL_MAC_ADDR_REV, |
| 5907 | base + NvRegTransmitPoll); | 5906 | base + NvRegTransmitPoll); |
| 5907 | } | ||
| 5908 | |||
| 5909 | static void __devexit nv_remove(struct pci_dev *pci_dev) | ||
| 5910 | { | ||
| 5911 | struct net_device *dev = pci_get_drvdata(pci_dev); | ||
| 5912 | |||
| 5913 | unregister_netdev(dev); | ||
| 5914 | |||
| 5915 | nv_restore_mac_addr(pci_dev); | ||
| 5908 | 5916 | ||
| 5909 | /* restore any phy related changes */ | 5917 | /* restore any phy related changes */ |
| 5910 | nv_restore_phy(dev); | 5918 | nv_restore_phy(dev); |
| @@ -5975,6 +5983,8 @@ static void nv_shutdown(struct pci_dev *pdev) | |||
| 5975 | if (netif_running(dev)) | 5983 | if (netif_running(dev)) |
| 5976 | nv_close(dev); | 5984 | nv_close(dev); |
| 5977 | 5985 | ||
| 5986 | nv_restore_mac_addr(pdev); | ||
| 5987 | |||
| 5978 | pci_disable_device(pdev); | 5988 | pci_disable_device(pdev); |
| 5979 | if (system_state == SYSTEM_POWER_OFF) { | 5989 | if (system_state == SYSTEM_POWER_OFF) { |
| 5980 | if (pci_enable_wake(pdev, PCI_D3cold, np->wolenabled)) | 5990 | if (pci_enable_wake(pdev, PCI_D3cold, np->wolenabled)) |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 8e42fbbd5761..57e26fa66185 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -951,6 +951,27 @@ int udp_disconnect(struct sock *sk, int flags) | |||
| 951 | return 0; | 951 | return 0; |
| 952 | } | 952 | } |
| 953 | 953 | ||
| 954 | static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | ||
| 955 | { | ||
| 956 | int is_udplite = IS_UDPLITE(sk); | ||
| 957 | int rc; | ||
| 958 | |||
| 959 | if ((rc = sock_queue_rcv_skb(sk, skb)) < 0) { | ||
| 960 | /* Note that an ENOMEM error is charged twice */ | ||
| 961 | if (rc == -ENOMEM) | ||
| 962 | UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS, | ||
| 963 | is_udplite); | ||
| 964 | goto drop; | ||
| 965 | } | ||
| 966 | |||
| 967 | return 0; | ||
| 968 | |||
| 969 | drop: | ||
| 970 | UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite); | ||
| 971 | kfree_skb(skb); | ||
| 972 | return -1; | ||
| 973 | } | ||
| 974 | |||
| 954 | /* returns: | 975 | /* returns: |
| 955 | * -1: error | 976 | * -1: error |
| 956 | * 0: success | 977 | * 0: success |
| @@ -989,9 +1010,7 @@ int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb) | |||
| 989 | up->encap_rcv != NULL) { | 1010 | up->encap_rcv != NULL) { |
| 990 | int ret; | 1011 | int ret; |
| 991 | 1012 | ||
| 992 | bh_unlock_sock(sk); | ||
| 993 | ret = (*up->encap_rcv)(sk, skb); | 1013 | ret = (*up->encap_rcv)(sk, skb); |
| 994 | bh_lock_sock(sk); | ||
| 995 | if (ret <= 0) { | 1014 | if (ret <= 0) { |
| 996 | UDP_INC_STATS_BH(sock_net(sk), | 1015 | UDP_INC_STATS_BH(sock_net(sk), |
| 997 | UDP_MIB_INDATAGRAMS, | 1016 | UDP_MIB_INDATAGRAMS, |
| @@ -1044,17 +1063,16 @@ int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb) | |||
| 1044 | goto drop; | 1063 | goto drop; |
| 1045 | } | 1064 | } |
| 1046 | 1065 | ||
| 1047 | if ((rc = sock_queue_rcv_skb(sk,skb)) < 0) { | 1066 | rc = 0; |
| 1048 | /* Note that an ENOMEM error is charged twice */ | ||
| 1049 | if (rc == -ENOMEM) { | ||
| 1050 | UDP_INC_STATS_BH(sock_net(sk), | ||
| 1051 | UDP_MIB_RCVBUFERRORS, is_udplite); | ||
| 1052 | atomic_inc(&sk->sk_drops); | ||
| 1053 | } | ||
| 1054 | goto drop; | ||
| 1055 | } | ||
| 1056 | 1067 | ||
| 1057 | return 0; | 1068 | bh_lock_sock(sk); |
| 1069 | if (!sock_owned_by_user(sk)) | ||
| 1070 | rc = __udp_queue_rcv_skb(sk, skb); | ||
| 1071 | else | ||
| 1072 | sk_add_backlog(sk, skb); | ||
| 1073 | bh_unlock_sock(sk); | ||
| 1074 | |||
| 1075 | return rc; | ||
| 1058 | 1076 | ||
| 1059 | drop: | 1077 | drop: |
| 1060 | UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite); | 1078 | UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite); |
| @@ -1092,15 +1110,7 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb, | |||
| 1092 | skb1 = skb_clone(skb, GFP_ATOMIC); | 1110 | skb1 = skb_clone(skb, GFP_ATOMIC); |
| 1093 | 1111 | ||
| 1094 | if (skb1) { | 1112 | if (skb1) { |
| 1095 | int ret = 0; | 1113 | int ret = udp_queue_rcv_skb(sk, skb1); |
| 1096 | |||
| 1097 | bh_lock_sock(sk); | ||
| 1098 | if (!sock_owned_by_user(sk)) | ||
| 1099 | ret = udp_queue_rcv_skb(sk, skb1); | ||
| 1100 | else | ||
| 1101 | sk_add_backlog(sk, skb1); | ||
| 1102 | bh_unlock_sock(sk); | ||
| 1103 | |||
| 1104 | if (ret > 0) | 1114 | if (ret > 0) |
| 1105 | /* we should probably re-process instead | 1115 | /* we should probably re-process instead |
| 1106 | * of dropping packets here. */ | 1116 | * of dropping packets here. */ |
| @@ -1195,13 +1205,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[], | |||
| 1195 | uh->dest, inet_iif(skb), udptable); | 1205 | uh->dest, inet_iif(skb), udptable); |
| 1196 | 1206 | ||
| 1197 | if (sk != NULL) { | 1207 | if (sk != NULL) { |
| 1198 | int ret = 0; | 1208 | int ret = udp_queue_rcv_skb(sk, skb); |
| 1199 | bh_lock_sock(sk); | ||
| 1200 | if (!sock_owned_by_user(sk)) | ||
| 1201 | ret = udp_queue_rcv_skb(sk, skb); | ||
| 1202 | else | ||
| 1203 | sk_add_backlog(sk, skb); | ||
| 1204 | bh_unlock_sock(sk); | ||
| 1205 | sock_put(sk); | 1209 | sock_put(sk); |
| 1206 | 1210 | ||
| 1207 | /* a return value > 0 means to resubmit the input, but | 1211 | /* a return value > 0 means to resubmit the input, but |
| @@ -1494,7 +1498,7 @@ struct proto udp_prot = { | |||
| 1494 | .sendmsg = udp_sendmsg, | 1498 | .sendmsg = udp_sendmsg, |
| 1495 | .recvmsg = udp_recvmsg, | 1499 | .recvmsg = udp_recvmsg, |
| 1496 | .sendpage = udp_sendpage, | 1500 | .sendpage = udp_sendpage, |
| 1497 | .backlog_rcv = udp_queue_rcv_skb, | 1501 | .backlog_rcv = __udp_queue_rcv_skb, |
| 1498 | .hash = udp_lib_hash, | 1502 | .hash = udp_lib_hash, |
| 1499 | .unhash = udp_lib_unhash, | 1503 | .unhash = udp_lib_unhash, |
| 1500 | .get_port = udp_v4_get_port, | 1504 | .get_port = udp_v4_get_port, |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 8472b8b349c4..abd51cef2413 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
| @@ -599,11 +599,12 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, | |||
| 599 | /* Check to see if this is a duplicate. */ | 599 | /* Check to see if this is a duplicate. */ |
| 600 | peer = sctp_assoc_lookup_paddr(asoc, addr); | 600 | peer = sctp_assoc_lookup_paddr(asoc, addr); |
| 601 | if (peer) { | 601 | if (peer) { |
| 602 | /* An UNKNOWN state is only set on transports added by | ||
| 603 | * user in sctp_connectx() call. Such transports should be | ||
| 604 | * considered CONFIRMED per RFC 4960, Section 5.4. | ||
| 605 | */ | ||
| 602 | if (peer->state == SCTP_UNKNOWN) { | 606 | if (peer->state == SCTP_UNKNOWN) { |
| 603 | if (peer_state == SCTP_ACTIVE) | 607 | peer->state = SCTP_ACTIVE; |
| 604 | peer->state = SCTP_ACTIVE; | ||
| 605 | if (peer_state == SCTP_UNCONFIRMED) | ||
| 606 | peer->state = SCTP_UNCONFIRMED; | ||
| 607 | } | 608 | } |
| 608 | return peer; | 609 | return peer; |
| 609 | } | 610 | } |
diff --git a/net/sctp/output.c b/net/sctp/output.c index 0dc4a7dfb234..225c7123c41f 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
| @@ -533,7 +533,8 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
| 533 | if (!(dst->dev->features & NETIF_F_NO_CSUM)) { | 533 | if (!(dst->dev->features & NETIF_F_NO_CSUM)) { |
| 534 | crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); | 534 | crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); |
| 535 | crc32 = sctp_end_cksum(crc32); | 535 | crc32 = sctp_end_cksum(crc32); |
| 536 | } | 536 | } else |
| 537 | nskb->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 537 | 538 | ||
| 538 | /* 3) Put the resultant value into the checksum field in the | 539 | /* 3) Put the resultant value into the checksum field in the |
| 539 | * common header, and leave the rest of the bits unchanged. | 540 | * common header, and leave the rest of the bits unchanged. |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index e8ca4e54981f..b599cbba4fbe 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
| @@ -1886,11 +1886,13 @@ static void sctp_process_ext_param(struct sctp_association *asoc, | |||
| 1886 | /* if the peer reports AUTH, assume that he | 1886 | /* if the peer reports AUTH, assume that he |
| 1887 | * supports AUTH. | 1887 | * supports AUTH. |
| 1888 | */ | 1888 | */ |
| 1889 | asoc->peer.auth_capable = 1; | 1889 | if (sctp_auth_enable) |
| 1890 | asoc->peer.auth_capable = 1; | ||
| 1890 | break; | 1891 | break; |
| 1891 | case SCTP_CID_ASCONF: | 1892 | case SCTP_CID_ASCONF: |
| 1892 | case SCTP_CID_ASCONF_ACK: | 1893 | case SCTP_CID_ASCONF_ACK: |
| 1893 | asoc->peer.asconf_capable = 1; | 1894 | if (sctp_addip_enable) |
| 1895 | asoc->peer.asconf_capable = 1; | ||
| 1894 | break; | 1896 | break; |
| 1895 | default: | 1897 | default: |
| 1896 | break; | 1898 | break; |
| @@ -2319,12 +2321,10 @@ clean_up: | |||
| 2319 | /* Release the transport structures. */ | 2321 | /* Release the transport structures. */ |
| 2320 | list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { | 2322 | list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { |
| 2321 | transport = list_entry(pos, struct sctp_transport, transports); | 2323 | transport = list_entry(pos, struct sctp_transport, transports); |
| 2322 | list_del_init(pos); | 2324 | if (transport->state != SCTP_ACTIVE) |
| 2323 | sctp_transport_free(transport); | 2325 | sctp_assoc_rm_peer(asoc, transport); |
| 2324 | } | 2326 | } |
| 2325 | 2327 | ||
| 2326 | asoc->peer.transport_count = 0; | ||
| 2327 | |||
| 2328 | nomem: | 2328 | nomem: |
| 2329 | return 0; | 2329 | return 0; |
| 2330 | } | 2330 | } |
| @@ -2460,6 +2460,9 @@ do_addr_param: | |||
| 2460 | break; | 2460 | break; |
| 2461 | 2461 | ||
| 2462 | case SCTP_PARAM_SET_PRIMARY: | 2462 | case SCTP_PARAM_SET_PRIMARY: |
| 2463 | if (!sctp_addip_enable) | ||
| 2464 | goto fall_through; | ||
| 2465 | |||
| 2463 | addr_param = param.v + sizeof(sctp_addip_param_t); | 2466 | addr_param = param.v + sizeof(sctp_addip_param_t); |
| 2464 | 2467 | ||
| 2465 | af = sctp_get_af_specific(param_type2af(param.p->type)); | 2468 | af = sctp_get_af_specific(param_type2af(param.p->type)); |
