imep_spec.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  *      This product includes software developed by the Computer Systems
  17.  *      Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * Ported from CMU/Monarch's code
  35.  *
  36.  * $Header: /cvsroot/nsnam/ns-2/imep/imep_spec.h,v 1.4 2006/02/21 15:20:18 mahrenho Exp $
  37.  */
  38. #ifndef __imep_spec_h__
  39. #define __imep_spec_h__
  40. #include <sys/types.h>
  41. #include <stddef.h> // for the offsetof() macro
  42. // **********************************************************************
  43. #ifdef COMMENT_ONLY
  44. The Internet MANET Encapsulation Protocol (IMEP) consists of five
  45. different mechanisms:
  46.      Link/Connection Status Sensing
  47.      Control Message Aggregation
  48.      Broadcast Reliability
  49.      Network-layer Address Resolution
  50.      Security Authentication
  51. 04AUG98 - jgb - For now, I am going to implement the first three mechanisms
  52.                 as the last two are not really necessary for the present
  53.                 simulation work.
  54. #endif /* COMMENT_ONLY */
  55. // **********************************************************************
  56. // Link/Connection Status Sensing
  57. // IMEP may be configured to run in the following "connection
  58. // notification" modes.
  59. #define MODE_BIDIRECTIONAL 0x01
  60. #define MODE_UNIDIRECTIONAL 0x02
  61. // Link status
  62. #define LINK_DOWN 0x00
  63. #define LINK_IN   0x01
  64. #define LINK_OUT  0x02
  65. #define LINK_BI   (LINK_IN | LINK_OUT)
  66. // XXX - The values for these constants are not specified by the IMEP draft.
  67. #define BEACON_PERIOD 1.0  // seconds
  68. #define BEACON_JITTER 0.010 // seconds
  69. #define MAX_BEACON_TIME  (BEACON_PERIOD * 3)
  70. // **********************************************************************
  71. // Control Message Aggregation
  72. // XXX - The values for these constants are not specified by the IMEP draft.
  73. #define MAX_TRANSMIT_WAIT_TIME_LOWP 0.250 // seconds
  74. #define MIN_TRANSMIT_WAIT_TIME_LOWP     0.150
  75. #define MAX_TRANSMIT_WAIT_TIME_HIGHP 0.010 // seconds
  76. #define MIN_TRANSMIT_WAIT_TIME_HIGHP    0.000
  77. // **********************************************************************
  78. // Broadcast Reliability
  79. #define RETRANS_PERIOD 0.500 // seconds
  80. #define MAX_REXMITS             2
  81. #define MAX_RETRANS_TIME (RETRANS_PERIOD * (MAX_REXMITS + 1))
  82. // **********************************************************************
  83. // Protocol Message Format
  84. struct hdr_imep {
  85. u_int8_t          imep_version : 4;
  86. u_int8_t   imep_block_flags : 4;
  87. u_int16_t   imep_length;
  88. // Header access methods
  89. static int offset_; // required by PacketHeaderManager
  90. inline static int& offset() { return offset_; }
  91. inline static hdr_imep* access(const Packet* p) {
  92. return (hdr_imep*) p->access(offset_);
  93. }
  94. };
  95. /* hdr_imep actually takes 4 bytes, not 3, b/c we aren't packing the
  96.    two bitfields into 1 byte */
  97. #define IMEP_VERSION_0 0x00
  98. #define IMEP_VERSION IMEP_VERSION_0
  99. #define BLOCK_FLAG_ACK 0x08
  100. #define BLOCK_FLAG_HELLO 0x04
  101. #define BLOCK_FLAG_OBJECT 0x02
  102. #define BLOCK_FLAG_UNUSED 0x01
  103. /* I'd rather not deal with alignment issues in this code, so I've
  104. just padded out the IMEP structs to be word aligned.  The sizes of
  105. packets will be slightly inflated, but the packet formats in the IMEP
  106. draft are really odd --- I can't imagine anyone actually implementing them,
  107. and they'd need to be padded out or redone in real life. -dam */
  108. struct imep_ack {
  109. u_int8_t  ack_seqno;
  110.         u_int8_t  r1;
  111.         u_int16_t  r2;
  112. u_int32_t ack_ipaddr;
  113. };
  114. struct imep_ack_block {
  115. u_int8_t  ab_num_acks;
  116.         u_int8_t  r1;
  117.         u_int16_t  r2;
  118. char ab_ack_list[1]; // placeholder
  119. };
  120. struct imep_hello {
  121. u_int32_t  hello_ipaddr;
  122. };
  123. struct imep_hello_block {
  124. u_int8_t  hb_num_hellos;
  125.         u_int8_t  r1;
  126.         u_int16_t  r2;
  127. char hb_hello_list[1]; // placeholder
  128. };
  129. struct imep_object {
  130. u_int16_t o_length;
  131. // The IMEP spec uses the first bit to determine if this field
  132. // is 8 or 16 bits.  I fix its length at 16 bits to keep
  133. // things simple.
  134. char o_data[1]; // placeholder
  135. };
  136. /* define the size of the an imep_object without the following bytes of o_data,
  137.    Use this instead of sizeof(struct imep_object)
  138.  */
  139. #define IMEP_OBJECT_SIZE offsetof(struct imep_object, o_data[0])
  140. struct imep_object_block {
  141. u_int8_t  ob_sequence;
  142. u_int8_t  ob_protocol_type : 4;
  143. u_int8_t  ob_num_objects : 7;
  144. u_int8_t  ob_num_responses : 5;
  145. char ob_object_list[1]; // placeholder
  146. };
  147. /*  Use this instead of sizeof(struct imep_object_block)  */
  148. #define IMEP_OBJECT_BLOCK_SIZE offsetof(struct imep_object_block, ob_object_list[0])
  149. #define PROTO_RESERVED 0x00
  150. #define PROTO_NARP 0x01
  151. #define PROTO_RNARP 0x01
  152. #define PROTO_TORA 0x02
  153. // The "response list" follows the "object list" in an IMEP packet.
  154. struct imep_response {
  155. u_int32_t  resp_ipaddr;
  156. };
  157. #endif /* __imep_spec_h__ */