summaryrefslogtreecommitdiff
path: root/src/lbtest_ttl.cc
diff options
context:
space:
mode:
authorslioch <slioch@eng-140.vyatta.com>2009-07-27 17:01:08 -0700
committerslioch <slioch@eng-140.vyatta.com>2009-07-27 17:01:08 -0700
commitb80e518d20d05646404a28c2a5cbfc86d0221600 (patch)
tree7d9f5fc32c677819adcb9a679a75b2d73d76cfa4 /src/lbtest_ttl.cc
parent6047ad1d172c1f825ff98468e2ffdb33002c718f (diff)
downloadvyatta-wanloadbalance-b80e518d20d05646404a28c2a5cbfc86d0221600.tar.gz
vyatta-wanloadbalance-b80e518d20d05646404a28c2a5cbfc86d0221600.zip
clean up all of mangle table on exit, including new entries. fixed bug in target iteration where some targets never completed test cycle
Diffstat (limited to 'src/lbtest_ttl.cc')
-rw-r--r--src/lbtest_ttl.cc92
1 files changed, 44 insertions, 48 deletions
diff --git a/src/lbtest_ttl.cc b/src/lbtest_ttl.cc
index 4b10223..47d1f4d 100644
--- a/src/lbtest_ttl.cc
+++ b/src/lbtest_ttl.cc
@@ -1,5 +1,5 @@
/*
- * Module: lbpathtest.cc
+ * Module: lbtest_ttl.cc
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
@@ -83,6 +83,7 @@ TTLEngine::process(LBHealth &health,LBTestTTL *data)
send(data->_send_raw_sock, health._interface,target,_packet_id,health._address,data->get_ttl(),data->get_port());
_results.insert(pair<int,PktData>(_packet_id,PktData(health._interface,-1)));
+ return 0;
}
/**
@@ -94,7 +95,6 @@ TTLEngine::recv(LBHealth &health,LBTestTTL *data)
{
_initialized = false;
if (_received == false) {
-
//use gettimeofday to calculate time to millisecond
//then iterate over recv socket and receive and record
//use sysinfo to make sure we don't get stuck in a loop with timechange
@@ -115,9 +115,9 @@ TTLEngine::recv(LBHealth &health,LBTestTTL *data)
//update current time for comparison
struct sysinfo si;
sysinfo(&si);
+ cur_time = si.uptime;
timeval recv_time;
gettimeofday(&recv_time,NULL);
- cur_time = si.uptime;
map<int,PktData>::iterator r_iter = _results.find(id);
if (r_iter != _results.end()) {
//calculate time in milliseconds
@@ -133,6 +133,9 @@ TTLEngine::recv(LBHealth &health,LBTestTTL *data)
r_iter->second._rtt = abs(msecs) / 1000 + 1000 * secs;
--pending_result_ct;
}
+ else {
+ return -1;
+ }
}
if (_debug) {
cout << "TTLEngine::recv(): finished heath test" << endl;
@@ -143,7 +146,6 @@ TTLEngine::recv(LBHealth &health,LBTestTTL *data)
map<int,PktData>::iterator r_iter = _results.begin();
data->_state = LBTest::K_FAILURE;
while (r_iter != _results.end()) {
-
if (r_iter->second._iface == health._interface) {
if (r_iter->second._rtt < data->_resp_time) {
data->_state = LBTest::K_SUCCESS;
@@ -200,7 +202,6 @@ TTLEngine::send(int send_sock, const string &iface, const string &target_addr, u
int err;
sockaddr_in taddr;
- timeval send_time;
char buffer[42];
struct iphdr *ip;
struct udphdr *udp;
@@ -309,10 +310,7 @@ TTLEngine::receive(int recv_sock)
int icmp_pktsize = 40;
char resp_buf[icmp_pktsize];
icmphdr *icmp_hdr;
- struct sockaddr_in dest_addr;
- unsigned int addr_len;
fd_set readfs;
- unsigned short packet_id = 0;
FD_ZERO(&readfs);
FD_SET(recv_sock, &readfs);
@@ -364,27 +362,27 @@ TTLEngine::receive(int recv_sock)
*
**/
unsigned short
-TTLEngine::in_checksum(unsigned short *pAddr, int iLen)
+TTLEngine::in_checksum(unsigned short *addr, int len)
{
- int iSum = 0;
- unsigned short usAnswer = 0;
- unsigned short *pW = pAddr;
- int iRemain = iLen;
+ int sum = 0;
+ unsigned short answer = 0;
+ unsigned short *w = addr;
+ int remain = len;
- while(iRemain > 1)
+ while(remain > 1)
{
- iSum += *pW++;
- iRemain -= sizeof(unsigned short);
+ sum += *w++;
+ remain -= sizeof(unsigned short);
}
- if(iRemain==1)
+ if(remain==1)
{
- *(u_char *)(&usAnswer)=*(u_char*)pW;
- iSum += usAnswer;
+ *(u_char *)(&answer)=*(u_char*)w;
+ sum += answer;
}
- iSum = (iSum>>16) + (iSum&0xffff);
- iSum += (iSum>>16);
- usAnswer = ~iSum;
- return(usAnswer);
+ sum = (sum>>16) + (sum&0xffff);
+ sum += (sum>>16);
+ answer = ~sum;
+ return(answer);
}
@@ -394,42 +392,40 @@ TTLEngine::in_checksum(unsigned short *pAddr, int iLen)
*
**/
unsigned short
-TTLEngine::udp_checksum(unsigned char ucProto, char *pPacket, int iLength, unsigned long ulSourceAddress, unsigned long ulDestAddress)
+TTLEngine::udp_checksum(unsigned char proto, char *packet, int length, unsigned long source_address, unsigned long dest_address)
{
- struct PsuedoHdr
+ struct PseudoHdr
{
- struct in_addr sourceAddr;
- struct in_addr destAddr;
- unsigned char ucPlaceHolder;
- unsigned char ucProtocol;
- unsigned short usLength;
- } PsuedoHdr;
+ struct in_addr source_addr;
+ struct in_addr dest_addr;
+ unsigned char place_holder;
+ unsigned char protocol;
+ unsigned short length;
+ } PseudoHdr;
- struct PsuedoHdr psuedoHdr;
- char *pTempPacket;
- unsigned short usAnswer;
- psuedoHdr.ucProtocol = ucProto;
- psuedoHdr.usLength = htons(iLength);
- psuedoHdr.ucPlaceHolder = 0;
- psuedoHdr.sourceAddr.s_addr = ulSourceAddress;
- psuedoHdr.destAddr.s_addr = ulDestAddress;
+ struct PseudoHdr pseudoHdr;
+ char *temp_packet;
+ unsigned short answer;
+ pseudoHdr.protocol = proto;
+ pseudoHdr.length = htons(length);
+ pseudoHdr.place_holder = 0;
+ pseudoHdr.source_addr.s_addr = source_address;
+ pseudoHdr.dest_addr.s_addr = dest_address;
- if((pTempPacket = (char*)malloc(sizeof(PsuedoHdr) + iLength)) == NULL)
+ if((temp_packet = (char*)malloc(sizeof(PseudoHdr) + length)) == NULL)
{
cerr << "ActionDropConn::UDPChecksum(), error in malloc" << endl;
//throw an exception
return 0;
}
- memcpy(pTempPacket, &psuedoHdr, sizeof(PsuedoHdr));
- memcpy((pTempPacket + sizeof(PsuedoHdr)), pPacket, iLength);
-
- usAnswer = (unsigned short)in_checksum((unsigned short*)pTempPacket,
- (iLength + sizeof(PsuedoHdr)));
-
- free(pTempPacket);
+ memcpy(temp_packet, &pseudoHdr, sizeof(PseudoHdr));
+ memcpy((temp_packet + sizeof(PseudoHdr)), packet, length);
- return usAnswer;
+ answer = (unsigned short)in_checksum((unsigned short*)temp_packet,
+ (length + sizeof(PseudoHdr)));
+ free(temp_packet);
+ return answer;
}
/**