int physical_doUpdateSet(struct fdescriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n, int force) { struct physical *p = descriptor2physical(d); int sets; sets = 0; if (p->fd >= 0) { if (r) { FD_SET(p->fd, r); log_Printf(LogTIMER, "%s: fdset(r) %d\n", p->link.name, p->fd); sets++; } if (e) { FD_SET(p->fd, e); log_Printf(LogTIMER, "%s: fdset(e) %d\n", p->link.name, p->fd); sets++; } if (w && (force || link_QueueLen(&p->link) || p->out)) { FD_SET(p->fd, w); log_Printf(LogTIMER, "%s: fdset(w) %d\n", p->link.name, p->fd); sets++; } if (sets && *n < p->fd + 1) *n = p->fd + 1; } return sets; }
/* * Arrange that each of our links has at least one packet. We keep the * number of packets queued at the link level to a minimum so that the * loss of a link in multi-link mode results in the minimum number of * dropped packets. */ size_t ncp_FillPhysicalQueues(struct ncp *ncp, struct bundle *bundle) { size_t total; if (bundle->ncp.mp.active) total = mp_FillPhysicalQueues(bundle); else { struct datalink *dl; size_t add; for (total = 0, dl = bundle->links; dl; dl = dl->next) if (dl->state == DATALINK_OPEN) { add = link_QueueLen(&dl->physical->link); if (add == 0 && dl->physical->out == NULL) add = ncp_PushPacket(ncp, &ncp->afq, &dl->physical->link); total += add; } } return total + ncp_QueueLen(&bundle->ncp); }
int physical_ShowStatus(struct cmdargs const *arg) { struct physical *p = arg->cx->physical; struct cd *cd; const char *dev; int n, slot; prompt_Printf(arg->prompt, "Name: %s\n", p->link.name); prompt_Printf(arg->prompt, " State: "); if (p->fd < 0) prompt_Printf(arg->prompt, "closed\n"); else { slot = physical_Slot(p); if (p->handler && p->handler->openinfo) { if (slot == -1) prompt_Printf(arg->prompt, "open (%s)\n", (*p->handler->openinfo)(p)); else prompt_Printf(arg->prompt, "open (%s, port %d)\n", (*p->handler->openinfo)(p), slot); } else if (slot == -1) prompt_Printf(arg->prompt, "open\n"); else prompt_Printf(arg->prompt, "open (port %d)\n", slot); } prompt_Printf(arg->prompt, " Device: %s", *p->name.full ? p->name.full : p->type == PHYS_DIRECT ? "unknown" : "N/A"); if (p->session_owner != (pid_t)-1) prompt_Printf(arg->prompt, " (session owner: %ld)", (long)p->session_owner); prompt_Printf(arg->prompt, "\n Link Type: %s\n", mode2Nam(p->type)); prompt_Printf(arg->prompt, " Connect Count: %d\n", p->connect_count); #ifdef TIOCOUTQ if (p->fd >= 0 && ioctl(p->fd, TIOCOUTQ, &n) >= 0) prompt_Printf(arg->prompt, " Physical outq: %d\n", n); #endif prompt_Printf(arg->prompt, " Queued Packets: %lu\n", (u_long)link_QueueLen(&p->link)); prompt_Printf(arg->prompt, " Phone Number: %s\n", arg->cx->phone.chosen); prompt_Printf(arg->prompt, "\nDefaults:\n"); prompt_Printf(arg->prompt, " Device List: "); dev = p->cfg.devlist; for (n = 0; n < p->cfg.ndev; n++) { if (n) prompt_Printf(arg->prompt, ", "); prompt_Printf(arg->prompt, "\"%s\"", dev); dev += strlen(dev) + 1; } prompt_Printf(arg->prompt, "\n Characteristics: "); if (physical_IsSync(arg->cx->physical)) prompt_Printf(arg->prompt, "sync"); else prompt_Printf(arg->prompt, "%dbps", p->cfg.speed); switch (p->cfg.parity & CSIZE) { case CS7: prompt_Printf(arg->prompt, ", cs7"); break; case CS8: prompt_Printf(arg->prompt, ", cs8"); break; } if (p->cfg.parity & PARENB) { if (p->cfg.parity & PARODD) prompt_Printf(arg->prompt, ", odd parity"); else prompt_Printf(arg->prompt, ", even parity"); } else prompt_Printf(arg->prompt, ", no parity"); prompt_Printf(arg->prompt, ", CTS/RTS %s\n", (p->cfg.rts_cts ? "on" : "off")); prompt_Printf(arg->prompt, " CD check delay: "); cd = p->handler ? &p->handler->cd : &p->cfg.cd; if (cd->necessity == CD_NOTREQUIRED) prompt_Printf(arg->prompt, "no cd"); else if (p->cfg.cd.necessity == CD_DEFAULT) { prompt_Printf(arg->prompt, "device specific"); } else { prompt_Printf(arg->prompt, "%d second%s", p->cfg.cd.delay, p->cfg.cd.delay == 1 ? "" : "s"); if (p->cfg.cd.necessity == CD_REQUIRED) prompt_Printf(arg->prompt, " (required!)"); } prompt_Printf(arg->prompt, "\n\n"); throughput_disp(&p->link.stats.total, arg->prompt); return 0; }