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