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