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
);