-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 */
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