📄 arp.c
字号:
/* * arp file */#include <net/xilsock.h>/* * xilnet_arp: handler for arp packets */int xilnet_arp(unsigned char *buf, int len) { struct xilnet_arp_pkt* ar = (struct xilnet_arp_pkt*) (buf+ETH_HDR_LEN); // Analyse if its a arp request and send a reply if needed if (ar->hdr.hard_type == ARP_HARD_TYPE_ETH && ar->hdr.prot_type == ETH_PROTO_IP && ar->hdr.hard_size == ARP_HARD_SIZE && ar->hdr.prot_size == ARP_PROTO_IP_SIZE && (ar->target_ip[0] == mb_ip_addr[0] && ar->target_ip[1] == mb_ip_addr[1] && ar->target_ip[2] == mb_ip_addr[2] && ar->target_ip[3] == mb_ip_addr[3]) ) { if (ar->hdr.op == ARP_REQ) { // update hw addr table xilnet_eth_update_hw_tbl(buf, ETH_PROTO_ARP); xilnet_arp_reply(buf+ETH_HDR_LEN, len-ETH_HDR_LEN); } } return 0;}/* * xilnet_arp_reply: */void xilnet_arp_reply(unsigned char *buf, int len) { int i; struct xilnet_arp_pkt *pkt; struct xilnet_arp_pkt *arp_req = (struct xilnet_arp_pkt*) buf; struct xilnet_arp_pkt *arp_reply;#ifdef _DEBUG_ // print("arp_reply(): \n");#endif pkt = (struct xilnet_arp_pkt*)(sendbuf+ETH_HDR_LEN); pkt->hdr.hard_type = ARP_HARD_TYPE_ETH; pkt->hdr.prot_type = ETH_PROTO_IP; pkt->hdr.hard_size = ARP_HARD_SIZE; pkt->hdr.prot_size = ARP_PROTO_IP_SIZE; pkt->hdr.op = ARP_REPLY; for (i = 0; i < ETH_ADDR_LEN; i++) { pkt->sender_hw[i] = mb_hw_addr[i]; pkt->target_hw[i] = arp_req->sender_hw[i]; } for (i = 0; i < ARP_PROTO_IP_SIZE ; i++) { pkt->sender_ip[i] = mb_ip_addr[i]; pkt->target_ip[i] = arp_req->sender_ip[i]; } memset(pkt->pad, 0, ARP_PAD_SIZE); /* initialize ethernet header */ xilnet_eth_send_frame(sendbuf, ETH_MIN_FRAME_LEN, arp_req->sender_ip, pkt->target_hw, ETH_PROTO_ARP); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -