home *** CD-ROM | disk | FTP | other *** search
/ ftp.umcs.maine.edu / 2015-02-07.ftp.umcs.maine.edu.tar / ftp.umcs.maine.edu / pub / thesis / zhongy / snmp / snmp.shar / snmpencode.c < prev    next >
C/C++ Source or Header  |  1994-05-11  |  4KB  |  177 lines

  1. /*
  2.  
  3.   This package include routines to encode a C structure to a 
  4.  
  5.   snmp package
  6.  
  7.  
  8.   programmer: Zhong Yunxiang
  9.  
  10. */
  11.  
  12.  
  13.  
  14. #include <sys/types.h>
  15. #include <sys/socket.h>
  16. #include <netinet/in.h>
  17. #include <netdb.h>
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <sys/time.h>
  23. #include <sys/types.h>
  24.  
  25. #include "asn1.h"
  26. #include "snmp.h"
  27.  
  28.  
  29. /*
  30.   make packet in buff acording the information
  31.   in the struct req_desc
  32.  
  33.   We firstly allocate in reverse order, then reverse it
  34. */
  35. int mkpacket(struct req_desc *redq, unsigned char *buff)
  36. {
  37.  
  38.   int i,j;
  39.   int len,obj_len;
  40.   unsigned char buf[SNMPMAXSZ];
  41.   struct snbentry sn;
  42.  
  43.   unsigned char  len_obj_in,len_obj_out;
  44.   unsigned char  len_seq1_in,len_seq1_out;
  45.   unsigned char  len_seq2_in,len_seq2_out;
  46.   unsigned char  len_err_out;
  47.   unsigned char  len_reqid_in,len_reqid_out;
  48.   unsigned char  len_operation_in,len_operation_out;
  49.   unsigned char  len_comm_out,len_version_out,len_total;
  50.  
  51.  
  52. /*  printf("\n in the mkpacket function");
  53. */
  54.   len=0;
  55.   /* last null */
  56.   buf[len]=0x00; len++;
  57.   buf[len]=ASN1_NULL; len++;
  58.  
  59.   /*obj id*/
  60.   sn=redq->bind;
  61.   obj_len=sn.sb_oid.len;
  62.   for (i=obj_len-1; i>1; i--) {
  63.       buf[len]=(unsigned char)sn.sb_oid.id[i];
  64.       len++;
  65.       }
  66.   buf[len]=0x2B;  len++;
  67.   len_obj_in=sn.sb_oid.len-1;        /*total inter length of obj in ASN.1*/
  68.   /*len of obj*/
  69.   /*  buf[len]=0x08;  len++; */
  70.   buf[len]=len_obj_in; len++;
  71.   /*printf("\n len_obj_in is %x = 0x08, %x",buf[len-1],len_obj_in);
  72.   */
  73.   buf[len]=ASN1_OBJID;  len++;
  74.   len_obj_out=len_obj_in+2;
  75.  
  76.   /*len of seq*/
  77.   len_seq1_in=len_obj_out+2;         /*total length of seq1 inter in ASN.1*/
  78.                                      /*plus null*/
  79.   /*buf[len]=0x0C; len++;*/
  80.   buf[len]=len_seq1_in; len++;
  81.   /*printf("\n len_seq1_in is %x =0x0C, %x",buf[len-1],len_seq1_in);
  82.   */
  83.   buf[len]=ASN1_SEQ; len++;
  84.   len_seq1_out=len_seq1_in+2;
  85.  
  86.   /*len of seq*/
  87.   len_seq2_in=len_seq1_out;          /*total length of seq2 inter in ASN.1*/
  88.   /*buf[len]=0x0E; len++;*/
  89.   buf[len]=len_seq2_in;len++;
  90.   /*printf("\n len_seq2_in is %x =0x0e, %x",buf[len-1],len_seq2_in);
  91.   */
  92.   buf[len]=ASN1_SEQ; len++;
  93.   len_seq2_out=len_seq2_in+2;        /*total length of seq2 out in ASN.1*/
  94.  
  95.   /*error index */
  96.   buf[len]=0x00;  len++;
  97.   buf[len]=0x01; len++;
  98.   buf[len]=ASN1_INT; len++;
  99.  
  100.   /*error status*/
  101.   buf[len]=0x00;  len++;
  102.   buf[len]=0x01; len++;
  103.   buf[len]=ASN1_INT; len++;
  104.  
  105.   len_err_out=6;
  106.  
  107.   /*requid id*/
  108.   buf[len]=0x02; len++;
  109.   buf[len]=0x56; len++;
  110.   buf[len]=0xAE; len++;
  111.   buf[len]=0x05; len++;
  112.   /*reid len*/
  113.   buf[len]=0x04; len++;
  114.   len_reqid_in=4;                     /*length of requid */
  115.   buf[len]=ASN1_INT; len++;
  116.  
  117.   len_reqid_out=len_reqid_in+2;   /*total out length of error field and redid*/
  118.  
  119.  
  120.   /*len of operation*/
  121.  
  122.   /*buf[len]=0x1C; len++; */
  123.   len_operation_in=len_seq2_out+len_reqid_out + len_err_out;
  124.                                          /*total inter length of operation*/
  125.   buf[len]=len_operation_in; len++;
  126.   /*printf("\n len_operation_in is %x =0x1C, %x",buf[len-1],len_operation_in);
  127.   */
  128.  
  129.   buf[len]=PDU_GET; len++;
  130.  
  131.   len_operation_out=len_operation_in+2;  /*total out length of operation*/
  132.   /*community*/
  133.   buf[len]=0x63; len++;
  134.   buf[len]=0x69; len++;
  135.   buf[len]=0x6C; len++;
  136.   buf[len]=0x62; len++;
  137.   buf[len]=0x75; len++;
  138.   buf[len]=0x70; len++;
  139.   /*len of community*/
  140.   buf[len]=0x06; len++;
  141.   buf[len]=ASN1_OCTSTR; len++;
  142.  
  143.   len_comm_out=8;                     /*total out length of community*/
  144.  
  145.   /*version*/
  146.   buf[len]=0x00; len++;
  147.   /*len*/
  148.   buf[len]=0x01; len++;
  149.   buf[len]=ASN1_INT; len++;
  150.  
  151.   len_version_out=3;                  /*total out length of version*/
  152.  
  153.   /*total len*/
  154.   /*buf[len]=0x29; len++; */
  155.   len_total=len_operation_out + len_version_out + len_comm_out;
  156.                                       /*total out length of whole packet*/
  157.   buf[len]=len_total; len++;
  158.   /*printf("\n len_total is %x =0x29, %x",buf[len-1],len_total);
  159.   */
  160.  
  161.   buf[len]=ASN1_SEQ;
  162.  
  163.   /*
  164.     reverse
  165.   */
  166.   j=len;
  167.   for (i=0;i<=len;i++) {
  168.     buff[i]=buf[j];
  169.     j=j-1;
  170.     }
  171.  
  172.   /*return len+1 */
  173.   return(len+1);
  174. }
  175.  
  176.  
  177.