65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/* $Id$ */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/** @file
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * VBoxNetAdapter - Network Adapter Driver (Host), Solaris Specific Code.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/*
d1d578bcfa0fcb019ef9cde17b7e493625143ab9vboxsync * Copyright (C) 2009-2012 Oracle Corporation
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync *
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * available from http://www.virtualbox.org. This file is free software;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * you can redistribute it and/or modify it under the terms of the GNU
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * General Public License (GPL) as published by the Free Software
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d1d578bcfa0fcb019ef9cde17b7e493625143ab9vboxsync *
d1d578bcfa0fcb019ef9cde17b7e493625143ab9vboxsync * The contents of this file may alternatively be used under the terms
d1d578bcfa0fcb019ef9cde17b7e493625143ab9vboxsync * of the Common Development and Distribution License Version 1.0
d1d578bcfa0fcb019ef9cde17b7e493625143ab9vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
d1d578bcfa0fcb019ef9cde17b7e493625143ab9vboxsync * VirtualBox OSE distribution, in which case the provisions of the
d1d578bcfa0fcb019ef9cde17b7e493625143ab9vboxsync * CDDL are applicable instead of those of the GPL.
d1d578bcfa0fcb019ef9cde17b7e493625143ab9vboxsync *
d1d578bcfa0fcb019ef9cde17b7e493625143ab9vboxsync * You may elect to license modified versions of this file under the
d1d578bcfa0fcb019ef9cde17b7e493625143ab9vboxsync * terms and conditions of either the GPL or the CDDL or both.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/*******************************************************************************
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync* Header Files *
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync*******************************************************************************/
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync#define LOG_GROUP LOG_GROUP_NET_ADP_DRV
87902654924b5893d165c3f31f1d8a50f87205b4vboxsync#ifdef DEBUG_ramshankar
1e564d9937b98dc6016ebcb9d83cb3635819baebvboxsync# define LOG_ENABLED
87902654924b5893d165c3f31f1d8a50f87205b4vboxsync# define LOG_INSTANCE RTLogRelDefaultInstance()
87902654924b5893d165c3f31f1d8a50f87205b4vboxsync#endif
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <VBox/log.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <VBox/err.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <VBox/version.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <iprt/assert.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <iprt/semaphore.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <iprt/initterm.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <iprt/assert.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <iprt/mem.h>
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync#include <iprt/rand.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/types.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/dlpi.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/types.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/param.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/stat.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/stream.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/stropts.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/strsun.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/modctl.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/ddi.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/sunddi.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/sunldi.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#include <sys/gld.h>
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
97dc19418e21b4b87280756668cf171a4332e498vboxsync#include "../VBoxNetAdpInternal.h"
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/*******************************************************************************
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync* Defined Constants And Macros *
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync*******************************************************************************/
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#define DEVICE_NAME "vboxnet"
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/** The module descriptions as seen in 'modinfo'. */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync#define DEVICE_DESC_DRV "VirtualBox NetAdp"
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
a7327719907518e1a890c41ab95b5a58252afe3cvboxsync
87902654924b5893d165c3f31f1d8a50f87205b4vboxsync/*******************************************************************************
87902654924b5893d165c3f31f1d8a50f87205b4vboxsync* Internal Functions *
87902654924b5893d165c3f31f1d8a50f87205b4vboxsync*******************************************************************************/
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int VBoxNetAdpSolarisAttach(dev_info_t *pDip, ddi_attach_cmd_t enmCmd);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int VBoxNetAdpSolarisDetach(dev_info_t *pDip, ddi_detach_cmd_t enmCmd);
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsyncstatic int VBoxNetAdpSolarisQuiesceNotNeeded(dev_info_t *pDip);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Streams: module info.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic struct module_info g_VBoxNetAdpSolarisModInfo =
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync 0x0dd, /* module id */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync DEVICE_NAME,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync 0, /* min. packet size */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync INFPSZ, /* max. packet size */
43bb4d90097ef9a9d7fc597315d0869427609694vboxsync 0, /* hi-water mark */
43bb4d90097ef9a9d7fc597315d0869427609694vboxsync 0 /* lo-water mark */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync};
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Streams: read queue hooks.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic struct qinit g_VBoxNetAdpSolarisReadQ =
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync NULL, /* read */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync gld_rsrv,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync gld_open,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync gld_close,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync NULL, /* admin (reserved) */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync &g_VBoxNetAdpSolarisModInfo,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync NULL /* module stats */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync};
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Streams: write queue hooks.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic struct qinit g_VBoxNetAdpSolarisWriteQ =
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync gld_wput,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync gld_wsrv,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync NULL, /* open */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync NULL, /* close */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync NULL, /* admin (reserved) */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync &g_VBoxNetAdpSolarisModInfo,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync NULL /* module stats */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync};
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Streams: IO stream tab.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic struct streamtab g_VBoxNetAdpSolarisStreamTab =
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync &g_VBoxNetAdpSolarisReadQ,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync &g_VBoxNetAdpSolarisWriteQ,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync NULL, /* muxread init */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync NULL /* muxwrite init */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync};
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * cb_ops: driver char/block entry points
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic struct cb_ops g_VBoxNetAdpSolarisCbOps =
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nulldev, /* cb open */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nulldev, /* cb close */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nodev, /* b strategy */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nodev, /* b dump */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nodev, /* b print */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nodev, /* cb read */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nodev, /* cb write */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nodev, /* cb ioctl */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nodev, /* c devmap */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nodev, /* c mmap */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nodev, /* c segmap */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nochpoll, /* c poll */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync ddi_prop_op, /* property ops */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync &g_VBoxNetAdpSolarisStreamTab,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync D_MP, /* compat. flag */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync CB_REV /* revision */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync};
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * dev_ops: driver entry/exit and other ops.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic struct dev_ops g_VBoxNetAdpSolarisDevOps =
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync DEVO_REV, /* driver build revision */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync 0, /* ref count */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync gld_getinfo,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nulldev, /* identify */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nulldev, /* probe */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync VBoxNetAdpSolarisAttach,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync VBoxNetAdpSolarisDetach,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync nodev, /* reset */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync &g_VBoxNetAdpSolarisCbOps,
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync (struct bus_ops *)0,
3fa78bc85ec3388c0600fb4470002b1b45deda11vboxsync nodev, /* power */
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync VBoxNetAdpSolarisQuiesceNotNeeded
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync};
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * modldrv: export driver specifics to kernel
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic struct modldrv g_VBoxNetAdpSolarisDriver =
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync &mod_driverops, /* extern from kernel */
10cebb5ddf375a361848bc6b8ac781c257690da3vboxsync DEVICE_DESC_DRV " " VBOX_VERSION_STRING "r" RT_XSTR(VBOX_SVN_REV),
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync &g_VBoxNetAdpSolarisDevOps
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync};
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * modlinkage: export install/remove/info to the kernel
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic struct modlinkage g_VBoxNetAdpSolarisModLinkage =
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync MODREV_1, /* loadable module system revision */
463386f314aa3ce4676249803f0c0736f4561301vboxsync {
463386f314aa3ce4676249803f0c0736f4561301vboxsync &g_VBoxNetAdpSolarisDriver, /* adapter streams driver framework */
463386f314aa3ce4676249803f0c0736f4561301vboxsync NULL /* terminate array of linkage structures */
463386f314aa3ce4676249803f0c0736f4561301vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync};
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/*******************************************************************************
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync* Global Variables *
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync*******************************************************************************/
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/** The default ethernet broadcast address */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic uchar_t achBroadcastAddr[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * vboxnetadp_state_t: per-instance data
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsynctypedef struct vboxnetadp_state_t
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync dev_info_t *pDip; /* device info. */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync RTMAC FactoryMac; /* default 'factory' MAC address */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync RTMAC CurrentMac; /* current MAC address */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync} vboxnetadp_state_t;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/*******************************************************************************
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync* Internal Functions *
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync*******************************************************************************/
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisGenerateMac(PRTMAC pMac);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisSetMacAddress(gld_mac_info_t *pMacInfo, unsigned char *pszMacAddr);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisSend(gld_mac_info_t *pMacInfo, mblk_t *pMsg);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisStub(gld_mac_info_t *pMacInfo);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisSetPromisc(gld_mac_info_t *pMacInfo, int fPromisc);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisSetMulticast(gld_mac_info_t *pMacInfo, unsigned char *pMulticastAddr, int fMulticast);
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsyncstatic int vboxNetAdpSolarisGetStats(gld_mac_info_t *pMacInfo, struct gld_stats *pStats);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Kernel entry points
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncint _init(void)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
1e564d9937b98dc6016ebcb9d83cb3635819baebvboxsync LogFunc((DEVICE_NAME ":_init\n"));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync /*
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Prevent module autounloading.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync modctl_t *pModCtl = mod_getctl(&g_VBoxNetAdpSolarisModLinkage);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync if (pModCtl)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pModCtl->mod_loadflags |= MOD_NOAUTOUNLOAD;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync else
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync LogRel((DEVICE_NAME ":failed to disable autounloading!\n"));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync /*
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Initialize IPRT.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync int rc = RTR0Init(0);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync if (RT_SUCCESS(rc))
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync rc = mod_install(&g_VBoxNetAdpSolarisModLinkage);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync if (!rc)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return rc;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync LogRel((DEVICE_NAME ":mod_install failed. rc=%d\n", rc));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync RTR0Term();
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync else
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync LogRel((DEVICE_NAME ":failed to initialize IPRT (rc=%d)\n", rc));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return RTErrConvertToErrno(rc);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncint _fini(void)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
1e564d9937b98dc6016ebcb9d83cb3635819baebvboxsync LogFunc((DEVICE_NAME ":_fini\n"));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync /*
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Undo the work done during start (in reverse order).
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync RTR0Term();
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return mod_remove(&g_VBoxNetAdpSolarisModLinkage);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncint _info(struct modinfo *pModInfo)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
1e564d9937b98dc6016ebcb9d83cb3635819baebvboxsync LogFunc((DEVICE_NAME ":_info\n"));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync int rc = mod_info(&g_VBoxNetAdpSolarisModLinkage, pModInfo);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
1e564d9937b98dc6016ebcb9d83cb3635819baebvboxsync Log((DEVICE_NAME ":_info returns %d\n", rc));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return rc;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Attach entry point, to attach a device to the system or resume it.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync *
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * @param pDip The module structure instance.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * @param enmCmd Operation type (attach/resume).
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync *
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * @returns corresponding solaris error code.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int VBoxNetAdpSolarisAttach(dev_info_t *pDip, ddi_attach_cmd_t enmCmd)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
1e564d9937b98dc6016ebcb9d83cb3635819baebvboxsync LogFunc((DEVICE_NAME ":VBoxNetAdpSolarisAttach pDip=%p enmCmd=%d\n", pDip, enmCmd));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync int rc = -1;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync switch (enmCmd)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync case DDI_ATTACH:
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync gld_mac_info_t *pMacInfo = gld_mac_alloc(pDip);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync if (pMacInfo)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync vboxnetadp_state_t *pState = RTMemAllocZ(sizeof(vboxnetadp_state_t));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync if (pState)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pState->pDip = pDip;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync /*
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * Setup GLD MAC layer registration info.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_reset = vboxNetAdpSolarisStub;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_start = vboxNetAdpSolarisStub;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_stop = vboxNetAdpSolarisStub;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_set_mac_addr = vboxNetAdpSolarisSetMacAddress;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_set_multicast = vboxNetAdpSolarisSetMulticast;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_set_promiscuous = vboxNetAdpSolarisSetPromisc;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_send = vboxNetAdpSolarisSend;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_intr = NULL;
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pMacInfo->gldm_get_stats = vboxNetAdpSolarisGetStats;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_ioctl = NULL;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_ident = DEVICE_NAME;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_type = DL_ETHER;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_minpkt = 0;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_maxpkt = VBOXNETADP_MTU;
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pMacInfo->gldm_capabilities = GLD_CAP_LINKSTATE;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync AssertCompile(sizeof(RTMAC) == ETHERADDRL);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_addrlen = ETHERADDRL;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_saplen = -2;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_broadcast_addr = achBroadcastAddr;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_ppa = ddi_get_instance(pState->pDip);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_devinfo = pState->pDip;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_private = (caddr_t)pState;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync /*
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * We use a semi-random MAC addresses similar to a guest NIC's MAC address
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * as the default factory address of the interface.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync rc = vboxNetAdpSolarisGenerateMac(&pState->FactoryMac);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync if (RT_SUCCESS(rc))
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync bcopy(&pState->FactoryMac, &pState->CurrentMac, sizeof(RTMAC));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMacInfo->gldm_vendor_addr = (unsigned char *)&pState->FactoryMac;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync /*
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Now try registering our GLD with the MAC layer.
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * Registration can fail on some S10 versions when the MTU size is more than 1500.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * When we implement jumbo frames we should probably retry with MTU 1500 for S10.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync rc = gld_register(pDip, (char *)ddi_driver_name(pDip), pMacInfo);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync if (rc == DDI_SUCCESS)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync ddi_report_dev(pDip);
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync gld_linkstate(pMacInfo, GLD_LINKSTATE_UP);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return DDI_SUCCESS;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync else
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync LogRel((DEVICE_NAME ":VBoxNetAdpSolarisAttach failed to register GLD. rc=%d\n", rc));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync else
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync LogRel((DEVICE_NAME ":VBoxNetAdpSolarisAttach failed to generate mac address.rc=%d\n"));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync RTMemFree(pState);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync else
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync LogRel((DEVICE_NAME ":VBoxNetAdpSolarisAttach failed to alloc state.\n"));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync gld_mac_free(pMacInfo);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync else
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync LogRel((DEVICE_NAME ":VBoxNetAdpSolarisAttach failed to alloc mac structure.\n"));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return DDI_FAILURE;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync case DDI_RESUME:
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync /* Nothing to do here... */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return DDI_SUCCESS;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
463386f314aa3ce4676249803f0c0736f4561301vboxsync
463386f314aa3ce4676249803f0c0736f4561301vboxsync /* case DDI_PM_RESUME: */
463386f314aa3ce4676249803f0c0736f4561301vboxsync default:
463386f314aa3ce4676249803f0c0736f4561301vboxsync return DDI_FAILURE;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync/**
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Detach entry point, to detach a device to the system or suspend it.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync *
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * @param pDip The module structure instance.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * @param enmCmd Operation type (detach/suspend).
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync *
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * @returns corresponding solaris error code.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int VBoxNetAdpSolarisDetach(dev_info_t *pDip, ddi_detach_cmd_t enmCmd)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
1e564d9937b98dc6016ebcb9d83cb3635819baebvboxsync LogFunc((DEVICE_NAME ":VBoxNetAdpSolarisDetach pDip=%p enmCmd=%d\n", pDip, enmCmd));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync switch (enmCmd)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync case DDI_DETACH:
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync /*
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync * Unregister and clean up.
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync gld_mac_info_t *pMacInfo = ddi_get_driver_private(pDip);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync if (pMacInfo)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync vboxnetadp_state_t *pState = (vboxnetadp_state_t *)pMacInfo->gldm_private;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync if (pState)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync gld_linkstate(pMacInfo, GLD_LINKSTATE_DOWN);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync int rc = gld_unregister(pMacInfo);
e8360046bf56d03d114dcd9c8e273d00e1985f43vboxsync if (rc == DDI_SUCCESS)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync gld_mac_free(pMacInfo);
97dc19418e21b4b87280756668cf171a4332e498vboxsync RTMemFree(pState);
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return DDI_SUCCESS;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync else
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync LogRel((DEVICE_NAME ":VBoxNetAdpSolarisDetach failed to unregister GLD from MAC layer.rc=%d\n", rc));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync else
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync LogRel((DEVICE_NAME ":VBoxNetAdpSolarisDetach failed to get internal state.\n"));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync else
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync LogRel((DEVICE_NAME ":VBoxNetAdpSolarisDetach failed to get driver private GLD data.\n"));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return DDI_FAILURE;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync case DDI_RESUME:
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync {
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync /* Nothing to do here... */
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return DDI_SUCCESS;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
463386f314aa3ce4676249803f0c0736f4561301vboxsync
463386f314aa3ce4676249803f0c0736f4561301vboxsync /* case DDI_SUSPEND: */
463386f314aa3ce4676249803f0c0736f4561301vboxsync /* case DDI_HOTPLUG_DETACH: */
463386f314aa3ce4676249803f0c0736f4561301vboxsync default:
463386f314aa3ce4676249803f0c0736f4561301vboxsync return DDI_FAILURE;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync }
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync/**
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync * Quiesce not-needed entry point, as Solaris 10 doesn't have any
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync * ddi_quiesce_not_needed() function.
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync *
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync * @param pDip The module structure instance.
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync *
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync * @return corresponding solaris error code.
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync */
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsyncstatic int VBoxNetAdpSolarisQuiesceNotNeeded(dev_info_t *pDip)
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync{
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync return DDI_SUCCESS;
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync}
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync
5294b8bda3841180e9ed62cee43bd67ae6620d37vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisGenerateMac(PRTMAC pMac)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
fd5b0082a64ec49263419f41ddabf584b78d887evboxsync pMac->au8[0] = 0x08;
fd5b0082a64ec49263419f41ddabf584b78d887evboxsync pMac->au8[1] = 0x00;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync pMac->au8[2] = 0x27;
faff6adca592b2de8725db32b9476cbcb120ba57vboxsync RTRandBytes(&pMac->au8[3], 3);
1e564d9937b98dc6016ebcb9d83cb3635819baebvboxsync Log((DEVICE_NAME ":VBoxNetAdpSolarisGenerateMac Generated %.*Rhxs\n", sizeof(RTMAC), &pMac));
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return VINF_SUCCESS;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisSetMacAddress(gld_mac_info_t *pMacInfo, unsigned char *pszMacAddr)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync vboxnetadp_state_t *pState = (vboxnetadp_state_t *)pMacInfo->gldm_private;
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync if (pState)
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync {
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync bcopy(pszMacAddr, &pState->CurrentMac, sizeof(RTMAC));
1e564d9937b98dc6016ebcb9d83cb3635819baebvboxsync Log((DEVICE_NAME ":vboxNetAdpSolarisSetMacAddress updated MAC %.*Rhxs\n", sizeof(RTMAC), &pState->CurrentMac));
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync return GLD_SUCCESS;
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync }
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync else
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync LogRel((DEVICE_NAME ":vboxNetAdpSolarisSetMacAddress failed to get internal state.\n"));
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync return GLD_FAILURE;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisSend(gld_mac_info_t *pMacInfo, mblk_t *pMsg)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
ee1c2a1c43d1ac3a8b30a99c4f47a14adc835837vboxsync while (pMsg)
ee1c2a1c43d1ac3a8b30a99c4f47a14adc835837vboxsync {
ee1c2a1c43d1ac3a8b30a99c4f47a14adc835837vboxsync mblk_t *pMsgNext = pMsg->b_cont;
ee1c2a1c43d1ac3a8b30a99c4f47a14adc835837vboxsync pMsg->b_cont = NULL;
ee1c2a1c43d1ac3a8b30a99c4f47a14adc835837vboxsync freemsg(pMsg);
ee1c2a1c43d1ac3a8b30a99c4f47a14adc835837vboxsync pMsg = pMsgNext;
ee1c2a1c43d1ac3a8b30a99c4f47a14adc835837vboxsync }
691aac57c6f10a29a7507143a789f3dca28ed1f3vboxsync return GLD_SUCCESS;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisStub(gld_mac_info_t *pMacInfo)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync return GLD_SUCCESS;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisSetMulticast(gld_mac_info_t *pMacInfo, unsigned char *pMulticastAddr, int fMulticast)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
29890600941d8c492d0c52cc0daefda9bad1b538vboxsync return GLD_SUCCESS;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsyncstatic int vboxNetAdpSolarisSetPromisc(gld_mac_info_t *pMacInfo, int fPromisc)
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync{
97dc19418e21b4b87280756668cf171a4332e498vboxsync /* Host requesting promiscuous intnet connection... */
43bb4d90097ef9a9d7fc597315d0869427609694vboxsync return GLD_SUCCESS;
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync}
65acc9a737d682ad726d06327bf6f6ecc6eb7e83vboxsync
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsyncstatic int vboxNetAdpSolarisGetStats(gld_mac_info_t *pMacInfo, struct gld_stats *pStats)
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync{
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync /*
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync * For now fake up stats. Stats like duplex and speed are better set as they
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync * are used in utilities like dladm. Link state capabilities are critical
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync * as they are used by ipadm while trying to restore persistent interface configs.
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync vboxnetadp_state_t *pState = (vboxnetadp_state_t *)pMacInfo->gldm_private;
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync if (pState)
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync {
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_speed = 1000000000ULL; /* Bits/sec. */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_media = GLDM_UNKNOWN; /* Media/Connector Type */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_intr = 0; /* Interrupt count */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_norcvbuf = 0; /* Recv. discards */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_errxmt = 0; /* Xmit errors */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_errrcv = 0; /* Recv. errors */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_missed = 0; /* Pkt Drops on Recv. */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_underflow = 0; /* Buffer underflows */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_overflow = 0; /* Buffer overflows */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync /* Ether */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_frame = 0; /* Align errors */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_crc = 0; /* CRC errors */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_duplex = GLD_DUPLEX_FULL; /* Link duplex state */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_nocarrier = 0; /* Carrier sense errors */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_collisions = 0; /* Xmit Collisions */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_excoll = 0; /* Frame discard due to excess collisions */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_xmtlatecoll = 0; /* Late collisions */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_defer = 0; /* Deferred Xmits */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_dot3_first_coll = 0; /* Single collision frames */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_dot3_multi_coll = 0; /* Multiple collision frames */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_dot3_sqe_error = 0; /* SQE errors */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_dot3_mac_xmt_error = 0; /* MAC Xmit errors */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_dot3_mac_rcv_error = 0; /* Mac Recv. errors */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_dot3_frame_too_long = 0; /* Frame too long errors */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_short = 0; /* Runt frames */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync
6c3dd27b00d54628338468be96c177564a5b7afdvboxsync pStats->glds_noxmtbuf = 0; /* Xmit Buf errors */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_xmtretry = 0; /* Xmit retries */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_multixmt = 0; /* Multicast Xmits */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_multircv = 0; /* Multicast Recvs. */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_brdcstxmt = 0; /* Broadcast Xmits*/
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync pStats->glds_brdcstrcv = 0; /* Broadcast Recvs. */
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync return GLD_SUCCESS;
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync }
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync else
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync LogRel((DEVICE_NAME ":vboxNetAdpSolarisGetStats failed to get internal state.\n"));
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync return GLD_FAILURE;
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync}
fb7786ca005a8497b2a0c2f3058906a8f2325ef8vboxsync