Ignore:
Timestamp:
Apr 13, 2018, 1:00:30 PM (6 years ago)
Author:
coas-nagasima
Message:

NTPクライアント処理を追加

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_rx/trunk/asp3_dcre/tinet/netapp/dhcp4_cli.c

    r337 r340  
    191191#endif
    192192
     193#ifdef SEM_DHCP4_CLI_TIMER
     194#define DHCP4_CLI_TIMER_LOCK() do { syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); } while(0)
     195#define DHCP4_CLI_TIMER_UNLOCK() do { syscall(sig_sem(SEM_DHCP4_CLI_TIMER)); } while(0)
     196#else
     197#define DHCP4_CLI_TIMER_LOCK() do { } while(0)
     198#define DHCP4_CLI_TIMER_UNLOCK() do { } while(0)
     199#endif
     200
     201#ifdef SEM_DHCP4_CLI_READY
     202#define DHCP4_CLI_READY_WAIT(ct) do { syscall(wai_sem(SEM_DHCP4_CLI_READY)); } while(0)
     203#define DHCP4_CLI_READY_SIGNAL(ct) do { syscall(sig_sem(SEM_DHCP4_CLI_READY)); } while(0)
     204#else
     205#define DHCP4_CLI_READY_WAIT(ct) do { } while(0)
     206#define DHCP4_CLI_READY_SIGNAL(ct) do { syscall(wup_tsk(ct->tskid)); } while(0)
     207#endif
     208
    193209/*
    194210 *  dhcp4_cksum -- チェックサムの計算関数
     
    919935        int ix;
    920936
    921         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     937        DHCP4_CLI_TIMER_LOCK();
    922938        for (ix = NUM_DHCP4C_TIMERS; ix -- > 0; )
    923939                ct->timers[ix] = 0;
    924         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     940        DHCP4_CLI_TIMER_UNLOCK();
    925941        }
    926942
     
    937953
    938954        /* OFFER メッセージ受信タイムアウトを設定する。*/
    939         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     955        DHCP4_CLI_TIMER_LOCK();
    940956        ct->timers[DHCP4C_TIMER_RCV_OFFER] = SYSTIM2TIMER(TMO_DHCP4C_OFFER);
    941         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     957        DHCP4_CLI_TIMER_UNLOCK();
    942958
    943959        /* 送信先アドレスにローカルネットワークへのブロードキャストを設定する。*/
     
    952968        /* DISCOVER メッセージを送信する。*/
    953969        ct->flags |= DHCP4C_FLAG_TMOUT_SND_DISC;
    954         syscall(sig_sem(SEM_DHCP4_CLI_READY));
     970        DHCP4_CLI_READY_SIGNAL(ct);
    955971        }
    956972
     
    979995
    980996        /* EXPIRE、RENEW、REBIND タイマーを設定する。*/
    981         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     997        DHCP4_CLI_TIMER_LOCK();
    982998        ct->timers[DHCP4C_TIMER_EXPIRE] = SYSTIM2TIMER(ct->expire);             /* EXPIRE      までの時間 */
    983999        ct->timers[DHCP4C_TIMER_REBIND] = SYSTIM2TIMER(ct->rebind);             /* REBIND(T2)までの時間 */
    9841000        ct->timers[DHCP4C_TIMER_RENEW]  = SYSTIM2TIMER(ct->renew);              /* RENEW (T1)までの時間 */
    985         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1001        DHCP4_CLI_TIMER_UNLOCK();
    9861002
    9871003        /* BOUND 状態に遷移する。*/
     
    10061022        /* 遷移する状態が RENEW 以外では ACK/NAK メッセージ受信タイムアウトを設定する。*/
    10071023        if (fsm != DHCP4_FSM_RENEW) {
    1008                 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1024                DHCP4_CLI_TIMER_LOCK();
    10091025                ct->timers[DHCP4C_TIMER_RCV_ACK] = SYSTIM2TIMER(TMO_DHCP4C_ACK);
    1010                 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1026                DHCP4_CLI_TIMER_UNLOCK();
    10111027                }
    10121028
     
    10291045        /* REQUEST メッセージを送信する。*/
    10301046        ct->flags |= DHCP4C_FLAG_TMOUT_SND_REQ;
    1031         syscall(sig_sem(SEM_DHCP4_CLI_READY));
     1047        DHCP4_CLI_READY_SIGNAL(ct);
    10321048        }
    10331049
     
    10551071        /* RELEASE メッセージを送信する。*/
    10561072        ct->flags |= DHCP4C_FLAG_TMOUT_SND_REL;
    1057         syscall(sig_sem(SEM_DHCP4_CLI_READY));
     1073        DHCP4_CLI_READY_SIGNAL(ct);
    10581074        }
    10591075
     
    13491365
    13501366                /* REQUEST メッセージ送信タイマーを停止する。*/
    1351                 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1367                DHCP4_CLI_TIMER_LOCK();
    13521368                ct->timers[DHCP4C_TIMER_SND_REQ] = 0;
    1353                 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1369                DHCP4_CLI_TIMER_UNLOCK();
    13541370
    13551371                /*
     
    13991415
    14001416                /* ACK/NAK メッセージ受信タイマーを停止する。*/
    1401                 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1417                DHCP4_CLI_TIMER_LOCK();
    14021418                ct->timers[DHCP4C_TIMER_RCV_ACK] = 0;
    1403                 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1419                DHCP4_CLI_TIMER_UNLOCK();
    14041420
    14051421                /*
     
    14751491
    14761492        /* 再送信タイムアウトを設定する。*/
    1477         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1493        DHCP4_CLI_TIMER_LOCK();
    14781494        ct->timers[DHCP4C_TIMER_SND_REQ] = SYSTIM2TIMER(ct->interval);
    1479         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1495        DHCP4_CLI_TIMER_UNLOCK();
    14801496        }
    14811497
     
    15111527
    15121528        /* メッセージ送信待ちを行う。*/
    1513         syscall(wai_sem(SEM_DHCP4_CLI_READY));
     1529        DHCP4_CLI_READY_WAIT(ct);
    15141530
    15151531        /* SLEEP 状態に遷移する。*/
     
    15291545
    15301546                /* DISCOVER メッセージ送信タイマーを停止する。*/
    1531                 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1547                DHCP4_CLI_TIMER_LOCK();
    15321548                ct->timers[DHCP4C_TIMER_SND_DISC] = 0;
    1533                 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1549                DHCP4_CLI_TIMER_UNLOCK();
    15341550
    15351551                /* REQUEST メッセージを送信して REQUEST 状態に遷移する。*/
     
    15591575
    15601576                /* OFFER メッセージ受信タイマーを停止する。*/
    1561                 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1577                DHCP4_CLI_TIMER_LOCK();
    15621578                ct->timers[DHCP4C_TIMER_RCV_OFFER] = 0;
    1563                 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1579                DHCP4_CLI_TIMER_UNLOCK();
    15641580
    15651581                /* REQUEST メッセージを送信して REQUEST 状態に遷移する。*/
     
    16141630
    16151631        /* 再送信タイムアウトを設定する。*/
    1616         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1632        DHCP4_CLI_TIMER_LOCK();
    16171633        ct->timers[DHCP4C_TIMER_SND_DISC] = SYSTIM2TIMER(ct->interval);
    1618         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
    1619         }
     1634        DHCP4_CLI_TIMER_UNLOCK();
     1635        }
     1636
     1637#ifdef DHCP4_CLI_TASK
    16201638
    16211639/*
     
    16281646        int ix;
    16291647
    1630         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1648        DHCP4_CLI_TIMER_LOCK();
    16311649        for (ix = NUM_DHCP4C_TIMERS; ix -- > 0; ) {
    16321650                if (ct->timers[ix] != 0) {
     
    16341652                        if (ct->timers[ix] == 0) {
    16351653                                ct->flags = (ct->flags & ~DHCP4C_FLAG_TMOUT_MASK) | DHCP4C_FLAG_TMOUT_TIMER | ix;
    1636                                 syscall(sig_sem(SEM_DHCP4_CLI_READY));
     1654                                DHCP4_CLI_READY_SIGNAL(ct);
    16371655                                }
    16381656                        }
    16391657                }
    1640         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1658        DHCP4_CLI_TIMER_UNLOCK();
    16411659
    16421660        /* 1秒毎にタイムアウトする。*/
    16431661        timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ);
    16441662        }
     1663
     1664#endif
    16451665
    16461666/*
     
    17481768        }
    17491769
     1770#ifdef DHCP4_CLI_TASK
     1771
    17501772/*
    17511773 *  dispatch_event -- イベント毎の処理
     
    17601782
    17611783                /* メッセージの受信とタイムアウトを待つ。*/
    1762                 syscall(wai_sem(SEM_DHCP4_CLI_READY));
     1784                DHCP4_CLI_READY_WAIT(ct);
    17631785
    17641786                if (ct->flags & DHCP4C_FLAG_RCV_MSG) {
     
    17781800        }
    17791801
     1802#endif
     1803
    17801804/*
    17811805 *  init_context -- DHCP クライアントコンテキスト構造体を初期化する。
     
    17831807
    17841808static void
    1785 init_context (T_DHCP4_CLI_CONTEXT *ct, ID cepid)
     1809init_context (T_DHCP4_CLI_CONTEXT *ct, ID tskid, ID cepid)
    17861810{
    17871811        memset(ct, 0, sizeof(*ct));
     1812        ct->tskid       = tskid;
    17881813        ct->cepid       = cepid;
    17891814        ct->sc          = IF_ETHER_NIC_GET_SOFTC();
     
    18801905
    18811906                /* SLEEP を解除する。*/
    1882                 wup_tsk(DHCP4_CLI_TASK);
     1907                context.fsm = DHCP4_FSM_WAKE;
     1908                context.timer = 0;
     1909                wup_tsk(context.tskid);
    18831910                return E_OK;
    18841911                }
     
    19701997                                }
    19711998                        }
    1972                 syscall(sig_sem(SEM_DHCP4_CLI_READY));
     1999                DHCP4_CLI_READY_SIGNAL((&context));
    19732000                }
    19742001        return E_OK;
    19752002        }
     2003
     2004#ifdef DHCP4_CLI_TASK
    19762005
    19772006/*
     
    19932022
    19942023        /* DHCP クライアントコンテキスト構造体を初期化する。*/
    1995         init_context(ct, (ID)exinf);
     2024        init_context(ct, tskid, (ID)exinf);
    19962025        ct->fsm = DHCP4_FSM_SLEEP;
    19972026
     
    20372066        }
    20382067
     2068#else
     2069
     2070T_DHCP4_CLI_CONTEXT *
     2071dhcp4_cli_initialize(ID tskid, ID cepid)
     2072{
     2073        T_DHCP4_CLI_CONTEXT *ct = &context;
     2074        /* DHCP クライアントコンテキスト構造体を初期化する。*/
     2075        init_context(ct, tskid, cepid);
     2076        ct->fsm = DHCP4_FSM_SLEEP;
     2077        ct->timer = TMO_FEVR;
     2078        return ct;
     2079        }
     2080
     2081int
     2082dhcp4_cli_get_timer(T_DHCP4_CLI_CONTEXT *ct)
     2083{
     2084        if (ct->fsm == DHCP4_FSM_SLEEP)
     2085                return TMO_FEVR;
     2086
     2087        return ct->timer;
     2088        }
     2089
     2090void
     2091dhcp4_cli_progress(T_DHCP4_CLI_CONTEXT *ct, int elapse)
     2092{
     2093        int ix;
     2094
     2095        if ((ct->fsm == DHCP4_FSM_SLEEP) || (ct->timer == TMO_FEVR))
     2096                return;
     2097
     2098        ct->timer -= elapse;
     2099        if (ct->timer > 0)
     2100                return;
     2101
     2102        /* 1秒毎にタイムアウトするようにタイマーを設定する。*/
     2103        ct->timer = 1000 * 1000;
     2104
     2105        for (ix = NUM_DHCP4C_TIMERS; ix-- > 0; ) {
     2106                if (ct->timers[ix] != 0) {
     2107                        ct->timers[ix] --;
     2108                        if (ct->timers[ix] <= 0) {
     2109                                ct->timers[ix] = 0;
     2110                                ct->flags = (ct->flags & ~DHCP4C_FLAG_TMOUT_MASK) | DHCP4C_FLAG_TMOUT_TIMER | ix;
     2111                                DHCP4_CLI_READY_SIGNAL(ct);
     2112                                }
     2113                        }
     2114                }
     2115        }
     2116
     2117void
     2118dhcp4_cli_wakeup(T_DHCP4_CLI_CONTEXT *ct)
     2119{
     2120        if (ct->fsm == DHCP4_FSM_WAKE) {
     2121                ct->flags = 0;
     2122                ct->error = E_OK;
     2123
     2124                /* メッセージ構造体を初期化する。*/
     2125                if ((ct->error = init_cli_msg(ct)) != E_OK)
     2126                        return;
     2127
     2128                ct->timer = 1000 * 1000;
     2129
     2130                /* SELECT 状態に遷移する。*/
     2131                start_select(ct);
     2132                }
     2133
     2134        if (ct->flags & DHCP4C_FLAG_RCV_MSG) {
     2135                while (ct->val_lst != NULL) {
     2136                        ct->error = eval_rcv_msg(ct);
     2137                        }
     2138                ct->flags &= ~DHCP4C_FLAG_RCV_MSG;
     2139                }
     2140        }
     2141
     2142void
     2143dhcp4_cli_timeout(T_DHCP4_CLI_CONTEXT *ct)
     2144{
     2145        if (ct->flags & DHCP4C_FLAG_TMOUT_MASK)
     2146                ct->error = dispatch_timeout(ct);
     2147
     2148        if (ct->error != E_OK || ct->fsm == DHCP4_FSM_SLEEP) {
     2149                /* 全ての TIMER をキャンセルする。*/
     2150                cancel_all_timers(ct);
     2151                ct->timer = TMO_FEVR;
     2152
     2153                /* メッセージ構造体を解放する。*/
     2154                rel_cli_msg(ct);
     2155
     2156                /* リースを解放後、再取得が指定されていなければ休止する。*/
     2157                if (!(ct->flags & DHCP4C_FLAG_RENEW)) {
     2158
     2159                        /* 休止する。*/
     2160                        if (ct->error == E_OK)
     2161                                syslog(LOG_NOTICE, "[DHCP4C] lease released, go to sleep.");
     2162                        else {
     2163                                syslog(LOG_NOTICE, "[DHCP4C] server not available, go to sleep, error: %s.", itron_strerror(ct->error));
     2164                                ct->error = E_OK;
     2165                                ct->fsm = DHCP4_FSM_SLEEP;
     2166                                }
     2167                        }
     2168                }
     2169        }
     2170
     2171#endif /* DHCP4_CLI_TASK */
    20392172#endif  /* of #ifdef DHCP4_CLI_CFG */
Note: See TracChangeset for help on using the changeset viewer.