|
From: <nor...@us...> - 2007-05-11 12:40:40
|
Revision: 27
http://opencalea.svn.sourceforge.net/opencalea/?rev=27&view=rev
Author: norm_brandinger
Date: 2007-05-11 05:40:32 -0700 (Fri, 11 May 2007)
Log Message:
-----------
Reapply df_collector fixes
Modified Paths:
--------------
trunk/src/df_collector.c
Modified: trunk/src/df_collector.c
===================================================================
--- trunk/src/df_collector.c 2007-05-10 23:07:56 UTC (rev 26)
+++ trunk/src/df_collector.c 2007-05-11 12:40:32 UTC (rev 27)
@@ -32,8 +32,8 @@
ssize_t tcp_write(int fd, const void *buf, size_t tot_len);
ssize_t tcp_read(int fd, void *buf, size_t tot_len);
+void parse_commandline(int argc, char *argv[]);
void usage (void);
-int PacketSend ( char *packet, int length, int *send_sock );
#define DF_REPLY 1
@@ -263,7 +263,7 @@
ssize_t num_sent;
msg_len = sizeof(Msg);
CtrlMsg *ctrlmsg;
- int id;
+ int id, socktype;
char route_port[8];
char filename[MAX_LINE];
@@ -283,7 +283,7 @@
break;
case MSGTYPE_CONTROL:
- debug_3("df_collector: MSGTYPE_CONTROL OpenCALEA Control message");
+ //debug_3("df_collector: MSGTYPE_CONTROL OpenCALEA Control message");
ctrlmsg = (CtrlMsg *)((char *)msg + msg_len);
//print_hex((const u_char *)msg, msg_len);
@@ -355,26 +355,23 @@
/* Create a Route (generally to the LEA) */
/*****************************************/
sprintf(route_port, "%d", ntohs(ctrlmsg->ctrlh.dfhost.port));
- debug_4("df_collector: route port is %s", route_port);
-
- bzero(&hints, sizeof(hints));
- hints.ai_family = AF_INET;
-
if (strcmp((char *)ctrlmsg->ctrlh.dfhost.protocol,"udp") == 0) {
debug_4("df_collector: route protocol is UDP");
- hints.ai_socktype = SOCK_DGRAM;
+ socktype = SOCK_DGRAM;
} else if (strcmp((char *)ctrlmsg->ctrlh.dfhost.protocol,"tcp") == 0) {
error("df_collector: TCP is currently an unsupported route protocol");
- hints.ai_socktype = SOCK_STREAM;
+ socktype = SOCK_STREAM;
} else {
debug_2("df_collector: %s is currently an unsupported route protocol. Defaulting to UDP",
ctrlmsg->ctrlh.dfhost.protocol);
- hints.ai_socktype = SOCK_DGRAM;
+ socktype = SOCK_DGRAM;
}
- if (getaddrinfo((char *)ctrlmsg->ctrlh.dfhost.host, route_port, &hints, &res)) {
- return -1;
- }
+ res = Getaddrinfo1st((char *)ctrlmsg->ctrlh.dfhost.host, route_port, AF_INET, socktype);
+ if (!res) {
+ debug_5("df_collector: ROUTE ADD Getaddrinfo1st failed");
+ return -1;
+ }
switch (res->ai_family) {
case AF_INET:
@@ -457,28 +454,49 @@
debug_5("df_collector: CmII capture file is not available");
}
- num_sent = sendto (route[id].lea_fd,
- ((char *)msg + msg_len),
- msg->msgh.msglen,
- 0,
- (struct sockaddr *)&route[id].lea_addr,
- sizeof(route[id].lea_addr));
+ num_sent = sendto (route[id].lea_fd,
+ ((char *)msg + msg_len),
+ msg->msgh.msglen,
+ 0,
+ (struct sockaddr *)&route[id].lea_addr,
+ sizeof(route[id].lea_addr));
- if (num_sent == -1) {
- debug_3("df_collector: CmII packet -> route[%d] %s:%d failed",
- id,
- addrstr,
- ntohs(route[id].lea_addr.sin_port));
- socklen = sizeof(sockval);
- Getsockopt(route[id].lea_fd, SOL_SOCKET, SO_ERROR, &sockval, &socklen);
- } else {
- debug_5("df_collector: CmII packet -> route[%d] %s:%d %d bytes sent ",
- id,
- addrstr,
- ntohs(route[id].lea_addr.sin_port),
- num_sent);
- }
+ /****************************************************************************/
+ /* If there was an error sending the data to the other end of the route[id] */
+ /* then save the data locally for future transmission. */
+ /* Note that for UDP transmissions, an error will only be indicated if the */
+ /* the socket to the route[id] is in an error state. For UDP, there IS NO */
+ /* GUARANTEE that the data was actually received at the remote end. */
+ /****************************************************************************/
+ if (num_sent == -1) {
+ debug_5("df_collector: CmII packet -> route[%d] %s:%d failed saving to file",
+ id,
+ addrstr,
+ ntohs(route[id].lea_addr.sin_port));
+ socklen = sizeof(sockval);
+ Getsockopt(route[id].lea_fd, SOL_SOCKET, SO_ERROR, &sockval, &socklen);
+ /**************************/
+ /* Write packet to a file */
+ /**************************/
+ if (route[id].cmii_fp) {
+ ret = fwrite(((char *)msg + msg_len), msg->msgh.msglen, 1, route[id].cmii_fp);
+ if (ret != 1) {
+ debug_5("df_collector: Error writing to CmII file");
+ } else {
+ debug_5("df_collector: Wrote %d bytes to CmII file", (ret * msg->msgh.msglen));
+ }
+ } else {
+ debug_5("df_collector: Warning CmII capture file is not available");
+ }
+ } else {
+ debug_5("df_collector: CmII packet -> route[%d] %s:%d %d bytes sent ",
+ id,
+ addrstr,
+ ntohs(route[id].lea_addr.sin_port),
+ num_sent);
+ }
+
break;
case MSGTYPE_CII:
@@ -493,37 +511,49 @@
id = ntohs(msg->msgh.routeid);
inet_ntop (route[id].lea_addr.sin_family, &route[id].lea_addr.sin_addr.s_addr, addrstr, sizeof(addrstr));
- if (route[id].cmc_fp) {
- ret = fwrite(((char *)msg + msg_len), msg->msgh.msglen, 1, route[id].cmc_fp);
- if (ret != 1) {
- error("df_collector: error writing to CmC file: %s", strerror(errno));
- }
- } else {
- debug_5("df_collector: CmC capture file is not available");
- }
+ num_sent = sendto (route[id].lea_fd,
+ ((char *)msg + msg_len),
+ msg->msgh.msglen,
+ 0,
+ (struct sockaddr *)&route[id].lea_addr,
+ sizeof(route[id].lea_addr));
- num_sent = sendto (route[id].lea_fd,
- ((char *)msg + msg_len),
- msg->msgh.msglen,
- 0,
- (struct sockaddr *)&route[id].lea_addr,
- sizeof(route[id].lea_addr));
-
- if (num_sent == -1) {
- debug_3("df_collector: CmC packet -> route[%d] %s:%d failed",
- id,
- addrstr,
- ntohs(route[id].lea_addr.sin_port));
- socklen = sizeof(sockval);
- Getsockopt(route[id].lea_fd, SOL_SOCKET, SO_ERROR, &sockval, &socklen);
- } else {
- debug_5("df_collector: CmC packet -> route[%d] %s:%d %d bytes sent ",
- id,
- addrstr,
- ntohs(route[id].lea_addr.sin_port),
- num_sent);
- }
+ /****************************************************************************/
+ /* If there was an error sending the data to the other end of the route[id] */
+ /* then save the data locally for future transmission. */
+ /* Note that for UDP transmissions, an error will only be indicated if the */
+ /* the socket to the route[id] is in an error state. For UDP, there IS NO */
+ /* GUARANTEE that the data was actually received at the remote end. */
+ /****************************************************************************/
+ if (num_sent == -1) {
+ debug_5("df_collector: CmC packet -> route[%d] %s:%d failed saving to file",
+ id,
+ addrstr,
+ ntohs(route[id].lea_addr.sin_port));
+ socklen = sizeof(sockval);
+ Getsockopt(route[id].lea_fd, SOL_SOCKET, SO_ERROR, &sockval, &socklen);
+ /**************************/
+ /* Write packet to a file */
+ /**************************/
+ if (route[id].cmc_fp) {
+ ret = fwrite(((char *)msg + msg_len), msg->msgh.msglen, 1, route[id].cmc_fp);
+ if (ret != 1) {
+ debug_5("df_collector: Error writing to CmC file");
+ } else {
+ debug_5("df_collector: Wrote %d bytes to CmC file", (ret * msg->msgh.msglen));
+ }
+ } else {
+ debug_5("df_collector: Warning CmC capture file is not available");
+ }
+ } else {
+ debug_5("df_collector: CmC packet -> route[%d] %s:%d %d bytes sent ",
+ id,
+ addrstr,
+ ntohs(route[id].lea_addr.sin_port),
+ num_sent);
+ }
+
break;
case MSGTYPE_CC:
@@ -608,7 +638,13 @@
/************************/
/* Create DF TCP socket */
/************************/
+
res = Getaddrinfo1st(bind_addr, df_port, AF_INET, SOCK_STREAM);
+ if (!res) {
+ debug_5("df_collector: %s:%s TCP Gteaddrinfo1st failed", bind_addr, df_port);
+ return -1;
+ }
+
switch (res->ai_family) {
case AF_INET:
bzero(&servaddr, sizeof(servaddr));
@@ -637,7 +673,13 @@
/*****************************/
ctrl_port = Calloc ( 64 );
snprintf ( ctrl_port, 64, "%d", DF_CONTROL_PORT );
+
res = Getaddrinfo1st(bind_addr, ctrl_port, AF_INET, SOCK_STREAM);
+ if (!res) {
+ debug_5("df_collector: Control %s:%s TCP Gteaddrinfo1st failed", bind_addr, ctrl_port);
+ return -1;
+ }
+
switch (res->ai_family) {
case AF_INET:
bzero(&servaddr, sizeof(servaddr));
@@ -664,7 +706,13 @@
/************************/
/* Create DF UDP socket */
/************************/
+
res = Getaddrinfo1st(bind_addr, df_port, AF_INET, SOCK_DGRAM);
+ if (!res) {
+ debug_5("df_collector: %s:%s TCP Gteaddrinfo1st failed", bind_addr, df_port);
+ return -1;
+ }
+
switch (res->ai_family) {
case AF_INET:
bzero(&servaddr, sizeof(servaddr));
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|