diff options
Diffstat (limited to 'net/ipv4/ah4.c')
-rw-r--r-- | net/ipv4/ah4.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/net/ipv4/ah4.c b/net/ipv4/ah4.c index e4f7aa39978d..d69706405d58 100644 --- a/net/ipv4/ah4.c +++ b/net/ipv4/ah4.c | |||
@@ -82,7 +82,7 @@ static int ah_output(struct xfrm_state *x, struct sk_buff *skb) | |||
82 | goto error; | 82 | goto error; |
83 | } | 83 | } |
84 | 84 | ||
85 | ah = (struct ip_auth_hdr *)skb_transport_header(skb); | 85 | ah = ip_auth_hdr(skb); |
86 | ah->nexthdr = *skb_mac_header(skb); | 86 | ah->nexthdr = *skb_mac_header(skb); |
87 | *skb_mac_header(skb) = IPPROTO_AH; | 87 | *skb_mac_header(skb) = IPPROTO_AH; |
88 | 88 | ||
@@ -93,8 +93,7 @@ static int ah_output(struct xfrm_state *x, struct sk_buff *skb) | |||
93 | top_iph->check = 0; | 93 | top_iph->check = 0; |
94 | 94 | ||
95 | ahp = x->data; | 95 | ahp = x->data; |
96 | ah->hdrlen = (XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + | 96 | ah->hdrlen = (XFRM_ALIGN8(sizeof(*ah) + ahp->icv_trunc_len) >> 2) - 2; |
97 | ahp->icv_trunc_len) >> 2) - 2; | ||
98 | 97 | ||
99 | ah->reserved = 0; | 98 | ah->reserved = 0; |
100 | ah->spi = x->id.spi; | 99 | ah->spi = x->id.spi; |
@@ -134,15 +133,15 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) | |||
134 | struct ah_data *ahp; | 133 | struct ah_data *ahp; |
135 | char work_buf[60]; | 134 | char work_buf[60]; |
136 | 135 | ||
137 | if (!pskb_may_pull(skb, sizeof(struct ip_auth_hdr))) | 136 | if (!pskb_may_pull(skb, sizeof(*ah))) |
138 | goto out; | 137 | goto out; |
139 | 138 | ||
140 | ah = (struct ip_auth_hdr*)skb->data; | 139 | ah = (struct ip_auth_hdr *)skb->data; |
141 | ahp = x->data; | 140 | ahp = x->data; |
142 | ah_hlen = (ah->hdrlen + 2) << 2; | 141 | ah_hlen = (ah->hdrlen + 2) << 2; |
143 | 142 | ||
144 | if (ah_hlen != XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_full_len) && | 143 | if (ah_hlen != XFRM_ALIGN8(sizeof(*ah) + ahp->icv_full_len) && |
145 | ah_hlen != XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_trunc_len)) | 144 | ah_hlen != XFRM_ALIGN8(sizeof(*ah) + ahp->icv_trunc_len)) |
146 | goto out; | 145 | goto out; |
147 | 146 | ||
148 | if (!pskb_may_pull(skb, ah_hlen)) | 147 | if (!pskb_may_pull(skb, ah_hlen)) |
@@ -156,7 +155,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) | |||
156 | 155 | ||
157 | skb->ip_summed = CHECKSUM_NONE; | 156 | skb->ip_summed = CHECKSUM_NONE; |
158 | 157 | ||
159 | ah = (struct ip_auth_hdr*)skb->data; | 158 | ah = (struct ip_auth_hdr *)skb->data; |
160 | iph = ip_hdr(skb); | 159 | iph = ip_hdr(skb); |
161 | 160 | ||
162 | ihl = skb->data - skb_network_header(skb); | 161 | ihl = skb->data - skb_network_header(skb); |
@@ -266,7 +265,8 @@ static int ah_init_state(struct xfrm_state *x) | |||
266 | if (!ahp->work_icv) | 265 | if (!ahp->work_icv) |
267 | goto error; | 266 | goto error; |
268 | 267 | ||
269 | x->props.header_len = XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_trunc_len); | 268 | x->props.header_len = XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + |
269 | ahp->icv_trunc_len); | ||
270 | if (x->props.mode == XFRM_MODE_TUNNEL) | 270 | if (x->props.mode == XFRM_MODE_TUNNEL) |
271 | x->props.header_len += sizeof(struct iphdr); | 271 | x->props.header_len += sizeof(struct iphdr); |
272 | x->data = ahp; | 272 | x->data = ahp; |