Changes in uspace/srv/net/inetsrv/inet_link.c [417a2ba1:b8b1adb1] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/inetsrv/inet_link.c
r417a2ba1 rb8b1adb1 43 43 #include <stdlib.h> 44 44 #include <str.h> 45 #include <net/socket_codes.h> 45 46 #include "addrobj.h" 46 47 #include "inetsrv.h" … … 54 55 static uint16_t ip_ident = 0; 55 56 56 static int inet_ iplink_recv(iplink_t *, iplink_recv_sdu_t *, ip_ver_t);57 static in et_link_t *inet_link_get_by_id_locked(sysarg_t);57 static int inet_link_open(service_id_t); 58 static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, uint16_t); 58 59 59 60 static iplink_ev_ops_t inet_iplink_ev_ops = { … … 61 62 }; 62 63 63 static LIST_INITIALIZE(inet_link s);64 static FIBRIL_MUTEX_INITIALIZE(inet_ links_lock);64 static LIST_INITIALIZE(inet_link_list); 65 static FIBRIL_MUTEX_INITIALIZE(inet_discovery_lock); 65 66 66 67 static addr128_t link_local_node_ip = … … 80 81 } 81 82 82 static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, ip_ver_t ver)83 static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, uint16_t af) 83 84 { 84 85 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()"); … … 87 88 inet_packet_t packet; 88 89 89 switch ( ver) {90 case ip_v4:90 switch (af) { 91 case AF_INET: 91 92 rc = inet_pdu_decode(sdu->data, sdu->size, &packet); 92 93 break; 93 case ip_v6:94 case AF_INET6: 94 95 rc = inet_pdu_decode6(sdu->data, sdu->size, &packet); 95 96 break; 96 97 default: 97 log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid IP version");98 log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid address family"); 98 99 return EINVAL; 99 100 } … … 112 113 } 113 114 115 static int inet_link_check_new(void) 116 { 117 bool already_known; 118 category_id_t iplink_cat; 119 service_id_t *svcs; 120 size_t count, i; 121 int rc; 122 123 fibril_mutex_lock(&inet_discovery_lock); 124 125 rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING); 126 if (rc != EOK) { 127 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed resolving category 'iplink'."); 128 fibril_mutex_unlock(&inet_discovery_lock); 129 return ENOENT; 130 } 131 132 rc = loc_category_get_svcs(iplink_cat, &svcs, &count); 133 if (rc != EOK) { 134 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed getting list of IP links."); 135 fibril_mutex_unlock(&inet_discovery_lock); 136 return EIO; 137 } 138 139 for (i = 0; i < count; i++) { 140 already_known = false; 141 142 list_foreach(inet_link_list, link_list, inet_link_t, ilink) { 143 if (ilink->svc_id == svcs[i]) { 144 already_known = true; 145 break; 146 } 147 } 148 149 if (!already_known) { 150 log_msg(LOG_DEFAULT, LVL_DEBUG, "Found IP link '%lu'", 151 (unsigned long) svcs[i]); 152 rc = inet_link_open(svcs[i]); 153 if (rc != EOK) 154 log_msg(LOG_DEFAULT, LVL_ERROR, "Could not open IP link."); 155 } 156 } 157 158 fibril_mutex_unlock(&inet_discovery_lock); 159 return EOK; 160 } 161 114 162 static inet_link_t *inet_link_new(void) 115 163 { … … 135 183 } 136 184 137 int inet_link_open(service_id_t sid)185 static int inet_link_open(service_id_t sid) 138 186 { 139 187 inet_link_t *ilink; … … 183 231 184 232 log_msg(LOG_DEFAULT, LVL_DEBUG, "Opened IP link '%s'", ilink->svc_name); 185 186 fibril_mutex_lock(&inet_links_lock); 187 188 if (inet_link_get_by_id_locked(sid) != NULL) { 189 fibril_mutex_unlock(&inet_links_lock); 190 log_msg(LOG_DEFAULT, LVL_DEBUG, "Link %zu already open", 191 sid); 192 rc = EEXIST; 193 goto error; 194 } 195 196 list_append(&ilink->link_list, &inet_links); 197 fibril_mutex_unlock(&inet_links_lock); 233 list_append(&ilink->link_list, &inet_link_list); 198 234 199 235 inet_addrobj_t *addr = NULL; … … 263 299 } 264 300 265 log_msg(LOG_DEFAULT, LVL_DEBUG, "Configured link '%s'.", ilink->svc_name);266 301 return EOK; 267 302 … … 272 307 inet_link_delete(ilink); 273 308 return rc; 309 } 310 311 static void inet_link_cat_change_cb(void) 312 { 313 (void) inet_link_check_new(); 314 } 315 316 int inet_link_discovery_start(void) 317 { 318 int rc; 319 320 rc = loc_register_cat_change_cb(inet_link_cat_change_cb); 321 if (rc != EOK) { 322 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering callback for IP link " 323 "discovery (%d).", rc); 324 return rc; 325 } 326 327 return inet_link_check_new(); 274 328 } 275 329 … … 293 347 { 294 348 addr32_t src_v4; 295 ip_ver_t src_ver= inet_addr_get(&dgram->src, &src_v4, NULL);296 if (src_ ver != ip_v4)349 uint16_t src_af = inet_addr_get(&dgram->src, &src_v4, NULL); 350 if (src_af != AF_INET) 297 351 return EINVAL; 298 352 299 353 addr32_t dest_v4; 300 ip_ver_t dest_ver= inet_addr_get(&dgram->dest, &dest_v4, NULL);301 if (dest_ ver != ip_v4)354 uint16_t dest_af = inet_addr_get(&dgram->dest, &dest_v4, NULL); 355 if (dest_af != AF_INET) 302 356 return EINVAL; 303 357 … … 368 422 { 369 423 addr128_t src_v6; 370 ip_ver_t src_ver= inet_addr_get(&dgram->src, NULL, &src_v6);371 if (src_ ver != ip_v6)424 uint16_t src_af = inet_addr_get(&dgram->src, NULL, &src_v6); 425 if (src_af != AF_INET6) 372 426 return EINVAL; 373 427 374 428 addr128_t dest_v6; 375 ip_ver_t dest_ver= inet_addr_get(&dgram->dest, NULL, &dest_v6);376 if (dest_ ver != ip_v6)429 uint16_t dest_af = inet_addr_get(&dgram->dest, NULL, &dest_v6); 430 if (dest_af != AF_INET6) 377 431 return EINVAL; 378 432 … … 424 478 } 425 479 426 static inet_link_t *inet_link_get_by_id_locked(sysarg_t link_id) 427 { 428 assert(fibril_mutex_is_locked(&inet_links_lock)); 429 430 list_foreach(inet_links, link_list, inet_link_t, ilink) { 431 if (ilink->svc_id == link_id) 480 inet_link_t *inet_link_get_by_id(sysarg_t link_id) 481 { 482 fibril_mutex_lock(&inet_discovery_lock); 483 484 list_foreach(inet_link_list, link_list, inet_link_t, ilink) { 485 if (ilink->svc_id == link_id) { 486 fibril_mutex_unlock(&inet_discovery_lock); 432 487 return ilink; 433 } 434 488 } 489 } 490 491 fibril_mutex_unlock(&inet_discovery_lock); 435 492 return NULL; 436 }437 438 inet_link_t *inet_link_get_by_id(sysarg_t link_id)439 {440 inet_link_t *ilink;441 442 fibril_mutex_lock(&inet_links_lock);443 ilink = inet_link_get_by_id_locked(link_id);444 fibril_mutex_unlock(&inet_links_lock);445 446 return ilink;447 493 } 448 494 … … 453 499 size_t count, i; 454 500 455 fibril_mutex_lock(&inet_ links_lock);456 count = list_count(&inet_link s);501 fibril_mutex_lock(&inet_discovery_lock); 502 count = list_count(&inet_link_list); 457 503 458 504 id_list = calloc(count, sizeof(sysarg_t)); 459 505 if (id_list == NULL) { 460 fibril_mutex_unlock(&inet_ links_lock);506 fibril_mutex_unlock(&inet_discovery_lock); 461 507 return ENOMEM; 462 508 } 463 509 464 510 i = 0; 465 list_foreach(inet_link s, link_list, inet_link_t, ilink) {511 list_foreach(inet_link_list, link_list, inet_link_t, ilink) { 466 512 id_list[i++] = ilink->svc_id; 467 513 log_msg(LOG_DEFAULT, LVL_NOTE, "add link to list"); 468 514 } 469 515 470 fibril_mutex_unlock(&inet_ links_lock);516 fibril_mutex_unlock(&inet_discovery_lock); 471 517 472 518 log_msg(LOG_DEFAULT, LVL_NOTE, "return %zu links", count);
Note:
See TracChangeset
for help on using the changeset viewer.