This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C129ENCPDT:在以太网中使用原始套接字实现 ARP 协议

Guru**** 2589280 points
Other Parts Discussed in Thread: TM4C129ENCPDT, CC3100

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1057049/tm4c129encpdt-arp-protocol-implementation-using-raw-sockets-in-ethernet

器件型号:TM4C129ENCPDT
主题中讨论的其他器件: CC3100

大家好、

我使用的是 TI RTOS 和 tm4c129encpdt mnicrocontroller。 我有一项要求、即我想使用设备的 IP 地址查找设备的 Mac 地址。 根据该示例、

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/845693/cc3200-gratuitous-arp-using-raw-socket/3132843#3132843

我在使用 cc3100的 wifi 项目中完成了这项工作。

但是、现在我也有一个以太网项目、并且希望在那里执行同样的操作。 我正在努力,但我无法做到这一点。 我用以太网套接字 API 替换了套接字 API 调用。  

请告诉我是否有人可以解决此问题。  

附加以太网代码。 (对于 wifi 代码、一个 ccan 访问上述链接、因为整个代码对 cc3100正常工作)。

void Wireless_Build_Arp_Packet(char* buf, unsigned char * src_mac, unsigned char *src_ip,
										  unsigned char * dest_mac, unsigned char *dest_ip)
{
    struct arp_hdr* arp1;
    struct arp_ethip* ethip;
    struct arp_eth_hdr* ethhdr1;

    unsigned char eth_type[2] = {0x08, 0x06}; // for arp
//    unsigned char eth_type[2] = {0x80, 0x35};  // for rarp

    ethhdr1 = (struct arp_eth_hdr*)buf;
    memcpy(ethhdr1->dst_mac, dest_mac, ETH_ADDR_LEN);
    memcpy(ethhdr1->src_mac, src_mac, ETH_ADDR_LEN);
    memcpy(ethhdr1->type, eth_type, 2);


    arp1 = (struct arp_hdr*)(buf+ ETH_HDR_LEN);
    arp1->ar_hrd = sl_Htons(ARP_HRD_ETH);
    arp1->ar_pro = sl_Htons(ARP_PRO_IP);
    arp1->ar_hln = ETH_ADDR_LEN;
    arp1->ar_pln = IP_ADDR_LEN;
    arp1->ar_op = sl_Htons(ARP_HRD_ETH);

    ethip = (struct arp_ethip*)(buf + ARP_HDR_LEN + ETH_HDR_LEN);
    memcpy(ethip->ar_sha, src_mac, ETH_ADDR_LEN);
    memcpy(ethip->ar_spa, src_ip, IP_ADDR_LEN);
    memcpy(ethip->ar_tha, dest_mac, ETH_ADDR_LEN);
    memcpy(ethip->ar_tpa, dest_ip, IP_ADDR_LEN);
}


void Wireless_Decode_Arp_Packet(char* buf){

    struct arp_hdr* arp1;
    struct arp_ethip* ethip;
    struct arp_eth_hdr* ethhdr1;

    ethhdr1 = (struct arp_eth_hdr*)buf;

    // Mac address we were trying to get..
    // Need to return this using pointers
	logAsHexStr("Dest Mac address------ %s", "", ethhdr1->src_mac,6);

    arp1 = (struct arp_hdr*)(buf+ ETH_HDR_LEN);
    ethip = (struct arp_ethip*)(buf + ARP_HDR_LEN + ETH_HDR_LEN);
 //   UART_PRINT("\n\rGot ARP response!\n\r");
 //   UART_PRINT("\n\rIP addr %i.%i.%i.%i ",ethip->ar_spa[0],ethip->ar_spa[1],ethip->ar_spa[2],ethip->ar_spa[3]);
 //   UART_PRINT("maps to MAC addr %x:%x:%x:%x:%x:%x!\n\r",ethip->ar_sha[0],ethip->ar_sha[1],ethip->ar_sha[2],ethip->ar_sha[3],ethip->ar_sha[4],ethip->ar_sha[5]);






//    struct arp_hdr* arp1;
//    struct arp_ethip* ethip;
//    struct arp_eth_hdr* ethhdr1;
//
//    char d_ipAdd[6] = {0};
//    char d_mac[8] = {0};
//
//    strncpy(buf+26, d_ipAdd, 4);
//
//
//
//   // ethhdr1 = (struct arp_ethip*)buf;
//    ethhdr1 = (struct arp_eth_hdr*)buf;
//
//
//    strncpy(ethhdr1->src_mac, d_mac, 6);
//
//	logAsHexStr("Dest Mac address------ %s", "", ethhdr1->src_mac, 6);
//	logStr("Dest IP add -------- %s", "", d_ipAdd);
//	logAsHexStr("Dest ip address in hex ------ %s", "", d_ipAdd, 4);
//
////
//
//
////
////	 ethip = (struct arp_ethip*)(buf+ ETH_HDR_LEN);
////	 arp1 = (struct arp_hdr*)(buf + ARP_HDR_LEN + ETH_HDR_LEN);
//
//    arp1 = (struct arp_hdr*)(buf+ ETH_HDR_LEN);
//    ethip = (struct arp_ethip*)(buf + ARP_HDR_LEN + ETH_HDR_LEN);
// //   UART_PRINT("\n\rGot ARP response!\n\r");
// //   UART_PRINT("\n\rIP addr %i.%i.%i.%i ",ethip->ar_spa[0],ethip->ar_spa[1],ethip->ar_spa[2],ethip->ar_spa[3]);
// //   UART_PRINT("maps to MAC addr %x:%x:%x:%x:%x:%x!\n\r",ethip->ar_sha[0],ethip->ar_sha[1],ethip->ar_sha[2],ethip->ar_sha[3],ethip->ar_sha[4],ethip->ar_sha[5]);
//

}
char buf4[200];
void arp_protocol( unsigned char *s_mac, unsigned char *s_ip, unsigned char  *d_mac, unsigned char *d_ip)
{
    int fd, ret, len;
    uint32_t header = 1;

    //SlTimeval_t tTimeout;
   // fd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW); // working for wifi

    fd = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
    Wireless_Build_Arp_Packet(buf4, s_mac, s_ip, d_mac, d_ip);
    len = ARP_HDR_LEN + ARP_ETHIP_LEN + ETH_HDR_LEN;
    ret = send(fd, buf4, len, 0);
	__delay_cycles(5000000000);

	logg("recv arp packet....", "");
    ret = recv(fd, buf4, 200,0);
	logg(" arp done... now decoding....", "");
    Wireless_Decode_Arp_Packet(buf4);
    close(fd);
}

似乎这不起作用、因为在这一行中-在上面的代码中、

  fd =套接字(AF_iNet、SOCK_RAW、IPPROTO_IP);

我们没有合适的宏。 (请参考上述链接)。

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我不是 TI-RTOS NDK 专家。 arp_protocol()是由另一个任务创建的任务吗? 我想知道问题是否  是 由于.cfg 文件中缺少 autoOpenCloseFD=true 所致。 如果没有  autopentCloseFD=true,则必须插入对 fdPpenSession()和 fdCloseSession()的调用,以打开和关闭套接字会话。 请参阅 API 用户指南中的详细信息。  有关详细信息、请参阅第3.1.2.1节。 另请参阅屏幕截图中的以下注释。 autoOpenCloseFD 仅适用于从另一个正在运行的任务动态创建的任务。  

    http://software-dl.ti.com/simplelink/esd/simplelink_msp432e4_sdk/2.30.00.14/docs/ndk/NDK_API_Reference.html

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、  

     arp_protocol()是当我想执行 arp 时被调用的函数。

    我的主要问题是如何在以太网中实施 ARP 协议? 对于 cc3100、一切正常。  

    在 cc3100中、如果您看到代码和链接、它主要使用原始套接字。 我们自己正在为 arp 协议创建整个数据包结构、然后发送该数据包。

    我想在以太网中做的同样的事情、但它不起作用。  

    您可以在以太网中尝试此代码吗? 或者、以太网中是否有 ARP 协议的示例?

    谢谢

    AKHIG

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="419920" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1057049/tm4c129encpdt-arp-protocol-implementation-using-raw-sockets-in-ethernet/3914696 #3914696"]cc3100中、如果您看到代码和链接、它主要使用原始套接字。 我们自己正在为 arp 协议创建整个数据包结构、然后发送此数据包。

    对于 TM4C129、您将为 arp 协议创建整个数据包结构。 这是否与 cc3100的数据包结构相同?

    我实际上不是 ARP 协议专家。 我建议您使用一个有效的以太网示例、如 tcpEcho 示例。 您可以从 Resource Explorer 下载一些以太网示例。  

    通常,示例将自动处理 ARP。 使用 Wireshark 查看 ARP 数据包的构建方式。 接下来、运行您自己的代码、并查看您的 ARP 数据包与 Wireshark 中的工作示例有何不同。

     很抱歉、由于我对 ARP 的了解有限、因此缺乏指导。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    对于 TM4C129、您将为 arp 协议创建整个数据包结构。 这是否与 cc3100的数据包结构相同?

    是的。

    我的意思是-如果我们能够使用 cc3100创建和发送原始数据包(arp 数据包发送和接收都很好)、它也应该在以太网中工作?  

    但在以太网中、它无法正常工作。  

    此参数与我们所做的正常 http 或回显完全不同。 在这里、整个数据包是由我们创建的。

    您也可以在最后尝试一下吗?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是一篇介绍 ARP 工作原理的文章。 我在讲话时也在学习。 为什么不显示您发送的 ARP 数据包的 Wireshark 捕获? 您可以检查它是否与本文中所述的格式匹配。 您要向其发送 ARP 数据包的 IP 地址是在同一个网络还是在另一个网络上?

    https://www.practicalnetworking.net/series/arp/traditional-arp/

    还要检查 Wireshark 上对 ARP 数据包的预期结果。  

    https://wiki.wireshark.org/AddressResolutionProtocol