#navi(Toppers) #counter #contents -[[TOPPERS本家:http://www.toppers.jp/index.html]] -[[ITRON TCP/IPの仕様書:http://www.ertl.jp/ITRON/SPEC/tcpip-j.html]] * nservの解析 [#g0666aea] * nservディレクトリ内のファイル [#o5df2cf8] -nserv/nserv.cfg --それぞれの.cfgをincludeしているだけ --#includeとINCLUDEの違いは? ---doc/configurator.txtより (2)「INCLUDE」静的APIの処理 システムコンフィギュレーションファイルに含まれる「INCLUDE」静的APIに対 応するプリプロセッサディレクティブ(#include)を生成する.例えば, INCLUDE("\"sample1.h\""); という静的APIに対して, #include "sample1.h" というディレクティブを生成する.生成するディレクティブの順序は,システ ムコンフィギュレーションファイル中での静的APIの順序に一致させる. --#define _MACRO_ONLYとは? ---include/t_services.hより /* * アプリケーション用 標準インクルードファイル * * このインクルードファイルは,カーネル上で動作するプログラムのソース * ファイルでインクルードする標準インクルードファイルである.この中で, * kernel.h(さらにここから,t_stddef.h,itron.h,tool_defs.h, * sys_defs.h,cpu_defs.h,t_syslog.h)とserial.hをインクルードしてい * る.また,アプリケーションに有益と思われる定義をいくつか含んでいる. * * アセンブリ言語のソースファイルやシステムコンフィギュレーションファ * イルからこのファイルをインクルードする時は,_MACRO_ONLY を定義して * おくことで,マクロ定義以外の記述を除くことができる. */ -nserv/nserv.h --TCP送受信バッファサイズの定義 --ECHOサーバのタスク数の定義 --TCP送受信バッファのextern宣言 -nserv/nserv.c --TCP送受信バッファ本体の宣言(配列として) --ARPのコールバック関数の定義 ---IPアドレス重複時の処理 *tinet/netappディレクトリ内のファイル [#hc0e5479] **tinet/netapp/dbg_cons.cfg [#i6de5d40] -dgb_cons_taskの静的APIが書いてある CRE_TSK(DBG_CON_TASK, {TA_HLNG | TA_ACT, 0, dbg_con_task, DBG_CON_PRIORITY, DBG_CON_STACK_SIZE, NULL}); **tinet/netapp/dbg_cons.h [#lb8c56c9] -スタックサイズ、優先度、タスクと関数のextern #define DBG_CON_STACK_SIZE 1024 #define DBG_CON_PRIORITY 5 extern void dbg_con_task(VP_INT exinf); extern void act_tasks(void); extern void extra_parse(UB *line); **tinet/netapp/dbg_cons.c [#s2aa6f5c] ***dbg_con_task() [#s60c21e1] -メイン関数に相当する void dbg_con_task (VP_INT exinf) { static UB line[DBG_LINE_SIZE + 1]; int len; ID tskid; get_tid(&tskid); syslog(LOG_NOTICE, "[CONSOLE:%d] started.", tskid); syscall(serial_ctl_por(CONSOLE_PORTID, IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCANY | IOCTL_FCRCV)); while (TRUE) { len = cons_getline(line, DBG_LINE_SIZE); /* tinet/netapp/netapp_subr.cに記載 */ /* serial_rea_dat(CONSOLE_PORTID, &ch, sizeof(UB); */ /* しながら文字列にしてCRでreturn */ dbg_parse(line); /* コマンドを解釈してジャンプ */ } } ***ifコマンドの処理方法 [#na673f4f] case 'i': if (*(line + 1) == 'f') ifconfig(line + 2); break; -ifconfigはdbg_cons.c内 static void ifconfig (UB *line) { T_IFNET *ifp = IF_GET_IFNET(); T_IN4_ADDR bc; if (*(line = skip_blanks(line))) { T_IN4_ADDR addr, mask; GET_IPADDR(&mask, skip_blanks(GET_IPADDR(&addr, line))); in4_add_ifaddr(addr, mask); } cons_printf(CONSOLE_PORTID, "Network Interface Configurations\n"); cons_printf(CONSOLE_PORTID, "ether: %M\n", IF_ETHER_NIC_GET_SOFTC()->ifaddr.lladdr); bc = (ifp->in_ifaddr.addr & ifp->in_ifaddr.mask) | ~ifp->in_ifaddr.mask; cons_printf(CONSOLE_PORTID, "inet: %I, mask: %I, boadcast: %I\n", &ifp->in_ifaddr.addr, &ifp->in_ifaddr.mask, &bc); } ***nrコマンドの処理方法 [#d40a84f4] -dbg_parse()->network_status()->routing_status()->routing_table_status() static void routing_table_status (UB *line) { SYSTIM now; int ix; cons_printf(CONSOLE_PORTID, "Routing Table Status\n" "IX Expire flags Prefix Target Gateway\n"); for (ix = 0; ix < NUM_STATIC_ROUTE_ENTRY; ix ++) { cons_printf(CONSOLE_PORTID, "%2d STATIC - %6d %30I %I\n", ix, routing_tbl[ix].prefix_len, &routing_tbl[ix].target, &routing_tbl[ix].gateway); } /* expireの単位は[s] */ syscall(get_tim(&now)); now /= SYSTIM_HZ; for ( ; ix < NUM_ROUTE_ENTRY; ix ++) if (routing_tbl[ix].flags & IN_RTF_DEFINED) cons_printf(CONSOLE_PORTID, "%2d %6d %02x %6d %30I %I\n", ix, (int)(routing_tbl[ix].expire - now) <= 0 ? 0 : routing_tbl[ix].expire - now, routing_tbl[ix].flags, routing_tbl[ix].prefix_len, &routing_tbl[ix].target, &routing_tbl[ix].gateway); } ***etコマンドの処理方法 [#kf70c1aa] case 't': /* TCP echo client */ line += 2; if ((error = psnd_dtq(DTQ_TCP_ECHO_CLI, (VP_INT)line)) != E_OK) /* データキューでコマンドラインを渡す */ syslog(LOG_NOTICE, "[TCP ECHO CON] error: %s", itron_strerror(error)); break; -DTQ_TCP_ECHO_CLIを待っているのは、tcp_echo_cli_snd_task()。(tinet/netapp/tcp_echo_cli.c参照) **tinet/netapp/echo.h [#lffd3bbc] -TCPのECHO関連タスクの宣言 -スタックサイズと優先度の宣言 #define TCP_ECHO_SRV_STACK_SIZE 1024 #define TCP_ECHO_CLI_RCV_STACK_SIZE 1024 #define TCP_ECHO_CLI_SND_STACK_SIZE 1024 #define UDP_ECHO_SRV_STACK_SIZE 1024 #define UDP_ECHO_CLI_STACK_SIZE 1024 #define TCP_ECHO_SRV_MAIN_PRIORITY 5 #define TCP_ECHO_CLI_RCV_MAIN_PRIORITY 5 #define TCP_ECHO_CLI_SND_MAIN_PRIORITY 5 #define UDP_ECHO_SRV_MAIN_PRIORITY 5 #define UDP_ECHO_CLI_MAIN_PRIORITY 5 #define NUM_DTQ_UDP_ECHO_CLI 2 #define NUM_DTQ_TCP_ECHO_CLI 2 -タスク extern void tcp_echo_srv_task(VP_INT exinf); extern void tcp_echo_srv_rcv_task(VP_INT exinf); extern void tcp_echo_srv_snd_task(VP_INT exinf); extern void tcp_echo_cli_rcv_task(VP_INT exinf); extern void tcp_echo_cli_snd_task(VP_INT exinf); extern void udp_echo_srv_task(VP_INT exinf); extern void udp_echo_cli_task(VP_INT exinf); -コールバック関数 extern ER callback_nblk_tcp_echo_srv (ID cepid, FN fncd, VP p_parblk); extern ER callback_nblk_tcp_echo_cli (ID cepid, FN fncd, VP p_parblk); extern ER callback_udp_echo_srv (ID cepid, FN fncd, VP p_parblk); extern ER callback_udp_echo_cli (ID cepid, FN fncd, VP p_parblk); extern ER callback_nblk_udp_echo_srv (ID cepid, FN fncd, VP p_parblk); extern ER callback_nblk_udp_echo_cli (ID cepid, FN fncd, VP p_parblk); **tinet/netapp/tcp_echo_cli.cfg [#w649e8ec] -TCP ECHOクライアント用送信タスク、受信タスクの生成 CRE_TSK(TCP_ECHO_CLI_SND_TASK, { TA_HLNG|TA_ACT, TCP_ECHO_CLI_CEPID, tcp_echo_cli_snd_task, TCP_ECHO_CLI_SND_MAIN_PRIORITY, TCP_ECHO_CLI_SND_STACK_SIZE, NULL }); CRE_TSK(TCP_ECHO_CLI_RCV_TASK, { TA_HLNG|TA_ACT, TCP_ECHO_CLI_CEPID, tcp_echo_cli_rcv_task, TCP_ECHO_CLI_RCV_MAIN_PRIORITY, TCP_ECHO_CLI_RCV_STACK_SIZE, NULL }); -データキューの生成 CRE_DTQ(DTQ_TCP_ECHO_CLI, { TA_TFIFO, NUM_DTQ_TCP_ECHO_CLI, NULL }); **tinet/netapp/tcp_echo_cli.c [#wdb9f42e] -DTQ_TCP_ECHO_CLIを待っているのは、tcp_echo_cli_snd_task()。~ tcp_echo_cli_snd_task()で相手先IPなど読んでから、send_tcp_echo()。~ send_tcp_echo()では、TCP_CON_CEP()してから、wup_tsk(TCP_ECHO_CLI_RCV_TASK)してtcp_snd_dat()で3800文字を送信。 while (TRUE) { if (rcv_dtq(DTQ_TCP_ECHO_CLI, (VP_INT*)(VP)&line) == E_OK) { line = skip_blanks(GET_IPADDR(&addr, skip_blanks(line))); if ('0' < *line && *line < '9') { line = get_int(&no, line); portno = (UH)no; } else { if ((error = TCP_CON_CEP(cepid, &src, &dst, 60 * SYSTIM_HZ)) != E_OK) { syslog(LOG_NOTICE, "[TEC:%02d SND] connect error: %s", cepid, it ron_strerror(error)); return; } get_tim(&time); IP2STR(addr, ipaddr); syslog(LOG_NOTICE, "[TEC:%02d SND] connecting: %6d, to: %s.%d", cepid, time / SYSTIM_HZ, &addr, portno); syscall(wup_tsk(TCP_ECHO_CLI_RCV_TASK)); scount = total = 0; for (echo = NUM_ECHO; echo -- > 0; ) { soff = 0; while (soff < SND_BUF_SIZE) { if ((slen = tcp_snd_dat(cepid, smsg + soff, sizeof(smsg) - soff, TMO_FEVR)) < 0) { syslog(LOG_NOTICE, "[TEC:%02d SND] send error: %s", cepid, itron_strerror(slen)); goto cls_ret; }