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

📄 acctrl.c

📁 包括EPA协议栈
💻 C
字号:
#include "tcpip.h"
#include "epa.h"
#include "variable.h"
#include <string.h>
#include "nsmib.h"
#include "security.h"
#include "acctrl.h"
#include "list.h"
#include "stimer.h"

#define ACCSOCK_AMOUNT_ALL             (0x04)
#define ACC_RIGHT_READ                 (32)
#define ACC_RIGHT_WRITE                (16)
#define ACC_RIGHT_DOMAINDOWN_LOAD      (8)
#define ACC_RIGHT_DOMAIN_UPLOAD        (4)
#define ACC_RIGHT_ACK_NOTI             (2)
#define ACC_RIGHT_ALERT                (1)


typedef struct {
	uint8  srv_id;
	uint8  com_type;
	uint16 msg_id;
	uint16 local_app;
	uint16 local_obj;
	uint16 rmt_app;
	uint16 rmt_obj;
	PSock  psock;
	Foo    node;
} ACCSock, *PACCSock;

static OS_EVENT* gpACCSockSem;
static OS_MEM*   gpACCSockMCB;

static ACCSock gACCSockPool[ACCSOCK_AMOUNT_ALL];

void ACCtrlInit(void) {
	uint8 err;
	
	gpACCSockSem = OSSemCreate(SOCK_AMOUNT_ALL);
	gpACCSockMCB = OSMemCreate(gACCSockPool, ACCSOCK_AMOUNT_ALL, sizeof(ACCSock), &err);
}


__inline PACCSock GetACCSock(void) {
	CpuSr    sr;
	uint8    err;
	PACCSock pacc_sock;

	SpinLock(sr);
	OSSemPend(gpACCSockSem, 0, &err);
	pacc_sock = (PACCSock)OSMemGet(gpACCSockMCB, &err);
	SpinUnLock(sr);
	
	return (pacc_sock);
}

__inline void PutACCSock(PACCSock pacc_sock) {
	CpuSr sr;

	SpinLock(sr);
	OSSemPost(gpACCSockSem);
	OSMemPut(gpACCSockMCB, (void*)pacc_sock);
	SpinUnLock(sr);
}	

uint8 NS_ACCtrl_Retry_Output(uint32 para, void* pdata) {
	PACCSock pacc_sock;
	PACCtrlObj pacc_obj;
	
	pacc_sock = (PACCSock)pdata;
	pacc_obj = GetACCtrlObj(pacc_sock->local_app, pacc_sock->local_obj, pacc_sock->rmt_app, pacc_sock->rmt_obj);
	if((pacc_obj != 0) && (pacc_obj->srv_op == pacc_sock->srv_id)) {
		EPAOutput(pacc_sock->psock, pacc_sock->srv_id, pacc_sock->com_type, pacc_sock->msg_id);
		return EPA_NO_ERR;
	}
	else {
		PutACCSock(pacc_sock);
		return EPA_RIGHT_ILLEGAL;
	}
}

uint8 NS_ACCtrl_Req(PSock psock, uint16 src_app, uint16 src_obj, uint16 dst_app, uint16 dst_obj, uint8 srv_id, uint8 com_type) {
	uint32     para;
	PSock      psock_new;
	PACCSock   pacc_sock;
	PACCtrlObj pacc_obj;
	
	pacc_obj = GetACCtrlObj(src_app, src_obj, dst_app, dst_obj);
	if((pacc_obj != 0) && (pacc_obj->srv_op == srv_id)) {
		return EPA_NO_ERR;
	}
	pacc_sock = GetACCSock();
	para = ((uint32)srv_id << 24) | ((uint32)com_type << 16) | (uint32)EPA_MSG_ID;
	AddSt(300, para, pacc_sock, NS_ACCtrl_Retry_Output);
	psock_new = GetSock(PROTOCOL_EPA_FB, LEN_ACCTRL, psock->dst_port, psock->dst_ip, psock->pni); 
	
	h2n16(src_app, psock_new->payload);
	h2n16(src_obj, psock_new->payload + 2);
	h2n16(dst_app, psock_new->payload + 4);
	h2n16(dst_obj, psock_new->payload + 6);
	h2n16(pacc_obj->psw, psock_new->payload + 8);
	psock_new->payload[10] = pacc_obj->group;
	psock_new->payload[11] = srv_id;
	
	EPAOutput(psock_new, NSID_ACSCTRL, EPA_COM_TYPE, EPA_MSG_ID);
	return EPA_REQUIRE_ACCESS;
}

uint8 NS_ACCtrl_Chk(uint16 local_app, uint16 local_obj, uint16 rmt_app, uint16 rmt_obj, uint8 srv_id) {
	PACCtrlObj pacc_obj;

	pacc_obj = GetACCtrlObj(local_app, local_obj, rmt_app, rmt_obj);
	if((pacc_obj != 0) && (pacc_obj->srv_op == srv_id)) {
		SetLocalACCtrlOP(pacc_obj, 0);
		return EPA_NO_ERR;
	}
	return EPA_RIGHT_ILLEGAL;
}

void NS_ACCtrl_Input(PSock psock, uint8 com_type, uint16 msg_id) {
	uint32 src_ip;
	uint16 rmt_app, rmt_obj, local_app, local_obj, psw, src_port;
	uint8  group, srv_id, right;
	PACCtrlObj pacc_obj;
	
	n2h16(psock->payload, &rmt_app);
	n2h16(psock->payload + 2, &rmt_obj);
	n2h16(psock->payload + 4, &local_app);
	n2h16(psock->payload + 6, &local_obj);
	n2h16(psock->payload + 8, &psw);
	group = psock->payload[10];
	srv_id = psock->payload[11];
	src_ip = psock->src_ip;
	src_port = psock->src_port;
	PutSock(psock);
	
	switch(srv_id) {
		case EVS_READ:
			right = ACC_RIGHT_READ;
			break;
		case EVS_WRITE:
			right = ACC_RIGHT_WRITE;
			break;
		case EDS_DOMAINDOWNLOAD:
			right = ACC_RIGHT_DOMAINDOWN_LOAD;
			break;
		case EDS_DOMAINUPLOAD:
			right = ACC_RIGHT_DOMAIN_UPLOAD;
			break;
		case EES_ACK_NOTI:
			right = ACC_RIGHT_ACK_NOTI;
			break;
		case EES_ALTER_MONITOR:
			right = ACC_RIGHT_ALERT;
			break;
		default:
			right = 0;
	}
	pacc_obj = GetACCtrlObj(local_app, local_obj, rmt_app, rmt_obj);
	if((pacc_obj != 0) && (pacc_obj->psw == psw) && (pacc_obj->group == group)) {
		SetLocalACCtrlOP(pacc_obj, srv_id);
		NS_ACCtrl_Pos_Output(rmt_app, msg_id, src_port, src_ip);
	}
	else {
		NS_ACCtrl_Neg_Output(rmt_app, 1, 0, 0, msg_id, src_port, src_ip);
	}
}

void NS_ACCtrl_Pos_Output(uint16 dst_app, uint16 msg_id, uint16 dst_port, uint32 dst_ip) {
	PSock psock;
	
	psock = GetSock(PROTOCOL_EPA_FB, 2, dst_port, dst_ip, NISelect(dst_ip));
	
	h2n16(dst_app, psock->payload);
	EPAOutput(psock, NSID_ACSCTRL_POS, EPA_COM_TYPE, msg_id);
}

void NS_ACCtrl_Pos_Input(PSock psock, uint8 com_type, uint16 msg_id) {
	// Send pkt
	PutSock(psock);
}

void NS_ACCtrl_Neg_Output(uint16 src_app, uint8 err_class, uint8 err_code, uint8 add_code, uint16 msg_id, uint16 dst_port, uint32 dst_ip) {
	PSock psock;

	psock = GetSock(PROTOCOL_EPA_FB, LEN_READ_NEG, dst_port, dst_ip, NISelect(dst_ip));
 
	h2n16(src_app, psock->payload); 
	psock->payload[2] = EPA_RESERVED_VALUE;
	psock->payload[3] = EPA_RESERVED_VALUE;
 	psock->payload[4] = err_class;
	psock->payload[5] = err_code;
	psock->payload[6] = add_code;
	psock->payload[7] = EPA_RESERVED_VALUE;
	memcpy(psock->payload + 8, gErr_Des[err_class][err_code], VISUAL_STRING_LEN);

	EPAOutput(psock, NSID_ACSCTRL_NEG, EPA_COM_TYPE, msg_id);
}

void NS_ACCtrl_Neg_Input(PSock psock, uint8 com_type, uint16 msg_id) {
	// Free pkt
	PutSock(psock);
}

⌨️ 快捷键说明

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