summaryrefslogtreecommitdiff
path: root/common/src/addr_tuple4.cpp
blob: 7e294f85ec4d22dc64456b45b02fbd3435520ccc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>

#include "addr_tuple4.h"

char *addr_tuple4_to_str(const struct addr_tuple4 *addr)
{
    char *str_ret = NULL;

    if (addr->addr_type == ADDR_TUPLE4_TYPE_V4)
    {
        char src_addr[INET_ADDRSTRLEN] = {0};
        char dst_addr[INET_ADDRSTRLEN] = {0};
        uint16_t src_port = ntohs((uint16_t)addr->src_port);
        uint16_t dst_port = ntohs((uint16_t)addr->dst_port);
        inet_ntop(AF_INET, &addr->addr_v4.src_addr, src_addr, sizeof(src_addr));
        inet_ntop(AF_INET, &addr->addr_v4.dst_addr, dst_addr, sizeof(dst_addr));
        asprintf(&str_ret, "%s %u %s %u", src_addr, src_port, dst_addr, dst_port);
    }

    if (addr->addr_type == ADDR_TUPLE4_TYPE_V6)
    {
        char src_addr[INET6_ADDRSTRLEN] = {0};
        char dst_addr[INET6_ADDRSTRLEN] = {0};
        uint16_t src_port = ntohs((uint16_t)addr->src_port);
        uint16_t dst_port = ntohs((uint16_t)addr->dst_port);
        inet_ntop(AF_INET6, &addr->addr_v6.src_addr, src_addr, sizeof(src_addr));
        inet_ntop(AF_INET6, &addr->addr_v6.dst_addr, dst_addr, sizeof(dst_addr));
        asprintf(&str_ret, "%s %u %s %u", src_addr, src_port, dst_addr, dst_port);
    }

    return str_ret;
}

char *addr_src_ip_to_str(const struct addr_tuple4 *addr)//TODO: self test
{
    char *str_ret = NULL;

    if (addr->addr_type == ADDR_TUPLE4_TYPE_V4)
    {
        char src_addr[INET_ADDRSTRLEN] = {0};
        inet_ntop(AF_INET, &addr->addr_v4.src_addr, src_addr, sizeof(src_addr));
        asprintf(&str_ret, "%s", src_addr);
    }

    if (addr->addr_type == ADDR_TUPLE4_TYPE_V6)
    {
        char src_addr[INET6_ADDRSTRLEN] = {0};
        inet_ntop(AF_INET6, &addr->addr_v6.src_addr, src_addr, sizeof(src_addr));
        asprintf(&str_ret, "%s", src_addr);
    }

    return str_ret;
}

void addr_tuple4_reverse(const struct addr_tuple4 *orin, struct addr_tuple4 *out)
{
    memset(out, 0, sizeof(struct addr_tuple4));

    if (orin->addr_type == ADDR_TUPLE4_TYPE_V4)
    {
        out->addr_type = ADDR_TUPLE4_TYPE_V4;
        out->addr_v4.src_addr = orin->addr_v4.dst_addr;
        out->addr_v4.dst_addr = orin->addr_v4.src_addr;
        out->src_port = orin->dst_port;
        out->dst_port = orin->src_port;
    }

    if (orin->addr_type == ADDR_TUPLE4_TYPE_V6)
    {
        out->addr_type = ADDR_TUPLE4_TYPE_V6;
        out->addr_v6.src_addr = orin->addr_v6.dst_addr;
        out->addr_v6.dst_addr = orin->addr_v6.src_addr;
        out->src_port = orin->dst_port;
        out->dst_port = orin->src_port;
    }
}