int brport(char *ifname, int ifs, int argc, char **argv) { int set, i; struct brc *x; if (NO_ARG(argv[0])) { set = 0; argv++; argc--; } else set = 1; x = (struct brc *) genget(argv[0], (char **)brps, sizeof(struct brc)); if (x == 0) { printf("%% Internal error - Invalid argument %s\n", argv[0]); return 0; } else if (Ambiguous(x)) { printf("%% Internal error - Ambiguous argument %s\n", argv[0]); return 0; } argv++; argc--; if (argc == 0) { printf("%% %s <if> [if]...\n", x->name); printf("%% no %s <if> [if]...\n", x->name); return(0); } for (i = 0; i < argc; i++) { if (!is_valid_ifname(argv[i]) || is_bridge(ifs, argv[i])) { printf("%% Invalid interface name %s\n", argv[i]); continue; } switch(x->type) { case BRPORT_MEMBER: if (set) { /* adding a member activates a bridge */ set_ifflag(ifs, ifname, IFF_UP); bridge_add(ifs, ifname, argv[i]); } else bridge_delete(ifs, ifname, argv[i]); break; case BRPORT_SPAN: if (set) bridge_addspan(ifs, ifname, argv[i]); else bridge_delspan(ifs, ifname, argv[i]); break; case BRPORT_BLOCKNONIP: if (set) bridge_ifsetflag(ifs, ifname, argv[i], IFBIF_BLOCKNONIP); else bridge_ifclrflag(ifs, ifname, argv[i], IFBIF_BLOCKNONIP); break; case BRPORT_DISCOVER: if (set) bridge_ifsetflag(ifs, ifname, argv[i], IFBIF_DISCOVER); else bridge_ifclrflag(ifs, ifname, argv[i], IFBIF_DISCOVER); break; case BRPORT_LEARN: if (set) bridge_ifsetflag(ifs, ifname, argv[i], IFBIF_LEARNING); else bridge_ifclrflag(ifs, ifname, argv[i], IFBIF_LEARNING); break; case BRPORT_STP: if (set) bridge_ifsetflag(ifs, ifname, argv[i], IFBIF_STP); else bridge_ifclrflag(ifs, ifname, argv[i], IFBIF_STP); break; } } return(0); }
int intsyncdev(char *ifname, int ifs, int argc, char **argv) { struct ifreq ifr; struct pfsyncreq preq; int set; if (NO_ARG(argv[0])) { set = 0; argc--; argv++; } else set = 1; argc--; argv++; if ((!set && argc > 1) || (set && argc != 1)) { printf("%% syncdev <if>\n"); printf("%% no syncdev [if]\n"); return (0); } if (!MIN_ARG(ifname, "pfsync")) { printf("%% syncdev is only for pfsync devices\n"); return 0; } bzero((char *) &preq, sizeof(struct pfsyncreq)); ifr.ifr_data = (caddr_t) & preq; strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); if (ioctl(ifs, SIOCGETPFSYNC, (caddr_t) & ifr) == -1) { printf("%% intsyncdev: SIOCGETPFSYNC: %s\n", strerror(errno)); return (0); } if (argv[0]) if (!is_valid_ifname(argv[0])) { printf("%% Interface not found: %s\n", argv[0]); return (0); } if (set) { strlcpy(preq.pfsyncr_syncdev, argv[0], sizeof(preq.pfsyncr_syncdev)); set_ifflag(ifs, ifname, IFF_UP); } else bzero((char *) &preq.pfsyncr_syncdev, sizeof(preq.pfsyncr_syncdev)); if (ioctl(ifs, SIOCSETPFSYNC, (caddr_t) & ifr) == -1) { if (errno == ENOBUFS) printf("%% Invalid synchronization interface: %s\n", argv[0]); else printf("%% intsyncdev: SIOCSETPFSYNC: %s\n", strerror(errno)); } return (0); }