Ejemplo n.º 1
0
indigo_error_t
icmpa_create_send_packet_in (of_octets_t *of_octets, uint64_t reason, 
                             of_port_no_t in_port)
{
    of_packet_in_t *of_packet_in;
    of_match_t     match;

    memset(&match, 0, sizeof(of_match_t)); 

    if (!of_octets) return INDIGO_ERROR_UNKNOWN;

    if ((of_packet_in = of_packet_in_new(OF_VERSION_1_3)) == NULL) {
        return INDIGO_ERROR_RESOURCE;
    }

    of_packet_in_total_len_set(of_packet_in, of_octets->bytes);
    match.version = OF_VERSION_1_3;
    match.fields.in_port = in_port;
    OF_MATCH_MASK_IN_PORT_EXACT_SET(&match);
    match.fields.metadata |= reason;
    OF_MATCH_MASK_METADATA_EXACT_SET(&match);
    if ((of_packet_in_match_set(of_packet_in, &match)) != OF_ERROR_NONE) {
        printf("Failed to write match to packet-in message\n");
        of_packet_in_delete(of_packet_in);
        return INDIGO_ERROR_UNKNOWN;
    }

    if ((of_packet_in_data_set(of_packet_in, of_octets)) != OF_ERROR_NONE) {
        printf("Failed to write packet data to packet-in message\n");
        of_packet_in_delete(of_packet_in);
        return INDIGO_ERROR_UNKNOWN;
    }

    if (icmpa_packet_in_handler(of_packet_in) == 
        INDIGO_CORE_LISTENER_RESULT_DROP) {
        printf("Listener dropped packet-in\n");
    } else {
        printf("Listener passed packet-in\n");
    }

    of_packet_in_delete(of_packet_in);
    return INDIGO_ERROR_NONE;

}
Ejemplo n.º 2
0
/* Generated from of10/flow_stats_entry.data */
static int
test_of10_flow_stats_entry(void) {
    uint8_t binary[] = {
        0x00, 0x68, 0x03, 0x00, 0x00, 0x30, 0x00, 0xe2, 
        0x00, 0x03, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 
        0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x00, 0x00, 
        0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0xc0, 0xa8, 0x03, 0x7f, 0xff, 0xff, 0xff, 0xff, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
        0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0x05, 
        0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8, 
        0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 
        0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 
        
    };

    of_object_t *obj;

    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);

    if (sizeof(binary) != WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj))
        || memcmp(binary, WBUF_BUF(OF_OBJECT_TO_WBUF(obj)), sizeof(binary))) {
	show_failure(binary, sizeof(binary),
		     WBUF_BUF(OF_OBJECT_TO_WBUF(obj)),
		     WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj)));
	of_object_delete(obj);
	return TEST_FAIL;
    }

    of_object_delete(obj);
    return TEST_PASS;
}
Ejemplo n.º 3
0
/* Generated from of10/echo_request.data */
static int
test_of10_echo_request(void) {
    uint8_t binary[] = {
        0x01, 0x02, 0x00, 0x0b, 0x12, 0x34, 0x56, 0x78, 
        0x61, 0x62, 0x01, 
    };

    of_object_t *obj;

    obj = of_echo_request_new(OF_VERSION_1_0);
    of_echo_request_xid_set(obj, 0x12345678);
    {
        of_octets_t data = { .data=(uint8_t *)"ab\x01", .bytes=3 };
        of_echo_request_data_set(obj, &data);
    }

    if (sizeof(binary) != WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj))
        || memcmp(binary, WBUF_BUF(OF_OBJECT_TO_WBUF(obj)), sizeof(binary))) {
	show_failure(binary, sizeof(binary),
		     WBUF_BUF(OF_OBJECT_TO_WBUF(obj)),
		     WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj)));
	of_object_delete(obj);
	return TEST_FAIL;
    }

    of_object_delete(obj);
    return TEST_PASS;
}

/* Generated from of10/flow_add.data */
static int
test_of10_flow_add(void) {
    uint8_t binary[] = {
        0x01, 0x0e, 0x00, 0x70, 0x12, 0x34, 0x56, 0x78, 
        0x00, 0x30, 0x00, 0xe2, 0x00, 0x03, 0x01, 0x23, 
        0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 
        0x45, 0x67, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0xc0, 0xa8, 0x03, 0x7f, 
        0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 
        0x00, 0x00, 0x00, 0x08, 0xff, 0xfb, 0x00, 0x00, 
        0xff, 0xff, 0x00, 0x10, 0x00, 0x00, 0x23, 0x20, 
        0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0xff, 0xff, 0x00, 0x10, 0x00, 0x5c, 0x16, 0xc7, 
        0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 
        
    };

    of_object_t *obj;

    obj = of_flow_add_new(OF_VERSION_1_0);
    of_flow_add_xid_set(obj, 0x12345678);
    of_flow_add_idle_timeout_set(obj, 5);
    of_flow_add_flags_set(obj, 2);
    {
        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_add_match_set(obj, &match);
    }
    {
        of_list_action_t actions;
        of_flow_add_actions_bind(obj, &actions);
        {
            of_action_t action;
            of_action_output_init(&action.output, OF_VERSION_1_0, -1, 1);
            of_list_action_append_bind(&actions, &action);
            of_action_output_port_set(&action.output, OF_PORT_DEST_FLOOD);
        }
        {
            of_action_t action;
            of_action_nicira_dec_ttl_init(&action.nicira_dec_ttl, OF_VERSION_1_0, -1, 1);
            of_list_action_append_bind(&actions, &action);
        }
        {
            of_action_t action;
            of_action_bsn_set_tunnel_dst_init(&action.bsn_set_tunnel_dst, OF_VERSION_1_0, -1, 1);
            of_list_action_append_bind(&actions, &action);
        }
    }

    if (sizeof(binary) != WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj))
        || memcmp(binary, WBUF_BUF(OF_OBJECT_TO_WBUF(obj)), sizeof(binary))) {
	show_failure(binary, sizeof(binary),
		     WBUF_BUF(OF_OBJECT_TO_WBUF(obj)),
		     WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj)));
	of_object_delete(obj);
	return TEST_FAIL;
    }

    of_object_delete(obj);
    return TEST_PASS;
}
Ejemplo n.º 4
0
/* Should only be used when creating the match for a packet-in */
void
ind_ovs_key_to_match(const struct ind_ovs_parsed_key *pkey,
                     of_match_t *match)
{
    memset(match, 0, sizeof(*match));

    /* We only populate the masks for this OF version */
    match->version = ind_ovs_version;

    of_match_fields_t *fields = &match->fields;

    assert(ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_IN_PORT));
    fields->in_port = pkey->in_port;
    OF_MATCH_MASK_IN_PORT_EXACT_SET(match);

    assert(ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_ETHERNET));
    memcpy(&fields->eth_dst, pkey->ethernet.eth_dst, OF_MAC_ADDR_BYTES);
    memcpy(&fields->eth_src, pkey->ethernet.eth_src, OF_MAC_ADDR_BYTES);
    OF_MATCH_MASK_ETH_DST_EXACT_SET(match);
    OF_MATCH_MASK_ETH_SRC_EXACT_SET(match);

    if (ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_ETHERTYPE)) {
        fields->eth_type = ntohs(pkey->ethertype);
        if (fields->eth_type <= OF_DL_TYPE_NOT_ETH_TYPE) {
            fields->eth_type = OF_DL_TYPE_NOT_ETH_TYPE;
        }
    } else {
        fields->eth_type = OF_DL_TYPE_NOT_ETH_TYPE;
    }
    OF_MATCH_MASK_ETH_TYPE_EXACT_SET(match);

    if (ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_VLAN)) {
        fields->vlan_vid = VLAN_VID(ntohs(pkey->vlan));
        fields->vlan_pcp = VLAN_PCP(ntohs(pkey->vlan));
        if (ind_ovs_version == OF_VERSION_1_3) {
            fields->vlan_vid |= VLAN_CFI_BIT;
        }
    } else {
        if (ind_ovs_version == OF_VERSION_1_0) {
            fields->vlan_vid = -1;
        } else {
            fields->vlan_vid = 0;
        }
        fields->vlan_pcp = 0;
    }
    OF_MATCH_MASK_VLAN_VID_EXACT_SET(match);
    OF_MATCH_MASK_VLAN_PCP_EXACT_SET(match);

    if (ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_IPV4)) {
        fields->ipv4_src = ntohl(pkey->ipv4.ipv4_src);
        fields->ipv4_dst = ntohl(pkey->ipv4.ipv4_dst);
        fields->ip_dscp = pkey->ipv4.ipv4_tos;
        fields->ip_proto = pkey->ipv4.ipv4_proto;
        OF_MATCH_MASK_IPV4_SRC_EXACT_SET(match);
        OF_MATCH_MASK_IPV4_DST_EXACT_SET(match);
        OF_MATCH_MASK_IP_DSCP_EXACT_SET(match);
        OF_MATCH_MASK_IP_PROTO_EXACT_SET(match);
    }

    if (ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_IPV6)) {
        memcpy(&fields->ipv6_src, pkey->ipv6.ipv6_src, OF_IPV6_BYTES);
        memcpy(&fields->ipv6_dst, pkey->ipv6.ipv6_dst, OF_IPV6_BYTES);
        fields->ipv6_flabel = ntohl(pkey->ipv6.ipv6_label);
    }

    if (ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_ARP)) {
        fields->arp_op = ntohs(pkey->arp.arp_op);
        fields->arp_spa = ntohl(pkey->arp.arp_sip);
        fields->arp_tpa = ntohl(pkey->arp.arp_tip);
        memcpy(&fields->arp_sha, pkey->arp.arp_sha, OF_MAC_ADDR_BYTES);
        memcpy(&fields->arp_tha, pkey->arp.arp_tha, OF_MAC_ADDR_BYTES);

        /* Special case ARP for OF 1.0 */
        if (ind_ovs_version == OF_VERSION_1_0) {
            fields->ipv4_src = ntohl(pkey->arp.arp_sip);
            fields->ipv4_dst = ntohl(pkey->arp.arp_tip);
            fields->ip_proto = ntohs(pkey->arp.arp_op) & 0xFF;
            OF_MATCH_MASK_IPV4_SRC_EXACT_SET(match);
            OF_MATCH_MASK_IPV4_DST_EXACT_SET(match);
            OF_MATCH_MASK_IP_PROTO_EXACT_SET(match);
        }
    }

    if (ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_TCP)) {
        fields->tcp_dst = ntohs(pkey->tcp.tcp_dst);
        fields->tcp_src = ntohs(pkey->tcp.tcp_src);
        OF_MATCH_MASK_TCP_DST_EXACT_SET(match);
        OF_MATCH_MASK_TCP_SRC_EXACT_SET(match);
    }

    if (ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_UDP)) {
        fields->udp_dst = ntohs(pkey->udp.udp_dst);
        fields->udp_src = ntohs(pkey->udp.udp_src);

        /* Special case UDP for OF 1.0 */
        if (ind_ovs_version == OF_VERSION_1_0) {
            fields->tcp_dst = ntohs(pkey->udp.udp_dst);
            fields->tcp_src = ntohs(pkey->udp.udp_src);
            OF_MATCH_MASK_TCP_DST_EXACT_SET(match);
            OF_MATCH_MASK_TCP_SRC_EXACT_SET(match);
        }
    }

    if (ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_ICMP)) {
        fields->icmpv4_type = pkey->icmp.icmp_type;
        fields->icmpv4_code = pkey->icmp.icmp_code;

        /* Special case ICMP for OF 1.0 */
        if (ind_ovs_version == OF_VERSION_1_0) {
            fields->tcp_dst = pkey->icmp.icmp_code;
            fields->tcp_src = pkey->icmp.icmp_type;
            OF_MATCH_MASK_TCP_DST_EXACT_SET(match);
            OF_MATCH_MASK_TCP_SRC_EXACT_SET(match);
        }
    }

    if (ATTR_BITMAP_TEST(pkey->populated, OVS_KEY_ATTR_ICMPV6)) {
        fields->icmpv6_type = pkey->icmpv6.icmpv6_type;
        fields->icmpv6_code = pkey->icmpv6.icmpv6_code;
    }

    /*
     * Not supported by OVS:
     * sctp_dst, sctp_src, ipv6_nd_target, ipv6_nd_sll, ipv6_nd_tll,
     * mpls_label, mpls_tc, ip_ecn, in_phy_port, metadata
    */
}