of_list_hello_elem_t * of_list_hello_elem_new(of_version_t version) { of_list_hello_elem_t *obj; int bytes; bytes = of_object_fixed_len[version][OF_LIST_HELLO_ELEM] + of_object_extra_len[version][OF_LIST_HELLO_ELEM]; if ((obj = (of_list_hello_elem_t *)of_object_new(OF_WIRE_BUFFER_MAX_LENGTH)) == NULL) { return NULL; } of_list_hello_elem_init(obj, version, bytes, 0); return obj; }
/** * Bind an object of type of_list_hello_elem_t to the parent of type of_hello for * member elements * @param obj Pointer to an object of type of_hello. * @param elements Pointer to the child object of type * of_list_hello_elem_t to be filled out. * \ingroup of_hello * * The parameter elements is filled out to point to the same underlying * wire buffer as its parent. * */ void of_hello_elements_bind( of_hello_t *obj, of_list_hello_elem_t *elements) { of_wire_buffer_t *wbuf; int offset = 0; /* Offset of value relative to the start obj */ int abs_offset; /* Offset of value relative to start of wbuf */ of_version_t ver; int cur_len = 0; /* Current length of object data */ ASSERT(obj->object_id == OF_HELLO); ver = obj->version; wbuf = OF_OBJECT_TO_WBUF(obj); ASSERT(wbuf != NULL); /* By version, determine offset and current length (where needed) */ switch (ver) { case OF_VERSION_1_3: offset = 8; cur_len = _END_LEN(obj, offset); break; default: ASSERT(0); } abs_offset = OF_OBJECT_ABSOLUTE_OFFSET(obj, offset); ASSERT(abs_offset >= 0); ASSERT(cur_len >= 0 && cur_len < 64 * 1024); /* Initialize child */ of_list_hello_elem_init(elements, obj->version, 0, 1); /* Attach to parent */ elements->parent = (of_object_t *)obj; elements->wire_object.wbuf = obj->wire_object.wbuf; elements->wire_object.obj_offset = abs_offset; elements->wire_object.owned = 0; elements->length = cur_len; OF_LENGTH_CHECK_ASSERT(obj); return ; }