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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Functions for level 3 net/rom support
  2.  * Copyright 1989 Dan Frank, W9NK
  3.  */
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "ax25.h"
  7. #include "netrom.h"
  8. #include "lapb.h"
  9. #include <ctype.h>
  10. /* Convert a net/rom network header to host format structure
  11.  * Return -1 if error, 0 if OK
  12.  */
  13. int
  14. ntohnr3(hdr,bpp)
  15. register struct nr3hdr *hdr; /* output structure */
  16. struct mbuf **bpp;
  17. {
  18. int ttl;
  19. if(pullup(bpp,hdr->source,AXALEN) < AXALEN)
  20. return -1;
  21. if(pullup(bpp,hdr->dest,AXALEN) < AXALEN)
  22. return -1;
  23. if((ttl = PULLCHAR(bpp)) == -1)
  24. return -1;
  25. hdr->ttl = ttl;
  26. return 0;
  27. }
  28. /* Convert a host-format net/rom level 3 header into an mbuf ready
  29.  * for transmission.
  30.  */
  31. struct mbuf *
  32. htonnr3(hdr)
  33. register struct nr3hdr *hdr;
  34. {
  35. struct mbuf *rbuf;
  36. register uint8 *cp;
  37. if(hdr == (struct nr3hdr *) NULL)
  38. return NULL;
  39. /* Allocate space for return buffer */
  40. if((rbuf = alloc_mbuf(NR3HLEN)) == NULL)
  41. return NULL;
  42. rbuf->cnt = NR3HLEN;
  43. /* Now convert */
  44. cp = rbuf->data;
  45. memcpy(cp,hdr->source,AXALEN);
  46. cp[ALEN] &= ~E; /* source E-bit is always off */
  47. cp += AXALEN;
  48. memcpy(cp,hdr->dest,AXALEN);
  49. cp[ALEN] |= E; /* destination E-bit always set */
  50. cp += AXALEN;
  51. *cp = hdr->ttl;
  52. return rbuf;
  53. }
  54. /* Convert a net/rom routing broadcast destination subpacket from
  55.  * network format to a host format structure.  Return -1 if error,
  56.  * 0 if OK.
  57.  */
  58. int
  59. ntohnrdest(ds,bpp)
  60. register struct nr3dest *ds;
  61. struct mbuf **bpp;
  62. {
  63. int quality;
  64. /* get destination callsign */
  65. if(pullup(bpp,ds->dest,AXALEN) < AXALEN)
  66. return -1;
  67. /* get destination alias */
  68. if(pullup(bpp,ds->alias,ALEN) < ALEN)
  69. return -1;
  70. ds->alias[ALEN] = '';
  71. /* get best neighbor callsign */
  72. if(pullup(bpp,ds->neighbor,AXALEN) < AXALEN)
  73. return -1;
  74. /* get route quality */
  75. if((quality = PULLCHAR(bpp)) == -1)
  76. return -1;
  77. ds->quality = quality;
  78. return 0;
  79. }
  80. /* Convert a host-format net/rom destination subpacket into an
  81.  * mbuf ready for transmission as part of a route broadcast
  82.  * packet.
  83.  */
  84. struct mbuf *
  85. htonnrdest(ds)
  86. register struct nr3dest *ds;
  87. {
  88. struct mbuf *rbuf;
  89. register uint8 *cp;
  90. if(ds == (struct nr3dest *) NULL)
  91. return NULL;
  92. /* Allocate space for return buffer */
  93. if((rbuf = alloc_mbuf(NRRTDESTLEN)) == NULL)
  94. return NULL;
  95. rbuf->cnt = NRRTDESTLEN;
  96. cp = rbuf->data;
  97. memcpy(cp,ds->dest,AXALEN);
  98. cp += AXALEN;
  99. memcpy(cp,ds->alias,ALEN);
  100. cp += ALEN;
  101. memcpy(cp,ds->neighbor,AXALEN);
  102. cp += AXALEN;
  103. *cp = ds->quality;
  104. return rbuf;
  105. }