Changeset 3d016ac in mainline
- Timestamp:
- 2012-03-07T18:54:08Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0e25780
- Parents:
- f9d3dd4
- Location:
- uspace/srv/ethip
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/ethip/arp.c
rf9d3dd4 r3d016ac 47 47 #include "std.h" 48 48 49 /** Time to wait for ARP reply in microseconds */ 50 #define ARP_REQUEST_TIMEOUT (3 * 1000 * 1000) 51 49 52 static int arp_send_packet(ethip_nic_t *nic, arp_eth_packet_t *packet); 50 53 … … 64 67 log_msg(LVL_DEBUG, "ARP PDU decoded, opcode=%d, tpa=%x", 65 68 packet.opcode, packet.target_proto_addr.ipv4); 66 if (packet.opcode == aop_request) {67 log_msg(LVL_DEBUG, "ARP request");68 69 69 70 71 log_msg(LVL_DEBUG, "Request onmy address");70 laddr = ethip_nic_addr_find(nic, &packet.target_proto_addr); 71 if (laddr != NULL) { 72 log_msg(LVL_DEBUG, "Request/reply to my address"); 72 73 73 74 74 (void) atrans_add(&packet.sender_proto_addr, 75 &packet.sender_hw_addr); 75 76 76 reply.opcode = aop_reply; 77 reply.sender_hw_addr = nic->mac_addr; 77 if (packet.opcode == aop_request) { 78 reply.opcode = aop_reply; 79 reply.sender_hw_addr = nic->mac_addr; 78 80 reply.sender_proto_addr = laddr->addr; 79 81 reply.target_hw_addr = packet.sender_hw_addr; … … 83 85 } 84 86 } 87 } 88 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) 91 { 92 int rc; 93 arp_eth_packet_t packet; 94 95 rc = atrans_lookup(ip_addr, mac_addr); 96 if (rc == EOK) 97 return EOK; 98 99 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 105 rc = arp_send_packet(nic, &packet); 106 if (rc != EOK) 107 return rc; 108 109 (void) atrans_wait_timeout(ARP_REQUEST_TIMEOUT); 110 111 return atrans_lookup(ip_addr, mac_addr); 85 112 } 86 113 -
uspace/srv/ethip/arp.h
rf9d3dd4 r3d016ac 42 42 43 43 extern void arp_received(ethip_nic_t *, eth_frame_t *); 44 extern int arp_translate(ethip_nic_t *, iplink_srv_addr_t *, 45 iplink_srv_addr_t *, mac48_addr_t *); 44 46 45 47 #endif -
uspace/srv/ethip/atrans.c
rf9d3dd4 r3d016ac 47 47 static FIBRIL_MUTEX_INITIALIZE(atrans_list_lock); 48 48 static LIST_INITIALIZE(atrans_list); 49 static FIBRIL_CONDVAR_INITIALIZE(atrans_cv); 49 50 50 51 static ethip_atrans_t *atrans_find(iplink_srv_addr_t *ip_addr) … … 82 83 list_append(&atrans->atrans_list, &atrans_list); 83 84 fibril_mutex_unlock(&atrans_list_lock); 85 fibril_condvar_broadcast(&atrans_cv); 84 86 85 87 return EOK; … … 120 122 } 121 123 124 int atrans_wait_timeout(suseconds_t timeout) 125 { 126 int rc; 127 128 fibril_mutex_lock(&atrans_list_lock); 129 rc = fibril_condvar_wait_timeout(&atrans_cv, &atrans_list_lock, 130 timeout); 131 fibril_mutex_unlock(&atrans_list_lock); 132 133 return rc; 134 } 135 122 136 /** @} 123 137 */ -
uspace/srv/ethip/atrans.h
rf9d3dd4 r3d016ac 44 44 extern int atrans_remove(iplink_srv_addr_t *); 45 45 extern int atrans_lookup(iplink_srv_addr_t *, mac48_addr_t *); 46 extern int atrans_wait_timeout(suseconds_t); 46 47 47 48 #endif -
uspace/srv/ethip/ethip.c
rf9d3dd4 r3d016ac 46 46 47 47 #include "arp.h" 48 #include "atrans.h"49 48 #include "ethip.h" 50 49 #include "ethip_nic.h" … … 178 177 log_msg(LVL_DEBUG, "ethip_send()"); 179 178 180 rc = a trans_lookup(&sdu->ldest, &dest_mac_addr);179 rc = arp_translate(nic, &sdu->lsrc, &sdu->ldest, &dest_mac_addr); 181 180 if (rc != EOK) { 182 181 log_msg(LVL_WARN, "Failed to look up IP address 0x%" PRIx32, -
uspace/srv/ethip/ethip.h
rf9d3dd4 r3d016ac 43 43 #include <loc.h> 44 44 #include <sys/types.h> 45 46 #define MAC48_BROADCAST 0xffffffffffff 45 47 46 48 typedef struct {
Note:
See TracChangeset
for help on using the changeset viewer.