From: Geir Ola Vaagland <hidden> Date: 2014-06-17 11:57:59
Geir Ola Vaagland (6):
Support for SCTP_RECVRCVINFO socket option
Support for SCTP_RCVINFO ancillary data
Support for SCTP_SNDINFO ancillary data
Support for SCTP_NXTINFO socket option
Support for receiving SCTP_NXTINFO ancillary data
Support for SCTP_DEFAULT_SNDINFO socket option
include/net/sctp/structs.h | 11 +-
include/net/sctp/ulpevent.h | 4 +
include/uapi/linux/sctp.h | 46 ++++++++
net/sctp/socket.c | 260 ++++++++++++++++++++++++++++++++++++++++++--
net/sctp/ulpevent.c | 158 +++++++++++++++++++++++++++
5 files changed, 470 insertions(+), 9 deletions(-)
@@ -216,6 +216,7 @@ struct sctp_sock {__u8frag_interleave;__u32adaptation_ind;__u32pd_point;+__u8recvrcvinfo;atomic_tpd_mode;/* Receive to here while partial delivery is in effect. */
@@ -3566,6 +3566,24 @@ static int sctp_setsockopt_paddr_thresholds(struct sock *sk,return0;}+staticintsctp_setsockopt_recvrcvinfo(structsock*sk,+char__user*optval,+unsignedintoptlen){++intval;++if(optlen<sizeof(int))+return-EINVAL;++if(get_user(val,(int__user*)optval)){+return-EFAULT;+}+sctp_sk(sk)->recvrcvinfo=(val==0)?0:1;+return0;+}+++/* API 6.2 setsockopt(), getsockopt()**Applicationsusesetsockopt()andgetsockopt()tosetorretrieve
@@ -3717,6 +3735,9 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname,caseSCTP_PEER_ADDR_THLDS:retval=sctp_setsockopt_paddr_thresholds(sk,optval,optlen);break;+caseSCTP_RECVRCVINFO:+retval=sctp_setsockopt_recvrcvinfo(sk,optval,optlen);+break;default:retval=-ENOPROTOOPT;break;
@@ -3963,6 +3984,9 @@ static int sctp_init_sock(struct sock *sk)/* Enable Nagle algorithm by default. */sp->nodelay=0;+/* No SCTP_RECVRCVINFO by default. */+sp->recvrcvinfo=0;+/* Enable by default. */sp->v4mapped=1;
@@ -5734,6 +5758,27 @@ static int sctp_getsockopt_assoc_stats(struct sock *sk, int len,return0;}+staticintsctp_getsockopt_recvrcvinfo(structsock*sk,+intlen,+char__user*optval,+int__user*optlen){++intval;++if(len<sizeof(int))+return-EINVAL;++len=sizeof(int);+val=(sctp_sk(sk)->recvrcvinfo==1);+if(put_user(len,optlen))+return-EFAULT;+if(copy_to_user(optval,&val,len))+return-EFAULT;+return0;+}+++staticintsctp_getsockopt(structsock*sk,intlevel,intoptname,char__user*optval,int__user*optlen){
@@ -5877,6 +5922,9 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname,caseSCTP_GET_ASSOC_STATS:retval=sctp_getsockopt_assoc_stats(sk,len,optval,optlen);break;+caseSCTP_RECVRCVINFO:+retval=sctp_getsockopt_recvrcvinfo(sk,len,optval,optlen);+break;default:retval=-ENOPROTOOPT;break;
@@ -131,6 +131,8 @@ struct sctp_ulpevent *sctp_ulpevent_make_sender_dry_event(voidsctp_ulpevent_read_sndrcvinfo(conststructsctp_ulpevent*event,structmsghdr*);+voidsctp_ulpevent_read_rcvinfo(conststructsctp_ulpevent*event,+structmsghdr*);__u16sctp_ulpevent_get_notification_type(conststructsctp_ulpevent*event);/* Is this event type enabled? */
@@ -2094,6 +2094,12 @@ static int sctp_recvmsg(struct kiocb *iocb, struct sock *sk,sp->pf->skb_msgname(skb,msg->msg_name,addr_len);}++/* Check if SCTP_RCVINFO should be included */+if(sp->recvrcvinfo){+sctp_ulpevent_read_rcvinfo(event,msg);+}+/* Check if we allow SCTP_SNDRCVINFO. */if(sp->subscribe.sctp_data_io_event)sctp_ulpevent_read_sndrcvinfo(event,msg);
@@ -1648,10 +1648,21 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,msg_name=msg->msg_name;}-sinfo=cmsgs.info;+if(cmsgs.cmsg_type==SCTP_SNDINFO){+memset(&default_sinfo,0,sizeof(default_sinfo));+default_sinfo.sinfo_flags=cmsgs.s_info->snd_flags;+default_sinfo.sinfo_stream=cmsgs.s_info->snd_sid;+default_sinfo.sinfo_assoc_id=cmsgs.s_info->snd_assoc_id;+default_sinfo.sinfo_ppid=cmsgs.s_info->snd_ppid;+default_sinfo.sinfo_context=cmsgs.s_info->snd_context;+sinfo=&default_sinfo;+}else{+sinfo=cmsgs.sr_info;+}+sinit=cmsgs.init;-/* Did the user specify SNDRCVINFO? */+/* Did the user specify SNDINFO/SNDRCVINFO? */if(sinfo){sinfo_flags=sinfo->sinfo_flags;associd=sinfo->sinfo_assoc_id;
@@ -1858,7 +1869,7 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,pr_debug("%s: we have a valid association\n",__func__);if(!sinfo){-/* If the user didn't specify SNDRCVINFO, make up one with+/* If the user didn't specify SNDINFO/SNDRCVINFO, make up one with*somedefaults.*/memset(&default_sinfo,0,sizeof(default_sinfo));
@@ -1869,6 +1880,8 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,default_sinfo.sinfo_timetolive=asoc->default_timetolive;default_sinfo.sinfo_assoc_id=sctp_assoc2id(asoc);sinfo=&default_sinfo;+}else{+sinfo->sinfo_timetolive=asoc->default_timetolive;}/* API 7.1.7, the sndbuf size per association bounds the
@@ -6473,16 +6486,46 @@ static int sctp_msghdr_parse(const struct msghdr *msg, sctp_cmsgs_t *cmsgs)CMSG_LEN(sizeof(structsctp_sndrcvinfo)))return-EINVAL;-cmsgs->info=+cmsgs->info.srinfo=(structsctp_sndrcvinfo*)CMSG_DATA(cmsg);/* Minimally, validate the sinfo_flags. */-if(cmsgs->info->sinfo_flags&+if(cmsgs->sr_info->sinfo_flags&~(SCTP_UNORDERED|SCTP_ADDR_OVER|SCTP_ABORT|SCTP_EOF))return-EINVAL;break;+caseSCTP_SNDINFO:+/* SCTP Socket API Extension+*5.3.4SCTPSendInformationStructure(SCTP_SNDINFO)+*+*ThiscmsghdrstructurespecifiesSCTPoptionsfor+*sendmsg().ThisstructureandSCTP_RCVINFOreplaces+*SCTP_SNDRCVwhichhasbeendepleted.+*+*cmsg_levelcmsg_typecmsg_data[]+*---------------------------------------------+*IPPROTO_SCTPSCTP_SNDINFOstructsctp_sndinfo+**/+if(cmsg->cmsg_len!=+CMSG_LEN(sizeof(structsctp_sndinfo))){++return-EINVAL;+}++/* SCTP_SENDALL should also be added here when+*itisimplemented*/+cmsgs->info.sinfo=(structsctp_sndinfo*)CMSG_DATA(cmsg);+cmsgs->cmsg_type=SCTP_SNDINFO;++if(cmsgs->s_info->snd_flags&+~(SCTP_UNORDERED|SCTP_ADDR_OVER|+SCTP_ABORT|SCTP_EOF)){+return-EINVAL;+}+break;+default:return-EINVAL;}
@@ -217,6 +217,7 @@ struct sctp_sock {__u32adaptation_ind;__u32pd_point;__u8recvrcvinfo;+__u8recvnxtinfo;atomic_tpd_mode;/* Receive to here while partial delivery is in effect. */
@@ -3602,6 +3602,20 @@ static int sctp_setsockopt_recvrcvinfo(struct sock *sk,}+staticintsctp_setsockopt_recvnxtinfo(structsock*sk,+char__user*optval,+unsignedintoptlen){+intval;++if(optlen<sizeof(int))+return-EINVAL;++if(get_user(val,(int__user*)optval)){+return-EFAULT;+}+sctp_sk(sk)->recvnxtinfo=(val==0)?0:1;+return0;+}/* API 6.2 setsockopt(), getsockopt()*
@@ -3757,6 +3771,9 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname,caseSCTP_RECVRCVINFO:retval=sctp_setsockopt_recvrcvinfo(sk,optval,optlen);break;+caseSCTP_RECVNXTINFO:+retval=sctp_setsockopt_recvnxtinfo(sk,optval,optlen);+break;default:retval=-ENOPROTOOPT;break;
@@ -4006,6 +4023,9 @@ static int sctp_init_sock(struct sock *sk)/* No SCTP_RECVRCVINFO by default. */sp->recvrcvinfo=0;+/* No SCTP_RECVNXTINFO by default. */+sp->recvnxtinfo=0;+/* Enable by default. */sp->v4mapped=1;
@@ -5777,6 +5797,26 @@ static int sctp_getsockopt_assoc_stats(struct sock *sk, int len,return0;}+staticintsctp_getsockopt_recvnxtinfo(structsock*sk,+intlen,+char__user*optval,+int__user*optlen){++intval;+if(len<sizeof(int))+return-EINVAL;++len=sizeof(int);+val=(sctp_sk(sk)->recvnxtinfo==1);++if(put_user(len,optlen))+return-EFAULT;+if(copy_to_user(optval,&val,len))+return-EFAULT;++return0;+}+staticintsctp_getsockopt_recvrcvinfo(structsock*sk,intlen,char__user*optval,
@@ -5944,6 +5984,9 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname,caseSCTP_RECVRCVINFO:retval=sctp_getsockopt_recvrcvinfo(sk,len,optval,optlen);break;+caseSCTP_RECVNXTINFO:+retval=sctp_getsockopt_recvnxtinfo(sk,len,optval,optlen);+break;default:retval=-ENOPROTOOPT;break;
@@ -133,6 +133,8 @@ void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,structmsghdr*);voidsctp_ulpevent_read_rcvinfo(conststructsctp_ulpevent*event,structmsghdr*);+voidsctp_ulpevent_read_nxtinfo(conststructsctp_ulpevent*event,+structmsghdr*,structsk_buff*);__u16sctp_ulpevent_get_notification_type(conststructsctp_ulpevent*event);/* Is this event type enabled? */
@@ -2801,6 +2801,55 @@ static int sctp_setsockopt_default_send_param(struct sock *sk,return0;}+/*+*8.1.31.SetDefaultSendParameters(SCTP_DEFAULT_SNDINFO)+*+*Applicationsthatwishtousethesendto()systemcallmaywishto+*specifyadefaultsetofparametersthatwouldnormallybesupplied+*throughtheinclusionofancillarydata.Thissocketoptionallows+*suchanapplicationtosetthedefaultsctp_sndinfostructure.The+*applicationthatwishestousethissocketoptionsimplypassesthe+*sctp_sndinfostructure(definedinSection5.3.4)tothiscall.The+*inputparametersacceptedbythiscallincludesnd_sid,snd_flags,+*snd_ppid,andsnd_context.Thesnd_flagsparameteriscomposedofa+*bitwiseORofSCTP_UNORDERED,SCTP_EOF,andSCTP_SENDALL.The+*snd_assoc_idfieldspecifiestheassociationtowhichtoapplythe+*parameters.Foraone-to-manystylesocket,anyofthepredefined+*constantsarealsoallowedinthisfield.Thefieldisignoredfor+*one-to-onestylesockets.+*/+staticintsctp_setsockopt_default_sndinfo(structsock*sk,+char__user*optval,+unsignedintoptlen){+structsctp_sndinfoinfo;+structsctp_association*asoc;+structsctp_sock*sp=sctp_sk(sk);++if(optlen!=sizeof(structsctp_sndinfo))+return-EINVAL;+if(copy_from_user(&info,optval,optlen))+return-EFAULT;++asoc=sctp_id2assoc(sk,info.snd_assoc_id);+if(!asoc&&info.snd_assoc_id&&sctp_style(sk,UDP))+return-EINVAL;++/* Note! asoc->default_timetolive is not set in this way anymore.+*ThePR-SCTPextensionneedstobeimplemented.*/+if(asoc){+asoc->default_stream=info.snd_sid;+asoc->default_flags=info.snd_flags;+asoc->default_ppid=info.snd_ppid;+asoc->default_context=info.snd_context;+}else{+sp->default_stream=info.snd_sid;+sp->default_flags=info.snd_flags;+sp->default_ppid=info.snd_ppid;+sp->default_context=info.snd_context;+}+return0;+}+/* 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR)*
@@ -3724,6 +3773,9 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname,retval=sctp_setsockopt_default_send_param(sk,optval,optlen);break;+caseSCTP_DEFAULT_SNDINFO:+retval=sctp_setsockopt_default_sndinfo(sk,optval,optlen);+break;caseSCTP_PRIMARY_ADDR:retval=sctp_setsockopt_primary_addr(sk,optval,optlen);break;
@@ -5063,6 +5115,45 @@ static int sctp_getsockopt_default_send_param(struct sock *sk,return0;}+staticintsctp_getsockopt_default_sndinfo(structsock*sk,+intlen,char__user*optval,+int__user*optlen)+{+structsctp_sndinfoinfo;+structsctp_association*asoc;+structsctp_sock*sp=sctp_sk(sk);++if(len<sizeof(structsctp_sndinfo))+return-EINVAL;++len=sizeof(structsctp_sndinfo);++if(copy_from_user(&info,optval,len))+return-EFAULT;++asoc=sctp_id2assoc(sk,info.snd_assoc_id);+if(!asoc&&info.snd_assoc_id&&sctp_style(sk,UDP))+return-EINVAL;++if(asoc){+info.snd_sid=asoc->default_stream;+info.snd_flags=asoc->default_flags;+info.snd_ppid=asoc->default_ppid;+info.snd_context=asoc->default_context;+}else{+info.snd_sid=sp->default_stream;+info.snd_flags=sp->default_flags;+info.snd_ppid=sp->default_ppid;+info.snd_context=sp->default_context;+}++if(put_user(len,optlen))+return-EFAULT;+if(copy_to_user(optval,&info,len))+return-EFAULT;++return0;+}/**
@@ -5917,6 +6008,9 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname,retval=sctp_getsockopt_default_send_param(sk,len,optval,optlen);break;+caseSCTP_DEFAULT_SNDINFO:+retval=sctp_getsockopt_default_sndinfo(sk,len,optval,optlen);+break;caseSCTP_PRIMARY_ADDR:retval=sctp_getsockopt_primary_addr(sk,len,optval,optlen);break;
From: David Laight <hidden> Date: 2014-06-17 12:33:29
From: Geir Ola Vaagland
Geir Ola Vaagland (6):
Support for SCTP_RECVRCVINFO socket option
Support for SCTP_RCVINFO ancillary data
Support for SCTP_SNDINFO ancillary data
Support for SCTP_NXTINFO socket option
Support for receiving SCTP_NXTINFO ancillary data
Support for SCTP_DEFAULT_SNDINFO socket option
include/net/sctp/structs.h | 11 +-
include/net/sctp/ulpevent.h | 4 +
include/uapi/linux/sctp.h | 46 ++++++++
net/sctp/socket.c | 260 ++++++++++++++++++++++++++++++++++++++++++--
net/sctp/ulpevent.c | 158 +++++++++++++++++++++++++++
5 files changed, 470 insertions(+), 9 deletions(-)
You need to make your C match the expected layout for kernel code.
In particular the whitespace rules.
David
From: David Laight <hidden> Date: 2014-06-17 12:39:38
From: Geir Ola Vaagland
...
+ case SCTP_SNDINFO:
+ /* SCTP Socket API Extension
+ * 5.3.4 SCTP Send Information Structure (SCTP_SNDINFO)
+ *
+ * This cmsghdr structure specifies SCTP options for
+ * sendmsg(). This structure and SCTP_RCVINFO replaces
+ * SCTP_SNDRCV which has been depleted.
What do you mean by 'depleted'?
Support for it cannot be removed because it will break existing
applications.
David
On 06/17/2014 07:57 AM, Geir Ola Vaagland wrote:
Hi Geir
Please provide a bit more description for the those who are not familiar
with the series.
Thanks
-vlad
Geir Ola Vaagland (6):
Support for SCTP_RECVRCVINFO socket option
Support for SCTP_RCVINFO ancillary data
Support for SCTP_SNDINFO ancillary data
Support for SCTP_NXTINFO socket option
Support for receiving SCTP_NXTINFO ancillary data
Support for SCTP_DEFAULT_SNDINFO socket option
include/net/sctp/structs.h | 11 +-
include/net/sctp/ulpevent.h | 4 +
include/uapi/linux/sctp.h | 46 ++++++++
net/sctp/socket.c | 260 ++++++++++++++++++++++++++++++++++++++++++--
net/sctp/ulpevent.c | 158 +++++++++++++++++++++++++++
5 files changed, 470 insertions(+), 9 deletions(-)
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
@@ -216,6 +216,7 @@ struct sctp_sock {__u8frag_interleave;__u32adaptation_ind;__u32pd_point;+__u8recvrcvinfo;atomic_tpd_mode;/* Receive to here while partial delivery is in effect. */
@@ -3566,6 +3566,24 @@ static int sctp_setsockopt_paddr_thresholds(struct sock *sk,return0;}+staticintsctp_setsockopt_recvrcvinfo(structsock*sk,+char__user*optval,+unsignedintoptlen){
Coding style. Please put a space between ) and {. Also,
please align definitions with above 'struct sock'.
As in:
+static int sctp_setsockopt_recvrcvinfo(struct sock *sk,
+ char __user *optval,
+ unsigned int optlen) {
For more info on coding style see Documentation/CodingStyle
in the kernel tree.
quoted hunk
+
+ int val;
+
+ if(optlen < sizeof(int))
+ return -EINVAL;
+
+ if(get_user(val, (int __user*)optval)){
+ return -EFAULT;
+ }
+ sctp_sk(sk)->recvrcvinfo = (val == 0) ? 0 : 1;
+ return 0;
+}
+
+
+
/* API 6.2 setsockopt(), getsockopt()
*
* Applications use setsockopt() and getsockopt() to set or retrieve
@@ -3717,6 +3735,9 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname, case SCTP_PEER_ADDR_THLDS: retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen); break;+ case SCTP_RECVRCVINFO:+ retval = sctp_setsockopt_recvrcvinfo(sk, optval, optlen);+ break; default: retval = -ENOPROTOOPT; break;
@@ -3963,6 +3984,9 @@ static int sctp_init_sock(struct sock *sk) /* Enable Nagle algorithm by default. */ sp->nodelay = 0;+ /* No SCTP_RECVRCVINFO by default. */+ sp->recvrcvinfo = 0;+ /* Enable by default. */ sp->v4mapped = 1;
@@ -5734,6 +5758,27 @@ static int sctp_getsockopt_assoc_stats(struct sock *sk, int len, return 0; }+static int sctp_getsockopt_recvrcvinfo(struct sock *sk,+ int len,+ char __user *optval,+ int __user *optlen){+
Indent issue.
-vlad
quoted hunk
+ int val;
+
+ if (len < sizeof(int))
+ return -EINVAL;
+
+ len = sizeof(int);
+ val = (sctp_sk(sk)->recvrcvinfo == 1);
+ if (put_user(len, optlen))
+ return -EFAULT;
+ if (copy_to_user(optval, &val, len))
+ return -EFAULT;
+ return 0;
+}
+
+
+
static int sctp_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{
@@ -5877,6 +5922,9 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname, case SCTP_GET_ASSOC_STATS: retval = sctp_getsockopt_assoc_stats(sk, len, optval, optlen); break;+ case SCTP_RECVRCVINFO:+ retval = sctp_getsockopt_recvrcvinfo(sk, len, optval, optlen);+ break; default: retval = -ENOPROTOOPT; break;
@@ -2094,6 +2094,12 @@ static int sctp_recvmsg(struct kiocb *iocb, struct sock *sk,sp->pf->skb_msgname(skb,msg->msg_name,addr_len);}++/* Check if SCTP_RCVINFO should be included */+if(sp->recvrcvinfo){+sctp_ulpevent_read_rcvinfo(event,msg);+}+/* Check if we allow SCTP_SNDRCVINFO. */if(sp->subscribe.sctp_data_io_event)sctp_ulpevent_read_sndrcvinfo(event,msg);
As David Laight mentioned, the spec defines sctp_rcvinfo with a hole in it.
To prevent passing kernel stack data to user space, you need to zero-out the
data first.
-vlad
+ /* Sockets API Extensions for SCTP
+ * Section 5.3.5 SCTP Receive Information Structure (SCTP_SNDRCV)
+ *
+ * rcv_sid: 16 bits (unsigned integer)
+ *
+ * The SCTP stack places the message's stream number in this
+ * value.
+ */
+ rinfo.rcv_sid = event->stream;
+
+ /* rcv_ssn: 16 bits (unsigned integer)
+ * This value contains the stream sequence number that the
+ * remote endpoint placed in the DATA chunk. For fragmented
+ * messages, this is the same number for all deliveries of the
+ * message (if more than one recvmsg() is needed to read
+ * the message)
+ */
+ rinfo.rcv_ssn = event->ssn;
+
+
+ /* rcv_ppid: 32 bits (unsigned integer)
+ *
+ * This value is the same information that was passed by the
+ * upper layer in the peer application. Please note that the SCTP
+ * stack performs no byte order modification of this field.
+ * For example, if the DATA chunk has to contain a given
+ * value in network byte order, the SCTP user has to perform the
+ * ntohl() computation.
+ */
+ rinfo.rcv_ppid = event->ppid;
+
+ /* rcv_flags: 16 bits (unsigned integer)
+ *
+ * This field may contain any of the following flags and is composed of
+ * a bitwise OR of these values.
+ *
+ * recvmsg() flags:
+ *
+ * SCTP_UNORDERED - This flag is present when the message was sent
+ * non-ordered.
+ */
+
+ rinfo.rcv_flags = event->flags;
+
+ /* rcv_tsn: 32 bits (unsigned integer)
+ *
+ * This field holds a TSN that was assigned to one of the SCTP
+ * DATA chunks.
+ */
+ rinfo.rcv_tsn = event->tsn;
+
+ /* rcv_cumtsn: 32 bits (unsigned integer)
+ *
+ * This field will hold the current cumulative TSN as known
+ * by the underlying SCTP layer.
+ */
+ rinfo.rcv_cumtsn = event->cumtsn;
+
+ /* rcv_assoc_id: sizeof (sctp_assoc_t)
+ *
+ * The association handle field, sinfo_assoc_id, holds the identifier
+ * for the association announced in the COMMUNICATION_UP notification.
+ * All notifications for a given association have the same identifier.
+ * Ignored for one-to-one style sockets.
+ */
+ rinfo.rcv_assoc_id = sctp_assoc2id(event->asoc);
+
+ /* rcv_context: 32 bits (unsigned integer)
+ *
+ * This value is an opaque 32-bit context datum that was
+ * set by the user with the SCTP_CONTEXT socket option. This
+ * value is passed back to the upper layer if an error occurs on
+ * the send of a message and is retrieved with each undelivered
+ * message.
+ */
+ rinfo.rcv_context = event->asoc->default_rcv_context;
+
+ put_cmsg(msghdr, IPPROTO_SCTP, SCTP_RCVINFO,
+ sizeof(struct sctp_rcvinfo), (void *)&rinfo);
+}
+
+
/* Copy out the sndrcvinfo into a msghdr. */
void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
struct msghdr *msghdr)
+ case SCTP_SNDINFO:
+ /* SCTP Socket API Extension
+ * 5.3.4 SCTP Send Information Structure (SCTP_SNDINFO)
+ *
+ * This cmsghdr structure specifies SCTP options for
+ * sendmsg(). This structure and SCTP_RCVINFO replaces
+ * SCTP_SNDRCV which has been depleted.
What do you mean by 'depleted'?
I think he meant deprecated.
-vlad
Support for it cannot be removed because it will break existing
applications.
David
From: David Laight <hidden> Date: 2014-06-17 14:43:32
From: Vlad Yasevich
On 06/17/2014 08:38 AM, David Laight wrote:
quoted
From: Geir Ola Vaagland
...
quoted
+ case SCTP_SNDINFO:
+ /* SCTP Socket API Extension
+ * 5.3.4 SCTP Send Information Structure (SCTP_SNDINFO)
+ *
+ * This cmsghdr structure specifies SCTP options for
+ * sendmsg(). This structure and SCTP_RCVINFO replaces
+ * SCTP_SNDRCV which has been depleted.
What do you mean by 'depleted'?
I think he meant deprecated.
Hmm.... that isn't going to work well, is it!
I presume the 'standard' only requires that the structure contain
the required fields?
Which probably means it could contain the required padding to make
it binary compatible with the existing 'struct sctp_sndrcvinfo'
(which also contains pad bytes!)
David