1fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck/*
2fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * q_multiq.c		Multiqueue aware qdisc
3fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck *
4fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * Copyright (c) 2008, Intel Corporation.
5fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck *
6fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * This program is free software; you can redistribute it and/or modify it
7fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * under the terms and conditions of the GNU General Public License,
8fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * version 2, as published by the Free Software Foundation.
9fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck *
10fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * This program is distributed in the hope it will be useful, but WITHOUT
11fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * more details.
14fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck *
15fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * You should have received a copy of the GNU General Public License along with
16fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
17fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * Place - Suite 330, Boston, MA 02111-1307 USA.
18fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck *
19fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * Author: Alexander Duyck <alexander.h.duyck@intel.com>
20fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck *
21fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * Original Authors:	PJ Waskiewicz, <peter.p.waskiewicz.jr@intel.com> (RR)
22fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck * 			Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> (from PRIO)
23fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck *
24fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck */
25fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
26fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include <stdio.h>
27fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include <stdlib.h>
28fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include <unistd.h>
29fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include <syslog.h>
30fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include <fcntl.h>
31fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include <sys/socket.h>
32fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include <netinet/in.h>
33fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include <arpa/inet.h>
34fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include <string.h>
35fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
36fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include "utils.h"
37fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck#include "tc_util.h"
38fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
39fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyckstatic void explain(void)
40fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck{
41fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	fprintf(stderr, "Usage: ... multiq [help]\n");
42fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck}
43fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
44fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyckstatic int multiq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
45fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck			    struct nlmsghdr *n)
46fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck{
47fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	struct tc_multiq_qopt opt;
48fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
495582c0cffd5b65def21eca6ef0b7c165cb2f9523Petr Sabata	if (argc) {
50fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck		if (strcmp(*argv, "help") == 0) {
51fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck			explain();
52fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck			return -1;
53fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck		} else {
54fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck			fprintf(stderr, "What is \"%s\"?\n", *argv);
55fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck			explain();
56fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck			return -1;
57fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck		}
58fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	}
59fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
60fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
61fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	return 0;
62fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck}
63fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
64fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyckint multiq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
65fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck{
66fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	struct tc_multiq_qopt *qopt;
67fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
68fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	if (opt == NULL)
69fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck		return 0;
70fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	if (RTA_PAYLOAD(opt) < sizeof(*qopt))
71fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck		return 0;
72fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
73fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	qopt = RTA_DATA(opt);
74fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
75fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	fprintf(f, "bands %u/%u ", qopt->bands, qopt->max_bands);
76fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
77fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	return 0;
78fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck}
79fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck
80fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyckstruct qdisc_util multiq_qdisc_util = {
81fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	.id	 	= "multiq",
82fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	.parse_qopt	= multiq_parse_opt,
83fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck	.print_qopt	= multiq_print_opt,
84fe1a34fa81f61bb3000ea6b127480f7cce24af06Alexander Duyck};
85