source: examples/munge/lib/libtrace_enc.c @ 5959435

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

Add new munge program to the libtrace examples

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