lanTask.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*
  2. ** author: zhouchao
  3. ** date: 2019-03-28
  4. ** version: 1.00
  5. ** e-mail: zhouchao@storlead.com 1959353124@qq.com
  6. ** brief: LM73 driver
  7. **
  8. */
  9. #include "./lanTask.h"
  10. #include "bmc_main.h"
  11. #include "bmc_type.h"
  12. #define BUF_LEN 128
  13. uint8_t REC_BUF[BUF_LEN];
  14. uint8_t SEND_BUF[BUF_LEN];
  15. //#define IPMI (REC_BUF[0]==0x06&&REC_BUF[1]==0x00&&REC_BUF[2]==0xff&&(REC_BUF==0x06||REC_BUF==0x07))
  16. int LanTask(void)
  17. {
  18. int socket=0;
  19. char **argv;
  20. int reclan_len=0;
  21. int i=0;
  22. unsigned short clientport = 0;
  23. char clientIP[50] = {0};
  24. struct sockaddr_in clientAddr;
  25. socket=udpserver_init(3,argv);
  26. if(socket<0)
  27. {
  28. printf("create socket fial!!!\n");
  29. return -1;
  30. }
  31. while(1)
  32. {
  33. // printf("start receiver lan fream:\n");
  34. reclan_len=udp_receiver(socket,REC_BUF,BUF_LEN,&clientAddr);
  35. clientport = ntohs(clientAddr.sin_port);
  36. strcpy(clientIP, inet_ntoa(clientAddr.sin_addr));
  37. // printf("Recv len: %d, from ip %s:%d\n",reclan_len, clientIP, clientport);
  38. // printf("receiver data leng is %d ,data is :\n",reclan_len);
  39. // for(i=0;i<reclan_len;i++)
  40. {
  41. // if(i%16==0)
  42. // printf("\n");
  43. // printf("%#x ",REC_BUF[i]);
  44. }
  45. if(REC_BUF[0]==0x06&&REC_BUF[1]==0x00&&REC_BUF[2]==0xff)
  46. switch(REC_BUF[3])
  47. {
  48. case 0x06:
  49. cmd_asf(socket,REC_BUF,reclan_len,&clientAddr);
  50. break;
  51. case 0x07:
  52. cmd_ipmi(socket,REC_BUF,reclan_len,&clientAddr);
  53. break;
  54. default :
  55. break;
  56. }
  57. }
  58. return 0;
  59. }
  60. int cmd_asf(int socket,char * REC_BUF,uint16_t rec_len,struct sockaddr_in * clientAddr)
  61. {
  62. int i=0;
  63. ASF_Pong_Message pong_struct;
  64. for(i=0;i<rec_len;i++)
  65. {
  66. pong_struct.Data[i]=REC_BUF[i];
  67. }
  68. pong_struct.AST_T.MessageType=0x40;
  69. pong_struct.AST_T.OEM_IANA[0] = 0x00;
  70. pong_struct.AST_T.OEM_IANA[1] = 0x00;
  71. pong_struct.AST_T.OEM_IANA[2] = 0x8e;
  72. pong_struct.AST_T.OEM_IANA[3] = 0x71;
  73. pong_struct.AST_T.Oem_def[0] = 0x03;
  74. pong_struct.AST_T.Oem_def[1] = 0x00;
  75. pong_struct.AST_T.Oem_def[2] = 0x00;
  76. pong_struct.AST_T.Oem_def[3] = 0x00;
  77. pong_struct.AST_T.DataLen = 0x10;
  78. pong_struct.AST_T.SupportEntities=0x81;
  79. pong_struct.AST_T.SupportInteractions=0x00;
  80. pong_struct.AST_T.Reserved3[0] = 0;
  81. pong_struct.AST_T.Reserved3[1] = 0;
  82. pong_struct.AST_T.Reserved3[2] = 0;
  83. pong_struct.AST_T.Reserved3[3] = 0;
  84. pong_struct.AST_T.Reserved3[4] = 0;
  85. pong_struct.AST_T.Reserved3[5] = 0;
  86. if(udp_send(socket,pong_struct.Data,sizeof(pong_struct.Data),clientAddr)<=0)
  87. printf("send fail!\n");
  88. // printf("send success !!!\n");
  89. // printf("\n");
  90. return 0;
  91. }
  92. int cmd_ipmi(int socket,char * REC_BUF,uint16_t len,struct sockaddr_in * clientAddr)
  93. {
  94. int i=0,j=0;
  95. char Type;
  96. MsgPkt_T pReq,pRes;
  97. INT16U clientport;
  98. uint32_t rec_len=len;
  99. uint32_t send_len;
  100. IPMI_Message IpmiMessage_struct;
  101. char SequenceNumber[4]={0x1c,0xb6,0xe8,0xf3};
  102. char SessionId[4]={0xfb,0x2d,0xb5,0xff};
  103. clientport = ntohs(clientAddr->sin_port);
  104. memset(&IpmiMessage_struct,0,sizeof(IPMI_Message));
  105. Type=GetType(REC_BUF,&rec_len);
  106. //add udp lan message
  107. memcpy(IpmiMessage_struct.Data,REC_BUF,rec_len);
  108. pReq.Channel=1;
  109. pReq.Param=PARAM_IFC;
  110. pReq.Privilege=4;
  111. pReq.ResTimeOut=WAIT_INFINITE;
  112. pReq.UDPPort=clientport;
  113. pReq.Socket=socket;
  114. pReq.Size=IpmiMessage_struct.AST_T.MessageLength;
  115. //send to MsgHndlr.c
  116. memcpy(pReq.Data,IpmiMessage_struct.AST_T.MessageData,pReq.Size);
  117. pReq.NetFnLUN=pReq.Data[1];
  118. pReq.Cmd=pReq.Data[5];
  119. strcpy(pReq.SrcQ,OBSM_TASK_Q);
  120. strcpy(pReq.IPAddr,inet_ntoa(clientAddr->sin_addr));
  121. PostMsg (&pReq,MSG_HNDLR_Q);
  122. //receiver from MsgHndlr.c
  123. GetMsg (&pRes,OBSM_TASK_Q,WAIT_INFINITE);
  124. IpmiMessage_struct.AST_T.MessageLength=pRes.Size;
  125. memcpy(IpmiMessage_struct.AST_T.MessageData,pRes.Data,pRes.Size);
  126. pRes.Data[0]=pReq.Data[3];//source addr
  127. pRes.Data[1]=((pReq.Data[1]>>2)+1)<<2;//netfn
  128. pRes.Data[3]=pReq.Data[0];//target addr
  129. pRes.Data[4]=pReq.Data[4];
  130. pRes.Data[5]=pReq.Data[5];
  131. //MD5 add authentication code
  132. if(Type==MD5)
  133. {
  134. memcpy(IpmiMessage_struct.AST_T.Sequence_Number,SequenceNumber,4);
  135. IpmiMessage_struct.AST_T.Sequence_Number[0]=IpmiMessage_struct.AST_T.Sequence_Number[0]+SessionSequenceNumberCount;
  136. memcpy(IpmiMessage_struct.AST_T.Session_ID,SessionId,4);
  137. }
  138. //calculate checksum
  139. pRes.Data[pRes.Size]=0x00;//checksum is 0
  140. CalculateCheckSum2(pRes.Data,pRes.Size+1);
  141. CalculateCheckSum(pRes.Data,pRes.Size+1);
  142. pRes.Size=pRes.Size+1;
  143. IpmiMessage_struct.AST_T.MessageLength=pRes.Size;
  144. memcpy(IpmiMessage_struct.AST_T.MessageData,pRes.Data,pRes.Size);
  145. //send ipmi response
  146. send_len=AddToSendBuf(SEND_BUF,&IpmiMessage_struct);
  147. if(udp_send(socket,SEND_BUF,send_len,clientAddr)<=0)
  148. printf("send fail!\n");
  149. // printf("send success !!!\n");
  150. // printf("\n");
  151. return 0;
  152. }
  153. char GetType(char *REC_BUF,uint32_t *rec_len)
  154. {
  155. int i;
  156. if(REC_BUF[4]==MD5)
  157. {
  158. for(i=13;i<*rec_len-16;i++)
  159. {
  160. REC_BUF[i]=REC_BUF[i+16];
  161. }
  162. *rec_len=*rec_len-16;
  163. }
  164. return REC_BUF[4];
  165. }
  166. int AddToSendBuf(char *SEND_BUF,IPMI_Message * IpmiMessage_struct)
  167. {
  168. char authent[16]={ 0xfa,0x6f,0x65,0xe4,
  169. 0xea,0xec,0xaa,0xa0,
  170. 0x92,0x27,0x95,0xbd,
  171. 0xf2,0xa9,0x9d,0xcb
  172. };
  173. int i=0;
  174. if(IpmiMessage_struct->AST_T.MessageType==MD5)
  175. {
  176. memcpy(SEND_BUF,&IpmiMessage_struct->Data[0],13);
  177. memcpy(&SEND_BUF[13],authent,16);
  178. SEND_BUF[29]=IpmiMessage_struct->AST_T.MessageLength;
  179. memcpy(&SEND_BUF[30],&IpmiMessage_struct->AST_T.MessageData[0],IpmiMessage_struct->AST_T.MessageLength);
  180. return IpmiMessage_struct->AST_T.MessageLength+14+16;
  181. }
  182. else
  183. {
  184. for(i=0;i<IpmiMessage_struct->AST_T.MessageLength+14;i++)
  185. SEND_BUF[i]=IpmiMessage_struct->Data[i];
  186. return IpmiMessage_struct->AST_T.MessageLength+14;
  187. }
  188. }