diff options
Diffstat (limited to 'net')
129 files changed, 1204 insertions, 1310 deletions
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index 990afab2be1b..9c5a1aa34d12 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c | |||
@@ -544,9 +544,7 @@ static int p9_virtio_probe(struct virtio_device *vdev) | |||
544 | 544 | ||
545 | chan->inuse = false; | 545 | chan->inuse = false; |
546 | if (virtio_has_feature(vdev, VIRTIO_9P_MOUNT_TAG)) { | 546 | if (virtio_has_feature(vdev, VIRTIO_9P_MOUNT_TAG)) { |
547 | vdev->config->get(vdev, | 547 | virtio_cread(vdev, struct virtio_9p_config, tag_len, &tag_len); |
548 | offsetof(struct virtio_9p_config, tag_len), | ||
549 | &tag_len, sizeof(tag_len)); | ||
550 | } else { | 548 | } else { |
551 | err = -EINVAL; | 549 | err = -EINVAL; |
552 | goto out_free_vq; | 550 | goto out_free_vq; |
@@ -556,8 +554,9 @@ static int p9_virtio_probe(struct virtio_device *vdev) | |||
556 | err = -ENOMEM; | 554 | err = -ENOMEM; |
557 | goto out_free_vq; | 555 | goto out_free_vq; |
558 | } | 556 | } |
559 | vdev->config->get(vdev, offsetof(struct virtio_9p_config, tag), | 557 | |
560 | tag, tag_len); | 558 | virtio_cread_bytes(vdev, offsetof(struct virtio_9p_config, tag), |
559 | tag, tag_len); | ||
561 | chan->tag = tag; | 560 | chan->tag = tag; |
562 | chan->tag_len = tag_len; | 561 | chan->tag_len = tag_len; |
563 | err = sysfs_create_file(&(vdev->dev.kobj), &dev_attr_mount_tag.attr); | 562 | err = sysfs_create_file(&(vdev->dev.kobj), &dev_attr_mount_tag.attr); |
diff --git a/net/Kconfig b/net/Kconfig index 0715db64a5c3..d334678c0bd8 100644 --- a/net/Kconfig +++ b/net/Kconfig | |||
@@ -224,7 +224,7 @@ source "net/hsr/Kconfig" | |||
224 | 224 | ||
225 | config RPS | 225 | config RPS |
226 | boolean | 226 | boolean |
227 | depends on SMP && SYSFS && USE_GENERIC_SMP_HELPERS | 227 | depends on SMP && SYSFS |
228 | default y | 228 | default y |
229 | 229 | ||
230 | config RFS_ACCEL | 230 | config RFS_ACCEL |
@@ -235,7 +235,7 @@ config RFS_ACCEL | |||
235 | 235 | ||
236 | config XPS | 236 | config XPS |
237 | boolean | 237 | boolean |
238 | depends on SMP && USE_GENERIC_SMP_HELPERS | 238 | depends on SMP |
239 | default y | 239 | default y |
240 | 240 | ||
241 | config NETPRIO_CGROUP | 241 | config NETPRIO_CGROUP |
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 7fee50d637f9..7d424ac6e760 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c | |||
@@ -1735,7 +1735,6 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | |||
1735 | size_t size, int flags) | 1735 | size_t size, int flags) |
1736 | { | 1736 | { |
1737 | struct sock *sk = sock->sk; | 1737 | struct sock *sk = sock->sk; |
1738 | struct sockaddr_at *sat = (struct sockaddr_at *)msg->msg_name; | ||
1739 | struct ddpehdr *ddp; | 1738 | struct ddpehdr *ddp; |
1740 | int copied = 0; | 1739 | int copied = 0; |
1741 | int offset = 0; | 1740 | int offset = 0; |
@@ -1764,14 +1763,13 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | |||
1764 | } | 1763 | } |
1765 | err = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copied); | 1764 | err = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copied); |
1766 | 1765 | ||
1767 | if (!err) { | 1766 | if (!err && msg->msg_name) { |
1768 | if (sat) { | 1767 | struct sockaddr_at *sat = msg->msg_name; |
1769 | sat->sat_family = AF_APPLETALK; | 1768 | sat->sat_family = AF_APPLETALK; |
1770 | sat->sat_port = ddp->deh_sport; | 1769 | sat->sat_port = ddp->deh_sport; |
1771 | sat->sat_addr.s_node = ddp->deh_snode; | 1770 | sat->sat_addr.s_node = ddp->deh_snode; |
1772 | sat->sat_addr.s_net = ddp->deh_snet; | 1771 | sat->sat_addr.s_net = ddp->deh_snet; |
1773 | } | 1772 | msg->msg_namelen = sizeof(*sat); |
1774 | msg->msg_namelen = sizeof(*sat); | ||
1775 | } | 1773 | } |
1776 | 1774 | ||
1777 | skb_free_datagram(sk, skb); /* Free the datagram. */ | 1775 | skb_free_datagram(sk, skb); /* Free the datagram. */ |
diff --git a/net/atm/common.c b/net/atm/common.c index 737bef59ce89..7b491006eaf4 100644 --- a/net/atm/common.c +++ b/net/atm/common.c | |||
@@ -531,8 +531,6 @@ int vcc_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | |||
531 | struct sk_buff *skb; | 531 | struct sk_buff *skb; |
532 | int copied, error = -EINVAL; | 532 | int copied, error = -EINVAL; |
533 | 533 | ||
534 | msg->msg_namelen = 0; | ||
535 | |||
536 | if (sock->state != SS_CONNECTED) | 534 | if (sock->state != SS_CONNECTED) |
537 | return -ENOTCONN; | 535 | return -ENOTCONN; |
538 | 536 | ||
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index a00123ebb0ae..7bb1605bdfd9 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c | |||
@@ -1636,11 +1636,11 @@ static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1636 | 1636 | ||
1637 | skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); | 1637 | skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); |
1638 | 1638 | ||
1639 | if (msg->msg_namelen != 0) { | 1639 | if (msg->msg_name) { |
1640 | struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name; | ||
1641 | ax25_digi digi; | 1640 | ax25_digi digi; |
1642 | ax25_address src; | 1641 | ax25_address src; |
1643 | const unsigned char *mac = skb_mac_header(skb); | 1642 | const unsigned char *mac = skb_mac_header(skb); |
1643 | struct sockaddr_ax25 *sax = msg->msg_name; | ||
1644 | 1644 | ||
1645 | memset(sax, 0, sizeof(struct full_sockaddr_ax25)); | 1645 | memset(sax, 0, sizeof(struct full_sockaddr_ax25)); |
1646 | ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL, | 1646 | ax25_addr_parse(mac + 1, skb->data - mac - 1, &src, NULL, |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index f6a1671ea2ff..56ca494621c6 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -224,10 +224,9 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
224 | 224 | ||
225 | skb = skb_recv_datagram(sk, flags, noblock, &err); | 225 | skb = skb_recv_datagram(sk, flags, noblock, &err); |
226 | if (!skb) { | 226 | if (!skb) { |
227 | if (sk->sk_shutdown & RCV_SHUTDOWN) { | 227 | if (sk->sk_shutdown & RCV_SHUTDOWN) |
228 | msg->msg_namelen = 0; | ||
229 | return 0; | 228 | return 0; |
230 | } | 229 | |
231 | return err; | 230 | return err; |
232 | } | 231 | } |
233 | 232 | ||
@@ -245,8 +244,6 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
245 | if (bt_sk(sk)->skb_msg_name) | 244 | if (bt_sk(sk)->skb_msg_name) |
246 | bt_sk(sk)->skb_msg_name(skb, msg->msg_name, | 245 | bt_sk(sk)->skb_msg_name(skb, msg->msg_name, |
247 | &msg->msg_namelen); | 246 | &msg->msg_namelen); |
248 | else | ||
249 | msg->msg_namelen = 0; | ||
250 | } | 247 | } |
251 | 248 | ||
252 | skb_free_datagram(sk, skb); | 249 | skb_free_datagram(sk, skb); |
@@ -295,8 +292,6 @@ int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
295 | if (flags & MSG_OOB) | 292 | if (flags & MSG_OOB) |
296 | return -EOPNOTSUPP; | 293 | return -EOPNOTSUPP; |
297 | 294 | ||
298 | msg->msg_namelen = 0; | ||
299 | |||
300 | BT_DBG("sk %p size %zu", sk, size); | 295 | BT_DBG("sk %p size %zu", sk, size); |
301 | 296 | ||
302 | lock_sock(sk); | 297 | lock_sock(sk); |
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 71f0be173080..6a6c8bb4fd72 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -856,8 +856,6 @@ static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
856 | if (!skb) | 856 | if (!skb) |
857 | return err; | 857 | return err; |
858 | 858 | ||
859 | msg->msg_namelen = 0; | ||
860 | |||
861 | copied = skb->len; | 859 | copied = skb->len; |
862 | if (len < copied) { | 860 | if (len < copied) { |
863 | msg->msg_flags |= MSG_TRUNC; | 861 | msg->msg_flags |= MSG_TRUNC; |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 0cef67707838..4af3821df880 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -2439,6 +2439,9 @@ int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len, | |||
2439 | int err; | 2439 | int err; |
2440 | struct sk_buff_head seg_queue; | 2440 | struct sk_buff_head seg_queue; |
2441 | 2441 | ||
2442 | if (!chan->conn) | ||
2443 | return -ENOTCONN; | ||
2444 | |||
2442 | /* Connectionless channel */ | 2445 | /* Connectionless channel */ |
2443 | if (chan->chan_type == L2CAP_CHAN_CONN_LESS) { | 2446 | if (chan->chan_type == L2CAP_CHAN_CONN_LESS) { |
2444 | skb = l2cap_create_connless_pdu(chan, msg, len, priority); | 2447 | skb = l2cap_create_connless_pdu(chan, msg, len, priority); |
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 94d06cbfbc18..facd8a79c038 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
@@ -694,6 +694,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, | |||
694 | addr.l2_family = AF_BLUETOOTH; | 694 | addr.l2_family = AF_BLUETOOTH; |
695 | addr.l2_psm = 0; | 695 | addr.l2_psm = 0; |
696 | addr.l2_cid = 0; | 696 | addr.l2_cid = 0; |
697 | addr.l2_bdaddr_type = BDADDR_BREDR; | ||
697 | *err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr)); | 698 | *err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr)); |
698 | if (*err < 0) | 699 | if (*err < 0) |
699 | goto failed; | 700 | goto failed; |
@@ -719,6 +720,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, | |||
719 | addr.l2_family = AF_BLUETOOTH; | 720 | addr.l2_family = AF_BLUETOOTH; |
720 | addr.l2_psm = __constant_cpu_to_le16(RFCOMM_PSM); | 721 | addr.l2_psm = __constant_cpu_to_le16(RFCOMM_PSM); |
721 | addr.l2_cid = 0; | 722 | addr.l2_cid = 0; |
723 | addr.l2_bdaddr_type = BDADDR_BREDR; | ||
722 | *err = kernel_connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK); | 724 | *err = kernel_connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK); |
723 | if (*err == 0 || *err == -EINPROGRESS) | 725 | if (*err == 0 || *err == -EINPROGRESS) |
724 | return s; | 726 | return s; |
@@ -1983,6 +1985,7 @@ static int rfcomm_add_listener(bdaddr_t *ba) | |||
1983 | addr.l2_family = AF_BLUETOOTH; | 1985 | addr.l2_family = AF_BLUETOOTH; |
1984 | addr.l2_psm = __constant_cpu_to_le16(RFCOMM_PSM); | 1986 | addr.l2_psm = __constant_cpu_to_le16(RFCOMM_PSM); |
1985 | addr.l2_cid = 0; | 1987 | addr.l2_cid = 0; |
1988 | addr.l2_bdaddr_type = BDADDR_BREDR; | ||
1986 | err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr)); | 1989 | err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr)); |
1987 | if (err < 0) { | 1990 | if (err < 0) { |
1988 | BT_ERR("Bind failed %d", err); | 1991 | BT_ERR("Bind failed %d", err); |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index c4d3d423f89b..3c2d3e4aa2f5 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
@@ -615,7 +615,6 @@ static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
615 | 615 | ||
616 | if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) { | 616 | if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) { |
617 | rfcomm_dlc_accept(d); | 617 | rfcomm_dlc_accept(d); |
618 | msg->msg_namelen = 0; | ||
619 | return 0; | 618 | return 0; |
620 | } | 619 | } |
621 | 620 | ||
@@ -739,8 +738,9 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, c | |||
739 | static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen) | 738 | static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen) |
740 | { | 739 | { |
741 | struct sock *sk = sock->sk; | 740 | struct sock *sk = sock->sk; |
741 | struct sock *l2cap_sk; | ||
742 | struct l2cap_conn *conn; | ||
742 | struct rfcomm_conninfo cinfo; | 743 | struct rfcomm_conninfo cinfo; |
743 | struct l2cap_conn *conn = l2cap_pi(sk)->chan->conn; | ||
744 | int len, err = 0; | 744 | int len, err = 0; |
745 | u32 opt; | 745 | u32 opt; |
746 | 746 | ||
@@ -783,6 +783,9 @@ static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __u | |||
783 | break; | 783 | break; |
784 | } | 784 | } |
785 | 785 | ||
786 | l2cap_sk = rfcomm_pi(sk)->dlc->session->sock->sk; | ||
787 | conn = l2cap_pi(l2cap_sk)->chan->conn; | ||
788 | |||
786 | memset(&cinfo, 0, sizeof(cinfo)); | 789 | memset(&cinfo, 0, sizeof(cinfo)); |
787 | cinfo.hci_handle = conn->hcon->handle; | 790 | cinfo.hci_handle = conn->hcon->handle; |
788 | memcpy(cinfo.dev_class, conn->hcon->dev_class, 3); | 791 | memcpy(cinfo.dev_class, conn->hcon->dev_class, 3); |
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 12a0e51e21e1..24fa3964b3c8 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -711,7 +711,6 @@ static int sco_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
711 | test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { | 711 | test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { |
712 | sco_conn_defer_accept(pi->conn->hcon, pi->setting); | 712 | sco_conn_defer_accept(pi->conn->hcon, pi->setting); |
713 | sk->sk_state = BT_CONFIG; | 713 | sk->sk_state = BT_CONFIG; |
714 | msg->msg_namelen = 0; | ||
715 | 714 | ||
716 | release_sock(sk); | 715 | release_sock(sk); |
717 | return 0; | 716 | return 0; |
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c index 85a2796cac61..4b07acb8293c 100644 --- a/net/bluetooth/smp.c +++ b/net/bluetooth/smp.c | |||
@@ -742,6 +742,9 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb) | |||
742 | 742 | ||
743 | BT_DBG("conn %p", conn); | 743 | BT_DBG("conn %p", conn); |
744 | 744 | ||
745 | if (!(conn->hcon->link_mode & HCI_LM_MASTER)) | ||
746 | return SMP_CMD_NOTSUPP; | ||
747 | |||
745 | hcon->pending_sec_level = authreq_to_seclevel(rp->auth_req); | 748 | hcon->pending_sec_level = authreq_to_seclevel(rp->auth_req); |
746 | 749 | ||
747 | if (smp_ltk_encrypt(conn, hcon->pending_sec_level)) | 750 | if (smp_ltk_encrypt(conn, hcon->pending_sec_level)) |
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index c41d5fbb91d0..4bf02adb5dc2 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c | |||
@@ -172,6 +172,9 @@ void br_dev_delete(struct net_device *dev, struct list_head *head) | |||
172 | del_nbp(p); | 172 | del_nbp(p); |
173 | } | 173 | } |
174 | 174 | ||
175 | br_fdb_delete_by_port(br, NULL, 1); | ||
176 | |||
177 | br_vlan_flush(br); | ||
175 | del_timer_sync(&br->gc_timer); | 178 | del_timer_sync(&br->gc_timer); |
176 | 179 | ||
177 | br_sysfs_delbr(br->dev); | 180 | br_sysfs_delbr(br->dev); |
diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c index 53f0990eab58..af5ebd18d705 100644 --- a/net/bridge/br_vlan.c +++ b/net/bridge/br_vlan.c | |||
@@ -34,7 +34,6 @@ static void __vlan_add_flags(struct net_port_vlans *v, u16 vid, u16 flags) | |||
34 | 34 | ||
35 | static int __vlan_add(struct net_port_vlans *v, u16 vid, u16 flags) | 35 | static int __vlan_add(struct net_port_vlans *v, u16 vid, u16 flags) |
36 | { | 36 | { |
37 | const struct net_device_ops *ops; | ||
38 | struct net_bridge_port *p = NULL; | 37 | struct net_bridge_port *p = NULL; |
39 | struct net_bridge *br; | 38 | struct net_bridge *br; |
40 | struct net_device *dev; | 39 | struct net_device *dev; |
@@ -53,17 +52,15 @@ static int __vlan_add(struct net_port_vlans *v, u16 vid, u16 flags) | |||
53 | br = v->parent.br; | 52 | br = v->parent.br; |
54 | dev = br->dev; | 53 | dev = br->dev; |
55 | } | 54 | } |
56 | ops = dev->netdev_ops; | ||
57 | 55 | ||
58 | if (p && (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) { | 56 | if (p) { |
59 | /* Add VLAN to the device filter if it is supported. | 57 | /* Add VLAN to the device filter if it is supported. |
60 | * Stricly speaking, this is not necessary now, since | 58 | * Stricly speaking, this is not necessary now, since |
61 | * devices are made promiscuous by the bridge, but if | 59 | * devices are made promiscuous by the bridge, but if |
62 | * that ever changes this code will allow tagged | 60 | * that ever changes this code will allow tagged |
63 | * traffic to enter the bridge. | 61 | * traffic to enter the bridge. |
64 | */ | 62 | */ |
65 | err = ops->ndo_vlan_rx_add_vid(dev, htons(ETH_P_8021Q), | 63 | err = vlan_vid_add(dev, htons(ETH_P_8021Q), vid); |
66 | vid); | ||
67 | if (err) | 64 | if (err) |
68 | return err; | 65 | return err; |
69 | } | 66 | } |
@@ -82,8 +79,8 @@ static int __vlan_add(struct net_port_vlans *v, u16 vid, u16 flags) | |||
82 | return 0; | 79 | return 0; |
83 | 80 | ||
84 | out_filt: | 81 | out_filt: |
85 | if (p && (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) | 82 | if (p) |
86 | ops->ndo_vlan_rx_kill_vid(dev, htons(ETH_P_8021Q), vid); | 83 | vlan_vid_del(dev, htons(ETH_P_8021Q), vid); |
87 | return err; | 84 | return err; |
88 | } | 85 | } |
89 | 86 | ||
@@ -95,13 +92,8 @@ static int __vlan_del(struct net_port_vlans *v, u16 vid) | |||
95 | __vlan_delete_pvid(v, vid); | 92 | __vlan_delete_pvid(v, vid); |
96 | clear_bit(vid, v->untagged_bitmap); | 93 | clear_bit(vid, v->untagged_bitmap); |
97 | 94 | ||
98 | if (v->port_idx) { | 95 | if (v->port_idx) |
99 | struct net_device *dev = v->parent.port->dev; | 96 | vlan_vid_del(v->parent.port->dev, htons(ETH_P_8021Q), vid); |
100 | const struct net_device_ops *ops = dev->netdev_ops; | ||
101 | |||
102 | if (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER) | ||
103 | ops->ndo_vlan_rx_kill_vid(dev, htons(ETH_P_8021Q), vid); | ||
104 | } | ||
105 | 97 | ||
106 | clear_bit(vid, v->vlan_bitmap); | 98 | clear_bit(vid, v->vlan_bitmap); |
107 | v->num_vlans--; | 99 | v->num_vlans--; |
@@ -398,6 +390,7 @@ int nbp_vlan_delete(struct net_bridge_port *port, u16 vid) | |||
398 | void nbp_vlan_flush(struct net_bridge_port *port) | 390 | void nbp_vlan_flush(struct net_bridge_port *port) |
399 | { | 391 | { |
400 | struct net_port_vlans *pv; | 392 | struct net_port_vlans *pv; |
393 | u16 vid; | ||
401 | 394 | ||
402 | ASSERT_RTNL(); | 395 | ASSERT_RTNL(); |
403 | 396 | ||
@@ -405,6 +398,9 @@ void nbp_vlan_flush(struct net_bridge_port *port) | |||
405 | if (!pv) | 398 | if (!pv) |
406 | return; | 399 | return; |
407 | 400 | ||
401 | for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) | ||
402 | vlan_vid_del(port->dev, htons(ETH_P_8021Q), vid); | ||
403 | |||
408 | __vlan_flush(pv); | 404 | __vlan_flush(pv); |
409 | } | 405 | } |
410 | 406 | ||
diff --git a/net/bridge/netfilter/ebt_ip6.c b/net/bridge/netfilter/ebt_ip6.c index 99c85668f551..17fd5f2cb4b8 100644 --- a/net/bridge/netfilter/ebt_ip6.c +++ b/net/bridge/netfilter/ebt_ip6.c | |||
@@ -48,10 +48,12 @@ ebt_ip6_mt(const struct sk_buff *skb, struct xt_action_param *par) | |||
48 | if (info->bitmask & EBT_IP6_TCLASS && | 48 | if (info->bitmask & EBT_IP6_TCLASS && |
49 | FWINV(info->tclass != ipv6_get_dsfield(ih6), EBT_IP6_TCLASS)) | 49 | FWINV(info->tclass != ipv6_get_dsfield(ih6), EBT_IP6_TCLASS)) |
50 | return false; | 50 | return false; |
51 | if (FWINV(ipv6_masked_addr_cmp(&ih6->saddr, &info->smsk, | 51 | if ((info->bitmask & EBT_IP6_SOURCE && |
52 | &info->saddr), EBT_IP6_SOURCE) || | 52 | FWINV(ipv6_masked_addr_cmp(&ih6->saddr, &info->smsk, |
53 | &info->saddr), EBT_IP6_SOURCE)) || | ||
54 | (info->bitmask & EBT_IP6_DEST && | ||
53 | FWINV(ipv6_masked_addr_cmp(&ih6->daddr, &info->dmsk, | 55 | FWINV(ipv6_masked_addr_cmp(&ih6->daddr, &info->dmsk, |
54 | &info->daddr), EBT_IP6_DEST)) | 56 | &info->daddr), EBT_IP6_DEST))) |
55 | return false; | 57 | return false; |
56 | if (info->bitmask & EBT_IP6_PROTO) { | 58 | if (info->bitmask & EBT_IP6_PROTO) { |
57 | uint8_t nexthdr = ih6->nexthdr; | 59 | uint8_t nexthdr = ih6->nexthdr; |
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c index 05a41c7ec304..d6be3edb7a43 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c | |||
@@ -286,8 +286,6 @@ static int caif_seqpkt_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
286 | if (m->msg_flags&MSG_OOB) | 286 | if (m->msg_flags&MSG_OOB) |
287 | goto read_error; | 287 | goto read_error; |
288 | 288 | ||
289 | m->msg_namelen = 0; | ||
290 | |||
291 | skb = skb_recv_datagram(sk, flags, 0 , &ret); | 289 | skb = skb_recv_datagram(sk, flags, 0 , &ret); |
292 | if (!skb) | 290 | if (!skb) |
293 | goto read_error; | 291 | goto read_error; |
@@ -361,8 +359,6 @@ static int caif_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
361 | if (flags&MSG_OOB) | 359 | if (flags&MSG_OOB) |
362 | goto out; | 360 | goto out; |
363 | 361 | ||
364 | msg->msg_namelen = 0; | ||
365 | |||
366 | /* | 362 | /* |
367 | * Lock the socket to prevent queue disordering | 363 | * Lock the socket to prevent queue disordering |
368 | * while sleeps in memcpy_tomsg | 364 | * while sleeps in memcpy_tomsg |
diff --git a/net/can/af_can.c b/net/can/af_can.c index 3ab8dd2e1282..d249874a366d 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c | |||
@@ -420,7 +420,7 @@ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask, | |||
420 | * @mask: CAN mask (see description) | 420 | * @mask: CAN mask (see description) |
421 | * @func: callback function on filter match | 421 | * @func: callback function on filter match |
422 | * @data: returned parameter for callback function | 422 | * @data: returned parameter for callback function |
423 | * @ident: string for calling module indentification | 423 | * @ident: string for calling module identification |
424 | * | 424 | * |
425 | * Description: | 425 | * Description: |
426 | * Invokes the callback function with the received sk_buff and the given | 426 | * Invokes the callback function with the received sk_buff and the given |
diff --git a/net/compat.c b/net/compat.c index 89032580bd1d..dd32e34c1e2c 100644 --- a/net/compat.c +++ b/net/compat.c | |||
@@ -72,7 +72,7 @@ int get_compat_msghdr(struct msghdr *kmsg, struct compat_msghdr __user *umsg) | |||
72 | __get_user(kmsg->msg_flags, &umsg->msg_flags)) | 72 | __get_user(kmsg->msg_flags, &umsg->msg_flags)) |
73 | return -EFAULT; | 73 | return -EFAULT; |
74 | if (kmsg->msg_namelen > sizeof(struct sockaddr_storage)) | 74 | if (kmsg->msg_namelen > sizeof(struct sockaddr_storage)) |
75 | return -EINVAL; | 75 | kmsg->msg_namelen = sizeof(struct sockaddr_storage); |
76 | kmsg->msg_name = compat_ptr(tmp1); | 76 | kmsg->msg_name = compat_ptr(tmp1); |
77 | kmsg->msg_iov = compat_ptr(tmp2); | 77 | kmsg->msg_iov = compat_ptr(tmp2); |
78 | kmsg->msg_control = compat_ptr(tmp3); | 78 | kmsg->msg_control = compat_ptr(tmp3); |
@@ -93,7 +93,8 @@ int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov, | |||
93 | if (err < 0) | 93 | if (err < 0) |
94 | return err; | 94 | return err; |
95 | } | 95 | } |
96 | kern_msg->msg_name = kern_address; | 96 | if (kern_msg->msg_name) |
97 | kern_msg->msg_name = kern_address; | ||
97 | } else | 98 | } else |
98 | kern_msg->msg_name = NULL; | 99 | kern_msg->msg_name = NULL; |
99 | 100 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index 8ffc52e01ece..ba3b7ea5ebb3 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -131,6 +131,7 @@ | |||
131 | #include <linux/static_key.h> | 131 | #include <linux/static_key.h> |
132 | #include <linux/hashtable.h> | 132 | #include <linux/hashtable.h> |
133 | #include <linux/vmalloc.h> | 133 | #include <linux/vmalloc.h> |
134 | #include <linux/if_macvlan.h> | ||
134 | 135 | ||
135 | #include "net-sysfs.h" | 136 | #include "net-sysfs.h" |
136 | 137 | ||
@@ -1424,6 +1425,10 @@ void dev_disable_lro(struct net_device *dev) | |||
1424 | if (is_vlan_dev(dev)) | 1425 | if (is_vlan_dev(dev)) |
1425 | dev = vlan_dev_real_dev(dev); | 1426 | dev = vlan_dev_real_dev(dev); |
1426 | 1427 | ||
1428 | /* the same for macvlan devices */ | ||
1429 | if (netif_is_macvlan(dev)) | ||
1430 | dev = macvlan_dev_real_dev(dev); | ||
1431 | |||
1427 | dev->wanted_features &= ~NETIF_F_LRO; | 1432 | dev->wanted_features &= ~NETIF_F_LRO; |
1428 | netdev_update_features(dev); | 1433 | netdev_update_features(dev); |
1429 | 1434 | ||
@@ -1690,13 +1695,9 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | |||
1690 | kfree_skb(skb); | 1695 | kfree_skb(skb); |
1691 | return NET_RX_DROP; | 1696 | return NET_RX_DROP; |
1692 | } | 1697 | } |
1693 | skb->protocol = eth_type_trans(skb, dev); | ||
1694 | 1698 | ||
1695 | /* eth_type_trans() can set pkt_type. | ||
1696 | * call skb_scrub_packet() after it to clear pkt_type _after_ calling | ||
1697 | * eth_type_trans(). | ||
1698 | */ | ||
1699 | skb_scrub_packet(skb, true); | 1699 | skb_scrub_packet(skb, true); |
1700 | skb->protocol = eth_type_trans(skb, dev); | ||
1700 | 1701 | ||
1701 | return netif_rx(skb); | 1702 | return netif_rx(skb); |
1702 | } | 1703 | } |
@@ -4995,7 +4996,7 @@ static void dev_change_rx_flags(struct net_device *dev, int flags) | |||
4995 | { | 4996 | { |
4996 | const struct net_device_ops *ops = dev->netdev_ops; | 4997 | const struct net_device_ops *ops = dev->netdev_ops; |
4997 | 4998 | ||
4998 | if ((dev->flags & IFF_UP) && ops->ndo_change_rx_flags) | 4999 | if (ops->ndo_change_rx_flags) |
4999 | ops->ndo_change_rx_flags(dev, flags); | 5000 | ops->ndo_change_rx_flags(dev, flags); |
5000 | } | 5001 | } |
5001 | 5002 | ||
diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c index 5e78d44333b9..95897183226e 100644 --- a/net/core/drop_monitor.c +++ b/net/core/drop_monitor.c | |||
@@ -106,6 +106,10 @@ static struct sk_buff *reset_per_cpu_data(struct per_cpu_dm_data *data) | |||
106 | return skb; | 106 | return skb; |
107 | } | 107 | } |
108 | 108 | ||
109 | static struct genl_multicast_group dropmon_mcgrps[] = { | ||
110 | { .name = "events", }, | ||
111 | }; | ||
112 | |||
109 | static void send_dm_alert(struct work_struct *work) | 113 | static void send_dm_alert(struct work_struct *work) |
110 | { | 114 | { |
111 | struct sk_buff *skb; | 115 | struct sk_buff *skb; |
@@ -116,7 +120,8 @@ static void send_dm_alert(struct work_struct *work) | |||
116 | skb = reset_per_cpu_data(data); | 120 | skb = reset_per_cpu_data(data); |
117 | 121 | ||
118 | if (skb) | 122 | if (skb) |
119 | genlmsg_multicast(skb, 0, NET_DM_GRP_ALERT, GFP_KERNEL); | 123 | genlmsg_multicast(&net_drop_monitor_family, skb, 0, |
124 | 0, GFP_KERNEL); | ||
120 | } | 125 | } |
121 | 126 | ||
122 | /* | 127 | /* |
@@ -333,7 +338,7 @@ out: | |||
333 | return NOTIFY_DONE; | 338 | return NOTIFY_DONE; |
334 | } | 339 | } |
335 | 340 | ||
336 | static struct genl_ops dropmon_ops[] = { | 341 | static const struct genl_ops dropmon_ops[] = { |
337 | { | 342 | { |
338 | .cmd = NET_DM_CMD_CONFIG, | 343 | .cmd = NET_DM_CMD_CONFIG, |
339 | .doit = net_dm_cmd_config, | 344 | .doit = net_dm_cmd_config, |
@@ -364,13 +369,13 @@ static int __init init_net_drop_monitor(void) | |||
364 | return -ENOSPC; | 369 | return -ENOSPC; |
365 | } | 370 | } |
366 | 371 | ||
367 | rc = genl_register_family_with_ops(&net_drop_monitor_family, | 372 | rc = genl_register_family_with_ops_groups(&net_drop_monitor_family, |
368 | dropmon_ops, | 373 | dropmon_ops, dropmon_mcgrps); |
369 | ARRAY_SIZE(dropmon_ops)); | ||
370 | if (rc) { | 374 | if (rc) { |
371 | pr_err("Could not create drop monitor netlink family\n"); | 375 | pr_err("Could not create drop monitor netlink family\n"); |
372 | return rc; | 376 | return rc; |
373 | } | 377 | } |
378 | WARN_ON(net_drop_monitor_family.mcgrp_offset != NET_DM_GRP_ALERT); | ||
374 | 379 | ||
375 | rc = register_netdevice_notifier(&dropmon_net_notifier); | 380 | rc = register_netdevice_notifier(&dropmon_net_notifier); |
376 | if (rc < 0) { | 381 | if (rc < 0) { |
diff --git a/net/core/iovec.c b/net/core/iovec.c index 4cdb7c48dad6..b61869429f4c 100644 --- a/net/core/iovec.c +++ b/net/core/iovec.c | |||
@@ -48,7 +48,8 @@ int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *a | |||
48 | if (err < 0) | 48 | if (err < 0) |
49 | return err; | 49 | return err; |
50 | } | 50 | } |
51 | m->msg_name = address; | 51 | if (m->msg_name) |
52 | m->msg_name = address; | ||
52 | } else { | 53 | } else { |
53 | m->msg_name = NULL; | 54 | m->msg_name = NULL; |
54 | } | 55 | } |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 261357a66300..a797fff7f222 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -2527,6 +2527,8 @@ static int process_ipsec(struct pktgen_dev *pkt_dev, | |||
2527 | if (x) { | 2527 | if (x) { |
2528 | int ret; | 2528 | int ret; |
2529 | __u8 *eth; | 2529 | __u8 *eth; |
2530 | struct iphdr *iph; | ||
2531 | |||
2530 | nhead = x->props.header_len - skb_headroom(skb); | 2532 | nhead = x->props.header_len - skb_headroom(skb); |
2531 | if (nhead > 0) { | 2533 | if (nhead > 0) { |
2532 | ret = pskb_expand_head(skb, nhead, 0, GFP_ATOMIC); | 2534 | ret = pskb_expand_head(skb, nhead, 0, GFP_ATOMIC); |
@@ -2548,6 +2550,11 @@ static int process_ipsec(struct pktgen_dev *pkt_dev, | |||
2548 | eth = (__u8 *) skb_push(skb, ETH_HLEN); | 2550 | eth = (__u8 *) skb_push(skb, ETH_HLEN); |
2549 | memcpy(eth, pkt_dev->hh, 12); | 2551 | memcpy(eth, pkt_dev->hh, 12); |
2550 | *(u16 *) ð[12] = protocol; | 2552 | *(u16 *) ð[12] = protocol; |
2553 | |||
2554 | /* Update IPv4 header len as well as checksum value */ | ||
2555 | iph = ip_hdr(skb); | ||
2556 | iph->tot_len = htons(skb->len - ETH_HLEN); | ||
2557 | ip_send_check(iph); | ||
2551 | } | 2558 | } |
2552 | } | 2559 | } |
2553 | return 1; | 2560 | return 1; |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 8cec1e6b844d..2718fed53d8c 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -2796,6 +2796,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features) | |||
2796 | struct sk_buff *segs = NULL; | 2796 | struct sk_buff *segs = NULL; |
2797 | struct sk_buff *tail = NULL; | 2797 | struct sk_buff *tail = NULL; |
2798 | struct sk_buff *fskb = skb_shinfo(skb)->frag_list; | 2798 | struct sk_buff *fskb = skb_shinfo(skb)->frag_list; |
2799 | skb_frag_t *skb_frag = skb_shinfo(skb)->frags; | ||
2799 | unsigned int mss = skb_shinfo(skb)->gso_size; | 2800 | unsigned int mss = skb_shinfo(skb)->gso_size; |
2800 | unsigned int doffset = skb->data - skb_mac_header(skb); | 2801 | unsigned int doffset = skb->data - skb_mac_header(skb); |
2801 | unsigned int offset = doffset; | 2802 | unsigned int offset = doffset; |
@@ -2835,16 +2836,38 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features) | |||
2835 | if (hsize > len || !sg) | 2836 | if (hsize > len || !sg) |
2836 | hsize = len; | 2837 | hsize = len; |
2837 | 2838 | ||
2838 | if (!hsize && i >= nfrags) { | 2839 | if (!hsize && i >= nfrags && skb_headlen(fskb) && |
2839 | BUG_ON(fskb->len != len); | 2840 | (skb_headlen(fskb) == len || sg)) { |
2841 | BUG_ON(skb_headlen(fskb) > len); | ||
2842 | |||
2843 | i = 0; | ||
2844 | nfrags = skb_shinfo(fskb)->nr_frags; | ||
2845 | skb_frag = skb_shinfo(fskb)->frags; | ||
2846 | pos += skb_headlen(fskb); | ||
2847 | |||
2848 | while (pos < offset + len) { | ||
2849 | BUG_ON(i >= nfrags); | ||
2850 | |||
2851 | size = skb_frag_size(skb_frag); | ||
2852 | if (pos + size > offset + len) | ||
2853 | break; | ||
2854 | |||
2855 | i++; | ||
2856 | pos += size; | ||
2857 | skb_frag++; | ||
2858 | } | ||
2840 | 2859 | ||
2841 | pos += len; | ||
2842 | nskb = skb_clone(fskb, GFP_ATOMIC); | 2860 | nskb = skb_clone(fskb, GFP_ATOMIC); |
2843 | fskb = fskb->next; | 2861 | fskb = fskb->next; |
2844 | 2862 | ||
2845 | if (unlikely(!nskb)) | 2863 | if (unlikely(!nskb)) |
2846 | goto err; | 2864 | goto err; |
2847 | 2865 | ||
2866 | if (unlikely(pskb_trim(nskb, len))) { | ||
2867 | kfree_skb(nskb); | ||
2868 | goto err; | ||
2869 | } | ||
2870 | |||
2848 | hsize = skb_end_offset(nskb); | 2871 | hsize = skb_end_offset(nskb); |
2849 | if (skb_cow_head(nskb, doffset + headroom)) { | 2872 | if (skb_cow_head(nskb, doffset + headroom)) { |
2850 | kfree_skb(nskb); | 2873 | kfree_skb(nskb); |
@@ -2881,7 +2904,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features) | |||
2881 | nskb->data - tnl_hlen, | 2904 | nskb->data - tnl_hlen, |
2882 | doffset + tnl_hlen); | 2905 | doffset + tnl_hlen); |
2883 | 2906 | ||
2884 | if (fskb != skb_shinfo(skb)->frag_list) | 2907 | if (nskb->len == len + doffset) |
2885 | goto perform_csum_check; | 2908 | goto perform_csum_check; |
2886 | 2909 | ||
2887 | if (!sg) { | 2910 | if (!sg) { |
@@ -2899,8 +2922,28 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features) | |||
2899 | 2922 | ||
2900 | skb_shinfo(nskb)->tx_flags = skb_shinfo(skb)->tx_flags & SKBTX_SHARED_FRAG; | 2923 | skb_shinfo(nskb)->tx_flags = skb_shinfo(skb)->tx_flags & SKBTX_SHARED_FRAG; |
2901 | 2924 | ||
2902 | while (pos < offset + len && i < nfrags) { | 2925 | while (pos < offset + len) { |
2903 | *frag = skb_shinfo(skb)->frags[i]; | 2926 | if (i >= nfrags) { |
2927 | BUG_ON(skb_headlen(fskb)); | ||
2928 | |||
2929 | i = 0; | ||
2930 | nfrags = skb_shinfo(fskb)->nr_frags; | ||
2931 | skb_frag = skb_shinfo(fskb)->frags; | ||
2932 | |||
2933 | BUG_ON(!nfrags); | ||
2934 | |||
2935 | fskb = fskb->next; | ||
2936 | } | ||
2937 | |||
2938 | if (unlikely(skb_shinfo(nskb)->nr_frags >= | ||
2939 | MAX_SKB_FRAGS)) { | ||
2940 | net_warn_ratelimited( | ||
2941 | "skb_segment: too many frags: %u %u\n", | ||
2942 | pos, mss); | ||
2943 | goto err; | ||
2944 | } | ||
2945 | |||
2946 | *frag = *skb_frag; | ||
2904 | __skb_frag_ref(frag); | 2947 | __skb_frag_ref(frag); |
2905 | size = skb_frag_size(frag); | 2948 | size = skb_frag_size(frag); |
2906 | 2949 | ||
@@ -2913,6 +2956,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features) | |||
2913 | 2956 | ||
2914 | if (pos + size <= offset + len) { | 2957 | if (pos + size <= offset + len) { |
2915 | i++; | 2958 | i++; |
2959 | skb_frag++; | ||
2916 | pos += size; | 2960 | pos += size; |
2917 | } else { | 2961 | } else { |
2918 | skb_frag_size_sub(frag, pos + size - (offset + len)); | 2962 | skb_frag_size_sub(frag, pos + size - (offset + len)); |
@@ -2922,25 +2966,6 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features) | |||
2922 | frag++; | 2966 | frag++; |
2923 | } | 2967 | } |
2924 | 2968 | ||
2925 | if (pos < offset + len) { | ||
2926 | struct sk_buff *fskb2 = fskb; | ||
2927 | |||
2928 | BUG_ON(pos + fskb->len != offset + len); | ||
2929 | |||
2930 | pos += fskb->len; | ||
2931 | fskb = fskb->next; | ||
2932 | |||
2933 | if (fskb2->next) { | ||
2934 | fskb2 = skb_clone(fskb2, GFP_ATOMIC); | ||
2935 | if (!fskb2) | ||
2936 | goto err; | ||
2937 | } else | ||
2938 | skb_get(fskb2); | ||
2939 | |||
2940 | SKB_FRAG_ASSERT(nskb); | ||
2941 | skb_shinfo(nskb)->frag_list = fskb2; | ||
2942 | } | ||
2943 | |||
2944 | skip_fraglist: | 2969 | skip_fraglist: |
2945 | nskb->data_len = len - hsize; | 2970 | nskb->data_len = len - hsize; |
2946 | nskb->len += nskb->data_len; | 2971 | nskb->len += nskb->data_len; |
diff --git a/net/hsr/hsr_framereg.c b/net/hsr/hsr_framereg.c index 003f5bb3acd2..4bdab1521878 100644 --- a/net/hsr/hsr_framereg.c +++ b/net/hsr/hsr_framereg.c | |||
@@ -288,7 +288,8 @@ void hsr_addr_subst_dest(struct hsr_priv *hsr_priv, struct ethhdr *ethhdr, | |||
288 | static bool seq_nr_after(u16 a, u16 b) | 288 | static bool seq_nr_after(u16 a, u16 b) |
289 | { | 289 | { |
290 | /* Remove inconsistency where | 290 | /* Remove inconsistency where |
291 | * seq_nr_after(a, b) == seq_nr_before(a, b) */ | 291 | * seq_nr_after(a, b) == seq_nr_before(a, b) |
292 | */ | ||
292 | if ((int) b - a == 32768) | 293 | if ((int) b - a == 32768) |
293 | return false; | 294 | return false; |
294 | 295 | ||
diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c index 4e66bf61f585..01a5261ac7a5 100644 --- a/net/hsr/hsr_netlink.c +++ b/net/hsr/hsr_netlink.c | |||
@@ -23,6 +23,8 @@ static const struct nla_policy hsr_policy[IFLA_HSR_MAX + 1] = { | |||
23 | [IFLA_HSR_SLAVE1] = { .type = NLA_U32 }, | 23 | [IFLA_HSR_SLAVE1] = { .type = NLA_U32 }, |
24 | [IFLA_HSR_SLAVE2] = { .type = NLA_U32 }, | 24 | [IFLA_HSR_SLAVE2] = { .type = NLA_U32 }, |
25 | [IFLA_HSR_MULTICAST_SPEC] = { .type = NLA_U8 }, | 25 | [IFLA_HSR_MULTICAST_SPEC] = { .type = NLA_U8 }, |
26 | [IFLA_HSR_SUPERVISION_ADDR] = { .type = NLA_BINARY, .len = ETH_ALEN }, | ||
27 | [IFLA_HSR_SEQ_NR] = { .type = NLA_U16 }, | ||
26 | }; | 28 | }; |
27 | 29 | ||
28 | 30 | ||
@@ -59,6 +61,31 @@ static int hsr_newlink(struct net *src_net, struct net_device *dev, | |||
59 | return hsr_dev_finalize(dev, link, multicast_spec); | 61 | return hsr_dev_finalize(dev, link, multicast_spec); |
60 | } | 62 | } |
61 | 63 | ||
64 | static int hsr_fill_info(struct sk_buff *skb, const struct net_device *dev) | ||
65 | { | ||
66 | struct hsr_priv *hsr_priv; | ||
67 | |||
68 | hsr_priv = netdev_priv(dev); | ||
69 | |||
70 | if (hsr_priv->slave[0]) | ||
71 | if (nla_put_u32(skb, IFLA_HSR_SLAVE1, hsr_priv->slave[0]->ifindex)) | ||
72 | goto nla_put_failure; | ||
73 | |||
74 | if (hsr_priv->slave[1]) | ||
75 | if (nla_put_u32(skb, IFLA_HSR_SLAVE2, hsr_priv->slave[1]->ifindex)) | ||
76 | goto nla_put_failure; | ||
77 | |||
78 | if (nla_put(skb, IFLA_HSR_SUPERVISION_ADDR, ETH_ALEN, | ||
79 | hsr_priv->sup_multicast_addr) || | ||
80 | nla_put_u16(skb, IFLA_HSR_SEQ_NR, hsr_priv->sequence_nr)) | ||
81 | goto nla_put_failure; | ||
82 | |||
83 | return 0; | ||
84 | |||
85 | nla_put_failure: | ||
86 | return -EMSGSIZE; | ||
87 | } | ||
88 | |||
62 | static struct rtnl_link_ops hsr_link_ops __read_mostly = { | 89 | static struct rtnl_link_ops hsr_link_ops __read_mostly = { |
63 | .kind = "hsr", | 90 | .kind = "hsr", |
64 | .maxtype = IFLA_HSR_MAX, | 91 | .maxtype = IFLA_HSR_MAX, |
@@ -66,6 +93,7 @@ static struct rtnl_link_ops hsr_link_ops __read_mostly = { | |||
66 | .priv_size = sizeof(struct hsr_priv), | 93 | .priv_size = sizeof(struct hsr_priv), |
67 | .setup = hsr_dev_setup, | 94 | .setup = hsr_dev_setup, |
68 | .newlink = hsr_newlink, | 95 | .newlink = hsr_newlink, |
96 | .fill_info = hsr_fill_info, | ||
69 | }; | 97 | }; |
70 | 98 | ||
71 | 99 | ||
@@ -90,8 +118,8 @@ static struct genl_family hsr_genl_family = { | |||
90 | .maxattr = HSR_A_MAX, | 118 | .maxattr = HSR_A_MAX, |
91 | }; | 119 | }; |
92 | 120 | ||
93 | static struct genl_multicast_group hsr_network_genl_mcgrp = { | 121 | static const struct genl_multicast_group hsr_mcgrps[] = { |
94 | .name = "hsr-network", | 122 | { .name = "hsr-network", }, |
95 | }; | 123 | }; |
96 | 124 | ||
97 | 125 | ||
@@ -129,7 +157,7 @@ void hsr_nl_ringerror(struct hsr_priv *hsr_priv, unsigned char addr[ETH_ALEN], | |||
129 | goto nla_put_failure; | 157 | goto nla_put_failure; |
130 | 158 | ||
131 | genlmsg_end(skb, msg_head); | 159 | genlmsg_end(skb, msg_head); |
132 | genlmsg_multicast(skb, 0, hsr_network_genl_mcgrp.id, GFP_ATOMIC); | 160 | genlmsg_multicast(&hsr_genl_family, skb, 0, 0, GFP_ATOMIC); |
133 | 161 | ||
134 | return; | 162 | return; |
135 | 163 | ||
@@ -163,7 +191,7 @@ void hsr_nl_nodedown(struct hsr_priv *hsr_priv, unsigned char addr[ETH_ALEN]) | |||
163 | goto nla_put_failure; | 191 | goto nla_put_failure; |
164 | 192 | ||
165 | genlmsg_end(skb, msg_head); | 193 | genlmsg_end(skb, msg_head); |
166 | genlmsg_multicast(skb, 0, hsr_network_genl_mcgrp.id, GFP_ATOMIC); | 194 | genlmsg_multicast(&hsr_genl_family, skb, 0, 0, GFP_ATOMIC); |
167 | 195 | ||
168 | return; | 196 | return; |
169 | 197 | ||
@@ -249,7 +277,7 @@ static int hsr_get_node_status(struct sk_buff *skb_in, struct genl_info *info) | |||
249 | &hsr_node_if2_age, | 277 | &hsr_node_if2_age, |
250 | &hsr_node_if2_seq); | 278 | &hsr_node_if2_seq); |
251 | if (res < 0) | 279 | if (res < 0) |
252 | goto fail; | 280 | goto nla_put_failure; |
253 | 281 | ||
254 | res = nla_put(skb_out, HSR_A_NODE_ADDR, ETH_ALEN, | 282 | res = nla_put(skb_out, HSR_A_NODE_ADDR, ETH_ALEN, |
255 | nla_data(info->attrs[HSR_A_NODE_ADDR])); | 283 | nla_data(info->attrs[HSR_A_NODE_ADDR])); |
@@ -306,15 +334,6 @@ fail: | |||
306 | return res; | 334 | return res; |
307 | } | 335 | } |
308 | 336 | ||
309 | static struct genl_ops hsr_ops_get_node_status = { | ||
310 | .cmd = HSR_C_GET_NODE_STATUS, | ||
311 | .flags = 0, | ||
312 | .policy = hsr_genl_policy, | ||
313 | .doit = hsr_get_node_status, | ||
314 | .dumpit = NULL, | ||
315 | }; | ||
316 | |||
317 | |||
318 | /* Get a list of MacAddressA of all nodes known to this node (other than self). | 337 | /* Get a list of MacAddressA of all nodes known to this node (other than self). |
319 | */ | 338 | */ |
320 | static int hsr_get_node_list(struct sk_buff *skb_in, struct genl_info *info) | 339 | static int hsr_get_node_list(struct sk_buff *skb_in, struct genl_info *info) |
@@ -398,12 +417,21 @@ fail: | |||
398 | } | 417 | } |
399 | 418 | ||
400 | 419 | ||
401 | static struct genl_ops hsr_ops_get_node_list = { | 420 | static const struct genl_ops hsr_ops[] = { |
402 | .cmd = HSR_C_GET_NODE_LIST, | 421 | { |
403 | .flags = 0, | 422 | .cmd = HSR_C_GET_NODE_STATUS, |
404 | .policy = hsr_genl_policy, | 423 | .flags = 0, |
405 | .doit = hsr_get_node_list, | 424 | .policy = hsr_genl_policy, |
406 | .dumpit = NULL, | 425 | .doit = hsr_get_node_status, |
426 | .dumpit = NULL, | ||
427 | }, | ||
428 | { | ||
429 | .cmd = HSR_C_GET_NODE_LIST, | ||
430 | .flags = 0, | ||
431 | .policy = hsr_genl_policy, | ||
432 | .doit = hsr_get_node_list, | ||
433 | .dumpit = NULL, | ||
434 | }, | ||
407 | }; | 435 | }; |
408 | 436 | ||
409 | int __init hsr_netlink_init(void) | 437 | int __init hsr_netlink_init(void) |
@@ -414,30 +442,13 @@ int __init hsr_netlink_init(void) | |||
414 | if (rc) | 442 | if (rc) |
415 | goto fail_rtnl_link_register; | 443 | goto fail_rtnl_link_register; |
416 | 444 | ||
417 | rc = genl_register_family(&hsr_genl_family); | 445 | rc = genl_register_family_with_ops_groups(&hsr_genl_family, hsr_ops, |
446 | hsr_mcgrps); | ||
418 | if (rc) | 447 | if (rc) |
419 | goto fail_genl_register_family; | 448 | goto fail_genl_register_family; |
420 | 449 | ||
421 | rc = genl_register_ops(&hsr_genl_family, &hsr_ops_get_node_status); | ||
422 | if (rc) | ||
423 | goto fail_genl_register_ops; | ||
424 | |||
425 | rc = genl_register_ops(&hsr_genl_family, &hsr_ops_get_node_list); | ||
426 | if (rc) | ||
427 | goto fail_genl_register_ops_node_list; | ||
428 | |||
429 | rc = genl_register_mc_group(&hsr_genl_family, &hsr_network_genl_mcgrp); | ||
430 | if (rc) | ||
431 | goto fail_genl_register_mc_group; | ||
432 | |||
433 | return 0; | 450 | return 0; |
434 | 451 | ||
435 | fail_genl_register_mc_group: | ||
436 | genl_unregister_ops(&hsr_genl_family, &hsr_ops_get_node_list); | ||
437 | fail_genl_register_ops_node_list: | ||
438 | genl_unregister_ops(&hsr_genl_family, &hsr_ops_get_node_status); | ||
439 | fail_genl_register_ops: | ||
440 | genl_unregister_family(&hsr_genl_family); | ||
441 | fail_genl_register_family: | 452 | fail_genl_register_family: |
442 | rtnl_link_unregister(&hsr_link_ops); | 453 | rtnl_link_unregister(&hsr_link_ops); |
443 | fail_rtnl_link_register: | 454 | fail_rtnl_link_register: |
@@ -447,10 +458,7 @@ fail_rtnl_link_register: | |||
447 | 458 | ||
448 | void __exit hsr_netlink_exit(void) | 459 | void __exit hsr_netlink_exit(void) |
449 | { | 460 | { |
450 | genl_unregister_mc_group(&hsr_genl_family, &hsr_network_genl_mcgrp); | ||
451 | genl_unregister_ops(&hsr_genl_family, &hsr_ops_get_node_status); | ||
452 | genl_unregister_family(&hsr_genl_family); | 461 | genl_unregister_family(&hsr_genl_family); |
453 | |||
454 | rtnl_link_unregister(&hsr_link_ops); | 462 | rtnl_link_unregister(&hsr_link_ops); |
455 | } | 463 | } |
456 | 464 | ||
diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c index 426b5df1c98f..459e200c08a4 100644 --- a/net/ieee802154/6lowpan.c +++ b/net/ieee802154/6lowpan.c | |||
@@ -956,7 +956,7 @@ lowpan_process_data(struct sk_buff *skb) | |||
956 | * Traffic class carried in-line | 956 | * Traffic class carried in-line |
957 | * ECN + DSCP (1 byte), Flow Label is elided | 957 | * ECN + DSCP (1 byte), Flow Label is elided |
958 | */ | 958 | */ |
959 | case 1: /* 10b */ | 959 | case 2: /* 10b */ |
960 | if (lowpan_fetch_skb_u8(skb, &tmp)) | 960 | if (lowpan_fetch_skb_u8(skb, &tmp)) |
961 | goto drop; | 961 | goto drop; |
962 | 962 | ||
@@ -967,7 +967,7 @@ lowpan_process_data(struct sk_buff *skb) | |||
967 | * Flow Label carried in-line | 967 | * Flow Label carried in-line |
968 | * ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided | 968 | * ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided |
969 | */ | 969 | */ |
970 | case 2: /* 01b */ | 970 | case 1: /* 01b */ |
971 | if (lowpan_fetch_skb_u8(skb, &tmp)) | 971 | if (lowpan_fetch_skb_u8(skb, &tmp)) |
972 | goto drop; | 972 | goto drop; |
973 | 973 | ||
diff --git a/net/ieee802154/dgram.c b/net/ieee802154/dgram.c index 581a59504bd5..1865fdf5a5a5 100644 --- a/net/ieee802154/dgram.c +++ b/net/ieee802154/dgram.c | |||
@@ -315,9 +315,8 @@ static int dgram_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
315 | if (saddr) { | 315 | if (saddr) { |
316 | saddr->family = AF_IEEE802154; | 316 | saddr->family = AF_IEEE802154; |
317 | saddr->addr = mac_cb(skb)->sa; | 317 | saddr->addr = mac_cb(skb)->sa; |
318 | } | ||
319 | if (addr_len) | ||
320 | *addr_len = sizeof(*saddr); | 318 | *addr_len = sizeof(*saddr); |
319 | } | ||
321 | 320 | ||
322 | if (flags & MSG_TRUNC) | 321 | if (flags & MSG_TRUNC) |
323 | copied = skb->len; | 322 | copied = skb->len; |
diff --git a/net/ieee802154/ieee802154.h b/net/ieee802154/ieee802154.h index aadec428e6ec..cee4425b9956 100644 --- a/net/ieee802154/ieee802154.h +++ b/net/ieee802154/ieee802154.h | |||
@@ -47,7 +47,24 @@ struct sk_buff *ieee802154_nl_new_reply(struct genl_info *info, | |||
47 | int ieee802154_nl_reply(struct sk_buff *msg, struct genl_info *info); | 47 | int ieee802154_nl_reply(struct sk_buff *msg, struct genl_info *info); |
48 | 48 | ||
49 | extern struct genl_family nl802154_family; | 49 | extern struct genl_family nl802154_family; |
50 | int nl802154_mac_register(void); | 50 | |
51 | int nl802154_phy_register(void); | 51 | /* genetlink ops/groups */ |
52 | int ieee802154_list_phy(struct sk_buff *skb, struct genl_info *info); | ||
53 | int ieee802154_dump_phy(struct sk_buff *skb, struct netlink_callback *cb); | ||
54 | int ieee802154_add_iface(struct sk_buff *skb, struct genl_info *info); | ||
55 | int ieee802154_del_iface(struct sk_buff *skb, struct genl_info *info); | ||
56 | |||
57 | enum ieee802154_mcgrp_ids { | ||
58 | IEEE802154_COORD_MCGRP, | ||
59 | IEEE802154_BEACON_MCGRP, | ||
60 | }; | ||
61 | |||
62 | int ieee802154_associate_req(struct sk_buff *skb, struct genl_info *info); | ||
63 | int ieee802154_associate_resp(struct sk_buff *skb, struct genl_info *info); | ||
64 | int ieee802154_disassociate_req(struct sk_buff *skb, struct genl_info *info); | ||
65 | int ieee802154_scan_req(struct sk_buff *skb, struct genl_info *info); | ||
66 | int ieee802154_start_req(struct sk_buff *skb, struct genl_info *info); | ||
67 | int ieee802154_list_iface(struct sk_buff *skb, struct genl_info *info); | ||
68 | int ieee802154_dump_iface(struct sk_buff *skb, struct netlink_callback *cb); | ||
52 | 69 | ||
53 | #endif | 70 | #endif |
diff --git a/net/ieee802154/netlink.c b/net/ieee802154/netlink.c index 7e49bbcc6967..43f1b2bf469f 100644 --- a/net/ieee802154/netlink.c +++ b/net/ieee802154/netlink.c | |||
@@ -70,7 +70,7 @@ int ieee802154_nl_mcast(struct sk_buff *msg, unsigned int group) | |||
70 | if (genlmsg_end(msg, hdr) < 0) | 70 | if (genlmsg_end(msg, hdr) < 0) |
71 | goto out; | 71 | goto out; |
72 | 72 | ||
73 | return genlmsg_multicast(msg, 0, group, GFP_ATOMIC); | 73 | return genlmsg_multicast(&nl802154_family, msg, 0, group, GFP_ATOMIC); |
74 | out: | 74 | out: |
75 | nlmsg_free(msg); | 75 | nlmsg_free(msg); |
76 | return -ENOBUFS; | 76 | return -ENOBUFS; |
@@ -109,31 +109,36 @@ out: | |||
109 | return -ENOBUFS; | 109 | return -ENOBUFS; |
110 | } | 110 | } |
111 | 111 | ||
112 | int __init ieee802154_nl_init(void) | 112 | static const struct genl_ops ieee8021154_ops[] = { |
113 | { | 113 | /* see nl-phy.c */ |
114 | int rc; | 114 | IEEE802154_DUMP(IEEE802154_LIST_PHY, ieee802154_list_phy, |
115 | 115 | ieee802154_dump_phy), | |
116 | rc = genl_register_family(&nl802154_family); | 116 | IEEE802154_OP(IEEE802154_ADD_IFACE, ieee802154_add_iface), |
117 | if (rc) | 117 | IEEE802154_OP(IEEE802154_DEL_IFACE, ieee802154_del_iface), |
118 | goto fail; | 118 | /* see nl-mac.c */ |
119 | 119 | IEEE802154_OP(IEEE802154_ASSOCIATE_REQ, ieee802154_associate_req), | |
120 | rc = nl802154_mac_register(); | 120 | IEEE802154_OP(IEEE802154_ASSOCIATE_RESP, ieee802154_associate_resp), |
121 | if (rc) | 121 | IEEE802154_OP(IEEE802154_DISASSOCIATE_REQ, ieee802154_disassociate_req), |
122 | goto fail; | 122 | IEEE802154_OP(IEEE802154_SCAN_REQ, ieee802154_scan_req), |
123 | IEEE802154_OP(IEEE802154_START_REQ, ieee802154_start_req), | ||
124 | IEEE802154_DUMP(IEEE802154_LIST_IFACE, ieee802154_list_iface, | ||
125 | ieee802154_dump_iface), | ||
126 | }; | ||
123 | 127 | ||
124 | rc = nl802154_phy_register(); | 128 | static const struct genl_multicast_group ieee802154_mcgrps[] = { |
125 | if (rc) | 129 | [IEEE802154_COORD_MCGRP] = { .name = IEEE802154_MCAST_COORD_NAME, }, |
126 | goto fail; | 130 | [IEEE802154_BEACON_MCGRP] = { .name = IEEE802154_MCAST_BEACON_NAME, }, |
131 | }; | ||
127 | 132 | ||
128 | return 0; | ||
129 | 133 | ||
130 | fail: | 134 | int __init ieee802154_nl_init(void) |
131 | genl_unregister_family(&nl802154_family); | 135 | { |
132 | return rc; | 136 | return genl_register_family_with_ops_groups(&nl802154_family, |
137 | ieee8021154_ops, | ||
138 | ieee802154_mcgrps); | ||
133 | } | 139 | } |
134 | 140 | ||
135 | void __exit ieee802154_nl_exit(void) | 141 | void __exit ieee802154_nl_exit(void) |
136 | { | 142 | { |
137 | genl_unregister_family(&nl802154_family); | 143 | genl_unregister_family(&nl802154_family); |
138 | } | 144 | } |
139 | |||
diff --git a/net/ieee802154/nl-mac.c b/net/ieee802154/nl-mac.c index b0bdd8c51e9c..ba5c1e002f37 100644 --- a/net/ieee802154/nl-mac.c +++ b/net/ieee802154/nl-mac.c | |||
@@ -39,14 +39,6 @@ | |||
39 | 39 | ||
40 | #include "ieee802154.h" | 40 | #include "ieee802154.h" |
41 | 41 | ||
42 | static struct genl_multicast_group ieee802154_coord_mcgrp = { | ||
43 | .name = IEEE802154_MCAST_COORD_NAME, | ||
44 | }; | ||
45 | |||
46 | static struct genl_multicast_group ieee802154_beacon_mcgrp = { | ||
47 | .name = IEEE802154_MCAST_BEACON_NAME, | ||
48 | }; | ||
49 | |||
50 | int ieee802154_nl_assoc_indic(struct net_device *dev, | 42 | int ieee802154_nl_assoc_indic(struct net_device *dev, |
51 | struct ieee802154_addr *addr, u8 cap) | 43 | struct ieee802154_addr *addr, u8 cap) |
52 | { | 44 | { |
@@ -72,7 +64,7 @@ int ieee802154_nl_assoc_indic(struct net_device *dev, | |||
72 | nla_put_u8(msg, IEEE802154_ATTR_CAPABILITY, cap)) | 64 | nla_put_u8(msg, IEEE802154_ATTR_CAPABILITY, cap)) |
73 | goto nla_put_failure; | 65 | goto nla_put_failure; |
74 | 66 | ||
75 | return ieee802154_nl_mcast(msg, ieee802154_coord_mcgrp.id); | 67 | return ieee802154_nl_mcast(msg, IEEE802154_COORD_MCGRP); |
76 | 68 | ||
77 | nla_put_failure: | 69 | nla_put_failure: |
78 | nlmsg_free(msg); | 70 | nlmsg_free(msg); |
@@ -98,7 +90,7 @@ int ieee802154_nl_assoc_confirm(struct net_device *dev, u16 short_addr, | |||
98 | nla_put_u16(msg, IEEE802154_ATTR_SHORT_ADDR, short_addr) || | 90 | nla_put_u16(msg, IEEE802154_ATTR_SHORT_ADDR, short_addr) || |
99 | nla_put_u8(msg, IEEE802154_ATTR_STATUS, status)) | 91 | nla_put_u8(msg, IEEE802154_ATTR_STATUS, status)) |
100 | goto nla_put_failure; | 92 | goto nla_put_failure; |
101 | return ieee802154_nl_mcast(msg, ieee802154_coord_mcgrp.id); | 93 | return ieee802154_nl_mcast(msg, IEEE802154_COORD_MCGRP); |
102 | 94 | ||
103 | nla_put_failure: | 95 | nla_put_failure: |
104 | nlmsg_free(msg); | 96 | nlmsg_free(msg); |
@@ -133,7 +125,7 @@ int ieee802154_nl_disassoc_indic(struct net_device *dev, | |||
133 | } | 125 | } |
134 | if (nla_put_u8(msg, IEEE802154_ATTR_REASON, reason)) | 126 | if (nla_put_u8(msg, IEEE802154_ATTR_REASON, reason)) |
135 | goto nla_put_failure; | 127 | goto nla_put_failure; |
136 | return ieee802154_nl_mcast(msg, ieee802154_coord_mcgrp.id); | 128 | return ieee802154_nl_mcast(msg, IEEE802154_COORD_MCGRP); |
137 | 129 | ||
138 | nla_put_failure: | 130 | nla_put_failure: |
139 | nlmsg_free(msg); | 131 | nlmsg_free(msg); |
@@ -157,7 +149,7 @@ int ieee802154_nl_disassoc_confirm(struct net_device *dev, u8 status) | |||
157 | dev->dev_addr) || | 149 | dev->dev_addr) || |
158 | nla_put_u8(msg, IEEE802154_ATTR_STATUS, status)) | 150 | nla_put_u8(msg, IEEE802154_ATTR_STATUS, status)) |
159 | goto nla_put_failure; | 151 | goto nla_put_failure; |
160 | return ieee802154_nl_mcast(msg, ieee802154_coord_mcgrp.id); | 152 | return ieee802154_nl_mcast(msg, IEEE802154_COORD_MCGRP); |
161 | 153 | ||
162 | nla_put_failure: | 154 | nla_put_failure: |
163 | nlmsg_free(msg); | 155 | nlmsg_free(msg); |
@@ -183,7 +175,7 @@ int ieee802154_nl_beacon_indic(struct net_device *dev, | |||
183 | nla_put_u16(msg, IEEE802154_ATTR_COORD_SHORT_ADDR, coord_addr) || | 175 | nla_put_u16(msg, IEEE802154_ATTR_COORD_SHORT_ADDR, coord_addr) || |
184 | nla_put_u16(msg, IEEE802154_ATTR_COORD_PAN_ID, panid)) | 176 | nla_put_u16(msg, IEEE802154_ATTR_COORD_PAN_ID, panid)) |
185 | goto nla_put_failure; | 177 | goto nla_put_failure; |
186 | return ieee802154_nl_mcast(msg, ieee802154_coord_mcgrp.id); | 178 | return ieee802154_nl_mcast(msg, IEEE802154_COORD_MCGRP); |
187 | 179 | ||
188 | nla_put_failure: | 180 | nla_put_failure: |
189 | nlmsg_free(msg); | 181 | nlmsg_free(msg); |
@@ -214,7 +206,7 @@ int ieee802154_nl_scan_confirm(struct net_device *dev, | |||
214 | (edl && | 206 | (edl && |
215 | nla_put(msg, IEEE802154_ATTR_ED_LIST, 27, edl))) | 207 | nla_put(msg, IEEE802154_ATTR_ED_LIST, 27, edl))) |
216 | goto nla_put_failure; | 208 | goto nla_put_failure; |
217 | return ieee802154_nl_mcast(msg, ieee802154_coord_mcgrp.id); | 209 | return ieee802154_nl_mcast(msg, IEEE802154_COORD_MCGRP); |
218 | 210 | ||
219 | nla_put_failure: | 211 | nla_put_failure: |
220 | nlmsg_free(msg); | 212 | nlmsg_free(msg); |
@@ -238,7 +230,7 @@ int ieee802154_nl_start_confirm(struct net_device *dev, u8 status) | |||
238 | dev->dev_addr) || | 230 | dev->dev_addr) || |
239 | nla_put_u8(msg, IEEE802154_ATTR_STATUS, status)) | 231 | nla_put_u8(msg, IEEE802154_ATTR_STATUS, status)) |
240 | goto nla_put_failure; | 232 | goto nla_put_failure; |
241 | return ieee802154_nl_mcast(msg, ieee802154_coord_mcgrp.id); | 233 | return ieee802154_nl_mcast(msg, IEEE802154_COORD_MCGRP); |
242 | 234 | ||
243 | nla_put_failure: | 235 | nla_put_failure: |
244 | nlmsg_free(msg); | 236 | nlmsg_free(msg); |
@@ -309,8 +301,7 @@ static struct net_device *ieee802154_nl_get_dev(struct genl_info *info) | |||
309 | return dev; | 301 | return dev; |
310 | } | 302 | } |
311 | 303 | ||
312 | static int ieee802154_associate_req(struct sk_buff *skb, | 304 | int ieee802154_associate_req(struct sk_buff *skb, struct genl_info *info) |
313 | struct genl_info *info) | ||
314 | { | 305 | { |
315 | struct net_device *dev; | 306 | struct net_device *dev; |
316 | struct ieee802154_addr addr; | 307 | struct ieee802154_addr addr; |
@@ -357,8 +348,7 @@ out: | |||
357 | return ret; | 348 | return ret; |
358 | } | 349 | } |
359 | 350 | ||
360 | static int ieee802154_associate_resp(struct sk_buff *skb, | 351 | int ieee802154_associate_resp(struct sk_buff *skb, struct genl_info *info) |
361 | struct genl_info *info) | ||
362 | { | 352 | { |
363 | struct net_device *dev; | 353 | struct net_device *dev; |
364 | struct ieee802154_addr addr; | 354 | struct ieee802154_addr addr; |
@@ -390,8 +380,7 @@ out: | |||
390 | return ret; | 380 | return ret; |
391 | } | 381 | } |
392 | 382 | ||
393 | static int ieee802154_disassociate_req(struct sk_buff *skb, | 383 | int ieee802154_disassociate_req(struct sk_buff *skb, struct genl_info *info) |
394 | struct genl_info *info) | ||
395 | { | 384 | { |
396 | struct net_device *dev; | 385 | struct net_device *dev; |
397 | struct ieee802154_addr addr; | 386 | struct ieee802154_addr addr; |
@@ -433,7 +422,7 @@ out: | |||
433 | * PAN_coordinator, battery_life_extension = 0, | 422 | * PAN_coordinator, battery_life_extension = 0, |
434 | * coord_realignment = 0, security_enable = 0 | 423 | * coord_realignment = 0, security_enable = 0 |
435 | */ | 424 | */ |
436 | static int ieee802154_start_req(struct sk_buff *skb, struct genl_info *info) | 425 | int ieee802154_start_req(struct sk_buff *skb, struct genl_info *info) |
437 | { | 426 | { |
438 | struct net_device *dev; | 427 | struct net_device *dev; |
439 | struct ieee802154_addr addr; | 428 | struct ieee802154_addr addr; |
@@ -492,7 +481,7 @@ out: | |||
492 | return ret; | 481 | return ret; |
493 | } | 482 | } |
494 | 483 | ||
495 | static int ieee802154_scan_req(struct sk_buff *skb, struct genl_info *info) | 484 | int ieee802154_scan_req(struct sk_buff *skb, struct genl_info *info) |
496 | { | 485 | { |
497 | struct net_device *dev; | 486 | struct net_device *dev; |
498 | int ret = -EOPNOTSUPP; | 487 | int ret = -EOPNOTSUPP; |
@@ -530,8 +519,7 @@ out: | |||
530 | return ret; | 519 | return ret; |
531 | } | 520 | } |
532 | 521 | ||
533 | static int ieee802154_list_iface(struct sk_buff *skb, | 522 | int ieee802154_list_iface(struct sk_buff *skb, struct genl_info *info) |
534 | struct genl_info *info) | ||
535 | { | 523 | { |
536 | /* Request for interface name, index, type, IEEE address, | 524 | /* Request for interface name, index, type, IEEE address, |
537 | PAN Id, short address */ | 525 | PAN Id, short address */ |
@@ -565,8 +553,7 @@ out_dev: | |||
565 | 553 | ||
566 | } | 554 | } |
567 | 555 | ||
568 | static int ieee802154_dump_iface(struct sk_buff *skb, | 556 | int ieee802154_dump_iface(struct sk_buff *skb, struct netlink_callback *cb) |
569 | struct netlink_callback *cb) | ||
570 | { | 557 | { |
571 | struct net *net = sock_net(skb->sk); | 558 | struct net *net = sock_net(skb->sk); |
572 | struct net_device *dev; | 559 | struct net_device *dev; |
@@ -590,41 +577,3 @@ cont: | |||
590 | 577 | ||
591 | return skb->len; | 578 | return skb->len; |
592 | } | 579 | } |
593 | |||
594 | static struct genl_ops ieee802154_coordinator_ops[] = { | ||
595 | IEEE802154_OP(IEEE802154_ASSOCIATE_REQ, ieee802154_associate_req), | ||
596 | IEEE802154_OP(IEEE802154_ASSOCIATE_RESP, ieee802154_associate_resp), | ||
597 | IEEE802154_OP(IEEE802154_DISASSOCIATE_REQ, ieee802154_disassociate_req), | ||
598 | IEEE802154_OP(IEEE802154_SCAN_REQ, ieee802154_scan_req), | ||
599 | IEEE802154_OP(IEEE802154_START_REQ, ieee802154_start_req), | ||
600 | IEEE802154_DUMP(IEEE802154_LIST_IFACE, ieee802154_list_iface, | ||
601 | ieee802154_dump_iface), | ||
602 | }; | ||
603 | |||
604 | /* | ||
605 | * No need to unregister as family unregistration will do it. | ||
606 | */ | ||
607 | int nl802154_mac_register(void) | ||
608 | { | ||
609 | int i; | ||
610 | int rc; | ||
611 | |||
612 | rc = genl_register_mc_group(&nl802154_family, | ||
613 | &ieee802154_coord_mcgrp); | ||
614 | if (rc) | ||
615 | return rc; | ||
616 | |||
617 | rc = genl_register_mc_group(&nl802154_family, | ||
618 | &ieee802154_beacon_mcgrp); | ||
619 | if (rc) | ||
620 | return rc; | ||
621 | |||
622 | for (i = 0; i < ARRAY_SIZE(ieee802154_coordinator_ops); i++) { | ||
623 | rc = genl_register_ops(&nl802154_family, | ||
624 | &ieee802154_coordinator_ops[i]); | ||
625 | if (rc) | ||
626 | return rc; | ||
627 | } | ||
628 | |||
629 | return 0; | ||
630 | } | ||
diff --git a/net/ieee802154/nl-phy.c b/net/ieee802154/nl-phy.c index 22b1a7058fd3..d08c7a43dcd1 100644 --- a/net/ieee802154/nl-phy.c +++ b/net/ieee802154/nl-phy.c | |||
@@ -77,8 +77,7 @@ out: | |||
77 | return -EMSGSIZE; | 77 | return -EMSGSIZE; |
78 | } | 78 | } |
79 | 79 | ||
80 | static int ieee802154_list_phy(struct sk_buff *skb, | 80 | int ieee802154_list_phy(struct sk_buff *skb, struct genl_info *info) |
81 | struct genl_info *info) | ||
82 | { | 81 | { |
83 | /* Request for interface name, index, type, IEEE address, | 82 | /* Request for interface name, index, type, IEEE address, |
84 | PAN Id, short address */ | 83 | PAN Id, short address */ |
@@ -151,8 +150,7 @@ static int ieee802154_dump_phy_iter(struct wpan_phy *phy, void *_data) | |||
151 | return 0; | 150 | return 0; |
152 | } | 151 | } |
153 | 152 | ||
154 | static int ieee802154_dump_phy(struct sk_buff *skb, | 153 | int ieee802154_dump_phy(struct sk_buff *skb, struct netlink_callback *cb) |
155 | struct netlink_callback *cb) | ||
156 | { | 154 | { |
157 | struct dump_phy_data data = { | 155 | struct dump_phy_data data = { |
158 | .cb = cb, | 156 | .cb = cb, |
@@ -170,8 +168,7 @@ static int ieee802154_dump_phy(struct sk_buff *skb, | |||
170 | return skb->len; | 168 | return skb->len; |
171 | } | 169 | } |
172 | 170 | ||
173 | static int ieee802154_add_iface(struct sk_buff *skb, | 171 | int ieee802154_add_iface(struct sk_buff *skb, struct genl_info *info) |
174 | struct genl_info *info) | ||
175 | { | 172 | { |
176 | struct sk_buff *msg; | 173 | struct sk_buff *msg; |
177 | struct wpan_phy *phy; | 174 | struct wpan_phy *phy; |
@@ -273,8 +270,7 @@ out_dev: | |||
273 | return rc; | 270 | return rc; |
274 | } | 271 | } |
275 | 272 | ||
276 | static int ieee802154_del_iface(struct sk_buff *skb, | 273 | int ieee802154_del_iface(struct sk_buff *skb, struct genl_info *info) |
277 | struct genl_info *info) | ||
278 | { | 274 | { |
279 | struct sk_buff *msg; | 275 | struct sk_buff *msg; |
280 | struct wpan_phy *phy; | 276 | struct wpan_phy *phy; |
@@ -356,28 +352,3 @@ out_dev: | |||
356 | 352 | ||
357 | return rc; | 353 | return rc; |
358 | } | 354 | } |
359 | |||
360 | static struct genl_ops ieee802154_phy_ops[] = { | ||
361 | IEEE802154_DUMP(IEEE802154_LIST_PHY, ieee802154_list_phy, | ||
362 | ieee802154_dump_phy), | ||
363 | IEEE802154_OP(IEEE802154_ADD_IFACE, ieee802154_add_iface), | ||
364 | IEEE802154_OP(IEEE802154_DEL_IFACE, ieee802154_del_iface), | ||
365 | }; | ||
366 | |||
367 | /* | ||
368 | * No need to unregister as family unregistration will do it. | ||
369 | */ | ||
370 | int nl802154_phy_register(void) | ||
371 | { | ||
372 | int i; | ||
373 | int rc; | ||
374 | |||
375 | for (i = 0; i < ARRAY_SIZE(ieee802154_phy_ops); i++) { | ||
376 | rc = genl_register_ops(&nl802154_family, | ||
377 | &ieee802154_phy_ops[i]); | ||
378 | if (rc) | ||
379 | return rc; | ||
380 | } | ||
381 | |||
382 | return 0; | ||
383 | } | ||
diff --git a/net/ipv4/datagram.c b/net/ipv4/datagram.c index b28e863fe0a7..19e36376d2a0 100644 --- a/net/ipv4/datagram.c +++ b/net/ipv4/datagram.c | |||
@@ -57,7 +57,7 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
57 | if (IS_ERR(rt)) { | 57 | if (IS_ERR(rt)) { |
58 | err = PTR_ERR(rt); | 58 | err = PTR_ERR(rt); |
59 | if (err == -ENETUNREACH) | 59 | if (err == -ENETUNREACH) |
60 | IP_INC_STATS_BH(sock_net(sk), IPSTATS_MIB_OUTNOROUTES); | 60 | IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTNOROUTES); |
61 | goto out; | 61 | goto out; |
62 | } | 62 | } |
63 | 63 | ||
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index ec9a9ef4ce50..5afeb5aa4c7c 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -2523,16 +2523,17 @@ static int fib_route_seq_show(struct seq_file *seq, void *v) | |||
2523 | list_for_each_entry_rcu(fa, &li->falh, fa_list) { | 2523 | list_for_each_entry_rcu(fa, &li->falh, fa_list) { |
2524 | const struct fib_info *fi = fa->fa_info; | 2524 | const struct fib_info *fi = fa->fa_info; |
2525 | unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi); | 2525 | unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi); |
2526 | int len; | ||
2527 | 2526 | ||
2528 | if (fa->fa_type == RTN_BROADCAST | 2527 | if (fa->fa_type == RTN_BROADCAST |
2529 | || fa->fa_type == RTN_MULTICAST) | 2528 | || fa->fa_type == RTN_MULTICAST) |
2530 | continue; | 2529 | continue; |
2531 | 2530 | ||
2531 | seq_setwidth(seq, 127); | ||
2532 | |||
2532 | if (fi) | 2533 | if (fi) |
2533 | seq_printf(seq, | 2534 | seq_printf(seq, |
2534 | "%s\t%08X\t%08X\t%04X\t%d\t%u\t" | 2535 | "%s\t%08X\t%08X\t%04X\t%d\t%u\t" |
2535 | "%d\t%08X\t%d\t%u\t%u%n", | 2536 | "%d\t%08X\t%d\t%u\t%u", |
2536 | fi->fib_dev ? fi->fib_dev->name : "*", | 2537 | fi->fib_dev ? fi->fib_dev->name : "*", |
2537 | prefix, | 2538 | prefix, |
2538 | fi->fib_nh->nh_gw, flags, 0, 0, | 2539 | fi->fib_nh->nh_gw, flags, 0, 0, |
@@ -2541,15 +2542,15 @@ static int fib_route_seq_show(struct seq_file *seq, void *v) | |||
2541 | (fi->fib_advmss ? | 2542 | (fi->fib_advmss ? |
2542 | fi->fib_advmss + 40 : 0), | 2543 | fi->fib_advmss + 40 : 0), |
2543 | fi->fib_window, | 2544 | fi->fib_window, |
2544 | fi->fib_rtt >> 3, &len); | 2545 | fi->fib_rtt >> 3); |
2545 | else | 2546 | else |
2546 | seq_printf(seq, | 2547 | seq_printf(seq, |
2547 | "*\t%08X\t%08X\t%04X\t%d\t%u\t" | 2548 | "*\t%08X\t%08X\t%04X\t%d\t%u\t" |
2548 | "%d\t%08X\t%d\t%u\t%u%n", | 2549 | "%d\t%08X\t%d\t%u\t%u", |
2549 | prefix, 0, flags, 0, 0, 0, | 2550 | prefix, 0, flags, 0, 0, 0, |
2550 | mask, 0, 0, 0, &len); | 2551 | mask, 0, 0, 0); |
2551 | 2552 | ||
2552 | seq_printf(seq, "%*s\n", 127 - len, ""); | 2553 | seq_pad(seq, '\n'); |
2553 | } | 2554 | } |
2554 | } | 2555 | } |
2555 | 2556 | ||
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 3f858266fa7e..ddf32a6bc415 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
@@ -386,7 +386,7 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf | |||
386 | /* | 386 | /* |
387 | * Handle MSG_ERRQUEUE | 387 | * Handle MSG_ERRQUEUE |
388 | */ | 388 | */ |
389 | int ip_recv_error(struct sock *sk, struct msghdr *msg, int len) | 389 | int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) |
390 | { | 390 | { |
391 | struct sock_exterr_skb *serr; | 391 | struct sock_exterr_skb *serr; |
392 | struct sk_buff *skb, *skb2; | 392 | struct sk_buff *skb, *skb2; |
@@ -423,6 +423,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len) | |||
423 | serr->addr_offset); | 423 | serr->addr_offset); |
424 | sin->sin_port = serr->port; | 424 | sin->sin_port = serr->port; |
425 | memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); | 425 | memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); |
426 | *addr_len = sizeof(*sin); | ||
426 | } | 427 | } |
427 | 428 | ||
428 | memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); | 429 | memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index caf01176a5e4..90ff9570d7d4 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
@@ -454,6 +454,8 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, | |||
454 | tstats->rx_bytes += skb->len; | 454 | tstats->rx_bytes += skb->len; |
455 | u64_stats_update_end(&tstats->syncp); | 455 | u64_stats_update_end(&tstats->syncp); |
456 | 456 | ||
457 | skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev))); | ||
458 | |||
457 | if (tunnel->dev->type == ARPHRD_ETHER) { | 459 | if (tunnel->dev->type == ARPHRD_ETHER) { |
458 | skb->protocol = eth_type_trans(skb, tunnel->dev); | 460 | skb->protocol = eth_type_trans(skb, tunnel->dev); |
459 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); | 461 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); |
@@ -461,8 +463,6 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, | |||
461 | skb->dev = tunnel->dev; | 463 | skb->dev = tunnel->dev; |
462 | } | 464 | } |
463 | 465 | ||
464 | skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev))); | ||
465 | |||
466 | gro_cells_receive(&tunnel->gro_cells, skb); | 466 | gro_cells_receive(&tunnel->gro_cells, skb); |
467 | return 0; | 467 | return 0; |
468 | 468 | ||
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index 5d9c845d288a..52b802a0cd8c 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c | |||
@@ -126,6 +126,7 @@ static netdev_tx_t vti_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
126 | if (!rt->dst.xfrm || | 126 | if (!rt->dst.xfrm || |
127 | rt->dst.xfrm->props.mode != XFRM_MODE_TUNNEL) { | 127 | rt->dst.xfrm->props.mode != XFRM_MODE_TUNNEL) { |
128 | dev->stats.tx_carrier_errors++; | 128 | dev->stats.tx_carrier_errors++; |
129 | ip_rt_put(rt); | ||
129 | goto tx_error_icmp; | 130 | goto tx_error_icmp; |
130 | } | 131 | } |
131 | tdev = rt->dst.dev; | 132 | tdev = rt->dst.dev; |
diff --git a/net/ipv4/netfilter/ipt_SYNPROXY.c b/net/ipv4/netfilter/ipt_SYNPROXY.c index 01cffeaa0085..f13bd91d9a56 100644 --- a/net/ipv4/netfilter/ipt_SYNPROXY.c +++ b/net/ipv4/netfilter/ipt_SYNPROXY.c | |||
@@ -244,6 +244,7 @@ synproxy_recv_client_ack(const struct synproxy_net *snet, | |||
244 | 244 | ||
245 | this_cpu_inc(snet->stats->cookie_valid); | 245 | this_cpu_inc(snet->stats->cookie_valid); |
246 | opts->mss = mss; | 246 | opts->mss = mss; |
247 | opts->options |= XT_SYNPROXY_OPT_MSS; | ||
247 | 248 | ||
248 | if (opts->options & XT_SYNPROXY_OPT_TIMESTAMP) | 249 | if (opts->options & XT_SYNPROXY_OPT_TIMESTAMP) |
249 | synproxy_check_timestamp_cookie(opts); | 250 | synproxy_check_timestamp_cookie(opts); |
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index 9afbdb19f4a2..242e7f4ed6f4 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c | |||
@@ -772,7 +772,7 @@ int ping_v4_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
772 | err = PTR_ERR(rt); | 772 | err = PTR_ERR(rt); |
773 | rt = NULL; | 773 | rt = NULL; |
774 | if (err == -ENETUNREACH) | 774 | if (err == -ENETUNREACH) |
775 | IP_INC_STATS_BH(net, IPSTATS_MIB_OUTNOROUTES); | 775 | IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES); |
776 | goto out; | 776 | goto out; |
777 | } | 777 | } |
778 | 778 | ||
@@ -830,8 +830,6 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
830 | { | 830 | { |
831 | struct inet_sock *isk = inet_sk(sk); | 831 | struct inet_sock *isk = inet_sk(sk); |
832 | int family = sk->sk_family; | 832 | int family = sk->sk_family; |
833 | struct sockaddr_in *sin; | ||
834 | struct sockaddr_in6 *sin6; | ||
835 | struct sk_buff *skb; | 833 | struct sk_buff *skb; |
836 | int copied, err; | 834 | int copied, err; |
837 | 835 | ||
@@ -841,19 +839,13 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
841 | if (flags & MSG_OOB) | 839 | if (flags & MSG_OOB) |
842 | goto out; | 840 | goto out; |
843 | 841 | ||
844 | if (addr_len) { | ||
845 | if (family == AF_INET) | ||
846 | *addr_len = sizeof(*sin); | ||
847 | else if (family == AF_INET6 && addr_len) | ||
848 | *addr_len = sizeof(*sin6); | ||
849 | } | ||
850 | |||
851 | if (flags & MSG_ERRQUEUE) { | 842 | if (flags & MSG_ERRQUEUE) { |
852 | if (family == AF_INET) { | 843 | if (family == AF_INET) { |
853 | return ip_recv_error(sk, msg, len); | 844 | return ip_recv_error(sk, msg, len, addr_len); |
854 | #if IS_ENABLED(CONFIG_IPV6) | 845 | #if IS_ENABLED(CONFIG_IPV6) |
855 | } else if (family == AF_INET6) { | 846 | } else if (family == AF_INET6) { |
856 | return pingv6_ops.ipv6_recv_error(sk, msg, len); | 847 | return pingv6_ops.ipv6_recv_error(sk, msg, len, |
848 | addr_len); | ||
857 | #endif | 849 | #endif |
858 | } | 850 | } |
859 | } | 851 | } |
@@ -877,11 +869,15 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
877 | 869 | ||
878 | /* Copy the address and add cmsg data. */ | 870 | /* Copy the address and add cmsg data. */ |
879 | if (family == AF_INET) { | 871 | if (family == AF_INET) { |
880 | sin = (struct sockaddr_in *) msg->msg_name; | 872 | struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name; |
881 | sin->sin_family = AF_INET; | 873 | |
882 | sin->sin_port = 0 /* skb->h.uh->source */; | 874 | if (sin) { |
883 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; | 875 | sin->sin_family = AF_INET; |
884 | memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); | 876 | sin->sin_port = 0 /* skb->h.uh->source */; |
877 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; | ||
878 | memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); | ||
879 | *addr_len = sizeof(*sin); | ||
880 | } | ||
885 | 881 | ||
886 | if (isk->cmsg_flags) | 882 | if (isk->cmsg_flags) |
887 | ip_cmsg_recv(msg, skb); | 883 | ip_cmsg_recv(msg, skb); |
@@ -890,17 +886,21 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
890 | } else if (family == AF_INET6) { | 886 | } else if (family == AF_INET6) { |
891 | struct ipv6_pinfo *np = inet6_sk(sk); | 887 | struct ipv6_pinfo *np = inet6_sk(sk); |
892 | struct ipv6hdr *ip6 = ipv6_hdr(skb); | 888 | struct ipv6hdr *ip6 = ipv6_hdr(skb); |
893 | sin6 = (struct sockaddr_in6 *) msg->msg_name; | 889 | struct sockaddr_in6 *sin6 = |
894 | sin6->sin6_family = AF_INET6; | 890 | (struct sockaddr_in6 *)msg->msg_name; |
895 | sin6->sin6_port = 0; | 891 | |
896 | sin6->sin6_addr = ip6->saddr; | 892 | if (sin6) { |
897 | 893 | sin6->sin6_family = AF_INET6; | |
898 | sin6->sin6_flowinfo = 0; | 894 | sin6->sin6_port = 0; |
899 | if (np->sndflow) | 895 | sin6->sin6_addr = ip6->saddr; |
900 | sin6->sin6_flowinfo = ip6_flowinfo(ip6); | 896 | sin6->sin6_flowinfo = 0; |
901 | 897 | if (np->sndflow) | |
902 | sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr, | 898 | sin6->sin6_flowinfo = ip6_flowinfo(ip6); |
903 | IP6CB(skb)->iif); | 899 | sin6->sin6_scope_id = |
900 | ipv6_iface_scope_id(&sin6->sin6_addr, | ||
901 | IP6CB(skb)->iif); | ||
902 | *addr_len = sizeof(*sin6); | ||
903 | } | ||
904 | 904 | ||
905 | if (inet6_sk(sk)->rxopt.all) | 905 | if (inet6_sk(sk)->rxopt.all) |
906 | pingv6_ops.ip6_datagram_recv_ctl(sk, msg, skb); | 906 | pingv6_ops.ip6_datagram_recv_ctl(sk, msg, skb); |
@@ -1076,7 +1076,7 @@ void ping_seq_stop(struct seq_file *seq, void *v) | |||
1076 | EXPORT_SYMBOL_GPL(ping_seq_stop); | 1076 | EXPORT_SYMBOL_GPL(ping_seq_stop); |
1077 | 1077 | ||
1078 | static void ping_v4_format_sock(struct sock *sp, struct seq_file *f, | 1078 | static void ping_v4_format_sock(struct sock *sp, struct seq_file *f, |
1079 | int bucket, int *len) | 1079 | int bucket) |
1080 | { | 1080 | { |
1081 | struct inet_sock *inet = inet_sk(sp); | 1081 | struct inet_sock *inet = inet_sk(sp); |
1082 | __be32 dest = inet->inet_daddr; | 1082 | __be32 dest = inet->inet_daddr; |
@@ -1085,7 +1085,7 @@ static void ping_v4_format_sock(struct sock *sp, struct seq_file *f, | |||
1085 | __u16 srcp = ntohs(inet->inet_sport); | 1085 | __u16 srcp = ntohs(inet->inet_sport); |
1086 | 1086 | ||
1087 | seq_printf(f, "%5d: %08X:%04X %08X:%04X" | 1087 | seq_printf(f, "%5d: %08X:%04X %08X:%04X" |
1088 | " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d%n", | 1088 | " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d", |
1089 | bucket, src, srcp, dest, destp, sp->sk_state, | 1089 | bucket, src, srcp, dest, destp, sp->sk_state, |
1090 | sk_wmem_alloc_get(sp), | 1090 | sk_wmem_alloc_get(sp), |
1091 | sk_rmem_alloc_get(sp), | 1091 | sk_rmem_alloc_get(sp), |
@@ -1093,23 +1093,22 @@ static void ping_v4_format_sock(struct sock *sp, struct seq_file *f, | |||
1093 | from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)), | 1093 | from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)), |
1094 | 0, sock_i_ino(sp), | 1094 | 0, sock_i_ino(sp), |
1095 | atomic_read(&sp->sk_refcnt), sp, | 1095 | atomic_read(&sp->sk_refcnt), sp, |
1096 | atomic_read(&sp->sk_drops), len); | 1096 | atomic_read(&sp->sk_drops)); |
1097 | } | 1097 | } |
1098 | 1098 | ||
1099 | static int ping_v4_seq_show(struct seq_file *seq, void *v) | 1099 | static int ping_v4_seq_show(struct seq_file *seq, void *v) |
1100 | { | 1100 | { |
1101 | seq_setwidth(seq, 127); | ||
1101 | if (v == SEQ_START_TOKEN) | 1102 | if (v == SEQ_START_TOKEN) |
1102 | seq_printf(seq, "%-127s\n", | 1103 | seq_puts(seq, " sl local_address rem_address st tx_queue " |
1103 | " sl local_address rem_address st tx_queue " | ||
1104 | "rx_queue tr tm->when retrnsmt uid timeout " | 1104 | "rx_queue tr tm->when retrnsmt uid timeout " |
1105 | "inode ref pointer drops"); | 1105 | "inode ref pointer drops"); |
1106 | else { | 1106 | else { |
1107 | struct ping_iter_state *state = seq->private; | 1107 | struct ping_iter_state *state = seq->private; |
1108 | int len; | ||
1109 | 1108 | ||
1110 | ping_v4_format_sock(v, seq, state->bucket, &len); | 1109 | ping_v4_format_sock(v, seq, state->bucket); |
1111 | seq_printf(seq, "%*s\n", 127 - len, ""); | ||
1112 | } | 1110 | } |
1111 | seq_pad(seq, '\n'); | ||
1113 | return 0; | 1112 | return 0; |
1114 | } | 1113 | } |
1115 | 1114 | ||
diff --git a/net/ipv4/protocol.c b/net/ipv4/protocol.c index ce848461acbb..46d6a1c923a8 100644 --- a/net/ipv4/protocol.c +++ b/net/ipv4/protocol.c | |||
@@ -31,10 +31,6 @@ | |||
31 | const struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS] __read_mostly; | 31 | const struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS] __read_mostly; |
32 | const struct net_offload __rcu *inet_offloads[MAX_INET_PROTOS] __read_mostly; | 32 | const struct net_offload __rcu *inet_offloads[MAX_INET_PROTOS] __read_mostly; |
33 | 33 | ||
34 | /* | ||
35 | * Add a protocol handler to the hash tables | ||
36 | */ | ||
37 | |||
38 | int inet_add_protocol(const struct net_protocol *prot, unsigned char protocol) | 34 | int inet_add_protocol(const struct net_protocol *prot, unsigned char protocol) |
39 | { | 35 | { |
40 | if (!prot->netns_ok) { | 36 | if (!prot->netns_ok) { |
@@ -55,10 +51,6 @@ int inet_add_offload(const struct net_offload *prot, unsigned char protocol) | |||
55 | } | 51 | } |
56 | EXPORT_SYMBOL(inet_add_offload); | 52 | EXPORT_SYMBOL(inet_add_offload); |
57 | 53 | ||
58 | /* | ||
59 | * Remove a protocol from the hash tables. | ||
60 | */ | ||
61 | |||
62 | int inet_del_protocol(const struct net_protocol *prot, unsigned char protocol) | 54 | int inet_del_protocol(const struct net_protocol *prot, unsigned char protocol) |
63 | { | 55 | { |
64 | int ret; | 56 | int ret; |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 41e1d2845c8f..23c3e5b5bb53 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -696,11 +696,8 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
696 | if (flags & MSG_OOB) | 696 | if (flags & MSG_OOB) |
697 | goto out; | 697 | goto out; |
698 | 698 | ||
699 | if (addr_len) | ||
700 | *addr_len = sizeof(*sin); | ||
701 | |||
702 | if (flags & MSG_ERRQUEUE) { | 699 | if (flags & MSG_ERRQUEUE) { |
703 | err = ip_recv_error(sk, msg, len); | 700 | err = ip_recv_error(sk, msg, len, addr_len); |
704 | goto out; | 701 | goto out; |
705 | } | 702 | } |
706 | 703 | ||
@@ -726,6 +723,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
726 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; | 723 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; |
727 | sin->sin_port = 0; | 724 | sin->sin_port = 0; |
728 | memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); | 725 | memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); |
726 | *addr_len = sizeof(*sin); | ||
729 | } | 727 | } |
730 | if (inet->cmsg_flags) | 728 | if (inet->cmsg_flags) |
731 | ip_cmsg_recv(msg, skb); | 729 | ip_cmsg_recv(msg, skb); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index f428935c50db..f8da28278014 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1776,8 +1776,12 @@ local_input: | |||
1776 | rth->dst.error= -err; | 1776 | rth->dst.error= -err; |
1777 | rth->rt_flags &= ~RTCF_LOCAL; | 1777 | rth->rt_flags &= ~RTCF_LOCAL; |
1778 | } | 1778 | } |
1779 | if (do_cache) | 1779 | if (do_cache) { |
1780 | rt_cache_route(&FIB_RES_NH(res), rth); | 1780 | if (unlikely(!rt_cache_route(&FIB_RES_NH(res), rth))) { |
1781 | rth->dst.flags |= DST_NOCACHE; | ||
1782 | rt_add_uncached_list(rth); | ||
1783 | } | ||
1784 | } | ||
1781 | skb_dst_set(skb, &rth->dst); | 1785 | skb_dst_set(skb, &rth->dst); |
1782 | err = 0; | 1786 | err = 0; |
1783 | goto out; | 1787 | goto out; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 8e8529d3c8c9..c4638e6f0238 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -808,12 +808,6 @@ static unsigned int tcp_xmit_size_goal(struct sock *sk, u32 mss_now, | |||
808 | xmit_size_goal = min_t(u32, gso_size, | 808 | xmit_size_goal = min_t(u32, gso_size, |
809 | sk->sk_gso_max_size - 1 - hlen); | 809 | sk->sk_gso_max_size - 1 - hlen); |
810 | 810 | ||
811 | /* TSQ : try to have at least two segments in flight | ||
812 | * (one in NIC TX ring, another in Qdisc) | ||
813 | */ | ||
814 | xmit_size_goal = min_t(u32, xmit_size_goal, | ||
815 | sysctl_tcp_limit_output_bytes >> 1); | ||
816 | |||
817 | xmit_size_goal = tcp_bound_to_half_wnd(tp, xmit_size_goal); | 811 | xmit_size_goal = tcp_bound_to_half_wnd(tp, xmit_size_goal); |
818 | 812 | ||
819 | /* We try hard to avoid divides here */ | 813 | /* We try hard to avoid divides here */ |
@@ -1431,7 +1425,7 @@ static void tcp_service_net_dma(struct sock *sk, bool wait) | |||
1431 | do { | 1425 | do { |
1432 | if (dma_async_is_tx_complete(tp->ucopy.dma_chan, | 1426 | if (dma_async_is_tx_complete(tp->ucopy.dma_chan, |
1433 | last_issued, &done, | 1427 | last_issued, &done, |
1434 | &used) == DMA_SUCCESS) { | 1428 | &used) == DMA_COMPLETE) { |
1435 | /* Safe to free early-copied skbs now */ | 1429 | /* Safe to free early-copied skbs now */ |
1436 | __skb_queue_purge(&sk->sk_async_wait_queue); | 1430 | __skb_queue_purge(&sk->sk_async_wait_queue); |
1437 | break; | 1431 | break; |
@@ -1439,7 +1433,7 @@ static void tcp_service_net_dma(struct sock *sk, bool wait) | |||
1439 | struct sk_buff *skb; | 1433 | struct sk_buff *skb; |
1440 | while ((skb = skb_peek(&sk->sk_async_wait_queue)) && | 1434 | while ((skb = skb_peek(&sk->sk_async_wait_queue)) && |
1441 | (dma_async_is_complete(skb->dma_cookie, done, | 1435 | (dma_async_is_complete(skb->dma_cookie, done, |
1442 | used) == DMA_SUCCESS)) { | 1436 | used) == DMA_COMPLETE)) { |
1443 | __skb_dequeue(&sk->sk_async_wait_queue); | 1437 | __skb_dequeue(&sk->sk_async_wait_queue); |
1444 | kfree_skb(skb); | 1438 | kfree_skb(skb); |
1445 | } | 1439 | } |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 14bba8a1c5a7..067213924751 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -177,7 +177,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
177 | if (IS_ERR(rt)) { | 177 | if (IS_ERR(rt)) { |
178 | err = PTR_ERR(rt); | 178 | err = PTR_ERR(rt); |
179 | if (err == -ENETUNREACH) | 179 | if (err == -ENETUNREACH) |
180 | IP_INC_STATS_BH(sock_net(sk), IPSTATS_MIB_OUTNOROUTES); | 180 | IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTNOROUTES); |
181 | return err; | 181 | return err; |
182 | } | 182 | } |
183 | 183 | ||
@@ -2541,13 +2541,13 @@ void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo) | |||
2541 | EXPORT_SYMBOL(tcp_proc_unregister); | 2541 | EXPORT_SYMBOL(tcp_proc_unregister); |
2542 | 2542 | ||
2543 | static void get_openreq4(const struct sock *sk, const struct request_sock *req, | 2543 | static void get_openreq4(const struct sock *sk, const struct request_sock *req, |
2544 | struct seq_file *f, int i, kuid_t uid, int *len) | 2544 | struct seq_file *f, int i, kuid_t uid) |
2545 | { | 2545 | { |
2546 | const struct inet_request_sock *ireq = inet_rsk(req); | 2546 | const struct inet_request_sock *ireq = inet_rsk(req); |
2547 | long delta = req->expires - jiffies; | 2547 | long delta = req->expires - jiffies; |
2548 | 2548 | ||
2549 | seq_printf(f, "%4d: %08X:%04X %08X:%04X" | 2549 | seq_printf(f, "%4d: %08X:%04X %08X:%04X" |
2550 | " %02X %08X:%08X %02X:%08lX %08X %5u %8d %u %d %pK%n", | 2550 | " %02X %08X:%08X %02X:%08lX %08X %5u %8d %u %d %pK", |
2551 | i, | 2551 | i, |
2552 | ireq->ir_loc_addr, | 2552 | ireq->ir_loc_addr, |
2553 | ntohs(inet_sk(sk)->inet_sport), | 2553 | ntohs(inet_sk(sk)->inet_sport), |
@@ -2562,11 +2562,10 @@ static void get_openreq4(const struct sock *sk, const struct request_sock *req, | |||
2562 | 0, /* non standard timer */ | 2562 | 0, /* non standard timer */ |
2563 | 0, /* open_requests have no inode */ | 2563 | 0, /* open_requests have no inode */ |
2564 | atomic_read(&sk->sk_refcnt), | 2564 | atomic_read(&sk->sk_refcnt), |
2565 | req, | 2565 | req); |
2566 | len); | ||
2567 | } | 2566 | } |
2568 | 2567 | ||
2569 | static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len) | 2568 | static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i) |
2570 | { | 2569 | { |
2571 | int timer_active; | 2570 | int timer_active; |
2572 | unsigned long timer_expires; | 2571 | unsigned long timer_expires; |
@@ -2605,7 +2604,7 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len) | |||
2605 | rx_queue = max_t(int, tp->rcv_nxt - tp->copied_seq, 0); | 2604 | rx_queue = max_t(int, tp->rcv_nxt - tp->copied_seq, 0); |
2606 | 2605 | ||
2607 | seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " | 2606 | seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX " |
2608 | "%08X %5u %8d %lu %d %pK %lu %lu %u %u %d%n", | 2607 | "%08X %5u %8d %lu %d %pK %lu %lu %u %u %d", |
2609 | i, src, srcp, dest, destp, sk->sk_state, | 2608 | i, src, srcp, dest, destp, sk->sk_state, |
2610 | tp->write_seq - tp->snd_una, | 2609 | tp->write_seq - tp->snd_una, |
2611 | rx_queue, | 2610 | rx_queue, |
@@ -2622,12 +2621,11 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len) | |||
2622 | tp->snd_cwnd, | 2621 | tp->snd_cwnd, |
2623 | sk->sk_state == TCP_LISTEN ? | 2622 | sk->sk_state == TCP_LISTEN ? |
2624 | (fastopenq ? fastopenq->max_qlen : 0) : | 2623 | (fastopenq ? fastopenq->max_qlen : 0) : |
2625 | (tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh), | 2624 | (tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh)); |
2626 | len); | ||
2627 | } | 2625 | } |
2628 | 2626 | ||
2629 | static void get_timewait4_sock(const struct inet_timewait_sock *tw, | 2627 | static void get_timewait4_sock(const struct inet_timewait_sock *tw, |
2630 | struct seq_file *f, int i, int *len) | 2628 | struct seq_file *f, int i) |
2631 | { | 2629 | { |
2632 | __be32 dest, src; | 2630 | __be32 dest, src; |
2633 | __u16 destp, srcp; | 2631 | __u16 destp, srcp; |
@@ -2639,10 +2637,10 @@ static void get_timewait4_sock(const struct inet_timewait_sock *tw, | |||
2639 | srcp = ntohs(tw->tw_sport); | 2637 | srcp = ntohs(tw->tw_sport); |
2640 | 2638 | ||
2641 | seq_printf(f, "%4d: %08X:%04X %08X:%04X" | 2639 | seq_printf(f, "%4d: %08X:%04X %08X:%04X" |
2642 | " %02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %pK%n", | 2640 | " %02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %pK", |
2643 | i, src, srcp, dest, destp, tw->tw_substate, 0, 0, | 2641 | i, src, srcp, dest, destp, tw->tw_substate, 0, 0, |
2644 | 3, jiffies_delta_to_clock_t(delta), 0, 0, 0, 0, | 2642 | 3, jiffies_delta_to_clock_t(delta), 0, 0, 0, 0, |
2645 | atomic_read(&tw->tw_refcnt), tw, len); | 2643 | atomic_read(&tw->tw_refcnt), tw); |
2646 | } | 2644 | } |
2647 | 2645 | ||
2648 | #define TMPSZ 150 | 2646 | #define TMPSZ 150 |
@@ -2651,11 +2649,10 @@ static int tcp4_seq_show(struct seq_file *seq, void *v) | |||
2651 | { | 2649 | { |
2652 | struct tcp_iter_state *st; | 2650 | struct tcp_iter_state *st; |
2653 | struct sock *sk = v; | 2651 | struct sock *sk = v; |
2654 | int len; | ||
2655 | 2652 | ||
2653 | seq_setwidth(seq, TMPSZ - 1); | ||
2656 | if (v == SEQ_START_TOKEN) { | 2654 | if (v == SEQ_START_TOKEN) { |
2657 | seq_printf(seq, "%-*s\n", TMPSZ - 1, | 2655 | seq_puts(seq, " sl local_address rem_address st tx_queue " |
2658 | " sl local_address rem_address st tx_queue " | ||
2659 | "rx_queue tr tm->when retrnsmt uid timeout " | 2656 | "rx_queue tr tm->when retrnsmt uid timeout " |
2660 | "inode"); | 2657 | "inode"); |
2661 | goto out; | 2658 | goto out; |
@@ -2666,16 +2663,16 @@ static int tcp4_seq_show(struct seq_file *seq, void *v) | |||
2666 | case TCP_SEQ_STATE_LISTENING: | 2663 | case TCP_SEQ_STATE_LISTENING: |
2667 | case TCP_SEQ_STATE_ESTABLISHED: | 2664 | case TCP_SEQ_STATE_ESTABLISHED: |
2668 | if (sk->sk_state == TCP_TIME_WAIT) | 2665 | if (sk->sk_state == TCP_TIME_WAIT) |
2669 | get_timewait4_sock(v, seq, st->num, &len); | 2666 | get_timewait4_sock(v, seq, st->num); |
2670 | else | 2667 | else |
2671 | get_tcp4_sock(v, seq, st->num, &len); | 2668 | get_tcp4_sock(v, seq, st->num); |
2672 | break; | 2669 | break; |
2673 | case TCP_SEQ_STATE_OPENREQ: | 2670 | case TCP_SEQ_STATE_OPENREQ: |
2674 | get_openreq4(st->syn_wait_sk, v, seq, st->num, st->uid, &len); | 2671 | get_openreq4(st->syn_wait_sk, v, seq, st->num, st->uid); |
2675 | break; | 2672 | break; |
2676 | } | 2673 | } |
2677 | seq_printf(seq, "%*s\n", TMPSZ - 1 - len, ""); | ||
2678 | out: | 2674 | out: |
2675 | seq_pad(seq, '\n'); | ||
2679 | return 0; | 2676 | return 0; |
2680 | } | 2677 | } |
2681 | 2678 | ||
diff --git a/net/ipv4/tcp_memcontrol.c b/net/ipv4/tcp_memcontrol.c index 03e9154f7e68..269a89ecd2f4 100644 --- a/net/ipv4/tcp_memcontrol.c +++ b/net/ipv4/tcp_memcontrol.c | |||
@@ -60,7 +60,6 @@ EXPORT_SYMBOL(tcp_destroy_cgroup); | |||
60 | static int tcp_update_limit(struct mem_cgroup *memcg, u64 val) | 60 | static int tcp_update_limit(struct mem_cgroup *memcg, u64 val) |
61 | { | 61 | { |
62 | struct cg_proto *cg_proto; | 62 | struct cg_proto *cg_proto; |
63 | u64 old_lim; | ||
64 | int i; | 63 | int i; |
65 | int ret; | 64 | int ret; |
66 | 65 | ||
@@ -71,7 +70,6 @@ static int tcp_update_limit(struct mem_cgroup *memcg, u64 val) | |||
71 | if (val > RES_COUNTER_MAX) | 70 | if (val > RES_COUNTER_MAX) |
72 | val = RES_COUNTER_MAX; | 71 | val = RES_COUNTER_MAX; |
73 | 72 | ||
74 | old_lim = res_counter_read_u64(&cg_proto->memory_allocated, RES_LIMIT); | ||
75 | ret = res_counter_set_limit(&cg_proto->memory_allocated, val); | 73 | ret = res_counter_set_limit(&cg_proto->memory_allocated, val); |
76 | if (ret) | 74 | if (ret) |
77 | return ret; | 75 | return ret; |
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c index 2ab09cbae74d..06493736fbc8 100644 --- a/net/ipv4/tcp_metrics.c +++ b/net/ipv4/tcp_metrics.c | |||
@@ -663,10 +663,13 @@ void tcp_fastopen_cache_get(struct sock *sk, u16 *mss, | |||
663 | void tcp_fastopen_cache_set(struct sock *sk, u16 mss, | 663 | void tcp_fastopen_cache_set(struct sock *sk, u16 mss, |
664 | struct tcp_fastopen_cookie *cookie, bool syn_lost) | 664 | struct tcp_fastopen_cookie *cookie, bool syn_lost) |
665 | { | 665 | { |
666 | struct dst_entry *dst = __sk_dst_get(sk); | ||
666 | struct tcp_metrics_block *tm; | 667 | struct tcp_metrics_block *tm; |
667 | 668 | ||
669 | if (!dst) | ||
670 | return; | ||
668 | rcu_read_lock(); | 671 | rcu_read_lock(); |
669 | tm = tcp_get_metrics(sk, __sk_dst_get(sk), true); | 672 | tm = tcp_get_metrics(sk, dst, true); |
670 | if (tm) { | 673 | if (tm) { |
671 | struct tcp_fastopen_metrics *tfom = &tm->tcpm_fastopen; | 674 | struct tcp_fastopen_metrics *tfom = &tm->tcpm_fastopen; |
672 | 675 | ||
@@ -988,7 +991,7 @@ static int tcp_metrics_nl_cmd_del(struct sk_buff *skb, struct genl_info *info) | |||
988 | return 0; | 991 | return 0; |
989 | } | 992 | } |
990 | 993 | ||
991 | static struct genl_ops tcp_metrics_nl_ops[] = { | 994 | static const struct genl_ops tcp_metrics_nl_ops[] = { |
992 | { | 995 | { |
993 | .cmd = TCP_METRICS_CMD_GET, | 996 | .cmd = TCP_METRICS_CMD_GET, |
994 | .doit = tcp_metrics_nl_cmd_get, | 997 | .doit = tcp_metrics_nl_cmd_get, |
@@ -1079,8 +1082,7 @@ void __init tcp_metrics_init(void) | |||
1079 | if (ret < 0) | 1082 | if (ret < 0) |
1080 | goto cleanup; | 1083 | goto cleanup; |
1081 | ret = genl_register_family_with_ops(&tcp_metrics_nl_family, | 1084 | ret = genl_register_family_with_ops(&tcp_metrics_nl_family, |
1082 | tcp_metrics_nl_ops, | 1085 | tcp_metrics_nl_ops); |
1083 | ARRAY_SIZE(tcp_metrics_nl_ops)); | ||
1084 | if (ret < 0) | 1086 | if (ret < 0) |
1085 | goto cleanup_subsys; | 1087 | goto cleanup_subsys; |
1086 | return; | 1088 | return; |
diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c index a2b68a108eae..05606353c7e7 100644 --- a/net/ipv4/tcp_offload.c +++ b/net/ipv4/tcp_offload.c | |||
@@ -274,33 +274,32 @@ static struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff * | |||
274 | { | 274 | { |
275 | const struct iphdr *iph = skb_gro_network_header(skb); | 275 | const struct iphdr *iph = skb_gro_network_header(skb); |
276 | __wsum wsum; | 276 | __wsum wsum; |
277 | __sum16 sum; | 277 | |
278 | /* Don't bother verifying checksum if we're going to flush anyway. */ | ||
279 | if (NAPI_GRO_CB(skb)->flush) | ||
280 | goto skip_csum; | ||
281 | |||
282 | wsum = skb->csum; | ||
278 | 283 | ||
279 | switch (skb->ip_summed) { | 284 | switch (skb->ip_summed) { |
285 | case CHECKSUM_NONE: | ||
286 | wsum = skb_checksum(skb, skb_gro_offset(skb), skb_gro_len(skb), | ||
287 | 0); | ||
288 | |||
289 | /* fall through */ | ||
290 | |||
280 | case CHECKSUM_COMPLETE: | 291 | case CHECKSUM_COMPLETE: |
281 | if (!tcp_v4_check(skb_gro_len(skb), iph->saddr, iph->daddr, | 292 | if (!tcp_v4_check(skb_gro_len(skb), iph->saddr, iph->daddr, |
282 | skb->csum)) { | 293 | wsum)) { |
283 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 294 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
284 | break; | 295 | break; |
285 | } | 296 | } |
286 | flush: | 297 | |
287 | NAPI_GRO_CB(skb)->flush = 1; | 298 | NAPI_GRO_CB(skb)->flush = 1; |
288 | return NULL; | 299 | return NULL; |
289 | |||
290 | case CHECKSUM_NONE: | ||
291 | wsum = csum_tcpudp_nofold(iph->saddr, iph->daddr, | ||
292 | skb_gro_len(skb), IPPROTO_TCP, 0); | ||
293 | sum = csum_fold(skb_checksum(skb, | ||
294 | skb_gro_offset(skb), | ||
295 | skb_gro_len(skb), | ||
296 | wsum)); | ||
297 | if (sum) | ||
298 | goto flush; | ||
299 | |||
300 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
301 | break; | ||
302 | } | 300 | } |
303 | 301 | ||
302 | skip_csum: | ||
304 | return tcp_gro_receive(head, skb); | 303 | return tcp_gro_receive(head, skb); |
305 | } | 304 | } |
306 | 305 | ||
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 672854664ff5..7820f3a7dd70 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -1875,8 +1875,12 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | |||
1875 | * - better RTT estimation and ACK scheduling | 1875 | * - better RTT estimation and ACK scheduling |
1876 | * - faster recovery | 1876 | * - faster recovery |
1877 | * - high rates | 1877 | * - high rates |
1878 | * Alas, some drivers / subsystems require a fair amount | ||
1879 | * of queued bytes to ensure line rate. | ||
1880 | * One example is wifi aggregation (802.11 AMPDU) | ||
1878 | */ | 1881 | */ |
1879 | limit = max(skb->truesize, sk->sk_pacing_rate >> 10); | 1882 | limit = max_t(unsigned int, sysctl_tcp_limit_output_bytes, |
1883 | sk->sk_pacing_rate >> 10); | ||
1880 | 1884 | ||
1881 | if (atomic_read(&sk->sk_wmem_alloc) > limit) { | 1885 | if (atomic_read(&sk->sk_wmem_alloc) > limit) { |
1882 | set_bit(TSQ_THROTTLED, &tp->tsq_flags); | 1886 | set_bit(TSQ_THROTTLED, &tp->tsq_flags); |
@@ -3093,7 +3097,6 @@ void tcp_send_window_probe(struct sock *sk) | |||
3093 | { | 3097 | { |
3094 | if (sk->sk_state == TCP_ESTABLISHED) { | 3098 | if (sk->sk_state == TCP_ESTABLISHED) { |
3095 | tcp_sk(sk)->snd_wl1 = tcp_sk(sk)->rcv_nxt - 1; | 3099 | tcp_sk(sk)->snd_wl1 = tcp_sk(sk)->rcv_nxt - 1; |
3096 | tcp_sk(sk)->snd_nxt = tcp_sk(sk)->write_seq; | ||
3097 | tcp_xmit_probe_skb(sk, 0); | 3100 | tcp_xmit_probe_skb(sk, 0); |
3098 | } | 3101 | } |
3099 | } | 3102 | } |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 89909dd730dd..44f6a20fa29d 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -999,7 +999,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
999 | err = PTR_ERR(rt); | 999 | err = PTR_ERR(rt); |
1000 | rt = NULL; | 1000 | rt = NULL; |
1001 | if (err == -ENETUNREACH) | 1001 | if (err == -ENETUNREACH) |
1002 | IP_INC_STATS_BH(net, IPSTATS_MIB_OUTNOROUTES); | 1002 | IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES); |
1003 | goto out; | 1003 | goto out; |
1004 | } | 1004 | } |
1005 | 1005 | ||
@@ -1098,6 +1098,9 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset, | |||
1098 | struct udp_sock *up = udp_sk(sk); | 1098 | struct udp_sock *up = udp_sk(sk); |
1099 | int ret; | 1099 | int ret; |
1100 | 1100 | ||
1101 | if (flags & MSG_SENDPAGE_NOTLAST) | ||
1102 | flags |= MSG_MORE; | ||
1103 | |||
1101 | if (!up->pending) { | 1104 | if (!up->pending) { |
1102 | struct msghdr msg = { .msg_flags = flags|MSG_MORE }; | 1105 | struct msghdr msg = { .msg_flags = flags|MSG_MORE }; |
1103 | 1106 | ||
@@ -1235,14 +1238,8 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
1235 | int is_udplite = IS_UDPLITE(sk); | 1238 | int is_udplite = IS_UDPLITE(sk); |
1236 | bool slow; | 1239 | bool slow; |
1237 | 1240 | ||
1238 | /* | ||
1239 | * Check any passed addresses | ||
1240 | */ | ||
1241 | if (addr_len) | ||
1242 | *addr_len = sizeof(*sin); | ||
1243 | |||
1244 | if (flags & MSG_ERRQUEUE) | 1241 | if (flags & MSG_ERRQUEUE) |
1245 | return ip_recv_error(sk, msg, len); | 1242 | return ip_recv_error(sk, msg, len, addr_len); |
1246 | 1243 | ||
1247 | try_again: | 1244 | try_again: |
1248 | skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0), | 1245 | skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0), |
@@ -1302,6 +1299,7 @@ try_again: | |||
1302 | sin->sin_port = udp_hdr(skb)->source; | 1299 | sin->sin_port = udp_hdr(skb)->source; |
1303 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; | 1300 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; |
1304 | memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); | 1301 | memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); |
1302 | *addr_len = sizeof(*sin); | ||
1305 | } | 1303 | } |
1306 | if (inet->cmsg_flags) | 1304 | if (inet->cmsg_flags) |
1307 | ip_cmsg_recv(msg, skb); | 1305 | ip_cmsg_recv(msg, skb); |
@@ -2331,7 +2329,7 @@ EXPORT_SYMBOL(udp_proc_unregister); | |||
2331 | 2329 | ||
2332 | /* ------------------------------------------------------------------------ */ | 2330 | /* ------------------------------------------------------------------------ */ |
2333 | static void udp4_format_sock(struct sock *sp, struct seq_file *f, | 2331 | static void udp4_format_sock(struct sock *sp, struct seq_file *f, |
2334 | int bucket, int *len) | 2332 | int bucket) |
2335 | { | 2333 | { |
2336 | struct inet_sock *inet = inet_sk(sp); | 2334 | struct inet_sock *inet = inet_sk(sp); |
2337 | __be32 dest = inet->inet_daddr; | 2335 | __be32 dest = inet->inet_daddr; |
@@ -2340,7 +2338,7 @@ static void udp4_format_sock(struct sock *sp, struct seq_file *f, | |||
2340 | __u16 srcp = ntohs(inet->inet_sport); | 2338 | __u16 srcp = ntohs(inet->inet_sport); |
2341 | 2339 | ||
2342 | seq_printf(f, "%5d: %08X:%04X %08X:%04X" | 2340 | seq_printf(f, "%5d: %08X:%04X %08X:%04X" |
2343 | " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d%n", | 2341 | " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d", |
2344 | bucket, src, srcp, dest, destp, sp->sk_state, | 2342 | bucket, src, srcp, dest, destp, sp->sk_state, |
2345 | sk_wmem_alloc_get(sp), | 2343 | sk_wmem_alloc_get(sp), |
2346 | sk_rmem_alloc_get(sp), | 2344 | sk_rmem_alloc_get(sp), |
@@ -2348,23 +2346,22 @@ static void udp4_format_sock(struct sock *sp, struct seq_file *f, | |||
2348 | from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)), | 2346 | from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)), |
2349 | 0, sock_i_ino(sp), | 2347 | 0, sock_i_ino(sp), |
2350 | atomic_read(&sp->sk_refcnt), sp, | 2348 | atomic_read(&sp->sk_refcnt), sp, |
2351 | atomic_read(&sp->sk_drops), len); | 2349 | atomic_read(&sp->sk_drops)); |
2352 | } | 2350 | } |
2353 | 2351 | ||
2354 | int udp4_seq_show(struct seq_file *seq, void *v) | 2352 | int udp4_seq_show(struct seq_file *seq, void *v) |
2355 | { | 2353 | { |
2354 | seq_setwidth(seq, 127); | ||
2356 | if (v == SEQ_START_TOKEN) | 2355 | if (v == SEQ_START_TOKEN) |
2357 | seq_printf(seq, "%-127s\n", | 2356 | seq_puts(seq, " sl local_address rem_address st tx_queue " |
2358 | " sl local_address rem_address st tx_queue " | ||
2359 | "rx_queue tr tm->when retrnsmt uid timeout " | 2357 | "rx_queue tr tm->when retrnsmt uid timeout " |
2360 | "inode ref pointer drops"); | 2358 | "inode ref pointer drops"); |
2361 | else { | 2359 | else { |
2362 | struct udp_iter_state *state = seq->private; | 2360 | struct udp_iter_state *state = seq->private; |
2363 | int len; | ||
2364 | 2361 | ||
2365 | udp4_format_sock(v, seq, state->bucket, &len); | 2362 | udp4_format_sock(v, seq, state->bucket); |
2366 | seq_printf(seq, "%*s\n", 127 - len, ""); | ||
2367 | } | 2363 | } |
2364 | seq_pad(seq, '\n'); | ||
2368 | return 0; | 2365 | return 0; |
2369 | } | 2366 | } |
2370 | 2367 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 5658d9d51637..12c97d8aa6bb 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -1996,23 +1996,6 @@ static void addrconf_add_mroute(struct net_device *dev) | |||
1996 | ip6_route_add(&cfg); | 1996 | ip6_route_add(&cfg); |
1997 | } | 1997 | } |
1998 | 1998 | ||
1999 | #if IS_ENABLED(CONFIG_IPV6_SIT) | ||
2000 | static void sit_route_add(struct net_device *dev) | ||
2001 | { | ||
2002 | struct fib6_config cfg = { | ||
2003 | .fc_table = RT6_TABLE_MAIN, | ||
2004 | .fc_metric = IP6_RT_PRIO_ADDRCONF, | ||
2005 | .fc_ifindex = dev->ifindex, | ||
2006 | .fc_dst_len = 96, | ||
2007 | .fc_flags = RTF_UP | RTF_NONEXTHOP, | ||
2008 | .fc_nlinfo.nl_net = dev_net(dev), | ||
2009 | }; | ||
2010 | |||
2011 | /* prefix length - 96 bits "::d.d.d.d" */ | ||
2012 | ip6_route_add(&cfg); | ||
2013 | } | ||
2014 | #endif | ||
2015 | |||
2016 | static struct inet6_dev *addrconf_add_dev(struct net_device *dev) | 1999 | static struct inet6_dev *addrconf_add_dev(struct net_device *dev) |
2017 | { | 2000 | { |
2018 | struct inet6_dev *idev; | 2001 | struct inet6_dev *idev; |
@@ -2542,7 +2525,8 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
2542 | struct in6_addr addr; | 2525 | struct in6_addr addr; |
2543 | struct net_device *dev; | 2526 | struct net_device *dev; |
2544 | struct net *net = dev_net(idev->dev); | 2527 | struct net *net = dev_net(idev->dev); |
2545 | int scope; | 2528 | int scope, plen; |
2529 | u32 pflags = 0; | ||
2546 | 2530 | ||
2547 | ASSERT_RTNL(); | 2531 | ASSERT_RTNL(); |
2548 | 2532 | ||
@@ -2552,12 +2536,16 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
2552 | if (idev->dev->flags&IFF_POINTOPOINT) { | 2536 | if (idev->dev->flags&IFF_POINTOPOINT) { |
2553 | addr.s6_addr32[0] = htonl(0xfe800000); | 2537 | addr.s6_addr32[0] = htonl(0xfe800000); |
2554 | scope = IFA_LINK; | 2538 | scope = IFA_LINK; |
2539 | plen = 64; | ||
2555 | } else { | 2540 | } else { |
2556 | scope = IPV6_ADDR_COMPATv4; | 2541 | scope = IPV6_ADDR_COMPATv4; |
2542 | plen = 96; | ||
2543 | pflags |= RTF_NONEXTHOP; | ||
2557 | } | 2544 | } |
2558 | 2545 | ||
2559 | if (addr.s6_addr32[3]) { | 2546 | if (addr.s6_addr32[3]) { |
2560 | add_addr(idev, &addr, 128, scope); | 2547 | add_addr(idev, &addr, plen, scope); |
2548 | addrconf_prefix_route(&addr, plen, idev->dev, 0, pflags); | ||
2561 | return; | 2549 | return; |
2562 | } | 2550 | } |
2563 | 2551 | ||
@@ -2569,7 +2557,6 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
2569 | int flag = scope; | 2557 | int flag = scope; |
2570 | 2558 | ||
2571 | for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { | 2559 | for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { |
2572 | int plen; | ||
2573 | 2560 | ||
2574 | addr.s6_addr32[3] = ifa->ifa_local; | 2561 | addr.s6_addr32[3] = ifa->ifa_local; |
2575 | 2562 | ||
@@ -2580,12 +2567,10 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
2580 | continue; | 2567 | continue; |
2581 | flag |= IFA_HOST; | 2568 | flag |= IFA_HOST; |
2582 | } | 2569 | } |
2583 | if (idev->dev->flags&IFF_POINTOPOINT) | ||
2584 | plen = 64; | ||
2585 | else | ||
2586 | plen = 96; | ||
2587 | 2570 | ||
2588 | add_addr(idev, &addr, plen, flag); | 2571 | add_addr(idev, &addr, plen, flag); |
2572 | addrconf_prefix_route(&addr, plen, idev->dev, 0, | ||
2573 | pflags); | ||
2589 | } | 2574 | } |
2590 | } | 2575 | } |
2591 | } | 2576 | } |
@@ -2711,7 +2696,6 @@ static void addrconf_sit_config(struct net_device *dev) | |||
2711 | struct in6_addr addr; | 2696 | struct in6_addr addr; |
2712 | 2697 | ||
2713 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); | 2698 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); |
2714 | addrconf_prefix_route(&addr, 64, dev, 0, 0); | ||
2715 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) | 2699 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) |
2716 | addrconf_add_linklocal(idev, &addr); | 2700 | addrconf_add_linklocal(idev, &addr); |
2717 | return; | 2701 | return; |
@@ -2721,8 +2705,6 @@ static void addrconf_sit_config(struct net_device *dev) | |||
2721 | 2705 | ||
2722 | if (dev->flags&IFF_POINTOPOINT) | 2706 | if (dev->flags&IFF_POINTOPOINT) |
2723 | addrconf_add_mroute(dev); | 2707 | addrconf_add_mroute(dev); |
2724 | else | ||
2725 | sit_route_add(dev); | ||
2726 | } | 2708 | } |
2727 | #endif | 2709 | #endif |
2728 | 2710 | ||
@@ -2740,8 +2722,6 @@ static void addrconf_gre_config(struct net_device *dev) | |||
2740 | } | 2722 | } |
2741 | 2723 | ||
2742 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); | 2724 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); |
2743 | addrconf_prefix_route(&addr, 64, dev, 0, 0); | ||
2744 | |||
2745 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) | 2725 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) |
2746 | addrconf_add_linklocal(idev, &addr); | 2726 | addrconf_add_linklocal(idev, &addr); |
2747 | } | 2727 | } |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index ff75313f27a8..4fbdb7046d28 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -972,10 +972,10 @@ out: | |||
972 | 972 | ||
973 | #ifdef CONFIG_SYSCTL | 973 | #ifdef CONFIG_SYSCTL |
974 | sysctl_fail: | 974 | sysctl_fail: |
975 | ipv6_packet_cleanup(); | 975 | pingv6_exit(); |
976 | #endif | 976 | #endif |
977 | pingv6_fail: | 977 | pingv6_fail: |
978 | pingv6_exit(); | 978 | ipv6_packet_cleanup(); |
979 | ipv6_packet_fail: | 979 | ipv6_packet_fail: |
980 | tcpv6_exit(); | 980 | tcpv6_exit(); |
981 | tcpv6_fail: | 981 | tcpv6_fail: |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index a454b0ff57c7..8dfe1f4d3c1a 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -318,7 +318,7 @@ void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu) | |||
318 | /* | 318 | /* |
319 | * Handle MSG_ERRQUEUE | 319 | * Handle MSG_ERRQUEUE |
320 | */ | 320 | */ |
321 | int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) | 321 | int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) |
322 | { | 322 | { |
323 | struct ipv6_pinfo *np = inet6_sk(sk); | 323 | struct ipv6_pinfo *np = inet6_sk(sk); |
324 | struct sock_exterr_skb *serr; | 324 | struct sock_exterr_skb *serr; |
@@ -369,6 +369,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) | |||
369 | &sin->sin6_addr); | 369 | &sin->sin6_addr); |
370 | sin->sin6_scope_id = 0; | 370 | sin->sin6_scope_id = 0; |
371 | } | 371 | } |
372 | *addr_len = sizeof(*sin); | ||
372 | } | 373 | } |
373 | 374 | ||
374 | memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); | 375 | memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); |
@@ -377,6 +378,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) | |||
377 | if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) { | 378 | if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) { |
378 | sin->sin6_family = AF_INET6; | 379 | sin->sin6_family = AF_INET6; |
379 | sin->sin6_flowinfo = 0; | 380 | sin->sin6_flowinfo = 0; |
381 | sin->sin6_port = 0; | ||
380 | if (skb->protocol == htons(ETH_P_IPV6)) { | 382 | if (skb->protocol == htons(ETH_P_IPV6)) { |
381 | sin->sin6_addr = ipv6_hdr(skb)->saddr; | 383 | sin->sin6_addr = ipv6_hdr(skb)->saddr; |
382 | if (np->rxopt.all) | 384 | if (np->rxopt.all) |
@@ -423,7 +425,8 @@ EXPORT_SYMBOL_GPL(ipv6_recv_error); | |||
423 | /* | 425 | /* |
424 | * Handle IPV6_RECVPATHMTU | 426 | * Handle IPV6_RECVPATHMTU |
425 | */ | 427 | */ |
426 | int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len) | 428 | int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len, |
429 | int *addr_len) | ||
427 | { | 430 | { |
428 | struct ipv6_pinfo *np = inet6_sk(sk); | 431 | struct ipv6_pinfo *np = inet6_sk(sk); |
429 | struct sk_buff *skb; | 432 | struct sk_buff *skb; |
@@ -457,6 +460,7 @@ int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len) | |||
457 | sin->sin6_port = 0; | 460 | sin->sin6_port = 0; |
458 | sin->sin6_scope_id = mtu_info.ip6m_addr.sin6_scope_id; | 461 | sin->sin6_scope_id = mtu_info.ip6m_addr.sin6_scope_id; |
459 | sin->sin6_addr = mtu_info.ip6m_addr.sin6_addr; | 462 | sin->sin6_addr = mtu_info.ip6m_addr.sin6_addr; |
463 | *addr_len = sizeof(*sin); | ||
460 | } | 464 | } |
461 | 465 | ||
462 | put_cmsg(msg, SOL_IPV6, IPV6_PATHMTU, sizeof(mtu_info), &mtu_info); | 466 | put_cmsg(msg, SOL_IPV6, IPV6_PATHMTU, sizeof(mtu_info), &mtu_info); |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 59df872e2f4d..4acdb63495db 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -116,8 +116,8 @@ static int ip6_finish_output2(struct sk_buff *skb) | |||
116 | } | 116 | } |
117 | rcu_read_unlock_bh(); | 117 | rcu_read_unlock_bh(); |
118 | 118 | ||
119 | IP6_INC_STATS_BH(dev_net(dst->dev), | 119 | IP6_INC_STATS(dev_net(dst->dev), |
120 | ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); | 120 | ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); |
121 | kfree_skb(skb); | 121 | kfree_skb(skb); |
122 | return -EINVAL; | 122 | return -EINVAL; |
123 | } | 123 | } |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index df1fa58528c6..d6062325db08 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -1642,6 +1642,15 @@ static int ip6_tnl_changelink(struct net_device *dev, struct nlattr *tb[], | |||
1642 | return ip6_tnl_update(t, &p); | 1642 | return ip6_tnl_update(t, &p); |
1643 | } | 1643 | } |
1644 | 1644 | ||
1645 | static void ip6_tnl_dellink(struct net_device *dev, struct list_head *head) | ||
1646 | { | ||
1647 | struct net *net = dev_net(dev); | ||
1648 | struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); | ||
1649 | |||
1650 | if (dev != ip6n->fb_tnl_dev) | ||
1651 | unregister_netdevice_queue(dev, head); | ||
1652 | } | ||
1653 | |||
1645 | static size_t ip6_tnl_get_size(const struct net_device *dev) | 1654 | static size_t ip6_tnl_get_size(const struct net_device *dev) |
1646 | { | 1655 | { |
1647 | return | 1656 | return |
@@ -1706,6 +1715,7 @@ static struct rtnl_link_ops ip6_link_ops __read_mostly = { | |||
1706 | .validate = ip6_tnl_validate, | 1715 | .validate = ip6_tnl_validate, |
1707 | .newlink = ip6_tnl_newlink, | 1716 | .newlink = ip6_tnl_newlink, |
1708 | .changelink = ip6_tnl_changelink, | 1717 | .changelink = ip6_tnl_changelink, |
1718 | .dellink = ip6_tnl_dellink, | ||
1709 | .get_size = ip6_tnl_get_size, | 1719 | .get_size = ip6_tnl_get_size, |
1710 | .fill_info = ip6_tnl_fill_info, | 1720 | .fill_info = ip6_tnl_fill_info, |
1711 | }; | 1721 | }; |
@@ -1722,9 +1732,9 @@ static struct xfrm6_tunnel ip6ip6_handler __read_mostly = { | |||
1722 | .priority = 1, | 1732 | .priority = 1, |
1723 | }; | 1733 | }; |
1724 | 1734 | ||
1725 | static void __net_exit ip6_tnl_destroy_tunnels(struct ip6_tnl_net *ip6n) | 1735 | static void __net_exit ip6_tnl_destroy_tunnels(struct net *net) |
1726 | { | 1736 | { |
1727 | struct net *net = dev_net(ip6n->fb_tnl_dev); | 1737 | struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); |
1728 | struct net_device *dev, *aux; | 1738 | struct net_device *dev, *aux; |
1729 | int h; | 1739 | int h; |
1730 | struct ip6_tnl *t; | 1740 | struct ip6_tnl *t; |
@@ -1792,10 +1802,8 @@ err_alloc_dev: | |||
1792 | 1802 | ||
1793 | static void __net_exit ip6_tnl_exit_net(struct net *net) | 1803 | static void __net_exit ip6_tnl_exit_net(struct net *net) |
1794 | { | 1804 | { |
1795 | struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); | ||
1796 | |||
1797 | rtnl_lock(); | 1805 | rtnl_lock(); |
1798 | ip6_tnl_destroy_tunnels(ip6n); | 1806 | ip6_tnl_destroy_tunnels(net); |
1799 | rtnl_unlock(); | 1807 | rtnl_unlock(); |
1800 | } | 1808 | } |
1801 | 1809 | ||
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index f8a55ff1971b..3512177deb4d 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -1726,8 +1726,8 @@ int __init ndisc_init(void) | |||
1726 | &ndisc_ifinfo_sysctl_change); | 1726 | &ndisc_ifinfo_sysctl_change); |
1727 | if (err) | 1727 | if (err) |
1728 | goto out_unregister_pernet; | 1728 | goto out_unregister_pernet; |
1729 | #endif | ||
1730 | out: | 1729 | out: |
1730 | #endif | ||
1731 | return err; | 1731 | return err; |
1732 | 1732 | ||
1733 | #ifdef CONFIG_SYSCTL | 1733 | #ifdef CONFIG_SYSCTL |
diff --git a/net/ipv6/netfilter/ip6t_SYNPROXY.c b/net/ipv6/netfilter/ip6t_SYNPROXY.c index bf9f612c1bc2..f78f41aca8e9 100644 --- a/net/ipv6/netfilter/ip6t_SYNPROXY.c +++ b/net/ipv6/netfilter/ip6t_SYNPROXY.c | |||
@@ -259,6 +259,7 @@ synproxy_recv_client_ack(const struct synproxy_net *snet, | |||
259 | 259 | ||
260 | this_cpu_inc(snet->stats->cookie_valid); | 260 | this_cpu_inc(snet->stats->cookie_valid); |
261 | opts->mss = mss; | 261 | opts->mss = mss; |
262 | opts->options |= XT_SYNPROXY_OPT_MSS; | ||
262 | 263 | ||
263 | if (opts->options & XT_SYNPROXY_OPT_TIMESTAMP) | 264 | if (opts->options & XT_SYNPROXY_OPT_TIMESTAMP) |
264 | synproxy_check_timestamp_cookie(opts); | 265 | synproxy_check_timestamp_cookie(opts); |
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c index 8815e31a87fe..a83243c3d656 100644 --- a/net/ipv6/ping.c +++ b/net/ipv6/ping.c | |||
@@ -57,7 +57,8 @@ static struct inet_protosw pingv6_protosw = { | |||
57 | 57 | ||
58 | 58 | ||
59 | /* Compatibility glue so we can support IPv6 when it's compiled as a module */ | 59 | /* Compatibility glue so we can support IPv6 when it's compiled as a module */ |
60 | static int dummy_ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) | 60 | static int dummy_ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, |
61 | int *addr_len) | ||
61 | { | 62 | { |
62 | return -EAFNOSUPPORT; | 63 | return -EAFNOSUPPORT; |
63 | } | 64 | } |
diff --git a/net/ipv6/protocol.c b/net/ipv6/protocol.c index 22d1bd4670da..e048cf1bb6a2 100644 --- a/net/ipv6/protocol.c +++ b/net/ipv6/protocol.c | |||
@@ -36,10 +36,6 @@ int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char protocol | |||
36 | } | 36 | } |
37 | EXPORT_SYMBOL(inet6_add_protocol); | 37 | EXPORT_SYMBOL(inet6_add_protocol); |
38 | 38 | ||
39 | /* | ||
40 | * Remove a protocol from the hash tables. | ||
41 | */ | ||
42 | |||
43 | int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char protocol) | 39 | int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char protocol) |
44 | { | 40 | { |
45 | int ret; | 41 | int ret; |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 3c00842b0079..7fb4e14c467f 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -465,14 +465,11 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
465 | if (flags & MSG_OOB) | 465 | if (flags & MSG_OOB) |
466 | return -EOPNOTSUPP; | 466 | return -EOPNOTSUPP; |
467 | 467 | ||
468 | if (addr_len) | ||
469 | *addr_len=sizeof(*sin6); | ||
470 | |||
471 | if (flags & MSG_ERRQUEUE) | 468 | if (flags & MSG_ERRQUEUE) |
472 | return ipv6_recv_error(sk, msg, len); | 469 | return ipv6_recv_error(sk, msg, len, addr_len); |
473 | 470 | ||
474 | if (np->rxpmtu && np->rxopt.bits.rxpmtu) | 471 | if (np->rxpmtu && np->rxopt.bits.rxpmtu) |
475 | return ipv6_recv_rxpmtu(sk, msg, len); | 472 | return ipv6_recv_rxpmtu(sk, msg, len, addr_len); |
476 | 473 | ||
477 | skb = skb_recv_datagram(sk, flags, noblock, &err); | 474 | skb = skb_recv_datagram(sk, flags, noblock, &err); |
478 | if (!skb) | 475 | if (!skb) |
@@ -506,6 +503,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
506 | sin6->sin6_flowinfo = 0; | 503 | sin6->sin6_flowinfo = 0; |
507 | sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr, | 504 | sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr, |
508 | IP6CB(skb)->iif); | 505 | IP6CB(skb)->iif); |
506 | *addr_len = sizeof(*sin6); | ||
509 | } | 507 | } |
510 | 508 | ||
511 | sock_recv_ts_and_drops(msg, sk, skb); | 509 | sock_recv_ts_and_drops(msg, sk, skb); |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index bfc6fcea3841..366fbba3359a 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -478,14 +478,44 @@ static void ipip6_tunnel_uninit(struct net_device *dev) | |||
478 | dev_put(dev); | 478 | dev_put(dev); |
479 | } | 479 | } |
480 | 480 | ||
481 | /* Generate icmpv6 with type/code ICMPV6_DEST_UNREACH/ICMPV6_ADDR_UNREACH | ||
482 | * if sufficient data bytes are available | ||
483 | */ | ||
484 | static int ipip6_err_gen_icmpv6_unreach(struct sk_buff *skb) | ||
485 | { | ||
486 | const struct iphdr *iph = (const struct iphdr *) skb->data; | ||
487 | struct rt6_info *rt; | ||
488 | struct sk_buff *skb2; | ||
489 | |||
490 | if (!pskb_may_pull(skb, iph->ihl * 4 + sizeof(struct ipv6hdr) + 8)) | ||
491 | return 1; | ||
492 | |||
493 | skb2 = skb_clone(skb, GFP_ATOMIC); | ||
494 | |||
495 | if (!skb2) | ||
496 | return 1; | ||
497 | |||
498 | skb_dst_drop(skb2); | ||
499 | skb_pull(skb2, iph->ihl * 4); | ||
500 | skb_reset_network_header(skb2); | ||
501 | |||
502 | rt = rt6_lookup(dev_net(skb->dev), &ipv6_hdr(skb2)->saddr, NULL, 0, 0); | ||
503 | |||
504 | if (rt && rt->dst.dev) | ||
505 | skb2->dev = rt->dst.dev; | ||
506 | |||
507 | icmpv6_send(skb2, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0); | ||
508 | |||
509 | if (rt) | ||
510 | ip6_rt_put(rt); | ||
511 | |||
512 | kfree_skb(skb2); | ||
513 | |||
514 | return 0; | ||
515 | } | ||
481 | 516 | ||
482 | static int ipip6_err(struct sk_buff *skb, u32 info) | 517 | static int ipip6_err(struct sk_buff *skb, u32 info) |
483 | { | 518 | { |
484 | |||
485 | /* All the routers (except for Linux) return only | ||
486 | 8 bytes of packet payload. It means, that precise relaying of | ||
487 | ICMP in the real Internet is absolutely infeasible. | ||
488 | */ | ||
489 | const struct iphdr *iph = (const struct iphdr *)skb->data; | 519 | const struct iphdr *iph = (const struct iphdr *)skb->data; |
490 | const int type = icmp_hdr(skb)->type; | 520 | const int type = icmp_hdr(skb)->type; |
491 | const int code = icmp_hdr(skb)->code; | 521 | const int code = icmp_hdr(skb)->code; |
@@ -500,7 +530,6 @@ static int ipip6_err(struct sk_buff *skb, u32 info) | |||
500 | case ICMP_DEST_UNREACH: | 530 | case ICMP_DEST_UNREACH: |
501 | switch (code) { | 531 | switch (code) { |
502 | case ICMP_SR_FAILED: | 532 | case ICMP_SR_FAILED: |
503 | case ICMP_PORT_UNREACH: | ||
504 | /* Impossible event. */ | 533 | /* Impossible event. */ |
505 | return 0; | 534 | return 0; |
506 | default: | 535 | default: |
@@ -545,6 +574,9 @@ static int ipip6_err(struct sk_buff *skb, u32 info) | |||
545 | goto out; | 574 | goto out; |
546 | 575 | ||
547 | err = 0; | 576 | err = 0; |
577 | if (!ipip6_err_gen_icmpv6_unreach(skb)) | ||
578 | goto out; | ||
579 | |||
548 | if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED) | 580 | if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED) |
549 | goto out; | 581 | goto out; |
550 | 582 | ||
@@ -919,7 +951,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb, | |||
919 | if (!new_skb) { | 951 | if (!new_skb) { |
920 | ip_rt_put(rt); | 952 | ip_rt_put(rt); |
921 | dev->stats.tx_dropped++; | 953 | dev->stats.tx_dropped++; |
922 | dev_kfree_skb(skb); | 954 | kfree_skb(skb); |
923 | return NETDEV_TX_OK; | 955 | return NETDEV_TX_OK; |
924 | } | 956 | } |
925 | if (skb->sk) | 957 | if (skb->sk) |
@@ -945,7 +977,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb, | |||
945 | tx_error_icmp: | 977 | tx_error_icmp: |
946 | dst_link_failure(skb); | 978 | dst_link_failure(skb); |
947 | tx_error: | 979 | tx_error: |
948 | dev_kfree_skb(skb); | 980 | kfree_skb(skb); |
949 | out: | 981 | out: |
950 | dev->stats.tx_errors++; | 982 | dev->stats.tx_errors++; |
951 | return NETDEV_TX_OK; | 983 | return NETDEV_TX_OK; |
@@ -985,7 +1017,7 @@ static netdev_tx_t sit_tunnel_xmit(struct sk_buff *skb, | |||
985 | 1017 | ||
986 | tx_err: | 1018 | tx_err: |
987 | dev->stats.tx_errors++; | 1019 | dev->stats.tx_errors++; |
988 | dev_kfree_skb(skb); | 1020 | kfree_skb(skb); |
989 | return NETDEV_TX_OK; | 1021 | return NETDEV_TX_OK; |
990 | 1022 | ||
991 | } | 1023 | } |
@@ -1619,6 +1651,15 @@ static const struct nla_policy ipip6_policy[IFLA_IPTUN_MAX + 1] = { | |||
1619 | #endif | 1651 | #endif |
1620 | }; | 1652 | }; |
1621 | 1653 | ||
1654 | static void ipip6_dellink(struct net_device *dev, struct list_head *head) | ||
1655 | { | ||
1656 | struct net *net = dev_net(dev); | ||
1657 | struct sit_net *sitn = net_generic(net, sit_net_id); | ||
1658 | |||
1659 | if (dev != sitn->fb_tunnel_dev) | ||
1660 | unregister_netdevice_queue(dev, head); | ||
1661 | } | ||
1662 | |||
1622 | static struct rtnl_link_ops sit_link_ops __read_mostly = { | 1663 | static struct rtnl_link_ops sit_link_ops __read_mostly = { |
1623 | .kind = "sit", | 1664 | .kind = "sit", |
1624 | .maxtype = IFLA_IPTUN_MAX, | 1665 | .maxtype = IFLA_IPTUN_MAX, |
@@ -1630,6 +1671,7 @@ static struct rtnl_link_ops sit_link_ops __read_mostly = { | |||
1630 | .changelink = ipip6_changelink, | 1671 | .changelink = ipip6_changelink, |
1631 | .get_size = ipip6_get_size, | 1672 | .get_size = ipip6_get_size, |
1632 | .fill_info = ipip6_fill_info, | 1673 | .fill_info = ipip6_fill_info, |
1674 | .dellink = ipip6_dellink, | ||
1633 | }; | 1675 | }; |
1634 | 1676 | ||
1635 | static struct xfrm_tunnel sit_handler __read_mostly = { | 1677 | static struct xfrm_tunnel sit_handler __read_mostly = { |
@@ -1644,9 +1686,10 @@ static struct xfrm_tunnel ipip_handler __read_mostly = { | |||
1644 | .priority = 2, | 1686 | .priority = 2, |
1645 | }; | 1687 | }; |
1646 | 1688 | ||
1647 | static void __net_exit sit_destroy_tunnels(struct sit_net *sitn, struct list_head *head) | 1689 | static void __net_exit sit_destroy_tunnels(struct net *net, |
1690 | struct list_head *head) | ||
1648 | { | 1691 | { |
1649 | struct net *net = dev_net(sitn->fb_tunnel_dev); | 1692 | struct sit_net *sitn = net_generic(net, sit_net_id); |
1650 | struct net_device *dev, *aux; | 1693 | struct net_device *dev, *aux; |
1651 | int prio; | 1694 | int prio; |
1652 | 1695 | ||
@@ -1721,11 +1764,10 @@ err_alloc_dev: | |||
1721 | 1764 | ||
1722 | static void __net_exit sit_exit_net(struct net *net) | 1765 | static void __net_exit sit_exit_net(struct net *net) |
1723 | { | 1766 | { |
1724 | struct sit_net *sitn = net_generic(net, sit_net_id); | ||
1725 | LIST_HEAD(list); | 1767 | LIST_HEAD(list); |
1726 | 1768 | ||
1727 | rtnl_lock(); | 1769 | rtnl_lock(); |
1728 | sit_destroy_tunnels(sitn, &list); | 1770 | sit_destroy_tunnels(net, &list); |
1729 | unregister_netdevice_many(&list); | 1771 | unregister_netdevice_many(&list); |
1730 | rtnl_unlock(); | 1772 | rtnl_unlock(); |
1731 | } | 1773 | } |
diff --git a/net/ipv6/tcpv6_offload.c b/net/ipv6/tcpv6_offload.c index c1097c798900..6d18157dc32c 100644 --- a/net/ipv6/tcpv6_offload.c +++ b/net/ipv6/tcpv6_offload.c | |||
@@ -37,34 +37,32 @@ static struct sk_buff **tcp6_gro_receive(struct sk_buff **head, | |||
37 | { | 37 | { |
38 | const struct ipv6hdr *iph = skb_gro_network_header(skb); | 38 | const struct ipv6hdr *iph = skb_gro_network_header(skb); |
39 | __wsum wsum; | 39 | __wsum wsum; |
40 | __sum16 sum; | 40 | |
41 | /* Don't bother verifying checksum if we're going to flush anyway. */ | ||
42 | if (NAPI_GRO_CB(skb)->flush) | ||
43 | goto skip_csum; | ||
44 | |||
45 | wsum = skb->csum; | ||
41 | 46 | ||
42 | switch (skb->ip_summed) { | 47 | switch (skb->ip_summed) { |
48 | case CHECKSUM_NONE: | ||
49 | wsum = skb_checksum(skb, skb_gro_offset(skb), skb_gro_len(skb), | ||
50 | wsum); | ||
51 | |||
52 | /* fall through */ | ||
53 | |||
43 | case CHECKSUM_COMPLETE: | 54 | case CHECKSUM_COMPLETE: |
44 | if (!tcp_v6_check(skb_gro_len(skb), &iph->saddr, &iph->daddr, | 55 | if (!tcp_v6_check(skb_gro_len(skb), &iph->saddr, &iph->daddr, |
45 | skb->csum)) { | 56 | wsum)) { |
46 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 57 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
47 | break; | 58 | break; |
48 | } | 59 | } |
49 | flush: | 60 | |
50 | NAPI_GRO_CB(skb)->flush = 1; | 61 | NAPI_GRO_CB(skb)->flush = 1; |
51 | return NULL; | 62 | return NULL; |
52 | |||
53 | case CHECKSUM_NONE: | ||
54 | wsum = ~csum_unfold(csum_ipv6_magic(&iph->saddr, &iph->daddr, | ||
55 | skb_gro_len(skb), | ||
56 | IPPROTO_TCP, 0)); | ||
57 | sum = csum_fold(skb_checksum(skb, | ||
58 | skb_gro_offset(skb), | ||
59 | skb_gro_len(skb), | ||
60 | wsum)); | ||
61 | if (sum) | ||
62 | goto flush; | ||
63 | |||
64 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
65 | break; | ||
66 | } | 63 | } |
67 | 64 | ||
65 | skip_csum: | ||
68 | return tcp_gro_receive(head, skb); | 66 | return tcp_gro_receive(head, skb); |
69 | } | 67 | } |
70 | 68 | ||
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index f3893e897f72..bcd5699313c3 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -392,14 +392,11 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
392 | int is_udp4; | 392 | int is_udp4; |
393 | bool slow; | 393 | bool slow; |
394 | 394 | ||
395 | if (addr_len) | ||
396 | *addr_len = sizeof(struct sockaddr_in6); | ||
397 | |||
398 | if (flags & MSG_ERRQUEUE) | 395 | if (flags & MSG_ERRQUEUE) |
399 | return ipv6_recv_error(sk, msg, len); | 396 | return ipv6_recv_error(sk, msg, len, addr_len); |
400 | 397 | ||
401 | if (np->rxpmtu && np->rxopt.bits.rxpmtu) | 398 | if (np->rxpmtu && np->rxopt.bits.rxpmtu) |
402 | return ipv6_recv_rxpmtu(sk, msg, len); | 399 | return ipv6_recv_rxpmtu(sk, msg, len, addr_len); |
403 | 400 | ||
404 | try_again: | 401 | try_again: |
405 | skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0), | 402 | skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0), |
@@ -480,7 +477,7 @@ try_again: | |||
480 | ipv6_iface_scope_id(&sin6->sin6_addr, | 477 | ipv6_iface_scope_id(&sin6->sin6_addr, |
481 | IP6CB(skb)->iif); | 478 | IP6CB(skb)->iif); |
482 | } | 479 | } |
483 | 480 | *addr_len = sizeof(*sin6); | |
484 | } | 481 | } |
485 | if (is_udp4) { | 482 | if (is_udp4) { |
486 | if (inet->cmsg_flags) | 483 | if (inet->cmsg_flags) |
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index 7a1e0fc1bd4d..e096025b477f 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c | |||
@@ -1823,8 +1823,6 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1823 | if (skb->tstamp.tv64) | 1823 | if (skb->tstamp.tv64) |
1824 | sk->sk_stamp = skb->tstamp; | 1824 | sk->sk_stamp = skb->tstamp; |
1825 | 1825 | ||
1826 | msg->msg_namelen = sizeof(*sipx); | ||
1827 | |||
1828 | if (sipx) { | 1826 | if (sipx) { |
1829 | sipx->sipx_family = AF_IPX; | 1827 | sipx->sipx_family = AF_IPX; |
1830 | sipx->sipx_port = ipx->ipx_source.sock; | 1828 | sipx->sipx_port = ipx->ipx_source.sock; |
@@ -1832,6 +1830,7 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1832 | sipx->sipx_network = IPX_SKB_CB(skb)->ipx_source_net; | 1830 | sipx->sipx_network = IPX_SKB_CB(skb)->ipx_source_net; |
1833 | sipx->sipx_type = ipx->ipx_type; | 1831 | sipx->sipx_type = ipx->ipx_type; |
1834 | sipx->sipx_zero = 0; | 1832 | sipx->sipx_zero = 0; |
1833 | msg->msg_namelen = sizeof(*sipx); | ||
1835 | } | 1834 | } |
1836 | rc = copied; | 1835 | rc = copied; |
1837 | 1836 | ||
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index 0f676908d15b..de7db23049f1 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c | |||
@@ -1385,8 +1385,6 @@ static int irda_recvmsg_dgram(struct kiocb *iocb, struct socket *sock, | |||
1385 | 1385 | ||
1386 | IRDA_DEBUG(4, "%s()\n", __func__); | 1386 | IRDA_DEBUG(4, "%s()\n", __func__); |
1387 | 1387 | ||
1388 | msg->msg_namelen = 0; | ||
1389 | |||
1390 | skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, | 1388 | skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, |
1391 | flags & MSG_DONTWAIT, &err); | 1389 | flags & MSG_DONTWAIT, &err); |
1392 | if (!skb) | 1390 | if (!skb) |
@@ -1451,8 +1449,6 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock, | |||
1451 | target = sock_rcvlowat(sk, flags & MSG_WAITALL, size); | 1449 | target = sock_rcvlowat(sk, flags & MSG_WAITALL, size); |
1452 | timeo = sock_rcvtimeo(sk, noblock); | 1450 | timeo = sock_rcvtimeo(sk, noblock); |
1453 | 1451 | ||
1454 | msg->msg_namelen = 0; | ||
1455 | |||
1456 | do { | 1452 | do { |
1457 | int chunk; | 1453 | int chunk; |
1458 | struct sk_buff *skb = skb_dequeue(&sk->sk_receive_queue); | 1454 | struct sk_buff *skb = skb_dequeue(&sk->sk_receive_queue); |
diff --git a/net/irda/irnetlink.c b/net/irda/irnetlink.c index c32971269280..a37b81fe0479 100644 --- a/net/irda/irnetlink.c +++ b/net/irda/irnetlink.c | |||
@@ -131,7 +131,7 @@ static const struct nla_policy irda_nl_policy[IRDA_NL_ATTR_MAX + 1] = { | |||
131 | [IRDA_NL_ATTR_MODE] = { .type = NLA_U32 }, | 131 | [IRDA_NL_ATTR_MODE] = { .type = NLA_U32 }, |
132 | }; | 132 | }; |
133 | 133 | ||
134 | static struct genl_ops irda_nl_ops[] = { | 134 | static const struct genl_ops irda_nl_ops[] = { |
135 | { | 135 | { |
136 | .cmd = IRDA_NL_CMD_SET_MODE, | 136 | .cmd = IRDA_NL_CMD_SET_MODE, |
137 | .doit = irda_nl_set_mode, | 137 | .doit = irda_nl_set_mode, |
@@ -149,8 +149,7 @@ static struct genl_ops irda_nl_ops[] = { | |||
149 | 149 | ||
150 | int irda_nl_register(void) | 150 | int irda_nl_register(void) |
151 | { | 151 | { |
152 | return genl_register_family_with_ops(&irda_nl_family, | 152 | return genl_register_family_with_ops(&irda_nl_family, irda_nl_ops); |
153 | irda_nl_ops, ARRAY_SIZE(irda_nl_ops)); | ||
154 | } | 153 | } |
155 | 154 | ||
156 | void irda_nl_unregister(void) | 155 | void irda_nl_unregister(void) |
diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c index 168aff5e60de..c4b7218058b6 100644 --- a/net/iucv/af_iucv.c +++ b/net/iucv/af_iucv.c | |||
@@ -1324,8 +1324,6 @@ static int iucv_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1324 | int err = 0; | 1324 | int err = 0; |
1325 | u32 offset; | 1325 | u32 offset; |
1326 | 1326 | ||
1327 | msg->msg_namelen = 0; | ||
1328 | |||
1329 | if ((sk->sk_state == IUCV_DISCONN) && | 1327 | if ((sk->sk_state == IUCV_DISCONN) && |
1330 | skb_queue_empty(&iucv->backlog_skb_q) && | 1328 | skb_queue_empty(&iucv->backlog_skb_q) && |
1331 | skb_queue_empty(&sk->sk_receive_queue) && | 1329 | skb_queue_empty(&sk->sk_receive_queue) && |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 911ef03bf8fb..545f047868ad 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -3616,7 +3616,6 @@ static int pfkey_recvmsg(struct kiocb *kiocb, | |||
3616 | if (flags & ~(MSG_PEEK|MSG_DONTWAIT|MSG_TRUNC|MSG_CMSG_COMPAT)) | 3616 | if (flags & ~(MSG_PEEK|MSG_DONTWAIT|MSG_TRUNC|MSG_CMSG_COMPAT)) |
3617 | goto out; | 3617 | goto out; |
3618 | 3618 | ||
3619 | msg->msg_namelen = 0; | ||
3620 | skb = skb_recv_datagram(sk, flags, flags & MSG_DONTWAIT, &err); | 3619 | skb = skb_recv_datagram(sk, flags, flags & MSG_DONTWAIT, &err); |
3621 | if (skb == NULL) | 3620 | if (skb == NULL) |
3622 | goto out; | 3621 | goto out; |
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index 571db8dd2292..da1a1cee1a08 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c | |||
@@ -518,9 +518,6 @@ static int l2tp_ip_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m | |||
518 | if (flags & MSG_OOB) | 518 | if (flags & MSG_OOB) |
519 | goto out; | 519 | goto out; |
520 | 520 | ||
521 | if (addr_len) | ||
522 | *addr_len = sizeof(*sin); | ||
523 | |||
524 | skb = skb_recv_datagram(sk, flags, noblock, &err); | 521 | skb = skb_recv_datagram(sk, flags, noblock, &err); |
525 | if (!skb) | 522 | if (!skb) |
526 | goto out; | 523 | goto out; |
@@ -543,6 +540,7 @@ static int l2tp_ip_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m | |||
543 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; | 540 | sin->sin_addr.s_addr = ip_hdr(skb)->saddr; |
544 | sin->sin_port = 0; | 541 | sin->sin_port = 0; |
545 | memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); | 542 | memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); |
543 | *addr_len = sizeof(*sin); | ||
546 | } | 544 | } |
547 | if (inet->cmsg_flags) | 545 | if (inet->cmsg_flags) |
548 | ip_cmsg_recv(msg, skb); | 546 | ip_cmsg_recv(msg, skb); |
diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c index cfd65304be60..d9b437e55007 100644 --- a/net/l2tp/l2tp_ip6.c +++ b/net/l2tp/l2tp_ip6.c | |||
@@ -665,7 +665,7 @@ static int l2tp_ip6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
665 | *addr_len = sizeof(*lsa); | 665 | *addr_len = sizeof(*lsa); |
666 | 666 | ||
667 | if (flags & MSG_ERRQUEUE) | 667 | if (flags & MSG_ERRQUEUE) |
668 | return ipv6_recv_error(sk, msg, len); | 668 | return ipv6_recv_error(sk, msg, len, addr_len); |
669 | 669 | ||
670 | skb = skb_recv_datagram(sk, flags, noblock, &err); | 670 | skb = skb_recv_datagram(sk, flags, noblock, &err); |
671 | if (!skb) | 671 | if (!skb) |
diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c index be446d517bc9..4cfd722e9153 100644 --- a/net/l2tp/l2tp_netlink.c +++ b/net/l2tp/l2tp_netlink.c | |||
@@ -793,7 +793,7 @@ static struct nla_policy l2tp_nl_policy[L2TP_ATTR_MAX + 1] = { | |||
793 | }, | 793 | }, |
794 | }; | 794 | }; |
795 | 795 | ||
796 | static struct genl_ops l2tp_nl_ops[] = { | 796 | static const struct genl_ops l2tp_nl_ops[] = { |
797 | { | 797 | { |
798 | .cmd = L2TP_CMD_NOOP, | 798 | .cmd = L2TP_CMD_NOOP, |
799 | .doit = l2tp_nl_cmd_noop, | 799 | .doit = l2tp_nl_cmd_noop, |
@@ -887,13 +887,8 @@ EXPORT_SYMBOL_GPL(l2tp_nl_unregister_ops); | |||
887 | 887 | ||
888 | static int l2tp_nl_init(void) | 888 | static int l2tp_nl_init(void) |
889 | { | 889 | { |
890 | int err; | ||
891 | |||
892 | pr_info("L2TP netlink interface\n"); | 890 | pr_info("L2TP netlink interface\n"); |
893 | err = genl_register_family_with_ops(&l2tp_nl_family, l2tp_nl_ops, | 891 | return genl_register_family_with_ops(&l2tp_nl_family, l2tp_nl_ops); |
894 | ARRAY_SIZE(l2tp_nl_ops)); | ||
895 | |||
896 | return err; | ||
897 | } | 892 | } |
898 | 893 | ||
899 | static void l2tp_nl_cleanup(void) | 894 | static void l2tp_nl_cleanup(void) |
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c index ffda81ef1a70..be5fadf34739 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c | |||
@@ -197,8 +197,6 @@ static int pppol2tp_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
197 | if (sk->sk_state & PPPOX_BOUND) | 197 | if (sk->sk_state & PPPOX_BOUND) |
198 | goto end; | 198 | goto end; |
199 | 199 | ||
200 | msg->msg_namelen = 0; | ||
201 | |||
202 | err = 0; | 200 | err = 0; |
203 | skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, | 201 | skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, |
204 | flags & MSG_DONTWAIT, &err); | 202 | flags & MSG_DONTWAIT, &err); |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 6cba486353e8..7b01b9f5846c 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
@@ -720,8 +720,6 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
720 | int target; /* Read at least this many bytes */ | 720 | int target; /* Read at least this many bytes */ |
721 | long timeo; | 721 | long timeo; |
722 | 722 | ||
723 | msg->msg_namelen = 0; | ||
724 | |||
725 | lock_sock(sk); | 723 | lock_sock(sk); |
726 | copied = -ENOTCONN; | 724 | copied = -ENOTCONN; |
727 | if (unlikely(sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_LISTEN)) | 725 | if (unlikely(sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_LISTEN)) |
diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig index 48acec17e27a..c3398cd99b94 100644 --- a/net/netfilter/Kconfig +++ b/net/netfilter/Kconfig | |||
@@ -909,7 +909,7 @@ config NETFILTER_XT_MATCH_CONNLABEL | |||
909 | connection simultaneously. | 909 | connection simultaneously. |
910 | 910 | ||
911 | config NETFILTER_XT_MATCH_CONNLIMIT | 911 | config NETFILTER_XT_MATCH_CONNLIMIT |
912 | tristate '"connlimit" match support"' | 912 | tristate '"connlimit" match support' |
913 | depends on NF_CONNTRACK | 913 | depends on NF_CONNTRACK |
914 | depends on NETFILTER_ADVANCED | 914 | depends on NETFILTER_ADVANCED |
915 | ---help--- | 915 | ---help--- |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 1ded5c6d268c..35be035ee0ce 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
@@ -3580,7 +3580,7 @@ out: | |||
3580 | } | 3580 | } |
3581 | 3581 | ||
3582 | 3582 | ||
3583 | static struct genl_ops ip_vs_genl_ops[] __read_mostly = { | 3583 | static const struct genl_ops ip_vs_genl_ops[] __read_mostly = { |
3584 | { | 3584 | { |
3585 | .cmd = IPVS_CMD_NEW_SERVICE, | 3585 | .cmd = IPVS_CMD_NEW_SERVICE, |
3586 | .flags = GENL_ADMIN_PERM, | 3586 | .flags = GENL_ADMIN_PERM, |
@@ -3679,7 +3679,7 @@ static struct genl_ops ip_vs_genl_ops[] __read_mostly = { | |||
3679 | static int __init ip_vs_genl_register(void) | 3679 | static int __init ip_vs_genl_register(void) |
3680 | { | 3680 | { |
3681 | return genl_register_family_with_ops(&ip_vs_genl_family, | 3681 | return genl_register_family_with_ops(&ip_vs_genl_family, |
3682 | ip_vs_genl_ops, ARRAY_SIZE(ip_vs_genl_ops)); | 3682 | ip_vs_genl_ops); |
3683 | } | 3683 | } |
3684 | 3684 | ||
3685 | static void ip_vs_genl_unregister(void) | 3685 | static void ip_vs_genl_unregister(void) |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index e22d950c60b3..43549eb7a7be 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -764,9 +764,10 @@ void nf_conntrack_free(struct nf_conn *ct) | |||
764 | struct net *net = nf_ct_net(ct); | 764 | struct net *net = nf_ct_net(ct); |
765 | 765 | ||
766 | nf_ct_ext_destroy(ct); | 766 | nf_ct_ext_destroy(ct); |
767 | atomic_dec(&net->ct.count); | ||
768 | nf_ct_ext_free(ct); | 767 | nf_ct_ext_free(ct); |
769 | kmem_cache_free(net->ct.nf_conntrack_cachep, ct); | 768 | kmem_cache_free(net->ct.nf_conntrack_cachep, ct); |
769 | smp_mb__before_atomic_dec(); | ||
770 | atomic_dec(&net->ct.count); | ||
770 | } | 771 | } |
771 | EXPORT_SYMBOL_GPL(nf_conntrack_free); | 772 | EXPORT_SYMBOL_GPL(nf_conntrack_free); |
772 | 773 | ||
diff --git a/net/netfilter/nf_conntrack_seqadj.c b/net/netfilter/nf_conntrack_seqadj.c index 5f9bfd060dea..17c1bcb182c6 100644 --- a/net/netfilter/nf_conntrack_seqadj.c +++ b/net/netfilter/nf_conntrack_seqadj.c | |||
@@ -41,8 +41,8 @@ int nf_ct_seqadj_set(struct nf_conn *ct, enum ip_conntrack_info ctinfo, | |||
41 | spin_lock_bh(&ct->lock); | 41 | spin_lock_bh(&ct->lock); |
42 | this_way = &seqadj->seq[dir]; | 42 | this_way = &seqadj->seq[dir]; |
43 | if (this_way->offset_before == this_way->offset_after || | 43 | if (this_way->offset_before == this_way->offset_after || |
44 | before(this_way->correction_pos, seq)) { | 44 | before(this_way->correction_pos, ntohl(seq))) { |
45 | this_way->correction_pos = seq; | 45 | this_way->correction_pos = ntohl(seq); |
46 | this_way->offset_before = this_way->offset_after; | 46 | this_way->offset_before = this_way->offset_after; |
47 | this_way->offset_after += off; | 47 | this_way->offset_after += off; |
48 | } | 48 | } |
diff --git a/net/netfilter/nf_synproxy_core.c b/net/netfilter/nf_synproxy_core.c index cdf4567ba9b3..9858e3e51a3a 100644 --- a/net/netfilter/nf_synproxy_core.c +++ b/net/netfilter/nf_synproxy_core.c | |||
@@ -151,9 +151,10 @@ void synproxy_init_timestamp_cookie(const struct xt_synproxy_info *info, | |||
151 | opts->tsecr = opts->tsval; | 151 | opts->tsecr = opts->tsval; |
152 | opts->tsval = tcp_time_stamp & ~0x3f; | 152 | opts->tsval = tcp_time_stamp & ~0x3f; |
153 | 153 | ||
154 | if (opts->options & XT_SYNPROXY_OPT_WSCALE) | 154 | if (opts->options & XT_SYNPROXY_OPT_WSCALE) { |
155 | opts->tsval |= info->wscale; | 155 | opts->tsval |= opts->wscale; |
156 | else | 156 | opts->wscale = info->wscale; |
157 | } else | ||
157 | opts->tsval |= 0xf; | 158 | opts->tsval |= 0xf; |
158 | 159 | ||
159 | if (opts->options & XT_SYNPROXY_OPT_SACK_PERM) | 160 | if (opts->options & XT_SYNPROXY_OPT_SACK_PERM) |
diff --git a/net/netfilter/nft_compat.c b/net/netfilter/nft_compat.c index a82667c64729..da0c1f4ada12 100644 --- a/net/netfilter/nft_compat.c +++ b/net/netfilter/nft_compat.c | |||
@@ -128,7 +128,7 @@ static const struct nla_policy nft_rule_compat_policy[NFTA_RULE_COMPAT_MAX + 1] | |||
128 | [NFTA_RULE_COMPAT_FLAGS] = { .type = NLA_U32 }, | 128 | [NFTA_RULE_COMPAT_FLAGS] = { .type = NLA_U32 }, |
129 | }; | 129 | }; |
130 | 130 | ||
131 | static u8 nft_parse_compat(const struct nlattr *attr, bool *inv) | 131 | static int nft_parse_compat(const struct nlattr *attr, u8 *proto, bool *inv) |
132 | { | 132 | { |
133 | struct nlattr *tb[NFTA_RULE_COMPAT_MAX+1]; | 133 | struct nlattr *tb[NFTA_RULE_COMPAT_MAX+1]; |
134 | u32 flags; | 134 | u32 flags; |
@@ -148,7 +148,8 @@ static u8 nft_parse_compat(const struct nlattr *attr, bool *inv) | |||
148 | if (flags & NFT_RULE_COMPAT_F_INV) | 148 | if (flags & NFT_RULE_COMPAT_F_INV) |
149 | *inv = true; | 149 | *inv = true; |
150 | 150 | ||
151 | return ntohl(nla_get_be32(tb[NFTA_RULE_COMPAT_PROTO])); | 151 | *proto = ntohl(nla_get_be32(tb[NFTA_RULE_COMPAT_PROTO])); |
152 | return 0; | ||
152 | } | 153 | } |
153 | 154 | ||
154 | static int | 155 | static int |
@@ -166,8 +167,11 @@ nft_target_init(const struct nft_ctx *ctx, const struct nft_expr *expr, | |||
166 | 167 | ||
167 | target_compat_from_user(target, nla_data(tb[NFTA_TARGET_INFO]), info); | 168 | target_compat_from_user(target, nla_data(tb[NFTA_TARGET_INFO]), info); |
168 | 169 | ||
169 | if (ctx->nla[NFTA_RULE_COMPAT]) | 170 | if (ctx->nla[NFTA_RULE_COMPAT]) { |
170 | proto = nft_parse_compat(ctx->nla[NFTA_RULE_COMPAT], &inv); | 171 | ret = nft_parse_compat(ctx->nla[NFTA_RULE_COMPAT], &proto, &inv); |
172 | if (ret < 0) | ||
173 | goto err; | ||
174 | } | ||
171 | 175 | ||
172 | nft_target_set_tgchk_param(&par, ctx, target, info, &e, proto, inv); | 176 | nft_target_set_tgchk_param(&par, ctx, target, info, &e, proto, inv); |
173 | 177 | ||
@@ -356,8 +360,11 @@ nft_match_init(const struct nft_ctx *ctx, const struct nft_expr *expr, | |||
356 | 360 | ||
357 | match_compat_from_user(match, nla_data(tb[NFTA_MATCH_INFO]), info); | 361 | match_compat_from_user(match, nla_data(tb[NFTA_MATCH_INFO]), info); |
358 | 362 | ||
359 | if (ctx->nla[NFTA_RULE_COMPAT]) | 363 | if (ctx->nla[NFTA_RULE_COMPAT]) { |
360 | proto = nft_parse_compat(ctx->nla[NFTA_RULE_COMPAT], &inv); | 364 | ret = nft_parse_compat(ctx->nla[NFTA_RULE_COMPAT], &proto, &inv); |
365 | if (ret < 0) | ||
366 | goto err; | ||
367 | } | ||
361 | 368 | ||
362 | nft_match_set_mtchk_param(&par, ctx, match, info, &e, proto, inv); | 369 | nft_match_set_mtchk_param(&par, ctx, match, info, &e, proto, inv); |
363 | 370 | ||
diff --git a/net/netfilter/xt_set.c b/net/netfilter/xt_set.c index e7c4e0e01ff5..80c2e2d603e0 100644 --- a/net/netfilter/xt_set.c +++ b/net/netfilter/xt_set.c | |||
@@ -84,7 +84,7 @@ set_match_v0_checkentry(const struct xt_mtchk_param *par) | |||
84 | index = ip_set_nfnl_get_byindex(par->net, info->match_set.index); | 84 | index = ip_set_nfnl_get_byindex(par->net, info->match_set.index); |
85 | 85 | ||
86 | if (index == IPSET_INVALID_ID) { | 86 | if (index == IPSET_INVALID_ID) { |
87 | pr_warning("Cannot find set indentified by id %u to match\n", | 87 | pr_warning("Cannot find set identified by id %u to match\n", |
88 | info->match_set.index); | 88 | info->match_set.index); |
89 | return -ENOENT; | 89 | return -ENOENT; |
90 | } | 90 | } |
@@ -134,7 +134,7 @@ set_match_v1_checkentry(const struct xt_mtchk_param *par) | |||
134 | index = ip_set_nfnl_get_byindex(par->net, info->match_set.index); | 134 | index = ip_set_nfnl_get_byindex(par->net, info->match_set.index); |
135 | 135 | ||
136 | if (index == IPSET_INVALID_ID) { | 136 | if (index == IPSET_INVALID_ID) { |
137 | pr_warning("Cannot find set indentified by id %u to match\n", | 137 | pr_warning("Cannot find set identified by id %u to match\n", |
138 | info->match_set.index); | 138 | info->match_set.index); |
139 | return -ENOENT; | 139 | return -ENOENT; |
140 | } | 140 | } |
diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c index a1100640495d..69345cebe3a3 100644 --- a/net/netlabel/netlabel_cipso_v4.c +++ b/net/netlabel/netlabel_cipso_v4.c | |||
@@ -737,7 +737,7 @@ static int netlbl_cipsov4_remove(struct sk_buff *skb, struct genl_info *info) | |||
737 | * NetLabel Generic NETLINK Command Definitions | 737 | * NetLabel Generic NETLINK Command Definitions |
738 | */ | 738 | */ |
739 | 739 | ||
740 | static struct genl_ops netlbl_cipsov4_ops[] = { | 740 | static const struct genl_ops netlbl_cipsov4_ops[] = { |
741 | { | 741 | { |
742 | .cmd = NLBL_CIPSOV4_C_ADD, | 742 | .cmd = NLBL_CIPSOV4_C_ADD, |
743 | .flags = GENL_ADMIN_PERM, | 743 | .flags = GENL_ADMIN_PERM, |
@@ -783,5 +783,5 @@ static struct genl_ops netlbl_cipsov4_ops[] = { | |||
783 | int __init netlbl_cipsov4_genl_init(void) | 783 | int __init netlbl_cipsov4_genl_init(void) |
784 | { | 784 | { |
785 | return genl_register_family_with_ops(&netlbl_cipsov4_gnl_family, | 785 | return genl_register_family_with_ops(&netlbl_cipsov4_gnl_family, |
786 | netlbl_cipsov4_ops, ARRAY_SIZE(netlbl_cipsov4_ops)); | 786 | netlbl_cipsov4_ops); |
787 | } | 787 | } |
diff --git a/net/netlabel/netlabel_mgmt.c b/net/netlabel/netlabel_mgmt.c index dd1c37d7acbc..8ef83ee97c6a 100644 --- a/net/netlabel/netlabel_mgmt.c +++ b/net/netlabel/netlabel_mgmt.c | |||
@@ -705,7 +705,7 @@ version_failure: | |||
705 | * NetLabel Generic NETLINK Command Definitions | 705 | * NetLabel Generic NETLINK Command Definitions |
706 | */ | 706 | */ |
707 | 707 | ||
708 | static struct genl_ops netlbl_mgmt_genl_ops[] = { | 708 | static const struct genl_ops netlbl_mgmt_genl_ops[] = { |
709 | { | 709 | { |
710 | .cmd = NLBL_MGMT_C_ADD, | 710 | .cmd = NLBL_MGMT_C_ADD, |
711 | .flags = GENL_ADMIN_PERM, | 711 | .flags = GENL_ADMIN_PERM, |
@@ -779,5 +779,5 @@ static struct genl_ops netlbl_mgmt_genl_ops[] = { | |||
779 | int __init netlbl_mgmt_genl_init(void) | 779 | int __init netlbl_mgmt_genl_init(void) |
780 | { | 780 | { |
781 | return genl_register_family_with_ops(&netlbl_mgmt_gnl_family, | 781 | return genl_register_family_with_ops(&netlbl_mgmt_gnl_family, |
782 | netlbl_mgmt_genl_ops, ARRAY_SIZE(netlbl_mgmt_genl_ops)); | 782 | netlbl_mgmt_genl_ops); |
783 | } | 783 | } |
diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 8f0897407a2c..43817d73ccf9 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c | |||
@@ -1323,7 +1323,7 @@ unlabel_staticlistdef_return: | |||
1323 | * NetLabel Generic NETLINK Command Definitions | 1323 | * NetLabel Generic NETLINK Command Definitions |
1324 | */ | 1324 | */ |
1325 | 1325 | ||
1326 | static struct genl_ops netlbl_unlabel_genl_ops[] = { | 1326 | static const struct genl_ops netlbl_unlabel_genl_ops[] = { |
1327 | { | 1327 | { |
1328 | .cmd = NLBL_UNLABEL_C_STATICADD, | 1328 | .cmd = NLBL_UNLABEL_C_STATICADD, |
1329 | .flags = GENL_ADMIN_PERM, | 1329 | .flags = GENL_ADMIN_PERM, |
@@ -1397,7 +1397,7 @@ static struct genl_ops netlbl_unlabel_genl_ops[] = { | |||
1397 | int __init netlbl_unlabel_genl_init(void) | 1397 | int __init netlbl_unlabel_genl_init(void) |
1398 | { | 1398 | { |
1399 | return genl_register_family_with_ops(&netlbl_unlabel_gnl_family, | 1399 | return genl_register_family_with_ops(&netlbl_unlabel_gnl_family, |
1400 | netlbl_unlabel_genl_ops, ARRAY_SIZE(netlbl_unlabel_genl_ops)); | 1400 | netlbl_unlabel_genl_ops); |
1401 | } | 1401 | } |
1402 | 1402 | ||
1403 | /* | 1403 | /* |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 8df7f64c6db3..bca50b95c182 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -2017,7 +2017,7 @@ out: | |||
2017 | * netlink_set_err - report error to broadcast listeners | 2017 | * netlink_set_err - report error to broadcast listeners |
2018 | * @ssk: the kernel netlink socket, as returned by netlink_kernel_create() | 2018 | * @ssk: the kernel netlink socket, as returned by netlink_kernel_create() |
2019 | * @portid: the PORTID of a process that we want to skip (if any) | 2019 | * @portid: the PORTID of a process that we want to skip (if any) |
2020 | * @groups: the broadcast group that will notice the error | 2020 | * @group: the broadcast group that will notice the error |
2021 | * @code: error code, must be negative (as usual in kernelspace) | 2021 | * @code: error code, must be negative (as usual in kernelspace) |
2022 | * | 2022 | * |
2023 | * This function returns the number of broadcast listeners that have set the | 2023 | * This function returns the number of broadcast listeners that have set the |
@@ -2335,8 +2335,6 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock, | |||
2335 | } | 2335 | } |
2336 | #endif | 2336 | #endif |
2337 | 2337 | ||
2338 | msg->msg_namelen = 0; | ||
2339 | |||
2340 | copied = data_skb->len; | 2338 | copied = data_skb->len; |
2341 | if (len < copied) { | 2339 | if (len < copied) { |
2342 | msg->msg_flags |= MSG_TRUNC; | 2340 | msg->msg_flags |= MSG_TRUNC; |
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index 0c741cec4d0d..713671ae45af 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
@@ -65,12 +65,27 @@ static struct list_head family_ht[GENL_FAM_TAB_SIZE]; | |||
65 | * To avoid an allocation at boot of just one unsigned long, | 65 | * To avoid an allocation at boot of just one unsigned long, |
66 | * declare it global instead. | 66 | * declare it global instead. |
67 | * Bit 0 is marked as already used since group 0 is invalid. | 67 | * Bit 0 is marked as already used since group 0 is invalid. |
68 | * Bit 1 is marked as already used since the drop-monitor code | ||
69 | * abuses the API and thinks it can statically use group 1. | ||
70 | * That group will typically conflict with other groups that | ||
71 | * any proper users use. | ||
72 | * Bit 16 is marked as used since it's used for generic netlink | ||
73 | * and the code no longer marks pre-reserved IDs as used. | ||
74 | * Bit 17 is marked as already used since the VFS quota code | ||
75 | * also abused this API and relied on family == group ID, we | ||
76 | * cater to that by giving it a static family and group ID. | ||
77 | * Bit 18 is marked as already used since the PMCRAID driver | ||
78 | * did the same thing as the VFS quota code (maybe copied?) | ||
68 | */ | 79 | */ |
69 | static unsigned long mc_group_start = 0x1; | 80 | static unsigned long mc_group_start = 0x3 | BIT(GENL_ID_CTRL) | |
81 | BIT(GENL_ID_VFS_DQUOT) | | ||
82 | BIT(GENL_ID_PMCRAID); | ||
70 | static unsigned long *mc_groups = &mc_group_start; | 83 | static unsigned long *mc_groups = &mc_group_start; |
71 | static unsigned long mc_groups_longs = 1; | 84 | static unsigned long mc_groups_longs = 1; |
72 | 85 | ||
73 | static int genl_ctrl_event(int event, void *data); | 86 | static int genl_ctrl_event(int event, struct genl_family *family, |
87 | const struct genl_multicast_group *grp, | ||
88 | int grp_id); | ||
74 | 89 | ||
75 | static inline unsigned int genl_family_hash(unsigned int id) | 90 | static inline unsigned int genl_family_hash(unsigned int id) |
76 | { | 91 | { |
@@ -106,13 +121,13 @@ static struct genl_family *genl_family_find_byname(char *name) | |||
106 | return NULL; | 121 | return NULL; |
107 | } | 122 | } |
108 | 123 | ||
109 | static struct genl_ops *genl_get_cmd(u8 cmd, struct genl_family *family) | 124 | static const struct genl_ops *genl_get_cmd(u8 cmd, struct genl_family *family) |
110 | { | 125 | { |
111 | struct genl_ops *ops; | 126 | int i; |
112 | 127 | ||
113 | list_for_each_entry(ops, &family->ops_list, ops_list) | 128 | for (i = 0; i < family->n_ops; i++) |
114 | if (ops->cmd == cmd) | 129 | if (family->ops[i].cmd == cmd) |
115 | return ops; | 130 | return &family->ops[i]; |
116 | 131 | ||
117 | return NULL; | 132 | return NULL; |
118 | } | 133 | } |
@@ -126,7 +141,9 @@ static u16 genl_generate_id(void) | |||
126 | int i; | 141 | int i; |
127 | 142 | ||
128 | for (i = 0; i <= GENL_MAX_ID - GENL_MIN_ID; i++) { | 143 | for (i = 0; i <= GENL_MAX_ID - GENL_MIN_ID; i++) { |
129 | if (!genl_family_find_byid(id_gen_idx)) | 144 | if (id_gen_idx != GENL_ID_VFS_DQUOT && |
145 | id_gen_idx != GENL_ID_PMCRAID && | ||
146 | !genl_family_find_byid(id_gen_idx)) | ||
130 | return id_gen_idx; | 147 | return id_gen_idx; |
131 | if (++id_gen_idx > GENL_MAX_ID) | 148 | if (++id_gen_idx > GENL_MAX_ID) |
132 | id_gen_idx = GENL_MIN_ID; | 149 | id_gen_idx = GENL_MIN_ID; |
@@ -135,62 +152,113 @@ static u16 genl_generate_id(void) | |||
135 | return 0; | 152 | return 0; |
136 | } | 153 | } |
137 | 154 | ||
138 | static struct genl_multicast_group notify_grp; | 155 | static int genl_allocate_reserve_groups(int n_groups, int *first_id) |
139 | |||
140 | /** | ||
141 | * genl_register_mc_group - register a multicast group | ||
142 | * | ||
143 | * Registers the specified multicast group and notifies userspace | ||
144 | * about the new group. | ||
145 | * | ||
146 | * Returns 0 on success or a negative error code. | ||
147 | * | ||
148 | * @family: The generic netlink family the group shall be registered for. | ||
149 | * @grp: The group to register, must have a name. | ||
150 | */ | ||
151 | int genl_register_mc_group(struct genl_family *family, | ||
152 | struct genl_multicast_group *grp) | ||
153 | { | 156 | { |
154 | int id; | ||
155 | unsigned long *new_groups; | 157 | unsigned long *new_groups; |
156 | int err = 0; | 158 | int start = 0; |
159 | int i; | ||
160 | int id; | ||
161 | bool fits; | ||
162 | |||
163 | do { | ||
164 | if (start == 0) | ||
165 | id = find_first_zero_bit(mc_groups, | ||
166 | mc_groups_longs * | ||
167 | BITS_PER_LONG); | ||
168 | else | ||
169 | id = find_next_zero_bit(mc_groups, | ||
170 | mc_groups_longs * BITS_PER_LONG, | ||
171 | start); | ||
172 | |||
173 | fits = true; | ||
174 | for (i = id; | ||
175 | i < min_t(int, id + n_groups, | ||
176 | mc_groups_longs * BITS_PER_LONG); | ||
177 | i++) { | ||
178 | if (test_bit(i, mc_groups)) { | ||
179 | start = i; | ||
180 | fits = false; | ||
181 | break; | ||
182 | } | ||
183 | } | ||
157 | 184 | ||
158 | BUG_ON(grp->name[0] == '\0'); | 185 | if (id >= mc_groups_longs * BITS_PER_LONG) { |
159 | BUG_ON(memchr(grp->name, '\0', GENL_NAMSIZ) == NULL); | 186 | unsigned long new_longs = mc_groups_longs + |
187 | BITS_TO_LONGS(n_groups); | ||
188 | size_t nlen = new_longs * sizeof(unsigned long); | ||
189 | |||
190 | if (mc_groups == &mc_group_start) { | ||
191 | new_groups = kzalloc(nlen, GFP_KERNEL); | ||
192 | if (!new_groups) | ||
193 | return -ENOMEM; | ||
194 | mc_groups = new_groups; | ||
195 | *mc_groups = mc_group_start; | ||
196 | } else { | ||
197 | new_groups = krealloc(mc_groups, nlen, | ||
198 | GFP_KERNEL); | ||
199 | if (!new_groups) | ||
200 | return -ENOMEM; | ||
201 | mc_groups = new_groups; | ||
202 | for (i = 0; i < BITS_TO_LONGS(n_groups); i++) | ||
203 | mc_groups[mc_groups_longs + i] = 0; | ||
204 | } | ||
205 | mc_groups_longs = new_longs; | ||
206 | } | ||
207 | } while (!fits); | ||
160 | 208 | ||
161 | genl_lock_all(); | 209 | for (i = id; i < id + n_groups; i++) |
210 | set_bit(i, mc_groups); | ||
211 | *first_id = id; | ||
212 | return 0; | ||
213 | } | ||
162 | 214 | ||
163 | /* special-case our own group */ | 215 | static struct genl_family genl_ctrl; |
164 | if (grp == ¬ify_grp) | ||
165 | id = GENL_ID_CTRL; | ||
166 | else | ||
167 | id = find_first_zero_bit(mc_groups, | ||
168 | mc_groups_longs * BITS_PER_LONG); | ||
169 | 216 | ||
217 | static int genl_validate_assign_mc_groups(struct genl_family *family) | ||
218 | { | ||
219 | int first_id; | ||
220 | int n_groups = family->n_mcgrps; | ||
221 | int err = 0, i; | ||
222 | bool groups_allocated = false; | ||
170 | 223 | ||
171 | if (id >= mc_groups_longs * BITS_PER_LONG) { | 224 | if (!n_groups) |
172 | size_t nlen = (mc_groups_longs + 1) * sizeof(unsigned long); | 225 | return 0; |
173 | 226 | ||
174 | if (mc_groups == &mc_group_start) { | 227 | for (i = 0; i < n_groups; i++) { |
175 | new_groups = kzalloc(nlen, GFP_KERNEL); | 228 | const struct genl_multicast_group *grp = &family->mcgrps[i]; |
176 | if (!new_groups) { | 229 | |
177 | err = -ENOMEM; | 230 | if (WARN_ON(grp->name[0] == '\0')) |
178 | goto out; | 231 | return -EINVAL; |
179 | } | 232 | if (WARN_ON(memchr(grp->name, '\0', GENL_NAMSIZ) == NULL)) |
180 | mc_groups = new_groups; | 233 | return -EINVAL; |
181 | *mc_groups = mc_group_start; | 234 | } |
182 | } else { | 235 | |
183 | new_groups = krealloc(mc_groups, nlen, GFP_KERNEL); | 236 | /* special-case our own group and hacks */ |
184 | if (!new_groups) { | 237 | if (family == &genl_ctrl) { |
185 | err = -ENOMEM; | 238 | first_id = GENL_ID_CTRL; |
186 | goto out; | 239 | BUG_ON(n_groups != 1); |
187 | } | 240 | } else if (strcmp(family->name, "NET_DM") == 0) { |
188 | mc_groups = new_groups; | 241 | first_id = 1; |
189 | mc_groups[mc_groups_longs] = 0; | 242 | BUG_ON(n_groups != 1); |
190 | } | 243 | } else if (family->id == GENL_ID_VFS_DQUOT) { |
191 | mc_groups_longs++; | 244 | first_id = GENL_ID_VFS_DQUOT; |
245 | BUG_ON(n_groups != 1); | ||
246 | } else if (family->id == GENL_ID_PMCRAID) { | ||
247 | first_id = GENL_ID_PMCRAID; | ||
248 | BUG_ON(n_groups != 1); | ||
249 | } else { | ||
250 | groups_allocated = true; | ||
251 | err = genl_allocate_reserve_groups(n_groups, &first_id); | ||
252 | if (err) | ||
253 | return err; | ||
192 | } | 254 | } |
193 | 255 | ||
256 | family->mcgrp_offset = first_id; | ||
257 | |||
258 | /* if still initializing, can't and don't need to to realloc bitmaps */ | ||
259 | if (!init_net.genl_sock) | ||
260 | return 0; | ||
261 | |||
194 | if (family->netnsok) { | 262 | if (family->netnsok) { |
195 | struct net *net; | 263 | struct net *net; |
196 | 264 | ||
@@ -206,9 +274,7 @@ int genl_register_mc_group(struct genl_family *family, | |||
206 | * number of _possible_ groups has been | 274 | * number of _possible_ groups has been |
207 | * increased on some sockets which is ok. | 275 | * increased on some sockets which is ok. |
208 | */ | 276 | */ |
209 | rcu_read_unlock(); | 277 | break; |
210 | netlink_table_ungrab(); | ||
211 | goto out; | ||
212 | } | 278 | } |
213 | } | 279 | } |
214 | rcu_read_unlock(); | 280 | rcu_read_unlock(); |
@@ -216,152 +282,67 @@ int genl_register_mc_group(struct genl_family *family, | |||
216 | } else { | 282 | } else { |
217 | err = netlink_change_ngroups(init_net.genl_sock, | 283 | err = netlink_change_ngroups(init_net.genl_sock, |
218 | mc_groups_longs * BITS_PER_LONG); | 284 | mc_groups_longs * BITS_PER_LONG); |
219 | if (err) | ||
220 | goto out; | ||
221 | } | 285 | } |
222 | 286 | ||
223 | grp->id = id; | 287 | if (groups_allocated && err) { |
224 | set_bit(id, mc_groups); | 288 | for (i = 0; i < family->n_mcgrps; i++) |
225 | list_add_tail(&grp->list, &family->mcast_groups); | 289 | clear_bit(family->mcgrp_offset + i, mc_groups); |
226 | grp->family = family; | 290 | } |
227 | 291 | ||
228 | genl_ctrl_event(CTRL_CMD_NEWMCAST_GRP, grp); | ||
229 | out: | ||
230 | genl_unlock_all(); | ||
231 | return err; | 292 | return err; |
232 | } | 293 | } |
233 | EXPORT_SYMBOL(genl_register_mc_group); | ||
234 | 294 | ||
235 | static void __genl_unregister_mc_group(struct genl_family *family, | 295 | static void genl_unregister_mc_groups(struct genl_family *family) |
236 | struct genl_multicast_group *grp) | ||
237 | { | 296 | { |
238 | struct net *net; | 297 | struct net *net; |
239 | BUG_ON(grp->family != family); | 298 | int i; |
240 | 299 | ||
241 | netlink_table_grab(); | 300 | netlink_table_grab(); |
242 | rcu_read_lock(); | 301 | rcu_read_lock(); |
243 | for_each_net_rcu(net) | 302 | for_each_net_rcu(net) { |
244 | __netlink_clear_multicast_users(net->genl_sock, grp->id); | 303 | for (i = 0; i < family->n_mcgrps; i++) |
304 | __netlink_clear_multicast_users( | ||
305 | net->genl_sock, family->mcgrp_offset + i); | ||
306 | } | ||
245 | rcu_read_unlock(); | 307 | rcu_read_unlock(); |
246 | netlink_table_ungrab(); | 308 | netlink_table_ungrab(); |
247 | 309 | ||
248 | clear_bit(grp->id, mc_groups); | 310 | for (i = 0; i < family->n_mcgrps; i++) { |
249 | list_del(&grp->list); | 311 | int grp_id = family->mcgrp_offset + i; |
250 | genl_ctrl_event(CTRL_CMD_DELMCAST_GRP, grp); | ||
251 | grp->id = 0; | ||
252 | grp->family = NULL; | ||
253 | } | ||
254 | 312 | ||
255 | /** | 313 | if (grp_id != 1) |
256 | * genl_unregister_mc_group - unregister a multicast group | 314 | clear_bit(grp_id, mc_groups); |
257 | * | 315 | genl_ctrl_event(CTRL_CMD_DELMCAST_GRP, family, |
258 | * Unregisters the specified multicast group and notifies userspace | 316 | &family->mcgrps[i], grp_id); |
259 | * about it. All current listeners on the group are removed. | 317 | } |
260 | * | ||
261 | * Note: It is not necessary to unregister all multicast groups before | ||
262 | * unregistering the family, unregistering the family will cause | ||
263 | * all assigned multicast groups to be unregistered automatically. | ||
264 | * | ||
265 | * @family: Generic netlink family the group belongs to. | ||
266 | * @grp: The group to unregister, must have been registered successfully | ||
267 | * previously. | ||
268 | */ | ||
269 | void genl_unregister_mc_group(struct genl_family *family, | ||
270 | struct genl_multicast_group *grp) | ||
271 | { | ||
272 | genl_lock_all(); | ||
273 | __genl_unregister_mc_group(family, grp); | ||
274 | genl_unlock_all(); | ||
275 | } | 318 | } |
276 | EXPORT_SYMBOL(genl_unregister_mc_group); | ||
277 | 319 | ||
278 | static void genl_unregister_mc_groups(struct genl_family *family) | 320 | static int genl_validate_ops(struct genl_family *family) |
279 | { | 321 | { |
280 | struct genl_multicast_group *grp, *tmp; | 322 | const struct genl_ops *ops = family->ops; |
323 | unsigned int n_ops = family->n_ops; | ||
324 | int i, j; | ||
281 | 325 | ||
282 | list_for_each_entry_safe(grp, tmp, &family->mcast_groups, list) | 326 | if (WARN_ON(n_ops && !ops)) |
283 | __genl_unregister_mc_group(family, grp); | 327 | return -EINVAL; |
284 | } | ||
285 | |||
286 | /** | ||
287 | * genl_register_ops - register generic netlink operations | ||
288 | * @family: generic netlink family | ||
289 | * @ops: operations to be registered | ||
290 | * | ||
291 | * Registers the specified operations and assigns them to the specified | ||
292 | * family. Either a doit or dumpit callback must be specified or the | ||
293 | * operation will fail. Only one operation structure per command | ||
294 | * identifier may be registered. | ||
295 | * | ||
296 | * See include/net/genetlink.h for more documenation on the operations | ||
297 | * structure. | ||
298 | * | ||
299 | * Returns 0 on success or a negative error code. | ||
300 | */ | ||
301 | int genl_register_ops(struct genl_family *family, struct genl_ops *ops) | ||
302 | { | ||
303 | int err = -EINVAL; | ||
304 | 328 | ||
305 | if (ops->dumpit == NULL && ops->doit == NULL) | 329 | if (!n_ops) |
306 | goto errout; | 330 | return 0; |
307 | 331 | ||
308 | if (genl_get_cmd(ops->cmd, family)) { | 332 | for (i = 0; i < n_ops; i++) { |
309 | err = -EEXIST; | 333 | if (ops[i].dumpit == NULL && ops[i].doit == NULL) |
310 | goto errout; | 334 | return -EINVAL; |
335 | for (j = i + 1; j < n_ops; j++) | ||
336 | if (ops[i].cmd == ops[j].cmd) | ||
337 | return -EINVAL; | ||
311 | } | 338 | } |
312 | 339 | ||
313 | if (ops->dumpit) | 340 | /* family is not registered yet, so no locking needed */ |
314 | ops->flags |= GENL_CMD_CAP_DUMP; | 341 | family->ops = ops; |
315 | if (ops->doit) | 342 | family->n_ops = n_ops; |
316 | ops->flags |= GENL_CMD_CAP_DO; | ||
317 | if (ops->policy) | ||
318 | ops->flags |= GENL_CMD_CAP_HASPOL; | ||
319 | 343 | ||
320 | genl_lock_all(); | 344 | return 0; |
321 | list_add_tail(&ops->ops_list, &family->ops_list); | ||
322 | genl_unlock_all(); | ||
323 | |||
324 | genl_ctrl_event(CTRL_CMD_NEWOPS, ops); | ||
325 | err = 0; | ||
326 | errout: | ||
327 | return err; | ||
328 | } | ||
329 | EXPORT_SYMBOL(genl_register_ops); | ||
330 | |||
331 | /** | ||
332 | * genl_unregister_ops - unregister generic netlink operations | ||
333 | * @family: generic netlink family | ||
334 | * @ops: operations to be unregistered | ||
335 | * | ||
336 | * Unregisters the specified operations and unassigns them from the | ||
337 | * specified family. The operation blocks until the current message | ||
338 | * processing has finished and doesn't start again until the | ||
339 | * unregister process has finished. | ||
340 | * | ||
341 | * Note: It is not necessary to unregister all operations before | ||
342 | * unregistering the family, unregistering the family will cause | ||
343 | * all assigned operations to be unregistered automatically. | ||
344 | * | ||
345 | * Returns 0 on success or a negative error code. | ||
346 | */ | ||
347 | int genl_unregister_ops(struct genl_family *family, struct genl_ops *ops) | ||
348 | { | ||
349 | struct genl_ops *rc; | ||
350 | |||
351 | genl_lock_all(); | ||
352 | list_for_each_entry(rc, &family->ops_list, ops_list) { | ||
353 | if (rc == ops) { | ||
354 | list_del(&ops->ops_list); | ||
355 | genl_unlock_all(); | ||
356 | genl_ctrl_event(CTRL_CMD_DELOPS, ops); | ||
357 | return 0; | ||
358 | } | ||
359 | } | ||
360 | genl_unlock_all(); | ||
361 | |||
362 | return -ENOENT; | ||
363 | } | 345 | } |
364 | EXPORT_SYMBOL(genl_unregister_ops); | ||
365 | 346 | ||
366 | /** | 347 | /** |
367 | * __genl_register_family - register a generic netlink family | 348 | * __genl_register_family - register a generic netlink family |
@@ -372,11 +353,14 @@ EXPORT_SYMBOL(genl_unregister_ops); | |||
372 | * The family id may equal GENL_ID_GENERATE causing an unique id to | 353 | * The family id may equal GENL_ID_GENERATE causing an unique id to |
373 | * be automatically generated and assigned. | 354 | * be automatically generated and assigned. |
374 | * | 355 | * |
356 | * The family's ops array must already be assigned, you can use the | ||
357 | * genl_register_family_with_ops() helper function. | ||
358 | * | ||
375 | * Return 0 on success or a negative error code. | 359 | * Return 0 on success or a negative error code. |
376 | */ | 360 | */ |
377 | int __genl_register_family(struct genl_family *family) | 361 | int __genl_register_family(struct genl_family *family) |
378 | { | 362 | { |
379 | int err = -EINVAL; | 363 | int err = -EINVAL, i; |
380 | 364 | ||
381 | if (family->id && family->id < GENL_MIN_ID) | 365 | if (family->id && family->id < GENL_MIN_ID) |
382 | goto errout; | 366 | goto errout; |
@@ -384,8 +368,9 @@ int __genl_register_family(struct genl_family *family) | |||
384 | if (family->id > GENL_MAX_ID) | 368 | if (family->id > GENL_MAX_ID) |
385 | goto errout; | 369 | goto errout; |
386 | 370 | ||
387 | INIT_LIST_HEAD(&family->ops_list); | 371 | err = genl_validate_ops(family); |
388 | INIT_LIST_HEAD(&family->mcast_groups); | 372 | if (err) |
373 | return err; | ||
389 | 374 | ||
390 | genl_lock_all(); | 375 | genl_lock_all(); |
391 | 376 | ||
@@ -418,10 +403,18 @@ int __genl_register_family(struct genl_family *family) | |||
418 | } else | 403 | } else |
419 | family->attrbuf = NULL; | 404 | family->attrbuf = NULL; |
420 | 405 | ||
406 | err = genl_validate_assign_mc_groups(family); | ||
407 | if (err) | ||
408 | goto errout_locked; | ||
409 | |||
421 | list_add_tail(&family->family_list, genl_family_chain(family->id)); | 410 | list_add_tail(&family->family_list, genl_family_chain(family->id)); |
422 | genl_unlock_all(); | 411 | genl_unlock_all(); |
423 | 412 | ||
424 | genl_ctrl_event(CTRL_CMD_NEWFAMILY, family); | 413 | /* send all events */ |
414 | genl_ctrl_event(CTRL_CMD_NEWFAMILY, family, NULL, 0); | ||
415 | for (i = 0; i < family->n_mcgrps; i++) | ||
416 | genl_ctrl_event(CTRL_CMD_NEWMCAST_GRP, family, | ||
417 | &family->mcgrps[i], family->mcgrp_offset + i); | ||
425 | 418 | ||
426 | return 0; | 419 | return 0; |
427 | 420 | ||
@@ -433,52 +426,6 @@ errout: | |||
433 | EXPORT_SYMBOL(__genl_register_family); | 426 | EXPORT_SYMBOL(__genl_register_family); |
434 | 427 | ||
435 | /** | 428 | /** |
436 | * __genl_register_family_with_ops - register a generic netlink family | ||
437 | * @family: generic netlink family | ||
438 | * @ops: operations to be registered | ||
439 | * @n_ops: number of elements to register | ||
440 | * | ||
441 | * Registers the specified family and operations from the specified table. | ||
442 | * Only one family may be registered with the same family name or identifier. | ||
443 | * | ||
444 | * The family id may equal GENL_ID_GENERATE causing an unique id to | ||
445 | * be automatically generated and assigned. | ||
446 | * | ||
447 | * Either a doit or dumpit callback must be specified for every registered | ||
448 | * operation or the function will fail. Only one operation structure per | ||
449 | * command identifier may be registered. | ||
450 | * | ||
451 | * See include/net/genetlink.h for more documenation on the operations | ||
452 | * structure. | ||
453 | * | ||
454 | * This is equivalent to calling genl_register_family() followed by | ||
455 | * genl_register_ops() for every operation entry in the table taking | ||
456 | * care to unregister the family on error path. | ||
457 | * | ||
458 | * Return 0 on success or a negative error code. | ||
459 | */ | ||
460 | int __genl_register_family_with_ops(struct genl_family *family, | ||
461 | struct genl_ops *ops, size_t n_ops) | ||
462 | { | ||
463 | int err, i; | ||
464 | |||
465 | err = __genl_register_family(family); | ||
466 | if (err) | ||
467 | return err; | ||
468 | |||
469 | for (i = 0; i < n_ops; ++i, ++ops) { | ||
470 | err = genl_register_ops(family, ops); | ||
471 | if (err) | ||
472 | goto err_out; | ||
473 | } | ||
474 | return 0; | ||
475 | err_out: | ||
476 | genl_unregister_family(family); | ||
477 | return err; | ||
478 | } | ||
479 | EXPORT_SYMBOL(__genl_register_family_with_ops); | ||
480 | |||
481 | /** | ||
482 | * genl_unregister_family - unregister generic netlink family | 429 | * genl_unregister_family - unregister generic netlink family |
483 | * @family: generic netlink family | 430 | * @family: generic netlink family |
484 | * | 431 | * |
@@ -499,11 +446,11 @@ int genl_unregister_family(struct genl_family *family) | |||
499 | continue; | 446 | continue; |
500 | 447 | ||
501 | list_del(&rc->family_list); | 448 | list_del(&rc->family_list); |
502 | INIT_LIST_HEAD(&family->ops_list); | 449 | family->n_ops = 0; |
503 | genl_unlock_all(); | 450 | genl_unlock_all(); |
504 | 451 | ||
505 | kfree(family->attrbuf); | 452 | kfree(family->attrbuf); |
506 | genl_ctrl_event(CTRL_CMD_DELFAMILY, family); | 453 | genl_ctrl_event(CTRL_CMD_DELFAMILY, family, NULL, 0); |
507 | return 0; | 454 | return 0; |
508 | } | 455 | } |
509 | 456 | ||
@@ -546,7 +493,8 @@ EXPORT_SYMBOL(genlmsg_put); | |||
546 | 493 | ||
547 | static int genl_lock_dumpit(struct sk_buff *skb, struct netlink_callback *cb) | 494 | static int genl_lock_dumpit(struct sk_buff *skb, struct netlink_callback *cb) |
548 | { | 495 | { |
549 | struct genl_ops *ops = cb->data; | 496 | /* our ops are always const - netlink API doesn't propagate that */ |
497 | const struct genl_ops *ops = cb->data; | ||
550 | int rc; | 498 | int rc; |
551 | 499 | ||
552 | genl_lock(); | 500 | genl_lock(); |
@@ -557,7 +505,8 @@ static int genl_lock_dumpit(struct sk_buff *skb, struct netlink_callback *cb) | |||
557 | 505 | ||
558 | static int genl_lock_done(struct netlink_callback *cb) | 506 | static int genl_lock_done(struct netlink_callback *cb) |
559 | { | 507 | { |
560 | struct genl_ops *ops = cb->data; | 508 | /* our ops are always const - netlink API doesn't propagate that */ |
509 | const struct genl_ops *ops = cb->data; | ||
561 | int rc = 0; | 510 | int rc = 0; |
562 | 511 | ||
563 | if (ops->done) { | 512 | if (ops->done) { |
@@ -572,7 +521,7 @@ static int genl_family_rcv_msg(struct genl_family *family, | |||
572 | struct sk_buff *skb, | 521 | struct sk_buff *skb, |
573 | struct nlmsghdr *nlh) | 522 | struct nlmsghdr *nlh) |
574 | { | 523 | { |
575 | struct genl_ops *ops; | 524 | const struct genl_ops *ops; |
576 | struct net *net = sock_net(skb->sk); | 525 | struct net *net = sock_net(skb->sk); |
577 | struct genl_info info; | 526 | struct genl_info info; |
578 | struct genlmsghdr *hdr = nlmsg_data(nlh); | 527 | struct genlmsghdr *hdr = nlmsg_data(nlh); |
@@ -604,7 +553,8 @@ static int genl_family_rcv_msg(struct genl_family *family, | |||
604 | if (!family->parallel_ops) { | 553 | if (!family->parallel_ops) { |
605 | struct netlink_dump_control c = { | 554 | struct netlink_dump_control c = { |
606 | .module = family->module, | 555 | .module = family->module, |
607 | .data = ops, | 556 | /* we have const, but the netlink API doesn't */ |
557 | .data = (void *)ops, | ||
608 | .dump = genl_lock_dumpit, | 558 | .dump = genl_lock_dumpit, |
609 | .done = genl_lock_done, | 559 | .done = genl_lock_done, |
610 | }; | 560 | }; |
@@ -726,24 +676,32 @@ static int ctrl_fill_info(struct genl_family *family, u32 portid, u32 seq, | |||
726 | nla_put_u32(skb, CTRL_ATTR_MAXATTR, family->maxattr)) | 676 | nla_put_u32(skb, CTRL_ATTR_MAXATTR, family->maxattr)) |
727 | goto nla_put_failure; | 677 | goto nla_put_failure; |
728 | 678 | ||
729 | if (!list_empty(&family->ops_list)) { | 679 | if (family->n_ops) { |
730 | struct nlattr *nla_ops; | 680 | struct nlattr *nla_ops; |
731 | struct genl_ops *ops; | 681 | int i; |
732 | int idx = 1; | ||
733 | 682 | ||
734 | nla_ops = nla_nest_start(skb, CTRL_ATTR_OPS); | 683 | nla_ops = nla_nest_start(skb, CTRL_ATTR_OPS); |
735 | if (nla_ops == NULL) | 684 | if (nla_ops == NULL) |
736 | goto nla_put_failure; | 685 | goto nla_put_failure; |
737 | 686 | ||
738 | list_for_each_entry(ops, &family->ops_list, ops_list) { | 687 | for (i = 0; i < family->n_ops; i++) { |
739 | struct nlattr *nest; | 688 | struct nlattr *nest; |
689 | const struct genl_ops *ops = &family->ops[i]; | ||
690 | u32 op_flags = ops->flags; | ||
740 | 691 | ||
741 | nest = nla_nest_start(skb, idx++); | 692 | if (ops->dumpit) |
693 | op_flags |= GENL_CMD_CAP_DUMP; | ||
694 | if (ops->doit) | ||
695 | op_flags |= GENL_CMD_CAP_DO; | ||
696 | if (ops->policy) | ||
697 | op_flags |= GENL_CMD_CAP_HASPOL; | ||
698 | |||
699 | nest = nla_nest_start(skb, i + 1); | ||
742 | if (nest == NULL) | 700 | if (nest == NULL) |
743 | goto nla_put_failure; | 701 | goto nla_put_failure; |
744 | 702 | ||
745 | if (nla_put_u32(skb, CTRL_ATTR_OP_ID, ops->cmd) || | 703 | if (nla_put_u32(skb, CTRL_ATTR_OP_ID, ops->cmd) || |
746 | nla_put_u32(skb, CTRL_ATTR_OP_FLAGS, ops->flags)) | 704 | nla_put_u32(skb, CTRL_ATTR_OP_FLAGS, op_flags)) |
747 | goto nla_put_failure; | 705 | goto nla_put_failure; |
748 | 706 | ||
749 | nla_nest_end(skb, nest); | 707 | nla_nest_end(skb, nest); |
@@ -752,23 +710,26 @@ static int ctrl_fill_info(struct genl_family *family, u32 portid, u32 seq, | |||
752 | nla_nest_end(skb, nla_ops); | 710 | nla_nest_end(skb, nla_ops); |
753 | } | 711 | } |
754 | 712 | ||
755 | if (!list_empty(&family->mcast_groups)) { | 713 | if (family->n_mcgrps) { |
756 | struct genl_multicast_group *grp; | ||
757 | struct nlattr *nla_grps; | 714 | struct nlattr *nla_grps; |
758 | int idx = 1; | 715 | int i; |
759 | 716 | ||
760 | nla_grps = nla_nest_start(skb, CTRL_ATTR_MCAST_GROUPS); | 717 | nla_grps = nla_nest_start(skb, CTRL_ATTR_MCAST_GROUPS); |
761 | if (nla_grps == NULL) | 718 | if (nla_grps == NULL) |
762 | goto nla_put_failure; | 719 | goto nla_put_failure; |
763 | 720 | ||
764 | list_for_each_entry(grp, &family->mcast_groups, list) { | 721 | for (i = 0; i < family->n_mcgrps; i++) { |
765 | struct nlattr *nest; | 722 | struct nlattr *nest; |
723 | const struct genl_multicast_group *grp; | ||
724 | |||
725 | grp = &family->mcgrps[i]; | ||
766 | 726 | ||
767 | nest = nla_nest_start(skb, idx++); | 727 | nest = nla_nest_start(skb, i + 1); |
768 | if (nest == NULL) | 728 | if (nest == NULL) |
769 | goto nla_put_failure; | 729 | goto nla_put_failure; |
770 | 730 | ||
771 | if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID, grp->id) || | 731 | if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID, |
732 | family->mcgrp_offset + i) || | ||
772 | nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME, | 733 | nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME, |
773 | grp->name)) | 734 | grp->name)) |
774 | goto nla_put_failure; | 735 | goto nla_put_failure; |
@@ -785,9 +746,10 @@ nla_put_failure: | |||
785 | return -EMSGSIZE; | 746 | return -EMSGSIZE; |
786 | } | 747 | } |
787 | 748 | ||
788 | static int ctrl_fill_mcgrp_info(struct genl_multicast_group *grp, u32 portid, | 749 | static int ctrl_fill_mcgrp_info(struct genl_family *family, |
789 | u32 seq, u32 flags, struct sk_buff *skb, | 750 | const struct genl_multicast_group *grp, |
790 | u8 cmd) | 751 | int grp_id, u32 portid, u32 seq, u32 flags, |
752 | struct sk_buff *skb, u8 cmd) | ||
791 | { | 753 | { |
792 | void *hdr; | 754 | void *hdr; |
793 | struct nlattr *nla_grps; | 755 | struct nlattr *nla_grps; |
@@ -797,8 +759,8 @@ static int ctrl_fill_mcgrp_info(struct genl_multicast_group *grp, u32 portid, | |||
797 | if (hdr == NULL) | 759 | if (hdr == NULL) |
798 | return -1; | 760 | return -1; |
799 | 761 | ||
800 | if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, grp->family->name) || | 762 | if (nla_put_string(skb, CTRL_ATTR_FAMILY_NAME, family->name) || |
801 | nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, grp->family->id)) | 763 | nla_put_u16(skb, CTRL_ATTR_FAMILY_ID, family->id)) |
802 | goto nla_put_failure; | 764 | goto nla_put_failure; |
803 | 765 | ||
804 | nla_grps = nla_nest_start(skb, CTRL_ATTR_MCAST_GROUPS); | 766 | nla_grps = nla_nest_start(skb, CTRL_ATTR_MCAST_GROUPS); |
@@ -809,7 +771,7 @@ static int ctrl_fill_mcgrp_info(struct genl_multicast_group *grp, u32 portid, | |||
809 | if (nest == NULL) | 771 | if (nest == NULL) |
810 | goto nla_put_failure; | 772 | goto nla_put_failure; |
811 | 773 | ||
812 | if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID, grp->id) || | 774 | if (nla_put_u32(skb, CTRL_ATTR_MCAST_GRP_ID, grp_id) || |
813 | nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME, | 775 | nla_put_string(skb, CTRL_ATTR_MCAST_GRP_NAME, |
814 | grp->name)) | 776 | grp->name)) |
815 | goto nla_put_failure; | 777 | goto nla_put_failure; |
@@ -875,8 +837,10 @@ static struct sk_buff *ctrl_build_family_msg(struct genl_family *family, | |||
875 | return skb; | 837 | return skb; |
876 | } | 838 | } |
877 | 839 | ||
878 | static struct sk_buff *ctrl_build_mcgrp_msg(struct genl_multicast_group *grp, | 840 | static struct sk_buff * |
879 | u32 portid, int seq, u8 cmd) | 841 | ctrl_build_mcgrp_msg(struct genl_family *family, |
842 | const struct genl_multicast_group *grp, | ||
843 | int grp_id, u32 portid, int seq, u8 cmd) | ||
880 | { | 844 | { |
881 | struct sk_buff *skb; | 845 | struct sk_buff *skb; |
882 | int err; | 846 | int err; |
@@ -885,7 +849,8 @@ static struct sk_buff *ctrl_build_mcgrp_msg(struct genl_multicast_group *grp, | |||
885 | if (skb == NULL) | 849 | if (skb == NULL) |
886 | return ERR_PTR(-ENOBUFS); | 850 | return ERR_PTR(-ENOBUFS); |
887 | 851 | ||
888 | err = ctrl_fill_mcgrp_info(grp, portid, seq, 0, skb, cmd); | 852 | err = ctrl_fill_mcgrp_info(family, grp, grp_id, portid, |
853 | seq, 0, skb, cmd); | ||
889 | if (err < 0) { | 854 | if (err < 0) { |
890 | nlmsg_free(skb); | 855 | nlmsg_free(skb); |
891 | return ERR_PTR(err); | 856 | return ERR_PTR(err); |
@@ -947,11 +912,11 @@ static int ctrl_getfamily(struct sk_buff *skb, struct genl_info *info) | |||
947 | return genlmsg_reply(msg, info); | 912 | return genlmsg_reply(msg, info); |
948 | } | 913 | } |
949 | 914 | ||
950 | static int genl_ctrl_event(int event, void *data) | 915 | static int genl_ctrl_event(int event, struct genl_family *family, |
916 | const struct genl_multicast_group *grp, | ||
917 | int grp_id) | ||
951 | { | 918 | { |
952 | struct sk_buff *msg; | 919 | struct sk_buff *msg; |
953 | struct genl_family *family; | ||
954 | struct genl_multicast_group *grp; | ||
955 | 920 | ||
956 | /* genl is still initialising */ | 921 | /* genl is still initialising */ |
957 | if (!init_net.genl_sock) | 922 | if (!init_net.genl_sock) |
@@ -960,14 +925,13 @@ static int genl_ctrl_event(int event, void *data) | |||
960 | switch (event) { | 925 | switch (event) { |
961 | case CTRL_CMD_NEWFAMILY: | 926 | case CTRL_CMD_NEWFAMILY: |
962 | case CTRL_CMD_DELFAMILY: | 927 | case CTRL_CMD_DELFAMILY: |
963 | family = data; | 928 | WARN_ON(grp); |
964 | msg = ctrl_build_family_msg(family, 0, 0, event); | 929 | msg = ctrl_build_family_msg(family, 0, 0, event); |
965 | break; | 930 | break; |
966 | case CTRL_CMD_NEWMCAST_GRP: | 931 | case CTRL_CMD_NEWMCAST_GRP: |
967 | case CTRL_CMD_DELMCAST_GRP: | 932 | case CTRL_CMD_DELMCAST_GRP: |
968 | grp = data; | 933 | BUG_ON(!grp); |
969 | family = grp->family; | 934 | msg = ctrl_build_mcgrp_msg(family, grp, grp_id, 0, 0, event); |
970 | msg = ctrl_build_mcgrp_msg(data, 0, 0, event); | ||
971 | break; | 935 | break; |
972 | default: | 936 | default: |
973 | return -EINVAL; | 937 | return -EINVAL; |
@@ -977,26 +941,29 @@ static int genl_ctrl_event(int event, void *data) | |||
977 | return PTR_ERR(msg); | 941 | return PTR_ERR(msg); |
978 | 942 | ||
979 | if (!family->netnsok) { | 943 | if (!family->netnsok) { |
980 | genlmsg_multicast_netns(&init_net, msg, 0, | 944 | genlmsg_multicast_netns(&genl_ctrl, &init_net, msg, 0, |
981 | GENL_ID_CTRL, GFP_KERNEL); | 945 | 0, GFP_KERNEL); |
982 | } else { | 946 | } else { |
983 | rcu_read_lock(); | 947 | rcu_read_lock(); |
984 | genlmsg_multicast_allns(msg, 0, GENL_ID_CTRL, GFP_ATOMIC); | 948 | genlmsg_multicast_allns(&genl_ctrl, msg, 0, |
949 | 0, GFP_ATOMIC); | ||
985 | rcu_read_unlock(); | 950 | rcu_read_unlock(); |
986 | } | 951 | } |
987 | 952 | ||
988 | return 0; | 953 | return 0; |
989 | } | 954 | } |
990 | 955 | ||
991 | static struct genl_ops genl_ctrl_ops = { | 956 | static struct genl_ops genl_ctrl_ops[] = { |
992 | .cmd = CTRL_CMD_GETFAMILY, | 957 | { |
993 | .doit = ctrl_getfamily, | 958 | .cmd = CTRL_CMD_GETFAMILY, |
994 | .dumpit = ctrl_dumpfamily, | 959 | .doit = ctrl_getfamily, |
995 | .policy = ctrl_policy, | 960 | .dumpit = ctrl_dumpfamily, |
961 | .policy = ctrl_policy, | ||
962 | }, | ||
996 | }; | 963 | }; |
997 | 964 | ||
998 | static struct genl_multicast_group notify_grp = { | 965 | static struct genl_multicast_group genl_ctrl_groups[] = { |
999 | .name = "notify", | 966 | { .name = "notify", }, |
1000 | }; | 967 | }; |
1001 | 968 | ||
1002 | static int __net_init genl_pernet_init(struct net *net) | 969 | static int __net_init genl_pernet_init(struct net *net) |
@@ -1036,7 +1003,8 @@ static int __init genl_init(void) | |||
1036 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) | 1003 | for (i = 0; i < GENL_FAM_TAB_SIZE; i++) |
1037 | INIT_LIST_HEAD(&family_ht[i]); | 1004 | INIT_LIST_HEAD(&family_ht[i]); |
1038 | 1005 | ||
1039 | err = genl_register_family_with_ops(&genl_ctrl, &genl_ctrl_ops, 1); | 1006 | err = genl_register_family_with_ops_groups(&genl_ctrl, genl_ctrl_ops, |
1007 | genl_ctrl_groups); | ||
1040 | if (err < 0) | 1008 | if (err < 0) |
1041 | goto problem; | 1009 | goto problem; |
1042 | 1010 | ||
@@ -1044,10 +1012,6 @@ static int __init genl_init(void) | |||
1044 | if (err) | 1012 | if (err) |
1045 | goto problem; | 1013 | goto problem; |
1046 | 1014 | ||
1047 | err = genl_register_mc_group(&genl_ctrl, ¬ify_grp); | ||
1048 | if (err < 0) | ||
1049 | goto problem; | ||
1050 | |||
1051 | return 0; | 1015 | return 0; |
1052 | 1016 | ||
1053 | problem: | 1017 | problem: |
@@ -1085,14 +1049,18 @@ static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group, | |||
1085 | return err; | 1049 | return err; |
1086 | } | 1050 | } |
1087 | 1051 | ||
1088 | int genlmsg_multicast_allns(struct sk_buff *skb, u32 portid, unsigned int group, | 1052 | int genlmsg_multicast_allns(struct genl_family *family, struct sk_buff *skb, |
1089 | gfp_t flags) | 1053 | u32 portid, unsigned int group, gfp_t flags) |
1090 | { | 1054 | { |
1055 | if (WARN_ON_ONCE(group >= family->n_mcgrps)) | ||
1056 | return -EINVAL; | ||
1057 | group = family->mcgrp_offset + group; | ||
1091 | return genlmsg_mcast(skb, portid, group, flags); | 1058 | return genlmsg_mcast(skb, portid, group, flags); |
1092 | } | 1059 | } |
1093 | EXPORT_SYMBOL(genlmsg_multicast_allns); | 1060 | EXPORT_SYMBOL(genlmsg_multicast_allns); |
1094 | 1061 | ||
1095 | void genl_notify(struct sk_buff *skb, struct net *net, u32 portid, u32 group, | 1062 | void genl_notify(struct genl_family *family, |
1063 | struct sk_buff *skb, struct net *net, u32 portid, u32 group, | ||
1096 | struct nlmsghdr *nlh, gfp_t flags) | 1064 | struct nlmsghdr *nlh, gfp_t flags) |
1097 | { | 1065 | { |
1098 | struct sock *sk = net->genl_sock; | 1066 | struct sock *sk = net->genl_sock; |
@@ -1101,6 +1069,9 @@ void genl_notify(struct sk_buff *skb, struct net *net, u32 portid, u32 group, | |||
1101 | if (nlh) | 1069 | if (nlh) |
1102 | report = nlmsg_report(nlh); | 1070 | report = nlmsg_report(nlh); |
1103 | 1071 | ||
1072 | if (WARN_ON_ONCE(group >= family->n_mcgrps)) | ||
1073 | return; | ||
1074 | group = family->mcgrp_offset + group; | ||
1104 | nlmsg_notify(sk, skb, portid, group, report, flags); | 1075 | nlmsg_notify(sk, skb, portid, group, report, flags); |
1105 | } | 1076 | } |
1106 | EXPORT_SYMBOL(genl_notify); | 1077 | EXPORT_SYMBOL(genl_notify); |
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 698814bfa7ad..53c19a35fc6d 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c | |||
@@ -1179,10 +1179,9 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1179 | sax->sax25_family = AF_NETROM; | 1179 | sax->sax25_family = AF_NETROM; |
1180 | skb_copy_from_linear_data_offset(skb, 7, sax->sax25_call.ax25_call, | 1180 | skb_copy_from_linear_data_offset(skb, 7, sax->sax25_call.ax25_call, |
1181 | AX25_ADDR_LEN); | 1181 | AX25_ADDR_LEN); |
1182 | msg->msg_namelen = sizeof(*sax); | ||
1182 | } | 1183 | } |
1183 | 1184 | ||
1184 | msg->msg_namelen = sizeof(*sax); | ||
1185 | |||
1186 | skb_free_datagram(sk, skb); | 1185 | skb_free_datagram(sk, skb); |
1187 | 1186 | ||
1188 | release_sock(sk); | 1187 | release_sock(sk); |
diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index d308402b67d8..824c6056bf82 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c | |||
@@ -807,8 +807,6 @@ static int llcp_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
807 | 807 | ||
808 | pr_debug("%p %zu\n", sk, len); | 808 | pr_debug("%p %zu\n", sk, len); |
809 | 809 | ||
810 | msg->msg_namelen = 0; | ||
811 | |||
812 | lock_sock(sk); | 810 | lock_sock(sk); |
813 | 811 | ||
814 | if (sk->sk_state == LLCP_CLOSED && | 812 | if (sk->sk_state == LLCP_CLOSED && |
diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c index 84b7e3ea7b7a..a9b2342d5253 100644 --- a/net/nfc/netlink.c +++ b/net/nfc/netlink.c | |||
@@ -30,8 +30,8 @@ | |||
30 | #include "nfc.h" | 30 | #include "nfc.h" |
31 | #include "llcp.h" | 31 | #include "llcp.h" |
32 | 32 | ||
33 | static struct genl_multicast_group nfc_genl_event_mcgrp = { | 33 | static const struct genl_multicast_group nfc_genl_mcgrps[] = { |
34 | .name = NFC_GENL_MCAST_EVENT_NAME, | 34 | { .name = NFC_GENL_MCAST_EVENT_NAME, }, |
35 | }; | 35 | }; |
36 | 36 | ||
37 | static struct genl_family nfc_genl_family = { | 37 | static struct genl_family nfc_genl_family = { |
@@ -194,7 +194,7 @@ int nfc_genl_targets_found(struct nfc_dev *dev) | |||
194 | 194 | ||
195 | genlmsg_end(msg, hdr); | 195 | genlmsg_end(msg, hdr); |
196 | 196 | ||
197 | return genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_ATOMIC); | 197 | return genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC); |
198 | 198 | ||
199 | nla_put_failure: | 199 | nla_put_failure: |
200 | genlmsg_cancel(msg, hdr); | 200 | genlmsg_cancel(msg, hdr); |
@@ -223,7 +223,7 @@ int nfc_genl_target_lost(struct nfc_dev *dev, u32 target_idx) | |||
223 | 223 | ||
224 | genlmsg_end(msg, hdr); | 224 | genlmsg_end(msg, hdr); |
225 | 225 | ||
226 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | 226 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
227 | 227 | ||
228 | return 0; | 228 | return 0; |
229 | 229 | ||
@@ -255,7 +255,7 @@ int nfc_genl_tm_activated(struct nfc_dev *dev, u32 protocol) | |||
255 | 255 | ||
256 | genlmsg_end(msg, hdr); | 256 | genlmsg_end(msg, hdr); |
257 | 257 | ||
258 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | 258 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
259 | 259 | ||
260 | return 0; | 260 | return 0; |
261 | 261 | ||
@@ -285,7 +285,7 @@ int nfc_genl_tm_deactivated(struct nfc_dev *dev) | |||
285 | 285 | ||
286 | genlmsg_end(msg, hdr); | 286 | genlmsg_end(msg, hdr); |
287 | 287 | ||
288 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | 288 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
289 | 289 | ||
290 | return 0; | 290 | return 0; |
291 | 291 | ||
@@ -318,7 +318,7 @@ int nfc_genl_device_added(struct nfc_dev *dev) | |||
318 | 318 | ||
319 | genlmsg_end(msg, hdr); | 319 | genlmsg_end(msg, hdr); |
320 | 320 | ||
321 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | 321 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
322 | 322 | ||
323 | return 0; | 323 | return 0; |
324 | 324 | ||
@@ -348,7 +348,7 @@ int nfc_genl_device_removed(struct nfc_dev *dev) | |||
348 | 348 | ||
349 | genlmsg_end(msg, hdr); | 349 | genlmsg_end(msg, hdr); |
350 | 350 | ||
351 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | 351 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
352 | 352 | ||
353 | return 0; | 353 | return 0; |
354 | 354 | ||
@@ -414,7 +414,7 @@ int nfc_genl_llc_send_sdres(struct nfc_dev *dev, struct hlist_head *sdres_list) | |||
414 | 414 | ||
415 | genlmsg_end(msg, hdr); | 415 | genlmsg_end(msg, hdr); |
416 | 416 | ||
417 | return genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_ATOMIC); | 417 | return genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC); |
418 | 418 | ||
419 | nla_put_failure: | 419 | nla_put_failure: |
420 | genlmsg_cancel(msg, hdr); | 420 | genlmsg_cancel(msg, hdr); |
@@ -448,7 +448,7 @@ int nfc_genl_se_added(struct nfc_dev *dev, u32 se_idx, u16 type) | |||
448 | 448 | ||
449 | genlmsg_end(msg, hdr); | 449 | genlmsg_end(msg, hdr); |
450 | 450 | ||
451 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | 451 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
452 | 452 | ||
453 | return 0; | 453 | return 0; |
454 | 454 | ||
@@ -479,7 +479,7 @@ int nfc_genl_se_removed(struct nfc_dev *dev, u32 se_idx) | |||
479 | 479 | ||
480 | genlmsg_end(msg, hdr); | 480 | genlmsg_end(msg, hdr); |
481 | 481 | ||
482 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | 482 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
483 | 483 | ||
484 | return 0; | 484 | return 0; |
485 | 485 | ||
@@ -600,7 +600,7 @@ int nfc_genl_dep_link_up_event(struct nfc_dev *dev, u32 target_idx, | |||
600 | 600 | ||
601 | dev->dep_link_up = true; | 601 | dev->dep_link_up = true; |
602 | 602 | ||
603 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_ATOMIC); | 603 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC); |
604 | 604 | ||
605 | return 0; | 605 | return 0; |
606 | 606 | ||
@@ -632,7 +632,7 @@ int nfc_genl_dep_link_down_event(struct nfc_dev *dev) | |||
632 | 632 | ||
633 | genlmsg_end(msg, hdr); | 633 | genlmsg_end(msg, hdr); |
634 | 634 | ||
635 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_ATOMIC); | 635 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC); |
636 | 636 | ||
637 | return 0; | 637 | return 0; |
638 | 638 | ||
@@ -1137,7 +1137,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name, | |||
1137 | 1137 | ||
1138 | genlmsg_end(msg, hdr); | 1138 | genlmsg_end(msg, hdr); |
1139 | 1139 | ||
1140 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | 1140 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
1141 | 1141 | ||
1142 | return 0; | 1142 | return 0; |
1143 | 1143 | ||
@@ -1308,7 +1308,7 @@ static void se_io_cb(void *context, u8 *apdu, size_t apdu_len, int err) | |||
1308 | 1308 | ||
1309 | genlmsg_end(msg, hdr); | 1309 | genlmsg_end(msg, hdr); |
1310 | 1310 | ||
1311 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | 1311 | genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
1312 | 1312 | ||
1313 | kfree(ctx); | 1313 | kfree(ctx); |
1314 | 1314 | ||
@@ -1364,7 +1364,7 @@ static int nfc_genl_se_io(struct sk_buff *skb, struct genl_info *info) | |||
1364 | return dev->ops->se_io(dev, se_idx, apdu, apdu_len, se_io_cb, ctx); | 1364 | return dev->ops->se_io(dev, se_idx, apdu, apdu_len, se_io_cb, ctx); |
1365 | } | 1365 | } |
1366 | 1366 | ||
1367 | static struct genl_ops nfc_genl_ops[] = { | 1367 | static const struct genl_ops nfc_genl_ops[] = { |
1368 | { | 1368 | { |
1369 | .cmd = NFC_CMD_GET_DEVICE, | 1369 | .cmd = NFC_CMD_GET_DEVICE, |
1370 | .doit = nfc_genl_get_device, | 1370 | .doit = nfc_genl_get_device, |
@@ -1536,16 +1536,15 @@ int __init nfc_genl_init(void) | |||
1536 | { | 1536 | { |
1537 | int rc; | 1537 | int rc; |
1538 | 1538 | ||
1539 | rc = genl_register_family_with_ops(&nfc_genl_family, nfc_genl_ops, | 1539 | rc = genl_register_family_with_ops_groups(&nfc_genl_family, |
1540 | ARRAY_SIZE(nfc_genl_ops)); | 1540 | nfc_genl_ops, |
1541 | nfc_genl_mcgrps); | ||
1541 | if (rc) | 1542 | if (rc) |
1542 | return rc; | 1543 | return rc; |
1543 | 1544 | ||
1544 | rc = genl_register_mc_group(&nfc_genl_family, &nfc_genl_event_mcgrp); | ||
1545 | |||
1546 | netlink_register_notifier(&nl_notifier); | 1545 | netlink_register_notifier(&nl_notifier); |
1547 | 1546 | ||
1548 | return rc; | 1547 | return 0; |
1549 | } | 1548 | } |
1550 | 1549 | ||
1551 | /** | 1550 | /** |
diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c index cd958b381f96..66bcd2eb5773 100644 --- a/net/nfc/rawsock.c +++ b/net/nfc/rawsock.c | |||
@@ -244,8 +244,6 @@ static int rawsock_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
244 | if (!skb) | 244 | if (!skb) |
245 | return rc; | 245 | return rc; |
246 | 246 | ||
247 | msg->msg_namelen = 0; | ||
248 | |||
249 | copied = skb->len; | 247 | copied = skb->len; |
250 | if (len < copied) { | 248 | if (len < copied) { |
251 | msg->msg_flags |= MSG_TRUNC; | 249 | msg->msg_flags |= MSG_TRUNC; |
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 449e0776a2c0..6f5e1dd3be2d 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
@@ -61,11 +61,11 @@ | |||
61 | 61 | ||
62 | int ovs_net_id __read_mostly; | 62 | int ovs_net_id __read_mostly; |
63 | 63 | ||
64 | static void ovs_notify(struct sk_buff *skb, struct genl_info *info, | 64 | static void ovs_notify(struct genl_family *family, |
65 | struct genl_multicast_group *grp) | 65 | struct sk_buff *skb, struct genl_info *info) |
66 | { | 66 | { |
67 | genl_notify(skb, genl_info_net(info), info->snd_portid, | 67 | genl_notify(family, skb, genl_info_net(info), info->snd_portid, |
68 | grp->id, info->nlhdr, GFP_KERNEL); | 68 | 0, info->nlhdr, GFP_KERNEL); |
69 | } | 69 | } |
70 | 70 | ||
71 | /** | 71 | /** |
@@ -557,7 +557,7 @@ static const struct nla_policy packet_policy[OVS_PACKET_ATTR_MAX + 1] = { | |||
557 | [OVS_PACKET_ATTR_ACTIONS] = { .type = NLA_NESTED }, | 557 | [OVS_PACKET_ATTR_ACTIONS] = { .type = NLA_NESTED }, |
558 | }; | 558 | }; |
559 | 559 | ||
560 | static struct genl_ops dp_packet_genl_ops[] = { | 560 | static const struct genl_ops dp_packet_genl_ops[] = { |
561 | { .cmd = OVS_PACKET_CMD_EXECUTE, | 561 | { .cmd = OVS_PACKET_CMD_EXECUTE, |
562 | .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */ | 562 | .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */ |
563 | .policy = packet_policy, | 563 | .policy = packet_policy, |
@@ -877,10 +877,10 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb, struct genl_info *info) | |||
877 | ovs_unlock(); | 877 | ovs_unlock(); |
878 | 878 | ||
879 | if (!IS_ERR(reply)) | 879 | if (!IS_ERR(reply)) |
880 | ovs_notify(reply, info, &ovs_dp_flow_multicast_group); | 880 | ovs_notify(&dp_flow_genl_family, reply, info); |
881 | else | 881 | else |
882 | netlink_set_err(sock_net(skb->sk)->genl_sock, 0, | 882 | genl_set_err(&dp_flow_genl_family, sock_net(skb->sk), 0, |
883 | ovs_dp_flow_multicast_group.id, PTR_ERR(reply)); | 883 | 0, PTR_ERR(reply)); |
884 | return 0; | 884 | return 0; |
885 | 885 | ||
886 | err_flow_free: | 886 | err_flow_free: |
@@ -990,7 +990,7 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info) | |||
990 | ovs_flow_free(flow, true); | 990 | ovs_flow_free(flow, true); |
991 | ovs_unlock(); | 991 | ovs_unlock(); |
992 | 992 | ||
993 | ovs_notify(reply, info, &ovs_dp_flow_multicast_group); | 993 | ovs_notify(&dp_flow_genl_family, reply, info); |
994 | return 0; | 994 | return 0; |
995 | unlock: | 995 | unlock: |
996 | ovs_unlock(); | 996 | ovs_unlock(); |
@@ -1034,7 +1034,7 @@ static int ovs_flow_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1034 | return skb->len; | 1034 | return skb->len; |
1035 | } | 1035 | } |
1036 | 1036 | ||
1037 | static struct genl_ops dp_flow_genl_ops[] = { | 1037 | static const struct genl_ops dp_flow_genl_ops[] = { |
1038 | { .cmd = OVS_FLOW_CMD_NEW, | 1038 | { .cmd = OVS_FLOW_CMD_NEW, |
1039 | .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */ | 1039 | .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */ |
1040 | .policy = flow_policy, | 1040 | .policy = flow_policy, |
@@ -1243,7 +1243,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) | |||
1243 | 1243 | ||
1244 | ovs_unlock(); | 1244 | ovs_unlock(); |
1245 | 1245 | ||
1246 | ovs_notify(reply, info, &ovs_dp_datapath_multicast_group); | 1246 | ovs_notify(&dp_datapath_genl_family, reply, info); |
1247 | return 0; | 1247 | return 0; |
1248 | 1248 | ||
1249 | err_destroy_local_port: | 1249 | err_destroy_local_port: |
@@ -1308,7 +1308,7 @@ static int ovs_dp_cmd_del(struct sk_buff *skb, struct genl_info *info) | |||
1308 | __dp_destroy(dp); | 1308 | __dp_destroy(dp); |
1309 | ovs_unlock(); | 1309 | ovs_unlock(); |
1310 | 1310 | ||
1311 | ovs_notify(reply, info, &ovs_dp_datapath_multicast_group); | 1311 | ovs_notify(&dp_datapath_genl_family, reply, info); |
1312 | 1312 | ||
1313 | return 0; | 1313 | return 0; |
1314 | unlock: | 1314 | unlock: |
@@ -1332,14 +1332,14 @@ static int ovs_dp_cmd_set(struct sk_buff *skb, struct genl_info *info) | |||
1332 | info->snd_seq, OVS_DP_CMD_NEW); | 1332 | info->snd_seq, OVS_DP_CMD_NEW); |
1333 | if (IS_ERR(reply)) { | 1333 | if (IS_ERR(reply)) { |
1334 | err = PTR_ERR(reply); | 1334 | err = PTR_ERR(reply); |
1335 | netlink_set_err(sock_net(skb->sk)->genl_sock, 0, | 1335 | genl_set_err(&dp_datapath_genl_family, sock_net(skb->sk), 0, |
1336 | ovs_dp_datapath_multicast_group.id, err); | 1336 | 0, err); |
1337 | err = 0; | 1337 | err = 0; |
1338 | goto unlock; | 1338 | goto unlock; |
1339 | } | 1339 | } |
1340 | 1340 | ||
1341 | ovs_unlock(); | 1341 | ovs_unlock(); |
1342 | ovs_notify(reply, info, &ovs_dp_datapath_multicast_group); | 1342 | ovs_notify(&dp_datapath_genl_family, reply, info); |
1343 | 1343 | ||
1344 | return 0; | 1344 | return 0; |
1345 | unlock: | 1345 | unlock: |
@@ -1398,7 +1398,7 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1398 | return skb->len; | 1398 | return skb->len; |
1399 | } | 1399 | } |
1400 | 1400 | ||
1401 | static struct genl_ops dp_datapath_genl_ops[] = { | 1401 | static const struct genl_ops dp_datapath_genl_ops[] = { |
1402 | { .cmd = OVS_DP_CMD_NEW, | 1402 | { .cmd = OVS_DP_CMD_NEW, |
1403 | .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */ | 1403 | .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */ |
1404 | .policy = datapath_policy, | 1404 | .policy = datapath_policy, |
@@ -1431,7 +1431,7 @@ static const struct nla_policy vport_policy[OVS_VPORT_ATTR_MAX + 1] = { | |||
1431 | [OVS_VPORT_ATTR_OPTIONS] = { .type = NLA_NESTED }, | 1431 | [OVS_VPORT_ATTR_OPTIONS] = { .type = NLA_NESTED }, |
1432 | }; | 1432 | }; |
1433 | 1433 | ||
1434 | static struct genl_family dp_vport_genl_family = { | 1434 | struct genl_family dp_vport_genl_family = { |
1435 | .id = GENL_ID_GENERATE, | 1435 | .id = GENL_ID_GENERATE, |
1436 | .hdrsize = sizeof(struct ovs_header), | 1436 | .hdrsize = sizeof(struct ovs_header), |
1437 | .name = OVS_VPORT_FAMILY, | 1437 | .name = OVS_VPORT_FAMILY, |
@@ -1601,7 +1601,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info) | |||
1601 | goto exit_unlock; | 1601 | goto exit_unlock; |
1602 | } | 1602 | } |
1603 | 1603 | ||
1604 | ovs_notify(reply, info, &ovs_dp_vport_multicast_group); | 1604 | ovs_notify(&dp_vport_genl_family, reply, info); |
1605 | 1605 | ||
1606 | exit_unlock: | 1606 | exit_unlock: |
1607 | ovs_unlock(); | 1607 | ovs_unlock(); |
@@ -1648,7 +1648,7 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info) | |||
1648 | BUG_ON(err < 0); | 1648 | BUG_ON(err < 0); |
1649 | 1649 | ||
1650 | ovs_unlock(); | 1650 | ovs_unlock(); |
1651 | ovs_notify(reply, info, &ovs_dp_vport_multicast_group); | 1651 | ovs_notify(&dp_vport_genl_family, reply, info); |
1652 | return 0; | 1652 | return 0; |
1653 | 1653 | ||
1654 | exit_free: | 1654 | exit_free: |
@@ -1685,7 +1685,7 @@ static int ovs_vport_cmd_del(struct sk_buff *skb, struct genl_info *info) | |||
1685 | err = 0; | 1685 | err = 0; |
1686 | ovs_dp_detach_port(vport); | 1686 | ovs_dp_detach_port(vport); |
1687 | 1687 | ||
1688 | ovs_notify(reply, info, &ovs_dp_vport_multicast_group); | 1688 | ovs_notify(&dp_vport_genl_family, reply, info); |
1689 | 1689 | ||
1690 | exit_unlock: | 1690 | exit_unlock: |
1691 | ovs_unlock(); | 1691 | ovs_unlock(); |
@@ -1759,7 +1759,7 @@ out: | |||
1759 | return skb->len; | 1759 | return skb->len; |
1760 | } | 1760 | } |
1761 | 1761 | ||
1762 | static struct genl_ops dp_vport_genl_ops[] = { | 1762 | static const struct genl_ops dp_vport_genl_ops[] = { |
1763 | { .cmd = OVS_VPORT_CMD_NEW, | 1763 | { .cmd = OVS_VPORT_CMD_NEW, |
1764 | .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */ | 1764 | .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */ |
1765 | .policy = vport_policy, | 1765 | .policy = vport_policy, |
@@ -1785,9 +1785,9 @@ static struct genl_ops dp_vport_genl_ops[] = { | |||
1785 | 1785 | ||
1786 | struct genl_family_and_ops { | 1786 | struct genl_family_and_ops { |
1787 | struct genl_family *family; | 1787 | struct genl_family *family; |
1788 | struct genl_ops *ops; | 1788 | const struct genl_ops *ops; |
1789 | int n_ops; | 1789 | int n_ops; |
1790 | struct genl_multicast_group *group; | 1790 | const struct genl_multicast_group *group; |
1791 | }; | 1791 | }; |
1792 | 1792 | ||
1793 | static const struct genl_family_and_ops dp_genl_families[] = { | 1793 | static const struct genl_family_and_ops dp_genl_families[] = { |
@@ -1823,17 +1823,14 @@ static int dp_register_genl(void) | |||
1823 | for (i = 0; i < ARRAY_SIZE(dp_genl_families); i++) { | 1823 | for (i = 0; i < ARRAY_SIZE(dp_genl_families); i++) { |
1824 | const struct genl_family_and_ops *f = &dp_genl_families[i]; | 1824 | const struct genl_family_and_ops *f = &dp_genl_families[i]; |
1825 | 1825 | ||
1826 | err = genl_register_family_with_ops(f->family, f->ops, | 1826 | f->family->ops = f->ops; |
1827 | f->n_ops); | 1827 | f->family->n_ops = f->n_ops; |
1828 | f->family->mcgrps = f->group; | ||
1829 | f->family->n_mcgrps = f->group ? 1 : 0; | ||
1830 | err = genl_register_family(f->family); | ||
1828 | if (err) | 1831 | if (err) |
1829 | goto error; | 1832 | goto error; |
1830 | n_registered++; | 1833 | n_registered++; |
1831 | |||
1832 | if (f->group) { | ||
1833 | err = genl_register_mc_group(f->family, f->group); | ||
1834 | if (err) | ||
1835 | goto error; | ||
1836 | } | ||
1837 | } | 1834 | } |
1838 | 1835 | ||
1839 | return 0; | 1836 | return 0; |
diff --git a/net/openvswitch/datapath.h b/net/openvswitch/datapath.h index d3d14a58aa91..4067ea41be28 100644 --- a/net/openvswitch/datapath.h +++ b/net/openvswitch/datapath.h | |||
@@ -177,6 +177,7 @@ static inline struct vport *ovs_vport_ovsl(const struct datapath *dp, int port_n | |||
177 | } | 177 | } |
178 | 178 | ||
179 | extern struct notifier_block ovs_dp_device_notifier; | 179 | extern struct notifier_block ovs_dp_device_notifier; |
180 | extern struct genl_family dp_vport_genl_family; | ||
180 | extern struct genl_multicast_group ovs_dp_vport_multicast_group; | 181 | extern struct genl_multicast_group ovs_dp_vport_multicast_group; |
181 | 182 | ||
182 | void ovs_dp_process_received_packet(struct vport *, struct sk_buff *); | 183 | void ovs_dp_process_received_packet(struct vport *, struct sk_buff *); |
diff --git a/net/openvswitch/dp_notify.c b/net/openvswitch/dp_notify.c index 5c2dab276109..2c631fe76be1 100644 --- a/net/openvswitch/dp_notify.c +++ b/net/openvswitch/dp_notify.c | |||
@@ -34,15 +34,14 @@ static void dp_detach_port_notify(struct vport *vport) | |||
34 | OVS_VPORT_CMD_DEL); | 34 | OVS_VPORT_CMD_DEL); |
35 | ovs_dp_detach_port(vport); | 35 | ovs_dp_detach_port(vport); |
36 | if (IS_ERR(notify)) { | 36 | if (IS_ERR(notify)) { |
37 | netlink_set_err(ovs_dp_get_net(dp)->genl_sock, 0, | 37 | genl_set_err(&dp_vport_genl_family, ovs_dp_get_net(dp), 0, |
38 | ovs_dp_vport_multicast_group.id, | 38 | 0, PTR_ERR(notify)); |
39 | PTR_ERR(notify)); | ||
40 | return; | 39 | return; |
41 | } | 40 | } |
42 | 41 | ||
43 | genlmsg_multicast_netns(ovs_dp_get_net(dp), notify, 0, | 42 | genlmsg_multicast_netns(&dp_vport_genl_family, |
44 | ovs_dp_vport_multicast_group.id, | 43 | ovs_dp_get_net(dp), notify, 0, |
45 | GFP_KERNEL); | 44 | 0, GFP_KERNEL); |
46 | } | 45 | } |
47 | 46 | ||
48 | void ovs_dp_notify_wq(struct work_struct *work) | 47 | void ovs_dp_notify_wq(struct work_struct *work) |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 2e8286b47c28..ba2548bd85bf 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -244,11 +244,15 @@ static void __fanout_link(struct sock *sk, struct packet_sock *po); | |||
244 | static void register_prot_hook(struct sock *sk) | 244 | static void register_prot_hook(struct sock *sk) |
245 | { | 245 | { |
246 | struct packet_sock *po = pkt_sk(sk); | 246 | struct packet_sock *po = pkt_sk(sk); |
247 | |||
247 | if (!po->running) { | 248 | if (!po->running) { |
248 | if (po->fanout) | 249 | if (po->fanout) { |
249 | __fanout_link(sk, po); | 250 | __fanout_link(sk, po); |
250 | else | 251 | } else { |
251 | dev_add_pack(&po->prot_hook); | 252 | dev_add_pack(&po->prot_hook); |
253 | rcu_assign_pointer(po->cached_dev, po->prot_hook.dev); | ||
254 | } | ||
255 | |||
252 | sock_hold(sk); | 256 | sock_hold(sk); |
253 | po->running = 1; | 257 | po->running = 1; |
254 | } | 258 | } |
@@ -266,10 +270,13 @@ static void __unregister_prot_hook(struct sock *sk, bool sync) | |||
266 | struct packet_sock *po = pkt_sk(sk); | 270 | struct packet_sock *po = pkt_sk(sk); |
267 | 271 | ||
268 | po->running = 0; | 272 | po->running = 0; |
269 | if (po->fanout) | 273 | if (po->fanout) { |
270 | __fanout_unlink(sk, po); | 274 | __fanout_unlink(sk, po); |
271 | else | 275 | } else { |
272 | __dev_remove_pack(&po->prot_hook); | 276 | __dev_remove_pack(&po->prot_hook); |
277 | RCU_INIT_POINTER(po->cached_dev, NULL); | ||
278 | } | ||
279 | |||
273 | __sock_put(sk); | 280 | __sock_put(sk); |
274 | 281 | ||
275 | if (sync) { | 282 | if (sync) { |
@@ -432,9 +439,9 @@ static void prb_shutdown_retire_blk_timer(struct packet_sock *po, | |||
432 | 439 | ||
433 | pkc = tx_ring ? &po->tx_ring.prb_bdqc : &po->rx_ring.prb_bdqc; | 440 | pkc = tx_ring ? &po->tx_ring.prb_bdqc : &po->rx_ring.prb_bdqc; |
434 | 441 | ||
435 | spin_lock(&rb_queue->lock); | 442 | spin_lock_bh(&rb_queue->lock); |
436 | pkc->delete_blk_timer = 1; | 443 | pkc->delete_blk_timer = 1; |
437 | spin_unlock(&rb_queue->lock); | 444 | spin_unlock_bh(&rb_queue->lock); |
438 | 445 | ||
439 | prb_del_retire_blk_timer(pkc); | 446 | prb_del_retire_blk_timer(pkc); |
440 | } | 447 | } |
@@ -2052,12 +2059,24 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb, | |||
2052 | return tp_len; | 2059 | return tp_len; |
2053 | } | 2060 | } |
2054 | 2061 | ||
2062 | static struct net_device *packet_cached_dev_get(struct packet_sock *po) | ||
2063 | { | ||
2064 | struct net_device *dev; | ||
2065 | |||
2066 | rcu_read_lock(); | ||
2067 | dev = rcu_dereference(po->cached_dev); | ||
2068 | if (dev) | ||
2069 | dev_hold(dev); | ||
2070 | rcu_read_unlock(); | ||
2071 | |||
2072 | return dev; | ||
2073 | } | ||
2074 | |||
2055 | static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | 2075 | static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) |
2056 | { | 2076 | { |
2057 | struct sk_buff *skb; | 2077 | struct sk_buff *skb; |
2058 | struct net_device *dev; | 2078 | struct net_device *dev; |
2059 | __be16 proto; | 2079 | __be16 proto; |
2060 | bool need_rls_dev = false; | ||
2061 | int err, reserve = 0; | 2080 | int err, reserve = 0; |
2062 | void *ph; | 2081 | void *ph; |
2063 | struct sockaddr_ll *saddr = (struct sockaddr_ll *)msg->msg_name; | 2082 | struct sockaddr_ll *saddr = (struct sockaddr_ll *)msg->msg_name; |
@@ -2070,7 +2089,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | |||
2070 | mutex_lock(&po->pg_vec_lock); | 2089 | mutex_lock(&po->pg_vec_lock); |
2071 | 2090 | ||
2072 | if (saddr == NULL) { | 2091 | if (saddr == NULL) { |
2073 | dev = po->prot_hook.dev; | 2092 | dev = packet_cached_dev_get(po); |
2074 | proto = po->num; | 2093 | proto = po->num; |
2075 | addr = NULL; | 2094 | addr = NULL; |
2076 | } else { | 2095 | } else { |
@@ -2084,19 +2103,17 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | |||
2084 | proto = saddr->sll_protocol; | 2103 | proto = saddr->sll_protocol; |
2085 | addr = saddr->sll_addr; | 2104 | addr = saddr->sll_addr; |
2086 | dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex); | 2105 | dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex); |
2087 | need_rls_dev = true; | ||
2088 | } | 2106 | } |
2089 | 2107 | ||
2090 | err = -ENXIO; | 2108 | err = -ENXIO; |
2091 | if (unlikely(dev == NULL)) | 2109 | if (unlikely(dev == NULL)) |
2092 | goto out; | 2110 | goto out; |
2093 | |||
2094 | reserve = dev->hard_header_len; | ||
2095 | |||
2096 | err = -ENETDOWN; | 2111 | err = -ENETDOWN; |
2097 | if (unlikely(!(dev->flags & IFF_UP))) | 2112 | if (unlikely(!(dev->flags & IFF_UP))) |
2098 | goto out_put; | 2113 | goto out_put; |
2099 | 2114 | ||
2115 | reserve = dev->hard_header_len; | ||
2116 | |||
2100 | size_max = po->tx_ring.frame_size | 2117 | size_max = po->tx_ring.frame_size |
2101 | - (po->tp_hdrlen - sizeof(struct sockaddr_ll)); | 2118 | - (po->tp_hdrlen - sizeof(struct sockaddr_ll)); |
2102 | 2119 | ||
@@ -2173,8 +2190,7 @@ out_status: | |||
2173 | __packet_set_status(po, ph, status); | 2190 | __packet_set_status(po, ph, status); |
2174 | kfree_skb(skb); | 2191 | kfree_skb(skb); |
2175 | out_put: | 2192 | out_put: |
2176 | if (need_rls_dev) | 2193 | dev_put(dev); |
2177 | dev_put(dev); | ||
2178 | out: | 2194 | out: |
2179 | mutex_unlock(&po->pg_vec_lock); | 2195 | mutex_unlock(&po->pg_vec_lock); |
2180 | return err; | 2196 | return err; |
@@ -2212,7 +2228,6 @@ static int packet_snd(struct socket *sock, | |||
2212 | struct sk_buff *skb; | 2228 | struct sk_buff *skb; |
2213 | struct net_device *dev; | 2229 | struct net_device *dev; |
2214 | __be16 proto; | 2230 | __be16 proto; |
2215 | bool need_rls_dev = false; | ||
2216 | unsigned char *addr; | 2231 | unsigned char *addr; |
2217 | int err, reserve = 0; | 2232 | int err, reserve = 0; |
2218 | struct virtio_net_hdr vnet_hdr = { 0 }; | 2233 | struct virtio_net_hdr vnet_hdr = { 0 }; |
@@ -2228,7 +2243,7 @@ static int packet_snd(struct socket *sock, | |||
2228 | */ | 2243 | */ |
2229 | 2244 | ||
2230 | if (saddr == NULL) { | 2245 | if (saddr == NULL) { |
2231 | dev = po->prot_hook.dev; | 2246 | dev = packet_cached_dev_get(po); |
2232 | proto = po->num; | 2247 | proto = po->num; |
2233 | addr = NULL; | 2248 | addr = NULL; |
2234 | } else { | 2249 | } else { |
@@ -2240,19 +2255,17 @@ static int packet_snd(struct socket *sock, | |||
2240 | proto = saddr->sll_protocol; | 2255 | proto = saddr->sll_protocol; |
2241 | addr = saddr->sll_addr; | 2256 | addr = saddr->sll_addr; |
2242 | dev = dev_get_by_index(sock_net(sk), saddr->sll_ifindex); | 2257 | dev = dev_get_by_index(sock_net(sk), saddr->sll_ifindex); |
2243 | need_rls_dev = true; | ||
2244 | } | 2258 | } |
2245 | 2259 | ||
2246 | err = -ENXIO; | 2260 | err = -ENXIO; |
2247 | if (dev == NULL) | 2261 | if (unlikely(dev == NULL)) |
2248 | goto out_unlock; | 2262 | goto out_unlock; |
2249 | if (sock->type == SOCK_RAW) | ||
2250 | reserve = dev->hard_header_len; | ||
2251 | |||
2252 | err = -ENETDOWN; | 2263 | err = -ENETDOWN; |
2253 | if (!(dev->flags & IFF_UP)) | 2264 | if (unlikely(!(dev->flags & IFF_UP))) |
2254 | goto out_unlock; | 2265 | goto out_unlock; |
2255 | 2266 | ||
2267 | if (sock->type == SOCK_RAW) | ||
2268 | reserve = dev->hard_header_len; | ||
2256 | if (po->has_vnet_hdr) { | 2269 | if (po->has_vnet_hdr) { |
2257 | vnet_hdr_len = sizeof(vnet_hdr); | 2270 | vnet_hdr_len = sizeof(vnet_hdr); |
2258 | 2271 | ||
@@ -2386,15 +2399,14 @@ static int packet_snd(struct socket *sock, | |||
2386 | if (err > 0 && (err = net_xmit_errno(err)) != 0) | 2399 | if (err > 0 && (err = net_xmit_errno(err)) != 0) |
2387 | goto out_unlock; | 2400 | goto out_unlock; |
2388 | 2401 | ||
2389 | if (need_rls_dev) | 2402 | dev_put(dev); |
2390 | dev_put(dev); | ||
2391 | 2403 | ||
2392 | return len; | 2404 | return len; |
2393 | 2405 | ||
2394 | out_free: | 2406 | out_free: |
2395 | kfree_skb(skb); | 2407 | kfree_skb(skb); |
2396 | out_unlock: | 2408 | out_unlock: |
2397 | if (dev && need_rls_dev) | 2409 | if (dev) |
2398 | dev_put(dev); | 2410 | dev_put(dev); |
2399 | out: | 2411 | out: |
2400 | return err; | 2412 | return err; |
@@ -2614,6 +2626,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol, | |||
2614 | po = pkt_sk(sk); | 2626 | po = pkt_sk(sk); |
2615 | sk->sk_family = PF_PACKET; | 2627 | sk->sk_family = PF_PACKET; |
2616 | po->num = proto; | 2628 | po->num = proto; |
2629 | RCU_INIT_POINTER(po->cached_dev, NULL); | ||
2617 | 2630 | ||
2618 | sk->sk_destruct = packet_sock_destruct; | 2631 | sk->sk_destruct = packet_sock_destruct; |
2619 | sk_refcnt_debug_inc(sk); | 2632 | sk_refcnt_debug_inc(sk); |
@@ -2660,7 +2673,6 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
2660 | struct sock *sk = sock->sk; | 2673 | struct sock *sk = sock->sk; |
2661 | struct sk_buff *skb; | 2674 | struct sk_buff *skb; |
2662 | int copied, err; | 2675 | int copied, err; |
2663 | struct sockaddr_ll *sll; | ||
2664 | int vnet_hdr_len = 0; | 2676 | int vnet_hdr_len = 0; |
2665 | 2677 | ||
2666 | err = -EINVAL; | 2678 | err = -EINVAL; |
@@ -2744,22 +2756,10 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
2744 | goto out_free; | 2756 | goto out_free; |
2745 | } | 2757 | } |
2746 | 2758 | ||
2747 | /* | 2759 | /* You lose any data beyond the buffer you gave. If it worries |
2748 | * If the address length field is there to be filled in, we fill | 2760 | * a user program they can ask the device for its MTU |
2749 | * it in now. | 2761 | * anyway. |
2750 | */ | 2762 | */ |
2751 | |||
2752 | sll = &PACKET_SKB_CB(skb)->sa.ll; | ||
2753 | if (sock->type == SOCK_PACKET) | ||
2754 | msg->msg_namelen = sizeof(struct sockaddr_pkt); | ||
2755 | else | ||
2756 | msg->msg_namelen = sll->sll_halen + offsetof(struct sockaddr_ll, sll_addr); | ||
2757 | |||
2758 | /* | ||
2759 | * You lose any data beyond the buffer you gave. If it worries a | ||
2760 | * user program they can ask the device for its MTU anyway. | ||
2761 | */ | ||
2762 | |||
2763 | copied = skb->len; | 2763 | copied = skb->len; |
2764 | if (copied > len) { | 2764 | if (copied > len) { |
2765 | copied = len; | 2765 | copied = len; |
@@ -2772,9 +2772,20 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
2772 | 2772 | ||
2773 | sock_recv_ts_and_drops(msg, sk, skb); | 2773 | sock_recv_ts_and_drops(msg, sk, skb); |
2774 | 2774 | ||
2775 | if (msg->msg_name) | 2775 | if (msg->msg_name) { |
2776 | /* If the address length field is there to be filled | ||
2777 | * in, we fill it in now. | ||
2778 | */ | ||
2779 | if (sock->type == SOCK_PACKET) { | ||
2780 | msg->msg_namelen = sizeof(struct sockaddr_pkt); | ||
2781 | } else { | ||
2782 | struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; | ||
2783 | msg->msg_namelen = sll->sll_halen + | ||
2784 | offsetof(struct sockaddr_ll, sll_addr); | ||
2785 | } | ||
2776 | memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, | 2786 | memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, |
2777 | msg->msg_namelen); | 2787 | msg->msg_namelen); |
2788 | } | ||
2778 | 2789 | ||
2779 | if (pkt_sk(sk)->auxdata) { | 2790 | if (pkt_sk(sk)->auxdata) { |
2780 | struct tpacket_auxdata aux; | 2791 | struct tpacket_auxdata aux; |
diff --git a/net/packet/internal.h b/net/packet/internal.h index c4e4b4561207..1035fa2d909c 100644 --- a/net/packet/internal.h +++ b/net/packet/internal.h | |||
@@ -113,6 +113,7 @@ struct packet_sock { | |||
113 | unsigned int tp_loss:1; | 113 | unsigned int tp_loss:1; |
114 | unsigned int tp_tx_has_off:1; | 114 | unsigned int tp_tx_has_off:1; |
115 | unsigned int tp_tstamp; | 115 | unsigned int tp_tstamp; |
116 | struct net_device __rcu *cached_dev; | ||
116 | struct packet_type prot_hook ____cacheline_aligned_in_smp; | 117 | struct packet_type prot_hook ____cacheline_aligned_in_smp; |
117 | }; | 118 | }; |
118 | 119 | ||
diff --git a/net/phonet/datagram.c b/net/phonet/datagram.c index 12c30f3e643e..38946b26e471 100644 --- a/net/phonet/datagram.c +++ b/net/phonet/datagram.c | |||
@@ -139,9 +139,6 @@ static int pn_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
139 | MSG_CMSG_COMPAT)) | 139 | MSG_CMSG_COMPAT)) |
140 | goto out_nofree; | 140 | goto out_nofree; |
141 | 141 | ||
142 | if (addr_len) | ||
143 | *addr_len = sizeof(sa); | ||
144 | |||
145 | skb = skb_recv_datagram(sk, flags, noblock, &rval); | 142 | skb = skb_recv_datagram(sk, flags, noblock, &rval); |
146 | if (skb == NULL) | 143 | if (skb == NULL) |
147 | goto out_nofree; | 144 | goto out_nofree; |
@@ -162,8 +159,10 @@ static int pn_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
162 | 159 | ||
163 | rval = (flags & MSG_TRUNC) ? skb->len : copylen; | 160 | rval = (flags & MSG_TRUNC) ? skb->len : copylen; |
164 | 161 | ||
165 | if (msg->msg_name != NULL) | 162 | if (msg->msg_name != NULL) { |
166 | memcpy(msg->msg_name, &sa, sizeof(struct sockaddr_pn)); | 163 | memcpy(msg->msg_name, &sa, sizeof(sa)); |
164 | *addr_len = sizeof(sa); | ||
165 | } | ||
167 | 166 | ||
168 | out: | 167 | out: |
169 | skb_free_datagram(sk, skb); | 168 | skb_free_datagram(sk, skb); |
diff --git a/net/phonet/socket.c b/net/phonet/socket.c index 77e38f733496..008214a3d5eb 100644 --- a/net/phonet/socket.c +++ b/net/phonet/socket.c | |||
@@ -595,26 +595,25 @@ static void pn_sock_seq_stop(struct seq_file *seq, void *v) | |||
595 | 595 | ||
596 | static int pn_sock_seq_show(struct seq_file *seq, void *v) | 596 | static int pn_sock_seq_show(struct seq_file *seq, void *v) |
597 | { | 597 | { |
598 | int len; | 598 | seq_setwidth(seq, 127); |
599 | |||
600 | if (v == SEQ_START_TOKEN) | 599 | if (v == SEQ_START_TOKEN) |
601 | seq_printf(seq, "%s%n", "pt loc rem rs st tx_queue rx_queue " | 600 | seq_puts(seq, "pt loc rem rs st tx_queue rx_queue " |
602 | " uid inode ref pointer drops", &len); | 601 | " uid inode ref pointer drops"); |
603 | else { | 602 | else { |
604 | struct sock *sk = v; | 603 | struct sock *sk = v; |
605 | struct pn_sock *pn = pn_sk(sk); | 604 | struct pn_sock *pn = pn_sk(sk); |
606 | 605 | ||
607 | seq_printf(seq, "%2d %04X:%04X:%02X %02X %08X:%08X %5d %lu " | 606 | seq_printf(seq, "%2d %04X:%04X:%02X %02X %08X:%08X %5d %lu " |
608 | "%d %pK %d%n", | 607 | "%d %pK %d", |
609 | sk->sk_protocol, pn->sobject, pn->dobject, | 608 | sk->sk_protocol, pn->sobject, pn->dobject, |
610 | pn->resource, sk->sk_state, | 609 | pn->resource, sk->sk_state, |
611 | sk_wmem_alloc_get(sk), sk_rmem_alloc_get(sk), | 610 | sk_wmem_alloc_get(sk), sk_rmem_alloc_get(sk), |
612 | from_kuid_munged(seq_user_ns(seq), sock_i_uid(sk)), | 611 | from_kuid_munged(seq_user_ns(seq), sock_i_uid(sk)), |
613 | sock_i_ino(sk), | 612 | sock_i_ino(sk), |
614 | atomic_read(&sk->sk_refcnt), sk, | 613 | atomic_read(&sk->sk_refcnt), sk, |
615 | atomic_read(&sk->sk_drops), &len); | 614 | atomic_read(&sk->sk_drops)); |
616 | } | 615 | } |
617 | seq_printf(seq, "%*s\n", 127 - len, ""); | 616 | seq_pad(seq, '\n'); |
618 | return 0; | 617 | return 0; |
619 | } | 618 | } |
620 | 619 | ||
@@ -785,20 +784,19 @@ static void pn_res_seq_stop(struct seq_file *seq, void *v) | |||
785 | 784 | ||
786 | static int pn_res_seq_show(struct seq_file *seq, void *v) | 785 | static int pn_res_seq_show(struct seq_file *seq, void *v) |
787 | { | 786 | { |
788 | int len; | 787 | seq_setwidth(seq, 63); |
789 | |||
790 | if (v == SEQ_START_TOKEN) | 788 | if (v == SEQ_START_TOKEN) |
791 | seq_printf(seq, "%s%n", "rs uid inode", &len); | 789 | seq_puts(seq, "rs uid inode"); |
792 | else { | 790 | else { |
793 | struct sock **psk = v; | 791 | struct sock **psk = v; |
794 | struct sock *sk = *psk; | 792 | struct sock *sk = *psk; |
795 | 793 | ||
796 | seq_printf(seq, "%02X %5u %lu%n", | 794 | seq_printf(seq, "%02X %5u %lu", |
797 | (int) (psk - pnres.sk), | 795 | (int) (psk - pnres.sk), |
798 | from_kuid_munged(seq_user_ns(seq), sock_i_uid(sk)), | 796 | from_kuid_munged(seq_user_ns(seq), sock_i_uid(sk)), |
799 | sock_i_ino(sk), &len); | 797 | sock_i_ino(sk)); |
800 | } | 798 | } |
801 | seq_printf(seq, "%*s\n", 63 - len, ""); | 799 | seq_pad(seq, '\n'); |
802 | return 0; | 800 | return 0; |
803 | } | 801 | } |
804 | 802 | ||
diff --git a/net/rds/recv.c b/net/rds/recv.c index 9f0f17cf6bf9..de339b24ca14 100644 --- a/net/rds/recv.c +++ b/net/rds/recv.c | |||
@@ -410,8 +410,6 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | |||
410 | 410 | ||
411 | rdsdebug("size %zu flags 0x%x timeo %ld\n", size, msg_flags, timeo); | 411 | rdsdebug("size %zu flags 0x%x timeo %ld\n", size, msg_flags, timeo); |
412 | 412 | ||
413 | msg->msg_namelen = 0; | ||
414 | |||
415 | if (msg_flags & MSG_OOB) | 413 | if (msg_flags & MSG_OOB) |
416 | goto out; | 414 | goto out; |
417 | 415 | ||
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index e98fcfbe6007..33af77246bfe 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c | |||
@@ -1216,7 +1216,6 @@ static int rose_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1216 | { | 1216 | { |
1217 | struct sock *sk = sock->sk; | 1217 | struct sock *sk = sock->sk; |
1218 | struct rose_sock *rose = rose_sk(sk); | 1218 | struct rose_sock *rose = rose_sk(sk); |
1219 | struct sockaddr_rose *srose = (struct sockaddr_rose *)msg->msg_name; | ||
1220 | size_t copied; | 1219 | size_t copied; |
1221 | unsigned char *asmptr; | 1220 | unsigned char *asmptr; |
1222 | struct sk_buff *skb; | 1221 | struct sk_buff *skb; |
@@ -1252,8 +1251,11 @@ static int rose_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1252 | 1251 | ||
1253 | skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); | 1252 | skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); |
1254 | 1253 | ||
1255 | if (srose != NULL) { | 1254 | if (msg->msg_name) { |
1256 | memset(srose, 0, msg->msg_namelen); | 1255 | struct sockaddr_rose *srose; |
1256 | |||
1257 | memset(msg->msg_name, 0, sizeof(struct full_sockaddr_rose)); | ||
1258 | srose = msg->msg_name; | ||
1257 | srose->srose_family = AF_ROSE; | 1259 | srose->srose_family = AF_ROSE; |
1258 | srose->srose_addr = rose->dest_addr; | 1260 | srose->srose_addr = rose->dest_addr; |
1259 | srose->srose_call = rose->dest_call; | 1261 | srose->srose_call = rose->dest_call; |
diff --git a/net/rxrpc/ar-recvmsg.c b/net/rxrpc/ar-recvmsg.c index 4b48687c3890..898492a8d61b 100644 --- a/net/rxrpc/ar-recvmsg.c +++ b/net/rxrpc/ar-recvmsg.c | |||
@@ -143,10 +143,13 @@ int rxrpc_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
143 | 143 | ||
144 | /* copy the peer address and timestamp */ | 144 | /* copy the peer address and timestamp */ |
145 | if (!continue_call) { | 145 | if (!continue_call) { |
146 | if (msg->msg_name && msg->msg_namelen > 0) | 146 | if (msg->msg_name) { |
147 | size_t len = | ||
148 | sizeof(call->conn->trans->peer->srx); | ||
147 | memcpy(msg->msg_name, | 149 | memcpy(msg->msg_name, |
148 | &call->conn->trans->peer->srx, | 150 | &call->conn->trans->peer->srx, len); |
149 | sizeof(call->conn->trans->peer->srx)); | 151 | msg->msg_namelen = len; |
152 | } | ||
150 | sock_recv_ts_and_drops(msg, &rx->sk, skb); | 153 | sock_recv_ts_and_drops(msg, &rx->sk, skb); |
151 | } | 154 | } |
152 | 155 | ||
diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c index fdc041c57853..95d843961907 100644 --- a/net/sched/sch_fq.c +++ b/net/sched/sch_fq.c | |||
@@ -88,7 +88,7 @@ struct fq_sched_data { | |||
88 | struct fq_flow internal; /* for non classified or high prio packets */ | 88 | struct fq_flow internal; /* for non classified or high prio packets */ |
89 | u32 quantum; | 89 | u32 quantum; |
90 | u32 initial_quantum; | 90 | u32 initial_quantum; |
91 | u32 flow_default_rate;/* rate per flow : bytes per second */ | 91 | u32 flow_refill_delay; |
92 | u32 flow_max_rate; /* optional max rate per flow */ | 92 | u32 flow_max_rate; /* optional max rate per flow */ |
93 | u32 flow_plimit; /* max packets per flow */ | 93 | u32 flow_plimit; /* max packets per flow */ |
94 | struct rb_root *fq_root; | 94 | struct rb_root *fq_root; |
@@ -115,6 +115,7 @@ static struct fq_flow detached, throttled; | |||
115 | static void fq_flow_set_detached(struct fq_flow *f) | 115 | static void fq_flow_set_detached(struct fq_flow *f) |
116 | { | 116 | { |
117 | f->next = &detached; | 117 | f->next = &detached; |
118 | f->age = jiffies; | ||
118 | } | 119 | } |
119 | 120 | ||
120 | static bool fq_flow_is_detached(const struct fq_flow *f) | 121 | static bool fq_flow_is_detached(const struct fq_flow *f) |
@@ -209,21 +210,15 @@ static void fq_gc(struct fq_sched_data *q, | |||
209 | } | 210 | } |
210 | } | 211 | } |
211 | 212 | ||
212 | static const u8 prio2band[TC_PRIO_MAX + 1] = { | ||
213 | 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 | ||
214 | }; | ||
215 | |||
216 | static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q) | 213 | static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q) |
217 | { | 214 | { |
218 | struct rb_node **p, *parent; | 215 | struct rb_node **p, *parent; |
219 | struct sock *sk = skb->sk; | 216 | struct sock *sk = skb->sk; |
220 | struct rb_root *root; | 217 | struct rb_root *root; |
221 | struct fq_flow *f; | 218 | struct fq_flow *f; |
222 | int band; | ||
223 | 219 | ||
224 | /* warning: no starvation prevention... */ | 220 | /* warning: no starvation prevention... */ |
225 | band = prio2band[skb->priority & TC_PRIO_MAX]; | 221 | if (unlikely((skb->priority & TC_PRIO_MAX) == TC_PRIO_CONTROL)) |
226 | if (unlikely(band == 0)) | ||
227 | return &q->internal; | 222 | return &q->internal; |
228 | 223 | ||
229 | if (unlikely(!sk)) { | 224 | if (unlikely(!sk)) { |
@@ -373,17 +368,20 @@ static int fq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
373 | } | 368 | } |
374 | 369 | ||
375 | f->qlen++; | 370 | f->qlen++; |
376 | flow_queue_add(f, skb); | ||
377 | if (skb_is_retransmit(skb)) | 371 | if (skb_is_retransmit(skb)) |
378 | q->stat_tcp_retrans++; | 372 | q->stat_tcp_retrans++; |
379 | sch->qstats.backlog += qdisc_pkt_len(skb); | 373 | sch->qstats.backlog += qdisc_pkt_len(skb); |
380 | if (fq_flow_is_detached(f)) { | 374 | if (fq_flow_is_detached(f)) { |
381 | fq_flow_add_tail(&q->new_flows, f); | 375 | fq_flow_add_tail(&q->new_flows, f); |
382 | if (q->quantum > f->credit) | 376 | if (time_after(jiffies, f->age + q->flow_refill_delay)) |
383 | f->credit = q->quantum; | 377 | f->credit = max_t(u32, f->credit, q->quantum); |
384 | q->inactive_flows--; | 378 | q->inactive_flows--; |
385 | qdisc_unthrottled(sch); | 379 | qdisc_unthrottled(sch); |
386 | } | 380 | } |
381 | |||
382 | /* Note: this overwrites f->age */ | ||
383 | flow_queue_add(f, skb); | ||
384 | |||
387 | if (unlikely(f == &q->internal)) { | 385 | if (unlikely(f == &q->internal)) { |
388 | q->stat_internal_packets++; | 386 | q->stat_internal_packets++; |
389 | qdisc_unthrottled(sch); | 387 | qdisc_unthrottled(sch); |
@@ -461,7 +459,6 @@ begin: | |||
461 | fq_flow_add_tail(&q->old_flows, f); | 459 | fq_flow_add_tail(&q->old_flows, f); |
462 | } else { | 460 | } else { |
463 | fq_flow_set_detached(f); | 461 | fq_flow_set_detached(f); |
464 | f->age = jiffies; | ||
465 | q->inactive_flows++; | 462 | q->inactive_flows++; |
466 | } | 463 | } |
467 | goto begin; | 464 | goto begin; |
@@ -615,6 +612,7 @@ static const struct nla_policy fq_policy[TCA_FQ_MAX + 1] = { | |||
615 | [TCA_FQ_FLOW_DEFAULT_RATE] = { .type = NLA_U32 }, | 612 | [TCA_FQ_FLOW_DEFAULT_RATE] = { .type = NLA_U32 }, |
616 | [TCA_FQ_FLOW_MAX_RATE] = { .type = NLA_U32 }, | 613 | [TCA_FQ_FLOW_MAX_RATE] = { .type = NLA_U32 }, |
617 | [TCA_FQ_BUCKETS_LOG] = { .type = NLA_U32 }, | 614 | [TCA_FQ_BUCKETS_LOG] = { .type = NLA_U32 }, |
615 | [TCA_FQ_FLOW_REFILL_DELAY] = { .type = NLA_U32 }, | ||
618 | }; | 616 | }; |
619 | 617 | ||
620 | static int fq_change(struct Qdisc *sch, struct nlattr *opt) | 618 | static int fq_change(struct Qdisc *sch, struct nlattr *opt) |
@@ -656,7 +654,8 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt) | |||
656 | q->initial_quantum = nla_get_u32(tb[TCA_FQ_INITIAL_QUANTUM]); | 654 | q->initial_quantum = nla_get_u32(tb[TCA_FQ_INITIAL_QUANTUM]); |
657 | 655 | ||
658 | if (tb[TCA_FQ_FLOW_DEFAULT_RATE]) | 656 | if (tb[TCA_FQ_FLOW_DEFAULT_RATE]) |
659 | q->flow_default_rate = nla_get_u32(tb[TCA_FQ_FLOW_DEFAULT_RATE]); | 657 | pr_warn_ratelimited("sch_fq: defrate %u ignored.\n", |
658 | nla_get_u32(tb[TCA_FQ_FLOW_DEFAULT_RATE])); | ||
660 | 659 | ||
661 | if (tb[TCA_FQ_FLOW_MAX_RATE]) | 660 | if (tb[TCA_FQ_FLOW_MAX_RATE]) |
662 | q->flow_max_rate = nla_get_u32(tb[TCA_FQ_FLOW_MAX_RATE]); | 661 | q->flow_max_rate = nla_get_u32(tb[TCA_FQ_FLOW_MAX_RATE]); |
@@ -670,6 +669,12 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt) | |||
670 | err = -EINVAL; | 669 | err = -EINVAL; |
671 | } | 670 | } |
672 | 671 | ||
672 | if (tb[TCA_FQ_FLOW_REFILL_DELAY]) { | ||
673 | u32 usecs_delay = nla_get_u32(tb[TCA_FQ_FLOW_REFILL_DELAY]) ; | ||
674 | |||
675 | q->flow_refill_delay = usecs_to_jiffies(usecs_delay); | ||
676 | } | ||
677 | |||
673 | if (!err) | 678 | if (!err) |
674 | err = fq_resize(q, fq_log); | 679 | err = fq_resize(q, fq_log); |
675 | 680 | ||
@@ -705,7 +710,7 @@ static int fq_init(struct Qdisc *sch, struct nlattr *opt) | |||
705 | q->flow_plimit = 100; | 710 | q->flow_plimit = 100; |
706 | q->quantum = 2 * psched_mtu(qdisc_dev(sch)); | 711 | q->quantum = 2 * psched_mtu(qdisc_dev(sch)); |
707 | q->initial_quantum = 10 * psched_mtu(qdisc_dev(sch)); | 712 | q->initial_quantum = 10 * psched_mtu(qdisc_dev(sch)); |
708 | q->flow_default_rate = 0; | 713 | q->flow_refill_delay = msecs_to_jiffies(40); |
709 | q->flow_max_rate = ~0U; | 714 | q->flow_max_rate = ~0U; |
710 | q->rate_enable = 1; | 715 | q->rate_enable = 1; |
711 | q->new_flows.first = NULL; | 716 | q->new_flows.first = NULL; |
@@ -732,15 +737,16 @@ static int fq_dump(struct Qdisc *sch, struct sk_buff *skb) | |||
732 | if (opts == NULL) | 737 | if (opts == NULL) |
733 | goto nla_put_failure; | 738 | goto nla_put_failure; |
734 | 739 | ||
735 | /* TCA_FQ_FLOW_DEFAULT_RATE is not used anymore, | 740 | /* TCA_FQ_FLOW_DEFAULT_RATE is not used anymore */ |
736 | * do not bother giving its value | 741 | |
737 | */ | ||
738 | if (nla_put_u32(skb, TCA_FQ_PLIMIT, sch->limit) || | 742 | if (nla_put_u32(skb, TCA_FQ_PLIMIT, sch->limit) || |
739 | nla_put_u32(skb, TCA_FQ_FLOW_PLIMIT, q->flow_plimit) || | 743 | nla_put_u32(skb, TCA_FQ_FLOW_PLIMIT, q->flow_plimit) || |
740 | nla_put_u32(skb, TCA_FQ_QUANTUM, q->quantum) || | 744 | nla_put_u32(skb, TCA_FQ_QUANTUM, q->quantum) || |
741 | nla_put_u32(skb, TCA_FQ_INITIAL_QUANTUM, q->initial_quantum) || | 745 | nla_put_u32(skb, TCA_FQ_INITIAL_QUANTUM, q->initial_quantum) || |
742 | nla_put_u32(skb, TCA_FQ_RATE_ENABLE, q->rate_enable) || | 746 | nla_put_u32(skb, TCA_FQ_RATE_ENABLE, q->rate_enable) || |
743 | nla_put_u32(skb, TCA_FQ_FLOW_MAX_RATE, q->flow_max_rate) || | 747 | nla_put_u32(skb, TCA_FQ_FLOW_MAX_RATE, q->flow_max_rate) || |
748 | nla_put_u32(skb, TCA_FQ_FLOW_REFILL_DELAY, | ||
749 | jiffies_to_usecs(q->flow_refill_delay)) || | ||
744 | nla_put_u32(skb, TCA_FQ_BUCKETS_LOG, q->fq_trees_log)) | 750 | nla_put_u32(skb, TCA_FQ_BUCKETS_LOG, q->fq_trees_log)) |
745 | goto nla_put_failure; | 751 | goto nla_put_failure; |
746 | 752 | ||
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index 75c94e59a3bd..bccd52b36e97 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
@@ -215,10 +215,10 @@ static bool loss_4state(struct netem_sched_data *q) | |||
215 | if (rnd < clg->a4) { | 215 | if (rnd < clg->a4) { |
216 | clg->state = 4; | 216 | clg->state = 4; |
217 | return true; | 217 | return true; |
218 | } else if (clg->a4 < rnd && rnd < clg->a1) { | 218 | } else if (clg->a4 < rnd && rnd < clg->a1 + clg->a4) { |
219 | clg->state = 3; | 219 | clg->state = 3; |
220 | return true; | 220 | return true; |
221 | } else if (clg->a1 < rnd) | 221 | } else if (clg->a1 + clg->a4 < rnd) |
222 | clg->state = 1; | 222 | clg->state = 1; |
223 | 223 | ||
224 | break; | 224 | break; |
@@ -268,10 +268,11 @@ static bool loss_gilb_ell(struct netem_sched_data *q) | |||
268 | clg->state = 2; | 268 | clg->state = 2; |
269 | if (net_random() < clg->a4) | 269 | if (net_random() < clg->a4) |
270 | return true; | 270 | return true; |
271 | break; | ||
271 | case 2: | 272 | case 2: |
272 | if (net_random() < clg->a2) | 273 | if (net_random() < clg->a2) |
273 | clg->state = 1; | 274 | clg->state = 1; |
274 | if (clg->a3 > net_random()) | 275 | if (net_random() > clg->a3) |
275 | return true; | 276 | return true; |
276 | } | 277 | } |
277 | 278 | ||
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 68f98595819c..a6090051c5db 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <net/netlink.h> | 21 | #include <net/netlink.h> |
22 | #include <net/sch_generic.h> | 22 | #include <net/sch_generic.h> |
23 | #include <net/pkt_sched.h> | 23 | #include <net/pkt_sched.h> |
24 | #include <net/tcp.h> | ||
24 | 25 | ||
25 | 26 | ||
26 | /* Simple Token Bucket Filter. | 27 | /* Simple Token Bucket Filter. |
@@ -117,6 +118,22 @@ struct tbf_sched_data { | |||
117 | }; | 118 | }; |
118 | 119 | ||
119 | 120 | ||
121 | /* | ||
122 | * Return length of individual segments of a gso packet, | ||
123 | * including all headers (MAC, IP, TCP/UDP) | ||
124 | */ | ||
125 | static unsigned int skb_gso_seglen(const struct sk_buff *skb) | ||
126 | { | ||
127 | unsigned int hdr_len = skb_transport_header(skb) - skb_mac_header(skb); | ||
128 | const struct skb_shared_info *shinfo = skb_shinfo(skb); | ||
129 | |||
130 | if (likely(shinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6))) | ||
131 | hdr_len += tcp_hdrlen(skb); | ||
132 | else | ||
133 | hdr_len += sizeof(struct udphdr); | ||
134 | return hdr_len + shinfo->gso_size; | ||
135 | } | ||
136 | |||
120 | /* GSO packet is too big, segment it so that tbf can transmit | 137 | /* GSO packet is too big, segment it so that tbf can transmit |
121 | * each segment in time | 138 | * each segment in time |
122 | */ | 139 | */ |
@@ -136,12 +153,8 @@ static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch) | |||
136 | while (segs) { | 153 | while (segs) { |
137 | nskb = segs->next; | 154 | nskb = segs->next; |
138 | segs->next = NULL; | 155 | segs->next = NULL; |
139 | if (likely(segs->len <= q->max_size)) { | 156 | qdisc_skb_cb(segs)->pkt_len = segs->len; |
140 | qdisc_skb_cb(segs)->pkt_len = segs->len; | 157 | ret = qdisc_enqueue(segs, q->qdisc); |
141 | ret = qdisc_enqueue(segs, q->qdisc); | ||
142 | } else { | ||
143 | ret = qdisc_reshape_fail(skb, sch); | ||
144 | } | ||
145 | if (ret != NET_XMIT_SUCCESS) { | 158 | if (ret != NET_XMIT_SUCCESS) { |
146 | if (net_xmit_drop_count(ret)) | 159 | if (net_xmit_drop_count(ret)) |
147 | sch->qstats.drops++; | 160 | sch->qstats.drops++; |
@@ -163,7 +176,7 @@ static int tbf_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
163 | int ret; | 176 | int ret; |
164 | 177 | ||
165 | if (qdisc_pkt_len(skb) > q->max_size) { | 178 | if (qdisc_pkt_len(skb) > q->max_size) { |
166 | if (skb_is_gso(skb)) | 179 | if (skb_is_gso(skb) && skb_gso_seglen(skb) <= q->max_size) |
167 | return tbf_segment(skb, sch); | 180 | return tbf_segment(skb, sch); |
168 | return qdisc_reshape_fail(skb, sch); | 181 | return qdisc_reshape_fail(skb, sch); |
169 | } | 182 | } |
@@ -319,6 +332,11 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt) | |||
319 | if (max_size < 0) | 332 | if (max_size < 0) |
320 | goto done; | 333 | goto done; |
321 | 334 | ||
335 | if (max_size < psched_mtu(qdisc_dev(sch))) | ||
336 | pr_warn_ratelimited("sch_tbf: burst %u is lower than device %s mtu (%u) !\n", | ||
337 | max_size, qdisc_dev(sch)->name, | ||
338 | psched_mtu(qdisc_dev(sch))); | ||
339 | |||
322 | if (q->qdisc != &noop_qdisc) { | 340 | if (q->qdisc != &noop_qdisc) { |
323 | err = fifo_set_limit(q->qdisc, qopt->limit); | 341 | err = fifo_set_limit(q->qdisc, qopt->limit); |
324 | if (err) | 342 | if (err) |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index c9b91cb1cb0d..68a27f9796d2 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -907,8 +907,8 @@ void sctp_assoc_control_transport(struct sctp_association *asoc, | |||
907 | if (!first || t->last_time_heard > first->last_time_heard) { | 907 | if (!first || t->last_time_heard > first->last_time_heard) { |
908 | second = first; | 908 | second = first; |
909 | first = t; | 909 | first = t; |
910 | } | 910 | } else if (!second || |
911 | if (!second || t->last_time_heard > second->last_time_heard) | 911 | t->last_time_heard > second->last_time_heard) |
912 | second = t; | 912 | second = t; |
913 | } | 913 | } |
914 | 914 | ||
@@ -929,6 +929,8 @@ void sctp_assoc_control_transport(struct sctp_association *asoc, | |||
929 | first = asoc->peer.primary_path; | 929 | first = asoc->peer.primary_path; |
930 | } | 930 | } |
931 | 931 | ||
932 | if (!second) | ||
933 | second = first; | ||
932 | /* If we failed to find a usable transport, just camp on the | 934 | /* If we failed to find a usable transport, just camp on the |
933 | * primary, even if it is inactive. | 935 | * primary, even if it is inactive. |
934 | */ | 936 | */ |
diff --git a/net/sctp/objcnt.c b/net/sctp/objcnt.c index 5ea573b37648..647396baa56f 100644 --- a/net/sctp/objcnt.c +++ b/net/sctp/objcnt.c | |||
@@ -79,12 +79,13 @@ static sctp_dbg_objcnt_entry_t sctp_dbg_objcnt[] = { | |||
79 | */ | 79 | */ |
80 | static int sctp_objcnt_seq_show(struct seq_file *seq, void *v) | 80 | static int sctp_objcnt_seq_show(struct seq_file *seq, void *v) |
81 | { | 81 | { |
82 | int i, len; | 82 | int i; |
83 | 83 | ||
84 | i = (int)*(loff_t *)v; | 84 | i = (int)*(loff_t *)v; |
85 | seq_printf(seq, "%s: %d%n", sctp_dbg_objcnt[i].label, | 85 | seq_setwidth(seq, 127); |
86 | atomic_read(sctp_dbg_objcnt[i].counter), &len); | 86 | seq_printf(seq, "%s: %d", sctp_dbg_objcnt[i].label, |
87 | seq_printf(seq, "%*s\n", 127 - len, ""); | 87 | atomic_read(sctp_dbg_objcnt[i].counter)); |
88 | seq_pad(seq, '\n'); | ||
88 | return 0; | 89 | return 0; |
89 | } | 90 | } |
90 | 91 | ||
diff --git a/net/sctp/output.c b/net/sctp/output.c index e650978daf27..0e2644d0a773 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
@@ -474,10 +474,11 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
474 | * for a given destination transport address. | 474 | * for a given destination transport address. |
475 | */ | 475 | */ |
476 | 476 | ||
477 | if (!tp->rto_pending) { | 477 | if (!chunk->resent && !tp->rto_pending) { |
478 | chunk->rtt_in_progress = 1; | 478 | chunk->rtt_in_progress = 1; |
479 | tp->rto_pending = 1; | 479 | tp->rto_pending = 1; |
480 | } | 480 | } |
481 | |||
481 | has_data = 1; | 482 | has_data = 1; |
482 | } | 483 | } |
483 | 484 | ||
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index 94df75877869..f51ba985a36e 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
@@ -446,6 +446,8 @@ void sctp_retransmit_mark(struct sctp_outq *q, | |||
446 | transport->rto_pending = 0; | 446 | transport->rto_pending = 0; |
447 | } | 447 | } |
448 | 448 | ||
449 | chunk->resent = 1; | ||
450 | |||
449 | /* Move the chunk to the retransmit queue. The chunks | 451 | /* Move the chunk to the retransmit queue. The chunks |
450 | * on the retransmit queue are always kept in order. | 452 | * on the retransmit queue are always kept in order. |
451 | */ | 453 | */ |
@@ -1375,6 +1377,7 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1375 | * instance). | 1377 | * instance). |
1376 | */ | 1378 | */ |
1377 | if (!tchunk->tsn_gap_acked && | 1379 | if (!tchunk->tsn_gap_acked && |
1380 | !tchunk->resent && | ||
1378 | tchunk->rtt_in_progress) { | 1381 | tchunk->rtt_in_progress) { |
1379 | tchunk->rtt_in_progress = 0; | 1382 | tchunk->rtt_in_progress = 0; |
1380 | rtt = jiffies - tchunk->sent_at; | 1383 | rtt = jiffies - tchunk->sent_at; |
@@ -1391,7 +1394,8 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1391 | */ | 1394 | */ |
1392 | if (!tchunk->tsn_gap_acked) { | 1395 | if (!tchunk->tsn_gap_acked) { |
1393 | tchunk->tsn_gap_acked = 1; | 1396 | tchunk->tsn_gap_acked = 1; |
1394 | *highest_new_tsn_in_sack = tsn; | 1397 | if (TSN_lt(*highest_new_tsn_in_sack, tsn)) |
1398 | *highest_new_tsn_in_sack = tsn; | ||
1395 | bytes_acked += sctp_data_size(tchunk); | 1399 | bytes_acked += sctp_data_size(tchunk); |
1396 | if (!tchunk->transport) | 1400 | if (!tchunk->transport) |
1397 | migrate_bytes += sctp_data_size(tchunk); | 1401 | migrate_bytes += sctp_data_size(tchunk); |
diff --git a/net/socket.c b/net/socket.c index c226aceee65b..e83c416708af 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -221,12 +221,13 @@ static int move_addr_to_user(struct sockaddr_storage *kaddr, int klen, | |||
221 | int err; | 221 | int err; |
222 | int len; | 222 | int len; |
223 | 223 | ||
224 | BUG_ON(klen > sizeof(struct sockaddr_storage)); | ||
224 | err = get_user(len, ulen); | 225 | err = get_user(len, ulen); |
225 | if (err) | 226 | if (err) |
226 | return err; | 227 | return err; |
227 | if (len > klen) | 228 | if (len > klen) |
228 | len = klen; | 229 | len = klen; |
229 | if (len < 0 || len > sizeof(struct sockaddr_storage)) | 230 | if (len < 0) |
230 | return -EINVAL; | 231 | return -EINVAL; |
231 | if (len) { | 232 | if (len) { |
232 | if (audit_sockaddr(klen, kaddr)) | 233 | if (audit_sockaddr(klen, kaddr)) |
@@ -1840,8 +1841,10 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size, | |||
1840 | msg.msg_iov = &iov; | 1841 | msg.msg_iov = &iov; |
1841 | iov.iov_len = size; | 1842 | iov.iov_len = size; |
1842 | iov.iov_base = ubuf; | 1843 | iov.iov_base = ubuf; |
1843 | msg.msg_name = (struct sockaddr *)&address; | 1844 | /* Save some cycles and don't copy the address if not needed */ |
1844 | msg.msg_namelen = sizeof(address); | 1845 | msg.msg_name = addr ? (struct sockaddr *)&address : NULL; |
1846 | /* We assume all kernel code knows the size of sockaddr_storage */ | ||
1847 | msg.msg_namelen = 0; | ||
1845 | if (sock->file->f_flags & O_NONBLOCK) | 1848 | if (sock->file->f_flags & O_NONBLOCK) |
1846 | flags |= MSG_DONTWAIT; | 1849 | flags |= MSG_DONTWAIT; |
1847 | err = sock_recvmsg(sock, &msg, size, flags); | 1850 | err = sock_recvmsg(sock, &msg, size, flags); |
@@ -1970,7 +1973,7 @@ static int copy_msghdr_from_user(struct msghdr *kmsg, | |||
1970 | if (copy_from_user(kmsg, umsg, sizeof(struct msghdr))) | 1973 | if (copy_from_user(kmsg, umsg, sizeof(struct msghdr))) |
1971 | return -EFAULT; | 1974 | return -EFAULT; |
1972 | if (kmsg->msg_namelen > sizeof(struct sockaddr_storage)) | 1975 | if (kmsg->msg_namelen > sizeof(struct sockaddr_storage)) |
1973 | return -EINVAL; | 1976 | kmsg->msg_namelen = sizeof(struct sockaddr_storage); |
1974 | return 0; | 1977 | return 0; |
1975 | } | 1978 | } |
1976 | 1979 | ||
@@ -2221,16 +2224,14 @@ static int ___sys_recvmsg(struct socket *sock, struct msghdr __user *msg, | |||
2221 | goto out; | 2224 | goto out; |
2222 | } | 2225 | } |
2223 | 2226 | ||
2224 | /* | 2227 | /* Save the user-mode address (verify_iovec will change the |
2225 | * Save the user-mode address (verify_iovec will change the | 2228 | * kernel msghdr to use the kernel address space) |
2226 | * kernel msghdr to use the kernel address space) | ||
2227 | */ | 2229 | */ |
2228 | |||
2229 | uaddr = (__force void __user *)msg_sys->msg_name; | 2230 | uaddr = (__force void __user *)msg_sys->msg_name; |
2230 | uaddr_len = COMPAT_NAMELEN(msg); | 2231 | uaddr_len = COMPAT_NAMELEN(msg); |
2231 | if (MSG_CMSG_COMPAT & flags) { | 2232 | if (MSG_CMSG_COMPAT & flags) |
2232 | err = verify_compat_iovec(msg_sys, iov, &addr, VERIFY_WRITE); | 2233 | err = verify_compat_iovec(msg_sys, iov, &addr, VERIFY_WRITE); |
2233 | } else | 2234 | else |
2234 | err = verify_iovec(msg_sys, iov, &addr, VERIFY_WRITE); | 2235 | err = verify_iovec(msg_sys, iov, &addr, VERIFY_WRITE); |
2235 | if (err < 0) | 2236 | if (err < 0) |
2236 | goto out_freeiov; | 2237 | goto out_freeiov; |
@@ -2239,6 +2240,9 @@ static int ___sys_recvmsg(struct socket *sock, struct msghdr __user *msg, | |||
2239 | cmsg_ptr = (unsigned long)msg_sys->msg_control; | 2240 | cmsg_ptr = (unsigned long)msg_sys->msg_control; |
2240 | msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT); | 2241 | msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT); |
2241 | 2242 | ||
2243 | /* We assume all kernel code knows the size of sockaddr_storage */ | ||
2244 | msg_sys->msg_namelen = 0; | ||
2245 | |||
2242 | if (sock->file->f_flags & O_NONBLOCK) | 2246 | if (sock->file->f_flags & O_NONBLOCK) |
2243 | flags |= MSG_DONTWAIT; | 2247 | flags |= MSG_DONTWAIT; |
2244 | err = (nosec ? sock_recvmsg_nosec : sock_recvmsg)(sock, msg_sys, | 2248 | err = (nosec ? sock_recvmsg_nosec : sock_recvmsg)(sock, msg_sys, |
diff --git a/net/sunrpc/auth_gss/gss_krb5_unseal.c b/net/sunrpc/auth_gss/gss_krb5_unseal.c index 6cd930f3678f..6c981ddc19f8 100644 --- a/net/sunrpc/auth_gss/gss_krb5_unseal.c +++ b/net/sunrpc/auth_gss/gss_krb5_unseal.c | |||
@@ -150,7 +150,6 @@ gss_verify_mic_v2(struct krb5_ctx *ctx, | |||
150 | struct xdr_netobj cksumobj = {.len = sizeof(cksumdata), | 150 | struct xdr_netobj cksumobj = {.len = sizeof(cksumdata), |
151 | .data = cksumdata}; | 151 | .data = cksumdata}; |
152 | s32 now; | 152 | s32 now; |
153 | u64 seqnum; | ||
154 | u8 *ptr = read_token->data; | 153 | u8 *ptr = read_token->data; |
155 | u8 *cksumkey; | 154 | u8 *cksumkey; |
156 | u8 flags; | 155 | u8 flags; |
@@ -197,9 +196,10 @@ gss_verify_mic_v2(struct krb5_ctx *ctx, | |||
197 | if (now > ctx->endtime) | 196 | if (now > ctx->endtime) |
198 | return GSS_S_CONTEXT_EXPIRED; | 197 | return GSS_S_CONTEXT_EXPIRED; |
199 | 198 | ||
200 | /* do sequencing checks */ | 199 | /* |
201 | 200 | * NOTE: the sequence number at ptr + 8 is skipped, rpcsec_gss | |
202 | seqnum = be64_to_cpup((__be64 *)ptr + 8); | 201 | * doesn't want it checked; see page 6 of rfc 2203. |
202 | */ | ||
203 | 203 | ||
204 | return GSS_S_COMPLETE; | 204 | return GSS_S_COMPLETE; |
205 | } | 205 | } |
diff --git a/net/sunrpc/auth_gss/gss_krb5_wrap.c b/net/sunrpc/auth_gss/gss_krb5_wrap.c index 1da52d1406fc..42560e55d978 100644 --- a/net/sunrpc/auth_gss/gss_krb5_wrap.c +++ b/net/sunrpc/auth_gss/gss_krb5_wrap.c | |||
@@ -489,7 +489,6 @@ static u32 | |||
489 | gss_unwrap_kerberos_v2(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf) | 489 | gss_unwrap_kerberos_v2(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf) |
490 | { | 490 | { |
491 | s32 now; | 491 | s32 now; |
492 | u64 seqnum; | ||
493 | u8 *ptr; | 492 | u8 *ptr; |
494 | u8 flags = 0x00; | 493 | u8 flags = 0x00; |
495 | u16 ec, rrc; | 494 | u16 ec, rrc; |
@@ -525,7 +524,10 @@ gss_unwrap_kerberos_v2(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf) | |||
525 | ec = be16_to_cpup((__be16 *)(ptr + 4)); | 524 | ec = be16_to_cpup((__be16 *)(ptr + 4)); |
526 | rrc = be16_to_cpup((__be16 *)(ptr + 6)); | 525 | rrc = be16_to_cpup((__be16 *)(ptr + 6)); |
527 | 526 | ||
528 | seqnum = be64_to_cpup((__be64 *)(ptr + 8)); | 527 | /* |
528 | * NOTE: the sequence number at ptr + 8 is skipped, rpcsec_gss | ||
529 | * doesn't want it checked; see page 6 of rfc 2203. | ||
530 | */ | ||
529 | 531 | ||
530 | if (rrc != 0) | 532 | if (rrc != 0) |
531 | rotate_left(offset + 16, buf, rrc); | 533 | rotate_left(offset + 16, buf, rrc); |
@@ -574,8 +576,8 @@ gss_unwrap_kerberos_v2(struct krb5_ctx *kctx, int offset, struct xdr_buf *buf) | |||
574 | buf->head[0].iov_len -= GSS_KRB5_TOK_HDR_LEN + headskip; | 576 | buf->head[0].iov_len -= GSS_KRB5_TOK_HDR_LEN + headskip; |
575 | buf->len -= GSS_KRB5_TOK_HDR_LEN + headskip; | 577 | buf->len -= GSS_KRB5_TOK_HDR_LEN + headskip; |
576 | 578 | ||
577 | /* Trim off the checksum blob */ | 579 | /* Trim off the trailing "extra count" and checksum blob */ |
578 | xdr_buf_trim(buf, GSS_KRB5_TOK_HDR_LEN + tailskip); | 580 | xdr_buf_trim(buf, ec + GSS_KRB5_TOK_HDR_LEN + tailskip); |
579 | return GSS_S_COMPLETE; | 581 | return GSS_S_COMPLETE; |
580 | } | 582 | } |
581 | 583 | ||
diff --git a/net/sunrpc/auth_gss/gss_rpc_upcall.c b/net/sunrpc/auth_gss/gss_rpc_upcall.c index f1eb0d16666c..458f85e9b0ba 100644 --- a/net/sunrpc/auth_gss/gss_rpc_upcall.c +++ b/net/sunrpc/auth_gss/gss_rpc_upcall.c | |||
@@ -298,7 +298,8 @@ int gssp_accept_sec_context_upcall(struct net *net, | |||
298 | if (res.context_handle) { | 298 | if (res.context_handle) { |
299 | data->out_handle = rctxh.exported_context_token; | 299 | data->out_handle = rctxh.exported_context_token; |
300 | data->mech_oid.len = rctxh.mech.len; | 300 | data->mech_oid.len = rctxh.mech.len; |
301 | memcpy(data->mech_oid.data, rctxh.mech.data, | 301 | if (rctxh.mech.data) |
302 | memcpy(data->mech_oid.data, rctxh.mech.data, | ||
302 | data->mech_oid.len); | 303 | data->mech_oid.len); |
303 | client_name = rctxh.src_name.display_name; | 304 | client_name = rctxh.src_name.display_name; |
304 | } | 305 | } |
diff --git a/net/sunrpc/auth_gss/gss_rpc_xdr.c b/net/sunrpc/auth_gss/gss_rpc_xdr.c index f0f78c5f1c7d..1ec19f6f0c2b 100644 --- a/net/sunrpc/auth_gss/gss_rpc_xdr.c +++ b/net/sunrpc/auth_gss/gss_rpc_xdr.c | |||
@@ -559,6 +559,8 @@ static int gssx_enc_cred(struct xdr_stream *xdr, | |||
559 | 559 | ||
560 | /* cred->elements */ | 560 | /* cred->elements */ |
561 | err = dummy_enc_credel_array(xdr, &cred->elements); | 561 | err = dummy_enc_credel_array(xdr, &cred->elements); |
562 | if (err) | ||
563 | return err; | ||
562 | 564 | ||
563 | /* cred->cred_handle_reference */ | 565 | /* cred->cred_handle_reference */ |
564 | err = gssx_enc_buffer(xdr, &cred->cred_handle_reference); | 566 | err = gssx_enc_buffer(xdr, &cred->cred_handle_reference); |
@@ -740,22 +742,20 @@ void gssx_enc_accept_sec_context(struct rpc_rqst *req, | |||
740 | goto done; | 742 | goto done; |
741 | 743 | ||
742 | /* arg->context_handle */ | 744 | /* arg->context_handle */ |
743 | if (arg->context_handle) { | 745 | if (arg->context_handle) |
744 | err = gssx_enc_ctx(xdr, arg->context_handle); | 746 | err = gssx_enc_ctx(xdr, arg->context_handle); |
745 | if (err) | 747 | else |
746 | goto done; | ||
747 | } else { | ||
748 | err = gssx_enc_bool(xdr, 0); | 748 | err = gssx_enc_bool(xdr, 0); |
749 | } | 749 | if (err) |
750 | goto done; | ||
750 | 751 | ||
751 | /* arg->cred_handle */ | 752 | /* arg->cred_handle */ |
752 | if (arg->cred_handle) { | 753 | if (arg->cred_handle) |
753 | err = gssx_enc_cred(xdr, arg->cred_handle); | 754 | err = gssx_enc_cred(xdr, arg->cred_handle); |
754 | if (err) | 755 | else |
755 | goto done; | ||
756 | } else { | ||
757 | err = gssx_enc_bool(xdr, 0); | 756 | err = gssx_enc_bool(xdr, 0); |
758 | } | 757 | if (err) |
758 | goto done; | ||
759 | 759 | ||
760 | /* arg->input_token */ | 760 | /* arg->input_token */ |
761 | err = gssx_enc_in_token(xdr, &arg->input_token); | 761 | err = gssx_enc_in_token(xdr, &arg->input_token); |
@@ -763,13 +763,12 @@ void gssx_enc_accept_sec_context(struct rpc_rqst *req, | |||
763 | goto done; | 763 | goto done; |
764 | 764 | ||
765 | /* arg->input_cb */ | 765 | /* arg->input_cb */ |
766 | if (arg->input_cb) { | 766 | if (arg->input_cb) |
767 | err = gssx_enc_cb(xdr, arg->input_cb); | 767 | err = gssx_enc_cb(xdr, arg->input_cb); |
768 | if (err) | 768 | else |
769 | goto done; | ||
770 | } else { | ||
771 | err = gssx_enc_bool(xdr, 0); | 769 | err = gssx_enc_bool(xdr, 0); |
772 | } | 770 | if (err) |
771 | goto done; | ||
773 | 772 | ||
774 | err = gssx_enc_bool(xdr, arg->ret_deleg_cred); | 773 | err = gssx_enc_bool(xdr, arg->ret_deleg_cred); |
775 | if (err) | 774 | if (err) |
diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index 09fb638bcaa4..008cdade5aae 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c | |||
@@ -1167,8 +1167,8 @@ static int gss_proxy_save_rsc(struct cache_detail *cd, | |||
1167 | if (!ud->found_creds) { | 1167 | if (!ud->found_creds) { |
1168 | /* userspace seem buggy, we should always get at least a | 1168 | /* userspace seem buggy, we should always get at least a |
1169 | * mapping to nobody */ | 1169 | * mapping to nobody */ |
1170 | dprintk("RPC: No creds found, marking Negative!\n"); | 1170 | dprintk("RPC: No creds found!\n"); |
1171 | set_bit(CACHE_NEGATIVE, &rsci.h.flags); | 1171 | goto out; |
1172 | } else { | 1172 | } else { |
1173 | 1173 | ||
1174 | /* steal creds */ | 1174 | /* steal creds */ |
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index dab09dac8fc7..f09b7db2c492 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -750,14 +750,16 @@ EXPORT_SYMBOL_GPL(rpc_shutdown_client); | |||
750 | /* | 750 | /* |
751 | * Free an RPC client | 751 | * Free an RPC client |
752 | */ | 752 | */ |
753 | static void | 753 | static struct rpc_clnt * |
754 | rpc_free_client(struct rpc_clnt *clnt) | 754 | rpc_free_client(struct rpc_clnt *clnt) |
755 | { | 755 | { |
756 | struct rpc_clnt *parent = NULL; | ||
757 | |||
756 | dprintk_rcu("RPC: destroying %s client for %s\n", | 758 | dprintk_rcu("RPC: destroying %s client for %s\n", |
757 | clnt->cl_program->name, | 759 | clnt->cl_program->name, |
758 | rcu_dereference(clnt->cl_xprt)->servername); | 760 | rcu_dereference(clnt->cl_xprt)->servername); |
759 | if (clnt->cl_parent != clnt) | 761 | if (clnt->cl_parent != clnt) |
760 | rpc_release_client(clnt->cl_parent); | 762 | parent = clnt->cl_parent; |
761 | rpc_clnt_remove_pipedir(clnt); | 763 | rpc_clnt_remove_pipedir(clnt); |
762 | rpc_unregister_client(clnt); | 764 | rpc_unregister_client(clnt); |
763 | rpc_free_iostats(clnt->cl_metrics); | 765 | rpc_free_iostats(clnt->cl_metrics); |
@@ -766,18 +768,17 @@ rpc_free_client(struct rpc_clnt *clnt) | |||
766 | rpciod_down(); | 768 | rpciod_down(); |
767 | rpc_free_clid(clnt); | 769 | rpc_free_clid(clnt); |
768 | kfree(clnt); | 770 | kfree(clnt); |
771 | return parent; | ||
769 | } | 772 | } |
770 | 773 | ||
771 | /* | 774 | /* |
772 | * Free an RPC client | 775 | * Free an RPC client |
773 | */ | 776 | */ |
774 | static void | 777 | static struct rpc_clnt * |
775 | rpc_free_auth(struct rpc_clnt *clnt) | 778 | rpc_free_auth(struct rpc_clnt *clnt) |
776 | { | 779 | { |
777 | if (clnt->cl_auth == NULL) { | 780 | if (clnt->cl_auth == NULL) |
778 | rpc_free_client(clnt); | 781 | return rpc_free_client(clnt); |
779 | return; | ||
780 | } | ||
781 | 782 | ||
782 | /* | 783 | /* |
783 | * Note: RPCSEC_GSS may need to send NULL RPC calls in order to | 784 | * Note: RPCSEC_GSS may need to send NULL RPC calls in order to |
@@ -788,7 +789,8 @@ rpc_free_auth(struct rpc_clnt *clnt) | |||
788 | rpcauth_release(clnt->cl_auth); | 789 | rpcauth_release(clnt->cl_auth); |
789 | clnt->cl_auth = NULL; | 790 | clnt->cl_auth = NULL; |
790 | if (atomic_dec_and_test(&clnt->cl_count)) | 791 | if (atomic_dec_and_test(&clnt->cl_count)) |
791 | rpc_free_client(clnt); | 792 | return rpc_free_client(clnt); |
793 | return NULL; | ||
792 | } | 794 | } |
793 | 795 | ||
794 | /* | 796 | /* |
@@ -799,10 +801,13 @@ rpc_release_client(struct rpc_clnt *clnt) | |||
799 | { | 801 | { |
800 | dprintk("RPC: rpc_release_client(%p)\n", clnt); | 802 | dprintk("RPC: rpc_release_client(%p)\n", clnt); |
801 | 803 | ||
802 | if (list_empty(&clnt->cl_tasks)) | 804 | do { |
803 | wake_up(&destroy_wait); | 805 | if (list_empty(&clnt->cl_tasks)) |
804 | if (atomic_dec_and_test(&clnt->cl_count)) | 806 | wake_up(&destroy_wait); |
805 | rpc_free_auth(clnt); | 807 | if (!atomic_dec_and_test(&clnt->cl_count)) |
808 | break; | ||
809 | clnt = rpc_free_auth(clnt); | ||
810 | } while (clnt != NULL); | ||
806 | } | 811 | } |
807 | EXPORT_SYMBOL_GPL(rpc_release_client); | 812 | EXPORT_SYMBOL_GPL(rpc_release_client); |
808 | 813 | ||
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index d0d14a04dce1..bf04b30a788a 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
@@ -471,15 +471,6 @@ struct rpc_filelist { | |||
471 | umode_t mode; | 471 | umode_t mode; |
472 | }; | 472 | }; |
473 | 473 | ||
474 | static int rpc_delete_dentry(const struct dentry *dentry) | ||
475 | { | ||
476 | return 1; | ||
477 | } | ||
478 | |||
479 | static const struct dentry_operations rpc_dentry_operations = { | ||
480 | .d_delete = rpc_delete_dentry, | ||
481 | }; | ||
482 | |||
483 | static struct inode * | 474 | static struct inode * |
484 | rpc_get_inode(struct super_block *sb, umode_t mode) | 475 | rpc_get_inode(struct super_block *sb, umode_t mode) |
485 | { | 476 | { |
@@ -1266,7 +1257,7 @@ rpc_fill_super(struct super_block *sb, void *data, int silent) | |||
1266 | sb->s_blocksize_bits = PAGE_CACHE_SHIFT; | 1257 | sb->s_blocksize_bits = PAGE_CACHE_SHIFT; |
1267 | sb->s_magic = RPCAUTH_GSSMAGIC; | 1258 | sb->s_magic = RPCAUTH_GSSMAGIC; |
1268 | sb->s_op = &s_ops; | 1259 | sb->s_op = &s_ops; |
1269 | sb->s_d_op = &rpc_dentry_operations; | 1260 | sb->s_d_op = &simple_dentry_operations; |
1270 | sb->s_time_gran = 1; | 1261 | sb->s_time_gran = 1; |
1271 | 1262 | ||
1272 | inode = rpc_get_inode(sb, S_IFDIR | S_IRUGO | S_IXUGO); | 1263 | inode = rpc_get_inode(sb, S_IFDIR | S_IRUGO | S_IXUGO); |
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index b974571126fe..e7fbe368b4a3 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c | |||
@@ -1104,8 +1104,6 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv) | |||
1104 | rqstp->rq_vers = vers = svc_getnl(argv); /* version number */ | 1104 | rqstp->rq_vers = vers = svc_getnl(argv); /* version number */ |
1105 | rqstp->rq_proc = proc = svc_getnl(argv); /* procedure number */ | 1105 | rqstp->rq_proc = proc = svc_getnl(argv); /* procedure number */ |
1106 | 1106 | ||
1107 | progp = serv->sv_program; | ||
1108 | |||
1109 | for (progp = serv->sv_program; progp; progp = progp->pg_next) | 1107 | for (progp = serv->sv_program; progp; progp = progp->pg_next) |
1110 | if (prog == progp->pg_prog) | 1108 | if (prog == progp->pg_prog) |
1111 | break; | 1109 | break; |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 17c88928b7db..dd9d295813cf 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -393,8 +393,10 @@ static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, | |||
393 | return kernel_sendmsg(sock, &msg, NULL, 0, 0); | 393 | return kernel_sendmsg(sock, &msg, NULL, 0, 0); |
394 | } | 394 | } |
395 | 395 | ||
396 | static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more) | 396 | static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more, bool zerocopy) |
397 | { | 397 | { |
398 | ssize_t (*do_sendpage)(struct socket *sock, struct page *page, | ||
399 | int offset, size_t size, int flags); | ||
398 | struct page **ppage; | 400 | struct page **ppage; |
399 | unsigned int remainder; | 401 | unsigned int remainder; |
400 | int err, sent = 0; | 402 | int err, sent = 0; |
@@ -403,6 +405,9 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i | |||
403 | base += xdr->page_base; | 405 | base += xdr->page_base; |
404 | ppage = xdr->pages + (base >> PAGE_SHIFT); | 406 | ppage = xdr->pages + (base >> PAGE_SHIFT); |
405 | base &= ~PAGE_MASK; | 407 | base &= ~PAGE_MASK; |
408 | do_sendpage = sock->ops->sendpage; | ||
409 | if (!zerocopy) | ||
410 | do_sendpage = sock_no_sendpage; | ||
406 | for(;;) { | 411 | for(;;) { |
407 | unsigned int len = min_t(unsigned int, PAGE_SIZE - base, remainder); | 412 | unsigned int len = min_t(unsigned int, PAGE_SIZE - base, remainder); |
408 | int flags = XS_SENDMSG_FLAGS; | 413 | int flags = XS_SENDMSG_FLAGS; |
@@ -410,7 +415,7 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i | |||
410 | remainder -= len; | 415 | remainder -= len; |
411 | if (remainder != 0 || more) | 416 | if (remainder != 0 || more) |
412 | flags |= MSG_MORE; | 417 | flags |= MSG_MORE; |
413 | err = sock->ops->sendpage(sock, *ppage, base, len, flags); | 418 | err = do_sendpage(sock, *ppage, base, len, flags); |
414 | if (remainder == 0 || err != len) | 419 | if (remainder == 0 || err != len) |
415 | break; | 420 | break; |
416 | sent += err; | 421 | sent += err; |
@@ -431,9 +436,10 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i | |||
431 | * @addrlen: UDP only -- length of destination address | 436 | * @addrlen: UDP only -- length of destination address |
432 | * @xdr: buffer containing this request | 437 | * @xdr: buffer containing this request |
433 | * @base: starting position in the buffer | 438 | * @base: starting position in the buffer |
439 | * @zerocopy: true if it is safe to use sendpage() | ||
434 | * | 440 | * |
435 | */ | 441 | */ |
436 | static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base) | 442 | static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base, bool zerocopy) |
437 | { | 443 | { |
438 | unsigned int remainder = xdr->len - base; | 444 | unsigned int remainder = xdr->len - base; |
439 | int err, sent = 0; | 445 | int err, sent = 0; |
@@ -461,7 +467,7 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, | |||
461 | if (base < xdr->page_len) { | 467 | if (base < xdr->page_len) { |
462 | unsigned int len = xdr->page_len - base; | 468 | unsigned int len = xdr->page_len - base; |
463 | remainder -= len; | 469 | remainder -= len; |
464 | err = xs_send_pagedata(sock, xdr, base, remainder != 0); | 470 | err = xs_send_pagedata(sock, xdr, base, remainder != 0, zerocopy); |
465 | if (remainder == 0 || err != len) | 471 | if (remainder == 0 || err != len) |
466 | goto out; | 472 | goto out; |
467 | sent += err; | 473 | sent += err; |
@@ -564,7 +570,7 @@ static int xs_local_send_request(struct rpc_task *task) | |||
564 | req->rq_svec->iov_base, req->rq_svec->iov_len); | 570 | req->rq_svec->iov_base, req->rq_svec->iov_len); |
565 | 571 | ||
566 | status = xs_sendpages(transport->sock, NULL, 0, | 572 | status = xs_sendpages(transport->sock, NULL, 0, |
567 | xdr, req->rq_bytes_sent); | 573 | xdr, req->rq_bytes_sent, true); |
568 | dprintk("RPC: %s(%u) = %d\n", | 574 | dprintk("RPC: %s(%u) = %d\n", |
569 | __func__, xdr->len - req->rq_bytes_sent, status); | 575 | __func__, xdr->len - req->rq_bytes_sent, status); |
570 | if (likely(status >= 0)) { | 576 | if (likely(status >= 0)) { |
@@ -620,7 +626,7 @@ static int xs_udp_send_request(struct rpc_task *task) | |||
620 | status = xs_sendpages(transport->sock, | 626 | status = xs_sendpages(transport->sock, |
621 | xs_addr(xprt), | 627 | xs_addr(xprt), |
622 | xprt->addrlen, xdr, | 628 | xprt->addrlen, xdr, |
623 | req->rq_bytes_sent); | 629 | req->rq_bytes_sent, true); |
624 | 630 | ||
625 | dprintk("RPC: xs_udp_send_request(%u) = %d\n", | 631 | dprintk("RPC: xs_udp_send_request(%u) = %d\n", |
626 | xdr->len - req->rq_bytes_sent, status); | 632 | xdr->len - req->rq_bytes_sent, status); |
@@ -693,6 +699,7 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
693 | struct rpc_xprt *xprt = req->rq_xprt; | 699 | struct rpc_xprt *xprt = req->rq_xprt; |
694 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | 700 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); |
695 | struct xdr_buf *xdr = &req->rq_snd_buf; | 701 | struct xdr_buf *xdr = &req->rq_snd_buf; |
702 | bool zerocopy = true; | ||
696 | int status; | 703 | int status; |
697 | 704 | ||
698 | xs_encode_stream_record_marker(&req->rq_snd_buf); | 705 | xs_encode_stream_record_marker(&req->rq_snd_buf); |
@@ -700,13 +707,20 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
700 | xs_pktdump("packet data:", | 707 | xs_pktdump("packet data:", |
701 | req->rq_svec->iov_base, | 708 | req->rq_svec->iov_base, |
702 | req->rq_svec->iov_len); | 709 | req->rq_svec->iov_len); |
710 | /* Don't use zero copy if this is a resend. If the RPC call | ||
711 | * completes while the socket holds a reference to the pages, | ||
712 | * then we may end up resending corrupted data. | ||
713 | */ | ||
714 | if (task->tk_flags & RPC_TASK_SENT) | ||
715 | zerocopy = false; | ||
703 | 716 | ||
704 | /* Continue transmitting the packet/record. We must be careful | 717 | /* Continue transmitting the packet/record. We must be careful |
705 | * to cope with writespace callbacks arriving _after_ we have | 718 | * to cope with writespace callbacks arriving _after_ we have |
706 | * called sendmsg(). */ | 719 | * called sendmsg(). */ |
707 | while (1) { | 720 | while (1) { |
708 | status = xs_sendpages(transport->sock, | 721 | status = xs_sendpages(transport->sock, |
709 | NULL, 0, xdr, req->rq_bytes_sent); | 722 | NULL, 0, xdr, req->rq_bytes_sent, |
723 | zerocopy); | ||
710 | 724 | ||
711 | dprintk("RPC: xs_tcp_send_request(%u) = %d\n", | 725 | dprintk("RPC: xs_tcp_send_request(%u) = %d\n", |
712 | xdr->len - req->rq_bytes_sent, status); | 726 | xdr->len - req->rq_bytes_sent, status); |
diff --git a/net/tipc/link.c b/net/tipc/link.c index cf465d66ccde..69cd9bf3f561 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -2358,7 +2358,8 @@ int tipc_link_recv_fragment(struct sk_buff **head, struct sk_buff **tail, | |||
2358 | *head = frag; | 2358 | *head = frag; |
2359 | skb_frag_list_init(*head); | 2359 | skb_frag_list_init(*head); |
2360 | return 0; | 2360 | return 0; |
2361 | } else if (skb_try_coalesce(*head, frag, &headstolen, &delta)) { | 2361 | } else if (*head && |
2362 | skb_try_coalesce(*head, frag, &headstolen, &delta)) { | ||
2362 | kfree_skb_partial(frag, headstolen); | 2363 | kfree_skb_partial(frag, headstolen); |
2363 | } else { | 2364 | } else { |
2364 | if (!*head) | 2365 | if (!*head) |
diff --git a/net/tipc/netlink.c b/net/tipc/netlink.c index 8bcd4985d0fb..9f72a6376362 100644 --- a/net/tipc/netlink.c +++ b/net/tipc/netlink.c | |||
@@ -76,9 +76,11 @@ static struct genl_family tipc_genl_family = { | |||
76 | .maxattr = 0, | 76 | .maxattr = 0, |
77 | }; | 77 | }; |
78 | 78 | ||
79 | static struct genl_ops tipc_genl_ops = { | 79 | static struct genl_ops tipc_genl_ops[] = { |
80 | .cmd = TIPC_GENL_CMD, | 80 | { |
81 | .doit = handle_cmd, | 81 | .cmd = TIPC_GENL_CMD, |
82 | .doit = handle_cmd, | ||
83 | }, | ||
82 | }; | 84 | }; |
83 | 85 | ||
84 | static int tipc_genl_family_registered; | 86 | static int tipc_genl_family_registered; |
@@ -87,8 +89,7 @@ int tipc_netlink_start(void) | |||
87 | { | 89 | { |
88 | int res; | 90 | int res; |
89 | 91 | ||
90 | res = genl_register_family_with_ops(&tipc_genl_family, | 92 | res = genl_register_family_with_ops(&tipc_genl_family, tipc_genl_ops); |
91 | &tipc_genl_ops, 1); | ||
92 | if (res) { | 93 | if (res) { |
93 | pr_err("Failed to register netlink interface\n"); | 94 | pr_err("Failed to register netlink interface\n"); |
94 | return res; | 95 | return res; |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 3906527259d1..3b61851bb927 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -980,9 +980,6 @@ static int recv_msg(struct kiocb *iocb, struct socket *sock, | |||
980 | goto exit; | 980 | goto exit; |
981 | } | 981 | } |
982 | 982 | ||
983 | /* will be updated in set_orig_addr() if needed */ | ||
984 | m->msg_namelen = 0; | ||
985 | |||
986 | timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); | 983 | timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); |
987 | restart: | 984 | restart: |
988 | 985 | ||
@@ -1091,9 +1088,6 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock, | |||
1091 | goto exit; | 1088 | goto exit; |
1092 | } | 1089 | } |
1093 | 1090 | ||
1094 | /* will be updated in set_orig_addr() if needed */ | ||
1095 | m->msg_namelen = 0; | ||
1096 | |||
1097 | target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len); | 1091 | target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len); |
1098 | timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); | 1092 | timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); |
1099 | 1093 | ||
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index c1f403bed683..01625ccc3ae6 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -1754,7 +1754,6 @@ static void unix_copy_addr(struct msghdr *msg, struct sock *sk) | |||
1754 | { | 1754 | { |
1755 | struct unix_sock *u = unix_sk(sk); | 1755 | struct unix_sock *u = unix_sk(sk); |
1756 | 1756 | ||
1757 | msg->msg_namelen = 0; | ||
1758 | if (u->addr) { | 1757 | if (u->addr) { |
1759 | msg->msg_namelen = u->addr->len; | 1758 | msg->msg_namelen = u->addr->len; |
1760 | memcpy(msg->msg_name, u->addr->name, u->addr->len); | 1759 | memcpy(msg->msg_name, u->addr->name, u->addr->len); |
@@ -1778,8 +1777,6 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1778 | if (flags&MSG_OOB) | 1777 | if (flags&MSG_OOB) |
1779 | goto out; | 1778 | goto out; |
1780 | 1779 | ||
1781 | msg->msg_namelen = 0; | ||
1782 | |||
1783 | err = mutex_lock_interruptible(&u->readlock); | 1780 | err = mutex_lock_interruptible(&u->readlock); |
1784 | if (err) { | 1781 | if (err) { |
1785 | err = sock_intr_errno(sock_rcvtimeo(sk, noblock)); | 1782 | err = sock_intr_errno(sock_rcvtimeo(sk, noblock)); |
@@ -1924,8 +1921,6 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1924 | target = sock_rcvlowat(sk, flags&MSG_WAITALL, size); | 1921 | target = sock_rcvlowat(sk, flags&MSG_WAITALL, size); |
1925 | timeo = sock_rcvtimeo(sk, flags&MSG_DONTWAIT); | 1922 | timeo = sock_rcvtimeo(sk, flags&MSG_DONTWAIT); |
1926 | 1923 | ||
1927 | msg->msg_namelen = 0; | ||
1928 | |||
1929 | /* Lock the socket to prevent queue disordering | 1924 | /* Lock the socket to prevent queue disordering |
1930 | * while sleeps in memcpy_tomsg | 1925 | * while sleeps in memcpy_tomsg |
1931 | */ | 1926 | */ |
diff --git a/net/vmw_vsock/Kconfig b/net/vmw_vsock/Kconfig index b5fa7e40cdcb..14810abedc2e 100644 --- a/net/vmw_vsock/Kconfig +++ b/net/vmw_vsock/Kconfig | |||
@@ -6,7 +6,7 @@ config VSOCKETS | |||
6 | tristate "Virtual Socket protocol" | 6 | tristate "Virtual Socket protocol" |
7 | help | 7 | help |
8 | Virtual Socket Protocol is a socket protocol similar to TCP/IP | 8 | Virtual Socket Protocol is a socket protocol similar to TCP/IP |
9 | allowing comunication between Virtual Machines and hypervisor | 9 | allowing communication between Virtual Machines and hypervisor |
10 | or host. | 10 | or host. |
11 | 11 | ||
12 | You should also select one or more hypervisor-specific transports | 12 | You should also select one or more hypervisor-specific transports |
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index 545c08b8a1d4..5adfd94c5b85 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c | |||
@@ -1662,8 +1662,6 @@ vsock_stream_recvmsg(struct kiocb *kiocb, | |||
1662 | vsk = vsock_sk(sk); | 1662 | vsk = vsock_sk(sk); |
1663 | err = 0; | 1663 | err = 0; |
1664 | 1664 | ||
1665 | msg->msg_namelen = 0; | ||
1666 | |||
1667 | lock_sock(sk); | 1665 | lock_sock(sk); |
1668 | 1666 | ||
1669 | if (sk->sk_state != SS_CONNECTED) { | 1667 | if (sk->sk_state != SS_CONNECTED) { |
diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c index 9d6986634e0b..687360da62d9 100644 --- a/net/vmw_vsock/vmci_transport.c +++ b/net/vmw_vsock/vmci_transport.c | |||
@@ -1746,8 +1746,6 @@ static int vmci_transport_dgram_dequeue(struct kiocb *kiocb, | |||
1746 | if (flags & MSG_OOB || flags & MSG_ERRQUEUE) | 1746 | if (flags & MSG_OOB || flags & MSG_ERRQUEUE) |
1747 | return -EOPNOTSUPP; | 1747 | return -EOPNOTSUPP; |
1748 | 1748 | ||
1749 | msg->msg_namelen = 0; | ||
1750 | |||
1751 | /* Retrieve the head sk_buff from the socket's receive queue. */ | 1749 | /* Retrieve the head sk_buff from the socket's receive queue. */ |
1752 | err = 0; | 1750 | err = 0; |
1753 | skb = skb_recv_datagram(&vsk->sk, flags, noblock, &err); | 1751 | skb = skb_recv_datagram(&vsk->sk, flags, noblock, &err); |
diff --git a/net/wimax/op-msg.c b/net/wimax/op-msg.c index 0694d62e4dbc..c278b3356f75 100644 --- a/net/wimax/op-msg.c +++ b/net/wimax/op-msg.c | |||
@@ -279,7 +279,7 @@ int wimax_msg_send(struct wimax_dev *wimax_dev, struct sk_buff *skb) | |||
279 | 279 | ||
280 | d_printf(1, dev, "CTX: wimax msg, %zu bytes\n", size); | 280 | d_printf(1, dev, "CTX: wimax msg, %zu bytes\n", size); |
281 | d_dump(2, dev, msg, size); | 281 | d_dump(2, dev, msg, size); |
282 | genlmsg_multicast(skb, 0, wimax_gnl_mcg.id, GFP_KERNEL); | 282 | genlmsg_multicast(&wimax_gnl_family, skb, 0, 0, GFP_KERNEL); |
283 | d_printf(1, dev, "CTX: genl multicast done\n"); | 283 | d_printf(1, dev, "CTX: genl multicast done\n"); |
284 | return 0; | 284 | return 0; |
285 | } | 285 | } |
@@ -321,17 +321,6 @@ int wimax_msg(struct wimax_dev *wimax_dev, const char *pipe_name, | |||
321 | } | 321 | } |
322 | EXPORT_SYMBOL_GPL(wimax_msg); | 322 | EXPORT_SYMBOL_GPL(wimax_msg); |
323 | 323 | ||
324 | |||
325 | static const struct nla_policy wimax_gnl_msg_policy[WIMAX_GNL_ATTR_MAX + 1] = { | ||
326 | [WIMAX_GNL_MSG_IFIDX] = { | ||
327 | .type = NLA_U32, | ||
328 | }, | ||
329 | [WIMAX_GNL_MSG_DATA] = { | ||
330 | .type = NLA_UNSPEC, /* libnl doesn't grok BINARY yet */ | ||
331 | }, | ||
332 | }; | ||
333 | |||
334 | |||
335 | /* | 324 | /* |
336 | * Relays a message from user space to the driver | 325 | * Relays a message from user space to the driver |
337 | * | 326 | * |
@@ -340,7 +329,6 @@ static const struct nla_policy wimax_gnl_msg_policy[WIMAX_GNL_ATTR_MAX + 1] = { | |||
340 | * | 329 | * |
341 | * This call will block while handling/relaying the message. | 330 | * This call will block while handling/relaying the message. |
342 | */ | 331 | */ |
343 | static | ||
344 | int wimax_gnl_doit_msg_from_user(struct sk_buff *skb, struct genl_info *info) | 332 | int wimax_gnl_doit_msg_from_user(struct sk_buff *skb, struct genl_info *info) |
345 | { | 333 | { |
346 | int result, ifindex; | 334 | int result, ifindex; |
@@ -418,16 +406,3 @@ error_no_wimax_dev: | |||
418 | return result; | 406 | return result; |
419 | } | 407 | } |
420 | 408 | ||
421 | |||
422 | /* | ||
423 | * Generic Netlink glue | ||
424 | */ | ||
425 | |||
426 | struct genl_ops wimax_gnl_msg_from_user = { | ||
427 | .cmd = WIMAX_GNL_OP_MSG_FROM_USER, | ||
428 | .flags = GENL_ADMIN_PERM, | ||
429 | .policy = wimax_gnl_msg_policy, | ||
430 | .doit = wimax_gnl_doit_msg_from_user, | ||
431 | .dumpit = NULL, | ||
432 | }; | ||
433 | |||
diff --git a/net/wimax/op-reset.c b/net/wimax/op-reset.c index 7ceffe39d70e..eb4580784d9d 100644 --- a/net/wimax/op-reset.c +++ b/net/wimax/op-reset.c | |||
@@ -92,13 +92,6 @@ int wimax_reset(struct wimax_dev *wimax_dev) | |||
92 | EXPORT_SYMBOL(wimax_reset); | 92 | EXPORT_SYMBOL(wimax_reset); |
93 | 93 | ||
94 | 94 | ||
95 | static const struct nla_policy wimax_gnl_reset_policy[WIMAX_GNL_ATTR_MAX + 1] = { | ||
96 | [WIMAX_GNL_RESET_IFIDX] = { | ||
97 | .type = NLA_U32, | ||
98 | }, | ||
99 | }; | ||
100 | |||
101 | |||
102 | /* | 95 | /* |
103 | * Exporting to user space over generic netlink | 96 | * Exporting to user space over generic netlink |
104 | * | 97 | * |
@@ -106,7 +99,6 @@ static const struct nla_policy wimax_gnl_reset_policy[WIMAX_GNL_ATTR_MAX + 1] = | |||
106 | * | 99 | * |
107 | * No attributes. | 100 | * No attributes. |
108 | */ | 101 | */ |
109 | static | ||
110 | int wimax_gnl_doit_reset(struct sk_buff *skb, struct genl_info *info) | 102 | int wimax_gnl_doit_reset(struct sk_buff *skb, struct genl_info *info) |
111 | { | 103 | { |
112 | int result, ifindex; | 104 | int result, ifindex; |
@@ -130,12 +122,3 @@ error_no_wimax_dev: | |||
130 | d_fnend(3, NULL, "(skb %p info %p) = %d\n", skb, info, result); | 122 | d_fnend(3, NULL, "(skb %p info %p) = %d\n", skb, info, result); |
131 | return result; | 123 | return result; |
132 | } | 124 | } |
133 | |||
134 | |||
135 | struct genl_ops wimax_gnl_reset = { | ||
136 | .cmd = WIMAX_GNL_OP_RESET, | ||
137 | .flags = GENL_ADMIN_PERM, | ||
138 | .policy = wimax_gnl_reset_policy, | ||
139 | .doit = wimax_gnl_doit_reset, | ||
140 | .dumpit = NULL, | ||
141 | }; | ||
diff --git a/net/wimax/op-rfkill.c b/net/wimax/op-rfkill.c index 7ab60babdd22..403078d670a9 100644 --- a/net/wimax/op-rfkill.c +++ b/net/wimax/op-rfkill.c | |||
@@ -411,17 +411,6 @@ void wimax_rfkill_rm(struct wimax_dev *wimax_dev) | |||
411 | * just query). | 411 | * just query). |
412 | */ | 412 | */ |
413 | 413 | ||
414 | static const struct nla_policy wimax_gnl_rfkill_policy[WIMAX_GNL_ATTR_MAX + 1] = { | ||
415 | [WIMAX_GNL_RFKILL_IFIDX] = { | ||
416 | .type = NLA_U32, | ||
417 | }, | ||
418 | [WIMAX_GNL_RFKILL_STATE] = { | ||
419 | .type = NLA_U32 /* enum wimax_rf_state */ | ||
420 | }, | ||
421 | }; | ||
422 | |||
423 | |||
424 | static | ||
425 | int wimax_gnl_doit_rfkill(struct sk_buff *skb, struct genl_info *info) | 414 | int wimax_gnl_doit_rfkill(struct sk_buff *skb, struct genl_info *info) |
426 | { | 415 | { |
427 | int result, ifindex; | 416 | int result, ifindex; |
@@ -457,13 +446,3 @@ error_no_wimax_dev: | |||
457 | d_fnend(3, NULL, "(skb %p info %p) = %d\n", skb, info, result); | 446 | d_fnend(3, NULL, "(skb %p info %p) = %d\n", skb, info, result); |
458 | return result; | 447 | return result; |
459 | } | 448 | } |
460 | |||
461 | |||
462 | struct genl_ops wimax_gnl_rfkill = { | ||
463 | .cmd = WIMAX_GNL_OP_RFKILL, | ||
464 | .flags = GENL_ADMIN_PERM, | ||
465 | .policy = wimax_gnl_rfkill_policy, | ||
466 | .doit = wimax_gnl_doit_rfkill, | ||
467 | .dumpit = NULL, | ||
468 | }; | ||
469 | |||
diff --git a/net/wimax/op-state-get.c b/net/wimax/op-state-get.c index aff8776e2d41..995c08c827b5 100644 --- a/net/wimax/op-state-get.c +++ b/net/wimax/op-state-get.c | |||
@@ -33,13 +33,6 @@ | |||
33 | #include "debug-levels.h" | 33 | #include "debug-levels.h" |
34 | 34 | ||
35 | 35 | ||
36 | static const struct nla_policy wimax_gnl_state_get_policy[WIMAX_GNL_ATTR_MAX + 1] = { | ||
37 | [WIMAX_GNL_STGET_IFIDX] = { | ||
38 | .type = NLA_U32, | ||
39 | }, | ||
40 | }; | ||
41 | |||
42 | |||
43 | /* | 36 | /* |
44 | * Exporting to user space over generic netlink | 37 | * Exporting to user space over generic netlink |
45 | * | 38 | * |
@@ -48,7 +41,6 @@ static const struct nla_policy wimax_gnl_state_get_policy[WIMAX_GNL_ATTR_MAX + 1 | |||
48 | * | 41 | * |
49 | * No attributes. | 42 | * No attributes. |
50 | */ | 43 | */ |
51 | static | ||
52 | int wimax_gnl_doit_state_get(struct sk_buff *skb, struct genl_info *info) | 44 | int wimax_gnl_doit_state_get(struct sk_buff *skb, struct genl_info *info) |
53 | { | 45 | { |
54 | int result, ifindex; | 46 | int result, ifindex; |
@@ -72,12 +64,3 @@ error_no_wimax_dev: | |||
72 | d_fnend(3, NULL, "(skb %p info %p) = %d\n", skb, info, result); | 64 | d_fnend(3, NULL, "(skb %p info %p) = %d\n", skb, info, result); |
73 | return result; | 65 | return result; |
74 | } | 66 | } |
75 | |||
76 | |||
77 | struct genl_ops wimax_gnl_state_get = { | ||
78 | .cmd = WIMAX_GNL_OP_STATE_GET, | ||
79 | .flags = GENL_ADMIN_PERM, | ||
80 | .policy = wimax_gnl_state_get_policy, | ||
81 | .doit = wimax_gnl_doit_state_get, | ||
82 | .dumpit = NULL, | ||
83 | }; | ||
diff --git a/net/wimax/stack.c b/net/wimax/stack.c index a6470ac39498..ec8b577db135 100644 --- a/net/wimax/stack.c +++ b/net/wimax/stack.c | |||
@@ -116,8 +116,9 @@ struct sk_buff *wimax_gnl_re_state_change_alloc( | |||
116 | dev_err(dev, "RE_STCH: can't create message\n"); | 116 | dev_err(dev, "RE_STCH: can't create message\n"); |
117 | goto error_new; | 117 | goto error_new; |
118 | } | 118 | } |
119 | data = genlmsg_put(report_skb, 0, wimax_gnl_mcg.id, &wimax_gnl_family, | 119 | /* FIXME: sending a group ID as the seq is wrong */ |
120 | 0, WIMAX_GNL_RE_STATE_CHANGE); | 120 | data = genlmsg_put(report_skb, 0, wimax_gnl_family.mcgrp_offset, |
121 | &wimax_gnl_family, 0, WIMAX_GNL_RE_STATE_CHANGE); | ||
121 | if (data == NULL) { | 122 | if (data == NULL) { |
122 | dev_err(dev, "RE_STCH: can't put data into message\n"); | 123 | dev_err(dev, "RE_STCH: can't put data into message\n"); |
123 | goto error_put; | 124 | goto error_put; |
@@ -177,7 +178,7 @@ int wimax_gnl_re_state_change_send( | |||
177 | goto out; | 178 | goto out; |
178 | } | 179 | } |
179 | genlmsg_end(report_skb, header); | 180 | genlmsg_end(report_skb, header); |
180 | genlmsg_multicast(report_skb, 0, wimax_gnl_mcg.id, GFP_KERNEL); | 181 | genlmsg_multicast(&wimax_gnl_family, report_skb, 0, 0, GFP_KERNEL); |
181 | out: | 182 | out: |
182 | d_fnend(3, dev, "(wimax_dev %p report_skb %p) = %d\n", | 183 | d_fnend(3, dev, "(wimax_dev %p report_skb %p) = %d\n", |
183 | wimax_dev, report_skb, result); | 184 | wimax_dev, report_skb, result); |
@@ -402,22 +403,44 @@ void wimax_dev_init(struct wimax_dev *wimax_dev) | |||
402 | } | 403 | } |
403 | EXPORT_SYMBOL_GPL(wimax_dev_init); | 404 | EXPORT_SYMBOL_GPL(wimax_dev_init); |
404 | 405 | ||
405 | /* | 406 | static const struct nla_policy wimax_gnl_policy[WIMAX_GNL_ATTR_MAX + 1] = { |
406 | * This extern is declared here because it's easier to keep track -- | 407 | [WIMAX_GNL_RESET_IFIDX] = { .type = NLA_U32, }, |
407 | * both declarations are a list of the same | 408 | [WIMAX_GNL_RFKILL_IFIDX] = { .type = NLA_U32, }, |
408 | */ | 409 | [WIMAX_GNL_RFKILL_STATE] = { |
409 | extern struct genl_ops | 410 | .type = NLA_U32 /* enum wimax_rf_state */ |
410 | wimax_gnl_msg_from_user, | 411 | }, |
411 | wimax_gnl_reset, | 412 | [WIMAX_GNL_STGET_IFIDX] = { .type = NLA_U32, }, |
412 | wimax_gnl_rfkill, | 413 | [WIMAX_GNL_MSG_IFIDX] = { .type = NLA_U32, }, |
413 | wimax_gnl_state_get; | 414 | [WIMAX_GNL_MSG_DATA] = { |
415 | .type = NLA_UNSPEC, /* libnl doesn't grok BINARY yet */ | ||
416 | }, | ||
417 | }; | ||
414 | 418 | ||
415 | static | 419 | static const struct genl_ops wimax_gnl_ops[] = { |
416 | struct genl_ops *wimax_gnl_ops[] = { | 420 | { |
417 | &wimax_gnl_msg_from_user, | 421 | .cmd = WIMAX_GNL_OP_MSG_FROM_USER, |
418 | &wimax_gnl_reset, | 422 | .flags = GENL_ADMIN_PERM, |
419 | &wimax_gnl_rfkill, | 423 | .policy = wimax_gnl_policy, |
420 | &wimax_gnl_state_get, | 424 | .doit = wimax_gnl_doit_msg_from_user, |
425 | }, | ||
426 | { | ||
427 | .cmd = WIMAX_GNL_OP_RESET, | ||
428 | .flags = GENL_ADMIN_PERM, | ||
429 | .policy = wimax_gnl_policy, | ||
430 | .doit = wimax_gnl_doit_reset, | ||
431 | }, | ||
432 | { | ||
433 | .cmd = WIMAX_GNL_OP_RFKILL, | ||
434 | .flags = GENL_ADMIN_PERM, | ||
435 | .policy = wimax_gnl_policy, | ||
436 | .doit = wimax_gnl_doit_rfkill, | ||
437 | }, | ||
438 | { | ||
439 | .cmd = WIMAX_GNL_OP_STATE_GET, | ||
440 | .flags = GENL_ADMIN_PERM, | ||
441 | .policy = wimax_gnl_policy, | ||
442 | .doit = wimax_gnl_doit_state_get, | ||
443 | }, | ||
421 | }; | 444 | }; |
422 | 445 | ||
423 | 446 | ||
@@ -557,8 +580,8 @@ struct genl_family wimax_gnl_family = { | |||
557 | .maxattr = WIMAX_GNL_ATTR_MAX, | 580 | .maxattr = WIMAX_GNL_ATTR_MAX, |
558 | }; | 581 | }; |
559 | 582 | ||
560 | struct genl_multicast_group wimax_gnl_mcg = { | 583 | static const struct genl_multicast_group wimax_gnl_mcgrps[] = { |
561 | .name = "msg", | 584 | { .name = "msg", }, |
562 | }; | 585 | }; |
563 | 586 | ||
564 | 587 | ||
@@ -567,7 +590,7 @@ struct genl_multicast_group wimax_gnl_mcg = { | |||
567 | static | 590 | static |
568 | int __init wimax_subsys_init(void) | 591 | int __init wimax_subsys_init(void) |
569 | { | 592 | { |
570 | int result, cnt; | 593 | int result; |
571 | 594 | ||
572 | d_fnstart(4, NULL, "()\n"); | 595 | d_fnstart(4, NULL, "()\n"); |
573 | d_parse_params(D_LEVEL, D_LEVEL_SIZE, wimax_debug_params, | 596 | d_parse_params(D_LEVEL, D_LEVEL_SIZE, wimax_debug_params, |
@@ -575,38 +598,18 @@ int __init wimax_subsys_init(void) | |||
575 | 598 | ||
576 | snprintf(wimax_gnl_family.name, sizeof(wimax_gnl_family.name), | 599 | snprintf(wimax_gnl_family.name, sizeof(wimax_gnl_family.name), |
577 | "WiMAX"); | 600 | "WiMAX"); |
578 | result = genl_register_family(&wimax_gnl_family); | 601 | result = genl_register_family_with_ops_groups(&wimax_gnl_family, |
602 | wimax_gnl_ops, | ||
603 | wimax_gnl_mcgrps); | ||
579 | if (unlikely(result < 0)) { | 604 | if (unlikely(result < 0)) { |
580 | printk(KERN_ERR "cannot register generic netlink family: %d\n", | 605 | printk(KERN_ERR "cannot register generic netlink family: %d\n", |
581 | result); | 606 | result); |
582 | goto error_register_family; | 607 | goto error_register_family; |
583 | } | 608 | } |
584 | 609 | ||
585 | for (cnt = 0; cnt < ARRAY_SIZE(wimax_gnl_ops); cnt++) { | ||
586 | result = genl_register_ops(&wimax_gnl_family, | ||
587 | wimax_gnl_ops[cnt]); | ||
588 | d_printf(4, NULL, "registering generic netlink op code " | ||
589 | "%u: %d\n", wimax_gnl_ops[cnt]->cmd, result); | ||
590 | if (unlikely(result < 0)) { | ||
591 | printk(KERN_ERR "cannot register generic netlink op " | ||
592 | "code %u: %d\n", | ||
593 | wimax_gnl_ops[cnt]->cmd, result); | ||
594 | goto error_register_ops; | ||
595 | } | ||
596 | } | ||
597 | |||
598 | result = genl_register_mc_group(&wimax_gnl_family, &wimax_gnl_mcg); | ||
599 | if (result < 0) | ||
600 | goto error_mc_group; | ||
601 | d_fnend(4, NULL, "() = 0\n"); | 610 | d_fnend(4, NULL, "() = 0\n"); |
602 | return 0; | 611 | return 0; |
603 | 612 | ||
604 | error_mc_group: | ||
605 | error_register_ops: | ||
606 | for (cnt--; cnt >= 0; cnt--) | ||
607 | genl_unregister_ops(&wimax_gnl_family, | ||
608 | wimax_gnl_ops[cnt]); | ||
609 | genl_unregister_family(&wimax_gnl_family); | ||
610 | error_register_family: | 613 | error_register_family: |
611 | d_fnend(4, NULL, "() = %d\n", result); | 614 | d_fnend(4, NULL, "() = %d\n", result); |
612 | return result; | 615 | return result; |
@@ -619,12 +622,7 @@ module_init(wimax_subsys_init); | |||
619 | static | 622 | static |
620 | void __exit wimax_subsys_exit(void) | 623 | void __exit wimax_subsys_exit(void) |
621 | { | 624 | { |
622 | int cnt; | ||
623 | wimax_id_table_release(); | 625 | wimax_id_table_release(); |
624 | genl_unregister_mc_group(&wimax_gnl_family, &wimax_gnl_mcg); | ||
625 | for (cnt = ARRAY_SIZE(wimax_gnl_ops) - 1; cnt >= 0; cnt--) | ||
626 | genl_unregister_ops(&wimax_gnl_family, | ||
627 | wimax_gnl_ops[cnt]); | ||
628 | genl_unregister_family(&wimax_gnl_family); | 626 | genl_unregister_family(&wimax_gnl_family); |
629 | } | 627 | } |
630 | module_exit(wimax_subsys_exit); | 628 | module_exit(wimax_subsys_exit); |
diff --git a/net/wimax/wimax-internal.h b/net/wimax/wimax-internal.h index 5dcd9c067bf0..b445b82020a8 100644 --- a/net/wimax/wimax-internal.h +++ b/net/wimax/wimax-internal.h | |||
@@ -84,8 +84,14 @@ void wimax_id_table_release(void); | |||
84 | int wimax_rfkill_add(struct wimax_dev *); | 84 | int wimax_rfkill_add(struct wimax_dev *); |
85 | void wimax_rfkill_rm(struct wimax_dev *); | 85 | void wimax_rfkill_rm(struct wimax_dev *); |
86 | 86 | ||
87 | /* generic netlink */ | ||
87 | extern struct genl_family wimax_gnl_family; | 88 | extern struct genl_family wimax_gnl_family; |
88 | extern struct genl_multicast_group wimax_gnl_mcg; | 89 | |
90 | /* ops */ | ||
91 | int wimax_gnl_doit_msg_from_user(struct sk_buff *skb, struct genl_info *info); | ||
92 | int wimax_gnl_doit_reset(struct sk_buff *skb, struct genl_info *info); | ||
93 | int wimax_gnl_doit_rfkill(struct sk_buff *skb, struct genl_info *info); | ||
94 | int wimax_gnl_doit_state_get(struct sk_buff *skb, struct genl_info *info); | ||
89 | 95 | ||
90 | #endif /* #ifdef __KERNEL__ */ | 96 | #endif /* #ifdef __KERNEL__ */ |
91 | #endif /* #ifndef __WIMAX_INTERNAL_H__ */ | 97 | #endif /* #ifndef __WIMAX_INTERNAL_H__ */ |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index a7f4e7902104..a1eb21073176 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -30,9 +30,9 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, | |||
30 | struct cfg80211_crypto_settings *settings, | 30 | struct cfg80211_crypto_settings *settings, |
31 | int cipher_limit); | 31 | int cipher_limit); |
32 | 32 | ||
33 | static int nl80211_pre_doit(struct genl_ops *ops, struct sk_buff *skb, | 33 | static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, |
34 | struct genl_info *info); | 34 | struct genl_info *info); |
35 | static void nl80211_post_doit(struct genl_ops *ops, struct sk_buff *skb, | 35 | static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, |
36 | struct genl_info *info); | 36 | struct genl_info *info); |
37 | 37 | ||
38 | /* the netlink family */ | 38 | /* the netlink family */ |
@@ -47,6 +47,25 @@ static struct genl_family nl80211_fam = { | |||
47 | .post_doit = nl80211_post_doit, | 47 | .post_doit = nl80211_post_doit, |
48 | }; | 48 | }; |
49 | 49 | ||
50 | /* multicast groups */ | ||
51 | enum nl80211_multicast_groups { | ||
52 | NL80211_MCGRP_CONFIG, | ||
53 | NL80211_MCGRP_SCAN, | ||
54 | NL80211_MCGRP_REGULATORY, | ||
55 | NL80211_MCGRP_MLME, | ||
56 | NL80211_MCGRP_TESTMODE /* keep last - ifdef! */ | ||
57 | }; | ||
58 | |||
59 | static const struct genl_multicast_group nl80211_mcgrps[] = { | ||
60 | [NL80211_MCGRP_CONFIG] = { .name = "config", }, | ||
61 | [NL80211_MCGRP_SCAN] = { .name = "scan", }, | ||
62 | [NL80211_MCGRP_REGULATORY] = { .name = "regulatory", }, | ||
63 | [NL80211_MCGRP_MLME] = { .name = "mlme", }, | ||
64 | #ifdef CONFIG_NL80211_TESTMODE | ||
65 | [NL80211_MCGRP_TESTMODE] = { .name = "testmode", } | ||
66 | #endif | ||
67 | }; | ||
68 | |||
50 | /* returns ERR_PTR values */ | 69 | /* returns ERR_PTR values */ |
51 | static struct wireless_dev * | 70 | static struct wireless_dev * |
52 | __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs) | 71 | __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs) |
@@ -6656,10 +6675,6 @@ static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) | |||
6656 | 6675 | ||
6657 | 6676 | ||
6658 | #ifdef CONFIG_NL80211_TESTMODE | 6677 | #ifdef CONFIG_NL80211_TESTMODE |
6659 | static struct genl_multicast_group nl80211_testmode_mcgrp = { | ||
6660 | .name = "testmode", | ||
6661 | }; | ||
6662 | |||
6663 | static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) | 6678 | static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) |
6664 | { | 6679 | { |
6665 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; | 6680 | struct cfg80211_registered_device *rdev = info->user_ptr[0]; |
@@ -6868,8 +6883,8 @@ void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp) | |||
6868 | 6883 | ||
6869 | nla_nest_end(skb, data); | 6884 | nla_nest_end(skb, data); |
6870 | genlmsg_end(skb, hdr); | 6885 | genlmsg_end(skb, hdr); |
6871 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), skb, 0, | 6886 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0, |
6872 | nl80211_testmode_mcgrp.id, gfp); | 6887 | NL80211_MCGRP_TESTMODE, gfp); |
6873 | } | 6888 | } |
6874 | EXPORT_SYMBOL(cfg80211_testmode_event); | 6889 | EXPORT_SYMBOL(cfg80211_testmode_event); |
6875 | #endif | 6890 | #endif |
@@ -8851,7 +8866,7 @@ static int nl80211_crit_protocol_stop(struct sk_buff *skb, | |||
8851 | #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ | 8866 | #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ |
8852 | NL80211_FLAG_CHECK_NETDEV_UP) | 8867 | NL80211_FLAG_CHECK_NETDEV_UP) |
8853 | 8868 | ||
8854 | static int nl80211_pre_doit(struct genl_ops *ops, struct sk_buff *skb, | 8869 | static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, |
8855 | struct genl_info *info) | 8870 | struct genl_info *info) |
8856 | { | 8871 | { |
8857 | struct cfg80211_registered_device *rdev; | 8872 | struct cfg80211_registered_device *rdev; |
@@ -8920,7 +8935,7 @@ static int nl80211_pre_doit(struct genl_ops *ops, struct sk_buff *skb, | |||
8920 | return 0; | 8935 | return 0; |
8921 | } | 8936 | } |
8922 | 8937 | ||
8923 | static void nl80211_post_doit(struct genl_ops *ops, struct sk_buff *skb, | 8938 | static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, |
8924 | struct genl_info *info) | 8939 | struct genl_info *info) |
8925 | { | 8940 | { |
8926 | if (info->user_ptr[1]) { | 8941 | if (info->user_ptr[1]) { |
@@ -8937,7 +8952,7 @@ static void nl80211_post_doit(struct genl_ops *ops, struct sk_buff *skb, | |||
8937 | rtnl_unlock(); | 8952 | rtnl_unlock(); |
8938 | } | 8953 | } |
8939 | 8954 | ||
8940 | static struct genl_ops nl80211_ops[] = { | 8955 | static const struct genl_ops nl80211_ops[] = { |
8941 | { | 8956 | { |
8942 | .cmd = NL80211_CMD_GET_WIPHY, | 8957 | .cmd = NL80211_CMD_GET_WIPHY, |
8943 | .doit = nl80211_get_wiphy, | 8958 | .doit = nl80211_get_wiphy, |
@@ -9566,21 +9581,6 @@ static struct genl_ops nl80211_ops[] = { | |||
9566 | }, | 9581 | }, |
9567 | }; | 9582 | }; |
9568 | 9583 | ||
9569 | static struct genl_multicast_group nl80211_mlme_mcgrp = { | ||
9570 | .name = "mlme", | ||
9571 | }; | ||
9572 | |||
9573 | /* multicast groups */ | ||
9574 | static struct genl_multicast_group nl80211_config_mcgrp = { | ||
9575 | .name = "config", | ||
9576 | }; | ||
9577 | static struct genl_multicast_group nl80211_scan_mcgrp = { | ||
9578 | .name = "scan", | ||
9579 | }; | ||
9580 | static struct genl_multicast_group nl80211_regulatory_mcgrp = { | ||
9581 | .name = "regulatory", | ||
9582 | }; | ||
9583 | |||
9584 | /* notification functions */ | 9584 | /* notification functions */ |
9585 | 9585 | ||
9586 | void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev) | 9586 | void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev) |
@@ -9597,8 +9597,8 @@ void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev) | |||
9597 | return; | 9597 | return; |
9598 | } | 9598 | } |
9599 | 9599 | ||
9600 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 9600 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
9601 | nl80211_config_mcgrp.id, GFP_KERNEL); | 9601 | NL80211_MCGRP_CONFIG, GFP_KERNEL); |
9602 | } | 9602 | } |
9603 | 9603 | ||
9604 | static int nl80211_add_scan_req(struct sk_buff *msg, | 9604 | static int nl80211_add_scan_req(struct sk_buff *msg, |
@@ -9707,8 +9707,8 @@ void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, | |||
9707 | return; | 9707 | return; |
9708 | } | 9708 | } |
9709 | 9709 | ||
9710 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 9710 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
9711 | nl80211_scan_mcgrp.id, GFP_KERNEL); | 9711 | NL80211_MCGRP_SCAN, GFP_KERNEL); |
9712 | } | 9712 | } |
9713 | 9713 | ||
9714 | void nl80211_send_scan_done(struct cfg80211_registered_device *rdev, | 9714 | void nl80211_send_scan_done(struct cfg80211_registered_device *rdev, |
@@ -9726,8 +9726,8 @@ void nl80211_send_scan_done(struct cfg80211_registered_device *rdev, | |||
9726 | return; | 9726 | return; |
9727 | } | 9727 | } |
9728 | 9728 | ||
9729 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 9729 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
9730 | nl80211_scan_mcgrp.id, GFP_KERNEL); | 9730 | NL80211_MCGRP_SCAN, GFP_KERNEL); |
9731 | } | 9731 | } |
9732 | 9732 | ||
9733 | void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev, | 9733 | void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev, |
@@ -9745,8 +9745,8 @@ void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev, | |||
9745 | return; | 9745 | return; |
9746 | } | 9746 | } |
9747 | 9747 | ||
9748 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 9748 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
9749 | nl80211_scan_mcgrp.id, GFP_KERNEL); | 9749 | NL80211_MCGRP_SCAN, GFP_KERNEL); |
9750 | } | 9750 | } |
9751 | 9751 | ||
9752 | void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev, | 9752 | void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev, |
@@ -9764,8 +9764,8 @@ void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev, | |||
9764 | return; | 9764 | return; |
9765 | } | 9765 | } |
9766 | 9766 | ||
9767 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 9767 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
9768 | nl80211_scan_mcgrp.id, GFP_KERNEL); | 9768 | NL80211_MCGRP_SCAN, GFP_KERNEL); |
9769 | } | 9769 | } |
9770 | 9770 | ||
9771 | void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev, | 9771 | void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev, |
@@ -9782,8 +9782,8 @@ void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev, | |||
9782 | return; | 9782 | return; |
9783 | } | 9783 | } |
9784 | 9784 | ||
9785 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 9785 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
9786 | nl80211_scan_mcgrp.id, GFP_KERNEL); | 9786 | NL80211_MCGRP_SCAN, GFP_KERNEL); |
9787 | } | 9787 | } |
9788 | 9788 | ||
9789 | /* | 9789 | /* |
@@ -9837,8 +9837,8 @@ void nl80211_send_reg_change_event(struct regulatory_request *request) | |||
9837 | genlmsg_end(msg, hdr); | 9837 | genlmsg_end(msg, hdr); |
9838 | 9838 | ||
9839 | rcu_read_lock(); | 9839 | rcu_read_lock(); |
9840 | genlmsg_multicast_allns(msg, 0, nl80211_regulatory_mcgrp.id, | 9840 | genlmsg_multicast_allns(&nl80211_fam, msg, 0, |
9841 | GFP_ATOMIC); | 9841 | NL80211_MCGRP_REGULATORY, GFP_ATOMIC); |
9842 | rcu_read_unlock(); | 9842 | rcu_read_unlock(); |
9843 | 9843 | ||
9844 | return; | 9844 | return; |
@@ -9873,8 +9873,8 @@ static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, | |||
9873 | 9873 | ||
9874 | genlmsg_end(msg, hdr); | 9874 | genlmsg_end(msg, hdr); |
9875 | 9875 | ||
9876 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 9876 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
9877 | nl80211_mlme_mcgrp.id, gfp); | 9877 | NL80211_MCGRP_MLME, gfp); |
9878 | return; | 9878 | return; |
9879 | 9879 | ||
9880 | nla_put_failure: | 9880 | nla_put_failure: |
@@ -9961,8 +9961,8 @@ static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, | |||
9961 | 9961 | ||
9962 | genlmsg_end(msg, hdr); | 9962 | genlmsg_end(msg, hdr); |
9963 | 9963 | ||
9964 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 9964 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
9965 | nl80211_mlme_mcgrp.id, gfp); | 9965 | NL80211_MCGRP_MLME, gfp); |
9966 | return; | 9966 | return; |
9967 | 9967 | ||
9968 | nla_put_failure: | 9968 | nla_put_failure: |
@@ -10017,8 +10017,8 @@ void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, | |||
10017 | 10017 | ||
10018 | genlmsg_end(msg, hdr); | 10018 | genlmsg_end(msg, hdr); |
10019 | 10019 | ||
10020 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10020 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10021 | nl80211_mlme_mcgrp.id, gfp); | 10021 | NL80211_MCGRP_MLME, gfp); |
10022 | return; | 10022 | return; |
10023 | 10023 | ||
10024 | nla_put_failure: | 10024 | nla_put_failure: |
@@ -10056,8 +10056,8 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev, | |||
10056 | 10056 | ||
10057 | genlmsg_end(msg, hdr); | 10057 | genlmsg_end(msg, hdr); |
10058 | 10058 | ||
10059 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10059 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10060 | nl80211_mlme_mcgrp.id, gfp); | 10060 | NL80211_MCGRP_MLME, gfp); |
10061 | return; | 10061 | return; |
10062 | 10062 | ||
10063 | nla_put_failure: | 10063 | nla_put_failure: |
@@ -10094,8 +10094,8 @@ void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, | |||
10094 | 10094 | ||
10095 | genlmsg_end(msg, hdr); | 10095 | genlmsg_end(msg, hdr); |
10096 | 10096 | ||
10097 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10097 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10098 | nl80211_mlme_mcgrp.id, GFP_KERNEL); | 10098 | NL80211_MCGRP_MLME, GFP_KERNEL); |
10099 | return; | 10099 | return; |
10100 | 10100 | ||
10101 | nla_put_failure: | 10101 | nla_put_failure: |
@@ -10128,8 +10128,8 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, | |||
10128 | 10128 | ||
10129 | genlmsg_end(msg, hdr); | 10129 | genlmsg_end(msg, hdr); |
10130 | 10130 | ||
10131 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10131 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10132 | nl80211_mlme_mcgrp.id, gfp); | 10132 | NL80211_MCGRP_MLME, gfp); |
10133 | return; | 10133 | return; |
10134 | 10134 | ||
10135 | nla_put_failure: | 10135 | nla_put_failure: |
@@ -10169,8 +10169,8 @@ void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, | |||
10169 | 10169 | ||
10170 | genlmsg_end(msg, hdr); | 10170 | genlmsg_end(msg, hdr); |
10171 | 10171 | ||
10172 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10172 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10173 | nl80211_mlme_mcgrp.id, gfp); | 10173 | NL80211_MCGRP_MLME, gfp); |
10174 | return; | 10174 | return; |
10175 | 10175 | ||
10176 | nla_put_failure: | 10176 | nla_put_failure: |
@@ -10208,8 +10208,8 @@ void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, | |||
10208 | 10208 | ||
10209 | genlmsg_end(msg, hdr); | 10209 | genlmsg_end(msg, hdr); |
10210 | 10210 | ||
10211 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10211 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10212 | nl80211_mlme_mcgrp.id, gfp); | 10212 | NL80211_MCGRP_MLME, gfp); |
10213 | return; | 10213 | return; |
10214 | 10214 | ||
10215 | nla_put_failure: | 10215 | nla_put_failure: |
@@ -10261,8 +10261,8 @@ void nl80211_send_beacon_hint_event(struct wiphy *wiphy, | |||
10261 | genlmsg_end(msg, hdr); | 10261 | genlmsg_end(msg, hdr); |
10262 | 10262 | ||
10263 | rcu_read_lock(); | 10263 | rcu_read_lock(); |
10264 | genlmsg_multicast_allns(msg, 0, nl80211_regulatory_mcgrp.id, | 10264 | genlmsg_multicast_allns(&nl80211_fam, msg, 0, |
10265 | GFP_ATOMIC); | 10265 | NL80211_MCGRP_REGULATORY, GFP_ATOMIC); |
10266 | rcu_read_unlock(); | 10266 | rcu_read_unlock(); |
10267 | 10267 | ||
10268 | return; | 10268 | return; |
@@ -10307,8 +10307,8 @@ static void nl80211_send_remain_on_chan_event( | |||
10307 | 10307 | ||
10308 | genlmsg_end(msg, hdr); | 10308 | genlmsg_end(msg, hdr); |
10309 | 10309 | ||
10310 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10310 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10311 | nl80211_mlme_mcgrp.id, gfp); | 10311 | NL80211_MCGRP_MLME, gfp); |
10312 | return; | 10312 | return; |
10313 | 10313 | ||
10314 | nla_put_failure: | 10314 | nla_put_failure: |
@@ -10362,8 +10362,8 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, | |||
10362 | return; | 10362 | return; |
10363 | } | 10363 | } |
10364 | 10364 | ||
10365 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10365 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10366 | nl80211_mlme_mcgrp.id, gfp); | 10366 | NL80211_MCGRP_MLME, gfp); |
10367 | } | 10367 | } |
10368 | EXPORT_SYMBOL(cfg80211_new_sta); | 10368 | EXPORT_SYMBOL(cfg80211_new_sta); |
10369 | 10369 | ||
@@ -10392,8 +10392,8 @@ void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp) | |||
10392 | 10392 | ||
10393 | genlmsg_end(msg, hdr); | 10393 | genlmsg_end(msg, hdr); |
10394 | 10394 | ||
10395 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10395 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10396 | nl80211_mlme_mcgrp.id, gfp); | 10396 | NL80211_MCGRP_MLME, gfp); |
10397 | return; | 10397 | return; |
10398 | 10398 | ||
10399 | nla_put_failure: | 10399 | nla_put_failure: |
@@ -10428,8 +10428,8 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, | |||
10428 | 10428 | ||
10429 | genlmsg_end(msg, hdr); | 10429 | genlmsg_end(msg, hdr); |
10430 | 10430 | ||
10431 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10431 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10432 | nl80211_mlme_mcgrp.id, gfp); | 10432 | NL80211_MCGRP_MLME, gfp); |
10433 | return; | 10433 | return; |
10434 | 10434 | ||
10435 | nla_put_failure: | 10435 | nla_put_failure: |
@@ -10590,8 +10590,8 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie, | |||
10590 | 10590 | ||
10591 | genlmsg_end(msg, hdr); | 10591 | genlmsg_end(msg, hdr); |
10592 | 10592 | ||
10593 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10593 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10594 | nl80211_mlme_mcgrp.id, gfp); | 10594 | NL80211_MCGRP_MLME, gfp); |
10595 | return; | 10595 | return; |
10596 | 10596 | ||
10597 | nla_put_failure: | 10597 | nla_put_failure: |
@@ -10639,8 +10639,8 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev, | |||
10639 | 10639 | ||
10640 | genlmsg_end(msg, hdr); | 10640 | genlmsg_end(msg, hdr); |
10641 | 10641 | ||
10642 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10642 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10643 | nl80211_mlme_mcgrp.id, gfp); | 10643 | NL80211_MCGRP_MLME, gfp); |
10644 | return; | 10644 | return; |
10645 | 10645 | ||
10646 | nla_put_failure: | 10646 | nla_put_failure: |
@@ -10684,8 +10684,8 @@ static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, | |||
10684 | 10684 | ||
10685 | genlmsg_end(msg, hdr); | 10685 | genlmsg_end(msg, hdr); |
10686 | 10686 | ||
10687 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10687 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10688 | nl80211_mlme_mcgrp.id, gfp); | 10688 | NL80211_MCGRP_MLME, gfp); |
10689 | return; | 10689 | return; |
10690 | 10690 | ||
10691 | nla_put_failure: | 10691 | nla_put_failure: |
@@ -10742,8 +10742,8 @@ nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, | |||
10742 | 10742 | ||
10743 | genlmsg_end(msg, hdr); | 10743 | genlmsg_end(msg, hdr); |
10744 | 10744 | ||
10745 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10745 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10746 | nl80211_mlme_mcgrp.id, gfp); | 10746 | NL80211_MCGRP_MLME, gfp); |
10747 | return; | 10747 | return; |
10748 | 10748 | ||
10749 | nla_put_failure: | 10749 | nla_put_failure: |
@@ -10789,8 +10789,8 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, | |||
10789 | 10789 | ||
10790 | genlmsg_end(msg, hdr); | 10790 | genlmsg_end(msg, hdr); |
10791 | 10791 | ||
10792 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10792 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10793 | nl80211_mlme_mcgrp.id, gfp); | 10793 | NL80211_MCGRP_MLME, gfp); |
10794 | return; | 10794 | return; |
10795 | 10795 | ||
10796 | nla_put_failure: | 10796 | nla_put_failure: |
@@ -10866,8 +10866,8 @@ void cfg80211_cqm_txe_notify(struct net_device *dev, | |||
10866 | 10866 | ||
10867 | genlmsg_end(msg, hdr); | 10867 | genlmsg_end(msg, hdr); |
10868 | 10868 | ||
10869 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10869 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10870 | nl80211_mlme_mcgrp.id, gfp); | 10870 | NL80211_MCGRP_MLME, gfp); |
10871 | return; | 10871 | return; |
10872 | 10872 | ||
10873 | nla_put_failure: | 10873 | nla_put_failure: |
@@ -10915,8 +10915,8 @@ nl80211_radar_notify(struct cfg80211_registered_device *rdev, | |||
10915 | 10915 | ||
10916 | genlmsg_end(msg, hdr); | 10916 | genlmsg_end(msg, hdr); |
10917 | 10917 | ||
10918 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10918 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10919 | nl80211_mlme_mcgrp.id, gfp); | 10919 | NL80211_MCGRP_MLME, gfp); |
10920 | return; | 10920 | return; |
10921 | 10921 | ||
10922 | nla_put_failure: | 10922 | nla_put_failure: |
@@ -10962,8 +10962,8 @@ void cfg80211_cqm_pktloss_notify(struct net_device *dev, | |||
10962 | 10962 | ||
10963 | genlmsg_end(msg, hdr); | 10963 | genlmsg_end(msg, hdr); |
10964 | 10964 | ||
10965 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 10965 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
10966 | nl80211_mlme_mcgrp.id, gfp); | 10966 | NL80211_MCGRP_MLME, gfp); |
10967 | return; | 10967 | return; |
10968 | 10968 | ||
10969 | nla_put_failure: | 10969 | nla_put_failure: |
@@ -11002,8 +11002,8 @@ void cfg80211_probe_status(struct net_device *dev, const u8 *addr, | |||
11002 | 11002 | ||
11003 | genlmsg_end(msg, hdr); | 11003 | genlmsg_end(msg, hdr); |
11004 | 11004 | ||
11005 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 11005 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
11006 | nl80211_mlme_mcgrp.id, gfp); | 11006 | NL80211_MCGRP_MLME, gfp); |
11007 | return; | 11007 | return; |
11008 | 11008 | ||
11009 | nla_put_failure: | 11009 | nla_put_failure: |
@@ -11154,8 +11154,8 @@ void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, | |||
11154 | 11154 | ||
11155 | genlmsg_end(msg, hdr); | 11155 | genlmsg_end(msg, hdr); |
11156 | 11156 | ||
11157 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 11157 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
11158 | nl80211_mlme_mcgrp.id, gfp); | 11158 | NL80211_MCGRP_MLME, gfp); |
11159 | return; | 11159 | return; |
11160 | 11160 | ||
11161 | free_msg: | 11161 | free_msg: |
@@ -11196,8 +11196,8 @@ void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, | |||
11196 | 11196 | ||
11197 | genlmsg_end(msg, hdr); | 11197 | genlmsg_end(msg, hdr); |
11198 | 11198 | ||
11199 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 11199 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
11200 | nl80211_mlme_mcgrp.id, gfp); | 11200 | NL80211_MCGRP_MLME, gfp); |
11201 | return; | 11201 | return; |
11202 | 11202 | ||
11203 | nla_put_failure: | 11203 | nla_put_failure: |
@@ -11279,8 +11279,8 @@ void cfg80211_ft_event(struct net_device *netdev, | |||
11279 | 11279 | ||
11280 | genlmsg_end(msg, hdr); | 11280 | genlmsg_end(msg, hdr); |
11281 | 11281 | ||
11282 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | 11282 | genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, |
11283 | nl80211_mlme_mcgrp.id, GFP_KERNEL); | 11283 | NL80211_MCGRP_MLME, GFP_KERNEL); |
11284 | } | 11284 | } |
11285 | EXPORT_SYMBOL(cfg80211_ft_event); | 11285 | EXPORT_SYMBOL(cfg80211_ft_event); |
11286 | 11286 | ||
@@ -11329,33 +11329,11 @@ int nl80211_init(void) | |||
11329 | { | 11329 | { |
11330 | int err; | 11330 | int err; |
11331 | 11331 | ||
11332 | err = genl_register_family_with_ops(&nl80211_fam, | 11332 | err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops, |
11333 | nl80211_ops, ARRAY_SIZE(nl80211_ops)); | 11333 | nl80211_mcgrps); |
11334 | if (err) | 11334 | if (err) |
11335 | return err; | 11335 | return err; |
11336 | 11336 | ||
11337 | err = genl_register_mc_group(&nl80211_fam, &nl80211_config_mcgrp); | ||
11338 | if (err) | ||
11339 | goto err_out; | ||
11340 | |||
11341 | err = genl_register_mc_group(&nl80211_fam, &nl80211_scan_mcgrp); | ||
11342 | if (err) | ||
11343 | goto err_out; | ||
11344 | |||
11345 | err = genl_register_mc_group(&nl80211_fam, &nl80211_regulatory_mcgrp); | ||
11346 | if (err) | ||
11347 | goto err_out; | ||
11348 | |||
11349 | err = genl_register_mc_group(&nl80211_fam, &nl80211_mlme_mcgrp); | ||
11350 | if (err) | ||
11351 | goto err_out; | ||
11352 | |||
11353 | #ifdef CONFIG_NL80211_TESTMODE | ||
11354 | err = genl_register_mc_group(&nl80211_fam, &nl80211_testmode_mcgrp); | ||
11355 | if (err) | ||
11356 | goto err_out; | ||
11357 | #endif | ||
11358 | |||
11359 | err = netlink_register_notifier(&nl80211_netlink_notifier); | 11337 | err = netlink_register_notifier(&nl80211_netlink_notifier); |
11360 | if (err) | 11338 | if (err) |
11361 | goto err_out; | 11339 | goto err_out; |
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index 45a3ab5612c1..7622789d3750 100644 --- a/net/x25/af_x25.c +++ b/net/x25/af_x25.c | |||
@@ -1340,10 +1340,9 @@ static int x25_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1340 | if (sx25) { | 1340 | if (sx25) { |
1341 | sx25->sx25_family = AF_X25; | 1341 | sx25->sx25_family = AF_X25; |
1342 | sx25->sx25_addr = x25->dest_addr; | 1342 | sx25->sx25_addr = x25->dest_addr; |
1343 | msg->msg_namelen = sizeof(*sx25); | ||
1343 | } | 1344 | } |
1344 | 1345 | ||
1345 | msg->msg_namelen = sizeof(struct sockaddr_x25); | ||
1346 | |||
1347 | x25_check_rbuf(sk); | 1346 | x25_check_rbuf(sk); |
1348 | rc = copied; | 1347 | rc = copied; |
1349 | out_free_dgram: | 1348 | out_free_dgram: |