Skip to content

Commit fa35e69

Browse files
committed
linux SCTP support part 2
1 parent 35ad929 commit fa35e69

File tree

3 files changed

+260
-6
lines changed

3 files changed

+260
-6
lines changed

libc-test/build.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3122,6 +3122,7 @@ fn test_linux(target: &str) {
31223122
"netdb.h",
31233123
"netinet/in.h",
31243124
"netinet/ip.h",
3125+
//"netinet/sctp.h",
31253126
"netinet/tcp.h",
31263127
"netinet/udp.h",
31273128
"netpacket/packet.h",
@@ -3856,7 +3857,8 @@ fn test_linux(target: &str) {
38563857
// the `ifr_ifru` field is an anonymous union
38573858
(struct_ == "ifreq" && field == "ifr_ifru") ||
38583859
// glibc uses a single array `uregs` instead of individual fields.
3859-
(struct_ == "user_regs" && arm)
3860+
(struct_ == "user_regs" && arm) ||
3861+
(struct_ == "sctp_stream_reset_event" && field == "strreset_stream_list")
38603862
});
38613863

38623864
cfg.skip_roundtrip(move |s| match s {

libc-test/semver/linux.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2161,18 +2161,33 @@ SCM_J1939_PRIO
21612161
SCM_TIMESTAMP
21622162
SCM_TIMESTAMPING
21632163
SCTP_ABORT
2164+
SCTP_ADDR_ADDED
2165+
SCTP_ADDR_AVAILABLE
2166+
SCTP_ADDR_CONFIRMED
2167+
SCTP_ADDR_MADE_PRIM
21642168
SCTP_ADDR_OVER
2169+
SCTP_ADDR_POTENTIALLY_FAILED
2170+
SCTP_ADDR_REMOVED
2171+
SCTP_ADDR_UNREACHABLE
21652172
SCTP_ALL_ASSOC
21662173
SCTP_ASSOCINFO
21672174
SCTP_AUTH_CHUNK
21682175
SCTP_AUTH_ACTIVE_KEY
21692176
SCTP_AUTH_DEACTIVATE_KEY
21702177
SCTP_AUTH_DELETE_KEY
2178+
SCTP_AUTH_FREE_KEY
21712179
SCTP_AUTH_KEY
2180+
SCTP_AUTH_NEW_KEY
2181+
SCTP_AUTH_NO_AUTH
21722182
SCTP_AUTO_ASCONF
21732183
SCTP_AUTOCLOSE
2184+
SCTP_CANT_STR_ASSOC
2185+
SCTP_COMM_LOST
2186+
SCTP_COMM_UP
21742187
SCTP_CONTEXT
21752188
SCTP_CURRENT_ASSOC
2189+
SCTP_DATA_SENT
2190+
SCTP_DATA_UNSENT
21762191
SCTP_DELAYED_ACK
21772192
SCTP_DELAYED_ACK_TIME
21782193
SCTP_DELAYED_SACK
@@ -2199,6 +2214,7 @@ SCTP_MAXSEG
21992214
SCTP_NODELAY
22002215
SCTP_NOTIFICATION
22012216
SCTP_NXTINFO
2217+
SCTP_PARTIAL_DELIVERY_ABORTED
22022218
SCTP_PARTIAL_DELIVERY_POINT
22032219
SCTP_PEER_ADDR_PARAMS
22042220
SCTP_PEER_ADDR_THLDS
@@ -2214,11 +2230,13 @@ SCTP_PR_SCTP_TTL
22142230
SCTP_PRIMARY_ADDR
22152231
SCTP_RECVNXTINFO
22162232
SCTP_RECVRCVINFO
2233+
SCTP_RESTART
22172234
SCTP_REUSE_PORT
22182235
SCTP_RTOINFO
22192236
SCTP_SACK_IMMEDIATELY
22202237
SCTP_SENDALL
22212238
SCTP_SET_PEER_PRIMARY_ADDR
2239+
SCTP_SHUTDOWN_COMP
22222240
SCTP_SNDRCV
22232241
SCTP_STATUS
22242242
SCTP_STREAM_RESET_INCOMING

src/unix/linux_like/linux/mod.rs

Lines changed: 239 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub type __u16 = ::c_ushort;
2121
pub type __s16 = ::c_short;
2222
pub type __u32 = ::c_uint;
2323
pub type __s32 = ::c_int;
24+
pub type __be16 = ::__u16;
2425

2526
pub type Elf32_Half = u16;
2627
pub type Elf32_Word = u32;
@@ -616,11 +617,11 @@ s! {
616617
pub port: ::c_uchar,
617618
}
618619

619-
pub struct in6_ifreq {
620-
pub ifr6_addr: ::in6_addr,
621-
pub ifr6_prefixlen: u32,
622-
pub ifr6_ifindex: ::c_int,
623-
}
620+
pub struct in6_ifreq {
621+
pub ifr6_addr: ::in6_addr,
622+
pub ifr6_prefixlen: u32,
623+
pub ifr6_ifindex: ::c_int,
624+
}
624625

625626
pub struct option {
626627
pub name: *const ::c_char,
@@ -685,6 +686,132 @@ s! {
685686
pub struct sctp_authinfo {
686687
pub auth_keynumber: ::__u16,
687688
}
689+
690+
pub struct sctp_assoc_change {
691+
pub sac_type: ::__u16,
692+
pub sac_flags: ::__u16,
693+
pub sac_length: ::__u32,
694+
pub sac_state: ::__u16,
695+
pub sac_error: ::__u16,
696+
pub sac_outbound_streams: ::__u16,
697+
pub sac_inbound_streams: ::__u16,
698+
pub sac_assoc_id: ::sctp_assoc_t,
699+
pub sac_info: [::__u8; 0],
700+
}
701+
702+
pub struct sctp_remote_error {
703+
pub sre_type: ::__u16,
704+
pub sre_flags: ::__u16,
705+
pub sre_length: ::__u32,
706+
pub sre_error: ::__be16,
707+
pub sre_assoc_id: ::sctp_assoc_t,
708+
pub sre_data: [::__u8; 0],
709+
}
710+
711+
pub struct sctp_send_failed {
712+
pub ssf_type: ::__u16,
713+
pub ssf_flags: ::__u16,
714+
pub ssf_length: ::__u32,
715+
pub ssf_error: ::__u32,
716+
pub ssf_info: sctp_sndrcvinfo,
717+
pub ssf_assoc_id: ::sctp_assoc_t,
718+
pub ssf_data: [::__u8; 0],
719+
}
720+
721+
pub struct sctp_send_failed_event {
722+
pub ssf_type: ::__u16,
723+
pub ssf_flags: ::__u16,
724+
pub ssf_length: ::__u32,
725+
pub ssf_error: ::__u32,
726+
pub ssfe_info: sctp_sndinfo,
727+
pub ssf_assoc_id: ::sctp_assoc_t,
728+
pub ssf_data: [::__u8; 0],
729+
}
730+
731+
pub struct sctp_shutdown_event {
732+
pub sse_type: ::__u16,
733+
pub sse_flags: ::__u16,
734+
pub sse_length: ::__u32,
735+
pub sse_assoc_id: ::sctp_assoc_t,
736+
}
737+
738+
pub struct sctp_adaptation_event {
739+
pub sai_type: ::__u16,
740+
pub sai_flags: ::__u16,
741+
pub sai_length: ::__u32,
742+
pub sai_adaptation_ind: ::__u32,
743+
pub sai_assoc_id: ::sctp_assoc_t,
744+
}
745+
746+
pub struct sctp_pdapi_event {
747+
pub pdapi_type: ::__u16,
748+
pub pdapi_flags: ::__u16,
749+
pub pdapi_length: ::__u32,
750+
pub pdapi_indication: ::__u32,
751+
pub pdapi_assoc_id: ::sctp_assoc_t,
752+
pub pdapi_stream: ::__u32,
753+
pub pdapi_seq: ::__u32,
754+
}
755+
756+
pub struct sctp_authkey_event {
757+
pub auth_type: ::__u16,
758+
pub auth_flags: ::__u16,
759+
pub auth_length: ::__u32,
760+
pub auth_keynumber: ::__u16,
761+
pub auth_altkeynumber: ::__u16,
762+
pub auth_indication: ::__u32,
763+
pub auth_assoc_id: ::sctp_assoc_t,
764+
}
765+
766+
pub struct sctp_sender_dry_event {
767+
pub sender_dry_type: ::__u16,
768+
pub sender_dry_flags: ::__u16,
769+
pub sender_dry_length: ::__u32,
770+
pub sender_dry_assoc_id: ::sctp_assoc_t,
771+
}
772+
773+
pub struct sctp_stream_reset_event {
774+
pub strreset_type: ::__u16,
775+
pub strreset_flags: ::__u16,
776+
pub strreset_length: ::__u32,
777+
pub strreset_assoc_id: ::sctp_assoc_t,
778+
pub strreset_stream_list: [::__u16; 0],
779+
}
780+
781+
pub struct sctp_assoc_reset_event {
782+
pub assocreset_type: ::__u16,
783+
pub assocreset_flags: ::__u16,
784+
pub assocreset_length: ::__u32,
785+
pub assocreset_assoc_id: ::sctp_assoc_t,
786+
pub assocreset_local_tsn: ::__u32,
787+
pub assocreset_remote_tsn: ::__u32,
788+
}
789+
790+
pub struct sctp_stream_change_event {
791+
pub strchange_type: ::__u16,
792+
pub strchange_flags: ::__u16,
793+
pub strchange_length: ::__u32,
794+
pub strchange_assoc_id: ::sctp_assoc_t,
795+
pub strchange_instrms: ::__u16,
796+
pub strchange_outstrms: ::__u16,
797+
}
798+
799+
pub struct sctp_event_subscribe {
800+
pub sctp_data_io_event: ::__u8,
801+
pub sctp_association_event: ::__u8,
802+
pub sctp_address_event: ::__u8,
803+
pub sctp_send_failure_event: ::__u8,
804+
pub sctp_peer_error_event: ::__u8,
805+
pub sctp_shutdown_event: ::__u8,
806+
pub sctp_partial_delivery_event: ::__u8,
807+
pub sctp_adaptation_layer_event: ::__u8,
808+
pub sctp_authentication_event: ::__u8,
809+
pub sctp_sender_dry_event: ::__u8,
810+
pub sctp_stream_reset_event: ::__u8,
811+
pub sctp_assoc_reset_event: ::__u8,
812+
pub sctp_stream_change_event: ::__u8,
813+
pub sctp_send_failure_event_event: ::__u8,
814+
}
688815
}
689816

690817
s_no_extra_traits! {
@@ -798,6 +925,17 @@ s_no_extra_traits! {
798925
#[cfg(not(libc_union))]
799926
pub ifr_ifru: ::sockaddr,
800927
}
928+
929+
#[cfg_attr(libc_packedN, repr(packed(4)))]
930+
pub struct sctp_paddr_change {
931+
pub spc_type: ::__u16,
932+
pub spc_flags: ::__u16,
933+
pub spc_length: ::__u32,
934+
pub spc_aaddr: ::sockaddr_storage,
935+
pub spc_state: ::c_int,
936+
pub spc_error: ::c_int,
937+
pub spc_assoc_id: ::sctp_assoc_t,
938+
}
801939
}
802940

803941
s_no_extra_traits! {
@@ -1221,6 +1359,18 @@ cfg_if! {
12211359
.finish()
12221360
}
12231361
}
1362+
impl ::fmt::Debug for sctp_paddr_change {
1363+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
1364+
f.debug_struct("sctp_paddr_change")
1365+
.field("spc_type", &self.spc_type)
1366+
.field("spc_flags", &self.spc_flags)
1367+
.field("spc_aaddr", &self.spc_aaddr)
1368+
.field("spc_state", &self.spc_state)
1369+
.field("spc_error", &self.spc_error)
1370+
.field("spc_assoc_id", &self.spc_assoc_id)
1371+
.finish()
1372+
}
1373+
}
12241374
}
12251375
}
12261376

@@ -3788,6 +3938,29 @@ pub const SCTP_PR_SCTP_ALL: ::c_int = 1 << 7;
37883938
pub const SCTP_NOTIFICATION: ::c_int = MSG_NOTIFICATION;
37893939
pub const SCTP_EOF: ::c_int = ::MSG_FIN;
37903940

3941+
pub const SCTP_COMM_UP: ::c_int = 0;
3942+
pub const SCTP_COMM_LOST: ::c_int = 1;
3943+
pub const SCTP_RESTART: ::c_int = 2;
3944+
pub const SCTP_SHUTDOWN_COMP: ::c_int = 3;
3945+
pub const SCTP_CANT_STR_ASSOC: ::c_int = 4;
3946+
3947+
pub const SCTP_ADDR_AVAILABLE: ::c_int = 0;
3948+
pub const SCTP_ADDR_UNREACHABLE: ::c_int = 1;
3949+
pub const SCTP_ADDR_REMOVED: ::c_int = 2;
3950+
pub const SCTP_ADDR_ADDED: ::c_int = 3;
3951+
pub const SCTP_ADDR_MADE_PRIM: ::c_int = 4;
3952+
pub const SCTP_ADDR_CONFIRMED: ::c_int = 5;
3953+
pub const SCTP_ADDR_POTENTIALLY_FAILED: ::c_int = 6;
3954+
3955+
pub const SCTP_DATA_UNSENT: ::c_int = 0;
3956+
pub const SCTP_DATA_SENT: ::c_int = 1;
3957+
3958+
pub const SCTP_PARTIAL_DELIVERY_ABORTED: ::c_int = 0;
3959+
3960+
pub const SCTP_AUTH_NEW_KEY: ::c_int = 0;
3961+
pub const SCTP_AUTH_FREE_KEY: ::c_int = 1;
3962+
pub const SCTP_AUTH_NO_AUTH: ::c_int = 2;
3963+
37913964
f! {
37923965
pub fn NLA_ALIGN(len: ::c_int) -> ::c_int {
37933966
return ((len) + NLA_ALIGNTO - 1) & !(NLA_ALIGNTO - 1)
@@ -4704,6 +4877,67 @@ extern "C" {
47044877
) -> ::c_int;
47054878
}
47064879

4880+
/*
4881+
#[link(name = "sctp")]
4882+
extern "C" {
4883+
pub fn sctp_bindx(
4884+
sd: ::c_int,
4885+
addrs: *mut ::sockaddr,
4886+
addrcnt: ::c_int,
4887+
flags: ::c_int,
4888+
) -> ::c_int;
4889+
pub fn sctp_connectx(
4890+
sd: ::c_int,
4891+
addrs: *mut ::sockaddr,
4892+
addrcnt: ::c_int,
4893+
id: *mut ::sctp_assoc_t,
4894+
) -> ::c_int;
4895+
pub fn sctp_peeloff(sd: ::c_int, assoc_id: ::sctp_assoc_t) -> ::c_int;
4896+
// FIXME: linkage issue albeit belonging to the same part.
4897+
//pub fn sctp_peeloff_flags(sd: ::c_int, assoc_id: ::sctp_assoc_t, flags: ::c_uint) -> ::c_int;
4898+
pub fn sctp_opt_info(
4899+
sd: ::c_int,
4900+
id: ::sctp_assoc_t,
4901+
opt: ::c_int,
4902+
arg: *mut ::c_void,
4903+
size: *mut ::socklen_t,
4904+
) -> ::c_int;
4905+
pub fn sctp_getpaddrs(sd: ::c_int, id: ::sctp_assoc_t, addrs: *mut *mut ::sockaddr) -> ::c_int;
4906+
pub fn sctp_freepaddrs(addrs: *mut ::sockaddr) -> ::c_int;
4907+
pub fn sctp_getladdrs(sd: ::c_int, id: ::sctp_assoc_t, addrs: *mut *mut ::sockaddr) -> ::c_int;
4908+
pub fn sctp_freeladdrs(addrs: *mut ::sockaddr) -> ::c_int;
4909+
pub fn sctp_send(
4910+
s: ::c_int,
4911+
msg: *const ::c_void,
4912+
len: ::size_t,
4913+
sinfo: *const ::sctp_sndrcvinfo,
4914+
flags: ::c_int,
4915+
) -> ::c_int;
4916+
pub fn sctp_sendmsg(
4917+
s: ::c_int,
4918+
msg: *const ::c_void,
4919+
len: ::size_t,
4920+
to: *mut ::sockaddr,
4921+
tolen: ::socklen_t,
4922+
ppid: u32,
4923+
flags: u32,
4924+
stream_no: u16,
4925+
timetolive: u32,
4926+
context: u32,
4927+
) -> ::c_int;
4928+
pub fn sctp_recvmsg(
4929+
s: ::c_int,
4930+
msg: *mut ::c_void,
4931+
len: ::size_t,
4932+
from: *mut ::sockaddr,
4933+
fromlen: *mut ::socklen_t,
4934+
sinfo: *mut ::sctp_sndrcvinfo,
4935+
msg_flags: *mut ::c_int,
4936+
) -> ::c_int;
4937+
pub fn sctp_getaddrlen(family: ::sa_family_t) -> ::c_int;
4938+
}
4939+
*/
4940+
47074941
cfg_if! {
47084942
if #[cfg(target_env = "uclibc")] {
47094943
mod uclibc;

0 commit comments

Comments
 (0)