xref: /aosp_15_r20/external/iptables/extensions/libxt_LOG.c (revision a71a954618bbadd4a345637e5edcf36eec826889)
1*a71a9546SAutomerger Merge Worker #include <stdio.h>
2*a71a9546SAutomerger Merge Worker #include <string.h>
3*a71a9546SAutomerger Merge Worker #define SYSLOG_NAMES
4*a71a9546SAutomerger Merge Worker #include <syslog.h>
5*a71a9546SAutomerger Merge Worker #include <xtables.h>
6*a71a9546SAutomerger Merge Worker #include <linux/netfilter/xt_LOG.h>
7*a71a9546SAutomerger Merge Worker 
8*a71a9546SAutomerger Merge Worker #define LOG_DEFAULT_LEVEL LOG_WARNING
9*a71a9546SAutomerger Merge Worker 
10*a71a9546SAutomerger Merge Worker enum {
11*a71a9546SAutomerger Merge Worker 	/* make sure the values correspond with XT_LOG_* bit positions */
12*a71a9546SAutomerger Merge Worker 	O_LOG_TCPSEQ = 0,
13*a71a9546SAutomerger Merge Worker 	O_LOG_TCPOPTS,
14*a71a9546SAutomerger Merge Worker 	O_LOG_IPOPTS,
15*a71a9546SAutomerger Merge Worker 	O_LOG_UID,
16*a71a9546SAutomerger Merge Worker 	__O_LOG_NFLOG,
17*a71a9546SAutomerger Merge Worker 	O_LOG_MAC,
18*a71a9546SAutomerger Merge Worker 	O_LOG_LEVEL,
19*a71a9546SAutomerger Merge Worker 	O_LOG_PREFIX,
20*a71a9546SAutomerger Merge Worker };
21*a71a9546SAutomerger Merge Worker 
LOG_help(void)22*a71a9546SAutomerger Merge Worker static void LOG_help(void)
23*a71a9546SAutomerger Merge Worker {
24*a71a9546SAutomerger Merge Worker 	printf(
25*a71a9546SAutomerger Merge Worker "LOG target options:\n"
26*a71a9546SAutomerger Merge Worker " --log-level level		Level of logging (numeric or see syslog.conf)\n"
27*a71a9546SAutomerger Merge Worker " --log-prefix prefix		Prefix log messages with this prefix.\n"
28*a71a9546SAutomerger Merge Worker " --log-tcp-sequence		Log TCP sequence numbers.\n"
29*a71a9546SAutomerger Merge Worker " --log-tcp-options		Log TCP options.\n"
30*a71a9546SAutomerger Merge Worker " --log-ip-options		Log IP options.\n"
31*a71a9546SAutomerger Merge Worker " --log-uid			Log UID owning the local socket.\n"
32*a71a9546SAutomerger Merge Worker " --log-macdecode		Decode MAC addresses and protocol.\n");
33*a71a9546SAutomerger Merge Worker }
34*a71a9546SAutomerger Merge Worker 
35*a71a9546SAutomerger Merge Worker #define s struct xt_log_info
36*a71a9546SAutomerger Merge Worker static const struct xt_option_entry LOG_opts[] = {
37*a71a9546SAutomerger Merge Worker 	{.name = "log-level", .id = O_LOG_LEVEL, .type = XTTYPE_SYSLOGLEVEL,
38*a71a9546SAutomerger Merge Worker 	 .flags = XTOPT_PUT, XTOPT_POINTER(s, level)},
39*a71a9546SAutomerger Merge Worker 	{.name = "log-prefix", .id = O_LOG_PREFIX, .type = XTTYPE_STRING,
40*a71a9546SAutomerger Merge Worker 	 .flags = XTOPT_PUT, XTOPT_POINTER(s, prefix), .min = 1},
41*a71a9546SAutomerger Merge Worker 	{.name = "log-tcp-sequence", .id = O_LOG_TCPSEQ, .type = XTTYPE_NONE},
42*a71a9546SAutomerger Merge Worker 	{.name = "log-tcp-options", .id = O_LOG_TCPOPTS, .type = XTTYPE_NONE},
43*a71a9546SAutomerger Merge Worker 	{.name = "log-ip-options", .id = O_LOG_IPOPTS, .type = XTTYPE_NONE},
44*a71a9546SAutomerger Merge Worker 	{.name = "log-uid", .id = O_LOG_UID, .type = XTTYPE_NONE},
45*a71a9546SAutomerger Merge Worker 	{.name = "log-macdecode", .id = O_LOG_MAC, .type = XTTYPE_NONE},
46*a71a9546SAutomerger Merge Worker 	XTOPT_TABLEEND,
47*a71a9546SAutomerger Merge Worker };
48*a71a9546SAutomerger Merge Worker #undef s
49*a71a9546SAutomerger Merge Worker 
LOG_init(struct xt_entry_target * t)50*a71a9546SAutomerger Merge Worker static void LOG_init(struct xt_entry_target *t)
51*a71a9546SAutomerger Merge Worker {
52*a71a9546SAutomerger Merge Worker 	struct xt_log_info *loginfo = (void *)t->data;
53*a71a9546SAutomerger Merge Worker 
54*a71a9546SAutomerger Merge Worker 	loginfo->level = LOG_DEFAULT_LEVEL;
55*a71a9546SAutomerger Merge Worker }
56*a71a9546SAutomerger Merge Worker 
LOG_parse(struct xt_option_call * cb)57*a71a9546SAutomerger Merge Worker static void LOG_parse(struct xt_option_call *cb)
58*a71a9546SAutomerger Merge Worker {
59*a71a9546SAutomerger Merge Worker 	struct xt_log_info *info = cb->data;
60*a71a9546SAutomerger Merge Worker 
61*a71a9546SAutomerger Merge Worker 	xtables_option_parse(cb);
62*a71a9546SAutomerger Merge Worker 	switch (cb->entry->id) {
63*a71a9546SAutomerger Merge Worker 	case O_LOG_PREFIX:
64*a71a9546SAutomerger Merge Worker 		if (strchr(cb->arg, '\n') != NULL)
65*a71a9546SAutomerger Merge Worker 			xtables_error(PARAMETER_PROBLEM,
66*a71a9546SAutomerger Merge Worker 				   "Newlines not allowed in --log-prefix");
67*a71a9546SAutomerger Merge Worker 		break;
68*a71a9546SAutomerger Merge Worker 	case O_LOG_TCPSEQ:
69*a71a9546SAutomerger Merge Worker 	case O_LOG_TCPOPTS:
70*a71a9546SAutomerger Merge Worker 	case O_LOG_IPOPTS:
71*a71a9546SAutomerger Merge Worker 	case O_LOG_UID:
72*a71a9546SAutomerger Merge Worker 	case O_LOG_MAC:
73*a71a9546SAutomerger Merge Worker 		info->logflags |= 1 << cb->entry->id;
74*a71a9546SAutomerger Merge Worker 		break;
75*a71a9546SAutomerger Merge Worker 	}
76*a71a9546SAutomerger Merge Worker }
77*a71a9546SAutomerger Merge Worker 
priority2name(unsigned char level)78*a71a9546SAutomerger Merge Worker static const char *priority2name(unsigned char level)
79*a71a9546SAutomerger Merge Worker {
80*a71a9546SAutomerger Merge Worker 	int i;
81*a71a9546SAutomerger Merge Worker 
82*a71a9546SAutomerger Merge Worker 	for (i = 0; prioritynames[i].c_name; ++i) {
83*a71a9546SAutomerger Merge Worker 		if (level == prioritynames[i].c_val)
84*a71a9546SAutomerger Merge Worker 			return prioritynames[i].c_name;
85*a71a9546SAutomerger Merge Worker 	}
86*a71a9546SAutomerger Merge Worker 	return NULL;
87*a71a9546SAutomerger Merge Worker }
88*a71a9546SAutomerger Merge Worker 
LOG_print(const void * ip,const struct xt_entry_target * target,int numeric)89*a71a9546SAutomerger Merge Worker static void LOG_print(const void *ip, const struct xt_entry_target *target,
90*a71a9546SAutomerger Merge Worker                       int numeric)
91*a71a9546SAutomerger Merge Worker {
92*a71a9546SAutomerger Merge Worker 	const struct xt_log_info *loginfo = (const void *)target->data;
93*a71a9546SAutomerger Merge Worker 
94*a71a9546SAutomerger Merge Worker 	printf(" LOG");
95*a71a9546SAutomerger Merge Worker 	if (numeric)
96*a71a9546SAutomerger Merge Worker 		printf(" flags %u level %u",
97*a71a9546SAutomerger Merge Worker 		       loginfo->logflags, loginfo->level);
98*a71a9546SAutomerger Merge Worker 	else {
99*a71a9546SAutomerger Merge Worker 		const char *pname = priority2name(loginfo->level);
100*a71a9546SAutomerger Merge Worker 
101*a71a9546SAutomerger Merge Worker 		if (pname)
102*a71a9546SAutomerger Merge Worker 			printf(" level %s", pname);
103*a71a9546SAutomerger Merge Worker 		else
104*a71a9546SAutomerger Merge Worker 			printf(" UNKNOWN level %u", loginfo->level);
105*a71a9546SAutomerger Merge Worker 		if (loginfo->logflags & XT_LOG_TCPSEQ)
106*a71a9546SAutomerger Merge Worker 			printf(" tcp-sequence");
107*a71a9546SAutomerger Merge Worker 		if (loginfo->logflags & XT_LOG_TCPOPT)
108*a71a9546SAutomerger Merge Worker 			printf(" tcp-options");
109*a71a9546SAutomerger Merge Worker 		if (loginfo->logflags & XT_LOG_IPOPT)
110*a71a9546SAutomerger Merge Worker 			printf(" ip-options");
111*a71a9546SAutomerger Merge Worker 		if (loginfo->logflags & XT_LOG_UID)
112*a71a9546SAutomerger Merge Worker 			printf(" uid");
113*a71a9546SAutomerger Merge Worker 		if (loginfo->logflags & XT_LOG_MACDECODE)
114*a71a9546SAutomerger Merge Worker 			printf(" macdecode");
115*a71a9546SAutomerger Merge Worker 		if (loginfo->logflags & ~(XT_LOG_MASK))
116*a71a9546SAutomerger Merge Worker 			printf(" unknown-flags");
117*a71a9546SAutomerger Merge Worker 	}
118*a71a9546SAutomerger Merge Worker 
119*a71a9546SAutomerger Merge Worker 	if (strcmp(loginfo->prefix, "") != 0)
120*a71a9546SAutomerger Merge Worker 		printf(" prefix \"%s\"", loginfo->prefix);
121*a71a9546SAutomerger Merge Worker }
122*a71a9546SAutomerger Merge Worker 
LOG_save(const void * ip,const struct xt_entry_target * target)123*a71a9546SAutomerger Merge Worker static void LOG_save(const void *ip, const struct xt_entry_target *target)
124*a71a9546SAutomerger Merge Worker {
125*a71a9546SAutomerger Merge Worker 	const struct xt_log_info *loginfo = (const void *)target->data;
126*a71a9546SAutomerger Merge Worker 
127*a71a9546SAutomerger Merge Worker 	if (strcmp(loginfo->prefix, "") != 0) {
128*a71a9546SAutomerger Merge Worker 		printf(" --log-prefix");
129*a71a9546SAutomerger Merge Worker 		xtables_save_string(loginfo->prefix);
130*a71a9546SAutomerger Merge Worker 	}
131*a71a9546SAutomerger Merge Worker 
132*a71a9546SAutomerger Merge Worker 	if (loginfo->level != LOG_DEFAULT_LEVEL)
133*a71a9546SAutomerger Merge Worker 		printf(" --log-level %d", loginfo->level);
134*a71a9546SAutomerger Merge Worker 
135*a71a9546SAutomerger Merge Worker 	if (loginfo->logflags & XT_LOG_TCPSEQ)
136*a71a9546SAutomerger Merge Worker 		printf(" --log-tcp-sequence");
137*a71a9546SAutomerger Merge Worker 	if (loginfo->logflags & XT_LOG_TCPOPT)
138*a71a9546SAutomerger Merge Worker 		printf(" --log-tcp-options");
139*a71a9546SAutomerger Merge Worker 	if (loginfo->logflags & XT_LOG_IPOPT)
140*a71a9546SAutomerger Merge Worker 		printf(" --log-ip-options");
141*a71a9546SAutomerger Merge Worker 	if (loginfo->logflags & XT_LOG_UID)
142*a71a9546SAutomerger Merge Worker 		printf(" --log-uid");
143*a71a9546SAutomerger Merge Worker 	if (loginfo->logflags & XT_LOG_MACDECODE)
144*a71a9546SAutomerger Merge Worker 		printf(" --log-macdecode");
145*a71a9546SAutomerger Merge Worker }
146*a71a9546SAutomerger Merge Worker 
LOG_xlate(struct xt_xlate * xl,const struct xt_xlate_tg_params * params)147*a71a9546SAutomerger Merge Worker static int LOG_xlate(struct xt_xlate *xl,
148*a71a9546SAutomerger Merge Worker 		     const struct xt_xlate_tg_params *params)
149*a71a9546SAutomerger Merge Worker {
150*a71a9546SAutomerger Merge Worker 	const struct xt_log_info *loginfo = (const void *)params->target->data;
151*a71a9546SAutomerger Merge Worker 	const char *pname = priority2name(loginfo->level);
152*a71a9546SAutomerger Merge Worker 
153*a71a9546SAutomerger Merge Worker 	xt_xlate_add(xl, "log");
154*a71a9546SAutomerger Merge Worker 	if (strcmp(loginfo->prefix, "") != 0)
155*a71a9546SAutomerger Merge Worker 		xt_xlate_add(xl, " prefix \"%s\"", loginfo->prefix);
156*a71a9546SAutomerger Merge Worker 
157*a71a9546SAutomerger Merge Worker 	if (loginfo->level != LOG_DEFAULT_LEVEL && pname)
158*a71a9546SAutomerger Merge Worker 		xt_xlate_add(xl, " level %s", pname);
159*a71a9546SAutomerger Merge Worker 	else if (!pname)
160*a71a9546SAutomerger Merge Worker 		return 0;
161*a71a9546SAutomerger Merge Worker 
162*a71a9546SAutomerger Merge Worker 	if ((loginfo->logflags & XT_LOG_MASK) == XT_LOG_MASK) {
163*a71a9546SAutomerger Merge Worker 		xt_xlate_add(xl, " flags all");
164*a71a9546SAutomerger Merge Worker 	} else {
165*a71a9546SAutomerger Merge Worker 		if (loginfo->logflags & (XT_LOG_TCPSEQ | XT_LOG_TCPOPT)) {
166*a71a9546SAutomerger Merge Worker 			const char *delim = " ";
167*a71a9546SAutomerger Merge Worker 
168*a71a9546SAutomerger Merge Worker 			xt_xlate_add(xl, " flags tcp");
169*a71a9546SAutomerger Merge Worker 			if (loginfo->logflags & XT_LOG_TCPSEQ) {
170*a71a9546SAutomerger Merge Worker 				xt_xlate_add(xl, " sequence");
171*a71a9546SAutomerger Merge Worker 				delim = ",";
172*a71a9546SAutomerger Merge Worker 			}
173*a71a9546SAutomerger Merge Worker 			if (loginfo->logflags & XT_LOG_TCPOPT)
174*a71a9546SAutomerger Merge Worker 				xt_xlate_add(xl, "%soptions", delim);
175*a71a9546SAutomerger Merge Worker 		}
176*a71a9546SAutomerger Merge Worker 		if (loginfo->logflags & XT_LOG_IPOPT)
177*a71a9546SAutomerger Merge Worker 			xt_xlate_add(xl, " flags ip options");
178*a71a9546SAutomerger Merge Worker 		if (loginfo->logflags & XT_LOG_UID)
179*a71a9546SAutomerger Merge Worker 			xt_xlate_add(xl, " flags skuid");
180*a71a9546SAutomerger Merge Worker 		if (loginfo->logflags & XT_LOG_MACDECODE)
181*a71a9546SAutomerger Merge Worker 			xt_xlate_add(xl, " flags ether");
182*a71a9546SAutomerger Merge Worker 	}
183*a71a9546SAutomerger Merge Worker 
184*a71a9546SAutomerger Merge Worker 	return 1;
185*a71a9546SAutomerger Merge Worker }
186*a71a9546SAutomerger Merge Worker static struct xtables_target log_tg_reg = {
187*a71a9546SAutomerger Merge Worker 	.name          = "LOG",
188*a71a9546SAutomerger Merge Worker 	.version       = XTABLES_VERSION,
189*a71a9546SAutomerger Merge Worker 	.family        = NFPROTO_UNSPEC,
190*a71a9546SAutomerger Merge Worker 	.size          = XT_ALIGN(sizeof(struct xt_log_info)),
191*a71a9546SAutomerger Merge Worker 	.userspacesize = XT_ALIGN(sizeof(struct xt_log_info)),
192*a71a9546SAutomerger Merge Worker 	.help          = LOG_help,
193*a71a9546SAutomerger Merge Worker 	.init          = LOG_init,
194*a71a9546SAutomerger Merge Worker 	.print         = LOG_print,
195*a71a9546SAutomerger Merge Worker 	.save          = LOG_save,
196*a71a9546SAutomerger Merge Worker 	.x6_parse      = LOG_parse,
197*a71a9546SAutomerger Merge Worker 	.x6_options    = LOG_opts,
198*a71a9546SAutomerger Merge Worker 	.xlate	       = LOG_xlate,
199*a71a9546SAutomerger Merge Worker };
200*a71a9546SAutomerger Merge Worker 
_init(void)201*a71a9546SAutomerger Merge Worker void _init(void)
202*a71a9546SAutomerger Merge Worker {
203*a71a9546SAutomerger Merge Worker 	xtables_register_target(&log_tg_reg);
204*a71a9546SAutomerger Merge Worker }
205