• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/uqmi/uqmid/ctrl.c

  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