-- binary
00 68 # length
03 # table_id
00 # pad

#### ofp_match_v1
00 30 00 e2 # wild cards=(OFPFW_DL_VLAN|OFPFW_NW_PROTO|OFPFW_TP_SRC|OFPFW_TP_DST|OFPFW_DL_VLAN_PCP|OFPFW_NW_TOS)
00 03 # in_port
01 23 45 67 89 ab # eth_src
cd ef 01 23 45 67 # eth_dst
00 00 # dl_vlan
00 00 # dl_pcp, pad
08 00 # dl_type
00 00 00 00 # nw_tos, nw_proto, pad[2]
c0 a8 03 7f # nw_src
ff ff ff ff # nw_dst
00 00 00 00 # tcp_src, tcp_dst

00 00 00 01 # duration_sec
00 00 00 02 # duration_nsec
00 64 # priority
00 05 # idle_timeout
00 0a # hard_timeout
00 00 00 00 00 00 # pad
01 23 45 67 89 ab cd ef # cookie
00 00 00 00 00 00 00 0a # packet_count
00 00 00 00 00 00 03 e8 # byte_count
00 00 # actions[0].type
00 08 # actions[0].len
00 01 # actions[0].port
00 00 # actions[0].max_len
00 00 # actions[1].type
00 08 # actions[1].len
00 02 # actions[1].port
00 00 # actions[1].max_len
-- python
ofp.flow_stats_entry(
    table_id=3,
    match=ofp.match(
        wildcards=ofp.OFPFW_DL_VLAN|ofp.OFPFW_NW_PROTO|ofp.OFPFW_TP_SRC|ofp.OFPFW_TP_DST|ofp.OFPFW_DL_VLAN_PCP|ofp.OFPFW_NW_TOS,
        in_port=3,
        eth_type=0x800,
        ipv4_src=0xc0a8037f,
        ipv4_dst=0xffffffff,
        eth_src=[0x01, 0x23, 0x45, 0x67, 0x89, 0xab],
        eth_dst=[0xcd, 0xef, 0x01, 0x23, 0x45, 0x67]),
    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)])
-- c
obj = of_flow_stats_entry_new(OF_VERSION_1_0);
{
    of_object_t list;
    of_flow_stats_entry_actions_bind(obj, &list);
    {
        of_object_t *obj = of_action_output_new(OF_VERSION_1_0);
        of_action_output_max_len_set(obj, 0);
        of_action_output_port_set(obj, 1);
        of_list_append(&list, obj);
        of_object_delete(obj);
    }
    {
        of_object_t *obj = of_action_output_new(OF_VERSION_1_0);
        of_action_output_max_len_set(obj, 0);
        of_action_output_port_set(obj, 2);
        of_list_append(&list, obj);
        of_object_delete(obj);
    }
}

of_flow_stats_entry_byte_count_set(obj, 1000);
of_flow_stats_entry_cookie_set(obj, 81985529216486895);
of_flow_stats_entry_duration_nsec_set(obj, 2);
of_flow_stats_entry_duration_sec_set(obj, 1);
of_flow_stats_entry_hard_timeout_set(obj, 10);
of_flow_stats_entry_idle_timeout_set(obj, 5);
{
    of_match_t match = { OF_VERSION_1_0 };
    match.fields.in_port = 3;
    match.fields.eth_src = (of_mac_addr_t) { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab } };
    match.fields.eth_dst = (of_mac_addr_t) { { 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67 } };
    match.fields.eth_type = 0x800;
    match.fields.ipv4_src = 0xc0a8037f;
    match.fields.ipv4_dst = 0xffffffff;
    OF_MATCH_MASK_IN_PORT_EXACT_SET(&match);
    OF_MATCH_MASK_ETH_SRC_EXACT_SET(&match);
    OF_MATCH_MASK_ETH_DST_EXACT_SET(&match);
    OF_MATCH_MASK_ETH_TYPE_EXACT_SET(&match);
    //OF_MATCH_MASK_VLAN_VID_EXACT_SET(&match);
    //OF_MATCH_MASK_VLAN_PCP_EXACT_SET(&match);
    OF_MATCH_MASK_ETH_TYPE_EXACT_SET(&match);
    //OF_MATCH_MASK_IP_DSCP_EXACT_SET(&match);
    //OF_MATCH_MASK_IP_PROTO_EXACT_SET(&match);
    OF_MATCH_MASK_IPV4_SRC_EXACT_SET(&match);
    OF_MATCH_MASK_IPV4_DST_EXACT_SET(&match);
    //OF_MATCH_MASK_TCP_SRC_EXACT_SET(&match);
    //OF_MATCH_MASK_TCP_DST_EXACT_SET(&match);
    of_flow_stats_entry_match_set(obj, &match);
}
of_flow_stats_entry_packet_count_set(obj, 10);
of_flow_stats_entry_priority_set(obj, 100);
of_flow_stats_entry_table_id_set(obj, 3);
-- java
    builder
      .setTableId(TableId.of(3))
      .setMatch(
        factory.buildMatch()
            .setExact(MatchField.IN_PORT, OFPort.of(3))
            .setExact(MatchField.ETH_TYPE, EthType.IPv4)
            .setExact(MatchField.IPV4_SRC, IPv4Address.of(0xc0a8037f))
            .setExact(MatchField.IPV4_DST, IPv4Address.of(0xffffffff))
            .setExact(MatchField.ETH_SRC, MacAddress.of("01:23:45:67:89:ab"))
            .setExact(MatchField.ETH_DST, MacAddress.of("cd:ef:01:23:45:67"))
            .build()
      )
      .setDurationSec(1)
      .setDurationNsec(2)
      .setPriority(100)
      .setIdleTimeout(5)
      .setHardTimeout(10)
      .setCookie(U64.of(0x0123456789abcdefL))
      .setPacketCount(U64.of(10))
      .setByteCount(U64.of(1000))
      .setActions(
            ImmutableList.<OFAction>of(
                   factory.actions().output(OFPort.of(1), 0),
                   factory.actions().output(OFPort.of(2), 0)
                   )
      );
