pppcmd.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:11k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /*
  2.  *  PPPCMD.C -- PPP related user commands
  3.  *
  4.  * This implementation of PPP is declared to be in the public domain.
  5.  *
  6.  * Jan 91 Bill_Simpson@um.cc.umich.edu
  7.  * Computer Systems Consulting Services
  8.  *
  9.  * Acknowledgements and correction history may be found in PPP.C
  10.  */
  11. #include <stdio.h>
  12. #include "global.h"
  13. #include "mbuf.h"
  14. #include "iface.h"
  15. #include "pktdrvr.h"
  16. #include "ppp.h"
  17. #include "pppfsm.h"
  18. #include "ppplcp.h"
  19. #include "ppppap.h"
  20. #include "pppipcp.h"
  21. #include "cmdparse.h"
  22. static struct iface *ppp_lookup(char *ifname);
  23. static int doppp_quick(int argc, char *argv[], void *p);
  24. static int doppp_trace(int argc, char *argv[], void *p);
  25. static int spot(uint16 work,uint16 want,uint16 will,uint16 mask);
  26. static void genstat(struct ppp_s *ppp_p);
  27. static void lcpstat(struct fsm_s *fsm_p);
  28. static void papstat(struct fsm_s *fsm_p);
  29. static void ipcpstat(struct fsm_s *fsm_p);
  30. static int dotry_nak(int argc, char *argv[], void *p);
  31. static int dotry_req(int argc, char *argv[], void *p);
  32. static int dotry_terminate(int argc, char *argv[], void *p);
  33. /* "ppp" subcommands */
  34. static struct cmds Pppcmds[] = {
  35. "ipcp", doppp_ipcp, 0, 0, NULL,
  36. "lcp", doppp_lcp, 0, 0, NULL,
  37. "pap", doppp_pap, 0, 0, NULL,
  38. "quick", doppp_quick, 0, 0, NULL,
  39. "trace", doppp_trace, 0, 0, NULL,
  40. NULL,
  41. };
  42. /* "ppp <iface> <ncp> try" subcommands */
  43. static struct cmds PppTrycmds[] = {
  44. "configure", dotry_req, 0, 0, NULL,
  45. "failure", dotry_nak, 0, 0, NULL,
  46. "terminate", dotry_terminate, 0, 0, NULL,
  47. NULL,
  48. };
  49. static char *PPPStatus[] = {
  50. "Physical Line Dead",
  51. "Establishment Phase",
  52. "Authentication Phase",
  53. "Network Protocol Phase",
  54. "Termination Phase"
  55. };
  56. static char *NCPStatus[] = {
  57. "Closed",
  58. "Listening -- waiting for remote host to attempt open",
  59. "Starting configuration exchange",
  60. "Remote host accepted our request; waiting for remote request",
  61. "We accepted remote request; waiting for reply to our request",
  62. "Opened",
  63. "Terminate request sent to remote host"
  64. };
  65. int PPPtrace;
  66. struct iface *PPPiface;  /* iface for trace */
  67. /****************************************************************************/
  68. static struct iface *
  69. ppp_lookup(ifname)
  70. char *ifname;
  71. {
  72. register struct iface *ifp;
  73. if ((ifp = if_lookup(ifname)) == NULL) {
  74. printf("%s: Interface unknownn",ifname);
  75. return(NULL);
  76. }
  77. if (ifp->iftype->type != CL_PPP) {
  78. printf("%s: not a PPP interfacen",ifp->name);
  79. return(NULL);
  80. }
  81. return(ifp);
  82. }
  83. /****************************************************************************/
  84. int
  85. doppp_commands(argc,argv,p)
  86. int argc;
  87. char *argv[];
  88. void *p;
  89. {
  90. register struct iface *ifp;
  91. if (argc < 2) {
  92. printf( "ppp <iface> requiredn" );
  93. return -1;
  94. }
  95. if ((ifp = ppp_lookup(argv[1])) == NULL)
  96. return -1;
  97. if ( argc == 2 ) {
  98. ppp_show( ifp );
  99. return 0;
  100. }
  101. return subcmd(Pppcmds, argc - 1, &argv[1], ifp);
  102. }
  103. /* Close connection on PPP interface */
  104. int
  105. doppp_close(argc,argv,p)
  106. int argc;
  107. char *argv[];
  108. void *p;
  109. {
  110. register struct fsm_s *fsm_p = p;
  111. fsm_p->flags &= ~(FSM_ACTIVE | FSM_PASSIVE);
  112. fsm_close( fsm_p );
  113. return 0;
  114. }
  115. int
  116. doppp_passive(argc,argv,p)
  117. int argc;
  118. char *argv[];
  119. void *p;
  120. {
  121. register struct fsm_s *fsm_p = p;
  122. fsm_p->flags &= ~FSM_ACTIVE;
  123. fsm_p->flags |= FSM_PASSIVE;
  124. fsm_start(fsm_p);
  125. return 0;
  126. }
  127. int
  128. doppp_active(argc,argv,p)
  129. int argc;
  130. char *argv[];
  131. void *p;
  132. {
  133. register struct fsm_s *fsm_p = p;
  134. fsm_p->flags &= ~FSM_PASSIVE;
  135. fsm_p->flags |= FSM_ACTIVE;
  136. if ( fsm_p->state < fsmLISTEN ) {
  137. fsm_p->state = fsmLISTEN;
  138. }
  139. return 0;
  140. }
  141. static int
  142. doppp_quick(argc,argv,p)
  143. int argc;
  144. char *argv[];
  145. void *p;
  146. {
  147. register struct iface *ifp = p;
  148. register struct ppp_s *ppp_p = ifp->edv;
  149. struct lcp_s *lcp_p = ppp_p->fsm[Lcp].pdv;
  150. struct ipcp_s *ipcp_p = ppp_p->fsm[IPcp].pdv;
  151. lcp_p->local.want.accm = 0L;
  152. lcp_p->local.want.negotiate |= LCP_N_ACCM;
  153. lcp_p->local.want.magic_number += (long)&lcp_p->local.want.magic_number;
  154. lcp_p->local.want.negotiate |= LCP_N_MAGIC;
  155. lcp_p->local.want.negotiate |= LCP_N_ACFC;
  156. lcp_p->local.want.negotiate |= LCP_N_PFC;
  157. ipcp_p->local.want.compression = PPP_COMPR_PROTOCOL;
  158. ipcp_p->local.want.slots = 16;
  159. ipcp_p->local.want.slot_compress = 1;
  160. ipcp_p->local.want.negotiate |= IPCP_N_COMPRESS;
  161. doppp_active( 0, NULL, &(ppp_p->fsm[IPcp]) );
  162. return 0;
  163. }
  164. /****************************************************************************/
  165. void
  166. ppp_show(ifp)
  167. struct iface *ifp;
  168. {
  169. register struct ppp_s *ppp_p = ifp->edv;
  170. genstat(ppp_p);
  171. if ( ppp_p->fsm[Lcp].pdv != NULL )
  172. lcpstat(&(ppp_p->fsm[Lcp]));
  173. if ( ppp_p->fsm[Pap].pdv != NULL )
  174. papstat(&(ppp_p->fsm[Pap]));
  175. if ( ppp_p->fsm[IPcp].pdv != NULL )
  176. ipcpstat(&(ppp_p->fsm[IPcp]));
  177. }
  178. static void
  179. genstat(ppp_p)
  180. register struct ppp_s *ppp_p;
  181. {
  182. printf("%s", PPPStatus[ppp_p->phase]);
  183. if (ppp_p->phase == pppREADY) {
  184. printf("t(open for %s)",
  185. tformat(secclock() - ppp_p->upsince));
  186. }
  187. printf("n");
  188. printf("%10lu In,  %10lu Flags,%6u ME, %6u FE, %6u CSE, %6u othern",
  189. ppp_p->InRxOctetCount,
  190. ppp_p->InOpenFlag,
  191. ppp_p->InMemory,
  192. ppp_p->InFrame,
  193. ppp_p->InChecksum,
  194. ppp_p->InError);
  195. printf("tt%6u Lcp,%6u Pap,%6u IPcp,%6u Unknownn",
  196. ppp_p->InNCP[Lcp],
  197. ppp_p->InNCP[Pap],
  198. ppp_p->InNCP[IPcp],
  199. ppp_p->InUnknown);
  200. printf("%10lu Out, %10lu Flags,%6u ME, %6u Failn",
  201. ppp_p->OutTxOctetCount,
  202. ppp_p->OutOpenFlag,
  203. ppp_p->OutMemory,
  204. ppp_p->OutError);
  205. printf("tt%6u Lcp,%6u Pap,%6u IPcpn",
  206. ppp_p->OutNCP[Lcp],
  207. ppp_p->OutNCP[Pap],
  208. ppp_p->OutNCP[IPcp]);
  209. }
  210. static int
  211. spot(work,want,will,mask)
  212. uint16 work;
  213. uint16 want;
  214. uint16 will;
  215. uint16 mask;
  216. {
  217. char blot = ' ';
  218. int result = (work & mask);
  219. if ( !(will & mask) ) {
  220. blot = '*';
  221. } else if ( (want ^ work) & mask ) {
  222. blot = (result ? '+' : '-');
  223. }
  224. printf( "%c", blot );
  225. return result;
  226. }
  227. static void
  228. lcpstat(fsm_p)
  229. struct fsm_s *fsm_p;
  230. {
  231. struct lcp_s *lcp_p = fsm_p->pdv;
  232. struct lcp_value_s *localp = &(lcp_p->local.work);
  233. uint16  localwork = lcp_p->local.work.negotiate;
  234. uint16  localwant = lcp_p->local.want.negotiate;
  235. uint16  localwill = lcp_p->local.will_negotiate;
  236. struct lcp_value_s *remotep = &(lcp_p->remote.work);
  237. uint16  remotework = lcp_p->remote.work.negotiate;
  238. uint16  remotewant = lcp_p->remote.want.negotiate;
  239. uint16  remotewill = lcp_p->remote.will_negotiate;
  240. printf("LCP %sn",
  241. NCPStatus[fsm_p->state]);
  242. printf("tt MRUt ACCMtt APt PFC  ACFC Magicn");
  243. printf("tLocal:t");
  244. spot( localwork, localwant, localwill, LCP_N_MRU );
  245. printf( "%4dt", localp->mru );
  246. spot( localwork, localwant, localwill, LCP_N_ACCM );
  247. printf( "0x%08lxt", localp->accm );
  248. if ( spot( localwork, localwant, localwill, LCP_N_AUTHENT ) ) {
  249. switch ( localp->authentication ) {
  250. case PPP_PAP_PROTOCOL:
  251. printf( "Papt" );
  252. break;
  253. default:
  254. printf( "0x%04xt", localp->authentication);
  255. break;
  256. };
  257. } else {
  258. printf( "Nonet" );
  259. }
  260. printf( spot( localwork, localwant, localwill, LCP_N_PFC )
  261.  ? "Yes " : "No  " );
  262. printf( spot( localwork, localwant, localwill, LCP_N_ACFC )
  263.  ? "Yes " : "No  " );
  264. spot( localwork, localwant, localwill, LCP_N_MAGIC );
  265. if ( localp->magic_number != 0L ) {
  266. printf( "0x%08lxn", localp->magic_number );
  267. } else {
  268. printf( "unusedn" );
  269. }
  270. printf("tRemote:t");
  271. spot( remotework, remotewant, remotewill, LCP_N_MRU );
  272. printf( "%4dt", remotep->mru );
  273. spot( remotework, remotewant, remotewill, LCP_N_ACCM );
  274. printf( "0x%08lxt", remotep->accm );
  275. if ( spot( remotework, remotewant, remotewill, LCP_N_AUTHENT ) ) {
  276. switch ( remotep->authentication ) {
  277. case PPP_PAP_PROTOCOL:
  278. printf( "Papt" );
  279. break;
  280. default:
  281. printf( "0x%04xt", remotep->authentication);
  282. break;
  283. };
  284. } else {
  285. printf( "Nonet" );
  286. }
  287. printf( spot( remotework, remotewant, remotewill, LCP_N_PFC )
  288.  ? "Yes " : "No  " );
  289. printf( spot( remotework, remotewant, remotewill, LCP_N_ACFC )
  290.  ? "Yes " : "No  " );
  291. spot( remotework, remotewant, remotewill, LCP_N_MAGIC );
  292. if ( remotep->magic_number != 0L ) {
  293. printf( "0x%08lxn", remotep->magic_number );
  294. } else {
  295. printf( "unusedn" );
  296. }
  297. }
  298. static void
  299. papstat(fsm_p)
  300. struct fsm_s *fsm_p;
  301. {
  302. struct pap_s *pap_p = fsm_p->pdv;
  303. printf("PAP %sn",
  304. NCPStatus[fsm_p->state]);
  305. printf( "tMessage: '%s'n", (pap_p->message == NULL) ?
  306. "none" : pap_p->message );
  307. }
  308. static void
  309. ipcpstat(fsm_p)
  310. struct fsm_s *fsm_p;
  311. {
  312. struct ipcp_s *ipcp_p = fsm_p->pdv;
  313. struct ipcp_value_s *localp = &(ipcp_p->local.work);
  314. uint16  localwork = ipcp_p->local.work.negotiate;
  315. struct ipcp_value_s *remotep = &(ipcp_p->remote.work);
  316. uint16  remotework = ipcp_p->remote.work.negotiate;
  317. printf("IPCP %sn",
  318. NCPStatus[fsm_p->state]);
  319. printf("tlocal IP address: %s",
  320. inet_ntoa(localp->address));
  321. printf("  remote IP address: %sn",
  322. inet_ntoa(localp->other));
  323. if (localwork & IPCP_N_COMPRESS) {
  324. printf("    IntTCP header compression enabled:"
  325. " slots = %d, flag = 0x%02xn",
  326. localp->slots,
  327. localp->slot_compress);
  328. slhc_i_status(ipcp_p->slhcp);
  329. }
  330. if (remotework & IPCP_N_COMPRESS) {
  331. printf("    OuttTCP header compression enabled:"
  332. " slots = %d, flag = 0x%02xn",
  333. remotep->slots,
  334. remotep->slot_compress);
  335. slhc_o_status(ipcp_p->slhcp);
  336. }
  337. }
  338. /****************************************************************************/
  339. /* Set timeout interval when waiting for response from remote peer */
  340. int
  341. doppp_timeout(argc,argv,p)
  342. int argc;
  343. char *argv[];
  344. void *p;
  345. {
  346. struct fsm_s *fsm_p = p;
  347. struct timer *t = &(fsm_p->timer);
  348. if (argc < 2) {
  349. printf("%dn",dur_timer(t)/1000L);
  350. } else {
  351. int x = (int)strtol( argv[1], NULL, 0 );
  352. if (x <= 0) {
  353. printf("Timeout value %s (%d) must be > 0n",
  354. argv[1], x);
  355. return -1;
  356. } else {
  357. set_timer(t, x * 1000L);
  358. }
  359. }
  360. return 0;
  361. }
  362. int
  363. doppp_try(argc,argv,p)
  364. int argc;
  365. char *argv[];
  366. void *p;
  367. {
  368. return subcmd(PppTrycmds, argc, argv, p);
  369. }
  370. static int
  371. dotry_nak(argc,argv,p)
  372. int argc;
  373. char *argv[];
  374. void *p;
  375. {
  376. struct fsm_s *fsm_p = p;
  377. if (argc < 2) {
  378. printf("%dn",fsm_p->try_nak);
  379. } else {
  380. int x = (int)strtol( argv[1], NULL, 0 );
  381. if (x <= 0) {
  382. printf("Value %s (%d) must be > 0n",
  383. argv[1], x);
  384. return -1;
  385. } else {
  386. fsm_p->try_nak = x;
  387. }
  388. }
  389. return 0;
  390. }
  391. static int
  392. dotry_req(argc,argv,p)
  393. int argc;
  394. char *argv[];
  395. void *p;
  396. {
  397. struct fsm_s *fsm_p = p;
  398. if (argc < 2) {
  399. printf("%dn",fsm_p->try_req);
  400. } else {
  401. int x = (int)strtol( argv[1], NULL, 0 );
  402. if (x <= 0) {
  403. printf("Value %s (%d) must be > 0n",
  404. argv[1], x);
  405. return -1;
  406. } else {
  407. fsm_p->try_req = x;
  408. }
  409. }
  410. return 0;
  411. }
  412. static int
  413. dotry_terminate(argc,argv,p)
  414. int argc;
  415. char *argv[];
  416. void *p;
  417. {
  418. struct fsm_s *fsm_p = p;
  419. if (argc < 2) {
  420. printf("%dn",fsm_p->try_terminate);
  421. } else {
  422. int x = (int)strtol( argv[1], NULL, 0 );
  423. if (x <= 0) {
  424. printf("Value %s (%d) must be > 0n",
  425. argv[1], x);
  426. return -1;
  427. } else {
  428. fsm_p->try_terminate = x;
  429. }
  430. }
  431. return 0;
  432. }
  433. static int
  434. doppp_trace(argc,argv,p)
  435. int argc;
  436. char *argv[];
  437. void *p;
  438. {
  439. register struct iface *ifp = p;
  440. register struct ppp_s *ppp_p = ifp->edv;
  441. int tracing = ppp_p->trace;
  442. int result = setint(&tracing,"PPP tracing",argc,argv);
  443. ppp_p->trace = tracing;
  444. return result;
  445. }