ide-cd: signedness warning fix again
[pandora-kernel.git] / net / ipv4 / netfilter / nf_nat_snmp_basic.c
1 /*
2  * nf_nat_snmp_basic.c
3  *
4  * Basic SNMP Application Layer Gateway
5  *
6  * This IP NAT module is intended for use with SNMP network
7  * discovery and monitoring applications where target networks use
8  * conflicting private address realms.
9  *
10  * Static NAT is used to remap the networks from the view of the network
11  * management system at the IP layer, and this module remaps some application
12  * layer addresses to match.
13  *
14  * The simplest form of ALG is performed, where only tagged IP addresses
15  * are modified.  The module does not need to be MIB aware and only scans
16  * messages at the ASN.1/BER level.
17  *
18  * Currently, only SNMPv1 and SNMPv2 are supported.
19  *
20  * More information on ALG and associated issues can be found in
21  * RFC 2962
22  *
23  * The ASB.1/BER parsing code is derived from the gxsnmp package by Gregory
24  * McLean & Jochen Friedrich, stripped down for use in the kernel.
25  *
26  * Copyright (c) 2000 RP Internet (www.rpi.net.au).
27  *
28  * This program is free software; you can redistribute it and/or modify
29  * it under the terms of the GNU General Public License as published by
30  * the Free Software Foundation; either version 2 of the License, or
31  * (at your option) any later version.
32  * This program is distributed in the hope that it will be useful,
33  * but WITHOUT ANY WARRANTY; without even the implied warranty of
34  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
35  * GNU General Public License for more details.
36  * You should have received a copy of the GNU General Public License
37  * along with this program; if not, write to the Free Software
38  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
39  *
40  * Author: James Morris <jmorris@intercode.com.au>
41  */
42 #include <linux/module.h>
43 #include <linux/moduleparam.h>
44 #include <linux/types.h>
45 #include <linux/kernel.h>
46 #include <linux/slab.h>
47 #include <linux/in.h>
48 #include <linux/ip.h>
49 #include <linux/udp.h>
50 #include <net/checksum.h>
51 #include <net/udp.h>
52
53 #include <net/netfilter/nf_nat.h>
54 #include <net/netfilter/nf_conntrack_expect.h>
55 #include <net/netfilter/nf_conntrack_helper.h>
56 #include <net/netfilter/nf_nat_helper.h>
57 #include <linux/netfilter/nf_conntrack_snmp.h>
58
59 MODULE_LICENSE("GPL");
60 MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
61 MODULE_DESCRIPTION("Basic SNMP Application Layer Gateway");
62 MODULE_ALIAS("ip_nat_snmp_basic");
63
64 #define SNMP_PORT 161
65 #define SNMP_TRAP_PORT 162
66 #define NOCT1(n) (*(u8 *)(n))
67
68 static int debug;
69 static DEFINE_SPINLOCK(snmp_lock);
70
71 /*
72  * Application layer address mapping mimics the NAT mapping, but
73  * only for the first octet in this case (a more flexible system
74  * can be implemented if needed).
75  */
76 struct oct1_map
77 {
78         u_int8_t from;
79         u_int8_t to;
80 };
81
82
83 /*****************************************************************************
84  *
85  * Basic ASN.1 decoding routines (gxsnmp author Dirk Wisse)
86  *
87  *****************************************************************************/
88
89 /* Class */
90 #define ASN1_UNI        0       /* Universal */
91 #define ASN1_APL        1       /* Application */
92 #define ASN1_CTX        2       /* Context */
93 #define ASN1_PRV        3       /* Private */
94
95 /* Tag */
96 #define ASN1_EOC        0       /* End Of Contents */
97 #define ASN1_BOL        1       /* Boolean */
98 #define ASN1_INT        2       /* Integer */
99 #define ASN1_BTS        3       /* Bit String */
100 #define ASN1_OTS        4       /* Octet String */
101 #define ASN1_NUL        5       /* Null */
102 #define ASN1_OJI        6       /* Object Identifier  */
103 #define ASN1_OJD        7       /* Object Description */
104 #define ASN1_EXT        8       /* External */
105 #define ASN1_SEQ        16      /* Sequence */
106 #define ASN1_SET        17      /* Set */
107 #define ASN1_NUMSTR     18      /* Numerical String */
108 #define ASN1_PRNSTR     19      /* Printable String */
109 #define ASN1_TEXSTR     20      /* Teletext String */
110 #define ASN1_VIDSTR     21      /* Video String */
111 #define ASN1_IA5STR     22      /* IA5 String */
112 #define ASN1_UNITIM     23      /* Universal Time */
113 #define ASN1_GENTIM     24      /* General Time */
114 #define ASN1_GRASTR     25      /* Graphical String */
115 #define ASN1_VISSTR     26      /* Visible String */
116 #define ASN1_GENSTR     27      /* General String */
117
118 /* Primitive / Constructed methods*/
119 #define ASN1_PRI        0       /* Primitive */
120 #define ASN1_CON        1       /* Constructed */
121
122 /*
123  * Error codes.
124  */
125 #define ASN1_ERR_NOERROR                0
126 #define ASN1_ERR_DEC_EMPTY              2
127 #define ASN1_ERR_DEC_EOC_MISMATCH       3
128 #define ASN1_ERR_DEC_LENGTH_MISMATCH    4
129 #define ASN1_ERR_DEC_BADVALUE           5
130
131 /*
132  * ASN.1 context.
133  */
134 struct asn1_ctx
135 {
136         int error;                      /* Error condition */
137         unsigned char *pointer;         /* Octet just to be decoded */
138         unsigned char *begin;           /* First octet */
139         unsigned char *end;             /* Octet after last octet */
140 };
141
142 /*
143  * Octet string (not null terminated)
144  */
145 struct asn1_octstr
146 {
147         unsigned char *data;
148         unsigned int len;
149 };
150
151 static void asn1_open(struct asn1_ctx *ctx,
152                       unsigned char *buf,
153                       unsigned int len)
154 {
155         ctx->begin = buf;
156         ctx->end = buf + len;
157         ctx->pointer = buf;
158         ctx->error = ASN1_ERR_NOERROR;
159 }
160
161 static unsigned char asn1_octet_decode(struct asn1_ctx *ctx, unsigned char *ch)
162 {
163         if (ctx->pointer >= ctx->end) {
164                 ctx->error = ASN1_ERR_DEC_EMPTY;
165                 return 0;
166         }
167         *ch = *(ctx->pointer)++;
168         return 1;
169 }
170
171 static unsigned char asn1_tag_decode(struct asn1_ctx *ctx, unsigned int *tag)
172 {
173         unsigned char ch;
174
175         *tag = 0;
176
177         do
178         {
179                 if (!asn1_octet_decode(ctx, &ch))
180                         return 0;
181                 *tag <<= 7;
182                 *tag |= ch & 0x7F;
183         } while ((ch & 0x80) == 0x80);
184         return 1;
185 }
186
187 static unsigned char asn1_id_decode(struct asn1_ctx *ctx,
188                                     unsigned int *cls,
189                                     unsigned int *con,
190                                     unsigned int *tag)
191 {
192         unsigned char ch;
193
194         if (!asn1_octet_decode(ctx, &ch))
195                 return 0;
196
197         *cls = (ch & 0xC0) >> 6;
198         *con = (ch & 0x20) >> 5;
199         *tag = (ch & 0x1F);
200
201         if (*tag == 0x1F) {
202                 if (!asn1_tag_decode(ctx, tag))
203                         return 0;
204         }
205         return 1;
206 }
207
208 static unsigned char asn1_length_decode(struct asn1_ctx *ctx,
209                                         unsigned int *def,
210                                         unsigned int *len)
211 {
212         unsigned char ch, cnt;
213
214         if (!asn1_octet_decode(ctx, &ch))
215                 return 0;
216
217         if (ch == 0x80)
218                 *def = 0;
219         else {
220                 *def = 1;
221
222                 if (ch < 0x80)
223                         *len = ch;
224                 else {
225                         cnt = ch & 0x7F;
226                         *len = 0;
227
228                         while (cnt > 0) {
229                                 if (!asn1_octet_decode(ctx, &ch))
230                                         return 0;
231                                 *len <<= 8;
232                                 *len |= ch;
233                                 cnt--;
234                         }
235                 }
236         }
237
238         /* don't trust len bigger than ctx buffer */
239         if (*len > ctx->end - ctx->pointer)
240                 return 0;
241
242         return 1;
243 }
244
245 static unsigned char asn1_header_decode(struct asn1_ctx *ctx,
246                                         unsigned char **eoc,
247                                         unsigned int *cls,
248                                         unsigned int *con,
249                                         unsigned int *tag)
250 {
251         unsigned int def, len;
252
253         if (!asn1_id_decode(ctx, cls, con, tag))
254                 return 0;
255
256         def = len = 0;
257         if (!asn1_length_decode(ctx, &def, &len))
258                 return 0;
259
260         /* primitive shall be definite, indefinite shall be constructed */
261         if (*con == ASN1_PRI && !def)
262                 return 0;
263
264         if (def)
265                 *eoc = ctx->pointer + len;
266         else
267                 *eoc = NULL;
268         return 1;
269 }
270
271 static unsigned char asn1_eoc_decode(struct asn1_ctx *ctx, unsigned char *eoc)
272 {
273         unsigned char ch;
274
275         if (eoc == NULL) {
276                 if (!asn1_octet_decode(ctx, &ch))
277                         return 0;
278
279                 if (ch != 0x00) {
280                         ctx->error = ASN1_ERR_DEC_EOC_MISMATCH;
281                         return 0;
282                 }
283
284                 if (!asn1_octet_decode(ctx, &ch))
285                         return 0;
286
287                 if (ch != 0x00) {
288                         ctx->error = ASN1_ERR_DEC_EOC_MISMATCH;
289                         return 0;
290                 }
291                 return 1;
292         } else {
293                 if (ctx->pointer != eoc) {
294                         ctx->error = ASN1_ERR_DEC_LENGTH_MISMATCH;
295                         return 0;
296                 }
297                 return 1;
298         }
299 }
300
301 static unsigned char asn1_null_decode(struct asn1_ctx *ctx, unsigned char *eoc)
302 {
303         ctx->pointer = eoc;
304         return 1;
305 }
306
307 static unsigned char asn1_long_decode(struct asn1_ctx *ctx,
308                                       unsigned char *eoc,
309                                       long *integer)
310 {
311         unsigned char ch;
312         unsigned int  len;
313
314         if (!asn1_octet_decode(ctx, &ch))
315                 return 0;
316
317         *integer = (signed char) ch;
318         len = 1;
319
320         while (ctx->pointer < eoc) {
321                 if (++len > sizeof (long)) {
322                         ctx->error = ASN1_ERR_DEC_BADVALUE;
323                         return 0;
324                 }
325
326                 if (!asn1_octet_decode(ctx, &ch))
327                         return 0;
328
329                 *integer <<= 8;
330                 *integer |= ch;
331         }
332         return 1;
333 }
334
335 static unsigned char asn1_uint_decode(struct asn1_ctx *ctx,
336                                       unsigned char *eoc,
337                                       unsigned int *integer)
338 {
339         unsigned char ch;
340         unsigned int  len;
341
342         if (!asn1_octet_decode(ctx, &ch))
343                 return 0;
344
345         *integer = ch;
346         if (ch == 0) len = 0;
347         else len = 1;
348
349         while (ctx->pointer < eoc) {
350                 if (++len > sizeof (unsigned int)) {
351                         ctx->error = ASN1_ERR_DEC_BADVALUE;
352                         return 0;
353                 }
354
355                 if (!asn1_octet_decode(ctx, &ch))
356                         return 0;
357
358                 *integer <<= 8;
359                 *integer |= ch;
360         }
361         return 1;
362 }
363
364 static unsigned char asn1_ulong_decode(struct asn1_ctx *ctx,
365                                        unsigned char *eoc,
366                                        unsigned long *integer)
367 {
368         unsigned char ch;
369         unsigned int  len;
370
371         if (!asn1_octet_decode(ctx, &ch))
372                 return 0;
373
374         *integer = ch;
375         if (ch == 0) len = 0;
376         else len = 1;
377
378         while (ctx->pointer < eoc) {
379                 if (++len > sizeof (unsigned long)) {
380                         ctx->error = ASN1_ERR_DEC_BADVALUE;
381                         return 0;
382                 }
383
384                 if (!asn1_octet_decode(ctx, &ch))
385                         return 0;
386
387                 *integer <<= 8;
388                 *integer |= ch;
389         }
390         return 1;
391 }
392
393 static unsigned char asn1_octets_decode(struct asn1_ctx *ctx,
394                                         unsigned char *eoc,
395                                         unsigned char **octets,
396                                         unsigned int *len)
397 {
398         unsigned char *ptr;
399
400         *len = 0;
401
402         *octets = kmalloc(eoc - ctx->pointer, GFP_ATOMIC);
403         if (*octets == NULL) {
404                 if (net_ratelimit())
405                         pr_notice("OOM in bsalg (%d)\n", __LINE__);
406                 return 0;
407         }
408
409         ptr = *octets;
410         while (ctx->pointer < eoc) {
411                 if (!asn1_octet_decode(ctx, (unsigned char *)ptr++)) {
412                         kfree(*octets);
413                         *octets = NULL;
414                         return 0;
415                 }
416                 (*len)++;
417         }
418         return 1;
419 }
420
421 static unsigned char asn1_subid_decode(struct asn1_ctx *ctx,
422                                        unsigned long *subid)
423 {
424         unsigned char ch;
425
426         *subid = 0;
427
428         do {
429                 if (!asn1_octet_decode(ctx, &ch))
430                         return 0;
431
432                 *subid <<= 7;
433                 *subid |= ch & 0x7F;
434         } while ((ch & 0x80) == 0x80);
435         return 1;
436 }
437
438 static unsigned char asn1_oid_decode(struct asn1_ctx *ctx,
439                                      unsigned char *eoc,
440                                      unsigned long **oid,
441                                      unsigned int *len)
442 {
443         unsigned long subid;
444         unsigned long *optr;
445         size_t size;
446
447         size = eoc - ctx->pointer + 1;
448
449         /* first subid actually encodes first two subids */
450         if (size < 2 || size > ULONG_MAX/sizeof(unsigned long))
451                 return 0;
452
453         *oid = kmalloc(size * sizeof(unsigned long), GFP_ATOMIC);
454         if (*oid == NULL) {
455                 if (net_ratelimit())
456                         pr_notice("OOM in bsalg (%d)\n", __LINE__);
457                 return 0;
458         }
459
460         optr = *oid;
461
462         if (!asn1_subid_decode(ctx, &subid)) {
463                 kfree(*oid);
464                 *oid = NULL;
465                 return 0;
466         }
467
468         if (subid < 40) {
469                 optr [0] = 0;
470                 optr [1] = subid;
471         } else if (subid < 80) {
472                 optr [0] = 1;
473                 optr [1] = subid - 40;
474         } else {
475                 optr [0] = 2;
476                 optr [1] = subid - 80;
477         }
478
479         *len = 2;
480         optr += 2;
481
482         while (ctx->pointer < eoc) {
483                 if (++(*len) > size) {
484                         ctx->error = ASN1_ERR_DEC_BADVALUE;
485                         kfree(*oid);
486                         *oid = NULL;
487                         return 0;
488                 }
489
490                 if (!asn1_subid_decode(ctx, optr++)) {
491                         kfree(*oid);
492                         *oid = NULL;
493                         return 0;
494                 }
495         }
496         return 1;
497 }
498
499 /*****************************************************************************
500  *
501  * SNMP decoding routines (gxsnmp author Dirk Wisse)
502  *
503  *****************************************************************************/
504
505 /* SNMP Versions */
506 #define SNMP_V1                         0
507 #define SNMP_V2C                        1
508 #define SNMP_V2                         2
509 #define SNMP_V3                         3
510
511 /* Default Sizes */
512 #define SNMP_SIZE_COMM                  256
513 #define SNMP_SIZE_OBJECTID              128
514 #define SNMP_SIZE_BUFCHR                256
515 #define SNMP_SIZE_BUFINT                128
516 #define SNMP_SIZE_SMALLOBJECTID         16
517
518 /* Requests */
519 #define SNMP_PDU_GET                    0
520 #define SNMP_PDU_NEXT                   1
521 #define SNMP_PDU_RESPONSE               2
522 #define SNMP_PDU_SET                    3
523 #define SNMP_PDU_TRAP1                  4
524 #define SNMP_PDU_BULK                   5
525 #define SNMP_PDU_INFORM                 6
526 #define SNMP_PDU_TRAP2                  7
527
528 /* Errors */
529 #define SNMP_NOERROR                    0
530 #define SNMP_TOOBIG                     1
531 #define SNMP_NOSUCHNAME                 2
532 #define SNMP_BADVALUE                   3
533 #define SNMP_READONLY                   4
534 #define SNMP_GENERROR                   5
535 #define SNMP_NOACCESS                   6
536 #define SNMP_WRONGTYPE                  7
537 #define SNMP_WRONGLENGTH                8
538 #define SNMP_WRONGENCODING              9
539 #define SNMP_WRONGVALUE                 10
540 #define SNMP_NOCREATION                 11
541 #define SNMP_INCONSISTENTVALUE          12
542 #define SNMP_RESOURCEUNAVAILABLE        13
543 #define SNMP_COMMITFAILED               14
544 #define SNMP_UNDOFAILED                 15
545 #define SNMP_AUTHORIZATIONERROR         16
546 #define SNMP_NOTWRITABLE                17
547 #define SNMP_INCONSISTENTNAME           18
548
549 /* General SNMP V1 Traps */
550 #define SNMP_TRAP_COLDSTART             0
551 #define SNMP_TRAP_WARMSTART             1
552 #define SNMP_TRAP_LINKDOWN              2
553 #define SNMP_TRAP_LINKUP                3
554 #define SNMP_TRAP_AUTFAILURE            4
555 #define SNMP_TRAP_EQPNEIGHBORLOSS       5
556 #define SNMP_TRAP_ENTSPECIFIC           6
557
558 /* SNMPv1 Types */
559 #define SNMP_NULL                0
560 #define SNMP_INTEGER             1    /* l  */
561 #define SNMP_OCTETSTR            2    /* c  */
562 #define SNMP_DISPLAYSTR          2    /* c  */
563 #define SNMP_OBJECTID            3    /* ul */
564 #define SNMP_IPADDR              4    /* uc */
565 #define SNMP_COUNTER             5    /* ul */
566 #define SNMP_GAUGE               6    /* ul */
567 #define SNMP_TIMETICKS           7    /* ul */
568 #define SNMP_OPAQUE              8    /* c  */
569
570 /* Additional SNMPv2 Types */
571 #define SNMP_UINTEGER            5    /* ul */
572 #define SNMP_BITSTR              9    /* uc */
573 #define SNMP_NSAP               10    /* uc */
574 #define SNMP_COUNTER64          11    /* ul */
575 #define SNMP_NOSUCHOBJECT       12
576 #define SNMP_NOSUCHINSTANCE     13
577 #define SNMP_ENDOFMIBVIEW       14
578
579 union snmp_syntax
580 {
581         unsigned char uc[0];    /* 8 bit unsigned */
582         char c[0];              /* 8 bit signed */
583         unsigned long ul[0];    /* 32 bit unsigned */
584         long l[0];              /* 32 bit signed */
585 };
586
587 struct snmp_object
588 {
589         unsigned long *id;
590         unsigned int id_len;
591         unsigned short type;
592         unsigned int syntax_len;
593         union snmp_syntax syntax;
594 };
595
596 struct snmp_request
597 {
598         unsigned long id;
599         unsigned int error_status;
600         unsigned int error_index;
601 };
602
603 struct snmp_v1_trap
604 {
605         unsigned long *id;
606         unsigned int id_len;
607         unsigned long ip_address;       /* pointer  */
608         unsigned int general;
609         unsigned int specific;
610         unsigned long time;
611 };
612
613 /* SNMP types */
614 #define SNMP_IPA    0
615 #define SNMP_CNT    1
616 #define SNMP_GGE    2
617 #define SNMP_TIT    3
618 #define SNMP_OPQ    4
619 #define SNMP_C64    6
620
621 /* SNMP errors */
622 #define SERR_NSO    0
623 #define SERR_NSI    1
624 #define SERR_EOM    2
625
626 static inline void mangle_address(unsigned char *begin,
627                                   unsigned char *addr,
628                                   const struct oct1_map *map,
629                                   __sum16 *check);
630 struct snmp_cnv
631 {
632         unsigned int class;
633         unsigned int tag;
634         int syntax;
635 };
636
637 static const struct snmp_cnv snmp_conv[] = {
638         {ASN1_UNI, ASN1_NUL, SNMP_NULL},
639         {ASN1_UNI, ASN1_INT, SNMP_INTEGER},
640         {ASN1_UNI, ASN1_OTS, SNMP_OCTETSTR},
641         {ASN1_UNI, ASN1_OTS, SNMP_DISPLAYSTR},
642         {ASN1_UNI, ASN1_OJI, SNMP_OBJECTID},
643         {ASN1_APL, SNMP_IPA, SNMP_IPADDR},
644         {ASN1_APL, SNMP_CNT, SNMP_COUNTER},     /* Counter32 */
645         {ASN1_APL, SNMP_GGE, SNMP_GAUGE},       /* Gauge32 == Unsigned32  */
646         {ASN1_APL, SNMP_TIT, SNMP_TIMETICKS},
647         {ASN1_APL, SNMP_OPQ, SNMP_OPAQUE},
648
649         /* SNMPv2 data types and errors */
650         {ASN1_UNI, ASN1_BTS, SNMP_BITSTR},
651         {ASN1_APL, SNMP_C64, SNMP_COUNTER64},
652         {ASN1_CTX, SERR_NSO, SNMP_NOSUCHOBJECT},
653         {ASN1_CTX, SERR_NSI, SNMP_NOSUCHINSTANCE},
654         {ASN1_CTX, SERR_EOM, SNMP_ENDOFMIBVIEW},
655         {0,       0,       -1}
656 };
657
658 static unsigned char snmp_tag_cls2syntax(unsigned int tag,
659                                          unsigned int cls,
660                                          unsigned short *syntax)
661 {
662         const struct snmp_cnv *cnv;
663
664         cnv = snmp_conv;
665
666         while (cnv->syntax != -1) {
667                 if (cnv->tag == tag && cnv->class == cls) {
668                         *syntax = cnv->syntax;
669                         return 1;
670                 }
671                 cnv++;
672         }
673         return 0;
674 }
675
676 static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
677                                         struct snmp_object **obj)
678 {
679         unsigned int cls, con, tag, len, idlen;
680         unsigned short type;
681         unsigned char *eoc, *end, *p;
682         unsigned long *lp, *id;
683         unsigned long ul;
684         long l;
685
686         *obj = NULL;
687         id = NULL;
688
689         if (!asn1_header_decode(ctx, &eoc, &cls, &con, &tag))
690                 return 0;
691
692         if (cls != ASN1_UNI || con != ASN1_CON || tag != ASN1_SEQ)
693                 return 0;
694
695         if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
696                 return 0;
697
698         if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_OJI)
699                 return 0;
700
701         if (!asn1_oid_decode(ctx, end, &id, &idlen))
702                 return 0;
703
704         if (!asn1_header_decode(ctx, &end, &cls, &con, &tag)) {
705                 kfree(id);
706                 return 0;
707         }
708
709         if (con != ASN1_PRI) {
710                 kfree(id);
711                 return 0;
712         }
713
714         type = 0;
715         if (!snmp_tag_cls2syntax(tag, cls, &type)) {
716                 kfree(id);
717                 return 0;
718         }
719
720         l = 0;
721         switch (type) {
722                 case SNMP_INTEGER:
723                         len = sizeof(long);
724                         if (!asn1_long_decode(ctx, end, &l)) {
725                                 kfree(id);
726                                 return 0;
727                         }
728                         *obj = kmalloc(sizeof(struct snmp_object) + len,
729                                        GFP_ATOMIC);
730                         if (*obj == NULL) {
731                                 kfree(id);
732                                 if (net_ratelimit())
733                                         pr_notice("OOM in bsalg (%d)\n", __LINE__);
734                                 return 0;
735                         }
736                         (*obj)->syntax.l[0] = l;
737                         break;
738                 case SNMP_OCTETSTR:
739                 case SNMP_OPAQUE:
740                         if (!asn1_octets_decode(ctx, end, &p, &len)) {
741                                 kfree(id);
742                                 return 0;
743                         }
744                         *obj = kmalloc(sizeof(struct snmp_object) + len,
745                                        GFP_ATOMIC);
746                         if (*obj == NULL) {
747                                 kfree(p);
748                                 kfree(id);
749                                 if (net_ratelimit())
750                                         pr_notice("OOM in bsalg (%d)\n", __LINE__);
751                                 return 0;
752                         }
753                         memcpy((*obj)->syntax.c, p, len);
754                         kfree(p);
755                         break;
756                 case SNMP_NULL:
757                 case SNMP_NOSUCHOBJECT:
758                 case SNMP_NOSUCHINSTANCE:
759                 case SNMP_ENDOFMIBVIEW:
760                         len = 0;
761                         *obj = kmalloc(sizeof(struct snmp_object), GFP_ATOMIC);
762                         if (*obj == NULL) {
763                                 kfree(id);
764                                 if (net_ratelimit())
765                                         pr_notice("OOM in bsalg (%d)\n", __LINE__);
766                                 return 0;
767                         }
768                         if (!asn1_null_decode(ctx, end)) {
769                                 kfree(id);
770                                 kfree(*obj);
771                                 *obj = NULL;
772                                 return 0;
773                         }
774                         break;
775                 case SNMP_OBJECTID:
776                         if (!asn1_oid_decode(ctx, end, (unsigned long **)&lp, &len)) {
777                                 kfree(id);
778                                 return 0;
779                         }
780                         len *= sizeof(unsigned long);
781                         *obj = kmalloc(sizeof(struct snmp_object) + len, GFP_ATOMIC);
782                         if (*obj == NULL) {
783                                 kfree(lp);
784                                 kfree(id);
785                                 if (net_ratelimit())
786                                         pr_notice("OOM in bsalg (%d)\n", __LINE__);
787                                 return 0;
788                         }
789                         memcpy((*obj)->syntax.ul, lp, len);
790                         kfree(lp);
791                         break;
792                 case SNMP_IPADDR:
793                         if (!asn1_octets_decode(ctx, end, &p, &len)) {
794                                 kfree(id);
795                                 return 0;
796                         }
797                         if (len != 4) {
798                                 kfree(p);
799                                 kfree(id);
800                                 return 0;
801                         }
802                         *obj = kmalloc(sizeof(struct snmp_object) + len, GFP_ATOMIC);
803                         if (*obj == NULL) {
804                                 kfree(p);
805                                 kfree(id);
806                                 if (net_ratelimit())
807                                         pr_notice("OOM in bsalg (%d)\n", __LINE__);
808                                 return 0;
809                         }
810                         memcpy((*obj)->syntax.uc, p, len);
811                         kfree(p);
812                         break;
813                 case SNMP_COUNTER:
814                 case SNMP_GAUGE:
815                 case SNMP_TIMETICKS:
816                         len = sizeof(unsigned long);
817                         if (!asn1_ulong_decode(ctx, end, &ul)) {
818                                 kfree(id);
819                                 return 0;
820                         }
821                         *obj = kmalloc(sizeof(struct snmp_object) + len, GFP_ATOMIC);
822                         if (*obj == NULL) {
823                                 kfree(id);
824                                 if (net_ratelimit())
825                                         pr_notice("OOM in bsalg (%d)\n", __LINE__);
826                                 return 0;
827                         }
828                         (*obj)->syntax.ul[0] = ul;
829                         break;
830                 default:
831                         kfree(id);
832                         return 0;
833         }
834
835         (*obj)->syntax_len = len;
836         (*obj)->type = type;
837         (*obj)->id = id;
838         (*obj)->id_len = idlen;
839
840         if (!asn1_eoc_decode(ctx, eoc)) {
841                 kfree(id);
842                 kfree(*obj);
843                 *obj = NULL;
844                 return 0;
845         }
846         return 1;
847 }
848
849 static unsigned char snmp_request_decode(struct asn1_ctx *ctx,
850                                          struct snmp_request *request)
851 {
852         unsigned int cls, con, tag;
853         unsigned char *end;
854
855         if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
856                 return 0;
857
858         if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
859                 return 0;
860
861         if (!asn1_ulong_decode(ctx, end, &request->id))
862                 return 0;
863
864         if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
865                 return 0;
866
867         if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
868                 return 0;
869
870         if (!asn1_uint_decode(ctx, end, &request->error_status))
871                 return 0;
872
873         if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
874                 return 0;
875
876         if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
877                 return 0;
878
879         if (!asn1_uint_decode(ctx, end, &request->error_index))
880                 return 0;
881
882         return 1;
883 }
884
885 /*
886  * Fast checksum update for possibly oddly-aligned UDP byte, from the
887  * code example in the draft.
888  */
889 static void fast_csum(__sum16 *csum,
890                       const unsigned char *optr,
891                       const unsigned char *nptr,
892                       int offset)
893 {
894         unsigned char s[4];
895
896         if (offset & 1) {
897                 s[0] = ~0;
898                 s[1] = ~*optr;
899                 s[2] = 0;
900                 s[3] = *nptr;
901         } else {
902                 s[0] = ~*optr;
903                 s[1] = ~0;
904                 s[2] = *nptr;
905                 s[3] = 0;
906         }
907
908         *csum = csum_fold(csum_partial(s, 4, ~csum_unfold(*csum)));
909 }
910
911 /*
912  * Mangle IP address.
913  *      - begin points to the start of the snmp messgae
914  *      - addr points to the start of the address
915  */
916 static inline void mangle_address(unsigned char *begin,
917                                   unsigned char *addr,
918                                   const struct oct1_map *map,
919                                   __sum16 *check)
920 {
921         if (map->from == NOCT1(addr)) {
922                 u_int32_t old;
923
924                 if (debug)
925                         memcpy(&old, addr, sizeof(old));
926
927                 *addr = map->to;
928
929                 /* Update UDP checksum if being used */
930                 if (*check) {
931                         fast_csum(check,
932                                   &map->from, &map->to, addr - begin);
933
934                 }
935
936                 if (debug)
937                         printk(KERN_DEBUG "bsalg: mapped %pI4 to %pI4\n",
938                                &old, addr);
939         }
940 }
941
942 static unsigned char snmp_trap_decode(struct asn1_ctx *ctx,
943                                       struct snmp_v1_trap *trap,
944                                       const struct oct1_map *map,
945                                       __sum16 *check)
946 {
947         unsigned int cls, con, tag, len;
948         unsigned char *end;
949
950         if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
951                 return 0;
952
953         if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_OJI)
954                 return 0;
955
956         if (!asn1_oid_decode(ctx, end, &trap->id, &trap->id_len))
957                 return 0;
958
959         if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
960                 goto err_id_free;
961
962         if (!((cls == ASN1_APL && con == ASN1_PRI && tag == SNMP_IPA) ||
963               (cls == ASN1_UNI && con == ASN1_PRI && tag == ASN1_OTS)))
964                 goto err_id_free;
965
966         if (!asn1_octets_decode(ctx, end, (unsigned char **)&trap->ip_address, &len))
967                 goto err_id_free;
968
969         /* IPv4 only */
970         if (len != 4)
971                 goto err_addr_free;
972
973         mangle_address(ctx->begin, ctx->pointer - 4, map, check);
974
975         if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
976                 goto err_addr_free;
977
978         if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
979                 goto err_addr_free;
980
981         if (!asn1_uint_decode(ctx, end, &trap->general))
982                 goto err_addr_free;
983
984         if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
985                 goto err_addr_free;
986
987         if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
988                 goto err_addr_free;
989
990         if (!asn1_uint_decode(ctx, end, &trap->specific))
991                 goto err_addr_free;
992
993         if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
994                 goto err_addr_free;
995
996         if (!((cls == ASN1_APL && con == ASN1_PRI && tag == SNMP_TIT) ||
997               (cls == ASN1_UNI && con == ASN1_PRI && tag == ASN1_INT)))
998                 goto err_addr_free;
999
1000         if (!asn1_ulong_decode(ctx, end, &trap->time))
1001                 goto err_addr_free;
1002
1003         return 1;
1004
1005 err_addr_free:
1006         kfree((unsigned long *)trap->ip_address);
1007
1008 err_id_free:
1009         kfree(trap->id);
1010
1011         return 0;
1012 }
1013
1014 /*****************************************************************************
1015  *
1016  * Misc. routines
1017  *
1018  *****************************************************************************/
1019
1020 static void hex_dump(const unsigned char *buf, size_t len)
1021 {
1022         size_t i;
1023
1024         for (i = 0; i < len; i++) {
1025                 if (i && !(i % 16))
1026                         printk("\n");
1027                 printk("%02x ", *(buf + i));
1028         }
1029         printk("\n");
1030 }
1031
1032 /*
1033  * Parse and mangle SNMP message according to mapping.
1034  * (And this is the fucking 'basic' method).
1035  */
1036 static int snmp_parse_mangle(unsigned char *msg,
1037                              u_int16_t len,
1038                              const struct oct1_map *map,
1039                              __sum16 *check)
1040 {
1041         unsigned char *eoc, *end;
1042         unsigned int cls, con, tag, vers, pdutype;
1043         struct asn1_ctx ctx;
1044         struct asn1_octstr comm;
1045         struct snmp_object *obj;
1046
1047         if (debug > 1)
1048                 hex_dump(msg, len);
1049
1050         asn1_open(&ctx, msg, len);
1051
1052         /*
1053          * Start of SNMP message.
1054          */
1055         if (!asn1_header_decode(&ctx, &eoc, &cls, &con, &tag))
1056                 return 0;
1057         if (cls != ASN1_UNI || con != ASN1_CON || tag != ASN1_SEQ)
1058                 return 0;
1059
1060         /*
1061          * Version 1 or 2 handled.
1062          */
1063         if (!asn1_header_decode(&ctx, &end, &cls, &con, &tag))
1064                 return 0;
1065         if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
1066                 return 0;
1067         if (!asn1_uint_decode (&ctx, end, &vers))
1068                 return 0;
1069         if (debug > 1)
1070                 printk(KERN_DEBUG "bsalg: snmp version: %u\n", vers + 1);
1071         if (vers > 1)
1072                 return 1;
1073
1074         /*
1075          * Community.
1076          */
1077         if (!asn1_header_decode (&ctx, &end, &cls, &con, &tag))
1078                 return 0;
1079         if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_OTS)
1080                 return 0;
1081         if (!asn1_octets_decode(&ctx, end, &comm.data, &comm.len))
1082                 return 0;
1083         if (debug > 1) {
1084                 unsigned int i;
1085
1086                 printk(KERN_DEBUG "bsalg: community: ");
1087                 for (i = 0; i < comm.len; i++)
1088                         printk("%c", comm.data[i]);
1089                 printk("\n");
1090         }
1091         kfree(comm.data);
1092
1093         /*
1094          * PDU type
1095          */
1096         if (!asn1_header_decode(&ctx, &eoc, &cls, &con, &pdutype))
1097                 return 0;
1098         if (cls != ASN1_CTX || con != ASN1_CON)
1099                 return 0;
1100         if (debug > 1) {
1101                 static const unsigned char *const pdus[] = {
1102                         [SNMP_PDU_GET] = "get",
1103                         [SNMP_PDU_NEXT] = "get-next",
1104                         [SNMP_PDU_RESPONSE] = "response",
1105                         [SNMP_PDU_SET] = "set",
1106                         [SNMP_PDU_TRAP1] = "trapv1",
1107                         [SNMP_PDU_BULK] = "bulk",
1108                         [SNMP_PDU_INFORM] = "inform",
1109                         [SNMP_PDU_TRAP2] = "trapv2"
1110                 };
1111
1112                 if (pdutype > SNMP_PDU_TRAP2)
1113                         printk(KERN_DEBUG "bsalg: bad pdu type %u\n", pdutype);
1114                 else
1115                         printk(KERN_DEBUG "bsalg: pdu: %s\n", pdus[pdutype]);
1116         }
1117         if (pdutype != SNMP_PDU_RESPONSE &&
1118             pdutype != SNMP_PDU_TRAP1 && pdutype != SNMP_PDU_TRAP2)
1119                 return 1;
1120
1121         /*
1122          * Request header or v1 trap
1123          */
1124         if (pdutype == SNMP_PDU_TRAP1) {
1125                 struct snmp_v1_trap trap;
1126                 unsigned char ret = snmp_trap_decode(&ctx, &trap, map, check);
1127
1128                 if (ret) {
1129                         kfree(trap.id);
1130                         kfree((unsigned long *)trap.ip_address);
1131                 } else
1132                         return ret;
1133
1134         } else {
1135                 struct snmp_request req;
1136
1137                 if (!snmp_request_decode(&ctx, &req))
1138                         return 0;
1139
1140                 if (debug > 1)
1141                         printk(KERN_DEBUG "bsalg: request: id=0x%lx error_status=%u "
1142                         "error_index=%u\n", req.id, req.error_status,
1143                         req.error_index);
1144         }
1145
1146         /*
1147          * Loop through objects, look for IP addresses to mangle.
1148          */
1149         if (!asn1_header_decode(&ctx, &eoc, &cls, &con, &tag))
1150                 return 0;
1151
1152         if (cls != ASN1_UNI || con != ASN1_CON || tag != ASN1_SEQ)
1153                 return 0;
1154
1155         while (!asn1_eoc_decode(&ctx, eoc)) {
1156                 unsigned int i;
1157
1158                 if (!snmp_object_decode(&ctx, &obj)) {
1159                         if (obj) {
1160                                 kfree(obj->id);
1161                                 kfree(obj);
1162                         }
1163                         return 0;
1164                 }
1165
1166                 if (debug > 1) {
1167                         printk(KERN_DEBUG "bsalg: object: ");
1168                         for (i = 0; i < obj->id_len; i++) {
1169                                 if (i > 0)
1170                                         printk(".");
1171                                 printk("%lu", obj->id[i]);
1172                         }
1173                         printk(": type=%u\n", obj->type);
1174
1175                 }
1176
1177                 if (obj->type == SNMP_IPADDR)
1178                         mangle_address(ctx.begin, ctx.pointer - 4 , map, check);
1179
1180                 kfree(obj->id);
1181                 kfree(obj);
1182         }
1183
1184         if (!asn1_eoc_decode(&ctx, eoc))
1185                 return 0;
1186
1187         return 1;
1188 }
1189
1190 /*****************************************************************************
1191  *
1192  * NAT routines.
1193  *
1194  *****************************************************************************/
1195
1196 /*
1197  * SNMP translation routine.
1198  */
1199 static int snmp_translate(struct nf_conn *ct,
1200                           enum ip_conntrack_info ctinfo,
1201                           struct sk_buff *skb)
1202 {
1203         struct iphdr *iph = ip_hdr(skb);
1204         struct udphdr *udph = (struct udphdr *)((__be32 *)iph + iph->ihl);
1205         u_int16_t udplen = ntohs(udph->len);
1206         u_int16_t paylen = udplen - sizeof(struct udphdr);
1207         int dir = CTINFO2DIR(ctinfo);
1208         struct oct1_map map;
1209
1210         /*
1211          * Determine mappping for application layer addresses based
1212          * on NAT manipulations for the packet.
1213          */
1214         if (dir == IP_CT_DIR_ORIGINAL) {
1215                 /* SNAT traps */
1216                 map.from = NOCT1(&ct->tuplehash[dir].tuple.src.u3.ip);
1217                 map.to = NOCT1(&ct->tuplehash[!dir].tuple.dst.u3.ip);
1218         } else {
1219                 /* DNAT replies */
1220                 map.from = NOCT1(&ct->tuplehash[dir].tuple.src.u3.ip);
1221                 map.to = NOCT1(&ct->tuplehash[!dir].tuple.dst.u3.ip);
1222         }
1223
1224         if (map.from == map.to)
1225                 return NF_ACCEPT;
1226
1227         if (!snmp_parse_mangle((unsigned char *)udph + sizeof(struct udphdr),
1228                                paylen, &map, &udph->check)) {
1229                 if (net_ratelimit())
1230                         printk(KERN_WARNING "bsalg: parser failed\n");
1231                 return NF_DROP;
1232         }
1233         return NF_ACCEPT;
1234 }
1235
1236 /* We don't actually set up expectations, just adjust internal IP
1237  * addresses if this is being NATted */
1238 static int help(struct sk_buff *skb, unsigned int protoff,
1239                 struct nf_conn *ct,
1240                 enum ip_conntrack_info ctinfo)
1241 {
1242         int dir = CTINFO2DIR(ctinfo);
1243         unsigned int ret;
1244         const struct iphdr *iph = ip_hdr(skb);
1245         const struct udphdr *udph = (struct udphdr *)((__be32 *)iph + iph->ihl);
1246
1247         /* SNMP replies and originating SNMP traps get mangled */
1248         if (udph->source == htons(SNMP_PORT) && dir != IP_CT_DIR_REPLY)
1249                 return NF_ACCEPT;
1250         if (udph->dest == htons(SNMP_TRAP_PORT) && dir != IP_CT_DIR_ORIGINAL)
1251                 return NF_ACCEPT;
1252
1253         /* No NAT? */
1254         if (!(ct->status & IPS_NAT_MASK))
1255                 return NF_ACCEPT;
1256
1257         /*
1258          * Make sure the packet length is ok.  So far, we were only guaranteed
1259          * to have a valid length IP header plus 8 bytes, which means we have
1260          * enough room for a UDP header.  Just verify the UDP length field so we
1261          * can mess around with the payload.
1262          */
1263         if (ntohs(udph->len) != skb->len - (iph->ihl << 2)) {
1264                  if (net_ratelimit())
1265                          printk(KERN_WARNING "SNMP: dropping malformed packet src=%pI4 dst=%pI4\n",
1266                                 &iph->saddr, &iph->daddr);
1267                  return NF_DROP;
1268         }
1269
1270         if (!skb_make_writable(skb, skb->len))
1271                 return NF_DROP;
1272
1273         spin_lock_bh(&snmp_lock);
1274         ret = snmp_translate(ct, ctinfo, skb);
1275         spin_unlock_bh(&snmp_lock);
1276         return ret;
1277 }
1278
1279 static const struct nf_conntrack_expect_policy snmp_exp_policy = {
1280         .max_expected   = 0,
1281         .timeout        = 180,
1282 };
1283
1284 static struct nf_conntrack_helper snmp_helper __read_mostly = {
1285         .me                     = THIS_MODULE,
1286         .help                   = help,
1287         .expect_policy          = &snmp_exp_policy,
1288         .name                   = "snmp",
1289         .tuple.src.l3num        = AF_INET,
1290         .tuple.src.u.udp.port   = cpu_to_be16(SNMP_PORT),
1291         .tuple.dst.protonum     = IPPROTO_UDP,
1292 };
1293
1294 static struct nf_conntrack_helper snmp_trap_helper __read_mostly = {
1295         .me                     = THIS_MODULE,
1296         .help                   = help,
1297         .expect_policy          = &snmp_exp_policy,
1298         .name                   = "snmp_trap",
1299         .tuple.src.l3num        = AF_INET,
1300         .tuple.src.u.udp.port   = cpu_to_be16(SNMP_TRAP_PORT),
1301         .tuple.dst.protonum     = IPPROTO_UDP,
1302 };
1303
1304 /*****************************************************************************
1305  *
1306  * Module stuff.
1307  *
1308  *****************************************************************************/
1309
1310 static int __init nf_nat_snmp_basic_init(void)
1311 {
1312         int ret = 0;
1313
1314         BUG_ON(nf_nat_snmp_hook != NULL);
1315         rcu_assign_pointer(nf_nat_snmp_hook, help);
1316
1317         ret = nf_conntrack_helper_register(&snmp_trap_helper);
1318         if (ret < 0) {
1319                 nf_conntrack_helper_unregister(&snmp_helper);
1320                 return ret;
1321         }
1322         return ret;
1323 }
1324
1325 static void __exit nf_nat_snmp_basic_fini(void)
1326 {
1327         rcu_assign_pointer(nf_nat_snmp_hook, NULL);
1328         nf_conntrack_helper_unregister(&snmp_trap_helper);
1329 }
1330
1331 module_init(nf_nat_snmp_basic_init);
1332 module_exit(nf_nat_snmp_basic_fini);
1333
1334 module_param(debug, int, 0600);