netfilter: propagate net to nf_bridge_get_physindev
[platform/kernel/linux-starfive.git] / net / netfilter / nf_log_syslog.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* (C) 1999-2001 Paul `Rusty' Russell
3  * (C) 2002-2004 Netfilter Core Team <coreteam@netfilter.org>
4  */
5
6 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
7
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/spinlock.h>
11 #include <linux/skbuff.h>
12 #include <linux/if_arp.h>
13 #include <linux/ip.h>
14 #include <net/ipv6.h>
15 #include <net/icmp.h>
16 #include <net/udp.h>
17 #include <net/tcp.h>
18 #include <net/route.h>
19
20 #include <linux/netfilter.h>
21 #include <linux/netfilter_bridge.h>
22 #include <linux/netfilter_ipv6.h>
23 #include <linux/netfilter/xt_LOG.h>
24 #include <net/netfilter/nf_log.h>
25
26 static const struct nf_loginfo default_loginfo = {
27         .type   = NF_LOG_TYPE_LOG,
28         .u = {
29                 .log = {
30                         .level    = LOGLEVEL_NOTICE,
31                         .logflags = NF_LOG_DEFAULT_MASK,
32                 },
33         },
34 };
35
36 struct arppayload {
37         unsigned char mac_src[ETH_ALEN];
38         unsigned char ip_src[4];
39         unsigned char mac_dst[ETH_ALEN];
40         unsigned char ip_dst[4];
41 };
42
43 /* Guard against containers flooding syslog. */
44 static bool nf_log_allowed(const struct net *net)
45 {
46         return net_eq(net, &init_net) || sysctl_nf_log_all_netns;
47 }
48
49 static void nf_log_dump_vlan(struct nf_log_buf *m, const struct sk_buff *skb)
50 {
51         u16 vid;
52
53         if (!skb_vlan_tag_present(skb))
54                 return;
55
56         vid = skb_vlan_tag_get(skb);
57         nf_log_buf_add(m, "VPROTO=%04x VID=%u ", ntohs(skb->vlan_proto), vid);
58 }
59 static void noinline_for_stack
60 dump_arp_packet(struct nf_log_buf *m,
61                 const struct nf_loginfo *info,
62                 const struct sk_buff *skb, unsigned int nhoff)
63 {
64         const struct arppayload *ap;
65         struct arppayload _arpp;
66         const struct arphdr *ah;
67         unsigned int logflags;
68         struct arphdr _arph;
69
70         ah = skb_header_pointer(skb, nhoff, sizeof(_arph), &_arph);
71         if (!ah) {
72                 nf_log_buf_add(m, "TRUNCATED");
73                 return;
74         }
75
76         if (info->type == NF_LOG_TYPE_LOG)
77                 logflags = info->u.log.logflags;
78         else
79                 logflags = NF_LOG_DEFAULT_MASK;
80
81         if (logflags & NF_LOG_MACDECODE) {
82                 nf_log_buf_add(m, "MACSRC=%pM MACDST=%pM ",
83                                eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest);
84                 nf_log_dump_vlan(m, skb);
85                 nf_log_buf_add(m, "MACPROTO=%04x ",
86                                ntohs(eth_hdr(skb)->h_proto));
87         }
88
89         nf_log_buf_add(m, "ARP HTYPE=%d PTYPE=0x%04x OPCODE=%d",
90                        ntohs(ah->ar_hrd), ntohs(ah->ar_pro), ntohs(ah->ar_op));
91         /* If it's for Ethernet and the lengths are OK, then log the ARP
92          * payload.
93          */
94         if (ah->ar_hrd != htons(ARPHRD_ETHER) ||
95             ah->ar_hln != ETH_ALEN ||
96             ah->ar_pln != sizeof(__be32))
97                 return;
98
99         ap = skb_header_pointer(skb, nhoff + sizeof(_arph), sizeof(_arpp), &_arpp);
100         if (!ap) {
101                 nf_log_buf_add(m, " INCOMPLETE [%zu bytes]",
102                                skb->len - sizeof(_arph));
103                 return;
104         }
105         nf_log_buf_add(m, " MACSRC=%pM IPSRC=%pI4 MACDST=%pM IPDST=%pI4",
106                        ap->mac_src, ap->ip_src, ap->mac_dst, ap->ip_dst);
107 }
108
109 static void
110 nf_log_dump_packet_common(struct nf_log_buf *m, u8 pf,
111                           unsigned int hooknum, const struct sk_buff *skb,
112                           const struct net_device *in,
113                           const struct net_device *out,
114                           const struct nf_loginfo *loginfo, const char *prefix,
115                           struct net *net)
116 {
117         const struct net_device *physoutdev __maybe_unused;
118         const struct net_device *physindev __maybe_unused;
119
120         nf_log_buf_add(m, KERN_SOH "%c%sIN=%s OUT=%s ",
121                        '0' + loginfo->u.log.level, prefix,
122                         in ? in->name : "",
123                         out ? out->name : "");
124 #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
125         physindev = nf_bridge_get_physindev(skb, net);
126         if (physindev && in != physindev)
127                 nf_log_buf_add(m, "PHYSIN=%s ", physindev->name);
128         physoutdev = nf_bridge_get_physoutdev(skb);
129         if (physoutdev && out != physoutdev)
130                 nf_log_buf_add(m, "PHYSOUT=%s ", physoutdev->name);
131 #endif
132 }
133
134 static void nf_log_arp_packet(struct net *net, u_int8_t pf,
135                               unsigned int hooknum, const struct sk_buff *skb,
136                               const struct net_device *in,
137                               const struct net_device *out,
138                               const struct nf_loginfo *loginfo,
139                               const char *prefix)
140 {
141         struct nf_log_buf *m;
142
143         if (!nf_log_allowed(net))
144                 return;
145
146         m = nf_log_buf_open();
147
148         if (!loginfo)
149                 loginfo = &default_loginfo;
150
151         nf_log_dump_packet_common(m, pf, hooknum, skb, in, out, loginfo,
152                                   prefix, net);
153         dump_arp_packet(m, loginfo, skb, skb_network_offset(skb));
154
155         nf_log_buf_close(m);
156 }
157
158 static struct nf_logger nf_arp_logger __read_mostly = {
159         .name           = "nf_log_arp",
160         .type           = NF_LOG_TYPE_LOG,
161         .logfn          = nf_log_arp_packet,
162         .me             = THIS_MODULE,
163 };
164
165 static void nf_log_dump_sk_uid_gid(struct net *net, struct nf_log_buf *m,
166                                    struct sock *sk)
167 {
168         if (!sk || !sk_fullsock(sk) || !net_eq(net, sock_net(sk)))
169                 return;
170
171         read_lock_bh(&sk->sk_callback_lock);
172         if (sk->sk_socket && sk->sk_socket->file) {
173                 const struct cred *cred = sk->sk_socket->file->f_cred;
174
175                 nf_log_buf_add(m, "UID=%u GID=%u ",
176                                from_kuid_munged(&init_user_ns, cred->fsuid),
177                                from_kgid_munged(&init_user_ns, cred->fsgid));
178         }
179         read_unlock_bh(&sk->sk_callback_lock);
180 }
181
182 static noinline_for_stack int
183 nf_log_dump_tcp_header(struct nf_log_buf *m,
184                        const struct sk_buff *skb,
185                        u8 proto, int fragment,
186                        unsigned int offset,
187                        unsigned int logflags)
188 {
189         struct tcphdr _tcph;
190         const struct tcphdr *th;
191
192         /* Max length: 10 "PROTO=TCP " */
193         nf_log_buf_add(m, "PROTO=TCP ");
194
195         if (fragment)
196                 return 0;
197
198         /* Max length: 25 "INCOMPLETE [65535 bytes] " */
199         th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
200         if (!th) {
201                 nf_log_buf_add(m, "INCOMPLETE [%u bytes] ", skb->len - offset);
202                 return 1;
203         }
204
205         /* Max length: 20 "SPT=65535 DPT=65535 " */
206         nf_log_buf_add(m, "SPT=%u DPT=%u ",
207                        ntohs(th->source), ntohs(th->dest));
208         /* Max length: 30 "SEQ=4294967295 ACK=4294967295 " */
209         if (logflags & NF_LOG_TCPSEQ) {
210                 nf_log_buf_add(m, "SEQ=%u ACK=%u ",
211                                ntohl(th->seq), ntohl(th->ack_seq));
212         }
213
214         /* Max length: 13 "WINDOW=65535 " */
215         nf_log_buf_add(m, "WINDOW=%u ", ntohs(th->window));
216         /* Max length: 9 "RES=0x3C " */
217         nf_log_buf_add(m, "RES=0x%02x ", (u_int8_t)(ntohl(tcp_flag_word(th) &
218                                             TCP_RESERVED_BITS) >> 22));
219         /* Max length: 32 "CWR ECE URG ACK PSH RST SYN FIN " */
220         if (th->cwr)
221                 nf_log_buf_add(m, "CWR ");
222         if (th->ece)
223                 nf_log_buf_add(m, "ECE ");
224         if (th->urg)
225                 nf_log_buf_add(m, "URG ");
226         if (th->ack)
227                 nf_log_buf_add(m, "ACK ");
228         if (th->psh)
229                 nf_log_buf_add(m, "PSH ");
230         if (th->rst)
231                 nf_log_buf_add(m, "RST ");
232         if (th->syn)
233                 nf_log_buf_add(m, "SYN ");
234         if (th->fin)
235                 nf_log_buf_add(m, "FIN ");
236         /* Max length: 11 "URGP=65535 " */
237         nf_log_buf_add(m, "URGP=%u ", ntohs(th->urg_ptr));
238
239         if ((logflags & NF_LOG_TCPOPT) && th->doff * 4 > sizeof(struct tcphdr)) {
240                 unsigned int optsize = th->doff * 4 - sizeof(struct tcphdr);
241                 u8 _opt[60 - sizeof(struct tcphdr)];
242                 unsigned int i;
243                 const u8 *op;
244
245                 op = skb_header_pointer(skb, offset + sizeof(struct tcphdr),
246                                         optsize, _opt);
247                 if (!op) {
248                         nf_log_buf_add(m, "OPT (TRUNCATED)");
249                         return 1;
250                 }
251
252                 /* Max length: 127 "OPT (" 15*4*2chars ") " */
253                 nf_log_buf_add(m, "OPT (");
254                 for (i = 0; i < optsize; i++)
255                         nf_log_buf_add(m, "%02X", op[i]);
256
257                 nf_log_buf_add(m, ") ");
258         }
259
260         return 0;
261 }
262
263 static noinline_for_stack int
264 nf_log_dump_udp_header(struct nf_log_buf *m,
265                        const struct sk_buff *skb,
266                        u8 proto, int fragment,
267                        unsigned int offset)
268 {
269         struct udphdr _udph;
270         const struct udphdr *uh;
271
272         if (proto == IPPROTO_UDP)
273                 /* Max length: 10 "PROTO=UDP "     */
274                 nf_log_buf_add(m, "PROTO=UDP ");
275         else    /* Max length: 14 "PROTO=UDPLITE " */
276                 nf_log_buf_add(m, "PROTO=UDPLITE ");
277
278         if (fragment)
279                 goto out;
280
281         /* Max length: 25 "INCOMPLETE [65535 bytes] " */
282         uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
283         if (!uh) {
284                 nf_log_buf_add(m, "INCOMPLETE [%u bytes] ", skb->len - offset);
285
286                 return 1;
287         }
288
289         /* Max length: 20 "SPT=65535 DPT=65535 " */
290         nf_log_buf_add(m, "SPT=%u DPT=%u LEN=%u ",
291                        ntohs(uh->source), ntohs(uh->dest), ntohs(uh->len));
292
293 out:
294         return 0;
295 }
296
297 /* One level of recursion won't kill us */
298 static noinline_for_stack void
299 dump_ipv4_packet(struct net *net, struct nf_log_buf *m,
300                  const struct nf_loginfo *info,
301                  const struct sk_buff *skb, unsigned int iphoff)
302 {
303         const struct iphdr *ih;
304         unsigned int logflags;
305         struct iphdr _iph;
306
307         if (info->type == NF_LOG_TYPE_LOG)
308                 logflags = info->u.log.logflags;
309         else
310                 logflags = NF_LOG_DEFAULT_MASK;
311
312         ih = skb_header_pointer(skb, iphoff, sizeof(_iph), &_iph);
313         if (!ih) {
314                 nf_log_buf_add(m, "TRUNCATED");
315                 return;
316         }
317
318         /* Important fields:
319          * TOS, len, DF/MF, fragment offset, TTL, src, dst, options.
320          * Max length: 40 "SRC=255.255.255.255 DST=255.255.255.255 "
321          */
322         nf_log_buf_add(m, "SRC=%pI4 DST=%pI4 ", &ih->saddr, &ih->daddr);
323
324         /* Max length: 46 "LEN=65535 TOS=0xFF PREC=0xFF TTL=255 ID=65535 " */
325         nf_log_buf_add(m, "LEN=%u TOS=0x%02X PREC=0x%02X TTL=%u ID=%u ",
326                        iph_totlen(skb, ih), ih->tos & IPTOS_TOS_MASK,
327                        ih->tos & IPTOS_PREC_MASK, ih->ttl, ntohs(ih->id));
328
329         /* Max length: 6 "CE DF MF " */
330         if (ntohs(ih->frag_off) & IP_CE)
331                 nf_log_buf_add(m, "CE ");
332         if (ntohs(ih->frag_off) & IP_DF)
333                 nf_log_buf_add(m, "DF ");
334         if (ntohs(ih->frag_off) & IP_MF)
335                 nf_log_buf_add(m, "MF ");
336
337         /* Max length: 11 "FRAG:65535 " */
338         if (ntohs(ih->frag_off) & IP_OFFSET)
339                 nf_log_buf_add(m, "FRAG:%u ", ntohs(ih->frag_off) & IP_OFFSET);
340
341         if ((logflags & NF_LOG_IPOPT) &&
342             ih->ihl * 4 > sizeof(struct iphdr)) {
343                 unsigned char _opt[4 * 15 - sizeof(struct iphdr)];
344                 const unsigned char *op;
345                 unsigned int i, optsize;
346
347                 optsize = ih->ihl * 4 - sizeof(struct iphdr);
348                 op = skb_header_pointer(skb, iphoff + sizeof(_iph),
349                                         optsize, _opt);
350                 if (!op) {
351                         nf_log_buf_add(m, "TRUNCATED");
352                         return;
353                 }
354
355                 /* Max length: 127 "OPT (" 15*4*2chars ") " */
356                 nf_log_buf_add(m, "OPT (");
357                 for (i = 0; i < optsize; i++)
358                         nf_log_buf_add(m, "%02X", op[i]);
359                 nf_log_buf_add(m, ") ");
360         }
361
362         switch (ih->protocol) {
363         case IPPROTO_TCP:
364                 if (nf_log_dump_tcp_header(m, skb, ih->protocol,
365                                            ntohs(ih->frag_off) & IP_OFFSET,
366                                            iphoff + ih->ihl * 4, logflags))
367                         return;
368                 break;
369         case IPPROTO_UDP:
370         case IPPROTO_UDPLITE:
371                 if (nf_log_dump_udp_header(m, skb, ih->protocol,
372                                            ntohs(ih->frag_off) & IP_OFFSET,
373                                            iphoff + ih->ihl * 4))
374                         return;
375                 break;
376         case IPPROTO_ICMP: {
377                 static const size_t required_len[NR_ICMP_TYPES + 1] = {
378                         [ICMP_ECHOREPLY] = 4,
379                         [ICMP_DEST_UNREACH] = 8 + sizeof(struct iphdr),
380                         [ICMP_SOURCE_QUENCH] = 8 + sizeof(struct iphdr),
381                         [ICMP_REDIRECT] = 8 + sizeof(struct iphdr),
382                         [ICMP_ECHO] = 4,
383                         [ICMP_TIME_EXCEEDED] = 8 + sizeof(struct iphdr),
384                         [ICMP_PARAMETERPROB] = 8 + sizeof(struct iphdr),
385                         [ICMP_TIMESTAMP] = 20,
386                         [ICMP_TIMESTAMPREPLY] = 20,
387                         [ICMP_ADDRESS] = 12,
388                         [ICMP_ADDRESSREPLY] = 12 };
389                 const struct icmphdr *ich;
390                 struct icmphdr _icmph;
391
392                 /* Max length: 11 "PROTO=ICMP " */
393                 nf_log_buf_add(m, "PROTO=ICMP ");
394
395                 if (ntohs(ih->frag_off) & IP_OFFSET)
396                         break;
397
398                 /* Max length: 25 "INCOMPLETE [65535 bytes] " */
399                 ich = skb_header_pointer(skb, iphoff + ih->ihl * 4,
400                                          sizeof(_icmph), &_icmph);
401                 if (!ich) {
402                         nf_log_buf_add(m, "INCOMPLETE [%u bytes] ",
403                                        skb->len - iphoff - ih->ihl * 4);
404                         break;
405                 }
406
407                 /* Max length: 18 "TYPE=255 CODE=255 " */
408                 nf_log_buf_add(m, "TYPE=%u CODE=%u ", ich->type, ich->code);
409
410                 /* Max length: 25 "INCOMPLETE [65535 bytes] " */
411                 if (ich->type <= NR_ICMP_TYPES &&
412                     required_len[ich->type] &&
413                     skb->len - iphoff - ih->ihl * 4 < required_len[ich->type]) {
414                         nf_log_buf_add(m, "INCOMPLETE [%u bytes] ",
415                                        skb->len - iphoff - ih->ihl * 4);
416                         break;
417                 }
418
419                 switch (ich->type) {
420                 case ICMP_ECHOREPLY:
421                 case ICMP_ECHO:
422                         /* Max length: 19 "ID=65535 SEQ=65535 " */
423                         nf_log_buf_add(m, "ID=%u SEQ=%u ",
424                                        ntohs(ich->un.echo.id),
425                                        ntohs(ich->un.echo.sequence));
426                         break;
427
428                 case ICMP_PARAMETERPROB:
429                         /* Max length: 14 "PARAMETER=255 " */
430                         nf_log_buf_add(m, "PARAMETER=%u ",
431                                        ntohl(ich->un.gateway) >> 24);
432                         break;
433                 case ICMP_REDIRECT:
434                         /* Max length: 24 "GATEWAY=255.255.255.255 " */
435                         nf_log_buf_add(m, "GATEWAY=%pI4 ", &ich->un.gateway);
436                         fallthrough;
437                 case ICMP_DEST_UNREACH:
438                 case ICMP_SOURCE_QUENCH:
439                 case ICMP_TIME_EXCEEDED:
440                         /* Max length: 3+maxlen */
441                         if (!iphoff) { /* Only recurse once. */
442                                 nf_log_buf_add(m, "[");
443                                 dump_ipv4_packet(net, m, info, skb,
444                                                  iphoff + ih->ihl * 4 + sizeof(_icmph));
445                                 nf_log_buf_add(m, "] ");
446                         }
447
448                         /* Max length: 10 "MTU=65535 " */
449                         if (ich->type == ICMP_DEST_UNREACH &&
450                             ich->code == ICMP_FRAG_NEEDED) {
451                                 nf_log_buf_add(m, "MTU=%u ",
452                                                ntohs(ich->un.frag.mtu));
453                         }
454                 }
455                 break;
456         }
457         /* Max Length */
458         case IPPROTO_AH: {
459                 const struct ip_auth_hdr *ah;
460                 struct ip_auth_hdr _ahdr;
461
462                 if (ntohs(ih->frag_off) & IP_OFFSET)
463                         break;
464
465                 /* Max length: 9 "PROTO=AH " */
466                 nf_log_buf_add(m, "PROTO=AH ");
467
468                 /* Max length: 25 "INCOMPLETE [65535 bytes] " */
469                 ah = skb_header_pointer(skb, iphoff + ih->ihl * 4,
470                                         sizeof(_ahdr), &_ahdr);
471                 if (!ah) {
472                         nf_log_buf_add(m, "INCOMPLETE [%u bytes] ",
473                                        skb->len - iphoff - ih->ihl * 4);
474                         break;
475                 }
476
477                 /* Length: 15 "SPI=0xF1234567 " */
478                 nf_log_buf_add(m, "SPI=0x%x ", ntohl(ah->spi));
479                 break;
480         }
481         case IPPROTO_ESP: {
482                 const struct ip_esp_hdr *eh;
483                 struct ip_esp_hdr _esph;
484
485                 /* Max length: 10 "PROTO=ESP " */
486                 nf_log_buf_add(m, "PROTO=ESP ");
487
488                 if (ntohs(ih->frag_off) & IP_OFFSET)
489                         break;
490
491                 /* Max length: 25 "INCOMPLETE [65535 bytes] " */
492                 eh = skb_header_pointer(skb, iphoff + ih->ihl * 4,
493                                         sizeof(_esph), &_esph);
494                 if (!eh) {
495                         nf_log_buf_add(m, "INCOMPLETE [%u bytes] ",
496                                        skb->len - iphoff - ih->ihl * 4);
497                         break;
498                 }
499
500                 /* Length: 15 "SPI=0xF1234567 " */
501                 nf_log_buf_add(m, "SPI=0x%x ", ntohl(eh->spi));
502                 break;
503         }
504         /* Max length: 10 "PROTO 255 " */
505         default:
506                 nf_log_buf_add(m, "PROTO=%u ", ih->protocol);
507         }
508
509         /* Max length: 15 "UID=4294967295 " */
510         if ((logflags & NF_LOG_UID) && !iphoff)
511                 nf_log_dump_sk_uid_gid(net, m, skb->sk);
512
513         /* Max length: 16 "MARK=0xFFFFFFFF " */
514         if (!iphoff && skb->mark)
515                 nf_log_buf_add(m, "MARK=0x%x ", skb->mark);
516
517         /* Proto    Max log string length */
518         /* IP:      40+46+6+11+127 = 230 */
519         /* TCP:     10+max(25,20+30+13+9+32+11+127) = 252 */
520         /* UDP:     10+max(25,20) = 35 */
521         /* UDPLITE: 14+max(25,20) = 39 */
522         /* ICMP:    11+max(25, 18+25+max(19,14,24+3+n+10,3+n+10)) = 91+n */
523         /* ESP:     10+max(25)+15 = 50 */
524         /* AH:      9+max(25)+15 = 49 */
525         /* unknown: 10 */
526
527         /* (ICMP allows recursion one level deep) */
528         /* maxlen =  IP + ICMP +  IP + max(TCP,UDP,ICMP,unknown) */
529         /* maxlen = 230+   91  + 230 + 252 = 803 */
530 }
531
532 static noinline_for_stack void
533 dump_ipv6_packet(struct net *net, struct nf_log_buf *m,
534                  const struct nf_loginfo *info,
535                  const struct sk_buff *skb, unsigned int ip6hoff,
536                  int recurse)
537 {
538         const struct ipv6hdr *ih;
539         unsigned int hdrlen = 0;
540         unsigned int logflags;
541         struct ipv6hdr _ip6h;
542         unsigned int ptr;
543         u8 currenthdr;
544         int fragment;
545
546         if (info->type == NF_LOG_TYPE_LOG)
547                 logflags = info->u.log.logflags;
548         else
549                 logflags = NF_LOG_DEFAULT_MASK;
550
551         ih = skb_header_pointer(skb, ip6hoff, sizeof(_ip6h), &_ip6h);
552         if (!ih) {
553                 nf_log_buf_add(m, "TRUNCATED");
554                 return;
555         }
556
557         /* Max length: 88 "SRC=0000.0000.0000.0000.0000.0000.0000.0000 DST=0000.0000.0000.0000.0000.0000.0000.0000 " */
558         nf_log_buf_add(m, "SRC=%pI6 DST=%pI6 ", &ih->saddr, &ih->daddr);
559
560         /* Max length: 44 "LEN=65535 TC=255 HOPLIMIT=255 FLOWLBL=FFFFF " */
561         nf_log_buf_add(m, "LEN=%zu TC=%u HOPLIMIT=%u FLOWLBL=%u ",
562                        ntohs(ih->payload_len) + sizeof(struct ipv6hdr),
563                        (ntohl(*(__be32 *)ih) & 0x0ff00000) >> 20,
564                        ih->hop_limit,
565                        (ntohl(*(__be32 *)ih) & 0x000fffff));
566
567         fragment = 0;
568         ptr = ip6hoff + sizeof(struct ipv6hdr);
569         currenthdr = ih->nexthdr;
570         while (currenthdr != NEXTHDR_NONE && nf_ip6_ext_hdr(currenthdr)) {
571                 struct ipv6_opt_hdr _hdr;
572                 const struct ipv6_opt_hdr *hp;
573
574                 hp = skb_header_pointer(skb, ptr, sizeof(_hdr), &_hdr);
575                 if (!hp) {
576                         nf_log_buf_add(m, "TRUNCATED");
577                         return;
578                 }
579
580                 /* Max length: 48 "OPT (...) " */
581                 if (logflags & NF_LOG_IPOPT)
582                         nf_log_buf_add(m, "OPT ( ");
583
584                 switch (currenthdr) {
585                 case IPPROTO_FRAGMENT: {
586                         struct frag_hdr _fhdr;
587                         const struct frag_hdr *fh;
588
589                         nf_log_buf_add(m, "FRAG:");
590                         fh = skb_header_pointer(skb, ptr, sizeof(_fhdr),
591                                                 &_fhdr);
592                         if (!fh) {
593                                 nf_log_buf_add(m, "TRUNCATED ");
594                                 return;
595                         }
596
597                         /* Max length: 6 "65535 " */
598                         nf_log_buf_add(m, "%u ", ntohs(fh->frag_off) & 0xFFF8);
599
600                         /* Max length: 11 "INCOMPLETE " */
601                         if (fh->frag_off & htons(0x0001))
602                                 nf_log_buf_add(m, "INCOMPLETE ");
603
604                         nf_log_buf_add(m, "ID:%08x ",
605                                        ntohl(fh->identification));
606
607                         if (ntohs(fh->frag_off) & 0xFFF8)
608                                 fragment = 1;
609
610                         hdrlen = 8;
611                         break;
612                 }
613                 case IPPROTO_DSTOPTS:
614                 case IPPROTO_ROUTING:
615                 case IPPROTO_HOPOPTS:
616                         if (fragment) {
617                                 if (logflags & NF_LOG_IPOPT)
618                                         nf_log_buf_add(m, ")");
619                                 return;
620                         }
621                         hdrlen = ipv6_optlen(hp);
622                         break;
623                 /* Max Length */
624                 case IPPROTO_AH:
625                         if (logflags & NF_LOG_IPOPT) {
626                                 struct ip_auth_hdr _ahdr;
627                                 const struct ip_auth_hdr *ah;
628
629                                 /* Max length: 3 "AH " */
630                                 nf_log_buf_add(m, "AH ");
631
632                                 if (fragment) {
633                                         nf_log_buf_add(m, ")");
634                                         return;
635                                 }
636
637                                 ah = skb_header_pointer(skb, ptr, sizeof(_ahdr),
638                                                         &_ahdr);
639                                 if (!ah) {
640                                         /* Max length: 26 "INCOMPLETE [65535 bytes] )" */
641                                         nf_log_buf_add(m, "INCOMPLETE [%u bytes] )",
642                                                        skb->len - ptr);
643                                         return;
644                                 }
645
646                                 /* Length: 15 "SPI=0xF1234567 */
647                                 nf_log_buf_add(m, "SPI=0x%x ", ntohl(ah->spi));
648                         }
649
650                         hdrlen = ipv6_authlen(hp);
651                         break;
652                 case IPPROTO_ESP:
653                         if (logflags & NF_LOG_IPOPT) {
654                                 struct ip_esp_hdr _esph;
655                                 const struct ip_esp_hdr *eh;
656
657                                 /* Max length: 4 "ESP " */
658                                 nf_log_buf_add(m, "ESP ");
659
660                                 if (fragment) {
661                                         nf_log_buf_add(m, ")");
662                                         return;
663                                 }
664
665                                 /* Max length: 26 "INCOMPLETE [65535 bytes] )" */
666                                 eh = skb_header_pointer(skb, ptr, sizeof(_esph),
667                                                         &_esph);
668                                 if (!eh) {
669                                         nf_log_buf_add(m, "INCOMPLETE [%u bytes] )",
670                                                        skb->len - ptr);
671                                         return;
672                                 }
673
674                                 /* Length: 16 "SPI=0xF1234567 )" */
675                                 nf_log_buf_add(m, "SPI=0x%x )",
676                                                ntohl(eh->spi));
677                         }
678                         return;
679                 default:
680                         /* Max length: 20 "Unknown Ext Hdr 255" */
681                         nf_log_buf_add(m, "Unknown Ext Hdr %u", currenthdr);
682                         return;
683                 }
684                 if (logflags & NF_LOG_IPOPT)
685                         nf_log_buf_add(m, ") ");
686
687                 currenthdr = hp->nexthdr;
688                 ptr += hdrlen;
689         }
690
691         switch (currenthdr) {
692         case IPPROTO_TCP:
693                 if (nf_log_dump_tcp_header(m, skb, currenthdr, fragment,
694                                            ptr, logflags))
695                         return;
696                 break;
697         case IPPROTO_UDP:
698         case IPPROTO_UDPLITE:
699                 if (nf_log_dump_udp_header(m, skb, currenthdr, fragment, ptr))
700                         return;
701                 break;
702         case IPPROTO_ICMPV6: {
703                 struct icmp6hdr _icmp6h;
704                 const struct icmp6hdr *ic;
705
706                 /* Max length: 13 "PROTO=ICMPv6 " */
707                 nf_log_buf_add(m, "PROTO=ICMPv6 ");
708
709                 if (fragment)
710                         break;
711
712                 /* Max length: 25 "INCOMPLETE [65535 bytes] " */
713                 ic = skb_header_pointer(skb, ptr, sizeof(_icmp6h), &_icmp6h);
714                 if (!ic) {
715                         nf_log_buf_add(m, "INCOMPLETE [%u bytes] ",
716                                        skb->len - ptr);
717                         return;
718                 }
719
720                 /* Max length: 18 "TYPE=255 CODE=255 " */
721                 nf_log_buf_add(m, "TYPE=%u CODE=%u ",
722                                ic->icmp6_type, ic->icmp6_code);
723
724                 switch (ic->icmp6_type) {
725                 case ICMPV6_ECHO_REQUEST:
726                 case ICMPV6_ECHO_REPLY:
727                         /* Max length: 19 "ID=65535 SEQ=65535 " */
728                         nf_log_buf_add(m, "ID=%u SEQ=%u ",
729                                        ntohs(ic->icmp6_identifier),
730                                        ntohs(ic->icmp6_sequence));
731                         break;
732                 case ICMPV6_MGM_QUERY:
733                 case ICMPV6_MGM_REPORT:
734                 case ICMPV6_MGM_REDUCTION:
735                         break;
736
737                 case ICMPV6_PARAMPROB:
738                         /* Max length: 17 "POINTER=ffffffff " */
739                         nf_log_buf_add(m, "POINTER=%08x ",
740                                        ntohl(ic->icmp6_pointer));
741                         fallthrough;
742                 case ICMPV6_DEST_UNREACH:
743                 case ICMPV6_PKT_TOOBIG:
744                 case ICMPV6_TIME_EXCEED:
745                         /* Max length: 3+maxlen */
746                         if (recurse) {
747                                 nf_log_buf_add(m, "[");
748                                 dump_ipv6_packet(net, m, info, skb,
749                                                  ptr + sizeof(_icmp6h), 0);
750                                 nf_log_buf_add(m, "] ");
751                         }
752
753                         /* Max length: 10 "MTU=65535 " */
754                         if (ic->icmp6_type == ICMPV6_PKT_TOOBIG) {
755                                 nf_log_buf_add(m, "MTU=%u ",
756                                                ntohl(ic->icmp6_mtu));
757                         }
758                 }
759                 break;
760         }
761         /* Max length: 10 "PROTO=255 " */
762         default:
763                 nf_log_buf_add(m, "PROTO=%u ", currenthdr);
764         }
765
766         /* Max length: 15 "UID=4294967295 " */
767         if ((logflags & NF_LOG_UID) && recurse)
768                 nf_log_dump_sk_uid_gid(net, m, skb->sk);
769
770         /* Max length: 16 "MARK=0xFFFFFFFF " */
771         if (recurse && skb->mark)
772                 nf_log_buf_add(m, "MARK=0x%x ", skb->mark);
773 }
774
775 static void dump_mac_header(struct nf_log_buf *m,
776                             const struct nf_loginfo *info,
777                             const struct sk_buff *skb)
778 {
779         struct net_device *dev = skb->dev;
780         unsigned int logflags = 0;
781
782         if (info->type == NF_LOG_TYPE_LOG)
783                 logflags = info->u.log.logflags;
784
785         if (!(logflags & NF_LOG_MACDECODE))
786                 goto fallback;
787
788         switch (dev->type) {
789         case ARPHRD_ETHER:
790                 nf_log_buf_add(m, "MACSRC=%pM MACDST=%pM ",
791                                eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest);
792                 nf_log_dump_vlan(m, skb);
793                 nf_log_buf_add(m, "MACPROTO=%04x ",
794                                ntohs(eth_hdr(skb)->h_proto));
795                 return;
796         default:
797                 break;
798         }
799
800 fallback:
801         nf_log_buf_add(m, "MAC=");
802         if (dev->hard_header_len &&
803             skb->mac_header != skb->network_header) {
804                 const unsigned char *p = skb_mac_header(skb);
805                 unsigned int i;
806
807                 if (dev->type == ARPHRD_SIT) {
808                         p -= ETH_HLEN;
809
810                         if (p < skb->head)
811                                 p = NULL;
812                 }
813
814                 if (p) {
815                         nf_log_buf_add(m, "%02x", *p++);
816                         for (i = 1; i < dev->hard_header_len; i++)
817                                 nf_log_buf_add(m, ":%02x", *p++);
818                 }
819
820                 if (dev->type == ARPHRD_SIT) {
821                         const struct iphdr *iph =
822                                 (struct iphdr *)skb_mac_header(skb);
823
824                         nf_log_buf_add(m, " TUNNEL=%pI4->%pI4", &iph->saddr,
825                                        &iph->daddr);
826                 }
827         }
828         nf_log_buf_add(m, " ");
829 }
830
831 static void nf_log_ip_packet(struct net *net, u_int8_t pf,
832                              unsigned int hooknum, const struct sk_buff *skb,
833                              const struct net_device *in,
834                              const struct net_device *out,
835                              const struct nf_loginfo *loginfo,
836                              const char *prefix)
837 {
838         struct nf_log_buf *m;
839
840         if (!nf_log_allowed(net))
841                 return;
842
843         m = nf_log_buf_open();
844
845         if (!loginfo)
846                 loginfo = &default_loginfo;
847
848         nf_log_dump_packet_common(m, pf, hooknum, skb, in,
849                                   out, loginfo, prefix, net);
850
851         if (in)
852                 dump_mac_header(m, loginfo, skb);
853
854         dump_ipv4_packet(net, m, loginfo, skb, skb_network_offset(skb));
855
856         nf_log_buf_close(m);
857 }
858
859 static struct nf_logger nf_ip_logger __read_mostly = {
860         .name           = "nf_log_ipv4",
861         .type           = NF_LOG_TYPE_LOG,
862         .logfn          = nf_log_ip_packet,
863         .me             = THIS_MODULE,
864 };
865
866 static void nf_log_ip6_packet(struct net *net, u_int8_t pf,
867                               unsigned int hooknum, const struct sk_buff *skb,
868                               const struct net_device *in,
869                               const struct net_device *out,
870                               const struct nf_loginfo *loginfo,
871                               const char *prefix)
872 {
873         struct nf_log_buf *m;
874
875         if (!nf_log_allowed(net))
876                 return;
877
878         m = nf_log_buf_open();
879
880         if (!loginfo)
881                 loginfo = &default_loginfo;
882
883         nf_log_dump_packet_common(m, pf, hooknum, skb, in, out,
884                                   loginfo, prefix, net);
885
886         if (in)
887                 dump_mac_header(m, loginfo, skb);
888
889         dump_ipv6_packet(net, m, loginfo, skb, skb_network_offset(skb), 1);
890
891         nf_log_buf_close(m);
892 }
893
894 static struct nf_logger nf_ip6_logger __read_mostly = {
895         .name           = "nf_log_ipv6",
896         .type           = NF_LOG_TYPE_LOG,
897         .logfn          = nf_log_ip6_packet,
898         .me             = THIS_MODULE,
899 };
900
901 static void nf_log_unknown_packet(struct net *net, u_int8_t pf,
902                                   unsigned int hooknum,
903                                   const struct sk_buff *skb,
904                                   const struct net_device *in,
905                                   const struct net_device *out,
906                                   const struct nf_loginfo *loginfo,
907                                   const char *prefix)
908 {
909         struct nf_log_buf *m;
910
911         if (!nf_log_allowed(net))
912                 return;
913
914         m = nf_log_buf_open();
915
916         if (!loginfo)
917                 loginfo = &default_loginfo;
918
919         nf_log_dump_packet_common(m, pf, hooknum, skb, in, out, loginfo,
920                                   prefix, net);
921
922         dump_mac_header(m, loginfo, skb);
923
924         nf_log_buf_close(m);
925 }
926
927 static void nf_log_netdev_packet(struct net *net, u_int8_t pf,
928                                  unsigned int hooknum,
929                                  const struct sk_buff *skb,
930                                  const struct net_device *in,
931                                  const struct net_device *out,
932                                  const struct nf_loginfo *loginfo,
933                                  const char *prefix)
934 {
935         switch (skb->protocol) {
936         case htons(ETH_P_IP):
937                 nf_log_ip_packet(net, pf, hooknum, skb, in, out, loginfo, prefix);
938                 break;
939         case htons(ETH_P_IPV6):
940                 nf_log_ip6_packet(net, pf, hooknum, skb, in, out, loginfo, prefix);
941                 break;
942         case htons(ETH_P_ARP):
943         case htons(ETH_P_RARP):
944                 nf_log_arp_packet(net, pf, hooknum, skb, in, out, loginfo, prefix);
945                 break;
946         default:
947                 nf_log_unknown_packet(net, pf, hooknum, skb,
948                                       in, out, loginfo, prefix);
949                 break;
950         }
951 }
952
953 static struct nf_logger nf_netdev_logger __read_mostly = {
954         .name           = "nf_log_netdev",
955         .type           = NF_LOG_TYPE_LOG,
956         .logfn          = nf_log_netdev_packet,
957         .me             = THIS_MODULE,
958 };
959
960 static struct nf_logger nf_bridge_logger __read_mostly = {
961         .name           = "nf_log_bridge",
962         .type           = NF_LOG_TYPE_LOG,
963         .logfn          = nf_log_netdev_packet,
964         .me             = THIS_MODULE,
965 };
966
967 static int __net_init nf_log_syslog_net_init(struct net *net)
968 {
969         int ret = nf_log_set(net, NFPROTO_IPV4, &nf_ip_logger);
970
971         if (ret)
972                 return ret;
973
974         ret = nf_log_set(net, NFPROTO_ARP, &nf_arp_logger);
975         if (ret)
976                 goto err1;
977
978         ret = nf_log_set(net, NFPROTO_IPV6, &nf_ip6_logger);
979         if (ret)
980                 goto err2;
981
982         ret = nf_log_set(net, NFPROTO_NETDEV, &nf_netdev_logger);
983         if (ret)
984                 goto err3;
985
986         ret = nf_log_set(net, NFPROTO_BRIDGE, &nf_bridge_logger);
987         if (ret)
988                 goto err4;
989         return 0;
990 err4:
991         nf_log_unset(net, &nf_netdev_logger);
992 err3:
993         nf_log_unset(net, &nf_ip6_logger);
994 err2:
995         nf_log_unset(net, &nf_arp_logger);
996 err1:
997         nf_log_unset(net, &nf_ip_logger);
998         return ret;
999 }
1000
1001 static void __net_exit nf_log_syslog_net_exit(struct net *net)
1002 {
1003         nf_log_unset(net, &nf_ip_logger);
1004         nf_log_unset(net, &nf_arp_logger);
1005         nf_log_unset(net, &nf_ip6_logger);
1006         nf_log_unset(net, &nf_netdev_logger);
1007         nf_log_unset(net, &nf_bridge_logger);
1008 }
1009
1010 static struct pernet_operations nf_log_syslog_net_ops = {
1011         .init = nf_log_syslog_net_init,
1012         .exit = nf_log_syslog_net_exit,
1013 };
1014
1015 static int __init nf_log_syslog_init(void)
1016 {
1017         int ret;
1018
1019         ret = register_pernet_subsys(&nf_log_syslog_net_ops);
1020         if (ret < 0)
1021                 return ret;
1022
1023         ret = nf_log_register(NFPROTO_IPV4, &nf_ip_logger);
1024         if (ret < 0)
1025                 goto err1;
1026
1027         ret = nf_log_register(NFPROTO_ARP, &nf_arp_logger);
1028         if (ret < 0)
1029                 goto err2;
1030
1031         ret = nf_log_register(NFPROTO_IPV6, &nf_ip6_logger);
1032         if (ret < 0)
1033                 goto err3;
1034
1035         ret = nf_log_register(NFPROTO_NETDEV, &nf_netdev_logger);
1036         if (ret < 0)
1037                 goto err4;
1038
1039         ret = nf_log_register(NFPROTO_BRIDGE, &nf_bridge_logger);
1040         if (ret < 0)
1041                 goto err5;
1042
1043         return 0;
1044 err5:
1045         nf_log_unregister(&nf_netdev_logger);
1046 err4:
1047         nf_log_unregister(&nf_ip6_logger);
1048 err3:
1049         nf_log_unregister(&nf_arp_logger);
1050 err2:
1051         nf_log_unregister(&nf_ip_logger);
1052 err1:
1053         pr_err("failed to register logger\n");
1054         unregister_pernet_subsys(&nf_log_syslog_net_ops);
1055         return ret;
1056 }
1057
1058 static void __exit nf_log_syslog_exit(void)
1059 {
1060         unregister_pernet_subsys(&nf_log_syslog_net_ops);
1061         nf_log_unregister(&nf_ip_logger);
1062         nf_log_unregister(&nf_arp_logger);
1063         nf_log_unregister(&nf_ip6_logger);
1064         nf_log_unregister(&nf_netdev_logger);
1065         nf_log_unregister(&nf_bridge_logger);
1066 }
1067
1068 module_init(nf_log_syslog_init);
1069 module_exit(nf_log_syslog_exit);
1070
1071 MODULE_AUTHOR("Netfilter Core Team <coreteam@netfilter.org>");
1072 MODULE_DESCRIPTION("Netfilter syslog packet logging");
1073 MODULE_LICENSE("GPL");
1074 MODULE_ALIAS("nf_log_arp");
1075 MODULE_ALIAS("nf_log_bridge");
1076 MODULE_ALIAS("nf_log_ipv4");
1077 MODULE_ALIAS("nf_log_ipv6");
1078 MODULE_ALIAS("nf_log_netdev");
1079 MODULE_ALIAS_NF_LOGGER(AF_BRIDGE, 0);
1080 MODULE_ALIAS_NF_LOGGER(AF_INET, 0);
1081 MODULE_ALIAS_NF_LOGGER(3, 0);
1082 MODULE_ALIAS_NF_LOGGER(5, 0); /* NFPROTO_NETDEV */
1083 MODULE_ALIAS_NF_LOGGER(AF_INET6, 0);