diff --git a/server/udp_server.c b/server/udp_server.c index 21d1e5e7..fb76d9c1 100644 --- a/server/udp_server.c +++ b/server/udp_server.c @@ -180,6 +180,8 @@ run_udp_server(fko_srv_options_t *opts) if(selval == 0) continue; + /* If we make it here then there is a datagram to process + */ pkt_len = recvfrom(s_sock, msg, 5000, 0, (struct sockaddr *)&caddr, &clen); printf("-------------------------------------------------------\n"); @@ -198,20 +200,37 @@ run_udp_server(fko_srv_options_t *opts) /* Expect the data to not be too large */ - if(pkt_len > MAX_SPA_PACKET_LEN) - continue; + if(pkt_len <= MAX_SPA_PACKET_LEN) + { + /* Copy the packet for SPA processing + */ + strlcpy((char *)opts->spa_pkt.packet_data, msg, pkt_len+1); + opts->spa_pkt.packet_data_len = pkt_len; + opts->spa_pkt.packet_proto = IPPROTO_UDP; + opts->spa_pkt.packet_src_ip = caddr.sin_addr.s_addr; + opts->spa_pkt.packet_dst_ip = saddr.sin_addr.s_addr; + opts->spa_pkt.packet_src_port = ntohs(caddr.sin_port); + opts->spa_pkt.packet_dst_port = ntohs(saddr.sin_port); - /* Copy the packet for SPA processing + incoming_spa(opts); + } + + opts->packet_ctr += 1; + if(opts->foreground == 1 && opts->verbose > 2) + log_msg(LOG_DEBUG, "run_udp_server() processed: %d packets", opts->packet_ctr); + + /* Count the set of processed packets (pcap_dispatch() return + * value) - we use this as a comparison for --packet-limit regardless + * of SPA packet validity at this point. */ - strlcpy((char *)opts->spa_pkt.packet_data, msg, pkt_len+1); - opts->spa_pkt.packet_data_len = pkt_len; - opts->spa_pkt.packet_proto = IPPROTO_UDP; - opts->spa_pkt.packet_src_ip = caddr.sin_addr.s_addr; - opts->spa_pkt.packet_dst_ip = saddr.sin_addr.s_addr; - opts->spa_pkt.packet_src_port = ntohs(caddr.sin_port); - opts->spa_pkt.packet_dst_port = ntohs(saddr.sin_port); - - incoming_spa(opts); + if (opts->packet_ctr_limit && opts->packet_ctr >= opts->packet_ctr_limit) + { + log_msg(LOG_WARNING, + "* Incoming packet count limit of %i reached", + opts->packet_ctr_limit + ); + return 1; + } } /* infinite while loop */ diff --git a/test/tests/basic_operations.pl b/test/tests/basic_operations.pl index f6ba4c0e..91051edc 100644 --- a/test/tests/basic_operations.pl +++ b/test/tests/basic_operations.pl @@ -2482,6 +2482,14 @@ 'function' => \&server_packet_limit, 'fwknopd_cmdline' => "$fwknopdCmd $default_server_conf_args --packet-limit 1 $intf_str", }, + { + 'category' => 'basic operations', + 'subcategory' => 'server', + 'detail' => 'UDP server --packet-limit 1 exit', + 'function' => \&server_packet_limit, + 'fwknopd_cmdline' => "$fwknopdCmd $default_server_conf_args --udp-server --packet-limit 1 $intf_str", + }, + { 'category' => 'basic operations', 'subcategory' => 'server',