Esempio n. 1
0
__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);
}
Esempio n. 7
0
__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;
}
Esempio n. 8
0
__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;
}
Esempio n. 9
0
__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;
}