3 * Copyright (C) 2014 John Crispin <blogic@openwrt.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2
7 * as published by the Free Software Foundation
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
15 #include <sys/types.h>
25 #include <libubox/utils.h>
26 #include <libubox/uloop.h>
30 #include "data/mbim-service-basic-connect.h"
32 int transaction_id
= 1;
33 uint8_t basic_connect
[16] = { 0xa2, 0x89, 0xcc, 0x33, 0xbc, 0xbb, 0x8b, 0x4f,
34 0xb6, 0xb0, 0x13, 0x3e, 0xc2, 0xaa, 0xe6,0xdf };
35 static int payload_offset
, payload_free
, payload_len
;
36 static uint8_t *payload_buffer
;
39 mbim_add_payload(uint8_t len
)
41 uint32_t offset
= payload_offset
;
43 if (payload_free
< len
)
47 payload_offset
+= len
;
54 mbim_encode_string(struct mbim_string
*str
, char *in
)
57 int s
= mbim_add_payload(l
* 2);
58 uint8_t *p
= &payload_buffer
[s
];
64 str
->offset
= htole32(s
);
65 str
->length
= htole32(l
* 2);
66 for (i
= 0; i
< l
; i
++)
74 mbim_get_string(struct mbim_string
*str
, char *in
)
76 char *p
= &in
[le32toh(str
->offset
)];
79 if (!le32toh(str
->offset
))
82 if (le32toh(str
->length
)) {
83 for (i
= 0; i
< le32toh(str
->length
) / 2; i
++)
93 mbim_get_ipv4(void *buffer
, char *out
, uint32_t offset
)
95 uint8_t *b
= buffer
+ offset
;
97 snprintf(out
, 16, "%d.%d.%d.%d", b
[0], b
[1], b
[2], b
[3]);
101 mbim_enum_string(struct mbim_enum
*e
, uint32_t key
)
112 mbim_setup_header(struct mbim_message_header
*hdr
, MbimMessageType type
, int length
)
117 hdr
->transaction_id
= htole32(transaction_id
++);
118 hdr
->type
= htole32(type
);
119 hdr
->length
= htole32(length
);
123 mbim_setup_command_msg(uint8_t *uuid
, uint32_t type
, uint32_t command_id
, int len
)
125 struct command_message
*cmd
= (struct command_message
*) mbim_buffer
;
127 memset(mbim_buffer
, 0, MBIM_BUFFER_SIZE
);
129 cmd
->fragment_header
.total
= htole32(1);
130 cmd
->fragment_header
.current
= htole32(0);
131 memcpy(cmd
->service_id
, uuid
, 16);
132 cmd
->command_id
= htole32(command_id
);
133 cmd
->command_type
= htole32(type
);
134 cmd
->buffer_length
= htole32(len
);
136 payload_offset
= len
;
137 payload_free
= MBIM_BUFFER_SIZE
- (sizeof(*cmd
) + len
);
139 payload_buffer
= cmd
->buffer
;
145 mbim_send_command_msg(void)
147 struct command_message
*cmd
= (struct command_message
*) mbim_buffer
;
149 if (payload_len
& 0x3) {
154 cmd
->buffer_length
= htole32(le32toh(cmd
->buffer_length
) + payload_len
);
155 mbim_setup_header(&cmd
->header
, MBIM_MESSAGE_TYPE_COMMAND
, sizeof(*cmd
) + le32toh(cmd
->buffer_length
));
161 mbim_send_open_msg(void)
163 struct mbim_open_message
*msg
= (struct mbim_open_message
*) mbim_buffer
;
165 mbim_setup_header(&msg
->header
, MBIM_MESSAGE_TYPE_OPEN
, sizeof(*msg
));
166 msg
->max_control_transfer
= htole32(MBIM_BUFFER_SIZE
);
172 mbim_send_close_msg(void)
174 struct mbim_message_header
*hdr
= (struct mbim_message_header
*) mbim_buffer
;
180 mbim_setup_header(hdr
, MBIM_MESSAGE_TYPE_CLOSE
, sizeof(*hdr
));