summaryrefslogtreecommitdiff
path: root/src/lib/sockets.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/sockets.c')
-rw-r--r--src/lib/sockets.c228
1 files changed, 145 insertions, 83 deletions
diff --git a/src/lib/sockets.c b/src/lib/sockets.c
index ef4b3a47..c0331063 100644
--- a/src/lib/sockets.c
+++ b/src/lib/sockets.c
@@ -31,8 +31,6 @@
#include <string.h>
#include <malloc.h>
-#define BUFFER_SIZE 256
-
int client_socket_open(char * file_name)
{
int sockfd;
@@ -146,6 +144,14 @@ static void deser_copy_int(uint8_t * data,
deser_copy_value(sizeof(int), dst, data, offset);
}
+static void deser_copy_size_t(uint8_t * data,
+ size_t * dst,
+ int * offset)
+{
+ *dst = 0;
+ deser_copy_value(sizeof(size_t), dst, data, offset);
+}
+
static void deser_copy_enum(uint8_t * data,
enum irm_msg_code * dst,
int * offset)
@@ -160,13 +166,16 @@ buffer_t * serialize_irm_msg(struct irm_msg * msg)
uint8_t * data;
int offset = 0;
int i;
- char buffer[BUFFER_SIZE];
+ char ** pos;
+
+ if (msg == NULL)
+ return NULL;
buf = malloc(sizeof(*buf));
if (buf == NULL)
return NULL;
- buf->data = malloc(BUFFER_SIZE);
+ buf->data = malloc(IRM_MSG_BUF_SIZE);
if (buf->data == NULL) {
free(buf);
return NULL;
@@ -174,47 +183,75 @@ buffer_t * serialize_irm_msg(struct irm_msg * msg)
data = buf->data;
- ser_copy_value(sizeof(enum irm_msg_code),
- data,
- &msg->code,
- &offset);
+ ser_copy_value(sizeof(enum irm_msg_code), data, &msg->code, &offset);
+
+ if (msg->name == NULL ||
+ msg->name->ap_name == NULL ||
+ msg->name->ae_name == NULL ) {
+ LOG_ERR("Null pointer passed");
+ free(buf->data);
+ free(buf);
+ return NULL;
+ }
+
+ /*
+ * Every IRM message passes the name, may change
+ * Move to separate function when it does
+ */
+ ser_copy_value(strlen(msg->name->ap_name) + 1, data,
+ msg->name->ap_name, &offset);
+
+ ser_copy_value(sizeof(int), data, &msg->name->api_id, &offset);
+
+ ser_copy_value(strlen(msg->name->ae_name) + 1, data,
+ msg->name->ae_name, &offset);
+
+ ser_copy_value(sizeof(int), data, &msg->name->aei_id, &offset);
switch (msg->code) {
case IRM_CREATE_IPCP:
- if (!msg->msgs.create_ipcp.name ||
- !msg->msgs.create_ipcp.name->ap_name ||
- !msg->msgs.create_ipcp.name->ae_name ||
- !msg->msgs.create_ipcp.ipcp_type) {
+ if (!msg->ipcp_type) {
LOG_ERR("Null pointer passed");
free(buf->data);
free(buf);
return NULL;
}
- ser_copy_value(strlen(msg->msgs.create_ipcp.name->ap_name) + 1,
- data,
- msg->msgs.create_ipcp.name->ap_name,
- &offset);
-
- ser_copy_value(sizeof(int),
- data,
- &msg->msgs.create_ipcp.name->api_id,
- &offset);
-
- ser_copy_value(strlen(msg->msgs.create_ipcp.name->ae_name) + 1,
- data,
- msg->msgs.create_ipcp.name->ae_name,
- &offset);
-
- ser_copy_value(sizeof(int),
- data,
- &msg->msgs.create_ipcp.name->aei_id,
- &offset);
-
- ser_copy_value(strlen(msg->msgs.create_ipcp.ipcp_type) + 1,
- data,
- msg->msgs.create_ipcp.ipcp_type,
- &offset);
+ ser_copy_value(strlen(msg->ipcp_type) + 1, data,
+ msg->ipcp_type, &offset);
+ break;
+ case IRM_DESTROY_IPCP:
+ break;
+ case IRM_BOOTSTRAP_IPCP:
+ /* FIXME: Fields missing, need to define dif_info properly */
+ break;
+ case IRM_ENROLL_IPCP:
+ if (msg->dif_name == NULL) {
+ free(buf->data);
+ free(buf);
+ return NULL;
+ }
+
+ ser_copy_value(strlen(msg->dif_name) + 1, data,
+ msg->dif_name, &offset);
+
+ break;
+ case IRM_REG_IPCP:
+ case IRM_UNREG_IPCP:
+ if (msg->difs == NULL || msg->difs[0] == NULL) {
+ free(buf->data);
+ free(buf);
+ return NULL;
+ }
+
+ ser_copy_value(sizeof(size_t), data, &msg->difs_size, &offset);
+
+ pos = msg->difs;
+ for (i = 0; i < msg->difs_size; i++) {
+ ser_copy_value(strlen(*pos) + 1, data, *pos, &offset);
+ pos++;
+ }
+
break;
default:
LOG_ERR("Don't know that code");
@@ -225,89 +262,114 @@ buffer_t * serialize_irm_msg(struct irm_msg * msg)
buf->size = offset;
- for (i = 0; i < buf->size; i++) {
- if (i > 0) sprintf(buffer + strlen(buffer), ":");
- sprintf(buffer + strlen(buffer), "%02X", data[i]);
- }
- LOG_DBGF("Serialized buffer to %s", buffer);
-
return buf;
}
struct irm_msg * deserialize_irm_msg(buffer_t * data)
{
struct irm_msg * msg;
- char buffer[BUFFER_SIZE];
- int i;
+ int i, j;
int offset = 0;
+ size_t difs_size;
- if (data == NULL ||
- data->data == NULL) {
+ if (data == NULL || data->data == NULL) {
LOG_ERR("Got a null pointer");
return NULL;
}
- memset(buffer, 0, sizeof(buffer));
- for (i = 0; i < data->size; i++) {
- if (i > 0) sprintf(buffer + strlen(buffer), ":");
- sprintf(buffer + strlen(buffer), "%02X", data->data[i]);
- }
- LOG_DBGF("Got buffer %s", buffer);
-
msg = malloc(sizeof(*msg));
if (msg == NULL) {
LOG_ERR("Failed to allocate memory");
return NULL;
}
- deser_copy_enum(data->data,
- &msg->code,
- &offset);
+ deser_copy_enum(data->data, &msg->code, &offset);
+
+ msg->name = malloc(sizeof(*(msg->name)));
+ if (msg->name == NULL) {
+ LOG_ERR("Failed to alloc memory");
+ free(msg);
+ return NULL;
+ }
+
+ if (deser_copy_string(data->data,
+ &msg->name->ap_name,
+ &offset)) {
+ free(msg->name);
+ free(msg);
+ return NULL;
+ }
+
+ deser_copy_int(data->data, &msg->name->api_id, &offset);
+
+ if (deser_copy_string(data->data,
+ &msg->name->ae_name,
+ &offset)) {
+ free(msg->name->ap_name);
+ free(msg->name);
+ free(msg);
+ return NULL;
+ }
+
+ deser_copy_int(data->data, &msg->name->aei_id, &offset);
switch (msg->code) {
case IRM_CREATE_IPCP:
- msg->msgs.create_ipcp.name =
- malloc(sizeof(*(msg->msgs.create_ipcp.name)));
- if (!msg->msgs.create_ipcp.name) {
- LOG_ERR("Failed to alloc memory");
+ if (deser_copy_string(data->data,
+ &msg->ipcp_type,
+ &offset)) {
+ free(msg->name->ae_name);
+ free(msg->name->ap_name);
+ free(msg->name);
free(msg);
return NULL;
}
+ break;
+ case IRM_DESTROY_IPCP:
+ break;
+ case IRM_BOOTSTRAP_IPCP:
+ break;
+ case IRM_ENROLL_IPCP:
if (deser_copy_string(data->data,
- &msg->msgs.create_ipcp.name->ap_name,
+ &msg->dif_name,
&offset)) {
- free(msg->msgs.create_ipcp.name);
+ free(msg->name->ae_name);
+ free(msg->name->ap_name);
+ free(msg->name);
free(msg);
return NULL;
}
- deser_copy_int(data->data,
- &msg->msgs.create_ipcp.name->api_id,
- &offset);
-
- if (deser_copy_string(data->data,
- &msg->msgs.create_ipcp.name->ae_name,
- &offset)) {
- free(msg->msgs.create_ipcp.name->ap_name);
- free(msg->msgs.create_ipcp.name);
+ break;
+ case IRM_REG_IPCP:
+ case IRM_UNREG_IPCP:
+ deser_copy_size_t(data->data, &difs_size, &offset);
+
+ msg->difs = malloc(sizeof(*(msg->difs)) * difs_size);
+ if (msg->difs == NULL) {
+ free(msg->name->ae_name);
+ free(msg->name->ap_name);
+ free(msg->name);
free(msg);
return NULL;
}
- deser_copy_int(data->data,
- &msg->msgs.create_ipcp.name->aei_id,
- &offset);
-
- if (deser_copy_string(data->data,
- &msg->msgs.create_ipcp.ipcp_type,
- &offset)) {
- free(msg->msgs.create_ipcp.name->ae_name);
- free(msg->msgs.create_ipcp.name->ap_name);
- free(msg->msgs.create_ipcp.name);
- free(msg);
- return NULL;
+ for (i = 0; i < difs_size; i++) {
+ if (deser_copy_string(data->data,
+ &msg->difs[i],
+ &offset)) {
+ for (j = 0; j < i; j++)
+ free(msg->difs[j]);
+ free(msg->difs);
+ free(msg->name->ae_name);
+ free(msg->name->ap_name);
+ free(msg->name);
+ free(msg);
+ return NULL;
+ }
}
+
break;
default:
LOG_ERR("Don't know that code");