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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* IP-related user commands
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "internet.h"
  8. #include "timer.h"
  9. #include "netuser.h"
  10. #include "iface.h"
  11. #include "ip.h"
  12. #include "cmdparse.h"
  13. #include "commands.h"
  14. #include "rip.h"
  15. int32 Ip_addr;
  16. static int doadd(int argc,char *argv[],void *p);
  17. static int dodrop(int argc,char *argv[],void *p);
  18. static int doflush(int argc,char *argv[],void *p);
  19. static int doipaddr(int argc,char *argv[],void *p);
  20. static int doipstat(int argc,char *argv[],void *p);
  21. static int dolook(int argc,char *argv[],void *p);
  22. static int dortimer(int argc,char *argv[],void *p);
  23. static int dottl(int argc,char *argv[],void *p);
  24. static int doiptrace(int argc,char *argv[],void *p);
  25. static int dumproute(struct route *rp);
  26. static struct cmds Ipcmds[] = {
  27. "address", doipaddr, 0, 0, NULL,
  28. "rtimer", dortimer, 0, 0, NULL,
  29. "status", doipstat, 0, 0, NULL,
  30. "trace", doiptrace, 0, 0, NULL,
  31. "ttl", dottl, 0, 0, NULL,
  32. NULL,
  33. };
  34. /* "route" subcommands */
  35. static struct cmds Rtcmds[] = {
  36. "add", doadd, 0, 3,
  37. "route add <dest addr>[/<bits>] <if name> [gateway] [metric]",
  38. "addprivate", doadd, 0, 3,
  39. "route addprivate <dest addr>[/<bits>] <if name> [gateway] [metric]",
  40. "drop", dodrop, 0, 2,
  41. "route drop <dest addr>[/<bits>]",
  42. "flush", doflush, 0, 0,
  43. NULL,
  44. "lookup", dolook, 0, 2,
  45. "route lookup <dest addr>",
  46. NULL,
  47. };
  48. int
  49. doip(argc,argv,p)
  50. int argc;
  51. char *argv[];
  52. void *p;
  53. {
  54. return subcmd(Ipcmds,argc,argv,p);
  55. }
  56. static int
  57. doiptrace(argc,argv,p)
  58. int argc;
  59. char *argv[];
  60. void *p;
  61. {
  62. return setbool(&Ip_trace,"IP rx tracing",argc,argv);
  63. }
  64. static int
  65. doipaddr(argc,argv,p)
  66. int argc;
  67. char *argv[];
  68. void *p;
  69. {
  70. int32 n;
  71. if(argc < 2) {
  72. printf("%sn",inet_ntoa(Ip_addr));
  73. } else if((n = resolve(argv[1])) == 0){
  74. printf(Badhost,argv[1]);
  75. return 1;
  76. } else
  77. Ip_addr = n;
  78. return 0;
  79. }
  80. static int
  81. dortimer(argc,argv,p)
  82. int argc;
  83. char *argv[];
  84. void *p;
  85. {
  86. return setlong(&ipReasmTimeout,"IP reasm timeout (sec)",argc,argv);
  87. }
  88. static int
  89. dottl(argc,argv,p)
  90. int argc;
  91. char *argv[];
  92. void *p;
  93. {
  94. return setlong(&ipDefaultTTL,"IP Time-to-live",argc,argv);
  95. }
  96. /* Display and/or manipulate routing table */
  97. int
  98. doroute(argc,argv,p)
  99. int argc;
  100. char *argv[];
  101. void *p;
  102. {
  103. register int i,bits;
  104. register struct route *rp;
  105. if(argc >= 2)
  106. return subcmd(Rtcmds,argc,argv,p);
  107. /* Dump IP routing table
  108.  * Dest            Len Interface    Gateway          Use
  109.  * 192.001.002.003 32  sl0          192.002.003.004  0
  110.  */
  111. printf(
  112. "Dest            Len Interface    Gateway          Metric  P Timer  Usen");
  113. for(bits=31;bits>=0;bits--){
  114. for(i=0;i<HASHMOD;i++){
  115. for(rp = Routes[bits][i];rp != NULL;rp = rp->next){
  116. if(dumproute(rp) == EOF)
  117. return 0;
  118. }
  119. }
  120. }
  121. if(R_default.iface != NULL)
  122. dumproute(&R_default);
  123. return 0;
  124. }
  125. /* Add an entry to the routing table
  126.  * E.g., "add 1.2.3.4 ax0 5.6.7.8 3"
  127.  */
  128. static int
  129. doadd(argc,argv,p)
  130. int argc;
  131. char *argv[];
  132. void *p;
  133. {
  134. struct iface *ifp;
  135. int32 dest,gateway;
  136. unsigned bits;
  137. char *bitp;
  138. int32 metric;
  139. char private;
  140. if(strncmp(argv[0],"addp",4) == 0)
  141. private = 1;
  142. else
  143. private = 0;
  144. if(strcmp(argv[1],"default") == 0){
  145. dest = 0;
  146. bits = 0;
  147. } else {
  148. /* If IP address is followed by an optional slash and
  149.  * a length field, (e.g., 128.96/16) get it;
  150.  * otherwise assume a full 32-bit address
  151.  */
  152. if((bitp = strchr(argv[1],'/')) != NULL){
  153. /* Terminate address token for resolve() call */
  154. *bitp++ = '';
  155. bits = atoi(bitp);
  156. } else
  157. bits = 32;
  158. if((dest = resolve(argv[1])) == 0){
  159. printf(Badhost,argv[1]);
  160. return 1;
  161. }
  162. }
  163. if((ifp = if_lookup(argv[2])) == NULL){
  164. printf("Interface "%s" unknownn",argv[2]);
  165. return 1;
  166. }
  167. if(argc > 3){
  168. if((gateway = resolve(argv[3])) == 0){
  169. printf(Badhost,argv[3]);
  170. return 1;
  171. }
  172. } else {
  173. gateway = 0;
  174. }
  175. if (argc > 4)
  176. metric = atol(argv[4]);
  177. else
  178. metric = 1;
  179. if(rt_add(dest,bits,gateway,ifp,metric,0,private) == NULL)
  180. printf("Can't add routen");
  181. return 0;
  182. }
  183. /* Drop an entry from the routing table
  184.  * E.g., "drop 128.96/16
  185.  */
  186. static int
  187. dodrop(argc,argv,p)
  188. int argc;
  189. char *argv[];
  190. void *p;
  191. {
  192. char *bitp;
  193. unsigned bits;
  194. int32 n;
  195. if(strcmp(argv[1],"default") == 0){
  196. n = 0;
  197. bits = 0;
  198. } else {
  199. /* If IP address is followed by an optional slash and length field,
  200.  * (e.g., 128.96/16) get it; otherwise assume a full 32-bit address
  201.  */
  202. if((bitp = strchr(argv[1],'/')) != NULL){
  203. /* Terminate address token for resolve() call */
  204. *bitp++ = '';
  205. bits = atoi(bitp);
  206. } else
  207. bits = 32;
  208. if((n = resolve(argv[1])) == 0){
  209. printf(Badhost,argv[1]);
  210. return 1;
  211. }
  212. }
  213. return rt_drop(n,bits);
  214. }
  215. /* Force a timeout on all temporary routes */
  216. static int
  217. doflush(argc,argv,p)
  218. int argc;
  219. char *argv[];
  220. void *p;
  221. {
  222. register struct route *rp;
  223. struct route *rptmp;
  224. int i,j;
  225. if(R_default.timer.state == TIMER_RUN){
  226. rt_drop(0,0); /* Drop default route */
  227. }
  228. for(i=0;i<HASHMOD;i++){
  229. for(j=0;j<32;j++){
  230. for(rp = Routes[j][i];rp != NULL;rp = rptmp){
  231. rptmp = rp->next;
  232. if(rp->timer.state == TIMER_RUN){
  233. rt_drop(rp->target,rp->bits);
  234. }
  235. }
  236. }
  237. }
  238. return 0;
  239. }
  240. /* Dump a routing table entry */
  241. static int
  242. dumproute(rp)
  243. register struct route *rp;
  244. {
  245. char *cp;
  246. if(rp->target != 0)
  247. cp = inet_ntoa(rp->target);
  248. else
  249. cp = "default";
  250. printf("%-16s",cp);
  251. printf("%-4u",rp->bits);
  252. printf("%-13s",rp->iface->name);
  253. if(rp->gateway != 0)
  254. cp = inet_ntoa(rp->gateway);
  255. else
  256. cp = "";
  257. printf("%-17s",cp);
  258. printf("%-8lu",rp->metric);
  259. printf("%c ",rp->flags.rtprivate ? 'P' : ' ');
  260. printf("%-7lu",
  261.  read_timer(&rp->timer) / 1000L);
  262. return printf("%lun",rp->uses);
  263. }
  264. static int
  265. dolook(argc,argv,p)
  266. int argc;
  267. char *argv[];
  268. void *p;
  269. {
  270. struct route *rp;
  271. int32 addr;
  272. addr = resolve(argv[1]);
  273. if(addr == 0){
  274. printf("Host %s unknownn",argv[1]);
  275. return 1;
  276. }
  277. if((rp = rt_lookup(addr)) == NULL){
  278. printf("Host %s (%s) unreachablen",argv[1],inet_ntoa(addr));
  279. return 1;
  280. }
  281. dumproute(rp);
  282. return 0;
  283. }
  284. static int
  285. doipstat(argc,argv,p)
  286. int argc;
  287. char *argv[];
  288. void *p;
  289. {
  290. register struct reasm *rp;
  291. register struct frag *fp;
  292. int i;
  293. for(i=1;i<=NUMIPMIB;i++){
  294. printf("(%2u)%-20s%10lu",i,
  295.  Ip_mib[i].name,Ip_mib[i].value.integer);
  296. if(i % 2)
  297. printf("     ");
  298. else
  299. printf("n");
  300. }
  301. if((i % 2) == 0)
  302. printf("n");
  303. printf("Routing lookups: %lu, cache hits %lu (%lu%%)n",
  304.  Rtlookups,Rtchits,
  305.  Rtlookups != 0 ? (Rtchits*100 + Rtlookups/2)/Rtlookups: 0);
  306. if(Reasmq != NULL)
  307. printf("Reassembly fragments:n");
  308. for(rp = Reasmq;rp != NULL;rp = rp->next){
  309. printf("src %s",inet_ntoa(rp->source));
  310. printf(" dest %s",inet_ntoa(rp->dest));
  311. printf(" id %u pctl %u time %lu len %un",
  312.  rp->id,rp->protocol,read_timer(&rp->timer),
  313.  rp->length);
  314. for(fp = rp->fraglist;fp != NULL;fp = fp->next){
  315. printf(" offset %u last %un",fp->offset,
  316. fp->last);
  317. }
  318. }
  319. return 0;
  320. }