EvComm.c 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552
  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,UdpSock,TcpSock;
  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, MnbcSoundNum,AttenProfileNum;
  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\n***********************************\n");
  432. printf("***** Received MME Packet *****\n");
  433. printf("***********************************\n");
  434. printf("DataLength=%d\n",DataLength);
  435. printf("ODA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  436. MmePacket->ODA[0],MmePacket->ODA[1],MmePacket->ODA[2],MmePacket->ODA[3],MmePacket->ODA[4],MmePacket->ODA[5]);
  437. printf("OSA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  438. MmePacket->OSA[0],MmePacket->OSA[1],MmePacket->OSA[2],MmePacket->OSA[3],MmePacket->OSA[4],MmePacket->OSA[5]);
  439. printf("MTYPE: 0x%x\n", htons(MmePacket->MTYPE));
  440. printf("MMV: 0x%x\n", MmePacket->MMV);
  441. printf("MMTYPE: 0x%x\n", MmePacket->MMTYPE);
  442. printf("FMI 0x%x, 0x%x\n", MmePacket->FMI[0],MmePacket->FMI[1]);
  443. #endif
  444. //check if the destination address is broadcast or EVSE itself, it can be ignore if not belong to itself.
  445. switch(MmePacket->MMTYPE)
  446. {
  447. case MMTYPE_CM_SET_KEY_CNF:
  448. #ifdef Debug
  449. printf("--- MMTYPE_CM_SET_KEY_CNF ---\n");
  450. printf("Result: 0x%x\n", MmePacket->MMENTRY[0]);
  451. #endif
  452. V2gFlowStatus=CM_SET_KEY_CNF;
  453. break;
  454. case MMTYPE_CM_SLAC_PARM_REQ:
  455. #ifdef Debug
  456. printf("--- MMTYPE_CM_SLAC_PARM_REQ ---\n");
  457. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  458. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  459. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  460. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],
  461. MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9]);
  462. printf("CipherSuiteSetSize: 0x%x\n", MmePacket->MMENTRY[10]);
  463. printf("CipherSuite [1]: 0x%x,0x%x\n", MmePacket->MMENTRY[11], MmePacket->MMENTRY[12]);
  464. #endif
  465. V2gFlowStatus=CM_SLAC_PARM_REQ;
  466. memcpy(EvMac,MmePacket->OSA,sizeof(EvMac));
  467. memcpy(DestSocketAddress.sll_addr,MmePacket->OSA,sizeof(EvMac));
  468. memcpy(SlacRunId,MmePacket->MMENTRY+2,sizeof(SlacRunId));
  469. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  470. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  471. memcpy(SendMmePacket.OSA,CsuMac,6);
  472. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  473. SendMmePacket.MMV=MmePacket->MMV;
  474. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_PARM_CNF;
  475. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  476. SendMmePacketSize=0;
  477. memset(SendMmePacket.MMENTRY,0xFF,6); //Fixed value indicating that M-Sounds to be sent as Ethernet broadcast
  478. SendMmePacketSize+=6;
  479. SendMmePacket.MMENTRY[SendMmePacketSize++]=C_EV_match_MNBC;
  480. SendMmePacket.MMENTRY[SendMmePacketSize++]=TT_EVSE_match_MNBC;
  481. 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
  482. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  483. SendMmePacketSize+=6;
  484. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value indicating ¡§PEVEVSEMatching¡¨
  485. SendMmePacket.MMENTRY[SendMmePacketSize++]=0; //Fixed value indicating ¡§No Security¡¨
  486. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  487. SendMmePacketSize+=sizeof(SlacRunId);
  488. SendMmePacketSize+=19; //the size before MMENTRY
  489. #ifdef Debug
  490. printf("\n\n***** Response MME Packet *****\n");
  491. printf("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  492. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  493. printf("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  494. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  495. printf("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  496. printf("MMV: 0x%x\n", SendMmePacket.MMV);
  497. printf("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  498. printf("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  499. printf("--- CM_SLAC_PARM_CNF ---\n");
  500. printf("M-SOUND_TARGET: %02x:%02x:%02x:%02x:%02x:%02x\n",
  501. SendMmePacket.MMENTRY[0],SendMmePacket.MMENTRY[1],SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],
  502. SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5]);
  503. printf("NUM_SOUNDS: 0x%x\n", SendMmePacket.MMENTRY[6]);
  504. printf("Time_Out: 0x%x\n", SendMmePacket.MMENTRY[7]);
  505. printf("RESP_TYPE: 0x%x\n", SendMmePacket.MMENTRY[8]);
  506. printf("M-FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  507. SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],SendMmePacket.MMENTRY[12],
  508. SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14]);
  509. printf("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[15]);
  510. printf("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[16]);
  511. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  512. SendMmePacket.MMENTRY[17],SendMmePacket.MMENTRY[18],SendMmePacket.MMENTRY[19],SendMmePacket.MMENTRY[20],
  513. SendMmePacket.MMENTRY[21],SendMmePacket.MMENTRY[22],SendMmePacket.MMENTRY[23],SendMmePacket.MMENTRY[24]);
  514. #endif
  515. V2gFlowStatus=CM_SLAC_PARM_CONF;
  516. Rtn=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  517. #ifdef Debug
  518. printf("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  519. #endif
  520. ftime(&SeqStartTime);
  521. counter=0;
  522. break;
  523. case MMTYPE_CM_START_ATTEN_CHAR_IND:
  524. #ifdef Debug
  525. printf("--- MMTYPE_CM_START_ATTEN_CHAR_IND (counter : %d/3 ) ---\n",counter+1);
  526. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  527. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  528. printf("NUM_SOUNDS: 0x%x\n", MmePacket->MMENTRY[2]);
  529. MnbcSoundNum=MmePacket->MMENTRY[2];
  530. printf("Time_Out 0x%x\n", MmePacket->MMENTRY[3]);
  531. printf("RESP_TYPE 0x%x\n", MmePacket->MMENTRY[4]);//Fixed value (0x01) indicating ¡§other Green PHY station¡¨
  532. printf("FORWARDING_STA: %02x:%02x:%02x:%02x:%02x:%02x\n",
  533. MmePacket->MMENTRY[5],MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],
  534. MmePacket->MMENTRY[9],MmePacket->MMENTRY[10]);
  535. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  536. MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],
  537. MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],MmePacket->MMENTRY[18]);
  538. #endif
  539. V2gFlowStatus=CM_START_ATTEN_CHAR_IND;
  540. counter++;
  541. if(counter==1)
  542. {
  543. memset(Aag,0,sizeof(Aag));
  544. AttenProfileNum=0;
  545. ftime(&SeqStartTime); //start TT_EVSE_match_MNBC
  546. }
  547. else if(counter>=3)
  548. {
  549. counter=0;
  550. }
  551. break;
  552. case MMTYPE_CM_MNBC_SOUND_IND:
  553. if(V2gFlowStatus>=CM_ATTEN_CHAR_IND)
  554. break;
  555. #ifdef Debug
  556. printf("--- MMTYPE_CM_MNBC_SOUND_IND (counter : %d/%d) ---\n",counter+1,MnbcSoundNum);
  557. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  558. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  559. printf("SenderID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  560. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  561. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7],MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],
  562. MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],
  563. MmePacket->MMENTRY[14],MmePacket->MMENTRY[15],MmePacket->MMENTRY[16],MmePacket->MMENTRY[17],
  564. MmePacket->MMENTRY[18]);
  565. printf("Cnt: 0x%x\n", MmePacket->MMENTRY[19]);
  566. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  567. MmePacket->MMENTRY[20],MmePacket->MMENTRY[21],MmePacket->MMENTRY[22],MmePacket->MMENTRY[23],
  568. MmePacket->MMENTRY[24],MmePacket->MMENTRY[25],MmePacket->MMENTRY[26],MmePacket->MMENTRY[27]);
  569. printf("RSVD: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  570. MmePacket->MMENTRY[28],MmePacket->MMENTRY[29],MmePacket->MMENTRY[30],MmePacket->MMENTRY[31],
  571. MmePacket->MMENTRY[32],MmePacket->MMENTRY[33],MmePacket->MMENTRY[34],MmePacket->MMENTRY[35]);
  572. printf("Rnd: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  573. MmePacket->MMENTRY[36],MmePacket->MMENTRY[37],MmePacket->MMENTRY[38],MmePacket->MMENTRY[39],
  574. MmePacket->MMENTRY[40],MmePacket->MMENTRY[41],MmePacket->MMENTRY[42],MmePacket->MMENTRY[43],
  575. MmePacket->MMENTRY[44],MmePacket->MMENTRY[45],MmePacket->MMENTRY[46],MmePacket->MMENTRY[47],
  576. MmePacket->MMENTRY[48],MmePacket->MMENTRY[49],MmePacket->MMENTRY[50],MmePacket->MMENTRY[51]);
  577. #endif
  578. V2gFlowStatus=CM_MNBC_SOUND_IND;
  579. counter++;
  580. break;
  581. case MMTYPE_CM_ATTEN_PROFILE_IND:
  582. if(V2gFlowStatus>=CM_ATTEN_CHAR_IND)
  583. break;
  584. #ifdef Debug
  585. printf("--- MMTYPE_CM_ATTEN_PROFILE_IND (counter : %d/%d) ---\n",counter,MnbcSoundNum);
  586. printf("EV MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
  587. MmePacket->MMENTRY[0],MmePacket->MMENTRY[1],MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],
  588. MmePacket->MMENTRY[4],MmePacket->MMENTRY[5]);
  589. printf("NumGroups: 0x%x\n", MmePacket->MMENTRY[6]);
  590. printf("RSVD: 0x%x\n", MmePacket->MMENTRY[7]);
  591. printf("AAG: \n");
  592. for(Rtn=0;Rtn<MmePacket->MMENTRY[6];Rtn++)
  593. printf("%02x, ",MmePacket->MMENTRY[8+Rtn]);
  594. printf("\n");
  595. #endif
  596. AagGroupsNum=MmePacket->MMENTRY[6];
  597. for(Rtn=0;Rtn<MmePacket->MMENTRY[6];Rtn++)
  598. Aag[Rtn]+=MmePacket->MMENTRY[8+Rtn];
  599. AttenProfileNum++;
  600. V2gFlowStatus=CM_MNBC_SOUND_IND;
  601. break;
  602. case MMTYPE_CM_ATTN_CHAR_RSP:
  603. #ifdef Debug
  604. printf("--- MMTYPE_CM_ATTN_CHAR_RSP ---\n");
  605. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  606. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  607. printf("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  608. MmePacket->MMENTRY[2],MmePacket->MMENTRY[3],MmePacket->MMENTRY[4],MmePacket->MMENTRY[5],
  609. MmePacket->MMENTRY[6],MmePacket->MMENTRY[7]);
  610. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  611. MmePacket->MMENTRY[8],MmePacket->MMENTRY[9],MmePacket->MMENTRY[10],MmePacket->MMENTRY[11],
  612. MmePacket->MMENTRY[12],MmePacket->MMENTRY[13],MmePacket->MMENTRY[14],MmePacket->MMENTRY[15]);
  613. printf("SOURCE_ID: \n");
  614. for(Rtn=0;Rtn<17;Rtn++)
  615. printf("%02x, ",MmePacket->MMENTRY[16+Rtn]);
  616. printf("\n");
  617. printf("RESP_ID: \n");
  618. for(Rtn=0;Rtn<17;Rtn++)
  619. printf("%02x, ",MmePacket->MMENTRY[33+Rtn]);
  620. printf("\n");
  621. printf("Result: 0x%x\n", MmePacket->MMENTRY[50]);//Fixed value of 0x00 indicates a successful SLAC process
  622. #endif
  623. V2gFlowStatus=CM_ATTEN_CHAR_RSP;
  624. ftime(&SeqStartTime);
  625. break;
  626. case MMTYPE_CM_VALIDATE_REQ:
  627. #ifdef Debug
  628. printf("--- MMTYPE_CM_VALIDATE_REQ ---\n");
  629. printf("Signal Type: 0x%x\n", MmePacket->MMENTRY[0]);//Fixed value (0x00) to indicate ¡§PEV S2 toggles on control pilot line¡¨
  630. 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.
  631. 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¡¨.
  632. #endif
  633. counter=0;
  634. for(Rtn=0;Rtn<6;Rtn++)
  635. {
  636. if(MmePacket->ODA[Rtn]!=CsuMac[Rtn])
  637. {
  638. counter=1;
  639. break;
  640. }
  641. }
  642. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  643. memcpy(SendMmePacket.ODA,EvMac,6);
  644. memcpy(SendMmePacket.OSA,CsuMac,6);
  645. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  646. SendMmePacket.MMV=0x01;
  647. SendMmePacket.MMTYPE=MMTYPE_CM_VALIDATE_CNF;
  648. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  649. SendMmePacketSize=0;
  650. if(counter==0)
  651. {
  652. //First MMTYPE_CM_VALIDATE_REQ because Unicast
  653. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//Fixed value to indicate ¡§PEV S2 toggles on control pilot line¡¨
  654. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//Fixed value In the first VALIDATE Request-Response exchange, the ToggleNum field shall be set to zero.
  655. #ifdef SupportBcbToggle
  656. SendMmePacket.MMENTRY[SendMmePacketSize++]=1;//0x01 = Ready
  657. #else
  658. SendMmePacket.MMENTRY[SendMmePacketSize++]=4;//0x04 = Not Required
  659. #endif
  660. }
  661. else
  662. {
  663. //second MMTYPE_CM_VALIDATE_REQ because Broadcast
  664. unsigned char PreStatus=3,ToggleNum=0;
  665. ftime(&SeqStartTime);
  666. while(1)
  667. {
  668. ftime(&SeqEndTime);
  669. if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[0].PilotState==4)&&(PreStatus==3))
  670. {
  671. ToggleNum++;
  672. PreStatus=4;
  673. }
  674. else
  675. {
  676. PreStatus=3;
  677. }
  678. if(DiffTimeb(SeqStartTime, SeqEndTime)>=(SendMmePacket.MMENTRY[1]*100+100))
  679. {
  680. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//Fixed value to indicate ¡§PEV S2 toggles on control pilot line¡¨
  681. SendMmePacket.MMENTRY[SendMmePacketSize++]= ToggleNum;
  682. #ifdef SupportBcbToggle
  683. SendMmePacket.MMENTRY[SendMmePacketSize++]=2;//0x02 = Success
  684. #else
  685. SendMmePacket.MMENTRY[SendMmePacketSize++]=4;//0x04 = Not Required
  686. #endif
  687. break;
  688. }
  689. }
  690. }
  691. SendMmePacketSize+=19; //the size before MMENTRY
  692. sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  693. V2gFlowStatus=CM_VALIDATE_CNF;
  694. ftime(&SeqStartTime);
  695. break;
  696. case MMTYPE_CM_SLAC_MATCH_REQ:
  697. #ifdef Debug
  698. printf("--- MMTYPE_CM_SLAC_MATCH_REQ ---\n");
  699. printf("APPLICATION_TYPE: 0x%x\n", MmePacket->MMENTRY[0]);
  700. printf("SECURITY_TYPE: 0x%x\n", MmePacket->MMENTRY[1]);
  701. printf("MVFLength: 0x%x, 0x%x\n", MmePacket->MMENTRY[2],MmePacket->MMENTRY[3]);//Fixed value (0x3E) for matching
  702. printf("PEV ID: \n");
  703. for(Rtn=0;Rtn<17;Rtn++)
  704. printf("%02x, ",MmePacket->MMENTRY[4+Rtn]);
  705. printf("\n");
  706. printf("PEV MAC: \n");
  707. for(Rtn=0;Rtn<6;Rtn++)
  708. printf("%02x, ",MmePacket->MMENTRY[21+Rtn]);
  709. printf("\n");
  710. printf("EVSE ID: \n");
  711. for(Rtn=0;Rtn<17;Rtn++)
  712. printf("%02x, ",MmePacket->MMENTRY[27+Rtn]);
  713. printf("\n");
  714. printf("EVSE MAC: \n");
  715. for(Rtn=0;Rtn<6;Rtn++)
  716. printf("%02x, ",MmePacket->MMENTRY[44+Rtn]);
  717. printf("\n");
  718. printf("RunID: \n");
  719. for(Rtn=0;Rtn<8;Rtn++)
  720. printf("%02x, ",MmePacket->MMENTRY[50+Rtn]);
  721. printf("\n");
  722. printf("RSVD: \n");
  723. for(Rtn=0;Rtn<8;Rtn++)
  724. printf("%02x, ",MmePacket->MMENTRY[58+Rtn]);
  725. printf("\n");
  726. #endif
  727. V2gFlowStatus=CM_SLAC_MATCH_REQ;
  728. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  729. memcpy(SendMmePacket.ODA,MmePacket->OSA,6);
  730. memcpy(SendMmePacket.OSA,CsuMac,6);
  731. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  732. SendMmePacket.MMV=MmePacket->MMV;
  733. SendMmePacket.MMTYPE=MMTYPE_CM_SLAC_MATCH_CNF;
  734. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  735. SendMmePacketSize=0;
  736. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//Fixed value (0x00) indicating ¡§PEV-EVSE matching¡¨
  737. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//Fixed value (0x00) indicating ¡§No Security¡¨
  738. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//Fixed value (0x0056) for matching
  739. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x56;//Fixed value (0x0056) for matching
  740. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17);//PEV ID
  741. SendMmePacketSize+=17;
  742. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);
  743. SendMmePacketSize+=6;
  744. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17);//EVSE ID
  745. SendMmePacketSize+=17;
  746. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,CsuMac,6);
  747. SendMmePacketSize+=6;
  748. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  749. SendMmePacketSize+=sizeof(SlacRunId);
  750. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,8);//RSVD
  751. SendMmePacketSize+=8;
  752. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));
  753. SendMmePacketSize+=sizeof(Nid);
  754. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//RSVD
  755. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));
  756. SendMmePacketSize+=sizeof(NewNmkKey);
  757. SendMmePacketSize+=19; //the size before MMENTRY
  758. #ifdef Debug
  759. printf("\n\n***** Response MME Packet *****\n");
  760. printf("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  761. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  762. printf("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  763. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  764. printf("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  765. printf("MMV: 0x%x\n", SendMmePacket.MMV);
  766. printf("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  767. printf("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  768. printf("--- CM_SLAC_MATCH_CNF ---\n");
  769. printf("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  770. printf("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  771. printf("MVFLength: 0x%x, 0x%x\n", SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3]);
  772. printf("PEV ID: \n");
  773. for(Rtn=0;Rtn<17;Rtn++)
  774. printf("%02x, ",SendMmePacket.MMENTRY[4+Rtn]);
  775. printf("\n");
  776. printf("PEV MAC: \n");
  777. for(Rtn=0;Rtn<6;Rtn++)
  778. printf("%02x, ",SendMmePacket.MMENTRY[21+Rtn]);
  779. printf("\n");
  780. printf("EVSE ID: \n");
  781. for(Rtn=0;Rtn<17;Rtn++)
  782. printf("%02x, ",SendMmePacket.MMENTRY[27+Rtn]);
  783. printf("\n");
  784. printf("EVSE MAC: \n");
  785. for(Rtn=0;Rtn<6;Rtn++)
  786. printf("%02x, ",SendMmePacket.MMENTRY[44+Rtn]);
  787. printf("\n");
  788. printf("RunID: \n");
  789. for(Rtn=0;Rtn<8;Rtn++)
  790. printf("%02x, ",SendMmePacket.MMENTRY[50+Rtn]);
  791. printf("\n");
  792. printf("RSVD: \n");
  793. for(Rtn=0;Rtn<8;Rtn++)
  794. printf("%02x, ",SendMmePacket.MMENTRY[58+Rtn]);
  795. printf("\n");
  796. printf("NID: \n");
  797. for(Rtn=0;Rtn<7;Rtn++)
  798. printf("%02x, ",SendMmePacket.MMENTRY[66+Rtn]);
  799. printf("\n");
  800. printf("RSVD: 0x%x\n", SendMmePacket.MMENTRY[73]);
  801. printf("NMK: \n");
  802. for(Rtn=0;Rtn<16;Rtn++)
  803. printf("%02x, ",SendMmePacket.MMENTRY[74+Rtn]);
  804. printf("\n");
  805. #endif
  806. V2gFlowStatus=CM_SLAC_MATCH_CNF;
  807. Rtn=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  808. #ifdef Debug
  809. printf("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,Rtn);
  810. #endif
  811. ftime(&SeqStartTime);
  812. break;
  813. case MMTYPE_VENDOR_VS_HOST_ACTION:
  814. {
  815. struct QcaVendorMmeHeader *RecvPacket;
  816. RecvPacket = (struct QcaVendorMmeHeader *)Buffer;
  817. //#ifdef Debug
  818. printf("--- MMTYPE_VENDOR_VS_HOST_ACTION ---\n");
  819. //#endif
  820. switch (RecvPacket->MBODY[0])
  821. {
  822. case 0x00:
  823. //Loader (Device Softloader or Bootloader) ready
  824. printf("QCA7K: Loader Ready\n");
  825. break;
  826. case 0x01:
  827. //Firmware Upgrade Ready
  828. printf("QCA7K: Firmware Upgrade Ready\n");
  829. break;
  830. case 0x02:
  831. //PIB Update Ready
  832. printf("QCA7K: PIB Update Ready\n");
  833. break;
  834. case 0x03:
  835. //Firmware Upgrade and PIB Update ready
  836. printf("QCA7K: Firmware Upgrade and PIB Update ready\n");
  837. break;
  838. case 0x04:
  839. //Loader (Bootloader) ready to receive SDRAM configuration.
  840. printf("QCA7K: Loader ready to receive SDRAM configuration\n");
  841. break;
  842. case 0x05:
  843. //Reset to Factory Defaults.
  844. printf("QCA7K: Reset to Factory Defaults\n");
  845. break;
  846. default:
  847. //Reserved
  848. printf("QCA7K: Reserved\n");
  849. break;
  850. }
  851. }
  852. break;
  853. case MMTYPE_VENDOR_ATTEN_CHAR:
  854. #ifdef Debug
  855. printf("--- MMTYPE_VENDOR_ATTEN_CHAR ---\n");
  856. #endif
  857. break;
  858. case MMTYPE_VENDOR_VS_NW_INFO_CNF:
  859. memcpy(QcaMac,MmePacket->OSA,6);
  860. #ifdef Debug
  861. printf("--- MMTYPE_VENDOR_VS_NW_INFO_CNF ---\n");
  862. printf("QcaMac: %02x:%02x:%02x:%02x:%02x:%02x\n",
  863. QcaMac[0],QcaMac[1],QcaMac[2],QcaMac[3],QcaMac[4],QcaMac[5]);
  864. #endif
  865. V2gFlowStatus=CM_SET_KEY_REQ;
  866. default:
  867. break;
  868. }
  869. }
  870. int SendSetKey()
  871. {
  872. int i = 0;
  873. unsigned char nRandValue = 0x0;
  874. unsigned char ConstString[16]="PhihongKey000000";
  875. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  876. memcpy(SendMmePacket.ODA,QcaMac,6);
  877. memcpy(SendMmePacket.OSA,CsuMac,6);
  878. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  879. SendMmePacket.MMV=0x01;
  880. SendMmePacket.MMTYPE=MMTYPE_CM_SET_KEY_REQ;
  881. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  882. SendMmePacketSize=0;
  883. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//Fixed value (0x01) to indicate ¡§NMK¡¨
  884. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//My Nonce, Fixed value(0x00000000), encrypted payload not used
  885. SendMmePacketSize+=4;
  886. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,4);//Your Nonce, Fixed value(0x00000000), encrypted payload not used
  887. SendMmePacketSize+=4;
  888. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x04;//PID, Fixed value (0x04) to indicate ¡§HLE protocol¡¨
  889. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,2);//PRN, Fixed value(0x00), encrypted payload not used
  890. SendMmePacketSize+=2;
  891. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x00;//PMN, Fixed value(0x00) encrypted payload not used
  892. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//CCo Capablility
  893. srand(time(NULL));
  894. for(i=10;i<16;i++)
  895. {
  896. nRandValue = (rand()%62)+1;
  897. if((nRandValue>=0)&&(nRandValue<=9)) // 0 ~ 9
  898. ConstString[i]= nRandValue + 0x30;
  899. else if((nRandValue>=10)&&(nRandValue<=35)) // A ~ Z
  900. ConstString[i]= nRandValue -10 + 0x41;
  901. else if((nRandValue>=36)&&(nRandValue<=61)) // a ~ z
  902. ConstString[i]= nRandValue -37 + 0x61;
  903. else
  904. ConstString[i]= 0x30;
  905. }
  906. memset(NewNmkKey,0,sizeof(NewNmkKey));
  907. memset(Nid,0,sizeof(Nid));
  908. HPAVKeyNMK(NewNmkKey,ConstString);
  909. HPAVKeyNID(Nid,NewNmkKey,DEFAULT_LEVEL);
  910. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,Nid,sizeof(Nid));//NID, 54 LSBs contain the NID 2 MSBs = 0b00
  911. SendMmePacketSize+=sizeof(Nid);
  912. SendMmePacket.MMENTRY[SendMmePacketSize++]=0x01;//NewEKS,Fixed value (0x01)to indicate ¡§NMK¡¨
  913. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,NewNmkKey,sizeof(NewNmkKey));//NewKey
  914. SendMmePacketSize+=sizeof(NewNmkKey);
  915. SendMmePacketSize+=19; //the size before MMENTRY
  916. V2gFlowStatus=CM_SET_KEY_REQ;
  917. i=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  918. #ifdef Debug
  919. printf("SendSetKey: send size =%d\n",i);
  920. #endif
  921. }
  922. int GetQca7kMac()
  923. {
  924. int i = 0;
  925. struct QcaVendorMmeHeader SendPacket;
  926. memset(&SendPacket,0,sizeof(struct QcaVendorMmeHeader));
  927. memset(SendPacket.ODA, 0xFF, 6);
  928. memcpy(SendPacket.OSA,CsuMac,6);
  929. SendPacket.MTYPE=htons(EtherType_HomePlug);
  930. SendPacket.MMV=0x00;
  931. SendPacket.MMTYPE=MMTYPE_VENDOR_VS_NW_INFO;
  932. SendPacket.OUI[0]=0x00;
  933. SendPacket.OUI[1]=0xB0;
  934. SendPacket.OUI[2]=0x52;
  935. i=sendto(RawSock, &SendPacket, 20, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  936. #ifdef Debug
  937. printf("GetQca7kMac: send size =%d\n",i);
  938. #endif
  939. }
  940. int SlacComm()
  941. {
  942. int packet_size,count;
  943. static unsigned int STime;
  944. if(RawSock>=0)
  945. {
  946. memset(RecvBuffer,0,RecvBufferSize);
  947. packet_size = recvfrom(RawSock , RecvBuffer , RecvBufferSize , 0 , NULL, NULL);
  948. if(packet_size>0)
  949. {
  950. /*#ifdef Debug
  951. printf("Raw Data: ");
  952. for(count=0;count<packet_size;count++)
  953. printf("0x%x, ",RecvBuffer[count]);
  954. printf("\n");
  955. #endif*/
  956. MmeProcess(RecvBuffer, packet_size);
  957. }
  958. }
  959. switch(V2gFlowStatus)
  960. {
  961. case Idle:
  962. if(RawSock<0)
  963. {
  964. struct timeval tv;
  965. RawSock= socket(PF_PACKET, SOCK_RAW, htons(EtherType_HomePlug));
  966. #ifdef Debug
  967. printf("RawSock=%d\n",RawSock);
  968. #endif
  969. if(RawSock == -1)
  970. {
  971. #ifdef SystemLogMessage
  972. StoreLogMsg("[EvComm]SlacComm:Failed to create socke");
  973. #endif
  974. V2gFlowStatus=Other_Fault;
  975. return -1;
  976. }
  977. setsockopt(RawSock, SOL_SOCKET, SO_BINDTODEVICE,QcaInterface, 4);
  978. /*tv.tv_sec = 0;
  979. tv.tv_usec = 10000;
  980. if (setsockopt(RawSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
  981. {
  982. #ifdef SystemLogMessage
  983. StoreLogMsg("[EvComm]SlacComm:Set SO_RCVTIMEO NG");
  984. #endif
  985. V2gFlowStatus=Other_Fault;
  986. return -1;
  987. }*/
  988. memset(&Req, 0, sizeof(struct ifreq));
  989. strcpy( (char*)Req.ifr_name, QcaInterface);
  990. if (ioctl(RawSock, SIOCGIFINDEX, &Req) < 0)
  991. {
  992. #ifdef SystemLogMessage
  993. StoreLogMsg("[EvComm]SlacComm: ioctl NG");
  994. #endif
  995. V2gFlowStatus=Other_Fault;
  996. return -1;
  997. }
  998. memset( &DestSocketAddress, 0, sizeof(struct sockaddr_ll) );
  999. DestSocketAddress.sll_ifindex = Req.ifr_ifindex;
  1000. DestSocketAddress.sll_halen = ETH_ALEN;
  1001. //Get QCA7K MAC address
  1002. GetQca7kMac();
  1003. PwmStartTime=0;
  1004. count=0;
  1005. STime=time(NULL);
  1006. }
  1007. else
  1008. {
  1009. if((time(NULL)-STime)>=3)
  1010. {
  1011. if((count++) >=3)
  1012. V2gFlowStatus=Sequence_Timeout;
  1013. else
  1014. {
  1015. GetQca7kMac();
  1016. STime=time(NULL);
  1017. }
  1018. }
  1019. }
  1020. break;
  1021. case CM_SET_KEY_REQ:
  1022. //CM_SET_KEY_REQ
  1023. SendSetKey();
  1024. break;
  1025. case CM_SET_KEY_CNF:
  1026. OutputCpPwmDuty(5);
  1027. if(PwmStartTime<=0)
  1028. PwmStartTime=time(NULL);
  1029. else
  1030. {
  1031. if((time(NULL)-PwmStartTime)>TT_EVSE_SLAC_init)
  1032. {
  1033. #ifdef SystemLogMessage
  1034. StoreLogMsg("[EvComm]SlacComm: Wait CM_SLAC_PARM_REQ Timeout - TT_EVSE_SLAC_init ");
  1035. #endif
  1036. V2gFlowStatus=Sequence_Timeout;
  1037. return -1;
  1038. }
  1039. }
  1040. break;
  1041. case CM_SLAC_PARM_CONF:
  1042. ftime(&SeqEndTime);
  1043. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_sequence)
  1044. {
  1045. #ifdef SystemLogMessage
  1046. StoreLogMsg("[EvComm]SlacComm: Wait CM_START_ATTEN_CHAR_IND Timeout - TT_match_sequence ");
  1047. #endif
  1048. V2gFlowStatus=Sequence_Timeout;
  1049. return -1;
  1050. }
  1051. break;
  1052. case CM_START_ATTEN_CHAR_IND:
  1053. ftime(&SeqEndTime);
  1054. if(DiffTimeb(SeqStartTime, SeqEndTime)>(3*TP_EV_batch_msg_interval))//one more time interval for tolerance
  1055. {
  1056. #ifdef SystemLogMessage
  1057. StoreLogMsg("[EvComm]SlacComm: Wait CM_MNBC_SOUND_IND Timeout - 3*TP_EV_batch_msg_interval ");
  1058. #endif
  1059. V2gFlowStatus=Sequence_Timeout;
  1060. return -1;
  1061. }
  1062. break;
  1063. case CM_MNBC_SOUND_IND:
  1064. ftime(&SeqEndTime);
  1065. if(DiffTimeb(SeqStartTime, SeqEndTime)>(TT_EVSE_match_MNBC*100))
  1066. {
  1067. memset(&SendMmePacket,0,sizeof(struct MmeHeader));
  1068. memcpy(SendMmePacket.ODA,EvMac,6);
  1069. memcpy(SendMmePacket.OSA,CsuMac,6);
  1070. SendMmePacket.MTYPE=htons(EtherType_HomePlug);
  1071. SendMmePacket.MMV=0x01;
  1072. SendMmePacket.MMTYPE=MMTYPE_CM_ATTN_CHAR_IND;
  1073. SendMmePacket.FMI[0]=SendMmePacket.FMI[1]=0;
  1074. SendMmePacketSize=0;
  1075. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//APPLICATION_TYPE, Fixed value indicating ¡§PEVEVSE matching¡¨
  1076. SendMmePacket.MMENTRY[SendMmePacketSize++]=0;//SECURITY_TYPE, Fixed value indicating ¡§No Security¡¨
  1077. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,EvMac,6);//SOURCE_ADDRESS, MAC address of the EV Host
  1078. SendMmePacketSize+=6;
  1079. memcpy(SendMmePacket.MMENTRY+SendMmePacketSize,SlacRunId,sizeof(SlacRunId));
  1080. SendMmePacketSize+=sizeof(SlacRunId);
  1081. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17);//SOURCE_ID
  1082. SendMmePacketSize+=17;
  1083. memset(SendMmePacket.MMENTRY+SendMmePacketSize,0,17);//RESP_ID
  1084. SendMmePacketSize+=17;
  1085. SendMmePacket.MMENTRY[SendMmePacketSize++]=AttenProfileNum;//NumSounds
  1086. for(count=0;count<AagGroupsNum;count++)
  1087. SendMmePacket.MMENTRY[SendMmePacketSize++]=(Aag[count]/AttenProfileNum)&0xFF;
  1088. SendMmePacketSize+=19; //the size before MMENTRY
  1089. #ifdef Debug
  1090. printf("\n\n***** Send MME Packet *****\n");
  1091. printf("SendMmePacket.ODA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  1092. SendMmePacket.ODA[0],SendMmePacket.ODA[1],SendMmePacket.ODA[2],SendMmePacket.ODA[3],SendMmePacket.ODA[4],SendMmePacket.ODA[5]);
  1093. printf("SendMmePacket.OSA: %02x:%02x:%02x:%02x:%02x:%02x:\n",
  1094. SendMmePacket.OSA[0],SendMmePacket.OSA[1],SendMmePacket.OSA[2],SendMmePacket.OSA[3],SendMmePacket.OSA[4],SendMmePacket.OSA[5]);
  1095. printf("MTYPE: 0x%x\n", htons(SendMmePacket.MTYPE));
  1096. printf("MMV: 0x%x\n", SendMmePacket.MMV);
  1097. printf("MMTYPE: 0x%x\n", SendMmePacket.MMTYPE);
  1098. printf("FMI 0x%x, 0x%x\n", SendMmePacket.FMI[0],SendMmePacket.FMI[1]);
  1099. printf("--- CM_ATTEN_CHAR_IND ---\n");
  1100. printf("APPLICATION_TYPE: 0x%x\n", SendMmePacket.MMENTRY[0]);
  1101. printf("SECURITY_TYPE: 0x%x\n", SendMmePacket.MMENTRY[1]);
  1102. printf("SOURCE_ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
  1103. SendMmePacket.MMENTRY[2],SendMmePacket.MMENTRY[3],SendMmePacket.MMENTRY[4],SendMmePacket.MMENTRY[5],
  1104. SendMmePacket.MMENTRY[6],SendMmePacket.MMENTRY[7]);
  1105. printf("RunID: %02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x\n",
  1106. SendMmePacket.MMENTRY[8],SendMmePacket.MMENTRY[9],SendMmePacket.MMENTRY[10],SendMmePacket.MMENTRY[11],
  1107. SendMmePacket.MMENTRY[12],SendMmePacket.MMENTRY[13],SendMmePacket.MMENTRY[14],SendMmePacket.MMENTRY[15]);
  1108. printf("SOURCE_ID: \n");
  1109. for(count=0;count<17;count++)
  1110. printf("%02x, ",SendMmePacket.MMENTRY[16+count]);
  1111. printf("\n");
  1112. printf("RESP_ID: \n");
  1113. for(count=0;count<17;count++)
  1114. printf("%02x, ",SendMmePacket.MMENTRY[33+count]);
  1115. printf("\n");
  1116. printf("NumSounds: 0x%x\n", SendMmePacket.MMENTRY[50]);
  1117. printf("ATTEN_PROFILE: \n");
  1118. for(count=0;count<AagGroupsNum;count++)
  1119. printf("%02x, ",SendMmePacket.MMENTRY[51+count]);
  1120. printf("\n");
  1121. #endif
  1122. V2gFlowStatus=CM_ATTEN_CHAR_IND;
  1123. count=sendto(RawSock, &SendMmePacket, SendMmePacketSize, 0, (struct sockaddr*)&DestSocketAddress, sizeof(struct sockaddr_ll));
  1124. #ifdef Debug
  1125. printf("SendMmePacketSize=%d,Rtn=%d\n",SendMmePacketSize,count);
  1126. #endif
  1127. ftime(&SeqStartTime);
  1128. }
  1129. break;
  1130. case CM_ATTEN_CHAR_IND:
  1131. ftime(&SeqEndTime);
  1132. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_response)
  1133. {
  1134. #ifdef SystemLogMessage
  1135. StoreLogMsg("[EvComm]SlacComm: Wait CM_ATTEN_CHAR_RSP Timeout - TT_match_response ");
  1136. #endif
  1137. V2gFlowStatus=Sequence_Timeout;
  1138. return -1;
  1139. }
  1140. break;
  1141. case CM_ATTEN_CHAR_RSP:
  1142. ftime(&SeqEndTime);
  1143. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_EVSE_match_session)
  1144. {
  1145. #ifdef SystemLogMessage
  1146. StoreLogMsg("[EvComm]SlacComm: Wait CM_VALIDATE_REQ or CM_SLAC_MATCH_REQ Timeout - TT_EVSE_match_session ");
  1147. #endif
  1148. V2gFlowStatus=Sequence_Timeout;
  1149. return -1;
  1150. }
  1151. break;
  1152. case CM_VALIDATE_CNF:
  1153. ftime(&SeqEndTime);
  1154. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_sequence)
  1155. {
  1156. #ifdef SystemLogMessage
  1157. StoreLogMsg("[EvComm]SlacComm: Wait CM_VALIDATE_CNF or CM_SLAC_MATCH_REQ Timeout - TT_match_sequence ");
  1158. #endif
  1159. V2gFlowStatus=Sequence_Timeout;
  1160. return -1;
  1161. }
  1162. break;
  1163. case CM_SLAC_MATCH_CNF:
  1164. if(UdpSock>0)
  1165. {
  1166. close(UdpSock);
  1167. UdpSock=-1;
  1168. }
  1169. if(TcpSock>0)
  1170. {
  1171. close(TcpSock);
  1172. TcpSock=-1;
  1173. }
  1174. ftime(&SeqStartTime);
  1175. V2gFlowStatus=SLACC_SDP_UDP_Connection;
  1176. break;
  1177. defaudlt:
  1178. break;
  1179. }
  1180. return 0;
  1181. }
  1182. int V2gMsgProcess(unsigned char *Buffer, int DataLength)
  1183. {
  1184. struct V2gtpHeader *RecvHeader;
  1185. unsigned char *PayloadData;
  1186. RecvHeader= (struct V2gtpHeader *) Buffer;
  1187. #ifdef Debug
  1188. printf("\n\n***********************************\n");
  1189. printf("***** Received V2G Packet *****\n");
  1190. printf("***********************************\n");
  1191. printf("ProtocolVersion=%d\n",RecvHeader->ProtocolVersion);
  1192. printf("InverseProtocolVersion=0x%x\n",RecvHeader->InverseProtocolVersion);
  1193. printf("PayloadType=0x%x\n",htons(RecvHeader->PayloadType));
  1194. printf("PayloadLength=0x%x\n",htonl(RecvHeader->PayloadLength));
  1195. #endif
  1196. if(htons(RecvHeader->PayloadType)!=V2GTP_PAYLOAD_TYPE_EXI_MSG)
  1197. {
  1198. #ifdef SystemLogMessage
  1199. StoreLogMsg("[EvComm]V2gMsgProcess: Wrong Payload Type");
  1200. #endif
  1201. return 0;
  1202. }
  1203. //EXI decode
  1204. //process received message and change status flag
  1205. }
  1206. int V2gComm(int AcceptFd)
  1207. {
  1208. int packet_size,count;
  1209. memset(RecvBuffer,0,RecvBufferSize);
  1210. packet_size=recv(AcceptFd, RecvBuffer, RecvBufferSize, 0);
  1211. if(packet_size>0)
  1212. {
  1213. /*#ifdef Debug
  1214. printf("V2gComm Data: ");
  1215. for(count=0;count<packet_size;count++)
  1216. printf("0x%x, ",RecvBuffer[count]);
  1217. printf("\n");
  1218. #endif*/
  1219. V2gMsgProcess(RecvBuffer, packet_size);
  1220. }
  1221. //following are the response message handling according to status flag
  1222. switch(V2gFlowStatus)
  1223. {
  1224. case SupportedAppProtocolRequest:
  1225. break;
  1226. default:
  1227. break;
  1228. }
  1229. return 0;
  1230. }
  1231. int SdpUdpConnected()
  1232. {
  1233. int packet_size,Rtn;
  1234. struct sockaddr_in6 ServerAddr,ClientAddr;
  1235. struct V2gtpHeader *RecvHeader;
  1236. unsigned char *PayloadData;
  1237. if(UdpSock<=0)
  1238. {
  1239. if ((UdpSock = socket(AF_INET6, SOCK_DGRAM, 0)) <0)
  1240. {
  1241. #ifdef SystemLogMessage
  1242. StoreLogMsg("[EvComm]SdpUdpConnected: Fail to open UdpSock");
  1243. #endif
  1244. return 0;
  1245. }
  1246. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  1247. ServerAddr.sin6_family = AF_INET6;
  1248. ServerAddr.sin6_addr=in6addr_any;
  1249. ServerAddr.sin6_port = htons(SdpUdpServerPort);
  1250. if(bind(UdpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
  1251. {
  1252. #ifdef SystemLogMessage
  1253. StoreLogMsg("[EvComm]SdpUdpConnected: Fail to bind UdpSock");
  1254. #endif
  1255. close(UdpSock);
  1256. UdpSock=-1;
  1257. return 0;
  1258. }
  1259. #ifdef Debug
  1260. printf("UdpSock=%d\n",UdpSock);
  1261. #endif
  1262. }
  1263. memset(RecvBuffer,0,RecvBufferSize);
  1264. memset(&ClientAddr,0, sizeof(struct sockaddr_in));
  1265. Rtn=sizeof(struct sockaddr_in6);
  1266. packet_size = recvfrom(UdpSock , RecvBuffer , RecvBufferSize , MSG_DONTWAIT , (struct sockaddr *)&ClientAddr, &Rtn);
  1267. #ifdef Debug
  1268. printf("packet_size=%d\n",packet_size);
  1269. #endif
  1270. if(packet_size>0)
  1271. {
  1272. RecvHeader= (struct V2gtpHeader *) RecvBuffer;
  1273. PayloadData=RecvBuffer+sizeof(struct V2gtpHeader);
  1274. #ifdef Debug
  1275. printf("\n\n***********************************\n");
  1276. printf("***** Received SDP Packet *****\n");
  1277. printf("***********************************\n");
  1278. printf("ClientAddress=");
  1279. for(Rtn=0;Rtn<16;Rtn+=2)
  1280. printf("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  1281. printf("\n");
  1282. printf("ClientPort=%d\n",ClientAddr.sin6_port);
  1283. printf("ProtocolVersion=%d\n",RecvHeader->ProtocolVersion);
  1284. printf("InverseProtocolVersion=0x%x\n",RecvHeader->InverseProtocolVersion);
  1285. printf("PayloadType=0x%x\n",htons(RecvHeader->PayloadType));
  1286. printf("PayloadLength=0x%x\n",htonl(RecvHeader->PayloadLength));
  1287. #endif
  1288. if((RecvHeader->ProtocolVersion==0x01)&&(RecvHeader->InverseProtocolVersion==0xFE)&&(htons(RecvHeader->PayloadType)==V2GTP_PAYLOAD_TYPE_SDP_REQUEST))
  1289. {
  1290. #ifdef Debug
  1291. printf("Security=0x%x\n",*(PayloadData+0));
  1292. printf("TransportProtocol=0x%x\n",*(PayloadData+1));
  1293. #endif
  1294. RecvHeader->PayloadType=htons(V2GTP_PAYLOAD_TYPE_SDP_RESPONSE);
  1295. RecvHeader->PayloadLength=htonl(20); //Fixed Length=20
  1296. memset(PayloadData,0,20);
  1297. // MAC address[0:2] + FFFE + MAC address[3:5]
  1298. PayloadData[0]=(IPV6_LINK_LOCAL_PREFIX>>8)&0xFF;
  1299. PayloadData[1]=IPV6_LINK_LOCAL_PREFIX&0xFF;
  1300. PayloadData[8]=CsuMac[0];
  1301. PayloadData[8]^=0x02;// bit 1 should complemented.
  1302. PayloadData[9]=CsuMac[1];
  1303. PayloadData[10]=CsuMac[2];
  1304. PayloadData[11]=0xFF;
  1305. PayloadData[12]=0xFE;
  1306. PayloadData[13] =CsuMac[3];
  1307. PayloadData[14]=CsuMac[4];
  1308. PayloadData[15]=CsuMac[5];
  1309. //TCP port
  1310. PayloadData[16]=(SdpTcpServerPort>>8)&0xFF;
  1311. PayloadData[17]=SdpTcpServerPort&0xFF;
  1312. PayloadData[18]=SDP_PAYLOAD_SECURITY_NONE; //Security
  1313. PayloadData[19]=SDP_PAYLOAD_TRANS_PROTOCOL_TCP; //Transport protocol
  1314. Rtn=sendto(UdpSock, RecvBuffer, sizeof(struct V2gtpHeader)+htonl(RecvHeader->PayloadLength), 0, (struct sockaddr *)&ClientAddr, sizeof(struct sockaddr_in6));
  1315. #ifdef Debug
  1316. printf("\n\n***** Response SDP Packet *****\n");
  1317. printf("Send size=%d\n",Rtn);
  1318. printf("Destination Address=");
  1319. for(Rtn=0;Rtn<16;Rtn++)
  1320. printf("%02x, ",ClientAddr.sin6_addr.s6_addr[Rtn]);
  1321. printf("\n");
  1322. printf("Destination Port=%d\n",ClientAddr.sin6_port);
  1323. printf("ProtocolVersion=%d\n",RecvHeader->ProtocolVersion);
  1324. printf("InverseProtocolVersion=0x%x\n",RecvHeader->InverseProtocolVersion);
  1325. printf("PayloadType=0x%x\n",htons(RecvHeader->PayloadType));
  1326. printf("PayloadLength=0x%x\n",htonl(RecvHeader->PayloadLength));
  1327. printf("SECC Ipv6 Address=");
  1328. for(Rtn=0;Rtn<16;Rtn++)
  1329. printf("%02x:",PayloadData[Rtn]);
  1330. printf("\n");
  1331. printf("SECC Port=%d\n",(PayloadData[16]<<8|PayloadData[17]));
  1332. printf("Security=0x%x\n",PayloadData[19]);
  1333. printf("TransportProtocol=0x%x\n",PayloadData[20]);
  1334. #endif
  1335. if(Rtn>0)
  1336. return 1;
  1337. }
  1338. }
  1339. return 0;
  1340. }
  1341. int V2gTcpConnected()
  1342. {
  1343. int packet_size,Rtn,AcceptFd;
  1344. struct sockaddr_in6 ServerAddr,ClientAddr;
  1345. if(TcpSock<=0)
  1346. {
  1347. if ((TcpSock = socket(PF_INET6, SOCK_STREAM, 0)) <0)
  1348. {
  1349. #ifdef SystemLogMessage
  1350. StoreLogMsg("[EvComm]V2gTcpConnected: Fail to open TcpSock");
  1351. #endif
  1352. return 0;
  1353. }
  1354. fcntl(TcpSock, F_SETFL, O_NONBLOCK); //set to O_NONBLOCK
  1355. memset(&ServerAddr,0, sizeof(struct sockaddr_in));
  1356. ServerAddr.sin6_family = PF_INET6;
  1357. ServerAddr.sin6_addr=in6addr_any;
  1358. ServerAddr.sin6_port = htons(SdpTcpServerPort);
  1359. if(bind(TcpSock, (struct sockaddr *)&ServerAddr, sizeof(struct sockaddr_in6)) <0)
  1360. {
  1361. #ifdef SystemLogMessage
  1362. StoreLogMsg("[EvComm]V2gTcpConnected: Fail to bind TcpSock");
  1363. #endif
  1364. close(TcpSock);
  1365. TcpSock=-1;
  1366. return 0;
  1367. }
  1368. if(listen(TcpSock, 1) == -1) //only accept one connection
  1369. {
  1370. #ifdef SystemLogMessage
  1371. StoreLogMsg("[EvComm]V2gTcpConnected: Fail to listen TcpSock");
  1372. #endif
  1373. close(TcpSock);
  1374. TcpSock=-1;
  1375. return 0;
  1376. }
  1377. #ifdef Debug
  1378. printf("TcpSock=%d\n",TcpSock);
  1379. #endif
  1380. }
  1381. Rtn=sizeof(struct sockaddr_in6);
  1382. if((AcceptFd=accept(TcpSock,(struct sockaddr *)&ClientAddr,&Rtn))==-1)
  1383. {
  1384. #ifdef Debug
  1385. printf("Wait TCP connection\n");
  1386. #endif
  1387. return 0;
  1388. }
  1389. #ifdef Debug
  1390. printf("Accept one TCP connection:\n");
  1391. printf("AcceptFd=%d\n",AcceptFd);
  1392. printf("ClientAddress=");
  1393. for(Rtn=0;Rtn<16;Rtn+=2)
  1394. printf("%02x%02x:",ClientAddr.sin6_addr.s6_addr[Rtn],ClientAddr.sin6_addr.s6_addr[Rtn+1]);
  1395. printf("\n");
  1396. printf("ClientPort=%d\n",ClientAddr.sin6_port);
  1397. #endif
  1398. return AcceptFd;
  1399. }
  1400. int main(int argc,char *argv[])
  1401. {
  1402. unsigned char Rtn;
  1403. int TcpAcceptFd;
  1404. //Initialization
  1405. InitShareMemory();
  1406. //start to detect pilot state
  1407. PilotDetectionPid=0;
  1408. PilotDetection();
  1409. //Init communication parameters
  1410. GetEthMac(QcaInterface, CsuMac);
  1411. RecvBuffer=(unsigned char *)malloc(RecvBufferSize);
  1412. memset(RecvBuffer,0,RecvBufferSize);
  1413. SendBuffer=(unsigned char *)malloc(SendBufferSize);
  1414. memset(SendBuffer,0,SendBufferSize);
  1415. if(RawSock>0)
  1416. close(RawSock);
  1417. if(UdpSock>0)
  1418. close(UdpSock);
  1419. if(TcpSock>0)
  1420. close(TcpSock);
  1421. RawSock=UdpSock=TcpSock=-1;
  1422. V2gFlowStatus=0;
  1423. AttenProfileNum=0;
  1424. while(1)
  1425. {
  1426. #ifdef Debug
  1427. printf("V2gFlowStatus=%d\n",V2gFlowStatus);
  1428. #endif
  1429. //if((ShmInternalComm->ChargingPermission==0x01)&&(ConnectorPlugIn()==1))
  1430. if(1)
  1431. {
  1432. if(V2gFlowStatus<SLACC_SDP_UDP_Connection)
  1433. SlacComm();
  1434. else if(V2gFlowStatus==SLACC_SDP_UDP_Connection)
  1435. {
  1436. if(SdpUdpConnected()==1)
  1437. {
  1438. V2gFlowStatus=SLACC_SDP_TCP_Connection;
  1439. continue;
  1440. }
  1441. ftime(&SeqEndTime);
  1442. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_join)
  1443. {
  1444. #ifdef SystemLogMessage
  1445. StoreLogMsg("[EvComm]main: Wait SLACC_SDP_UDP_Connection Timeout - TT_match_join ");
  1446. #endif
  1447. V2gFlowStatus=Sequence_Timeout;
  1448. }
  1449. }
  1450. else if(V2gFlowStatus==SLACC_SDP_TCP_Connection)
  1451. {
  1452. if((TcpAcceptFd=V2gTcpConnected())>0)
  1453. {
  1454. V2gFlowStatus=SupportedAppProtocolRequest;
  1455. continue;
  1456. }
  1457. ftime(&SeqEndTime);
  1458. if(DiffTimeb(SeqStartTime, SeqEndTime)>TT_match_join)
  1459. {
  1460. #ifdef SystemLogMessage
  1461. StoreLogMsg("[EvComm]main: Wait SLACC_SDP_TCP_Connection Timeout - TT_match_join ");
  1462. #endif
  1463. V2gFlowStatus=Sequence_Timeout;
  1464. }
  1465. }
  1466. else if(V2gFlowStatus<Performance_Timeout)
  1467. V2gComm(TcpAcceptFd);
  1468. }
  1469. if(V2gFlowStatus>=Performance_Timeout)
  1470. {
  1471. //Normal Stop
  1472. //alarm and duty to 100%
  1473. OutputCpPwmDuty(100);
  1474. goto ReSet;
  1475. }
  1476. /*else if((ConnectorPlugIn()==0)&&(V2gFlowStatus>Idle))
  1477. {
  1478. //Emergency stop
  1479. OutputCpPwmDuty(100);
  1480. goto ReSet;
  1481. }*/
  1482. continue;
  1483. ReSet:
  1484. if(RawSock>0)
  1485. close(RawSock);
  1486. if(UdpSock>0)
  1487. close(UdpSock);
  1488. if(TcpSock>0)
  1489. {
  1490. close(TcpSock);
  1491. close(TcpAcceptFd);
  1492. }
  1493. RawSock=UdpSock=TcpSock=TcpAcceptFd=-1;
  1494. V2gFlowStatus=0;
  1495. while(1)
  1496. {
  1497. //wait for CSU configrm
  1498. }
  1499. }//main while
  1500. }