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;