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