Exemplo n.º 1
0
static void
lagg_status(int s)
{
	struct lagg_protos lpr[] = LAGG_PROTOS;
	struct lagg_reqport rp, rpbuf[LAGG_MAX_PORTS];
	struct lagg_reqall ra;
	struct lagg_reqflags rf;
	struct lacp_opreq *lp;
	const char *proto = "<unknown>";
	bool isport = false;
	size_t i;

	bzero(&rp, sizeof(rp));
	bzero(&ra, sizeof(ra));

	strlcpy(rp.rp_ifname, name, sizeof(rp.rp_ifname));
	strlcpy(rp.rp_portname, name, sizeof(rp.rp_portname));

	if (ioctl(s, SIOCGLAGGPORT, &rp) == 0)
		isport = true;

	strlcpy(ra.ra_ifname, name, sizeof(ra.ra_ifname));
	ra.ra_size = sizeof(rpbuf);
	ra.ra_port = rpbuf;

	strlcpy(rf.rf_ifname, name, sizeof(rf.rf_ifname));
	if (ioctl(s, SIOCGLAGGFLAGS, &rf) != 0)
		rf.rf_flags = 0;

	if (ioctl(s, SIOCGLAGG, &ra) == 0) {
		lp = (struct lacp_opreq *)&ra.ra_lacpreq;

		for (i = 0; i < nitems(lpr); i++) {
			if ((int)ra.ra_proto == lpr[i].lpr_proto) {
				proto = lpr[i].lpr_name;
				break;
			}
		}

		printf("\tlaggproto %s", proto);
		if (rf.rf_flags & LAGG_F_HASHMASK) {
			const char *sep = "";

			printf(" lagghash ");
			if (rf.rf_flags & LAGG_F_HASHL2) {
				printf("%sl2", sep);
				sep = ",";
			}
			if (rf.rf_flags & LAGG_F_HASHL3) {
				printf("%sl3", sep);
				sep = ",";
			}
			if (rf.rf_flags & LAGG_F_HASHL4) {
				printf("%sl4", sep);
				sep = ",";
			}
		}
		if (isport)
			printf(" laggdev %s", rp.rp_ifname);
		putchar('\n');
		if (verbose && ra.ra_proto == LAGG_PROTO_LACP)
			printf("\tlag id: %s\n",
			    lacp_format_peer(lp, "\n\t\t "));

		for (i = 0; i < (size_t)ra.ra_ports; i++) {
			lp = (struct lacp_opreq *)&rpbuf[i].rp_lacpreq;
			printf("\tlaggport: %s ", rpbuf[i].rp_portname);
			printb("flags", rpbuf[i].rp_flags, LAGG_PORT_BITS);
			if (verbose && ra.ra_proto == LAGG_PROTO_LACP)
				printf(" state=%X", lp->actor_state);
			putchar('\n');
			if (verbose && ra.ra_proto == LAGG_PROTO_LACP)
				printf("\t\t%s\n",
				    lacp_format_peer(lp, "\n\t\t "));
		}

		if (0 /* XXX */) {
			printf("\tsupported aggregation protocols:\n");
			for (i = 0; i < nitems(lpr); i++)
				printf("\t\tlaggproto %s\n", lpr[i].lpr_name);
		}
	}
}
Exemplo n.º 2
0
static void
lagg_status(int s)
{
	struct lagg_protos lpr[] = LAGG_PROTOS;
	struct lagg_reqport rp, rpbuf[LAGG_MAX_PORTS];
	struct lagg_reqall ra;
	struct lagg_reqopts ro;
	struct lagg_reqflags rf;
	struct lacp_opreq *lp;
	const char *proto = "<unknown>";
	int i, isport = 0;

	bzero(&rp, sizeof(rp));
	bzero(&ra, sizeof(ra));
	bzero(&ro, sizeof(ro));

	strlcpy(rp.rp_ifname, name, sizeof(rp.rp_ifname));
	strlcpy(rp.rp_portname, name, sizeof(rp.rp_portname));

	if (ioctl(s, SIOCGLAGGPORT, &rp) == 0)
		isport = 1;

	strlcpy(ra.ra_ifname, name, sizeof(ra.ra_ifname));
	ra.ra_size = sizeof(rpbuf);
	ra.ra_port = rpbuf;

	strlcpy(ro.ro_ifname, name, sizeof(ro.ro_ifname));
	ioctl(s, SIOCGLAGGOPTS, &ro);

	strlcpy(rf.rf_ifname, name, sizeof(rf.rf_ifname));
	if (ioctl(s, SIOCGLAGGFLAGS, &rf) != 0)
		rf.rf_flags = 0;

	if (ioctl(s, SIOCGLAGG, &ra) == 0) {
		lp = (struct lacp_opreq *)&ra.ra_lacpreq;

		for (i = 0; i < nitems(lpr); i++) {
			if (ra.ra_proto == lpr[i].lpr_proto) {
				proto = lpr[i].lpr_name;
				break;
			}
		}

		printf("\tlaggproto %s", proto);
		if (rf.rf_flags & LAGG_F_HASHMASK) {
			const char *sep = "";

			printf(" lagghash ");
			if (rf.rf_flags & LAGG_F_HASHL2) {
				printf("%sl2", sep);
				sep = ",";
			}
			if (rf.rf_flags & LAGG_F_HASHL3) {
				printf("%sl3", sep);
				sep = ",";
			}
			if (rf.rf_flags & LAGG_F_HASHL4) {
				printf("%sl4", sep);
				sep = ",";
			}
		}
		if (isport)
			printf(" laggdev %s", rp.rp_ifname);
		putchar('\n');
		if (verbose) {
			printf("\tlagg options:\n");
			printb("\t\tflags", ro.ro_opts, LAGG_OPT_BITS);
			putchar('\n');
			printf("\t\tflowid_shift: %d\n", ro.ro_flowid_shift);
			if (ra.ra_proto == LAGG_PROTO_ROUNDROBIN)
				printf("\t\trr_limit: %d\n", ro.ro_bkt);
			printf("\tlagg statistics:\n");
			printf("\t\tactive ports: %d\n", ro.ro_active);
			printf("\t\tflapping: %u\n", ro.ro_flapping);
			if (ra.ra_proto == LAGG_PROTO_LACP) {
				printf("\tlag id: %s\n",
				    lacp_format_peer(lp, "\n\t\t "));
			}
		}

		for (i = 0; i < ra.ra_ports; i++) {
			lp = (struct lacp_opreq *)&rpbuf[i].rp_lacpreq;
			printf("\tlaggport: %s ", rpbuf[i].rp_portname);
			printb("flags", rpbuf[i].rp_flags, LAGG_PORT_BITS);
			if (verbose && ra.ra_proto == LAGG_PROTO_LACP)
				printb(" state", lp->actor_state,
				    LACP_STATE_BITS);
			putchar('\n');
			if (verbose && ra.ra_proto == LAGG_PROTO_LACP)
				printf("\t\t%s\n",
				    lacp_format_peer(lp, "\n\t\t "));
		}

		if (0 /* XXX */) {
			printf("\tsupported aggregation protocols:\n");
			for (i = 0; i < (sizeof(lpr) / sizeof(lpr[0])); i++)
				printf("\t\tlaggproto %s\n", lpr[i].lpr_name);
		}
	}
}