]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
RDS: Add UUID socket option
authorSantosh Shilimkar <santosh.shilimkar@oracle.com>
Wed, 3 Feb 2016 16:13:25 +0000 (08:13 -0800)
committerSantosh Shilimkar <santosh.shilimkar@oracle.com>
Tue, 31 May 2016 16:03:34 +0000 (09:03 -0700)
UUID is opaque user application data to be stored
per socket connection.

IB transport makes use of it for the ACL based
message filtering.

Orabug: 23222944

Signed-off-by: Yuval Shaia <yuval.shaia@oracle.com>
Signed-off-by: Bang Ngyen <bang.nguyen@oracle.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
include/uapi/linux/rds.h
net/rds/af_rds.c
net/rds/rds.h
net/rds/recv.c

index ce93edb7a1f979ec9f953a8fe314407d3b81694b..513f05dd3593049cb6be055ae3aa280ae407cd11 100644 (file)
@@ -67,6 +67,7 @@
 #define RDS_GET_MR_FOR_DEST            7
 #define RDS_CONN_RESET                  8
 #define SO_RDS_TRANSPORT               9
+#define RDS_CONFIG_UUID                        11
 
 /* supported values for SO_RDS_TRANSPORT */
 #define        RDS_TRANS_IB    0
@@ -146,6 +147,7 @@ struct rds_cmsg_rx_trace {
 #define RDS_CMSG_MASKED_ATOMIC_CSWP     9
 #define RDS_CMSG_ASYNC_SEND             10
 #define RDS_CMSG_RXPATH_LATENCY                11
+#define RDS_CMSG_UUID                  12
 
 #define RDS_INFO_FIRST                 10000
 #define RDS_INFO_COUNTERS              10000
@@ -345,11 +347,20 @@ struct rds_rdma_send_notify {
        int32_t         status;
 };
 
+#define RDS_UUID_MAXLEN 64
+struct rds_uuid_args {
+       u_int8_t        uuid[RDS_UUID_MAXLEN];
+       unsigned int    uuid_en;
+       unsigned int    acl_en;
+       unsigned int drop_cnt;
+};
+
 #define RDS_RDMA_SEND_SUCCESS  0
 #define RDS_RDMA_REMOTE_ERROR  1
 #define RDS_RDMA_SEND_CANCELED 2
 #define RDS_RDMA_SEND_DROPPED  3
 #define RDS_RDMA_SEND_OTHER_ERROR      4
+#define RDS_RDMA_SEND_ACCVIO   5
 
 /*
  * Common set of flags for all RDMA related structs
index 4b3e728a4c3cc37f875629247ed11c54a34926b4..0f5ea17d5152f5e9782e2b53c4aefd1325561922 100644 (file)
@@ -437,6 +437,34 @@ static int rds_recv_track_latency(struct rds_sock *rs, char __user *optval,
 }
 
 
+static int rds_set_config_uuid(struct rds_sock *rs, char __user *optval,
+                              int optlen)
+{
+       return rds_set_bool_option(&rs->rs_uuid_en, optval, optlen);
+}
+
+static int rds_get_config_uuid(struct rds_sock *rs, char __user *optval,
+                              int *optlen)
+{
+       struct rds_uuid_args args;
+
+       memset(&args, 0, sizeof(args));
+       args.uuid_en = rs->rs_uuid_en;
+       args.drop_cnt = rs->rs_uuid_drop_cnt;
+       if (rs->rs_conn) {
+               args.acl_en = rs->rs_conn->c_acl_en;
+               memcpy(args.uuid, rs->rs_conn->c_uuid, sizeof(args.uuid));
+       }
+
+       if (copy_to_user(optval, &args, sizeof(args)))
+               return -EFAULT;
+
+       if (put_user(sizeof(args), optlen))
+               return -EFAULT;
+
+       return 0;
+}
+
 static int rds_setsockopt(struct socket *sock, int level, int optname,
                          char __user *optval, unsigned int optlen)
 {
@@ -483,6 +511,9 @@ static int rds_setsockopt(struct socket *sock, int level, int optname,
        case SO_RDS_MSG_RXPATH_LATENCY:
                ret = rds_recv_track_latency(rs, optval, optlen);
                break;
+       case RDS_CONFIG_UUID:
+               ret = rds_set_config_uuid(rs, optval, optlen);
+               break;
        default:
                ret = -ENOPROTOOPT;
        }
@@ -534,6 +565,9 @@ static int rds_getsockopt(struct socket *sock, int level, int optname,
                else
                        ret = 0;
                break;
+       case RDS_CONFIG_UUID:
+               ret = rds_get_config_uuid(rs, optval, optlen);
+               break;
        default:
                break;
        }
index 7237bc58fb9d773b6517c8374db32db3e4598715..5499e15aaf3cacdc67b1daa98839c0f4a5e2678f 100644 (file)
@@ -288,6 +288,10 @@ struct rds_connection {
 
        enum rds_conn_drop_src  c_drop_source;
        struct list_head        c_laddr_node;
+
+       unsigned char           c_acl_init;
+       unsigned char           c_acl_en;
+       u_int8_t                c_uuid[RDS_UUID_MAXLEN];
 };
 
 static inline
@@ -494,6 +498,7 @@ struct rds_message {
        u64                     m_ack_seq;
        __be32                  m_daddr;
        unsigned long           m_flags;
+       unsigned int            m_status;
 
        /* Never access m_rs without holding m_rs_lock.
         * Lock nesting is
@@ -561,6 +566,10 @@ struct rds_message {
                        unsigned int            op_dmaoff;
                        struct scatterlist      *op_sg;
                } data;
+               struct rm_uuid_op {
+                       u_int8_t                value[RDS_UUID_MAXLEN];
+                       u_int8_t                enable;
+               } uuid;
        };
 };
 
@@ -718,6 +727,12 @@ struct rds_sock {
        /* Socket receive path trace points*/
        u8                      rs_rx_traces;
        u8                      rs_rx_trace[RDS_MSG_RX_DGRAM_TRACE_MAX];
+
+       /* UUID specific fields */
+       unsigned char           rs_uuid_en;
+       unsigned int            rs_uuid_drop_cnt;
+       unsigned int            rs_uuid_sent_cnt;
+       unsigned int            rs_uuid_recv_cnt;
 };
 
 static inline struct rds_sock *rds_sk_to_rs(const struct sock *sk)
index 67509dea2735f50ce3ba549bb65ae580920d3d11..90b665be6d4a188c837c765b8994f41bc684959d 100644 (file)
@@ -773,6 +773,21 @@ out:
        return ret;
 }
 
+static int rds_cmsg_uuid(struct rds_sock *rs, struct rds_incoming *inc,
+                        struct msghdr *msghdr)
+{
+       struct rds_uuid_args args;
+
+       if (!inc->i_conn->c_acl_en || !rs->rs_uuid_en)
+               return 0;
+
+       memcpy(args.uuid, inc->i_conn->c_uuid, sizeof(inc->i_conn->c_uuid));
+       args.acl_en = inc->i_conn->c_acl_en;
+       args.uuid_en = rs->rs_uuid_en;
+
+       return put_cmsg(msghdr, SOL_RDS, RDS_CMSG_UUID, sizeof(args), &args);
+}
+
 int rds_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
                int msg_flags)
 {