RDMA/IWPM: refactor the IWPM message attribute names
authorSteve Wise <swise@opengridcomputing.com>
Tue, 29 Jan 2019 21:33:11 +0000 (13:33 -0800)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 4 Feb 2019 23:26:02 +0000 (16:26 -0700)
In order to add new IWPM_NL attributes, the enums for the IWPM commands
attributes are refactored such that a new attribute can be added without
breaking ABI version 3. Instead of sharing nl attribute enums for both
request and response messages, we create separate enums for each IWPM
message request and reply.  This allows us to extend any given IWPM
message by adding new attributes for just that message.  These new enums
are created, though, in a way to avoid breaking ABI version 3.

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Reviewed-by: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/iwpm_msg.c
include/uapi/rdma/rdma_netlink.h

index 8861c052155ab72e0062be5e1c03d1723705f0c2..3a8753595c8f7265f9c859728493a17c271f5dad 100644 (file)
@@ -403,10 +403,12 @@ register_pid_response_exit:
 
 /* netlink attribute policy for the received response to add mapping request */
 static const struct nla_policy resp_add_policy[IWPM_NLA_RMANAGE_MAPPING_MAX] = {
-       [IWPM_NLA_MANAGE_MAPPING_SEQ]     = { .type = NLA_U32 },
-       [IWPM_NLA_MANAGE_ADDR]            = { .len = sizeof(struct sockaddr_storage) },
-       [IWPM_NLA_MANAGE_MAPPED_LOC_ADDR] = { .len = sizeof(struct sockaddr_storage) },
-       [IWPM_NLA_RMANAGE_MAPPING_ERR]    = { .type = NLA_U16 }
+       [IWPM_NLA_RMANAGE_MAPPING_SEQ]     = { .type = NLA_U32 },
+       [IWPM_NLA_RMANAGE_ADDR]            = {
+                               .len = sizeof(struct sockaddr_storage) },
+       [IWPM_NLA_RMANAGE_MAPPED_LOC_ADDR] = {
+                               .len = sizeof(struct sockaddr_storage) },
+       [IWPM_NLA_RMANAGE_MAPPING_ERR]     = { .type = NLA_U16 }
 };
 
 /*
@@ -430,7 +432,7 @@ int iwpm_add_mapping_cb(struct sk_buff *skb, struct netlink_callback *cb)
 
        atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq);
 
-       msg_seq = nla_get_u32(nltb[IWPM_NLA_MANAGE_MAPPING_SEQ]);
+       msg_seq = nla_get_u32(nltb[IWPM_NLA_RMANAGE_MAPPING_SEQ]);
        nlmsg_request = iwpm_find_nlmsg_request(msg_seq);
        if (!nlmsg_request) {
                pr_info("%s: Could not find a matching request (seq = %u)\n",
@@ -439,9 +441,9 @@ int iwpm_add_mapping_cb(struct sk_buff *skb, struct netlink_callback *cb)
        }
        pm_msg = nlmsg_request->req_buffer;
        local_sockaddr = (struct sockaddr_storage *)
-                       nla_data(nltb[IWPM_NLA_MANAGE_ADDR]);
+                       nla_data(nltb[IWPM_NLA_RMANAGE_ADDR]);
        mapped_sockaddr = (struct sockaddr_storage *)
-                       nla_data(nltb[IWPM_NLA_MANAGE_MAPPED_LOC_ADDR]);
+                       nla_data(nltb[IWPM_NLA_RMANAGE_MAPPED_LOC_ADDR]);
 
        if (iwpm_compare_sockaddr(local_sockaddr, &pm_msg->loc_addr)) {
                nlmsg_request->err_code = IWPM_USER_LIB_INFO_ERR;
@@ -472,11 +474,15 @@ add_mapping_response_exit:
 /* netlink attribute policy for the response to add and query mapping request
  * and response with remote address info */
 static const struct nla_policy resp_query_policy[IWPM_NLA_RQUERY_MAPPING_MAX] = {
-       [IWPM_NLA_QUERY_MAPPING_SEQ]      = { .type = NLA_U32 },
-       [IWPM_NLA_QUERY_LOCAL_ADDR]       = { .len = sizeof(struct sockaddr_storage) },
-       [IWPM_NLA_QUERY_REMOTE_ADDR]      = { .len = sizeof(struct sockaddr_storage) },
-       [IWPM_NLA_RQUERY_MAPPED_LOC_ADDR] = { .len = sizeof(struct sockaddr_storage) },
-       [IWPM_NLA_RQUERY_MAPPED_REM_ADDR] = { .len = sizeof(struct sockaddr_storage) },
+       [IWPM_NLA_RQUERY_MAPPING_SEQ]     = { .type = NLA_U32 },
+       [IWPM_NLA_RQUERY_LOCAL_ADDR]      = {
+                               .len = sizeof(struct sockaddr_storage) },
+       [IWPM_NLA_RQUERY_REMOTE_ADDR]     = {
+                               .len = sizeof(struct sockaddr_storage) },
+       [IWPM_NLA_RQUERY_MAPPED_LOC_ADDR] = {
+                               .len = sizeof(struct sockaddr_storage) },
+       [IWPM_NLA_RQUERY_MAPPED_REM_ADDR] = {
+                               .len = sizeof(struct sockaddr_storage) },
        [IWPM_NLA_RQUERY_MAPPING_ERR]     = { .type = NLA_U16 }
 };
 
@@ -502,7 +508,7 @@ int iwpm_add_and_query_mapping_cb(struct sk_buff *skb,
                return -EINVAL;
        atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq);
 
-       msg_seq = nla_get_u32(nltb[IWPM_NLA_QUERY_MAPPING_SEQ]);
+       msg_seq = nla_get_u32(nltb[IWPM_NLA_RQUERY_MAPPING_SEQ]);
        nlmsg_request = iwpm_find_nlmsg_request(msg_seq);
        if (!nlmsg_request) {
                pr_info("%s: Could not find a matching request (seq = %u)\n",
@@ -511,9 +517,9 @@ int iwpm_add_and_query_mapping_cb(struct sk_buff *skb,
        }
        pm_msg = nlmsg_request->req_buffer;
        local_sockaddr = (struct sockaddr_storage *)
-                       nla_data(nltb[IWPM_NLA_QUERY_LOCAL_ADDR]);
+                       nla_data(nltb[IWPM_NLA_RQUERY_LOCAL_ADDR]);
        remote_sockaddr = (struct sockaddr_storage *)
-                       nla_data(nltb[IWPM_NLA_QUERY_REMOTE_ADDR]);
+                       nla_data(nltb[IWPM_NLA_RQUERY_REMOTE_ADDR]);
        mapped_loc_sockaddr = (struct sockaddr_storage *)
                        nla_data(nltb[IWPM_NLA_RQUERY_MAPPED_LOC_ADDR]);
        mapped_rem_sockaddr = (struct sockaddr_storage *)
@@ -588,9 +594,9 @@ int iwpm_remote_info_cb(struct sk_buff *skb, struct netlink_callback *cb)
        atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq);
 
        local_sockaddr = (struct sockaddr_storage *)
-                       nla_data(nltb[IWPM_NLA_QUERY_LOCAL_ADDR]);
+                       nla_data(nltb[IWPM_NLA_RQUERY_LOCAL_ADDR]);
        remote_sockaddr = (struct sockaddr_storage *)
-                       nla_data(nltb[IWPM_NLA_QUERY_REMOTE_ADDR]);
+                       nla_data(nltb[IWPM_NLA_RQUERY_REMOTE_ADDR]);
        mapped_loc_sockaddr = (struct sockaddr_storage *)
                        nla_data(nltb[IWPM_NLA_RQUERY_MAPPED_LOC_ADDR]);
        mapped_rem_sockaddr = (struct sockaddr_storage *)
index 2e18b77a817fb178702170f73d25e79191bfa45d..42d53e182d5f8e83849148ea24b845c4fb07316f 100644 (file)
@@ -83,13 +83,20 @@ enum {
        IWPM_NLA_MANAGE_MAPPING_UNSPEC = 0,
        IWPM_NLA_MANAGE_MAPPING_SEQ,
        IWPM_NLA_MANAGE_ADDR,
-       IWPM_NLA_MANAGE_MAPPED_LOC_ADDR,
+       IWPM_NLA_MANAGE_MAPPING_MAX
+};
+
+enum {
+       IWPM_NLA_RMANAGE_MAPPING_UNSPEC = 0,
+       IWPM_NLA_RMANAGE_MAPPING_SEQ,
+       IWPM_NLA_RMANAGE_ADDR,
+       IWPM_NLA_RMANAGE_MAPPED_LOC_ADDR,
+       /* The following maintains bisectability of rdma-core */
+       IWPM_NLA_MANAGE_MAPPED_LOC_ADDR = IWPM_NLA_RMANAGE_MAPPED_LOC_ADDR,
        IWPM_NLA_RMANAGE_MAPPING_ERR,
        IWPM_NLA_RMANAGE_MAPPING_MAX
 };
 
-#define IWPM_NLA_MANAGE_MAPPING_MAX 3
-#define IWPM_NLA_QUERY_MAPPING_MAX  4
 #define IWPM_NLA_MAPINFO_SEND_MAX   3
 
 enum {
@@ -97,6 +104,14 @@ enum {
        IWPM_NLA_QUERY_MAPPING_SEQ,
        IWPM_NLA_QUERY_LOCAL_ADDR,
        IWPM_NLA_QUERY_REMOTE_ADDR,
+       IWPM_NLA_QUERY_MAPPING_MAX,
+};
+
+enum {
+       IWPM_NLA_RQUERY_MAPPING_UNSPEC = 0,
+       IWPM_NLA_RQUERY_MAPPING_SEQ,
+       IWPM_NLA_RQUERY_LOCAL_ADDR,
+       IWPM_NLA_RQUERY_REMOTE_ADDR,
        IWPM_NLA_RQUERY_MAPPED_LOC_ADDR,
        IWPM_NLA_RQUERY_MAPPED_REM_ADDR,
        IWPM_NLA_RQUERY_MAPPING_ERR,