of_object_t * of_object_new_from_message_preallocated(of_object_storage_t *storage, uint8_t *buf, int len) { of_object_t *obj = &storage->obj; of_wire_buffer_t *wbuf = &storage->wbuf; of_message_t msg = buf; of_version_t version; of_object_id_t object_id; memset(storage, 0, sizeof(*storage)); version = of_message_version_get(msg); if (!OF_VERSION_OKAY(version)) { return NULL; } if (of_validate_message(msg, len) != 0) { LOCI_LOG_ERROR("message validation failed\n"); return NULL; } obj->version = version; obj->wbuf = wbuf; wbuf->buf = msg; wbuf->alloc_bytes = len; wbuf->current_bytes = len; of_header_wire_object_id_get(obj, &object_id); of_object_init_map[object_id](obj, version, len, 0); return obj; }
of_hello_t * of_hello_new_from_message(of_message_t msg) { of_hello_t *obj = NULL; of_version_t version; int length; if (msg == NULL) return NULL; version = of_message_version_get(msg); if (!OF_VERSION_OKAY(version)) return NULL; length = of_message_length_get(msg); if ((obj = (of_hello_t *)of_object_new(-1)) == NULL) { return NULL; } of_hello_init(obj, version, 0, 0); if ((of_object_buffer_bind((of_object_t *)obj, OF_MESSAGE_TO_BUFFER(msg), length, OF_MESSAGE_FREE_FUNCTION)) < 0) { FREE(obj); return NULL; } obj->length = length; obj->version = version; return obj; }
of_object_t * of_object_new_from_message(of_message_t msg, int len) { of_object_id_t object_id; of_object_t *obj; of_version_t version; version = of_message_version_get(msg); if (!OF_VERSION_OKAY(version)) { return NULL; } if (of_validate_message(msg, len) != 0) { LOCI_LOG_ERROR("message validation failed\n"); return NULL; } if ((obj = of_object_new(-1)) == NULL) { return NULL; } if (of_object_buffer_bind(obj, OF_MESSAGE_TO_BUFFER(msg), len, OF_MESSAGE_FREE_FUNCTION) < 0) { FREE(obj); return NULL; } obj->version = version; of_header_wire_object_id_get(obj, &object_id); of_object_init_map[object_id](obj, version, len, 0); return obj; }