aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2013-02-18 23:59:27 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2013-02-19 20:58:04 -0500
commit05b9689245c1b2f0dea38c1cb4882810ce3adda8 (patch)
treefcf82d7aad2b9772f7c70a0572f83441ddb04f72 /drivers/target
parentfbbf8555a986ed31e54f006b6cc637ea4ff1425b (diff)
iscsi-target: Refactor iscsit_get_np sockaddr matching into iscsit_check_np_match
This patch refactors the sockaddr matching logic in iscsit_get_np() into a seperate iscsit_check_np_match() that can be used by external code. Tested-by: Andy Grover <agrover@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/iscsi/iscsi_target.c65
-rw-r--r--drivers/target/iscsi/iscsi_target.h2
2 files changed, 41 insertions, 26 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index 339f97f7085b..23a98e658306 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -264,16 +264,50 @@ int iscsit_deaccess_np(struct iscsi_np *np, struct iscsi_portal_group *tpg)
264 return 0; 264 return 0;
265} 265}
266 266
267static struct iscsi_np *iscsit_get_np( 267bool iscsit_check_np_match(
268 struct __kernel_sockaddr_storage *sockaddr, 268 struct __kernel_sockaddr_storage *sockaddr,
269 struct iscsi_np *np,
269 int network_transport) 270 int network_transport)
270{ 271{
271 struct sockaddr_in *sock_in, *sock_in_e; 272 struct sockaddr_in *sock_in, *sock_in_e;
272 struct sockaddr_in6 *sock_in6, *sock_in6_e; 273 struct sockaddr_in6 *sock_in6, *sock_in6_e;
273 struct iscsi_np *np; 274 bool ip_match = false;
274 int ip_match = 0;
275 u16 port; 275 u16 port;
276 276
277 if (sockaddr->ss_family == AF_INET6) {
278 sock_in6 = (struct sockaddr_in6 *)sockaddr;
279 sock_in6_e = (struct sockaddr_in6 *)&np->np_sockaddr;
280
281 if (!memcmp(&sock_in6->sin6_addr.in6_u,
282 &sock_in6_e->sin6_addr.in6_u,
283 sizeof(struct in6_addr)))
284 ip_match = true;
285
286 port = ntohs(sock_in6->sin6_port);
287 } else {
288 sock_in = (struct sockaddr_in *)sockaddr;
289 sock_in_e = (struct sockaddr_in *)&np->np_sockaddr;
290
291 if (sock_in->sin_addr.s_addr == sock_in_e->sin_addr.s_addr)
292 ip_match = true;
293
294 port = ntohs(sock_in->sin_port);
295 }
296
297 if ((ip_match == true) && (np->np_port == port) &&
298 (np->np_network_transport == network_transport))
299 return true;
300
301 return false;
302}
303
304static struct iscsi_np *iscsit_get_np(
305 struct __kernel_sockaddr_storage *sockaddr,
306 int network_transport)
307{
308 struct iscsi_np *np;
309 bool match;
310
277 spin_lock_bh(&np_lock); 311 spin_lock_bh(&np_lock);
278 list_for_each_entry(np, &g_np_list, np_list) { 312 list_for_each_entry(np, &g_np_list, np_list) {
279 spin_lock(&np->np_thread_lock); 313 spin_lock(&np->np_thread_lock);
@@ -282,29 +316,8 @@ static struct iscsi_np *iscsit_get_np(
282 continue; 316 continue;
283 } 317 }
284 318
285 if (sockaddr->ss_family == AF_INET6) { 319 match = iscsit_check_np_match(sockaddr, np, network_transport);
286 sock_in6 = (struct sockaddr_in6 *)sockaddr; 320 if (match == true) {
287 sock_in6_e = (struct sockaddr_in6 *)&np->np_sockaddr;
288
289 if (!memcmp(&sock_in6->sin6_addr.in6_u,
290 &sock_in6_e->sin6_addr.in6_u,
291 sizeof(struct in6_addr)))
292 ip_match = 1;
293
294 port = ntohs(sock_in6->sin6_port);
295 } else {
296 sock_in = (struct sockaddr_in *)sockaddr;
297 sock_in_e = (struct sockaddr_in *)&np->np_sockaddr;
298
299 if (sock_in->sin_addr.s_addr ==
300 sock_in_e->sin_addr.s_addr)
301 ip_match = 1;
302
303 port = ntohs(sock_in->sin_port);
304 }
305
306 if ((ip_match == 1) && (np->np_port == port) &&
307 (np->np_network_transport == network_transport)) {
308 /* 321 /*
309 * Increment the np_exports reference count now to 322 * Increment the np_exports reference count now to
310 * prevent iscsit_del_np() below from being called 323 * prevent iscsit_del_np() below from being called
diff --git a/drivers/target/iscsi/iscsi_target.h b/drivers/target/iscsi/iscsi_target.h
index f1e4f3155bac..b1a1e6350707 100644
--- a/drivers/target/iscsi/iscsi_target.h
+++ b/drivers/target/iscsi/iscsi_target.h
@@ -8,6 +8,8 @@ extern struct iscsi_tiqn *iscsit_add_tiqn(unsigned char *);
8extern void iscsit_del_tiqn(struct iscsi_tiqn *); 8extern void iscsit_del_tiqn(struct iscsi_tiqn *);
9extern int iscsit_access_np(struct iscsi_np *, struct iscsi_portal_group *); 9extern int iscsit_access_np(struct iscsi_np *, struct iscsi_portal_group *);
10extern int iscsit_deaccess_np(struct iscsi_np *, struct iscsi_portal_group *); 10extern int iscsit_deaccess_np(struct iscsi_np *, struct iscsi_portal_group *);
11extern bool iscsit_check_np_match(struct __kernel_sockaddr_storage *,
12 struct iscsi_np *, int);
11extern struct iscsi_np *iscsit_add_np(struct __kernel_sockaddr_storage *, 13extern struct iscsi_np *iscsit_add_np(struct __kernel_sockaddr_storage *,
12 char *, int); 14 char *, int);
13extern int iscsit_reset_np_thread(struct iscsi_np *, struct iscsi_tpg_np *, 15extern int iscsit_reset_np_thread(struct iscsi_np *, struct iscsi_tpg_np *,