diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/8021q/vlan.c | 2 | ||||
| -rw-r--r-- | net/8021q/vlan_dev.c | 71 | ||||
| -rw-r--r-- | net/core/netpoll.c | 7 | ||||
| -rw-r--r-- | net/ipv6/netfilter/ip6table_raw.c | 2 | ||||
| -rw-r--r-- | net/key/af_key.c | 8 | ||||
| -rw-r--r-- | net/netfilter/xt_hashlimit.c | 4 | ||||
| -rw-r--r-- | net/netfilter/xt_recent.c | 2 | ||||
| -rw-r--r-- | net/sched/Kconfig | 5 | ||||
| -rw-r--r-- | net/sched/cls_cgroup.c | 36 |
9 files changed, 114 insertions, 23 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 453512266ea1..db783d7af5a3 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
| @@ -378,6 +378,8 @@ static void vlan_transfer_features(struct net_device *dev, | |||
| 378 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 378 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
| 379 | vlandev->fcoe_ddp_xid = dev->fcoe_ddp_xid; | 379 | vlandev->fcoe_ddp_xid = dev->fcoe_ddp_xid; |
| 380 | #endif | 380 | #endif |
| 381 | vlandev->real_num_tx_queues = dev->real_num_tx_queues; | ||
| 382 | BUG_ON(vlandev->real_num_tx_queues > vlandev->num_tx_queues); | ||
| 381 | 383 | ||
| 382 | if (old_features != vlandev->features) | 384 | if (old_features != vlandev->features) |
| 383 | netdev_features_change(vlandev); | 385 | netdev_features_change(vlandev); |
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 9e83272fc5b0..2fd057c81bbf 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
| @@ -361,6 +361,14 @@ static netdev_tx_t vlan_dev_hwaccel_hard_start_xmit(struct sk_buff *skb, | |||
| 361 | return ret; | 361 | return ret; |
| 362 | } | 362 | } |
| 363 | 363 | ||
| 364 | static u16 vlan_dev_select_queue(struct net_device *dev, struct sk_buff *skb) | ||
| 365 | { | ||
| 366 | struct net_device *rdev = vlan_dev_info(dev)->real_dev; | ||
| 367 | const struct net_device_ops *ops = rdev->netdev_ops; | ||
| 368 | |||
| 369 | return ops->ndo_select_queue(rdev, skb); | ||
| 370 | } | ||
| 371 | |||
| 364 | static int vlan_dev_change_mtu(struct net_device *dev, int new_mtu) | 372 | static int vlan_dev_change_mtu(struct net_device *dev, int new_mtu) |
| 365 | { | 373 | { |
| 366 | /* TODO: gotta make sure the underlying layer can handle it, | 374 | /* TODO: gotta make sure the underlying layer can handle it, |
| @@ -688,7 +696,8 @@ static const struct header_ops vlan_header_ops = { | |||
| 688 | .parse = eth_header_parse, | 696 | .parse = eth_header_parse, |
| 689 | }; | 697 | }; |
| 690 | 698 | ||
| 691 | static const struct net_device_ops vlan_netdev_ops, vlan_netdev_accel_ops; | 699 | static const struct net_device_ops vlan_netdev_ops, vlan_netdev_accel_ops, |
| 700 | vlan_netdev_ops_sq, vlan_netdev_accel_ops_sq; | ||
| 692 | 701 | ||
| 693 | static int vlan_dev_init(struct net_device *dev) | 702 | static int vlan_dev_init(struct net_device *dev) |
| 694 | { | 703 | { |
| @@ -722,11 +731,17 @@ static int vlan_dev_init(struct net_device *dev) | |||
| 722 | if (real_dev->features & NETIF_F_HW_VLAN_TX) { | 731 | if (real_dev->features & NETIF_F_HW_VLAN_TX) { |
| 723 | dev->header_ops = real_dev->header_ops; | 732 | dev->header_ops = real_dev->header_ops; |
| 724 | dev->hard_header_len = real_dev->hard_header_len; | 733 | dev->hard_header_len = real_dev->hard_header_len; |
| 725 | dev->netdev_ops = &vlan_netdev_accel_ops; | 734 | if (real_dev->netdev_ops->ndo_select_queue) |
| 735 | dev->netdev_ops = &vlan_netdev_accel_ops_sq; | ||
| 736 | else | ||
| 737 | dev->netdev_ops = &vlan_netdev_accel_ops; | ||
| 726 | } else { | 738 | } else { |
| 727 | dev->header_ops = &vlan_header_ops; | 739 | dev->header_ops = &vlan_header_ops; |
| 728 | dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN; | 740 | dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN; |
| 729 | dev->netdev_ops = &vlan_netdev_ops; | 741 | if (real_dev->netdev_ops->ndo_select_queue) |
| 742 | dev->netdev_ops = &vlan_netdev_ops_sq; | ||
| 743 | else | ||
| 744 | dev->netdev_ops = &vlan_netdev_ops; | ||
| 730 | } | 745 | } |
| 731 | 746 | ||
| 732 | if (is_vlan_dev(real_dev)) | 747 | if (is_vlan_dev(real_dev)) |
| @@ -865,6 +880,56 @@ static const struct net_device_ops vlan_netdev_accel_ops = { | |||
| 865 | #endif | 880 | #endif |
| 866 | }; | 881 | }; |
| 867 | 882 | ||
| 883 | static const struct net_device_ops vlan_netdev_ops_sq = { | ||
| 884 | .ndo_select_queue = vlan_dev_select_queue, | ||
| 885 | .ndo_change_mtu = vlan_dev_change_mtu, | ||
| 886 | .ndo_init = vlan_dev_init, | ||
| 887 | .ndo_uninit = vlan_dev_uninit, | ||
| 888 | .ndo_open = vlan_dev_open, | ||
| 889 | .ndo_stop = vlan_dev_stop, | ||
| 890 | .ndo_start_xmit = vlan_dev_hard_start_xmit, | ||
| 891 | .ndo_validate_addr = eth_validate_addr, | ||
| 892 | .ndo_set_mac_address = vlan_dev_set_mac_address, | ||
| 893 | .ndo_set_rx_mode = vlan_dev_set_rx_mode, | ||
| 894 | .ndo_set_multicast_list = vlan_dev_set_rx_mode, | ||
| 895 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, | ||
| 896 | .ndo_do_ioctl = vlan_dev_ioctl, | ||
| 897 | .ndo_neigh_setup = vlan_dev_neigh_setup, | ||
| 898 | .ndo_get_stats = vlan_dev_get_stats, | ||
| 899 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | ||
| 900 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, | ||
| 901 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, | ||
| 902 | .ndo_fcoe_enable = vlan_dev_fcoe_enable, | ||
| 903 | .ndo_fcoe_disable = vlan_dev_fcoe_disable, | ||
| 904 | .ndo_fcoe_get_wwn = vlan_dev_fcoe_get_wwn, | ||
| 905 | #endif | ||
| 906 | }; | ||
| 907 | |||
| 908 | static const struct net_device_ops vlan_netdev_accel_ops_sq = { | ||
| 909 | .ndo_select_queue = vlan_dev_select_queue, | ||
| 910 | .ndo_change_mtu = vlan_dev_change_mtu, | ||
| 911 | .ndo_init = vlan_dev_init, | ||
| 912 | .ndo_uninit = vlan_dev_uninit, | ||
| 913 | .ndo_open = vlan_dev_open, | ||
| 914 | .ndo_stop = vlan_dev_stop, | ||
| 915 | .ndo_start_xmit = vlan_dev_hwaccel_hard_start_xmit, | ||
| 916 | .ndo_validate_addr = eth_validate_addr, | ||
| 917 | .ndo_set_mac_address = vlan_dev_set_mac_address, | ||
| 918 | .ndo_set_rx_mode = vlan_dev_set_rx_mode, | ||
| 919 | .ndo_set_multicast_list = vlan_dev_set_rx_mode, | ||
| 920 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, | ||
| 921 | .ndo_do_ioctl = vlan_dev_ioctl, | ||
| 922 | .ndo_neigh_setup = vlan_dev_neigh_setup, | ||
| 923 | .ndo_get_stats = vlan_dev_get_stats, | ||
| 924 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | ||
| 925 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, | ||
| 926 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, | ||
| 927 | .ndo_fcoe_enable = vlan_dev_fcoe_enable, | ||
| 928 | .ndo_fcoe_disable = vlan_dev_fcoe_disable, | ||
| 929 | .ndo_fcoe_get_wwn = vlan_dev_fcoe_get_wwn, | ||
| 930 | #endif | ||
| 931 | }; | ||
| 932 | |||
| 868 | void vlan_setup(struct net_device *dev) | 933 | void vlan_setup(struct net_device *dev) |
| 869 | { | 934 | { |
| 870 | ether_setup(dev); | 935 | ether_setup(dev); |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index d4ec38fa64e6..6f9206b36dc2 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -614,7 +614,7 @@ void netpoll_print_options(struct netpoll *np) | |||
| 614 | np->name, np->local_port); | 614 | np->name, np->local_port); |
| 615 | printk(KERN_INFO "%s: local IP %pI4\n", | 615 | printk(KERN_INFO "%s: local IP %pI4\n", |
| 616 | np->name, &np->local_ip); | 616 | np->name, &np->local_ip); |
| 617 | printk(KERN_INFO "%s: interface %s\n", | 617 | printk(KERN_INFO "%s: interface '%s'\n", |
| 618 | np->name, np->dev_name); | 618 | np->name, np->dev_name); |
| 619 | printk(KERN_INFO "%s: remote port %d\n", | 619 | printk(KERN_INFO "%s: remote port %d\n", |
| 620 | np->name, np->remote_port); | 620 | np->name, np->remote_port); |
| @@ -661,6 +661,9 @@ int netpoll_parse_options(struct netpoll *np, char *opt) | |||
| 661 | if ((delim = strchr(cur, '@')) == NULL) | 661 | if ((delim = strchr(cur, '@')) == NULL) |
| 662 | goto parse_failed; | 662 | goto parse_failed; |
| 663 | *delim = 0; | 663 | *delim = 0; |
| 664 | if (*cur == ' ' || *cur == '\t') | ||
| 665 | printk(KERN_INFO "%s: warning: whitespace" | ||
| 666 | "is not allowed\n", np->name); | ||
| 664 | np->remote_port = simple_strtol(cur, NULL, 10); | 667 | np->remote_port = simple_strtol(cur, NULL, 10); |
| 665 | cur = delim; | 668 | cur = delim; |
| 666 | } | 669 | } |
| @@ -708,7 +711,7 @@ int netpoll_parse_options(struct netpoll *np, char *opt) | |||
| 708 | return 0; | 711 | return 0; |
| 709 | 712 | ||
| 710 | parse_failed: | 713 | parse_failed: |
| 711 | printk(KERN_INFO "%s: couldn't parse config at %s!\n", | 714 | printk(KERN_INFO "%s: couldn't parse config at '%s'!\n", |
| 712 | np->name, cur); | 715 | np->name, cur); |
| 713 | return -1; | 716 | return -1; |
| 714 | } | 717 | } |
diff --git a/net/ipv6/netfilter/ip6table_raw.c b/net/ipv6/netfilter/ip6table_raw.c index aef31a29de9e..b9cf7cd61923 100644 --- a/net/ipv6/netfilter/ip6table_raw.c +++ b/net/ipv6/netfilter/ip6table_raw.c | |||
| @@ -13,7 +13,7 @@ static const struct xt_table packet_raw = { | |||
| 13 | .valid_hooks = RAW_VALID_HOOKS, | 13 | .valid_hooks = RAW_VALID_HOOKS, |
| 14 | .me = THIS_MODULE, | 14 | .me = THIS_MODULE, |
| 15 | .af = NFPROTO_IPV6, | 15 | .af = NFPROTO_IPV6, |
| 16 | .priority = NF_IP6_PRI_FIRST, | 16 | .priority = NF_IP6_PRI_RAW, |
| 17 | }; | 17 | }; |
| 18 | 18 | ||
| 19 | /* The work comes in here from netfilter.c. */ | 19 | /* The work comes in here from netfilter.c. */ |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 368707882647..344145f23c34 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
| @@ -2129,10 +2129,9 @@ static int key_notify_policy(struct xfrm_policy *xp, int dir, struct km_event *c | |||
| 2129 | int err; | 2129 | int err; |
| 2130 | 2130 | ||
| 2131 | out_skb = pfkey_xfrm_policy2msg_prep(xp); | 2131 | out_skb = pfkey_xfrm_policy2msg_prep(xp); |
| 2132 | if (IS_ERR(out_skb)) { | 2132 | if (IS_ERR(out_skb)) |
| 2133 | err = PTR_ERR(out_skb); | 2133 | return PTR_ERR(out_skb); |
| 2134 | goto out; | 2134 | |
| 2135 | } | ||
| 2136 | err = pfkey_xfrm_policy2msg(out_skb, xp, dir); | 2135 | err = pfkey_xfrm_policy2msg(out_skb, xp, dir); |
| 2137 | if (err < 0) | 2136 | if (err < 0) |
| 2138 | return err; | 2137 | return err; |
| @@ -2148,7 +2147,6 @@ static int key_notify_policy(struct xfrm_policy *xp, int dir, struct km_event *c | |||
| 2148 | out_hdr->sadb_msg_seq = c->seq; | 2147 | out_hdr->sadb_msg_seq = c->seq; |
| 2149 | out_hdr->sadb_msg_pid = c->pid; | 2148 | out_hdr->sadb_msg_pid = c->pid; |
| 2150 | pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, NULL, xp_net(xp)); | 2149 | pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, NULL, xp_net(xp)); |
| 2151 | out: | ||
| 2152 | return 0; | 2150 | return 0; |
| 2153 | 2151 | ||
| 2154 | } | 2152 | } |
diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c index 9e9c48963942..215a64835de8 100644 --- a/net/netfilter/xt_hashlimit.c +++ b/net/netfilter/xt_hashlimit.c | |||
| @@ -493,6 +493,7 @@ static void hashlimit_ipv6_mask(__be32 *i, unsigned int p) | |||
| 493 | case 64 ... 95: | 493 | case 64 ... 95: |
| 494 | i[2] = maskl(i[2], p - 64); | 494 | i[2] = maskl(i[2], p - 64); |
| 495 | i[3] = 0; | 495 | i[3] = 0; |
| 496 | break; | ||
| 496 | case 96 ... 127: | 497 | case 96 ... 127: |
| 497 | i[3] = maskl(i[3], p - 96); | 498 | i[3] = maskl(i[3], p - 96); |
| 498 | break; | 499 | break; |
| @@ -879,7 +880,8 @@ static void dl_seq_stop(struct seq_file *s, void *v) | |||
| 879 | struct xt_hashlimit_htable *htable = s->private; | 880 | struct xt_hashlimit_htable *htable = s->private; |
| 880 | unsigned int *bucket = (unsigned int *)v; | 881 | unsigned int *bucket = (unsigned int *)v; |
| 881 | 882 | ||
| 882 | kfree(bucket); | 883 | if (!IS_ERR(bucket)) |
| 884 | kfree(bucket); | ||
| 883 | spin_unlock_bh(&htable->lock); | 885 | spin_unlock_bh(&htable->lock); |
| 884 | } | 886 | } |
| 885 | 887 | ||
diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c index 7073dbb8100c..971d172afece 100644 --- a/net/netfilter/xt_recent.c +++ b/net/netfilter/xt_recent.c | |||
| @@ -267,7 +267,7 @@ recent_mt(const struct sk_buff *skb, const struct xt_match_param *par) | |||
| 267 | for (i = 0; i < e->nstamps; i++) { | 267 | for (i = 0; i < e->nstamps; i++) { |
| 268 | if (info->seconds && time_after(time, e->stamps[i])) | 268 | if (info->seconds && time_after(time, e->stamps[i])) |
| 269 | continue; | 269 | continue; |
| 270 | if (info->hit_count && ++hits >= info->hit_count) { | 270 | if (!info->hit_count || ++hits >= info->hit_count) { |
| 271 | ret = !ret; | 271 | ret = !ret; |
| 272 | break; | 272 | break; |
| 273 | } | 273 | } |
diff --git a/net/sched/Kconfig b/net/sched/Kconfig index 21f9c7678aa3..2f691fb180d1 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig | |||
| @@ -328,13 +328,16 @@ config NET_CLS_FLOW | |||
| 328 | module will be called cls_flow. | 328 | module will be called cls_flow. |
| 329 | 329 | ||
| 330 | config NET_CLS_CGROUP | 330 | config NET_CLS_CGROUP |
| 331 | bool "Control Group Classifier" | 331 | tristate "Control Group Classifier" |
| 332 | select NET_CLS | 332 | select NET_CLS |
| 333 | depends on CGROUPS | 333 | depends on CGROUPS |
| 334 | ---help--- | 334 | ---help--- |
| 335 | Say Y here if you want to classify packets based on the control | 335 | Say Y here if you want to classify packets based on the control |
| 336 | cgroup of their process. | 336 | cgroup of their process. |
| 337 | 337 | ||
| 338 | To compile this code as a module, choose M here: the | ||
| 339 | module will be called cls_cgroup. | ||
| 340 | |||
| 338 | config NET_EMATCH | 341 | config NET_EMATCH |
| 339 | bool "Extended Matches" | 342 | bool "Extended Matches" |
| 340 | select NET_CLS | 343 | select NET_CLS |
diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c index e4877ca6727c..7f27d2c15e08 100644 --- a/net/sched/cls_cgroup.c +++ b/net/sched/cls_cgroup.c | |||
| @@ -24,6 +24,25 @@ struct cgroup_cls_state | |||
| 24 | u32 classid; | 24 | u32 classid; |
| 25 | }; | 25 | }; |
| 26 | 26 | ||
| 27 | static struct cgroup_subsys_state *cgrp_create(struct cgroup_subsys *ss, | ||
| 28 | struct cgroup *cgrp); | ||
| 29 | static void cgrp_destroy(struct cgroup_subsys *ss, struct cgroup *cgrp); | ||
| 30 | static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp); | ||
| 31 | |||
| 32 | struct cgroup_subsys net_cls_subsys = { | ||
| 33 | .name = "net_cls", | ||
| 34 | .create = cgrp_create, | ||
| 35 | .destroy = cgrp_destroy, | ||
| 36 | .populate = cgrp_populate, | ||
| 37 | #ifdef CONFIG_NET_CLS_CGROUP | ||
| 38 | .subsys_id = net_cls_subsys_id, | ||
| 39 | #else | ||
| 40 | #define net_cls_subsys_id net_cls_subsys.subsys_id | ||
| 41 | #endif | ||
| 42 | .module = THIS_MODULE, | ||
| 43 | }; | ||
| 44 | |||
| 45 | |||
| 27 | static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp) | 46 | static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp) |
| 28 | { | 47 | { |
| 29 | return container_of(cgroup_subsys_state(cgrp, net_cls_subsys_id), | 48 | return container_of(cgroup_subsys_state(cgrp, net_cls_subsys_id), |
| @@ -79,14 +98,6 @@ static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp) | |||
| 79 | return cgroup_add_files(cgrp, ss, ss_files, ARRAY_SIZE(ss_files)); | 98 | return cgroup_add_files(cgrp, ss, ss_files, ARRAY_SIZE(ss_files)); |
| 80 | } | 99 | } |
| 81 | 100 | ||
| 82 | struct cgroup_subsys net_cls_subsys = { | ||
| 83 | .name = "net_cls", | ||
| 84 | .create = cgrp_create, | ||
| 85 | .destroy = cgrp_destroy, | ||
| 86 | .populate = cgrp_populate, | ||
| 87 | .subsys_id = net_cls_subsys_id, | ||
| 88 | }; | ||
| 89 | |||
| 90 | struct cls_cgroup_head | 101 | struct cls_cgroup_head |
| 91 | { | 102 | { |
| 92 | u32 handle; | 103 | u32 handle; |
| @@ -277,12 +288,19 @@ static struct tcf_proto_ops cls_cgroup_ops __read_mostly = { | |||
| 277 | 288 | ||
| 278 | static int __init init_cgroup_cls(void) | 289 | static int __init init_cgroup_cls(void) |
| 279 | { | 290 | { |
| 280 | return register_tcf_proto_ops(&cls_cgroup_ops); | 291 | int ret = register_tcf_proto_ops(&cls_cgroup_ops); |
| 292 | if (ret) | ||
| 293 | return ret; | ||
| 294 | ret = cgroup_load_subsys(&net_cls_subsys); | ||
| 295 | if (ret) | ||
| 296 | unregister_tcf_proto_ops(&cls_cgroup_ops); | ||
| 297 | return ret; | ||
| 281 | } | 298 | } |
| 282 | 299 | ||
| 283 | static void __exit exit_cgroup_cls(void) | 300 | static void __exit exit_cgroup_cls(void) |
| 284 | { | 301 | { |
| 285 | unregister_tcf_proto_ops(&cls_cgroup_ops); | 302 | unregister_tcf_proto_ops(&cls_cgroup_ops); |
| 303 | cgroup_unload_subsys(&net_cls_subsys); | ||
| 286 | } | 304 | } |
| 287 | 305 | ||
| 288 | module_init(init_cgroup_cls); | 306 | module_init(init_cgroup_cls); |
