aggr_ctl.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
269473047d747f7815af570197e4ef7322d3632cEvan Yan * CDDL HEADER START
269473047d747f7815af570197e4ef7322d3632cEvan Yan * The contents of this file are subject to the terms of the
269473047d747f7815af570197e4ef7322d3632cEvan Yan * Common Development and Distribution License, Version 1.0 only
269473047d747f7815af570197e4ef7322d3632cEvan Yan * (the "License"). You may not use this file except in compliance
269473047d747f7815af570197e4ef7322d3632cEvan Yan * with the License.
269473047d747f7815af570197e4ef7322d3632cEvan Yan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
269473047d747f7815af570197e4ef7322d3632cEvan Yan * See the License for the specific language governing permissions
269473047d747f7815af570197e4ef7322d3632cEvan Yan * and limitations under the License.
269473047d747f7815af570197e4ef7322d3632cEvan Yan * When distributing Covered Code, include this CDDL HEADER in each
269473047d747f7815af570197e4ef7322d3632cEvan Yan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
269473047d747f7815af570197e4ef7322d3632cEvan Yan * If applicable, add the following below this CDDL HEADER, with the
269473047d747f7815af570197e4ef7322d3632cEvan Yan * fields enclosed by brackets "[]" replaced with your own identifying
269473047d747f7815af570197e4ef7322d3632cEvan Yan * information: Portions Copyright [yyyy] [name of copyright owner]
269473047d747f7815af570197e4ef7322d3632cEvan Yan * CDDL HEADER END
269473047d747f7815af570197e4ef7322d3632cEvan Yan * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
269473047d747f7815af570197e4ef7322d3632cEvan Yan * Use is subject to license terms.
269473047d747f7815af570197e4ef7322d3632cEvan Yan#pragma ident "%Z%%M% %I% %E% SMI"
269473047d747f7815af570197e4ef7322d3632cEvan Yan * IEEE 802.3ad Link Aggregation -- IOCTL processing.
269473047d747f7815af570197e4ef7322d3632cEvan Yanstatic int aggr_ioc_create(int, void *, int);
269473047d747f7815af570197e4ef7322d3632cEvan Yanstatic int aggr_ioc_delete(int, void *, int);
269473047d747f7815af570197e4ef7322d3632cEvan Yanstatic int aggr_ioc_info(int, void *, int);
269473047d747f7815af570197e4ef7322d3632cEvan Yanstatic int aggr_ioc_add_remove(int, void *, int);
269473047d747f7815af570197e4ef7322d3632cEvan Yanstatic int aggr_ioc_status(int, void *, int);
269473047d747f7815af570197e4ef7322d3632cEvan Yanstatic int aggr_ioc_modify(int, void *, int);
269473047d747f7815af570197e4ef7322d3632cEvan Yantypedef struct ioc_cmd_s {
269473047d747f7815af570197e4ef7322d3632cEvan Yan int (*ic_func)(int, void *, int);
269473047d747f7815af570197e4ef7322d3632cEvan Yan/*ARGSUSED*/
269473047d747f7815af570197e4ef7322d3632cEvan Yanaggr_open(dev_t *devp, int flag, int otyp, cred_t *cred_p)
269473047d747f7815af570197e4ef7322d3632cEvan Yan /* only the control interface can be opened */
269473047d747f7815af570197e4ef7322d3632cEvan Yan return (0);
269473047d747f7815af570197e4ef7322d3632cEvan Yan/*ARGSUSED*/
269473047d747f7815af570197e4ef7322d3632cEvan Yanaggr_close(dev_t dev, int flag, int otyp, cred_t *cred_p)
269473047d747f7815af570197e4ef7322d3632cEvan Yan return (0);
269473047d747f7815af570197e4ef7322d3632cEvan Yan * Process a LAIOC_MODIFY request.
269473047d747f7815af570197e4ef7322d3632cEvan Yan/* ARGSUSED */
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyin(arg, STRUCT_BUF(modify_arg), STRUCT_SIZE(modify_arg)) != 0)
269473047d747f7815af570197e4ef7322d3632cEvan Yan modify_mask_arg = STRUCT_FGET(modify_arg, lu_modify_mask);
269473047d747f7815af570197e4ef7322d3632cEvan Yan bcopy(STRUCT_FGET(modify_arg, lu_mac), mac_addr, ETHERADDRL);
269473047d747f7815af570197e4ef7322d3632cEvan Yan lacp_timer = STRUCT_FGET(modify_arg, lu_lacp_timer);
269473047d747f7815af570197e4ef7322d3632cEvan Yan return (aggr_grp_modify(key, NULL, modify_mask, policy, mac_fixed,
269473047d747f7815af570197e4ef7322d3632cEvan Yan * Process a LAIOC_CREATE request.
269473047d747f7815af570197e4ef7322d3632cEvan Yan/* ARGSUSED */
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyin(arg, STRUCT_BUF(create_arg), STRUCT_SIZE(create_arg)) != 0)
269473047d747f7815af570197e4ef7322d3632cEvan Yan lacp_timer = STRUCT_FGET(create_arg, lc_lacp_timer);
269473047d747f7815af570197e4ef7322d3632cEvan Yan ports = kmem_alloc(nports * sizeof (laioc_port_t), KM_SLEEP);
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyin(STRUCT_FGETP(create_arg, lc_ports), ports,
269473047d747f7815af570197e4ef7322d3632cEvan Yan bcopy(STRUCT_FGET(create_arg, lc_mac), mac_addr, ETHERADDRL);
269473047d747f7815af570197e4ef7322d3632cEvan Yan rc = aggr_grp_create(STRUCT_FGET(create_arg, lc_key),
269473047d747f7815af570197e4ef7322d3632cEvan Yan nports, ports, policy, mac_fixed, mac_addr, lacp_mode, lacp_timer);
269473047d747f7815af570197e4ef7322d3632cEvan Yan/* ARGSUSED */
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyin(arg, STRUCT_BUF(delete_arg), STRUCT_SIZE(delete_arg)) != 0)
269473047d747f7815af570197e4ef7322d3632cEvan Yan return (aggr_grp_delete(STRUCT_FGET(delete_arg, ld_key)));
269473047d747f7815af570197e4ef7322d3632cEvan Yantypedef struct aggr_ioc_info_state {
269473047d747f7815af570197e4ef7322d3632cEvan Yanaggr_ioc_info_new_grp(void *arg, uint32_t key, uchar_t *mac,
269473047d747f7815af570197e4ef7322d3632cEvan Yan boolean_t mac_fixed, uint32_t policy, uint32_t nports,
269473047d747f7815af570197e4ef7322d3632cEvan Yan aggr_lacp_mode_t lacp_mode, aggr_lacp_timer_t lacp_timer)
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyout(&grp, state->where, sizeof (grp)) != 0)
269473047d747f7815af570197e4ef7322d3632cEvan Yan return (0);
269473047d747f7815af570197e4ef7322d3632cEvan Yanaggr_ioc_info_new_port(void *arg, char *devname, uint32_t portnum,
269473047d747f7815af570197e4ef7322d3632cEvan Yan uchar_t *mac, aggr_port_state_t portstate, aggr_lacp_state_t *lacp_state)
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyout(&port, state->where, sizeof (port)) != 0)
269473047d747f7815af570197e4ef7322d3632cEvan Yan return (0);
269473047d747f7815af570197e4ef7322d3632cEvan Yan/*ARGSUSED*/
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyin(arg, &info_arg, sizeof (info_arg)) != 0)
269473047d747f7815af570197e4ef7322d3632cEvan Yan * Key of the group to return. If zero, the call returns information
269473047d747f7815af570197e4ef7322d3632cEvan Yan * regarding all groups currently defined.
269473047d747f7815af570197e4ef7322d3632cEvan Yan state.bytes_left = info_arg.li_bufsize - sizeof (laioc_info_t);
269473047d747f7815af570197e4ef7322d3632cEvan Yan state.where = (uchar_t *)arg + sizeof (laioc_info_t);
269473047d747f7815af570197e4ef7322d3632cEvan Yan rc = aggr_grp_info(&ngroups, group_key, &state, aggr_ioc_info_new_grp,
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (rc == 0) {
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyout(&info_arg, arg, sizeof (info_arg)) != 0)
269473047d747f7815af570197e4ef7322d3632cEvan Yan/*ARGSUSED*/
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyin(arg, STRUCT_BUF(add_rem_arg), STRUCT_SIZE(add_rem_arg)) != 0)
269473047d747f7815af570197e4ef7322d3632cEvan Yan ports = kmem_alloc(nports * sizeof (laioc_port_t), KM_SLEEP);
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyin(STRUCT_FGETP(add_rem_arg, la_ports), ports,
269473047d747f7815af570197e4ef7322d3632cEvan Yan rc = aggr_grp_add_ports(STRUCT_FGET(add_rem_arg, la_key),
269473047d747f7815af570197e4ef7322d3632cEvan Yan rc = aggr_grp_rem_ports(STRUCT_FGET(add_rem_arg, la_key),
269473047d747f7815af570197e4ef7322d3632cEvan Yan/*ARGSUSED*/
269473047d747f7815af570197e4ef7322d3632cEvan Yan if (copyin(arg, STRUCT_BUF(rem_arg), STRUCT_SIZE(rem_arg)) != 0)
269473047d747f7815af570197e4ef7322d3632cEvan Yan ports = kmem_alloc(nports * sizeof (laioc_port_t), KM_SLEEP);
269473047d747f7815af570197e4ef7322d3632cEvan Yan rc = aggr_grp_rem_ports(STRUCT_FGET(rem_arg, la_key),
269473047d747f7815af570197e4ef7322d3632cEvan Yan/*ARGSUSED*/
269473047d747f7815af570197e4ef7322d3632cEvan Yanaggr_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cr, int *rv)
269473047d747f7815af570197e4ef7322d3632cEvan Yan for (i = 0; i < sizeof (ioc_cmd) / sizeof (ioc_cmd_t); i++) {