Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
0002 #ifndef _UAPI_MPTCP_H
0003 #define _UAPI_MPTCP_H
0004 
0005 #ifndef __KERNEL__
0006 #include <netinet/in.h>     /* for sockaddr_in and sockaddr_in6 */
0007 #include <sys/socket.h>     /* for struct sockaddr          */
0008 #endif
0009 
0010 #include <linux/const.h>
0011 #include <linux/types.h>
0012 #include <linux/in.h>       /* for sockaddr_in          */
0013 #include <linux/in6.h>      /* for sockaddr_in6         */
0014 #include <linux/socket.h>   /* for sockaddr_storage and sa_family   */
0015 
0016 #define MPTCP_SUBFLOW_FLAG_MCAP_REM     _BITUL(0)
0017 #define MPTCP_SUBFLOW_FLAG_MCAP_LOC     _BITUL(1)
0018 #define MPTCP_SUBFLOW_FLAG_JOIN_REM     _BITUL(2)
0019 #define MPTCP_SUBFLOW_FLAG_JOIN_LOC     _BITUL(3)
0020 #define MPTCP_SUBFLOW_FLAG_BKUP_REM     _BITUL(4)
0021 #define MPTCP_SUBFLOW_FLAG_BKUP_LOC     _BITUL(5)
0022 #define MPTCP_SUBFLOW_FLAG_FULLY_ESTABLISHED    _BITUL(6)
0023 #define MPTCP_SUBFLOW_FLAG_CONNECTED        _BITUL(7)
0024 #define MPTCP_SUBFLOW_FLAG_MAPVALID     _BITUL(8)
0025 
0026 enum {
0027     MPTCP_SUBFLOW_ATTR_UNSPEC,
0028     MPTCP_SUBFLOW_ATTR_TOKEN_REM,
0029     MPTCP_SUBFLOW_ATTR_TOKEN_LOC,
0030     MPTCP_SUBFLOW_ATTR_RELWRITE_SEQ,
0031     MPTCP_SUBFLOW_ATTR_MAP_SEQ,
0032     MPTCP_SUBFLOW_ATTR_MAP_SFSEQ,
0033     MPTCP_SUBFLOW_ATTR_SSN_OFFSET,
0034     MPTCP_SUBFLOW_ATTR_MAP_DATALEN,
0035     MPTCP_SUBFLOW_ATTR_FLAGS,
0036     MPTCP_SUBFLOW_ATTR_ID_REM,
0037     MPTCP_SUBFLOW_ATTR_ID_LOC,
0038     MPTCP_SUBFLOW_ATTR_PAD,
0039     __MPTCP_SUBFLOW_ATTR_MAX
0040 };
0041 
0042 #define MPTCP_SUBFLOW_ATTR_MAX (__MPTCP_SUBFLOW_ATTR_MAX - 1)
0043 
0044 /* netlink interface */
0045 #define MPTCP_PM_NAME       "mptcp_pm"
0046 #define MPTCP_PM_CMD_GRP_NAME   "mptcp_pm_cmds"
0047 #define MPTCP_PM_EV_GRP_NAME    "mptcp_pm_events"
0048 #define MPTCP_PM_VER        0x1
0049 
0050 /*
0051  * ATTR types defined for MPTCP
0052  */
0053 enum {
0054     MPTCP_PM_ATTR_UNSPEC,
0055 
0056     MPTCP_PM_ATTR_ADDR,             /* nested address */
0057     MPTCP_PM_ATTR_RCV_ADD_ADDRS,            /* u32 */
0058     MPTCP_PM_ATTR_SUBFLOWS,             /* u32 */
0059     MPTCP_PM_ATTR_TOKEN,                /* u32 */
0060     MPTCP_PM_ATTR_LOC_ID,               /* u8 */
0061     MPTCP_PM_ATTR_ADDR_REMOTE,          /* nested address */
0062 
0063     __MPTCP_PM_ATTR_MAX
0064 };
0065 
0066 #define MPTCP_PM_ATTR_MAX (__MPTCP_PM_ATTR_MAX - 1)
0067 
0068 enum {
0069     MPTCP_PM_ADDR_ATTR_UNSPEC,
0070 
0071     MPTCP_PM_ADDR_ATTR_FAMILY,          /* u16 */
0072     MPTCP_PM_ADDR_ATTR_ID,              /* u8 */
0073     MPTCP_PM_ADDR_ATTR_ADDR4,           /* struct in_addr */
0074     MPTCP_PM_ADDR_ATTR_ADDR6,           /* struct in6_addr */
0075     MPTCP_PM_ADDR_ATTR_PORT,            /* u16 */
0076     MPTCP_PM_ADDR_ATTR_FLAGS,           /* u32 */
0077     MPTCP_PM_ADDR_ATTR_IF_IDX,          /* s32 */
0078 
0079     __MPTCP_PM_ADDR_ATTR_MAX
0080 };
0081 
0082 #define MPTCP_PM_ADDR_ATTR_MAX (__MPTCP_PM_ADDR_ATTR_MAX - 1)
0083 
0084 #define MPTCP_PM_ADDR_FLAG_SIGNAL           (1 << 0)
0085 #define MPTCP_PM_ADDR_FLAG_SUBFLOW          (1 << 1)
0086 #define MPTCP_PM_ADDR_FLAG_BACKUP           (1 << 2)
0087 #define MPTCP_PM_ADDR_FLAG_FULLMESH         (1 << 3)
0088 #define MPTCP_PM_ADDR_FLAG_IMPLICIT         (1 << 4)
0089 
0090 enum {
0091     MPTCP_PM_CMD_UNSPEC,
0092 
0093     MPTCP_PM_CMD_ADD_ADDR,
0094     MPTCP_PM_CMD_DEL_ADDR,
0095     MPTCP_PM_CMD_GET_ADDR,
0096     MPTCP_PM_CMD_FLUSH_ADDRS,
0097     MPTCP_PM_CMD_SET_LIMITS,
0098     MPTCP_PM_CMD_GET_LIMITS,
0099     MPTCP_PM_CMD_SET_FLAGS,
0100     MPTCP_PM_CMD_ANNOUNCE,
0101     MPTCP_PM_CMD_REMOVE,
0102     MPTCP_PM_CMD_SUBFLOW_CREATE,
0103     MPTCP_PM_CMD_SUBFLOW_DESTROY,
0104 
0105     __MPTCP_PM_CMD_AFTER_LAST
0106 };
0107 
0108 #define MPTCP_INFO_FLAG_FALLBACK        _BITUL(0)
0109 #define MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED _BITUL(1)
0110 
0111 struct mptcp_info {
0112     __u8    mptcpi_subflows;
0113     __u8    mptcpi_add_addr_signal;
0114     __u8    mptcpi_add_addr_accepted;
0115     __u8    mptcpi_subflows_max;
0116     __u8    mptcpi_add_addr_signal_max;
0117     __u8    mptcpi_add_addr_accepted_max;
0118     __u32   mptcpi_flags;
0119     __u32   mptcpi_token;
0120     __u64   mptcpi_write_seq;
0121     __u64   mptcpi_snd_una;
0122     __u64   mptcpi_rcv_nxt;
0123     __u8    mptcpi_local_addr_used;
0124     __u8    mptcpi_local_addr_max;
0125     __u8    mptcpi_csum_enabled;
0126 };
0127 
0128 /*
0129  * MPTCP_EVENT_CREATED: token, family, saddr4 | saddr6, daddr4 | daddr6,
0130  *                      sport, dport
0131  * A new MPTCP connection has been created. It is the good time to allocate
0132  * memory and send ADD_ADDR if needed. Depending on the traffic-patterns
0133  * it can take a long time until the MPTCP_EVENT_ESTABLISHED is sent.
0134  *
0135  * MPTCP_EVENT_ESTABLISHED: token, family, saddr4 | saddr6, daddr4 | daddr6,
0136  *              sport, dport
0137  * A MPTCP connection is established (can start new subflows).
0138  *
0139  * MPTCP_EVENT_CLOSED: token
0140  * A MPTCP connection has stopped.
0141  *
0142  * MPTCP_EVENT_ANNOUNCED: token, rem_id, family, daddr4 | daddr6 [, dport]
0143  * A new address has been announced by the peer.
0144  *
0145  * MPTCP_EVENT_REMOVED: token, rem_id
0146  * An address has been lost by the peer.
0147  *
0148  * MPTCP_EVENT_SUB_ESTABLISHED: token, family, loc_id, rem_id,
0149  *                              saddr4 | saddr6, daddr4 | daddr6, sport,
0150  *                              dport, backup, if_idx [, error]
0151  * A new subflow has been established. 'error' should not be set.
0152  *
0153  * MPTCP_EVENT_SUB_CLOSED: token, family, loc_id, rem_id, saddr4 | saddr6,
0154  *                         daddr4 | daddr6, sport, dport, backup, if_idx
0155  *                         [, error]
0156  * A subflow has been closed. An error (copy of sk_err) could be set if an
0157  * error has been detected for this subflow.
0158  *
0159  * MPTCP_EVENT_SUB_PRIORITY: token, family, loc_id, rem_id, saddr4 | saddr6,
0160  *                           daddr4 | daddr6, sport, dport, backup, if_idx
0161  *                           [, error]
0162  * The priority of a subflow has changed. 'error' should not be set.
0163  */
0164 enum mptcp_event_type {
0165     MPTCP_EVENT_UNSPEC = 0,
0166     MPTCP_EVENT_CREATED = 1,
0167     MPTCP_EVENT_ESTABLISHED = 2,
0168     MPTCP_EVENT_CLOSED = 3,
0169 
0170     MPTCP_EVENT_ANNOUNCED = 6,
0171     MPTCP_EVENT_REMOVED = 7,
0172 
0173     MPTCP_EVENT_SUB_ESTABLISHED = 10,
0174     MPTCP_EVENT_SUB_CLOSED = 11,
0175 
0176     MPTCP_EVENT_SUB_PRIORITY = 13,
0177 };
0178 
0179 enum mptcp_event_attr {
0180     MPTCP_ATTR_UNSPEC = 0,
0181 
0182     MPTCP_ATTR_TOKEN,   /* u32 */
0183     MPTCP_ATTR_FAMILY,  /* u16 */
0184     MPTCP_ATTR_LOC_ID,  /* u8 */
0185     MPTCP_ATTR_REM_ID,  /* u8 */
0186     MPTCP_ATTR_SADDR4,  /* be32 */
0187     MPTCP_ATTR_SADDR6,  /* struct in6_addr */
0188     MPTCP_ATTR_DADDR4,  /* be32 */
0189     MPTCP_ATTR_DADDR6,  /* struct in6_addr */
0190     MPTCP_ATTR_SPORT,   /* be16 */
0191     MPTCP_ATTR_DPORT,   /* be16 */
0192     MPTCP_ATTR_BACKUP,  /* u8 */
0193     MPTCP_ATTR_ERROR,   /* u8 */
0194     MPTCP_ATTR_FLAGS,   /* u16 */
0195     MPTCP_ATTR_TIMEOUT, /* u32 */
0196     MPTCP_ATTR_IF_IDX,  /* s32 */
0197     MPTCP_ATTR_RESET_REASON,/* u32 */
0198     MPTCP_ATTR_RESET_FLAGS, /* u32 */
0199     MPTCP_ATTR_SERVER_SIDE, /* u8 */
0200 
0201     __MPTCP_ATTR_AFTER_LAST
0202 };
0203 
0204 #define MPTCP_ATTR_MAX (__MPTCP_ATTR_AFTER_LAST - 1)
0205 
0206 /* MPTCP Reset reason codes, rfc8684 */
0207 #define MPTCP_RST_EUNSPEC   0
0208 #define MPTCP_RST_EMPTCP    1
0209 #define MPTCP_RST_ERESOURCE 2
0210 #define MPTCP_RST_EPROHIBIT 3
0211 #define MPTCP_RST_EWQ2BIG   4
0212 #define MPTCP_RST_EBADPERF  5
0213 #define MPTCP_RST_EMIDDLEBOX    6
0214 
0215 struct mptcp_subflow_data {
0216     __u32       size_subflow_data;      /* size of this structure in userspace */
0217     __u32       num_subflows;           /* must be 0, set by kernel */
0218     __u32       size_kernel;            /* must be 0, set by kernel */
0219     __u32       size_user;          /* size of one element in data[] */
0220 } __attribute__((aligned(8)));
0221 
0222 struct mptcp_subflow_addrs {
0223     union {
0224         __kernel_sa_family_t sa_family;
0225         struct sockaddr sa_local;
0226         struct sockaddr_in sin_local;
0227         struct sockaddr_in6 sin6_local;
0228         struct __kernel_sockaddr_storage ss_local;
0229     };
0230     union {
0231         struct sockaddr sa_remote;
0232         struct sockaddr_in sin_remote;
0233         struct sockaddr_in6 sin6_remote;
0234         struct __kernel_sockaddr_storage ss_remote;
0235     };
0236 };
0237 
0238 /* MPTCP socket options */
0239 #define MPTCP_INFO      1
0240 #define MPTCP_TCPINFO       2
0241 #define MPTCP_SUBFLOW_ADDRS 3
0242 
0243 #endif /* _UAPI_MPTCP_H */