Changeset 774b237


Ignore:
Timestamp:
11/07/18 10:21:19 (2 years ago)
Author:
Jacob Van Walraven <jcv9@…>
Branches:
develop
Children:
7d86ee2
Parents:
cdd9753
Message:

ipdist added gnuplot of results, Added ability to exclude network prefix

File:
1 edited

Legend:

Unmodified
Added
Removed
  • examples/tutorial/ipdist.c

    rcdd9753 r774b237  
    44#include "libtrace.h"
    55#include <stdio.h>
     6#include <stdlib.h>
     7#include <string.h>
    68#include <sys/socket.h>
    79#include <netinet/in.h>
    810#include <arpa/inet.h>
    911
    10 uint64_t srcaddrcount[255];
    11 uint64_t dstaddrcount[255];
    12 
    13 static void print_results() {
     12uint64_t srcaddrcount[256];
     13uint64_t dstaddrcount[256];
     14
     15struct exclude_networks {
     16        uint32_t address;
     17        uint32_t mask;
     18        uint32_t network;
     19};
     20struct exclude_networks *exclude;
     21int exclude_networks_count = 0;
     22
     23static void plot_results() {
     24
     25        /* Push all the data into a tmp file for gnuplot */
     26        FILE *tmp = fopen("ipdist.tmp", "w");
     27        int i;
     28        for(i=0;i<255;i++) {
     29                fprintf(tmp, "%d %d %d\n", i, srcaddrcount[i], dstaddrcount[i]);
     30        }
     31        fclose(tmp);
     32
     33        /* Commands that need to be sent to gnuplot */
     34        char *commands[] = {"set term png size 1280,960",
     35                            "set xrange [0:255]",
     36                            "set xtics 0,10,255",
     37                            "set output 'ipdist.png'",
     38                            "plot 'ipdist.tmp' using 1:2 title 'Source Address' with boxes, 'ipdist.tmp' using 1:3 title 'Destination Address' with boxes",
     39                            "replot"};
     40        /* Open pipe to gnuplot */
     41        FILE *gnuplot = popen("gnuplot -persistent", "w");
     42        /* send all commands to gnuplot */
     43        for(i=0;i<6;i++) {
     44                fprintf(gnuplot, "%s \n", commands[i]);
     45        }
     46        pclose(gnuplot);
     47}
     48
     49/* Checks if address is part of a excluded subnet. */
     50static int network_excluded(uint32_t address) {
     51
    1452        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 
    29 static 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(".");
     53        for(i=0;i<exclude_networks_count;i++) {
     54                /* Convert address into a network address */
     55                uint32_t net_addr = address & exclude[i].mask;
     56
     57                /* If this matches the network address from the excluded list we need to exclude this
     58                   address. */
     59                if(net_addr == exclude[i].network) {
     60                        return 1;
    3561                }
    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         }
     62        }
     63
     64        /* If we got this far the address should not be excluded */
     65        return 0;
    4566}
    4667
     
    5475                /* Get in_addr from sockaddr */
    5576                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]]++;
     77                /* Ensure the address is in network byte order */
     78                uint32_t address = htonl(ip4.s_addr);
     79
     80                /* Check if the address is part of an excluded network.
     81                   This is performed before splitting the into octets so if performed over entire address. */
     82                if(network_excluded(address) == 0) {
     83
     84                        /* Split the IPv4 address into each octet */
     85                        uint8_t octet[4];
     86                        octet[0] = (address & 0xff000000) >> 24;
     87                        octet[1] = (address & 0x00ff0000) >> 16;
     88                        octet[2] = (address & 0x0000ff00) >> 8;
     89                        octet[3] = (address & 0x000000ff);
     90
     91                        /* check if the supplied address was a source or destination, increment
     92                           the correct one */
     93                        if(srcaddr) {
     94                                srcaddrcount[octet[0]]++;
     95                        } else {
     96                                dstaddrcount[octet[0]]++;
     97                        }
    7098                }
    7199
     
    75103static void per_packet(libtrace_packet_t *packet) {
    76104        struct sockaddr_storage addr;
    77         struct sockaddr *addr_src;
    78         struct sockaddr *addr_dst;
     105        struct sockaddr *address;
    79106
    80107        /* Get the source IP address */
    81         addr_src = trace_get_source_address(packet, (struct sockaddr *)&addr);
     108        address = trace_get_source_address(packet, (struct sockaddr *)&addr);
    82109        /* If a source ip address was found */
    83         if(addr_src != NULL) {
    84                 process_ip(addr_src, 1);
     110        if(address != NULL) {
     111                process_ip(address, 1);
    85112        }
    86113
    87114        /* Get the destination IP address */
    88         addr_dst = trace_get_destination_address(packet, (struct sockaddr *)&addr);
     115        address = trace_get_destination_address(packet, (struct sockaddr *)&addr);
    89116        /* If a destination ip address was found */
    90         if(addr_dst != NULL) {
    91                 process_ip(addr_dst, 0);
     117        if(address != NULL) {
     118                process_ip(address, 0);
    92119        }
    93120
     
    99126        libtrace_packet_t *packet = NULL;
    100127
     128        /* Ensure the input URI was supplied */
     129        if(argc < 2) {
     130                fprintf(stderr, "Usage: %s inputURI\n", argv[0]);
     131                return 1;
     132        }
     133
    101134        /* 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;
     135        int i;
     136        for(i=0; i<256; i++) {
     137                srcaddrcount[i] = 0;
     138                dstaddrcount[i] = 0;
     139        }
     140
     141        /* Setup excluded networks if any were supplied */
     142        exclude_networks_count = argc-2;
     143        exclude = malloc(sizeof(struct exclude_networks)*(argc-2));
     144        if(exclude == NULL) {
     145                fprintf(stderr, "Unable to allocate memory");
     146                return 1;
     147        }
     148
     149        char delim[] = "/";
     150        // Convert supplied address and mask to a exclude_network structure
     151        for(i=2;i<argc;i++) {
     152                char *address = strtok(argv[i], delim);
     153                char *mask = strtok(NULL, delim);
     154
     155                /* right shift so netmask is in network byte order */
     156                exclude[i-2].mask = 0xffffffff << (32 - atoi(mask));
     157
     158                struct in_addr addr;
     159                /* Convert address string into uint32_t */
     160                inet_aton(address, &addr);
     161                /* Ensure its saved in network byte order */
     162                exclude[i-2].address = htonl(addr.s_addr);
     163
     164                /* Calculate the network address */
     165                exclude[i-2].network = exclude[i-2].address & exclude[i-2].mask;
    112166        }
    113167
     
    143197        }
    144198
     199        /* free memory used to hold excluded networks */
     200        free(exclude);
     201
    145202        /* Print results */
    146         print_results();
     203        plot_results();
    147204
    148205        trace_destroy(trace);
Note: See TracChangeset for help on using the changeset viewer.