Exemple #1
0
/*
 * B_input(packet),where packet is a structure of type pkt. This routine 
 * will be called whenever a packet sent from the A-side (i.e., as a result 
 * of a tolayer3() being done by a A-side procedure) arrives at the B-side. 
 * packet is the (possibly corrupted) packet sent from the A-side.
 */
void B_input(struct pkt packet) {
	struct msg message; // Store message retrived from network
	struct pkt ack; // Store ack packet

    // Pass message to layer 5 when it not corrupted and when it has expected seqnum
	if (not_corrupted(packet) && (packet.seqnum == rev_seqnum)) {
		strncpy(message.data, packet.payload, MESSAGE_LENGTH);
		tolayer5(BEntity, message);

		// Make ack message
		ack = prepare_pkt(1, rev_seqnum, NULL);
		// flip expected sequence number of packet
		rev_seqnum = !rev_seqnum;
	} else {
		// Make ack message
		ack = prepare_pkt(1, !rev_seqnum, NULL);
	}
	// Send ack message
	tolayer3(BEntity, ack);
}
Exemple #2
0
/**
 * test main entrance for library sched
 */
static int
test_sched(void)
{
	struct rte_mempool *mp = NULL;
	struct rte_sched_port *port = NULL;
	uint32_t pipe;
	struct rte_mbuf *in_mbufs[10];
	struct rte_mbuf *out_mbufs[10];
	int i;

	int err;

	mp = create_mempool();

	port_param.socket = 0;
	port_param.rate = (uint64_t) 10000 * 1000 * 1000 / 8;

	port = rte_sched_port_config(&port_param);
	VERIFY(port != NULL, "Error config sched port\n");


	err = rte_sched_subport_config(port, SUBPORT, subport_param);
	VERIFY(err == 0, "Error config sched, err=%d\n", err);

	for (pipe = 0; pipe < port_param.n_pipes_per_subport; pipe ++) {
		err = rte_sched_pipe_config(port, SUBPORT, pipe, 0);
		VERIFY(err == 0, "Error config sched pipe %u, err=%d\n", pipe, err);
	}

	for (i = 0; i < 10; i++) {
		in_mbufs[i] = rte_pktmbuf_alloc(mp);
		prepare_pkt(in_mbufs[i]);
	}


	err = rte_sched_port_enqueue(port, in_mbufs, 10);
	VERIFY(err == 10, "Wrong enqueue, err=%d\n", err);

	err = rte_sched_port_dequeue(port, out_mbufs, 10);
	VERIFY(err == 10, "Wrong dequeue, err=%d\n", err);

	for (i = 0; i < 10; i++) {
		enum rte_meter_color color;
		uint32_t subport, traffic_class, queue;

		color = rte_sched_port_pkt_read_color(out_mbufs[i]);
		VERIFY(color == e_RTE_METER_YELLOW, "Wrong color\n");

		rte_sched_port_pkt_read_tree_path(out_mbufs[i],
				&subport, &pipe, &traffic_class, &queue);

		VERIFY(subport == SUBPORT, "Wrong subport\n");
		VERIFY(pipe == PIPE, "Wrong pipe\n");
		VERIFY(traffic_class == TC, "Wrong traffic_class\n");
		VERIFY(queue == QUEUE, "Wrong queue\n");

	}


	struct rte_sched_subport_stats subport_stats;
	uint32_t tc_ov;
	rte_sched_subport_read_stats(port, SUBPORT, &subport_stats, &tc_ov);
	//VERIFY(subport_stats.n_pkts_tc[TC-1] == 10, "Wrong subport stats\n");

	struct rte_sched_queue_stats queue_stats;
	uint16_t qlen;
	rte_sched_queue_read_stats(port, QUEUE, &queue_stats, &qlen);
	//VERIFY(queue_stats.n_pkts == 10, "Wrong queue stats\n");

	rte_sched_port_free(port);

	return 0;
}