File ip_resend-0.4.diff of Package ip_resend

--- ip_resend-0.4/README.de~	1970-01-01 01:00:00.000000000 +0100
+++ ip_resend-0.4/README.de	2006-02-14 19:03:57.000000000 +0100
@@ -0,0 +1,64 @@
+Hallo,
+
+stellvertretend für alle, die auch schon unter dem Problem zu leiden
+haben, zitier ich mal die mir letzte bekannte Anfrage:
+
+>>>>> "Thomas" == Thomas Voss <tux102000@katja.tafeu.de> writes:
+
+    Thomas> Hallo zusammen,
+
+    Thomas> ich stehe hier gerade vor dem ungeliebten Problem, daß ein
+    Thomas> UDP-Paket, daß ein Dial-On-Demand bei dynamischer
+    Thomas> IP-Vergabe auslöst, quasi verloren ist, wenn auf eine
+    Thomas> Antwort vom Adressaten gewartet wird.
+
+    Thomas> Das betrifft bei mir besonders bind, der hier als
+    Thomas> caching-only Nameserver läuft und häufig mit einer
+    Thomas> geforwardete Anfrage (UDP-Paket) die Neuanwahl
+    Thomas> auslöst. Leider wartet bind (bind 8.2.2p5) mit dem
+    Thomas> erneuten Versenden der Anfrage per UDP eine ganze Minute,
+    Thomas> was für ein angenehmes Dial-On-Demand viel zu lang ist.
+
+    Thomas> Das Problem ist wahrscheinlich nicht ganz neu, aber leider
+    Thomas> konnte ich in den Archiven keine Lösung finden.
+
+Wir haben das auf dem letzten Linux-Kongress wieder diskutiert und
+mir schwebte schon lange eine reine User-Space-Lösung des Problems
+vor. Nach dem Kongress hab ich mich dann mal hingesetzt und das
+tatsächlich programmiert. Der Teufel steckte im Detail, und so hat
+es doch etwas länger als ein paar Tage gedauert, bis das ganze
+zuverlässig das tat, was es tun sollte.
+
+Aber jetzt ist die Zeit reif zum Testen im großen Stil.
+
+Das System besteht aus zwei Programmen: ip_resend und
+ip_resend_wakeup.  Das kompliziertere von beiden, ip_resend, wird
+gestarted, wenn die isdn-Verbindung abgebaut wird (typischerweise in
+/etc/ppp/ip-down).  Es schnüffelt auf dem damand-dial
+Netzwerk-Interface und kopiert sich das erste Packet, welches dort
+rausgesendet wird. Dann wartet es, bis es von einem zweiten Programm,
+nämlich ip_resend_wakeup (welches typischerweise von /etc/ppp/ip_up
+aus gestarted wird), mitgeteilt bekommt, dass die Isdn-Verbindung
+wieder steht und wie die neue Interface-Adresse ist. Dann sendet es
+das kopierte Paket noch einmal raus, uns zwar diesmal mit entsprechend
+der neuen Interface-Adresse geänderten Absenderadresse. Das
+entsprechende Response-Paket wird auch noch mal abgefangen und
+übersetzt.
+
+Das Resultat ist, dass z.B. innerhalb von 0.1 sec (oder noch scheller),
+nachdem die ppp-Verbindung steht, die DNS-Anfrage aufgelöst ist.
+
+Es ist kein Kernel-Patch nötig. Es sollte sowohl mit 2.2.x als auch
+mit 2.4.x Kerneln funktionieren. Übrigens nicht nur mit isdn_ppp
+sondern auch mit async ppp, pppoe/ADSL, ... -- ist völlig egal!
+Async-ppp Usern mit 30sec Traingingszeit für das Modem wird das
+allerdings nicht so deutlich auffallen ;).
+
+Wer es ausprobieren will: die URL ist
+
+	http://www.baty.hanse.de/ip_resend/ip-resend-0.1.tar.gz
+
+Viel Spaß,
+
+Henner
+
--- ip_resend-0.4/Makefile.orig	2001-09-10 22:15:42.000000000 +0200
+++ ip_resend-0.4/Makefile	2006-02-14 20:24:57.000000000 +0100
@@ -1,5 +1,5 @@
 #install binaries in this directory:
-INSTALL_PREFIX = /usr
+INSTALL_PREFIX = $(DESTDIR)/usr
 INSTALL_SBIN_DIR = $(INSTALL_PREFIX)/sbin
 INSTALL_MAN_DIR  = $(INSTALL_PREFIX)/share/man/man8
 
@@ -14,14 +14,14 @@
 .PHONY: all install clean test
 
 ip_resend: ip_resend.c 
-	cc ip_resend.c -Wall -D 'SOCK_DIR_PREFIX="$(SOCKET_DIR)"' -lm -o ip_resend
+	cc ip_resend.c $(CFLAGS) -Wall -D 'SOCK_DIR_PREFIX="$(SOCKET_DIR)"' -lm -o ip_resend
 
 ip_resend_wakeup: ip_resend_wakeup.c
-	cc ip_resend_wakeup.c -Wall -D 'SOCK_DIR_PREFIX="$(SOCKET_DIR)"' -o ip_resend_wakeup
+	cc ip_resend_wakeup.c $(CFLAGS) -Wall -D 'SOCK_DIR_PREFIX="$(SOCKET_DIR)"' -o ip_resend_wakeup
 
 install: $(PROGRAMS)
 	cp $(PROGRAMS) $(INSTALL_SBIN_DIR)
-	if [ ! -d $(SOCKET_DIR) ]; then mkdir $(SOCKET_DIR); fi
+	if [ ! -d $(DESTDIR)$(SOCKET_DIR) ]; then mkdir -p $(DESTDIR)$(SOCKET_DIR); fi
 	cp ip_resend.8 $(INSTALL_MAN_DIR)
 	(cd $(INSTALL_MAN_DIR); ln -sf ip_resend.8 ip_resend_wakeup.8)
 
--- ip_resend-0.4/ip_resend.c.orig	2001-09-11 00:29:31.000000000 +0200
+++ ip_resend-0.4/ip_resend.c	2006-02-14 22:15:24.750676049 +0100
@@ -52,7 +52,7 @@
 #include <stdlib.h>
 //#include <time.h>
 
-int debug = 1;
+int debug = 0;
 int daemonize = 1;
 int log_option = LOG_PID;
 struct timeval tv_start;
@@ -158,7 +158,7 @@
  * 2.4.0-test9 kernel net/ipv4/ip_nat_dumb.c by Henner Eisen
  * Original Authors:     Alexey Kuznetsov, Rani Assaf
  */
-static int ip_do_nat(unsigned char * buffer, int size, int saddr, int daddr)
+static int ip_do_nat(char * buffer, int size, int saddr, int daddr)
 {
 	struct iphdr * iph = (struct iphdr*) buffer;
         u_int32_t odaddr = iph->daddr;
@@ -240,14 +240,14 @@
 /*
  * write hexdump of packet to stdout
  */
-static void dump_packet(unsigned char *buffer, int size)
+static void dump_packet(char *buffer, int size)
 {
 	int i, c=0;
 #define DUMP_BUFSIZE 4000	
 	char wbuf[DUMP_BUFSIZE];
 
 	for(i=0;i<size;i++){
-		c += snprintf(wbuf+c,DUMP_BUFSIZE-c, " %2.2x",(int) buffer[i]);
+		c += snprintf(wbuf+c,DUMP_BUFSIZE-c, " %2.2x",(u_int) buffer[i]);
 	}
 	syslog(LOG_DEBUG,"%s\n", wbuf);
 }
@@ -288,7 +288,7 @@
 			return -1;
 		}
 	}
-	if(bind(fd,&addr,sizeof(addr))){
+	if(bind(fd,(struct sockaddr *)&addr,sizeof(addr))){
 		syslog(LOG_ERR, " -c %s: error in AF_UNIX bind(%s): %m\n",
 		        netif, path);
 		return -1;
@@ -303,7 +303,7 @@
  *
  * Returns an AF_PACKET socket file descriptor on success, -1 on failure;
  */
-static int setup_snoop_socket(struct sockaddr_ll *sl,unsigned char * netif)
+static int setup_snoop_socket(struct sockaddr_ll *sl, char *netif)
 {
 	int s;
 	struct ifreq ifr;
@@ -340,13 +340,14 @@
 /*
  *
  */
-static int snoop_first_outgoing_packet(int s, int us, unsigned char *buffer,
+static int snoop_first_outgoing_packet(int s, int us, char *buffer,
 				       int bufsize, struct sockaddr_ll * sl,
-				       unsigned char * netif)
+				       char * netif)
 {
-	int size, nfd, fromlen;
+	int size, nfd;
+	socklen_t fromlen;
 	fd_set rfds, efds;
-	unsigned char dummy[1500];
+	char dummy[1500];
 
 	/*
 	 * Snoop for first outgoing packet
@@ -403,14 +404,14 @@
 static int wait_for_resend_notification(int s, int us, double wake_timeo,
 					struct sockaddr_ll *sl,
 					struct in_addr *in_new,
-					unsigned char * netif,
-					unsigned char * path)
+					char * netif,
+					char * path)
 {
 	int err, nfd, cnt, n_garbage=0;
 	fd_set rfds, efds;
 	struct timeval tv;
 	struct ifreq ifr;
-	unsigned char new_address[81], dummy[1500];
+	char new_address[81], dummy[1500];
 
 	/*
 	 * we are no longer interested in outgoing packets at the snoop device
@@ -462,7 +463,7 @@
 		if(FD_ISSET(s, &rfds)){
 			/* we drain garbage from the socket that could
 			   accumulate while waiting for re-send notification */
-			int fromlen = sizeof(sl);
+			socklen_t fromlen = sizeof(sl);
 			recvfrom(s, dummy, sizeof(dummy), 0,
 				 (struct sockaddr*) &sl, &fromlen);
 			n_garbage++;
@@ -498,12 +499,13 @@
 }
 
 
-static int wait_for_response(int s, unsigned char *buffer, int bufsize,
+static int wait_for_response(int s, char *buffer, int bufsize,
 			     double resp_timeo, struct sockaddr_ll *sl,
 			     u_int32_t from_addr, u_int32_t to_addr,
-			     unsigned char * netif, unsigned char *path)
+			     char * netif, char *path)
 {
-	int err, fromlen, size, n_received=0;
+	int err, size, n_received=0;
+	socklen_t fromlen;
 	fd_set rfds, efds;
 	struct timeval tv;
 	struct iphdr * iph = (struct iphdr *) buffer;
@@ -554,7 +556,7 @@
 		if( (iph->daddr!=to_addr) || (iph->saddr!=from_addr) ){
 			if(debug>0){
 				struct ip * ipH = (struct ip *) iph;
-				unsigned char saddr[17];
+				char saddr[17];
 				strncpy(saddr,inet_ntoa(ipH->ip_src),sizeof(saddr));
 				syslog(LOG_INFO," -o %s: response packet from %s to %s after %.3fs: addresses don't match re-sent packet\n", netif, saddr, inet_ntoa(ipH->ip_dst),tvdiff(&tv_start));
 			}
@@ -568,8 +570,8 @@
 }
 
 
-static int loopback_response_packet(int s, unsigned char *buffer, int size,
-				    unsigned char * netif)
+static int loopback_response_packet(int s, char *buffer, int size,
+				    char * netif)
 {
 	struct ifreq ifr;
 	struct sockaddr_ll sl;
@@ -614,7 +616,7 @@
 
 int main(int argc, char **argv)
 {
-	unsigned char buffer[1500], path_buf[PATH_MAX];
+	char buffer[1500], path_buf[PATH_MAX];
 	unsigned int proto;
 	int s, us, err, size, new_ttl, dont_translate_response=0, c;
 	struct sockaddr_ll sl_bind, sl_from, sl;
@@ -623,7 +625,7 @@
 	struct timeval tv;
 	double td, wake_timeo=10., resp_timeo=10., resend_delay=0.;
 
-	unsigned char *path=NULL, *out_dev=NULL, *snoop_dev=NULL; 
+	char *path=NULL, *out_dev=NULL, *snoop_dev=NULL; 
 	
 	while( (c=getopt(argc,argv,"o:s:c:w:r:R:d:DM")) != EOF ){
 		switch(c){
@@ -693,7 +695,7 @@
 		n=snprintf(path_buf,sizeof(path_buf),
 			   SOCK_DIR_PREFIX "/%s", out_dev);
 		if((n<0) || n>=(sizeof(path_buf)-1)){
-			syslog(LOG_ERR, " -o %s: option too long!\n");
+			syslog(LOG_ERR, " -o %s: option too long!\n", out_dev);
 			return 1;
 		}
 		path = path_buf;
@@ -726,7 +728,7 @@
 	in_d.s_addr = iph -> daddr;
 	proto = iph->protocol;
 	if(debug > 0){
-		unsigned char saddr[17];
+		char saddr[17];
 		strncpy(saddr,inet_ntoa(in_s),sizeof(saddr));
 
 		syslog(LOG_DEBUG," -s %s: outgoing IP packet from %s to %s, proto %d:\n",
@@ -800,7 +802,7 @@
 	td = tvdiff(&tv_start);
 	if(debug > 0){
 		struct ip * ipH = (struct ip *) iph;
-		unsigned char saddr[17];
+		char saddr[17];
 		strncpy(saddr,inet_ntoa(ipH->ip_src),sizeof(saddr));
 		
 		syslog(LOG_DEBUG," -o %s: response from %s to %s, proto %d after %.3fs:\n",
--- ip_resend-0.4/ip_resend_wakeup.c.orig	2006-02-14 21:51:03.000000000 +0100
+++ ip_resend-0.4/ip_resend_wakeup.c	2006-02-14 21:52:26.000000000 +0100
@@ -45,7 +45,7 @@
 {
 	int ufd, debug=1, c, err=0;
 	struct sockaddr_un  ua;
-	unsigned char *out_dev=NULL, *path=NULL, *msg=NULL, path_buf[PATH_MAX];
+	char *out_dev=NULL, *path=NULL, *msg=NULL, path_buf[PATH_MAX];
 
 	while( (c=getopt(argc,argv,"Do:c:m:")) != EOF ){
 		switch(c){
@@ -77,7 +77,7 @@
 		n=snprintf(path_buf,sizeof(path_buf),
 			   SOCK_DIR_PREFIX "/%s", out_dev);
 		if((n<0) || n>=(sizeof(path_buf)-1)){
-			syslog(LOG_ERR, "ip_resend -o %s: option too long!\n");
+			syslog(LOG_ERR, "ip_resend -o %s: option too long!\n", out_dev);
 			return 1;
 		}
 		path = path_buf;
openSUSE Build Service is sponsored by