1/* Shared library add-on to iptables for FTOS
2 *
3 * (C) 2000 by Matthew G. Marsh <mgm@paktronix.com>
4 *
5 * This program is distributed under the terms of GNU GPL v2, 1991
6 *
7 * libipt_FTOS.c borrowed heavily from libipt_TOS.c  11/09/2000
8 *
9 */
10#include <stdio.h>
11#include <string.h>
12#include <stdlib.h>
13#include <getopt.h>
14
15#include <iptables.h>
16#include <linux/netfilter_ipv4/ip_tables.h>
17#include <linux/netfilter_ipv4/ipt_FTOS.h>
18
19struct finfo {
20 	struct ipt_entry_target t;
21	u_int8_t ftos;
22};
23
24static void init(struct ipt_entry_target *t, unsigned int *nfcache)
25{
26}
27
28static void help(void)
29{
30	printf(
31"FTOS target options\n"
32"  --set-ftos value		Set TOS field in packet header to value\n"
33"  		                This value can be in decimal (ex: 32)\n"
34"               		or in hex (ex: 0x20)\n"
35);
36}
37
38static struct option opts[] = {
39	{ "set-ftos", 1, 0, 'F' },
40	{ 0 }
41};
42
43static void
44parse_ftos(const unsigned char *s, struct ipt_FTOS_info *finfo)
45{
46	unsigned int ftos;
47
48	if (string_to_number(s, 0, 255, &ftos) == -1)
49		exit_error(PARAMETER_PROBLEM,
50			   "Invalid ftos `%s'\n", s);
51    	finfo->ftos = (u_int8_t )ftos;
52    	return;
53}
54
55static int
56parse(int c, char **argv, int invert, unsigned int *flags,
57      const struct ipt_entry *entry,
58      struct ipt_entry_target **target)
59{
60	struct ipt_FTOS_info *finfo
61		= (struct ipt_FTOS_info *)(*target)->data;
62
63	switch (c) {
64	case 'F':
65		if (*flags)
66			exit_error(PARAMETER_PROBLEM,
67			           "FTOS target: Only use --set-ftos ONCE!");
68		parse_ftos(optarg, finfo);
69		*flags = 1;
70		break;
71
72	default:
73		return 0;
74	}
75
76	return 1;
77}
78
79static void
80final_check(unsigned int flags)
81{
82	if (!flags)
83		exit_error(PARAMETER_PROBLEM,
84		           "FTOS target: Parameter --set-ftos is required");
85}
86
87static void
88print_ftos(u_int8_t ftos, int numeric)
89{
90 	printf("0x%02x ", ftos);
91}
92
93/* Prints out the targinfo. */
94static void
95print(const struct ipt_ip *ip,
96      const struct ipt_entry_target *target,
97      int numeric)
98{
99	const struct ipt_FTOS_info *finfo =
100		(const struct ipt_FTOS_info *)target->data;
101	printf("TOS set ");
102	print_ftos(finfo->ftos, numeric);
103}
104
105/* Saves the union ipt_targinfo in parsable form to stdout. */
106static void
107save(const struct ipt_ip *ip, const struct ipt_entry_target *target)
108{
109	const struct ipt_FTOS_info *finfo =
110		(const struct ipt_FTOS_info *)target->data;
111
112	printf("--set-ftos 0x%02x ", finfo->ftos);
113}
114
115static
116struct iptables_target ftos
117= { NULL,
118    "FTOS",
119    IPTABLES_VERSION,
120    IPT_ALIGN(sizeof(struct ipt_FTOS_info)),
121    IPT_ALIGN(sizeof(struct ipt_FTOS_info)),
122    &help,
123    &init,
124    &parse,
125    &final_check,
126    &print,
127    &save,
128    opts
129};
130
131void _init(void)
132{
133	register_target(&ftos);
134}
135