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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Routines for AX.25 encapsulation in KISS TNC
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "iface.h"
  7. #include "kiss.h"
  8. #include "devparam.h"
  9. #include "slip.h"
  10. #include "asy.h"
  11. #include "ax25.h"
  12. #include "pktdrvr.h"
  13. /* Set up a SLIP link to use AX.25 */
  14. int
  15. kiss_init(
  16. struct iface *ifp
  17. ){
  18. int xdev;
  19. struct slip *sp;
  20. char *ifn;
  21. for(xdev = 0;xdev < SLIP_MAX;xdev++){
  22. sp = &Slip[xdev];
  23. if(sp->iface == NULL)
  24. break;
  25. }
  26. if(xdev >= SLIP_MAX) {
  27. printf("Too many slip devicesn");
  28. return -1;
  29. }
  30. ifp->ioctl = kiss_ioctl;
  31. ifp->raw = kiss_raw;
  32. ifp->show = slip_status;
  33. if(ifp->hwaddr == NULL)
  34. ifp->hwaddr = mallocw(AXALEN);
  35. memcpy(ifp->hwaddr,Mycall,AXALEN);
  36. ifp->xdev = xdev;
  37. sp->iface = ifp;
  38. sp->send = asy_send;
  39. sp->get = get_asy;
  40. sp->type = CL_KISS;
  41. ifp->rxproc = newproc( ifn = if_name( ifp, " rx" ),
  42. 256,slip_rx,xdev,NULL,NULL,0);
  43. free(ifn);
  44. return 0;
  45. }
  46. int
  47. kiss_free(
  48. struct iface *ifp
  49. ){
  50. if(Slip[ifp->xdev].iface == ifp)
  51. Slip[ifp->xdev].iface = NULL;
  52. return 0;
  53. }
  54. /* Send raw data packet on KISS TNC */
  55. int
  56. kiss_raw(
  57. struct iface *iface,
  58. struct mbuf **bpp
  59. ){
  60. /* Put type field for KISS TNC on front */
  61. pushdown(bpp,NULL,1);
  62. (*bpp)->data[0] = PARAM_DATA;
  63. /* slip_raw also increments sndrawcnt */
  64. slip_raw(iface,bpp);
  65. return 0;
  66. }
  67. /* Process incoming KISS TNC frame */
  68. void
  69. kiss_recv(
  70. struct iface *iface,
  71. struct mbuf **bpp
  72. ){
  73. char kisstype;
  74. kisstype = PULLCHAR(bpp);
  75. switch(kisstype & 0xf){
  76. case PARAM_DATA:
  77. ax_recv(iface,bpp);
  78. break;
  79. default:
  80. free_p(bpp);
  81. break;
  82. }
  83. }
  84. /* Perform device control on KISS TNC by sending control messages */
  85. int32
  86. kiss_ioctl(
  87. struct iface *iface,
  88. int cmd,
  89. int set,
  90. int32 val
  91. ){
  92. struct mbuf *hbp;
  93. uint8 *cp;
  94. int rval = 0;
  95. /* At present, only certain parameters are supported by
  96.  * stock KISS TNCs. As additional params are implemented,
  97.  * this will have to be edited
  98.  */
  99. switch(cmd){
  100. case PARAM_RETURN:
  101. set = 1; /* Note fall-thru */
  102. case PARAM_TXDELAY:
  103. case PARAM_PERSIST:
  104. case PARAM_SLOTTIME:
  105. case PARAM_TXTAIL:
  106. case PARAM_FULLDUP:
  107. case PARAM_HW:
  108. if(!set){
  109. rval = -1; /* Can't read back */
  110. break;
  111. }
  112. /* Allocate space for cmd and arg */
  113. if((hbp = alloc_mbuf(2)) == NULL){
  114. free_p(&hbp);
  115. rval = -1;
  116. break;
  117. }
  118. cp = hbp->data;
  119. *cp++ = cmd;
  120. *cp = val;
  121. hbp->cnt = 2;
  122. slip_raw(iface,&hbp); /* Even more "raw" than kiss_raw */
  123. rval = val; /* per Jay Maynard -- mce */
  124. break;
  125. case PARAM_SPEED: /* These go to the local asy driver */
  126. case PARAM_DTR:
  127. case PARAM_RTS:
  128. rval = asy_ioctl(iface,cmd,set,val);
  129. break;
  130. default: /* Not implemented */
  131. rval = -1;
  132. break;
  133. }
  134. return rval;
  135. }