aboutsummaryrefslogtreecommitdiffstats
path: root/ctrl/libhicnctrl/src/commands/command_listener.c
blob: cfcd22f482453b4ab372c7461ded9daf3dfe8528 (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <math.h>
#include <hicn/ctrl/command.h>

/* Parameters */

#define protocol_hicn                                                      \
  {                                                                        \
    .name = "protocol", .help = "Protocol [hicn].",                        \
    .type = TYPE_ENUM(face_type), .offset = offsetof(hc_listener_t, type), \
  }

#define protocol_tcp_udp                                                   \
  {                                                                        \
    .name = "protocol", .help = "Protocol [tcp | udp]",                    \
    .type = TYPE_ENUM(face_type), .offset = offsetof(hc_listener_t, type), \
  }

#define symbolic                                                          \
  {                                                                       \
    .name = "symbolic",                                                   \
    .help =                                                               \
        "User defined name for listener, must start with alpha and be "   \
        "alphanum",                                                       \
    .type = TYPE_SYMBOLIC_OR_ID, .offset = offsetof(hc_listener_t, name), \
  }

#define local_address                                                       \
  {                                                                         \
    .name = "local_addr",                                                   \
    .help =                                                                 \
        "IPv4 or IPv6 address (or prefix protocol = hicn) assigend to the " \
        "local interface",                                                  \
    .type = TYPE_IP_ADDRESS, .offset = offsetof(hc_listener_t, local_addr), \
    .offset2 = offsetof(hc_listener_t, family),                             \
  }

#define local_port                                 \
  {                                                \
    .name = "local_port", .help = "Local port.",   \
    .type = TYPE_UINT16(1, UINT16_MAX),            \
    .offset = offsetof(hc_listener_t, local_port), \
  }

#define interface                                              \
  {                                                            \
    .name = "interface", .help = "Interface on which to bind", \
    .type = TYPE_INTERFACE_NAME,                               \
    .offset = offsetof(hc_listener_t, interface_name),         \
  }

#define symbolic_or_id                                                    \
  {                                                                       \
    .name = "symbolic", .help = "The listener symbolic name or id",       \
    .type = TYPE_SYMBOLIC_OR_ID, .offset = offsetof(hc_listener_t, name), \
  }

/* Commands */

/* The parse sets the wrong face_type_t for listener, we fix that here */
int on_listener_create(hc_listener_t* listener) {
  switch (listener->type) {
    case FACE_TYPE_UDP:
      listener->type = FACE_TYPE_UDP_LISTENER;
      break;
    case FACE_TYPE_TCP:
      listener->type = FACE_TYPE_TCP_LISTENER;
      break;
    case FACE_TYPE_HICN:
      listener->type = FACE_TYPE_HICN_LISTENER;
      break;
    case FACE_TYPE_UDP_LISTENER:
    case FACE_TYPE_TCP_LISTENER:
    case FACE_TYPE_HICN_LISTENER:
      break;
    case FACE_TYPE_UNDEFINED:
    case FACE_TYPE_N:
      return -1;
  }
  return 0;
}

#if 0
static const command_parser_t command_listener_create4 = {
    .action = ACTION_CREATE,
    .object = OBJECT_TYPE_LISTENER,
    .nparams = 4,
    .parameters = {protocol_hicn, symbolic, local_address, interface},
    .post_hook = (parser_hook_t)on_listener_create,
};
COMMAND_REGISTER(command_listener_create4);
#endif

static const command_parser_t command_listener_create4 = {
    .action = ACTION_CREATE,
    .object_type = OBJECT_TYPE_LISTENER,
    .nparams = 4,
    .parameters = {protocol_tcp_udp, symbolic, local_address, local_port},
    .post_hook = (parser_hook_t)on_listener_create,
};
COMMAND_REGISTER(command_listener_create4);

static const command_parser_t command_listener_create5 = {
    .action = ACTION_CREATE,
    .object_type = OBJECT_TYPE_LISTENER,
    .nparams = 5,
    .parameters = {protocol_tcp_udp, symbolic, local_address, local_port,
                   interface},
    .post_hook = (parser_hook_t)on_listener_create,
};
COMMAND_REGISTER(command_listener_create5);

static const command_parser_t command_listener_list = {
    .action = ACTION_LIST,
    .object_type = OBJECT_TYPE_LISTENER,
    .nparams = 0,
};
COMMAND_REGISTER(command_listener_list);

static const command_parser_t command_listener_remove = {
    .action = ACTION_DELETE,
    .object_type = OBJECT_TYPE_LISTENER,
    .nparams = 1,
    .parameters = {symbolic_or_id},
};
COMMAND_REGISTER(command_listener_remove);