diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-11-26 16:05:05 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-11-26 16:05:05 -0500 |
commit | a0d60e62ea5c88a9823410e9d0929a513e29dea2 (patch) | |
tree | efbacfdcf8f06a6928128fcec79697233c86deeb /net | |
parent | 30e2b7cfc54c1efa0aa4c75eb8aa19318e3932e3 (diff) | |
parent | 6998cc6ec23740347670da13186d2979c5401903 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
1) Fix leak in fsl/fman driver, from Dan Carpenter.
2) Call flow dissector initcall earlier than any networking driver can
register and start to use it, from Eric Dumazet.
3) Some dup header fixes from Geliang Tang.
4) TIPC link monitoring compat fix from Jon Paul Maloy.
5) Link changes require EEE re-negotiation in bcm_sf2 driver, from
Florian Fainelli.
6) Fix bogus handle ID passed into tfilter_notify_chain(), from Roman
Mashak.
7) Fix dump size calculation in rtnl_calcit(), from Zhang Shengju.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (26 commits)
tipc: resolve connection flow control compatibility problem
mvpp2: use correct size for memset
net/mlx5: drop duplicate header delay.h
net: ieee802154: drop duplicate header delay.h
ibmvnic: drop duplicate header seq_file.h
fsl/fman: fix a leak in tgec_free()
net: ethtool: don't require CAP_NET_ADMIN for ETHTOOL_GLINKSETTINGS
tipc: improve sanity check for received domain records
tipc: fix compatibility bug in link monitoring
net: ethernet: mvneta: Remove IFF_UNICAST_FLT which is not implemented
dwc_eth_qos: drop duplicate headers
net sched filters: fix filter handle ID in tfilter_notify_chain()
net: dsa: bcm_sf2: Ensure we re-negotiate EEE during after link change
bnxt: do not busy-poll when link is down
udplite: call proper backlog handlers
ipv6: bump genid when the IFA_F_TENTATIVE flag is clear
net/mlx4_en: Free netdev resources under state lock
net: revert "net: l2tp: Treat NET_XMIT_CN as success in l2tp_eth_dev_xmit"
rtnetlink: fix the wrong minimal dump size getting from rtnl_calcit()
bnxt_en: Fix a VXLAN vs GENEVE issue
...
Diffstat (limited to 'net')
-rw-r--r-- | net/bluetooth/6lowpan.c | 4 | ||||
-rw-r--r-- | net/bluetooth/hci_conn.c | 26 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 2 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/tty.c | 2 | ||||
-rw-r--r-- | net/bluetooth/sco.c | 2 | ||||
-rw-r--r-- | net/can/bcm.c | 18 | ||||
-rw-r--r-- | net/core/ethtool.c | 1 | ||||
-rw-r--r-- | net/core/flow_dissector.c | 2 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 2 | ||||
-rw-r--r-- | net/ipv4/udp.c | 2 | ||||
-rw-r--r-- | net/ipv4/udp_impl.h | 2 | ||||
-rw-r--r-- | net/ipv4/udplite.c | 2 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 18 | ||||
-rw-r--r-- | net/ipv6/udp.c | 2 | ||||
-rw-r--r-- | net/ipv6/udp_impl.h | 2 | ||||
-rw-r--r-- | net/ipv6/udplite.c | 2 | ||||
-rw-r--r-- | net/l2tp/l2tp_eth.c | 2 | ||||
-rw-r--r-- | net/sched/cls_api.c | 2 | ||||
-rw-r--r-- | net/tipc/link.c | 5 | ||||
-rw-r--r-- | net/tipc/monitor.c | 10 | ||||
-rw-r--r-- | net/tipc/socket.c | 2 |
21 files changed, 71 insertions, 39 deletions
diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c index d020299baba4..1904a93f47d5 100644 --- a/net/bluetooth/6lowpan.c +++ b/net/bluetooth/6lowpan.c | |||
@@ -1090,7 +1090,6 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type, | |||
1090 | { | 1090 | { |
1091 | struct hci_conn *hcon; | 1091 | struct hci_conn *hcon; |
1092 | struct hci_dev *hdev; | 1092 | struct hci_dev *hdev; |
1093 | bdaddr_t *src = BDADDR_ANY; | ||
1094 | int n; | 1093 | int n; |
1095 | 1094 | ||
1096 | n = sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu", | 1095 | n = sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu", |
@@ -1101,7 +1100,8 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type, | |||
1101 | if (n < 7) | 1100 | if (n < 7) |
1102 | return -EINVAL; | 1101 | return -EINVAL; |
1103 | 1102 | ||
1104 | hdev = hci_get_route(addr, src); | 1103 | /* The LE_PUBLIC address type is ignored because of BDADDR_ANY */ |
1104 | hdev = hci_get_route(addr, BDADDR_ANY, BDADDR_LE_PUBLIC); | ||
1105 | if (!hdev) | 1105 | if (!hdev) |
1106 | return -ENOENT; | 1106 | return -ENOENT; |
1107 | 1107 | ||
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 3809617aa98d..dc59eae54717 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
@@ -613,7 +613,7 @@ int hci_conn_del(struct hci_conn *conn) | |||
613 | return 0; | 613 | return 0; |
614 | } | 614 | } |
615 | 615 | ||
616 | struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src) | 616 | struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src, uint8_t src_type) |
617 | { | 617 | { |
618 | int use_src = bacmp(src, BDADDR_ANY); | 618 | int use_src = bacmp(src, BDADDR_ANY); |
619 | struct hci_dev *hdev = NULL, *d; | 619 | struct hci_dev *hdev = NULL, *d; |
@@ -634,7 +634,29 @@ struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src) | |||
634 | */ | 634 | */ |
635 | 635 | ||
636 | if (use_src) { | 636 | if (use_src) { |
637 | if (!bacmp(&d->bdaddr, src)) { | 637 | bdaddr_t id_addr; |
638 | u8 id_addr_type; | ||
639 | |||
640 | if (src_type == BDADDR_BREDR) { | ||
641 | if (!lmp_bredr_capable(d)) | ||
642 | continue; | ||
643 | bacpy(&id_addr, &d->bdaddr); | ||
644 | id_addr_type = BDADDR_BREDR; | ||
645 | } else { | ||
646 | if (!lmp_le_capable(d)) | ||
647 | continue; | ||
648 | |||
649 | hci_copy_identity_address(d, &id_addr, | ||
650 | &id_addr_type); | ||
651 | |||
652 | /* Convert from HCI to three-value type */ | ||
653 | if (id_addr_type == ADDR_LE_DEV_PUBLIC) | ||
654 | id_addr_type = BDADDR_LE_PUBLIC; | ||
655 | else | ||
656 | id_addr_type = BDADDR_LE_RANDOM; | ||
657 | } | ||
658 | |||
659 | if (!bacmp(&id_addr, src) && id_addr_type == src_type) { | ||
638 | hdev = d; break; | 660 | hdev = d; break; |
639 | } | 661 | } |
640 | } else { | 662 | } else { |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index d4cad29b033f..577f1c01454a 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -7060,7 +7060,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, | |||
7060 | BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst, | 7060 | BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst, |
7061 | dst_type, __le16_to_cpu(psm)); | 7061 | dst_type, __le16_to_cpu(psm)); |
7062 | 7062 | ||
7063 | hdev = hci_get_route(dst, &chan->src); | 7063 | hdev = hci_get_route(dst, &chan->src, chan->src_type); |
7064 | if (!hdev) | 7064 | if (!hdev) |
7065 | return -EHOSTUNREACH; | 7065 | return -EHOSTUNREACH; |
7066 | 7066 | ||
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index 8e385a0ae60e..2f2cb5e27cdd 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c | |||
@@ -178,7 +178,7 @@ static void rfcomm_reparent_device(struct rfcomm_dev *dev) | |||
178 | struct hci_dev *hdev; | 178 | struct hci_dev *hdev; |
179 | struct hci_conn *conn; | 179 | struct hci_conn *conn; |
180 | 180 | ||
181 | hdev = hci_get_route(&dev->dst, &dev->src); | 181 | hdev = hci_get_route(&dev->dst, &dev->src, BDADDR_BREDR); |
182 | if (!hdev) | 182 | if (!hdev) |
183 | return; | 183 | return; |
184 | 184 | ||
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index f52bcbf2e58c..3125ce670c2f 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -219,7 +219,7 @@ static int sco_connect(struct sock *sk) | |||
219 | 219 | ||
220 | BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst); | 220 | BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst); |
221 | 221 | ||
222 | hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src); | 222 | hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR); |
223 | if (!hdev) | 223 | if (!hdev) |
224 | return -EHOSTUNREACH; | 224 | return -EHOSTUNREACH; |
225 | 225 | ||
diff --git a/net/can/bcm.c b/net/can/bcm.c index 8af9d25ff988..436a7537e6a9 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
@@ -77,7 +77,7 @@ | |||
77 | (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG) : \ | 77 | (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG) : \ |
78 | (CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG)) | 78 | (CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG)) |
79 | 79 | ||
80 | #define CAN_BCM_VERSION "20160617" | 80 | #define CAN_BCM_VERSION "20161123" |
81 | 81 | ||
82 | MODULE_DESCRIPTION("PF_CAN broadcast manager protocol"); | 82 | MODULE_DESCRIPTION("PF_CAN broadcast manager protocol"); |
83 | MODULE_LICENSE("Dual BSD/GPL"); | 83 | MODULE_LICENSE("Dual BSD/GPL"); |
@@ -109,8 +109,9 @@ struct bcm_op { | |||
109 | u32 count; | 109 | u32 count; |
110 | u32 nframes; | 110 | u32 nframes; |
111 | u32 currframe; | 111 | u32 currframe; |
112 | struct canfd_frame *frames; | 112 | /* void pointers to arrays of struct can[fd]_frame */ |
113 | struct canfd_frame *last_frames; | 113 | void *frames; |
114 | void *last_frames; | ||
114 | struct canfd_frame sframe; | 115 | struct canfd_frame sframe; |
115 | struct canfd_frame last_sframe; | 116 | struct canfd_frame last_sframe; |
116 | struct sock *sk; | 117 | struct sock *sk; |
@@ -681,7 +682,7 @@ static void bcm_rx_handler(struct sk_buff *skb, void *data) | |||
681 | 682 | ||
682 | if (op->flags & RX_FILTER_ID) { | 683 | if (op->flags & RX_FILTER_ID) { |
683 | /* the easiest case */ | 684 | /* the easiest case */ |
684 | bcm_rx_update_and_send(op, &op->last_frames[0], rxframe); | 685 | bcm_rx_update_and_send(op, op->last_frames, rxframe); |
685 | goto rx_starttimer; | 686 | goto rx_starttimer; |
686 | } | 687 | } |
687 | 688 | ||
@@ -1068,7 +1069,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, | |||
1068 | 1069 | ||
1069 | if (msg_head->nframes) { | 1070 | if (msg_head->nframes) { |
1070 | /* update CAN frames content */ | 1071 | /* update CAN frames content */ |
1071 | err = memcpy_from_msg((u8 *)op->frames, msg, | 1072 | err = memcpy_from_msg(op->frames, msg, |
1072 | msg_head->nframes * op->cfsiz); | 1073 | msg_head->nframes * op->cfsiz); |
1073 | if (err < 0) | 1074 | if (err < 0) |
1074 | return err; | 1075 | return err; |
@@ -1118,7 +1119,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, | |||
1118 | } | 1119 | } |
1119 | 1120 | ||
1120 | if (msg_head->nframes) { | 1121 | if (msg_head->nframes) { |
1121 | err = memcpy_from_msg((u8 *)op->frames, msg, | 1122 | err = memcpy_from_msg(op->frames, msg, |
1122 | msg_head->nframes * op->cfsiz); | 1123 | msg_head->nframes * op->cfsiz); |
1123 | if (err < 0) { | 1124 | if (err < 0) { |
1124 | if (op->frames != &op->sframe) | 1125 | if (op->frames != &op->sframe) |
@@ -1163,6 +1164,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, | |||
1163 | /* check flags */ | 1164 | /* check flags */ |
1164 | 1165 | ||
1165 | if (op->flags & RX_RTR_FRAME) { | 1166 | if (op->flags & RX_RTR_FRAME) { |
1167 | struct canfd_frame *frame0 = op->frames; | ||
1166 | 1168 | ||
1167 | /* no timers in RTR-mode */ | 1169 | /* no timers in RTR-mode */ |
1168 | hrtimer_cancel(&op->thrtimer); | 1170 | hrtimer_cancel(&op->thrtimer); |
@@ -1174,8 +1176,8 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, | |||
1174 | * prevent a full-load-loopback-test ... ;-] | 1176 | * prevent a full-load-loopback-test ... ;-] |
1175 | */ | 1177 | */ |
1176 | if ((op->flags & TX_CP_CAN_ID) || | 1178 | if ((op->flags & TX_CP_CAN_ID) || |
1177 | (op->frames[0].can_id == op->can_id)) | 1179 | (frame0->can_id == op->can_id)) |
1178 | op->frames[0].can_id = op->can_id & ~CAN_RTR_FLAG; | 1180 | frame0->can_id = op->can_id & ~CAN_RTR_FLAG; |
1179 | 1181 | ||
1180 | } else { | 1182 | } else { |
1181 | if (op->flags & SETTIMER) { | 1183 | if (op->flags & SETTIMER) { |
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 977489820eb9..047a1752ece1 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
@@ -2479,6 +2479,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) | |||
2479 | case ETHTOOL_GET_TS_INFO: | 2479 | case ETHTOOL_GET_TS_INFO: |
2480 | case ETHTOOL_GEEE: | 2480 | case ETHTOOL_GEEE: |
2481 | case ETHTOOL_GTUNABLE: | 2481 | case ETHTOOL_GTUNABLE: |
2482 | case ETHTOOL_GLINKSETTINGS: | ||
2482 | break; | 2483 | break; |
2483 | default: | 2484 | default: |
2484 | if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) | 2485 | if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) |
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 69e4463a4b1b..c6d8207ffa7e 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c | |||
@@ -1013,4 +1013,4 @@ static int __init init_default_flow_dissectors(void) | |||
1013 | return 0; | 1013 | return 0; |
1014 | } | 1014 | } |
1015 | 1015 | ||
1016 | late_initcall_sync(init_default_flow_dissectors); | 1016 | core_initcall(init_default_flow_dissectors); |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index a99917b5de33..deb35acbefd0 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -2737,7 +2737,7 @@ static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
2737 | ext_filter_mask)); | 2737 | ext_filter_mask)); |
2738 | } | 2738 | } |
2739 | 2739 | ||
2740 | return min_ifinfo_dump_size; | 2740 | return nlmsg_total_size(min_ifinfo_dump_size); |
2741 | } | 2741 | } |
2742 | 2742 | ||
2743 | static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb) | 2743 | static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb) |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 0de9d5d2b9ae..5bab6c3f7a2f 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -1455,7 +1455,7 @@ static void udp_v4_rehash(struct sock *sk) | |||
1455 | udp_lib_rehash(sk, new_hash); | 1455 | udp_lib_rehash(sk, new_hash); |
1456 | } | 1456 | } |
1457 | 1457 | ||
1458 | static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | 1458 | int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) |
1459 | { | 1459 | { |
1460 | int rc; | 1460 | int rc; |
1461 | 1461 | ||
diff --git a/net/ipv4/udp_impl.h b/net/ipv4/udp_impl.h index 7e0fe4bdd967..feb50a16398d 100644 --- a/net/ipv4/udp_impl.h +++ b/net/ipv4/udp_impl.h | |||
@@ -25,7 +25,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, | |||
25 | int flags, int *addr_len); | 25 | int flags, int *addr_len); |
26 | int udp_sendpage(struct sock *sk, struct page *page, int offset, size_t size, | 26 | int udp_sendpage(struct sock *sk, struct page *page, int offset, size_t size, |
27 | int flags); | 27 | int flags); |
28 | int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); | 28 | int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); |
29 | void udp_destroy_sock(struct sock *sk); | 29 | void udp_destroy_sock(struct sock *sk); |
30 | 30 | ||
31 | #ifdef CONFIG_PROC_FS | 31 | #ifdef CONFIG_PROC_FS |
diff --git a/net/ipv4/udplite.c b/net/ipv4/udplite.c index af817158d830..ff450c2aad9b 100644 --- a/net/ipv4/udplite.c +++ b/net/ipv4/udplite.c | |||
@@ -50,7 +50,7 @@ struct proto udplite_prot = { | |||
50 | .sendmsg = udp_sendmsg, | 50 | .sendmsg = udp_sendmsg, |
51 | .recvmsg = udp_recvmsg, | 51 | .recvmsg = udp_recvmsg, |
52 | .sendpage = udp_sendpage, | 52 | .sendpage = udp_sendpage, |
53 | .backlog_rcv = udp_queue_rcv_skb, | 53 | .backlog_rcv = __udp_queue_rcv_skb, |
54 | .hash = udp_lib_hash, | 54 | .hash = udp_lib_hash, |
55 | .unhash = udp_lib_unhash, | 55 | .unhash = udp_lib_unhash, |
56 | .get_port = udp_v4_get_port, | 56 | .get_port = udp_v4_get_port, |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 060dd9922018..4bc5ba3ae452 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -183,7 +183,7 @@ static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx, | |||
183 | 183 | ||
184 | static void addrconf_dad_start(struct inet6_ifaddr *ifp); | 184 | static void addrconf_dad_start(struct inet6_ifaddr *ifp); |
185 | static void addrconf_dad_work(struct work_struct *w); | 185 | static void addrconf_dad_work(struct work_struct *w); |
186 | static void addrconf_dad_completed(struct inet6_ifaddr *ifp); | 186 | static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id); |
187 | static void addrconf_dad_run(struct inet6_dev *idev); | 187 | static void addrconf_dad_run(struct inet6_dev *idev); |
188 | static void addrconf_rs_timer(unsigned long data); | 188 | static void addrconf_rs_timer(unsigned long data); |
189 | static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); | 189 | static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); |
@@ -2898,6 +2898,7 @@ static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr, | |||
2898 | spin_lock_bh(&ifp->lock); | 2898 | spin_lock_bh(&ifp->lock); |
2899 | ifp->flags &= ~IFA_F_TENTATIVE; | 2899 | ifp->flags &= ~IFA_F_TENTATIVE; |
2900 | spin_unlock_bh(&ifp->lock); | 2900 | spin_unlock_bh(&ifp->lock); |
2901 | rt_genid_bump_ipv6(dev_net(idev->dev)); | ||
2901 | ipv6_ifa_notify(RTM_NEWADDR, ifp); | 2902 | ipv6_ifa_notify(RTM_NEWADDR, ifp); |
2902 | in6_ifa_put(ifp); | 2903 | in6_ifa_put(ifp); |
2903 | } | 2904 | } |
@@ -3740,7 +3741,7 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp) | |||
3740 | { | 3741 | { |
3741 | struct inet6_dev *idev = ifp->idev; | 3742 | struct inet6_dev *idev = ifp->idev; |
3742 | struct net_device *dev = idev->dev; | 3743 | struct net_device *dev = idev->dev; |
3743 | bool notify = false; | 3744 | bool bump_id, notify = false; |
3744 | 3745 | ||
3745 | addrconf_join_solict(dev, &ifp->addr); | 3746 | addrconf_join_solict(dev, &ifp->addr); |
3746 | 3747 | ||
@@ -3755,11 +3756,12 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp) | |||
3755 | idev->cnf.accept_dad < 1 || | 3756 | idev->cnf.accept_dad < 1 || |
3756 | !(ifp->flags&IFA_F_TENTATIVE) || | 3757 | !(ifp->flags&IFA_F_TENTATIVE) || |
3757 | ifp->flags & IFA_F_NODAD) { | 3758 | ifp->flags & IFA_F_NODAD) { |
3759 | bump_id = ifp->flags & IFA_F_TENTATIVE; | ||
3758 | ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); | 3760 | ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); |
3759 | spin_unlock(&ifp->lock); | 3761 | spin_unlock(&ifp->lock); |
3760 | read_unlock_bh(&idev->lock); | 3762 | read_unlock_bh(&idev->lock); |
3761 | 3763 | ||
3762 | addrconf_dad_completed(ifp); | 3764 | addrconf_dad_completed(ifp, bump_id); |
3763 | return; | 3765 | return; |
3764 | } | 3766 | } |
3765 | 3767 | ||
@@ -3819,8 +3821,8 @@ static void addrconf_dad_work(struct work_struct *w) | |||
3819 | struct inet6_ifaddr, | 3821 | struct inet6_ifaddr, |
3820 | dad_work); | 3822 | dad_work); |
3821 | struct inet6_dev *idev = ifp->idev; | 3823 | struct inet6_dev *idev = ifp->idev; |
3824 | bool bump_id, disable_ipv6 = false; | ||
3822 | struct in6_addr mcaddr; | 3825 | struct in6_addr mcaddr; |
3823 | bool disable_ipv6 = false; | ||
3824 | 3826 | ||
3825 | enum { | 3827 | enum { |
3826 | DAD_PROCESS, | 3828 | DAD_PROCESS, |
@@ -3890,11 +3892,12 @@ static void addrconf_dad_work(struct work_struct *w) | |||
3890 | * DAD was successful | 3892 | * DAD was successful |
3891 | */ | 3893 | */ |
3892 | 3894 | ||
3895 | bump_id = ifp->flags & IFA_F_TENTATIVE; | ||
3893 | ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); | 3896 | ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); |
3894 | spin_unlock(&ifp->lock); | 3897 | spin_unlock(&ifp->lock); |
3895 | write_unlock_bh(&idev->lock); | 3898 | write_unlock_bh(&idev->lock); |
3896 | 3899 | ||
3897 | addrconf_dad_completed(ifp); | 3900 | addrconf_dad_completed(ifp, bump_id); |
3898 | 3901 | ||
3899 | goto out; | 3902 | goto out; |
3900 | } | 3903 | } |
@@ -3931,7 +3934,7 @@ static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp) | |||
3931 | return true; | 3934 | return true; |
3932 | } | 3935 | } |
3933 | 3936 | ||
3934 | static void addrconf_dad_completed(struct inet6_ifaddr *ifp) | 3937 | static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id) |
3935 | { | 3938 | { |
3936 | struct net_device *dev = ifp->idev->dev; | 3939 | struct net_device *dev = ifp->idev->dev; |
3937 | struct in6_addr lladdr; | 3940 | struct in6_addr lladdr; |
@@ -3983,6 +3986,9 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp) | |||
3983 | spin_unlock(&ifp->lock); | 3986 | spin_unlock(&ifp->lock); |
3984 | write_unlock_bh(&ifp->idev->lock); | 3987 | write_unlock_bh(&ifp->idev->lock); |
3985 | } | 3988 | } |
3989 | |||
3990 | if (bump_id) | ||
3991 | rt_genid_bump_ipv6(dev_net(dev)); | ||
3986 | } | 3992 | } |
3987 | 3993 | ||
3988 | static void addrconf_dad_run(struct inet6_dev *idev) | 3994 | static void addrconf_dad_run(struct inet6_dev *idev) |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index e5056d4873d1..e4a8000d59ad 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -514,7 +514,7 @@ out: | |||
514 | return; | 514 | return; |
515 | } | 515 | } |
516 | 516 | ||
517 | static int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | 517 | int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) |
518 | { | 518 | { |
519 | int rc; | 519 | int rc; |
520 | 520 | ||
diff --git a/net/ipv6/udp_impl.h b/net/ipv6/udp_impl.h index f6eb1ab34f4b..e78bdc76dcc3 100644 --- a/net/ipv6/udp_impl.h +++ b/net/ipv6/udp_impl.h | |||
@@ -26,7 +26,7 @@ int compat_udpv6_getsockopt(struct sock *sk, int level, int optname, | |||
26 | int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len); | 26 | int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len); |
27 | int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, | 27 | int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, |
28 | int flags, int *addr_len); | 28 | int flags, int *addr_len); |
29 | int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); | 29 | int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); |
30 | void udpv6_destroy_sock(struct sock *sk); | 30 | void udpv6_destroy_sock(struct sock *sk); |
31 | 31 | ||
32 | #ifdef CONFIG_PROC_FS | 32 | #ifdef CONFIG_PROC_FS |
diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c index 47d0d2b87106..2f5101a12283 100644 --- a/net/ipv6/udplite.c +++ b/net/ipv6/udplite.c | |||
@@ -45,7 +45,7 @@ struct proto udplitev6_prot = { | |||
45 | .getsockopt = udpv6_getsockopt, | 45 | .getsockopt = udpv6_getsockopt, |
46 | .sendmsg = udpv6_sendmsg, | 46 | .sendmsg = udpv6_sendmsg, |
47 | .recvmsg = udpv6_recvmsg, | 47 | .recvmsg = udpv6_recvmsg, |
48 | .backlog_rcv = udpv6_queue_rcv_skb, | 48 | .backlog_rcv = __udpv6_queue_rcv_skb, |
49 | .hash = udp_lib_hash, | 49 | .hash = udp_lib_hash, |
50 | .unhash = udp_lib_unhash, | 50 | .unhash = udp_lib_unhash, |
51 | .get_port = udp_v6_get_port, | 51 | .get_port = udp_v6_get_port, |
diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c index 3dc97b4f982b..965f7e344cef 100644 --- a/net/l2tp/l2tp_eth.c +++ b/net/l2tp/l2tp_eth.c | |||
@@ -97,7 +97,7 @@ static int l2tp_eth_dev_xmit(struct sk_buff *skb, struct net_device *dev) | |||
97 | unsigned int len = skb->len; | 97 | unsigned int len = skb->len; |
98 | int ret = l2tp_xmit_skb(session, skb, session->hdr_len); | 98 | int ret = l2tp_xmit_skb(session, skb, session->hdr_len); |
99 | 99 | ||
100 | if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) { | 100 | if (likely(ret == NET_XMIT_SUCCESS)) { |
101 | atomic_long_add(len, &priv->tx_bytes); | 101 | atomic_long_add(len, &priv->tx_bytes); |
102 | atomic_long_inc(&priv->tx_packets); | 102 | atomic_long_inc(&priv->tx_packets); |
103 | } else { | 103 | } else { |
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 8e93d4afe5ea..b05d4a2155b0 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
@@ -112,7 +112,7 @@ static void tfilter_notify_chain(struct net *net, struct sk_buff *oskb, | |||
112 | 112 | ||
113 | for (it_chain = chain; (tp = rtnl_dereference(*it_chain)) != NULL; | 113 | for (it_chain = chain; (tp = rtnl_dereference(*it_chain)) != NULL; |
114 | it_chain = &tp->next) | 114 | it_chain = &tp->next) |
115 | tfilter_notify(net, oskb, n, tp, n->nlmsg_flags, event, false); | 115 | tfilter_notify(net, oskb, n, tp, 0, event, false); |
116 | } | 116 | } |
117 | 117 | ||
118 | /* Select new prio value from the range, managed by kernel. */ | 118 | /* Select new prio value from the range, managed by kernel. */ |
diff --git a/net/tipc/link.c b/net/tipc/link.c index 1055164c6232..ecc12411155e 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -1492,8 +1492,9 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb, | |||
1492 | if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) | 1492 | if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) |
1493 | l->tolerance = peers_tol; | 1493 | l->tolerance = peers_tol; |
1494 | 1494 | ||
1495 | if (peers_prio && in_range(peers_prio, TIPC_MIN_LINK_PRI, | 1495 | /* Update own prio if peer indicates a different value */ |
1496 | TIPC_MAX_LINK_PRI)) { | 1496 | if ((peers_prio != l->priority) && |
1497 | in_range(peers_prio, 1, TIPC_MAX_LINK_PRI)) { | ||
1497 | l->priority = peers_prio; | 1498 | l->priority = peers_prio; |
1498 | rc = tipc_link_fsm_evt(l, LINK_FAILURE_EVT); | 1499 | rc = tipc_link_fsm_evt(l, LINK_FAILURE_EVT); |
1499 | } | 1500 | } |
diff --git a/net/tipc/monitor.c b/net/tipc/monitor.c index ed97a5876ebe..9e109bb1a207 100644 --- a/net/tipc/monitor.c +++ b/net/tipc/monitor.c | |||
@@ -455,14 +455,14 @@ void tipc_mon_rcv(struct net *net, void *data, u16 dlen, u32 addr, | |||
455 | int i, applied_bef; | 455 | int i, applied_bef; |
456 | 456 | ||
457 | state->probing = false; | 457 | state->probing = false; |
458 | if (!dlen) | ||
459 | return; | ||
460 | 458 | ||
461 | /* Sanity check received domain record */ | 459 | /* Sanity check received domain record */ |
462 | if ((dlen < new_dlen) || ntohs(arrv_dom->len) != new_dlen) { | 460 | if (dlen < dom_rec_len(arrv_dom, 0)) |
463 | pr_warn_ratelimited("Received illegal domain record\n"); | 461 | return; |
462 | if (dlen != dom_rec_len(arrv_dom, new_member_cnt)) | ||
463 | return; | ||
464 | if ((dlen < new_dlen) || ntohs(arrv_dom->len) != new_dlen) | ||
464 | return; | 465 | return; |
465 | } | ||
466 | 466 | ||
467 | /* Synch generation numbers with peer if link just came up */ | 467 | /* Synch generation numbers with peer if link just came up */ |
468 | if (!state->synched) { | 468 | if (!state->synched) { |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index db32777ab591..41f013888f07 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -186,7 +186,7 @@ static struct tipc_sock *tipc_sk(const struct sock *sk) | |||
186 | 186 | ||
187 | static bool tsk_conn_cong(struct tipc_sock *tsk) | 187 | static bool tsk_conn_cong(struct tipc_sock *tsk) |
188 | { | 188 | { |
189 | return tsk->snt_unacked >= tsk->snd_win; | 189 | return tsk->snt_unacked > tsk->snd_win; |
190 | } | 190 | } |
191 | 191 | ||
192 | /* tsk_blocks(): translate a buffer size in bytes to number of | 192 | /* tsk_blocks(): translate a buffer size in bytes to number of |