Changes in uspace/srv/net/ethip/ethip.c [a17356fd:1d24ad3] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/ethip/ethip.c
ra17356fd r1d24ad3 56 56 static int ethip_close(iplink_srv_t *srv); 57 57 static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu); 58 static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu);59 58 static int ethip_get_mtu(iplink_srv_t *srv, size_t *mtu); 60 static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac);61 59 static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr); 62 60 static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr); … … 68 66 .close = ethip_close, 69 67 .send = ethip_send, 70 .send6 = ethip_send6,71 68 .get_mtu = ethip_get_mtu, 72 .get_mac48 = ethip_get_mac48,73 69 .addr_add = ethip_addr_add, 74 70 .addr_remove = ethip_addr_remove … … 173 169 174 170 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 171 172 addr32_t src_v4; 173 addr128_t src_v6; 174 uint16_t src_af = inet_addr_get(&sdu->src, &src_v4, &src_v6); 175 176 addr32_t dest_v4; 177 addr128_t dest_v6; 178 uint16_t dest_af = inet_addr_get(&sdu->dest, &dest_v4, &dest_v6); 179 180 if (src_af != dest_af) 181 return EINVAL; 182 183 int rc; 175 184 eth_frame_t frame; 176 185 177 int rc = arp_translate(nic, sdu->src, sdu->dest, frame.dest); 178 if (rc != EOK) { 179 log_msg(LOG_DEFAULT, LVL_WARN, "Failed to look up IPv4 address 0x%" 180 PRIx32, sdu->dest); 181 return rc; 182 } 183 184 addr48(nic->mac_addr, frame.src); 185 frame.etype_len = ETYPE_IP; 186 frame.data = sdu->data; 187 frame.size = sdu->size; 186 switch (src_af) { 187 case AF_INET: 188 rc = arp_translate(nic, src_v4, dest_v4, frame.dest); 189 if (rc != EOK) { 190 log_msg(LOG_DEFAULT, LVL_WARN, "Failed to look up IPv4 address 0x%" 191 PRIx32, dest_v4); 192 return rc; 193 } 194 195 addr48(nic->mac_addr, frame.src); 196 frame.etype_len = ETYPE_IP; 197 frame.data = sdu->data; 198 frame.size = sdu->size; 199 200 break; 201 case AF_INET6: 202 // FIXME TODO 203 return ENOTSUP; 204 default: 205 return EINVAL; 206 } 188 207 189 208 void *data; 190 209 size_t size; 191 210 rc = eth_pdu_encode(&frame, &data, &size); 192 if (rc != EOK)193 return rc;194 195 rc = ethip_nic_send(nic, data, size);196 free(data);197 198 return rc;199 }200 201 static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu)202 {203 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send6()");204 205 ethip_nic_t *nic = (ethip_nic_t *) srv->arg;206 eth_frame_t frame;207 208 addr48(sdu->dest, frame.dest);209 addr48(nic->mac_addr, frame.src);210 frame.etype_len = ETYPE_IPV6;211 frame.data = sdu->data;212 frame.size = sdu->size;213 214 void *data;215 size_t size;216 int rc = eth_pdu_encode(&frame, &data, &size);217 211 if (rc != EOK) 218 212 return rc; … … 274 268 } 275 269 276 static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac)277 {278 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_get_mac48()");279 280 ethip_nic_t *nic = (ethip_nic_t *) srv->arg;281 addr48(nic->mac_addr, *mac);282 283 return EOK;284 }285 286 270 static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr) 287 271 {
Note:
See TracChangeset
for help on using the changeset viewer.