11 #include <libubox/utils.h>
12 #include <libubox/uloop.h>
16 #include "data/mbim-service-basic-connect.h"
18 int transaction_id
= 1;
19 uint8_t basic_connect
[16] = { 0xa2, 0x89, 0xcc, 0x33, 0xbc, 0xbb, 0x8b, 0x4f,
20 0xb6, 0xb0, 0x13, 0x3e, 0xc2, 0xaa, 0xe6,0xdf };
21 static int payload_offset
, payload_free
, payload_len
;
22 static uint8_t *payload_buffer
;
25 mbim_add_payload(uint8_t len
)
27 uint32_t offset
= payload_offset
;
29 if (payload_free
< len
)
33 payload_offset
+= len
;
40 mbim_encode_string(struct mbim_string
*str
, char *in
)
43 int s
= mbim_add_payload(l
* 2);
44 uint8_t *p
= &payload_buffer
[s
];
50 str
->offset
= htole32(s
);
51 str
->length
= htole32(l
* 2);
52 for (i
= 0; i
< l
; i
++)
60 mbim_get_string(struct mbim_string
*str
, char *in
)
62 char *p
= &in
[le32toh(str
->offset
)];
65 if (!le32toh(str
->offset
))
68 if (le32toh(str
->length
)) {
69 for (i
= 0; i
< le32toh(str
->length
) / 2; i
++)
79 mbim_get_ipv4(void *buffer
, char *out
, uint32_t offset
)
81 uint8_t *b
= buffer
+ offset
;
83 snprintf(out
, 16, "%d.%d.%d.%d", b
[0], b
[1], b
[2], b
[3]);
87 mbim_enum_string(struct mbim_enum
*e
, uint32_t key
)
98 mbim_setup_header(struct mbim_message_header
*hdr
, MbimMessageType type
, int length
)
103 hdr
->transaction_id
= htole32(transaction_id
++);
104 hdr
->type
= htole32(type
);
105 hdr
->length
= htole32(length
);
109 mbim_setup_command_msg(uint8_t *uuid
, uint32_t type
, uint32_t command_id
, int len
)
111 struct command_message
*cmd
= (struct command_message
*) mbim_buffer
;
113 memset(mbim_buffer
, 0, MBIM_BUFFER_SIZE
);
115 cmd
->fragment_header
.total
= htole32(1);
116 cmd
->fragment_header
.current
= htole32(0);
117 memcpy(cmd
->service_id
, uuid
, 16);
118 cmd
->command_id
= htole32(command_id
);
119 cmd
->command_type
= htole32(type
);
120 cmd
->buffer_length
= htole32(len
);
122 payload_offset
= len
;
123 payload_free
= MBIM_BUFFER_SIZE
- (sizeof(*cmd
) + len
);
125 payload_buffer
= cmd
->buffer
;
131 mbim_send_command_msg(void)
133 struct command_message
*cmd
= (struct command_message
*) mbim_buffer
;
135 if (payload_len
& 0x3) {
140 cmd
->buffer_length
= htole32(le32toh(cmd
->buffer_length
) + payload_len
);
141 mbim_setup_header(&cmd
->header
, MBIM_MESSAGE_TYPE_COMMAND
, sizeof(*cmd
) + le32toh(cmd
->buffer_length
));
147 mbim_send_open_msg(void)
149 struct mbim_open_message
*msg
= (struct mbim_open_message
*) mbim_buffer
;
151 mbim_setup_header(&msg
->header
, MBIM_MESSAGE_TYPE_OPEN
, sizeof(*msg
));
152 msg
->max_control_transfer
= htole32(MBIM_BUFFER_SIZE
);
158 mbim_send_close_msg(void)
160 struct mbim_message_header
*hdr
= (struct mbim_message_header
*) mbim_buffer
;
166 mbim_setup_header(hdr
, MBIM_MESSAGE_TYPE_CLOSE
, sizeof(*hdr
));