diff options
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/arp.c | 6 | ||||
| -rw-r--r-- | net/ipv4/ipmr.c | 3 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 34 | ||||
| -rw-r--r-- | net/ipv4/udp.c | 6 |
4 files changed, 32 insertions, 17 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 6e747065c202..80769f1f9fab 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
| @@ -661,13 +661,13 @@ struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip, | |||
| 661 | #endif | 661 | #endif |
| 662 | #endif | 662 | #endif |
| 663 | 663 | ||
| 664 | #ifdef CONFIG_FDDI | 664 | #if defined(CONFIG_FDDI) || defined(CONFIG_FDDI_MODULE) |
| 665 | case ARPHRD_FDDI: | 665 | case ARPHRD_FDDI: |
| 666 | arp->ar_hrd = htons(ARPHRD_ETHER); | 666 | arp->ar_hrd = htons(ARPHRD_ETHER); |
| 667 | arp->ar_pro = htons(ETH_P_IP); | 667 | arp->ar_pro = htons(ETH_P_IP); |
| 668 | break; | 668 | break; |
| 669 | #endif | 669 | #endif |
| 670 | #ifdef CONFIG_TR | 670 | #if defined(CONFIG_TR) || defined(CONFIG_TR_MODULE) |
| 671 | case ARPHRD_IEEE802_TR: | 671 | case ARPHRD_IEEE802_TR: |
| 672 | arp->ar_hrd = htons(ARPHRD_IEEE802); | 672 | arp->ar_hrd = htons(ARPHRD_IEEE802); |
| 673 | arp->ar_pro = htons(ETH_P_IP); | 673 | arp->ar_pro = htons(ETH_P_IP); |
| @@ -1051,7 +1051,7 @@ static int arp_req_set(struct net *net, struct arpreq *r, | |||
| 1051 | return -EINVAL; | 1051 | return -EINVAL; |
| 1052 | } | 1052 | } |
| 1053 | switch (dev->type) { | 1053 | switch (dev->type) { |
| 1054 | #ifdef CONFIG_FDDI | 1054 | #if defined(CONFIG_FDDI) || defined(CONFIG_FDDI_MODULE) |
| 1055 | case ARPHRD_FDDI: | 1055 | case ARPHRD_FDDI: |
| 1056 | /* | 1056 | /* |
| 1057 | * According to RFC 1390, FDDI devices should accept ARP | 1057 | * According to RFC 1390, FDDI devices should accept ARP |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 9d4f6d1340a4..ec19a890c9a0 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -754,7 +754,8 @@ ipmr_cache_unresolved(struct net *net, vifi_t vifi, struct sk_buff *skb) | |||
| 754 | c->next = mfc_unres_queue; | 754 | c->next = mfc_unres_queue; |
| 755 | mfc_unres_queue = c; | 755 | mfc_unres_queue = c; |
| 756 | 756 | ||
| 757 | mod_timer(&ipmr_expire_timer, c->mfc_un.unres.expires); | 757 | if (atomic_read(&net->ipv4.cache_resolve_queue_len) == 1) |
| 758 | mod_timer(&ipmr_expire_timer, c->mfc_un.unres.expires); | ||
| 758 | } | 759 | } |
| 759 | 760 | ||
| 760 | /* | 761 | /* |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 0f8caf64caa3..296150b2a62f 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -2839,7 +2839,6 @@ static void __tcp_free_md5sig_pool(struct tcp_md5sig_pool * __percpu *pool) | |||
| 2839 | if (p->md5_desc.tfm) | 2839 | if (p->md5_desc.tfm) |
| 2840 | crypto_free_hash(p->md5_desc.tfm); | 2840 | crypto_free_hash(p->md5_desc.tfm); |
| 2841 | kfree(p); | 2841 | kfree(p); |
| 2842 | p = NULL; | ||
| 2843 | } | 2842 | } |
| 2844 | } | 2843 | } |
| 2845 | free_percpu(pool); | 2844 | free_percpu(pool); |
| @@ -2937,25 +2936,40 @@ retry: | |||
| 2937 | 2936 | ||
| 2938 | EXPORT_SYMBOL(tcp_alloc_md5sig_pool); | 2937 | EXPORT_SYMBOL(tcp_alloc_md5sig_pool); |
| 2939 | 2938 | ||
| 2940 | struct tcp_md5sig_pool *__tcp_get_md5sig_pool(int cpu) | 2939 | |
| 2940 | /** | ||
| 2941 | * tcp_get_md5sig_pool - get md5sig_pool for this user | ||
| 2942 | * | ||
| 2943 | * We use percpu structure, so if we succeed, we exit with preemption | ||
| 2944 | * and BH disabled, to make sure another thread or softirq handling | ||
| 2945 | * wont try to get same context. | ||
| 2946 | */ | ||
| 2947 | struct tcp_md5sig_pool *tcp_get_md5sig_pool(void) | ||
| 2941 | { | 2948 | { |
| 2942 | struct tcp_md5sig_pool * __percpu *p; | 2949 | struct tcp_md5sig_pool * __percpu *p; |
| 2943 | spin_lock_bh(&tcp_md5sig_pool_lock); | 2950 | |
| 2951 | local_bh_disable(); | ||
| 2952 | |||
| 2953 | spin_lock(&tcp_md5sig_pool_lock); | ||
| 2944 | p = tcp_md5sig_pool; | 2954 | p = tcp_md5sig_pool; |
| 2945 | if (p) | 2955 | if (p) |
| 2946 | tcp_md5sig_users++; | 2956 | tcp_md5sig_users++; |
| 2947 | spin_unlock_bh(&tcp_md5sig_pool_lock); | 2957 | spin_unlock(&tcp_md5sig_pool_lock); |
| 2948 | return (p ? *per_cpu_ptr(p, cpu) : NULL); | 2958 | |
| 2949 | } | 2959 | if (p) |
| 2960 | return *per_cpu_ptr(p, smp_processor_id()); | ||
| 2950 | 2961 | ||
| 2951 | EXPORT_SYMBOL(__tcp_get_md5sig_pool); | 2962 | local_bh_enable(); |
| 2963 | return NULL; | ||
| 2964 | } | ||
| 2965 | EXPORT_SYMBOL(tcp_get_md5sig_pool); | ||
| 2952 | 2966 | ||
| 2953 | void __tcp_put_md5sig_pool(void) | 2967 | void tcp_put_md5sig_pool(void) |
| 2954 | { | 2968 | { |
| 2969 | local_bh_enable(); | ||
| 2955 | tcp_free_md5sig_pool(); | 2970 | tcp_free_md5sig_pool(); |
| 2956 | } | 2971 | } |
| 2957 | 2972 | EXPORT_SYMBOL(tcp_put_md5sig_pool); | |
| 2958 | EXPORT_SYMBOL(__tcp_put_md5sig_pool); | ||
| 2959 | 2973 | ||
| 2960 | int tcp_md5_hash_header(struct tcp_md5sig_pool *hp, | 2974 | int tcp_md5_hash_header(struct tcp_md5sig_pool *hp, |
| 2961 | struct tcphdr *th) | 2975 | struct tcphdr *th) |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 8fef859db35d..c36522a0f113 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -1527,6 +1527,9 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
| 1527 | 1527 | ||
| 1528 | uh = udp_hdr(skb); | 1528 | uh = udp_hdr(skb); |
| 1529 | ulen = ntohs(uh->len); | 1529 | ulen = ntohs(uh->len); |
| 1530 | saddr = ip_hdr(skb)->saddr; | ||
| 1531 | daddr = ip_hdr(skb)->daddr; | ||
| 1532 | |||
| 1530 | if (ulen > skb->len) | 1533 | if (ulen > skb->len) |
| 1531 | goto short_packet; | 1534 | goto short_packet; |
| 1532 | 1535 | ||
| @@ -1540,9 +1543,6 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
| 1540 | if (udp4_csum_init(skb, uh, proto)) | 1543 | if (udp4_csum_init(skb, uh, proto)) |
| 1541 | goto csum_error; | 1544 | goto csum_error; |
| 1542 | 1545 | ||
| 1543 | saddr = ip_hdr(skb)->saddr; | ||
| 1544 | daddr = ip_hdr(skb)->daddr; | ||
| 1545 | |||
| 1546 | if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) | 1546 | if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) |
| 1547 | return __udp4_lib_mcast_deliver(net, skb, uh, | 1547 | return __udp4_lib_mcast_deliver(net, skb, uh, |
| 1548 | saddr, daddr, udptable); | 1548 | saddr, daddr, udptable); |
