diff options
-rw-r--r-- | include/net/ipv6.h | 12 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 18 |
2 files changed, 15 insertions, 15 deletions
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index f27fd83d67d8..ad9a51130254 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -441,6 +441,18 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add | |||
441 | return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); | 441 | return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); |
442 | } | 442 | } |
443 | 443 | ||
444 | static __inline__ void ipv6_select_ident(struct frag_hdr *fhdr) | ||
445 | { | ||
446 | static u32 ipv6_fragmentation_id = 1; | ||
447 | static DEFINE_SPINLOCK(ip6_id_lock); | ||
448 | |||
449 | spin_lock_bh(&ip6_id_lock); | ||
450 | fhdr->identification = htonl(ipv6_fragmentation_id); | ||
451 | if (++ipv6_fragmentation_id == 0) | ||
452 | ipv6_fragmentation_id = 1; | ||
453 | spin_unlock_bh(&ip6_id_lock); | ||
454 | } | ||
455 | |||
444 | /* | 456 | /* |
445 | * Prototypes exported by ipv6 | 457 | * Prototypes exported by ipv6 |
446 | */ | 458 | */ |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 1c6f0fc43690..dd1a980b8ac9 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -57,18 +57,6 @@ | |||
57 | 57 | ||
58 | static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)); | 58 | static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)); |
59 | 59 | ||
60 | static __inline__ void ipv6_select_ident(struct sk_buff *skb, struct frag_hdr *fhdr) | ||
61 | { | ||
62 | static u32 ipv6_fragmentation_id = 1; | ||
63 | static DEFINE_SPINLOCK(ip6_id_lock); | ||
64 | |||
65 | spin_lock_bh(&ip6_id_lock); | ||
66 | fhdr->identification = htonl(ipv6_fragmentation_id); | ||
67 | if (++ipv6_fragmentation_id == 0) | ||
68 | ipv6_fragmentation_id = 1; | ||
69 | spin_unlock_bh(&ip6_id_lock); | ||
70 | } | ||
71 | |||
72 | int __ip6_local_out(struct sk_buff *skb) | 60 | int __ip6_local_out(struct sk_buff *skb) |
73 | { | 61 | { |
74 | int len; | 62 | int len; |
@@ -706,7 +694,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
706 | skb_reset_network_header(skb); | 694 | skb_reset_network_header(skb); |
707 | memcpy(skb_network_header(skb), tmp_hdr, hlen); | 695 | memcpy(skb_network_header(skb), tmp_hdr, hlen); |
708 | 696 | ||
709 | ipv6_select_ident(skb, fh); | 697 | ipv6_select_ident(fh); |
710 | fh->nexthdr = nexthdr; | 698 | fh->nexthdr = nexthdr; |
711 | fh->reserved = 0; | 699 | fh->reserved = 0; |
712 | fh->frag_off = htons(IP6_MF); | 700 | fh->frag_off = htons(IP6_MF); |
@@ -844,7 +832,7 @@ slow_path: | |||
844 | fh->nexthdr = nexthdr; | 832 | fh->nexthdr = nexthdr; |
845 | fh->reserved = 0; | 833 | fh->reserved = 0; |
846 | if (!frag_id) { | 834 | if (!frag_id) { |
847 | ipv6_select_ident(skb, fh); | 835 | ipv6_select_ident(fh); |
848 | frag_id = fh->identification; | 836 | frag_id = fh->identification; |
849 | } else | 837 | } else |
850 | fh->identification = frag_id; | 838 | fh->identification = frag_id; |
@@ -1093,7 +1081,7 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
1093 | skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - | 1081 | skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - |
1094 | sizeof(struct frag_hdr)) & ~7; | 1082 | sizeof(struct frag_hdr)) & ~7; |
1095 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | 1083 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; |
1096 | ipv6_select_ident(skb, &fhdr); | 1084 | ipv6_select_ident(&fhdr); |
1097 | skb_shinfo(skb)->ip6_frag_id = fhdr.identification; | 1085 | skb_shinfo(skb)->ip6_frag_id = fhdr.identification; |
1098 | __skb_queue_tail(&sk->sk_write_queue, skb); | 1086 | __skb_queue_tail(&sk->sk_write_queue, skb); |
1099 | 1087 | ||