219 }
220 /* Found one, return it. */
221 if (tmp != NULL) {
222 tmp->nse_refcnt++;
223 mutex_exit(&ilbs->ilbs_nat_src[idx].nsh_lock);
224 return (tmp);
225 }
226
227 tmp = kmem_alloc(sizeof (ilb_nat_src_entry_t), KM_NOSLEEP);
228 if (tmp == NULL) {
229 mutex_exit(&ilbs->ilbs_nat_src[idx].nsh_lock);
230 return (NULL);
231 }
232 tmp->nse_src_addr = *nat_src;
233 tmp->nse_serv_addr = *serv_addr;
234 tmp->nse_port = port;
235 tmp->nse_nsh_lock = &ilbs->ilbs_nat_src[idx].nsh_lock;
236 tmp->nse_refcnt = 1;
237
238 (void) snprintf(arena_name, ARENA_NAMESZ, "ilb_ns_%u",
239 atomic_add_32_nv(&ilb_nat_src_instance, 1));
240 if ((tmp->nse_port_arena = vmem_create(arena_name,
241 (void *)NAT_PORT_START, NAT_PORT_SIZE, 1, NULL, NULL, NULL, 1,
242 VM_SLEEP | VMC_IDENTIFIER)) == NULL) {
243 kmem_free(tmp, sizeof (*tmp));
244 return (NULL);
245 }
246
247 list_insert_tail(head, tmp);
248 mutex_exit(&ilbs->ilbs_nat_src[idx].nsh_lock);
249
250 return (tmp);
251 }
252
253 /*
254 * Create ilb_nat_src_t struct for a ilb_server_t struct.
255 */
256 int
257 ilb_create_nat_src(ilb_stack_t *ilbs, ilb_nat_src_t **nat_src,
258 const in6_addr_t *srv_addr, in_port_t port, const in6_addr_t *start,
259 int num)
|
219 }
220 /* Found one, return it. */
221 if (tmp != NULL) {
222 tmp->nse_refcnt++;
223 mutex_exit(&ilbs->ilbs_nat_src[idx].nsh_lock);
224 return (tmp);
225 }
226
227 tmp = kmem_alloc(sizeof (ilb_nat_src_entry_t), KM_NOSLEEP);
228 if (tmp == NULL) {
229 mutex_exit(&ilbs->ilbs_nat_src[idx].nsh_lock);
230 return (NULL);
231 }
232 tmp->nse_src_addr = *nat_src;
233 tmp->nse_serv_addr = *serv_addr;
234 tmp->nse_port = port;
235 tmp->nse_nsh_lock = &ilbs->ilbs_nat_src[idx].nsh_lock;
236 tmp->nse_refcnt = 1;
237
238 (void) snprintf(arena_name, ARENA_NAMESZ, "ilb_ns_%u",
239 atomic_inc_32_nv(&ilb_nat_src_instance));
240 if ((tmp->nse_port_arena = vmem_create(arena_name,
241 (void *)NAT_PORT_START, NAT_PORT_SIZE, 1, NULL, NULL, NULL, 1,
242 VM_SLEEP | VMC_IDENTIFIER)) == NULL) {
243 kmem_free(tmp, sizeof (*tmp));
244 return (NULL);
245 }
246
247 list_insert_tail(head, tmp);
248 mutex_exit(&ilbs->ilbs_nat_src[idx].nsh_lock);
249
250 return (tmp);
251 }
252
253 /*
254 * Create ilb_nat_src_t struct for a ilb_server_t struct.
255 */
256 int
257 ilb_create_nat_src(ilb_stack_t *ilbs, ilb_nat_src_t **nat_src,
258 const in6_addr_t *srv_addr, in_port_t port, const in6_addr_t *start,
259 int num)
|