source: tools/traceanon/ipenc.c @ ab4cb04

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since ab4cb04 was 49f147b, checked in by Perry Lorier <perry@…>, 16 years ago

Add traceanon to cvs (based heavily on the munge code)

  • Property mode set to 100644
File size: 1.9 KB
Line 
1#include "ipenc.h"
2#include "panon.h"
3#include <stdio.h>
4#include <assert.h>
5#include <unistd.h>
6#include <string.h>
7
8#ifndef HAVE_STRLCPY
9static size_t strlcpy(char *dest, const char *src, size_t size)
10{
11        size_t ret;
12        for(ret=0;src[ret] && ret<size; ret++) {
13                dest[ret]=src[ret];
14        }
15        dest[ret++]='\0';
16        return ret;
17}
18#endif
19
20static enum enc_type_t enc_type = ENC_NONE;
21
22static uint32_t masks[33] = {
23                0x00000000, 0x80000000, 0xC0000000, 0xe0000000, 0xf0000000,
24                0xf8000000, 0xfC000000, 0xfe000000, 0xff000000, 0xff800000,
25                0xffC00000, 0xffe00000, 0xfff00000, 0xfff80000, 0xfffC0000,
26                0xfffe0000, 0xffff0000, 0xffff8000, 0xffffC000, 0xffffe000,
27                0xfffff000, 0xfffff800, 0xfffffC00, 0xfffffe00, 0xffffff00,
28                0xffffff80, 0xffffffC0, 0xffffffe0, 0xfffffff0, 0xfffffff8,
29                0xfffffffC, 0xfffffffe, 0xffffffff,
30};
31
32static uint32_t prefix;
33static uint32_t netmask;
34static void init_prefix(char *key)
35{
36        int a,b,c,d;
37        int bits;
38        sscanf(key,"%i.%i.%i.%i/%i",
39                        &a, &b, &c, &d, &bits);
40        prefix=(a<<24) + (b<<16) + (c<<8) + d;
41        assert(bits>=0 && bits<=32);
42        netmask = masks[bits];
43}
44
45static uint32_t prefix_substitute(uint32_t ip)
46{
47        return (prefix & netmask) | (ip & ~netmask);
48}
49
50void enc_init(enum enc_type_t type, char *key)
51{
52        char cryptopan_key[32];
53        memset(cryptopan_key,0,sizeof(cryptopan_key));
54        enc_type = type;
55        switch (enc_type) {
56                case ENC_NONE:
57                        break;
58                case ENC_PREFIX_SUBSTITUTION:
59                        init_prefix(key);
60                        break;
61                case ENC_CRYPTOPAN:
62                        strlcpy(cryptopan_key,key,sizeof(cryptopan_key));
63                        panon_init(cryptopan_key);
64                        break;
65                default:
66                        assert(0 /* unknown encryption type */);
67                        _exit(1);
68        }
69}
70
71uint32_t enc_ip(uint32_t orig_addr) 
72{
73        switch (enc_type) {
74                case ENC_NONE:
75                        return orig_addr;
76                case ENC_PREFIX_SUBSTITUTION:
77                        return prefix_substitute(orig_addr);
78                case ENC_CRYPTOPAN:
79                        return cpp_anonymize(orig_addr);
80                default:
81                        assert(0 /* unknown encryption type */);
82                        _exit(1);
83        }
84}
Note: See TracBrowser for help on using the repository browser.