1 2 #include <stdint.h> 3 #include <talloc.h> 4 5 #include "services.h" 6 #include "uqmid.h" 7 8 #include "ctrl.h" 9 #include "qmi-message.h" 10 11 static void uqmi_ctrl_request_clientid_cb(struct qmi_service *ctrl, struct qmi_request *req, struct qmi_msg *msg) 12 { 13 struct qmi_ctl_allocate_cid_response res; 14 struct qmi_service *service; 15 if (!msg) 16 return; 17 18 qmi_parse_ctl_allocate_cid_response(msg, &res); 19 service = uqmi_service_find(ctrl->qmi, res.data.allocation_info.service); 20 if (!service) { 21 /* FIXME: error log("Can't find the service for the allocated CID") */ 22 return; 23 } 24 25 uqmi_service_get_client_id_cb(service, res.data.allocation_info.cid); 26 } 27 28 int uqmi_ctrl_request_clientid(struct qmi_service *service) 29 { 30 struct qmi_service *ctrl = service->qmi->ctrl; 31 struct qmi_request *req = talloc_zero(ctrl, struct qmi_request); 32 struct qmi_msg *msg = talloc_zero_size(req, 128); 33 34 35 struct qmi_ctl_allocate_cid_request creq = { 36 QMI_INIT(service, service->service) 37 }; 38 qmi_set_ctl_allocate_cid_request(msg, &creq); 39 req->cb = uqmi_ctrl_request_clientid_cb; 40 req->msg = msg; 41 42 return uqmi_service_send_msg(ctrl, req); 43 } 44 45 static void uqmi_ctrl_release_clientid_cb(struct qmi_service *ctrl, struct qmi_request *req, struct qmi_msg *msg) 46 { 47 struct qmi_ctl_release_cid_response res; 48 struct qmi_service *service; 49 50 if (!msg) 51 return; 52 53 if (qmi_parse_ctl_release_cid_response(msg, &res)) { 54 /* error_log("Couldn't parse release cid response") */ 55 return; 56 } 57 58 if (!res.set.release_info) 59 return; 60 61 service = uqmi_service_find(ctrl->qmi, res.data.release_info.service); 62 if (service && service->service) 63 uqmi_service_close_cb(service); 64 } 65 66 int uqmi_ctrl_release_clientid(struct qmi_service *service) 67 { 68 struct qmi_service *ctrl = service->qmi->ctrl; 69 struct qmi_request *req = talloc_zero(ctrl, struct qmi_request); 70 struct qmi_msg *msg = talloc_zero_size(req, 128); 71 72 struct qmi_ctl_release_cid_request creq = { 73 QMI_INIT_SEQUENCE(release_info, 74 .service = service->service, 75 .cid = service->client_id, 76 ) 77 }; 78 qmi_set_ctl_release_cid_request(msg, &creq); 79 req->msg = msg; 80 req->cb = uqmi_ctrl_release_clientid_cb; 81 82 return uqmi_service_send_msg(ctrl, req); 83 } 84 85 struct qmi_service *uqmi_ctrl_generate(struct qmi_dev *qmi) 86 { 87 qmi->ctrl = uqmi_service_create(qmi, 0); 88 qmi->ctrl->client_id = 0; 89 qmi->ctrl->state = SERVICE_READY; 90 91 return qmi->ctrl; 92 } 93 94
This page was automatically generated by LXR 0.3.1. • OpenWrt