Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:11.4
ip_resend
ip_resend-0.4.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor