diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/core/pktgen.c | 29 | ||||
| -rw-r--r-- | net/ipv4/Kconfig | 3 | ||||
| -rw-r--r-- | net/ipv4/ipvs/ip_vs_ctl.c | 8 | ||||
| -rw-r--r-- | net/ipv4/ipvs/ip_vs_sync.c | 4 | ||||
| -rw-r--r-- | net/netlink/af_netlink.c | 11 |
5 files changed, 29 insertions, 26 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index c57b06bc79f3..975d651312dc 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -151,7 +151,7 @@ | |||
| 151 | #include <asm/timex.h> | 151 | #include <asm/timex.h> |
| 152 | 152 | ||
| 153 | 153 | ||
| 154 | #define VERSION "pktgen v2.61: Packet Generator for packet performance testing.\n" | 154 | #define VERSION "pktgen v2.62: Packet Generator for packet performance testing.\n" |
| 155 | 155 | ||
| 156 | /* #define PG_DEBUG(a) a */ | 156 | /* #define PG_DEBUG(a) a */ |
| 157 | #define PG_DEBUG(a) | 157 | #define PG_DEBUG(a) |
| @@ -1921,6 +1921,11 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
| 1921 | struct iphdr *iph; | 1921 | struct iphdr *iph; |
| 1922 | struct pktgen_hdr *pgh = NULL; | 1922 | struct pktgen_hdr *pgh = NULL; |
| 1923 | 1923 | ||
| 1924 | /* Update any of the values, used when we're incrementing various | ||
| 1925 | * fields. | ||
| 1926 | */ | ||
| 1927 | mod_cur_headers(pkt_dev); | ||
| 1928 | |||
| 1924 | skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + 16, GFP_ATOMIC); | 1929 | skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + 16, GFP_ATOMIC); |
| 1925 | if (!skb) { | 1930 | if (!skb) { |
| 1926 | sprintf(pkt_dev->result, "No memory"); | 1931 | sprintf(pkt_dev->result, "No memory"); |
| @@ -1934,11 +1939,6 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
| 1934 | iph = (struct iphdr *)skb_put(skb, sizeof(struct iphdr)); | 1939 | iph = (struct iphdr *)skb_put(skb, sizeof(struct iphdr)); |
| 1935 | udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr)); | 1940 | udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr)); |
| 1936 | 1941 | ||
| 1937 | /* Update any of the values, used when we're incrementing various | ||
| 1938 | * fields. | ||
| 1939 | */ | ||
| 1940 | mod_cur_headers(pkt_dev); | ||
| 1941 | |||
| 1942 | memcpy(eth, pkt_dev->hh, 12); | 1942 | memcpy(eth, pkt_dev->hh, 12); |
| 1943 | *(u16*)ð[12] = __constant_htons(ETH_P_IP); | 1943 | *(u16*)ð[12] = __constant_htons(ETH_P_IP); |
| 1944 | 1944 | ||
| @@ -2192,7 +2192,12 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
| 2192 | int datalen; | 2192 | int datalen; |
| 2193 | struct ipv6hdr *iph; | 2193 | struct ipv6hdr *iph; |
| 2194 | struct pktgen_hdr *pgh = NULL; | 2194 | struct pktgen_hdr *pgh = NULL; |
| 2195 | 2195 | ||
| 2196 | /* Update any of the values, used when we're incrementing various | ||
| 2197 | * fields. | ||
| 2198 | */ | ||
| 2199 | mod_cur_headers(pkt_dev); | ||
| 2200 | |||
| 2196 | skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + 16, GFP_ATOMIC); | 2201 | skb = alloc_skb(pkt_dev->cur_pkt_size + 64 + 16, GFP_ATOMIC); |
| 2197 | if (!skb) { | 2202 | if (!skb) { |
| 2198 | sprintf(pkt_dev->result, "No memory"); | 2203 | sprintf(pkt_dev->result, "No memory"); |
| @@ -2206,17 +2211,9 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
| 2206 | iph = (struct ipv6hdr *)skb_put(skb, sizeof(struct ipv6hdr)); | 2211 | iph = (struct ipv6hdr *)skb_put(skb, sizeof(struct ipv6hdr)); |
| 2207 | udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr)); | 2212 | udph = (struct udphdr *)skb_put(skb, sizeof(struct udphdr)); |
| 2208 | 2213 | ||
| 2209 | |||
| 2210 | /* Update any of the values, used when we're incrementing various | ||
| 2211 | * fields. | ||
| 2212 | */ | ||
| 2213 | mod_cur_headers(pkt_dev); | ||
| 2214 | |||
| 2215 | |||
| 2216 | memcpy(eth, pkt_dev->hh, 12); | 2214 | memcpy(eth, pkt_dev->hh, 12); |
| 2217 | *(u16*)ð[12] = __constant_htons(ETH_P_IPV6); | 2215 | *(u16*)ð[12] = __constant_htons(ETH_P_IPV6); |
| 2218 | 2216 | ||
| 2219 | |||
| 2220 | datalen = pkt_dev->cur_pkt_size-14- | 2217 | datalen = pkt_dev->cur_pkt_size-14- |
| 2221 | sizeof(struct ipv6hdr)-sizeof(struct udphdr); /* Eth + IPh + UDPh */ | 2218 | sizeof(struct ipv6hdr)-sizeof(struct udphdr); /* Eth + IPh + UDPh */ |
| 2222 | 2219 | ||
diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig index 347083433120..3e63123f7bbd 100644 --- a/net/ipv4/Kconfig +++ b/net/ipv4/Kconfig | |||
| @@ -448,7 +448,6 @@ config IP_TCPDIAG_IPV6 | |||
| 448 | config TCP_CONG_ADVANCED | 448 | config TCP_CONG_ADVANCED |
| 449 | bool "TCP: advanced congestion control" | 449 | bool "TCP: advanced congestion control" |
| 450 | depends on INET | 450 | depends on INET |
| 451 | default y | ||
| 452 | ---help--- | 451 | ---help--- |
| 453 | Support for selection of various TCP congestion control | 452 | Support for selection of various TCP congestion control |
| 454 | modules. | 453 | modules. |
| @@ -549,7 +548,7 @@ config TCP_CONG_SCALABLE | |||
| 549 | endmenu | 548 | endmenu |
| 550 | 549 | ||
| 551 | config TCP_CONG_BIC | 550 | config TCP_CONG_BIC |
| 552 | boolean | 551 | tristate |
| 553 | depends on !TCP_CONG_ADVANCED | 552 | depends on !TCP_CONG_ADVANCED |
| 554 | default y | 553 | default y |
| 555 | 554 | ||
diff --git a/net/ipv4/ipvs/ip_vs_ctl.c b/net/ipv4/ipvs/ip_vs_ctl.c index 218d9701036e..12a82e91d22a 100644 --- a/net/ipv4/ipvs/ip_vs_ctl.c +++ b/net/ipv4/ipvs/ip_vs_ctl.c | |||
| @@ -2059,7 +2059,7 @@ ip_vs_copy_service(struct ip_vs_service_entry *dst, struct ip_vs_service *src) | |||
| 2059 | dst->addr = src->addr; | 2059 | dst->addr = src->addr; |
| 2060 | dst->port = src->port; | 2060 | dst->port = src->port; |
| 2061 | dst->fwmark = src->fwmark; | 2061 | dst->fwmark = src->fwmark; |
| 2062 | strcpy(dst->sched_name, src->scheduler->name); | 2062 | strlcpy(dst->sched_name, src->scheduler->name, sizeof(dst->sched_name)); |
| 2063 | dst->flags = src->flags; | 2063 | dst->flags = src->flags; |
| 2064 | dst->timeout = src->timeout / HZ; | 2064 | dst->timeout = src->timeout / HZ; |
| 2065 | dst->netmask = src->netmask; | 2065 | dst->netmask = src->netmask; |
| @@ -2080,6 +2080,7 @@ __ip_vs_get_service_entries(const struct ip_vs_get_services *get, | |||
| 2080 | list_for_each_entry(svc, &ip_vs_svc_table[idx], s_list) { | 2080 | list_for_each_entry(svc, &ip_vs_svc_table[idx], s_list) { |
| 2081 | if (count >= get->num_services) | 2081 | if (count >= get->num_services) |
| 2082 | goto out; | 2082 | goto out; |
| 2083 | memset(&entry, 0, sizeof(entry)); | ||
| 2083 | ip_vs_copy_service(&entry, svc); | 2084 | ip_vs_copy_service(&entry, svc); |
| 2084 | if (copy_to_user(&uptr->entrytable[count], | 2085 | if (copy_to_user(&uptr->entrytable[count], |
| 2085 | &entry, sizeof(entry))) { | 2086 | &entry, sizeof(entry))) { |
| @@ -2094,6 +2095,7 @@ __ip_vs_get_service_entries(const struct ip_vs_get_services *get, | |||
| 2094 | list_for_each_entry(svc, &ip_vs_svc_fwm_table[idx], f_list) { | 2095 | list_for_each_entry(svc, &ip_vs_svc_fwm_table[idx], f_list) { |
| 2095 | if (count >= get->num_services) | 2096 | if (count >= get->num_services) |
| 2096 | goto out; | 2097 | goto out; |
| 2098 | memset(&entry, 0, sizeof(entry)); | ||
| 2097 | ip_vs_copy_service(&entry, svc); | 2099 | ip_vs_copy_service(&entry, svc); |
| 2098 | if (copy_to_user(&uptr->entrytable[count], | 2100 | if (copy_to_user(&uptr->entrytable[count], |
| 2099 | &entry, sizeof(entry))) { | 2101 | &entry, sizeof(entry))) { |
| @@ -2304,12 +2306,12 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) | |||
| 2304 | memset(&d, 0, sizeof(d)); | 2306 | memset(&d, 0, sizeof(d)); |
| 2305 | if (ip_vs_sync_state & IP_VS_STATE_MASTER) { | 2307 | if (ip_vs_sync_state & IP_VS_STATE_MASTER) { |
| 2306 | d[0].state = IP_VS_STATE_MASTER; | 2308 | d[0].state = IP_VS_STATE_MASTER; |
| 2307 | strcpy(d[0].mcast_ifn, ip_vs_master_mcast_ifn); | 2309 | strlcpy(d[0].mcast_ifn, ip_vs_master_mcast_ifn, sizeof(d[0].mcast_ifn)); |
| 2308 | d[0].syncid = ip_vs_master_syncid; | 2310 | d[0].syncid = ip_vs_master_syncid; |
| 2309 | } | 2311 | } |
| 2310 | if (ip_vs_sync_state & IP_VS_STATE_BACKUP) { | 2312 | if (ip_vs_sync_state & IP_VS_STATE_BACKUP) { |
| 2311 | d[1].state = IP_VS_STATE_BACKUP; | 2313 | d[1].state = IP_VS_STATE_BACKUP; |
| 2312 | strcpy(d[1].mcast_ifn, ip_vs_backup_mcast_ifn); | 2314 | strlcpy(d[1].mcast_ifn, ip_vs_backup_mcast_ifn, sizeof(d[1].mcast_ifn)); |
| 2313 | d[1].syncid = ip_vs_backup_syncid; | 2315 | d[1].syncid = ip_vs_backup_syncid; |
| 2314 | } | 2316 | } |
| 2315 | if (copy_to_user(user, &d, sizeof(d)) != 0) | 2317 | if (copy_to_user(user, &d, sizeof(d)) != 0) |
diff --git a/net/ipv4/ipvs/ip_vs_sync.c b/net/ipv4/ipvs/ip_vs_sync.c index 25c479550a32..574d1f509b46 100644 --- a/net/ipv4/ipvs/ip_vs_sync.c +++ b/net/ipv4/ipvs/ip_vs_sync.c | |||
| @@ -839,10 +839,10 @@ int start_sync_thread(int state, char *mcast_ifn, __u8 syncid) | |||
| 839 | 839 | ||
| 840 | ip_vs_sync_state |= state; | 840 | ip_vs_sync_state |= state; |
| 841 | if (state == IP_VS_STATE_MASTER) { | 841 | if (state == IP_VS_STATE_MASTER) { |
| 842 | strcpy(ip_vs_master_mcast_ifn, mcast_ifn); | 842 | strlcpy(ip_vs_master_mcast_ifn, mcast_ifn, sizeof(ip_vs_master_mcast_ifn)); |
| 843 | ip_vs_master_syncid = syncid; | 843 | ip_vs_master_syncid = syncid; |
| 844 | } else { | 844 | } else { |
| 845 | strcpy(ip_vs_backup_mcast_ifn, mcast_ifn); | 845 | strlcpy(ip_vs_backup_mcast_ifn, mcast_ifn, sizeof(ip_vs_backup_mcast_ifn)); |
| 846 | ip_vs_backup_syncid = syncid; | 846 | ip_vs_backup_syncid = syncid; |
| 847 | } | 847 | } |
| 848 | 848 | ||
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 70bcd4744d93..fc456a7aaec3 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -315,8 +315,8 @@ err: | |||
| 315 | static void netlink_remove(struct sock *sk) | 315 | static void netlink_remove(struct sock *sk) |
| 316 | { | 316 | { |
| 317 | netlink_table_grab(); | 317 | netlink_table_grab(); |
| 318 | nl_table[sk->sk_protocol].hash.entries--; | 318 | if (sk_del_node_init(sk)) |
| 319 | sk_del_node_init(sk); | 319 | nl_table[sk->sk_protocol].hash.entries--; |
| 320 | if (nlk_sk(sk)->groups) | 320 | if (nlk_sk(sk)->groups) |
| 321 | __sk_del_bind_node(sk); | 321 | __sk_del_bind_node(sk); |
| 322 | netlink_table_ungrab(); | 322 | netlink_table_ungrab(); |
| @@ -429,7 +429,12 @@ retry: | |||
| 429 | err = netlink_insert(sk, pid); | 429 | err = netlink_insert(sk, pid); |
| 430 | if (err == -EADDRINUSE) | 430 | if (err == -EADDRINUSE) |
| 431 | goto retry; | 431 | goto retry; |
| 432 | return 0; | 432 | |
| 433 | /* If 2 threads race to autobind, that is fine. */ | ||
| 434 | if (err == -EBUSY) | ||
| 435 | err = 0; | ||
| 436 | |||
| 437 | return err; | ||
| 433 | } | 438 | } |
| 434 | 439 | ||
| 435 | static inline int netlink_capable(struct socket *sock, unsigned int flag) | 440 | static inline int netlink_capable(struct socket *sock, unsigned int flag) |
