📄 a00201.html
字号:
<a name="l00465"></a>00465 <a class="code" href="a00148.html#g769512993b7b27271909d6daa4748b60">uip_ipaddr_copy</a>(&conn->ripaddr, <a class="code" href="a00088.html#79510aa86d3fa0a0fc6cfc49b1da7279">ripaddr</a>);<a name="l00466"></a>00466 <a name="l00467"></a>00467 <span class="keywordflow">return</span> conn;<a name="l00468"></a>00468 }<a name="l00469"></a>00469 <span class="preprocessor">#endif </span><span class="comment">/* UIP_ACTIVE_OPEN */</span><a name="l00470"></a>00470 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00471"></a>00471 <span class="preprocessor">#if UIP_UDP</span><a name="l00472"></a>00472 <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00150.html#g210f227119fc972e6222c9cb452e15a9">uip_udp_conn</a> *<a name="l00473"></a><a class="code" href="a00150.html#g79c4110211247df3fb30b8cf1c4c02af">00473</a> <a class="code" href="a00147.html#g79c4110211247df3fb30b8cf1c4c02af">uip_udp_new</a>(<a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a> *<a class="code" href="a00095.html#8a661a2d544100b82d0d14a1985083d5">ripaddr</a>, <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> <a class="code" href="a00095.html#280a0c2a93544e597f92bbacf36ee1dc">rport</a>)<a name="l00474"></a>00474 {<a name="l00475"></a>00475 <span class="keyword">register</span> <span class="keyword">struct </span><a class="code" href="a00150.html#g210f227119fc972e6222c9cb452e15a9">uip_udp_conn</a> *conn;<a name="l00476"></a>00476 <a name="l00477"></a>00477 <span class="comment">/* Find an unused local port. */</span><a name="l00478"></a>00478 again:<a name="l00479"></a>00479 ++lastport;<a name="l00480"></a>00480 <a name="l00481"></a>00481 <span class="keywordflow">if</span>(lastport >= 32000) {<a name="l00482"></a>00482 lastport = 4096;<a name="l00483"></a>00483 }<a name="l00484"></a>00484 <a name="l00485"></a>00485 <span class="keywordflow">for</span>(c = 0; c < <a class="code" href="a00153.html#g196379ceb1219a99f4495e41ccc9bbfb">UIP_UDP_CONNS</a>; ++c) {<a name="l00486"></a>00486 <span class="keywordflow">if</span>(<a class="code" href="a00150.html#geb533744817cf6695d75293369c2248b">uip_udp_conns</a>[c].<a class="code" href="a00095.html#981392e295db4d024eea95805c51c371">lport</a> == <a class="code" href="a00148.html#ga22b04cac8cf283ca12f028578bebc06">htons</a>(lastport)) {<a name="l00487"></a>00487 <span class="keywordflow">goto</span> again;<a name="l00488"></a>00488 }<a name="l00489"></a>00489 }<a name="l00490"></a>00490 <a name="l00491"></a>00491 <a name="l00492"></a>00492 conn = 0;<a name="l00493"></a>00493 <span class="keywordflow">for</span>(c = 0; c < <a class="code" href="a00153.html#g196379ceb1219a99f4495e41ccc9bbfb">UIP_UDP_CONNS</a>; ++c) {<a name="l00494"></a>00494 <span class="keywordflow">if</span>(<a class="code" href="a00150.html#geb533744817cf6695d75293369c2248b">uip_udp_conns</a>[c].<a class="code" href="a00095.html#981392e295db4d024eea95805c51c371">lport</a> == 0) {<a name="l00495"></a>00495 conn = &<a class="code" href="a00150.html#geb533744817cf6695d75293369c2248b">uip_udp_conns</a>[c];<a name="l00496"></a>00496 <span class="keywordflow">break</span>;<a name="l00497"></a>00497 }<a name="l00498"></a>00498 }<a name="l00499"></a>00499 <a name="l00500"></a>00500 <span class="keywordflow">if</span>(conn == 0) {<a name="l00501"></a>00501 <span class="keywordflow">return</span> 0;<a name="l00502"></a>00502 }<a name="l00503"></a>00503 <a name="l00504"></a>00504 conn-><a class="code" href="a00095.html#981392e295db4d024eea95805c51c371">lport</a> = <a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(lastport);<a name="l00505"></a>00505 conn->rport = <a class="code" href="a00095.html#280a0c2a93544e597f92bbacf36ee1dc">rport</a>;<a name="l00506"></a>00506 <span class="keywordflow">if</span>(<a class="code" href="a00095.html#8a661a2d544100b82d0d14a1985083d5">ripaddr</a> == <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {<a name="l00507"></a>00507 memset(conn->ripaddr, 0, <span class="keyword">sizeof</span>(<a class="code" href="a00150.html#g1ef35301f43a5bbb9f89f07b5a36b9a0">uip_ipaddr_t</a>));<a name="l00508"></a>00508 } <span class="keywordflow">else</span> {<a name="l00509"></a>00509 <a class="code" href="a00148.html#g769512993b7b27271909d6daa4748b60">uip_ipaddr_copy</a>(&conn->ripaddr, <a class="code" href="a00095.html#8a661a2d544100b82d0d14a1985083d5">ripaddr</a>);<a name="l00510"></a>00510 }<a name="l00511"></a>00511 conn->ttl = <a class="code" href="a00153.html#gb61381673de27f31848c5396bf0b338e">UIP_TTL</a>;<a name="l00512"></a>00512 <a name="l00513"></a>00513 <span class="keywordflow">return</span> conn;<a name="l00514"></a>00514 }<a name="l00515"></a>00515 <span class="preprocessor">#endif </span><span class="comment">/* UIP_UDP */</span><a name="l00516"></a>00516 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00517"></a>00517 <span class="keywordtype">void</span><a name="l00518"></a><a class="code" href="a00150.html#gaa585784b0914cac1d37f07f85457008">00518</a> <a class="code" href="a00147.html#gaa585784b0914cac1d37f07f85457008">uip_unlisten</a>(<a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> port)<a name="l00519"></a>00519 {<a name="l00520"></a>00520 <span class="keywordflow">for</span>(c = 0; c < <a class="code" href="a00153.html#g8f4ebd8ef6c0ea665ed351d87fec09fd">UIP_LISTENPORTS</a>; ++c) {<a name="l00521"></a>00521 <span class="keywordflow">if</span>(uip_listenports[c] == port) {<a name="l00522"></a>00522 uip_listenports[c] = 0;<a name="l00523"></a>00523 <span class="keywordflow">return</span>;<a name="l00524"></a>00524 }<a name="l00525"></a>00525 }<a name="l00526"></a>00526 }<a name="l00527"></a>00527 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00528"></a>00528 <span class="keywordtype">void</span><a name="l00529"></a><a class="code" href="a00150.html#gdd1ab3704ecd4900eec61a6897d32dc8">00529</a> <a class="code" href="a00147.html#gdd1ab3704ecd4900eec61a6897d32dc8">uip_listen</a>(<a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> port)<a name="l00530"></a>00530 {<a name="l00531"></a>00531 <span class="keywordflow">for</span>(c = 0; c < <a class="code" href="a00153.html#g8f4ebd8ef6c0ea665ed351d87fec09fd">UIP_LISTENPORTS</a>; ++c) {<a name="l00532"></a>00532 <span class="keywordflow">if</span>(uip_listenports[c] == 0) {<a name="l00533"></a>00533 uip_listenports[c] = port;<a name="l00534"></a>00534 <span class="keywordflow">return</span>;<a name="l00535"></a>00535 }<a name="l00536"></a>00536 }<a name="l00537"></a>00537 }<a name="l00538"></a>00538 <span class="comment">/*---------------------------------------------------------------------------*/</span><a name="l00539"></a>00539 <span class="comment">/* XXX: IP fragment reassembly: not well-tested. */</span><a name="l00540"></a>00540 <a name="l00541"></a>00541 <span class="preprocessor">#if UIP_REASSEMBLY && !UIP_CONF_IPV6</span><a name="l00542"></a>00542 <span class="preprocessor"></span><span class="preprocessor">#define UIP_REASS_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN)</span><a name="l00543"></a>00543 <span class="preprocessor"></span><span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> uip_reassbuf[UIP_REASS_BUFSIZE];<a name="l00544"></a>00544 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> uip_reassbitmap[UIP_REASS_BUFSIZE / (8 * 8)];<a name="l00545"></a>00545 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> bitmap_bits[8] = {0xff, 0x7f, 0x3f, 0x1f,<a name="l00546"></a>00546 0x0f, 0x07, 0x03, 0x01};<a name="l00547"></a>00547 <span class="keyword">static</span> <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> uip_reasslen;<a name="l00548"></a>00548 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> uip_reassflags;<a name="l00549"></a>00549 <span class="preprocessor">#define UIP_REASS_FLAG_LASTFRAG 0x01</span><a name="l00550"></a>00550 <span class="preprocessor"></span><span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> uip_reasstmr;<a name="l00551"></a>00551 <a name="l00552"></a>00552 <span class="preprocessor">#define IP_MF 0x20</span><a name="l00553"></a>00553 <span class="preprocessor"></span><a name="l00554"></a>00554 <span class="keyword">static</span> <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a><a name="l00555"></a>00555 uip_reass(<span class="keywordtype">void</span>)<a name="l00556"></a>00556 {<a name="l00557"></a>00557 <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> offset, len;<a name="l00558"></a>00558 <a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> i;<a name="l00559"></a>00559 <a name="l00560"></a>00560 <span class="comment">/* If ip_reasstmr is zero, no packet is present in the buffer, so we</span><a name="l00561"></a>00561 <span class="comment"> write the IP header of the fragment into the reassembly</span><a name="l00562"></a>00562 <span class="comment"> buffer. The timer is updated with the maximum age. */</span><a name="l00563"></a>00563 <span class="keywordflow">if</span>(uip_reasstmr == 0) {<a name="l00564"></a>00564 memcpy(uip_reassbuf, &<a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->vhl, <a class="code" href="a00150.html#g6bc12c6c7b56f73ce5d57abfdcdc6eb5">UIP_IPH_LEN</a>);<a name="l00565"></a>00565 uip_reasstmr = <a class="code" href="a00153.html#gc3882366feda1cb759ccbfe98327a7db">UIP_REASS_MAXAGE</a>;<a name="l00566"></a>00566 uip_reassflags = 0;<a name="l00567"></a>00567 <span class="comment">/* Clear the bitmap. */</span><a name="l00568"></a>00568 memset(uip_reassbitmap, 0, <span class="keyword">sizeof</span>(uip_reassbitmap));<a name="l00569"></a>00569 }<a name="l00570"></a>00570 <a name="l00571"></a>00571 <span class="comment">/* Check if the incoming fragment matches the one currently present</span><a name="l00572"></a>00572 <span class="comment"> in the reasembly buffer. If so, we proceed with copying the</span><a name="l00573"></a>00573 <span class="comment"> fragment into the buffer. */</span><a name="l00574"></a>00574 <span class="keywordflow">if</span>(<a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->srcipaddr[0] == <a class="code" href="a00150.html#g96544dedc1cdc71ad2ad54bf1d5e5433">FBUF</a>->srcipaddr[0] &&<a name="l00575"></a>00575 <a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->srcipaddr[1] == <a class="code" href="a00150.html#g96544dedc1cdc71ad2ad54bf1d5e5433">FBUF</a>->srcipaddr[1] &&<a name="l00576"></a>00576 <a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->destipaddr[0] == <a class="code" href="a00150.html#g96544dedc1cdc71ad2ad54bf1d5e5433">FBUF</a>->destipaddr[0] &&<a name="l00577"></a>00577 <a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->destipaddr[1] == <a class="code" href="a00150.html#g96544dedc1cdc71ad2ad54bf1d5e5433">FBUF</a>->destipaddr[1] &&<a name="l00578"></a>00578 <a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->ipid[0] == <a class="code" href="a00150.html#g96544dedc1cdc71ad2ad54bf1d5e5433">FBUF</a>->ipid[0] &&<a name="l00579"></a>00579 <a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->ipid[1] == <a class="code" href="a00150.html#g96544dedc1cdc71ad2ad54bf1d5e5433">FBUF</a>->ipid[1]) {<a name="l00580"></a>00580 <a name="l00581"></a>00581 len = (<a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->len[0] << 8) + <a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->len[1] - (<a class="code" href="a00150.html#g24f52ac52d6e714cb04a5aa01be3bdd0">BUF</a>->vhl & 0x0f) * 4;<a name="l00582"></a>00582
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -