sctp: add support for PR-SCTP Information for sendmsg
This patch is to add support for PR-SCTP Information for sendmsg, as described in section 5.3.7 of RFC6458. With this option, you can specify pr_policy and pr_value for user data in sendmsg. It's also a necessary send info for sctp_sendv. Signed-off-by: Xin Long <lucien.xin@gmail.com> Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
5c3d0fd4b2
commit
ed63afb8a3
@@ -1644,6 +1644,12 @@ static int sctp_sendmsg_parse(struct sock *sk, struct sctp_cmsgs *cmsgs,
|
||||
srinfo->sinfo_assoc_id = cmsgs->sinfo->snd_assoc_id;
|
||||
}
|
||||
|
||||
if (cmsgs->prinfo) {
|
||||
srinfo->sinfo_timetolive = cmsgs->prinfo->pr_value;
|
||||
SCTP_PR_SET_POLICY(srinfo->sinfo_flags,
|
||||
cmsgs->prinfo->pr_policy);
|
||||
}
|
||||
|
||||
sflags = srinfo->sinfo_flags;
|
||||
if (!sflags && msg_len)
|
||||
return 0;
|
||||
@@ -1901,9 +1907,12 @@ static void sctp_sendmsg_update_sinfo(struct sctp_association *asoc,
|
||||
sinfo->sinfo_ppid = asoc->default_ppid;
|
||||
sinfo->sinfo_context = asoc->default_context;
|
||||
sinfo->sinfo_assoc_id = sctp_assoc2id(asoc);
|
||||
|
||||
if (!cmsgs->prinfo)
|
||||
sinfo->sinfo_flags = asoc->default_flags;
|
||||
}
|
||||
|
||||
if (!cmsgs->srinfo)
|
||||
if (!cmsgs->srinfo && !cmsgs->prinfo)
|
||||
sinfo->sinfo_timetolive = asoc->default_timetolive;
|
||||
}
|
||||
|
||||
@@ -7749,6 +7758,26 @@ static int sctp_msghdr_parse(const struct msghdr *msg, struct sctp_cmsgs *cmsgs)
|
||||
SCTP_ABORT | SCTP_EOF))
|
||||
return -EINVAL;
|
||||
break;
|
||||
case SCTP_PRINFO:
|
||||
/* SCTP Socket API Extension
|
||||
* 5.3.7 SCTP PR-SCTP Information Structure (SCTP_PRINFO)
|
||||
*
|
||||
* This cmsghdr structure specifies SCTP options for sendmsg().
|
||||
*
|
||||
* cmsg_level cmsg_type cmsg_data[]
|
||||
* ------------ ------------ ---------------------
|
||||
* IPPROTO_SCTP SCTP_PRINFO struct sctp_prinfo
|
||||
*/
|
||||
if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_prinfo)))
|
||||
return -EINVAL;
|
||||
|
||||
cmsgs->prinfo = CMSG_DATA(cmsg);
|
||||
if (cmsgs->prinfo->pr_policy & ~SCTP_PR_SCTP_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
if (cmsgs->prinfo->pr_policy == SCTP_PR_SCTP_NONE)
|
||||
cmsgs->prinfo->pr_value = 0;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
Reference in New Issue
Block a user