blob: 3ff2d5aad257884213f3505edecf46b41355e59c [file] [log] [blame]
Matthew G. Marshd9c66ba2000-12-18 06:22:44 +00001/* 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{
Harald Welteb4719762001-07-23 02:14:22 +000046 unsigned int ftos;
47
Marc Boucher459357f2001-09-08 02:16:51 +000048 if (string_to_number(s, 0, 255, &ftos) == -1)
49 exit_error(PARAMETER_PROBLEM,
50 "Invalid ftos `%s'\n", s);
Matthew G. Marshd9c66ba2000-12-18 06:22:44 +000051 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
Harald Welte3efb6ea2001-08-06 18:50:21 +0000115static
Matthew G. Marshd9c66ba2000-12-18 06:22:44 +0000116struct iptables_target ftos
117= { NULL,
118 "FTOS",
Harald Welte80fe35d2002-05-29 13:08:15 +0000119 IPTABLES_VERSION,
Matthew G. Marshd9c66ba2000-12-18 06:22:44 +0000120 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}