Changes in uspace/srv/net/ethip/arp.c [a1a101d:5a324d99] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/ethip/arp.c
ra1a101d r5a324d99 38 38 #include <io/log.h> 39 39 #include <inet/iplink_srv.h> 40 #include <inet/addr.h> 40 41 #include <stdlib.h> 41 42 42 #include "arp.h" 43 43 #include "atrans.h" … … 54 54 void arp_received(ethip_nic_t *nic, eth_frame_t *frame) 55 55 { 56 int rc; 56 log_msg(LOG_DEFAULT, LVL_DEBUG, "arp_received()"); 57 57 58 arp_eth_packet_t packet; 58 arp_eth_packet_t reply; 59 ethip_link_addr_t *laddr; 60 61 log_msg(LOG_DEFAULT, LVL_DEBUG, "arp_received()"); 62 63 rc = arp_pdu_decode(frame->data, frame->size, &packet); 59 int rc = arp_pdu_decode(frame->data, frame->size, &packet); 64 60 if (rc != EOK) 65 61 return; 66 62 67 63 log_msg(LOG_DEFAULT, LVL_DEBUG, "ARP PDU decoded, opcode=%d, tpa=%x", 68 packet.opcode, packet.target_proto_addr.ipv4); 69 70 laddr = ethip_nic_addr_find(nic, &packet.target_proto_addr); 71 if (laddr != NULL) { 72 log_msg(LOG_DEFAULT, LVL_DEBUG, "Request/reply to my address"); 73 74 (void) atrans_add(&packet.sender_proto_addr, 75 &packet.sender_hw_addr); 76 77 if (packet.opcode == aop_request) { 78 reply.opcode = aop_reply; 79 reply.sender_hw_addr = nic->mac_addr; 80 reply.sender_proto_addr = laddr->addr; 81 reply.target_hw_addr = packet.sender_hw_addr; 82 reply.target_proto_addr = packet.sender_proto_addr; 83 84 arp_send_packet(nic, &reply); 85 } 64 packet.opcode, packet.target_proto_addr); 65 66 inet_addr_t addr; 67 inet_addr_set(packet.target_proto_addr, &addr); 68 69 ethip_link_addr_t *laddr = ethip_nic_addr_find(nic, &addr); 70 if (laddr == NULL) 71 return; 72 73 addr32_t laddr_v4; 74 ip_ver_t laddr_ver = inet_addr_get(&laddr->addr, &laddr_v4, NULL); 75 if (laddr_ver != ip_v4) 76 return; 77 78 log_msg(LOG_DEFAULT, LVL_DEBUG, "Request/reply to my address"); 79 80 (void) atrans_add(packet.sender_proto_addr, 81 packet.sender_hw_addr); 82 83 if (packet.opcode == aop_request) { 84 arp_eth_packet_t reply; 85 86 reply.opcode = aop_reply; 87 addr48(nic->mac_addr, reply.sender_hw_addr); 88 reply.sender_proto_addr = laddr_v4; 89 addr48(packet.sender_hw_addr, reply.target_hw_addr); 90 reply.target_proto_addr = packet.sender_proto_addr; 91 92 arp_send_packet(nic, &reply); 86 93 } 87 94 } 88 95 89 int arp_translate(ethip_nic_t *nic, iplink_srv_addr_t *src_addr,90 iplink_srv_addr_t *ip_addr, mac48_addr_t *mac_addr)96 int arp_translate(ethip_nic_t *nic, addr32_t src_addr, addr32_t ip_addr, 97 addr48_t mac_addr) 91 98 { 92 int rc; 93 arp_eth_packet_t packet; 99 /* Broadcast address */ 100 if (ip_addr == addr32_broadcast_all_hosts) { 101 addr48(addr48_broadcast, mac_addr); 102 return EOK; 103 } 94 104 95 rc = atrans_lookup(ip_addr, mac_addr);105 int rc = atrans_lookup(ip_addr, mac_addr); 96 106 if (rc == EOK) 97 107 return EOK; 98 108 109 arp_eth_packet_t packet; 110 99 111 packet.opcode = aop_request; 100 packet.sender_hw_addr = nic->mac_addr;101 packet.sender_proto_addr = *src_addr;102 packet.target_hw_addr.addr = MAC48_BROADCAST;103 packet.target_proto_addr = *ip_addr;104 112 addr48(nic->mac_addr, packet.sender_hw_addr); 113 packet.sender_proto_addr = src_addr; 114 addr48(addr48_broadcast, packet.target_hw_addr); 115 packet.target_proto_addr = ip_addr; 116 105 117 rc = arp_send_packet(nic, &packet); 106 118 if (rc != EOK) 107 119 return rc; 108 120 109 121 (void) atrans_wait_timeout(ARP_REQUEST_TIMEOUT); 110 122 111 123 return atrans_lookup(ip_addr, mac_addr); 112 124 } … … 128 140 return rc; 129 141 130 frame.dest.addr = packet->target_hw_addr.addr;131 frame.src.addr = packet->sender_hw_addr.addr;142 addr48(packet->target_hw_addr, frame.dest); 143 addr48(packet->sender_hw_addr, frame.src); 132 144 frame.etype_len = ETYPE_ARP; 133 145 frame.data = pdata;
Note:
See TracChangeset
for help on using the changeset viewer.