📄 a00201.html
字号:
<a name="l00344"></a>00344 <span class="comment">/* Sum IP source and destination addresses. */</span><a name="l00345"></a>00345 sum = chksum(sum, (<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> *)&<a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->srcipaddr[0], 2 * <span class="keyword">sizeof</span>(<a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a>));<a name="l00346"></a>00346 <a name="l00347"></a>00347 <span class="comment">/* Sum TCP header and data. */</span><a name="l00348"></a>00348 sum = chksum(sum, &uip_buf[<a class="code" href="a00150.html#g6bc12c6c7b56f73ce5d57abfdcdc6eb5">UIP_IPH_LEN</a> + <a class="code" href="a00153.html#ge6f4a2453dbd8bc60e6a82774552366a">UIP_LLH_LEN</a>],<a name="l00349"></a>00349 upper_layer_len);<a name="l00350"></a>00350 <a name="l00351"></a>00351 <span class="keywordflow">return</span> (sum == 0) ? 0xffff : <a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(sum);<a name="l00352"></a>00352 }<a name="l00353"></a>00353 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00354"></a>00354 <span class="preprocessor">#if UIP_CONF_IPV6</span><a name="l00355"></a>00355 <span class="preprocessor"></span><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a><a name="l00356"></a>00356 uip_icmp6chksum(<span class="keywordtype">void</span>)<a name="l00357"></a>00357 {<a name="l00358"></a>00358 <span class="keywordflow">return</span> upper_layer_chksum(<a class="code" href="a00150.html#gad0321f4c570f9983c6de81ece3ddc20">UIP_PROTO_ICMP6</a>);<a name="l00359"></a>00359 <a name="l00360"></a>00360 }<a name="l00361"></a>00361 <span class="preprocessor">#endif </span><span class="comment">/* UIP_CONF_IPV6 */</span><a name="l00362"></a>00362 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00363"></a>00363 <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a><a name="l00364"></a><a class="code" href="a00150.html#g85b65e38aa74eba18979156f97a94a87">00364</a> <a class="code" href="a00150.html#g85b65e38aa74eba18979156f97a94a87">uip_tcpchksum</a>(<span class="keywordtype">void</span>)<a name="l00365"></a>00365 {<a name="l00366"></a>00366 <span class="keywordflow">return</span> upper_layer_chksum(<a class="code" href="a00150.html#g517c770991459cc62dc009c0d3875c6a">UIP_PROTO_TCP</a>);<a name="l00367"></a>00367 }<a name="l00368"></a>00368 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00369"></a>00369 <span class="preprocessor">#if UIP_UDP_CHECKSUMS</span><a name="l00370"></a>00370 <span class="preprocessor"></span><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a><a name="l00371"></a>00371 <a class="code" href="a00150.html#g7023a34ba9e9d03b5fbedbcb32924453">uip_udpchksum</a>(<span class="keywordtype">void</span>)<a name="l00372"></a>00372 {<a name="l00373"></a>00373 <span class="keywordflow">return</span> upper_layer_chksum(<a class="code" href="a00150.html#gf72d7b9a737707dcfb2c41fec2b6792e">UIP_PROTO_UDP</a>);<a name="l00374"></a>00374 }<a name="l00375"></a>00375 <span class="preprocessor">#endif </span><span class="comment">/* UIP_UDP_CHECKSUMS */</span><a name="l00376"></a>00376 <span class="preprocessor">#endif </span><span class="comment">/* UIP_ARCH_CHKSUM */</span><a name="l00377"></a>00377 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00378"></a>00378 <span class="keywordtype">void</span><a name="l00379"></a><a class="code" href="a00150.html#gc48ed5f0d27721ef62a3ed02a5ad8d2e">00379</a> <a class="code" href="a00145.html#gc48ed5f0d27721ef62a3ed02a5ad8d2e">uip_init</a>(<span class="keywordtype">void</span>)<a name="l00380"></a>00380 {<a name="l00381"></a>00381 <span class="keywordflow">for</span>(c = 0; c < <a class="code" href="a00153.html#g8f4ebd8ef6c0ea665ed351d87fec09fd">UIP_LISTENPORTS</a>; ++c) {<a name="l00382"></a>00382 uip_listenports[c] = 0;<a name="l00383"></a>00383 }<a name="l00384"></a>00384 <span class="keywordflow">for</span>(c = 0; c < <a class="code" href="a00153.html#gf5fe83be78b78b9e7d9e7f1e34ab1cc5">UIP_CONNS</a>; ++c) {<a name="l00385"></a>00385 <a class="code" href="a00150.html#gf703683056d2bfa5c81fa157dcb20fe2">uip_conns</a>[c].tcpstateflags = <a class="code" href="a00150.html#g28eda870cff3d8e3cf2949e6f57a502b">UIP_CLOSED</a>;<a name="l00386"></a>00386 }<a name="l00387"></a>00387 <span class="preprocessor">#if UIP_ACTIVE_OPEN</span><a name="l00388"></a>00388 <span class="preprocessor"></span> lastport = 1024;<a name="l00389"></a>00389 <span class="preprocessor">#endif </span><span class="comment">/* UIP_ACTIVE_OPEN */</span><a name="l00390"></a>00390 <a name="l00391"></a>00391 <span class="preprocessor">#if UIP_UDP</span><a name="l00392"></a>00392 <span class="preprocessor"></span> <span class="keywordflow">for</span>(c = 0; c < <a class="code" href="a00153.html#g196379ceb1219a99f4495e41ccc9bbfb">UIP_UDP_CONNS</a>; ++c) {<a name="l00393"></a>00393 <a class="code" href="a00150.html#geb533744817cf6695d75293369c2248b">uip_udp_conns</a>[c].lport = 0;<a name="l00394"></a>00394 }<a name="l00395"></a>00395 <span class="preprocessor">#endif </span><span class="comment">/* UIP_UDP */</span><a name="l00396"></a>00396 <a name="l00397"></a>00397 <a name="l00398"></a>00398 <span class="comment">/* IPv4 initialization. */</span><a name="l00399"></a>00399 <span class="preprocessor">#if UIP_FIXEDADDR == 0</span><a name="l00400"></a>00400 <span class="preprocessor"></span> <span class="comment">/* uip_hostaddr[0] = uip_hostaddr[1] = 0;*/</span><a name="l00401"></a>00401 <span class="preprocessor">#endif </span><span class="comment">/* UIP_FIXEDADDR */</span><a name="l00402"></a>00402 <a name="l00403"></a>00403 }<a name="l00404"></a>00404 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00405"></a>00405 <span class="preprocessor">#if UIP_ACTIVE_OPEN</span><a name="l00406"></a>00406 <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00150.html#g788ffac72342f6172343d7f8099cbe1a">uip_conn</a> *<a name="l00407"></a><a class="code" href="a00150.html#g9c24fba2cd8f7f62accb0a0d5bbe4dad">00407</a> <a class="code" href="a00147.html#g8096b0c4b543dc408f4dd031ddae7240">uip_connect</a>(<a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> *<a class="code" href="a00088.html#79510aa86d3fa0a0fc6cfc49b1da7279">ripaddr</a>, <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a class="code" href="a00088.html#1df6aa054ef2fa634ac4c6f418228285">rport</a>)<a name="l00408"></a>00408 {<a name="l00409"></a>00409 <span class="keyword">register</span> <span class="keyword">struct </span><a class="code" href="a00150.html#g788ffac72342f6172343d7f8099cbe1a">uip_conn</a> *conn, *cconn;<a name="l00410"></a>00410 <a name="l00411"></a>00411 <span class="comment">/* Find an unused local port. */</span><a name="l00412"></a>00412 again:<a name="l00413"></a>00413 ++lastport;<a name="l00414"></a>00414 <a name="l00415"></a>00415 <span class="keywordflow">if</span>(lastport >= 32000) {<a name="l00416"></a>00416 lastport = 4096;<a name="l00417"></a>00417 }<a name="l00418"></a>00418 <a name="l00419"></a>00419 <span class="comment">/* Check if this port is already in use, and if so try to find</span><a name="l00420"></a>00420 <span class="comment"> another one. */</span><a name="l00421"></a>00421 <span class="keywordflow">for</span>(c = 0; c < <a class="code" href="a00153.html#gf5fe83be78b78b9e7d9e7f1e34ab1cc5">UIP_CONNS</a>; ++c) {<a name="l00422"></a>00422 conn = &<a class="code" href="a00150.html#gf703683056d2bfa5c81fa157dcb20fe2">uip_conns</a>[c];<a name="l00423"></a>00423 <span class="keywordflow">if</span>(conn-><a class="code" href="a00088.html#a5f58074435cdc180f17de69651beebd">tcpstateflags</a> != <a class="code" href="a00150.html#g28eda870cff3d8e3cf2949e6f57a502b">UIP_CLOSED</a> &&<a name="l00424"></a>00424 conn-><a class="code" href="a00088.html#0cd09beee671e7e9efb0b4aced10249e">lport</a> == <a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(lastport)) {<a name="l00425"></a>00425 <span class="keywordflow">goto</span> again;<a name="l00426"></a>00426 }<a name="l00427"></a>00427 }<a name="l00428"></a>00428 <a name="l00429"></a>00429 conn = 0;<a name="l00430"></a>00430 <span class="keywordflow">for</span>(c = 0; c < <a class="code" href="a00153.html#gf5fe83be78b78b9e7d9e7f1e34ab1cc5">UIP_CONNS</a>; ++c) {<a name="l00431"></a>00431 cconn = &<a class="code" href="a00150.html#gf703683056d2bfa5c81fa157dcb20fe2">uip_conns</a>[c];<a name="l00432"></a>00432 <span class="keywordflow">if</span>(cconn->tcpstateflags == <a class="code" href="a00150.html#g28eda870cff3d8e3cf2949e6f57a502b">UIP_CLOSED</a>) {<a name="l00433"></a>00433 conn = cconn;<a name="l00434"></a>00434 <span class="keywordflow">break</span>;<a name="l00435"></a>00435 }<a name="l00436"></a>00436 <span class="keywordflow">if</span>(cconn->tcpstateflags == <a class="code" href="a00150.html#gfff0ed43201bf1e2020de1a0d6cac070">UIP_TIME_WAIT</a>) {<a name="l00437"></a>00437 <span class="keywordflow">if</span>(conn == 0 ||<a name="l00438"></a>00438 cconn->timer > conn->timer) {<a name="l00439"></a>00439 conn = cconn;<a name="l00440"></a>00440 }<a name="l00441"></a>00441 }<a name="l00442"></a>00442 }<a name="l00443"></a>00443 <a name="l00444"></a>00444 <span class="keywordflow">if</span>(conn == 0) {<a name="l00445"></a>00445 <span class="keywordflow">return</span> 0;<a name="l00446"></a>00446 }<a name="l00447"></a>00447 <a name="l00448"></a>00448 conn-><a class="code" href="a00088.html#a5f58074435cdc180f17de69651beebd">tcpstateflags</a> = <a class="code" href="a00150.html#g8af482dec973db57d8b3bd3f69461488">UIP_SYN_SENT</a>;<a name="l00449"></a>00449 <a name="l00450"></a>00450 conn->snd_nxt[0] = iss[0];<a name="l00451"></a>00451 conn->snd_nxt[1] = iss[1];<a name="l00452"></a>00452 conn->snd_nxt[2] = iss[2];<a name="l00453"></a>00453 conn->snd_nxt[3] = iss[3];<a name="l00454"></a>00454 <a name="l00455"></a>00455 conn->initialmss = conn->mss = <a class="code" href="a00153.html#g4910467b83a639f06739c82cd362037e">UIP_TCP_MSS</a>;<a name="l00456"></a>00456 <a name="l00457"></a>00457 conn->len = 1; <span class="comment">/* TCP length of the SYN is one. */</span><a name="l00458"></a>00458 conn->nrtx = 0;<a name="l00459"></a>00459 conn->timer = 1; <span class="comment">/* Send the SYN next time around. */</span><a name="l00460"></a>00460 conn->rto = <a class="code" href="a00153.html#g15de27b044603284f68db05a378235a7">UIP_RTO</a>;<a name="l00461"></a>00461 conn->sa = 0;<a name="l00462"></a>00462 conn->sv = 16; <span class="comment">/* Initial value of the RTT variance. */</span><a name="l00463"></a>00463 conn->lport = <a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(lastport);<a name="l00464"></a>00464 conn->rport = <a class="code" href="a00088.html#1df6aa054ef2fa634ac4c6f418228285">rport</a>;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -