Ignore:
Timestamp:
Jul 3, 2020, 7:19:17 PM (4 years ago)
Author:
coas-nagasima
Message:

ASP3, TINET, mbed を更新

File:
1 edited

Legend:

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

    r331 r429  
    206206#endif
    207207
     208#ifdef SEM_DHCP4_CLI_TIMER
     209#define DHCP4_CLI_TIMER_LOCK() do { syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); } while(0)
     210#define DHCP4_CLI_TIMER_UNLOCK() do { syscall(sig_sem(SEM_DHCP4_CLI_TIMER)); } while(0)
     211#else
     212#define DHCP4_CLI_TIMER_LOCK() do { } while(0)
     213#define DHCP4_CLI_TIMER_UNLOCK() do { } while(0)
     214#endif
     215
     216#ifdef SEM_DHCP4_CLI_READY
     217#define DHCP4_CLI_READY_WAIT(ct) do { syscall(wai_sem(SEM_DHCP4_CLI_READY)); } while(0)
     218#define DHCP4_CLI_READY_SIGNAL(ct) do { syscall(sig_sem(SEM_DHCP4_CLI_READY)); } while(0)
     219#else
     220#define DHCP4_CLI_READY_WAIT(ct) do { } while(0)
     221#define DHCP4_CLI_READY_SIGNAL(ct) do { ct->sig = 1; syscall(wup_tsk(ct->tskid)); } while(0)
     222#endif
     223
    208224/*
    209225 *  dhcp4_cksum -- チェックサムの計算関数
     
    381397#endif  /* of #ifdef USE_LCD */
    382398#endif
    383 
     399                ether_set_down();
    384400                }
    385401        }
     
    508524                lcd_putc(LCD_PORTID, '\n');
    509525#endif  /* of #ifdef USE_LCD */
    510         if (ct->set_addr_callback != NULL)
    511                 ct->set_addr_callback();
    512 
     526                ether_set_up();
    513527                }
    514528        }
     
    951965        int ix;
    952966
    953         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     967        DHCP4_CLI_TIMER_LOCK();
    954968        for (ix = NUM_DHCP4C_TIMERS; ix -- > 0; )
    955969                ct->timers[ix] = 0;
    956         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     970        DHCP4_CLI_TIMER_UNLOCK();
    957971        }
    958972
     
    970984
    971985        /* OFFER メッセージ受信タイムアウトを設定する。*/
    972         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     986        DHCP4_CLI_TIMER_LOCK();
    973987        ct->timers[DHCP4C_TIMER_RCV_OFFER] = SYSTIM2TIMER(TMO_DHCP4C_OFFER);
    974         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     988        DHCP4_CLI_TIMER_UNLOCK();
    975989
    976990        /* 送信å
     
    9871001        /* DISCOVER メッセージを送信する。*/
    9881002        ct->flags |= DHCP4C_FLAG_TMOUT_SND_DISC;
    989         syscall(sig_sem(SEM_DHCP4_CLI_READY));
     1003        DHCP4_CLI_READY_SIGNAL(ct);
    9901004        }
    9911005
     
    10181032
    10191033        /* EXPIRE、RENEW、REBIND タイマーを設定する。*/
    1020         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1034        DHCP4_CLI_TIMER_LOCK();
    10211035        ct->timers[DHCP4C_TIMER_EXPIRE] = SYSTIM2TIMER(ct->expire);             /* EXPIRE      までの時間 */
    10221036        ct->timers[DHCP4C_TIMER_REBIND] = SYSTIM2TIMER(ct->rebind);             /* REBIND(T2)までの時間 */
    10231037        ct->timers[DHCP4C_TIMER_RENEW]  = SYSTIM2TIMER(ct->renew);              /* RENEW (T1)までの時間 */
    1024         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1038        DHCP4_CLI_TIMER_UNLOCK();
    10251039
    10261040        /* BOUND 状æ
     
    10481062‹ãŒ RENEW 以外では ACK/NAK メッセージ受信タイムアウトを設定する。*/
    10491063        if (fsm != DHCP4_FSM_RENEW) {
    1050                 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1064                DHCP4_CLI_TIMER_LOCK();
    10511065                ct->timers[DHCP4C_TIMER_RCV_ACK] = SYSTIM2TIMER(TMO_DHCP4C_ACK);
    1052                 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1066                DHCP4_CLI_TIMER_UNLOCK();
    10531067                }
    10541068
     
    10731087        /* REQUEST メッセージを送信する。*/
    10741088        ct->flags |= DHCP4C_FLAG_TMOUT_SND_REQ;
    1075         syscall(sig_sem(SEM_DHCP4_CLI_READY));
     1089        DHCP4_CLI_READY_SIGNAL(ct);
    10761090        }
    10771091
     
    11031117        /* RELEASE メッセージを送信する。*/
    11041118        ct->flags |= DHCP4C_FLAG_TMOUT_SND_REL;
    1105         syscall(sig_sem(SEM_DHCP4_CLI_READY));
     1119        DHCP4_CLI_READY_SIGNAL(ct);
    11061120        }
    11071121
     
    11161130        uint8_t *option;
    11171131
    1118         memset((void*)&ct->snd_msg->msg, sizeof(ct->snd_msg->msg), 0);
     1132        memset((void*)&ct->snd_msg->msg, 0, sizeof(ct->snd_msg->msg));
    11191133        ct->snd_msg->len = sizeof(ct->snd_msg->msg);
    11201134
     
    14101424
    14111425                /* REQUEST メッセージ送信タイマーを停止する。*/
    1412                 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1426                DHCP4_CLI_TIMER_LOCK();
    14131427                ct->timers[DHCP4C_TIMER_SND_REQ] = 0;
    1414                 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1428                DHCP4_CLI_TIMER_UNLOCK();
    14151429
    14161430                /*
     
    14641478
    14651479                /* ACK/NAK メッセージ受信タイマーを停止する。*/
    1466                 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1480                DHCP4_CLI_TIMER_LOCK();
    14671481                ct->timers[DHCP4C_TIMER_RCV_ACK] = 0;
    1468                 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1482                DHCP4_CLI_TIMER_UNLOCK();
    14691483
    14701484                /*
     
    15441558
    15451559        /* 再送信タイムアウトを設定する。*/
    1546         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1560        DHCP4_CLI_TIMER_LOCK();
    15471561        ct->timers[DHCP4C_TIMER_SND_REQ] = SYSTIM2TIMER(ct->interval);
    1548         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1562        DHCP4_CLI_TIMER_UNLOCK();
    15491563        }
    15501564
     
    15821596        /* メッセージ送信å¾
    15831597ちを行う。*/
    1584         syscall(wai_sem(SEM_DHCP4_CLI_READY));
     1598        DHCP4_CLI_READY_WAIT(ct);
    15851599
    15861600        /* SLEEP 状æ
     
    16021616
    16031617                /* DISCOVER メッセージ送信タイマーを停止する。*/
    1604                 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1618                DHCP4_CLI_TIMER_LOCK();
    16051619                ct->timers[DHCP4C_TIMER_SND_DISC] = 0;
    1606                 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1620                DHCP4_CLI_TIMER_UNLOCK();
    16071621
    16081622                /* REQUEST メッセージを送信して REQUEST 状æ
     
    16341648
    16351649                /* OFFER メッセージ受信タイマーを停止する。*/
    1636                 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1650                DHCP4_CLI_TIMER_LOCK();
    16371651                ct->timers[DHCP4C_TIMER_RCV_OFFER] = 0;
    1638                 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1652                DHCP4_CLI_TIMER_UNLOCK();
    16391653
    16401654                /* REQUEST メッセージを送信して REQUEST 状æ
     
    16921706
    16931707        /* 再送信タイムアウトを設定する。*/
    1694         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1708        DHCP4_CLI_TIMER_LOCK();
    16951709        ct->timers[DHCP4C_TIMER_SND_DISC] = SYSTIM2TIMER(ct->interval);
    1696         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
    1697         }
     1710        DHCP4_CLI_TIMER_UNLOCK();
     1711        }
     1712
     1713#ifdef DHCP4_CLI_TASK
    16981714
    16991715/*
     
    17061722        int ix;
    17071723
    1708         syscall(wai_sem(SEM_DHCP4_CLI_TIMER));
     1724        DHCP4_CLI_TIMER_LOCK();
    17091725        for (ix = NUM_DHCP4C_TIMERS; ix -- > 0; ) {
    17101726                if (ct->timers[ix] != 0) {
     
    17121728                        if (ct->timers[ix] == 0) {
    17131729                                ct->flags = (ct->flags & ~DHCP4C_FLAG_TMOUT_MASK) | DHCP4C_FLAG_TMOUT_TIMER | ix;
    1714                                 syscall(sig_sem(SEM_DHCP4_CLI_READY));
     1730                                DHCP4_CLI_READY_SIGNAL(ct);
    17151731                                }
    17161732                        }
    17171733                }
    1718         syscall(sig_sem(SEM_DHCP4_CLI_TIMER));
     1734        DHCP4_CLI_TIMER_UNLOCK();
    17191735
    17201736        /* 1秒毎にタイムアウトする。*/
    17211737        timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ);
    17221738        }
     1739
     1740#endif
    17231741
    17241742/*
     
    18321850        }
    18331851
     1852#ifdef DHCP4_CLI_TASK
     1853
    18341854/*
    18351855 *  dispatch_event -- イベント毎の処理
     
    18451865                /* メッセージの受信とタイムアウトをå¾
    18461866つ。*/
    1847                 syscall(wai_sem(SEM_DHCP4_CLI_READY));
     1867                DHCP4_CLI_READY_WAIT(ct);
    18481868
    18491869                if (ct->flags & DHCP4C_FLAG_RCV_MSG) {
     
    18631883        }
    18641884
     1885#endif
     1886
    18651887/*
    18661888 *  init_context -- DHCP クライアントコンテキスト構造体を初期化する。
     
    18681890
    18691891static void
    1870 init_context (T_DHCP4_CLI_CONTEXT *ct, ID cepid)
     1892init_context (T_DHCP4_CLI_CONTEXT *ct, ID tskid, ID cepid)
    18711893{
    18721894        memset(ct, 0, sizeof(*ct));
     1895        ct->tskid       = tskid;
    18731896        ct->cepid       = cepid;
    18741897        ct->sc          = IF_ETHER_NIC_GET_SOFTC();
    18751898        ct->dst.portno  = DHCP4_SRV_CFG_PORTNO;
    18761899        ct->dst.ipaddr  = IPV4_ADDRANY;
    1877         ct->set_addr_callback = DHCP4_CLI_SET_ADDR_CALLBACK;
    18781900        }
    18791901
     
    19681990
    19691991                /* SLEEP を解除する。*/
    1970                 wup_tsk(DHCP4_CLI_TASK);
     1992                context.req = 1;
     1993                wup_tsk(context.tskid);
    19711994                return E_OK;
    19721995                }
     
    20612084                                }
    20622085                        }
    2063                 syscall(sig_sem(SEM_DHCP4_CLI_READY));
     2086                DHCP4_CLI_READY_SIGNAL((&context));
    20642087                }
    20652088        return E_OK;
    20662089        }
     2090
     2091#ifdef DHCP4_CLI_TASK
    20672092
    20682093/*
     
    20752100        T_DHCP4_CLI_CONTEXT     *ct;
    20762101        ID                      tskid;
    2077         ER                      error;
     2102        ER                      error = E_OK;
    20782103
    20792104        dly_tsk(1000);
     
    20842109
    20852110        /* DHCP クライアントコンテキスト構造体を初期化する。*/
    2086         init_context(ct, (ID)exinf);
     2111        init_context(ct, tskid, (ID)exinf);
     2112        ct->fsm = DHCP4_FSM_SLEEP;
    20872113
    20882114        while (true) {
    2089 
    2090                 /* 1秒毎にタイムアウトするようにタイマーを設定する。*/
    2091                 timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ / DHCP4C_TIMER_HZ);
    2092 
    2093                 /* メッセージ構造体を初期化する。*/
    2094                 if ((error = init_cli_msg(ct)) == E_OK) {
    2095 
    2096                         /* SELECT 状æ
    2097 ‹ã«é·ç§»ã™ã‚‹ã€‚*/
    2098                         start_select(ct);
    2099 
    2100                         /* メインループ */
    2101                         error = dispatch_event(ct);
    2102                         }
    2103 
    2104                 /* å
    2105 ¨ã¦ã® TIMER をキャンセルする。*/
    2106                 cancel_all_timers(ct);
    2107 
    2108                 /* タイマーを停止する。*/
    2109                 untimeout((callout_func)dhcpc_timer, ct);
    2110 
    2111                 /* メッセージ構造体を解放する。*/
    2112                 rel_cli_msg (ct);
    21132115
    21142116                /* リースを解放後、再取得が指定されていなければ休止する。*/
     
    21162118
    21172119                        /* 休止する。*/
    2118                         if (error == E_OK)
    2119                                 syslog(LOG_NOTICE, "[DHCP4C] lease released, go to sleep.");
     2120                        if (error == E_OK) {
     2121                                if (ct->fsm != DHCP4_FSM_SLEEP)
     2122                                        syslog(LOG_NOTICE, "[DHCP4C] lease released, go to sleep.");
     2123                        }
    21202124                        else {
    21212125                                syslog(LOG_NOTICE, "[DHCP4C] server not available, go to sleep, error: %s.", itron_strerror(error));
     
    21262130                ct->flags = 0;
    21272131                ct->error = E_OK;
    2128                 }
    2129         }
    2130 
     2132
     2133                /* 1秒毎にタイムアウトするようにタイマーを設定する。*/
     2134                timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ / DHCP4C_TIMER_HZ);
     2135
     2136                /* メッセージ構造体を初期化する。*/
     2137                if ((error = init_cli_msg(ct)) == E_OK) {
     2138
     2139                        /* SELECT 状æ
     2140‹ã«é·ç§»ã™ã‚‹ã€‚*/
     2141                        start_select(ct);
     2142
     2143                        /* メインループ */
     2144                        error = dispatch_event(ct);
     2145                        }
     2146
     2147                /* å
     2148¨ã¦ã® TIMER をキャンセルする。*/
     2149                cancel_all_timers(ct);
     2150
     2151                /* タイマーを停止する。*/
     2152                untimeout((callout_func)dhcpc_timer, ct);
     2153
     2154                /* メッセージ構造体を解放する。*/
     2155                rel_cli_msg (ct);
     2156                }
     2157        }
     2158
     2159#else
     2160
     2161T_DHCP4_CLI_CONTEXT *
     2162dhcp4_cli_initialize(ID tskid, ID cepid)
     2163{
     2164        T_DHCP4_CLI_CONTEXT *ct = &context;
     2165        /* DHCP クライアントコンテキスト構造体を初期化する。*/
     2166        init_context(ct, tskid, cepid);
     2167        ct->fsm = DHCP4_FSM_SLEEP;
     2168        ct->timer = TMO_FEVR;
     2169        return ct;
     2170        }
     2171
     2172int
     2173dhcp4_cli_get_timer(T_DHCP4_CLI_CONTEXT *ct)
     2174{
     2175        if (ct->fsm == DHCP4_FSM_SLEEP)
     2176                return TMO_FEVR;
     2177
     2178        return ct->timer;
     2179        }
     2180
     2181void
     2182dhcp4_cli_progress(T_DHCP4_CLI_CONTEXT *ct, int elapse)
     2183{
     2184        int ix;
     2185
     2186        if ((ct->fsm == DHCP4_FSM_SLEEP) || (ct->timer == TMO_FEVR))
     2187                return;
     2188
     2189        ct->timer -= elapse;
     2190        if (ct->timer > 0)
     2191                return;
     2192
     2193        /* 1秒毎にタイムアウトするようにタイマーを設定する。*/
     2194        ct->timer = 1000 * 1000;
     2195
     2196        for (ix = NUM_DHCP4C_TIMERS; ix-- > 0; ) {
     2197                if (ct->timers[ix] != 0) {
     2198                        ct->timers[ix] --;
     2199                        if (ct->timers[ix] <= 0) {
     2200                                ct->timers[ix] = 0;
     2201                                ct->flags = (ct->flags & ~DHCP4C_FLAG_TMOUT_MASK) | DHCP4C_FLAG_TMOUT_TIMER | ix;
     2202                                DHCP4_CLI_READY_SIGNAL(ct);
     2203                                }
     2204                        }
     2205                }
     2206        }
     2207
     2208void
     2209dhcp4_cli_wakeup(T_DHCP4_CLI_CONTEXT *ct)
     2210{
     2211        if (ct->req) {
     2212                ct->req = 0;
     2213                if (ct->snd_msg == NULL) {
     2214                        ct->flags = 0;
     2215                        ct->error = E_OK;
     2216
     2217                        /* メッセージ構造体を初期化する。*/
     2218                        if ((ct->error = init_cli_msg(ct)) != E_OK)
     2219                                return;
     2220
     2221                        ct->timer = 1000 * 1000;
     2222
     2223                        /* SELECT 状æ
     2224‹ã«é·ç§»ã™ã‚‹ã€‚*/
     2225                        start_select(ct);
     2226                        }
     2227                }
     2228
     2229        if (!ct->sig)
     2230                return;
     2231        ct->sig = 0;
     2232
     2233        if (ct->flags & DHCP4C_FLAG_RCV_MSG) {
     2234                while (ct->val_lst != NULL) {
     2235                        ct->error = eval_rcv_msg(ct);
     2236                        }
     2237                ct->flags &= ~DHCP4C_FLAG_RCV_MSG;
     2238                }
     2239        }
     2240
     2241void
     2242dhcp4_cli_timeout(T_DHCP4_CLI_CONTEXT *ct)
     2243{
     2244        if (ct->flags & DHCP4C_FLAG_TMOUT_MASK)
     2245                ct->error = dispatch_timeout(ct);
     2246
     2247        if (ct->error != E_OK || ct->fsm == DHCP4_FSM_SLEEP) {
     2248                /* å
     2249¨ã¦ã® TIMER をキャンセルする。*/
     2250                cancel_all_timers(ct);
     2251                ct->timer = TMO_FEVR;
     2252
     2253                /* メッセージ構造体を解放する。*/
     2254                rel_cli_msg(ct);
     2255
     2256                /* リースを解放後、再取得が指定されていなければ休止する。*/
     2257                if (!(ct->flags & DHCP4C_FLAG_RENEW)) {
     2258
     2259                        /* 休止する。*/
     2260                        if (ct->error == E_OK) {
     2261                                if (ct->fsm != DHCP4_FSM_SLEEP)
     2262                                        syslog(LOG_NOTICE, "[DHCP4C] lease released, go to sleep.");
     2263                        }
     2264                        else {
     2265                                syslog(LOG_NOTICE, "[DHCP4C] server not available, go to sleep, error: %s.", itron_strerror(ct->error));
     2266                                ct->error = E_OK;
     2267                                ct->fsm = DHCP4_FSM_SLEEP;
     2268                                }
     2269                        }
     2270                }
     2271        }
     2272
     2273#endif /* DHCP4_CLI_TASK */
    21312274#endif  /* of #ifdef DHCP4_CLI_CFG */
Note: See TracChangeset for help on using the changeset viewer.