/* * 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); }
/** * 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; }