PageRenderTime 35ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/release/src/router/rc/ppp.c

https://gitlab.com/envieidoc/tomato
C | 245 lines | 136 code | 46 blank | 63 comment | 40 complexity | 42797ab2f5458e4027d43ada6e0fbd40 MD5 | raw file
  1. /*
  2. Copyright 2003, CyberTAN Inc. All Rights Reserved
  3. This is UNPUBLISHED PROPRIETARY SOURCE CODE of CyberTAN Inc.
  4. the contents of this file may not be disclosed to third parties,
  5. copied or duplicated in any form without the prior written
  6. permission of CyberTAN Inc.
  7. This software should be used as a reference only, and it not
  8. intended for production use!
  9. THIS SOFTWARE IS OFFERED "AS IS", AND CYBERTAN GRANTS NO WARRANTIES OF ANY
  10. KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. CYBERTAN
  11. SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
  12. FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE
  13. */
  14. /*
  15. Copyright 2005, Broadcom Corporation
  16. All Rights Reserved.
  17. THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
  18. KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
  19. SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
  20. FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
  21. */
  22. /*
  23. $Id: ppp.c,v 1.27 2005/03/29 02:00:06 honor Exp $
  24. */
  25. #include "rc.h"
  26. #include <sys/ioctl.h>
  27. int ipup_main(int argc, char **argv)
  28. {
  29. char *wan_ifname;
  30. char *value;
  31. char buf[256];
  32. const char *p;
  33. TRACE_PT("begin\n");
  34. killall("listen", SIGKILL);
  35. if (!wait_action_idle(10)) return -1;
  36. wan_ifname = safe_getenv("IFNAME");
  37. if ((!wan_ifname) || (!*wan_ifname)) return -1;
  38. nvram_set("wan_iface", wan_ifname); // ppp#
  39. // ipup receives six arguments:
  40. // <interface name> <tty device> <speed> <local IP address> <remote IP address> <ipparam>
  41. // ppp1 vlan1 0 71.135.98.32 151.164.184.87 0
  42. f_write_string("/tmp/ppp/link", argv[1], 0, 0);
  43. if ((p = getenv("IPREMOTE"))) {
  44. nvram_set("wan_gateway_get", p);
  45. TRACE_PT("IPREMOTE=%s\n", p);
  46. }
  47. if ((value = getenv("IPLOCAL"))) {
  48. _dprintf("IPLOCAL=%s\n", value);
  49. switch (get_wan_proto()) {
  50. case WP_PPPOE:
  51. case WP_PPP3G:
  52. nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr")); // store last ip address
  53. nvram_set("wan_ipaddr", value);
  54. nvram_set("wan_netmask", "255.255.255.255");
  55. break;
  56. case WP_PPTP:
  57. case WP_L2TP:
  58. nvram_set("wan_ipaddr_buf", nvram_safe_get("ppp_get_ip"));
  59. break;
  60. }
  61. if (!nvram_match("ppp_get_ip", value)) {
  62. ifconfig(wan_ifname, IFUP, "0.0.0.0", NULL);
  63. nvram_set("ppp_get_ip", value);
  64. }
  65. _ifconfig(wan_ifname, IFUP, value, "255.255.255.255", (p && (*p)) ? p : NULL);
  66. }
  67. buf[0] = 0;
  68. if ((p = getenv("DNS1")) != NULL) strlcpy(buf, p, sizeof(buf));
  69. if ((p = getenv("DNS2")) != NULL) {
  70. if (buf[0]) strlcat(buf, " ", sizeof(buf));
  71. strlcat(buf, p, sizeof(buf));
  72. }
  73. nvram_set("wan_get_dns", buf);
  74. TRACE_PT("DNS=%s\n", buf);
  75. if ((value = getenv("AC_NAME"))) nvram_set("ppp_get_ac", value);
  76. if ((value = getenv("SRV_NAME"))) nvram_set("ppp_get_srv", value);
  77. if ((value = getenv("MTU"))) nvram_set("wan_run_mtu", value);
  78. start_wan_done(wan_ifname);
  79. TRACE_PT("end\n");
  80. return 0;
  81. }
  82. int ipdown_main(int argc, char **argv)
  83. {
  84. int proto;
  85. TRACE_PT("begin\n");
  86. if (!wait_action_idle(10)) return -1;
  87. stop_ddns(); // avoid to trigger DOD
  88. stop_ntpc();
  89. unlink("/tmp/ppp/link");
  90. proto = get_wan_proto();
  91. if (proto == WP_L2TP || proto == WP_PPTP) {
  92. /* clear dns from the resolv.conf */
  93. nvram_set("wan_get_dns","");
  94. dns_to_resolv();
  95. if (proto == WP_L2TP) {
  96. route_del(nvram_safe_get("wan_ifname"), 0, nvram_safe_get("l2tp_server_ip"),
  97. nvram_safe_get("wan_gateway"), "255.255.255.255"); // fixed routing problem in Israel by kanki
  98. }
  99. // Restore the default gateway for WAN interface
  100. nvram_set("wan_gateway_get", nvram_safe_get("wan_gateway"));
  101. // Set default route to gateway if specified
  102. route_del(nvram_safe_get("wan_ifname"), 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0");
  103. route_add(nvram_safe_get("wan_ifname"), 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0");
  104. }
  105. if (nvram_get_int("ppp_demand")) {
  106. killall("listen", SIGKILL);
  107. eval("listen", nvram_safe_get("lan_ifname"));
  108. }
  109. TRACE_PT("end\n");
  110. return 1;
  111. }
  112. #ifdef TCONFIG_IPV6
  113. int ip6up_main(int argc, char **argv)
  114. {
  115. /*
  116. char *wan_ifname;
  117. char *value;
  118. TRACE_PT("begin\n");
  119. if (!wait_action_idle(10)) return -1;
  120. wan_ifname = safe_getenv("IFNAME");
  121. if ((!wan_ifname) || (!*wan_ifname)) return -1;
  122. value = getenv("LLREMOTE");
  123. // ???
  124. start_wan6_done(wan_ifname);
  125. TRACE_PT("end\n");
  126. */
  127. return 0;
  128. }
  129. int ip6down_main(int argc, char **argv)
  130. {
  131. /*
  132. TRACE_PT("begin\n");
  133. if (!wait_action_idle(10)) return -1;
  134. // ???
  135. TRACE_PT("end\n");
  136. */
  137. return 1;
  138. }
  139. #endif // IPV6
  140. int pppevent_main(int argc, char **argv)
  141. {
  142. int i;
  143. TRACE_PT("begin\n");
  144. for (i = 1; i < argc; ++i) {
  145. TRACE_PT("arg%d=%s\n", i, argv[i]);
  146. if (strcmp(argv[i], "-t") == 0) {
  147. if (++i >= argc) return 1;
  148. if ((strcmp(argv[i], "PAP_AUTH_FAIL") == 0) || (strcmp(argv[i], "CHAP_AUTH_FAIL") == 0)) {
  149. f_write_string("/tmp/ppp/log", argv[i], 0, 0);
  150. notice_set("wan", "Authentication failed"); // !!!
  151. return 0;
  152. }
  153. }
  154. }
  155. TRACE_PT("end\n");
  156. return 1;
  157. }
  158. #if 0
  159. int set_pppoepid_main(int argc, char **argv)
  160. {
  161. if (argc < 2) return 0;
  162. TRACE_PT("num=%s\n", argv[1]);
  163. if (atoi(argv[1]) != 0) return 0;
  164. nvram_set("pppoe_pid0", getenv("PPPD_PID"));
  165. nvram_set("pppoe_ifname0", getenv("IFNAME"));
  166. nvram_set("wan_iface", getenv("IFNAME"));
  167. TRACE_PT("IFNAME=%s DEVICE=%s\n", getenv("IFNAME"), getenv("DEVICE"));
  168. return 0;
  169. }
  170. int pppoe_down_main(int argc, char **argv)
  171. {
  172. if (argc < 2) return 0;
  173. TRACE_PT("num=%s\n", argv[1]);
  174. if (atoi(argv[1]) != 0) return 0;
  175. if ((nvram_get_int("ppp_demand")) && (nvram_match("action_service", ""))) {
  176. stop_singe_pppoe(0);
  177. start_pppoe(0);
  178. stop_dnsmasq();
  179. dns_to_resolv();
  180. start_dnsmasq();
  181. }
  182. return 0;
  183. }
  184. #endif // 0