1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * q_fifo.c FIFO. 3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * This program is free software; you can redistribute it and/or 5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * modify it under the terms of the GNU General Public License 6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * as published by the Free Software Foundation; either version 7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 2 of the License, or (at your option) any later version. 8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdio.h> 14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdlib.h> 15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <unistd.h> 16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <syslog.h> 17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <fcntl.h> 18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/socket.h> 19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <netinet/in.h> 20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <arpa/inet.h> 21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <string.h> 22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "utils.h" 24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "tc_util.h" 25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void explain(void) 27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 281a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidt fprintf(stderr, "Usage: ... <[p|b]fifo | pfifo_head_drop> [ limit NUMBER ]\n"); 29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int fifo_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) 32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int ok=0; 34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tc_fifo_qopt opt; 35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat memset(&opt, 0, sizeof(opt)); 36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat while (argc > 0) { 38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "limit") == 0) { 39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_size(&opt.limit, *argv)) { 41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal \"limit\"\n"); 42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ok++; 45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "help") == 0) { 46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "What is \"%s\"?\n", *argv); 50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; argv++; 54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (ok) 57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt)); 58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int fifo_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) 62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tc_fifo_qopt *qopt; 64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (opt == NULL) 66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (RTA_PAYLOAD(opt) < sizeof(*qopt)) 69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat qopt = RTA_DATA(opt); 71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(qu->id, "bfifo") == 0) { 72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat SPRINT_BUF(b1); 73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "limit %s", sprint_size(qopt->limit, b1)); 74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else 75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "limit %up", qopt->limit); 76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct qdisc_util bfifo_qdisc_util = { 81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .id = "bfifo", 82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .parse_qopt = fifo_parse_opt, 83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_qopt = fifo_print_opt, 84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}; 85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct qdisc_util pfifo_qdisc_util = { 87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .id = "pfifo", 88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .parse_qopt = fifo_parse_opt, 89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_qopt = fifo_print_opt, 90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}; 91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 921a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidtstruct qdisc_util pfifo_head_drop_qdisc_util = { 931a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidt .id = "pfifo_head_drop", 941a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidt .parse_qopt = fifo_parse_opt, 951a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidt .print_qopt = fifo_print_opt, 961a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidt}; 971a441f49ec87ef74b978d7ae17da2a9b2ca6e811Dmitry Shmidt 98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int prio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt); 99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct qdisc_util pfifo_fast_qdisc_util = { 100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .id = "pfifo_fast", 101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_qopt = prio_print_opt, 102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}; 103