Print this page
3942 inject sanity into ipadm tcp buffer size properties
3943 _snd_lowat_fraction tcp tunable has no effect
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Peng Dai <peng.dai@delphix.com>
*** 19,28 ****
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1990 Mentat Inc.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
*/
/*
* This file contains the interface control functions for IP.
*/
*** 8852,8867 ****
struct iocblk *iocp = (struct iocblk *)mp->b_rptr;
mblk_t *mp1 = mp->b_cont;
mod_ioc_prop_t *pioc;
mod_prop_info_t *ptbl = NULL, *pinfo = NULL;
ip_stack_t *ipst;
- icmp_stack_t *is;
- tcp_stack_t *tcps;
- sctp_stack_t *sctps;
- udp_stack_t *us;
netstack_t *stack;
- void *cbarg;
cred_t *cr;
boolean_t set;
int err;
ASSERT(q->q_next == NULL);
--- 8853,8863 ----
*** 8878,8934 ****
switch (pioc->mpr_proto) {
case MOD_PROTO_IP:
case MOD_PROTO_IPV4:
case MOD_PROTO_IPV6:
ptbl = ipst->ips_propinfo_tbl;
- cbarg = ipst;
break;
case MOD_PROTO_RAWIP:
! is = stack->netstack_icmp;
! ptbl = is->is_propinfo_tbl;
! cbarg = is;
break;
case MOD_PROTO_TCP:
! tcps = stack->netstack_tcp;
! ptbl = tcps->tcps_propinfo_tbl;
! cbarg = tcps;
break;
case MOD_PROTO_UDP:
! us = stack->netstack_udp;
! ptbl = us->us_propinfo_tbl;
! cbarg = us;
break;
case MOD_PROTO_SCTP:
! sctps = stack->netstack_sctp;
! ptbl = sctps->sctps_propinfo_tbl;
! cbarg = sctps;
break;
default:
miocnak(q, mp, 0, EINVAL);
return;
}
! /* search for given property in respective protocol propinfo table */
! for (pinfo = ptbl; pinfo->mpi_name != NULL; pinfo++) {
! if (strcmp(pinfo->mpi_name, pioc->mpr_name) == 0 &&
! pinfo->mpi_proto == pioc->mpr_proto)
! break;
! }
! if (pinfo->mpi_name == NULL) {
miocnak(q, mp, 0, ENOENT);
return;
}
set = (iocp->ioc_cmd == SIOCSETPROP) ? B_TRUE : B_FALSE;
if (set && pinfo->mpi_setf != NULL) {
cr = msg_getcred(mp, NULL);
if (cr == NULL)
cr = iocp->ioc_cr;
! err = pinfo->mpi_setf(cbarg, cr, pinfo, pioc->mpr_ifname,
pioc->mpr_val, pioc->mpr_flags);
} else if (!set && pinfo->mpi_getf != NULL) {
! err = pinfo->mpi_getf(cbarg, pinfo, pioc->mpr_ifname,
pioc->mpr_val, pioc->mpr_valsize, pioc->mpr_flags);
} else {
err = EPERM;
}
--- 8874,8916 ----
switch (pioc->mpr_proto) {
case MOD_PROTO_IP:
case MOD_PROTO_IPV4:
case MOD_PROTO_IPV6:
ptbl = ipst->ips_propinfo_tbl;
break;
case MOD_PROTO_RAWIP:
! ptbl = stack->netstack_icmp->is_propinfo_tbl;
break;
case MOD_PROTO_TCP:
! ptbl = stack->netstack_tcp->tcps_propinfo_tbl;
break;
case MOD_PROTO_UDP:
! ptbl = stack->netstack_udp->us_propinfo_tbl;
break;
case MOD_PROTO_SCTP:
! ptbl = stack->netstack_sctp->sctps_propinfo_tbl;
break;
default:
miocnak(q, mp, 0, EINVAL);
return;
}
! pinfo = mod_prop_lookup(ptbl, pioc->mpr_name, pioc->mpr_proto);
! if (pinfo == NULL) {
miocnak(q, mp, 0, ENOENT);
return;
}
set = (iocp->ioc_cmd == SIOCSETPROP) ? B_TRUE : B_FALSE;
if (set && pinfo->mpi_setf != NULL) {
cr = msg_getcred(mp, NULL);
if (cr == NULL)
cr = iocp->ioc_cr;
! err = pinfo->mpi_setf(stack, cr, pinfo, pioc->mpr_ifname,
pioc->mpr_val, pioc->mpr_flags);
} else if (!set && pinfo->mpi_getf != NULL) {
! err = pinfo->mpi_getf(stack, pinfo, pioc->mpr_ifname,
pioc->mpr_val, pioc->mpr_valsize, pioc->mpr_flags);
} else {
err = EPERM;
}
*** 8953,8963 ****
{
struct iocblk *iocp = (struct iocblk *)mp->b_rptr;
mblk_t *mp1 = mp->b_cont;
char *pname, *pval, *buf;
uint_t bufsize, proto;
! mod_prop_info_t *ptbl = NULL, *pinfo = NULL;
ip_stack_t *ipst;
int err = 0;
ASSERT(CONN_Q(q));
ipst = CONNQ_TO_IPST(q);
--- 8935,8945 ----
{
struct iocblk *iocp = (struct iocblk *)mp->b_rptr;
mblk_t *mp1 = mp->b_cont;
char *pname, *pval, *buf;
uint_t bufsize, proto;
! mod_prop_info_t *pinfo = NULL;
ip_stack_t *ipst;
int err = 0;
ASSERT(CONN_Q(q));
ipst = CONNQ_TO_IPST(q);
*** 8980,9002 ****
} else {
miocnak(q, mp, 0, EINVAL);
return;
}
! ptbl = ipst->ips_propinfo_tbl;
! for (pinfo = ptbl; pinfo->mpi_name != NULL; pinfo++) {
! if (strcmp(pinfo->mpi_name, pname) == 0 &&
! pinfo->mpi_proto == proto)
! break;
! }
- ASSERT(pinfo->mpi_name != NULL);
-
switch (iocp->ioc_cmd) {
case ND_GET:
! if ((err = pinfo->mpi_getf(ipst, pinfo, NULL, buf, bufsize,
! 0)) == 0) {
miocack(q, mp, iocp->ioc_count, 0);
return;
}
break;
case ND_SET:
--- 8962,8977 ----
} else {
miocnak(q, mp, 0, EINVAL);
return;
}
! pinfo = mod_prop_lookup(ipst->ips_propinfo_tbl, pname, proto);
switch (iocp->ioc_cmd) {
case ND_GET:
! if ((err = pinfo->mpi_getf(ipst->ips_netstack, pinfo, NULL, buf,
! bufsize, 0)) == 0) {
miocack(q, mp, iocp->ioc_count, 0);
return;
}
break;
case ND_SET:
*** 9008,9019 ****
while (*pval++)
noop;
if (!*pval || pval >= (char *)mp1->b_wptr) {
err = EINVAL;
! } else if ((err = pinfo->mpi_setf(ipst, NULL, pinfo, NULL,
! pval, 0)) == 0) {
miocack(q, mp, 0, 0);
return;
}
break;
default:
--- 8983,8994 ----
while (*pval++)
noop;
if (!*pval || pval >= (char *)mp1->b_wptr) {
err = EINVAL;
! } else if ((err = pinfo->mpi_setf(ipst->ips_netstack, NULL,
! pinfo, NULL, pval, 0)) == 0) {
miocack(q, mp, 0, 0);
return;
}
break;
default: