亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? uip_arp.c

?? c51版本的uip(一個超小型的TCPIP棧,支持tcpudparpicmp.
?? C
字號:
/*
 * Copyright (c) 2001-2002, Adam Dunkels.
 * All rights reserved. 
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions 
 * are met: 
 * 1. Redistributions of source code must retain the above copyright 
 *    notice, this list of conditions and the following disclaimer. 
 * 2. Redistributions in binary form must reproduce the above copyright 
 *    notice, this list of conditions and the following disclaimer in the 
 *    documentation and/or other materials provided with the distribution. 
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed by Adam Dunkels.
 * 4. The name of the author may not be used to endorse or promote
 *    products derived from this software without specific prior
 *    written permission.  
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
 *
 * This file is part of the uIP TCP/IP stack.
 *
 * $Id: uip_arp.c,v 1.3 2002/01/13 21:12:41 adam Exp $
 *
 */


#include "uip_arp.h"

struct arp_hdr {
  struct uip_eth_hdr ethhdr;
  u16_t hwtype;
  u16_t protocol;
  u8_t hwlen;
  u8_t protolen;
  u16_t opcode;
  struct uip_eth_addr shwaddr;
  u16_t sipaddr[2];
  struct uip_eth_addr dhwaddr;
  u16_t dipaddr[2]; 
};

struct ethip_hdr {
    struct uip_eth_hdr ethhdr;
    /* IP header. */
    u8_t vhl,
    tos,          
    len[2],       
    ipid[2],        
    ipoffset[2],  
    ttl,          
    proto;     
    u16_t ipchksum;
    u16_t srcipaddr[2], 
    destipaddr[2];
};

#define ARP_REQUEST 1
#define ARP_REPLY   2

#define ARP_HWTYPE_ETH 1

struct arp_entry {
  u16_t ipaddr[2];
  struct uip_eth_addr ethaddr;
  u8_t time;
};

struct uip_eth_addr ethaddr = {{UIP_ETHADDR0,
					     UIP_ETHADDR1,
					     UIP_ETHADDR2,
					     UIP_ETHADDR3,
					     UIP_ETHADDR4,
					     UIP_ETHADDR5}};

static struct arp_entry arp_table[UIP_ARPTAB_SIZE];
static u16_t ipaddr[2];
static u8_t i, c;

static u8_t time;
static u8_t tmpage;

#define BUF   ((struct arp_hdr *)&uip_buf[0])
#define IPBUF ((struct ethip_hdr *)&uip_buf[0])
/*-----------------------------------------------------------------------------------*/
/*
void
uip_arp_init(void)
{
  for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
    arp_table[i].ipaddr[0] =
      arp_table[i].ipaddr[1] = 0;
  }
}
*/

/*-----------------------------------------------------------------------------------*/
void
uip_arp_timer(void)
{
   ++time;
   for(i = 0; i < UIP_ARPTAB_SIZE; ++i) 
   {
       if((arp_table[i].ipaddr[0] | arp_table[i].ipaddr[1]) != 0 &&
            time - arp_table[i].time >= UIP_ARP_MAXAGE) 
	   {
          arp_table[i].ipaddr[0] =
	      arp_table[i].ipaddr[1] = 0;
       }
   }
}
/*-----------------------------------------------------------------------------------*/
static void
uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr)
{
  /* Walk through the ARP mapping table and try to find an entry to
     update. If none is found, the IP -> MAC address mapping is
     inserted in the ARP table. */
  for(i = 0; i < UIP_ARPTAB_SIZE; ++i) 
  {
    
    /* Only check those entries that are actually in use. */
    if(arp_table[i].ipaddr[0] != 0 &&
       arp_table[i].ipaddr[1] != 0) 
	{
			/* Check if the source IP address of the incoming packet matches
			the IP address in this ARP table entry. */
			if(ipaddr[0] == arp_table[i].ipaddr[0] &&
			    ipaddr[1] == arp_table[i].ipaddr[1]) 
			{
			
				/* An old entry found, update this and return. */
				for(c = 0; c < 6; ++c) 
				{
					arp_table[i].ethaddr.addr[c] = ethaddr->addr[c];
				}
				arp_table[i].time = time;
				return;
      		}
    	}
     }

  /* If we get here, no existing ARP table entry was found, so we
     create one. */

  /* First, we try to find an unused entry in the ARP table. */
  for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
    if(arp_table[i].ipaddr[0] == 0 &&
       arp_table[i].ipaddr[1] == 0)
      break;    
  }

  /* If no unused entry is found, we try to find the oldest entry and
     throw it away. */
  if(i == UIP_ARPTAB_SIZE) {
    tmpage = 0;
    c = 0;
    for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
      if(time - arp_table[i].time > tmpage) {
	tmpage = time - arp_table[i].time;
	c = i;
      }
    }
    i = c;
  }

  /* Now, i is the ARP table entry which we will fill with the new
     information. */
  arp_table[i].ipaddr[0] = ipaddr[0];
  arp_table[i].ipaddr[1] = ipaddr[1];
  for(c = 0; c < 6; ++c) {
    arp_table[i].ethaddr.addr[c] = ethaddr->addr[c];
  }
  arp_table[i].time = time;
}
/*-----------------------------------------------------------------------------------*/
void
uip_arp_ipin(void)
{

  /* Only insert/update an entry if the source IP address of the
     incoming IP packet comes from a host on the local network. */
  if((IPBUF->srcipaddr[0] & htons((UIP_NETMASK0 << 8) | UIP_NETMASK1)) !=
     (htons((UIP_IPADDR0 << 8) | UIP_IPADDR1)
      & htons((UIP_NETMASK0 << 8) | UIP_NETMASK1)))
    return;
  if((IPBUF->srcipaddr[1] & htons((UIP_NETMASK2 << 8) | UIP_NETMASK3)) !=
     (htons((UIP_IPADDR2 << 8) | UIP_IPADDR3)
      & htons((UIP_NETMASK2 << 8) | UIP_NETMASK3)))
    return;

  uip_arp_update(IPBUF->srcipaddr, &(IPBUF->ethhdr.src));
  
  return;
}
/*-----------------------------------------------------------------------------------*/

extern void puthex(unsigned char Byte);//以十六進制格式顯示1個字節數據
extern void putstring(unsigned char *str);//顯示字符串
extern void putword(unsigned int Word);//以十六進制格式顯示1個字數據

void
uip_arp_arpin(void)
{

  if(uip_len < sizeof(struct arp_hdr)) 
  {
    uip_len = 0;
    return;
  }

  uip_len = 0;

  //putstring("\r\nuip_arp_arpin");
  //puthex(BUF->opcode);

  switch(BUF->opcode) 
  {
  case htons(ARP_REQUEST):

    /* ARP request. If it asked for our address, we send out a
       reply. */
    if(BUF->dipaddr[0] == htons((UIP_IPADDR0 << 8) | UIP_IPADDR1) &&
       BUF->dipaddr[1] == htons((UIP_IPADDR2 << 8) | UIP_IPADDR3)) 
	{
      /* The reply opcode is 2. */
      BUF->opcode = htons(2);
      BUF->dhwaddr = BUF->shwaddr;
	  //putstring("\r\ARP_REQUEST");
      for(c = 0; c < 6; ++c) 
	  {
	     BUF->shwaddr.addr[c] = 
	     BUF->ethhdr.src.addr[c] = ethaddr.addr[c];
	     BUF->ethhdr.dest.addr[c] = BUF->dhwaddr.addr[c];
      }

      BUF->dipaddr[0] = BUF->sipaddr[0];
      BUF->dipaddr[1] = BUF->sipaddr[1];
      BUF->sipaddr[0] = htons((UIP_IPADDR0 << 8) | UIP_IPADDR1);
      BUF->sipaddr[1] = htons((UIP_IPADDR2 << 8) | UIP_IPADDR3);

      BUF->ethhdr.type = htons(UIP_ETHTYPE_ARP); 

      uip_len = sizeof(struct arp_hdr);
    }      
    break;
  case htons(ARP_REPLY):
    /* ARP reply. We insert or update the ARP table if it was meant
       for us. */
    if(BUF->dipaddr[0] == htons((UIP_IPADDR0 << 8) | UIP_IPADDR1) &&
       BUF->dipaddr[1] == htons((UIP_IPADDR2 << 8) | UIP_IPADDR3)) 
	{
        uip_arp_update(BUF->sipaddr, &BUF->shwaddr);
    }
    break;
  }
}
/*-----------------------------------------------------------------------------------*/
void
uip_arp_out(void)
{
  /* Find the destination IP address in the ARP table and construct
     the Ethernet header. If the destination IP addres isn't on the
     local network, we use the default router's IP address instead.

     If not ARP table entry is found, we overwrite the original IP
     packet with an ARP request for the IP address. */

  /* Check if the destination address is on the local network. */
  if((IPBUF->destipaddr[0] & htons((UIP_NETMASK0 << 8) | UIP_NETMASK1)) !=
     (htons((UIP_IPADDR0 << 8) | UIP_IPADDR1)
      & htons((UIP_NETMASK0 << 8) | UIP_NETMASK1)) ||
     (IPBUF->destipaddr[1] & htons((UIP_NETMASK2 << 8) | UIP_NETMASK3)) !=
     (htons((UIP_IPADDR2 << 8) | UIP_IPADDR3)
      & htons((UIP_NETMASK2 << 8) | UIP_NETMASK3))) {
     /* Destination address was not on the local network, so we need to
       use the default router's IP address instead of the destination
       address when determining the MAC address. */
     ipaddr[0] = htons((UIP_DRIPADDR0 << 8) | UIP_DRIPADDR1);
     ipaddr[1] = htons((UIP_DRIPADDR2 << 8) | UIP_DRIPADDR3);
  } else {
     /* Else, we use the destination IP address. */
     ipaddr[0] = IPBUF->destipaddr[0];
     ipaddr[1] = IPBUF->destipaddr[1];
  }
      
  for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
    if(ipaddr[0] == arp_table[i].ipaddr[0] &&
       ipaddr[1] == arp_table[i].ipaddr[1])
      break;
  }

  if(i == UIP_ARPTAB_SIZE) {
    /* The destination address was not in our ARP table, so we
       overwrite the IP packet with an ARP request. */

    for(c = 0; c < 6; ++c) 
	{     
      BUF->ethhdr.dest.addr[c] = 0xff; /* Broadcast ARP request. */
      BUF->ethhdr.src.addr[c] = 
	  BUF->shwaddr.addr[c] = ethaddr.addr[c];
      BUF->dhwaddr.addr[c] = 0;
    }
    
    BUF->dipaddr[0] = ipaddr[0];
    BUF->dipaddr[1] = ipaddr[1];
    BUF->sipaddr[0] = htons((UIP_IPADDR0 << 8) | UIP_IPADDR1);
    BUF->sipaddr[1] = htons((UIP_IPADDR2 << 8) | UIP_IPADDR3);
    BUF->opcode = htons(ARP_REQUEST); /* ARP request. */
    BUF->hwtype = htons(ARP_HWTYPE_ETH);
    BUF->protocol = htons(UIP_ETHTYPE_IP);
    BUF->hwlen = 6;
    BUF->protolen = 4;
    BUF->ethhdr.type = htons(UIP_ETHTYPE_ARP);

    uip_appdata = &uip_buf[40 + UIP_LLH_LEN];
    
    uip_len = sizeof(struct arp_hdr);
    return;
  }

  /* Build an ethernet header. */
  for(c = 0; c < 6; ++c) {
    IPBUF->ethhdr.dest.addr[c] = arp_table[i].ethaddr.addr[c];
    IPBUF->ethhdr.src.addr[0] = ethaddr.addr[c];
  }
  IPBUF->ethhdr.type = htons(UIP_ETHTYPE_IP);

  uip_len += sizeof(struct uip_eth_hdr);
}
/*-----------------------------------------------------------------------------------*/




void
uip_arp_req(void)
{
	/* The destination address was not in our ARP table, so we
       overwrite the IP packet with an ARP request. */
    for(i = 0; i < 6; ++i) 
	{     
      BUF->ethhdr.dest.addr[i] = 0xff; /* Broadcast ARP request. */
      BUF->ethhdr.src.addr[i] = 
	  BUF->shwaddr.addr[i] = ethaddr.addr[i];
      BUF->dhwaddr.addr[i] = 0;
    }
    
    BUF->dipaddr[0] = htons((UIP_DRIPADDR0 << 8) | UIP_DRIPADDR1);
    BUF->dipaddr[1] = htons((UIP_DRIPADDR2 << 8) | UIP_DRIPADDR3);

    //BUF->dipaddr[0] = ipaddr[0];
    //BUF->dipaddr[1] = ipaddr[1];
    BUF->sipaddr[0] = htons((UIP_IPADDR0 << 8) | UIP_IPADDR1);
    BUF->sipaddr[1] = htons((UIP_IPADDR2 << 8) | UIP_IPADDR3);
    BUF->opcode = htons(ARP_REQUEST); /* ARP request. */
    BUF->hwtype = htons(ARP_HWTYPE_ETH);
    BUF->protocol = htons(UIP_ETHTYPE_IP);
    BUF->hwlen = 6;
    BUF->protolen = 4;
    BUF->ethhdr.type = htons(UIP_ETHTYPE_ARP);

    uip_appdata = &uip_buf[40 + UIP_LLH_LEN];
    
    uip_len = sizeof(struct arp_hdr);
}
/*-----------------------------------------------------------------------------------*/


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
爽好久久久欧美精品| 麻豆中文一区二区| 午夜久久福利影院| 精品系列免费在线观看| 丁香啪啪综合成人亚洲小说| 91精品福利视频| 欧美成人乱码一区二区三区| 中文一区二区完整视频在线观看| 亚洲精品视频一区二区| 另类小说图片综合网| 国产乱码精品一区二区三区av | 狠狠色丁香婷婷综合久久片| av亚洲精华国产精华| 99这里只有精品| 欧美一级国产精品| 一区二区三区中文字幕精品精品 | 久久精品国产在热久久| 91伊人久久大香线蕉| 日韩一级黄色片| 一区二区三区久久| 国内精品伊人久久久久av影院| 成人午夜免费视频| 欧美精品一区男女天堂| 亚洲成人av一区| 色先锋久久av资源部| 久久久久99精品国产片| 香蕉影视欧美成人| 欧美午夜理伦三级在线观看| 国产精品夫妻自拍| 国产电影一区二区三区| 精品区一区二区| 蜜臀va亚洲va欧美va天堂| 欧美吻胸吃奶大尺度电影| 亚洲天堂精品在线观看| 国产·精品毛片| 久久日一线二线三线suv| 青娱乐精品在线视频| 在线这里只有精品| 国产精品丝袜久久久久久app| 极品瑜伽女神91| 精品国产免费人成在线观看| 奇米在线7777在线精品| 欧美一区二区观看视频| 麻豆国产欧美日韩综合精品二区| 欧美精品 国产精品| 国产精品福利在线播放| 激情伊人五月天久久综合| 日韩一级完整毛片| 精品一区二区三区在线视频| 欧美成人精品福利| 久久精品国产99久久6| 精品久久五月天| 国产一区二区福利| 日韩欧美123| 日本不卡一区二区三区高清视频| 91精品国产色综合久久ai换脸| 亚洲第一电影网| 制服.丝袜.亚洲.另类.中文| 日韩高清一区二区| www久久久久| 成人av集中营| 日韩美女视频19| 欧美丝袜丝交足nylons图片| 日本成人在线看| 久久久久久久av麻豆果冻| 成人黄色综合网站| 亚洲综合在线第一页| 欧美男男青年gay1069videost | 天堂va蜜桃一区二区三区| 一本大道久久a久久综合婷婷 | 色综合视频在线观看| 亚洲特级片在线| 欧美日韩国产三级| 狠狠色丁香久久婷婷综合丁香| 国产精品久久久久久久久免费丝袜| 91网站在线观看视频| 视频一区二区三区中文字幕| 2021中文字幕一区亚洲| 国产精品一区2区| 亚洲夂夂婷婷色拍ww47| 日韩一级黄色片| 99久久精品99国产精品| 秋霞午夜av一区二区三区| 中文字幕av免费专区久久| 91搞黄在线观看| 国产一区二区三区免费在线观看| 亚洲欧美偷拍三级| 日韩一级欧美一级| 欧美天堂一区二区三区| 丁香激情综合国产| 一区二区三区加勒比av| 精品国产一区二区精华| 在线欧美日韩精品| 国产精品综合一区二区| 亚洲夂夂婷婷色拍ww47| 国产精品三级av在线播放| 欧美精品久久久久久久久老牛影院| 久久99热99| 调教+趴+乳夹+国产+精品| 中文字幕亚洲视频| 久久综合九色综合欧美亚洲| 欧美性猛片aaaaaaa做受| 久久机这里只有精品| 亚洲福利一区二区三区| 国产精品网站一区| 精品国产sm最大网站免费看| 欧美少妇一区二区| 99re热这里只有精品免费视频| 国产精品一区不卡| 亚洲成人在线观看视频| 一区二区理论电影在线观看| 日本一二三四高清不卡| 日韩免费看的电影| 欧美美女一区二区| 欧美亚洲动漫制服丝袜| 91在线小视频| 99精品视频在线观看| 国产精品88888| 国产精品白丝jk白祙喷水网站 | 日韩一区二区精品| 7777精品伊人久久久大香线蕉最新版| 91热门视频在线观看| 成人国产精品视频| 粉嫩av亚洲一区二区图片| 国产69精品久久久久毛片| 亚洲五码中文字幕| 亚洲精品你懂的| 亚洲黄一区二区三区| 亚洲视频免费看| 一区二区三区在线观看欧美| 亚洲日本欧美天堂| 国产精品免费视频网站| 亚洲男人的天堂网| 日韩福利电影在线| 国产永久精品大片wwwapp| 国产在线精品免费| 91视频免费播放| 欧洲一区在线电影| 精品入口麻豆88视频| 国产精品久久久一区麻豆最新章节| 亚洲日本va午夜在线影院| 午夜视频在线观看一区| 国产一区二区福利| 欧洲国产伦久久久久久久| 精品久久国产97色综合| 亚洲视频在线一区观看| 奇米色777欧美一区二区| 国产成人精品免费网站| 在线观看中文字幕不卡| 精品国产91乱码一区二区三区 | eeuss影院一区二区三区| 欧美午夜精品免费| 欧美激情中文字幕一区二区| 一区二区三区日韩| 国内精品国产成人| 欧美日韩一区二区三区免费看 | 亚洲在线视频免费观看| 黄色精品一二区| 欧美手机在线视频| 国产精品网站一区| 另类小说一区二区三区| 91福利国产精品| 国产欧美一区二区精品性| 婷婷成人综合网| 91日韩一区二区三区| 久久精品欧美日韩精品| 日韩av中文字幕一区二区三区| 92精品国产成人观看免费| 久久午夜色播影院免费高清| 三级影片在线观看欧美日韩一区二区| 成人av综合在线| 国产日韩高清在线| 久久99精品久久久久久国产越南| 欧美亚日韩国产aⅴ精品中极品| 国产日韩精品视频一区| 久久国内精品自在自线400部| 欧美另类高清zo欧美| 中文字幕综合网| av电影在线观看一区| 国产午夜精品一区二区三区四区| 午夜av一区二区三区| 在线中文字幕一区| 亚洲欧美激情插| 91香蕉视频污| 亚洲人成精品久久久久久 | 欧美视频一区二区三区在线观看| 中文字幕一区二区三区四区不卡 | 欧美亚一区二区| 亚洲综合偷拍欧美一区色| 91蜜桃在线观看| 国产精品国产三级国产| 岛国精品在线观看| 国产精品不卡在线| 99久久精品国产导航| 亚洲精品五月天| 在线观看亚洲精品| 亚洲高清一区二区三区| 欧美在线视频日韩| 丝袜美腿高跟呻吟高潮一区| 欧美精品久久久久久久多人混战 |