7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * CDDL HEADER START
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * The contents of this file are subject to the terms of the
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Common Development and Distribution License (the "License").
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * You may not use this file except in compliance with the License.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * or http://www.opensolaris.org/os/licensing.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * See the License for the specific language governing permissions
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * and limitations under the License.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * When distributing Covered Code, include this CDDL HEADER in each
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * If applicable, add the following below this CDDL HEADER, with the
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * fields enclosed by brackets "[]" replaced with your own identifying
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * information: Portions Copyright [yyyy] [name of copyright owner]
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * CDDL HEADER END
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Use is subject to license terms.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <sys/param.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <sys/atomic.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <sys/kmem.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <sys/rwlock.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <sys/errno.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <sys/queue.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <inet/common.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <inet/led.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <inet/ip.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <sys/neti.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed#include <sys/zone.h>
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedstatic net_handle_t net_find(const char *protocol, neti_stack_t *ns);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedstatic net_handle_t
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_find(const char *protocol, neti_stack_t *nts)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed struct net_data *n;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(protocol != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(nts != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed LIST_FOREACH(n, &nts->nts_netd_head, netd_list) {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(n->netd_info.netp_name != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed /*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * If they're trying to find a protocol that is being
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * shutdown, just ignore it..
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (n->netd_condemned != 0)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed continue;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (strcmp(n->netd_info.netp_name, protocol) == 0) {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed break;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed }
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed }
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (n);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_handle_t
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_protocol_register(netid_t id, const net_protocol_t *info)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed struct net_data *n, *new;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed neti_stack_t *nts;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed nts = net_getnetistackbyid(id);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (nts == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed new = kmem_alloc(sizeof (*new), KM_SLEEP);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed new->netd_refcnt = 1;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed new->netd_hooks = NULL;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed new->netd_info = *info;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed new->netd_stack = nts;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed new->netd_condemned = 0;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed mutex_enter(&nts->nts_lock);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed n = net_find(info->netp_name, nts);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (n != NULL) {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed mutex_exit(&nts->nts_lock);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed kmem_free(new, sizeof (*new));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed }
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (LIST_EMPTY(&nts->nts_netd_head)) {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed LIST_INSERT_HEAD(&nts->nts_netd_head, new, netd_list);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed } else {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed LIST_INSERT_AFTER(LIST_FIRST(&nts->nts_netd_head),
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed new, netd_list);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed }
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed mutex_exit(&nts->nts_lock);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (new);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_protocol_unregister(net_handle_t info)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed neti_stack_t *nts;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed nts = info->netd_stack;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(nts != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed mutex_enter(&nts->nts_lock);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed LIST_REMOVE(info, netd_list);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed info->netd_stack = NULL;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed mutex_exit(&nts->nts_lock);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed (void) net_protocol_release(info);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (0);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_handle_t
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_protocol_lookup(netid_t netid, const char *protocol)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed neti_stack_t *nts;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed net_handle_t nd;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(protocol != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed nts = net_getnetistackbyid(netid);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (nts == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed mutex_enter(&nts->nts_lock);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed nd = net_find(protocol, nts);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (nd != NULL)
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32((uint_t *)&nd->netd_refcnt);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed mutex_exit(&nts->nts_lock);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (nd);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Note: the man page specifies "returns -1 if the value passed in is unknown
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * to this framework". We are not doing a lookup in this function, just a
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * simply add to the netd_refcnt of the net_handle_t passed in, so -1 is never a
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * return value.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_protocol_release(net_handle_t info)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info->netd_refcnt > 0);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed /*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Is this safe? No hold on nts_lock? Consider that if the caller
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * of net_protocol_release() is going to free this structure then
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * it is now the only owner (refcnt==1) and it will have been
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * removed from the nts_netd_head list on the neti_stack_t from a
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * call to net_protocol_unregister already, so it is thus an orphan.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek if (atomic_dec_32_nv((uint_t *)&info->netd_refcnt) == 0) {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info->netd_hooks == NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info->netd_stack == NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed kmem_free(info, sizeof (struct net_data));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed }
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (0);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_handle_t
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_protocol_walk(netid_t netid, net_handle_t info)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed struct net_data *n = NULL;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed boolean_t found = B_FALSE;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed neti_stack_t *nts;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed nts = net_getnetistackbyid(netid);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(nts != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed found = B_TRUE;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed mutex_enter(&nts->nts_lock);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed LIST_FOREACH(n, &nts->nts_netd_head, netd_list) {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (found) {
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed /*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * We are only interested in finding protocols that
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * are not in some sort of shutdown state. There is
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * no need to check for netd_stack==NULL because
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * that implies it is no longer on this list.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (n->netd_condemned == 0)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed continue;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed break;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed }
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (n == info)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed found = B_TRUE;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed }
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info != NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed (void) net_protocol_release(info);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (n != NULL)
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32((uint_t *)&n->netd_refcnt);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed mutex_exit(&nts->nts_lock);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (n);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Public accessor functions
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_getifname(net_handle_t info, phy_if_t nic, char *buffer,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed const size_t buflen)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_getifname(info, nic, buffer, buflen));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_getmtu(net_handle_t info, phy_if_t nic, lif_if_t ifdata)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_getmtu(info, nic, ifdata));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_getpmtuenabled(net_handle_t info)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_getpmtuenabled(info));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_getlifaddr(net_handle_t info, phy_if_t nic, lif_if_t ifdata,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed int nelem, net_ifaddr_t type[], void *storage)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_getlifaddr(info, nic, ifdata,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed nelem, type, storage));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirkint
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirknet_getlifzone(net_handle_t info, phy_if_t phy_ifdata, lif_if_t ifdata,
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk zoneid_t *zoneid)
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk{
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk ASSERT(info != NULL);
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk if (info->netd_condemned != 0 || info->netd_stack == NULL)
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk return (-1);
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk return (info->netd_info.neti_getlifzone(info, phy_ifdata, ifdata,
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk zoneid));
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk}
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirkint
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirknet_getlifflags(net_handle_t info, phy_if_t phy_ifdata, lif_if_t ifdata,
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk uint64_t *flags)
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk{
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk ASSERT(info != NULL);
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk if (info->netd_condemned != 0 || info->netd_stack == NULL)
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk return (-1);
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk return (info->netd_info.neti_getlifflags(info, phy_ifdata, ifdata,
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk flags));
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk}
b127ac411761a3d8d642d9342d9cac2785e1faaaPhilip Kirk
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedphy_if_t
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_phygetnext(net_handle_t info, phy_if_t nic)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return ((phy_if_t)-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_phygetnext(info, nic));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedphy_if_t
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_phylookup(net_handle_t info, const char *name)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return ((phy_if_t)-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_phylookup(info, name));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedlif_if_t
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_lifgetnext(net_handle_t info, phy_if_t ifidx, lif_if_t ifdata)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return ((lif_if_t)-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_lifgetnext(info, ifidx, ifdata));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_inject(net_handle_t info, inject_t style, net_inject_t *packet)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_inject(info, style, packet));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedphy_if_t
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_routeto(net_handle_t info, struct sockaddr *address, struct sockaddr *next)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return ((phy_if_t)-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_routeto(info, address, next));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_ispartialchecksum(net_handle_t info, mblk_t *mp)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(mp != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_ispartialchecksum(info, mp));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_isvalidchecksum(net_handle_t info, mblk_t *mp)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(mp != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (info->netd_info.netp_isvalidchecksum(info, mp));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Hooks related functions
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Function: net_family_register
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Returns: int - 0 = Succ, Else = Fail
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Parameters: info(I) - protocol
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * hf(I) - family pointer
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Call hook_family_add to register family
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * There is no need to bump netd_refcnt in the two functions
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * net_family_register and net_family_unregister because the caller of these
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * two functions is assumed to "own" a reference on 'info' via an earlier
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * call to net_protocol_register(). Thus the owner is expected to do a
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * call to net_protocol_unregister() after having done a
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * net_family_unregister() to make sure things are properly cleaned up.
4a9b8375b74044a5b0fc0191eb42b835e72b65c0Darren Reed * Passing a pointer to info->netd_hooks into hook_family_add is required
4a9b8375b74044a5b0fc0191eb42b835e72b65c0Darren Reed * so that this can be set before the notify functions are called. If this
4a9b8375b74044a5b0fc0191eb42b835e72b65c0Darren Reed * does not happen, the notify function may do something that seems fine,
4a9b8375b74044a5b0fc0191eb42b835e72b65c0Darren Reed * like add a notify function to the family but cause a panic because
4a9b8375b74044a5b0fc0191eb42b835e72b65c0Darren Reed * netd_hooks is NULL when we get to hook_family_notify_register.
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_family_register(net_handle_t info, hook_family_t *hf)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed netstack_t *ns;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(hf != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (ESHUTDOWN);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_hooks != NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (EEXIST);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ns = info->netd_stack->nts_netstack;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(ns != NULL);
4a9b8375b74044a5b0fc0191eb42b835e72b65c0Darren Reed if (hook_family_add(hf, ns->netstack_hook,
4a9b8375b74044a5b0fc0191eb42b835e72b65c0Darren Reed (void **)&info->netd_hooks) == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (EEXIST);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (0);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Function: net_family_unregister
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Returns: int - transparent value, explained by caller
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Parameters: info(I) - protocol
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * hf(I) - family pointer
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Call hook_family_remove to unregister family
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_family_unregister(net_handle_t info, hook_family_t *hf)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed int ret;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(hf != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_hooks == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (ENXIO);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (strcmp(info->netd_hooks->hfi_family.hf_name,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed hf->hf_name) != 0)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (EINVAL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ret = hook_family_remove(info->netd_hooks);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (ret == 0)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed info->netd_hooks = NULL;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (ret);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reedint
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reednet_family_shutdown(net_handle_t info, hook_family_t *hf)
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed{
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed ASSERT(info != NULL);
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed ASSERT(hf != NULL);
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed if (info->netd_hooks == NULL)
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed return (ENXIO);
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed if (strcmp(info->netd_hooks->hfi_family.hf_name,
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed hf->hf_name) != 0)
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed return (EINVAL);
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed return (hook_family_shutdown(info->netd_hooks));
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed}
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Function: net_event_register
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Returns: internal event pointer - NULL = Fail
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Parameters: info(I) - protocol
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * he(I) - event pointer
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Call hook_event_add to register event on specific family
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Internal event pointer is returned so caller can get
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * handle to run hooks
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedhook_event_token_t
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_event_register(net_handle_t info, hook_event_t *he)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed hook_event_int_t *hei;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(he != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_hooks == NULL || info->netd_condemned != 0 ||
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed hei = hook_event_add(info->netd_hooks, he);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return ((hook_event_token_t)hei);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Function: net_event_unregister
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Returns: int - transparent value, explained by caller
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Parameters: info(I) - protocol
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * he(I) - event pointer
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Call hook_event_remove to unregister event on specific family
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_event_unregister(net_handle_t info, hook_event_t *he)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(he != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_hooks == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (ENXIO);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (hook_event_remove(info->netd_hooks, he));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reedint
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reednet_event_shutdown(net_handle_t info, hook_event_t *he)
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed{
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed ASSERT(info != NULL);
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed ASSERT(he != NULL);
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed if (info->netd_hooks == NULL)
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed return (ENXIO);
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed return (hook_event_shutdown(info->netd_hooks, he));
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed}
8ad7418892268f9f0ba29518ab332f6a26f69fc5Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Function: net_hook_register
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Returns: int - transparent value, explained by caller
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Parameters: info(I) - protocol
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * event(I) - event name
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * h(I) - hook pointer
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Call hook_register to add hook on specific family/event
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_hook_register(net_handle_t info, char *event, hook_t *h)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(event != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(h != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_condemned != 0 || info->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (ESHUTDOWN);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_hooks == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (ENXIO);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (hook_register(info->netd_hooks, event, h));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Function: net_hook_unregister
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Returns: int - transparent value, explained by caller
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Parameters: info(I) - protocol
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * event(I) - event name
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * h(I) - hook pointer
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Call hook_unregister to remove hook on specific family/event
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed */
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_hook_unregister(net_handle_t info, char *event, hook_t *h)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(info != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(event != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ASSERT(h != NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (info->netd_hooks == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (ENXIO);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (hook_unregister(info->netd_hooks, event, h));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednetid_t
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_getnetid(net_handle_t netd)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (netd->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (-1);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (netd->netd_stack->nts_id);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_inject_t *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_inject_alloc(const int version)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed net_inject_t *ni;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ni = kmem_zalloc(sizeof (*ni), KM_NOSLEEP);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (ni == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ni->ni_version = version;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (ni);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedvoid
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_inject_free(net_inject_t *ni)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed kmem_free(ni, sizeof (*ni));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedkstat_t *
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_kstat_create(netid_t netid, char *module, int instance, char *name,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed char *class, uchar_t type, ulong_t ndata, uchar_t ks_flag)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed netstackid_t stackid = net_getnetstackidbynetid(netid);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (stackid == -1)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (NULL);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (kstat_create_netstack(module, instance, name, class, type,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed ndata, ks_flag, stackid));
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedvoid
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_kstat_delete(netid_t netid, kstat_t *ks)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed netstackid_t stackid = net_getnetstackidbynetid(netid);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (stackid != -1)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed kstat_delete_netstack(ks, stackid);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_event_notify_register(net_handle_t family, char *event,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed hook_notify_fn_t callback, void *arg)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed int error;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (family->netd_condemned != 0 || family->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (ESHUTDOWN);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed error = hook_event_notify_register(family->netd_hooks, event,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed callback, arg);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (error);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_event_notify_unregister(net_handle_t family, char *event,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed hook_notify_fn_t callback)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed int error;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed error = hook_event_notify_unregister(family->netd_hooks, event,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed callback);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (error);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_protocol_notify_register(net_handle_t family, hook_notify_fn_t callback,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed void *arg)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed int error;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (family->netd_condemned != 0 || family->netd_stack == NULL)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (ESHUTDOWN);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed error = hook_family_notify_register(family->netd_hooks, callback,
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed arg);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (error);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reedint
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reednet_protocol_notify_unregister(net_handle_t family, hook_notify_fn_t callback)
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed{
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed int error;
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed error = hook_family_notify_unregister(family->netd_hooks, callback);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed return (error);
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed}