예제 #1
0
파일: cmdrun.c 프로젝트: seablueg/FWlib-dev
void act_nsend(uint8 sock, int8 *buf, uint16 len, uint8 *dip, uint16 *dport)
{
	int8 ret;

	if(sockstat[sock] & SOCK_STAT_TCP_MASK) {	// TCP
		ret = TCPSendNB(sock, buf, len);
		if(ret == SOCKERR_BUSY)
			CRITICAL_ERRA("Impossible TCP send busy - len(%d), avail(%d)", 
			len, GetSocketTxFreeBufferSize(sock));
		if(ret != RET_OK) CMD_RESP_RET(RET_NOT_CONN, VAL_NONE);
		tcpleft[sock] = len;
		sockwatch_set(sock, WATCH_SOCK_TCP_SEND);
		sockbusy[sock] = VAL_TRUE;
	} else {									// UDP
		ret = UDPSendNB(sock, buf, len, dip, *dport);
		if(ret == SOCKERR_BUSY) 
			CRITICAL_ERRA("Impossible UDP send busy - len(%d), avail(%d)", 
			len, GetSocketTxFreeBufferSize(sock));
		if(ret < RET_OK) {
			DBGA("UDPSendNB fail - ret(%d)", ret);
			CMD_RESP_RET(RET_WRONG_ADDR, VAL_NONE);
		}
		sockwatch_set(sock, WATCH_SOCK_UDP_SEND);
		sockbusy[sock] = VAL_TRUE;
	}
}
예제 #2
0
파일: atcmd.c 프로젝트: MikeJeong/FWlib-dev
static void hdl_nrecv(void)
{
	int8 num = VAL_NONE;
	int32 maxlen;

	if(atci.poll == POLL_MODE_NONE) RESP_CR(RET_DISABLED);
	if(atci.tcmd.sign == CMD_SIGN_NONE) atci.tcmd.sign = CMD_SIGN_EQUAL;
	if(atci.tcmd.sign == CMD_SIGN_QUEST) RESP_CR(RET_WRONG_SIGN);
	else if(atci.tcmd.sign == CMD_SIGN_INDIV) RESP_CR(RET_WRONG_SIGN);
	else if(atci.tcmd.sign == CMD_SIGN_EQUAL)
	{
		if(atci.tcmd.arg1[0] != 0) {
			if(str_check(isdigit, atci.tcmd.arg1) != RET_OK) RESP_CDR(RET_WRONG_ARG, 1);
			if(CHK_DGT_RANGE(atci.tcmd.arg1, num, ATC_SOCK_NUM_START, ATC_SOCK_NUM_END)) 
				RESP_CDR(RET_RANGE_OUT, 1);
		}
		if(atci.tcmd.arg2[0] == 0) maxlen = WORK_BUF_SIZE;	// 사이즈 지정안되면 최대값으로 지정
		else if(str_check(isdigit, atci.tcmd.arg2) != RET_OK) RESP_CDR(RET_WRONG_ARG, 2);
		else if((maxlen = atoi((char*)atci.tcmd.arg2)) < 1 || maxlen > WORK_BUF_SIZE) 
			RESP_CDR(RET_RANGE_OUT, 2);
		CMD_CLEAR();
		act_nrecv(num, maxlen);
	}
	else CRITICAL_ERRA("wrong sign(%d)", atci.tcmd.sign);
}
예제 #3
0
파일: atcmd.c 프로젝트: MikeJeong/FWlib-dev
static void hdl_mset(void)
{
	int8 echo, poll, num = -1;	//, mode, country

	if(atci.tcmd.sign == CMD_SIGN_NONE) atci.tcmd.sign = CMD_SIGN_QUEST;	// [?] 구현
	if(atci.tcmd.sign == CMD_SIGN_QUEST)
	{
		if(atci.tcmd.arg1[0] != 0) {
			if(str_check(isdigit, atci.tcmd.arg1) != RET_OK) RESP_CDR(RET_WRONG_ARG, 1);
			if(CHK_DGT_RANGE(atci.tcmd.arg1, num, 1, 4)) RESP_CDR(RET_RANGE_OUT, 1);
		}
		CMD_CLEAR();
		act_mset_q(num);
	}
	else if(atci.tcmd.sign == CMD_SIGN_INDIV)
	{
		if(atci.tcmd.arg1[0] != 0) {
			if(str_check(isdigit, atci.tcmd.arg1) != RET_OK) RESP_CDR(RET_WRONG_ARG, 1);
			if(CHK_DGT_RANGE(atci.tcmd.arg1, num, 1, 4)) RESP_CDR(RET_RANGE_OUT, 1);
			if(num == 1) {
				if(CMP_CHAR_2(atci.tcmd.arg2, 'E', 'D')) RESP_CDR(RET_WRONG_ARG, 2);
				echo = atci.tcmd.arg2[0];
				CMD_CLEAR();
				act_mset_a(echo, 0, 0, 0);
			} else if(num == 2) {
				RESP_CDR(RET_NOT_ALLOWED, 2);	// 아직 정해진 것 없음
			} else if(num == 3) {
				if(CMP_CHAR_3(atci.tcmd.arg2, 'F', 'S', 'D')) RESP_CDR(RET_WRONG_ARG, 2);
				poll = atci.tcmd.arg2[0];
				CMD_CLEAR();
				act_mset_a(0, 0, poll, 0);
			} else RESP_CDR(RET_NOT_ALLOWED, 2);	// 국가 설정 아직 구현안함
		} else RESP_CDR(RET_WRONG_ARG, 1);
	}
	else if(atci.tcmd.sign == CMD_SIGN_EQUAL)
	{
		num = 0;
		if(atci.tcmd.arg1[0] != 0) {
			num++;
			if(CMP_CHAR_2(atci.tcmd.arg1, 'E', 'D')) RESP_CDR(RET_WRONG_ARG, 1);
		}
		if(atci.tcmd.arg3[0] != 0) {
			num++;
			if(CMP_CHAR_3(atci.tcmd.arg3, 'F', 'S', 'D')) RESP_CDR(RET_WRONG_ARG, 3);
		}
		// arg 2, 4 는 일단 무시
		if(num == 0) RESP_CR(RET_NOT_ALLOWED);
		echo = atci.tcmd.arg1[0];
		poll = atci.tcmd.arg3[0];
		CMD_CLEAR();
		act_mset_a(echo, 0, poll, 0);
	} 
	else CRITICAL_ERRA("wrong sign(%d)", atci.tcmd.sign);	
}
예제 #4
0
파일: atcmd.c 프로젝트: MikeJeong/FWlib-dev
static void hdl_mstat(void)
{
	int8 num = -1;

	if(atci.tcmd.sign == CMD_SIGN_NONE) atci.tcmd.sign = CMD_SIGN_QUEST;
	if(atci.tcmd.sign == CMD_SIGN_QUEST)
	{
		if(atci.tcmd.arg1[0] != 0) {
			if(str_check(isdigit, atci.tcmd.arg1) != RET_OK) RESP_CDR(RET_WRONG_ARG, 1);
			if(CHK_DGT_RANGE(atci.tcmd.arg1, num, 1, 1)) RESP_CDR(RET_RANGE_OUT, 1);
		}
		CMD_CLEAR();
		act_mstat();
	}
	else if(atci.tcmd.sign == CMD_SIGN_INDIV) RESP_CR(RET_WRONG_SIGN);
	else if(atci.tcmd.sign == CMD_SIGN_EQUAL) RESP_CR(RET_WRONG_SIGN);
	else CRITICAL_ERRA("wrong sign(%d)", atci.tcmd.sign);
}
예제 #5
0
파일: atcmd.c 프로젝트: MikeJeong/FWlib-dev
static void hdl_nopen(void)
{
	int8 type=0;
	uint8 DstIP[4], *dip = NULL;
	uint16 SrcPort, DstPort = 0;

	if(atci.tcmd.sign == CMD_SIGN_NONE) atci.tcmd.sign = CMD_SIGN_QUEST;
	if(atci.tcmd.sign == CMD_SIGN_QUEST)
	{
		CMD_CLEAR();
		act_nopen_q();
	}
	else if(atci.tcmd.sign == CMD_SIGN_INDIV) RESP_CR(RET_WRONG_SIGN);
	else if(atci.tcmd.sign == CMD_SIGN_EQUAL)
	{
		if(CMP_CHAR_3(atci.tcmd.arg1, 'S', 'C', 'U')) RESP_CDR(RET_WRONG_ARG, 1);
		if(port_check(atci.tcmd.arg2, &SrcPort) != RET_OK) RESP_CDR(RET_WRONG_ARG, 2);

		if(atci.tcmd.arg1[0] == 'C') {
			if(ip_check(atci.tcmd.arg3, DstIP) != RET_OK) RESP_CDR(RET_WRONG_ARG, 3);
			if(port_check(atci.tcmd.arg4, &DstPort) != RET_OK) RESP_CDR(RET_WRONG_ARG, 4);
			dip = DstIP;
		} else if(atci.tcmd.arg1[0] == 'U') {
			if(atci.tcmd.arg3[0] != 0 && atci.tcmd.arg4[0] != 0) {
				if(ip_check(atci.tcmd.arg3, DstIP) != RET_OK) RESP_CDR(RET_WRONG_ARG, 3);
				if(port_check(atci.tcmd.arg4, &DstPort) != RET_OK) RESP_CDR(RET_WRONG_ARG, 4);
				dip = DstIP;
			} else {
				CHK_ARG_LEN(atci.tcmd.arg3, 0, 3);
				CHK_ARG_LEN(atci.tcmd.arg4, 0, 4);
			}
		} else {	// 'S'	무시정책이냐 아니면 전부 확인 정책이냐
			CHK_ARG_LEN(atci.tcmd.arg3, 0, 3);
			CHK_ARG_LEN(atci.tcmd.arg4, 0, 4);
		}

		CHK_ARG_LEN(atci.tcmd.arg5, 0, 5);
		type = atci.tcmd.arg1[0];
		CMD_CLEAR();
		act_nopen_a(type, SrcPort, dip, DstPort);
	}
	else CRITICAL_ERRA("wrong sign(%d)", atci.tcmd.sign);
}
예제 #6
0
파일: atcmd.c 프로젝트: MikeJeong/FWlib-dev
static void hdl_nsend(void)
{
	int8 num = -1;
	int32 ret;
	uint8 *dip = NULL;
	uint16 *dport = NULL;

	if(atci.tcmd.sign == CMD_SIGN_NONE) RESP_CR(RET_WRONG_SIGN);
	if(atci.tcmd.sign == CMD_SIGN_QUEST) RESP_CR(RET_WRONG_SIGN);
	else if(atci.tcmd.sign == CMD_SIGN_INDIV) RESP_CR(RET_WRONG_SIGN);
	else if(atci.tcmd.sign == CMD_SIGN_EQUAL)
	{
		if(atci.tcmd.arg1[0] != 0) {
			if(str_check(isdigit, atci.tcmd.arg1) != RET_OK) RESP_CDR(RET_WRONG_ARG, 1);
			if(CHK_DGT_RANGE(atci.tcmd.arg1, num, ATC_SOCK_NUM_START, ATC_SOCK_NUM_END)) 
				RESP_CDR(RET_RANGE_OUT, 1);
		}
		if(str_check(isdigit, atci.tcmd.arg2) != RET_OK || 
			(atci.sendlen = atoi((char*)atci.tcmd.arg2)) < 1 || 
			atci.sendlen > WORK_BUF_SIZE) RESP_CDR(RET_RANGE_OUT, 2);

		if(atci.tcmd.arg3[0]) {
			if(ip_check(atci.tcmd.arg3, atci.sendip) == RET_OK) dip = atci.sendip;
			else RESP_CDR(RET_WRONG_ARG, 3);
		}
		if(atci.tcmd.arg4[0]) {
			if(port_check(atci.tcmd.arg4, &atci.sendport)==RET_OK) dport = &atci.sendport;
			else RESP_CDR(RET_WRONG_ARG, 4);
		}

		CHK_ARG_LEN(atci.tcmd.arg5, 0, 5);
		CHK_ARG_LEN(atci.tcmd.arg6, 0, 6);
		CMD_CLEAR();
		ret = act_nsend_chk(num, &atci.sendlen, dip, dport);
		if(ret != RET_OK) return;

		atci.sendsock = num;	// 유효성 검사가 완료되면 SEND모드로 전환
		atci.worklen = 0;
		cmd_resp(RET_ASYNC, num);
	}
	else CRITICAL_ERRA("wrong sign(%d)", atci.tcmd.sign);
}
예제 #7
0
파일: atcmd.c 프로젝트: MikeJeong/FWlib-dev
static void hdl_mevt(void)
{
	int8 num = -1;

	if(atci.poll != POLL_MODE_FULL) RESP_CR(RET_DISABLED);
	if(atci.tcmd.sign == CMD_SIGN_NONE) atci.tcmd.sign = CMD_SIGN_EQUAL;
	if(atci.tcmd.sign == CMD_SIGN_QUEST) 
	{
		CMD_CLEAR();
		act_mevt_q();
	}
	else if(atci.tcmd.sign == CMD_SIGN_INDIV) RESP_CR(RET_WRONG_SIGN);
	else if(atci.tcmd.sign == CMD_SIGN_EQUAL)
	{
		if(atci.tcmd.arg1[0] != 0) {
			if(str_check(isdigit, atci.tcmd.arg1) != RET_OK) RESP_CDR(RET_WRONG_ARG, 1);
			if(CHK_DGT_RANGE(atci.tcmd.arg1, num, ATC_SOCK_NUM_START, ATC_SOCK_NUM_END)) 
				RESP_CDR(RET_RANGE_OUT, 1);
		}
		CMD_CLEAR();
		act_mevt_a(num);
	}
	else CRITICAL_ERRA("wrong sign(%d)", atci.tcmd.sign);
}
예제 #8
0
파일: atcmd.c 프로젝트: MikeJeong/FWlib-dev
static void hdl_nset(void)
{
	int8 mode, num = -1;
	uint8 ip[4];

	if(atci.tcmd.sign == CMD_SIGN_NONE) atci.tcmd.sign = CMD_SIGN_QUEST;	// x는 ?로 치환
	if(atci.tcmd.sign == CMD_SIGN_QUEST)
	{
		if(atci.tcmd.arg1[0] != 0) {
			if(str_check(isdigit, atci.tcmd.arg1) != RET_OK) RESP_CDR(RET_WRONG_ARG, 1);
			if(CHK_DGT_RANGE(atci.tcmd.arg1, num, 1, 6)) RESP_CDR(RET_RANGE_OUT, 1);
		}
		CMD_CLEAR();
		act_nset_q(num);
	}
	else if(atci.tcmd.sign == CMD_SIGN_INDIV)
	{
		if(atci.tcmd.arg1[0] != 0) {
			if(str_check(isdigit, atci.tcmd.arg1) != RET_OK) RESP_CDR(RET_WRONG_ARG, 1);
			if(CHK_DGT_RANGE(atci.tcmd.arg1, num, 1, 6)) RESP_CDR(RET_RANGE_OUT, 1);
			if(num == 1) {
				if(CMP_CHAR_2(atci.tcmd.arg2, 'D', 'S')) RESP_CDR(RET_WRONG_ARG, 2);
				mode = atci.tcmd.arg2[0];
				CMD_CLEAR();
				act_nset_a(mode, NULL, NULL, NULL, NULL, NULL);
			} else {
				if(ip_check(atci.tcmd.arg2, ip) != RET_OK) RESP_CDR(RET_WRONG_ARG, 2);
				CMD_CLEAR();
				switch(num) {
				case 2: act_nset_a(0, ip, NULL, NULL, NULL, NULL); return;
				case 3: act_nset_a(0, NULL, ip, NULL, NULL, NULL); return;
				case 4: act_nset_a(0, NULL, NULL, ip, NULL, NULL); return;
				case 5: act_nset_a(0, NULL, NULL, NULL, ip, NULL); return;
				case 6: act_nset_a(0, NULL, NULL, NULL, NULL, ip); return;
				default: CRITICAL_ERR("nset wrong num");
				}
			}
		} else RESP_CDR(RET_WRONG_ARG, 1);
	}
	else if(atci.tcmd.sign == CMD_SIGN_EQUAL)
	{
		uint8 sn[4], gw[4], dns1[4], dns2[4], *ptr[5];
		num = 0;
		if(atci.tcmd.arg1[0] != 0) {
			if(CMP_CHAR_2(atci.tcmd.arg1, 'D', 'S')) RESP_CDR(RET_WRONG_ARG, 1);
			else num++;
		}

#define NSET_ARG_SET(arg_p, addr_p, idx_v, ret_v) \
if(arg_p[0] != 0) { \
	num++; \
	if(ip_check(arg_p, addr_p) != RET_OK) RESP_CDR(RET_WRONG_ARG, ret_v); \
	ptr[idx_v] = addr_p; \
} else ptr[idx_v] = NULL

		NSET_ARG_SET(atci.tcmd.arg2, ip, 0, 2);
		NSET_ARG_SET(atci.tcmd.arg3, sn, 1, 3);
		NSET_ARG_SET(atci.tcmd.arg4, gw, 2, 4);
		NSET_ARG_SET(atci.tcmd.arg5, dns1, 3, 5);
		NSET_ARG_SET(atci.tcmd.arg6, dns2, 4, 6);
		if(num == 0) RESP_CR(RET_NOT_ALLOWED);
		mode = atci.tcmd.arg1[0];
		CMD_CLEAR();
		act_nset_a(mode, ptr[0], ptr[1], ptr[2], ptr[3], ptr[4]);
	} 
	else CRITICAL_ERRA("wrong sign(%d)", atci.tcmd.sign);
}
예제 #9
0
파일: atcmd.c 프로젝트: MikeJeong/FWlib-dev
void cmd_resp(int8 retval, int8 idval)
{
	uint8 cnt, len, idx = 0;

	DBGA("ret(%d), id(%d)", retval, idval);
	cnt = (atci.tcmd.arg1[0] != 0) + (atci.tcmd.arg2[0] != 0) + (atci.tcmd.arg3[0] != 0) + 
		  (atci.tcmd.arg4[0] != 0) + (atci.tcmd.arg5[0] != 0) + (atci.tcmd.arg6[0] != 0);
#define MAKE_RESP(item_v, size_v) \
{ \
	if(item_v[0] != 0) { \
		termbuf[idx++] = ','; \
		len = strlen((char*)item_v); \
		if(len > size_v-1) CRITICAL_ERR("resp buf overflow"); \
		memcpy((char*)&termbuf[idx], (char*)item_v, len); \
		idx += len; \
		cnt--; \
	} else if(cnt) { \
		termbuf[idx++] = ','; \
	} \
}//printf("MakeResp-(%s)(%d)", item_v, len); 
	termbuf[idx++] = '[';
	if(retval >= RET_OK) {
		if(retval == RET_OK) termbuf[idx++] = 'S';
		else if(retval == RET_OK_DUMP) CRITICAL_ERR("use cmd_resp_dump for dump");
		else if(retval == RET_ASYNC) termbuf[idx++] = 'W';
		else if(retval == RET_RECV) termbuf[idx++] = 'R';
		else CRITICAL_ERRA("undefined return value (%d)", retval);

		if(idval != VAL_NONE) {
			termbuf[idx++] = ',';
			//snprintf((char*)tbuf, TBUF_SIZE, "%d", idval);
			//len = strlen((char*)tbuf);
			//strcpy((char*)&termbuf[idx], (char*)tbuf);
			sprintf((char*)&termbuf[idx], "%d", idval);
			len = digit_length(idval, 10);
			idx += len;
		} else if(cnt) termbuf[idx++] = ',';
	} else {
		termbuf[idx++] = 'F';
		termbuf[idx++] = ',';
		if(idval != VAL_NONE) {
			//snprintf((char*)tbuf, TBUF_SIZE, "%d", idval);
			//len = strlen((char*)tbuf);
			//strcpy((char*)&termbuf[idx], (char*)tbuf);
			sprintf((char*)&termbuf[idx], "%d", idval);
			len = digit_length(idval, 10);
			idx += len;
		}
		termbuf[idx++] = ',';
#define CMD_SWT_DEF(errval_v) termbuf[idx++] = errval_v; break;
#define CMD_SWT_EXT(base_v, errval_v) termbuf[idx++]=base_v;termbuf[idx++] = errval_v; break;
		switch(retval) {
		case RET_UNSPECIFIED: CMD_SWT_DEF(ERRVAL_UNSPECIFIED);
		case RET_WRONG_OP: CMD_SWT_DEF(ERRVAL_WRONG_OP);
		case RET_WRONG_SIGN: CMD_SWT_DEF(ERRVAL_WRONG_SIGN);
		case RET_WRONG_ARG: CMD_SWT_DEF(ERRVAL_WRONG_ARG);
		case RET_RANGE_OUT: CMD_SWT_DEF(ERRVAL_RANGE_OUT);
		case RET_DISABLED: CMD_SWT_DEF(ERRVAL_DISABLED);
		case RET_NOT_ALLOWED: CMD_SWT_DEF(ERRVAL_NOT_ALLOWED);
		case RET_BUSY: CMD_SWT_DEF(ERRVAL_BUSY);
		case RET_TIMEOUT: CMD_SWT_DEF(ERRVAL_TIMEOUT);
		case RET_NO_SOCK: CMD_SWT_EXT('1', ERRVAL_NO_SOCK);
		case RET_SOCK_CLS: CMD_SWT_EXT('1', ERRVAL_SOCK_CLS);
		case RET_USING_PORT: CMD_SWT_EXT('1', ERRVAL_USING_PORT);
		case RET_NOT_CONN: CMD_SWT_EXT('1', ERRVAL_NOT_CONN);
		case RET_WRONG_ADDR: CMD_SWT_EXT('1', ERRVAL_WRONG_ADDR);
		case RET_NO_DATA: CMD_SWT_EXT('1', ERRVAL_NO_DATA);
		case RET_NO_FREEMEM: CMD_SWT_EXT('2', ERRVAL_NO_FREEMEM);
		default:termbuf[idx++] = '0';break;
		}
	}
	MAKE_RESP(atci.tcmd.arg1, ARG_1_SIZE);
	MAKE_RESP(atci.tcmd.arg2, ARG_2_SIZE);
	MAKE_RESP(atci.tcmd.arg3, ARG_3_SIZE);
	MAKE_RESP(atci.tcmd.arg4, ARG_4_SIZE);
	MAKE_RESP(atci.tcmd.arg5, ARG_5_SIZE);
	MAKE_RESP(atci.tcmd.arg6, ARG_6_SIZE);
	termbuf[idx++] = ']';
	termbuf[idx++] = 0;
	printf("%s\r\n", termbuf);	// print basic response
}
예제 #10
0
파일: cmdrun.c 프로젝트: seablueg/FWlib-dev
void act_nsock(int8 sock)
{
	uint8 tip[4];
	uint16 tport;

	if(sock < ATC_SOCK_NUM_START)
	{
		int8 *dump, i, type, cnt_con=0, cnt_notcon=0;
DBG("NSOCK-start");
		for(i=ATC_SOCK_NUM_START; i<=ATC_SOCK_NUM_END; i++) {
			if(sockstat[i] != SOCK_STAT_IDLE) {
				if(sockstat[i] & SOCK_STAT_CONNECTED) cnt_con++;
				else cnt_notcon++;
			}
		}
DBGA("NSOCK-con(%d),not(%d)", cnt_con, cnt_notcon);
 		if(cnt_con+cnt_notcon == 0) {
			cmd_resp_dump(VAL_NONE, NULL);
			return;
 		}
		dump = malloc((34*cnt_con)+(12*cnt_notcon)+1);
		if(dump == NULL) CMD_RESP_RET(RET_NO_FREEMEM, VAL_NONE);
		cnt_con = 0;
		for(i=ATC_SOCK_NUM_START; i<=ATC_SOCK_NUM_END; i++) {
			if(sockstat[i] == SOCK_STAT_IDLE) continue;
			if(cnt_con != 0) {
				dump[cnt_con++] = '\r';
				dump[cnt_con++] = '\n';
			}
			if((sockstat[i]&SOCK_STAT_PROTMASK)==SOCK_STAT_TCP_SRV) type = 'S';
			else if((sockstat[i]&SOCK_STAT_PROTMASK)==SOCK_STAT_TCP_CLT) type='C';
			else type = 'U';

			if(sockstat[i] & SOCK_STAT_CONNECTED) {
				GetDstInfo((uint8)i, tip, &tport);
				sprintf((char*)&dump[cnt_con], "%d,%c,%d,%d.%d.%d.%d,%d", i, type, 
					sockport[i], tip[0], tip[1], tip[2], tip[3], tport);
			} else {
				sprintf((char*)&dump[cnt_con], "%d,%c,%d", i, type, sockport[i]);
			}

			cnt_con += strlen((char*)&dump[cnt_con]);
		}
		cmd_resp_dump(VAL_NONE, dump);
	} 
	else if(sock <= ATC_SOCK_NUM_END)
	{
		if(sockstat[sock] == SOCK_STAT_IDLE) 
			sprintf((char*)atci.tcmd.arg1, "%c", 'I');
		else if((sockstat[sock] & SOCK_STAT_PROTMASK) == SOCK_STAT_TCP_SRV) 
			sprintf((char*)atci.tcmd.arg1, "%c", 'S');
		else if((sockstat[sock] & SOCK_STAT_PROTMASK) == SOCK_STAT_TCP_CLT) 
			sprintf((char*)atci.tcmd.arg1, "%c", 'C');
		else if((sockstat[sock] & SOCK_STAT_PROTMASK) == SOCK_STAT_UDP) 
			sprintf((char*)atci.tcmd.arg1, "%c", 'U');
		else CRITICAL_ERRA("wrong sock state(0x%d)", sockstat[sock]);
		sprintf((char*)atci.tcmd.arg2, "%d", sockport[sock]);
		if(sockstat[sock] & SOCK_STAT_CONNECTED) {
			GetDstInfo((uint8)sock, tip, &tport);
			sprintf((char*)atci.tcmd.arg3, "%d.%d.%d.%d", tip[0], tip[1], tip[2], tip[3]);
			sprintf((char*)atci.tcmd.arg4, "%d", tport);
		}
		CMD_RESP_RET(RET_OK, VAL_NONE);
	}
	else CMD_RESP_RET(RET_WRONG_ARG, VAL_NONE);
}
예제 #11
0
파일: cmdrun.c 프로젝트: seablueg/FWlib-dev
void atc_async_cb(uint8 sock, uint8 item, int32 ret)
{
	DBGCRTCA(sock<ATC_SOCK_NUM_START||sock>ATC_SOCK_NUM_END, "wrong sock(%d)", sock);

	switch(item) {
	case WATCH_SOCK_UDP_SEND:	DBG("WATCH_SOCK_UDP_SEND");
		sockbusy[sock] = VAL_FALSE;	//DBGA("WATCH UDP Sent - sock(%d), item(%d)", sock, item);
		if(ret == RET_OK) {
			cmd_resp(RET_OK, sock);
		} else {
			DBGA("WATCH_SOCK_UDP_SEND fail - ret(%d)", ret);
			cmd_resp(RET_TIMEOUT, sock);
		}
		break;
	case WATCH_SOCK_TCP_SEND:	DBG("WATCH_SOCK_TCP_SEND");
		if(ret < RET_OK) {
			sockbusy[sock] = VAL_FALSE;
			DBGA("WATCH_SOCK_TCP_SEND fail - ret(%d)", ret);
			sock_put(sock);
			cmd_resp(RET_TIMEOUT, sock);
		} else {
			tcpleft[sock] -= ret;
			if(tcpleft[sock] > 0) {
				ret = TCPReSendNB(sock);
				if(ret != RET_OK) {
					if(ret == SOCKERR_BUSY) {
						alarm_set(WINDOWFULL_WAIT_TIME, atc_resend_alarm, sock);
					} else if(ret == SOCKERR_WINDOW_FULL) {
						sockbusy[sock] = VAL_FALSE;
						DBGA("WATCH_SOCK_TCP_SEND fail - ret(%d)", ret);
						cmd_resp(RET_TIMEOUT, sock);
					} else {
						sockbusy[sock] = VAL_FALSE;
						DBGA("WATCH_SOCK_TCP_SEND fail - ret(%d)", ret);
						sock_put(sock);
						cmd_resp(RET_TIMEOUT, sock);
					}
				} else sockwatch_set(sock, WATCH_SOCK_TCP_SEND);
			} else {
				sockbusy[sock] = VAL_FALSE;
				cmd_resp(RET_OK, sock);
			}
		}
		break;
	case WATCH_SOCK_CONN_TRY:	DBG("WATCH_SOCK_CONN_TRY");
		sockbusy[sock] = VAL_FALSE;
		if(ret == RET_OK) {
			BITSET(sockstat[sock], SOCK_STAT_CONNECTED);
			sockwatch_set(sock, WATCH_SOCK_CLS_EVT);
			sockwatch_set(sock, WATCH_SOCK_RECV);
			cmd_resp(RET_ASYNC, sock);
		} else {
			DBGA("WATCH_SOCK_CONN_EVT fail - ret(%d)", ret);
			sock_put(sock);
			cmd_resp(RET_TIMEOUT, sock);
		}
		break;
	case WATCH_SOCK_CLS_TRY:	DBG("WATCH_SOCK_CLS_TRY");
		sockbusy[sock] = VAL_FALSE;
		if(ret == RET_OK) {
			sock_put(sock);
			cmd_resp(RET_ASYNC, sock);
		} else {
			CRITICAL_ERRA("WATCH_SOCK_CONN_EVT fail - ret(%d)", ret);
		}
		break;
	case WATCH_SOCK_CONN_EVT:	DBG("WATCH_SOCK_CONN_EVT");
		if(ret == RET_OK) {
			BITSET(sockstat[sock], SOCK_STAT_CONNECTED);
			sockwatch_set(sock, WATCH_SOCK_CLS_EVT);
			sockwatch_set(sock, WATCH_SOCK_RECV);
			if(atci.poll != POLL_MODE_FULL) EVENT_RESP(sock, SOCKEVENT_CONN);
			else event_enqueue(sock, SOCKEVENT_CONN);
		} else {
			CRITICAL_ERRA("WATCH_SOCK_CONN_EVT fail - ret(%d)", ret);
		}
		break;
	case WATCH_SOCK_CLS_EVT:	DBG("WATCH_SOCK_CLS_EVT");
		sockbusy[sock] = VAL_FALSE;
		if(ret == RET_OK) {
			if(sockwatch_chk(sock, WATCH_SOCK_CLS_TRY) == RET_OK) 
				cmd_resp(RET_OK, sock);
			sock_put(sock);
			if(atci.poll != POLL_MODE_FULL) EVENT_RESP(sock, SOCKEVENT_CLS);
			else event_enqueue(sock, SOCKEVENT_CLS);
		} else {
			CRITICAL_ERRA("WATCH_SOCK_CONN_EVT fail - ret(%d)", ret);
		}
		break;
	case WATCH_SOCK_RECV:	DBG("WATCH_SOCK_RECV");
		{
			int8 i;

			if(atci.poll != POLL_MODE_NONE) {
				recvnum++;
				if(recvord[sock] == 0) {
					for(i=ATC_SOCK_NUM_START; i<=ATC_SOCK_NUM_END; i++)
						if(recvord[i] != 0) recvord[i]++;
				} else {
					for(i=ATC_SOCK_NUM_START; i<=ATC_SOCK_NUM_END; i++)
						if(recvord[i] != 0 && recvord[i] < recvord[sock]) recvord[i]++;
				}
				recvord[sock] = 1;
				if(atci.poll != POLL_MODE_FULL) 
					EVENT_RESP_SIZE(sock, SOCKEVENT_RECV, GetSocketRxRecvBufferSize(sock));
				else event_enqueue(sock, SOCKEVENT_RECV);
			} else {
				act_nrecv(sock, WORK_BUF_SIZE);
			}
		}
		break;
	default: CRITICAL_ERRA("wrong item(0x%x)", item);
	}
}