Beispiel #1
0
/*
 * INIT
 */
static void init_ifnet(void)
{
	char str[256];

	ofp_config_interface_up_v4(port, vlan, vrf, dev_ip, 24);

	/* port 0 */
	dev = ofp_get_ifnet(port, vlan);
	memcpy(dev->mac, dev_mac, OFP_ETHER_ADDR_LEN);
	dev->if_mtu = def_mtu;
#ifdef SP
	dev->linux_index = port + 3; /* an if index of Linux != port val */
	ofp_update_ifindex_lookup_tab(dev);
#endif /* SP */

	dev->pkt_pool = odp_pool_lookup(pool_name);

	sprintf(str, "out default queue:%d", port);
	dev->outq_def = odp_queue_create(str, NULL);
	if (dev->outq_def == ODP_QUEUE_INVALID) {
		fail_with_odp("Out default queue create failed.\n");
		return;
	}

	dev->out_queue_num = 1;
	dev->out_queue_type = OFP_OUT_QUEUE_TYPE_QUEUE;

	/* port 0 vlan 1 */
	ofp_config_interface_up_v4(port, vlan + 1, vrf, dev_ip + 1, 24);

	dev_vlan = ofp_get_ifnet(port, vlan + 1);
	memcpy(dev_vlan->mac, dev_vlan_mac, OFP_ETHER_ADDR_LEN);
	dev_vlan->if_mtu = def_mtu;
#ifdef SP
	dev_vlan->linux_index = port + 4; /* an if index of Linux != port val */
	ofp_update_ifindex_lookup_tab(dev_vlan);
#endif /* SP */

	dev_vlan->pkt_pool = odp_pool_lookup(pool_name);

	sprintf(str, "out default queue:%d", port);
	dev_vlan->outq_def = odp_queue_create(str, NULL);
	if (dev_vlan->outq_def == ODP_QUEUE_INVALID) {
		fail_with_odp("Out default queue create failed.\n");
		return;
	}

	/* Tunnels */
	ofp_config_interface_up_tun(GRE_PORTS, 100, 0, dev_ip, tun_rem_ip,
				      tun_p2p, tun_addr, tun_mask);

	/* No nexthop for tunnel remote address */
	ofp_config_interface_up_tun(GRE_PORTS, 200, 0, dev_ip, 0x08070605,
				      tun_p2p + 1, tun_addr + 1, tun_mask);
}
Beispiel #2
0
static int
create_odp_packet_ip4(odp_packet_t *opkt, uint8_t *pkt_data, int plen,
                      uint32_t dst_addr)
{
    odp_pool_t pool;
    uint8_t *buf;
    odp_packet_t pkt = ODP_PACKET_INVALID;
    struct ofp_ip *iphdr;

    memset(orig_pkt_data, 0x0, sizeof(orig_pkt_data));

    pool = odp_pool_lookup("packet_pool");
    if (pool == ODP_POOL_INVALID) {
        fail_with_odp("ODP packet_pool not found\n");
        return -1;
    }

    pkt = odp_packet_alloc(pool, plen);
    if (pkt == ODP_PACKET_INVALID) {
        fail_with_odp("ODP packet alloc failed");
        return -1;
    }

    buf = odp_packet_data(pkt);

    if (odp_packet_copy_from_mem(pkt, 0, plen, pkt_data) < 0) {
        fail_with_odp("Packet data copy failed\n");
        return -1;
    };

    iphdr = (struct ofp_ip *)&buf[OFP_ETHER_HDR_LEN];

    /* changes to the default packet. Recalculate ip checksum */
    if (dst_addr) {
        iphdr->ip_dst.s_addr = dst_addr;
        iphdr->ip_sum = 0;
        iphdr->ip_sum =
            ofp_cksum_buffer((uint16_t *)iphdr, iphdr->ip_hl<<2);
    }
    /* END OF changes to the default packet */

    odp_packet_has_eth_set(pkt, 1);
    odp_packet_has_ipv4_set(pkt, 1);
    odp_packet_l2_offset_set(pkt, 0);
    odp_packet_l3_offset_set(pkt, OFP_ETHER_HDR_LEN);
    odp_packet_l4_offset_set(pkt, OFP_ETHER_HDR_LEN + (iphdr->ip_hl<<2));

    *opkt = pkt;

    memcpy(orig_pkt_data, pkt_data, plen);

    return 0;
}
Beispiel #3
0
static void init_ifnet(void)
{
    char str[256];

    ofp_config_interface_up_v4(port, vlan, vrf, dev_ip, 24);

    dev = ofp_get_ifnet(port, vlan);
    memcpy(dev->mac, dev_mac, OFP_ETHER_ADDR_LEN);
    dev->if_mtu = def_mtu;
#ifdef SP
    dev->linux_index = port + 3; /* an if index of Linux != port val */
    ofp_update_ifindex_lookup_tab(dev);
#endif /* SP */

    dev->pkt_pool = odp_pool_lookup("packet_pool");

    sprintf(str, "out default queue:%d", port);
    dev->outq_def = odp_queue_create(str, NULL);
    if (dev->outq_def == ODP_QUEUE_INVALID) {
        fail_with_odp("Out default queue create failed.\n");
        return;
    }

    dev->out_queue_num = 1;
    dev->out_queue_type = OFP_OUT_QUEUE_TYPE_QUEUE;
}
/*
 * INIT
 */
static void
test_init_ifnet(void)
{
    char str[256];

    ofp_config_interface_up_v4(port, vlan, vrf, local_ip, 24);

    ifnet = ofp_get_ifnet(port, vlan);
    ifnet->pkt_pool = odp_pool_lookup("packet_pool");

#ifdef SP
    ifnet->linux_index = port + 3; /* an if index of Linux != port val */
    ofp_update_ifindex_lookup_tab(ifnet);

    sprintf(str, "slow path stack port:%d", port);
    ifnet->spq_def = odp_queue_create(str,
                                      ODP_QUEUE_TYPE_POLL,
                                      NULL);
    if (ifnet->spq_def == ODP_QUEUE_INVALID) {
        fail_with_odp("Slow path queue create failed.\n");
        return;
    }
#endif

    sprintf(str, "out default queue:%d", port);
    ifnet->outq_def = odp_queue_create(str,
                                       ODP_QUEUE_TYPE_POLL,
                                       NULL);
    if (ifnet->outq_def == ODP_QUEUE_INVALID) {
        fail_with_odp("Out default queue create failed.\n");
        return;
    }

    sprintf(str, "interface queue:%d", port);
    interface_queue[port] =
        odp_queue_create(str, ODP_QUEUE_TYPE_POLL, NULL);
    if (interface_queue[port] == ODP_QUEUE_INVALID) {
        OFP_ERR("Poll queue create failed.\n");
        return;
    }
    ofp_queue_context_set(interface_queue[port], ifnet);

    ofp_config_interface_up_tun(GRE_PORTS, 100 + port, vrf, local_ip,
                                tun_rem_ip, tun_p2p, tun_addr,
                                tun_mask);
}
Beispiel #5
0
static int
create_odp_packet_ip6(odp_packet_t *opkt, uint8_t *pkt_data, int plen)
{
	odp_pool_t pool;
	odp_packet_t pkt = ODP_PACKET_INVALID;

	memset(orig_pkt_data, 0x0, sizeof(orig_pkt_data));

	pool = odp_pool_lookup("packet_pool");
	if (pool == ODP_POOL_INVALID) {
		fail_with_odp("ODP packet_pool not found\n");
		return -1;
	}

	pkt = odp_packet_alloc(pool, plen);
	if (pkt == ODP_PACKET_INVALID) {
		fail_with_odp("ODP packet alloc failed");
		return -1;
	}

	if (odp_packet_copy_from_mem(pkt, 0, plen, pkt_data) < 0) {
		fail_with_odp("Packet data copy failed\n");
		return -1;
	};

	odp_packet_has_eth_set(pkt, 1);
	odp_packet_has_l2_set(pkt, 1);
	odp_packet_has_ipv6_set(pkt, 1);
	odp_packet_l2_offset_set(pkt, 0);
	odp_packet_l3_offset_set(pkt, OFP_ETHER_HDR_LEN);

	*opkt = pkt;

	odp_packet_copy_to_mem(pkt, 0, plen, orig_pkt_data);

	return 0;
}