Lines Matching +full:no +full:- +full:ether +full:- +full:link

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
70 #include "link.h"
96 #include "ether.h"
99 #define PPPOE_NODE_TYPE_LEN (sizeof NG_PPPOE_NODE_TYPE - 1) /* "PPPoE" */
111 ((d)->type == ETHER_DEVICE ? (struct etherdevice *)d : NULL)
122 struct etherdevice *dev = device2ether(p->handler); in ether_Write()
124 return NgSendData(p->fd, dev->hook, v, n) == -1 ? -1 : (ssize_t)n; in ether_Write()
132 return NgRecvData(p->fd, v, n, hook); in ether_Read()
138 struct etherdevice *dev = device2ether(p->handler); in ether_RemoveFromSet()
141 if (r && dev->cs >= 0 && FD_ISSET(dev->cs, r)) { in ether_RemoveFromSet()
142 FD_CLR(dev->cs, r); in ether_RemoveFromSet()
143 log_Printf(LogTIMER, "%s: fdunset(ctrl) %d\n", p->link.name, dev->cs); in ether_RemoveFromSet()
150 p->handler->removefromset = NULL; in ether_RemoveFromSet()
152 p->handler->removefromset = ether_RemoveFromSet; in ether_RemoveFromSet()
160 struct etherdevice *dev = device2ether(p->handler); in ether_Free()
163 if (dev->cs != -1) in ether_Free()
164 close(dev->cs); in ether_Free()
171 struct etherdevice *dev = device2ether(p->handler); in ether_OpenInfo()
173 switch (dev->connected) { in ether_OpenInfo()
186 struct etherdevice *dev = device2ether(p->handler); in ether_Slot()
188 return dev->slot; in ether_Slot()
208 if (dev->cs >= 0) { in ether_device2iov()
209 *auxfd = dev->cs; in ether_device2iov()
227 if (dev->cs < 0) in ether_MessageIn()
237 FD_SET(dev->cs, r); in ether_MessageIn()
239 ret = select(dev->cs + 1, r, NULL, NULL, &t); in ether_MessageIn()
244 if (NgRecvMsg(dev->cs, rep, sizeof msgbuf, NULL) <= 0) in ether_MessageIn()
247 if (rep->header.version != NG_VERSION) { in ether_MessageIn()
249 (long)rep->header.version, (long)NG_VERSION); in ether_MessageIn()
253 if (rep->header.typecookie != NGM_PPPOE_COOKIE) { in ether_MessageIn()
255 (long)rep->header.typecookie, (long)NGM_PPPOE_COOKIE); in ether_MessageIn()
260 switch (rep->header.cmd) { in ether_MessageIn()
271 if (setenv("ACNAME", sts->hook, 1) != 0) in ether_MessageIn()
272 log_Printf(LogWARN, "setenv: cannot set ACNAME=%s: %m", sts->hook); in ether_MessageIn()
273 asciilen = rep->header.arglen; in ether_MessageIn()
284 dev->slot = slot; in ether_MessageIn()
287 snprintf(unknown, sizeof unknown, "<%d>", (int)rep->header.cmd); in ether_MessageIn()
294 msg, asciilen, sts->hook); in ether_MessageIn()
298 switch (rep->header.cmd) { in ether_MessageIn()
300 dev->connected = CARRIER_OK; in ether_MessageIn()
304 dev->connected = CARRIER_LOST; in ether_MessageIn()
314 struct etherdevice *dev = device2ether(p->handler); in ether_AwaitCarrier()
316 if (dev->connected != CARRIER_OK && !dev->timeout--) in ether_AwaitCarrier()
317 dev->connected = CARRIER_LOST; in ether_AwaitCarrier()
318 else if (dev->connected == CARRIER_PENDING) in ether_AwaitCarrier()
321 return dev->connected; in ether_AwaitCarrier()
326 "ether",
360 dev->cs = *auxfd; in ether_iov2device()
361 (*nauxfd)--; in ether_iov2device()
363 dev->cs = -1; in ether_iov2device()
366 memcpy(&dev->dev, &baseetherdevice, sizeof dev->dev); in ether_iov2device()
368 physical_SetupStack(p, dev->dev.name, PHYSICAL_FORCE_SYNCNOACF); in ether_iov2device()
369 return &dev->dev; in ether_iov2device()
379 struct etherdevice *dev = device2ether(p->handler); in ether_UpdateSet()
382 if (r && dev->cs >= 0) { in ether_UpdateSet()
383 FD_SET(dev->cs, r); in ether_UpdateSet()
384 log_Printf(LogTIMER, "%s(ctrl): fdset(r) %d\n", p->link.name, dev->cs); in ether_UpdateSet()
398 struct etherdevice *dev = device2ether(p->handler); in ether_IsSet()
401 result = dev->cs >= 0 && FD_ISSET(dev->cs, fdset); in ether_IsSet()
412 struct etherdevice *dev = device2ether(p->handler); in ether_DescriptorRead()
414 if (dev->cs >= 0 && FD_ISSET(dev->cs, fdset)) { in ether_DescriptorRead()
416 if (dev->connected == CARRIER_LOST) { in ether_DescriptorRead()
417 log_Printf(LogPHASE, "%s: Device disconnected\n", p->link.name); in ether_DescriptorRead()
418 datalink_Down(p->dl, CLOSE_NORMAL); in ether_DescriptorRead()
431 close(dev->cs); in ether_Abandon()
432 close(p->fd); in ether_Abandon()
433 p->fd = -2; /* Nobody else need try.. */ in ether_Abandon()
455 if (p->fd < 0 && !strncasecmp(p->name.full, NG_PPPOE_NODE_TYPE, in ether_Create()
457 p->name.full[PPPOE_NODE_TYPE_LEN] == ':') { in ether_Create()
465 char connectpath[sizeof dev->hook + 2]; /* .:<hook> */ in ether_Create()
467 p->fd--; /* We own the device - change fd */ in ether_Create()
475 iface = p->name.full + PPPOE_NODE_TYPE_LEN + 1; in ether_Create()
479 ifacelen = provider - iface; in ether_Create()
491 * .---------. in ether_Create()
492 * | ether | in ether_Create()
493 * | <iface> | dev->cs in ether_Create()
494 * `---------' | in ether_Create()
495 * (orphan) p->fd | in ether_Create()
499 * .---------. .-----------. in ether_Create()
501 * | <iface> |(tunN)<---->(tunN)| <unnamed> | in ether_Create()
502 * `--------- `-----------' in ether_Create()
506 * `--->(tunX) in ether_Create()
510 if (ID0NgMkSockNode(NULL, &dev->cs, &p->fd) == -1) { in ether_Create()
514 p->fd = -2; in ether_Create()
519 * Ask for a list of hooks attached to the "ether" node. This node should in ether_Create()
524 if (NgSendMsg(dev->cs, path, NGM_GENERIC_COOKIE, NGM_LISTHOOKS, in ether_Create()
533 if (NgRecvMsg(dev->cs, resp, sizeof rbuf, NULL) <= 0) { in ether_Create()
539 hlist = (const struct hooklist *)resp->data; in ether_Create()
540 ninfo = &hlist->nodeinfo; in ether_Create()
543 if (strncmp(ninfo->type, NG_ETHER_NODE_TYPE, in ether_Create()
544 sizeof NG_ETHER_NODE_TYPE - 1)) { in ether_Create()
546 NG_ETHER_NODE_TYPE "'')\n", path, ninfo->type); in ether_Create()
551 path, ninfo->id); in ether_Create()
554 for (f = 0; f < ninfo->hooks; f++) { in ether_Create()
555 nlink = &hlist->link[f]; in ether_Create()
557 log_Printf(LogDEBUG, " Found %s -> %s\n", nlink->ourhook, in ether_Create()
558 nlink->peerhook); in ether_Create()
560 if (!strcmp(nlink->ourhook, NG_ETHER_HOOK_ORPHAN) || in ether_Create()
561 !strcmp(nlink->ourhook, NG_ETHER_HOOK_DIVERT)) { in ether_Create()
563 * Something is using the data coming out of this ``ether'' node. in ether_Create()
567 if (!strcmp(nlink->nodeinfo.type, NG_PPPOE_NODE_TYPE)) in ether_Create()
569 snprintf(ngc.path, sizeof ngc.path, "[%x]:", nlink->nodeinfo.id); in ether_Create()
572 path, nlink->nodeinfo.type); in ether_Create()
579 if (f == ninfo->hooks) { in ether_Create()
581 * Create a new ``PPPoE'' node connected to the ``ether'' node using in ether_Create()
587 snprintf(etherid, sizeof etherid, "[%x]:", ninfo->id); in ether_Create()
589 log_Printf(LogDEBUG, "Creating PPPoE netgraph node %s%s -> %s\n", in ether_Create()
592 if (NgSendMsg(dev->cs, etherid, NGM_GENERIC_COOKIE, in ether_Create()
602 snprintf(dev->hook, sizeof dev->hook, "%s%d", in ether_Create()
603 TUN_NAME, p->dl->bundle->unit); in ether_Create()
609 snprintf(ngc.ourhook, sizeof ngc.ourhook, "%s", dev->hook); in ether_Create()
612 log_Printf(LogDEBUG, "Connecting netgraph socket .:%s -> %s:%s\n", in ether_Create()
614 if (NgSendMsg(dev->cs, ".:", NGM_GENERIC_COOKIE, in ether_Create()
625 p->link.name, path); in ether_Create()
627 snprintf(connectpath, sizeof connectpath, ".:%s", dev->hook); in ether_Create()
630 if (p->cfg.pppoe_configured) { in ether_Create()
631 mode = p->cfg.nonstandard_pppoe ? NG_PPPOE_NONSTANDARD : NG_PPPOE_STANDARD; in ether_Create()
632 if (NgSendMsg(dev->cs, connectpath, NGM_PPPOE_COOKIE, in ether_Create()
633 NGM_PPPOE_SETMODE, mode, strlen(mode) + 1) == -1) { in ether_Create()
643 snprintf(data->hook, sizeof data->hook, "%s", dev->hook); in ether_Create()
644 memcpy(data->data, provider, providerlen); in ether_Create()
645 data->data_len = providerlen; in ether_Create()
648 if (NgSendMsg(dev->cs, connectpath, NGM_PPPOE_COOKIE, in ether_Create()
649 NGM_PPPOE_CONNECT, data, sizeof *data + providerlen) == -1) { in ether_Create()
655 /* Hook things up so that we monitor dev->cs */ in ether_Create()
656 p->desc.UpdateSet = ether_UpdateSet; in ether_Create()
657 p->desc.IsSet = ether_IsSet; in ether_Create()
658 p->desc.Read = ether_DescriptorRead; in ether_Create()
660 memcpy(&dev->dev, &baseetherdevice, sizeof dev->dev); in ether_Create()
661 switch (p->cfg.cd.necessity) { in ether_Create()
663 dev->dev.cd.delay = p->cfg.cd.delay; in ether_Create()
666 dev->dev.cd = p->cfg.cd; in ether_Create()
670 p->link.name, dev->dev.cd.delay); in ether_Create()
675 dev->timeout = dev->dev.cd.delay; in ether_Create()
676 dev->connected = CARRIER_PENDING; in ether_Create()
677 /* This will be overridden by our session id - if provided by netgraph */ in ether_Create()
678 dev->slot = GetIfIndex(path); in ether_Create()
683 if (fstat(p->fd, &st) != -1 && (st.st_mode & S_IFSOCK)) { in ether_Create()
689 if (getsockname(p->fd, sock, &sz) == -1) { in ether_Create()
690 log_Printf(LogPHASE, "%s: Link is a closed socket !\n", p->link.name); in ether_Create()
691 close(p->fd); in ether_Create()
692 p->fd = -1; in ether_Create()
696 if (sock->sa_family == AF_NETGRAPH) { in ether_Create()
701 log_Printf(LogPHASE, "%s: Link is a netgraph node\n", p->link.name); in ether_Create()
704 log_Printf(LogWARN, "%s: Cannot allocate an ether device: %s\n", in ether_Create()
705 p->link.name, strerror(errno)); in ether_Create()
709 memcpy(&dev->dev, &baseetherdevice, sizeof dev->dev); in ether_Create()
710 dev->cs = -1; in ether_Create()
711 dev->timeout = 0; in ether_Create()
712 dev->connected = CARRIER_OK; in ether_Create()
713 *dev->hook = '\0'; in ether_Create()
724 dev->slot = end != sessionid && *end == '\0' ? slot : 0; in ether_Create()
726 dev->slot = 0; in ether_Create()
732 physical_SetupStack(p, dev->dev.name, PHYSICAL_FORCE_SYNCNOACF); in ether_Create()
733 return &dev->dev; in ether_Create()