#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;
                  }


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS