netsnmp_asn1_packet_parse.3
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:8k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. .TH "asn1 parsing and datatype manipulation routines." 3 "28 Nov 2005" "Version 5.2.1.rc3" "net-snmp" " -*- nroff -*-
  2. .ad l
  3. .nh
  4. .SH NAME
  5. asn1 parsing and datatype manipulation routines. - Note on.  
  6. .PP
  7. .SS "Defines"
  8. .in +1c
  9. .ti -1c
  10. .RI "#define fBNULLfP   0"
  11. .br
  12. .ti -1c
  13. .RI "#define fBINT32_MAXfP   2147483647"
  14. .br
  15. .ti -1c
  16. .RI "#define fBINT32_MINfP   (0 - INT32_MAX - 1)"
  17. .br
  18. .ti -1c
  19. .RI "#define fBCHECK_OVERFLOW_SfP(x, y)"
  20. .br
  21. .ti -1c
  22. .RI "#define fBCHECK_OVERFLOW_UfP(x, y)"
  23. .br
  24. .in -1c
  25. .SS "Functions"
  26. .in +1c
  27. .ti -1c
  28. .RI "int fBasn_check_packetfP (u_char *pkt, size_t len)"
  29. .br
  30. .ti -1c
  31. .RI "u_char * fBasn_parse_intfP (u_char *data, size_t *datalength, u_char *type, long *intp, size_t intsize)"
  32. .br
  33. .ti -1c
  34. .RI "u_char * fBasn_parse_unsigned_intfP (u_char *data, size_t *datalength, u_char *type, u_long *intp, size_t intsize)"
  35. .br
  36. .ti -1c
  37. .RI "u_char * fBasn_build_intfP (u_char *data, size_t *datalength, u_char type, const long *intp, size_t intsize)"
  38. .br
  39. .ti -1c
  40. .RI "u_char * fBasn_build_unsigned_intfP (u_char *data, size_t *datalength, u_char type, const u_long *intp, size_t intsize)"
  41. .br
  42. .ti -1c
  43. .RI "u_char * fBasn_parse_stringfP (u_char *data, size_t *datalength, u_char *type, u_char *str, size_t *strlength)"
  44. .br
  45. .ti -1c
  46. .RI "u_char * fBasn_build_stringfP (u_char *data, size_t *datalength, u_char type, const u_char *str, size_t strlength)"
  47. .br
  48. .ti -1c
  49. .RI "u_char * fBasn_parse_headerfP (u_char *data, size_t *datalength, u_char *type)"
  50. .br
  51. .ti -1c
  52. .RI "u_char * fBasn_parse_sequencefP (u_char *data, size_t *datalength, u_char *type, u_char expected_type, const char *estr)"
  53. .br
  54. .ti -1c
  55. .RI "u_char * fBasn_build_headerfP (u_char *data, size_t *datalength, u_char type, size_t length)"
  56. .br
  57. .ti -1c
  58. .RI "u_char * fBasn_build_sequencefP (u_char *data, size_t *datalength, u_char type, size_t length)"
  59. .br
  60. .ti -1c
  61. .RI "u_char * fBasn_parse_lengthfP (u_char *data, u_long *length)"
  62. .br
  63. .ti -1c
  64. .RI "u_char * fBasn_build_lengthfP (u_char *data, size_t *datalength, size_t length)"
  65. .br
  66. .ti -1c
  67. .RI "u_char * fBasn_parse_objidfP (u_char *data, size_t *datalength, u_char *type, oid *objid, size_t *objidlength)"
  68. .br
  69. .ti -1c
  70. .RI "u_char * fBasn_build_objidfP (u_char *data, size_t *datalength, u_char type, oid *objid, size_t objidlength)"
  71. .br
  72. .ti -1c
  73. .RI "u_char * fBasn_parse_nullfP (u_char *data, size_t *datalength, u_char *type)"
  74. .br
  75. .ti -1c
  76. .RI "u_char * fBasn_build_nullfP (u_char *data, size_t *datalength, u_char type)"
  77. .br
  78. .ti -1c
  79. .RI "u_char * fBasn_parse_bitstringfP (u_char *data, size_t *datalength, u_char *type, u_char *str, size_t *strlength)"
  80. .br
  81. .ti -1c
  82. .RI "u_char * fBasn_build_bitstringfP (u_char *data, size_t *datalength, u_char type, const u_char *str, size_t strlength)"
  83. .br
  84. .ti -1c
  85. .RI "u_char * fBasn_parse_unsigned_int64fP (u_char *data, size_t *datalength, u_char *type, struct fBcounter64fP *cp, size_t countersize)"
  86. .br
  87. .ti -1c
  88. .RI "u_char * fBasn_build_unsigned_int64fP (u_char *data, size_t *datalength, u_char type, const struct fBcounter64fP *cp, size_t countersize)"
  89. .br
  90. .ti -1c
  91. .RI "int fBasn_reallocfP (u_char **pkt, size_t *pkt_len)"
  92. .br
  93. .in -1c
  94. .SH "Detailed Description"
  95. .PP 
  96. Note on. 
  97. .PP
  98. Re-allocating reverse ASN.1 encoder functions. Synopsis:
  99. .PP
  100. .PP
  101. .nf
  102.  u_char *buf = (u_char*)malloc(100);
  103.  u_char type = (ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER);
  104.  size_t buf_len = 100, offset = 0;
  105.  long data = 12345;
  106.  int allow_realloc = 1;
  107.  
  108.  if (asn_realloc_rbuild_int(&buf, &buf_len, &offset, allow_realloc,
  109.                             type, &data, sizeof(long)) == 0) {
  110.      error;
  111.  }
  112. .fi
  113. .PP
  114. .PP
  115. NOTE WELL: after calling one of these functions with allow_realloc non-zero, buf might have moved, buf_len might have grown and offset will have increased by the size of the encoded data. You should **NEVER** do something like this:
  116. .PP
  117. .PP
  118. .nf
  119.  u_char *buf = (u_char *)malloc(100), *ptr;
  120.  u_char type = (ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER);
  121.  size_t buf_len = 100, offset = 0;
  122.  long data1 = 1234, data2 = 5678;
  123.  int rc = 0, allow_realloc = 1;
  124.  
  125.  rc  = asn_realloc_rbuild_int(&buf, &buf_len, &offset, allow_realloc,
  126.                                 type, &data1, sizeof(long));
  127.  ptr = buf[buf_len - offset];   / * points at encoding of data1 * /
  128.  if (rc == 0) {
  129.       error;
  130.  }
  131.  rc  = asn_realloc_rbuild_int(&buf, &buf_len, &offset, allow_realloc,
  132.                               type, &data2, sizeof(long));
  133.  make use of ptr here;
  134. .fi
  135. .PP
  136. .PP
  137. ptr is **INVALID** at this point. In general, you should store the offset value and compute pointers when you need them:
  138. .PP
  139. .PP
  140. .nf
  141.  u_char *buf = (u_char *)malloc(100), *ptr;
  142.  u_char type = (ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_INTEGER);
  143.  size_t buf_len = 100, offset = 0, ptr_offset;
  144.  long data1 = 1234, data2 = 5678;
  145.  int rc = 0, allow_realloc = 1;
  146.  
  147.  rc  = asn_realloc_rbuild_int(&buf, &buf_len, &offset, allow_realloc,
  148.                               type, &data1, sizeof(long));
  149.  ptr_offset = offset;
  150.  if (rc == 0) {
  151.       error;
  152.  }
  153.  rc  = asn_realloc_rbuild_int(&buf, &buf_len, &offset, allow_realloc,
  154.                               type, &data2, sizeof(long));
  155.  ptr = buf + buf_len - ptr_offset
  156.  make use of ptr here;
  157. .fi
  158. .PP
  159. .PP
  160. Here, you can see that ptr will be a valid pointer even if the block of memory has been moved, as it may well have been. Plenty of examples of usage all over fBasn1.cfP, fBsnmp_api.cfP, fBsnmpusm.cfP.
  161. .PP
  162. The other thing you should **NEVER** do is to pass a pointer to a buffer on the stack as the first argument when allow_realloc is non-zero, unless you really know what you are doing and your machine/compiler allows you to free non-heap memory. There are rumours that such things exist, but many consider them no more than the wild tales of a fool.
  163. .PP
  164. Of course, you can pass allow_realloc as zero, to indicate that you do not wish the packet buffer to be reallocated for some reason; perhaps because it is on the stack. This may be useful to emulate the functionality of the old API:
  165. .PP
  166. .PP
  167. .nf
  168.  u_char my_static_buffer[100], *cp = NULL;
  169.  size_t my_static_buffer_len = 100;
  170.  float my_pi = (float)22/(float)7;
  171.  
  172.  cp = asn_rbuild_float(my_static_buffer, &my_static_buffer_len,
  173.                        ASN_OPAQUE_FLOAT, &my_pi, sizeof(float));
  174.  if (cp == NULL) {
  175.  error;
  176.  }
  177. .fi
  178. .PP
  179. .PP
  180. IS EQUIVALENT TO:
  181. .PP
  182. .PP
  183. .nf
  184.  u_char my_static_buffer[100];
  185.  size_t my_static_buffer_len = 100, my_offset = 0;
  186.  float my_pi = (float)22/(float)7;
  187.  int rc = 0;
  188.  
  189.  rc = asn_realloc_rbuild_float(&my_static_buffer, &my_static_buffer_len,
  190.                                &my_offset, 0,
  191.                                ASN_OPAQUE_FLOAT, &my_pi, sizeof(float));
  192.  if (rc == 0) {
  193.    error;
  194.  }
  195. .fi
  196. .PP
  197. .SH "Define Documentation"
  198. .PP 
  199. .SS "#define CHECK_OVERFLOW_S(x, y)"
  200. .PP
  201. fBValue:fP
  202. .PP
  203. .nf
  204. do { int trunc = 0;                     
  205.         if (x > INT32_MAX) {                                            
  206.             trunc = 1;                                                  
  207.             x &= 0xffffffff;                                            
  208.         } else if (x < INT32_MIN) {                                     
  209.             trunc = 1;                                                  
  210.             x = 0 - (x & 0xffffffff);                                   
  211.         }                                                               
  212.         if (trunc)                                                      
  213.             snmp_log(LOG_ERR,'truncating signed value to 32 bits (%d)n',y); 
  214.     } while(0)
  215. .fi
  216. .PP
  217. Definition at line 214 of file asn1.c.
  218. .PP
  219. Referenced by asn_build_int(), and asn_parse_int().
  220. .SS "#define CHECK_OVERFLOW_U(x, y)"
  221. .PP
  222. fBValue:fP
  223. .PP
  224. .nf
  225. do {                                    
  226.         if (x > UINT32_MAX) {                                           
  227.             x &= 0xffffffff;                                            
  228.             snmp_log(LOG_ERR,'truncating unsigned value to 32 bits (%d)n',y); 
  229.         }                                                               
  230.     } while(0)
  231. .fi
  232. .PP
  233. Definition at line 226 of file asn1.c.
  234. .PP
  235. Referenced by asn_build_objid(), asn_build_unsigned_int(), asn_build_unsigned_int64(), asn_parse_unsigned_int(), and asn_parse_unsigned_int64().