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