Changeset 429 for EcnlProtoTool/trunk/asp3_dcre/tinet/netapp/dhcp4_cli.c
- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tinet/netapp/dhcp4_cli.c
r331 r429 206 206 #endif 207 207 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 208 224 /* 209 225 * dhcp4_cksum -- ãã§ãã¯ãµã ã®è¨ç®é¢æ° … … 381 397 #endif /* of #ifdef USE_LCD */ 382 398 #endif 383 399 ether_set_down(); 384 400 } 385 401 } … … 508 524 lcd_putc(LCD_PORTID, '\n'); 509 525 #endif /* of #ifdef USE_LCD */ 510 if (ct->set_addr_callback != NULL) 511 ct->set_addr_callback(); 512 526 ether_set_up(); 513 527 } 514 528 } … … 951 965 int ix; 952 966 953 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));967 DHCP4_CLI_TIMER_LOCK(); 954 968 for (ix = NUM_DHCP4C_TIMERS; ix -- > 0; ) 955 969 ct->timers[ix] = 0; 956 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));970 DHCP4_CLI_TIMER_UNLOCK(); 957 971 } 958 972 … … 970 984 971 985 /* OFFER ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/ 972 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));986 DHCP4_CLI_TIMER_LOCK(); 973 987 ct->timers[DHCP4C_TIMER_RCV_OFFER] = SYSTIM2TIMER(TMO_DHCP4C_OFFER); 974 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));988 DHCP4_CLI_TIMER_UNLOCK(); 975 989 976 990 /* éä¿¡å … … 987 1001 /* DISCOVER ã¡ãã»ã¼ã¸ãéä¿¡ããã*/ 988 1002 ct->flags |= DHCP4C_FLAG_TMOUT_SND_DISC; 989 syscall(sig_sem(SEM_DHCP4_CLI_READY));1003 DHCP4_CLI_READY_SIGNAL(ct); 990 1004 } 991 1005 … … 1018 1032 1019 1033 /* EXPIREãRENEWãREBIND ã¿ã¤ãã¼ãè¨å®ããã*/ 1020 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1034 DHCP4_CLI_TIMER_LOCK(); 1021 1035 ct->timers[DHCP4C_TIMER_EXPIRE] = SYSTIM2TIMER(ct->expire); /* EXPIRE ã¾ã§ã®æé */ 1022 1036 ct->timers[DHCP4C_TIMER_REBIND] = SYSTIM2TIMER(ct->rebind); /* REBINDï¼T2ï¼ã¾ã§ã®æé */ 1023 1037 ct->timers[DHCP4C_TIMER_RENEW] = SYSTIM2TIMER(ct->renew); /* RENEW ï¼T1ï¼ã¾ã§ã®æé */ 1024 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1038 DHCP4_CLI_TIMER_UNLOCK(); 1025 1039 1026 1040 /* BOUND ç¶æ … … 1048 1062 ã RENEW 以å¤ã§ã¯ ACK/NAK ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/ 1049 1063 if (fsm != DHCP4_FSM_RENEW) { 1050 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1064 DHCP4_CLI_TIMER_LOCK(); 1051 1065 ct->timers[DHCP4C_TIMER_RCV_ACK] = SYSTIM2TIMER(TMO_DHCP4C_ACK); 1052 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1066 DHCP4_CLI_TIMER_UNLOCK(); 1053 1067 } 1054 1068 … … 1073 1087 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã*/ 1074 1088 ct->flags |= DHCP4C_FLAG_TMOUT_SND_REQ; 1075 syscall(sig_sem(SEM_DHCP4_CLI_READY));1089 DHCP4_CLI_READY_SIGNAL(ct); 1076 1090 } 1077 1091 … … 1103 1117 /* RELEASE ã¡ãã»ã¼ã¸ãéä¿¡ããã*/ 1104 1118 ct->flags |= DHCP4C_FLAG_TMOUT_SND_REL; 1105 syscall(sig_sem(SEM_DHCP4_CLI_READY));1119 DHCP4_CLI_READY_SIGNAL(ct); 1106 1120 } 1107 1121 … … 1116 1130 uint8_t *option; 1117 1131 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)); 1119 1133 ct->snd_msg->len = sizeof(ct->snd_msg->msg); 1120 1134 … … 1410 1424 1411 1425 /* REQUEST ã¡ãã»ã¼ã¸éä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/ 1412 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1426 DHCP4_CLI_TIMER_LOCK(); 1413 1427 ct->timers[DHCP4C_TIMER_SND_REQ] = 0; 1414 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1428 DHCP4_CLI_TIMER_UNLOCK(); 1415 1429 1416 1430 /* … … 1464 1478 1465 1479 /* ACK/NAK ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/ 1466 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1480 DHCP4_CLI_TIMER_LOCK(); 1467 1481 ct->timers[DHCP4C_TIMER_RCV_ACK] = 0; 1468 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1482 DHCP4_CLI_TIMER_UNLOCK(); 1469 1483 1470 1484 /* … … 1544 1558 1545 1559 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/ 1546 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1560 DHCP4_CLI_TIMER_LOCK(); 1547 1561 ct->timers[DHCP4C_TIMER_SND_REQ] = SYSTIM2TIMER(ct->interval); 1548 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1562 DHCP4_CLI_TIMER_UNLOCK(); 1549 1563 } 1550 1564 … … 1582 1596 /* ã¡ãã»ã¼ã¸éä¿¡å¾ 1583 1597 ã¡ãè¡ãã*/ 1584 syscall(wai_sem(SEM_DHCP4_CLI_READY));1598 DHCP4_CLI_READY_WAIT(ct); 1585 1599 1586 1600 /* SLEEP ç¶æ … … 1602 1616 1603 1617 /* DISCOVER ã¡ãã»ã¼ã¸éä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/ 1604 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1618 DHCP4_CLI_TIMER_LOCK(); 1605 1619 ct->timers[DHCP4C_TIMER_SND_DISC] = 0; 1606 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1620 DHCP4_CLI_TIMER_UNLOCK(); 1607 1621 1608 1622 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠REQUEST ç¶æ … … 1634 1648 1635 1649 /* OFFER ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/ 1636 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1650 DHCP4_CLI_TIMER_LOCK(); 1637 1651 ct->timers[DHCP4C_TIMER_RCV_OFFER] = 0; 1638 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1652 DHCP4_CLI_TIMER_UNLOCK(); 1639 1653 1640 1654 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠REQUEST ç¶æ … … 1692 1706 1693 1707 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/ 1694 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1708 DHCP4_CLI_TIMER_LOCK(); 1695 1709 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 1698 1714 1699 1715 /* … … 1706 1722 int ix; 1707 1723 1708 syscall(wai_sem(SEM_DHCP4_CLI_TIMER));1724 DHCP4_CLI_TIMER_LOCK(); 1709 1725 for (ix = NUM_DHCP4C_TIMERS; ix -- > 0; ) { 1710 1726 if (ct->timers[ix] != 0) { … … 1712 1728 if (ct->timers[ix] == 0) { 1713 1729 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); 1715 1731 } 1716 1732 } 1717 1733 } 1718 syscall(sig_sem(SEM_DHCP4_CLI_TIMER));1734 DHCP4_CLI_TIMER_UNLOCK(); 1719 1735 1720 1736 /* 1ç§æ¯ã«ã¿ã¤ã ã¢ã¦ãããã*/ 1721 1737 timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ); 1722 1738 } 1739 1740 #endif 1723 1741 1724 1742 /* … … 1832 1850 } 1833 1851 1852 #ifdef DHCP4_CLI_TASK 1853 1834 1854 /* 1835 1855 * dispatch_event -- ã¤ãã³ãæ¯ã®å¦ç … … 1845 1865 /* ã¡ãã»ã¼ã¸ã®åä¿¡ã¨ã¿ã¤ã ã¢ã¦ããå¾ 1846 1866 ã¤ã*/ 1847 syscall(wai_sem(SEM_DHCP4_CLI_READY));1867 DHCP4_CLI_READY_WAIT(ct); 1848 1868 1849 1869 if (ct->flags & DHCP4C_FLAG_RCV_MSG) { … … 1863 1883 } 1864 1884 1885 #endif 1886 1865 1887 /* 1866 1888 * init_context -- DHCP ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ãæ§é ä½ãåæåããã … … 1868 1890 1869 1891 static void 1870 init_context (T_DHCP4_CLI_CONTEXT *ct, ID cepid)1892 init_context (T_DHCP4_CLI_CONTEXT *ct, ID tskid, ID cepid) 1871 1893 { 1872 1894 memset(ct, 0, sizeof(*ct)); 1895 ct->tskid = tskid; 1873 1896 ct->cepid = cepid; 1874 1897 ct->sc = IF_ETHER_NIC_GET_SOFTC(); 1875 1898 ct->dst.portno = DHCP4_SRV_CFG_PORTNO; 1876 1899 ct->dst.ipaddr = IPV4_ADDRANY; 1877 ct->set_addr_callback = DHCP4_CLI_SET_ADDR_CALLBACK;1878 1900 } 1879 1901 … … 1968 1990 1969 1991 /* SLEEP ã解é¤ããã*/ 1970 wup_tsk(DHCP4_CLI_TASK); 1992 context.req = 1; 1993 wup_tsk(context.tskid); 1971 1994 return E_OK; 1972 1995 } … … 2061 2084 } 2062 2085 } 2063 syscall(sig_sem(SEM_DHCP4_CLI_READY));2086 DHCP4_CLI_READY_SIGNAL((&context)); 2064 2087 } 2065 2088 return E_OK; 2066 2089 } 2090 2091 #ifdef DHCP4_CLI_TASK 2067 2092 2068 2093 /* … … 2075 2100 T_DHCP4_CLI_CONTEXT *ct; 2076 2101 ID tskid; 2077 ER error ;2102 ER error = E_OK; 2078 2103 2079 2104 dly_tsk(1000); … … 2084 2109 2085 2110 /* DHCP ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ãæ§é ä½ãåæåããã*/ 2086 init_context(ct, (ID)exinf); 2111 init_context(ct, tskid, (ID)exinf); 2112 ct->fsm = DHCP4_FSM_SLEEP; 2087 2113 2088 2114 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);2113 2115 2114 2116 /* ãªã¼ã¹ã解æ¾å¾ãååå¾ãæå®ããã¦ããªããã°ä¼æ¢ããã*/ … … 2116 2118 2117 2119 /* ä¼æ¢ããã*/ 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 } 2120 2124 else { 2121 2125 syslog(LOG_NOTICE, "[DHCP4C] server not available, go to sleep, error: %s.", itron_strerror(error)); … … 2126 2130 ct->flags = 0; 2127 2131 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 2161 T_DHCP4_CLI_CONTEXT * 2162 dhcp4_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 2172 int 2173 dhcp4_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 2181 void 2182 dhcp4_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 2208 void 2209 dhcp4_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 2241 void 2242 dhcp4_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 */ 2131 2274 #endif /* of #ifdef DHCP4_CLI_CFG */
Note:
See TracChangeset
for help on using the changeset viewer.