EvComm.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082
  1. #include<netinet/ip.h>
  2. #include<arpa/inet.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <linux/termios.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <time.h>
  10. #include <stdlib.h>
  11. #include <sys/ipc.h>
  12. #include <sys/shm.h>
  13. #include <sys/mman.h>
  14. #include <linux/sockios.h>
  15. #include <linux/socket.h>
  16. #include <sys/socket.h>
  17. #include <netinet/in.h>
  18. #include <sys/time.h>
  19. #include <sys/timeb.h>
  20. #include <math.h>//for pow
  21. #include <unistd.h>
  22. #include <linux/if_packet.h>
  23. #include <netinet/if_ether.h>
  24. #include <net/if.h>
  25. #include <netinet/ether.h>
  26. #include "define.h"
  27. #include "EvComm.h"
  28. #include "NidNmk.h"
  29. #define Debug
  30. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  31. struct StatusCodeData *ShmStatusCodeData;
  32. struct CcsData *ShmCcsData;
  33. struct InternalComm *ShmInternalComm;
  34. pid_t PilotDetectionPid;
  35. enum MsgFlowStatus V2gFlowStatus;
  36. int RawSock;
  37. unsigned char *RecvBuffer,*SendBuffer;
  38. int RecvBufferSize=64*1024;
  39. int SendBufferSize=64*1024;
  40. unsigned short Aag[64];
  41. struct MmeHeader SendMmePacket;
  42. int SendMmePacketSize;
  43. unsigned char CsuMac[6],QcaMac[6],EvMac[6],SlacRunId[8];
  44. struct sockaddr_ll DestSocketAddress;
  45. struct ifreq Req;
  46. unsigned int PwmStartTime;
  47. struct timeb SeqStartTime,SeqEndTime;
  48. unsigned char AagGroupsNum;
  49. unsigned char NewNmkKey[16],Nid[7];
  50. #ifdef SystemLogMessage
  51. int StoreLogMsg(unsigned char *DataString)
  52. {
  53. unsigned char Buf[256];
  54. time_t CurrentTime;
  55. struct tm *tm;
  56. memset(Buf,0,sizeof(Buf));
  57. CurrentTime = time(NULL);
  58. tm=localtime(&CurrentTime);
  59. sprintf(Buf,"echo \"%04d.%02d.%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  60. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
  61. DataString,
  62. tm->tm_year+1900,tm->tm_mon+1);
  63. system(Buf);
  64. #ifdef Debug
  65. printf("%s \n",DataString);
  66. #endif
  67. }
  68. #endif
  69. int DiffTimeb(struct timeb ST, struct timeb ET)
  70. {
  71. //return milli-second
  72. unsigned int StartTime,StopTime;
  73. StartTime=(unsigned int)ST.time;
  74. StopTime=(unsigned int)ET.time;
  75. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  76. }
  77. int CreatShareMemory()
  78. {
  79. int MeterSMId;
  80. //creat ShmSysConfigAndInfo
  81. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  82. {
  83. #ifdef SystemLogMessage
  84. StoreLogMsg("[main]CreatShareMemory:shmget ShmSysConfigAndInfo NG");
  85. #endif
  86. return 0;
  87. }
  88. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  89. {
  90. #ifdef SystemLogMessage
  91. StoreLogMsg("[main]CreatShareMemory:shmat ShmSysConfigAndInfo NG");
  92. #endif
  93. return 0;
  94. }
  95. memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
  96. //creat ShmStatusCodeData
  97. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  98. {
  99. #ifdef SystemLogMessage
  100. StoreLogMsg("[main]CreatShareMemory:shmget ShmStatusCodeData NG");
  101. #endif
  102. return 0;
  103. }
  104. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  105. {
  106. #ifdef SystemLogMessage
  107. StoreLogMsg("[main]CreatShareMemory:shmat ShmStatusCodeData NG");
  108. #endif
  109. return 0;
  110. }
  111. memset(ShmStatusCodeData,0,sizeof(struct StatusCodeData));
  112. //creat ShmCcsData
  113. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  114. {
  115. #ifdef SystemLogMessage
  116. StoreLogMsg("[main]CreatShareMemory:shmget ShmCcsData NG");
  117. #endif
  118. return 0;
  119. }
  120. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  121. {
  122. #ifdef SystemLogMessage
  123. StoreLogMsg("[main]CreatShareMemory:shmat ShmCcsData NG");
  124. #endif
  125. return 0;
  126. }
  127. memset(ShmCcsData,0,sizeof(struct CcsData));
  128. return 1;
  129. }
  130. int InitShareMemory()
  131. {
  132. int MeterSMId;
  133. //creat ShmSysConfigAndInfo
  134. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  135. {
  136. #ifdef SystemLogMessage
  137. StoreLogMsg("[EvComm]InitShareMemory:shmget ShmSysConfigAndInfo NG");
  138. #endif
  139. return 0;
  140. }
  141. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  142. {
  143. #ifdef SystemLogMessage
  144. StoreLogMsg("[EvComm]InitShareMemory:shmat ShmSysConfigAndInfo NG");
  145. #endif
  146. return 0;
  147. }
  148. //creat ShmStatusCodeData
  149. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  150. {
  151. #ifdef SystemLogMessage
  152. StoreLogMsg("[EvComm]InitShareMemory:shmget ShmStatusCodeData NG");
  153. #endif
  154. return 0;
  155. }
  156. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  157. {
  158. #ifdef SystemLogMessage
  159. StoreLogMsg("[EvComm]InitShareMemory:shmat ShmStatusCodeData NG");
  160. #endif
  161. return 0;
  162. }
  163. //creat ShmCcsData
  164. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), 0777)) < 0)
  165. {
  166. #ifdef SystemLogMessage
  167. StoreLogMsg("[EvComm]InitShareMemory:shmget ShmCcsData NG");
  168. #endif
  169. return 0;
  170. }
  171. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  172. {
  173. #ifdef SystemLogMessage
  174. StoreLogMsg("[EvComm]InitShareMemory:shmat ShmCcsData NG");
  175. #endif
  176. return 0;
  177. }
  178. //creat ShmInternalComm
  179. if ((MeterSMId = shmget(ShmInternalCommKey, sizeof(struct InternalComm), 0777)) < 0)
  180. {
  181. #ifdef SystemLogMessage
  182. StoreLogMsg("[EvComm]InitShareMemory:shmget ShmInternalComm NG");
  183. #endif
  184. return 0;
  185. }
  186. else if ((ShmInternalComm = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  187. {
  188. #ifdef SystemLogMessage
  189. StoreLogMsg("[EvComm]InitShareMemory:shmat ShmInternalComm NG");
  190. #endif
  191. return 0;
  192. }
  193. return 1;
  194. }
  195. int GetEthMac(unsigned char *Eth, unsigned char *mac)
  196. {
  197. //Parameters:MAC,IP,Mask,Gateway
  198. int fd,rd=0;
  199. unsigned char addr[18], Buffer[128];
  200. memset(Buffer,0,sizeof(Buffer));
  201. sprintf(Buffer,"cat /sys/class/net/%s/address > /mnt/GetEthInfo",Eth);
  202. system(Buffer);
  203. fd = open("/mnt/GetEthInfo", O_RDONLY);
  204. if(fd<0)
  205. {
  206. system("rm -f /mnt/GetEthInfo");
  207. #ifdef SystemLogMessage
  208. StoreLogMsg("[EvComm]GetEthMac: MAC Address open error");
  209. #endif
  210. return 0;
  211. }
  212. memset(mac,0,6);
  213. memset(addr,0,sizeof(addr));
  214. rd=read(fd,addr,17);
  215. close(fd);
  216. system("rm -f /mnt/GetEthInfo");
  217. sscanf(addr, "%02x:%02x:%02x:%02x:%02x:%02x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
  218. return 1;
  219. }
  220. float ReadAdcVolt(unsigned char AdcChannel)
  221. {
  222. //AIN0=CCS GUN Temp 1
  223. //AIN1=CCS GUN Temp 2
  224. //AIN2=CCS_Proximity/2
  225. //AIN3=pilot voltage
  226. FILE *fp;
  227. unsigned char str[64];
  228. unsigned char AdcValue[8];
  229. if(AdcChannel>7)
  230. return -1;
  231. memset(str,0,sizeof(str));
  232. memset(AdcValue,0,sizeof(AdcValue));
  233. sprintf(str,"cat /sys/bus/iio/devices/iio\\:device0/in_voltage%d_raw",AdcChannel);
  234. fp=popen(str, "r");
  235. if(fgets(AdcValue,sizeof(AdcValue),fp)==NULL)
  236. {
  237. pclose(fp);
  238. return -1;
  239. }
  240. pclose(fp);
  241. //Vin = Vref *D / (2^n - 1)
  242. return ((float)1.8*(float)atoi(AdcValue))/4095;
  243. }
  244. void Qca7kPowerReset()
  245. {
  246. system("echo 1 > /sys/class/gpio/gpio88/value");
  247. usleep(500000);
  248. system("echo 0 > /sys/class/gpio/gpio88/value");
  249. }
  250. void SwitchCpStateE(unsigned char OnOff)
  251. {
  252. //OnOff=1 => switch State to E
  253. //OnOff=0 => return noraml
  254. if(OnOff==0)
  255. system("echo 0 > /sys/class/gpio/gpio86/value");
  256. else
  257. system("echo 1 > /sys/class/gpio/gpio86/value");
  258. }
  259. int OutputCpPwmDuty(unsigned char Duty)
  260. {
  261. unsigned char str[128];
  262. int DutyInNanoSec;
  263. if((Duty<0)||(Duty>100))
  264. return -1;
  265. memset(str,0,sizeof(str));
  266. DutyInNanoSec=10000*Duty;
  267. sprintf(str,"echo %d > /sys/class/pwm/pwmchip0/pwm0/duty_cycle",DutyInNanoSec);//nanoseconds
  268. system(str);
  269. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty=Duty;
  270. return 0;
  271. }
  272. int ConnectorPlugIn()
  273. {
  274. //return 0 => unplug
  275. //return 1 => plug-in
  276. float TmpProximity;
  277. unsigned char Rtn=0;
  278. if(((FirmwareVersion&0x0000FF00)>>8)==0x01)
  279. {
  280. //UL version: judge with CP and proximity
  281. TmpProximity=ReadAdcVolt(2);
  282. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=5)&&
  283. (TmpProximity>=0.4)&&(TmpProximity<=0.9))
  284. {
  285. Rtn=1;
  286. }
  287. }
  288. else
  289. {
  290. //CE version: judge with CP only
  291. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=5))
  292. Rtn=1;
  293. }
  294. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].ConnectorPlugIn=Rtn;
  295. return Rtn;
  296. }
  297. void PilotDetection()
  298. {
  299. pid_t tmp=0;
  300. struct timeb StartTime,EndTime;
  301. unsigned char CpState[3],count;
  302. float TmpVolt;
  303. if(PilotDetectionPid==0)
  304. {
  305. tmp=fork();
  306. if(tmp>0)
  307. {
  308. PilotDetectionPid=tmp;
  309. {
  310. unsigned char buf[64];
  311. memset(buf,0,sizeof(buf));
  312. sprintf(buf,"renice -20 -p %d",tmp);
  313. system(buf);
  314. }
  315. return;
  316. }
  317. }
  318. while(1)
  319. {
  320. //ADC_Voltage = (1+RE62/RE63)*0.9 - (RE62/RE63)*Pilot_Voltage, RE62/RE63=0.06
  321. //=>Pilot_Voltage=(0.954-ADC_Voltage)/0.06
  322. //ftime(&StartTime);
  323. TmpVolt=0;
  324. for(count=0;count<3;count++)
  325. {
  326. TmpVolt+=(0.954-ReadAdcVolt(3))/0.06;
  327. }
  328. TmpVolt/=3;
  329. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotVoltage=TmpVolt;
  330. if(TmpVolt>=13.5)
  331. {
  332. //Pilot Error
  333. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==1)&&(TmpVolt<13.75))
  334. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=1;
  335. else
  336. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  337. }
  338. else if((TmpVolt>=10.5)&&(TmpVolt<13.5))
  339. {
  340. //State A
  341. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=3)&&(TmpVolt<10.75))
  342. {
  343. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty>=5)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty<100))
  344. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=3;
  345. else
  346. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=2;
  347. }
  348. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==8)&&(TmpVolt>=13.25))
  349. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  350. else
  351. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=1;
  352. }
  353. else if((TmpVolt>=7.5)&&(TmpVolt<10.5))
  354. {
  355. //State B
  356. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==4)&&(TmpVolt<7.75))
  357. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=4;
  358. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==1)&&(TmpVolt>=10.25))
  359. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=1;
  360. else
  361. {
  362. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty>=5)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty<100))
  363. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=3;
  364. else
  365. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=2;
  366. }
  367. }
  368. else if((TmpVolt>=4.5)&&(TmpVolt<7.5))
  369. {
  370. //State C
  371. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==5)&&(TmpVolt<4.75))
  372. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=5;
  373. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState>=2)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState<=3)&&(TmpVolt>=7.25))
  374. {
  375. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty>=5)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotDuty<100))
  376. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=3;
  377. else
  378. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=2;
  379. }
  380. else
  381. {
  382. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=4;
  383. }
  384. }
  385. else if((TmpVolt>=1.5)&&(TmpVolt<4.5))
  386. {
  387. //State D
  388. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==6)&&(TmpVolt<1.75))
  389. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=6;
  390. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==4)&&(TmpVolt>=4.25))
  391. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=4;
  392. else
  393. {
  394. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=5;
  395. }
  396. }
  397. else if((TmpVolt>= -1.5)&&(TmpVolt<1.5))
  398. {
  399. //State E
  400. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==8)&&(TmpVolt< -1.25))
  401. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  402. else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==5)&&(TmpVolt>=1.25))
  403. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=5;
  404. else
  405. {
  406. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=6;
  407. }
  408. }
  409. else if((TmpVolt>= -13.5)&&(TmpVolt< -10.5))
  410. {
  411. //State F
  412. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==8)&&(TmpVolt>= -10.75))
  413. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=8;
  414. else
  415. {
  416. ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState=7;
  417. }
  418. }
  419. //ftime(&EndTime);
  420. //printf("duration:%d\n", DiffTimeb(StartTime, EndTime));
  421. }//while
  422. }
  423. int MmeProcess(unsigned char *Buffer, int DataLength)
  424. {
  425. //struct ethhdr *EthPacket;
  426. struct MmeHeader *MmePacket;
  427. int Rtn;
  428. static unsigned char counter;
  429. MmePacket = (struct MmeHeader *)Buffer;
  430. #ifdef Debug
  431. printf("\n***** Received MME Packet *****\n");
  432. printf("DataLength=%d\n",DataLength);
  433. printf("ODA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  434. MmePacket->ODA[0],MmePacket->ODA[1],MmePacket->ODA[2],MmePacket->ODA[3],MmePacket->ODA[4],MmePacket->ODA[5]);
  435. printf("OSA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  436. MmePacket->OSA[0],MmePacket->OSA[1],MmePacket->OSA[2],MmePacket->OSA[3],MmePacket->OSA[4],MmePacket->OSA[5]);
  437. printf("MTYPE: 0x%x\n", htons(MmePacket->MTYPE));
  438. printf("MMV: 0x%x\n", MmePacket->MMV);
  439. printf("MMTYPE: 0x%x\n", MmePacket->MMTYPE);
  440. printf("FMI 0x%x, 0x%x\n", MmePacket->FMI[0],MmePacket->FMI[1]);
  441. #endif
  442. //check if the destination address is broadcast or EVSE itself, it can be ignore if not belong to itself.
  443. switch(MmePacket->MMTYPE)
  444. {
  445. case MMTYPE_CM_SET_KEY_CNF:
  446. #ifdef Debug
  447. printf("--- MMTYPE_CM_SET_KEY_CNF ---\n");
  448. printf("Result: 0x%x\n", MmePacket->MMENTRY[0]);
  449. #endif
  450. V2gFlowStatus=CM_SET_KEY_CNF;
  451. break;
  452. case MMTYPE_CM_SLAC_PARM_REQ:
  453. #ifdef Debug
  454. printf("--- MMTYPE_CM_SLAC_PARM_REQ ---\n");
  455. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  456. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  457. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  458. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],
  459. MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9]);
  460. printf("CipherSuiteSetSize: 0x%x\n", MmePacket->MMENTRY[10]);
  461. printf("CipherSuite [1]: 0x%x,0x%x\n", MmePacket->MMENTRY[11], MmePacket->MMENTRY[12]);
  462. #endif
  463. V2gFlowStatus=CM_SLAC_PARM_REQ;
  464. memcpy(EvMac,MmePacket->OSA,sizeof(EvMac));
  465. memcpy(DestSocketAddress.sll_addr,MmePacket->OSA,sizeof(EvMac));
  466. memcpy(SlacRunId,MmePacket->MMENTRY+2,sizeof(SlacRunId));
  467. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  468. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  469. memcpy(SendMmePacket.OSA,CsuMac,6);
  470. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  471. SendMmePacket.MMV=MmePacket->MMV;
  472. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_PARM_CNF;
  473. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  474. SendMmePacketSize=0;
  475. memset(SendMmePacket.MMENTRY,0xFF,6); //Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  476. SendMmePacketSize+=6;
  477. SendMmePacket.MMENTRY[SendMmePacketSize++]=C_EV_match_MNBC;
  478. SendMmePacket.MMENTRY[SendMmePacketSize++]=TT_EVSE_match_MNBC;
  479. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01; //Fixed value indicating ¡§Other GP station¡¨, 0x00 ¡V HLE of the STA, 0x01 ¡V Another GP STA, 0x02 ¡V 0xFF ¡V Reserved
  480. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  481. SendMmePacketSize+=6;
  482. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value indicating ¡§PEVEVSEMatching¡¨
  483. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value indicating ¡§No Security¡¨
  484. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  485. SendMmePacketSize+=sizeof(SlacRunId);
  486. SendMmePacketSize+=19; //the size before MMENTRY
  487. V2gFlowStatus=CM_SLAC_PARM_CONF;
  488. Rtn=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  489. ftime(&SeqStartTime);
  490. counter=0;
  491. #ifdef Debug
  492. printf("\n***** Response MME Packet *****\n");
  493. printf("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  494. printf("SendMmePacket->ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  495. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  496. printf("SendMmePacket->OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  497. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  498. printf("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  499. printf("MMV: 0x%x\n", SendMmePacket.MMV);
  500. printf("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  501. printf("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  502. printf("--- CM_SLAC_PARM_CNF ---\n");
  503. printf("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  504. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  505. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  506. printf("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  507. printf("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  508. printf("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  509. printf("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  510. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  511. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  512. printf("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  513. printf("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  514. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  515. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  516. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  517. #endif
  518. break;
  519. case MMTYPE_CM_START_ATTEN_CHAR_IND:
  520. #ifdef Debug
  521. printf("--- MMTYPE_CM_START_ATTEN_CHAR_IND (counter : %d) ---\n",counter+1);
  522. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  523. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  524. printf("NUM_SOUNDS: 0x%x\n", MmePacket->MMENTRY[2]);
  525. printf("Time_Out 0x%x\n", MmePacket->MMENTRY[3]);
  526. printf("RESP_TYPE 0x%x\n", MmePacket->MMENTRY[4]);//Fixed value (0x01) indicating ¡§other Green PHY station¡¨
  527. printf("FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  528. MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],
  529. MmePacket->MMENTRY[9],MmePacket->MMENTRY[10]);
  530. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  531. MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],
  532. MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],MmePacket->MMENTRY[18]);
  533. #endif
  534. V2gFlowStatus=CM_START_ATTEN_CHAR_IND;
  535. counter++;
  536. if(counter==1)
  537. {
  538. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  539. memset(Aag,0,sizeof(Aag));
  540. }
  541. else if(counter>=3)
  542. {
  543. counter=0;
  544. }
  545. break;
  546. case MMTYPE_CM_MNBC_SOUND_IND:
  547. #ifdef Debug
  548. printf("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d) ---\n",counter+1);
  549. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  550. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  551. printf("SenderID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  552. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  553. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],
  554. MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],
  555. MmePacket->MMENTRY[14],MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],
  556. MmePacket->MMENTRY[18]);
  557. printf("Cnt: 0x%x\n", MmePacket->MMENTRY[19]);
  558. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  559. MmePacket->MMENTRY[20],MmePacket->MMENTRY[21],MmePacket->MMENTRY[22],MmePacket->MMENTRY[23],
  560. MmePacket->MMENTRY[24],MmePacket->MMENTRY[25],MmePacket->MMENTRY[26],MmePacket->MMENTRY[27]);
  561. printf("RSVD: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  562. MmePacket->MMENTRY[28],MmePacket->MMENTRY[29],MmePacket->MMENTRY[30],MmePacket->MMENTRY[31],
  563. MmePacket->MMENTRY[32],MmePacket->MMENTRY[33],MmePacket->MMENTRY[34],MmePacket->MMENTRY[35]);
  564. printf("Rnd: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  565. MmePacket->MMENTRY[36],MmePacket->MMENTRY[37],MmePacket->MMENTRY[38],MmePacket->MMENTRY[39],
  566. MmePacket->MMENTRY[40],MmePacket->MMENTRY[41],MmePacket->MMENTRY[42],MmePacket->MMENTRY[43],
  567. MmePacket->MMENTRY[44],MmePacket->MMENTRY[45],MmePacket->MMENTRY[46],MmePacket->MMENTRY[47],
  568. MmePacket->MMENTRY[48],MmePacket->MMENTRY[49],MmePacket->MMENTRY[50],MmePacket->MMENTRY[51]);
  569. #endif
  570. V2gFlowStatus=CM_MNBC_SOUND_IND;
  571. counter++;
  572. break;
  573. case MMTYPE_CM_ATTEN_PROFILE_IND:
  574. #ifdef Debug
  575. printf("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d) ---\n",counter+1);
  576. printf("EV MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
  577. MmePacket->MMENTRY[0],MmePacket->MMENTRY[1],MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],
  578. MmePacket->MMENTRY[4],MmePacket->MMENTRY[5]);
  579. printf("NumGroups: 0x%x\n", MmePacket->MMENTRY[6]);
  580. printf("RSVD: 0x%x\n", MmePacket->MMENTRY[7]);
  581. printf("AAG: \n");
  582. for(Rtn=0;Rtn<MmePacket->MMENTRY[6];Rtn++)
  583. printf("%02x, ",MmePacket->MMENTRY[8+Rtn]);
  584. printf("\n");
  585. #endif
  586. AagGroupsNum=MmePacket->MMENTRY[6];
  587. for(Rtn=0;Rtn<MmePacket->MMENTRY[6];Rtn++)
  588. Aag[Rtn]+=MmePacket->MMENTRY[8+Rtn];
  589. V2gFlowStatus=CM_MNBC_SOUND_IND;
  590. break;
  591. case MMTYPE_CM_ATTN_CHAR_RSP:
  592. #ifdef Debug
  593. printf("--- MMTYPE_CM_ATTN_CHAR_RSP ---\n");
  594. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  595. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  596. printf("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  597. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  598. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7]);
  599. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  600. MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],
  601. MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],MmePacket->MMENTRY[15]);
  602. printf("SOURCE_ID: \n");
  603. for(Rtn=0;Rtn<17;Rtn++)
  604. printf("%02x, ",MmePacket->MMENTRY[16+Rtn]);
  605. printf("\n");
  606. printf("RESP_ID: \n");
  607. for(Rtn=0;Rtn<17;Rtn++)
  608. printf("%02x, ",MmePacket->MMENTRY[33+Rtn]);
  609. printf("\n");
  610. printf("Result: 0x%x\n", MmePacket->MMENTRY[50]);//Fixed value of 0x00 indicates a successful SLAC process
  611. #endif
  612. V2gFlowStatus=CM_ATTEN_CHAR_RSP;
  613. ftime(&SeqStartTime);
  614. break;
  615. case MMTYPE_CM_VALIDATE_REQ:
  616. #ifdef Debug
  617. printf("--- MMTYPE_CM_VALIDATE_REQ ---\n");
  618. printf("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]);//Fixed value (0x00) to indicate ¡§PEV S2 toggles on control pilot line¡¨
  619. printf("Timer: 0x%x\n", MmePacket->MMENTRY[1]);//Fixed value In the first VALIDATE Request-Response exchange, the Timer field shall be set to zero.
  620. printf("Result: 0x%x\n", MmePacket->MMENTRY[2]);//Fixed value In the first VALIDATE Request-Response exchange, the Result field shall be set to 0x01 = ¡§ready¡¨.
  621. #endif
  622. counter=0;
  623. for(Rtn=0;Rtn<6;Rtn++)
  624. {
  625. if(MmePacket->ODA[Rtn]!=CsuMac[Rtn])
  626. {
  627. counter=1;
  628. break;
  629. }
  630. }
  631. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  632. memcpy(SendMmePacket.ODA,EvMac,6);
  633. memcpy(SendMmePacket.OSA,CsuMac,6);
  634. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  635. SendMmePacket.MMV=0x01;
  636. SendMmePacket.MMTYPE=MMTYPE_CM_VALIDATE_CNF;
  637. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  638. SendMmePacketSize=0;
  639. if(counter==0)
  640. {
  641. //First MMTYPE_CM_VALIDATE_REQ because Unicast
  642. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//Fixed value to indicate ¡§PEV S2 toggles on control pilot line¡¨
  643. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//Fixed value In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  644. #ifdef SupportBcbToggle
  645. SendMmePacket.MMENTRY[SendMmePacketSize++]=1;//0x01 = Ready
  646. #else
  647. SendMmePacket.MMENTRY[SendMmePacketSize++]=4;//0x04 = Not Required
  648. #endif
  649. }
  650. else
  651. {
  652. //second MMTYPE_CM_VALIDATE_REQ because Broadcast
  653. unsigned char PreStatus=3,ToggleNum=0;
  654. ftime(&SeqStartTime);
  655. while(1)
  656. {
  657. ftime(&SeqEndTime);
  658. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==4)&&(PreStatus==3))
  659. {
  660. ToggleNum++;
  661. PreStatus=4;
  662. }
  663. else
  664. {
  665. PreStatus=3;
  666. }
  667. if(DiffTimeb(SeqStartTime, SeqEndTime)>=(SendMmePacket.MMENTRY[1]*100+100))
  668. {
  669. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//Fixed value to indicate ¡§PEV S2 toggles on control pilot line¡¨
  670. SendMmePacket.MMENTRY[SendMmePacketSize++]= ToggleNum;
  671. #ifdef SupportBcbToggle
  672. SendMmePacket.MMENTRY[SendMmePacketSize++]=2;//0x02 = Success
  673. #else
  674. SendMmePacket.MMENTRY[SendMmePacketSize++]=4;//0x04 = Not Required
  675. #endif
  676. break;
  677. }
  678. }
  679. }
  680. SendMmePacketSize+=19; //the size before MMENTRY
  681. sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  682. V2gFlowStatus=CM_VALIDATE_CNF;
  683. ftime(&SeqStartTime);
  684. break;
  685. case MMTYPE_CM_SLAC_MATCH_REQ:
  686. #ifdef Debug
  687. printf("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
  688. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  689. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  690. printf("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]);//Fixed value (0x3E) for matching
  691. printf("PEV ID: \n");
  692. for(Rtn=0;Rtn<17;Rtn++)
  693. printf("%02x, ",MmePacket->MMENTRY[4+Rtn]);
  694. printf("\n");
  695. printf("PEV MAC: \n");
  696. for(Rtn=0;Rtn<6;Rtn++)
  697. printf("%02x, ",MmePacket->MMENTRY[21+Rtn]);
  698. printf("\n");
  699. printf("EVSE ID: \n");
  700. for(Rtn=0;Rtn<17;Rtn++)
  701. printf("%02x, ",MmePacket->MMENTRY[27+Rtn]);
  702. printf("\n");
  703. printf("EVSE MAC: \n");
  704. for(Rtn=0;Rtn<6;Rtn++)
  705. printf("%02x, ",MmePacket->MMENTRY[44+Rtn]);
  706. printf("\n");
  707. printf("RunID: \n");
  708. for(Rtn=0;Rtn<8;Rtn++)
  709. printf("%02x, ",MmePacket->MMENTRY[50+Rtn]);
  710. printf("\n");
  711. printf("RSVD: \n");
  712. for(Rtn=0;Rtn<8;Rtn++)
  713. printf("%02x, ",MmePacket->MMENTRY[58+Rtn]);
  714. printf("\n");
  715. #endif
  716. V2gFlowStatus=CM_SLAC_MATCH_REQ;
  717. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  718. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  719. memcpy(SendMmePacket.OSA,CsuMac,6);
  720. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  721. SendMmePacket.MMV=MmePacket->MMV;
  722. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_PARM_CNF;
  723. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  724. SendMmePacketSize=0;
  725. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//Fixed value (0x00) indicating ¡§PEV-EVSE matching¡¨
  726. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//Fixed value (0x00) indicating ¡§No Security¡¨
  727. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//Fixed value (0x0056) for matching
  728. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x56;//Fixed value (0x0056) for matching
  729. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17);//PEV ID
  730. SendMmePacketSize+=17;
  731. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  732. SendMmePacketSize+=6;
  733. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17);//EVSE ID
  734. SendMmePacketSize+=17;
  735. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,CsuMac,6);
  736. SendMmePacketSize+=6;
  737. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  738. SendMmePacketSize+=sizeof(SlacRunId);
  739. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,8);//RSVD
  740. SendMmePacketSize+=8;
  741. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));
  742. SendMmePacketSize+=sizeof(Nid);
  743. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//RSVD
  744. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));
  745. SendMmePacketSize+=sizeof(NewNmkKey);
  746. V2gFlowStatus=CM_SLAC_MATCH_CNF;
  747. Rtn=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  748. ftime(&SeqStartTime);
  749. default:
  750. break;
  751. }
  752. }
  753. int SendSetKey()
  754. {
  755. int i = 0;
  756. unsigned char nRandValue = 0x0;
  757. unsigned char ConstString[16]="PhihongKey000000";
  758. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  759. memcpy(SendMmePacket.ODA,QcaMac,6);
  760. memcpy(SendMmePacket.OSA,CsuMac,6);
  761. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  762. SendMmePacket.MMV=0x01;
  763. SendMmePacket.MMTYPE=MMTYPE_CM_SET_KEY_REQ;
  764. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  765. SendMmePacketSize=0;
  766. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//Fixed value (0x01) to indicate ¡§NMK¡¨
  767. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
  768. SendMmePacketSize+=4;
  769. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
  770. SendMmePacketSize+=4;
  771. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x04;//PID, Fixed value (0x04) to indicate ¡§HLE protocol¡¨
  772. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,2);//PRN, Fixed value(0x00), encrypted payload not used
  773. SendMmePacketSize+=2;
  774. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//PMN, Fixed value(0x00) encrypted payload not used
  775. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//CCo Capablility
  776. srand(time(NULL));
  777. for(i=10;i<16;i++)
  778. {
  779. nRandValue = (rand()%62)+1;
  780. if((nRandValue>=0)&&(nRandValue<=9)) // 0 ~ 9
  781. ConstString[i]= nRandValue + 0x30;
  782. else if((nRandValue>=10)&&(nRandValue<=35)) // A ~ Z
  783. ConstString[i]= nRandValue -10 + 0x41;
  784. else if((nRandValue>=36)&&(nRandValue<=61)) // a ~ z
  785. ConstString[i]= nRandValue -37 + 0x61;
  786. else
  787. ConstString[i]= 0x30;
  788. }
  789. memset(NewNmkKey,0,sizeof(NewNmkKey));
  790. memset(Nid,0,sizeof(Nid));
  791. HPAVKeyNMK(NewNmkKey,ConstString);
  792. HPAVKeyNID(Nid,NewNmkKey,DEFAULT_LEVEL);
  793. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));//NID, 54 LSBs contain the NID 2 MSBs = 0b00
  794. SendMmePacketSize+=sizeof(Nid);
  795. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate ¡§NMK¡¨
  796. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));//NewKey
  797. SendMmePacketSize+=sizeof(NewNmkKey);
  798. SendMmePacketSize+=19; //the size before MMENTRY
  799. V2gFlowStatus=CM_SET_KEY_REQ;
  800. i=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  801. #ifdef Debug
  802. printf("i=%d\n",i);
  803. #endif
  804. }
  805. int SlacComm()
  806. {
  807. int packet_size,count;
  808. if(RawSock>=0)
  809. {
  810. packet_size = recvfrom(RawSock , RecvBuffer , RecvBufferSize , 0 , NULL, NULL);
  811. #ifdef Debug
  812. printf("packet_size=%d\n",packet_size);
  813. #endif
  814. if(packet_size>0)
  815. {
  816. /*#ifdef Debug
  817. printf("Raw Data: ");
  818. for(count=0;count<packet_size;count++)
  819. printf("0x%x, ",RecvBuffer[count]);
  820. printf("\n");
  821. #endif*/
  822. MmeProcess(RecvBuffer, packet_size);
  823. }
  824. }
  825. switch(V2gFlowStatus)
  826. {
  827. case Idle:
  828. if(RawSock<0)
  829. {
  830. struct timeval tv;
  831. RawSock= socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
  832. #ifdef Debug
  833. printf("RawSock=%d\n",RawSock);
  834. #endif
  835. if(RawSock == -1)
  836. {
  837. #ifdef SystemLogMessage
  838. StoreLogMsg("[EvComm]SlacComm:Failed to create socke");
  839. #endif
  840. V2gFlowStatus=Other_Fault;
  841. return -1;
  842. }
  843. setsockopt(RawSock, SOL_SOCKET, SO_BINDTODEVICE,QcaInterface, 4);
  844. /*tv.tv_sec = 0;
  845. tv.tv_usec = 10000;
  846. if (setsockopt(RawSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  847. {
  848. #ifdef SystemLogMessage
  849. StoreLogMsg("[EvComm]SlacComm:Set SO_RCVTIMEO NG");
  850. #endif
  851. V2gFlowStatus=Other_Fault;
  852. return -1;
  853. }*/
  854. memset(&Req, 0, sizeof(struct ifreq));
  855. strcpy( (char*)Req.ifr_name, QcaInterface);
  856. if (ioctl(RawSock, SIOCGIFINDEX, &Req) < 0)
  857. {
  858. #ifdef SystemLogMessage
  859. StoreLogMsg("[EvComm]SlacComm: ioctl NG");
  860. #endif
  861. V2gFlowStatus=Other_Fault;
  862. return -1;
  863. }
  864. memset( &DestSocketAddress, 0, sizeof(struct sockaddr_ll) );
  865. //DestSocketAddress.sll_family = PF_PACKET;
  866. //DestSocketAddress.sll_protocol = 0;
  867. DestSocketAddress.sll_ifindex = Req.ifr_ifindex;
  868. DestSocketAddress.sll_halen = ETH_ALEN;
  869. //CM_SET_KEY_REQ
  870. SendSetKey();
  871. }
  872. else
  873. {
  874. if((time(NULL)-PwmStartTime)>TT_EVSE_SLAC_init)
  875. {
  876. #ifdef SystemLogMessage
  877. StoreLogMsg("[EvComm]SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init ");
  878. #endif
  879. V2gFlowStatus=Sequence_Timeout;
  880. return -1;
  881. }
  882. }
  883. break;
  884. case CM_SET_KEY_CNF:
  885. OutputCpPwmDuty(5);
  886. PwmStartTime=time(NULL);
  887. break;
  888. case CM_SLAC_PARM_CONF:
  889. ftime(&SeqEndTime);
  890. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_sequence)
  891. {
  892. #ifdef SystemLogMessage
  893. StoreLogMsg("[EvComm]SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence ");
  894. #endif
  895. V2gFlowStatus=Sequence_Timeout;
  896. return -1;
  897. }
  898. break;
  899. case CM_START_ATTEN_CHAR_IND:
  900. ftime(&SeqEndTime);
  901. if(DiffTimeb(SeqStartTime, SeqEndTime)>(3*TP_EV_batch_msg_interval))//one more time interval for tolerance
  902. {
  903. #ifdef SystemLogMessage
  904. StoreLogMsg("[EvComm]SlacComm: Wait CM_MNBC_SOUND_IND Timeout - 3*TP_EV_batch_msg_interval ");
  905. #endif
  906. V2gFlowStatus=Sequence_Timeout;
  907. return -1;
  908. }
  909. break;
  910. case CM_MNBC_SOUND_IND:
  911. ftime(&SeqEndTime);
  912. if(DiffTimeb(SeqStartTime, SeqEndTime)>(TT_EVSE_match_MNBC*100))
  913. {
  914. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  915. memcpy(SendMmePacket.ODA,EvMac,6);
  916. memcpy(SendMmePacket.OSA,CsuMac,6);
  917. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  918. SendMmePacket.MMV=0x01;
  919. SendMmePacket.MMTYPE=MMTYPE_CM_ATTN_CHAR_IND;
  920. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  921. SendMmePacketSize=0;
  922. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//APPLICATION_TYPE, Fixed value indicating ¡§PEVEVSE matching¡¨
  923. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//SECURITY_TYPE, Fixed value indicating ¡§No Security¡¨
  924. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);//SOURCE_ADDRESS, MAC address of the EV Host
  925. SendMmePacketSize+=6;
  926. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  927. SendMmePacketSize+=sizeof(SlacRunId);
  928. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17);//SOURCE_ID
  929. SendMmePacketSize+=17;
  930. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17);//RESP_ID
  931. SendMmePacketSize+=17;
  932. SendMmePacket.MMENTRY[SendMmePacketSize++]=C_EV_match_MNBC;//NumSounds
  933. for(count=0;count<AagGroupsNum;count++)
  934. SendMmePacket.MMENTRY[SendMmePacketSize++]=(Aag[count]/C_EV_match_MNBC)&0xFF;
  935. SendMmePacketSize+=19; //the size before MMENTRY
  936. V2gFlowStatus=CM_ATTEN_CHAR_IND;
  937. count=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  938. ftime(&SeqStartTime);
  939. }
  940. break;
  941. case CM_ATTEN_CHAR_IND:
  942. ftime(&SeqEndTime);
  943. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response)
  944. {
  945. #ifdef SystemLogMessage
  946. StoreLogMsg("[EvComm]SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response ");
  947. #endif
  948. V2gFlowStatus=Sequence_Timeout;
  949. return -1;
  950. }
  951. break;
  952. case CM_ATTEN_CHAR_RSP:
  953. ftime(&SeqEndTime);
  954. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_EVSE_match_session)
  955. {
  956. #ifdef SystemLogMessage
  957. StoreLogMsg("[EvComm]SlacComm: Wait CM_VALIDATE_REQ or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session ");
  958. #endif
  959. V2gFlowStatus=Sequence_Timeout;
  960. return -1;
  961. }
  962. break;
  963. case CM_VALIDATE_CNF:
  964. ftime(&SeqEndTime);
  965. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_sequence)
  966. {
  967. #ifdef SystemLogMessage
  968. StoreLogMsg("[EvComm]SlacComm: Wait CM_VALIDATE_CNF or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence ");
  969. #endif
  970. V2gFlowStatus=Sequence_Timeout;
  971. return -1;
  972. }
  973. break;
  974. case CM_SLAC_MATCH_CNF:
  975. ftime(&SeqEndTime);
  976. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_join)
  977. {
  978. #ifdef SystemLogMessage
  979. StoreLogMsg("[EvComm]SlacComm: Wait CM_VALIDATE_CNF or CM_SLAC_MATCH_REQ Timeout - TT_match_join ");
  980. #endif
  981. V2gFlowStatus=Sequence_Timeout;
  982. return -1;
  983. }
  984. break;
  985. defaudlt:
  986. break;
  987. }
  988. return 0;
  989. }
  990. int V2gComm()
  991. {
  992. return 0;
  993. }
  994. int main(int argc,char *argv[])
  995. {
  996. //Initialization
  997. InitShareMemory();
  998. //CreatShareMemory();
  999. //Qca7kPowerReset();
  1000. //PilotDetectionPid=0;
  1001. //PilotDetection();
  1002. GetEthMac("eth1",CsuMac);
  1003. GetEthMac(QcaInterface, QcaMac);
  1004. RecvBuffer=(unsigned char *)malloc(RecvBufferSize);
  1005. memset(RecvBuffer,0,RecvBufferSize);
  1006. SendBuffer=(unsigned char *)malloc(SendBufferSize);
  1007. memset(SendBuffer,0,SendBufferSize);
  1008. RawSock=-1;
  1009. V2gFlowStatus=0;
  1010. while(1)
  1011. {
  1012. SlacComm();
  1013. continue;
  1014. if((ShmInternalComm->ChargingPermission==0x01)&&(ConnectorPlugIn()==1))
  1015. {
  1016. if(V2gFlowStatus<=CM_AMP_MAP_CNF)
  1017. SlacComm();
  1018. else if(V2gFlowStatus<=Performance_Timeout)
  1019. V2gComm();
  1020. }
  1021. if(V2gFlowStatus>=Performance_Timeout)
  1022. {
  1023. //Normal Stop
  1024. //alarm and duty to 100%
  1025. goto ReSet;
  1026. }
  1027. else if((ConnectorPlugIn()==0)&&(V2gFlowStatus>Idle))
  1028. {
  1029. //Emergency stop
  1030. goto ReSet;
  1031. }
  1032. ReSet:
  1033. RawSock=-1;
  1034. V2gFlowStatus=0;
  1035. while(1)
  1036. {
  1037. //wait for CSU configrm
  1038. }
  1039. }//main while
  1040. }