06_all_killaddr-smarter.patch 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. diff -Nur ppp-2.4.5.orig/pppd/options.c ppp-2.4.5/pppd/options.c
  2. --- ppp-2.4.5.orig/pppd/options.c 2009-11-16 23:26:07.000000000 +0100
  3. +++ ppp-2.4.5/pppd/options.c 2010-08-08 09:43:47.000000000 +0200
  4. @@ -100,6 +100,9 @@
  5. char user[MAXNAMELEN]; /* Username for PAP */
  6. char passwd[MAXSECRETLEN]; /* Password for PAP */
  7. bool persist = 0; /* Reopen link after it goes down */
  8. +bool killoldaddr = 0; /* If our IP is reassigned on
  9. + reconnect, kill active TCP
  10. + connections using the old IP. */
  11. char our_name[MAXNAMELEN]; /* Our name for authentication purposes */
  12. bool demand = 0; /* do dial-on-demand */
  13. char *ipparam = NULL; /* Extra parameter for ip up/down scripts */
  14. @@ -231,6 +234,11 @@
  15. { "demand", o_bool, &demand,
  16. "Dial on demand", OPT_INITONLY | 1, &persist },
  17. + { "killoldaddr", o_bool, &killoldaddr,
  18. + "Kill connections from an old source address", 1},
  19. + { "nokilloldaddr", o_bool,&killoldaddr,
  20. + "Don't kill connections from an old source address" },
  21. +
  22. { "--version", o_special_noarg, (void *)showversion,
  23. "Show version number" },
  24. { "--help", o_special_noarg, (void *)showhelp,
  25. diff -Nur ppp-2.4.5.orig/pppd/pppd.h ppp-2.4.5/pppd/pppd.h
  26. --- ppp-2.4.5.orig/pppd/pppd.h 2009-11-16 23:26:07.000000000 +0100
  27. +++ ppp-2.4.5/pppd/pppd.h 2010-08-08 09:43:47.000000000 +0200
  28. @@ -298,6 +298,9 @@
  29. extern char remote_name[MAXNAMELEN]; /* Peer's name for authentication */
  30. extern bool explicit_remote;/* remote_name specified with remotename opt */
  31. extern bool demand; /* Do dial-on-demand */
  32. +extern bool killoldaddr; /* If our IP is reassigned on
  33. + reconnect, kill active TCP
  34. + connections using the old IP. */
  35. extern char *ipparam; /* Extra parameter for ip up/down scripts */
  36. extern bool cryptpap; /* Others' PAP passwords are encrypted */
  37. extern int idle_time_limit;/* Shut down link if idle for this long */
  38. diff -Nur ppp-2.4.5.orig/pppd/sys-linux.c ppp-2.4.5/pppd/sys-linux.c
  39. --- ppp-2.4.5.orig/pppd/sys-linux.c 2009-11-16 23:26:07.000000000 +0100
  40. +++ ppp-2.4.5/pppd/sys-linux.c 2010-08-08 09:43:47.000000000 +0200
  41. @@ -165,6 +165,10 @@
  42. #endif /* INET6 */
  43. +#ifndef SIOCKILLADDR
  44. +#define SIOCKILLADDR 0x8939
  45. +#endif
  46. +
  47. /* We can get an EIO error on an ioctl if the modem has hung up */
  48. #define ok_error(num) ((num)==EIO)
  49. @@ -209,6 +213,7 @@
  50. static u_int32_t proxy_arp_addr; /* Addr for proxy arp entry added */
  51. static char proxy_arp_dev[16]; /* Device for proxy arp entry */
  52. static u_int32_t our_old_addr; /* for detecting address changes */
  53. +static u_int32_t our_current_addr;
  54. static int dynaddr_set; /* 1 if ip_dynaddr set */
  55. static int looped; /* 1 if using loop */
  56. static int link_mtu; /* mtu for the link (not bundle) */
  57. @@ -537,6 +542,27 @@
  58. return -1;
  59. }
  60. +static void do_killaddr(u_int32_t oldaddr)
  61. +{
  62. + struct ifreq ifr;
  63. +
  64. + memset(&ifr,0,sizeof ifr);
  65. +
  66. + SET_SA_FAMILY (ifr.ifr_addr, AF_INET);
  67. + SET_SA_FAMILY (ifr.ifr_dstaddr, AF_INET);
  68. + SET_SA_FAMILY (ifr.ifr_netmask, AF_INET);
  69. +
  70. + SIN_ADDR(ifr.ifr_addr) = oldaddr;
  71. +
  72. + strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
  73. +
  74. + if(ioctl(sock_fd,SIOCKILLADDR,&ifr) < 0) {
  75. + if (!ok_error (errno))
  76. + error("ioctl(SIOCKILLADDR): %m(%d)", errno);
  77. + return;
  78. + }
  79. +}
  80. +
  81. /********************************************************************
  82. *
  83. * tty_disestablish_ppp - Restore the serial port to normal operation.
  84. @@ -2385,21 +2411,29 @@
  85. }
  86. }
  87. - /* set ip_dynaddr in demand mode if address changes */
  88. - if (demand && tune_kernel && !dynaddr_set
  89. - && our_old_addr && our_old_addr != our_adr) {
  90. + if(persist && our_old_addr && our_old_addr != our_adr) {
  91. +
  92. + if(killoldaddr)
  93. + do_killaddr(our_old_addr);
  94. +
  95. +
  96. + /* set ip_dynaddr in persist mode if address changes */
  97. + if (tune_kernel && !dynaddr_set) {
  98. /* set ip_dynaddr if possible */
  99. char *path;
  100. int fd;
  101. path = path_to_procfs("/sys/net/ipv4/ip_dynaddr");
  102. if (path != 0 && (fd = open(path, O_WRONLY)) >= 0) {
  103. - if (write(fd, "1", 1) != 1)
  104. - error("Couldn't enable dynamic IP addressing: %m");
  105. - close(fd);
  106. + if (write(fd, "1", 1) != 1)
  107. + error("Couldn't enable dynamic IP addressing: %m");
  108. + close(fd);
  109. }
  110. dynaddr_set = 1; /* only 1 attempt */
  111. + }
  112. }
  113. +
  114. + our_current_addr = our_adr;
  115. our_old_addr = 0;
  116. return 1;
  117. @@ -2455,7 +2489,8 @@
  118. }
  119. our_old_addr = our_adr;
  120. -
  121. + our_current_addr = 0;
  122. +
  123. return 1;
  124. }