31 uint64_t permission_mask, uint64_t *option_types_found,
42 while (
buf_parse(buf,
',', line,
sizeof(line)))
44 uint64_t push_update_option_flags = 0;
50 while (isspace(line[i]))
67 if (strncmp(&line[i],
"route ", 6) == 0)
78 else if (!strcmp(&line[i],
"push-continuation 2"))
82 else if (!strcmp(&line[i],
"push-continuation 1"))
92 bool honor_received_options, uint64_t permission_mask,
93 uint64_t *option_types_found)
121#ifndef ENABLE_MANAGEMENT
159 "PUSH_UPDATE,dhcp-option DNS 8.8.8.8, route 0.0.0.0 0.0.0.0 10.10.10.1";
164 &option_types_found),
175 const char *
update_msg =
"PUSH_UPDATEerr,dhcp-option DNS 8.8.8.8";
180 &option_types_found),
191 const char *
update_msg =
"PUSH_UPDATE ,dhcp-option DNS 8.8.8.8";
196 &option_types_found),
207 const char *
update_msg =
"PUSH_UPDATE, -?dns, route something, ?dhcp-option DNS 8.8.8.8";
212 &option_types_found),
223 const char *
update_msg =
"PUSH_UPDATE, -dhcp-option, ?-dns";
228 &option_types_found),
239 const char *
update_msg =
"PUSH_UPDATE, dev tun";
244 &option_types_found),
256 "PUSH_UPDATE,-dhcp-option, route 10.10.10.0, dhcp-option DNS 1.1.1.1, route 10.11.12.0, dhcp-option DOMAIN corp.local, keepalive 10 60";
261 &option_types_found),
273 "PUSH_UPDATE,-dhcp-option,dhcp-option DNS 8.8.8.8,redirect-gateway local,route 192.168.1.0 255.255.255.0";
278 &option_types_found),
299 uint64_t option_types_found = 0;
305 const char *
cont_msg1 =
"PUSH_UPDATE, route 10.1.0.0 255.255.0.0, route 10.2.0.0 255.255.0.0, route 10.3.0.0 255.255.0.0,push-continuation 2";
309 &option_types_found),
315 const char *
cont_msg2 =
"PUSH_UPDATE, route 10.4.0.0 255.255.0.0, route 10.5.0.0 255.255.0.0, route 10.6.0.0 255.255.0.0,push-continuation 2";
319 &option_types_found),
325 const char *
cont_msg3 =
"PUSH_UPDATE, route 10.7.0.0 255.255.0.0, route 10.8.0.0 255.255.0.0, route 10.9.0.0 255.255.0.0,push-continuation 1";
329 &option_types_found),
343#ifdef ENABLE_MANAGEMENT
345 "PUSH_UPDATE,redirect-gateway local,route 192.168.1.0 255.255.255.0",
349 "PUSH_UPDATE,-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,push-continuation 2",
350 "PUSH_UPDATE, akakakakakakakakakakakaf, dhcp-option DNS 8.8.8.8,redirect-gateway local,push-continuation 2",
351 "PUSH_UPDATE,route 192.168.1.0 255.255.255.0,push-continuation 1",
359 "PUSH_UPDATE,-dhcp-option, blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,push-continuation 2",
360 "PUSH_UPDATE, akakakakakakakakakakakaf,dhcp-option DNS 8.8.8.8, redirect-gateway local,push-continuation 2",
361 "PUSH_UPDATE, route 192.168.1.0 255.255.255.0,,push-continuation 1",
365 "PUSH_UPDATE,,-dhcp-option, blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,push-continuation 2",
366 "PUSH_UPDATE, akakakakakakakakakakakaf,dhcp-option DNS 8.8.8.8, redirect-gateway local,push-continuation 2",
367 "PUSH_UPDATE, route 192.168.1.0 255.255.255.0,push-continuation 1",
371 "PUSH_UPDATE,-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,push-continuation 2",
372 "PUSH_UPDATE, akakakakakakakakakakakaf, dhcp-option DNS 8.8.8.8, redirect-gateway 10.10.10.10,,push-continuation 2",
373 "PUSH_UPDATE, route 192.168.1.0 255.255.255.0,,push-continuation 1",
377 "PUSH_UPDATE,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,push-continuation 2",
378 "PUSH_UPDATE,,,,,,,,,,,,,,,,,,,push-continuation 1",
382 "PUSH_UPDATE,-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,push-continuation 2",
383 "PUSH_UPDATE, akakakakakakakakakakakaf, dhcp-option DNS 8.8.8.8,redirect-gateway\n local,push-continuation 2",
384 "PUSH_UPDATE,route 192.168.1.0 255.255.255.0\n\n\n,push-continuation 1",
392 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,push-continuation 2",
393 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,push-continuation 2",
394 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,push-continuation 2",
395 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,push-continuation 2",
396 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,push-continuation 1",
400 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,,,,,,a,push-continuation 2",
401 "PUSH_UPDATE,abc,push-continuation 1",
405 "PUSH_UPDATE,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,,,,,,a,",
409 "PUSH_UPDATE,a,push-continuation 2",
410 "PUSH_UPDATE,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,push-continuation 2",
411 "PUSH_UPDATE,a,push-continuation 1",
415const char *
msg0 =
"redirect-gateway local,route 192.168.1.0 255.255.255.0";
416const char *
msg1 =
"-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,"
417 " akakakakakakakakakakakaf, dhcp-option DNS 8.8.8.8,redirect-gateway local,route 192.168.1.0 255.255.255.0";
420const char *
msg4 =
"-dhcp-option, blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,"
421 " akakakakakakakakakakakaf,dhcp-option DNS 8.8.8.8, redirect-gateway local, route 192.168.1.0 255.255.255.0,";
422const char *
msg5 =
",-dhcp-option, blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf,"
423 " akakakakakakakakakakakaf,dhcp-option DNS 8.8.8.8, redirect-gateway local, route 192.168.1.0 255.255.255.0";
424const char *
msg6 =
"-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf, akakakakakakakakakakakaf,"
425 " dhcp-option DNS 8.8.8.8, redirect-gateway 10.10.10.10,, route 192.168.1.0 255.255.255.0,";
426const char *
msg7 =
",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
427const char *
msg8 =
"-dhcp-option,blablalalalalalalalalalalalalf, lalalalalalalalalalalalalalaf, akakakakakakakakakakakaf,"
428 " dhcp-option DNS 8.8.8.8,redirect-gateway\n local,route 192.168.1.0 255.255.255.0\n\n\n";
431const char *
msg10 =
"abandon ability able about above absent absorb abstract absurd abuse access accident account accuse achieve"
432 "acid acoustic acquire across act action actor actress actual adapt add addict address adjust"
433 "baby bachelor bacon badge bag balance balcony ball bamboo banana banner bar barely bargain barrel base basic"
434 "basket battle beach bean beauty because become beef before begin behave behind"
435 "cabbage cabin cable cactus cage cake call calm camera camp can canal cancel candy cannon canoe canvas canyon"
436 "capable capital captain car carbon card cargo carpet carry cart case"
437 "daisy damage damp dance danger daring dash daughter dawn day deal debate debris decade december decide decline"
438 "decorate decrease deer defense define defy degree delay deliver demand demise denial";
440const char *
msg11 =
"a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,"
441 "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,"
442 "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,"
443 "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,"
444 "a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a";
446const char *
msg12 =
"a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,,,,,,a,abc";
448const char *
msg13 =
"a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,,,,,,a,";
450const char *
msg14 =
"a,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,a";
452#define PUSH_BUNDLE_SIZE_TEST 184
454#define expect_control_channel_strings(res) \
457 for (int j = 0; res[j] != NULL; j++) \
459 expect_string(send_control_channel_string, str, res[j]); \
467 const unsigned long cid = 0;
476 const unsigned long cid = 0;
485 const unsigned long cid = 0;
493 const unsigned long cid = 0;
502 const unsigned long cid = 0;
511 const unsigned long cid = 0;
520 const unsigned long cid = 0;
529 const unsigned long cid = 0;
538 const unsigned long cid = 0;
547 const unsigned long cid = 0;
556 const unsigned long cid = 0;
564 const unsigned long cid = 0;
573 const unsigned long cid = 0;
582 const unsigned long cid = 0;
591 const unsigned long cid = 0;
596#undef PUSH_BUNDLE_SIZE_TEST
616 free((*(m->
instances))->context.c2.tls_multi);
645 const struct CMUnitTest tests[] = {
657#ifdef ENABLE_MANAGEMENT
677 return cmocka_run_group_tests(tests, NULL, NULL);
bool buf_string_compare_advance(struct buffer *src, const char *match)
Compare the head of src with match and advance past it if equal.
void free_buf(struct buffer *buf)
Free the memory allocated for a buffer.
struct buffer alloc_buf(size_t size)
Allocate a buffer of the given size.
bool buf_parse(struct buffer *buf, const int delim, char *line, const int size)
Extract the next token from a buffer, delimited by a given character.
static bool buf_write(struct buffer *dest, const void *src, size_t size)
Append data to a buffer.
uint64_t pull_permission_mask(const struct context *c)
Header file for server-mode related structures and functions.
bool check_push_update_option_flags(char *line, int *i, uint64_t *flags)
Checks the formatting and validity of options inside push-update messages.
bool apply_pull_filter(const struct options *o, char *line)
Filter an option line by all pull filters.
int process_push_update(struct context *c, struct options *o, uint64_t permission_mask, uint64_t *option_types_found, struct buffer *buf, bool msg_sender)
Handles the receiving of a push-update message and applies updates to the specified options.
#define PUSH_OPT_OPTIONAL
#define PUSH_MSG_CONTINUATION
static int send_push_update(struct multi_context *m, const void *target, const char *msg, const push_update_type type, const size_t push_bundle_size)
A function to send a PUSH_UPDATE control message from server to client(s).
Wrapper structure for dynamically allocated memory.
int len
Length in bytes of the actual content within the allocated memory.
struct tls_multi * tls_multi
TLS state structure for this VPN tunnel.
Contains all state information for one tunnel.
struct context_2 c2
Level 2 context.
struct options options
Options loaded from command line or configuration file.
Main OpenVPN server state structure.
struct context top
Storage structure for process-wide configuration.
struct multi_instance ** instances
Array of multi_instances with the size of max_clients.
Server-mode state structure for one single VPN tunnel.
struct context context
The context structure storing state for this VPN tunnel.
struct pull_filter_list * pull_filter_list
uint64_t push_update_options_found
Security parameter state for a single VPN tunnel.
char * peer_info
A multi-line string of general-purpose info received from peer over control channel.
static void test_send_push_msg2(void **state)
bool send_control_channel_string(struct context *c, const char *str, msglvl_t msglevel)
static int teardown(void **state)
static void test_send_push_msg9(void **state)
static void test_send_push_msg11(void **state)
static void test_send_push_msg4(void **state)
static void test_send_push_msg1(void **state)
bool mroute_extract_openvpn_sockaddr(struct mroute_addr *addr, const struct openvpn_sockaddr *osaddr, bool use_port)
static void test_send_push_msg3(void **state)
static void reset_route_counters(void)
static void test_send_push_msg0(void **state)
static void test_send_push_msg8(void **state)
struct multi_instance * lookup_by_cid(struct multi_context *m, const unsigned long cid)
static void test_send_push_msg12(void **state)
static int teardown2(void **state)
static int route_add_count
static void test_incoming_push_message_bad_format(void **state)
#define expect_control_channel_strings(res)
static void test_send_push_msg6(void **state)
static void test_send_push_msg7(void **state)
static void test_incoming_push_message_error2(void **state)
static void test_send_push_msg5(void **state)
static int setup2(void **state)
static void test_incoming_push_continuation_route_accumulation(void **state)
Test that routes accumulate correctly across multiple continuation messages.
static int route_reset_count
static void test_send_push_msg10(void **state)
static void test_incoming_push_message_mix(void **state)
static int setup(void **state)
static void test_incoming_push_message_basic(void **state)
int process_incoming_push_msg(struct context *c, const struct buffer *buffer, bool honor_received_options, uint64_t permission_mask, uint64_t *option_types_found)
static void test_incoming_push_message_1(void **state)
static void test_incoming_push_message_error1(void **state)
bool apply_push_options(struct context *c, struct options *options, struct buffer *buf, uint64_t permission_mask, uint64_t *option_types_found, struct env_set *es, bool is_update)
static void test_incoming_push_message_mix2(void **state)
static void test_send_push_msg13(void **state)
static void test_incoming_push_message_not_updatable_option(void **state)
#define PUSH_BUNDLE_SIZE_TEST
static void test_send_push_msg14(void **state)
const char * tls_common_name(const struct tls_multi *multi, const bool null)
Returns the common name field for the given tunnel.