| Summary: | Arping dropping leading 0 from mac address | ||
|---|---|---|---|
| Product: | Busybox | Reporter: | Vito Mule <mulevito> |
| Component: | Networking | Assignee: | unassigned |
| Status: | RESOLVED FIXED | ||
| Severity: | normal | CC: | busybox-cvs |
| Priority: | P2 | ||
| Version: | 1.24.x | ||
| Target Milestone: | --- | ||
| Hardware: | All | ||
| OS: | Linux | ||
| Host: | Target: | ||
| Build: | |||
| Attachments: | arping_drops_leading_zero.patch | ||
Created attachment 6431 [details]
arping_drops_leading_zero.patch
Fixed in git, thanks |
Not sure if this is intende but busybox arping is not consistent with arping on linux, printing MAC addressed. root@agent4:/home/vmule# arping 192.168.1.159 ARPING 192.168.1.159 60 bytes from 08:00:27:86:47:9d (192.168.1.159): index=0 time=1.002 sec and this is busybox arping root@agent4:/home/vmule# busybox arping 192.168.1.159 ARPING to 192.168.1.159 from 192.168.1.157 via eth0 Unicast reply from 192.168.1.159 [8:0:27:86:47:9d] 0.314ms I wrote a small patch to fix it: diff --git a/networking/arping.c b/networking/arping.c index 6b0de4d..2b22451 100644 --- a/networking/arping.c +++ b/networking/arping.c @@ -230,12 +230,15 @@ static void recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM) } if (!(option_mask32 & QUIET)) { int s_printed = 0; + struct ether_addr* mac = (struct ether_addr *) p; - printf("%scast re%s from %s [%s]", + printf("%scast re%s from %s [%02x:%02x:%02x:%02x:%02x:%02x] ", FROM->sll_pkttype == PACKET_HOST ? "Uni" : "Broad", ah->ar_op == htons(ARPOP_REPLY) ? "ply" : "quest", inet_ntoa(src_ip), - ether_ntoa((struct ether_addr *) p)); + mac->ether_addr_octet[0], mac->ether_addr_octet[1], + mac->ether_addr_octet[2], mac->ether_addr_octet[3], + mac->ether_addr_octet[4], mac->ether_addr_octet[5]); if (dst_ip.s_addr != src.s_addr) { printf("for %s ", inet_ntoa(dst_ip)); s_printed = 1; @@ -243,8 +246,11 @@ static void recv_pack(unsigned char *buf, int len, struct sockaddr_ll *FROM) if (memcmp(p + ah->ar_hln + 4, me.sll_addr, ah->ar_hln)) { if (!s_printed) printf("for "); - printf("[%s]", - ether_ntoa((struct ether_addr *) p + ah->ar_hln + 4)); + struct ether_addr* mac2 = mac + ah->ar_hln + 4; + printf("[%02x:%02x:%02x:%02x:%02x:%02x]", + mac2->ether_addr_octet[0], mac2->ether_addr_octet[1], + mac2->ether_addr_octet[2], mac2->ether_addr_octet[3], + mac2->ether_addr_octet[4], mac2->ether_addr_octet[5]); } if (last) { Ideas?