source: examples/tutorial/ipdist.c @ cdd9753

develop
Last change on this file since cdd9753 was cdd9753, checked in by Jacob Van Walraven <jcv9@…>, 2 years ago

Add IPv4 distribution counter

  • Property mode set to 100644
File size: 3.6 KB
Line 
1/* Program reads a trace file and counts the first octet of the source and destination
2 * addresses
3 */
4#include "libtrace.h"
5#include <stdio.h>
6#include <sys/socket.h>
7#include <netinet/in.h>
8#include <arpa/inet.h>
9
10uint64_t srcaddrcount[255];
11uint64_t dstaddrcount[255];
12
13static void print_results() {
14        int i;
15        /* Print results */
16        printf("Source addresses\n");
17        for(i=0;i<255;i++) {
18                printf("%d ", srcaddrcount[i]);
19        }
20        printf("\n");
21
22        printf("Destination addresses\n");
23        for(i=0;i<255;i++) {
24                printf("%d ", dstaddrcount[i]);
25        }
26        printf("\n");
27}
28
29static void print_results2() {
30        int i, j;
31        printf("Source addresses\n");
32        for(i=0;i<255;i++) {
33                for(j=0;j<srcaddrcount[i];j++) {
34                        printf(".");
35                }
36                printf("\n");
37        }
38        printf("Destination addresses\n");
39        for(i=0;i<255;i++) {
40                for(j=0;j<dstaddrcount[i];j++) {
41                        printf(".");
42                }
43                printf("\n");
44        }
45}
46
47static void process_ip(struct sockaddr *ip, int srcaddr) {
48
49        /* Checks if the ip is of type IPv4 */
50        if (ip->sa_family == AF_INET) {
51
52                /* IPv4 - cast the generic sockaddr to a sockaddr_in */
53                struct sockaddr_in *v4 = (struct sockaddr_in *)ip;
54                /* Get in_addr from sockaddr */
55                struct in_addr ip4 = (struct in_addr)v4->sin_addr;
56                /* Split the IPv4 address into each octet */
57                uint8_t octet[4];
58                octet[0] = (ip4.s_addr & 0x000000ff);
59                octet[1] = (ip4.s_addr & 0x0000ff00) >> 8;
60                octet[2] = (ip4.s_addr & 0x00ff0000) >> 16;
61                octet[3] = (ip4.s_addr & 0xff000000) >> 24;
62                //printf("%u.%u.%u.%u\n", octets[0], octets[1], octets[2], octets[3]);
63
64                /* check if the supplied address was a source or destination, increment
65                   the correct one */
66                if(srcaddr) {
67                        srcaddrcount[octet[0]]++;
68                } else {
69                        dstaddrcount[octet[0]]++;
70                }
71
72        }
73}
74
75static void per_packet(libtrace_packet_t *packet) {
76        struct sockaddr_storage addr;
77        struct sockaddr *addr_src;
78        struct sockaddr *addr_dst;
79
80        /* Get the source IP address */
81        addr_src = trace_get_source_address(packet, (struct sockaddr *)&addr);
82        /* If a source ip address was found */
83        if(addr_src != NULL) {
84                process_ip(addr_src, 1);
85        }
86
87        /* Get the destination IP address */
88        addr_dst = trace_get_destination_address(packet, (struct sockaddr *)&addr);
89        /* If a destination ip address was found */
90        if(addr_dst != NULL) {
91                process_ip(addr_dst, 0);
92        }
93
94}
95
96int main(int argc, char *argv[]) {
97
98        libtrace_t *trace = NULL;
99        libtrace_packet_t *packet = NULL;
100
101        /* initialize address arrays */
102        int i;
103        for(i=0; i<255; i++) {
104                srcaddrcount[i] = 0;
105                dstaddrcount[i] = 0;
106        }
107
108        /* Ensure the input URI was supplied */
109        if(argc < 2) {
110                fprintf(stderr, "Usage: %s inputURI\n", argv[0]);
111                return 1;
112        }
113
114        /* Create the packet structure */
115        packet = trace_create_packet();
116
117        /* Create the trace */
118        trace = trace_create(argv[1]);
119
120        /* Ensure no error has occured creating the trace */
121        if(trace_is_err(trace)) {
122                trace_perror(trace, "Opening trace file");
123                return 1;
124        }
125
126        /* Start the trace, if it errors return */
127        if(trace_start(trace) == -1) {
128                trace_perror(trace, "Starting trace");
129                trace_destroy(trace);
130                return 1;
131        }
132
133        /* Proccess each packet in the trace */
134        while(trace_read_packet(trace,packet)>0) {
135                per_packet(packet);
136        }
137
138        /* If trace is error after proccessing packets it failed to process
139           the entire trace */
140        if(trace_is_err(trace)) {
141                trace_perror(trace, packet);
142                return 1;
143        }
144
145        /* Print results */
146        print_results();
147
148        trace_destroy(trace);
149        trace_destroy_packet(packet);
150        //libtrace_cleanup(trace, packet);
151        return 0;
152}
Note: See TracBrowser for help on using the repository browser.