diff options
Diffstat (limited to 'net/sctp/input.c')
| -rw-r--r-- | net/sctp/input.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/net/sctp/input.c b/net/sctp/input.c index 339f7acfdb64..5e085e041a6e 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c | |||
| @@ -115,6 +115,17 @@ static void sctp_rcv_set_owner_r(struct sk_buff *skb, struct sock *sk) | |||
| 115 | atomic_add(sizeof(struct sctp_chunk),&sk->sk_rmem_alloc); | 115 | atomic_add(sizeof(struct sctp_chunk),&sk->sk_rmem_alloc); |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | struct sctp_input_cb { | ||
| 119 | union { | ||
| 120 | struct inet_skb_parm h4; | ||
| 121 | #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) | ||
| 122 | struct inet6_skb_parm h6; | ||
| 123 | #endif | ||
| 124 | } header; | ||
| 125 | struct sctp_chunk *chunk; | ||
| 126 | }; | ||
| 127 | #define SCTP_INPUT_CB(__skb) ((struct sctp_input_cb *)&((__skb)->cb[0])) | ||
| 128 | |||
| 118 | /* | 129 | /* |
| 119 | * This is the routine which IP calls when receiving an SCTP packet. | 130 | * This is the routine which IP calls when receiving an SCTP packet. |
| 120 | */ | 131 | */ |
| @@ -243,6 +254,7 @@ int sctp_rcv(struct sk_buff *skb) | |||
| 243 | ret = -ENOMEM; | 254 | ret = -ENOMEM; |
| 244 | goto discard_release; | 255 | goto discard_release; |
| 245 | } | 256 | } |
| 257 | SCTP_INPUT_CB(skb)->chunk = chunk; | ||
| 246 | 258 | ||
| 247 | sctp_rcv_set_owner_r(skb,sk); | 259 | sctp_rcv_set_owner_r(skb,sk); |
| 248 | 260 | ||
| @@ -265,9 +277,9 @@ int sctp_rcv(struct sk_buff *skb) | |||
| 265 | sctp_bh_lock_sock(sk); | 277 | sctp_bh_lock_sock(sk); |
| 266 | 278 | ||
| 267 | if (sock_owned_by_user(sk)) | 279 | if (sock_owned_by_user(sk)) |
| 268 | sk_add_backlog(sk, (struct sk_buff *) chunk); | 280 | sk_add_backlog(sk, skb); |
| 269 | else | 281 | else |
| 270 | sctp_backlog_rcv(sk, (struct sk_buff *) chunk); | 282 | sctp_backlog_rcv(sk, skb); |
| 271 | 283 | ||
| 272 | /* Release the sock and any reference counts we took in the | 284 | /* Release the sock and any reference counts we took in the |
| 273 | * lookup calls. | 285 | * lookup calls. |
| @@ -302,14 +314,8 @@ discard_release: | |||
| 302 | */ | 314 | */ |
| 303 | int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb) | 315 | int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb) |
| 304 | { | 316 | { |
| 305 | struct sctp_chunk *chunk; | 317 | struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk; |
| 306 | struct sctp_inq *inqueue; | 318 | struct sctp_inq *inqueue = &chunk->rcvr->inqueue; |
| 307 | |||
| 308 | /* One day chunk will live inside the skb, but for | ||
| 309 | * now this works. | ||
| 310 | */ | ||
| 311 | chunk = (struct sctp_chunk *) skb; | ||
| 312 | inqueue = &chunk->rcvr->inqueue; | ||
| 313 | 319 | ||
| 314 | sctp_inq_push(inqueue, chunk); | 320 | sctp_inq_push(inqueue, chunk); |
| 315 | return 0; | 321 | return 0; |
