621 ilb_conn_hash_init(ilbs);
622 ilb_nat_src_init(ilbs);
623 }
624
625 /* Make sure that the new rule does not duplicate an existing one. */
626 if (ilb_match_rule(ilbs, zoneid, cmd->name, cmd->ip_ver, cmd->proto,
627 min_port, max_port, &cmd->vip)) {
628 mutex_exit(&ilbs->ilbs_g_lock);
629 return (EEXIST);
630 }
631
632 rule = kmem_zalloc(sizeof (ilb_rule_t), KM_NOSLEEP);
633 if (rule == NULL) {
634 mutex_exit(&ilbs->ilbs_g_lock);
635 return (ENOMEM);
636 }
637
638 /* ir_name is all 0 to begin with */
639 (void) memcpy(rule->ir_name, cmd->name, ILB_RULE_NAMESZ - 1);
640
641 rule->ir_ks_instance = atomic_add_int_nv(&ilb_kstat_instance, 1);
642 stackid = (netstackid_t)(uintptr_t)ilbs->ilbs_ksp->ks_private;
643 if ((rule->ir_ksp = ilb_rule_kstat_init(stackid, rule)) == NULL) {
644 ret = ENOMEM;
645 goto error;
646 }
647
648 if (cmd->topo == ILB_TOPO_IMPL_NAT) {
649 rule->ir_nat_src_start = cmd->nat_src_start;
650 rule->ir_nat_src_end = cmd->nat_src_end;
651 }
652
653 rule->ir_ipver = cmd->ip_ver;
654 rule->ir_proto = cmd->proto;
655 rule->ir_topo = cmd->topo;
656
657 rule->ir_min_port = min_port;
658 rule->ir_max_port = max_port;
659 if (rule->ir_min_port != rule->ir_max_port)
660 rule->ir_port_range = B_TRUE;
661 else
|
621 ilb_conn_hash_init(ilbs);
622 ilb_nat_src_init(ilbs);
623 }
624
625 /* Make sure that the new rule does not duplicate an existing one. */
626 if (ilb_match_rule(ilbs, zoneid, cmd->name, cmd->ip_ver, cmd->proto,
627 min_port, max_port, &cmd->vip)) {
628 mutex_exit(&ilbs->ilbs_g_lock);
629 return (EEXIST);
630 }
631
632 rule = kmem_zalloc(sizeof (ilb_rule_t), KM_NOSLEEP);
633 if (rule == NULL) {
634 mutex_exit(&ilbs->ilbs_g_lock);
635 return (ENOMEM);
636 }
637
638 /* ir_name is all 0 to begin with */
639 (void) memcpy(rule->ir_name, cmd->name, ILB_RULE_NAMESZ - 1);
640
641 rule->ir_ks_instance = atomic_inc_uint_nv(&ilb_kstat_instance);
642 stackid = (netstackid_t)(uintptr_t)ilbs->ilbs_ksp->ks_private;
643 if ((rule->ir_ksp = ilb_rule_kstat_init(stackid, rule)) == NULL) {
644 ret = ENOMEM;
645 goto error;
646 }
647
648 if (cmd->topo == ILB_TOPO_IMPL_NAT) {
649 rule->ir_nat_src_start = cmd->nat_src_start;
650 rule->ir_nat_src_end = cmd->nat_src_end;
651 }
652
653 rule->ir_ipver = cmd->ip_ver;
654 rule->ir_proto = cmd->proto;
655 rule->ir_topo = cmd->topo;
656
657 rule->ir_min_port = min_port;
658 rule->ir_max_port = max_port;
659 if (rule->ir_min_port != rule->ir_max_port)
660 rule->ir_port_range = B_TRUE;
661 else
|