Changeset a2e3ee6 in mainline for uspace/srv/net/inetsrv
- Timestamp:
- 2013-06-20T16:45:58Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 08bb73b
- Parents:
- 19a4f73
- Location:
- uspace/srv/net/inetsrv
- Files:
-
- 11 edited
-
addrobj.c (modified) (2 diffs)
-
icmp.c (modified) (3 diffs)
-
inet_link.c (modified) (6 diffs)
-
inetcfg.c (modified) (8 diffs)
-
inetping.c (modified) (4 diffs)
-
inetping.h (modified) (1 diff)
-
inetsrv.c (modified) (5 diffs)
-
inetsrv.h (modified) (1 diff)
-
pdu.c (modified) (3 diffs)
-
reass.c (modified) (1 diff)
-
sroute.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/addrobj.c
r19a4f73 ra2e3ee6 112 112 inet_addrobj_t *inet_addrobj_find(inet_addr_t *addr, inet_addrobj_find_t find) 113 113 { 114 uint32_t mask; 115 116 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find(%x)", (unsigned)addr->ipv4); 117 118 fibril_mutex_lock(&addr_list_lock); 119 114 uint32_t addr_addr; 115 int rc = inet_addr_pack(addr, &addr_addr); 116 if (rc != EOK) 117 return NULL; 118 119 fibril_mutex_lock(&addr_list_lock); 120 120 121 list_foreach(addr_list, link) { 121 122 inet_addrobj_t *naddr = list_get_instance(link, 122 123 inet_addrobj_t, addr_list); 123 124 mask = inet_netmask(naddr->naddr.bits); 125 if ((naddr->naddr.ipv4 & mask) == (addr->ipv4 & mask)) { 124 125 uint32_t naddr_addr; 126 uint8_t naddr_bits; 127 rc = inet_naddr_pack(&naddr->naddr, &naddr_addr, &naddr_bits); 128 if (rc != EOK) 129 continue; 130 131 uint32_t mask = inet_netmask(naddr_bits); 132 if ((naddr_addr & mask) == (addr_addr & mask)) { 126 133 fibril_mutex_unlock(&addr_list_lock); 127 134 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p", … … 218 225 { 219 226 inet_addr_t lsrc_addr; 220 inet_addr_t *ldest_addr; 221 222 lsrc_addr.ipv4 = addr->naddr.ipv4; 223 ldest_addr = ldest; 224 227 inet_naddr_addr(&addr->naddr, &lsrc_addr); 228 229 inet_addr_t *ldest_addr = ldest; 230 225 231 return inet_link_send_dgram(addr->ilink, &lsrc_addr, ldest_addr, dgram, 226 232 proto, ttl, df); -
uspace/srv/net/inetsrv/icmp.c
r19a4f73 ra2e3ee6 120 120 static int icmp_recv_echo_reply(inet_dgram_t *dgram) 121 121 { 122 icmp_echo_t *reply;123 inetping_sdu_t sdu;124 uint16_t ident;125 126 122 log_msg(LOG_DEFAULT, LVL_DEBUG, "icmp_recv_echo_reply()"); 127 123 128 124 if (dgram->size < sizeof(icmp_echo_t)) 129 125 return EINVAL; 130 131 reply = (icmp_echo_t *)dgram->data; 132 133 sdu.src = dgram->src; 134 sdu.dest = dgram->dest; 126 127 icmp_echo_t *reply = (icmp_echo_t *) dgram->data; 128 129 inetping_sdu_t sdu; 130 131 int rc = inet_addr_pack(&dgram->src, &sdu.src); 132 if (rc != EOK) 133 return rc; 134 135 rc = inet_addr_pack(&dgram->dest, &sdu.dest); 136 if (rc != EOK) 137 return rc; 138 135 139 sdu.seq_no = uint16_t_be2host(reply->seq_no); 136 140 sdu.data = reply + sizeof(icmp_echo_t); 137 141 sdu.size = dgram->size - sizeof(icmp_echo_t); 138 ident = uint16_t_be2host(reply->ident); 142 143 uint16_t ident = uint16_t_be2host(reply->ident); 139 144 140 145 return inetping_recv(ident, &sdu); … … 143 148 int icmp_ping_send(uint16_t ident, inetping_sdu_t *sdu) 144 149 { 145 inet_dgram_t dgram; 146 icmp_echo_t *request; 147 void *rdata; 148 size_t rsize; 149 uint16_t checksum; 150 int rc; 151 152 rsize = sizeof(icmp_echo_t) + sdu->size; 153 rdata = calloc(rsize, 1); 150 size_t rsize = sizeof(icmp_echo_t) + sdu->size; 151 void *rdata = calloc(rsize, 1); 154 152 if (rdata == NULL) 155 153 return ENOMEM; 156 157 request = (icmp_echo_t *)rdata;158 154 155 icmp_echo_t *request = (icmp_echo_t *)rdata; 156 159 157 request->type = ICMP_ECHO_REQUEST; 160 158 request->code = 0; … … 162 160 request->ident = host2uint16_t_be(ident); 163 161 request->seq_no = host2uint16_t_be(sdu->seq_no); 164 162 165 163 memcpy(rdata + sizeof(icmp_echo_t), sdu->data, sdu->size); 166 167 checksum = inet_checksum_calc(INET_CHECKSUM_INIT, rdata, rsize);164 165 uint16_t checksum = inet_checksum_calc(INET_CHECKSUM_INIT, rdata, rsize); 168 166 request->checksum = host2uint16_t_be(checksum); 169 170 dgram.src = sdu->src; 171 dgram.dest = sdu->dest; 167 168 inet_dgram_t dgram; 169 170 inet_addr_unpack(sdu->src, &dgram.src); 171 inet_addr_unpack(sdu->dest, &dgram.dest); 172 172 173 dgram.tos = ICMP_TOS; 173 174 dgram.data = rdata; 174 175 dgram.size = rsize; 175 176 rc = inet_route_packet(&dgram, IP_PROTO_ICMP, INET_TTL_MAX, 0);177 176 177 int rc = inet_route_packet(&dgram, IP_PROTO_ICMP, INET_TTL_MAX, 0); 178 178 179 free(rdata); 179 180 return rc; -
uspace/srv/net/inetsrv/inet_link.c
r19a4f73 ra2e3ee6 153 153 { 154 154 inet_link_t *ilink; 155 i plink_addr_t iaddr;155 inet_addr_t iaddr; 156 156 int rc; 157 157 … … 196 196 197 197 static int first = 1; 198 /* XXX For testing: set static IP address 10.0.2.15/24 */198 199 199 addr = inet_addrobj_new(); 200 200 201 if (first) { 201 addr->naddr.ipv4 = (127 << 24) + (0 << 16) + (0 << 8) + 1;202 inet_naddr(&addr->naddr, 127, 0, 0, 1, 24); 202 203 first = 0; 203 204 } else { 204 addr->naddr.ipv4 = (10 << 24) + (0 << 16) + (2 << 8) + 15; 205 } 206 addr->naddr.bits = 24; 205 /* XXX For testing: set static IP address 10.0.2.15/24 */ 206 inet_naddr(&addr->naddr, 10, 0, 2, 15, 24); 207 } 208 207 209 addr->ilink = ilink; 208 210 addr->name = str_dup("v4a"); … … 215 217 } 216 218 217 i addr.ipv4 = addr->naddr.ipv4;219 inet_naddr_addr(&addr->naddr, &iaddr); 218 220 rc = iplink_addr_add(ilink->iplink, &iaddr); 219 221 if (rc != EOK) { … … 257 259 inet_addr_t *ldest, inet_dgram_t *dgram, uint8_t proto, uint8_t ttl, int df) 258 260 { 259 iplink_sdu_t sdu;260 inet_packet_t packet;261 int rc;262 size_t offs, roffs;263 264 261 /* 265 262 * Fill packet structure. Fragmentation is performed by 266 263 * inet_pdu_encode(). 267 264 */ 265 inet_packet_t packet; 266 268 267 packet.src = dgram->src; 269 268 packet.dest = dgram->dest; … … 274 273 packet.data = dgram->data; 275 274 packet.size = dgram->size; 276 277 sdu.lsrc.ipv4 = lsrc->ipv4; 278 sdu.ldest.ipv4 = ldest->ipv4; 279 280 offs = 0; 275 276 iplink_sdu_t sdu; 277 278 int rc = inet_addr_pack(lsrc, &sdu.lsrc); 279 if (rc != EOK) 280 return rc; 281 282 rc = inet_addr_pack(ldest, &sdu.ldest); 283 if (rc != EOK) 284 return rc; 285 286 size_t offs = 0; 281 287 do { 288 size_t roffs; 289 282 290 /* Encode one fragment */ 283 291 rc = inet_pdu_encode(&packet, offs, ilink->def_mtu, &sdu.data, … … 285 293 if (rc != EOK) 286 294 return rc; 287 295 288 296 /* Send the PDU */ 289 297 rc = iplink_send(ilink->iplink, &sdu); 290 298 free(sdu.data); 291 299 292 300 offs = roffs; 293 301 } while (offs < packet.size); 294 302 295 303 return rc; 296 304 } -
uspace/srv/net/inetsrv/inetcfg.c
r19a4f73 ra2e3ee6 56 56 inet_link_t *ilink; 57 57 inet_addrobj_t *addr; 58 i plink_addr_t iaddr;58 inet_addr_t iaddr; 59 59 int rc; 60 60 … … 82 82 } 83 83 84 i addr.ipv4 = addr->naddr.ipv4;84 inet_naddr_addr(&addr->naddr, &iaddr); 85 85 rc = iplink_addr_add(ilink->iplink, &iaddr); 86 86 if (rc != EOK) { … … 254 254 } 255 255 256 naddr.ipv4 = IPC_GET_ARG1(*call); 257 naddr.bits = IPC_GET_ARG2(*call); 258 link_id = IPC_GET_ARG3(*call); 256 inet_naddr_unpack(IPC_GET_ARG1(*call), IPC_GET_ARG2(*call), &naddr); 257 link_id = IPC_GET_ARG3(*call); 259 258 260 259 addr_id = 0; … … 279 278 static void inetcfg_addr_get_srv(ipc_callid_t callid, ipc_call_t *call) 280 279 { 280 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_addr_get_srv()"); 281 282 sysarg_t addr_id = IPC_GET_ARG1(*call); 283 284 inet_addr_info_t ainfo; 285 286 inet_naddr_any(&ainfo.naddr); 287 ainfo.ilink = 0; 288 ainfo.name = NULL; 289 281 290 ipc_callid_t rcallid; 282 291 size_t max_size; 283 284 sysarg_t addr_id; 285 inet_addr_info_t ainfo; 286 int rc; 287 288 addr_id = IPC_GET_ARG1(*call); 289 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_addr_get_srv()"); 290 291 ainfo.naddr.ipv4 = 0; 292 ainfo.naddr.bits = 0; 293 ainfo.ilink = 0; 294 ainfo.name = NULL; 295 292 296 293 if (!async_data_read_receive(&rcallid, &max_size)) { 297 294 async_answer_0(rcallid, EREFUSED); … … 299 296 return; 300 297 } 301 302 rc = inetcfg_addr_get(addr_id, &ainfo); 303 if (rc != EOK) { 304 async_answer_0(callid, rc); 305 return; 306 } 307 298 299 int rc = inetcfg_addr_get(addr_id, &ainfo); 300 if (rc != EOK) { 301 async_answer_0(callid, rc); 302 return; 303 } 304 305 uint32_t naddr_addr; 306 uint8_t naddr_bits; 307 rc = inet_naddr_pack(&ainfo.naddr, &naddr_addr, &naddr_bits); 308 if (rc != EOK) { 309 async_answer_0(callid, rc); 310 return; 311 } 312 308 313 sysarg_t retval = async_data_read_finalize(rcallid, ainfo.name, 309 314 min(max_size, str_size(ainfo.name))); 310 315 free(ainfo.name); 311 312 async_answer_3(callid, retval, ainfo.naddr.ipv4, ainfo.naddr.bits,313 ainfo.ilink);316 317 async_answer_3(callid, retval, (sysarg_t) naddr_addr, 318 (sysarg_t) naddr_bits, ainfo.ilink); 314 319 } 315 320 … … 476 481 ipc_call_t *call) 477 482 { 483 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_sroute_create_srv()"); 484 478 485 char *name; 486 int rc = async_data_write_accept((void **) &name, true, 0, LOC_NAME_MAXLEN, 487 0, NULL); 488 if (rc != EOK) { 489 async_answer_0(callid, rc); 490 return; 491 } 492 479 493 inet_naddr_t dest; 480 494 inet_addr_t router; 481 sysarg_t sroute_id; 482 int rc; 483 484 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_sroute_create_srv()"); 485 486 rc = async_data_write_accept((void **) &name, true, 0, LOC_NAME_MAXLEN, 487 0, NULL); 488 if (rc != EOK) { 489 async_answer_0(callid, rc); 490 return; 491 } 492 493 dest.ipv4 = IPC_GET_ARG1(*call); 494 dest.bits = IPC_GET_ARG2(*call); 495 router.ipv4 = IPC_GET_ARG3(*call); 496 497 sroute_id = 0; 495 496 inet_naddr_unpack(IPC_GET_ARG1(*call), IPC_GET_ARG2(*call), &dest); 497 inet_addr_unpack(IPC_GET_ARG3(*call), &router); 498 499 sysarg_t sroute_id = 0; 498 500 rc = inetcfg_sroute_create(name, &dest, &router, &sroute_id); 499 501 free(name); … … 516 518 static void inetcfg_sroute_get_srv(ipc_callid_t callid, ipc_call_t *call) 517 519 { 520 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_sroute_get_srv()"); 521 522 sysarg_t sroute_id = IPC_GET_ARG1(*call); 523 524 inet_sroute_info_t srinfo; 525 526 inet_naddr_any(&srinfo.dest); 527 inet_addr_any(&srinfo.router); 528 srinfo.name = NULL; 529 518 530 ipc_callid_t rcallid; 519 531 size_t max_size; 520 521 sysarg_t sroute_id;522 inet_sroute_info_t srinfo;523 int rc;524 525 sroute_id = IPC_GET_ARG1(*call);526 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_sroute_get_srv()");527 528 srinfo.dest.ipv4 = 0;529 srinfo.dest.bits = 0;530 srinfo.router.ipv4 = 0;531 srinfo.name = NULL;532 533 532 if (!async_data_read_receive(&rcallid, &max_size)) { 534 533 async_answer_0(rcallid, EREFUSED); … … 536 535 return; 537 536 } 538 539 rc = inetcfg_sroute_get(sroute_id, &srinfo); 540 if (rc != EOK) { 541 async_answer_0(callid, rc); 542 return; 543 } 544 537 538 int rc = inetcfg_sroute_get(sroute_id, &srinfo); 539 if (rc != EOK) { 540 async_answer_0(callid, rc); 541 return; 542 } 543 544 uint32_t dest_addr; 545 uint8_t dest_bits; 546 rc = inet_naddr_pack(&srinfo.dest, &dest_addr, &dest_bits); 547 if (rc != EOK) { 548 async_answer_0(callid, rc); 549 return; 550 } 551 552 uint32_t router_addr; 553 rc = inet_addr_pack(&srinfo.router, &router_addr); 554 if (rc != EOK) { 555 async_answer_0(callid, rc); 556 return; 557 } 558 545 559 sysarg_t retval = async_data_read_finalize(rcallid, srinfo.name, 546 560 min(max_size, str_size(srinfo.name))); 547 561 free(srinfo.name); 548 549 async_answer_3(callid, retval, srinfo.dest.ipv4, srinfo.dest.bits,550 srinfo.router.ipv4);562 563 async_answer_3(callid, retval, (sysarg_t) dest_addr, 564 (sysarg_t) dest_bits, (sysarg_t) router_addr); 551 565 } 552 566 -
uspace/srv/net/inetsrv/inetping.c
r19a4f73 ra2e3ee6 62 62 } 63 63 64 static int inetping_get_srcaddr(inetping_client_t *client, inet_addr_t *remote, 65 inet_addr_t *local) 66 { 67 return inet_get_srcaddr(remote, ICMP_TOS, local); 64 static int inetping_get_srcaddr(inetping_client_t *client, uint32_t remote, 65 uint32_t *local) 66 { 67 inet_addr_t remote_addr; 68 inet_addr_unpack(remote, &remote_addr); 69 70 inet_addr_t local_addr; 71 int rc = inet_get_srcaddr(&remote_addr, ICMP_TOS, &local_addr); 72 if (rc != EOK) 73 return rc; 74 75 return inet_addr_pack(&local_addr, local); 68 76 } 69 77 … … 82 90 exch = async_exchange_begin(client->sess); 83 91 84 aid_t req = async_send_3(exch, INETPING_EV_RECV, sdu->src.ipv4,85 sdu->dest.ipv4, sdu->seq_no, &answer);92 aid_t req = async_send_3(exch, INETPING_EV_RECV, (sysarg_t) sdu->src, 93 (sysarg_t) sdu->dest, sdu->seq_no, &answer); 86 94 int rc = async_data_write_start(exch, sdu->data, sdu->size); 87 95 async_exchange_end(exch); … … 116 124 } 117 125 118 sdu.src .ipv4= IPC_GET_ARG1(*call);119 sdu.dest .ipv4= IPC_GET_ARG2(*call);126 sdu.src = IPC_GET_ARG1(*call); 127 sdu.dest = IPC_GET_ARG2(*call); 120 128 sdu.seq_no = IPC_GET_ARG3(*call); 121 129 … … 129 137 ipc_callid_t callid, ipc_call_t *call) 130 138 { 131 inet_addr_t remote;132 inet_addr_t local;133 int rc;134 135 139 log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_get_srcaddr_srv()"); 136 137 remote.ipv4= IPC_GET_ARG1(*call);138 local.ipv4= 0;139 140 rc = inetping_get_srcaddr(client, &remote, &local);141 async_answer_1(callid, rc, local.ipv4);140 141 uint32_t remote = IPC_GET_ARG1(*call); 142 uint32_t local = 0; 143 144 int rc = inetping_get_srcaddr(client, remote, &local); 145 async_answer_1(callid, rc, (sysarg_t) local); 142 146 } 143 147 -
uspace/srv/net/inetsrv/inetping.h
r19a4f73 ra2e3ee6 38 38 #define INETPING_H_ 39 39 40 #include "inetsrv.h" 41 40 42 extern void inetping_conn(ipc_callid_t, ipc_call_t *, void *); 41 43 extern int inetping_recv(uint16_t, inetping_sdu_t *); -
uspace/srv/net/inetsrv/inetsrv.c
r19a4f73 ra2e3ee6 104 104 } 105 105 106 sroute->dest.ipv4 = 0; 107 sroute->dest.bits = 0; 108 sroute->router.ipv4 = (10 << 24) | (0 << 16) | (2 << 8) | 2; 106 inet_naddr(&sroute->dest, 0, 0, 0, 0, 0); 107 inet_addr(&sroute->router, 10, 0, 2, 2); 109 108 sroute->name = str_dup("default"); 110 109 inet_sroute_add(sroute); 111 110 112 rc = inet_link_discovery_start();111 rc = inet_link_discovery_start(); 113 112 if (rc != EOK) 114 113 return EEXIST; … … 194 193 195 194 /* Take source address from the address object */ 196 local->ipv4 = dir.aobj->naddr.ipv4;195 inet_naddr_addr(&dir.aobj->naddr, local); 197 196 return EOK; 198 197 } … … 201 200 ipc_call_t *call) 202 201 { 202 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srcaddr_srv()"); 203 203 204 inet_addr_t remote; 204 uint8_t tos; 205 inet_addr_unpack(IPC_GET_ARG1(*call), &remote); 206 uint8_t tos = IPC_GET_ARG2(*call); 207 205 208 inet_addr_t local; 206 int rc; 207 208 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srcaddr_srv()"); 209 210 remote.ipv4 = IPC_GET_ARG1(*call); 211 tos = IPC_GET_ARG2(*call); 212 local.ipv4 = 0; 213 214 rc = inet_get_srcaddr(&remote, tos, &local); 215 async_answer_1(callid, rc, local.ipv4); 209 int rc = inet_get_srcaddr(&remote, tos, &local); 210 if (rc != EOK) { 211 async_answer_0(callid, rc); 212 return; 213 } 214 215 uint32_t local_addr; 216 rc = inet_addr_pack(&local, &local_addr); 217 if (rc != EOK) { 218 async_answer_0(callid, rc); 219 return; 220 } 221 222 async_answer_1(callid, rc, (sysarg_t) local_addr); 216 223 } 217 224 … … 219 226 ipc_call_t *call) 220 227 { 228 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_send_srv()"); 229 221 230 inet_dgram_t dgram; 222 uint8_t ttl; 223 int df; 224 int rc; 225 226 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_send_srv()"); 227 228 dgram.src.ipv4 = IPC_GET_ARG1(*call); 229 dgram.dest.ipv4 = IPC_GET_ARG2(*call); 231 232 inet_addr_unpack(IPC_GET_ARG1(*call), &dgram.src); 233 inet_addr_unpack(IPC_GET_ARG2(*call), &dgram.dest); 230 234 dgram.tos = IPC_GET_ARG3(*call); 231 ttl = IPC_GET_ARG4(*call); 232 df = IPC_GET_ARG5(*call); 233 234 rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, &dgram.size); 235 236 uint8_t ttl = IPC_GET_ARG4(*call); 237 int df = IPC_GET_ARG5(*call); 238 239 int rc = async_data_write_accept(&dgram.data, false, 0, 0, 0, 240 &dgram.size); 235 241 if (rc != EOK) { 236 242 async_answer_0(callid, rc); 237 243 return; 238 244 } 239 245 240 246 rc = inet_send(client, &dgram, client->protocol, ttl, df); 241 247 242 248 free(dgram.data); 243 249 async_answer_0(callid, rc); … … 365 371 int inet_ev_recv(inet_client_t *client, inet_dgram_t *dgram) 366 372 { 373 uint32_t src; 374 int rc = inet_addr_pack(&dgram->src, &src); 375 if (rc != EOK) 376 return rc; 377 378 uint32_t dest; 379 rc = inet_addr_pack(&dgram->dest, &dest); 380 if (rc != EOK) 381 return rc; 382 367 383 async_exch_t *exch = async_exchange_begin(client->sess); 368 384 369 385 ipc_call_t answer; 370 aid_t req = async_send_3(exch, INET_EV_RECV, dgram->src.ipv4,371 dgram->dest.ipv4, dgram->tos, &answer);372 intrc = async_data_write_start(exch, dgram->data, dgram->size);386 aid_t req = async_send_3(exch, INET_EV_RECV, (sysarg_t) src, 387 (sysarg_t) dest, dgram->tos, &answer); 388 rc = async_data_write_start(exch, dgram->data, dgram->size); 373 389 async_exchange_end(exch); 374 390 375 391 if (rc != EOK) { 376 392 async_forget(req); 377 393 return rc; 378 394 } 379 395 380 396 sysarg_t retval; 381 397 async_wait_for(req, &retval); 382 398 if (retval != EOK) 383 399 return retval; 384 400 385 401 return EOK; 386 402 } -
uspace/srv/net/inetsrv/inetsrv.h
r19a4f73 ra2e3ee6 172 172 173 173 typedef struct { 174 inet_addr_t src;175 inet_addr_t dest;174 uint32_t src; 175 uint32_t dest; 176 176 uint16_t seq_no; 177 177 void *data; -
uspace/srv/net/inetsrv/pdu.c
r19a4f73 ra2e3ee6 106 106 void **rdata, size_t *rsize, size_t *roffs) 107 107 { 108 void *data; 109 size_t size; 110 ip_header_t *hdr; 111 size_t hdr_size; 112 size_t data_offs; 113 uint16_t chksum; 114 uint16_t ident; 115 uint16_t flags_foff; 116 uint16_t foff; 117 size_t fragoff_limit; 118 size_t xfer_size; 119 size_t spc_avail; 120 size_t rem_offs; 121 108 uint32_t src_addr; 109 int rc = inet_addr_pack(&packet->src, &src_addr); 110 if (rc != EOK) 111 return rc; 112 113 uint32_t dest_addr; 114 rc = inet_addr_pack(&packet->dest, &dest_addr); 115 if (rc != EOK) 116 return rc; 117 122 118 /* Upper bound for fragment offset field */ 123 fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l);124 119 size_t fragoff_limit = 1 << (FF_FRAGOFF_h - FF_FRAGOFF_l); 120 125 121 /* Verify that total size of datagram is within reasonable bounds */ 126 122 if (offs + packet->size > FRAG_OFFS_UNIT * fragoff_limit) 127 123 return ELIMIT; 128 129 hdr_size = sizeof(ip_header_t);130 data_offs = ROUND_UP(hdr_size, 4);131 124 125 size_t hdr_size = sizeof(ip_header_t); 126 size_t data_offs = ROUND_UP(hdr_size, 4); 127 132 128 assert(offs % FRAG_OFFS_UNIT == 0); 133 129 assert(offs / FRAG_OFFS_UNIT < fragoff_limit); 134 130 135 131 /* Value for the fragment offset field */ 136 foff = offs / FRAG_OFFS_UNIT;137 132 uint16_t foff = offs / FRAG_OFFS_UNIT; 133 138 134 if (hdr_size >= mtu) 139 135 return EINVAL; 140 136 141 137 /* Amount of space in the PDU available for payload */ 142 s pc_avail = mtu - hdr_size;138 size_t spc_avail = mtu - hdr_size; 143 139 spc_avail -= (spc_avail % FRAG_OFFS_UNIT); 144 140 145 141 /* Amount of data (payload) to transfer */ 146 xfer_size = min(packet->size - offs, spc_avail);147 142 size_t xfer_size = min(packet->size - offs, spc_avail); 143 148 144 /* Total PDU size */ 149 size = hdr_size + xfer_size;150 145 size_t size = hdr_size + xfer_size; 146 151 147 /* Offset of remaining payload */ 152 rem_offs = offs + xfer_size;153 148 size_t rem_offs = offs + xfer_size; 149 154 150 /* Flags */ 155 flags_foff =151 uint16_t flags_foff = 156 152 (packet->df ? BIT_V(uint16_t, FF_FLAG_DF) : 0) + 157 153 (rem_offs < packet->size ? BIT_V(uint16_t, FF_FLAG_MF) : 0) + 158 154 (foff << FF_FRAGOFF_l); 159 160 data = calloc(size, 1);155 156 void *data = calloc(size, 1); 161 157 if (data == NULL) 162 158 return ENOMEM; 163 159 164 160 /* Allocate identifier */ 165 161 fibril_mutex_lock(&ip_ident_lock); 166 ident = ++ip_ident;162 uint16_t ident = ++ip_ident; 167 163 fibril_mutex_unlock(&ip_ident_lock); 168 164 169 165 /* Encode header fields */ 170 hdr = (ip_header_t *)data; 166 ip_header_t *hdr = (ip_header_t *) data; 167 171 168 hdr->ver_ihl = (4 << VI_VERSION_l) | (hdr_size / sizeof(uint32_t)); 172 169 hdr->tos = packet->tos; … … 177 174 hdr->proto = packet->proto; 178 175 hdr->chksum = 0; 179 hdr->src_addr = host2uint32_t_be( packet->src.ipv4);180 hdr->dest_addr = host2uint32_t_be( packet->dest.ipv4);181 176 hdr->src_addr = host2uint32_t_be(src_addr); 177 hdr->dest_addr = host2uint32_t_be(dest_addr); 178 182 179 /* Compute checksum */ 183 chksum = inet_checksum_calc(INET_CHECKSUM_INIT, (void *)hdr, hdr_size); 180 uint16_t chksum = inet_checksum_calc(INET_CHECKSUM_INIT, (void *) hdr, 181 hdr_size); 184 182 hdr->chksum = host2uint16_t_be(chksum); 185 183 186 184 /* Copy payload */ 187 memcpy((uint8_t *) data + data_offs, packet->data + offs, xfer_size);188 185 memcpy((uint8_t *) data + data_offs, packet->data + offs, xfer_size); 186 189 187 *rdata = data; 190 188 *rsize = size; 191 189 *roffs = rem_offs; 192 190 193 191 return EOK; 194 192 } … … 238 236 /* XXX Checksum */ 239 237 240 packet->src.ipv4 = uint32_t_be2host(hdr->src_addr);241 packet->dest.ipv4 = uint32_t_be2host(hdr->dest_addr);238 inet_addr_unpack(uint32_t_be2host(hdr->src_addr), &packet->src); 239 inet_addr_unpack(uint32_t_be2host(hdr->dest_addr), &packet->dest); 242 240 packet->tos = hdr->tos; 243 241 packet->proto = hdr->proto; -
uspace/srv/net/inetsrv/reass.c
r19a4f73 ra2e3ee6 139 139 dgram_link); 140 140 141 if ( f1->packet.src.ipv4 == packet->src.ipv4&&142 f1->packet.dest.ipv4 == packet->dest.ipv4&&143 f1->packet.proto == packet->proto&&144 f1->packet.ident == packet->ident) {141 if ((inet_addr_compare(&f1->packet.src, &packet->src)) && 142 (inet_addr_compare(&f1->packet.dest, &packet->dest)) && 143 (f1->packet.proto == packet->proto) && 144 (f1->packet.ident == packet->ident)) { 145 145 /* Match */ 146 146 return rdg; -
uspace/srv/net/inetsrv/sroute.c
r19a4f73 ra2e3ee6 97 97 inet_sroute_t *inet_sroute_find(inet_addr_t *addr) 98 98 { 99 uint32_t mask; 100 inet_sroute_t *best; 101 102 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find(%x)", (unsigned)addr->ipv4); 103 104 fibril_mutex_lock(&sroute_list_lock); 105 106 best = NULL; 107 108 list_foreach(sroute_list, link) { 109 inet_sroute_t *sroute = list_get_instance(link, 110 inet_sroute_t, sroute_list); 111 99 uint32_t addr_addr; 100 int rc = inet_addr_pack(addr, &addr_addr); 101 if (rc != EOK) 102 return NULL; 103 104 inet_sroute_t *best = NULL; 105 uint8_t best_bits = 0; 106 107 fibril_mutex_lock(&sroute_list_lock); 108 109 list_foreach(sroute_list, link) { 110 inet_sroute_t *sroute = list_get_instance(link, 111 inet_sroute_t, sroute_list); 112 113 uint32_t dest_addr; 114 uint8_t dest_bits; 115 rc = inet_naddr_pack(&sroute->dest, &dest_addr, &dest_bits); 116 if (rc != EOK) 117 continue; 118 112 119 /* Look for the most specific route */ 113 if ( best != NULL && best->dest.bits >= sroute->dest.bits)120 if ((best != NULL) && (best_bits >= dest_bits)) 114 121 continue; 115 116 mask = inet_netmask(sroute->dest.bits); 117 if ((sroute->dest.ipv4 & mask) == (addr->ipv4 & mask)) { 118 fibril_mutex_unlock(&sroute_list_lock); 119 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: found %p", 122 123 uint32_t mask = inet_netmask(dest_bits); 124 if ((dest_addr & mask) == (addr_addr & mask)) { 125 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: found candidate %p", 120 126 sroute); 121 return sroute; 127 128 best = sroute; 129 best_bits = dest_bits; 122 130 } 123 131 } 124 125 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: Not found"); 126 fibril_mutex_unlock(&sroute_list_lock); 127 128 return NULL; 132 133 if (best == NULL) 134 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: Not found"); 135 136 fibril_mutex_unlock(&sroute_list_lock); 137 138 return best; 129 139 } 130 140
Note:
See TracChangeset
for help on using the changeset viewer.
