⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fservice.c

📁 包括EPA协议栈
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "ucos_ii.h"
#define FSERVICE_GLOBALS
#include "fs_module.h"
#undef FSERVICE_GLOBALS
#include "epa_module.h"
#include "ip_module.h"
#include "timer.h"
#include "fb_module.h"
#include <string.h>

static uint16 gCrcMode;
static uint16 gPubESN;
static uint16 gSubESN;
static uint16 gSubLRSN;
static uint32 gPubKey;
static uint32 gSubKey;

static uint8 FSRetryOutput(void *pdata){
	uint32 crc;
	POutSock posock;
		
	posock = (POutSock)pdata;
	if(GetFSComState() == SAFETYCOM_OPEN) {
		h2n16(GetFSComESN(), posock->payload + 4);
		switch(gCrcMode) {
			case 1:
				crc = crc81_check(posock->payload + 4, posock->length - 4, GetFSComKey());
				break;
			case 2:
				crc = crc81_check(posock->payload + 4, posock->length - 4, GetFSComKey());
				break;
			case 3:
				crc = crc16_check(posock->payload + 4, posock->length - 4, GetFSComKey());
				break;
			case 4:
				crc = crc32_check(posock->payload + 4, posock->length - 4, GetFSComKey());
				break;
		}
		h2n32(crc, posock->payload);
		EPAOutput(posock);
		return (0);
	}
	else {
		FreeOutSock(posock);
		return (1);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: DesIPAddr 目的地址, pData 数据                        -*
 *- Description: 通信发起方发起open请求			                     -*
 *--------------------------------------------------------------------*/
void FS_ComOpen_req(uint32 dstip, uint16 srcappid) {
	POutSock posock;

	if(GetFSComState() == SAFETYCOM_CLOSE) {
	
		posock = GetOutSock(PROTOCOL_EPASFB);
		
		posock->dstip = dstip;
		posock->dstport = EPA_PORT;
		posock->length = 6;	
		posock->srvid = FSID_COM_OPEN;
		posock->comtype = 1;
		h2n16(srcappid, posock->payload);
		h2n32(dstip, posock->payload + 2);

		SetFSComState(SAFETYCOM_REQUESTING);
		EPAOutput(posock);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: Smo_Socket_Index 数据索引,由通信栈获得                -*
 *- Description: Communication Open 请求服务处理函数, 根据状态机     -*
 *-   对应的动作                                                     -*
 *--------------------------------------------------------------------*/
void FS_ComOpen_reqhandle(PInSock pisock) {
	OctetString usrdata;
	uint32 rcvip;
	uint16 rcvappid;
	
	n2h16(pisock->payload, &rcvappid);	
	n2h32(pisock->payload + 2, &rcvip);
	
	FreeInSock(pisock);
	if(GetFSComState() == SAFETYCOM_CLOSE) {
		if(pisock->srcip == rcvip) {
			SetFSComState(SAFETYCOM_REQUESTED);
			SetFSComRmtIP(rcvip);
			FS_ComOpen_pos(rcvip, pisock->srcport, pisock->msgid, rcvappid);
		}
		else {
			usrdata[0] = 0;
			usrdata[1] = 0;
			memcpy(usrdata + 4, "IP address check error", 32);
			FS_ComOpen_neg(pisock->srcip, pisock->srcport, pisock->msgid, usrdata, rcvappid);
		}
	}
	else {
		usrdata[0] = 0;
		usrdata[1] = 0;
		memcpy(usrdata + 4, "State not match", 32);
		FS_ComOpen_neg(pisock->srcip, pisock->srcport, pisock->msgid, usrdata, rcvappid);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: DesIPAddr 目标IP, UdpPort 目标端口, 对应请求的MsgID   -*
 *-   pData 需要发送的数据, 以网络序的Octet串形式提供                -*
 *- Description: 根据参数发送Communication Open正响应报文            -*
 *--------------------------------------------------------------------*/
void FS_ComOpen_pos(uint32 dstip, uint16 dstport, uint16 msgid, uint16 dstappid) {//应该连msgid也不用传下来了
	POutSock	posock;
	
	if(GetFSComState() == SAFETYCOM_REQUESTED) {
		posock = GetOutSock(PROTOCOL_EPASFB);
		posock->dstip = dstip;
		posock->dstport = dstport;
		posock->srvid = FSID_COM_OPEN_POS;
		posock->comtype = 1;
		posock->length = 2;
		posock->msgid = msgid;
		h2n16(dstappid, posock->payload);
		SetFSComState(SAFETYCOM_OPEN);
		EPAOutput(posock);
	}
}


/*--------------------------------------------------------------------*
 *- Parameter: DesIPAddr 目标IP, UdpPort 目标端口, 对应请求的MsgID   -*
 *-   pData 需要发送的数据, 以网络序的Octet串形式提供                -*
 *- Description: 根据参数发送Communication Open负响应报文            -*
 *--------------------------------------------------------------------*/
void FS_ComOpen_neg(uint32 dstip, uint16 dstport, uint16 msgid, uint8* pdata, uint16 dstappid) {
	POutSock	posock;
	
	posock = GetOutSock(PROTOCOL_EPASFB);		
	posock->dstip = dstip;
	posock->dstport = dstport;
	posock->srvid = FSID_COM_OPEN_NEG;
	posock->comtype = 1;
	posock->length = 40;		
		
	h2n16(dstappid, posock->payload);
	memcpy(posock->payload + 4, pdata, 36);

	SetFSComState(SAFETYCOM_CLOSE);
	EPAOutput(posock);		
}

/*--------------------------------------------------------------------*
 *- Parameter: Smo_Socket_Index 数据索引,由通信栈获得                -*
 *- Description: Communication open postive正响应 请求服务处理函数,        -*
 *-   根据状态机对应的动作                                            -*
 *--------------------------------------------------------------------*/
void FS_ComOpen_poshandle(PInSock pisock) {
	FreeInSock(pisock);
	if(GetFSComState() == SAFETYCOM_REQUESTING) {
		SetFSComState(SAFETYCOM_OPEN);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: Smo_Socket_Index 数据索引,由通信栈获得                -*
 *- Description: Communication open nagtive负响应 请求服务处理函数,        -*
 *-   根据状态机对应的动作                                            -*
 *--------------------------------------------------------------------*/
void FS_ComOpen_neghandle(PInSock pisock) {
	FreeInSock(pisock);
	if(GetFSComState() == SAFETYCOM_REQUESTING) {
		SetFSComState(SAFETYCOM_CLOSE);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: DesIPAddr 目的地址, pData 数据                          -*
 *- Description: 通信发起方发起open请求														   -*
 *--------------------------------------------------------------------*/
void FS_ComClose_req(uint32 dstip, uint16 srcappid) {
	POutSock posock;

	if(GetFSComState() == SAFETYCOM_OPEN) {

		posock = GetOutSock(PROTOCOL_EPASFB);
		posock->dstip = dstip;
		posock->dstport = EPA_PORT;
		posock->length = 6;	
		posock->srvid = FSID_COM_CLOSE;
		posock->comtype = 1;
		h2n32(dstip, posock->payload + 2);
		h2n16(srcappid, posock->payload);
	
		EPAOutput(posock);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: Smo_Socket_Index 数据索引,由通信栈获得                -*
 *- Description: Communication Close 请求服务处理函数, 根据状态机    -*
 *-   对应的动作                                                     -*
 *--------------------------------------------------------------------*/
void FS_ComClose_reqhandle(PInSock pisock) {
	OctetString usrdata;
	uint32 rcvip;
	uint16 rcvappid;

	n2h16(pisock->payload, &rcvappid);
	n2h32(pisock->payload + 2, &rcvip);

	if(GetFSComState() == SAFETYCOM_OPEN) {
		if(pisock->srcip == rcvip && rcvip == GetFSComRmtIP()) {
			FS_ComClose_pos(rcvip, pisock->srcport, pisock->msgid, rcvappid);
		}
		else {
			usrdata[0] = 0;
			usrdata[1] = 0;
			memcpy(usrdata + 4, "IP address check error", 32);
			FS_ComClose_neg(rcvip, pisock->srcport, pisock->msgid, usrdata, rcvappid);
		}
	}
	else {
		usrdata[0] = 0;
		usrdata[1] = 0;
		memcpy(usrdata + 4, "State not match", 32);
		FS_ComClose_neg(rcvip, pisock->srcport, pisock->msgid, usrdata, rcvappid);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: DesIPAddr 目标IP, UdpPort 目标端口, 对应请求的MsgID   -*
 *-   pData 需要发送的数据, 以网络序的Octet串形式提供                -*
 *- Description: 根据参数发送Communication Close正响应报文           -*
 *--------------------------------------------------------------------*/
void FS_ComClose_pos(uint32 dstip, uint16 dstport, uint16 msgid, uint16 dstappid) {
	POutSock posock;
	
	if(GetFSComState() == SAFETYCOM_OPEN) {
		posock = GetOutSock(PROTOCOL_EPASFB);
		posock->dstip = dstip;
		posock->dstport = dstport;
		posock->srvid = FSID_COM_CLOSE_POS;
		posock->comtype = 1;
		posock->length = 2;
		SetFSComState(SAFETYCOM_OPEN);
		EPAOutput(posock);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: DesIPAddr 目标IP, UdpPort 目标端口, 对应请求的MsgID   -*
 *-   pData 需要发送的数据, 以网络序的Octet串形式提供                -*
 *- Description: 根据参数发送Communication Close负响应报文           -*
 *--------------------------------------------------------------------*/
void FS_ComClose_neg(uint32 dstip, uint16 dstport, uint16 msgid, uint8* pdata, uint16 dstappid) {
	POutSock posock;

	posock = GetOutSock(PROTOCOL_EPASFB);
	posock->dstport = dstport;
	posock->srvid = FSID_COM_CLOSE_NEG;
	posock->comtype = 1;
	posock->length = 40;
	posock->dstip = dstip;	
	h2n16(dstappid, posock->payload);
	memcpy(posock->payload + 4, pdata, 36);
	EPAOutput(posock);
}

/*--------------------------------------------------------------------*
 *- Parameter: Smo_Socket_Index 数据索引,由通信栈获得                -*
 *- Description: Communication close postive正响应 请求服务处理函数,        -*
 *-   根据状态机对应的动作                                            -*
 *--------------------------------------------------------------------*/
void FS_ComClose_poshandle(PInSock pisock) {
	if(GetFSComState() == SAFETYCOM_OPEN) {
		SetFSComState(SAFETYCOM_CLOSE);
		FreeInSock(pisock);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: Smo_Socket_Index 数据索引,由通信栈获得                -*
 *- Description: Communication close nagtive负响应 请求服务处理函数,        -*
 *-   根据状态机对应的动作                                            -*
 *--------------------------------------------------------------------*/
void FS_ComClose_neghandle(PInSock pisock) {

	FreeInSock(pisock);
}

//////////////////////////////////////// 信息分发服务 /////////////////////////////////////

/*--------------------------------------------------------------------*
 *- Parameter: DesIPAddr 目标IP, UdpPort 目标端口, 对应请求的MsgID   -*
 *-   pData 需要发送的数据, 以网络序的Octet串形式提供,               -*
 *-   Datelen 数据长度                                               -*
 *- Description: 根据参数发送Safety Distribute 请求报文              -*
 *--------------------------------------------------------------------*/
void FS_Distribute_req(POutSock posock) {
	uint32 crc;
	Time ctime; 

	ShiftOutSock(posock, PROTOCOL_EPASSFB, PROTOCOL_EPASFB);
	++gPubESN;
	h2n16(gPubESN, posock->payload + 4);
	posock->payload[6] = 0x0;
	posock->payload[7] = 0x0;
	Getime(&ctime);    
	h2n32(ctime.secs, posock->payload + 8);
	h2n32(ctime.nasecs, posock->payload + 12);
	switch(gCrcMode) {
		case 1:
			crc = crc81_check(posock->payload + 4, posock->length + 16, gPubKey);
			break;
		case 2:
			crc = crc81_check(posock->payload + 4, posock->length + 16, gPubKey);
			break;
		case 3:
			crc = crc16_check(posock->payload + 4, posock->length + 16, gPubKey);
			break;
		case 4:
			crc = crc32_check(posock->payload + 4, posock->length + 16, gPubKey);
			break;
	}
	h2n32(crc, posock->payload);
	EPAOutput(posock);
}


/*--------------------------------------------------------------------*
 *- Parameter: Smo_Socket_Index 数据索引,由通信栈获得                -*
 *- Description: Safety Distribute 服务处理函数, 通过时间戳, CRC, SN -*
 *-   检查后, 传递到用户层处理, 未通过检查则产生对应错误报告         -*
 *--------------------------------------------------------------------*/
void FS_Distribute_reqhandle(PInSock pisock) {
	uint16 srcappid, srcobjid;
	uint32 rmtcrc, localcrc;
	uint16 rmtsn;
	FSCommunicationFailureObject fscfo;

	
	n2h16(pisock->payload, &srcappid);
	n2h16(pisock->payload + 2, &srcobjid);

	switch(gCrcMode) {
		case 1:
			localcrc = crc81_check(pisock->payload + 4, pisock->length - 4, gSubKey);
			break;
		case 2:
			localcrc = crc81_check(pisock->payload + 4, pisock->length - 4, gSubKey);
			break;
		case 3:
			localcrc = crc16_check(pisock->payload + 4, pisock->length - 4, gSubKey);
			break;
		case 4:
			localcrc = crc32_check(pisock->payload + 4, pisock->length - 4, gSubKey);
			break;
		default:
			return;
	}
	n2h32(pisock->payload, &rmtcrc);
	
	if(localcrc == rmtcrc) {
		n2h16(pisock->payload + 4, &rmtsn);
		if(!(gSubESN | gSubLRSN)) {
			// 链路处于初始化状态,使用发送方的ESN为初值
			gSubESN = rmtsn;
		}
		else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -