m_police.c revision ebf32083e0a15b416357087362738e123cd0df9f
1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/*
2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * m_police.c		Parse/print policing module options.
3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *
4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *		This program is free software; you can u32istribute 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 * FIXES:       19990619 - J Hadi Salim (hadi@cyberus.ca)
11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *		simple addattr packaging fix.
122373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger *		2002: J Hadi Salim - Add tc action extensions syntax
132373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger *
14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger */
15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdio.h>
17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdlib.h>
18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <unistd.h>
19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <syslog.h>
20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <fcntl.h>
21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/socket.h>
22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <netinet/in.h>
23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <arpa/inet.h>
24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <string.h>
25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "utils.h"
27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "tc_util.h"
28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
2995812b56a5a66e7e9a21744cfe8bc0bb9791ea98net[shemminger]!kaberstruct action_util police_action_util = {
302373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	.id = "police",
312373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	.parse_aopt = act_parse_police,
322373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	.print_aopt = print_police,
332373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger};
342373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger
35ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salimstatic void usage(void)
36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "Usage: ... police rate BPS burst BYTES[/BYTES] [ mtu BYTES[/BYTES] ]\n");
38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "                [ peakrate BPS ] [ avrate BPS ]\n");
392373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	fprintf(stderr, "                [ ACTIONTERM ]\n");
400284dcde32ccb3181c04f449ea41a0502fb91f07net[shemminger]!shemminger	fprintf(stderr, "Old Syntax ACTIONTERM := action <EXCEEDACT>[/NOTEXCEEDACT] \n");
412373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	fprintf(stderr, "New Syntax ACTIONTERM := conform-exceed <EXCEEDACT>[/NOTEXCEEDACT] \n");
422373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	fprintf(stderr, "Where: *EXCEEDACT := pipe | ok | reclassify | drop | continue \n");
432373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	fprintf(stderr, "Where:  pipe is only valid for new syntax \n");
44ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim	exit(-1);
45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void explain1(char *arg)
48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "Illegal \"%s\"\n", arg);
50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar *police_action_n2a(int action, char *buf, int len)
53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	switch (action) {
55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	case -1:
56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return "continue";
57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		break;
58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	case TC_POLICE_OK:
59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return "pass";
60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		break;
61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	case TC_POLICE_SHOT:
62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return "drop";
63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		break;
64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	case TC_POLICE_RECLASSIFY:
65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return "reclassify";
662373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	case TC_POLICE_PIPE:
672373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger		return "pipe";
68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	default:
69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		snprintf(buf, len, "%d", action);
70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return buf;
71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint police_action_a2n(char *arg, int *result)
75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int res;
77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (matches(arg, "continue") == 0)
79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		res = -1;
80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	else if (matches(arg, "drop") == 0)
81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		res = TC_POLICE_SHOT;
82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	else if (matches(arg, "shot") == 0)
83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		res = TC_POLICE_SHOT;
84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	else if (matches(arg, "pass") == 0)
85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		res = TC_POLICE_OK;
86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	else if (strcmp(arg, "ok") == 0)
87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		res = TC_POLICE_OK;
88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	else if (matches(arg, "reclassify") == 0)
89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		res = TC_POLICE_RECLASSIFY;
902373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	else if (matches(arg, "pipe") == 0)
912373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger		res = TC_POLICE_PIPE;
92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	else {
93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		char dummy;
94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (sscanf(arg, "%d%c", &res, &dummy) != 1)
95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	*result = res;
98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_police_result(int *action, int *result, char *arg)
103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	char *p = strchr(arg, '/');
105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (p)
107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		*p = 0;
108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (police_action_a2n(arg, action)) {
110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (p)
111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			*p = '/';
112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (p) {
116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		*p = '/';
117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (police_action_a2n(p+1, result))
118aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
119aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
120aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
121aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
122aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
1232373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger
1242373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemmingerint act_parse_police(struct action_util *a,int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n)
125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
126aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int argc = *argc_p;
127aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	char **argv = *argv_p;
128aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int res = -1;
129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int ok=0;
130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_police p;
131aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	__u32 rtab[256];
132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	__u32 ptab[256];
133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	__u32 avrate = 0;
134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int presult = 0;
135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	unsigned buffer=0, mtu=0, mpu=0;
136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int Rcell_log=-1, Pcell_log = -1;
137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct rtattr *tail;
138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&p, 0, sizeof(p));
140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	p.action = TC_POLICE_RECLASSIFY;
141aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
1422373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	if (a) /* new way of doing things */
1432373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger		NEXT_ARG();
1442373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger
145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (argc <= 0)
146aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
147aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (argc > 0) {
1492373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger
150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (matches(*argv, "index") == 0) {
151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
1522373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger			if (get_u32(&p.index, *argv, 10)) {
153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Illegal \"index\"\n");
154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (matches(*argv, "burst") == 0 ||
157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			strcmp(*argv, "buffer") == 0 ||
158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			strcmp(*argv, "maxburst") == 0) {
159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (buffer) {
161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Double \"buffer/burst\" spec\n");
162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size_and_cell(&buffer, &Rcell_log, *argv) < 0) {
165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("buffer");
166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (strcmp(*argv, "mtu") == 0 ||
169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			   strcmp(*argv, "minburst") == 0) {
170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (mtu) {
172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Double \"mtu/minburst\" spec\n");
173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size_and_cell(&mtu, &Pcell_log, *argv) < 0) {
176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("mtu");
177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (strcmp(*argv, "mpu") == 0) {
180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (mpu) {
182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Double \"mpu\" spec\n");
183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&mpu, *argv)) {
186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("mpu");
187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (strcmp(*argv, "rate") == 0) {
190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
191aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (p.rate.rate) {
192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Double \"rate\" spec\n");
193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_rate(&p.rate.rate, *argv)) {
196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("rate");
197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (strcmp(*argv, "avrate") == 0) {
200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (avrate) {
202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Double \"avrate\" spec\n");
203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_rate(&avrate, *argv)) {
206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("avrate");
207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (matches(*argv, "peakrate") == 0) {
210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (p.peakrate.rate) {
212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Double \"peakrate\" spec\n");
213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_rate(&p.peakrate.rate, *argv)) {
216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("peakrate");
217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (matches(*argv, "reclassify") == 0) {
220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			p.action = TC_POLICE_RECLASSIFY;
221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (matches(*argv, "drop") == 0 ||
222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			   matches(*argv, "shot") == 0) {
223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			p.action = TC_POLICE_SHOT;
224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (matches(*argv, "continue") == 0) {
225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			p.action = TC_POLICE_UNSPEC;
226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (matches(*argv, "pass") == 0) {
227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			p.action = TC_POLICE_OK;
2282373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger		} else if (matches(*argv, "pipe") == 0) {
2292373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger			p.action = TC_POLICE_PIPE;
2302373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger		} else if (strcmp(*argv, "conform-exceed") == 0) {
231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_police_result(&p.action, &presult, *argv)) {
233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Illegal \"action\"\n");
234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (strcmp(*argv, "help") == 0) {
237ebf32083e0a15b416357087362738e123cd0df9fJamal Hadi Salim			usage();
238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else {
239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			break;
240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		ok++;
242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		argc--; argv++;
243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (!ok)
246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (p.rate.rate && !buffer) {
249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(stderr, "\"burst\" requires \"rate\".\n");
250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (p.peakrate.rate) {
253aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (!p.rate.rate) {
254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "\"peakrate\" requires \"rate\".\n");
255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
257aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (!mtu) {
258aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "\"mtu\" is required, if \"peakrate\" is requested.\n");
259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
260aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
261aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (p.rate.rate) {
264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if ((Rcell_log = tc_calc_rtable(p.rate.rate, rtab, Rcell_log, mtu, mpu)) < 0) {
265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "TBF: failed to calculate rate table.\n");
266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		p.burst = tc_calc_xmittime(p.rate.rate, buffer);
269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		p.rate.cell_log = Rcell_log;
270aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		p.rate.mpu = mpu;
271aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
272aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	p.mtu = mtu;
273aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (p.peakrate.rate) {
274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if ((Pcell_log = tc_calc_rtable(p.peakrate.rate, ptab, Pcell_log, mtu, mpu)) < 0) {
275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "POLICE: failed to calculate peak rate table.\n");
276aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
277aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
278aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		p.peakrate.cell_log = Pcell_log;
279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		p.peakrate.mpu = mpu;
280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
2821b52a7622ea8eda9980ce2dbe984985ac092d92an);	tail = NLMSG_TAIL(n);
2832373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	addattr_l(n, MAX_MSG, tca_id, NULL, 0);
2842373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	addattr_l(n, MAX_MSG, TCA_POLICE_TBF, &p, sizeof(p));
285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (p.rate.rate)
2862373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger		addattr_l(n, MAX_MSG, TCA_POLICE_RATE, rtab, 1024);
287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (p.peakrate.rate)
2882373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger                addattr_l(n, MAX_MSG, TCA_POLICE_PEAKRATE, ptab, 1024);
289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (avrate)
2902373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger		addattr32(n, MAX_MSG, TCA_POLICE_AVRATE, avrate);
291aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (presult)
2922373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger		addattr32(n, MAX_MSG, TCA_POLICE_RESULT, presult);
293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
2941b52a7622ea8eda9980ce2dbe984985ac092d92avoid *) NLMSG_TAIL(n) - (void *) tail;	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	res = 0;
296aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
297aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	*argc_p = argc;
298aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	*argv_p = argv;
299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return res;
300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
301aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
3022373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemmingerint parse_police(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n)
3032373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger{
3042373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	return act_parse_police(NULL,argc_p,argv_p,tca_id,n);
3052373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger}
306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
3072373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemmingerint
308f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemmingerprint_police(struct action_util *a, FILE *f, struct rtattr *arg)
309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
310aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	SPRINT_BUF(b1);
311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_police *p;
312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct rtattr *tb[TCA_POLICE_MAX+1];
313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	unsigned buffer;
314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (arg == NULL)
316aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
317aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
31814ee9e615939b5bd193279535a0368d5f43950e3tb, TCA_POLICE_MAX, arg);	parse_rtattr_nested(tb, TCA_POLICE_MAX, arg);
319aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
320aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_POLICE_TBF] == NULL) {
321aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "[NULL police tbf]");
322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
3242373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger#ifndef STOOPID_8BYTE
325aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (RTA_PAYLOAD(tb[TCA_POLICE_TBF])  < sizeof(*p)) {
326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "[truncated police tbf]");
327aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
328aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
3292373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger#endif
330aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	p = RTA_DATA(tb[TCA_POLICE_TBF]);
331aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
3322373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	fprintf(f, " police 0x%x ", p->index);
333aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(f, "rate %s ", sprint_rate(p->rate.rate, b1));
334aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	buffer = ((double)p->rate.rate*tc_core_tick2usec(p->burst))/1000000;
335aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(f, "burst %s ", sprint_size(buffer, b1));
336aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(f, "mtu %s ", sprint_size(p->mtu, b1));
337aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (show_raw)
338aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "[%08x] ", p->burst);
339aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (p->peakrate.rate)
340aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "peakrate %s ", sprint_rate(p->peakrate.rate, b1));
341aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_POLICE_AVRATE])
342aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "avrate %s ", sprint_rate(*(__u32*)RTA_DATA(tb[TCA_POLICE_AVRATE]), b1));
3432373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	fprintf(f, "action %s", police_action_n2a(p->action, b1, sizeof(b1)));
3442373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	if (tb[TCA_POLICE_RESULT]) {
3452373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger		fprintf(f, "/%s ", police_action_n2a(*(int*)RTA_DATA(tb[TCA_POLICE_RESULT]), b1, sizeof(b1)));
3462373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	} else
3472373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger		fprintf(f, " ");
3482373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger	fprintf(f, "\nref %d bind %d\n",p->refcnt, p->bindcnt);
349aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
350aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
351aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
352aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
3532373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemmingerint
3542373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemmingertc_print_police(FILE *f, struct rtattr *arg) {
35595812b56a5a66e7e9a21744cfe8bc0bb9791ea98net[shemminger]!kaber	return print_police(&police_action_util,f,arg);
3562373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger}
357