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