#include "checksums.h"
+/*Use the DCCP source port to multiplex DCCP Ping streams by PID*/
+#define SRC_PORT_AS_PID_MULTIPLEX 1
+
+
#define MAX(x,y) (x>y ? x : y)
extern int errno;
};
struct params{
- int count; /*Default number of pings (-1 is infinity)*/
- int dest_port; /*Default port*/
- int ttl; /*Default TTL*/
- long interval; /*Default delay between pings in ms*/
+ int count; /*Number of pings (-1 is infinity)*/
+ int dest_port; /*Destination port*/
+ int src_port; /*Source port---used to encode pid*/
+ int ttl; /*TTL*/
+ long interval; /*Delay between pings in ms*/
int ip_type; /*IPv4 or IPv6*/
ipaddr_ptr_t dest_addr; /*Destination Address*/
ipaddr_ptr_t src_addr; /*Source Address*/
}
dst=argv[0];
+#if SRC_PORT_AS_PID_MULTIPLEX
+ /*Encode PID in source port*/
+ parms.src_port=(getpid()+1024)%65535;
+#else
+ parms.src_port=parms.dest_port;
+#endif
+
getAddresses(src, dst);
if(parms.src_addr.gen==NULL || parms.dest_addr.gen==NULL){
dbgprintf(0,"Error: Can't determine source or destination address\n");
free(rcv_addr.gen);
return;
}
- if(dhdr->dccph_dport!=htons(parms.dest_port)){
+ if(dhdr->dccph_dport!=htons(parms.src_port)){
dbgprintf(1,"DCCP packet with wrong Destination Port\n");
free(rcv_addr.gen);
return;
free(rcv_addr.gen);
return;
}
- if(dhdr->dccph_sport!=htons(parms.dest_port)){
+ if(dhdr->dccph_sport!=htons(parms.src_port)){
/*DCCP Source Ports don't match*/
dbgprintf(1,"Tossing ICMPv4 packet because the embedded packet doesn't have our DCCP source port\n");
free(rcv_addr.gen);
free(rcv_addr.gen);
return;
}
- if(dhdr->dccph_sport!=htons(parms.dest_port)){
+ if(dhdr->dccph_sport!=htons(parms.src_port)){
/*DCCP Source Ports don't match*/
dbgprintf(1,"Tossing ICMPv6 packet because the embedded packet doesn't have our DCCP source port\n");
free(rcv_addr.gen);
dhdr->dccph_doff=dccp_hdr_len/4;
dhdr->dccph_dport=htons(parms.dest_port);
dhdr->dccph_reserved=0;
- dhdr->dccph_sport=htons(parms.dest_port);
+ dhdr->dccph_sport=htons(parms.src_port);
dhdr->dccph_x=1;
dhdr->dccph_type=DCCP_PKT_REQUEST;
dhdr->dccph_seq2=htonl(0); //Reserved if using 48 bit sequence numbers
dhdr->dccph_doff=dccp_hdr_len/4;
dhdr->dccph_dport=htons(parms.dest_port);
dhdr->dccph_reserved=0;
- dhdr->dccph_sport=htons(parms.dest_port);
+ dhdr->dccph_sport=htons(parms.src_port);
dhdr->dccph_x=1;
dhdr->dccph_type=DCCP_PKT_CLOSE;
dhdr->dccph_seq2=htonl(0); //Reserved if using 48 bit sequence numbers
dhdr->dccph_doff=dccp_hdr_len/4;
dhdr->dccph_dport=htons(parms.dest_port);
dhdr->dccph_reserved=0;
- dhdr->dccph_sport=htons(parms.dest_port);
+ dhdr->dccph_sport=htons(parms.src_port);
dhdr->dccph_x=1;
dhdr->dccph_type=DCCP_PKT_RESET;
dhdr->dccph_seq2=htonl(0); //Reserved if using 48 bit sequence numbers