📄 arp_8c-source.html
字号:
00502 <span class="comment">/* Move to next entry */</span>00503 00504 aenext = (aenext + 1);00505 <span class="keywordflow">if</span>( aenext >= ARP_TSIZE )00506 aenext = 1;00507 00508 }00509 00510 00511 <span class="comment">/* Was there free or temporary entries? */</span>00512 00513 <span class="keywordflow">if</span>( found == (-1) )00514 <span class="keywordflow">return</span>(-1);00515 00516 <span class="comment">/* Next time start from next entry */</span>00517 00518 aenext = (aenext + 1); 00519 <span class="keywordflow">if</span>( aenext >= ARP_TSIZE )00520 aenext = 1; 00521 00522 qstruct = &arp_table[found];00523 00524 <span class="comment">/* Set ARP initial parameters */</span>00525 00526 qstruct-><a class="code" href="structarp__entry.html#m0">state</a> = <a class="code" href="arp_8h.html#a12">ARP_RESERVED</a>;00527 qstruct-><a class="code" href="structarp__entry.html#m1">type</a> = type;00528 00529 <span class="comment">/* Was return(i)!!! <-wrong!! */</span>00530 00531 <span class="keywordflow">return</span>((UINT8)found);00532 00533 00534 }<a name="l00552"></a><a class="code" href="arp_8c.html#a7">00552</a> INT8 <a class="code" href="arp_8c.html#a7">arp_add</a> (UINT32 pra, UINT8* hwadr, UINT8 type)00553 {00554 <span class="keyword">struct </span><a class="code" href="structarp__entry.html">arp_entry</a> *qstruct;00555 INT8 i;00556 INT8 j;00557 00558 <span class="keywordflow">for</span>( i=0; i<ARP_TSIZE; i++ ) {00559 qstruct = &arp_table[i];00560 00561 <span class="keywordflow">if</span>( qstruct-><a class="code" href="structarp__entry.html#m0">state</a> == <a class="code" href="arp_8h.html#a11">ARP_FREE</a> )00562 <span class="keywordflow">continue</span>;00563 00564 <span class="keywordflow">if</span>((qstruct-><a class="code" href="structarp__entry.html#m5">pradr</a> == pra)&&(pra != IP_BROADCAST_ADDRESS)) {00565 <span class="comment">/* The address is in cache, refresh it */</span>00566 00567 ARP_DEBUGOUT(<span class="stringliteral">" Refreshing Existing ARP Entry..\n\r"</span>);00568 00569 <span class="keywordflow">for</span>( j=0; j<<a class="code" href="arp_8h.html#a0">MAXHWALEN</a>; j++ ) 00570 qstruct-><a class="code" href="structarp__entry.html#m4">hwadr</a>[j] = *hwadr++;00571 00572 qstruct-><a class="code" href="structarp__entry.html#m3">ttl</a> = <a class="code" href="group__opentcp__config.html#a1">ARP_TIMEOUT</a>;00573 qstruct-><a class="code" href="structarp__entry.html#m2">retries</a> = <a class="code" href="group__opentcp__config.html#a3">ARP_MAXRETRY</a>;00574 qstruct-><a class="code" href="structarp__entry.html#m0">state</a> = <a class="code" href="arp_8h.html#a14">ARP_RESOLVED</a>;00575 00576 <span class="comment">/* All OK */</span>00577 00578 <span class="keywordflow">return</span> (0); 00579 }00580 00581 }00582 00583 <span class="keywordflow">if</span>(<a class="code" href="arp_8c.html#a11">is_subnet</a>(pra,&localmachine) == <a class="code" href="system_8h.html#a2">FALSE</a>){00584 <span class="keywordflow">return</span> (-1);00585 }00586 00587 <span class="keywordflow">if</span>( localmachine.defgw == pra ) {00588 <span class="keywordflow">if</span>(localmachine.defgw != 0) {00589 type = <a class="code" href="arp_8h.html#a16">ARP_FIXED_IP</a>;00590 }00591 }00592 00593 00594 <span class="comment">/* Address was'nt on cache. Need to allocate new one */</span>00595 00596 ARP_DEBUGOUT(<span class="stringliteral">"Allocating New ARP Entry..\n\r"</span>);00597 00598 i = <a class="code" href="arp_8c.html#a6">arp_alloc</a>(type);00599 00600 <span class="keywordflow">if</span>( i < 0 ) <span class="comment">/* No Entries Left? */</span>00601 <span class="keywordflow">return</span>(-1);00602 00603 <span class="comment">/* Fill the fields */</span>00604 00605 qstruct = &arp_table[i];00606 00607 qstruct-><a class="code" href="structarp__entry.html#m5">pradr</a> = pra; <span class="comment">/* Fill IP */</span>00608 00609 <span class="keywordflow">for</span>(i=0; i<<a class="code" href="arp_8h.html#a0">MAXHWALEN</a>; i++)00610 qstruct-><a class="code" href="structarp__entry.html#m4">hwadr</a>[i] = *hwadr++; <span class="comment">/* Fill HW address */</span>00611 00612 qstruct-><a class="code" href="structarp__entry.html#m2">retries</a> = <a class="code" href="group__opentcp__config.html#a3">ARP_MAXRETRY</a>;00613 qstruct-><a class="code" href="structarp__entry.html#m3">ttl</a> = <a class="code" href="group__opentcp__config.html#a1">ARP_TIMEOUT</a>;00614 qstruct-><a class="code" href="structarp__entry.html#m0">state</a> = <a class="code" href="arp_8h.html#a14">ARP_RESOLVED</a>; 00615 00616 ARP_DEBUGOUT(<span class="stringliteral">"ARP Entry Created!..\n\r"</span>);00617 00618 <span class="keywordflow">return</span>(1);00619 00620 }00621 <a name="l00639"></a><a class="code" href="arp_8c.html#a8">00639</a> <span class="keyword">struct </span><a class="code" href="structarp__entry.html">arp_entry</a>* arp_find (LWORD pra, struct netif *machine, UINT8 type)00640 {00641 <span class="keyword">struct </span><a class="code" href="structarp__entry.html">arp_entry</a> *qstruct;00642 INT8 i;00643 00644 ARP_DEBUGOUT(<span class="stringliteral">"Trying to find MAC address from ARP Cache\n\r"</span>);00645 00646 <span class="comment">/* Is the address in the cache */</span>00647 00648 <span class="keywordflow">for</span>( i=0; i<ARP_TSIZE; i++ ) {00649 qstruct = &arp_table[i];00650 00651 <span class="keywordflow">if</span>( qstruct-><a class="code" href="structarp__entry.html#m0">state</a> == <a class="code" href="arp_8h.html#a11">ARP_FREE</a> )00652 <span class="keywordflow">continue</span>;00653 <span class="keywordflow">if</span>( qstruct-><a class="code" href="structarp__entry.html#m5">pradr</a> == pra) {00654 <span class="comment">/* The address is in cache, is it valid? */</span>00655 00656 ARP_DEBUGOUT(<span class="stringliteral">"Address In Cache\n\r"</span>);00657 00658 <span class="keywordflow">if</span>( qstruct-><a class="code" href="structarp__entry.html#m0">state</a> < <a class="code" href="arp_8h.html#a14">ARP_RESOLVED</a> ) {00659 ARP_DEBUGOUT(<span class="stringliteral">"Address in cache but unresolved :(\n\r"</span>);00660 <span class="keywordflow">return</span>(0);00661 }00662 <span class="comment">/* All OK */</span>00663 00664 <span class="keywordflow">return</span>(qstruct); 00665 }00666 00667 }00668 00669 <span class="comment">/* The address wasn't on the cache. Is it in our Subnet? */</span>00670 00671 <span class="keywordflow">if</span>( <a class="code" href="arp_8c.html#a11">is_subnet</a>(pra, machine) ) {00672 <span class="comment">/* Yep, we need to send ARP REQUEST */</span>00673 00674 ARP_DEBUGOUT(<span class="stringliteral">"Need to send ARP Request to local network..\n\r"</span>);00675 00676 <span class="keywordflow">if</span>( machine->defgw == pra ) {00677 <span class="keywordflow">if</span>(machine->defgw != 0) {00678 type = <a class="code" href="arp_8h.html#a16">ARP_FIXED_IP</a>;00679 }00680 }00681 i = <a class="code" href="arp_8c.html#a6">arp_alloc</a>(type);00682 00683 <span class="keywordflow">if</span>( i < 0 ) <span class="comment">/* No Entries Left? */</span>00684 <span class="keywordflow">return</span>(0);00685 00686 <span class="comment">/* Send Request after filling the fields */</span>00687 00688 qstruct = &arp_table[i];00689 00690 qstruct-><a class="code" href="structarp__entry.html#m5">pradr</a> = pra; <span class="comment">/* Fill IP */</span>00691 qstruct-><a class="code" href="structarp__entry.html#m4">hwadr</a>[0] = 0xFF; <span class="comment">/* Fill Broadcast IP */</span>00692 qstruct-><a class="code" href="structarp__entry.html#m4">hwadr</a>[1] = 0xFF;00693 qstruct-><a class="code" href="structarp__entry.html#m4">hwadr</a>[2] = 0xFF;00694 qstruct-><a class="code" href="structarp__entry.html#m4">hwadr</a>[3] = 0xFF;00695 qstruct-><a class="code" href="structarp__entry.html#m4">hwadr</a>[4] = 0xFF;00696 qstruct-><a class="code" href="structarp__entry.html#m4">hwadr</a>[5] = 0xFF;00697 qstruct-><a class="code" href="structarp__entry.html#m2">retries</a> = <a class="code" href="group__opentcp__config.html#a3">ARP_MAXRETRY</a>;00698 qstruct-><a class="code" href="structarp__entry.html#m3">ttl</a> = <a class="code" href="group__opentcp__config.html#a2">ARP_RESEND</a>;00699 <a class="code" href="arp_8c.html#a5">arp_send_req</a>( i );00700 qstruct-><a class="code" href="structarp__entry.html#m0">state</a> = <a class="code" href="arp_8h.html#a13">ARP_PENDING</a>; <span class="comment">/* Waiting for Reply */</span>00701 00702 <span class="keywordflow">return</span>(0);00703 00704 } 00705 00706 <span class="comment">/* The Address belongst to the outern world, need to use MAC of */</span>00707 <span class="comment">/* Default Gateway */</span>00708 00709 ARP_DEBUGOUT(<span class="stringliteral">"Need to use MAC of Default GW\n\r"</span>);00710 00711 <span class="comment">/* Check for Broadcast */</span>00712 00713 <span class="keywordflow">if</span>(machine->defgw == 0) <span class="comment">/* It's not specified */</span>00714 <span class="keywordflow">return</span>(0);00715 00716 00717 <span class="keywordflow">for</span>( i=0; i<ARP_TSIZE; i++ ) {00718 qstruct = &arp_table[i];00719 00720 <span class="keywordflow">if</span>( qstruct-><a class="code" href="structarp__entry.html#m0">state</a> == <a class="code" href="arp_8h.html#a11">ARP_FREE</a> )00721 <span class="keywordflow">continue</span>;00722 00723 <span class="keywordflow">if</span>( qstruct-><a class="code" href="structarp__entry.html#m5">pradr</a> == machine->defgw ) {00724 <span class="comment">/* The address is in cache, is it valid? */</span>00725 00726 00727 <span class="keywordflow">if</span>( qstruct-><a class="code" href="structarp__entry.html#m0">state</a> < <a class="code" href="arp_8h.html#a14">ARP_RESOLVED</a> ) {00728 ARP_DEBUGOUT(<span class="stringliteral">"The Address of Def. GW is not Solved!\n\r"</span>);00729 <span class="keywordflow">return</span>(0);00730 }00731 00732 <span class="comment">/* All OK */</span>00733 00734 ARP_DEBUGOUT(<span class="stringliteral">" >> Default Gateway MAC found!\n\r"</span>);00735 00736 <span class="keywordflow">return</span>(qstruct);00737
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -