static ER send_udp_echo (ID cepid, T_IN_ADDR *ipaddr, uint16_t portno, char *line) { ER_UINT len; dst.ipaddr = *ipaddr; dst.portno = portno; len = strlen(line); syslog(LOG_NOTICE, "[UEC:%02d SND] sending: to: %s.%d: %s", cepid, IP2STR(NULL, &dst.ipaddr), dst.portno, line); if ((len = UDP_SND_DAT(cepid, &dst, line, len, TMO_FEVR)) < 0) { syslog(LOG_NOTICE, "[UEC:%02d SND] error: %s", cepid, itron_strerror(len)); return len; } if ((len = UDP_RCV_DAT(cepid, &dst, udp_buf, sizeof(udp_buf), 10*1000)) >= 0) { *(udp_buf + len) = '\0'; syslog(LOG_NOTICE, "[UEC:%02d RCV] received: from: %s.%d: %s", cepid, IP2STR(NULL, &dst.ipaddr), dst.portno, line); return E_OK; } else { syslog(LOG_NOTICE, "[UEC:%02d RCV] error: %s", cepid, itron_strerror(len)); return len; } }
void usrv_task(intptr_t exinf) { static uint8_t buffer[BUF_SIZE]; T_IPV4EP dst; T_IN4_ADDR addr; ER_UINT len; ID tskid; get_tid(&tskid); addr = IPV4_ADDR_LOCAL; syslog(LOG_NOTICE, "[UDP ECHO SRV:%d,%d] started, IP Address: %s.", tskid, (ID)exinf, ip2str(NULL, &addr)); while (true) { if ((len = udp_rcv_dat((ID)exinf, &dst, buffer, sizeof(buffer), 20 * 1000)) >= 0) { buffer[len] = '\0'; syslog(LOG_NOTICE, "[UDP ECHO SRV] recv, addr: %s:%d, len: %d, msg: '%s'", ip2str(NULL, &dst.ipaddr), dst.portno, len, buffer); if ((int)len > 0) { if ((len = udp_snd_dat((ID)exinf, &dst, buffer, len, TMO_FEVR)) < 0) syslog(LOG_NOTICE, "[UDP ECHO SRV] send, error: %s", itron_strerror(len)); } } else syslog(LOG_NOTICE, "[UDP ECHO SRV] recv, error: %s", itron_strerror(len)); } }
void tcp_echo_srv_task (intptr_t exinf) { ID tskid, cepid, repid; ER error = E_OK; syscall(get_tid(&tskid)); syslog(LOG_NOTICE, "[TCP ECHO SRV:%d] started.", tskid); while (true) { syscall(slp_tsk()); if ((error = get_tcp_cep (&cepid)) != E_OK) { syslog(LOG_NOTICE, "[TES:00 EXT] CEP create error: %s", itron_strerror(error)); continue; } while (true) { if ((error = get_tcp_rep (&repid)) != E_OK) { syslog(LOG_NOTICE, "[TES:00 EXT] REP create error: %s", itron_strerror(error)); break; } else if ((error = tcp_echo_srv(cepid, repid)) != E_OK) { error = free_tcp_rep(repid, error != E_DLT); break; } } if ((error = free_tcp_cep(cepid)) != E_OK) syslog(LOG_NOTICE, "[TES:%02d EXT] CEP delete error: %s", cepid, itron_strerror(error)); } }
void tcp_echo_srv_task(intptr_t exinf) { ID tskid; ER_UINT rlen, slen; ER error = E_OK; uint16_t soff, count, total; get_tid(&tskid); syslog(LOG_NOTICE, "[TCP ECHO SRV:%d,%d] started.", tskid, (int_t)exinf); while (true) { if (tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_FEVR) != E_OK) { syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] error: %s", itron_strerror(error)); continue; } total = count = 0; syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] connected from %s:%d", ip2str(NULL, &dst.ipaddr), dst.portno); while (true) { if ((rlen = tcp_rcv_dat((int_t)exinf, buffer, BUF_SIZE - 1, TMO_FEVR)) <= 0) { if (rlen != E_OK) syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] error: %s", itron_strerror(rlen)); break; } /*syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] count: %4d, len: %4d, data %02x -> %02x", ++ count, (uint16_t)rlen, *buffer, *(buffer + rlen - 1));*/ count ++; total += (uint16_t)rlen; soff = 0; while (rlen > 0) { if ((slen = tcp_snd_dat((int_t)exinf, &buffer[soff], rlen, TMO_FEVR)) < 0) { syslog(LOG_NOTICE, "[TCP ECHO SRV SND] error: %s", itron_strerror(slen)); goto err_fin; } /*syslog(LOG_NOTICE, "[TCP ECHO SRV SND] len: %d", slen);*/ rlen -= slen; soff += (uint16_t)slen; } } err_fin: if ((error = tcp_sht_cep((int_t)exinf)) != E_OK) syslog(LOG_NOTICE, "[TCP ECHO SRV SHT] error: %s", itron_strerror(error)); if ((error = tcp_cls_cep((int_t)exinf, TMO_FEVR)) != E_OK) syslog(LOG_NOTICE, "[TCP ECHO SRV CLS] error: %s", itron_strerror(error)); syslog(LOG_NOTICE, "[TCP ECHO SRV FIN] finished, total cnt: %d, len: %d", count, total); } }
static ER tcp_discard_srv (ID cepid, ID repid) { static char buffer[BUF_SIZE]; T_IPEP dst; ER_UINT rlen; ER error; SYSTIM time; uint32_t total; uint16_t count; uint8_t *buf = buffer; if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_FEVR)) != E_OK) { syslog(LOG_NOTICE, "[TDS:%02d RCV] 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, "[TDS:%02d DEL] REP delete error: %s", cepid, itron_strerror(error)); return error; } #endif /* of #ifdef USE_TCP_EXTENTIONS */ count = total = 0; get_tim(&time); syslog(LOG_NOTICE, "[TDS:%02d RCV] connected: %6ld, from: %s.%d", cepid, time / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno); while ((rlen = tcp_rcv_dat(cepid, buf, BUF_SIZE - 1, TMO_FEVR)) > 0) { count ++; #ifdef SHOW_RCV_RANGE syslog(LOG_NOTICE, "[TDS:%02d RCV] count: %4d, len: %4d, data: %02x -> %02x", cepid, count, (uint16_t)rlen, *buf, *(buf + rlen - 1)); #endif /* of #ifdef SHOW_RCV_RANGE */ total += rlen; } if (rlen != 0) syslog(LOG_NOTICE, "[TDS:%02d RCV] recv error: %s", cepid, itron_strerror(rlen)); if ((error = tcp_sht_cep(cepid)) != E_OK) syslog(LOG_NOTICE, "[TDS:%02d RCV] shutdown error: %s", cepid, itron_strerror(error)); if ((error = tcp_cls_cep(cepid, TMO_FEVR)) != E_OK) syslog(LOG_NOTICE, "[TDS:%02d RCV] close error: %s", cepid, itron_strerror(error)); get_tim(&time); syslog(LOG_NOTICE, "[TDS:%02d RCV] finished: %6ld, rcv: %4d, len: %ld", cepid, time / SYSTIM_HZ, count, total); return error; }
ER callback_nblk_tcp_telnet_srv (ID cepid, FN fncd, VP p_parblk) { ER error = E_OK; switch (fncd) { case TFN_TCP_ACP_CEP: nblk_error = *(ER*)p_parblk; syscall(sig_sem(SEM_TCP_TELNET_SRV_NBLK_READY)); break; case TFN_TCP_RCV_DAT: if ((nblk_rlen = *(ER_UINT*)p_parblk) < 0) syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) CBN] recv err: %s", itron_strerror(nblk_rlen)); syscall(sig_sem(SEM_TCP_TELNET_SRV_NRCV_READY)); break; case TFN_TCP_SND_DAT: if ((nblk_slen = *(ER_UINT*)p_parblk) < 0) syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) CBN] send err: %s", itron_strerror(nblk_slen)); syscall(sig_sem(SEM_TCP_TELNET_SRV_NSND_READY)); break; case TFN_TCP_CLS_CEP: if ((nblk_error = *(ER*)p_parblk) < 0) syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) CBN] clse err: %s", itron_strerror(nblk_error)); syscall(sig_sem(SEM_TCP_TELNET_SRV_NBLK_READY)); break; case TFN_TCP_RCV_BUF: if ((nblk_rlen = *(ER_UINT*)p_parblk) < 0) syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) CBN] rbuf err: %s", itron_strerror(nblk_rlen)); syscall(sig_sem(SEM_TCP_TELNET_SRV_NRCV_READY)); break; case TFN_TCP_GET_BUF: if ((nblk_slen = *(ER_UINT*)p_parblk) < 0) syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) CBN] sbuf err: %s", itron_strerror(nblk_slen)); syscall(sig_sem(SEM_TCP_TELNET_SRV_NSND_READY)); break; case TFN_TCP_CON_CEP: case TFN_TCP_SND_OOB: default: error = E_PAR; break; } return error; }
/* * エラーコードチェックのエラー処理 */ void _check_ercd(ER ercd, const char *file, int_t line) { syslog_3(LOG_ERROR, "## Unexpected error %s detected at %s:%u.", itron_strerror(ercd), file, line); test_finish(); }
static ER send_udp_echo (ID cepid, T_IN_ADDR *ipaddr, uint16_t portno, char *line) { ER_UINT error; uint_t len; dst.ipaddr = *ipaddr; dst.portno = portno; len = strlen(line); if ((error = UDP_SND_DAT(cepid, &dst, line, len, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[UEC:%02d SND] error: %s", cepid, itron_strerror(error)); return error; } else syslog(LOG_NOTICE, "[UEC:%02d SND] sending: to: %s.%d: %s", cepid, IP2STR(NULL, &dst.ipaddr), dst.portno, line); syscall(slp_tsk()); if (nblk_len < 0) { /* 0 以下の場合は、エラーコード */ syslog(LOG_NOTICE, "[UEC:%02d CBR] error: %s", cepid, itron_strerror(nblk_len)); return nblk_len; } if ((error = UDP_RCV_DAT(cepid, &dst, udp_buf, sizeof(udp_buf), TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[UEC:%02d RCV] error: %s", cepid, itron_strerror(error)); return error; } syscall(slp_tsk()); if (nblk_len < 0) { /* 0 以下の場合は、エラーコード */ syslog(LOG_NOTICE, "[UEC:%02d RCV] error: %s", cepid, itron_strerror(nblk_len)); return nblk_len; } else { udp_buf[nblk_len] = '\0'; syslog(LOG_NOTICE, "[UEC:%02d RCV] received: from: %s.%d: %s", cepid, IP2STR(NULL, &dst.ipaddr), dst.portno, udp_buf); nblk_len = E_OK; } return nblk_len; }
void check_point(uint_t count) { bool_t errorflag = false; ER rercd; ID prcid; SIL_PRE_LOC; /* * 割込みロック状態に */ SIL_LOC_INT(); /* * PRCID取得 */ sil_get_pid(&prcid); /* * シーケンスチェック */ if (++check_count[prcid-1] == count) { syslog_2(LOG_NOTICE, "PE %d : Check point %d passed.", prcid, count); } else { syslog_2(LOG_ERROR, "## PE %d : Unexpected check point %d.", prcid, count); errorflag = true; } /* * カーネルの内部状態の検査 */ if (check_bit_func != NULL) { rercd = (*check_bit_func)(); if (rercd < 0) { syslog_2(LOG_ERROR, "## Internal inconsistency detected (%s, %d).", itron_strerror(rercd), SERCD(rercd)); errorflag = true; } } /* * エラーが検出された場合は,テストプログラムを終了する. */ if (errorflag) { test_finish(); } /* * 割込みロック状態を解除 */ SIL_UNL_INT(); }
ER looutput (T_NET_BUF *output, TMO tmout) { ER error; NET_COUNT_LOOP(net_count_loop.out_octets, output->len); NET_COUNT_LOOP(net_count_loop.out_packets, 1); if ((error = tsnd_dtq(DTQ_LOOP_OUTPUT, output, tmout)) != E_OK) syslog(LOG_NOTICE, "[LOOP] drop error: %s", itron_strerror(error)); return error; }
ER callback_udp_echo_cli (ID cepid, FN fncd, void *p_parblk) { ER_UINT len; if ((len = UDP_RCV_DAT(cepid, &dst, udp_buf, sizeof(udp_buf), TMO_FEVR)) >= 0) { *(udp_buf + len) = '\0'; syslog(LOG_NOTICE, "[UEC:%02d RCV] recv: addr: %s.%d: %s", cepid, IP2STR(NULL, &dst.ipaddr), dst.portno, udp_buf); } else syslog(LOG_NOTICE, "[UEC:%02d RCV] recv: error: %s", cepid, itron_strerror(len)); return E_OK; }
static ER send_udp_echo (ID cepid, T_IN_ADDR *ipaddr, uint16_t portno, char *line) { ER_UINT len; dst.ipaddr = *ipaddr; dst.portno = portno; len = strlen(line); syslog(LOG_NOTICE, "[UEC:%02d SND] sending: to: %s.%d: %s", cepid, IP2STR(NULL, &dst.ipaddr), dst.portno, line); if ((len = UDP_SND_DAT(cepid, &dst, line, len, TMO_FEVR)) < 0) syslog(LOG_NOTICE, "[UEC:%02d SND] error: %s", cepid, itron_strerror(len)); return E_OK; }
void tcp_echo_srv_task(intptr_t exinf) { ID tskid; ER error; syscall(get_tid(&tskid)); syslog(LOG_NOTICE, "[TCP ECHO SRV:%d,%d] started.", tskid, (ID)exinf); while (true) { while ((error = tcp_echo_srv((ID)exinf, TCP_ECHO_SRV_REPID)) == E_OK) ; syslog(LOG_NOTICE, "[TES:%02d] goto sleep 60[s], error: %s", (ID)exinf, itron_strerror(error)); tslp_tsk(60 * 1000); } }
void if_loop_output_task (intptr_t exinf) { T_NET_BUF *output; ER error; ID tskid; get_tid(&tskid); syslog(LOG_NOTICE, "[LOOP OUTPUT:%d] started.", tskid); while (true) { if (rcv_dtq(DTQ_LOOP_OUTPUT, (intptr_t*)&output) == E_OK) { NET_COUNT_LOOP(net_count_loop.in_octets, output->len); NET_COUNT_LOOP(net_count_loop.in_packets, 1); if ((error = snd_dtq(DTQ_LOOP_INPUT, output)) != E_OK) syslog(LOG_NOTICE, "[LOOP OUTPUT] drop error: %s", itron_strerror(error)); } } }
void main_task(intptr_t exinf) { //串口任务初始化 ER_UINT ercd; SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG))); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf); ercd = serial_opn_por(TASK_PORTID); if (ercd < 0 && MERCD(ercd) != E_OBJ) { syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.", itron_strerror(ercd), SERCD(ercd)); } SVC_PERROR(serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); //初始化其它的任务 SVC_PERROR(act_tsk(SPEED_TASK)); SVC_PERROR(act_tsk(FOLLOW_TASK)); SVC_PERROR(act_tsk(SENSORS_TASK)); SVC_PERROR(sta_cyc(CYC_HANDLE)); //结束自己的使命 ext_tsk(); }
void tcp_echo_srv_task(intptr_t exinf) { ID tskid; ER error; uint32_t total; uint16_t rlen, slen, soff, count; char head, tail; get_tid(&tskid); syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK):%d,%d] started.", tskid, (int_t)exinf); while (true) { if ((error = tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(error)); continue; } /* 相手から接続されるまで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); if (nblk_error == E_OK) { syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] connected from %s:%d", ip2str(NULL, &dst.ipaddr), dst.portno); } else { syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error)); continue; } count = total = 0; while (true) { if ((error = tcp_rcv_dat((int_t)exinf, buffer, BUF_SIZE - 1, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s", itron_strerror(error)); break; } /* 受信完了まで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); if (nblk_rlen < 0) { syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] error: %s", itron_strerror(nblk_rlen)); break; } else if (nblk_rlen == 0) break; rlen = (uint16_t)nblk_rlen; total += (uint32_t)nblk_rlen; head = *buffer; tail = *(buffer + rlen - 1); count ++; /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) RCV] count: %4d, len: %4d, data %02x -> %02x", ++ count, rlen, head, tail);*/ soff = 0; while (rlen > 0) { if ((error = tcp_snd_dat((int_t)exinf, &buffer[soff], rlen, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s", itron_strerror(error)); goto err_fin; } /* 送信完了まで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); if (nblk_slen < 0) { syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] error: %s", itron_strerror(nblk_slen)); goto err_fin; } else /*syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SND] len: %4d", nblk_slen)*/; slen = (uint16_t)nblk_slen; rlen -= slen; soff += slen; } } err_fin: if ((error = tcp_sht_cep((int_t)exinf)) != E_OK) syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) SHT] error: %s", itron_strerror(error)); if ((error = tcp_cls_cep((int_t)exinf, TMO_NBLK)) != E_WBLK) syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) CLS] error: %s", itron_strerror(error)); /* 開放が完了するまで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) FIN] finished, total cnt: %d, len: %d", count, total); } }
static ER tcp_echo_srv (ID cepid, ID repid) { ER_UINT rlen, slen; ER error = E_OK; SYSTIM now; uint32_t total; uint16_t soff, scount, rcount; if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_FEVR)) != E_OK) { syslog(LOG_NOTICE, "[TES:%02d ACP] 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)); #endif /* of #ifdef USE_TCP_EXTENTIONS */ scount = rcount = total = 0; syscall(get_tim(&now)); syslog(LOG_NOTICE, "[TES:%02d ACP] connected: %6lu, from: %s.%u", cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno); while (true) { if ((rlen = tcp_rcv_dat(cepid, buffer, BUF_SIZE - 1, RCV_TMO)) <= 0) { if (rlen != E_OK) syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s", cepid, itron_strerror(rlen)); break; } rcount ++; #ifdef SHOW_RCV_RANGE syslog(LOG_NOTICE, "[TES:%02d RCV] rcount: %4d, len: %4d, data %02x -> %02x", cepid, rcount, (uint16_t)rlen, *buffer, *(buffer + rlen - 1)); #endif /* of #ifdef SHOW_RCV_RANGE */ total += rlen; soff = 0; while (rlen > 0) { scount ++; if ((slen = tcp_snd_dat(cepid, &buffer[soff], rlen, SND_TMO)) < 0) { syslog(LOG_NOTICE, "[TES:%02d SND] error: %s", cepid, itron_strerror(slen)); goto err_fin; } #ifdef SHOW_RCV_RANGE syslog(LOG_NOTICE, "[TES:%02d SND] scount: %4d, len: %4d", cepid, scount, (uint16_t)slen); #endif /* of #ifdef SHOW_RCV_RANGE */ rlen -= slen; soff += slen; } } err_fin: #ifdef USE_TCP_SHT_CEP if ((error = tcp_sht_cep(cepid)) != E_OK) syslog(LOG_NOTICE, "[TES:%02d SHT] error: %s", cepid, itron_strerror(error)); #endif /* of #ifdef USE_TCP_SHT_CEP */ if ((error = tcp_cls_cep(cepid, CLS_TMO)) != E_OK) syslog(LOG_NOTICE, "[TES:%02d CLS] error: %s", cepid, itron_strerror(error)); syscall(get_tim(&now)); syslog(LOG_NOTICE, "[TES:%02d FIN] finished: %6lu, snd: %4u, rcv: %4u, len: %lu", cepid, now / SYSTIM_HZ, scount, rcount, total); return error; }
static ER tcp_echo_srv (ID cepid, ID repid) { ER_UINT rblen, sblen; SYSTIM now; ER error; uint32_t total; uint16_t rlen, slen, soff, scount, rcount; char *rbuf, *sbuf, head, tail; if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_FEVR)) != E_OK) { syslog(LOG_NOTICE, "[TES:%02d ACP] 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)); #endif /* of #ifdef USE_TCP_EXTENTIONS */ scount = rcount = total = 0; syscall(get_tim(&now)); syslog(LOG_NOTICE, "[TES:%02d ACP] connected: %6lu, from: %s.%u", cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno); while (true) { if ((rblen = tcp_rcv_buf(cepid, (void**)&rbuf, RCV_TMO)) <= 0) { if (rblen != E_OK) syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s", cepid, itron_strerror(rblen)); break; } head = *rbuf; tail = *(rbuf + rblen - 1); rcount ++; //syslog(LOG_NOTICE, "[TES:%02d RCV] len: %4d", cepid, (uint16_t)rblen); #ifdef SHOW_RCV_RANGE syslog(LOG_NOTICE, "[TES:%02d RCV] rcount: %4d, len: %4d, data %02x -> %02x", cepid, rcount, (uint16_t)rblen, head, tail); #endif /* of #ifdef SHOW_RCV_RANGE */ rlen = (uint16_t)rblen; total += rblen; soff = 0; while (rlen > 0) { if ((sblen = tcp_get_buf(cepid, (void**)&sbuf, SND_TMO)) < 0) { syslog(LOG_NOTICE, "[TES:%02d GET] error: %s", cepid, itron_strerror(sblen)); goto err_fin; } //syslog(LOG_NOTICE, "[TES:%02d SND] len: %4d", cepid, (uint16_t)sblen); scount ++; slen = rlen < (uint16_t)sblen ? rlen : (uint16_t)sblen; memcpy(sbuf, rbuf + soff, slen); if ((error = tcp_snd_buf(cepid, slen)) != E_OK) { syslog(LOG_NOTICE, "[TES:%02d SND] error: %s", cepid, itron_strerror(error)); goto err_fin; } #ifdef SHOW_RCV_RANGE syslog(LOG_NOTICE, "[TES:%02d SND] scount: %4d, len: %4d", cepid, scount, slen); #endif /* of #ifdef SHOW_RCV_RANGE */ rlen -= slen; soff += slen; } if ((error = tcp_rel_buf(cepid, rblen)) < 0) { syslog(LOG_NOTICE, "[TES:%02d REL] error: %s", cepid, itron_strerror(error)); break; } } err_fin: #ifdef USE_TCP_SHT_CEP if ((error = tcp_sht_cep(cepid)) != E_OK) syslog(LOG_NOTICE, "[TES:%02d SHT] error: %s", cepid, itron_strerror(error)); #endif /* of #ifdef USE_TCP_SHT_CEP */ if ((error = tcp_cls_cep(cepid, CLS_TMO)) != E_OK) syslog(LOG_NOTICE, "[TES:%02d CLS] error: %s", cepid, itron_strerror(error)); syscall(get_tim(&now)); syslog(LOG_NOTICE, "[TES:%02d FIN] finished: %6lu, snd: %4u, rcv: %4u, len: %lu", cepid, now / SYSTIM_HZ, scount, rcount, total); return error; }
static ER tcp_echo_srv (ID cepid, ID repid) { SYSTIM now; ER error; uint32_t total; uint16_t rlen, slen, soff, scount, rcount; char head, tail; if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TES:%02d ACP] error: %s", cepid, itron_strerror(error)); return error; } /* 相手から接続されるまで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); if (nblk_error == E_OK) { syscall(get_tim(&now)); syslog(LOG_NOTICE, "[TES:%02d ACP] connected: %6lu, from: %s.%u", cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno); } else { syslog(LOG_NOTICE, "[TES:%02d ACP] error: %s", cepid, itron_strerror(nblk_error)); return nblk_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)); #endif /* of #ifdef USE_TCP_EXTENTIONS */ scount = rcount = total = 0; while (true) { if ((error = tcp_rcv_dat(cepid, buffer, BUF_SIZE - 1, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s", cepid, itron_strerror(error)); break; } /* 受信完了まで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); if (nblk_rlen < 0) { syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s", cepid, itron_strerror(nblk_rlen)); break; } else if (nblk_rlen == 0) break; rlen = nblk_rlen; head = *buffer; tail = *(buffer + rlen - 1); rcount ++; #ifdef SHOW_RCV_RANGE syslog(LOG_NOTICE, "[TES:%02d RCV] rcount: %4d, len: %4d, data %02x -> %02x", cepid, rcount, rlen, head, tail); #endif /* of #ifdef SHOW_RCV_RANGE */ total += rlen; soff = 0; while (rlen > 0) { scount ++; if ((error = tcp_snd_dat(cepid, &buffer[soff], rlen, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TES:%02d SND] error: %s", cepid, itron_strerror(error)); goto err_fin; } /* 送信完了まで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); if (nblk_slen < 0) { syslog(LOG_NOTICE, "[TES:%02d SND] error: %s", cepid, itron_strerror(nblk_slen)); goto err_fin; } slen = nblk_slen; #ifdef SHOW_RCV_RANGE syslog(LOG_NOTICE, "[TES:%02d SND] scount: %4d, len: %4d", cepid, scount, slen); #endif /* of #ifdef SHOW_RCV_RANGE */ rlen -= slen; soff += slen; } } err_fin: #ifdef USE_TCP_SHT_CEP if ((error = tcp_sht_cep(cepid)) != E_OK) syslog(LOG_NOTICE, "[TES:%02d SHT] error: %s", cepid, itron_strerror(error)); #endif /* of #ifdef USE_TCP_SHT_CEP */ if ((error = tcp_cls_cep(cepid, TMO_NBLK)) != E_WBLK) syslog(LOG_NOTICE, "[TES:%02d CLS] error: %s", cepid, itron_strerror(error)); /* 開放が完了するまで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); syscall(get_tim(&now)); syslog(LOG_NOTICE, "[TES:%02d FIN] finished: %6lu, snd: %4u, rcv: %4u, len: %lu", cepid, now / SYSTIM_HZ, scount, rcount, total); return error == E_WBLK ? E_OK : error; }
/* * メインタスク */ void main_task(intptr_t exinf) { char c; ID tskid = TASK1; int_t tskno = 1; ER_UINT ercd; PRI tskpri; #ifndef TASK_LOOP volatile ulong_t i; SYSTIM stime1, stime2; #endif /* TASK_LOOP */ #ifdef TOPPERS_SUPPORT_GET_UTM SYSUTM utime1, utime2; #endif /* TOPPERS_SUPPORT_GET_UTM */ T_CTSK ctsk; T_DTEX dtex; ID TASK3 = -1; SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf); /* * シリアルポートの初期化 * * システムログタスクと同じシリアルポートを使う場合など,シリアル * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は * ない. */ ercd = serial_opn_por(TASK_PORTID); if (ercd < 0 && MERCD(ercd) != E_OBJ) { syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.", itron_strerror(ercd), SERCD(ercd)); } SVC_PERROR(serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* * ループ回数の設定 * * 並行実行されるタスク内での空ループの回数(task_loop)は,空ルー * プの実行時間が約0.4秒になるように設定する.この設定のために, * LOOP_REF回の空ループの実行時間を,その前後でget_timを呼ぶことで * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ回 * 数を求め,task_loopに設定する. * * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ * り遅いプロセッサでは,サンプルプログラムの実行開始に時間がかか * りすぎるという問題を生じる.逆に想定したより速いプロセッサでは, * LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値 * の誤差が大きくなるという問題がある. * * そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適 * 切な値に定義するのが望ましい. * * また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定を * 行わずに,TASK_LOOPに定義された値を空ループの回数とする. * * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ * りも長めになるものがある.このようなターゲットでは,MEASURE_TWICE * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果 * を使う. * * タスク例外処理ルーチン内での空ループの回数(tex_loop)は, * task_loopの4分の1の値(空ループの実行時間が0.1秒になるループ回 * 数)に設定する. */ #ifdef TASK_LOOP task_loop = TASK_LOOP; #else /* TASK_LOOP */ #ifdef MEASURE_TWICE task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); #endif /* MEASURE_TWICE */ task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); task_loop = LOOP_REF * 400UL / (stime2 - stime1); #endif /* TASK_LOOP */ tex_loop = task_loop / 4; /* * タスクの起動 */ SVC_PERROR(act_tsk(TASK1)); SVC_PERROR(act_tsk(TASK2)); /* * メインループ */ do { SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1)); switch (c) { case 'e': case 's': case 'S': case 'd': case 'y': case 'Y': case 'z': case 'Z': message[tskno-1] = c; break; case '1': tskno = 1; tskid = TASK1; break; case '2': tskno = 2; tskid = TASK2; break; case '3': tskno = 3; tskid = TASK3; break; case 'a': syslog(LOG_INFO, "#act_tsk(%d)", tskno); SVC_PERROR(act_tsk(tskid)); break; case 'A': syslog(LOG_INFO, "#can_act(%d)", tskno); SVC_PERROR(ercd = can_act(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd); } break; case 't': syslog(LOG_INFO, "#ter_tsk(%d)", tskno); SVC_PERROR(ter_tsk(tskid)); break; case '>': syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY)); break; case '=': syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, MID_PRIORITY)); break; case '<': syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, LOW_PRIORITY)); break; case 'G': syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); SVC_PERROR(ercd = get_pri(tskid, &tskpri)); if (ercd >= 0) { syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); } break; case 'w': syslog(LOG_INFO, "#wup_tsk(%d)", tskno); SVC_PERROR(wup_tsk(tskid)); break; case 'W': syslog(LOG_INFO, "#can_wup(%d)", tskno); SVC_PERROR(ercd = can_wup(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd); } break; case 'l': syslog(LOG_INFO, "#rel_wai(%d)", tskno); SVC_PERROR(rel_wai(tskid)); break; case 'u': syslog(LOG_INFO, "#sus_tsk(%d)", tskno); SVC_PERROR(sus_tsk(tskid)); break; case 'm': syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); SVC_PERROR(rsm_tsk(tskid)); break; case 'x': syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno); SVC_PERROR(ras_tex(tskid, 0x0001U)); break; case 'X': syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno); SVC_PERROR(ras_tex(tskid, 0x0002U)); break; case 'r': syslog(LOG_INFO, "#rot_rdq(three priorities)"); SVC_PERROR(rot_rdq(HIGH_PRIORITY)); SVC_PERROR(rot_rdq(MID_PRIORITY)); SVC_PERROR(rot_rdq(LOW_PRIORITY)); break; case 'c': syslog(LOG_INFO, "#sta_cyc(1)"); SVC_PERROR(sta_cyc(CYCHDR1)); break; case 'C': syslog(LOG_INFO, "#stp_cyc(1)"); SVC_PERROR(stp_cyc(CYCHDR1)); break; case 'b': syslog(LOG_INFO, "#sta_alm(1, 5000)"); SVC_PERROR(sta_alm(ALMHDR1, 5000)); break; case 'B': syslog(LOG_INFO, "#stp_alm(1)"); SVC_PERROR(stp_alm(ALMHDR1)); break; case '@': ctsk.tskatr = TA_NULL; ctsk.exinf = 3; ctsk.task = task; ctsk.itskpri = MID_PRIORITY; ctsk.stksz = STACK_SIZE; ctsk.stk = NULL; SVC_PERROR(TASK3 = acre_tsk(&ctsk)); dtex.texatr = TA_NULL; dtex.texrtn = tex_routine; SVC_PERROR(def_tex(TASK3, &dtex)); syslog(LOG_NOTICE, "task3 is created with tskid = %d.", (int_t) TASK3); break; case '!': syslog(LOG_INFO, "#del_tsk(%d)", tskno); SVC_PERROR(del_tsk(tskid)); break; case 'V': #ifdef TOPPERS_SUPPORT_GET_UTM SVC_PERROR(get_utm(&utime1)); SVC_PERROR(get_utm(&utime2)); syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld", (ulong_t) utime1, (ulong_t) utime2); #else /* TOPPERS_SUPPORT_GET_UTM */ syslog(LOG_NOTICE, "get_utm is not supported."); #endif /* TOPPERS_SUPPORT_GET_UTM */ break; case 'v': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); break; case 'q': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG))); break; #ifdef BIT_KERNEL case ' ': SVC_PERROR(loc_cpu()); { extern ER bit_kernel(void); SVC_PERROR(ercd = bit_kernel()); if (ercd >= 0) { syslog(LOG_NOTICE, "bit_kernel passed."); } } SVC_PERROR(unl_cpu()); break; #endif /* BIT_KERNEL */ case '$': syslog(LOG_INFO, "#%d#twai_sem(10000)", tskno); SVC_PERROR(twai_sem(TEST_SEM, 10000)); break; default: break; } } while (c != '\003' && c != 'Q'); syslog(LOG_NOTICE, "Sample program ends."); SVC_PERROR(ext_ker()); assert(0); }
void udp_echo_cli_task (intptr_t exinf) { static char msg[sizeof(MESSAGE_FORMAT)] = MESSAGE_FORMAT; T_IN_ADDR addr; ID tskid, cepid; ER error = E_OK; char *line, *p; int_t rep; uint32_t count, msgno; uint16_t portno; #ifdef USE_UDP_EXTENTIONS T_UDP_CCEP ccep; #endif /* of #ifdef USE_UDP_EXTENTIONS */ get_tid(&tskid); syslog(LOG_NOTICE, "[UDP ECHO CLI:%d,%d] started.", tskid, (ID)exinf); while (true) { if (rcv_dtq(DTQ_UDP_ECHO_CLI, (intptr_t*)&line) == E_OK) { #ifdef USE_UDP_EXTENTIONS ccep.cepatr = UINT_C(0); ccep.myaddr.portno = UDP_PORTANY; #if defined(SUPPORT_INET4) ccep.myaddr.ipaddr = IPV4_ADDRANY; #endif #if defined(SUPPORT_INET6) memcpy(&ccep.myaddr.ipaddr, &ipv6_addrany, sizeof(T_IN6_ADDR)); #endif #ifdef USE_UDP_NON_BLOCKING ccep.callback = (FP)callback_nblk_udp_echo_cli; #else ccep.callback = NULL; #endif if ((error = alloc_udp_cep(&cepid, tskid, &ccep)) != E_OK) { syslog(LOG_NOTICE, "[UEC:%02d TSK] CEP create error: %s", cepid, itron_strerror(error)); continue; } #else /* of #ifdef USE_UDP_EXTENTIONS */ cepid = (ID)exinf; #endif /* of #ifdef USE_UDP_EXTENTIONS */ line = skip_blanks(GET_IPADDR(&addr, skip_blanks(line))); /* IP Address */ if ('0' <= *line && *line <= '9') { /* Port No */ line = get_int(&rep, line); portno = (uint16_t)rep; } else { line ++; portno = ECHO_SRV_PORTNO; } line = skip_blanks(line); if ('0' <= *line && *line <= '9') { /* Repeat */ line = get_int(&rep, line); if (rep > 1000000) rep = 1000000; udp_echo_cli_valid = true; for (count = 0; count ++ < rep; ) { if (!udp_echo_cli_valid) { syslog(LOG_NOTICE, "[UEC:%02d TSK] canceled.", cepid); break; } p = &msg[sizeof(MESSAGE_FORMAT)] - 1; for (msgno = count; msgno > 0; msgno /= 10) *(-- p) = msgno % 10 + '0'; while (*(p - 2) != 'G') *(-- p) = ' '; if ((error = send_udp_echo(cepid, &addr, portno, msg)) != E_OK) break; dly_tsk(10 * SYSTIM_HZ + net_rand() % (10 * SYSTIM_HZ)); } } else /* Single Message */ error = send_udp_echo(cepid, &addr, portno, line); if (error != E_OK) syslog(LOG_NOTICE, "[UEC:%02d TSK] error: %s", cepid, itron_strerror(error)); #ifdef USE_UDP_EXTENTIONS if ((error = free_udp_cep(cepid, !(error == E_NOEXS || error == E_DLT))) != E_OK) syslog(LOG_NOTICE, "[UEC:%02d TSK] CEP delete error: %s", cepid, itron_strerror(error)); #endif /* of #ifdef USE_UDP_EXTENTIONS */ } } }
void tcp_echo_srv_task(intptr_t exinf) { ID tskid; ER_UINT rblen, sblen; ER error = E_OK; uint32_t total; uint16_t rlen, slen, soff, count; char *rbuf, *sbuf, head, tail; get_tid(&tskid); syslog(LOG_NOTICE, "[TCP ECHO SRV:%d,%d] (copy save API) started.", tskid, (int_t)exinf); while (true) { if (tcp_acp_cep((int_t)exinf, TCP_ECHO_SRV_REPID, &dst, TMO_FEVR) != E_OK) { syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] error: %s", itron_strerror(error)); continue; } total = count = 0; syslog(LOG_NOTICE, "[TCP ECHO SRV ACP] connected from %s:%d", ip2str(NULL, &dst.ipaddr), dst.portno); while (true) { if ((rblen = tcp_rcv_buf((int_t)exinf, (void **)&rbuf, TMO_FEVR)) <= 0) { if (rblen != E_OK) syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] error: %s", itron_strerror(rblen)); break; } rlen = (uint16_t)rblen; total += (uint32_t)rblen; head = *rbuf; tail = *(rbuf + rlen - 1); count ++; /*syslog(LOG_NOTICE, "[TCP ECHO SRV RCV] count: %4d, len: %4d, data %02x -> %02x", ++ count, rlen, head, tail);*/ soff = 0; while (rlen > 0) { if ((sblen = tcp_get_buf((int_t)exinf, (void **)&sbuf, TMO_FEVR)) < 0) { syslog(LOG_NOTICE, "[TCP ECHO SRV GET] error: %s", itron_strerror(sblen)); goto err_fin; } /*syslog(LOG_NOTICE, "[TCP ECHO SRV GET] len: %d", sblen);*/ slen = rlen < (uint16_t)sblen ? rlen : (uint16_t)sblen; memcpy(sbuf, rbuf + soff, slen); if ((error = tcp_snd_buf((int_t)exinf, slen)) != E_OK) { syslog(LOG_NOTICE, "[TCP ECHO SRV SND] error: %s", itron_strerror(error)); goto err_fin; } /*syslog(LOG_NOTICE, "[TCP ECHO SRV SND] len: %d", slen);*/ rlen -= slen; soff += slen; } if ((error = tcp_rel_buf((int_t)exinf, rblen)) < 0) { syslog(LOG_NOTICE, "[TCP ECHO SRV REL] error: %s", itron_strerror(error)); break; } } err_fin: if ((error = tcp_sht_cep((int_t)exinf)) != E_OK) syslog(LOG_NOTICE, "[TCP ECHO SRV SHT] error: %s", itron_strerror(error)); if ((error = tcp_cls_cep((int_t)exinf, TMO_FEVR)) != E_OK) syslog(LOG_NOTICE, "[TCP ECHO SRV CLS] error: %s", itron_strerror(error)); syslog(LOG_NOTICE, "[TCP ECHO SRV FIN] finished, total cnt: %d, len: %d", count, total); } }
/* * メインタスク */ void main_task(intptr_t exinf) { char_t c; ID tskid = TASK1; int_t tskno = 1; ER_UINT ercd; PRI tskpri; #ifndef TASK_LOOP volatile ulong_t i; SYSTIM stime1, stime2; #endif /* TASK_LOOP */ #ifdef TOPPERS_SUPPORT_GET_UTM SYSUTM utime1, utime2; #endif /* TOPPERS_SUPPORT_GET_UTM */ SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf); /* * シリアルポートの初期化 * * システムログタスクと同じシリアルポートを使う場合など,シリアル * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は * ない. */ ercd = serial_opn_por(TASK_PORTID); if (ercd < 0 && MERCD(ercd) != E_OBJ) { syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.", itron_strerror(ercd), SERCD(ercd)); } SVC_PERROR(serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* * ループ回数の設定 * * TASK_LOOPがマクロ定義されている場合,測定せずに,TASK_LOOPに定 * 義された値を,タスク内でのループ回数とする. * * MEASURE_TWICEがマクロ定義されている場合,1回目の測定結果を捨て * て,2回目の測定結果を使う.1回目の測定は長めの時間が出るため. */ #ifdef TASK_LOOP task_loop = TASK_LOOP; #else /* TASK_LOOP */ #ifdef MEASURE_TWICE task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); #endif /* MEASURE_TWICE */ task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); task_loop = LOOP_REF * 400UL / (stime2 - stime1); #endif /* TASK_LOOP */ tex_loop = task_loop / 5; /* * タスクの起動 */ SVC_PERROR(act_tsk(TASK1)); SVC_PERROR(act_tsk(TASK2)); SVC_PERROR(act_tsk(TASK3)); /* * メインループ */ do { SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1)); switch (c) { case 'e': case 's': case 'S': case 'd': case 'y': case 'Y': case 'z': case 'Z': message[tskno-1] = c; break; case '1': tskno = 1; tskid = TASK1; break; case '2': tskno = 2; tskid = TASK2; break; case '3': tskno = 3; tskid = TASK3; break; case 'a': syslog(LOG_INFO, "#act_tsk(%d)", tskno); SVC_PERROR(act_tsk(tskid)); break; case 'A': syslog(LOG_INFO, "#can_act(%d)", tskno); SVC_PERROR(ercd = can_act(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd); } break; case 't': syslog(LOG_INFO, "#ter_tsk(%d)", tskno); SVC_PERROR(ter_tsk(tskid)); break; case '>': syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY)); break; case '=': syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, MID_PRIORITY)); break; case '<': syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, LOW_PRIORITY)); break; case 'G': syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); SVC_PERROR(ercd = get_pri(tskid, &tskpri)); if (ercd >= 0) { syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); } break; case 'w': syslog(LOG_INFO, "#wup_tsk(%d)", tskno); SVC_PERROR(wup_tsk(tskid)); break; case 'W': syslog(LOG_INFO, "#can_wup(%d)", tskno); SVC_PERROR(ercd = can_wup(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd); } break; case 'l': syslog(LOG_INFO, "#rel_wai(%d)", tskno); SVC_PERROR(rel_wai(tskid)); break; case 'u': syslog(LOG_INFO, "#sus_tsk(%d)", tskno); SVC_PERROR(sus_tsk(tskid)); break; case 'm': syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); SVC_PERROR(rsm_tsk(tskid)); break; case 'x': syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno); SVC_PERROR(ras_tex(tskid, 0x0001U)); break; case 'X': syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno); SVC_PERROR(ras_tex(tskid, 0x0002U)); break; case 'r': syslog(LOG_INFO, "#rot_rdq(three priorities)"); SVC_PERROR(rot_rdq(HIGH_PRIORITY)); SVC_PERROR(rot_rdq(MID_PRIORITY)); SVC_PERROR(rot_rdq(LOW_PRIORITY)); break; case 'c': syslog(LOG_INFO, "#sta_cyc(1)"); SVC_PERROR(sta_cyc(CYCHDR1)); break; case 'C': syslog(LOG_INFO, "#stp_cyc(1)"); SVC_PERROR(stp_cyc(CYCHDR1)); break; case 'b': syslog(LOG_INFO, "#sta_alm(1, 5000)"); SVC_PERROR(sta_alm(ALMHDR1, 5000)); break; case 'B': syslog(LOG_INFO, "#stp_alm(1)"); SVC_PERROR(stp_alm(ALMHDR1)); break; case 'V': #ifdef TOPPERS_SUPPORT_GET_UTM SVC_PERROR(get_utm(&utime1)); SVC_PERROR(get_utm(&utime2)); syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld", (ulong_t) utime1, (ulong_t) utime2); #else /* TOPPERS_SUPPORT_GET_UTM */ syslog(LOG_NOTICE, "get_utm is not supported."); #endif /* TOPPERS_SUPPORT_GET_UTM */ break; case 'v': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); break; case 'q': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG))); break; #ifdef BIT_KERNEL case ' ': SVC_PERROR(loc_cpu()); { extern ER bit_kernel(void); SVC_PERROR(ercd = bit_kernel()); if (ercd >= 0) { syslog(LOG_NOTICE, "bit_kernel passed."); } } SVC_PERROR(unl_cpu()); break; #endif /* BIT_KERNEL */ default: break; } } while (c != '\003' && c != 'Q'); syslog(LOG_NOTICE, "Sample program ends."); SVC_PERROR(ext_ker()); assert(0); }
void tcp_telnet_srv_task(VP_INT exinf) { UW total; UH rblen, sblen, rlen, slen, soff, count; UB *rbuf, *sbuf, head, tail; ID tskid; ER error = E_OK; T_IF_SOFTC *ic; get_tid(&tskid); syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK):%d,%d] (copy save API) started.", tskid, (INT)exinf); while (TRUE) { if ((error = tcp_acp_cep((INT)exinf, TCP_TELNET_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] error: %s", itron_strerror(error)); continue; } /* 相手から接続されるまで待つ。*/ syscall(wai_sem(SEM_TCP_TELNET_SRV_NBLK_READY)); if (nblk_error == E_OK) syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] connected from %s:%d", ip2str(NULL, &dst.ipaddr), dst.portno); else { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error)); continue; } connect = TRUE; total = rlen = count = 0; while (TRUE) { if ((error = tcp_rcv_buf((INT)exinf, (VP *)&rbuf, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] error: %s", itron_strerror(error)); break; } /* 受信するまで待つ。*/ syscall(wai_sem(SEM_TCP_TELNET_SRV_NRCV_READY)); if (nblk_rlen < 0) { /* エラー */ syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] error: %s", itron_strerror(nblk_rlen)); break; } else if (nblk_rlen == 0) /* 受信終了 */ break; rblen = (UH)nblk_rlen; /* バッファの残りにより、受信長を調整する。*/ if (rblen > BUF_SIZE - rlen) rblen = BUF_SIZE - rlen; total += rblen; rlen = rblen; head = *rbuf; tail = *(rbuf + rblen - 1); count ++; /*syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] " "count: %4d, len: %4d, data %02x -> %02x", ++ count, rblen, head, tail);*/ memcpy(buffer, rbuf, rblen); if ((error = tcp_rel_buf((INT)exinf, rlen)) < 0) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) REL] error: %s", itron_strerror(error)); break; } soff = 0; while (rlen > 0) { if ((error = tcp_get_buf((INT)exinf, (VP *)&sbuf, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) GET] error: %s", itron_strerror(error)); goto err_fin; } /* 送信バッファの獲得が完了するまで待つ。*/ syscall(wai_sem(SEM_TCP_TELNET_SRV_NSND_READY)); if (nblk_slen < 0) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) GET] error: %s", itron_strerror(nblk_slen)); goto err_fin; } else /*syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) GET] len: %d", nblk_slen)*/; sblen = (UH)nblk_slen; slen = sblen < rlen ? sblen : rlen; #if 0 /* ROI DEBUG */ memcpy(sbuf, buffer + soff, slen); #else /* ROI DEBUG */ slen = telnet_copy(sbuf, buffer + soff, slen, &rblen); #endif /* ROI DEBUG */ if ((error = tcp_snd_buf((INT)exinf, slen)) != E_OK) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SND] error: %s", itron_strerror(error)); goto err_fin; } /*syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SND] len: %d", slen);*/ #if 0 /* ROI DEBUG */ rlen -= slen; #else /* ROI DEBUG */ rlen -= rblen; #endif /* ROI DEBUG */ soff += slen; } } err_fin: if ((error = tcp_sht_cep((INT)exinf)) != E_OK) syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SHT] error: %s", itron_strerror(error)); if ((error = tcp_cls_cep((INT)exinf, TMO_NBLK)) != E_WBLK) syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) CLS] error: %s", itron_strerror(error)); connect = FALSE; /* 開放が完了するまで待つ。*/ syscall(wai_sem(SEM_TCP_TELNET_SRV_NBLK_READY)); syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) FIN] finished, total count: %d, len: %d", count, total); } }
void t_perror(UINT prio, const char *file, int line, const char *expr, ER ercd) { syslog_4(prio, "%s reported by `%s' in line %d of `%s'.", itron_strerror(ercd), expr, line, file); }
/* * メインタスク */ void main_task(intptr_t exinf) { char_t c; ER_UINT ercd; PRI tskpri; ID prcid = exinf; ID tskid = sample_tskid[(exinf - 1) * 3 ]; int_t tskno = (exinf-1) * 3 + 1; ID cycid = sample_cycid[(int_t)exinf-1]; ID almid = sample_almid[(int_t)exinf-1]; bool_t update_select = true; uint_t tme_select = exinf; uint_t prc_select = exinf; uint32_t server_req; #ifndef TASK_LOOP volatile ulong_t i; SYSTIM stime1, stime2; #endif /* TASK_LOOP */ #ifdef G_SYSLOG uint_t e; #endif /* G_SYSLOG */ SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf); /* * シリアルポートの初期化 * * システムログタスクと同じシリアルポートを使う場合など,シリアル * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は * ない. */ ercd = serial_opn_por(((int_t)serial_port[exinf-1])); if (ercd < 0 && MERCD(ercd) != E_OBJ) { syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.", itron_strerror(ercd), SERCD(ercd)); } SVC_PERROR(serial_ctl_por(serial_port[exinf-1], (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* * ループ回数の設定 * * TASK_LOOPがマクロ定義されている場合,測定せずに,TASK_LOOPに定 * 義された値を,タスク内でのループ回数とする. * * MEASURE_TWICEがマクロ定義されている場合,1回目の測定結果を捨て * て,2回目の測定結果を使う.1回目の測定は長めの時間が出るため. */ #ifdef TASK_LOOP task_loop = TASK_LOOP; #else /* TASK_LOOP */ #ifdef MEASURE_TWICE task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); #endif /* MEASURE_TWICE */ task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); task_loop = LOOP_REF * 400UL / (stime2 - stime1); #endif /* TASK_LOOP */ /* * タスクの起動 */ SVC_PERROR(act_tsk(tskid)); /* * メインループ */ do { if (update_select) { prcid = prc_select; cycid = sample_cycid[tme_select-1]; almid = sample_almid[tme_select-1]; tsk_mig_prc = prcid; update_select = false; syslog(LOG_INFO, "select tskno 0x%x", tskno); syslog(LOG_INFO, "select cycid %d", cycid); syslog(LOG_INFO, "select almid %d", almid); syslog(LOG_INFO, "select processor %d", prcid); } SVC_PERROR(serial_rea_dat(serial_port[exinf-1], &c, 1)); switch (c) { case 'e': case 's': case 'S': case 'd': case 'g': message[tskno - 1] = c; break; case '1': tskno = 1; tskid = TASK1; update_select = true; break; case '2': tskno = 2; tskid = TASK2; update_select = true; break; case '3': tskno = 3; tskid = TASK3; update_select = true; break; case '4': tskno = 4; tskid = TASK4; update_select = true; break; case '5': tskno = 5; tskid = TASK5; update_select = true; break; case '6': tskno = 6; tskid = TASK6; update_select = true; break; case '8': prc_select = 1; update_select = true; break; case '9': prc_select = 2; update_select = true; break; case 'a': syslog(LOG_INFO, "#act_tsk(0x%x)", tskno); SVC_PERROR(act_tsk(tskid)); break; case 'A': syslog(LOG_INFO, "#can_act(0x%x)", tskno); SVC_PERROR(ercd = can_act(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_act(0x%x) returns %d", tskno, ercd); } break; case '>': syslog(LOG_INFO, "#chg_pri(0x%x, HIGH_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY)); break; case '=': syslog(LOG_INFO, "#chg_pri(0x%x, MID_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, MID_PRIORITY)); break; case '<': syslog(LOG_INFO, "#chg_pri(0x%x, LOW_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, LOW_PRIORITY)); break; case 'G': syslog(LOG_INFO, "#get_pri(0x%x, &tskpri)", tskno); SVC_PERROR(ercd = get_pri(tskid, &tskpri)); if (ercd >= 0) { syslog(LOG_NOTICE, "priority of task 0x%x is %d", tskno, tskpri); } break; case 'w': syslog(LOG_INFO, "#wup_tsk(0x%x)", tskno); SVC_PERROR(wup_tsk(tskid)); break; case 'W': syslog(LOG_INFO, "#can_wup(0x%x)", tskno); SVC_PERROR(ercd = can_wup(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_wup(0x%x) returns %d", tskno, ercd); } break; case 'c': syslog(LOG_INFO, "#sta_cyc(%d)", cycid); SVC_PERROR(sta_cyc(cycid)); break; case 'C': syslog(LOG_INFO, "#stp_cyc(%d)", cycid); SVC_PERROR(stp_cyc(cycid)); break; case 'b': syslog(LOG_INFO, "#sta_alm(%d, %d)", almid, ALM_TIME); SVC_PERROR(sta_alm(almid, ALM_TIME)); break; case 'B': syslog(LOG_INFO, "#stp_alm(%d)", almid); SVC_PERROR(stp_alm(almid)); break; case 'f': syslog(LOG_INFO, "#mact_tsk(%d, %d)", tskid, prcid); SVC_PERROR(mact_tsk(tskid, prcid)); break; default: break; } } while (c != '\003' && c != 'Q'); syslog(LOG_NOTICE, "Sample program ends."); SVC_PERROR(ext_ker()); assert(0); }
/* * メインタスク */ void main_task(intptr_t exinf) { char c; ID tskid = TASK1; int_t tskno = 1; ER_UINT ercd; PRI tskpri; #ifndef TASK_LOOP volatile ulong_t i; SYSTIM stime1, stime2; #endif /* TASK_LOOP */ HRTCNT hrtcnt1, hrtcnt2; SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf); /* * シリアルポートの初期化 * * システムログタスクと同じシリアルポートを使う場合など,シリアル * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は * ない. */ ercd = serial_opn_por(TASK_PORTID); if (ercd < 0 && MERCD(ercd) != E_OBJ) { syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.", itron_strerror(ercd), SERCD(ercd)); } SVC_PERROR(serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV))); /* * ループ回数の設定 * * 並行実行されるタスク内での空ループの回数(task_loop)は,空ルー * プの実行時間が約0.4秒になるように設定する.この設定のために, * LOOP_REF回の空ループの実行時間を,その前後でget_timを呼ぶことで * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ回 * 数を求め,task_loopに設定する. * * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ * り遅いプロセッサでは,サンプルプログラムの実行開始に時間がかか * りすぎるという問題を生じる.逆に想定したより速いプロセッサでは, * LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値 * の誤差が大きくなるという問題がある. * * そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適 * 切な値に定義するのが望ましい. * * また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定を * 行わずに,TASK_LOOPに定義された値を空ループの回数とする. * * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ * りも長めになるものがある.このようなターゲットでは,MEASURE_TWICE * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果 * を使う. */ #ifdef TASK_LOOP task_loop = TASK_LOOP; #else /* TASK_LOOP */ #ifdef MEASURE_TWICE task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); #endif /* MEASURE_TWICE */ task_loop = LOOP_REF; SVC_PERROR(get_tim(&stime1)); for (i = 0; i < task_loop; i++); SVC_PERROR(get_tim(&stime2)); task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU; #endif /* TASK_LOOP */ /* * タスクの起動 */ SVC_PERROR(act_tsk(TASK1)); SVC_PERROR(act_tsk(TASK2)); SVC_PERROR(act_tsk(TASK3)); /* * メインループ */ do { SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1)); switch (c) { case 'e': case 's': case 'S': case 'd': case 'y': case 'Y': case 'z': case 'Z': message[tskno-1] = c; break; case '1': tskno = 1; tskid = TASK1; break; case '2': tskno = 2; tskid = TASK2; break; case '3': tskno = 3; tskid = TASK3; break; case 'a': syslog(LOG_INFO, "#act_tsk(%d)", tskno); SVC_PERROR(act_tsk(tskid)); break; case 'A': syslog(LOG_INFO, "#can_act(%d)", tskno); SVC_PERROR(ercd = can_act(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd); } break; case 't': syslog(LOG_INFO, "#ter_tsk(%d)", tskno); SVC_PERROR(ter_tsk(tskid)); break; case '>': syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY)); break; case '=': syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, MID_PRIORITY)); break; case '<': syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno); SVC_PERROR(chg_pri(tskid, LOW_PRIORITY)); break; case 'G': syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno); SVC_PERROR(ercd = get_pri(tskid, &tskpri)); if (ercd >= 0) { syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); } break; case 'w': syslog(LOG_INFO, "#wup_tsk(%d)", tskno); SVC_PERROR(wup_tsk(tskid)); break; case 'W': syslog(LOG_INFO, "#can_wup(%d)", tskno); SVC_PERROR(ercd = can_wup(tskid)); if (ercd >= 0) { syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd); } break; case 'l': syslog(LOG_INFO, "#rel_wai(%d)", tskno); SVC_PERROR(rel_wai(tskid)); break; case 'u': syslog(LOG_INFO, "#sus_tsk(%d)", tskno); SVC_PERROR(sus_tsk(tskid)); break; case 'm': syslog(LOG_INFO, "#rsm_tsk(%d)", tskno); SVC_PERROR(rsm_tsk(tskid)); break; case 'x': syslog(LOG_INFO, "#ras_ter(%d)", tskno); SVC_PERROR(ras_ter(tskid)); break; case 'r': syslog(LOG_INFO, "#rot_rdq(three priorities)"); SVC_PERROR(rot_rdq(HIGH_PRIORITY)); SVC_PERROR(rot_rdq(MID_PRIORITY)); SVC_PERROR(rot_rdq(LOW_PRIORITY)); break; case 'c': syslog(LOG_INFO, "#sta_cyc(1)"); SVC_PERROR(sta_cyc(CYCHDR1)); break; case 'C': syslog(LOG_INFO, "#stp_cyc(1)"); SVC_PERROR(stp_cyc(CYCHDR1)); break; case 'b': syslog(LOG_INFO, "#sta_alm(1, 5000000)"); SVC_PERROR(sta_alm(ALMHDR1, 5000000)); break; case 'B': syslog(LOG_INFO, "#stp_alm(1)"); SVC_PERROR(stp_alm(ALMHDR1)); break; case 'V': hrtcnt1 = fch_hrt(); hrtcnt2 = fch_hrt(); syslog(LOG_NOTICE, "hrtcnt1 = %tu, hrtcnt2 = %tu", hrtcnt1, hrtcnt2); break; case 'o': #ifdef TOPPERS_SUPPORT_OVRHDR syslog(LOG_INFO, "#sta_ovr(%d, 2000000)", tskno); SVC_PERROR(sta_ovr(tskid, 2000000)); #else /* TOPPERS_SUPPORT_OVRHDR */ syslog(LOG_NOTICE, "sta_ovr is not supported."); #endif /* TOPPERS_SUPPORT_OVRHDR */ break; case 'O': #ifdef TOPPERS_SUPPORT_OVRHDR syslog(LOG_INFO, "#stp_ovr(%d)", tskno); SVC_PERROR(stp_ovr(tskid)); #else /* TOPPERS_SUPPORT_OVRHDR */ syslog(LOG_NOTICE, "stp_ovr is not supported."); #endif /* TOPPERS_SUPPORT_OVRHDR */ break; case 'v': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); break; case 'q': SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG))); break; #ifdef BIT_KERNEL case ' ': SVC_PERROR(loc_cpu()); { extern ER bit_kernel(void); SVC_PERROR(ercd = bit_kernel()); if (ercd >= 0) { syslog(LOG_NOTICE, "bit_kernel passed."); } } SVC_PERROR(unl_cpu()); break; #endif /* BIT_KERNEL */ default: break; } } while (c != '\003' && c != 'Q'); syslog(LOG_NOTICE, "Sample program ends."); SVC_PERROR(ext_ker()); assert(0); }
ER callback_nblk_tcp_echo_srv (ID cepid, FN fncd, void *p_parblk) { ER error = E_OK; switch (fncd) { case TFN_TCP_ACP_CEP: nblk_error = *(ER*)p_parblk; syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); break; case TFN_TCP_RCV_DAT: if ((nblk_rlen = *(ER*)p_parblk) < 0) syslog(LOG_NOTICE, "[TES:%02d CBN] recv error: %s", cepid, itron_strerror(nblk_rlen)); syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); break; case TFN_TCP_SND_DAT: if ((nblk_slen = *(ER*)p_parblk) < 0) syslog(LOG_NOTICE, "[TES:%02d CBN] send error: %s", cepid, itron_strerror(nblk_slen)); syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); break; case TFN_TCP_CLS_CEP: if ((nblk_error = *(ER*)p_parblk) < 0) syslog(LOG_NOTICE, "[TES:%02d CBN] close error: %s", cepid, itron_strerror(nblk_error)); syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); break; case TFN_TCP_RCV_BUF: if ((nblk_rlen = *(ER*)p_parblk) < 0) syslog(LOG_NOTICE, "[TES:%02d CBN] rbuf error: %s", cepid, itron_strerror(nblk_rlen)); syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); break; case TFN_TCP_GET_BUF: if ((nblk_slen = *(ER*)p_parblk) < 0) syslog(LOG_NOTICE, "[TES:%02d CBN] sbuf error: %s", cepid, itron_strerror(nblk_slen)); syscall(sig_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); break; #ifdef USE_TCP_EXTENTIONS case TEV_TCP_RCV_OOB: if ((nblk_rlen = *(ER*)p_parblk) < 0) syslog(LOG_NOTICE, "[TES:%02d OOB] callback error: %s", cepid, itron_strerror(nblk_rlen)); else if (nblk_rlen > 0) { char ch; if ((nblk_rlen = tcp_rcv_oob(cepid, &ch, sizeof(ch))) > 0) syslog(LOG_NOTICE, "[TES:%02d OOB] recv oob: 0x%02x", cepid, ch); else if (nblk_rlen < 0) syslog(LOG_NOTICE, "[TES:%02d OOB] recv error: %s", cepid, itron_strerror(nblk_rlen)); } break; #endif /* of #ifdef USE_TCP_EXTENTIONS */ case TFN_TCP_CON_CEP: case TFN_TCP_SND_OOB: default: error = E_PAR; break; } return error; }
static ER tcp_echo_srv (ID cepid, ID repid) { ER error; SYSTIM now; uint32_t total; uint16_t rblen, sblen, rlen, slen, soff, scount, rcount; char *rbuf, *sbuf, head, tail; if ((error = TCP_ACP_CEP(cepid, repid, &dst, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TES:%02d ACP] error: %s", cepid, itron_strerror(error)); return error; } /* 相手から接続されるまで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); if (nblk_error == E_OK) { syscall(get_tim(&now)); syslog(LOG_NOTICE, "[TES:%02d ACP] connected: %6lu, from: %s.%u", cepid, now / SYSTIM_HZ, IP2STR(NULL, &dst.ipaddr), dst.portno); } else { syslog(LOG_NOTICE, "[TES:%02d ACP] error: %s", cepid, itron_strerror(nblk_error)); return nblk_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)); #endif /* of #ifdef USE_TCP_EXTENTIONS */ rlen = scount = rcount = total = 0; while (true) { if ((error = tcp_rcv_buf(cepid, (void**)&rbuf, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s", cepid, itron_strerror(error)); break; } /* 受信するまで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); if (nblk_rlen < 0) { /* エラー */ syslog(LOG_NOTICE, "[TES:%02d RCV] error: %s", cepid, itron_strerror(nblk_rlen)); break; } else if (nblk_rlen == 0) /* 受信終了 */ break; rblen = nblk_rlen; /* バッファの残りにより、受信長を調整する。*/ if (rblen > BUF_SIZE - rlen) rblen = BUF_SIZE - rlen; total += rblen; rlen = rblen; head = *rbuf; tail = *(rbuf + rblen - 1); rcount ++; #ifdef SHOW_RCV_RANGE syslog(LOG_NOTICE, "[TES:%02d RCV] " "rcount: %4d, len: %4d, data %02x -> %02x", cepid, rcount, rblen, head, tail); #endif /* of #ifdef SHOW_RCV_RANGE */ memcpy(buffer, rbuf, rblen); if ((error = tcp_rel_buf(cepid, rlen)) < 0) { syslog(LOG_NOTICE, "[TES:%02d REL] error: %s", cepid, itron_strerror(error)); break; } soff = 0; while (rlen > 0) { if ((error = tcp_get_buf(cepid, (void**)&sbuf, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TES:%02d GET] error: %s", cepid, itron_strerror(error)); goto err_fin; } /* 送信バッファの獲得が完了するまで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); if (nblk_slen < 0) { syslog(LOG_NOTICE, "[TES:%02d GET] error: %s", cepid, itron_strerror(nblk_slen)); goto err_fin; } sblen = nblk_slen; scount ++; slen = sblen < rlen ? sblen : rlen; memcpy(sbuf, buffer + soff, slen); if ((error = tcp_snd_buf(cepid, slen)) != E_OK) { syslog(LOG_NOTICE, "[TES:%02d SND] error: %s", cepid, itron_strerror(error)); goto err_fin; } #ifdef SHOW_RCV_RANGE syslog(LOG_NOTICE, "[TES:%02d SND] scount: %4d, len: %4d", cepid, scount, slen); #endif /* of #ifdef SHOW_RCV_RANGE */ rlen -= slen; soff += slen; } } err_fin: #ifdef USE_TCP_SHT_CEP if ((error = tcp_sht_cep(cepid)) != E_OK) syslog(LOG_NOTICE, "[TES:%02d SHT] error: %s", cepid, itron_strerror(error)); #endif /* of #ifdef USE_TCP_SHT_CEP */ if ((error = tcp_cls_cep(cepid, TMO_NBLK)) != E_WBLK) syslog(LOG_NOTICE, "[TES:%02d CLS] error: %s", cepid, itron_strerror(error)); /* 開放が完了するまで待つ。*/ syscall(wai_sem(SEM_TCP_ECHO_SRV_NBLK_READY)); syscall(get_tim(&now)); syslog(LOG_NOTICE, "[TES:%02d FIN] finished: %6lu, snd: %4u, rcv: %4u, len: %lu", cepid, now / SYSTIM_HZ, scount, rcount, total); return error == E_WBLK ? E_OK : error; }
void tcp_telnet_srv_task(VP_INT exinf) { UW total; UH rlen, slen, soff, count, sblen, rblen; ID tskid; ER error; UB head, tail; T_IF_SOFTC *ic; get_tid(&tskid); syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK):%d,%d] started.", tskid, (INT)exinf); while (TRUE) { if ((error = tcp_acp_cep((INT)exinf, TCP_TELNET_SRV_REPID, &dst, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] error: %s", itron_strerror(error)); continue; } /* 相手から接続されるまで待つ。*/ syscall(wai_sem(SEM_TCP_TELNET_SRV_NBLK_READY)); if (nblk_error == E_OK) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] connected from %s:%d", ip2str(NULL, &dst.ipaddr), dst.portno); } else { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) ACP] error: %s", itron_strerror(nblk_error)); continue; } connect = TRUE; count = total = 0; while (TRUE) { if ((error = tcp_rcv_dat((INT)exinf, buffer, BUF_SIZE - 1, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] error: %s", itron_strerror(error)); break; } /* 受信完了まで待つ。*/ syscall(wai_sem(SEM_TCP_TELNET_SRV_NRCV_READY)); if (nblk_rlen < 0) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] error: %s", itron_strerror(nblk_rlen)); break; } else if (nblk_rlen == 0) break; rlen = (UH)nblk_rlen; total += (UW)nblk_rlen; head = *buffer; tail = *(buffer + rlen - 1); count ++; /*syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) RCV] count: %4d, len: %4d, data %02x -> %02x", ++ count, rlen, head, tail);*/ soff = 0; while (rlen > 0) { sblen, telnet_copy(buffer + soff, buffer + soff, rlen, &rblen); if ((error = tcp_snd_dat((INT)exinf, &buffer[soff], sblen, TMO_NBLK)) != E_WBLK) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SND] error: %s", itron_strerror(error)); goto err_fin; } /* 送信完了まで待つ。*/ syscall(wai_sem(SEM_TCP_TELNET_SRV_NSND_READY)); if (nblk_slen < 0) { syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SND] error: %s", itron_strerror(nblk_slen)); goto err_fin; } else /*syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SND] len: %4d", nblk_slen)*/; slen = (UH)nblk_slen; rlen -= rblen; soff += slen; } } err_fin: if ((error = tcp_sht_cep((INT)exinf)) != E_OK) syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) SHT] error: %s", itron_strerror(error)); if ((error = tcp_cls_cep((INT)exinf, TMO_NBLK)) != E_WBLK) syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) CLS] error: %s", itron_strerror(error)); connect = FALSE; /* 開放が完了するまで待つ。*/ syscall(wai_sem(SEM_TCP_TELNET_SRV_NBLK_READY)); syslog(LOG_NOTICE, "[TCP TELNET SRV (NBLK) FIN] finished, total cnt: %d, len: %d", count, total); } }