Changes in uspace/srv/net/il/ip/ip.c [6b82009:7bf12387] in mainline
- File:
-
- 1 edited
-
uspace/srv/net/il/ip/ip.c (modified) (47 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/il/ip/ip.c
r6b82009 r7bf12387 120 120 GENERIC_FIELD_IMPLEMENT(ip_routes, ip_route_t); 121 121 122 static void ip_receiver(ipc_callid_t, ipc_call_t *, void *); 123 124 /** Release the packet and returns the result. 125 * 126 * @param[in] packet Packet queue to be released. 127 * @param[in] result Result to be returned. 128 * 129 * @return Result parameter. 130 * 122 static void ip_receiver(ipc_callid_t, ipc_call_t *); 123 124 /** Releases the packet and returns the result. 125 * 126 * @param[in] packet The packet queue to be released. 127 * @param[in] result The result to be returned. 128 * @return The result parameter. 131 129 */ 132 130 static int ip_release_and_return(packet_t *packet, int result) 133 131 { 134 pq_release_remote(ip_globals.net_ sess, packet_get_id(packet));132 pq_release_remote(ip_globals.net_phone, packet_get_id(packet)); 135 133 return result; 136 134 } 137 135 138 /** Return the ICMP session. 139 * 140 * Search the registered protocols. 141 * 142 * @return Found ICMP session. 143 * @return NULL if the ICMP is not registered. 144 * 145 */ 146 static async_sess_t *ip_get_icmp_session(void) 147 { 136 /** Returns the ICMP phone. 137 * 138 * Searches the registered protocols. 139 * 140 * @return The found ICMP phone. 141 * @return ENOENT if the ICMP is not registered. 142 */ 143 static int ip_get_icmp_phone(void) 144 { 145 ip_proto_t *proto; 146 int phone; 147 148 148 fibril_rwlock_read_lock(&ip_globals.protos_lock); 149 ip_proto_t *proto = ip_protos_find(&ip_globals.protos, IPPROTO_ICMP);150 async_sess_t *sess = proto ? proto->sess : NULL;149 proto = ip_protos_find(&ip_globals.protos, IPPROTO_ICMP); 150 phone = proto ? proto->phone : ENOENT; 151 151 fibril_rwlock_read_unlock(&ip_globals.protos_lock); 152 153 return sess; 152 return phone; 154 153 } 155 154 … … 180 179 next = pq_detach(packet); 181 180 if (next) 182 pq_release_remote(ip_globals.net_ sess, packet_get_id(next));181 pq_release_remote(ip_globals.net_phone, packet_get_id(next)); 183 182 184 183 if (!header) { … … 219 218 } 220 219 221 /** Prepare the ICMP notification packet.222 * 223 * Release additional packets and keeponly the first one.220 /** Prepares the ICMP notification packet. 221 * 222 * Releases additional packets and keeps only the first one. 224 223 * All packets are released on error. 225 224 * 226 * @param[in] error Packet error service. 227 * @param[in] packet Packet or the packet queue to be reported as faulty. 228 * @param[in] header First packet IP header. May be NULL. 229 * 230 * @return Found ICMP session. 231 * @return NULL if the error parameter is set. 232 * @return NULL if the ICMP session is not found. 233 * @return NULL if the ip_prepare_icmp() fails. 234 * 235 */ 236 static async_sess_t *ip_prepare_icmp_and_get_session(services_t error, 237 packet_t *packet, ip_header_t *header) 238 { 239 async_sess_t *sess = ip_get_icmp_session(); 240 241 if ((error) || (!sess) || (ip_prepare_icmp(packet, header))) { 242 pq_release_remote(ip_globals.net_sess, packet_get_id(packet)); 243 return NULL; 244 } 245 246 return sess; 247 } 248 249 int il_initialize(async_sess_t *net_sess) 225 * @param[in] error The packet error service. 226 * @param[in] packet The packet or the packet queue to be reported as faulty. 227 * @param[in] header The first packet IP header. May be NULL. 228 * @return The found ICMP phone. 229 * @return EINVAL if the error parameter is set. 230 * @return EINVAL if the ICMP phone is not found. 231 * @return EINVAL if the ip_prepare_icmp() fails. 232 */ 233 static int 234 ip_prepare_icmp_and_get_phone(services_t error, packet_t *packet, 235 ip_header_t *header) 236 { 237 int phone; 238 239 phone = ip_get_icmp_phone(); 240 if (error || (phone < 0) || ip_prepare_icmp(packet, header)) 241 return ip_release_and_return(packet, EINVAL); 242 return phone; 243 } 244 245 int il_initialize(int net_phone) 250 246 { 251 247 fibril_rwlock_initialize(&ip_globals.lock); … … 254 250 fibril_rwlock_initialize(&ip_globals.netifs_lock); 255 251 256 ip_globals.net_ sess = net_sess;252 ip_globals.net_phone = net_phone; 257 253 ip_globals.packet_counter = 0; 258 254 ip_globals.gateway.address.s_addr = 0; … … 356 352 357 353 /* Get configuration */ 358 rc = net_get_device_conf_req(ip_globals.net_ sess, ip_netif->device_id,354 rc = net_get_device_conf_req(ip_globals.net_phone, ip_netif->device_id, 359 355 &configuration, count, &data); 360 356 if (rc != EOK) … … 424 420 425 421 /* Bind netif service which also initializes the device */ 426 ip_netif-> sess= nil_bind_service(ip_netif->service,422 ip_netif->phone = nil_bind_service(ip_netif->service, 427 423 (sysarg_t) ip_netif->device_id, SERVICE_IP, 428 424 ip_receiver); 429 if (ip_netif-> sess == NULL) {425 if (ip_netif->phone < 0) { 430 426 printf("Failed to contact the nil service %d\n", 431 427 ip_netif->service); 432 return ENOENT;428 return ip_netif->phone; 433 429 } 434 430 … … 439 435 address.length = sizeof(in_addr_t); 440 436 441 rc = arp_device_req(ip_netif->arp-> sess,437 rc = arp_device_req(ip_netif->arp->phone, 442 438 ip_netif->device_id, SERVICE_IP, ip_netif->service, 443 439 &address); … … 450 446 451 447 /* Get packet dimensions */ 452 rc = nil_packet_size_req(ip_netif-> sess, ip_netif->device_id,448 rc = nil_packet_size_req(ip_netif->phone, ip_netif->device_id, 453 449 &ip_netif->packet_dimension); 454 450 if (rc != EOK) … … 482 478 } 483 479 484 static int ip_device_req_local(device_id_t device_id, services_t netif) 480 static int ip_device_req_local(int il_phone, device_id_t device_id, 481 services_t netif) 485 482 { 486 483 ip_netif_t *ip_netif; … … 516 513 517 514 /* Print the settings */ 518 printf("%s: Device registered (id: %d, ipv: %d, conf: %s)\n",519 NAME, ip_netif->device_id, ip_netif-> ipv,515 printf("%s: Device registered (id: %d, phone: %d, ipv: %d, conf: %s)\n", 516 NAME, ip_netif->device_id, ip_netif->phone, ip_netif->ipv, 520 517 ip_netif->dhcp ? "dhcp" : "static"); 521 518 … … 932 929 933 930 /* Create the last fragment */ 934 new_packet = packet_get_4_remote(ip_globals.net_ sess, prefix, length,931 new_packet = packet_get_4_remote(ip_globals.net_phone, prefix, length, 935 932 suffix, ((addrlen > addr_len) ? addrlen : addr_len)); 936 933 if (!new_packet) … … 969 966 /* Create middle fragments */ 970 967 while (IP_TOTAL_LENGTH(header) > length) { 971 new_packet = packet_get_4_remote(ip_globals.net_ sess, prefix,968 new_packet = packet_get_4_remote(ip_globals.net_phone, prefix, 972 969 length, suffix, 973 970 ((addrlen >= addr_len) ? addrlen : addr_len)); … … 994 991 } 995 992 996 /** Check the packet queue lengths and fragments the packets if needed.993 /** Checks the packet queue lengths and fragments the packets if needed. 997 994 * 998 995 * The ICMP_FRAG_NEEDED error notification may be sent if the packet needs to 999 996 * be fragmented and the fragmentation is not allowed. 1000 997 * 1001 * @param[in,out] packet Packet or the packet queue to be checked. 1002 * @param[in] prefix Minimum prefix size. 1003 * @param[in] content Maximum content size. 1004 * @param[in] suffix Minimum suffix size. 1005 * @param[in] addr_len Minimum address length. 1006 * @param[in] error Error module service. 1007 * 1008 * @return The packet or the packet queue of the allowed length. 1009 * @return NULL if there are no packets left. 1010 * 1011 */ 1012 static packet_t *ip_split_packet(packet_t *packet, size_t prefix, size_t content, 1013 size_t suffix, socklen_t addr_len, services_t error) 998 * @param[in,out] packet The packet or the packet queue to be checked. 999 * @param[in] prefix The minimum prefix size. 1000 * @param[in] content The maximum content size. 1001 * @param[in] suffix The minimum suffix size. 1002 * @param[in] addr_len The minimum address length. 1003 * @param[in] error The error module service. 1004 * @return The packet or the packet queue of the allowed length. 1005 * @return NULL if there are no packets left. 1006 */ 1007 static packet_t * 1008 ip_split_packet(packet_t *packet, size_t prefix, size_t content, size_t suffix, 1009 socklen_t addr_len, services_t error) 1014 1010 { 1015 1011 size_t length; … … 1017 1013 packet_t *new_packet; 1018 1014 int result; 1019 async_sess_t *sess;1020 1015 int phone; 1016 1021 1017 next = packet; 1022 1018 /* Check all packets */ … … 1040 1036 /* Fragmentation needed? */ 1041 1037 if (result == EPERM) { 1042 sess = ip_prepare_icmp_and_get_session(error, next, NULL); 1043 if (sess) { 1038 phone = ip_prepare_icmp_and_get_phone( 1039 error, next, NULL); 1040 if (phone >= 0) { 1044 1041 /* Fragmentation necessary ICMP */ 1045 icmp_destination_unreachable_msg( sess,1042 icmp_destination_unreachable_msg(phone, 1046 1043 ICMP_FRAG_NEEDED, content, next); 1047 1044 } 1048 1045 } else { 1049 pq_release_remote(ip_globals.net_ sess,1046 pq_release_remote(ip_globals.net_phone, 1050 1047 packet_get_id(next)); 1051 1048 } … … 1061 1058 } 1062 1059 1063 /** Send the packet or the packet queue via the specified route.1060 /** Sends the packet or the packet queue via the specified route. 1064 1061 * 1065 1062 * The ICMP_HOST_UNREACH error notification may be sent if route hardware 1066 1063 * destination address is found. 1067 1064 * 1068 * @param[in,out] packet Packet to be sent.1069 * @param[in] netif Target network interface.1070 * @param[in] route Target route.1071 * @param[in] src Source address.1072 * @param[in] dest Destination address.1073 * @param[in] error Error module service.1074 * 1075 * @return EOK on success.1076 * @return Other error codes as defined for arp_translate_req().1077 * @return Other error codes as defined for ip_prepare_packet().1078 * 1065 * @param[in,out] packet The packet to be sent. 1066 * @param[in] netif The target network interface. 1067 * @param[in] route The target route. 1068 * @param[in] src The source address. 1069 * @param[in] dest The destination address. 1070 * @param[in] error The error module service. 1071 * @return EOK on success. 1072 * @return Other error codes as defined for the arp_translate_req() 1073 * function. 1074 * @return Other error codes as defined for the ip_prepare_packet() 1075 * function. 1079 1076 */ 1080 1077 static int ip_send_route(packet_t *packet, ip_netif_t *netif, … … 1084 1081 measured_string_t *translation; 1085 1082 uint8_t *data; 1086 async_sess_t *sess;1083 int phone; 1087 1084 int rc; 1088 1085 … … 1093 1090 destination.length = sizeof(dest.s_addr); 1094 1091 1095 rc = arp_translate_req(netif->arp-> sess, netif->device_id,1092 rc = arp_translate_req(netif->arp->phone, netif->device_id, 1096 1093 SERVICE_IP, &destination, &translation, &data); 1097 1094 if (rc != EOK) { 1098 pq_release_remote(ip_globals.net_ sess,1095 pq_release_remote(ip_globals.net_phone, 1099 1096 packet_get_id(packet)); 1100 1097 return rc; … … 1106 1103 free(data); 1107 1104 } 1108 sess = ip_prepare_icmp_and_get_session(error, packet,1105 phone = ip_prepare_icmp_and_get_phone(error, packet, 1109 1106 NULL); 1110 if ( sess) {1107 if (phone >= 0) { 1111 1108 /* Unreachable ICMP if no routing */ 1112 icmp_destination_unreachable_msg( sess,1109 icmp_destination_unreachable_msg(phone, 1113 1110 ICMP_HOST_UNREACH, 0, packet); 1114 1111 } … … 1122 1119 rc = ip_prepare_packet(src, dest, packet, translation); 1123 1120 if (rc != EOK) { 1124 pq_release_remote(ip_globals.net_ sess, packet_get_id(packet));1121 pq_release_remote(ip_globals.net_phone, packet_get_id(packet)); 1125 1122 } else { 1126 1123 packet = ip_split_packet(packet, netif->packet_dimension.prefix, … … 1129 1126 netif->packet_dimension.addr_len, error); 1130 1127 if (packet) { 1131 nil_send_msg(netif-> sess, netif->device_id, packet,1128 nil_send_msg(netif->phone, netif->device_id, packet, 1132 1129 SERVICE_IP); 1133 1130 } … … 1142 1139 } 1143 1140 1144 static int ip_send_msg_local( device_id_t device_id, packet_t *packet,1145 services_t sender, services_t error)1141 static int ip_send_msg_local(int il_phone, device_id_t device_id, 1142 packet_t *packet, services_t sender, services_t error) 1146 1143 { 1147 1144 int addrlen; … … 1152 1149 in_addr_t *dest; 1153 1150 in_addr_t *src; 1154 async_sess_t *sess;1151 int phone; 1155 1152 int rc; 1156 1153 … … 1197 1194 if (!netif || !route) { 1198 1195 fibril_rwlock_read_unlock(&ip_globals.netifs_lock); 1199 sess = ip_prepare_icmp_and_get_session(error, packet, NULL);1200 if ( sess) {1196 phone = ip_prepare_icmp_and_get_phone(error, packet, NULL); 1197 if (phone >= 0) { 1201 1198 /* Unreachable ICMP if no routing */ 1202 icmp_destination_unreachable_msg( sess,1199 icmp_destination_unreachable_msg(phone, 1203 1200 ICMP_NET_UNREACH, 0, packet); 1204 1201 } … … 1228 1225 if (!netif || !route) { 1229 1226 fibril_rwlock_read_unlock(&ip_globals.netifs_lock); 1230 sess = ip_prepare_icmp_and_get_session(error, packet,1227 phone = ip_prepare_icmp_and_get_phone(error, packet, 1231 1228 NULL); 1232 if ( sess) {1229 if (phone >= 0) { 1233 1230 /* Unreachable ICMP if no routing */ 1234 icmp_destination_unreachable_msg( sess,1231 icmp_destination_unreachable_msg(phone, 1235 1232 ICMP_HOST_UNREACH, 0, packet); 1236 1233 } … … 1316 1313 { 1317 1314 ip_proto_t *proto; 1318 async_sess_t *sess;1315 int phone; 1319 1316 services_t service; 1320 1317 tl_received_msg_t received_msg; … … 1369 1366 if (!proto) { 1370 1367 fibril_rwlock_read_unlock(&ip_globals.protos_lock); 1371 sess = ip_prepare_icmp_and_get_session(error, packet, header);1372 if ( sess) {1368 phone = ip_prepare_icmp_and_get_phone(error, packet, header); 1369 if (phone >= 0) { 1373 1370 /* Unreachable ICMP */ 1374 icmp_destination_unreachable_msg( sess,1371 icmp_destination_unreachable_msg(phone, 1375 1372 ICMP_PROT_UNREACH, 0, packet); 1376 1373 } … … 1384 1381 rc = received_msg(device_id, packet, service, error); 1385 1382 } else { 1386 rc = tl_received_msg(proto-> sess, device_id, packet,1383 rc = tl_received_msg(proto->phone, device_id, packet, 1387 1384 proto->service, error); 1388 1385 fibril_rwlock_read_unlock(&ip_globals.protos_lock); … … 1418 1415 in_addr_t dest; 1419 1416 ip_route_t *route; 1420 async_sess_t *sess;1417 int phone; 1421 1418 struct sockaddr *addr; 1422 1419 struct sockaddr_in addr_in; … … 1431 1428 if ((header->header_checksum) && 1432 1429 (IP_HEADER_CHECKSUM(header) != IP_CHECKSUM_ZERO)) { 1433 sess = ip_prepare_icmp_and_get_session(0, packet, header);1434 if ( sess) {1430 phone = ip_prepare_icmp_and_get_phone(0, packet, header); 1431 if (phone >= 0) { 1435 1432 /* Checksum error ICMP */ 1436 icmp_parameter_problem_msg( sess, ICMP_PARAM_POINTER,1433 icmp_parameter_problem_msg(phone, ICMP_PARAM_POINTER, 1437 1434 ((size_t) ((void *) &header->header_checksum)) - 1438 1435 ((size_t) ((void *) header)), packet); … … 1442 1439 1443 1440 if (header->ttl <= 1) { 1444 sess = ip_prepare_icmp_and_get_session(0, packet, header);1445 if ( sess) {1441 phone = ip_prepare_icmp_and_get_phone(0, packet, header); 1442 if (phone >= 0) { 1446 1443 /* TTL exceeded ICMP */ 1447 icmp_time_exceeded_msg( sess, ICMP_EXC_TTL, packet);1444 icmp_time_exceeded_msg(phone, ICMP_EXC_TTL, packet); 1448 1445 } 1449 1446 return EINVAL; … … 1473 1470 route = ip_find_route(dest); 1474 1471 if (!route) { 1475 sess = ip_prepare_icmp_and_get_session(0, packet, header);1476 if ( sess) {1472 phone = ip_prepare_icmp_and_get_phone(0, packet, header); 1473 if (phone >= 0) { 1477 1474 /* Unreachable ICMP */ 1478 icmp_destination_unreachable_msg( sess,1475 icmp_destination_unreachable_msg(phone, 1479 1476 ICMP_HOST_UNREACH, 0, packet); 1480 1477 } … … 1493 1490 } 1494 1491 1495 sess = ip_prepare_icmp_and_get_session(0, packet, header);1496 if ( sess) {1492 phone = ip_prepare_icmp_and_get_phone(0, packet, header); 1493 if (phone >= 0) { 1497 1494 /* Unreachable ICMP if no routing */ 1498 icmp_destination_unreachable_msg( sess, ICMP_HOST_UNREACH, 0,1495 icmp_destination_unreachable_msg(phone, ICMP_HOST_UNREACH, 0, 1499 1496 packet); 1500 1497 } … … 1503 1500 } 1504 1501 1505 /** Return the device packet dimensions for sending.1506 * 1507 * @param[in] device_id Device identifier.1508 * @param[ out] addr_len Minimum reserved address length.1509 * @param[ out] prefix Minimum reserved prefix size.1510 * @param[out] content Maximum content size.1511 * @param[out] suffix Minimum reserved suffix size.1512 * 1513 * @ return EOK on success.1514 * 1502 /** Returns the device packet dimensions for sending. 1503 * 1504 * @param[in] phone The service module phone. 1505 * @param[in] message The service specific message. 1506 * @param[in] device_id The device identifier. 1507 * @param[out] addr_len The minimum reserved address length. 1508 * @param[out] prefix The minimum reserved prefix size. 1509 * @param[out] content The maximum content size. 1510 * @param[out] suffix The minimum reserved suffix size. 1511 * @return EOK on success. 1515 1512 */ 1516 1513 static int ip_packet_size_message(device_id_t device_id, size_t *addr_len, … … 1594 1591 * @param[in] iid Message identifier. 1595 1592 * @param[in,out] icall Message parameters. 1596 * @param[in] arg Local argument. 1597 * 1598 */ 1599 static void ip_receiver(ipc_callid_t iid, ipc_call_t *icall, void *arg) 1593 * 1594 */ 1595 static void ip_receiver(ipc_callid_t iid, ipc_call_t *icall) 1600 1596 { 1601 1597 packet_t *packet; … … 1611 1607 1612 1608 case NET_IL_RECEIVED: 1613 rc = packet_translate_remote(ip_globals.net_ sess, &packet,1609 rc = packet_translate_remote(ip_globals.net_phone, &packet, 1614 1610 IPC_GET_PACKET(*icall)); 1615 1611 if (rc == EOK) { … … 1638 1634 } 1639 1635 1640 /** Register the transport layer protocol.1636 /** Registers the transport layer protocol. 1641 1637 * 1642 1638 * The traffic of this protocol will be supplied using either the receive 1643 1639 * function or IPC message. 1644 1640 * 1645 * @param[in] protocol Transport layer module protocol. 1646 * @param[in] service Transport layer module service. 1647 * @param[in] sess Transport layer module session. 1648 * @param[in] received_msg Receiving function. 1649 * 1650 * @return EOK on success. 1651 * @return EINVAL if the protocol parameter and/or the service 1652 * parameter is zero. 1653 * @return EINVAL if the phone parameter is not a positive number 1654 * and the tl_receive_msg is NULL. 1655 * @return ENOMEM if there is not enough memory left. 1656 * 1657 */ 1658 static int ip_register(int protocol, services_t service, async_sess_t *sess, 1641 * @param[in] protocol The transport layer module protocol. 1642 * @param[in] service The transport layer module service. 1643 * @param[in] phone The transport layer module phone. 1644 * @param[in] received_msg The receiving function. 1645 * @return EOK on success. 1646 * @return EINVAL if the protocol parameter and/or the service 1647 * parameter is zero. 1648 * @return EINVAL if the phone parameter is not a positive number 1649 * and the tl_receive_msg is NULL. 1650 * @return ENOMEM if there is not enough memory left. 1651 */ 1652 static int 1653 ip_register(int protocol, services_t service, int phone, 1659 1654 tl_received_msg_t received_msg) 1660 1655 { … … 1662 1657 int index; 1663 1658 1664 if ( (!protocol) || (!service) || ((!sess) && (!received_msg)))1659 if (!protocol || !service || ((phone < 0) && !received_msg)) 1665 1660 return EINVAL; 1666 1661 1667 1662 proto = (ip_proto_t *) malloc(sizeof(ip_protos_t)); 1668 1663 if (!proto) … … 1671 1666 proto->protocol = protocol; 1672 1667 proto->service = service; 1673 proto-> sess = sess;1668 proto->phone = phone; 1674 1669 proto->received_msg = received_msg; 1675 1670 … … 1683 1678 fibril_rwlock_write_unlock(&ip_globals.protos_lock); 1684 1679 1685 printf("%s: Protocol registered (protocol: %d )\n",1686 NAME, proto->protocol );1680 printf("%s: Protocol registered (protocol: %d, phone: %d)\n", 1681 NAME, proto->protocol, proto->phone); 1687 1682 1688 1683 return EOK; 1689 1684 } 1690 1685 1691 static int ip_add_route_req_local(device_id_t device_id, in_addr_t address, 1686 1687 static int 1688 ip_add_route_req_local(int ip_phone, device_id_t device_id, in_addr_t address, 1692 1689 in_addr_t netmask, in_addr_t gateway) 1693 1690 { … … 1723 1720 } 1724 1721 1725 static int ip_set_gateway_req_local(device_id_t device_id, in_addr_t gateway) 1722 static int 1723 ip_set_gateway_req_local(int ip_phone, device_id_t device_id, in_addr_t gateway) 1726 1724 { 1727 1725 ip_netif_t *netif; … … 1747 1745 /** Notify the IP module about the received error notification packet. 1748 1746 * 1749 * @param[in] device_id Device identifier. 1750 * @param[in] packet Received packet or the received packet queue. 1751 * @param[in] target Target internetwork module service to be 1752 * delivered to. 1753 * @param[in] error Packet error reporting service. Prefixes the 1754 * received packet. 1755 * 1756 * @return EOK on success. 1757 * 1758 */ 1759 static int ip_received_error_msg_local(device_id_t device_id, 1747 * @param[in] ip_phone The IP module phone used for (semi)remote calls. 1748 * @param[in] device_id The device identifier. 1749 * @param[in] packet The received packet or the received packet queue. 1750 * @param[in] target The target internetwork module service to be 1751 * delivered to. 1752 * @param[in] error The packet error reporting service. Prefixes the 1753 * received packet. 1754 * @return EOK on success. 1755 * 1756 */ 1757 static int 1758 ip_received_error_msg_local(int ip_phone, device_id_t device_id, 1760 1759 packet_t *packet, services_t target, services_t error) 1761 1760 { … … 1802 1801 address.value = (uint8_t *) &header->destination_address; 1803 1802 address.length = sizeof(header->destination_address); 1804 arp_clear_address_req(netif->arp-> sess,1803 arp_clear_address_req(netif->arp->phone, 1805 1804 netif->device_id, SERVICE_IP, &address); 1806 1805 } … … 1816 1815 } 1817 1816 1818 static int ip_get_route_req_local(ip_protocol_t protocol, 1817 static int 1818 ip_get_route_req_local(int ip_phone, ip_protocol_t protocol, 1819 1819 const struct sockaddr *destination, socklen_t addrlen, 1820 1820 device_id_t *device_id, void **header, size_t *headerlen) … … 1913 1913 1914 1914 *answer_count = 0; 1915 1916 if (!IPC_GET_IMETHOD(*call))1915 switch (IPC_GET_IMETHOD(*call)) { 1916 case IPC_M_PHONE_HUNGUP: 1917 1917 return EOK; 1918 1918 1919 async_sess_t *callback = 1920 async_callback_receive_start(EXCHANGE_SERIALIZE, call); 1921 if (callback) 1919 case IPC_M_CONNECT_TO_ME: 1922 1920 return ip_register(IL_GET_PROTO(*call), IL_GET_SERVICE(*call), 1923 callback, NULL); 1924 1925 switch (IPC_GET_IMETHOD(*call)) { 1921 IPC_GET_PHONE(*call), NULL); 1922 1926 1923 case NET_IP_DEVICE: 1927 return ip_device_req_local( IPC_GET_DEVICE(*call),1924 return ip_device_req_local(0, IPC_GET_DEVICE(*call), 1928 1925 IPC_GET_SERVICE(*call)); 1929 1926 1930 1927 case NET_IP_RECEIVED_ERROR: 1931 rc = packet_translate_remote(ip_globals.net_ sess, &packet,1928 rc = packet_translate_remote(ip_globals.net_phone, &packet, 1932 1929 IPC_GET_PACKET(*call)); 1933 1930 if (rc != EOK) 1934 1931 return rc; 1935 return ip_received_error_msg_local( IPC_GET_DEVICE(*call),1932 return ip_received_error_msg_local(0, IPC_GET_DEVICE(*call), 1936 1933 packet, IPC_GET_TARGET(*call), IPC_GET_ERROR(*call)); 1937 1934 1938 1935 case NET_IP_ADD_ROUTE: 1939 return ip_add_route_req_local( IPC_GET_DEVICE(*call),1936 return ip_add_route_req_local(0, IPC_GET_DEVICE(*call), 1940 1937 IP_GET_ADDRESS(*call), IP_GET_NETMASK(*call), 1941 1938 IP_GET_GATEWAY(*call)); 1942 1939 1943 1940 case NET_IP_SET_GATEWAY: 1944 return ip_set_gateway_req_local( IPC_GET_DEVICE(*call),1941 return ip_set_gateway_req_local(0, IPC_GET_DEVICE(*call), 1945 1942 IP_GET_GATEWAY(*call)); 1946 1943 … … 1951 1948 return rc; 1952 1949 1953 rc = ip_get_route_req_local( IP_GET_PROTOCOL(*call), addr,1950 rc = ip_get_route_req_local(0, IP_GET_PROTOCOL(*call), addr, 1954 1951 (socklen_t) addrlen, &device_id, &header, &headerlen); 1955 1952 if (rc != EOK) … … 1982 1979 1983 1980 case NET_IP_SEND: 1984 rc = packet_translate_remote(ip_globals.net_ sess, &packet,1981 rc = packet_translate_remote(ip_globals.net_phone, &packet, 1985 1982 IPC_GET_PACKET(*call)); 1986 1983 if (rc != EOK) 1987 1984 return rc; 1988 1985 1989 return ip_send_msg_local( IPC_GET_DEVICE(*call), packet, 0,1986 return ip_send_msg_local(0, IPC_GET_DEVICE(*call), packet, 0, 1990 1987 IPC_GET_ERROR(*call)); 1991 1988 }
Note:
See TracChangeset
for help on using the changeset viewer.
