5 |
* |
* |
6 |
* Copyright (C) 2005-2007 NTT DATA CORPORATION |
* Copyright (C) 2005-2007 NTT DATA CORPORATION |
7 |
* |
* |
8 |
* Version: 1.5.2-pre 2007/11/19 |
* Version: 1.5.2-pre 2007/11/27 |
9 |
* |
* |
10 |
* This file is applicable to both 2.4.30 and 2.6.11 and later. |
* This file is applicable to both 2.4.30 and 2.6.11 and later. |
11 |
* See README.ccs for ChangeLog. |
* See README.ccs for ChangeLog. |
49 |
static const int block_size = 16; |
static const int block_size = 16; |
50 |
struct addr_list { |
struct addr_list { |
51 |
struct in6_addr addr[block_size]; |
struct in6_addr addr[block_size]; |
52 |
struct addr_list *next; |
struct list1_head list; |
53 |
u32 in_use_count; |
u32 in_use_count; |
54 |
}; |
}; |
55 |
static struct addr_list *list = NULL; |
static LIST1_HEAD(address_list); |
56 |
struct addr_list *ptr; |
struct addr_list *ptr; |
57 |
static DEFINE_MUTEX(lock); |
static DEFINE_MUTEX(lock); |
58 |
int i = block_size; |
int i = block_size; |
59 |
if (!addr) return NULL; |
if (!addr) return NULL; |
60 |
mutex_lock(&lock); |
mutex_lock(&lock); |
61 |
for (ptr = list; ptr; ptr = ptr->next) { |
list1_for_each_entry(ptr, &address_list, list) { |
62 |
for (i = 0; i < ptr->in_use_count; i++) { |
for (i = 0; i < ptr->in_use_count; i++) { |
63 |
if (memcmp(&ptr->addr[i], addr, sizeof(*addr)) == 0) goto ok; |
if (memcmp(&ptr->addr[i], addr, sizeof(*addr)) == 0) goto ok; |
64 |
} |
} |
65 |
if (i < block_size) break; |
if (i < block_size) break; |
66 |
} |
} |
67 |
if (i == block_size && (ptr = alloc_element(sizeof(*ptr))) != NULL) { |
if (i == block_size) { |
68 |
struct addr_list *p = list; |
ptr = alloc_element(sizeof(*ptr)); |
69 |
if (p) { |
if (!ptr) goto ok; |
70 |
while (p->next) p = p->next; |
list1_add_tail_mb(&ptr->list, &address_list); |
|
p->next = ptr; |
|
|
} else { |
|
|
list = ptr; |
|
|
} |
|
71 |
i = 0; |
i = 0; |
72 |
} |
} |
73 |
if (ptr) ptr->addr[ptr->in_use_count++] = *addr; |
ptr->addr[ptr->in_use_count++] = *addr; |
74 |
ok: |
ok: |
75 |
mutex_unlock(&lock); |
mutex_unlock(&lock); |
76 |
return ptr ? &ptr->addr[i] : NULL; |
return ptr ? &ptr->addr[i] : NULL; |