Changeset 340 for asp3_tinet_ecnl_rx/trunk/asp3_dcre
- Timestamp:
- Apr 13, 2018, 1:00:30 PM (6 years ago)
- Location:
- asp3_tinet_ecnl_rx/trunk/asp3_dcre/tinet
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_rx/trunk/asp3_dcre/tinet/netapp/dhcp4_cli.c
r337 r340 191 191 #endif 192 192 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 193 209 /* 194 210 * dhcp4_cksum -- チェックサムの計算関数 … … 919 935 int ix; 920 936 921 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));937 DHCP4_CLI_TIMER_LOCK(); 922 938 for (ix = NUM_DHCP4C_TIMERS; ix -- > 0; ) 923 939 ct->timers[ix] = 0; 924 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));940 DHCP4_CLI_TIMER_UNLOCK(); 925 941 } 926 942 … … 937 953 938 954 /* OFFER メッセージ受信タイムアウトを設定する。*/ 939 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));955 DHCP4_CLI_TIMER_LOCK(); 940 956 ct->timers[DHCP4C_TIMER_RCV_OFFER] = SYSTIM2TIMER(TMO_DHCP4C_OFFER); 941 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));957 DHCP4_CLI_TIMER_UNLOCK(); 942 958 943 959 /* 送信先アドレスにローカルネットワークへのブロードキャストを設定する。*/ … … 952 968 /* DISCOVER メッセージを送信する。*/ 953 969 ct->flags |= DHCP4C_FLAG_TMOUT_SND_DISC; 954 syscall(sig_sem(SEM_DHCP4_CLI_READY));970 DHCP4_CLI_READY_SIGNAL(ct); 955 971 } 956 972 … … 979 995 980 996 /* EXPIRE、RENEW、REBIND タイマーを設定する。*/ 981 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));997 DHCP4_CLI_TIMER_LOCK(); 982 998 ct->timers[DHCP4C_TIMER_EXPIRE] = SYSTIM2TIMER(ct->expire); /* EXPIRE までの時間 */ 983 999 ct->timers[DHCP4C_TIMER_REBIND] = SYSTIM2TIMER(ct->rebind); /* REBIND(T2)までの時間 */ 984 1000 ct->timers[DHCP4C_TIMER_RENEW] = SYSTIM2TIMER(ct->renew); /* RENEW (T1)までの時間 */ 985 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1001 DHCP4_CLI_TIMER_UNLOCK(); 986 1002 987 1003 /* BOUND 状態に遷移する。*/ … … 1006 1022 /* 遷移する状態が RENEW 以外では ACK/NAK メッセージ受信タイムアウトを設定する。*/ 1007 1023 if (fsm != DHCP4_FSM_RENEW) { 1008 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1024 DHCP4_CLI_TIMER_LOCK(); 1009 1025 ct->timers[DHCP4C_TIMER_RCV_ACK] = SYSTIM2TIMER(TMO_DHCP4C_ACK); 1010 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1026 DHCP4_CLI_TIMER_UNLOCK(); 1011 1027 } 1012 1028 … … 1029 1045 /* REQUEST メッセージを送信する。*/ 1030 1046 ct->flags |= DHCP4C_FLAG_TMOUT_SND_REQ; 1031 syscall(sig_sem(SEM_DHCP4_CLI_READY));1047 DHCP4_CLI_READY_SIGNAL(ct); 1032 1048 } 1033 1049 … … 1055 1071 /* RELEASE メッセージを送信する。*/ 1056 1072 ct->flags |= DHCP4C_FLAG_TMOUT_SND_REL; 1057 syscall(sig_sem(SEM_DHCP4_CLI_READY));1073 DHCP4_CLI_READY_SIGNAL(ct); 1058 1074 } 1059 1075 … … 1349 1365 1350 1366 /* REQUEST メッセージ送信タイマーを停止する。*/ 1351 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1367 DHCP4_CLI_TIMER_LOCK(); 1352 1368 ct->timers[DHCP4C_TIMER_SND_REQ] = 0; 1353 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1369 DHCP4_CLI_TIMER_UNLOCK(); 1354 1370 1355 1371 /* … … 1399 1415 1400 1416 /* ACK/NAK メッセージ受信タイマーを停止する。*/ 1401 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1417 DHCP4_CLI_TIMER_LOCK(); 1402 1418 ct->timers[DHCP4C_TIMER_RCV_ACK] = 0; 1403 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1419 DHCP4_CLI_TIMER_UNLOCK(); 1404 1420 1405 1421 /* … … 1475 1491 1476 1492 /* 再送信タイムアウトを設定する。*/ 1477 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1493 DHCP4_CLI_TIMER_LOCK(); 1478 1494 ct->timers[DHCP4C_TIMER_SND_REQ] = SYSTIM2TIMER(ct->interval); 1479 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1495 DHCP4_CLI_TIMER_UNLOCK(); 1480 1496 } 1481 1497 … … 1511 1527 1512 1528 /* メッセージ送信待ちを行う。*/ 1513 syscall(wai_sem(SEM_DHCP4_CLI_READY));1529 DHCP4_CLI_READY_WAIT(ct); 1514 1530 1515 1531 /* SLEEP 状態に遷移する。*/ … … 1529 1545 1530 1546 /* DISCOVER メッセージ送信タイマーを停止する。*/ 1531 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1547 DHCP4_CLI_TIMER_LOCK(); 1532 1548 ct->timers[DHCP4C_TIMER_SND_DISC] = 0; 1533 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1549 DHCP4_CLI_TIMER_UNLOCK(); 1534 1550 1535 1551 /* REQUEST メッセージを送信して REQUEST 状態に遷移する。*/ … … 1559 1575 1560 1576 /* OFFER メッセージ受信タイマーを停止する。*/ 1561 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1577 DHCP4_CLI_TIMER_LOCK(); 1562 1578 ct->timers[DHCP4C_TIMER_RCV_OFFER] = 0; 1563 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1579 DHCP4_CLI_TIMER_UNLOCK(); 1564 1580 1565 1581 /* REQUEST メッセージを送信して REQUEST 状態に遷移する。*/ … … 1614 1630 1615 1631 /* 再送信タイムアウトを設定する。*/ 1616 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1632 DHCP4_CLI_TIMER_LOCK(); 1617 1633 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 1620 1638 1621 1639 /* … … 1628 1646 int ix; 1629 1647 1630 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1648 DHCP4_CLI_TIMER_LOCK(); 1631 1649 for (ix = NUM_DHCP4C_TIMERS; ix -- > 0; ) { 1632 1650 if (ct->timers[ix] != 0) { … … 1634 1652 if (ct->timers[ix] == 0) { 1635 1653 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); 1637 1655 } 1638 1656 } 1639 1657 } 1640 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1658 DHCP4_CLI_TIMER_UNLOCK(); 1641 1659 1642 1660 /* 1秒毎にタイムアウトする。*/ 1643 1661 timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ); 1644 1662 } 1663 1664 #endif 1645 1665 1646 1666 /* … … 1748 1768 } 1749 1769 1770 #ifdef DHCP4_CLI_TASK 1771 1750 1772 /* 1751 1773 * dispatch_event -- イベント毎の処理 … … 1760 1782 1761 1783 /* メッセージの受信とタイムアウトを待つ。*/ 1762 syscall(wai_sem(SEM_DHCP4_CLI_READY));1784 DHCP4_CLI_READY_WAIT(ct); 1763 1785 1764 1786 if (ct->flags & DHCP4C_FLAG_RCV_MSG) { … … 1778 1800 } 1779 1801 1802 #endif 1803 1780 1804 /* 1781 1805 * init_context -- DHCP クライアントコンテキスト構造体を初期化する。 … … 1783 1807 1784 1808 static void 1785 init_context (T_DHCP4_CLI_CONTEXT *ct, ID cepid)1809 init_context (T_DHCP4_CLI_CONTEXT *ct, ID tskid, ID cepid) 1786 1810 { 1787 1811 memset(ct, 0, sizeof(*ct)); 1812 ct->tskid = tskid; 1788 1813 ct->cepid = cepid; 1789 1814 ct->sc = IF_ETHER_NIC_GET_SOFTC(); … … 1880 1905 1881 1906 /* SLEEP を解除する。*/ 1882 wup_tsk(DHCP4_CLI_TASK); 1907 context.fsm = DHCP4_FSM_WAKE; 1908 context.timer = 0; 1909 wup_tsk(context.tskid); 1883 1910 return E_OK; 1884 1911 } … … 1970 1997 } 1971 1998 } 1972 syscall(sig_sem(SEM_DHCP4_CLI_READY));1999 DHCP4_CLI_READY_SIGNAL((&context)); 1973 2000 } 1974 2001 return E_OK; 1975 2002 } 2003 2004 #ifdef DHCP4_CLI_TASK 1976 2005 1977 2006 /* … … 1993 2022 1994 2023 /* DHCP クライアントコンテキスト構造体を初期化する。*/ 1995 init_context(ct, (ID)exinf);2024 init_context(ct, tskid, (ID)exinf); 1996 2025 ct->fsm = DHCP4_FSM_SLEEP; 1997 2026 … … 2037 2066 } 2038 2067 2068 #else 2069 2070 T_DHCP4_CLI_CONTEXT * 2071 dhcp4_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 2081 int 2082 dhcp4_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 2090 void 2091 dhcp4_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 2117 void 2118 dhcp4_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 2142 void 2143 dhcp4_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 */ 2039 2172 #endif /* of #ifdef DHCP4_CLI_CFG */ -
asp3_tinet_ecnl_rx/trunk/asp3_dcre/tinet/netapp/dhcp4_cli_var.h
r337 r340 164 164 RELTIM interval; /* 送信間隔 */ 165 165 ER_UINT error; /* エラー・データ長 */ 166 ID tskid; /* タスクID */ 166 167 ID cepid; /* CEP ID */ 167 168 uint32_t xid; /* トランザクション ID */ … … 170 171 uint16_t secs; /* seconds since boot began */ 171 172 uint8_t fsm; /* 現在の状態 */ 173 int timer; 172 174 } T_DHCP4_CLI_CONTEXT; 173 175 … … 184 186 #define DHCP4_FSM_REL_INFO 11 /* DHCPv4 の RFC2131 には無い。*/ 185 187 #define DHCP4_FSM_SLEEP 12 /* DHCPv4 の RFC2131 には無い。*/ 188 #define DHCP4_FSM_WAKE 13 /* DHCPv4 の RFC2131 には無い。*/ 186 189 187 190 /* flag の定義 */ -
asp3_tinet_ecnl_rx/trunk/asp3_dcre/tinet/netinet/ip_igmp.c
r337 r340 297 297 igmph->type = IGMP_MEMBERSHIP_REPORT_V2; 298 298 igmph->time = 0; 299 igmph->addr = dst;299 igmph->addr = htonl(dst); 300 300 301 301 /* 4 オクテット境界のデータ長 */
Note:
See TracChangeset
for help on using the changeset viewer.