implement --packet-limit for UDP server mode

This commit is contained in:
Michael Rash 2014-09-28 21:19:19 -04:00
parent a5dd273189
commit 360905ec56
2 changed files with 39 additions and 12 deletions

View File

@ -180,6 +180,8 @@ run_udp_server(fko_srv_options_t *opts)
if(selval == 0) if(selval == 0)
continue; 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); pkt_len = recvfrom(s_sock, msg, 5000, 0, (struct sockaddr *)&caddr, &clen);
printf("-------------------------------------------------------\n"); printf("-------------------------------------------------------\n");
@ -198,20 +200,37 @@ run_udp_server(fko_srv_options_t *opts)
/* Expect the data to not be too large /* Expect the data to not be too large
*/ */
if(pkt_len > MAX_SPA_PACKET_LEN) if(pkt_len <= MAX_SPA_PACKET_LEN)
continue; {
/* 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); if (opts->packet_ctr_limit && opts->packet_ctr >= opts->packet_ctr_limit)
opts->spa_pkt.packet_data_len = pkt_len; {
opts->spa_pkt.packet_proto = IPPROTO_UDP; log_msg(LOG_WARNING,
opts->spa_pkt.packet_src_ip = caddr.sin_addr.s_addr; "* Incoming packet count limit of %i reached",
opts->spa_pkt.packet_dst_ip = saddr.sin_addr.s_addr; opts->packet_ctr_limit
opts->spa_pkt.packet_src_port = ntohs(caddr.sin_port); );
opts->spa_pkt.packet_dst_port = ntohs(saddr.sin_port); return 1;
}
incoming_spa(opts);
} /* infinite while loop */ } /* infinite while loop */

View File

@ -2482,6 +2482,14 @@
'function' => \&server_packet_limit, 'function' => \&server_packet_limit,
'fwknopd_cmdline' => "$fwknopdCmd $default_server_conf_args --packet-limit 1 $intf_str", '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', 'category' => 'basic operations',
'subcategory' => 'server', 'subcategory' => 'server',