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;
}
Пример #2
0
/**
 * 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 ;
}