10 #include <libubox/uloop.h>
14 uint8_t mbim_buffer[MBIM_BUFFER_SIZE];
15 static struct uloop_fd mbim_fd;
16 static uint32_t expected;
19 static void mbim_msg_tout_cb(struct uloop_timeout *t)
21 fprintf(stderr, "ERROR: mbim message timeout\n");
25 static struct uloop_timeout tout = {
26 .cb = mbim_msg_tout_cb,
32 struct mbim_message_header *hdr = (struct mbim_message_header *) mbim_buffer;
35 if (le32toh(hdr->length) > MBIM_BUFFER_SIZE) {
36 fprintf(stderr, "message too big %d\n", le32toh(hdr->length));
41 fprintf(stderr, "sending (%d): ", le32toh(hdr->length));
42 for (ret = 0; ret < le32toh(hdr->length); ret++)
43 printf("%02x ", ((uint8_t *) mbim_buffer)[ret]);
45 printf(" header_type: %04X\n", le32toh(hdr->type));
46 printf(" header_length: %04X\n", le32toh(hdr->length));
47 printf(" header_transaction: %04X\n", le32toh(hdr->transaction_id));
50 ret = write(mbim_fd.fd, mbim_buffer, le32toh(hdr->length));
52 perror("writing data failed: ");
54 expected = le32toh(hdr->type) | 0x80000000;
55 uloop_timeout_set(&tout, 15000);
61 mbim_recv(struct uloop_fd *u, unsigned int events)
63 ssize_t cnt = read(u->fd, mbim_buffer, MBIM_BUFFER_SIZE);
64 struct mbim_message_header *hdr = (struct mbim_message_header *) mbim_buffer;
65 struct command_message *msg = (struct command_message *) mbim_buffer;
71 if (cnt < sizeof(struct mbim_message_header)) {
72 perror("failed to read() data: ");
76 printf("reading (%zu): ", cnt);
77 for (i = 0; i < cnt; i++)
78 printf("%02x ", mbim_buffer[i]);
80 printf(" header_type: %04X\n", le32toh(hdr->type));
81 printf(" header_length: %04X\n", le32toh(hdr->length));
82 printf(" header_transaction: %04X\n", le32toh(hdr->transaction_id));
85 if (le32toh(hdr->type) == expected)
86 uloop_timeout_cancel(&tout);
88 switch(le32toh(hdr->type)) {
89 case MBIM_MESSAGE_TYPE_OPEN_DONE:
90 if (current_handler->request() < 0)
91 mbim_send_close_msg();
93 case MBIM_MESSAGE_TYPE_COMMAND_DONE:
94 return_code = current_handler->response(msg->buffer, le32toh(msg->buffer_length));
97 mbim_send_close_msg();
99 case MBIM_MESSAGE_TYPE_CLOSE_DONE:
102 case MBIM_MESSAGE_TYPE_FUNCTION_ERROR:
104 mbim_send_close_msg();
111 mbim_open(const char *path)
113 mbim_fd.cb = mbim_recv;
114 mbim_fd.fd = open(path, O_RDWR);
115 if (mbim_fd.fd < 1) {
116 perror("open failed: ");
119 uloop_fd_add(&mbim_fd, ULOOP_READ);