source: trunk/package/ppp/patches/105-debian_demand.patch @ 15957

Last change on this file since 15957 was 15957, checked in by hauke, 7 years ago

[ppp] Make patches apply agagin.
The deleted parts were two times in the patches.

File size: 5.5 KB
  • pppd/demand.c

    diff -Naur ppp-2.4.4.orig/pppd/demand.c ppp-2.4.4/pppd/demand.c
    old new  
    3636#include <errno.h> 
    3737#include <fcntl.h> 
    3838#include <netdb.h> 
     39#include <unistd.h> 
     40#include <syslog.h> 
    3941#include <sys/param.h> 
    4042#include <sys/types.h> 
    4143#include <sys/wait.h> 
     
    4345#include <sys/resource.h> 
    4446#include <sys/stat.h> 
    4547#include <sys/socket.h> 
     48#include <netinet/in.h> 
     49#include <arpa/inet.h> 
    4650#ifdef PPP_FILTER 
    4751#include <pcap-bpf.h> 
    4852#endif 
     
    221225    int c, rv; 
    222226 
    223227    rv = 0; 
     228 
     229/* check for synchronous connection... */ 
     230 
     231    if ( (p[0] == 0xFF) && (p[1] == 0x03) ) { 
     232        rv = loop_frame(p,n); 
     233        return rv; 
     234    } 
     235 
    224236    for (; n > 0; --n) { 
    225237        c = *p++; 
    226238        if (c == PPP_FLAG) { 
     
    299311 * loopback, now that the real serial link is up. 
    300312 */ 
    301313void 
    302 demand_rexmit(proto) 
     314demand_rexmit(proto, newip) 
    303315    int proto; 
     316    u_int32_t newip; 
    304317{ 
    305318    struct packet *pkt, *prev, *nextpkt; 
     319    unsigned short checksum; 
     320    unsigned short pkt_checksum = 0; 
     321    unsigned iphdr; 
     322    struct timeval tv; 
     323    char cv = 0; 
     324    char ipstr[16]; 
    306325 
    307326    prev = NULL; 
    308327    pkt = pend_q; 
    309328    pend_q = NULL; 
     329    tv.tv_sec = 1; 
     330    tv.tv_usec = 0; 
     331    select(0,NULL,NULL,NULL,&tv);       /* Sleep for 1 Seconds */ 
    310332    for (; pkt != NULL; pkt = nextpkt) { 
    311333        nextpkt = pkt->next; 
    312334        if (PPP_PROTOCOL(pkt->data) == proto) { 
     335            if ( (proto == PPP_IP) && newip ) { 
     336                /* Get old checksum */ 
     337 
     338                iphdr = (pkt->data[4] & 15) << 2; 
     339                checksum = *((unsigned short *) (pkt->data+14)); 
     340                if (checksum == 0xFFFF) { 
     341                    checksum = 0; 
     342                } 
     343 
     344  
     345                if (pkt->data[13] == 17) { 
     346                    pkt_checksum =  *((unsigned short *) (pkt->data+10+iphdr)); 
     347                    if (pkt_checksum) { 
     348                        cv = 1; 
     349                        if (pkt_checksum == 0xFFFF) { 
     350                            pkt_checksum = 0; 
     351                        } 
     352                    } 
     353                    else { 
     354                       cv = 0; 
     355                    } 
     356                } 
     357 
     358                if (pkt->data[13] == 6) { 
     359                    pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr)); 
     360                    cv = 1; 
     361                    if (pkt_checksum == 0xFFFF) { 
     362                        pkt_checksum = 0; 
     363                    } 
     364                } 
     365 
     366                /* Delete old Source-IP-Address */ 
     367                checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; 
     368                checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; 
     369 
     370                pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; 
     371                pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; 
     372 
     373                /* Change Source-IP-Address */ 
     374                * ((u_int32_t *) (pkt->data + 16)) = newip; 
     375 
     376                /* Add new Source-IP-Address */ 
     377                checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; 
     378                checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; 
     379 
     380                pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; 
     381                pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; 
     382 
     383                /* Write new checksum */ 
     384                if (!checksum) { 
     385                    checksum = 0xFFFF; 
     386                } 
     387                *((unsigned short *) (pkt->data+14)) = checksum; 
     388                if (pkt->data[13] == 6) { 
     389                    *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum; 
     390                } 
     391                if (cv && (pkt->data[13] == 17) ) { 
     392                    *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum; 
     393                } 
     394 
     395                /* Log Packet */ 
     396                strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16)))); 
     397                if (pkt->data[13] == 1) { 
     398                    syslog(LOG_INFO,"Open ICMP %s -> %s\n", 
     399                        ipstr, 
     400                        inet_ntoa(*( (struct in_addr *) (pkt->data+20)))); 
     401                } else { 
     402                    syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n", 
     403                        pkt->data[13] == 6 ? "TCP" : "UDP", 
     404                        ipstr, 
     405                        ntohs(*( (short *) (pkt->data+iphdr+4))), 
     406                        inet_ntoa(*( (struct in_addr *) (pkt->data+20))), 
     407                        ntohs(*( (short *) (pkt->data+iphdr+6)))); 
     408                } 
     409            } 
    313410            output(0, pkt->data, pkt->length); 
    314411            free(pkt); 
    315412        } else { 
  • pppd/ipcp.c

    diff -Naur ppp-2.4.4.orig/pppd/ipcp.c ppp-2.4.4/pppd/ipcp.c
    old new  
    17761776                    proxy_arp_set[f->unit] = 1; 
    17771777 
    17781778        } 
    1779         demand_rexmit(PPP_IP); 
     1779        demand_rexmit(PPP_IP,go->ouraddr); 
    17801780        sifnpmode(f->unit, PPP_IP, NPMODE_PASS); 
    17811781 
    17821782    } else { 
  • pppd/ipv6cp.c

    diff -Naur ppp-2.4.4.orig/pppd/ipv6cp.c ppp-2.4.4/pppd/ipv6cp.c
    old new  
    12321232            } 
    12331233 
    12341234        } 
    1235         demand_rexmit(PPP_IPV6); 
     1235        demand_rexmit(PPP_IPV6,0); 
    12361236        sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS); 
    12371237 
    12381238    } else { 
  • pppd/pppd.h

    diff -Naur ppp-2.4.4.orig/pppd/pppd.h ppp-2.4.4/pppd/pppd.h
    old new  
    565565void demand_block __P((void));  /* set all NPs to queue up packets */ 
    566566void demand_unblock __P((void)); /* set all NPs to pass packets */ 
    567567void demand_discard __P((void)); /* set all NPs to discard packets */ 
    568 void demand_rexmit __P((int));  /* retransmit saved frames for an NP */ 
     568void demand_rexmit __P((int, u_int32_t)); /* retransmit saved frames for an NP*/ 
    569569int  loop_chars __P((unsigned char *, int)); /* process chars from loopback */ 
    570570int  loop_frame __P((unsigned char *, int)); /* should we bring link up? */ 
    571571 
Note: See TracBrowser for help on using the repository browser.