34#include <sys/eventhandler.h>
37#include <sys/kernel.h>
38#include <sys/malloc.h>
42#include <sys/sockio.h>
43#include <sys/socket.h>
44#include <sys/syslog.h>
47#include <net/if_var.h>
48#include <net/if_media.h>
49#include <net/if_types.h>
50#include <net/netisr.h>
60#include <net/ethernet.h>
61#include <net/if_arp.h>
97static void ng_eiface_print_ioctl(
struct ifnet *
ifp,
int cmd, caddr_t
data);
125#define V_ng_eiface_unit VNET(ng_eiface_unit)
138 struct ifreq *
const ifr = (
struct ifreq *)
data;
142 ng_eiface_print_ioctl(ifp, command,
data);
147 error = ether_ioctl(ifp, command,
data);
158 if (ifp->if_flags & IFF_UP) {
159 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
160 ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE);
161 ifp->if_drv_flags |= IFF_DRV_RUNNING;
164 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
165 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING |
176 ifp->if_mtu = ifr->ifr_mtu;
182 error = ifmedia_ioctl(ifp, ifr, &
priv->media, command);
205 struct ifnet *ifp = sc->ifp;
207 ifp->if_drv_flags |= IFF_DRV_RUNNING;
208 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
219 struct ifnet *ifp = arg1;
226 if (!((ifp->if_flags & IFF_UP) &&
227 (ifp->if_drv_flags & IFF_DRV_RUNNING)))
234 IF_DEQUEUE(&ifp->if_snd, m);
241 m_tag_delete_chain(m, NULL);
250 if (ifp->if_flags & IFF_MONITOR) {
251 if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
266 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
268 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
271 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
295 if (ifp->if_drv_flags & IFF_DRV_OACTIVE)
298 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
301 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
310ng_eiface_print_ioctl(
struct ifnet *ifp,
int command, caddr_t
data)
314 switch (command & IOC_DIRMASK) {
330 log(LOG_DEBUG,
"%s: %s('%c', %d, char[%d])\n",
335 IOCPARM_LEN(command));
346 struct ifmedia *ifm = &
priv->media;
348 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
350 if (IFM_SUBTYPE(ifm->ifm_media) == IFM_AUTO)
351 ifp->if_baudrate = ifmedia_baudrate(IFM_ETHER | IFM_1000_T);
353 ifp->if_baudrate = ifmedia_baudrate(ifm->ifm_media);
362 struct ifmedia *ifm = &
priv->media;
364 if (ifm->ifm_cur->ifm_media == (IFM_ETHER | IFM_AUTO) &&
365 (
priv->link_status & IFM_ACTIVE))
366 ifmr->ifm_active = IFM_ETHER | IFM_1000_T | IFM_FDX;
368 ifmr->ifm_active = ifm->ifm_cur->ifm_media;
369 ifmr->ifm_status =
priv->link_status;
386 struct ether_addr eaddr;
389 priv = malloc(
sizeof(*
priv), M_NETGRAPH, M_WAITOK | M_ZERO);
391 ifp =
priv->ifp = if_alloc(IFT_ETHER);
393 free(
priv, M_NETGRAPH);
398 ifp->if_softc =
priv;
410 ifp->if_output = ether_output;
414 ifp->if_flags = (IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST);
415 ifp->if_capabilities = IFCAP_VLAN_MTU | IFCAP_JUMBO_MTU;
416 ifp->if_capenable = IFCAP_VLAN_MTU | IFCAP_JUMBO_MTU;
419 ifmedia_add(&
priv->media, IFM_ETHER | IFM_10_T, 0, NULL);
420 ifmedia_add(&
priv->media, IFM_ETHER | IFM_10_T | IFM_FDX, 0, NULL);
421 ifmedia_add(&
priv->media, IFM_ETHER | IFM_100_TX, 0, NULL);
422 ifmedia_add(&
priv->media, IFM_ETHER | IFM_100_TX | IFM_FDX, 0, NULL);
423 ifmedia_add(&
priv->media, IFM_ETHER | IFM_1000_T, 0, NULL);
424 ifmedia_add(&
priv->media, IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
425 ifmedia_add(&
priv->media, IFM_ETHER | IFM_10G_T | IFM_FDX, 0, NULL);
426 ifmedia_add(&
priv->media, IFM_ETHER | IFM_AUTO, 0, NULL);
427 ifmedia_set(&
priv->media, IFM_ETHER | IFM_AUTO);
428 priv->link_status = IFM_AVALID;
432 log(LOG_WARNING,
"%s: can't acquire netgraph name\n",
436 ether_gen_addr(ifp, &eaddr);
437 ether_ifattach(ifp, eaddr.octet);
438 ifp->if_baudrate = ifmedia_baudrate(IFM_ETHER | IFM_1000_T);
451 struct ifnet *ifp =
priv->ifp;
454 return (EPFNOSUPPORT);
455 if (
priv->ether != NULL)
461 priv->link_status |= IFM_ACTIVE;
462 CURVNET_SET_QUIET(ifp->if_vnet);
463 if_link_state_change(ifp, LINK_STATE_UP);
476 struct ifnet *
const ifp =
priv->ifp;
491 error = if_setlladdr(
priv->ifp,
492 (u_char *)msg->
data, ETHER_ADDR_LEN);
502 strlcpy(resp->
data, ifp->if_xname, IFNAMSIZ);
507 struct epoch_tracker et;
515 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
516 buflen += SA_SIZE(ifa->ifa_addr);
526 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
527 const int len = SA_SIZE(ifa->ifa_addr);
530 log(LOG_ERR,
"%s: len changed?\n",
534 bcopy(ifa->ifa_addr, ptr, len);
548 CURVNET_SET_QUIET(ifp->if_vnet);
551 priv->link_status |= IFM_ACTIVE;
552 if_link_state_change(ifp, LINK_STATE_UP);
555 priv->link_status &= ~IFM_ACTIVE;
556 if_link_state_change(ifp, LINK_STATE_DOWN);
579 struct ifnet *
const ifp =
priv->ifp;
585 if (!((ifp->if_flags & IFF_UP) &&
586 (ifp->if_drv_flags & IFF_DRV_RUNNING))) {
591 if (m->m_len < ETHER_HDR_LEN) {
592 m = m_pullup(m, ETHER_HDR_LEN);
598 m->m_pkthdr.rcvif = ifp;
601 if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
603 (*ifp->if_input)(ifp, m);
616 struct ifnet *
const ifp =
priv->ifp;
622 CURVNET_SET_QUIET(ifp->if_vnet);
624 ifmedia_removeall(&
priv->media);
628 free(
priv, M_NETGRAPH);
643 priv->link_status &= ~IFM_ACTIVE;
644 CURVNET_SET_QUIET(
priv->ifp->if_vnet);
645 if_link_state_change(
priv->ifp, LINK_STATE_DOWN);
#define NG_OUTBOUND_THREAD_UNREF()
#define NG_HOOK_NODE(hook)
#define NG_HOOK_SET_TO_INBOUND(hook)
int ng_rcvmsg_t(node_p node, item_p item, hook_p lasthook)
int ng_disconnect_t(hook_p hook)
#define NG_NODE_SET_PRIVATE(node, val)
#define NG_RESPOND_MSG(error, here, item, resp)
#define NG_NODE_UNREF(node)
#define NG_HOOK_SET_PRIVATE(hook, val)
#define NG_OUTBOUND_THREAD_REF()
#define NG_SEND_DATA_ONLY(error, hook, m)
int ng_rcvdata_t(hook_p hook, item_p item)
int ng_shutdown_t(node_p node)
#define NG_FREE_ITEM(item)
int ng_name_node(node_p node, const char *name)
int ng_constructor_t(node_p node)
int ng_send_fn(node_p node, hook_p hook, ng_item_fn *fn, void *arg1, int arg2)
#define NGI_GET_MSG(i, m)
#define NG_NODE_PRIVATE(node)
int ng_newhook_t(node_p node, hook_p hook, const char *name)
VNET_SYSINIT(vnet_ng_eiface_init, SI_SUB_PSEUDO, SI_ORDER_ANY, vnet_ng_eiface_init, NULL)
static void ng_eiface_start2(node_p node, hook_p hook, void *arg1, int arg2)
static ng_constructor_t ng_eiface_constructor
static ng_shutdown_t ng_eiface_rmnode
static void ng_eiface_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
static void vnet_ng_eiface_uninit(const void *unused)
static void vnet_ng_eiface_init(const void *unused)
static void ng_eiface_start(struct ifnet *ifp)
static struct ng_type typestruct
static ng_newhook_t ng_eiface_newhook
VNET_DEFINE_STATIC(struct unrhdr *, ng_eiface_unit)
static int ng_eiface_mediachange(struct ifnet *ifp)
VNET_SYSUNINIT(vnet_ng_eiface_uninit, SI_SUB_INIT_IF, SI_ORDER_ANY, vnet_ng_eiface_uninit, NULL)
static ng_rcvmsg_t ng_eiface_rcvmsg
static void ng_eiface_init(void *xsc)
static ng_disconnect_t ng_eiface_disconnect
static ng_rcvdata_t ng_eiface_rcvdata
static const struct ng_cmdlist ng_eiface_cmdlist[]
struct ng_eiface_private * priv_p
static int ng_eiface_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
NETGRAPH_INIT(eiface, &typestruct)
static int ng_eiface_mod_event(module_t, int, void *)
#define NG_EIFACE_MTU_MAX
#define NGM_EIFACE_COOKIE
#define NG_EIFACE_MTU_MIN
#define NG_EIFACE_HOOK_ETHER
#define NG_EIFACE_NODE_TYPE
#define NG_EIFACE_EIFACE_NAME
#define NG_MKRESPONSE(rsp, msg, len, how)
const struct ng_parse_type ng_parse_enaddr_type
const struct ng_parse_type ng_parse_string_type
struct ng_mesg::ng_msghdr header