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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Generic serial line interface routines
  2.  * Copyright 1992 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "proc.h"
  7. #include "iface.h"
  8. #include "netuser.h"
  9. #include "slhc.h"
  10. #include "n8250.h"
  11. #include "asy.h"
  12. #include "ax25.h"
  13. #include "kiss.h"
  14. #include "nrs.h"
  15. #include "pktdrvr.h"
  16. #include "slip.h"
  17. #include "ppp.h"
  18. #include "commands.h"
  19. static int asy_detach(struct iface *ifp);
  20. /* Attach a serial interface to the system
  21.  * argv[0]: hardware type, must be "asy"
  22.  * argv[1]: I/O address, e.g., "0x3f8"
  23.  * argv[2]: vector, e.g., "4", or "fp1" for port 1 on a 4port card
  24.  * argv[3]: mode, may be:
  25.  * "slip" (point-to-point SLIP)
  26.  * "kissui" (AX.25 UI frame format in SLIP for raw TNC)
  27.  * "ax25ui" (same as kissui)
  28.  * "kissi" (AX.25 I frame format in SLIP for raw TNC)
  29.  * "ax25i" (same as kissi)
  30.  * "nrs" (NET/ROM format serial protocol)
  31.  * "ppp" (Point-to-Point Protocol, RFC1171, RFC1172)
  32.  * argv[4]: interface label, e.g., "sl0"
  33.  * argv[5]: receiver ring buffer size in bytes
  34.  * argv[6]: maximum transmission unit, bytes
  35.  * argv[7]: interface speed, e.g, "9600"
  36.  * argv[8]: optional flags,
  37.  * 'v' for Van Jacobson TCP header compression (SLIP only,
  38.  *     use ppp command for VJ compression with PPP);
  39.  * 'c' for cts flow control
  40.  * 'r' for rlsd (cd) detection
  41.  */
  42. int
  43. asy_attach(argc,argv,p)
  44. int argc;
  45. char *argv[];
  46. void *p;
  47. {
  48. register struct iface *ifp;
  49. int dev;
  50. int trigchar = -1;
  51. int cts,rlsd;
  52. struct asymode *ap;
  53. char *cp;
  54. int base;
  55. int irq;
  56. struct asy *asyp;
  57. int i,n;
  58. int chain;
  59. if(if_lookup(argv[4]) != NULL){
  60. printf("Interface %s already existsn",argv[4]);
  61. return -1;
  62. }
  63. if(setencap(NULL,argv[3]) == -1){
  64. printf("Unknown encapsulation %sn",argv[3]);
  65. return -1;
  66. }
  67. /* Find unused asy control block */
  68. for(dev=0;dev < ASY_MAX;dev++){
  69. if(Asy[dev].iface == NULL)
  70. break;
  71. }
  72. if(dev >= ASY_MAX){
  73. printf("Too many asynch controllersn");
  74. return -1;
  75. }
  76. asyp = &Asy[dev];
  77. base = htoi(argv[1]);
  78. if(*argv[2] == 's'){
  79. /* This is a port on a 4port card with shared interrupt */
  80. for(i=0;i<FPORT_MAX;i++){
  81. if(base >= Fport[i].base && base < Fport[i].base+32){
  82. n = (base - Fport[i].base) >> 3;
  83. Fport[i].asy[n] = asyp;
  84. break;
  85. }
  86. }
  87. if(i == FPORT_MAX){
  88. printf("%x not a known 4port addressn");
  89. return -1;
  90. }
  91. irq = -1;
  92. } else
  93. irq = atoi(argv[2]);
  94. /* Create interface structure and fill in details */
  95. ifp = (struct iface *)callocw(1,sizeof(struct iface));
  96. ifp->addr = Ip_addr;
  97. ifp->name = strdup(argv[4]);
  98. ifp->mtu = atoi(argv[6]);
  99. ifp->dev = dev;
  100. ifp->stop = asy_detach;
  101. setencap(ifp,argv[3]);
  102. /* Look for the interface mode in the table */
  103. for(ap = Asymode;ap->name != NULL;ap++){
  104. if(stricmp(argv[3],ap->name) == 0){
  105. trigchar = ap->trigchar;
  106. if((*ap->init)(ifp) != 0){
  107. printf("%s: mode %s Init failedn",
  108.  ifp->name,argv[3]);
  109. if_detach(ifp);
  110. return -1;
  111. }
  112. break;
  113. }
  114. }
  115. if(ap->name == NULL){
  116. printf("Mode %s unknown for interface %sn",argv[3],argv[4]);
  117. if_detach(ifp);
  118. return -1;
  119. }
  120. /* Link in the interface */
  121. ifp->next = Ifaces;
  122. Ifaces = ifp;
  123. cts = rlsd = 0;
  124. if(argc > 8){
  125. if(strchr(argv[8],'c') != NULL)
  126. cts = 1;
  127. if(strchr(argv[8],'r') != NULL)
  128. rlsd = 1;
  129. }
  130. if(strchr(argv[2],'c') != NULL)
  131. chain = 1;
  132. else
  133. chain = 0;
  134. asy_init(dev,ifp,base,irq,(uint16)atol(argv[5]),
  135. trigchar,atol(argv[7]),cts,rlsd,chain);
  136. cp = if_name(ifp," tx");
  137. ifp->txproc = newproc(cp,768,if_tx,0,ifp,NULL,0);
  138. free(cp);
  139. return 0;
  140. }
  141. static int
  142. asy_detach(ifp)
  143. struct iface *ifp;
  144. {
  145. struct asymode *ap;
  146. if(ifp == NULL)
  147. return -1;
  148. asy_stop(ifp);
  149. /* Call mode-dependent routine */
  150. for(ap = Asymode;ap->name != NULL;ap++){
  151. if(ifp->iftype != NULL
  152.  && stricmp(ifp->iftype->name,ap->name) == 0
  153.  && ap->free != NULL){
  154. (*ap->free)(ifp);
  155. }
  156. }
  157. return 0;
  158. }