]> git.openfabrics.org - compat-rdma/compat-rdma.git/commitdiff
RDMA/iwpm: Updated fixes for the client registration functionality
authorTatyana E. Nikolova <tatyana.e.nikolova@intel.com>
Thu, 2 Jul 2015 19:20:29 +0000 (12:20 -0700)
committerTatyana E. Nikolova <tatyana.e.nikolova@intel.com>
Thu, 2 Jul 2015 19:22:03 +0000 (12:22 -0700)
Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova@intel.com>
linux-next-pending/0004-core-iwpm-client-reg.patch

index ac6a774fe5eefd220599daed1c61070325c6edcb..fd6f9c3ce0aa62ae1a5903c6d6b4a5064c304a8f 100644 (file)
@@ -1,37 +1,42 @@
-IWPM_REG_CLIENT and IWPM_PREV_REG_CLIENT are added:
+[PATCH 1/1] RDMA/core: Fixes for port mapper client registration
 
-IWPM_REG_CLIENT is a client, registered with the user
-space port mapper daemon, available at the time of the
-client register pid request.
-IWPM_PREV_REG_CLIENT is a client, which has been IWPM_REG_CLIENT
-before the user space port mapper daemon is stopped.
-After restarting the port mapper, IWPM_PREV_REG_CLIENTs provide
-their mapping info to the port mapper daemon and
-they are allowed to send remove mapping requests aftewards.
+Fixes to allow clients to make remove mapping requests, after
+they have provided the user space service with the mapping
+information, they are using when the service is restarted.
 
-Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova@intel.com>
+1) Adding IWPM_REG_VALID, IWPM_REG_INCOMPL and IWPM_REG_UNDEF
+   registration types for the port mapper clients and functions
+   to set/check the registration type.
+2) If the port mapper user space service is not available to register
+   the client, then its registration stays IWPM_REG_UNDEF and the
+   registration isn't checked until the service becomes available
+   (no mappings are possible, if the user space service isn't running).
+3) After the service is restarted, the user space port mapper pid is set
+   to valid and the client registration is set to IWPM_REG_INCOMPL
+   to allow the client to make remove mapping requests.
+
+Signed-off-by: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com>
 ---
- drivers/infiniband/core/iwpm_msg.c  |   13 +++++++------
- drivers/infiniband/core/iwpm_util.c |    1 +
- drivers/infiniband/core/iwpm_util.h |    3 +++
- 3 files changed, 11 insertions(+), 6 deletions(-)
+ drivers/infiniband/core/iwpm_msg.c  |   33 ++++++++++++++++-----------------
+ drivers/infiniband/core/iwpm_util.c |   12 ++++++++++--
+ drivers/infiniband/core/iwpm_util.h |   28 ++++++++++++++++++++++------
+ 3 files changed, 48 insertions(+), 25 deletions(-)
 
 diff --git a/drivers/infiniband/core/iwpm_msg.c b/drivers/infiniband/core/iwpm_msg.c
-index ab08170..2aca295 100644
+index e6ffa2e..22a3abe 100644
 --- a/drivers/infiniband/core/iwpm_msg.c
 +++ b/drivers/infiniband/core/iwpm_msg.c
-@@ -67,7 +67,9 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client)
+@@ -67,7 +67,8 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client)
                err_str = "Invalid port mapper client";
                goto pid_query_error;
        }
 -      if (iwpm_registered_client(nl_client))
-+      if (iwpm_registered_client(nl_client) == IWPM_REG_CLIENT)
-+              return 0;
-+      if (iwpm_user_pid == IWPM_PID_UNAVAILABLE)
++      if (iwpm_check_registration(nl_client, IWPM_REG_VALID) ||
++                      iwpm_user_pid == IWPM_PID_UNAVAILABLE)
                return 0;
        skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REG_PID, &nlh, nl_client);
        if (!skb) {
-@@ -106,7 +108,6 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client)
+@@ -106,7 +107,6 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client)
        ret = ibnl_multicast(skb, nlh, RDMA_NL_GROUP_IWPM, GFP_KERNEL);
        if (ret) {
                skb = NULL; /* skb is freed in the netlink send-op handling */
@@ -39,68 +44,197 @@ index ab08170..2aca295 100644
                iwpm_user_pid = IWPM_PID_UNAVAILABLE;
                err_str = "Unable to send a nlmsg";
                goto pid_query_error;
-@@ -144,7 +145,7 @@ int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client)
+@@ -144,12 +144,12 @@ int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client)
                err_str = "Invalid port mapper client";
                goto add_mapping_error;
        }
 -      if (!iwpm_registered_client(nl_client)) {
-+      if (iwpm_registered_client(nl_client) != IWPM_REG_CLIENT) {
++      if (!iwpm_valid_pid())
++              return 0;
++      if (!iwpm_check_registration(nl_client, IWPM_REG_VALID)) {
                err_str = "Unregistered port mapper client";
                goto add_mapping_error;
        }
-@@ -214,7 +215,7 @@ int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client)
+-      if (!iwpm_valid_pid())
+-              return 0;
+       skb = iwpm_create_nlmsg(RDMA_NL_IWPM_ADD_MAPPING, &nlh, nl_client);
+       if (!skb) {
+               err_str = "Unable to create a nlmsg";
+@@ -214,12 +214,12 @@ int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client)
                err_str = "Invalid port mapper client";
                goto query_mapping_error;
        }
 -      if (!iwpm_registered_client(nl_client)) {
-+      if (iwpm_registered_client(nl_client) != IWPM_REG_CLIENT) {
++      if (!iwpm_valid_pid())
++              return 0;
++      if (!iwpm_check_registration(nl_client, IWPM_REG_VALID)) {
                err_str = "Unregistered port mapper client";
                goto query_mapping_error;
        }
-@@ -388,7 +389,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb)
+-      if (!iwpm_valid_pid())
+-              return 0;
+       ret = -ENOMEM;
+       skb = iwpm_create_nlmsg(RDMA_NL_IWPM_QUERY_MAPPING, &nlh, nl_client);
+       if (!skb) {
+@@ -288,12 +288,12 @@ int iwpm_remove_mapping(struct sockaddr_storage *local_addr, u8 nl_client)
+               err_str = "Invalid port mapper client";
+               goto remove_mapping_error;
+       }
+-      if (!iwpm_registered_client(nl_client)) {
++      if (!iwpm_valid_pid())
++              return 0;
++      if (iwpm_check_registration(nl_client, IWPM_REG_UNDEF)) {
+               err_str = "Unregistered port mapper client";
+               goto remove_mapping_error;
+       }
+-      if (!iwpm_valid_pid())
+-              return 0;
+       skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REMOVE_MAPPING, &nlh, nl_client);
+       if (!skb) {
+               ret = -ENOMEM;
+@@ -388,7 +388,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb)
        pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n",
                        __func__, iwpm_user_pid);
        if (iwpm_valid_client(nl_client))
 -              iwpm_set_registered(nl_client, 1);
-+              iwpm_set_registered(nl_client, IWPM_REG_CLIENT);
++              iwpm_set_registration(nl_client, IWPM_REG_VALID);
  register_pid_response_exit:
        nlmsg_request->request_done = 1;
        /* always for found nlmsg_request */
-@@ -669,7 +670,7 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb)
+@@ -644,7 +644,6 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb)
+ {
+       struct nlattr *nltb[IWPM_NLA_MAPINFO_REQ_MAX];
+       const char *msg_type = "Mapping Info response";
+-      int iwpm_pid;
+       u8 nl_client;
+       char *iwpm_name;
+       u16 iwpm_version;
+@@ -669,14 +668,14 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb)
                                __func__, nl_client);
                return ret;
        }
 -      iwpm_set_registered(nl_client, 0);
-+      iwpm_set_registered(nl_client, IWPM_PREV_REG_CLIENT);
++      iwpm_set_registration(nl_client, IWPM_REG_INCOMPL);
        atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq);
++      iwpm_user_pid = cb->nlh->nlmsg_pid;
        if (!iwpm_mapinfo_available())
                return 0;
+-      iwpm_pid = cb->nlh->nlmsg_pid;
+       pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n",
+-               __func__, iwpm_pid);
+-      ret = iwpm_send_mapinfo(nl_client, iwpm_pid);
++               __func__, iwpm_user_pid);
++      ret = iwpm_send_mapinfo(nl_client, iwpm_user_pid);
+       return ret;
+ }
+ EXPORT_SYMBOL(iwpm_mapping_info_cb);
 diff --git a/drivers/infiniband/core/iwpm_util.c b/drivers/infiniband/core/iwpm_util.c
-index a626795..7a20a1b 100644
+index a626795..5fb089e 100644
 --- a/drivers/infiniband/core/iwpm_util.c
 +++ b/drivers/infiniband/core/iwpm_util.c
-@@ -106,6 +106,7 @@ int iwpm_exit(u8 nl_client)
+@@ -78,6 +78,7 @@ init_exit:
+       mutex_unlock(&iwpm_admin_lock);
+       if (!ret) {
+               iwpm_set_valid(nl_client, 1);
++              iwpm_set_registration(nl_client, IWPM_REG_UNDEF);
+               pr_debug("%s: Mapinfo and reminfo tables are created\n",
+                               __func__);
+       }
+@@ -106,6 +107,7 @@ int iwpm_exit(u8 nl_client)
        }
        mutex_unlock(&iwpm_admin_lock);
        iwpm_set_valid(nl_client, 0);
-+      iwpm_set_registered(nl_client, 0);
++      iwpm_set_registration(nl_client, IWPM_REG_UNDEF);
        return 0;
  }
  EXPORT_SYMBOL(iwpm_exit);
+@@ -397,17 +399,23 @@ void iwpm_set_valid(u8 nl_client, int valid)
+ }
+ /* valid client */
+-int iwpm_registered_client(u8 nl_client)
++u32 iwpm_get_registration(u8 nl_client)
+ {
+       return iwpm_admin.reg_list[nl_client];
+ }
+ /* valid client */
+-void iwpm_set_registered(u8 nl_client, int reg)
++void iwpm_set_registration(u8 nl_client, u32 reg)
+ {
+       iwpm_admin.reg_list[nl_client] = reg;
+ }
++/* valid client */
++u32 iwpm_check_registration(u8 nl_client, u32 reg)
++{
++      return (iwpm_get_registration(nl_client) & reg);
++}
++
+ int iwpm_compare_sockaddr(struct sockaddr_storage *a_sockaddr,
+                               struct sockaddr_storage *b_sockaddr)
+ {
 diff --git a/drivers/infiniband/core/iwpm_util.h b/drivers/infiniband/core/iwpm_util.h
-index ee2d9ff..b1dfd1a 100644
+index ee2d9ff..b7b9e19 100644
 --- a/drivers/infiniband/core/iwpm_util.h
 +++ b/drivers/infiniband/core/iwpm_util.h
-@@ -58,6 +58,9 @@
+@@ -58,6 +58,10 @@
  #define IWPM_PID_UNDEFINED     -1
  #define IWPM_PID_UNAVAILABLE   -2
  
-+#define IWPM_REG_CLIENT         1
-+#define IWPM_PREV_REG_CLIENT    2
++#define IWPM_REG_UNDEF          0x01
++#define IWPM_REG_VALID          0x02
++#define IWPM_REG_INCOMPL        0x04
 +
  struct iwpm_nlmsg_request {
        struct list_head    inprocess_list;
        __u32               nlmsg_seq;
+@@ -88,7 +92,7 @@ struct iwpm_admin_data {
+       atomic_t refcount;
+       atomic_t nlmsg_seq;
+       int      client_list[RDMA_NL_NUM_CLIENTS];
+-      int      reg_list[RDMA_NL_NUM_CLIENTS];
++      u32      reg_list[RDMA_NL_NUM_CLIENTS];
+ };
+ /**
+@@ -159,19 +163,31 @@ int iwpm_valid_client(u8 nl_client);
+ void iwpm_set_valid(u8 nl_client, int valid);
+ /**
+- * iwpm_registered_client - Check if the port mapper client is registered
++ * iwpm_check_registration - Check if the client registration
++ *                          matches the given one
+  * @nl_client: The index of the netlink client
++ * @reg: The given registration type to compare with
+  *
+  * Call iwpm_register_pid() to register a client
++ * Returns true if the client registration matches reg,
++ * otherwise returns false
++ */
++u32 iwpm_check_registration(u8 nl_client, u32 reg);
++
++/**
++ * iwpm_set_registration - Set the client registration
++ * @nl_client: The index of the netlink client
++ * @reg: Registration type to set
+  */
+-int iwpm_registered_client(u8 nl_client);
++void iwpm_set_registration(u8 nl_client, u32 reg);
+ /**
+- * iwpm_set_registered - Set the port mapper client to registered or not
++ * iwpm_get_registration
+  * @nl_client: The index of the netlink client
+- * @reg: 1 if registered or 0 if not
++ *
++ * Returns the client registration type
+  */
+-void iwpm_set_registered(u8 nl_client, int reg);
++u32 iwpm_get_registration(u8 nl_client);
+ /**
+  * iwpm_send_mapinfo - Send local and mapped IPv4/IPv6 address info of
 -- 
 1.7.1