qmsk/net/socket/sctp.pxd
author Tero Marttila <terom@fixme.fi>
Tue, 18 Aug 2009 23:02:30 +0300
changeset 24 f18b5787c46c
permissions -rw-r--r--
reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
"""
    The socket-based interface for SCTP.

    http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-15
"""

#from qmsk.net.libc cimport __u8, __u16, __u32, __s8, __s16, __s32, ssize_t
from qmsk.net.libc cimport *

cimport qmsk.net.socket.platform as platform
cimport qmsk.net.socket.socket as socket

# <netinet/sctp.h>
# this defines the kernel SCTP -> userspace API extensions, such as structure types etc.
cdef extern from "netinet/sctp.h" :
    ## types
    ctypedef __s32 sctp_assoc_t

    ## constants
    # sockapi
    enum :
        SOL_SCTP
        IPPROTO_SCTP

    # sockopts
    enum :
        SCTP_RTOINFO
        SCTP_ASSOCINFO
        SCTP_INITMSG
        SCTP_NODELAY
        SCTP_AUTOCLOSE
        SCTP_SET_PEER_PRIMARY_ADDR
        SCTP_PRIMARY_ADDR
        SCTP_ADAPTATION_LAYER
        SCTP_DISABLE_FRAGMENTS
        SCTP_PEER_ADDR_PARAMS
        SCTP_DEFAULT_SEND_PARAM
        SCTP_EVENTS
        SCTP_I_WANT_MAPPED_V4_ADDR
        SCTP_MAXSEG
        SCTP_STATUS
        SCTP_GET_PEER_ADDR_INFO
        SCTP_DELAYED_ACK_TIME
        SCTP_CONTEXT
        SCTP_FRAGMENT_INTERLEAVE
        SCTP_PARTIAL_DELIVERY_POINT
        SCTP_MAX_BURST

    ## send/recv-msg cmsghdr's
    struct sctp_initmsg :
        __u16 sinit_num_ostreams
        __u16 sinit_max_instreams
        __u16 sinit_max_attempts
        __u16 sinit_max_init_timeo

    struct sctp_sndrcvinfo :
        __u16 sinfo_stream
        __u16 sinfo_ssn
        __u16 sinfo_flags
        __u32 sinfo_ppid
        __u32 sinfo_context
        __u32 sinfo_timetolive
        __u32 sinfo_tsn
        __u32 sinfo_cumtsn
        sctp_assoc_t sinfo_assoc_id

    # XXX: missing sctp_extrcvinfo

    # sctp_sndrcvinfo.sinfo_flags values
    enum sctp_sinfo_flags :
        SCTP_UNORDERED          # Send/receive message unordered
        SCTP_ADDR_OVER          # Override the primary destination
        SCTP_ABORT              # Send an ABORT message to the peer
        SCTP_EOF                # Initiate graceful shutdown process
    
    ## notifications
    struct sctp_assoc_change :
        __u16 sac_type
        __u16 sac_flags
        __u32 sac_length
        __u16 sac_state
        __u16 sac_error
        __u16 sac_outbound_streams
        __u16 sac_inbound_streams
        sctp_assoc_t sac_assoc_id
        __u8 sac_info[0]
    
    # sctp_assoc_change.sac_state
    enum sctp_sac_state :
        SCTP_COMM_UP
        SCTP_COMM_LOST
        SCTP_RESTART
        SCTP_SHUTDOWN_COMP
        SCTP_CANT_STR_ASSOC

    struct sctp_paddr_change :
        __u16 spc_type
        __u16 spc_flags
        __u32 spc_length
        platform.sockaddr_storage spc_aaddr
        int spc_state
        int spc_error
        sctp_assoc_t spc_assoc_id

    enum sctp_spc_state :
        SCTP_ADDR_AVAILABLE
        SCTP_ADDR_UNREACHABLE
        SCTP_ADDR_REMOVED
        SCTP_ADDR_ADDED
        SCTP_ADDR_MADE_PRIM
        SCTP_ADDR_CONFIRMED

    struct sctp_remote_error :
        __u16 sre_type
        __u16 sre_flags
        __u32 sre_length
        __u16 sre_error
        sctp_assoc_t sre_assoc_id
        __u8 sre_data[0]


    struct sctp_send_failed :
        __u16 ssf_type
        __u16 ssf_flags
        __u32 ssf_length
        __u32 ssf_error
        sctp_sndrcvinfo ssf_info
        sctp_assoc_t ssf_assoc_id
        __u8 ssf_data[0]

    enum sctp_ssf_flags :
        SCTP_DATA_UNSENT
        SCTP_DATA_SENT

    struct sctp_shutdown_event :
        __u16 sse_type
        __u16 sse_flags
        __u32 sse_length
        sctp_assoc_t sse_assoc_id

    struct sctp_adaptation_event :
        __u16 sai_type
        __u16 sai_flags
        __u32 sai_length
        __u32 sai_adaptation_ind
        sctp_assoc_t sai_assoc_id

    struct sctp_pdapi_event :
        __u16 pdapi_type
        __u16 pdapi_flags
        __u32 pdapi_length
        __u32 pdapi_indication
        sctp_assoc_t pdapi_assoc_id

    enum :
        SCTP_PARTIAL_DELIVERY_ABORTED

    struct sctp_event_subscribe :
        __u8 sctp_data_io_event
        __u8 sctp_association_event
        __u8 sctp_address_event
        __u8 sctp_send_failure_event
        __u8 sctp_peer_error_event
        __u8 sctp_shutdown_event
        __u8 sctp_partial_delivery_event
        __u8 sctp_adaptation_layer_event

    struct sn_header :
        __u16 sn_type
        __u16 sn_flags
        __u32 sn_length

    union sctp_notification :
        sn_header sn_header

        sctp_assoc_change sn_assoc_change
        sctp_paddr_change sn_paddr_change
        sctp_remote_error sn_remote_error
        sctp_send_failed sn_send_failed
        sctp_shutdown_event sn_shutdown_event
        sctp_adaptation_event sn_adaptation_event
        sctp_pdapi_event sn_pdapi_event

    enum sctp_sn_type :
        SCTP_SN_TYPE_BASE
        SCTP_ASSOC_CHANGE
        SCTP_PEER_ADDR_CHANGE
        SCTP_SEND_FAILED
        SCTP_REMOTE_ERROR
        SCTP_SHUTDOWN_EVENT
        SCTP_PARTIAL_DELIVERY_EVENT
        SCTP_ADAPTATION_INDICATION

    enum sctp_sn_error :
        SCTP_FAILED_THRESHOLD
        SCTP_RECEIVED_SACK
        SCTP_HEARTBEAT_SUCCESS
        SCTP_RESPONSE_TO_USER_REQ
        SCTP_INTERNAL_ERROR
        SCTP_SHUTDOWN_GUARD_EXPIRES
        SCTP_PEER_FAULTY
    
    ctypedef sctp_sn_error sctp_sn_error_t
    
    
    ###
    ### 8   New Interfaces
    ###

    ## 8.1  sctp_bindx
    enum :
        SCTP_BINDX_ADD_ADDR
        SCTP_BINDX_REM_ADDR

    int sctp_bindx (int sd, platform.sockaddr *addrs, int addrcnt, int flags)

    ## 8.2 sctp_peeloff
    int sctp_peeloff (int sd, sctp_assoc_t assoc_id)

    ## 8.3 sctp_getpaddrs
    int sctp_getpaddrs (int sd, sctp_assoc_t assoc_id, platform.sockaddr **addrs)
    ## 8.4 sctp_freepaddrs
    void sctp_freepaddrs (platform.sockaddr *addrs)

    ## 8.5 sctp_getladdrs
    int sctp_getladdrs (int sd, sctp_assoc_t id, platform.sockaddr **ss)
    ## 8.6 sctp_freeladdrs
    void sctp_freeladdrs (platform.sockaddr **ss)

    ## 8.7 sctp_sendmsg
    ssize_t sctp_sendmsg (
            int sd,
            void *msg, size_t len,
            platform.sockaddr *dst, platform.socklen_t dstlen,
            uint32_t ppid, uint32_t flags, uint16_t stream_no, uint32_t timetolive, uint32_t context
    )

    ## 8.8 sctp_Recvmsg
    ssize_t sctp_recvmsg (
            int sd,
            void *msg, size_t len,
            platform.sockaddr *src, platform.socklen_t *srclen,
            sctp_sndrcvinfo *sinfo,
            int *msg_flags
    )


    ## 8.9 sctp_connectx
    # XXX: missing return-sctp_assoc_t-id argument from RFC!
    int sctp_connectx (int sd, platform.sockaddr *addrs, int addrcnt)

    ## 8.10 sctp_send
    int sctp_send (
            int sd,
            void *msg, size_t len,
            sctp_sndrcvinfo *sinfo,
            int flags
    )

    ## 8.11 sctp_sendx
    int sctp_sendx (
            int sd,
            void *msg, size_t len,
            platform.sockaddr *addrs, int addrcnt,
            sctp_sndrcvinfo *sinfo,
            int flags
    )

    ## 8.12 sctp_getaddrlen
    int sctp_getaddrlen (platform.sa_family_t family)

cdef class sctp_socket (socket.socket) :
    """
        SCTP-specific methods and functionality, built on top of the generic socket interface.
    """