コード例 #1
0
ファイル: RTOS.cpp プロジェクト: ReinaSaito/toppers_ev3rt_et
void RTOS::sndMessage(uint16 rv_mbx_id, void* rv_message){
    // 非同期メッセージ送信に使用する.
    //   OS のデータキューを利用.

    ER at_err = psnd_dtq(rv_mbx_id, reinterpret_cast<intptr_t>(rv_message));

    if(at_err != E_OK) {
        // 送信エラー発生時
        // T.B.D.
    }
    else {
        // Don't care...
    }
}
コード例 #2
0
ファイル: tcp_echo_srv2.c プロジェクト: Picosystems/Hkz0001
ER
tcp_echo_srv_rcv (ID cepid, ID repid)
{
    ER_UINT		rlen;
    ER		error;
    SYSTIM		now;
    uint16_t	blen, last;
    char		head, tail;

    if ((error = psnd_dtq(DTQ_TCP_ECHO_SRV_SND, (intptr_t)cepid)) != E_OK) {
        syslog(LOG_NOTICE, "[TES:%02d RCV] sync error: %s", cepid, itron_strerror(error));
        return error;
    }

    if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_FEVR)) != E_OK) {
        syslog(LOG_NOTICE, "[TES:%02d ACP] accept error = %s", cepid, itron_strerror(error));
        return error;
    }

#ifdef USE_TCP_EXTENTIONS
    if ((error = free_tcp_rep(repid, true)) != E_OK) {
        syslog(LOG_NOTICE, "[TES:%02d DEL] REP delete error: %s", cepid, itron_strerror(error));
        return error;
    }
#endif	/* of #ifdef USE_TCP_EXTENTIONS */

    syscall(get_tim(&now));
    syslog(LOG_NOTICE, "[TES:%02d ACP] connected:  %6ld, from: %s.%d",
           cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno);
    sptr = rptr = buffer;
    snd_count = snd_total = rcv_count = rcv_total = chars = 0;
    ena_rcv   = true;
    while (true) {

        /* 受信サイズを計算する。*/
        syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));
        if (sptr > rptr)
            blen = sptr - rptr;
        else
            blen = sizeof(buffer) - (rptr - buffer);
        syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK));

        /* 受信する。*/
        if ((rlen = tcp_rcv_dat(cepid, rptr, blen, TMO_FEVR)) <= 0) {
            if (rlen < 0)
                syslog(LOG_NOTICE, "[TES:%02d RCV] recv error = %s",
                       cepid, itron_strerror(rlen));
            break;
        }
        head = *rptr;
        tail = *(rptr + rlen - 1);
#ifdef SHOW_RCV_RANGE
        syslog(LOG_NOTICE, "[TES:%02d RCV] len: %4d, data %02x -> %02x",
               cepid, (uint16_t)rlen, head, tail);
#endif	/* of #ifdef SHOW_RCV_RANGE */
        rcv_count ++;
        rcv_total += rlen;

        syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));

        /* 受信ポインタを進める。*/
        if (rptr - buffer + rlen >= sizeof(buffer))
            rptr -= sizeof(buffer) - rlen;
        else
            rptr += rlen;

        /* バッファ内の文字数を増やす。*/
        last   =     chars;
        chars += (uint16_t)rlen;

        /* バッファ内に文字が入れば、送信タスクを起床する。*/
        if (last == 0 && chars > 0)
            sig_sem(SEM_TCP_ECHO_SRV_SND_READY);

        /* バッファ内に空きがあれば、受信タスクを起床する。*/
        if (sizeof(buffer) - chars > 0)
            sig_sem(SEM_TCP_ECHO_SRV_RCV_READY);

        syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK));

        /* バッファに空きができるまで待つ。*/
        syscall(wai_sem(SEM_TCP_ECHO_SRV_RCV_READY));
    }

    /* 受信完了 */
    ena_rcv = false;

    /* 受信バッファに文字が入るのを待っている送信タスクを起床する。*/
    if (chars == 0)
        sig_sem(SEM_TCP_ECHO_SRV_SND_READY);

    /* コネクションの切断が完了するまで待つ。*/
    syscall(wai_sem(SEM_TCP_ECHO_SRV_CLS_READY));

    return error;
}
コード例 #3
0
ファイル: udp_input.c プロジェクト: chenyifu/asp_tinet_mb
uint_t
udp_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp)
{
	T_NET_BUF	*input = *inputp;
	T_UDP_CEP	*cep;
	T_UDP_HDR	*udph;
	T_IP_HDR	*iph;
	int_t		ix;
	uint_t		len, hlen, ulen;

	hlen = (uint_t)GET_IF_IP_HDR_SIZE(input);

	NET_COUNT_UDP(net_count_udp.in_octets,  input->len - hlen);
	NET_COUNT_UDP(net_count_udp.in_packets, 1);
	NET_COUNT_MIB(udp_stats.udpInDatagrams, 1);

	/* ヘッダ長をチェックする。*/
	if (input->len < hlen + UDP_HDR_SIZE)
		goto buf_rel;

	udph = (T_UDP_HDR *)(input->buf + *offp);

	/* データグラム長をチェックする */
	ulen  = ntohs(udph->ulen);
	if (ulen != input->len - hlen)
		goto buf_rel;

	/* 宛先ポートが 0 のデータグラムは破棄する。RFC768 */
	if (udph->dport == 0)
		goto buf_rel;

#ifdef UDP_CFG_IN_CHECKSUM

	/* チェックサムをチェックする */
	if (udph->sum && IN_CKSUM(input, IPPROTO_UDP, *offp, ulen) != 0)
		goto buf_rel;

#endif	/* of #ifdef UDP_CFG_IN_CHECKSUM */

	iph = GET_IP_HDR(input);

	/* 宛先アドレスとポートをチェックする */
	for (ix = tmax_udp_ccepid; ix -- > 0; ) {
		cep = &udp_cep[ix];
		if (VALID_UDP_CEP(cep) &&
		    udp_is_dstaddr_accept(&cep->myaddr.ipaddr, &iph->dst) &&
		    ntohs(udph->dport) == cep->myaddr.portno) {
			len = (uint_t)(ntohs(udph->ulen) - UDP_HDR_SIZE);

			if (cep->rcv_tskid != TA_NULL) {	/* 非ノンブロッキングコールでペンディング中 */
				if (psnd_dtq(cep->rcvqid, (intptr_t)input) != E_OK)
					goto buf_rel;
				}

#ifdef UDP_CFG_NON_BLOCKING

			else if (cep->rcv_p_dstaddr != NULL) {	/* ノンブロッキングコールでペンディング中 */

				/* p_dstaddr を設定する。*/
				cep->rcv_p_dstaddr->portno = ntohs(udph->sport);
				IN_COPY_TO_HOST(&cep->rcv_p_dstaddr->ipaddr, &GET_IP_HDR(input)->src);

				/* データをバッファに移す。*/
				memcpy(cep->rcv_data, GET_UDP_SDU(input, *offp),
				       (size_t)(len < cep->rcv_len ? len : cep->rcv_len));
				syscall(rel_net_buf(input));

				if (IS_PTR_DEFINED(cep->callback))

#ifdef TCP_CFG_NON_BLOCKING_COMPAT14

					(*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_RCV_DAT, (void*)(uint32_t)len);

#else	/* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */

					(*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_RCV_DAT, (void*)&len);

#endif	/* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */

				else
					syslog(LOG_WARNING, "[UDP] no call back, CEP: %d.", GET_UDP_CEPID(cep));
				cep->rcv_p_dstaddr = NULL;
				}
コード例 #4
0
ファイル: tcp_echo_srv2.c プロジェクト: Picosystems/Hkz0001
ER
tcp_echo_srv_rcv (ID cepid, ID repid)
{
    ER		error;
    uint16_t	blen;

    if ((error = psnd_dtq(DTQ_TCP_ECHO_SRV_SND, (intptr_t)cepid)) != E_OK) {
        syslog(LOG_NOTICE, "[TES:%02d RCV] sync error: %s", cepid, itron_strerror(error));
        return error;
    }

    if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_NBLK)) != E_WBLK) {
        syslog(LOG_NOTICE, "[TES:%02d ACP] accept error = %s", cepid, itron_strerror(error));
        return error;
    }

    /* コネクション開設完了まで待つ。*/
    syscall(wai_sem(SEM_TCP_ECHO_SRV_RCV_READY));

    /* 待っている間にエラーになったら、コネクションの開設待ちに戻る。*/
    if (rcv_error != E_OK)
        return rcv_error;

#ifdef USE_TCP_EXTENTIONS
    if ((error = free_tcp_rep(repid, true)) != E_OK) {
        syslog(LOG_NOTICE, "[TES:%02d DEL] REP delete error: %s", cepid, itron_strerror(error));
        return error;
    }
#endif	/* of #ifdef USE_TCP_EXTENTIONS */

    while (true) {

        /* 受信サイズを計算する。*/
        syscall(wai_sem(SEM_TCP_ECHO_SRV_LOCK));
        if (sptr > rptr)
            blen = sptr - rptr;
        else
            blen = sizeof(buffer) - (rptr - buffer);
        syscall(sig_sem(SEM_TCP_ECHO_SRV_LOCK));

        /* 受信する。*/
        if ((error = tcp_rcv_dat(cepid, rptr, blen, TMO_NBLK)) != E_WBLK) {
            syslog(LOG_NOTICE, "[TES:%02d RCV] recv error = %s", cepid, itron_strerror(error));
            break;
        }

        /* 受信バッファに空ができるまで待つ。*/
        syscall(wai_sem(SEM_TCP_ECHO_SRV_RCV_READY));

        /* 待っている間に、受信文字数が 0 になるか、エラーになったら終了する。*/
        if (rcv_error <= 0)
            break;

    }

    /* 受信完了 */
    ena_rcv = false;

    /* 受信バッファに文字が入るのを待っている送信タスクを起床する。*/
    if (chars == 0)
        sig_sem(SEM_TCP_ECHO_SRV_SND_READY);

    /* コネクション切断完了まで待つ。*/
    syscall(wai_sem(SEM_TCP_ECHO_SRV_CLS_READY));

    return error == E_WBLK ? E_OK : error;
}