* Constructor for a node */
| 379 | * Constructor for a node |
| 380 | */ |
| 381 | static int |
| 382 | ng_eiface_constructor(node_p node) |
| 383 | { |
| 384 | struct ifnet *ifp; |
| 385 | priv_p priv; |
| 386 | struct ether_addr eaddr; |
| 387 | |
| 388 | /* Allocate node and interface private structures */ |
| 389 | priv = malloc(sizeof(*priv), M_NETGRAPH, M_WAITOK | M_ZERO); |
| 390 | |
| 391 | ifp = priv->ifp = if_alloc(IFT_ETHER); |
| 392 | if (ifp == NULL) { |
| 393 | free(priv, M_NETGRAPH); |
| 394 | return (ENOSPC); |
| 395 | } |
| 396 | |
| 397 | /* Link them together */ |
| 398 | ifp->if_softc = priv; |
| 399 | |
| 400 | /* Get an interface unit number */ |
| 401 | priv->unit = alloc_unr(V_ng_eiface_unit); |
| 402 | |
| 403 | /* Link together node and private info */ |
| 404 | NG_NODE_SET_PRIVATE(node, priv); |
| 405 | priv->node = node; |
| 406 | |
| 407 | /* Initialize interface structure */ |
| 408 | if_initname(ifp, NG_EIFACE_EIFACE_NAME, priv->unit); |
| 409 | ifp->if_init = ng_eiface_init; |
| 410 | ifp->if_output = ether_output; |
| 411 | ifp->if_start = ng_eiface_start; |
| 412 | ifp->if_ioctl = ng_eiface_ioctl; |
| 413 | ifp->if_snd.ifq_maxlen = ifqmaxlen; |
| 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; |
| 417 | ifmedia_init(&priv->media, 0, ng_eiface_mediachange, |
| 418 | ng_eiface_mediastatus); |
| 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; |
| 429 | |
| 430 | /* Give this node the same name as the interface (if possible) */ |
| 431 | if (ng_name_node(node, ifp->if_xname) != 0) |
| 432 | log(LOG_WARNING, "%s: can't acquire netgraph name\n", |
| 433 | ifp->if_xname); |
| 434 | |
| 435 | /* Attach the interface */ |
| 436 | ether_gen_addr(ifp, &eaddr); |
| 437 | ether_ifattach(ifp, eaddr.octet); |
| 438 | ifp->if_baudrate = ifmedia_baudrate(IFM_ETHER | IFM_1000_T); |
nothing calls this directly
no test coverage detected