diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/8021q/vlan_dev.c | 2 | ||||
| -rw-r--r-- | net/appletalk/aarp.c | 2 | ||||
| -rw-r--r-- | net/ax25/ax25_out.c | 6 | ||||
| -rw-r--r-- | net/bluetooth/hidp/core.c | 70 | ||||
| -rw-r--r-- | net/bluetooth/l2cap.c | 14 | ||||
| -rw-r--r-- | net/dccp/ccid.c | 18 | ||||
| -rw-r--r-- | net/dccp/ccid.h | 2 | ||||
| -rw-r--r-- | net/dccp/probe.c | 3 | ||||
| -rw-r--r-- | net/ipv4/inet_diag.c | 2 | ||||
| -rw-r--r-- | net/ipv4/route.c | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp_probe.c | 19 | ||||
| -rw-r--r-- | net/ipv4/xfrm4_policy.c | 14 | ||||
| -rw-r--r-- | net/ipv6/netfilter/nf_conntrack_reasm.c | 1 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_policy.c | 25 | ||||
| -rw-r--r-- | net/mac80211/cfg.c | 3 | ||||
| -rw-r--r-- | net/mac80211/driver-trace.h | 2 | ||||
| -rw-r--r-- | net/mac80211/rc80211_pid_algo.c | 2 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_netlink.c | 3 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_sip.c | 2 | ||||
| -rw-r--r-- | net/netrom/nr_route.c | 11 | ||||
| -rw-r--r-- | net/rose/rose_link.c | 8 | ||||
| -rw-r--r-- | net/rose/rose_route.c | 5 | ||||
| -rw-r--r-- | net/wireless/sme.c | 1 | ||||
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 75 | ||||
| -rw-r--r-- | net/xfrm/xfrm_state.c | 6 | ||||
| -rw-r--r-- | net/xfrm/xfrm_user.c | 14 |
26 files changed, 198 insertions, 114 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index b7889782047e..c1b92cab46c7 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
| @@ -163,7 +163,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
| 163 | goto err_unlock; | 163 | goto err_unlock; |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | rx_stats = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats, | 166 | rx_stats = per_cpu_ptr(vlan_dev_info(skb->dev)->vlan_rx_stats, |
| 167 | smp_processor_id()); | 167 | smp_processor_id()); |
| 168 | rx_stats->rx_packets++; | 168 | rx_stats->rx_packets++; |
| 169 | rx_stats->rx_bytes += skb->len; | 169 | rx_stats->rx_bytes += skb->len; |
diff --git a/net/appletalk/aarp.c b/net/appletalk/aarp.c index 9d4adfd22757..f2b3b56aa779 100644 --- a/net/appletalk/aarp.c +++ b/net/appletalk/aarp.c | |||
| @@ -819,7 +819,7 @@ static int aarp_rcv(struct sk_buff *skb, struct net_device *dev, | |||
| 819 | ma = &ifa->address; | 819 | ma = &ifa->address; |
| 820 | else { /* We need to make a copy of the entry. */ | 820 | else { /* We need to make a copy of the entry. */ |
| 821 | da.s_node = sa.s_node; | 821 | da.s_node = sa.s_node; |
| 822 | da.s_net = da.s_net; | 822 | da.s_net = sa.s_net; |
| 823 | ma = &da; | 823 | ma = &da; |
| 824 | } | 824 | } |
| 825 | 825 | ||
diff --git a/net/ax25/ax25_out.c b/net/ax25/ax25_out.c index bf706f83a5c9..14912600ec57 100644 --- a/net/ax25/ax25_out.c +++ b/net/ax25/ax25_out.c | |||
| @@ -92,6 +92,12 @@ ax25_cb *ax25_send_frame(struct sk_buff *skb, int paclen, ax25_address *src, ax2 | |||
| 92 | #endif | 92 | #endif |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | /* | ||
| 96 | * There is one ref for the state machine; a caller needs | ||
| 97 | * one more to put it back, just like with the existing one. | ||
| 98 | */ | ||
| 99 | ax25_cb_hold(ax25); | ||
| 100 | |||
| 95 | ax25_cb_add(ax25); | 101 | ax25_cb_add(ax25); |
| 96 | 102 | ||
| 97 | ax25->state = AX25_STATE_1; | 103 | ax25->state = AX25_STATE_1; |
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 18e7f5a43dc4..6cf526d06e21 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
| @@ -243,6 +243,39 @@ static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb) | |||
| 243 | input_sync(dev); | 243 | input_sync(dev); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | static int __hidp_send_ctrl_message(struct hidp_session *session, | ||
| 247 | unsigned char hdr, unsigned char *data, int size) | ||
| 248 | { | ||
| 249 | struct sk_buff *skb; | ||
| 250 | |||
| 251 | BT_DBG("session %p data %p size %d", session, data, size); | ||
| 252 | |||
| 253 | if (!(skb = alloc_skb(size + 1, GFP_ATOMIC))) { | ||
| 254 | BT_ERR("Can't allocate memory for new frame"); | ||
| 255 | return -ENOMEM; | ||
| 256 | } | ||
| 257 | |||
| 258 | *skb_put(skb, 1) = hdr; | ||
| 259 | if (data && size > 0) | ||
| 260 | memcpy(skb_put(skb, size), data, size); | ||
| 261 | |||
| 262 | skb_queue_tail(&session->ctrl_transmit, skb); | ||
| 263 | |||
| 264 | return 0; | ||
| 265 | } | ||
| 266 | |||
| 267 | static inline int hidp_send_ctrl_message(struct hidp_session *session, | ||
| 268 | unsigned char hdr, unsigned char *data, int size) | ||
| 269 | { | ||
| 270 | int err; | ||
| 271 | |||
| 272 | err = __hidp_send_ctrl_message(session, hdr, data, size); | ||
| 273 | |||
| 274 | hidp_schedule(session); | ||
| 275 | |||
| 276 | return err; | ||
| 277 | } | ||
| 278 | |||
| 246 | static int hidp_queue_report(struct hidp_session *session, | 279 | static int hidp_queue_report(struct hidp_session *session, |
| 247 | unsigned char *data, int size) | 280 | unsigned char *data, int size) |
| 248 | { | 281 | { |
| @@ -282,7 +315,9 @@ static int hidp_send_report(struct hidp_session *session, struct hid_report *rep | |||
| 282 | 315 | ||
| 283 | static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count) | 316 | static int hidp_output_raw_report(struct hid_device *hid, unsigned char *data, size_t count) |
| 284 | { | 317 | { |
| 285 | if (hidp_queue_report(hid->driver_data, data, count)) | 318 | if (hidp_send_ctrl_message(hid->driver_data, |
| 319 | HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE, | ||
| 320 | data, count)) | ||
| 286 | return -ENOMEM; | 321 | return -ENOMEM; |
| 287 | return count; | 322 | return count; |
| 288 | } | 323 | } |
| @@ -307,39 +342,6 @@ static inline void hidp_del_timer(struct hidp_session *session) | |||
| 307 | del_timer(&session->timer); | 342 | del_timer(&session->timer); |
| 308 | } | 343 | } |
| 309 | 344 | ||
| 310 | static int __hidp_send_ctrl_message(struct hidp_session *session, | ||
| 311 | unsigned char hdr, unsigned char *data, int size) | ||
| 312 | { | ||
| 313 | struct sk_buff *skb; | ||
| 314 | |||
| 315 | BT_DBG("session %p data %p size %d", session, data, size); | ||
| 316 | |||
| 317 | if (!(skb = alloc_skb(size + 1, GFP_ATOMIC))) { | ||
| 318 | BT_ERR("Can't allocate memory for new frame"); | ||
| 319 | return -ENOMEM; | ||
| 320 | } | ||
| 321 | |||
| 322 | *skb_put(skb, 1) = hdr; | ||
| 323 | if (data && size > 0) | ||
| 324 | memcpy(skb_put(skb, size), data, size); | ||
| 325 | |||
| 326 | skb_queue_tail(&session->ctrl_transmit, skb); | ||
| 327 | |||
| 328 | return 0; | ||
| 329 | } | ||
| 330 | |||
| 331 | static inline int hidp_send_ctrl_message(struct hidp_session *session, | ||
| 332 | unsigned char hdr, unsigned char *data, int size) | ||
| 333 | { | ||
| 334 | int err; | ||
| 335 | |||
| 336 | err = __hidp_send_ctrl_message(session, hdr, data, size); | ||
| 337 | |||
| 338 | hidp_schedule(session); | ||
| 339 | |||
| 340 | return err; | ||
| 341 | } | ||
| 342 | |||
| 343 | static void hidp_process_handshake(struct hidp_session *session, | 345 | static void hidp_process_handshake(struct hidp_session *session, |
| 344 | unsigned char param) | 346 | unsigned char param) |
| 345 | { | 347 | { |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 1120cf14a548..400efa26ddba 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -1368,7 +1368,6 @@ static int l2cap_ertm_send(struct sock *sk) | |||
| 1368 | 1368 | ||
| 1369 | while ((skb = sk->sk_send_head) && (!l2cap_tx_window_full(sk)) && | 1369 | while ((skb = sk->sk_send_head) && (!l2cap_tx_window_full(sk)) && |
| 1370 | !(pi->conn_state & L2CAP_CONN_REMOTE_BUSY)) { | 1370 | !(pi->conn_state & L2CAP_CONN_REMOTE_BUSY)) { |
| 1371 | tx_skb = skb_clone(skb, GFP_ATOMIC); | ||
| 1372 | 1371 | ||
| 1373 | if (pi->remote_max_tx && | 1372 | if (pi->remote_max_tx && |
| 1374 | bt_cb(skb)->retries == pi->remote_max_tx) { | 1373 | bt_cb(skb)->retries == pi->remote_max_tx) { |
| @@ -1376,6 +1375,8 @@ static int l2cap_ertm_send(struct sock *sk) | |||
| 1376 | break; | 1375 | break; |
| 1377 | } | 1376 | } |
| 1378 | 1377 | ||
| 1378 | tx_skb = skb_clone(skb, GFP_ATOMIC); | ||
| 1379 | |||
| 1379 | bt_cb(skb)->retries++; | 1380 | bt_cb(skb)->retries++; |
| 1380 | 1381 | ||
| 1381 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); | 1382 | control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); |
| @@ -3518,7 +3519,6 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
| 3518 | struct l2cap_pinfo *pi; | 3519 | struct l2cap_pinfo *pi; |
| 3519 | u16 control, len; | 3520 | u16 control, len; |
| 3520 | u8 tx_seq; | 3521 | u8 tx_seq; |
| 3521 | int err; | ||
| 3522 | 3522 | ||
| 3523 | sk = l2cap_get_chan_by_scid(&conn->chan_list, cid); | 3523 | sk = l2cap_get_chan_by_scid(&conn->chan_list, cid); |
| 3524 | if (!sk) { | 3524 | if (!sk) { |
| @@ -3570,13 +3570,11 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
| 3570 | goto drop; | 3570 | goto drop; |
| 3571 | 3571 | ||
| 3572 | if (__is_iframe(control)) | 3572 | if (__is_iframe(control)) |
| 3573 | err = l2cap_data_channel_iframe(sk, control, skb); | 3573 | l2cap_data_channel_iframe(sk, control, skb); |
| 3574 | else | 3574 | else |
| 3575 | err = l2cap_data_channel_sframe(sk, control, skb); | 3575 | l2cap_data_channel_sframe(sk, control, skb); |
| 3576 | 3576 | ||
| 3577 | if (!err) | 3577 | goto done; |
| 3578 | goto done; | ||
| 3579 | break; | ||
| 3580 | 3578 | ||
| 3581 | case L2CAP_MODE_STREAMING: | 3579 | case L2CAP_MODE_STREAMING: |
| 3582 | control = get_unaligned_le16(skb->data); | 3580 | control = get_unaligned_le16(skb->data); |
| @@ -3602,7 +3600,7 @@ static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk | |||
| 3602 | else | 3600 | else |
| 3603 | pi->expected_tx_seq = tx_seq + 1; | 3601 | pi->expected_tx_seq = tx_seq + 1; |
| 3604 | 3602 | ||
| 3605 | err = l2cap_sar_reassembly_sdu(sk, skb, control); | 3603 | l2cap_sar_reassembly_sdu(sk, skb, control); |
| 3606 | 3604 | ||
| 3607 | goto done; | 3605 | goto done; |
| 3608 | 3606 | ||
diff --git a/net/dccp/ccid.c b/net/dccp/ccid.c index f3e9ba1cfd01..57dfb9c8c4f2 100644 --- a/net/dccp/ccid.c +++ b/net/dccp/ccid.c | |||
| @@ -77,34 +77,24 @@ int ccid_getsockopt_builtin_ccids(struct sock *sk, int len, | |||
| 77 | return err; | 77 | return err; |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | static struct kmem_cache *ccid_kmem_cache_create(int obj_size, const char *fmt,...) | 80 | static struct kmem_cache *ccid_kmem_cache_create(int obj_size, char *slab_name_fmt, const char *fmt,...) |
| 81 | { | 81 | { |
| 82 | struct kmem_cache *slab; | 82 | struct kmem_cache *slab; |
| 83 | char slab_name_fmt[32], *slab_name; | ||
| 84 | va_list args; | 83 | va_list args; |
| 85 | 84 | ||
| 86 | va_start(args, fmt); | 85 | va_start(args, fmt); |
| 87 | vsnprintf(slab_name_fmt, sizeof(slab_name_fmt), fmt, args); | 86 | vsnprintf(slab_name_fmt, sizeof(slab_name_fmt), fmt, args); |
| 88 | va_end(args); | 87 | va_end(args); |
| 89 | 88 | ||
| 90 | slab_name = kstrdup(slab_name_fmt, GFP_KERNEL); | 89 | slab = kmem_cache_create(slab_name_fmt, sizeof(struct ccid) + obj_size, 0, |
| 91 | if (slab_name == NULL) | ||
| 92 | return NULL; | ||
| 93 | slab = kmem_cache_create(slab_name, sizeof(struct ccid) + obj_size, 0, | ||
| 94 | SLAB_HWCACHE_ALIGN, NULL); | 90 | SLAB_HWCACHE_ALIGN, NULL); |
| 95 | if (slab == NULL) | ||
| 96 | kfree(slab_name); | ||
| 97 | return slab; | 91 | return slab; |
| 98 | } | 92 | } |
| 99 | 93 | ||
| 100 | static void ccid_kmem_cache_destroy(struct kmem_cache *slab) | 94 | static void ccid_kmem_cache_destroy(struct kmem_cache *slab) |
| 101 | { | 95 | { |
| 102 | if (slab != NULL) { | 96 | if (slab != NULL) |
| 103 | const char *name = kmem_cache_name(slab); | ||
| 104 | |||
| 105 | kmem_cache_destroy(slab); | 97 | kmem_cache_destroy(slab); |
| 106 | kfree(name); | ||
| 107 | } | ||
| 108 | } | 98 | } |
| 109 | 99 | ||
| 110 | static int ccid_activate(struct ccid_operations *ccid_ops) | 100 | static int ccid_activate(struct ccid_operations *ccid_ops) |
| @@ -113,6 +103,7 @@ static int ccid_activate(struct ccid_operations *ccid_ops) | |||
| 113 | 103 | ||
| 114 | ccid_ops->ccid_hc_rx_slab = | 104 | ccid_ops->ccid_hc_rx_slab = |
| 115 | ccid_kmem_cache_create(ccid_ops->ccid_hc_rx_obj_size, | 105 | ccid_kmem_cache_create(ccid_ops->ccid_hc_rx_obj_size, |
| 106 | ccid_ops->ccid_hc_rx_slab_name, | ||
| 116 | "ccid%u_hc_rx_sock", | 107 | "ccid%u_hc_rx_sock", |
| 117 | ccid_ops->ccid_id); | 108 | ccid_ops->ccid_id); |
| 118 | if (ccid_ops->ccid_hc_rx_slab == NULL) | 109 | if (ccid_ops->ccid_hc_rx_slab == NULL) |
| @@ -120,6 +111,7 @@ static int ccid_activate(struct ccid_operations *ccid_ops) | |||
| 120 | 111 | ||
| 121 | ccid_ops->ccid_hc_tx_slab = | 112 | ccid_ops->ccid_hc_tx_slab = |
| 122 | ccid_kmem_cache_create(ccid_ops->ccid_hc_tx_obj_size, | 113 | ccid_kmem_cache_create(ccid_ops->ccid_hc_tx_obj_size, |
| 114 | ccid_ops->ccid_hc_tx_slab_name, | ||
| 123 | "ccid%u_hc_tx_sock", | 115 | "ccid%u_hc_tx_sock", |
| 124 | ccid_ops->ccid_id); | 116 | ccid_ops->ccid_id); |
| 125 | if (ccid_ops->ccid_hc_tx_slab == NULL) | 117 | if (ccid_ops->ccid_hc_tx_slab == NULL) |
diff --git a/net/dccp/ccid.h b/net/dccp/ccid.h index facedd20b531..269958bf7fe9 100644 --- a/net/dccp/ccid.h +++ b/net/dccp/ccid.h | |||
| @@ -49,6 +49,8 @@ struct ccid_operations { | |||
| 49 | const char *ccid_name; | 49 | const char *ccid_name; |
| 50 | struct kmem_cache *ccid_hc_rx_slab, | 50 | struct kmem_cache *ccid_hc_rx_slab, |
| 51 | *ccid_hc_tx_slab; | 51 | *ccid_hc_tx_slab; |
| 52 | char ccid_hc_rx_slab_name[32]; | ||
| 53 | char ccid_hc_tx_slab_name[32]; | ||
| 52 | __u32 ccid_hc_rx_obj_size, | 54 | __u32 ccid_hc_rx_obj_size, |
| 53 | ccid_hc_tx_obj_size; | 55 | ccid_hc_tx_obj_size; |
| 54 | /* Interface Routines */ | 56 | /* Interface Routines */ |
diff --git a/net/dccp/probe.c b/net/dccp/probe.c index a1362dc8abb0..bace1d8cbcfd 100644 --- a/net/dccp/probe.c +++ b/net/dccp/probe.c | |||
| @@ -161,7 +161,8 @@ static __init int dccpprobe_init(void) | |||
| 161 | if (!proc_net_fops_create(&init_net, procname, S_IRUSR, &dccpprobe_fops)) | 161 | if (!proc_net_fops_create(&init_net, procname, S_IRUSR, &dccpprobe_fops)) |
| 162 | goto err0; | 162 | goto err0; |
| 163 | 163 | ||
| 164 | ret = register_jprobe(&dccp_send_probe); | 164 | ret = try_then_request_module((register_jprobe(&dccp_send_probe) == 0), |
| 165 | "dccp"); | ||
| 165 | if (ret) | 166 | if (ret) |
| 166 | goto err1; | 167 | goto err1; |
| 167 | 168 | ||
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index bdb78dd180ce..1aaa8110d84b 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
| @@ -368,7 +368,7 @@ static int inet_diag_bc_run(const void *bc, int len, | |||
| 368 | yes = entry->sport >= op[1].no; | 368 | yes = entry->sport >= op[1].no; |
| 369 | break; | 369 | break; |
| 370 | case INET_DIAG_BC_S_LE: | 370 | case INET_DIAG_BC_S_LE: |
| 371 | yes = entry->dport <= op[1].no; | 371 | yes = entry->sport <= op[1].no; |
| 372 | break; | 372 | break; |
| 373 | case INET_DIAG_BC_D_GE: | 373 | case INET_DIAG_BC_D_GE: |
| 374 | yes = entry->dport >= op[1].no; | 374 | yes = entry->dport >= op[1].no; |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index e446496f564f..d62b05d33384 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -586,7 +586,9 @@ static void __net_exit ip_rt_do_proc_exit(struct net *net) | |||
| 586 | { | 586 | { |
| 587 | remove_proc_entry("rt_cache", net->proc_net_stat); | 587 | remove_proc_entry("rt_cache", net->proc_net_stat); |
| 588 | remove_proc_entry("rt_cache", net->proc_net); | 588 | remove_proc_entry("rt_cache", net->proc_net); |
| 589 | #ifdef CONFIG_NET_CLS_ROUTE | ||
| 589 | remove_proc_entry("rt_acct", net->proc_net); | 590 | remove_proc_entry("rt_acct", net->proc_net); |
| 591 | #endif | ||
| 590 | } | 592 | } |
| 591 | 593 | ||
| 592 | static struct pernet_operations ip_rt_proc_ops __net_initdata = { | 594 | static struct pernet_operations ip_rt_proc_ops __net_initdata = { |
diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c index bb110c5ce1d2..9bc805df95d2 100644 --- a/net/ipv4/tcp_probe.c +++ b/net/ipv4/tcp_probe.c | |||
| @@ -39,9 +39,9 @@ static int port __read_mostly = 0; | |||
| 39 | MODULE_PARM_DESC(port, "Port to match (0=all)"); | 39 | MODULE_PARM_DESC(port, "Port to match (0=all)"); |
| 40 | module_param(port, int, 0); | 40 | module_param(port, int, 0); |
| 41 | 41 | ||
| 42 | static int bufsize __read_mostly = 4096; | 42 | static unsigned int bufsize __read_mostly = 4096; |
| 43 | MODULE_PARM_DESC(bufsize, "Log buffer size in packets (4096)"); | 43 | MODULE_PARM_DESC(bufsize, "Log buffer size in packets (4096)"); |
| 44 | module_param(bufsize, int, 0); | 44 | module_param(bufsize, uint, 0); |
| 45 | 45 | ||
| 46 | static int full __read_mostly; | 46 | static int full __read_mostly; |
| 47 | MODULE_PARM_DESC(full, "Full log (1=every ack packet received, 0=only cwnd changes)"); | 47 | MODULE_PARM_DESC(full, "Full log (1=every ack packet received, 0=only cwnd changes)"); |
| @@ -75,12 +75,12 @@ static struct { | |||
| 75 | 75 | ||
| 76 | static inline int tcp_probe_used(void) | 76 | static inline int tcp_probe_used(void) |
| 77 | { | 77 | { |
| 78 | return (tcp_probe.head - tcp_probe.tail) % bufsize; | 78 | return (tcp_probe.head - tcp_probe.tail) & (bufsize - 1); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | static inline int tcp_probe_avail(void) | 81 | static inline int tcp_probe_avail(void) |
| 82 | { | 82 | { |
| 83 | return bufsize - tcp_probe_used(); | 83 | return bufsize - tcp_probe_used() - 1; |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | /* | 86 | /* |
| @@ -116,7 +116,7 @@ static int jtcp_rcv_established(struct sock *sk, struct sk_buff *skb, | |||
| 116 | p->ssthresh = tcp_current_ssthresh(sk); | 116 | p->ssthresh = tcp_current_ssthresh(sk); |
| 117 | p->srtt = tp->srtt >> 3; | 117 | p->srtt = tp->srtt >> 3; |
| 118 | 118 | ||
| 119 | tcp_probe.head = (tcp_probe.head + 1) % bufsize; | 119 | tcp_probe.head = (tcp_probe.head + 1) & (bufsize - 1); |
| 120 | } | 120 | } |
| 121 | tcp_probe.lastcwnd = tp->snd_cwnd; | 121 | tcp_probe.lastcwnd = tp->snd_cwnd; |
| 122 | spin_unlock(&tcp_probe.lock); | 122 | spin_unlock(&tcp_probe.lock); |
| @@ -149,7 +149,7 @@ static int tcpprobe_open(struct inode * inode, struct file * file) | |||
| 149 | static int tcpprobe_sprint(char *tbuf, int n) | 149 | static int tcpprobe_sprint(char *tbuf, int n) |
| 150 | { | 150 | { |
| 151 | const struct tcp_log *p | 151 | const struct tcp_log *p |
| 152 | = tcp_probe.log + tcp_probe.tail % bufsize; | 152 | = tcp_probe.log + tcp_probe.tail; |
| 153 | struct timespec tv | 153 | struct timespec tv |
| 154 | = ktime_to_timespec(ktime_sub(p->tstamp, tcp_probe.start)); | 154 | = ktime_to_timespec(ktime_sub(p->tstamp, tcp_probe.start)); |
| 155 | 155 | ||
| @@ -192,7 +192,7 @@ static ssize_t tcpprobe_read(struct file *file, char __user *buf, | |||
| 192 | width = tcpprobe_sprint(tbuf, sizeof(tbuf)); | 192 | width = tcpprobe_sprint(tbuf, sizeof(tbuf)); |
| 193 | 193 | ||
| 194 | if (cnt + width < len) | 194 | if (cnt + width < len) |
| 195 | tcp_probe.tail = (tcp_probe.tail + 1) % bufsize; | 195 | tcp_probe.tail = (tcp_probe.tail + 1) & (bufsize - 1); |
| 196 | 196 | ||
| 197 | spin_unlock_bh(&tcp_probe.lock); | 197 | spin_unlock_bh(&tcp_probe.lock); |
| 198 | 198 | ||
| @@ -222,9 +222,10 @@ static __init int tcpprobe_init(void) | |||
| 222 | init_waitqueue_head(&tcp_probe.wait); | 222 | init_waitqueue_head(&tcp_probe.wait); |
| 223 | spin_lock_init(&tcp_probe.lock); | 223 | spin_lock_init(&tcp_probe.lock); |
| 224 | 224 | ||
| 225 | if (bufsize < 0) | 225 | if (bufsize == 0) |
| 226 | return -EINVAL; | 226 | return -EINVAL; |
| 227 | 227 | ||
| 228 | bufsize = roundup_pow_of_two(bufsize); | ||
| 228 | tcp_probe.log = kcalloc(bufsize, sizeof(struct tcp_log), GFP_KERNEL); | 229 | tcp_probe.log = kcalloc(bufsize, sizeof(struct tcp_log), GFP_KERNEL); |
| 229 | if (!tcp_probe.log) | 230 | if (!tcp_probe.log) |
| 230 | goto err0; | 231 | goto err0; |
| @@ -236,7 +237,7 @@ static __init int tcpprobe_init(void) | |||
| 236 | if (ret) | 237 | if (ret) |
| 237 | goto err1; | 238 | goto err1; |
| 238 | 239 | ||
| 239 | pr_info("TCP probe registered (port=%d)\n", port); | 240 | pr_info("TCP probe registered (port=%d) bufsize=%u\n", port, bufsize); |
| 240 | return 0; | 241 | return 0; |
| 241 | err1: | 242 | err1: |
| 242 | proc_net_remove(&init_net, procname); | 243 | proc_net_remove(&init_net, procname); |
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c index 8c08a28d8f83..67107d63c1cd 100644 --- a/net/ipv4/xfrm4_policy.c +++ b/net/ipv4/xfrm4_policy.c | |||
| @@ -15,7 +15,6 @@ | |||
| 15 | #include <net/xfrm.h> | 15 | #include <net/xfrm.h> |
| 16 | #include <net/ip.h> | 16 | #include <net/ip.h> |
| 17 | 17 | ||
| 18 | static struct dst_ops xfrm4_dst_ops; | ||
| 19 | static struct xfrm_policy_afinfo xfrm4_policy_afinfo; | 18 | static struct xfrm_policy_afinfo xfrm4_policy_afinfo; |
| 20 | 19 | ||
| 21 | static struct dst_entry *xfrm4_dst_lookup(struct net *net, int tos, | 20 | static struct dst_entry *xfrm4_dst_lookup(struct net *net, int tos, |
| @@ -190,8 +189,10 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) | |||
| 190 | 189 | ||
| 191 | static inline int xfrm4_garbage_collect(struct dst_ops *ops) | 190 | static inline int xfrm4_garbage_collect(struct dst_ops *ops) |
| 192 | { | 191 | { |
| 193 | xfrm4_policy_afinfo.garbage_collect(&init_net); | 192 | struct net *net = container_of(ops, struct net, xfrm.xfrm4_dst_ops); |
| 194 | return (atomic_read(&xfrm4_dst_ops.entries) > xfrm4_dst_ops.gc_thresh*2); | 193 | |
| 194 | xfrm4_policy_afinfo.garbage_collect(net); | ||
| 195 | return (atomic_read(&ops->entries) > ops->gc_thresh * 2); | ||
| 195 | } | 196 | } |
| 196 | 197 | ||
| 197 | static void xfrm4_update_pmtu(struct dst_entry *dst, u32 mtu) | 198 | static void xfrm4_update_pmtu(struct dst_entry *dst, u32 mtu) |
| @@ -268,7 +269,7 @@ static struct xfrm_policy_afinfo xfrm4_policy_afinfo = { | |||
| 268 | static struct ctl_table xfrm4_policy_table[] = { | 269 | static struct ctl_table xfrm4_policy_table[] = { |
| 269 | { | 270 | { |
| 270 | .procname = "xfrm4_gc_thresh", | 271 | .procname = "xfrm4_gc_thresh", |
| 271 | .data = &xfrm4_dst_ops.gc_thresh, | 272 | .data = &init_net.xfrm.xfrm4_dst_ops.gc_thresh, |
| 272 | .maxlen = sizeof(int), | 273 | .maxlen = sizeof(int), |
| 273 | .mode = 0644, | 274 | .mode = 0644, |
| 274 | .proc_handler = proc_dointvec, | 275 | .proc_handler = proc_dointvec, |
| @@ -295,8 +296,6 @@ static void __exit xfrm4_policy_fini(void) | |||
| 295 | 296 | ||
| 296 | void __init xfrm4_init(int rt_max_size) | 297 | void __init xfrm4_init(int rt_max_size) |
| 297 | { | 298 | { |
| 298 | xfrm4_state_init(); | ||
| 299 | xfrm4_policy_init(); | ||
| 300 | /* | 299 | /* |
| 301 | * Select a default value for the gc_thresh based on the main route | 300 | * Select a default value for the gc_thresh based on the main route |
| 302 | * table hash size. It seems to me the worst case scenario is when | 301 | * table hash size. It seems to me the worst case scenario is when |
| @@ -308,6 +307,9 @@ void __init xfrm4_init(int rt_max_size) | |||
| 308 | * and start cleaning when were 1/2 full | 307 | * and start cleaning when were 1/2 full |
| 309 | */ | 308 | */ |
| 310 | xfrm4_dst_ops.gc_thresh = rt_max_size/2; | 309 | xfrm4_dst_ops.gc_thresh = rt_max_size/2; |
| 310 | |||
| 311 | xfrm4_state_init(); | ||
| 312 | xfrm4_policy_init(); | ||
| 311 | #ifdef CONFIG_SYSCTL | 313 | #ifdef CONFIG_SYSCTL |
| 312 | sysctl_hdr = register_net_sysctl_table(&init_net, net_ipv4_ctl_path, | 314 | sysctl_hdr = register_net_sysctl_table(&init_net, net_ipv4_ctl_path, |
| 313 | xfrm4_policy_table); | 315 | xfrm4_policy_table); |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 312c20adc83f..624a54832a7c 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
| @@ -63,6 +63,7 @@ struct nf_ct_frag6_queue | |||
| 63 | struct inet_frag_queue q; | 63 | struct inet_frag_queue q; |
| 64 | 64 | ||
| 65 | __be32 id; /* fragment id */ | 65 | __be32 id; /* fragment id */ |
| 66 | u32 user; | ||
| 66 | struct in6_addr saddr; | 67 | struct in6_addr saddr; |
| 67 | struct in6_addr daddr; | 68 | struct in6_addr daddr; |
| 68 | 69 | ||
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 7254e3f899a7..dbdc696f5fc5 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
| @@ -24,7 +24,6 @@ | |||
| 24 | #include <net/mip6.h> | 24 | #include <net/mip6.h> |
| 25 | #endif | 25 | #endif |
| 26 | 26 | ||
| 27 | static struct dst_ops xfrm6_dst_ops; | ||
| 28 | static struct xfrm_policy_afinfo xfrm6_policy_afinfo; | 27 | static struct xfrm_policy_afinfo xfrm6_policy_afinfo; |
| 29 | 28 | ||
| 30 | static struct dst_entry *xfrm6_dst_lookup(struct net *net, int tos, | 29 | static struct dst_entry *xfrm6_dst_lookup(struct net *net, int tos, |
| @@ -224,8 +223,10 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse) | |||
| 224 | 223 | ||
| 225 | static inline int xfrm6_garbage_collect(struct dst_ops *ops) | 224 | static inline int xfrm6_garbage_collect(struct dst_ops *ops) |
| 226 | { | 225 | { |
| 227 | xfrm6_policy_afinfo.garbage_collect(&init_net); | 226 | struct net *net = container_of(ops, struct net, xfrm.xfrm6_dst_ops); |
| 228 | return (atomic_read(&xfrm6_dst_ops.entries) > xfrm6_dst_ops.gc_thresh*2); | 227 | |
| 228 | xfrm6_policy_afinfo.garbage_collect(net); | ||
| 229 | return (atomic_read(&ops->entries) > ops->gc_thresh * 2); | ||
| 229 | } | 230 | } |
| 230 | 231 | ||
| 231 | static void xfrm6_update_pmtu(struct dst_entry *dst, u32 mtu) | 232 | static void xfrm6_update_pmtu(struct dst_entry *dst, u32 mtu) |
| @@ -310,7 +311,7 @@ static void xfrm6_policy_fini(void) | |||
| 310 | static struct ctl_table xfrm6_policy_table[] = { | 311 | static struct ctl_table xfrm6_policy_table[] = { |
| 311 | { | 312 | { |
| 312 | .procname = "xfrm6_gc_thresh", | 313 | .procname = "xfrm6_gc_thresh", |
| 313 | .data = &xfrm6_dst_ops.gc_thresh, | 314 | .data = &init_net.xfrm.xfrm6_dst_ops.gc_thresh, |
| 314 | .maxlen = sizeof(int), | 315 | .maxlen = sizeof(int), |
| 315 | .mode = 0644, | 316 | .mode = 0644, |
| 316 | .proc_handler = proc_dointvec, | 317 | .proc_handler = proc_dointvec, |
| @@ -326,13 +327,6 @@ int __init xfrm6_init(void) | |||
| 326 | int ret; | 327 | int ret; |
| 327 | unsigned int gc_thresh; | 328 | unsigned int gc_thresh; |
| 328 | 329 | ||
| 329 | ret = xfrm6_policy_init(); | ||
| 330 | if (ret) | ||
| 331 | goto out; | ||
| 332 | |||
| 333 | ret = xfrm6_state_init(); | ||
| 334 | if (ret) | ||
| 335 | goto out_policy; | ||
| 336 | /* | 330 | /* |
| 337 | * We need a good default value for the xfrm6 gc threshold. | 331 | * We need a good default value for the xfrm6 gc threshold. |
| 338 | * In ipv4 we set it to the route hash table size * 8, which | 332 | * In ipv4 we set it to the route hash table size * 8, which |
| @@ -346,6 +340,15 @@ int __init xfrm6_init(void) | |||
| 346 | */ | 340 | */ |
| 347 | gc_thresh = FIB6_TABLE_HASHSZ * 8; | 341 | gc_thresh = FIB6_TABLE_HASHSZ * 8; |
| 348 | xfrm6_dst_ops.gc_thresh = (gc_thresh < 1024) ? 1024 : gc_thresh; | 342 | xfrm6_dst_ops.gc_thresh = (gc_thresh < 1024) ? 1024 : gc_thresh; |
| 343 | |||
| 344 | ret = xfrm6_policy_init(); | ||
| 345 | if (ret) | ||
| 346 | goto out; | ||
| 347 | |||
| 348 | ret = xfrm6_state_init(); | ||
| 349 | if (ret) | ||
| 350 | goto out_policy; | ||
| 351 | |||
| 349 | #ifdef CONFIG_SYSCTL | 352 | #ifdef CONFIG_SYSCTL |
| 350 | sysctl_hdr = register_net_sysctl_table(&init_net, net_ipv6_ctl_path, | 353 | sysctl_hdr = register_net_sysctl_table(&init_net, net_ipv6_ctl_path, |
| 351 | xfrm6_policy_table); | 354 | xfrm6_policy_table); |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 6dc3579c0ac5..9ae1a4760b58 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
| @@ -1331,6 +1331,9 @@ static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, | |||
| 1331 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 1331 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
| 1332 | struct ieee80211_conf *conf = &local->hw.conf; | 1332 | struct ieee80211_conf *conf = &local->hw.conf; |
| 1333 | 1333 | ||
| 1334 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | ||
| 1335 | return -EOPNOTSUPP; | ||
| 1336 | |||
| 1334 | if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) | 1337 | if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) |
| 1335 | return -EOPNOTSUPP; | 1338 | return -EOPNOTSUPP; |
| 1336 | 1339 | ||
diff --git a/net/mac80211/driver-trace.h b/net/mac80211/driver-trace.h index ee94ea0c67e9..da8497ef7063 100644 --- a/net/mac80211/driver-trace.h +++ b/net/mac80211/driver-trace.h | |||
| @@ -680,7 +680,7 @@ TRACE_EVENT(drv_ampdu_action, | |||
| 680 | __entry->ret = ret; | 680 | __entry->ret = ret; |
| 681 | __entry->action = action; | 681 | __entry->action = action; |
| 682 | __entry->tid = tid; | 682 | __entry->tid = tid; |
| 683 | __entry->ssn = *ssn; | 683 | __entry->ssn = ssn ? *ssn : 0; |
| 684 | ), | 684 | ), |
| 685 | 685 | ||
| 686 | TP_printk( | 686 | TP_printk( |
diff --git a/net/mac80211/rc80211_pid_algo.c b/net/mac80211/rc80211_pid_algo.c index 699d3ed869c4..29bc4c516238 100644 --- a/net/mac80211/rc80211_pid_algo.c +++ b/net/mac80211/rc80211_pid_algo.c | |||
| @@ -190,7 +190,7 @@ static void rate_control_pid_sample(struct rc_pid_info *pinfo, | |||
| 190 | rate_control_pid_normalize(pinfo, sband->n_bitrates); | 190 | rate_control_pid_normalize(pinfo, sband->n_bitrates); |
| 191 | 191 | ||
| 192 | /* Compute the proportional, integral and derivative errors. */ | 192 | /* Compute the proportional, integral and derivative errors. */ |
| 193 | err_prop = (pinfo->target << RC_PID_ARITH_SHIFT) - pf; | 193 | err_prop = (pinfo->target - pf) << RC_PID_ARITH_SHIFT; |
| 194 | 194 | ||
| 195 | err_avg = spinfo->err_avg_sc >> pinfo->smoothing_shift; | 195 | err_avg = spinfo->err_avg_sc >> pinfo->smoothing_shift; |
| 196 | spinfo->err_avg_sc = spinfo->err_avg_sc - err_avg + err_prop; | 196 | spinfo->err_avg_sc = spinfo->err_avg_sc - err_avg + err_prop; |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 59d8064eb522..42f21c01a93e 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -1437,8 +1437,9 @@ ctnetlink_exp_dump_mask(struct sk_buff *skb, | |||
| 1437 | struct nlattr *nest_parms; | 1437 | struct nlattr *nest_parms; |
| 1438 | 1438 | ||
| 1439 | memset(&m, 0xFF, sizeof(m)); | 1439 | memset(&m, 0xFF, sizeof(m)); |
| 1440 | m.src.u.all = mask->src.u.all; | ||
| 1441 | memcpy(&m.src.u3, &mask->src.u3, sizeof(m.src.u3)); | 1440 | memcpy(&m.src.u3, &mask->src.u3, sizeof(m.src.u3)); |
| 1441 | m.src.u.all = mask->src.u.all; | ||
| 1442 | m.dst.protonum = tuple->dst.protonum; | ||
| 1442 | 1443 | ||
| 1443 | nest_parms = nla_nest_start(skb, CTA_EXPECT_MASK | NLA_F_NESTED); | 1444 | nest_parms = nla_nest_start(skb, CTA_EXPECT_MASK | NLA_F_NESTED); |
| 1444 | if (!nest_parms) | 1445 | if (!nest_parms) |
diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c index 4b572163784b..023966b569bf 100644 --- a/net/netfilter/nf_conntrack_sip.c +++ b/net/netfilter/nf_conntrack_sip.c | |||
| @@ -376,7 +376,7 @@ int ct_sip_get_header(const struct nf_conn *ct, const char *dptr, | |||
| 376 | dptr += hdr->len; | 376 | dptr += hdr->len; |
| 377 | else if (hdr->cname && limit - dptr >= hdr->clen + 1 && | 377 | else if (hdr->cname && limit - dptr >= hdr->clen + 1 && |
| 378 | strnicmp(dptr, hdr->cname, hdr->clen) == 0 && | 378 | strnicmp(dptr, hdr->cname, hdr->clen) == 0 && |
| 379 | !isalpha(*(dptr + hdr->clen + 1))) | 379 | !isalpha(*(dptr + hdr->clen))) |
| 380 | dptr += hdr->clen; | 380 | dptr += hdr->clen; |
| 381 | else | 381 | else |
| 382 | continue; | 382 | continue; |
diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index aacba76070fc..e2e2d33cafdf 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c | |||
| @@ -843,12 +843,13 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25) | |||
| 843 | dptr = skb_push(skb, 1); | 843 | dptr = skb_push(skb, 1); |
| 844 | *dptr = AX25_P_NETROM; | 844 | *dptr = AX25_P_NETROM; |
| 845 | 845 | ||
| 846 | ax25s = ax25_send_frame(skb, 256, (ax25_address *)dev->dev_addr, &nr_neigh->callsign, nr_neigh->digipeat, nr_neigh->dev); | 846 | ax25s = nr_neigh->ax25; |
| 847 | if (nr_neigh->ax25 && ax25s) { | 847 | nr_neigh->ax25 = ax25_send_frame(skb, 256, |
| 848 | /* We were already holding this ax25_cb */ | 848 | (ax25_address *)dev->dev_addr, |
| 849 | &nr_neigh->callsign, | ||
| 850 | nr_neigh->digipeat, nr_neigh->dev); | ||
| 851 | if (ax25s) | ||
| 849 | ax25_cb_put(ax25s); | 852 | ax25_cb_put(ax25s); |
| 850 | } | ||
| 851 | nr_neigh->ax25 = ax25s; | ||
| 852 | 853 | ||
| 853 | dev_put(dev); | 854 | dev_put(dev); |
| 854 | ret = (nr_neigh->ax25 != NULL); | 855 | ret = (nr_neigh->ax25 != NULL); |
diff --git a/net/rose/rose_link.c b/net/rose/rose_link.c index bd86a63960ce..5ef5f6988a2e 100644 --- a/net/rose/rose_link.c +++ b/net/rose/rose_link.c | |||
| @@ -101,13 +101,17 @@ static void rose_t0timer_expiry(unsigned long param) | |||
| 101 | static int rose_send_frame(struct sk_buff *skb, struct rose_neigh *neigh) | 101 | static int rose_send_frame(struct sk_buff *skb, struct rose_neigh *neigh) |
| 102 | { | 102 | { |
| 103 | ax25_address *rose_call; | 103 | ax25_address *rose_call; |
| 104 | ax25_cb *ax25s; | ||
| 104 | 105 | ||
| 105 | if (ax25cmp(&rose_callsign, &null_ax25_address) == 0) | 106 | if (ax25cmp(&rose_callsign, &null_ax25_address) == 0) |
| 106 | rose_call = (ax25_address *)neigh->dev->dev_addr; | 107 | rose_call = (ax25_address *)neigh->dev->dev_addr; |
| 107 | else | 108 | else |
| 108 | rose_call = &rose_callsign; | 109 | rose_call = &rose_callsign; |
| 109 | 110 | ||
| 111 | ax25s = neigh->ax25; | ||
| 110 | neigh->ax25 = ax25_send_frame(skb, 260, rose_call, &neigh->callsign, neigh->digipeat, neigh->dev); | 112 | neigh->ax25 = ax25_send_frame(skb, 260, rose_call, &neigh->callsign, neigh->digipeat, neigh->dev); |
| 113 | if (ax25s) | ||
| 114 | ax25_cb_put(ax25s); | ||
| 111 | 115 | ||
| 112 | return (neigh->ax25 != NULL); | 116 | return (neigh->ax25 != NULL); |
| 113 | } | 117 | } |
| @@ -120,13 +124,17 @@ static int rose_send_frame(struct sk_buff *skb, struct rose_neigh *neigh) | |||
| 120 | static int rose_link_up(struct rose_neigh *neigh) | 124 | static int rose_link_up(struct rose_neigh *neigh) |
| 121 | { | 125 | { |
| 122 | ax25_address *rose_call; | 126 | ax25_address *rose_call; |
| 127 | ax25_cb *ax25s; | ||
| 123 | 128 | ||
| 124 | if (ax25cmp(&rose_callsign, &null_ax25_address) == 0) | 129 | if (ax25cmp(&rose_callsign, &null_ax25_address) == 0) |
| 125 | rose_call = (ax25_address *)neigh->dev->dev_addr; | 130 | rose_call = (ax25_address *)neigh->dev->dev_addr; |
| 126 | else | 131 | else |
| 127 | rose_call = &rose_callsign; | 132 | rose_call = &rose_callsign; |
| 128 | 133 | ||
| 134 | ax25s = neigh->ax25; | ||
| 129 | neigh->ax25 = ax25_find_cb(rose_call, &neigh->callsign, neigh->digipeat, neigh->dev); | 135 | neigh->ax25 = ax25_find_cb(rose_call, &neigh->callsign, neigh->digipeat, neigh->dev); |
| 136 | if (ax25s) | ||
| 137 | ax25_cb_put(ax25s); | ||
| 130 | 138 | ||
| 131 | return (neigh->ax25 != NULL); | 139 | return (neigh->ax25 != NULL); |
| 132 | } | 140 | } |
diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c index 795c4b025e31..70a0b3b4b4d2 100644 --- a/net/rose/rose_route.c +++ b/net/rose/rose_route.c | |||
| @@ -235,6 +235,8 @@ static void rose_remove_neigh(struct rose_neigh *rose_neigh) | |||
| 235 | 235 | ||
| 236 | if ((s = rose_neigh_list) == rose_neigh) { | 236 | if ((s = rose_neigh_list) == rose_neigh) { |
| 237 | rose_neigh_list = rose_neigh->next; | 237 | rose_neigh_list = rose_neigh->next; |
| 238 | if (rose_neigh->ax25) | ||
| 239 | ax25_cb_put(rose_neigh->ax25); | ||
| 238 | kfree(rose_neigh->digipeat); | 240 | kfree(rose_neigh->digipeat); |
| 239 | kfree(rose_neigh); | 241 | kfree(rose_neigh); |
| 240 | return; | 242 | return; |
| @@ -243,6 +245,8 @@ static void rose_remove_neigh(struct rose_neigh *rose_neigh) | |||
| 243 | while (s != NULL && s->next != NULL) { | 245 | while (s != NULL && s->next != NULL) { |
| 244 | if (s->next == rose_neigh) { | 246 | if (s->next == rose_neigh) { |
| 245 | s->next = rose_neigh->next; | 247 | s->next = rose_neigh->next; |
| 248 | if (rose_neigh->ax25) | ||
| 249 | ax25_cb_put(rose_neigh->ax25); | ||
| 246 | kfree(rose_neigh->digipeat); | 250 | kfree(rose_neigh->digipeat); |
| 247 | kfree(rose_neigh); | 251 | kfree(rose_neigh); |
| 248 | return; | 252 | return; |
| @@ -812,6 +816,7 @@ void rose_link_failed(ax25_cb *ax25, int reason) | |||
| 812 | 816 | ||
| 813 | if (rose_neigh != NULL) { | 817 | if (rose_neigh != NULL) { |
| 814 | rose_neigh->ax25 = NULL; | 818 | rose_neigh->ax25 = NULL; |
| 819 | ax25_cb_put(ax25); | ||
| 815 | 820 | ||
| 816 | rose_del_route_by_neigh(rose_neigh); | 821 | rose_del_route_by_neigh(rose_neigh); |
| 817 | rose_kill_by_neigh(rose_neigh); | 822 | rose_kill_by_neigh(rose_neigh); |
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 2333d78187e4..dc0fc4989d54 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
| @@ -655,6 +655,7 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie, | |||
| 655 | memset(&wrqu, 0, sizeof(wrqu)); | 655 | memset(&wrqu, 0, sizeof(wrqu)); |
| 656 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; | 656 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; |
| 657 | wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); | 657 | wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); |
| 658 | wdev->wext.connect.ssid_len = 0; | ||
| 658 | #endif | 659 | #endif |
| 659 | } | 660 | } |
| 660 | 661 | ||
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 4725a549ad4d..0ecb16a9a883 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -469,16 +469,16 @@ static inline int xfrm_byidx_should_resize(struct net *net, int total) | |||
| 469 | return 0; | 469 | return 0; |
| 470 | } | 470 | } |
| 471 | 471 | ||
| 472 | void xfrm_spd_getinfo(struct xfrmk_spdinfo *si) | 472 | void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si) |
| 473 | { | 473 | { |
| 474 | read_lock_bh(&xfrm_policy_lock); | 474 | read_lock_bh(&xfrm_policy_lock); |
| 475 | si->incnt = init_net.xfrm.policy_count[XFRM_POLICY_IN]; | 475 | si->incnt = net->xfrm.policy_count[XFRM_POLICY_IN]; |
| 476 | si->outcnt = init_net.xfrm.policy_count[XFRM_POLICY_OUT]; | 476 | si->outcnt = net->xfrm.policy_count[XFRM_POLICY_OUT]; |
| 477 | si->fwdcnt = init_net.xfrm.policy_count[XFRM_POLICY_FWD]; | 477 | si->fwdcnt = net->xfrm.policy_count[XFRM_POLICY_FWD]; |
| 478 | si->inscnt = init_net.xfrm.policy_count[XFRM_POLICY_IN+XFRM_POLICY_MAX]; | 478 | si->inscnt = net->xfrm.policy_count[XFRM_POLICY_IN+XFRM_POLICY_MAX]; |
| 479 | si->outscnt = init_net.xfrm.policy_count[XFRM_POLICY_OUT+XFRM_POLICY_MAX]; | 479 | si->outscnt = net->xfrm.policy_count[XFRM_POLICY_OUT+XFRM_POLICY_MAX]; |
| 480 | si->fwdscnt = init_net.xfrm.policy_count[XFRM_POLICY_FWD+XFRM_POLICY_MAX]; | 480 | si->fwdscnt = net->xfrm.policy_count[XFRM_POLICY_FWD+XFRM_POLICY_MAX]; |
| 481 | si->spdhcnt = init_net.xfrm.policy_idx_hmask; | 481 | si->spdhcnt = net->xfrm.policy_idx_hmask; |
| 482 | si->spdhmcnt = xfrm_policy_hashmax; | 482 | si->spdhmcnt = xfrm_policy_hashmax; |
| 483 | read_unlock_bh(&xfrm_policy_lock); | 483 | read_unlock_bh(&xfrm_policy_lock); |
| 484 | } | 484 | } |
| @@ -1309,15 +1309,28 @@ static inline int xfrm_get_tos(struct flowi *fl, int family) | |||
| 1309 | return tos; | 1309 | return tos; |
| 1310 | } | 1310 | } |
| 1311 | 1311 | ||
| 1312 | static inline struct xfrm_dst *xfrm_alloc_dst(int family) | 1312 | static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family) |
| 1313 | { | 1313 | { |
| 1314 | struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(family); | 1314 | struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(family); |
| 1315 | struct dst_ops *dst_ops; | ||
| 1315 | struct xfrm_dst *xdst; | 1316 | struct xfrm_dst *xdst; |
| 1316 | 1317 | ||
| 1317 | if (!afinfo) | 1318 | if (!afinfo) |
| 1318 | return ERR_PTR(-EINVAL); | 1319 | return ERR_PTR(-EINVAL); |
| 1319 | 1320 | ||
| 1320 | xdst = dst_alloc(afinfo->dst_ops) ?: ERR_PTR(-ENOBUFS); | 1321 | switch (family) { |
| 1322 | case AF_INET: | ||
| 1323 | dst_ops = &net->xfrm.xfrm4_dst_ops; | ||
| 1324 | break; | ||
| 1325 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
| 1326 | case AF_INET6: | ||
| 1327 | dst_ops = &net->xfrm.xfrm6_dst_ops; | ||
| 1328 | break; | ||
| 1329 | #endif | ||
| 1330 | default: | ||
| 1331 | BUG(); | ||
| 1332 | } | ||
| 1333 | xdst = dst_alloc(dst_ops) ?: ERR_PTR(-ENOBUFS); | ||
| 1321 | 1334 | ||
| 1322 | xfrm_policy_put_afinfo(afinfo); | 1335 | xfrm_policy_put_afinfo(afinfo); |
| 1323 | 1336 | ||
| @@ -1366,6 +1379,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy, | |||
| 1366 | struct flowi *fl, | 1379 | struct flowi *fl, |
| 1367 | struct dst_entry *dst) | 1380 | struct dst_entry *dst) |
| 1368 | { | 1381 | { |
| 1382 | struct net *net = xp_net(policy); | ||
| 1369 | unsigned long now = jiffies; | 1383 | unsigned long now = jiffies; |
| 1370 | struct net_device *dev; | 1384 | struct net_device *dev; |
| 1371 | struct dst_entry *dst_prev = NULL; | 1385 | struct dst_entry *dst_prev = NULL; |
| @@ -1389,7 +1403,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy, | |||
| 1389 | dst_hold(dst); | 1403 | dst_hold(dst); |
| 1390 | 1404 | ||
| 1391 | for (; i < nx; i++) { | 1405 | for (; i < nx; i++) { |
| 1392 | struct xfrm_dst *xdst = xfrm_alloc_dst(family); | 1406 | struct xfrm_dst *xdst = xfrm_alloc_dst(net, family); |
| 1393 | struct dst_entry *dst1 = &xdst->u.dst; | 1407 | struct dst_entry *dst1 = &xdst->u.dst; |
| 1394 | 1408 | ||
| 1395 | err = PTR_ERR(xdst); | 1409 | err = PTR_ERR(xdst); |
| @@ -2279,6 +2293,7 @@ EXPORT_SYMBOL(xfrm_bundle_ok); | |||
| 2279 | 2293 | ||
| 2280 | int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo) | 2294 | int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo) |
| 2281 | { | 2295 | { |
| 2296 | struct net *net; | ||
| 2282 | int err = 0; | 2297 | int err = 0; |
| 2283 | if (unlikely(afinfo == NULL)) | 2298 | if (unlikely(afinfo == NULL)) |
| 2284 | return -EINVAL; | 2299 | return -EINVAL; |
| @@ -2302,6 +2317,27 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo) | |||
| 2302 | xfrm_policy_afinfo[afinfo->family] = afinfo; | 2317 | xfrm_policy_afinfo[afinfo->family] = afinfo; |
| 2303 | } | 2318 | } |
| 2304 | write_unlock_bh(&xfrm_policy_afinfo_lock); | 2319 | write_unlock_bh(&xfrm_policy_afinfo_lock); |
| 2320 | |||
| 2321 | rtnl_lock(); | ||
| 2322 | for_each_net(net) { | ||
| 2323 | struct dst_ops *xfrm_dst_ops; | ||
| 2324 | |||
| 2325 | switch (afinfo->family) { | ||
| 2326 | case AF_INET: | ||
| 2327 | xfrm_dst_ops = &net->xfrm.xfrm4_dst_ops; | ||
| 2328 | break; | ||
| 2329 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
| 2330 | case AF_INET6: | ||
| 2331 | xfrm_dst_ops = &net->xfrm.xfrm6_dst_ops; | ||
| 2332 | break; | ||
| 2333 | #endif | ||
| 2334 | default: | ||
| 2335 | BUG(); | ||
| 2336 | } | ||
| 2337 | *xfrm_dst_ops = *afinfo->dst_ops; | ||
| 2338 | } | ||
| 2339 | rtnl_unlock(); | ||
| 2340 | |||
| 2305 | return err; | 2341 | return err; |
| 2306 | } | 2342 | } |
| 2307 | EXPORT_SYMBOL(xfrm_policy_register_afinfo); | 2343 | EXPORT_SYMBOL(xfrm_policy_register_afinfo); |
| @@ -2332,6 +2368,22 @@ int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo) | |||
| 2332 | } | 2368 | } |
| 2333 | EXPORT_SYMBOL(xfrm_policy_unregister_afinfo); | 2369 | EXPORT_SYMBOL(xfrm_policy_unregister_afinfo); |
| 2334 | 2370 | ||
| 2371 | static void __net_init xfrm_dst_ops_init(struct net *net) | ||
| 2372 | { | ||
| 2373 | struct xfrm_policy_afinfo *afinfo; | ||
| 2374 | |||
| 2375 | read_lock_bh(&xfrm_policy_afinfo_lock); | ||
| 2376 | afinfo = xfrm_policy_afinfo[AF_INET]; | ||
| 2377 | if (afinfo) | ||
| 2378 | net->xfrm.xfrm4_dst_ops = *afinfo->dst_ops; | ||
| 2379 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
| 2380 | afinfo = xfrm_policy_afinfo[AF_INET6]; | ||
| 2381 | if (afinfo) | ||
| 2382 | net->xfrm.xfrm6_dst_ops = *afinfo->dst_ops; | ||
| 2383 | #endif | ||
| 2384 | read_unlock_bh(&xfrm_policy_afinfo_lock); | ||
| 2385 | } | ||
| 2386 | |||
| 2335 | static struct xfrm_policy_afinfo *xfrm_policy_get_afinfo(unsigned short family) | 2387 | static struct xfrm_policy_afinfo *xfrm_policy_get_afinfo(unsigned short family) |
| 2336 | { | 2388 | { |
| 2337 | struct xfrm_policy_afinfo *afinfo; | 2389 | struct xfrm_policy_afinfo *afinfo; |
| @@ -2494,6 +2546,7 @@ static int __net_init xfrm_net_init(struct net *net) | |||
| 2494 | rv = xfrm_policy_init(net); | 2546 | rv = xfrm_policy_init(net); |
| 2495 | if (rv < 0) | 2547 | if (rv < 0) |
| 2496 | goto out_policy; | 2548 | goto out_policy; |
| 2549 | xfrm_dst_ops_init(net); | ||
| 2497 | rv = xfrm_sysctl_init(net); | 2550 | rv = xfrm_sysctl_init(net); |
| 2498 | if (rv < 0) | 2551 | if (rv < 0) |
| 2499 | goto out_sysctl; | 2552 | goto out_sysctl; |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index d847f1a52b44..b36cc344474b 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
| @@ -641,11 +641,11 @@ out: | |||
| 641 | } | 641 | } |
| 642 | EXPORT_SYMBOL(xfrm_state_flush); | 642 | EXPORT_SYMBOL(xfrm_state_flush); |
| 643 | 643 | ||
| 644 | void xfrm_sad_getinfo(struct xfrmk_sadinfo *si) | 644 | void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si) |
| 645 | { | 645 | { |
| 646 | spin_lock_bh(&xfrm_state_lock); | 646 | spin_lock_bh(&xfrm_state_lock); |
| 647 | si->sadcnt = init_net.xfrm.state_num; | 647 | si->sadcnt = net->xfrm.state_num; |
| 648 | si->sadhcnt = init_net.xfrm.state_hmask; | 648 | si->sadhcnt = net->xfrm.state_hmask; |
| 649 | si->sadhmcnt = xfrm_state_hashmax; | 649 | si->sadhmcnt = xfrm_state_hashmax; |
| 650 | spin_unlock_bh(&xfrm_state_lock); | 650 | spin_unlock_bh(&xfrm_state_lock); |
| 651 | } | 651 | } |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 1ada6186933c..d5a712976004 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -781,7 +781,8 @@ static inline size_t xfrm_spdinfo_msgsize(void) | |||
| 781 | + nla_total_size(sizeof(struct xfrmu_spdhinfo)); | 781 | + nla_total_size(sizeof(struct xfrmu_spdhinfo)); |
| 782 | } | 782 | } |
| 783 | 783 | ||
| 784 | static int build_spdinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags) | 784 | static int build_spdinfo(struct sk_buff *skb, struct net *net, |
| 785 | u32 pid, u32 seq, u32 flags) | ||
| 785 | { | 786 | { |
| 786 | struct xfrmk_spdinfo si; | 787 | struct xfrmk_spdinfo si; |
| 787 | struct xfrmu_spdinfo spc; | 788 | struct xfrmu_spdinfo spc; |
| @@ -795,7 +796,7 @@ static int build_spdinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags) | |||
| 795 | 796 | ||
| 796 | f = nlmsg_data(nlh); | 797 | f = nlmsg_data(nlh); |
| 797 | *f = flags; | 798 | *f = flags; |
| 798 | xfrm_spd_getinfo(&si); | 799 | xfrm_spd_getinfo(net, &si); |
| 799 | spc.incnt = si.incnt; | 800 | spc.incnt = si.incnt; |
| 800 | spc.outcnt = si.outcnt; | 801 | spc.outcnt = si.outcnt; |
| 801 | spc.fwdcnt = si.fwdcnt; | 802 | spc.fwdcnt = si.fwdcnt; |
| @@ -828,7 +829,7 @@ static int xfrm_get_spdinfo(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 828 | if (r_skb == NULL) | 829 | if (r_skb == NULL) |
| 829 | return -ENOMEM; | 830 | return -ENOMEM; |
| 830 | 831 | ||
| 831 | if (build_spdinfo(r_skb, spid, seq, *flags) < 0) | 832 | if (build_spdinfo(r_skb, net, spid, seq, *flags) < 0) |
| 832 | BUG(); | 833 | BUG(); |
| 833 | 834 | ||
| 834 | return nlmsg_unicast(net->xfrm.nlsk, r_skb, spid); | 835 | return nlmsg_unicast(net->xfrm.nlsk, r_skb, spid); |
| @@ -841,7 +842,8 @@ static inline size_t xfrm_sadinfo_msgsize(void) | |||
| 841 | + nla_total_size(4); /* XFRMA_SAD_CNT */ | 842 | + nla_total_size(4); /* XFRMA_SAD_CNT */ |
| 842 | } | 843 | } |
| 843 | 844 | ||
| 844 | static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags) | 845 | static int build_sadinfo(struct sk_buff *skb, struct net *net, |
| 846 | u32 pid, u32 seq, u32 flags) | ||
| 845 | { | 847 | { |
| 846 | struct xfrmk_sadinfo si; | 848 | struct xfrmk_sadinfo si; |
| 847 | struct xfrmu_sadhinfo sh; | 849 | struct xfrmu_sadhinfo sh; |
| @@ -854,7 +856,7 @@ static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags) | |||
| 854 | 856 | ||
| 855 | f = nlmsg_data(nlh); | 857 | f = nlmsg_data(nlh); |
| 856 | *f = flags; | 858 | *f = flags; |
| 857 | xfrm_sad_getinfo(&si); | 859 | xfrm_sad_getinfo(net, &si); |
| 858 | 860 | ||
| 859 | sh.sadhmcnt = si.sadhmcnt; | 861 | sh.sadhmcnt = si.sadhmcnt; |
| 860 | sh.sadhcnt = si.sadhcnt; | 862 | sh.sadhcnt = si.sadhcnt; |
| @@ -882,7 +884,7 @@ static int xfrm_get_sadinfo(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 882 | if (r_skb == NULL) | 884 | if (r_skb == NULL) |
| 883 | return -ENOMEM; | 885 | return -ENOMEM; |
| 884 | 886 | ||
| 885 | if (build_sadinfo(r_skb, spid, seq, *flags) < 0) | 887 | if (build_sadinfo(r_skb, net, spid, seq, *flags) < 0) |
| 886 | BUG(); | 888 | BUG(); |
| 887 | 889 | ||
| 888 | return nlmsg_unicast(net->xfrm.nlsk, r_skb, spid); | 890 | return nlmsg_unicast(net->xfrm.nlsk, r_skb, spid); |
