Changeset a35b458 in mainline for uspace/srv/net/ethip
- Timestamp:
- 2018-03-02T20:10:49Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- Location:
- uspace/srv/net/ethip
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/ethip/arp.c
r3061bc1 ra35b458 55 55 { 56 56 log_msg(LOG_DEFAULT, LVL_DEBUG, "arp_received()"); 57 57 58 58 arp_eth_packet_t packet; 59 59 errno_t rc = arp_pdu_decode(frame->data, frame->size, &packet); 60 60 if (rc != EOK) 61 61 return; 62 62 63 63 log_msg(LOG_DEFAULT, LVL_DEBUG, "ARP PDU decoded, opcode=%d, tpa=%x", 64 64 packet.opcode, packet.target_proto_addr); 65 65 66 66 inet_addr_t addr; 67 67 inet_addr_set(packet.target_proto_addr, &addr); 68 68 69 69 ethip_link_addr_t *laddr = ethip_nic_addr_find(nic, &addr); 70 70 if (laddr == NULL) 71 71 return; 72 72 73 73 addr32_t laddr_v4; 74 74 ip_ver_t laddr_ver = inet_addr_get(&laddr->addr, &laddr_v4, NULL); 75 75 if (laddr_ver != ip_v4) 76 76 return; 77 77 78 78 log_msg(LOG_DEFAULT, LVL_DEBUG, "Request/reply to my address"); 79 79 80 80 (void) atrans_add(packet.sender_proto_addr, 81 81 packet.sender_hw_addr); 82 82 83 83 if (packet.opcode == aop_request) { 84 84 arp_eth_packet_t reply; 85 85 86 86 reply.opcode = aop_reply; 87 87 addr48(nic->mac_addr, reply.sender_hw_addr); … … 89 89 addr48(packet.sender_hw_addr, reply.target_hw_addr); 90 90 reply.target_proto_addr = packet.sender_proto_addr; 91 91 92 92 arp_send_packet(nic, &reply); 93 93 } … … 106 106 if (rc == EOK) 107 107 return EOK; 108 108 109 109 arp_eth_packet_t packet; 110 110 111 111 packet.opcode = aop_request; 112 112 addr48(nic->mac_addr, packet.sender_hw_addr); … … 114 114 addr48(addr48_broadcast, packet.target_hw_addr); 115 115 packet.target_proto_addr = ip_addr; 116 116 117 117 rc = arp_send_packet(nic, &packet); 118 118 if (rc != EOK) 119 119 return rc; 120 120 121 121 return atrans_lookup_timeout(ip_addr, ARP_REQUEST_TIMEOUT, mac_addr); 122 122 } -
uspace/srv/net/ethip/ethip.c
r3061bc1 ra35b458 80 80 { 81 81 async_set_fallback_port_handler(ethip_client_conn, NULL); 82 82 83 83 errno_t rc = loc_server_register(NAME); 84 84 if (rc != EOK) { … … 86 86 return rc; 87 87 } 88 88 89 89 rc = ethip_nic_discovery_start(); 90 90 if (rc != EOK) 91 91 return rc; 92 92 93 93 return EOK; 94 94 } … … 173 173 { 174 174 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send()"); 175 175 176 176 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 177 177 eth_frame_t frame; 178 178 179 179 errno_t rc = arp_translate(nic, sdu->src, sdu->dest, frame.dest); 180 180 if (rc != EOK) { … … 183 183 return rc; 184 184 } 185 185 186 186 addr48(nic->mac_addr, frame.src); 187 187 frame.etype_len = ETYPE_IP; 188 188 frame.data = sdu->data; 189 189 frame.size = sdu->size; 190 190 191 191 void *data; 192 192 size_t size; … … 194 194 if (rc != EOK) 195 195 return rc; 196 196 197 197 rc = ethip_nic_send(nic, data, size); 198 198 free(data); 199 199 200 200 return rc; 201 201 } … … 204 204 { 205 205 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send6()"); 206 206 207 207 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 208 208 eth_frame_t frame; 209 209 210 210 addr48(sdu->dest, frame.dest); 211 211 addr48(nic->mac_addr, frame.src); … … 213 213 frame.data = sdu->data; 214 214 frame.size = sdu->size; 215 215 216 216 void *data; 217 217 size_t size; … … 219 219 if (rc != EOK) 220 220 return rc; 221 221 222 222 rc = ethip_nic_send(nic, data, size); 223 223 free(data); 224 224 225 225 return rc; 226 226 } … … 230 230 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received(): srv=%p", srv); 231 231 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 232 232 233 233 log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode"); 234 234 235 235 eth_frame_t frame; 236 236 errno_t rc = eth_pdu_decode(data, size, &frame); … … 239 239 return rc; 240 240 } 241 241 242 242 iplink_recv_sdu_t sdu; 243 243 244 244 switch (frame.etype_len) { 245 245 case ETYPE_ARP: … … 264 264 frame.etype_len); 265 265 } 266 266 267 267 free(frame.data); 268 268 return rc; … … 279 279 { 280 280 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_get_mac48()"); 281 281 282 282 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 283 283 addr48(nic->mac_addr, *mac); 284 284 285 285 return EOK; 286 286 } … … 289 289 { 290 290 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_set_mac48()"); 291 291 292 292 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 293 293 addr48(*mac, nic->mac_addr); 294 294 295 295 return EOK; 296 296 } … … 299 299 { 300 300 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 301 301 302 302 return ethip_nic_addr_add(nic, addr); 303 303 } … … 306 306 { 307 307 ethip_nic_t *nic = (ethip_nic_t *) srv->arg; 308 308 309 309 return ethip_nic_addr_remove(nic, addr); 310 310 } -
uspace/srv/net/ethip/ethip.h
r3061bc1 ra35b458 62 62 /** MAC address */ 63 63 addr48_t mac_addr; 64 64 65 65 /** 66 66 * List of IP addresses configured on this link -
uspace/srv/net/ethip/ethip_nic.c
r3061bc1 ra35b458 112 112 return NULL; 113 113 } 114 114 115 115 link_initialize(&nic->link); 116 116 list_initialize(&nic->addr_list); 117 117 118 118 return nic; 119 119 } … … 127 127 return NULL; 128 128 } 129 129 130 130 link_initialize(&laddr->link); 131 131 laddr->addr = *addr; 132 132 133 133 return laddr; 134 134 } … … 138 138 if (nic->svc_name != NULL) 139 139 free(nic->svc_name); 140 140 141 141 free(nic); 142 142 } … … 151 151 bool in_list = false; 152 152 nic_address_t nic_address; 153 153 154 154 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_open()"); 155 155 ethip_nic_t *nic = ethip_nic_new(); 156 156 if (nic == NULL) 157 157 return ENOMEM; 158 158 159 159 errno_t rc = loc_service_get_name(sid, &nic->svc_name); 160 160 if (rc != EOK) { … … 162 162 goto error; 163 163 } 164 164 165 165 nic->sess = loc_service_connect(sid, INTERFACE_DDF, 0); 166 166 if (nic->sess == NULL) { … … 168 168 goto error; 169 169 } 170 170 171 171 nic->svc_id = sid; 172 172 173 173 rc = nic_callback_create(nic->sess, ethip_nic_cb_conn, nic); 174 174 if (rc != EOK) { … … 192 192 goto error; 193 193 } 194 194 195 195 addr48(nic_address.address, nic->mac_addr); 196 196 … … 216 216 if (in_list) 217 217 list_remove(&nic->link); 218 218 219 219 if (nic->sess != NULL) 220 220 async_hangup(nic->sess); 221 221 222 222 ethip_nic_delete(nic); 223 223 return rc; … … 332 332 return rc; 333 333 } 334 334 335 335 return ethip_nic_check_new(); 336 336 } … … 371 371 { 372 372 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_setup_multicast()"); 373 373 374 374 /* Count the number of multicast addresses */ 375 375 376 376 size_t count = 0; 377 377 378 378 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) { 379 379 ip_ver_t ver = inet_addr_get(&laddr->addr, NULL, NULL); … … 381 381 count++; 382 382 } 383 383 384 384 if (count == 0) 385 385 return nic_multicast_set_mode(nic->sess, NIC_MULTICAST_BLOCKED, 386 386 NULL, 0); 387 387 388 388 nic_address_t *mac_list = calloc(count, sizeof(nic_address_t)); 389 389 if (mac_list == NULL) 390 390 return ENOMEM; 391 391 392 392 /* Create the multicast MAC list */ 393 393 394 394 size_t i = 0; 395 395 396 396 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) { 397 397 addr128_t v6; … … 399 399 if (ver != ip_v6) 400 400 continue; 401 401 402 402 assert(i < count); 403 403 404 404 addr48_t mac; 405 405 addr48_solicited_node(v6, mac); 406 406 407 407 /* Avoid duplicate addresses in the list */ 408 408 409 409 bool found = false; 410 410 411 411 for (size_t j = 0; j < i; j++) { 412 412 if (addr48_compare(mac_list[j].address, mac)) { … … 415 415 } 416 416 } 417 417 418 418 if (!found) { 419 419 addr48(mac, mac_list[i].address); … … 422 422 count--; 423 423 } 424 424 425 425 /* Setup the multicast MAC list */ 426 426 427 427 errno_t rc = nic_multicast_set_mode(nic->sess, NIC_MULTICAST_LIST, 428 428 mac_list, count); 429 429 430 430 free(mac_list); 431 431 return rc; … … 435 435 { 436 436 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_add()"); 437 437 438 438 ethip_link_addr_t *laddr = ethip_nic_addr_new(addr); 439 439 if (laddr == NULL) 440 440 return ENOMEM; 441 441 442 442 list_append(&laddr->link, &nic->addr_list); 443 443 444 444 return ethip_nic_setup_multicast(nic); 445 445 } … … 448 448 { 449 449 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_remove()"); 450 450 451 451 ethip_link_addr_t *laddr = ethip_nic_addr_find(nic, addr); 452 452 if (laddr == NULL) 453 453 return ENOENT; 454 454 455 455 list_remove(&laddr->link); 456 456 ethip_link_addr_delete(laddr); 457 457 458 458 return ethip_nic_setup_multicast(nic); 459 459 } … … 463 463 { 464 464 log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_find()"); 465 465 466 466 list_foreach(nic->addr_list, link, ethip_link_addr_t, laddr) { 467 467 if (inet_addr_compare(addr, &laddr->addr)) 468 468 return laddr; 469 469 } 470 470 471 471 return NULL; 472 472 }
Note:
See TracChangeset
for help on using the changeset viewer.
