void pktgen_page_seq(uint32_t pid) { uint32_t i, row, col; port_info_t * info; pkt_seq_t * pkt; char buff[64]; display_topline("** Sequence Page **"); info = &pktgen.info[pid]; row = PORT_STATE_ROW; col = 1; wr_scrn_printf(row++, col, "Port: %2d, Sequence Count: %2d of %2d ", pid, info->seqCnt, NUM_SEQ_PKTS); wr_scrn_printf(row++, col, "%*s %*s%*s%*s%*s%*s%*s%*s", 6, "Seq:", COLUMN_WIDTH_0, "Dst MAC", COLUMN_WIDTH_0, "Src MAC", COLUMN_WIDTH_0, "Dst IP", COLUMN_WIDTH_0+2, "Src IP", 12, "Port S/D", 15, "Protocol:VLAN", 5, "Size"); for(i = 0; i < NUM_SEQ_PKTS; i++) { col = 1; pkt = &info->seq_pkt[i]; if ( i >= info->seqCnt ) { wr_scrn_eol_pos(row++, col); continue; } wr_scrn_printf(row, col, "%5d:", i); col += 7; wr_scrn_printf(row, col, "%*s", COLUMN_WIDTH_1, inet_mtoa(buff, sizeof(buff), &pkt->eth_dst_addr)); col += COLUMN_WIDTH_1; wr_scrn_printf(row, col, "%*s", COLUMN_WIDTH_1, inet_mtoa(buff, sizeof(buff), &pkt->eth_src_addr)); col += COLUMN_WIDTH_1; wr_scrn_printf(row, col, "%*s", COLUMN_WIDTH_1, inet_ntop4(buff, sizeof(buff), htonl(pkt->ip_dst_addr), 0xFFFFFFFF)); col += COLUMN_WIDTH_1; wr_scrn_printf(row, col, "%*s", COLUMN_WIDTH_1+2, inet_ntop4(buff, sizeof(buff), htonl(pkt->ip_src_addr), pkt->ip_mask)); col += COLUMN_WIDTH_1+2; snprintf(buff, sizeof(buff), "%d/%d", pkt->sport, pkt->dport); wr_scrn_printf(row, col, "%*s", 12, buff); col += 12; snprintf(buff, sizeof(buff), "%s/%s:%04x", (pkt->ethType == ETHER_TYPE_IPv4)? "IPv4" : (pkt->ethType == ETHER_TYPE_IPv6)? "IPv6" : "Other", (pkt->ipProto == PG_IPPROTO_TCP)? "TCP" : (pkt->ipProto == PG_IPPROTO_ICMP)? "ICMP" : "UDP", pkt->vlanid); wr_scrn_printf(row, col, "%*s", 15, buff); col += 15; wr_scrn_printf(row, col, "%5d", pkt->pktSize+FCS_SIZE); row++; } display_dashline(row+2); }
static void pktgen_print_pcap(uint16_t pid) { uint32_t i, row, col, max_pkts, len; uint16_t type, vlan, skip; uint8_t proto; port_info_t *info; pkt_hdr_t *hdr; pcap_info_t *pcap; pcaprec_hdr_t pcap_hdr; char buff[64]; char pkt_buff[2048]; display_topline("<PCAP Page>"); wr_scrn_printf(1, 3, "Port %d of %d", pid, pktgen.nb_ports); info = &pktgen.info[pid]; pcap = info->pcap; row = PORT_STATE_ROW; col = 1; if (pcap == NULL) { wr_scrn_center(10, pktgen.scrn->ncols, "** Port does not have a PCAP file assigned **"); row = 28; goto leave; } wr_scrn_eol_pos(row, col); wr_scrn_printf(row++, col, "Port: %d, PCAP Count: %d of %d", pid, pcap->pkt_idx, pcap->pkt_count); wr_scrn_printf(row++, col, "%*s %*s%*s%*s%*s%*s%*s%*s", 5, "Seq", COLUMN_WIDTH_0, "Dst MAC", COLUMN_WIDTH_0, "Src MAC", COLUMN_WIDTH_0, "Dst IP", COLUMN_WIDTH_0 + 2, "Src IP", 12, "Port S/D", 15, "Protocol:VLAN", 9, "Size-FCS"); max_pkts = pcap->pkt_idx + PCAP_PAGE_SIZE; if (max_pkts > pcap->pkt_count) max_pkts = pcap->pkt_count; wr_pcap_skip(pcap, pcap->pkt_idx); for (i = pcap->pkt_idx; i < max_pkts; i++) { col = 1; skip = 0; len = wr_pcap_read(pcap, &pcap_hdr, pkt_buff, sizeof(pkt_buff)); if (len == 0) break; /* Skip any jumbo packets larger then buffer. */ if (pcap_hdr.incl_len > sizeof(pkt_buff) ) { i--; skip++; } /* Skip packets that are not normal IP packets. */ type = ntohs( ((uint16_t *)pkt_buff)[6]); if (unlikely(type == ETHER_TYPE_VLAN) ) type = ntohs( ((uint16_t *)pkt_buff)[8]); if (unlikely(type < MAX_ETHER_TYPE_SIZE) ) skip++; hdr = (pkt_hdr_t *)&pkt_buff[0]; wr_scrn_eol_pos(row, col); wr_scrn_printf(row, col, "%5d:", i); col += 7; wr_scrn_printf(row, col, "%*s", COLUMN_WIDTH_1, inet_mtoa(buff, sizeof(buff), &hdr->eth.d_addr)); col += COLUMN_WIDTH_1; wr_scrn_printf(row, col, "%*s", COLUMN_WIDTH_1, inet_mtoa(buff, sizeof(buff), &hdr->eth.s_addr)); col += COLUMN_WIDTH_1; type = ntohs(hdr->eth.ether_type); proto = hdr->u.ipv4.proto; vlan = 0; if (type == ETHER_TYPE_VLAN) { vlan = ntohs( ((uint16_t *)&hdr->eth.ether_type)[1]); type = ntohs( ((uint16_t *)&hdr->eth.ether_type)[2]); proto = ((ipHdr_t *)((char *)&hdr->u.ipv4 + 4))->proto; } if (type == ETHER_TYPE_IPv4) { wr_scrn_printf(row, col, "%*s", COLUMN_WIDTH_1, inet_ntop4(buff, sizeof(buff), hdr->u.ipv4.dst, 0xFFFFFFFF)); col += COLUMN_WIDTH_1; wr_scrn_printf(row, col, "%*s", COLUMN_WIDTH_1 + 2, inet_ntop4(buff, sizeof(buff), hdr->u.ipv4.src, 0xFFFFFFFF)); col += COLUMN_WIDTH_1 + 2; snprintf(buff, sizeof(buff), "%d/%d", ntohs(hdr->u.uip.udp.sport), ntohs(hdr->u.uip.udp.dport)); wr_scrn_printf(row, col, "%*s", 12, buff); col += 12; } else { skip++; col += ((2 * COLUMN_WIDTH_1) + 2 + 12); } snprintf(buff, sizeof(buff), "%s/%s:%4d", (type == ETHER_TYPE_IPv4) ? "IPv4" : (type == ETHER_TYPE_IPv6) ? "IPv6" : "Other", (type == PG_IPPROTO_TCP) ? "TCP" : (proto == PG_IPPROTO_ICMP) ? "ICMP" : "UDP", (vlan & 0xFFF)); wr_scrn_printf(row, col, "%*s", 15, buff); col += 15; wr_scrn_printf(row, col, "%5d", len); if (skip && (type < ETHER_TYPE_IPv4) ) wr_scrn_printf(row, col + 7, "<<< Skip %04x", type); else if (skip && (type != ETHER_TYPE_IPv4) ) wr_scrn_printf(row, col + 7, " EthType %04x", type); row++; } leave: display_dashline(row + 2); pktgen.flags &= ~PRINT_LABELS_FLAG; }
int pktgen_save(char * path) { port_info_t * info; pkt_seq_t * pkt; range_info_t * range; uint32_t flags; char buff[64]; FILE * fd; int i, j; uint32_t lcore; struct ether_addr eaddr; fd = fopen(path, "w"); if ( fd == NULL ) { return -1; } for(i=0, lcore=0; i<RTE_MAX_LCORE; i++) if ( rte_lcore_is_enabled(i) ) lcore |= (1 << i); fprintf(fd, "#\n# Pktgen - %s\n", pktgen_version()); fprintf(fd, "# %s, %s\n\n", wr_copyright_msg(), wr_powered_by()); // TODO: Determine DPDK arguments for rank and memory, default for now. fprintf(fd, "# Command line arguments: (DPDK args are defaults)\n"); fprintf(fd, "# %s -c %x -n 3 -m 512 --proc-type %s -- ", pktgen.argv[0], lcore, (rte_eal_process_type() == RTE_PROC_PRIMARY)? "primary" : "secondary"); for(i=1; i < pktgen.argc; i++) fprintf(fd, "%s ", pktgen.argv[i]); fprintf(fd, "\n\n"); fprintf(fd, "#######################################################################\n"); fprintf(fd, "# Pktgen Configuration script information:\n"); fprintf(fd, "# GUI socket is %s\n", (pktgen.flags & ENABLE_GUI_FLAG)? "Enabled" : "Not Enabled"); fprintf(fd, "# Enabled Port mask: %08x\n", pktgen.enabled_port_mask); fprintf(fd, "# Flags %08x\n", pktgen.flags); fprintf(fd, "# Number of ports: %d\n", pktgen.nb_ports); fprintf(fd, "# Number ports per page: %d\n", pktgen.nb_ports_per_page); fprintf(fd, "# Coremask 0x%08x\n", pktgen.coremask); fprintf(fd, "# Number descriptors: RX %d TX: %d\n", pktgen.nb_rxd, pktgen.nb_txd); fprintf(fd, "# Promiscuous mode is %s\n\n", (pktgen.flags & PROMISCUOUS_ON_FLAG)? "Enabled" : "Disabled"); fprintf(fd, "# Port Descriptions (-- = blacklisted port):\n"); for(i=0; i < RTE_MAX_ETHPORTS; i++) { if ( strlen(pktgen.portdesc[i]) ) { if ( (pktgen.enabled_port_mask & (1 << i)) == 0 ) strcpy(buff, "--"); else strcpy(buff, "++"); fprintf(fd, "# %s %s\n", buff, pktgen.portdesc[i]); } } fprintf(fd, "\n#######################################################################\n"); fprintf(fd, "# Global configuration:\n"); fprintf(fd, "geometry %dx%d\n", pktgen.scrn->ncols, pktgen.scrn->nrows); fprintf(fd, "mac_from_arp %s\n\n", (pktgen.flags & MAC_FROM_ARP_FLAG)? "enable" : "disable"); for(i=0; i < RTE_MAX_ETHPORTS; i++) { info = &pktgen.info[i]; pkt = &info->seq_pkt[SINGLE_PKT]; range = &info->range; if ( info->tx_burst == 0 ) continue; fprintf(fd, "######################### Port %2d ##################################\n", i); if ( info->transmit_count == 0 ) strcpy(buff, "Forever"); else snprintf(buff, sizeof(buff), "%ld", info->transmit_count); fprintf(fd, "#\n"); flags = rte_atomic32_read(&info->port_flags); fprintf(fd, "# Port: %2d, Burst:%3d, Rate:%3d%%, Flags:%08x, TX Count:%s\n", info->pid, info->tx_burst, info->tx_rate, flags, buff); fprintf(fd, "# SeqCnt:%d, Prime:%d VLAN ID:%04x, ", info->seqCnt, info->prime_cnt, info->vlanid); pktgen_link_state(info->pid, buff, sizeof(buff)); fprintf(fd, "Link: %s\n", buff); fprintf(fd, "#\n# Set up the primary port information:\n"); fprintf(fd, "set %d count %ld\n", info->pid, info->transmit_count); fprintf(fd, "set %d size %d\n", info->pid, pkt->pktSize+FCS_SIZE); fprintf(fd, "set %d rate %d\n", info->pid, info->tx_rate); fprintf(fd, "set %d burst %d\n", info->pid, info->tx_burst); fprintf(fd, "set %d sport %d\n", info->pid, pkt->sport); fprintf(fd, "set %d dport %d\n", info->pid, pkt->dport); fprintf(fd, "set %d prime %d\n", info->pid, info->prime_cnt); fprintf(fd, "set %s %d\n", (pkt->ethType == ETHER_TYPE_IPv4)? "ipv4" : (pkt->ethType == ETHER_TYPE_IPv6)? "ipv6" : (pkt->ethType == ETHER_TYPE_VLAN)? "vlan" : "unknown", i); fprintf(fd, "set %s %d\n", (pkt->ipProto == PG_IPPROTO_TCP)? "tcp" : (pkt->ipProto == PG_IPPROTO_ICMP)? "icmp" : "udp", i); fprintf(fd, "set ip dst %d %s\n", i, inet_ntop4(buff, sizeof(buff), ntohl(pkt->ip_dst_addr), 0xFFFFFFFF)); fprintf(fd, "set ip src %d %s\n", i, inet_ntop4(buff, sizeof(buff), ntohl(pkt->ip_src_addr), pkt->ip_mask)); fprintf(fd, "set mac %d %s\n", info->pid, inet_mtoa(buff, sizeof(buff), &pkt->eth_dst_addr)); fprintf(fd, "vlanid %d %d\n\n", i, pkt->vlanid); fprintf(fd, "#\n# Port flag values:\n"); fprintf(fd, "icmp.echo %d %sable\n", i, (flags & ICMP_ECHO_ENABLE_FLAG)? "en" : "dis"); fprintf(fd, "pcap %d %sable\n", i, (flags & SEND_PCAP_PKTS)? "en" : "dis"); fprintf(fd, "range %d %sable\n", i, (flags & SEND_RANGE_PKTS)? "en" : "dis"); fprintf(fd, "process %d %sable\n", i, (flags & PROCESS_INPUT_PKTS)? "en" : "dis"); fprintf(fd, "tap %d %sable\n", i, (flags & PROCESS_TAP_PKTS)? "en" : "dis"); fprintf(fd, "vlan %d %sable\n\n", i, (flags & SEND_VLAN_ID)? "en" : "dis"); fprintf(fd, "#\n# Range packet information:\n"); fprintf(fd, "src.mac start %d %s\n", i, inet_mtoa(buff, sizeof(buff), inet_h64tom(range->src_mac, &eaddr))); fprintf(fd, "src.mac min %d %s\n", i, inet_mtoa(buff, sizeof(buff), inet_h64tom(range->src_mac_min, &eaddr))); fprintf(fd, "src.mac max %d %s\n", i, inet_mtoa(buff, sizeof(buff), inet_h64tom(range->src_mac_max, &eaddr))); fprintf(fd, "src.mac inc %d %s\n", i, inet_mtoa(buff, sizeof(buff), inet_h64tom(range->src_mac_inc, &eaddr))); fprintf(fd, "dst.mac start %d %s\n", i, inet_mtoa(buff, sizeof(buff), inet_h64tom(range->dst_mac, &eaddr))); fprintf(fd, "dst.mac min %d %s\n", i, inet_mtoa(buff, sizeof(buff), inet_h64tom(range->dst_mac_min, &eaddr))); fprintf(fd, "dst.mac max %d %s\n", i, inet_mtoa(buff, sizeof(buff), inet_h64tom(range->dst_mac_max, &eaddr))); fprintf(fd, "dst.mac inc %d %s\n", i, inet_mtoa(buff, sizeof(buff), inet_h64tom(range->dst_mac_inc, &eaddr))); fprintf(fd, "\n"); fprintf(fd, "src.ip start %d %s\n", i, inet_ntop4(buff, sizeof(buff), ntohl(range->src_ip), 0xFFFFFFFF)); fprintf(fd, "src.ip min %d %s\n", i, inet_ntop4(buff, sizeof(buff), ntohl(range->src_ip_min), 0xFFFFFFFF)); fprintf(fd, "src.ip max %d %s\n", i, inet_ntop4(buff, sizeof(buff), ntohl(range->src_ip_max), 0xFFFFFFFF)); fprintf(fd, "src.ip inc %d %s\n", i, inet_ntop4(buff, sizeof(buff), ntohl(range->src_ip_inc), 0xFFFFFFFF)); fprintf(fd, "\n"); fprintf(fd, "dst.ip start %d %s\n", i, inet_ntop4(buff, sizeof(buff), ntohl(range->dst_ip), 0xFFFFFFFF)); fprintf(fd, "dst.ip min %d %s\n", i, inet_ntop4(buff, sizeof(buff), ntohl(range->dst_ip_min), 0xFFFFFFFF)); fprintf(fd, "dst.ip max %d %s\n", i, inet_ntop4(buff, sizeof(buff), ntohl(range->dst_ip_max), 0xFFFFFFFF)); fprintf(fd, "dst.ip inc %d %s\n", i, inet_ntop4(buff, sizeof(buff), ntohl(range->dst_ip_inc), 0xFFFFFFFF)); fprintf(fd, "\n"); fprintf(fd, "src.port start %d %d\n", i, range->src_port); fprintf(fd, "src.port min %d %d\n", i, range->src_port_min); fprintf(fd, "src.port max %d %d\n", i, range->src_port_max); fprintf(fd, "src.port inc %d %d\n", i, range->src_port_inc); fprintf(fd, "\n"); fprintf(fd, "dst.port start %d %d\n", i, range->dst_port); fprintf(fd, "dst.port min %d %d\n", i, range->dst_port_min); fprintf(fd, "dst.port max %d %d\n", i, range->dst_port_max); fprintf(fd, "dst.port inc %d %d\n", i, range->dst_port_inc); fprintf(fd, "\n"); fprintf(fd, "vlan.id start %d %d\n", i, range->vlan_id); fprintf(fd, "vlan.id min %d %d\n", i, range->vlan_id_min); fprintf(fd, "vlan.id max %d %d\n", i, range->vlan_id_max); fprintf(fd, "vlan.id inc %d %d\n", i, range->vlan_id_inc); fprintf(fd, "\n"); fprintf(fd, "pkt.size start %d %d\n", i, range->pkt_size + FCS_SIZE); fprintf(fd, "pkt.size min %d %d\n", i, range->pkt_size_min + FCS_SIZE); fprintf(fd, "pkt.size max %d %d\n", i, range->pkt_size_max + FCS_SIZE); fprintf(fd, "pkt.size inc %d %d\n\n", i, range->pkt_size_inc); fprintf(fd, "#\n# Set up the sequence data for the port.\n"); fprintf(fd, "set %d seqCnt %d\n", info->pid, info->seqCnt); for(j=0; j<info->seqCnt; j++) { pkt = &info->seq_pkt[j]; fprintf(fd, "seq %d %d %s ", j, i, inet_mtoa(buff, sizeof(buff), &pkt->eth_dst_addr)); fprintf(fd, "%s ", inet_mtoa(buff, sizeof(buff), &pkt->eth_src_addr)); fprintf(fd, "%s ", inet_ntop4(buff, sizeof(buff), htonl(pkt->ip_dst_addr), 0xFFFFFFFF)); fprintf(fd, "%s ", inet_ntop4(buff, sizeof(buff), htonl(pkt->ip_src_addr), pkt->ip_mask)); fprintf(fd, "%d %d %s %s %d %d\n", pkt->sport, pkt->dport, (pkt->ethType == ETHER_TYPE_IPv4)? "ipv4" : (pkt->ethType == ETHER_TYPE_IPv6)? "ipv6" : (pkt->ethType == ETHER_TYPE_VLAN)? "vlan" : "Other", (pkt->ipProto == PG_IPPROTO_TCP)? "tcp" : (pkt->ipProto == PG_IPPROTO_ICMP)? "icmp" : "udp", pkt->vlanid, pkt->pktSize+FCS_SIZE); } if ( pktgen.info[i].pcap ) { fprintf(fd, "#\n# PCAP port %d\n", i); fprintf(fd, "# Packet count: %d\n", pktgen.info[i].pcap->pkt_count); fprintf(fd, "# Filename : %s\n", pktgen.info[i].pcap->filename); } fprintf(fd, "\n"); } fprintf(fd, "################################ Done #################################\n"); fclose(fd); return 0; }
void pktgen_page_seq(uint32_t pid) { uint32_t i, row, col; port_info_t *info; pkt_seq_t *pkt; char buff[64]; display_topline("<Sequence Page>"); info = &pktgen.info[pid]; row = PORT_STATE_ROW; col = 1; scrn_printf(row, col, "Port: %2d, Sequence Count: %2d of %2d ", pid, info->seqCnt, NUM_SEQ_PKTS); scrn_fgcolor(SCRN_BLUE, SCRN_BOLD); scrn_printf(row++, col + 111, "GTPu"); scrn_printf(row++, col, "%*s %*s%*s%*s%*s%*s%*s%*s%*s%*s%*s", 6, "Seq:", 18, "Dst MAC", 18, "Src MAC", 16, "Dst IP", 18, "Src IP", 12, "Port S/D", 14, "Protocol:VLAN", 4, "CoS", 4, "ToS", 6, "Size", 6, "TEID"); scrn_fgcolor(SCRN_DEFAULT_FG, SCRN_NO_ATTR); for (i = 0; i < NUM_SEQ_PKTS; i++) { pkt = &info->seq_pkt[i]; if (i >= info->seqCnt) { scrn_eol_pos(row++, col); continue; } col = 1; scrn_printf(row, col, "%c%4d:", pkt->seq_enabled ? '*' : ' ', i); col += 7; scrn_printf(row, col, "%*s", 18, inet_mtoa(buff, sizeof(buff), &pkt->eth_dst_addr)); col += 18; scrn_printf(row, col, "%*s", 18, inet_mtoa(buff, sizeof(buff), &pkt->eth_src_addr)); col += 18; scrn_printf(row, col, "%*s", 16, inet_ntop4(buff, sizeof(buff), htonl(pkt->ip_dst_addr.addr.ipv4.s_addr), 0xFFFFFFFF)); col += 16; scrn_printf(row, col, "%*s", 16 + 2, inet_ntop4(buff, sizeof(buff), htonl(pkt->ip_src_addr.addr.ipv4.s_addr), pkt->ip_mask)); col += 18; snprintf(buff, sizeof(buff), "%d/%d", pkt->sport, pkt->dport); scrn_printf(row, col, "%*s", 12, buff); col += 12; snprintf(buff, sizeof(buff), "%s/%s:%04x", (pkt->ethType == ETHER_TYPE_IPv4) ? "IPv4" : (pkt->ethType == ETHER_TYPE_IPv6) ? "IPv6" : "Other", (pkt->ipProto == PG_IPPROTO_TCP) ? "TCP" : (pkt->ipProto == PG_IPPROTO_ICMP) ? "ICMP" : "UDP", pkt->vlanid); scrn_printf(row, col, "%*s", 14, buff); col += 14; scrn_printf(row, col, "%3d", pkt->cos); col += 4; scrn_printf(row, col, "%3d", pkt->tos); col += 4; scrn_printf(row, col, "%5d", pkt->pktSize + FCS_SIZE); col += 6; scrn_printf(row, col, "%5d", pkt->gtpu_teid); row++; } display_dashline(row + 2); }