-- binary
01 11 # version/type
00 e4 # length
00 00 00 06 # xid
00 01 # stats_type
00 00 # flags
00 68 # entries[0].length
03 # entries[0].table_id
00 # entries[0].pad
00 3f ff ff # entries[0].match.wildcards
00 00 00 00 # remaining match fields
00 00 00 00 00 00 00 00 # ...
00 00 00 00 00 00 00 00 # ...
00 00 00 00 00 00 00 00 # ...
00 00 00 00 00 00 00 00 # ...
00 00 00 01 # entries[0].duration_sec
00 00 00 02 # entries[0].duration_nsec
00 64 # entries[0].priority
00 05 # entries[0].idle_timeout
00 0a # entries[0].hard_timeout
00 00 00 00 00 00 # pad
01 23 45 67 89 ab cd ef # entries[0].cookie
00 00 00 00 00 00 00 0a # entries[0].packet_count
00 00 00 00 00 00 03 e8 # entries[0].byte_count
00 00 # entries[0].actions[0].type
00 08 # entries[0].actions[0].len
00 01 # entries[0].actions[0].port
00 00 # entries[0].actions[0].max_len
00 00 # entries[0].actions[1].type
00 08 # entries[0].actions[1].len
00 02 # entries[0].actions[1].port
00 00 # entries[0].actions[1].max_len
00 70 # entries[1].length
04 # entries[1].table_id
00 # entries[1].pad
00 3f ff ff # entries[1].match.wildcards
00 00 00 00 # remaining match fields
00 00 00 00 00 00 00 00 # ...
00 00 00 00 00 00 00 00 # ...
00 00 00 00 00 00 00 00 # ...
00 00 00 00 00 00 00 00 # ...
00 00 00 01 # entries[1].duration_sec
00 00 00 02 # entries[1].duration_nsec
00 64 # entries[1].priority
00 05 # entries[1].idle_timeout
00 0a # entries[1].hard_timeout
00 00 00 00 00 00 # pad
01 23 45 67 89 ab cd ef # entries[1].cookie
00 00 00 00 00 00 00 0a # entries[1].packet_count
00 00 00 00 00 00 03 e8 # entries[1].byte_count
00 00 # entries[1].actions[0].type
00 08 # entries[1].actions[0].len
00 01 # entries[1].actions[0].port
00 00 # entries[1].actions[0].max_len
00 00 # entries[1].actions[1].type
00 08 # entries[1].actions[1].len
00 02 # entries[1].actions[1].port
00 00 # entries[1].actions[1].max_len
00 00 # entries[1].actions[2].type
00 08 # entries[1].actions[2].len
00 03 # entries[1].actions[2].port
00 00 # entries[1].actions[2].max_len
-- python
ofp.message.flow_stats_reply(
    xid=6,
    flags=0,
    entries=[
        ofp.flow_stats_entry(table_id=3,
            match=ofp.match(),
            duration_sec=1,
            duration_nsec=2,
            priority=100,
            idle_timeout=5,
            hard_timeout=10,
            cookie=0x0123456789abcdef,
            packet_count=10,
            byte_count=1000,
            actions=[ofp.action.output(port=1),
            ofp.action.output(port=2)]),
        ofp.flow_stats_entry(table_id=4,
            match=ofp.match(),
            duration_sec=1,
            duration_nsec=2,
            priority=100,
            idle_timeout=5,
            hard_timeout=10,
            cookie=0x0123456789abcdef,
            packet_count=10,
            byte_count=1000,
            actions=[ofp.action.output(port=1),
            ofp.action.output(port=2),
            ofp.action.output(port=3)])])
-- c
obj = of_flow_stats_reply_new(OF_VERSION_1_0);
of_flow_stats_reply_flags_set(obj, 0);
of_flow_stats_reply_xid_set(obj, 6);
{
    of_object_t *entries = of_list_flow_stats_entry_new(OF_VERSION_1_0);
    {
        of_object_t *elem = of_flow_stats_entry_new(OF_VERSION_1_0);
        of_flow_stats_entry_byte_count_set(elem, 1000);
        of_flow_stats_entry_cookie_set(elem, 81985529216486895);
        of_flow_stats_entry_duration_nsec_set(elem, 2);
        of_flow_stats_entry_duration_sec_set(elem, 1);
        of_flow_stats_entry_hard_timeout_set(elem, 10);
        of_flow_stats_entry_idle_timeout_set(elem, 5);
        of_flow_stats_entry_packet_count_set(elem, 10);
        of_flow_stats_entry_priority_set(elem, 100);
        of_flow_stats_entry_table_id_set(elem, 3);
        {
            of_match_t match = { OF_VERSION_1_0 };
            of_flow_stats_entry_match_set(elem, &match);
        }
        {
            of_object_t *actions = of_list_action_new(OF_VERSION_1_0);
            {
                of_object_t *elem = of_action_output_new(OF_VERSION_1_0);
                of_action_output_max_len_set(elem, 0);
                of_action_output_port_set(elem, 1);
                of_list_append(actions, elem);
                of_object_delete(elem);
            }
            {
                of_object_t *elem = of_action_output_new(OF_VERSION_1_0);
                of_action_output_max_len_set(elem, 0);
                of_action_output_port_set(elem, 2);
                of_list_append(actions, elem);
                of_object_delete(elem);
            }
            of_flow_stats_entry_actions_set(elem, actions);
            of_object_delete(actions);
        }
        of_list_append(entries, elem);
        of_object_delete(elem);
    }
    {
        of_object_t *elem = of_flow_stats_entry_new(OF_VERSION_1_0);
        of_flow_stats_entry_byte_count_set(elem, 1000);
        of_flow_stats_entry_cookie_set(elem, 81985529216486895);
        of_flow_stats_entry_duration_nsec_set(elem, 2);
        of_flow_stats_entry_duration_sec_set(elem, 1);
        of_flow_stats_entry_hard_timeout_set(elem, 10);
        of_flow_stats_entry_idle_timeout_set(elem, 5);
        of_flow_stats_entry_packet_count_set(elem, 10);
        of_flow_stats_entry_priority_set(elem, 100);
        of_flow_stats_entry_table_id_set(elem, 4);
        {
            of_match_t match = { OF_VERSION_1_0 };
            of_flow_stats_entry_match_set(elem, &match);
        }
        {
            of_object_t *actions = of_list_action_new(OF_VERSION_1_0);
            {
                of_object_t *elem = of_action_output_new(OF_VERSION_1_0);
                of_action_output_max_len_set(elem, 0);
                of_action_output_port_set(elem, 1);
                of_list_append(actions, elem);
                of_object_delete(elem);
            }
            {
                of_object_t *elem = of_action_output_new(OF_VERSION_1_0);
                of_action_output_max_len_set(elem, 0);
                of_action_output_port_set(elem, 2);
                of_list_append(actions, elem);
                of_object_delete(elem);
            }
            {
                of_object_t *elem = of_action_output_new(OF_VERSION_1_0);
                of_action_output_max_len_set(elem, 0);
                of_action_output_port_set(elem, 3);
                of_list_append(actions, elem);
                of_object_delete(elem);
            }
            of_flow_stats_entry_actions_set(elem, actions);
            of_object_delete(actions);
        }
        of_list_append(entries, elem);
        of_object_delete(elem);
    }
    of_flow_stats_reply_entries_set(obj, entries);
    of_object_delete(entries);
}
