diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/8021q/vlan_core.c | 4 | ||||
| -rw-r--r-- | net/bluetooth/hci_sysfs.c | 3 | ||||
| -rw-r--r-- | net/bluetooth/l2cap.c | 48 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/core.c | 41 | ||||
| -rw-r--r-- | net/bluetooth/rfcomm/sock.c | 38 | ||||
| -rw-r--r-- | net/bluetooth/sco.c | 38 | ||||
| -rw-r--r-- | net/core/dev.c | 8 | ||||
| -rw-r--r-- | net/ipv4/fib_trie.c | 4 | ||||
| -rw-r--r-- | net/ipv4/ip_gre.c | 4 | ||||
| -rw-r--r-- | net/ipv4/ipmr.c | 3 | ||||
| -rw-r--r-- | net/ipv4/route.c | 17 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 65 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 3 | ||||
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 5 | ||||
| -rw-r--r-- | net/ipv6/ip6mr.c | 3 | ||||
| -rw-r--r-- | net/ipv6/route.c | 2 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_netlink.c | 4 | ||||
| -rw-r--r-- | net/netfilter/nfnetlink.c | 4 | ||||
| -rw-r--r-- | net/netlink/af_netlink.c | 17 | ||||
| -rw-r--r-- | net/rxrpc/ar-accept.c | 6 |
20 files changed, 227 insertions, 90 deletions
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index c0316e0ca6e8..c584a0af77d3 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c | |||
| @@ -11,7 +11,7 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | |||
| 11 | if (netpoll_rx(skb)) | 11 | if (netpoll_rx(skb)) |
| 12 | return NET_RX_DROP; | 12 | return NET_RX_DROP; |
| 13 | 13 | ||
| 14 | if (skb_bond_should_drop(skb)) | 14 | if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) |
| 15 | goto drop; | 15 | goto drop; |
| 16 | 16 | ||
| 17 | skb->skb_iif = skb->dev->ifindex; | 17 | skb->skb_iif = skb->dev->ifindex; |
| @@ -83,7 +83,7 @@ vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp, | |||
| 83 | { | 83 | { |
| 84 | struct sk_buff *p; | 84 | struct sk_buff *p; |
| 85 | 85 | ||
| 86 | if (skb_bond_should_drop(skb)) | 86 | if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) |
| 87 | goto drop; | 87 | goto drop; |
| 88 | 88 | ||
| 89 | skb->skb_iif = skb->dev->ifindex; | 89 | skb->skb_iif = skb->dev->ifindex; |
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index cafb55b0cea5..05fd125f74fe 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
| @@ -8,8 +8,7 @@ | |||
| 8 | #include <net/bluetooth/bluetooth.h> | 8 | #include <net/bluetooth/bluetooth.h> |
| 9 | #include <net/bluetooth/hci_core.h> | 9 | #include <net/bluetooth/hci_core.h> |
| 10 | 10 | ||
| 11 | struct class *bt_class = NULL; | 11 | static struct class *bt_class; |
| 12 | EXPORT_SYMBOL_GPL(bt_class); | ||
| 13 | 12 | ||
| 14 | struct dentry *bt_debugfs = NULL; | 13 | struct dentry *bt_debugfs = NULL; |
| 15 | EXPORT_SYMBOL_GPL(bt_debugfs); | 14 | EXPORT_SYMBOL_GPL(bt_debugfs); |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 4db7ae2fe07d..7794a2e2adce 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -40,6 +40,8 @@ | |||
| 40 | #include <linux/skbuff.h> | 40 | #include <linux/skbuff.h> |
| 41 | #include <linux/list.h> | 41 | #include <linux/list.h> |
| 42 | #include <linux/device.h> | 42 | #include <linux/device.h> |
| 43 | #include <linux/debugfs.h> | ||
| 44 | #include <linux/seq_file.h> | ||
| 43 | #include <linux/uaccess.h> | 45 | #include <linux/uaccess.h> |
| 44 | #include <linux/crc16.h> | 46 | #include <linux/crc16.h> |
| 45 | #include <net/sock.h> | 47 | #include <net/sock.h> |
| @@ -2830,6 +2832,11 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
| 2830 | int len = cmd->len - sizeof(*rsp); | 2832 | int len = cmd->len - sizeof(*rsp); |
| 2831 | char req[64]; | 2833 | char req[64]; |
| 2832 | 2834 | ||
| 2835 | if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { | ||
| 2836 | l2cap_send_disconn_req(conn, sk); | ||
| 2837 | goto done; | ||
| 2838 | } | ||
| 2839 | |||
| 2833 | /* throw out any old stored conf requests */ | 2840 | /* throw out any old stored conf requests */ |
| 2834 | result = L2CAP_CONF_SUCCESS; | 2841 | result = L2CAP_CONF_SUCCESS; |
| 2835 | len = l2cap_parse_conf_rsp(sk, rsp->data, | 2842 | len = l2cap_parse_conf_rsp(sk, rsp->data, |
| @@ -3937,31 +3944,42 @@ drop: | |||
| 3937 | return 0; | 3944 | return 0; |
| 3938 | } | 3945 | } |
| 3939 | 3946 | ||
| 3940 | static ssize_t l2cap_sysfs_show(struct class *dev, | 3947 | static int l2cap_debugfs_show(struct seq_file *f, void *p) |
| 3941 | struct class_attribute *attr, | ||
| 3942 | char *buf) | ||
| 3943 | { | 3948 | { |
| 3944 | struct sock *sk; | 3949 | struct sock *sk; |
| 3945 | struct hlist_node *node; | 3950 | struct hlist_node *node; |
| 3946 | char *str = buf; | ||
| 3947 | 3951 | ||
| 3948 | read_lock_bh(&l2cap_sk_list.lock); | 3952 | read_lock_bh(&l2cap_sk_list.lock); |
| 3949 | 3953 | ||
| 3950 | sk_for_each(sk, node, &l2cap_sk_list.head) { | 3954 | sk_for_each(sk, node, &l2cap_sk_list.head) { |
| 3951 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 3955 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
| 3952 | 3956 | ||
| 3953 | str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n", | 3957 | seq_printf(f, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n", |
| 3954 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), | 3958 | batostr(&bt_sk(sk)->src), |
| 3955 | sk->sk_state, __le16_to_cpu(pi->psm), pi->scid, | 3959 | batostr(&bt_sk(sk)->dst), |
| 3956 | pi->dcid, pi->imtu, pi->omtu, pi->sec_level); | 3960 | sk->sk_state, __le16_to_cpu(pi->psm), |
| 3961 | pi->scid, pi->dcid, | ||
| 3962 | pi->imtu, pi->omtu, pi->sec_level); | ||
| 3957 | } | 3963 | } |
| 3958 | 3964 | ||
| 3959 | read_unlock_bh(&l2cap_sk_list.lock); | 3965 | read_unlock_bh(&l2cap_sk_list.lock); |
| 3960 | 3966 | ||
| 3961 | return str - buf; | 3967 | return 0; |
| 3962 | } | 3968 | } |
| 3963 | 3969 | ||
| 3964 | static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL); | 3970 | static int l2cap_debugfs_open(struct inode *inode, struct file *file) |
| 3971 | { | ||
| 3972 | return single_open(file, l2cap_debugfs_show, inode->i_private); | ||
| 3973 | } | ||
| 3974 | |||
| 3975 | static const struct file_operations l2cap_debugfs_fops = { | ||
| 3976 | .open = l2cap_debugfs_open, | ||
| 3977 | .read = seq_read, | ||
| 3978 | .llseek = seq_lseek, | ||
| 3979 | .release = single_release, | ||
| 3980 | }; | ||
| 3981 | |||
| 3982 | static struct dentry *l2cap_debugfs; | ||
| 3965 | 3983 | ||
| 3966 | static const struct proto_ops l2cap_sock_ops = { | 3984 | static const struct proto_ops l2cap_sock_ops = { |
| 3967 | .family = PF_BLUETOOTH, | 3985 | .family = PF_BLUETOOTH, |
| @@ -4021,8 +4039,12 @@ static int __init l2cap_init(void) | |||
| 4021 | goto error; | 4039 | goto error; |
| 4022 | } | 4040 | } |
| 4023 | 4041 | ||
| 4024 | if (class_create_file(bt_class, &class_attr_l2cap) < 0) | 4042 | if (bt_debugfs) { |
| 4025 | BT_ERR("Failed to create L2CAP info file"); | 4043 | l2cap_debugfs = debugfs_create_file("l2cap", 0444, |
| 4044 | bt_debugfs, NULL, &l2cap_debugfs_fops); | ||
| 4045 | if (!l2cap_debugfs) | ||
| 4046 | BT_ERR("Failed to create L2CAP debug file"); | ||
| 4047 | } | ||
| 4026 | 4048 | ||
| 4027 | BT_INFO("L2CAP ver %s", VERSION); | 4049 | BT_INFO("L2CAP ver %s", VERSION); |
| 4028 | BT_INFO("L2CAP socket layer initialized"); | 4050 | BT_INFO("L2CAP socket layer initialized"); |
| @@ -4036,7 +4058,7 @@ error: | |||
| 4036 | 4058 | ||
| 4037 | static void __exit l2cap_exit(void) | 4059 | static void __exit l2cap_exit(void) |
| 4038 | { | 4060 | { |
| 4039 | class_remove_file(bt_class, &class_attr_l2cap); | 4061 | debugfs_remove(l2cap_debugfs); |
| 4040 | 4062 | ||
| 4041 | if (bt_sock_unregister(BTPROTO_L2CAP) < 0) | 4063 | if (bt_sock_unregister(BTPROTO_L2CAP) < 0) |
| 4042 | BT_ERR("L2CAP socket unregistration failed"); | 4064 | BT_ERR("L2CAP socket unregistration failed"); |
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index db8a68e1a5ba..13f114e8b0f9 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
| @@ -33,6 +33,8 @@ | |||
| 33 | #include <linux/init.h> | 33 | #include <linux/init.h> |
| 34 | #include <linux/wait.h> | 34 | #include <linux/wait.h> |
| 35 | #include <linux/device.h> | 35 | #include <linux/device.h> |
| 36 | #include <linux/debugfs.h> | ||
| 37 | #include <linux/seq_file.h> | ||
| 36 | #include <linux/net.h> | 38 | #include <linux/net.h> |
| 37 | #include <linux/mutex.h> | 39 | #include <linux/mutex.h> |
| 38 | #include <linux/kthread.h> | 40 | #include <linux/kthread.h> |
| @@ -2098,13 +2100,10 @@ static struct hci_cb rfcomm_cb = { | |||
| 2098 | .security_cfm = rfcomm_security_cfm | 2100 | .security_cfm = rfcomm_security_cfm |
| 2099 | }; | 2101 | }; |
| 2100 | 2102 | ||
| 2101 | static ssize_t rfcomm_dlc_sysfs_show(struct class *dev, | 2103 | static int rfcomm_dlc_debugfs_show(struct seq_file *f, void *x) |
| 2102 | struct class_attribute *attr, | ||
| 2103 | char *buf) | ||
| 2104 | { | 2104 | { |
| 2105 | struct rfcomm_session *s; | 2105 | struct rfcomm_session *s; |
| 2106 | struct list_head *pp, *p; | 2106 | struct list_head *pp, *p; |
| 2107 | char *str = buf; | ||
| 2108 | 2107 | ||
| 2109 | rfcomm_lock(); | 2108 | rfcomm_lock(); |
| 2110 | 2109 | ||
| @@ -2114,18 +2113,32 @@ static ssize_t rfcomm_dlc_sysfs_show(struct class *dev, | |||
| 2114 | struct sock *sk = s->sock->sk; | 2113 | struct sock *sk = s->sock->sk; |
| 2115 | struct rfcomm_dlc *d = list_entry(pp, struct rfcomm_dlc, list); | 2114 | struct rfcomm_dlc *d = list_entry(pp, struct rfcomm_dlc, list); |
| 2116 | 2115 | ||
| 2117 | str += sprintf(str, "%s %s %ld %d %d %d %d\n", | 2116 | seq_printf(f, "%s %s %ld %d %d %d %d\n", |
| 2118 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), | 2117 | batostr(&bt_sk(sk)->src), |
| 2119 | d->state, d->dlci, d->mtu, d->rx_credits, d->tx_credits); | 2118 | batostr(&bt_sk(sk)->dst), |
| 2119 | d->state, d->dlci, d->mtu, | ||
| 2120 | d->rx_credits, d->tx_credits); | ||
| 2120 | } | 2121 | } |
| 2121 | } | 2122 | } |
| 2122 | 2123 | ||
| 2123 | rfcomm_unlock(); | 2124 | rfcomm_unlock(); |
| 2124 | 2125 | ||
| 2125 | return (str - buf); | 2126 | return 0; |
| 2126 | } | 2127 | } |
| 2127 | 2128 | ||
| 2128 | static CLASS_ATTR(rfcomm_dlc, S_IRUGO, rfcomm_dlc_sysfs_show, NULL); | 2129 | static int rfcomm_dlc_debugfs_open(struct inode *inode, struct file *file) |
| 2130 | { | ||
| 2131 | return single_open(file, rfcomm_dlc_debugfs_show, inode->i_private); | ||
| 2132 | } | ||
| 2133 | |||
| 2134 | static const struct file_operations rfcomm_dlc_debugfs_fops = { | ||
| 2135 | .open = rfcomm_dlc_debugfs_open, | ||
| 2136 | .read = seq_read, | ||
| 2137 | .llseek = seq_lseek, | ||
| 2138 | .release = single_release, | ||
| 2139 | }; | ||
| 2140 | |||
| 2141 | static struct dentry *rfcomm_dlc_debugfs; | ||
| 2129 | 2142 | ||
| 2130 | /* ---- Initialization ---- */ | 2143 | /* ---- Initialization ---- */ |
| 2131 | static int __init rfcomm_init(void) | 2144 | static int __init rfcomm_init(void) |
| @@ -2142,8 +2155,12 @@ static int __init rfcomm_init(void) | |||
| 2142 | goto unregister; | 2155 | goto unregister; |
| 2143 | } | 2156 | } |
| 2144 | 2157 | ||
| 2145 | if (class_create_file(bt_class, &class_attr_rfcomm_dlc) < 0) | 2158 | if (bt_debugfs) { |
| 2146 | BT_ERR("Failed to create RFCOMM info file"); | 2159 | rfcomm_dlc_debugfs = debugfs_create_file("rfcomm_dlc", 0444, |
| 2160 | bt_debugfs, NULL, &rfcomm_dlc_debugfs_fops); | ||
| 2161 | if (!rfcomm_dlc_debugfs) | ||
| 2162 | BT_ERR("Failed to create RFCOMM debug file"); | ||
| 2163 | } | ||
| 2147 | 2164 | ||
| 2148 | err = rfcomm_init_ttys(); | 2165 | err = rfcomm_init_ttys(); |
| 2149 | if (err < 0) | 2166 | if (err < 0) |
| @@ -2171,7 +2188,7 @@ unregister: | |||
| 2171 | 2188 | ||
| 2172 | static void __exit rfcomm_exit(void) | 2189 | static void __exit rfcomm_exit(void) |
| 2173 | { | 2190 | { |
| 2174 | class_remove_file(bt_class, &class_attr_rfcomm_dlc); | 2191 | debugfs_remove(rfcomm_dlc_debugfs); |
| 2175 | 2192 | ||
| 2176 | hci_unregister_cb(&rfcomm_cb); | 2193 | hci_unregister_cb(&rfcomm_cb); |
| 2177 | 2194 | ||
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index ca87d6ac6a20..7f439765403d 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
| @@ -40,6 +40,8 @@ | |||
| 40 | #include <linux/skbuff.h> | 40 | #include <linux/skbuff.h> |
| 41 | #include <linux/list.h> | 41 | #include <linux/list.h> |
| 42 | #include <linux/device.h> | 42 | #include <linux/device.h> |
| 43 | #include <linux/debugfs.h> | ||
| 44 | #include <linux/seq_file.h> | ||
| 43 | #include <net/sock.h> | 45 | #include <net/sock.h> |
| 44 | 46 | ||
| 45 | #include <asm/system.h> | 47 | #include <asm/system.h> |
| @@ -1061,28 +1063,38 @@ done: | |||
| 1061 | return result; | 1063 | return result; |
| 1062 | } | 1064 | } |
| 1063 | 1065 | ||
| 1064 | static ssize_t rfcomm_sock_sysfs_show(struct class *dev, | 1066 | static int rfcomm_sock_debugfs_show(struct seq_file *f, void *p) |
| 1065 | struct class_attribute *attr, | ||
| 1066 | char *buf) | ||
| 1067 | { | 1067 | { |
| 1068 | struct sock *sk; | 1068 | struct sock *sk; |
| 1069 | struct hlist_node *node; | 1069 | struct hlist_node *node; |
| 1070 | char *str = buf; | ||
| 1071 | 1070 | ||
| 1072 | read_lock_bh(&rfcomm_sk_list.lock); | 1071 | read_lock_bh(&rfcomm_sk_list.lock); |
| 1073 | 1072 | ||
| 1074 | sk_for_each(sk, node, &rfcomm_sk_list.head) { | 1073 | sk_for_each(sk, node, &rfcomm_sk_list.head) { |
| 1075 | str += sprintf(str, "%s %s %d %d\n", | 1074 | seq_printf(f, "%s %s %d %d\n", |
| 1076 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), | 1075 | batostr(&bt_sk(sk)->src), |
| 1076 | batostr(&bt_sk(sk)->dst), | ||
| 1077 | sk->sk_state, rfcomm_pi(sk)->channel); | 1077 | sk->sk_state, rfcomm_pi(sk)->channel); |
| 1078 | } | 1078 | } |
| 1079 | 1079 | ||
| 1080 | read_unlock_bh(&rfcomm_sk_list.lock); | 1080 | read_unlock_bh(&rfcomm_sk_list.lock); |
| 1081 | 1081 | ||
| 1082 | return (str - buf); | 1082 | return 0; |
| 1083 | } | 1083 | } |
| 1084 | 1084 | ||
| 1085 | static CLASS_ATTR(rfcomm, S_IRUGO, rfcomm_sock_sysfs_show, NULL); | 1085 | static int rfcomm_sock_debugfs_open(struct inode *inode, struct file *file) |
| 1086 | { | ||
| 1087 | return single_open(file, rfcomm_sock_debugfs_show, inode->i_private); | ||
| 1088 | } | ||
| 1089 | |||
| 1090 | static const struct file_operations rfcomm_sock_debugfs_fops = { | ||
| 1091 | .open = rfcomm_sock_debugfs_open, | ||
| 1092 | .read = seq_read, | ||
| 1093 | .llseek = seq_lseek, | ||
| 1094 | .release = single_release, | ||
| 1095 | }; | ||
| 1096 | |||
| 1097 | static struct dentry *rfcomm_sock_debugfs; | ||
| 1086 | 1098 | ||
| 1087 | static const struct proto_ops rfcomm_sock_ops = { | 1099 | static const struct proto_ops rfcomm_sock_ops = { |
| 1088 | .family = PF_BLUETOOTH, | 1100 | .family = PF_BLUETOOTH, |
| @@ -1122,8 +1134,12 @@ int __init rfcomm_init_sockets(void) | |||
| 1122 | if (err < 0) | 1134 | if (err < 0) |
| 1123 | goto error; | 1135 | goto error; |
| 1124 | 1136 | ||
| 1125 | if (class_create_file(bt_class, &class_attr_rfcomm) < 0) | 1137 | if (bt_debugfs) { |
| 1126 | BT_ERR("Failed to create RFCOMM info file"); | 1138 | rfcomm_sock_debugfs = debugfs_create_file("rfcomm", 0444, |
| 1139 | bt_debugfs, NULL, &rfcomm_sock_debugfs_fops); | ||
| 1140 | if (!rfcomm_sock_debugfs) | ||
| 1141 | BT_ERR("Failed to create RFCOMM debug file"); | ||
| 1142 | } | ||
| 1127 | 1143 | ||
| 1128 | BT_INFO("RFCOMM socket layer initialized"); | 1144 | BT_INFO("RFCOMM socket layer initialized"); |
| 1129 | 1145 | ||
| @@ -1137,7 +1153,7 @@ error: | |||
| 1137 | 1153 | ||
| 1138 | void rfcomm_cleanup_sockets(void) | 1154 | void rfcomm_cleanup_sockets(void) |
| 1139 | { | 1155 | { |
| 1140 | class_remove_file(bt_class, &class_attr_rfcomm); | 1156 | debugfs_remove(rfcomm_sock_debugfs); |
| 1141 | 1157 | ||
| 1142 | if (bt_sock_unregister(BTPROTO_RFCOMM) < 0) | 1158 | if (bt_sock_unregister(BTPROTO_RFCOMM) < 0) |
| 1143 | BT_ERR("RFCOMM socket layer unregistration failed"); | 1159 | BT_ERR("RFCOMM socket layer unregistration failed"); |
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index f93b939539bc..e5b16b76b22e 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
| @@ -38,6 +38,8 @@ | |||
| 38 | #include <linux/socket.h> | 38 | #include <linux/socket.h> |
| 39 | #include <linux/skbuff.h> | 39 | #include <linux/skbuff.h> |
| 40 | #include <linux/device.h> | 40 | #include <linux/device.h> |
| 41 | #include <linux/debugfs.h> | ||
| 42 | #include <linux/seq_file.h> | ||
| 41 | #include <linux/list.h> | 43 | #include <linux/list.h> |
| 42 | #include <net/sock.h> | 44 | #include <net/sock.h> |
| 43 | 45 | ||
| @@ -953,28 +955,36 @@ drop: | |||
| 953 | return 0; | 955 | return 0; |
| 954 | } | 956 | } |
| 955 | 957 | ||
| 956 | static ssize_t sco_sysfs_show(struct class *dev, | 958 | static int sco_debugfs_show(struct seq_file *f, void *p) |
| 957 | struct class_attribute *attr, | ||
| 958 | char *buf) | ||
| 959 | { | 959 | { |
| 960 | struct sock *sk; | 960 | struct sock *sk; |
| 961 | struct hlist_node *node; | 961 | struct hlist_node *node; |
| 962 | char *str = buf; | ||
| 963 | 962 | ||
| 964 | read_lock_bh(&sco_sk_list.lock); | 963 | read_lock_bh(&sco_sk_list.lock); |
| 965 | 964 | ||
| 966 | sk_for_each(sk, node, &sco_sk_list.head) { | 965 | sk_for_each(sk, node, &sco_sk_list.head) { |
| 967 | str += sprintf(str, "%s %s %d\n", | 966 | seq_printf(f, "%s %s %d\n", batostr(&bt_sk(sk)->src), |
| 968 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), | 967 | batostr(&bt_sk(sk)->dst), sk->sk_state); |
| 969 | sk->sk_state); | ||
| 970 | } | 968 | } |
| 971 | 969 | ||
| 972 | read_unlock_bh(&sco_sk_list.lock); | 970 | read_unlock_bh(&sco_sk_list.lock); |
| 973 | 971 | ||
| 974 | return (str - buf); | 972 | return 0; |
| 975 | } | 973 | } |
| 976 | 974 | ||
| 977 | static CLASS_ATTR(sco, S_IRUGO, sco_sysfs_show, NULL); | 975 | static int sco_debugfs_open(struct inode *inode, struct file *file) |
| 976 | { | ||
| 977 | return single_open(file, sco_debugfs_show, inode->i_private); | ||
| 978 | } | ||
| 979 | |||
| 980 | static const struct file_operations sco_debugfs_fops = { | ||
| 981 | .open = sco_debugfs_open, | ||
| 982 | .read = seq_read, | ||
| 983 | .llseek = seq_lseek, | ||
| 984 | .release = single_release, | ||
| 985 | }; | ||
| 986 | |||
| 987 | static struct dentry *sco_debugfs; | ||
| 978 | 988 | ||
| 979 | static const struct proto_ops sco_sock_ops = { | 989 | static const struct proto_ops sco_sock_ops = { |
| 980 | .family = PF_BLUETOOTH, | 990 | .family = PF_BLUETOOTH, |
| @@ -1032,8 +1042,12 @@ static int __init sco_init(void) | |||
| 1032 | goto error; | 1042 | goto error; |
| 1033 | } | 1043 | } |
| 1034 | 1044 | ||
| 1035 | if (class_create_file(bt_class, &class_attr_sco) < 0) | 1045 | if (bt_debugfs) { |
| 1036 | BT_ERR("Failed to create SCO info file"); | 1046 | sco_debugfs = debugfs_create_file("sco", 0444, |
| 1047 | bt_debugfs, NULL, &sco_debugfs_fops); | ||
| 1048 | if (!sco_debugfs) | ||
| 1049 | BT_ERR("Failed to create SCO debug file"); | ||
| 1050 | } | ||
| 1037 | 1051 | ||
| 1038 | BT_INFO("SCO (Voice Link) ver %s", VERSION); | 1052 | BT_INFO("SCO (Voice Link) ver %s", VERSION); |
| 1039 | BT_INFO("SCO socket layer initialized"); | 1053 | BT_INFO("SCO socket layer initialized"); |
| @@ -1047,7 +1061,7 @@ error: | |||
| 1047 | 1061 | ||
| 1048 | static void __exit sco_exit(void) | 1062 | static void __exit sco_exit(void) |
| 1049 | { | 1063 | { |
| 1050 | class_remove_file(bt_class, &class_attr_sco); | 1064 | debugfs_remove(sco_debugfs); |
| 1051 | 1065 | ||
| 1052 | if (bt_sock_unregister(BTPROTO_SCO) < 0) | 1066 | if (bt_sock_unregister(BTPROTO_SCO) < 0) |
| 1053 | BT_ERR("SCO socket unregistration failed"); | 1067 | BT_ERR("SCO socket unregistration failed"); |
diff --git a/net/core/dev.c b/net/core/dev.c index bcc490cc9452..59d4394d2ce8 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2483,6 +2483,7 @@ int netif_receive_skb(struct sk_buff *skb) | |||
| 2483 | { | 2483 | { |
| 2484 | struct packet_type *ptype, *pt_prev; | 2484 | struct packet_type *ptype, *pt_prev; |
| 2485 | struct net_device *orig_dev; | 2485 | struct net_device *orig_dev; |
| 2486 | struct net_device *master; | ||
| 2486 | struct net_device *null_or_orig; | 2487 | struct net_device *null_or_orig; |
| 2487 | struct net_device *null_or_bond; | 2488 | struct net_device *null_or_bond; |
| 2488 | int ret = NET_RX_DROP; | 2489 | int ret = NET_RX_DROP; |
| @@ -2503,11 +2504,12 @@ int netif_receive_skb(struct sk_buff *skb) | |||
| 2503 | 2504 | ||
| 2504 | null_or_orig = NULL; | 2505 | null_or_orig = NULL; |
| 2505 | orig_dev = skb->dev; | 2506 | orig_dev = skb->dev; |
| 2506 | if (orig_dev->master) { | 2507 | master = ACCESS_ONCE(orig_dev->master); |
| 2507 | if (skb_bond_should_drop(skb)) | 2508 | if (master) { |
| 2509 | if (skb_bond_should_drop(skb, master)) | ||
| 2508 | null_or_orig = orig_dev; /* deliver only exact match */ | 2510 | null_or_orig = orig_dev; /* deliver only exact match */ |
| 2509 | else | 2511 | else |
| 2510 | skb->dev = orig_dev->master; | 2512 | skb->dev = master; |
| 2511 | } | 2513 | } |
| 2512 | 2514 | ||
| 2513 | __get_cpu_var(netdev_rx_stat).total++; | 2515 | __get_cpu_var(netdev_rx_stat).total++; |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index af5d89792860..01ef8ba9025c 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
| @@ -961,7 +961,9 @@ fib_find_node(struct trie *t, u32 key) | |||
| 961 | struct node *n; | 961 | struct node *n; |
| 962 | 962 | ||
| 963 | pos = 0; | 963 | pos = 0; |
| 964 | n = rcu_dereference(t->trie); | 964 | n = rcu_dereference_check(t->trie, |
| 965 | rcu_read_lock_held() || | ||
| 966 | lockdep_rtnl_is_held()); | ||
| 965 | 967 | ||
| 966 | while (n != NULL && NODE_TYPE(n) == T_TNODE) { | 968 | while (n != NULL && NODE_TYPE(n) == T_TNODE) { |
| 967 | tn = (struct tnode *) n; | 969 | tn = (struct tnode *) n; |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index f47c9f76754b..f78402d097b3 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
| @@ -810,11 +810,13 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev | |||
| 810 | tunnel->err_count = 0; | 810 | tunnel->err_count = 0; |
| 811 | } | 811 | } |
| 812 | 812 | ||
| 813 | max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen; | 813 | max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen + rt->u.dst.header_len; |
| 814 | 814 | ||
| 815 | if (skb_headroom(skb) < max_headroom || skb_shared(skb)|| | 815 | if (skb_headroom(skb) < max_headroom || skb_shared(skb)|| |
| 816 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { | 816 | (skb_cloned(skb) && !skb_clone_writable(skb, 0))) { |
| 817 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); | 817 | struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom); |
| 818 | if (max_headroom > dev->needed_headroom) | ||
| 819 | dev->needed_headroom = max_headroom; | ||
| 818 | if (!new_skb) { | 820 | if (!new_skb) { |
| 819 | ip_rt_put(rt); | 821 | ip_rt_put(rt); |
| 820 | txq->tx_dropped++; | 822 | txq->tx_dropped++; |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 8582e12e4a62..0b9d03c54dc3 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -802,6 +802,9 @@ static int ipmr_mfc_add(struct net *net, struct mfcctl *mfc, int mrtsock) | |||
| 802 | int line; | 802 | int line; |
| 803 | struct mfc_cache *uc, *c, **cp; | 803 | struct mfc_cache *uc, *c, **cp; |
| 804 | 804 | ||
| 805 | if (mfc->mfcc_parent >= MAXVIFS) | ||
| 806 | return -ENFILE; | ||
| 807 | |||
| 805 | line = MFC_HASH(mfc->mfcc_mcastgrp.s_addr, mfc->mfcc_origin.s_addr); | 808 | line = MFC_HASH(mfc->mfcc_mcastgrp.s_addr, mfc->mfcc_origin.s_addr); |
| 806 | 809 | ||
| 807 | for (cp = &net->ipv4.mfc_cache_array[line]; | 810 | for (cp = &net->ipv4.mfc_cache_array[line]; |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index a770df2493d2..54fd68c14c87 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -1441,7 +1441,7 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw, | |||
| 1441 | dev_hold(rt->u.dst.dev); | 1441 | dev_hold(rt->u.dst.dev); |
| 1442 | if (rt->idev) | 1442 | if (rt->idev) |
| 1443 | in_dev_hold(rt->idev); | 1443 | in_dev_hold(rt->idev); |
| 1444 | rt->u.dst.obsolete = 0; | 1444 | rt->u.dst.obsolete = -1; |
| 1445 | rt->u.dst.lastuse = jiffies; | 1445 | rt->u.dst.lastuse = jiffies; |
| 1446 | rt->u.dst.path = &rt->u.dst; | 1446 | rt->u.dst.path = &rt->u.dst; |
| 1447 | rt->u.dst.neighbour = NULL; | 1447 | rt->u.dst.neighbour = NULL; |
| @@ -1506,11 +1506,12 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) | |||
| 1506 | struct dst_entry *ret = dst; | 1506 | struct dst_entry *ret = dst; |
| 1507 | 1507 | ||
| 1508 | if (rt) { | 1508 | if (rt) { |
| 1509 | if (dst->obsolete) { | 1509 | if (dst->obsolete > 0) { |
| 1510 | ip_rt_put(rt); | 1510 | ip_rt_put(rt); |
| 1511 | ret = NULL; | 1511 | ret = NULL; |
| 1512 | } else if ((rt->rt_flags & RTCF_REDIRECTED) || | 1512 | } else if ((rt->rt_flags & RTCF_REDIRECTED) || |
| 1513 | rt->u.dst.expires) { | 1513 | (rt->u.dst.expires && |
| 1514 | time_after_eq(jiffies, rt->u.dst.expires))) { | ||
| 1514 | unsigned hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src, | 1515 | unsigned hash = rt_hash(rt->fl.fl4_dst, rt->fl.fl4_src, |
| 1515 | rt->fl.oif, | 1516 | rt->fl.oif, |
| 1516 | rt_genid(dev_net(dst->dev))); | 1517 | rt_genid(dev_net(dst->dev))); |
| @@ -1726,7 +1727,9 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu) | |||
| 1726 | 1727 | ||
| 1727 | static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) | 1728 | static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) |
| 1728 | { | 1729 | { |
| 1729 | return NULL; | 1730 | if (rt_is_expired((struct rtable *)dst)) |
| 1731 | return NULL; | ||
| 1732 | return dst; | ||
| 1730 | } | 1733 | } |
| 1731 | 1734 | ||
| 1732 | static void ipv4_dst_destroy(struct dst_entry *dst) | 1735 | static void ipv4_dst_destroy(struct dst_entry *dst) |
| @@ -1888,7 +1891,8 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
| 1888 | if (!rth) | 1891 | if (!rth) |
| 1889 | goto e_nobufs; | 1892 | goto e_nobufs; |
| 1890 | 1893 | ||
| 1891 | rth->u.dst.output= ip_rt_bug; | 1894 | rth->u.dst.output = ip_rt_bug; |
| 1895 | rth->u.dst.obsolete = -1; | ||
| 1892 | 1896 | ||
| 1893 | atomic_set(&rth->u.dst.__refcnt, 1); | 1897 | atomic_set(&rth->u.dst.__refcnt, 1); |
| 1894 | rth->u.dst.flags= DST_HOST; | 1898 | rth->u.dst.flags= DST_HOST; |
| @@ -2054,6 +2058,7 @@ static int __mkroute_input(struct sk_buff *skb, | |||
| 2054 | rth->fl.oif = 0; | 2058 | rth->fl.oif = 0; |
| 2055 | rth->rt_spec_dst= spec_dst; | 2059 | rth->rt_spec_dst= spec_dst; |
| 2056 | 2060 | ||
| 2061 | rth->u.dst.obsolete = -1; | ||
| 2057 | rth->u.dst.input = ip_forward; | 2062 | rth->u.dst.input = ip_forward; |
| 2058 | rth->u.dst.output = ip_output; | 2063 | rth->u.dst.output = ip_output; |
| 2059 | rth->rt_genid = rt_genid(dev_net(rth->u.dst.dev)); | 2064 | rth->rt_genid = rt_genid(dev_net(rth->u.dst.dev)); |
| @@ -2218,6 +2223,7 @@ local_input: | |||
| 2218 | goto e_nobufs; | 2223 | goto e_nobufs; |
| 2219 | 2224 | ||
| 2220 | rth->u.dst.output= ip_rt_bug; | 2225 | rth->u.dst.output= ip_rt_bug; |
| 2226 | rth->u.dst.obsolete = -1; | ||
| 2221 | rth->rt_genid = rt_genid(net); | 2227 | rth->rt_genid = rt_genid(net); |
| 2222 | 2228 | ||
| 2223 | atomic_set(&rth->u.dst.__refcnt, 1); | 2229 | atomic_set(&rth->u.dst.__refcnt, 1); |
| @@ -2444,6 +2450,7 @@ static int __mkroute_output(struct rtable **result, | |||
| 2444 | rth->rt_spec_dst= fl->fl4_src; | 2450 | rth->rt_spec_dst= fl->fl4_src; |
| 2445 | 2451 | ||
| 2446 | rth->u.dst.output=ip_output; | 2452 | rth->u.dst.output=ip_output; |
| 2453 | rth->u.dst.obsolete = -1; | ||
| 2447 | rth->rt_genid = rt_genid(dev_net(dev_out)); | 2454 | rth->rt_genid = rt_genid(dev_net(dev_out)); |
| 2448 | 2455 | ||
| 2449 | RT_CACHE_STAT_INC(out_slow_tot); | 2456 | RT_CACHE_STAT_INC(out_slow_tot); |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 5901010fad55..6afb6d8662b2 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -429,7 +429,7 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait) | |||
| 429 | if (tp->urg_seq == tp->copied_seq && | 429 | if (tp->urg_seq == tp->copied_seq && |
| 430 | !sock_flag(sk, SOCK_URGINLINE) && | 430 | !sock_flag(sk, SOCK_URGINLINE) && |
| 431 | tp->urg_data) | 431 | tp->urg_data) |
| 432 | target--; | 432 | target++; |
| 433 | 433 | ||
| 434 | /* Potential race condition. If read of tp below will | 434 | /* Potential race condition. If read of tp below will |
| 435 | * escape above sk->sk_state, we can be illegally awaken | 435 | * escape above sk->sk_state, we can be illegally awaken |
| @@ -1254,6 +1254,39 @@ static void tcp_prequeue_process(struct sock *sk) | |||
| 1254 | tp->ucopy.memory = 0; | 1254 | tp->ucopy.memory = 0; |
| 1255 | } | 1255 | } |
| 1256 | 1256 | ||
| 1257 | #ifdef CONFIG_NET_DMA | ||
| 1258 | static void tcp_service_net_dma(struct sock *sk, bool wait) | ||
| 1259 | { | ||
| 1260 | dma_cookie_t done, used; | ||
| 1261 | dma_cookie_t last_issued; | ||
| 1262 | struct tcp_sock *tp = tcp_sk(sk); | ||
| 1263 | |||
| 1264 | if (!tp->ucopy.dma_chan) | ||
| 1265 | return; | ||
| 1266 | |||
| 1267 | last_issued = tp->ucopy.dma_cookie; | ||
| 1268 | dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); | ||
| 1269 | |||
| 1270 | do { | ||
| 1271 | if (dma_async_memcpy_complete(tp->ucopy.dma_chan, | ||
| 1272 | last_issued, &done, | ||
| 1273 | &used) == DMA_SUCCESS) { | ||
| 1274 | /* Safe to free early-copied skbs now */ | ||
| 1275 | __skb_queue_purge(&sk->sk_async_wait_queue); | ||
| 1276 | break; | ||
| 1277 | } else { | ||
| 1278 | struct sk_buff *skb; | ||
| 1279 | while ((skb = skb_peek(&sk->sk_async_wait_queue)) && | ||
| 1280 | (dma_async_is_complete(skb->dma_cookie, done, | ||
| 1281 | used) == DMA_SUCCESS)) { | ||
| 1282 | __skb_dequeue(&sk->sk_async_wait_queue); | ||
| 1283 | kfree_skb(skb); | ||
| 1284 | } | ||
| 1285 | } | ||
| 1286 | } while (wait); | ||
| 1287 | } | ||
| 1288 | #endif | ||
| 1289 | |||
| 1257 | static inline struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off) | 1290 | static inline struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off) |
| 1258 | { | 1291 | { |
| 1259 | struct sk_buff *skb; | 1292 | struct sk_buff *skb; |
| @@ -1546,6 +1579,10 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1546 | /* __ Set realtime policy in scheduler __ */ | 1579 | /* __ Set realtime policy in scheduler __ */ |
| 1547 | } | 1580 | } |
| 1548 | 1581 | ||
| 1582 | #ifdef CONFIG_NET_DMA | ||
| 1583 | if (tp->ucopy.dma_chan) | ||
| 1584 | dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); | ||
| 1585 | #endif | ||
| 1549 | if (copied >= target) { | 1586 | if (copied >= target) { |
| 1550 | /* Do not sleep, just process backlog. */ | 1587 | /* Do not sleep, just process backlog. */ |
| 1551 | release_sock(sk); | 1588 | release_sock(sk); |
| @@ -1554,6 +1591,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1554 | sk_wait_data(sk, &timeo); | 1591 | sk_wait_data(sk, &timeo); |
| 1555 | 1592 | ||
| 1556 | #ifdef CONFIG_NET_DMA | 1593 | #ifdef CONFIG_NET_DMA |
| 1594 | tcp_service_net_dma(sk, false); /* Don't block */ | ||
| 1557 | tp->ucopy.wakeup = 0; | 1595 | tp->ucopy.wakeup = 0; |
| 1558 | #endif | 1596 | #endif |
| 1559 | 1597 | ||
| @@ -1633,6 +1671,9 @@ do_prequeue: | |||
| 1633 | copied = -EFAULT; | 1671 | copied = -EFAULT; |
| 1634 | break; | 1672 | break; |
| 1635 | } | 1673 | } |
| 1674 | |||
| 1675 | dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); | ||
| 1676 | |||
| 1636 | if ((offset + used) == skb->len) | 1677 | if ((offset + used) == skb->len) |
| 1637 | copied_early = 1; | 1678 | copied_early = 1; |
| 1638 | 1679 | ||
| @@ -1702,27 +1743,9 @@ skip_copy: | |||
| 1702 | } | 1743 | } |
| 1703 | 1744 | ||
| 1704 | #ifdef CONFIG_NET_DMA | 1745 | #ifdef CONFIG_NET_DMA |
| 1705 | if (tp->ucopy.dma_chan) { | 1746 | tcp_service_net_dma(sk, true); /* Wait for queue to drain */ |
| 1706 | dma_cookie_t done, used; | 1747 | tp->ucopy.dma_chan = NULL; |
| 1707 | |||
| 1708 | dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); | ||
| 1709 | |||
| 1710 | while (dma_async_memcpy_complete(tp->ucopy.dma_chan, | ||
| 1711 | tp->ucopy.dma_cookie, &done, | ||
| 1712 | &used) == DMA_IN_PROGRESS) { | ||
| 1713 | /* do partial cleanup of sk_async_wait_queue */ | ||
| 1714 | while ((skb = skb_peek(&sk->sk_async_wait_queue)) && | ||
| 1715 | (dma_async_is_complete(skb->dma_cookie, done, | ||
| 1716 | used) == DMA_SUCCESS)) { | ||
| 1717 | __skb_dequeue(&sk->sk_async_wait_queue); | ||
| 1718 | kfree_skb(skb); | ||
| 1719 | } | ||
| 1720 | } | ||
| 1721 | 1748 | ||
| 1722 | /* Safe to free early-copied skbs now */ | ||
| 1723 | __skb_queue_purge(&sk->sk_async_wait_queue); | ||
| 1724 | tp->ucopy.dma_chan = NULL; | ||
| 1725 | } | ||
| 1726 | if (tp->ucopy.pinned_list) { | 1749 | if (tp->ucopy.pinned_list) { |
| 1727 | dma_unpin_iovec_pages(tp->ucopy.pinned_list); | 1750 | dma_unpin_iovec_pages(tp->ucopy.pinned_list); |
| 1728 | tp->ucopy.pinned_list = NULL; | 1751 | tp->ucopy.pinned_list = NULL; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 788851ca8c5d..c096a4218b8f 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -2511,6 +2511,9 @@ static void tcp_mark_head_lost(struct sock *sk, int packets) | |||
| 2511 | int err; | 2511 | int err; |
| 2512 | unsigned int mss; | 2512 | unsigned int mss; |
| 2513 | 2513 | ||
| 2514 | if (packets == 0) | ||
| 2515 | return; | ||
| 2516 | |||
| 2514 | WARN_ON(packets > tp->packets_out); | 2517 | WARN_ON(packets > tp->packets_out); |
| 2515 | if (tp->lost_skb_hint) { | 2518 | if (tp->lost_skb_hint) { |
| 2516 | skb = tp->lost_skb_hint; | 2519 | skb = tp->lost_skb_hint; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 70df40980a87..f4df5f931f36 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -370,6 +370,11 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info) | |||
| 370 | if (sk->sk_state == TCP_CLOSE) | 370 | if (sk->sk_state == TCP_CLOSE) |
| 371 | goto out; | 371 | goto out; |
| 372 | 372 | ||
| 373 | if (unlikely(iph->ttl < inet_sk(sk)->min_ttl)) { | ||
| 374 | NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP); | ||
| 375 | goto out; | ||
| 376 | } | ||
| 377 | |||
| 373 | icsk = inet_csk(sk); | 378 | icsk = inet_csk(sk); |
| 374 | tp = tcp_sk(sk); | 379 | tp = tcp_sk(sk); |
| 375 | seq = ntohl(th->seq); | 380 | seq = ntohl(th->seq); |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 52e0f74fdfe0..23e4ac0cc30e 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
| @@ -1113,6 +1113,9 @@ static int ip6mr_mfc_add(struct net *net, struct mf6cctl *mfc, int mrtsock) | |||
| 1113 | unsigned char ttls[MAXMIFS]; | 1113 | unsigned char ttls[MAXMIFS]; |
| 1114 | int i; | 1114 | int i; |
| 1115 | 1115 | ||
| 1116 | if (mfc->mf6cc_parent >= MAXMIFS) | ||
| 1117 | return -ENFILE; | ||
| 1118 | |||
| 1116 | memset(ttls, 255, MAXMIFS); | 1119 | memset(ttls, 255, MAXMIFS); |
| 1117 | for (i = 0; i < MAXMIFS; i++) { | 1120 | for (i = 0; i < MAXMIFS; i++) { |
| 1118 | if (IF_ISSET(i, &mfc->mf6cc_ifset)) | 1121 | if (IF_ISSET(i, &mfc->mf6cc_ifset)) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 52cd3eff31dc..7fcb0e5d1213 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -879,7 +879,7 @@ static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie) | |||
| 879 | 879 | ||
| 880 | rt = (struct rt6_info *) dst; | 880 | rt = (struct rt6_info *) dst; |
| 881 | 881 | ||
| 882 | if (rt && rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie)) | 882 | if (rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie)) |
| 883 | return dst; | 883 | return dst; |
| 884 | 884 | ||
| 885 | return NULL; | 885 | return NULL; |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 2b2af631d2b8..569410a85953 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -582,7 +582,9 @@ nla_put_failure: | |||
| 582 | nlmsg_failure: | 582 | nlmsg_failure: |
| 583 | kfree_skb(skb); | 583 | kfree_skb(skb); |
| 584 | errout: | 584 | errout: |
| 585 | nfnetlink_set_err(net, 0, group, -ENOBUFS); | 585 | if (nfnetlink_set_err(net, 0, group, -ENOBUFS) > 0) |
| 586 | return -ENOBUFS; | ||
| 587 | |||
| 586 | return 0; | 588 | return 0; |
| 587 | } | 589 | } |
| 588 | #endif /* CONFIG_NF_CONNTRACK_EVENTS */ | 590 | #endif /* CONFIG_NF_CONNTRACK_EVENTS */ |
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index 8eb0cc23ada3..6afa3d52ea5f 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c | |||
| @@ -113,9 +113,9 @@ int nfnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, | |||
| 113 | } | 113 | } |
| 114 | EXPORT_SYMBOL_GPL(nfnetlink_send); | 114 | EXPORT_SYMBOL_GPL(nfnetlink_send); |
| 115 | 115 | ||
| 116 | void nfnetlink_set_err(struct net *net, u32 pid, u32 group, int error) | 116 | int nfnetlink_set_err(struct net *net, u32 pid, u32 group, int error) |
| 117 | { | 117 | { |
| 118 | netlink_set_err(net->nfnl, pid, group, error); | 118 | return netlink_set_err(net->nfnl, pid, group, error); |
| 119 | } | 119 | } |
| 120 | EXPORT_SYMBOL_GPL(nfnetlink_set_err); | 120 | EXPORT_SYMBOL_GPL(nfnetlink_set_err); |
| 121 | 121 | ||
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 320d0423a240..acbbae1e89b5 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -1093,6 +1093,7 @@ static inline int do_one_set_err(struct sock *sk, | |||
| 1093 | struct netlink_set_err_data *p) | 1093 | struct netlink_set_err_data *p) |
| 1094 | { | 1094 | { |
| 1095 | struct netlink_sock *nlk = nlk_sk(sk); | 1095 | struct netlink_sock *nlk = nlk_sk(sk); |
| 1096 | int ret = 0; | ||
| 1096 | 1097 | ||
| 1097 | if (sk == p->exclude_sk) | 1098 | if (sk == p->exclude_sk) |
| 1098 | goto out; | 1099 | goto out; |
| @@ -1104,10 +1105,15 @@ static inline int do_one_set_err(struct sock *sk, | |||
| 1104 | !test_bit(p->group - 1, nlk->groups)) | 1105 | !test_bit(p->group - 1, nlk->groups)) |
| 1105 | goto out; | 1106 | goto out; |
| 1106 | 1107 | ||
| 1108 | if (p->code == ENOBUFS && nlk->flags & NETLINK_RECV_NO_ENOBUFS) { | ||
| 1109 | ret = 1; | ||
| 1110 | goto out; | ||
| 1111 | } | ||
| 1112 | |||
| 1107 | sk->sk_err = p->code; | 1113 | sk->sk_err = p->code; |
| 1108 | sk->sk_error_report(sk); | 1114 | sk->sk_error_report(sk); |
| 1109 | out: | 1115 | out: |
| 1110 | return 0; | 1116 | return ret; |
| 1111 | } | 1117 | } |
| 1112 | 1118 | ||
| 1113 | /** | 1119 | /** |
| @@ -1116,12 +1122,16 @@ out: | |||
| 1116 | * @pid: the PID of a process that we want to skip (if any) | 1122 | * @pid: the PID of a process that we want to skip (if any) |
| 1117 | * @groups: the broadcast group that will notice the error | 1123 | * @groups: the broadcast group that will notice the error |
| 1118 | * @code: error code, must be negative (as usual in kernelspace) | 1124 | * @code: error code, must be negative (as usual in kernelspace) |
| 1125 | * | ||
| 1126 | * This function returns the number of broadcast listeners that have set the | ||
| 1127 | * NETLINK_RECV_NO_ENOBUFS socket option. | ||
| 1119 | */ | 1128 | */ |
| 1120 | void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code) | 1129 | int netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code) |
| 1121 | { | 1130 | { |
| 1122 | struct netlink_set_err_data info; | 1131 | struct netlink_set_err_data info; |
| 1123 | struct hlist_node *node; | 1132 | struct hlist_node *node; |
| 1124 | struct sock *sk; | 1133 | struct sock *sk; |
| 1134 | int ret = 0; | ||
| 1125 | 1135 | ||
| 1126 | info.exclude_sk = ssk; | 1136 | info.exclude_sk = ssk; |
| 1127 | info.pid = pid; | 1137 | info.pid = pid; |
| @@ -1132,9 +1142,10 @@ void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code) | |||
| 1132 | read_lock(&nl_table_lock); | 1142 | read_lock(&nl_table_lock); |
| 1133 | 1143 | ||
| 1134 | sk_for_each_bound(sk, node, &nl_table[ssk->sk_protocol].mc_list) | 1144 | sk_for_each_bound(sk, node, &nl_table[ssk->sk_protocol].mc_list) |
| 1135 | do_one_set_err(sk, &info); | 1145 | ret += do_one_set_err(sk, &info); |
| 1136 | 1146 | ||
| 1137 | read_unlock(&nl_table_lock); | 1147 | read_unlock(&nl_table_lock); |
| 1148 | return ret; | ||
| 1138 | } | 1149 | } |
| 1139 | EXPORT_SYMBOL(netlink_set_err); | 1150 | EXPORT_SYMBOL(netlink_set_err); |
| 1140 | 1151 | ||
diff --git a/net/rxrpc/ar-accept.c b/net/rxrpc/ar-accept.c index 77228f28fa36..2d744f22a9a1 100644 --- a/net/rxrpc/ar-accept.c +++ b/net/rxrpc/ar-accept.c | |||
| @@ -88,6 +88,11 @@ static int rxrpc_accept_incoming_call(struct rxrpc_local *local, | |||
| 88 | 88 | ||
| 89 | /* get a notification message to send to the server app */ | 89 | /* get a notification message to send to the server app */ |
| 90 | notification = alloc_skb(0, GFP_NOFS); | 90 | notification = alloc_skb(0, GFP_NOFS); |
| 91 | if (!notification) { | ||
| 92 | _debug("no memory"); | ||
| 93 | ret = -ENOMEM; | ||
| 94 | goto error_nofree; | ||
| 95 | } | ||
| 91 | rxrpc_new_skb(notification); | 96 | rxrpc_new_skb(notification); |
| 92 | notification->mark = RXRPC_SKB_MARK_NEW_CALL; | 97 | notification->mark = RXRPC_SKB_MARK_NEW_CALL; |
| 93 | 98 | ||
| @@ -189,6 +194,7 @@ invalid_service: | |||
| 189 | ret = -ECONNREFUSED; | 194 | ret = -ECONNREFUSED; |
| 190 | error: | 195 | error: |
| 191 | rxrpc_free_skb(notification); | 196 | rxrpc_free_skb(notification); |
| 197 | error_nofree: | ||
| 192 | _leave(" = %d", ret); | 198 | _leave(" = %d", ret); |
| 193 | return ret; | 199 | return ret; |
| 194 | } | 200 | } |
