__private_extern__ void enable_service(int argc, char **argv) { SCNetworkServiceRef service; if (argc == 1) { service = _find_service(argv[0]); } else { if (net_service != NULL) { service = net_service; } else { SCPrint(TRUE, stdout, CFSTR("service not selected\n")); return; } } if (service == NULL) { return; } if (!SCNetworkServiceSetEnabled(service, TRUE)) { SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError())); return; } _prefs_changed = TRUE; return; }
int _cfw_deregister_service(cfw_handle_t handle, service_t * svc) { int index; #ifdef SVC_MANAGER_DEBUG pr_debug(LOG_MODULE_CFW, "%s", __func__); #endif if ((index = _find_service(svc->service_id)) == -1) { pr_error(LOG_MODULE_CFW, "Error: service %d was not registered", svc->service_id); return -1; } registered_service_count--; services[index] = NULL; return 0; }
int _cfw_register_service(service_t * svc) { pr_debug(LOG_MODULE_MAIN, "%s: %p id:%d port: %d\n", __func__, svc, svc->service_id, svc->port_id); int flags = interrupt_lock(); if (_find_service(svc->service_id) != -1) { interrupt_unlock(flags); pr_error(LOG_MODULE_MAIN, "Error: service %d already registered\n", svc->service_id); return -1; } _add_service(svc); notify_service_avail(svc->service_id); interrupt_unlock(flags); return 0; }
/** * \deprecated * Only accepted usage is tests */ int cfw_service_registered(int service_id) { return (_find_service(service_id) != -1); }
service_t * cfw_get_service(int service_id) { int index; index = _find_service(service_id); return (index == -1) ? NULL : services[index]; }
void internal_handle_message(struct cfw_message * msg, void * param) { int free_msg = 1; /* by default free message */ switch (CFW_MESSAGE_ID(msg)) { case MSG_ID_CFW_ALLOC_PORT: { //TODO: Enable this, currently relies on sync IPC API. //_port_t * port = cfw_port_alloc(NULL); //cfw_port_set_handler(port, send_message_ipc, NULL); break; } case MSG_ID_CFW_OPEN_SERVICE: { cfw_open_conn_req_msg_t * req = (cfw_open_conn_req_msg_t *) msg; service_t * svc = cfw_get_service(req->service_id); if (svc == NULL) { pr_error(LOG_MODULE_MAIN, "try to open non registered service %d", req->service_id); cfw_open_conn_rsp_msg_t * resp = (cfw_open_conn_rsp_msg_t *) cfw_alloc_rsp_msg(msg, MSG_ID_CFW_OPEN_SERVICE, sizeof(*resp)); resp->rsp_header.status = E_OS_ERR_UNKNOWN; cfw_send_message(resp); break; } uint8_t svc_cpu_id = port_get_cpu_id(svc->port_id); if (svc_cpu_id != get_cpu_id()) { #ifdef INFRA_MULTI_CPU_SUPPORT pr_debug(LOG_MODULE_MAIN, "forward open service to proxy"); CFW_MESSAGE_DST(msg) = proxies[svc_cpu_id].port_id; cfw_send_message(msg); free_msg = 0; /* the lower layers will free it! */ #else pr_error(LOG_MODULE_MAIN, "incorrect cpu_id settings, single cpu!"); #endif } else { conn_handle_t * conn_handle; conn_handle = (conn_handle_t *) balloc(sizeof(*conn_handle), NULL ); conn_handle->client_port = CFW_MESSAGE_SRC(msg); conn_handle->priv_data = NULL; conn_handle->svc = svc; conn_handle->client_handle = req->client_handle; /* For OPEN_SERVICE, conn is not know yet, it is just alloc'ed. * set it here.*/ req->header.conn = conn_handle; if (svc->client_connected != NULL && svc_cpu_id == get_cpu_id()) svc->client_connected(conn_handle); cfw_open_conn_rsp_msg_t * resp = (cfw_open_conn_rsp_msg_t *) cfw_alloc_rsp_msg(msg, MSG_ID_CFW_OPEN_SERVICE, sizeof(*resp)); resp->port = svc->port_id; resp->cpu_id = svc_cpu_id; #ifdef SVC_MANAGER_DEBUG pr_debug(LOG_MODULE_CFW, "OPEN_SERVICE: %d, svc:%p port:%d", req->service_id, svc, svc->port_id); #endif resp->svc_server_handle = conn_handle; resp->client_handle = req->client_handle; cfw_send_message(resp); } break; } case MSG_ID_CFW_CLOSE_SERVICE: { cfw_close_conn_req_msg_t * req = (cfw_close_conn_req_msg_t*) msg; service_t * svc = cfw_get_service(req->service_id); if (svc == NULL) { pr_debug(LOG_MODULE_MAIN, "try close unregistered service %d", req->service_id); cfw_close_conn_rsp_msg_t * resp = (cfw_close_conn_rsp_msg_t *) cfw_alloc_rsp_msg(msg, MSG_ID_CFW_CLOSE_SERVICE, sizeof(*resp)); resp->rsp_header.status = E_OS_ERR_UNKNOWN; cfw_send_message(resp); break; } uint8_t svc_cpu_id = port_get_cpu_id(svc->port_id); if (svc_cpu_id != get_cpu_id()) { #ifdef INFRA_MULTI_CPU_SUPPORT CFW_MESSAGE_DST(msg) = proxies[svc_cpu_id].port_id; cfw_send_message(msg); free_msg=0; #else pr_error(LOG_MODULE_MAIN, "incorrect cpu_id!"); #endif } else { cfw_close_conn_rsp_msg_t * resp = (cfw_close_conn_rsp_msg_t *) cfw_alloc_rsp_msg(msg, MSG_ID_CFW_CLOSE_SERVICE, sizeof(*resp)); conn_handle_t * conn = (conn_handle_t*) msg->conn; if (conn != NULL && conn->svc != NULL && conn->svc->client_disconnected != NULL ) conn->svc->client_disconnected(conn); cfw_send_message(resp); /* Free server-side conn */ bfree(conn); } break; } case MSG_ID_CFW_REGISTER_EVT: { int * params = (int *) &msg[1]; int i; for (i = 0; i < params[0]; i++) { _cfw_register_event((conn_handle_t*) msg->conn, params[i + 1]); } cfw_register_evt_rsp_msg_t * resp = (cfw_register_evt_rsp_msg_t *) cfw_alloc_rsp_msg(msg, MSG_ID_CFW_REGISTER_EVT, (sizeof(*resp))); conn_handle_t * conn = (conn_handle_t*) msg->conn; if (conn != NULL && conn->svc != NULL && conn->svc->registered_events_changed != NULL ) conn->svc->registered_events_changed(conn); cfw_send_message(resp); break; } case MSG_ID_CFW_REGISTER_SVC_AVAIL: { bool already_avail = true; cfw_register_svc_avail_req_msg_t * req = (cfw_register_svc_avail_req_msg_t *) msg; int flags = interrupt_lock(); if (_find_service(req->service_id) == -1) { add_service_avail_listener(CFW_MESSAGE_SRC(msg), req->service_id, msg->priv); already_avail = false; } interrupt_unlock(flags); cfw_register_svc_avail_rsp_msg_t * resp = (cfw_register_svc_avail_rsp_msg_t *) cfw_alloc_rsp_msg(msg, MSG_ID_CFW_REGISTER_SVC_AVAIL, (sizeof(*resp))); cfw_send_message(resp); if (already_avail) { send_service_avail_evt(req->service_id, CFW_MESSAGE_SRC(msg), msg->priv); } break; } default: pr_warning(LOG_MODULE_CFW, "%s: unhandled message id: %x", __func__, CFW_MESSAGE_ID(msg)); break; } if (free_msg) cfw_msg_free(msg); }
__private_extern__ void show_service(int argc, char **argv) { SCNetworkInterfaceRef interface; CFArrayRef protocols; SCNetworkServiceRef service; CFStringRef serviceName; SCNetworkServicePrimaryRank serviceRank; if (argc == 1) { service = _find_service(argv[0]); } else { if (net_service != NULL) { service = net_service; } else { SCPrint(TRUE, stdout, CFSTR("service not selected\n")); return; } } if (service == NULL) { return; } SCPrint(TRUE, stdout, CFSTR("service id = %@\n"), SCNetworkServiceGetServiceID(service)); serviceName = SCNetworkServiceGetName(service); SCPrint(TRUE, stdout, CFSTR("name = %@\n"), (serviceName != NULL) ? serviceName : CFSTR("")); serviceRank = SCNetworkServiceGetPrimaryRank(service); switch (serviceRank) { case kSCNetworkServicePrimaryRankDefault : // nothing to report break; case kSCNetworkServicePrimaryRankFirst : SCPrint(TRUE, stdout, CFSTR("primary rank = FIRST\n")); break; case kSCNetworkServicePrimaryRankLast : SCPrint(TRUE, stdout, CFSTR("primary rank = LAST\n")); break; case kSCNetworkServicePrimaryRankNever : SCPrint(TRUE, stdout, CFSTR("primary rank = NEVER\n")); break; case kSCNetworkServicePrimaryRankScoped : SCPrint(TRUE, stdout, CFSTR("primary rank = SCOPED\n")); break; default : SCPrint(TRUE, stdout, CFSTR("primary rank = %d\n"), serviceRank); break; } interface = SCNetworkServiceGetInterface(service); if (interface != NULL) { CFStringRef interfaceName; interfaceName = SCNetworkInterfaceGetLocalizedDisplayName(interface); if (interfaceName != NULL) { CFRetain(interfaceName); } else { interfaceName = _interface_description(interface); } if (interfaceName != NULL) { SCPrint(TRUE, stdout, CFSTR("interface = %@\n"), interfaceName); CFRelease(interfaceName); } } else { SCPrint(TRUE, stdout, CFSTR("\n No interface!\n\n")); } protocols = SCNetworkServiceCopyProtocols(service); if (protocols != NULL) { CFIndex n; n = CFArrayGetCount(protocols); if (n > 1) { CFMutableArrayRef sorted; sorted = CFArrayCreateMutableCopy(NULL, 0, protocols); CFArraySortValues(sorted, CFRangeMake(0, n), _compare_protocols, NULL); CFRelease(protocols); protocols = sorted; } if (n > 0) { CFIndex i; SCPrint(TRUE, stdout, CFSTR("configured protocols = ")); for (i = 0; i < n; i++) { SCNetworkProtocolRef protocol; protocol = CFArrayGetValueAtIndex(protocols, i); SCPrint(TRUE, stdout, CFSTR("%s%@"), (i == 0) ? "" : ", ", SCNetworkProtocolGetProtocolType(protocol)); } SCPrint(TRUE, stdout, CFSTR("\n")); __show_service_protocols(service, " ", FALSE); } else { SCPrint(TRUE, stdout, CFSTR("no configured protocols\n")); } CFRelease(protocols); } if (_sc_debug) { SCPrint(TRUE, stdout, CFSTR("\n%@\n"), service); } return; }
__private_extern__ void select_service(int argc, char **argv) { SCNetworkInterfaceRef interface; SCNetworkServiceRef service; CFStringRef serviceName; service = _find_service(argv[0]); if (service == NULL) { return; } if (net_service != NULL) CFRelease(net_service); net_service = CFRetain(service); serviceName = SCNetworkServiceGetName(service); if (serviceName != NULL) { SCPrint(TRUE, stdout, CFSTR("service \"%@\" selected\n"), serviceName); } else { SCPrint(TRUE, stdout, CFSTR("service ID \"%@\" selected\n"), SCNetworkServiceGetServiceID(service)); } interface = SCNetworkServiceGetInterface(service); if (interface != NULL) { CFStringRef interfaceName; if (net_interface != NULL) CFRelease(net_interface); net_interface = CFRetain(interface); interfaceName = SCNetworkInterfaceGetLocalizedDisplayName(interface); if (interfaceName == NULL) { interfaceName = SCNetworkInterfaceGetBSDName(interface); } if (interfaceName == NULL) { interfaceName = SCNetworkInterfaceGetInterfaceType(interface); } SCPrint(TRUE, stdout, CFSTR("& interface \"%@\" selected\n"), interfaceName); } else { if (net_interface != NULL) { CFRelease(net_interface); net_interface = NULL; SCPrint(TRUE, stdout, CFSTR("& no interface selected\n")); } } if (protocols != NULL) { CFRelease(protocols); protocols = NULL; } if (net_protocol != NULL) { CFRelease(net_protocol); net_protocol = NULL; SCPrint(TRUE, stdout, CFSTR("& no protocol selected\n")); } return; }
__private_extern__ void remove_service(int argc, char **argv) { SCNetworkServiceRef service = NULL; CFStringRef serviceName; if (argc == 1) { service = _find_service(argv[0]); } else { if (net_service != NULL) { service = net_service; } } if (service == NULL) { return; } CFRetain(service); if (!SCNetworkServiceRemove(service)) { SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError())); goto done; } _prefs_changed = TRUE; serviceName = SCNetworkServiceGetName(service); if (serviceName != NULL) { SCPrint(TRUE, stdout, CFSTR("service \"%@\" removed\n"), serviceName); } else { SCPrint(TRUE, stdout, CFSTR("service ID \"%@\" removed\n"), SCNetworkServiceGetServiceID(service)); } if ((net_service != NULL) && CFEqual(service, net_service)) { CFRelease(net_service); net_service = NULL; SCPrint(TRUE, stdout, CFSTR("& no service selected\n")); if (protocols != NULL) { CFRelease(protocols); protocols = NULL; } if (net_protocol != NULL) { CFRelease(net_protocol); net_protocol = NULL; SCPrint(TRUE, stdout, CFSTR("& no protocol selected\n")); } if (net_interface != NULL) { CFRelease(net_interface); net_interface = NULL; SCPrint(TRUE, stdout, CFSTR("& no interface selected\n")); } } if (services != NULL) { CFRelease(services); services = NULL; } done : CFRelease(service); return; }