X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fsctp%2Fulpevent.c;h=17d0ff5347356f0fb541bab00c9b84d646d04b62;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=e804d6ed8c0f6ca35d5b0dc1024262d62a789f1d;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c index e804d6ed8..17d0ff534 100644 --- a/net/sctp/ulpevent.c +++ b/net/sctp/ulpevent.c @@ -65,8 +65,16 @@ static void sctp_stub_rfree(struct sk_buff *skb) */ } +/* Initialize an ULP event from an given skb. */ +SCTP_STATIC void sctp_ulpevent_init(struct sctp_ulpevent *event, int msg_flags) +{ + memset(event, 0, sizeof(struct sctp_ulpevent)); + event->msg_flags = msg_flags; +} + /* Create a new sctp_ulpevent. */ -struct sctp_ulpevent *sctp_ulpevent_new(int size, int msg_flags, int gfp) +SCTP_STATIC struct sctp_ulpevent *sctp_ulpevent_new(int size, int msg_flags, + int gfp) { struct sctp_ulpevent *event; struct sk_buff *skb; @@ -84,13 +92,6 @@ fail: return NULL; } -/* Initialize an ULP event from an given skb. */ -void sctp_ulpevent_init(struct sctp_ulpevent *event, int msg_flags) -{ - memset(event, 0, sizeof(struct sctp_ulpevent)); - event->msg_flags = msg_flags; -} - /* Is this a MSG_NOTIFICATION? */ int sctp_ulpevent_is_notification(const struct sctp_ulpevent *event) { @@ -562,7 +563,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event( struct sctp_shutdown_event *sse; struct sk_buff *skb; - event = sctp_ulpevent_new(sizeof(struct sctp_assoc_change), + event = sctp_ulpevent_new(sizeof(struct sctp_shutdown_event), MSG_NOTIFICATION, gfp); if (!event) goto fail; @@ -613,6 +614,40 @@ fail: return NULL; } +/* Create and initialize a SCTP_ADAPTION_INDICATION notification. + * + * Socket Extensions for SCTP + * 5.3.1.6 SCTP_ADAPTION_INDICATION + */ +struct sctp_ulpevent *sctp_ulpevent_make_adaption_indication( + const struct sctp_association *asoc, int gfp) +{ + struct sctp_ulpevent *event; + struct sctp_adaption_event *sai; + struct sk_buff *skb; + + event = sctp_ulpevent_new(sizeof(struct sctp_adaption_event), + MSG_NOTIFICATION, gfp); + if (!event) + goto fail; + + skb = sctp_event2skb(event); + sai = (struct sctp_adaption_event *) + skb_put(skb, sizeof(struct sctp_adaption_event)); + + sai->sai_type = SCTP_ADAPTION_INDICATION; + sai->sai_flags = 0; + sai->sai_length = sizeof(struct sctp_adaption_event); + sai->sai_adaption_ind = asoc->peer.adaption_ind; + sctp_ulpevent_set_owner(event, asoc); + sai->sai_assoc_id = sctp_assoc2id(asoc); + + return event; + +fail: + return NULL; +} + /* A message has been received. Package this message as a notification * to pass it to the upper layers. Go ahead and calculate the sndrcvinfo * even if filtered out later. @@ -678,8 +713,8 @@ fail: * * 5.3.1.7 SCTP_PARTIAL_DELIVERY_EVENT * - * When a reciever is engaged in a partial delivery of a - * message this notification will be used to inidicate + * When a receiver is engaged in a partial delivery of a + * message this notification will be used to indicate * various events. */ struct sctp_ulpevent *sctp_ulpevent_make_pdapi( @@ -689,7 +724,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_pdapi( struct sctp_pdapi_event *pd; struct sk_buff *skb; - event = sctp_ulpevent_new(sizeof(struct sctp_assoc_change), + event = sctp_ulpevent_new(sizeof(struct sctp_pdapi_event), MSG_NOTIFICATION, gfp); if (!event) goto fail;