Lines Matching refs:pkt_dev

493 static void pktgen_clear_counters(struct pktgen_dev *pkt_dev);
494 static void fill_imix_distribution(struct pktgen_dev *pkt_dev);
568 const struct pktgen_dev *pkt_dev = seq->private; in pktgen_if_show() local
575 (unsigned long long)pkt_dev->count, pkt_dev->min_pkt_size, in pktgen_if_show()
576 pkt_dev->max_pkt_size); in pktgen_if_show()
578 if (pkt_dev->n_imix_entries > 0) { in pktgen_if_show()
580 for (i = 0; i < pkt_dev->n_imix_entries; i++) { in pktgen_if_show()
582 pkt_dev->imix_entries[i].size, in pktgen_if_show()
583 pkt_dev->imix_entries[i].weight); in pktgen_if_show()
590 pkt_dev->nfrags, (unsigned long long) pkt_dev->delay, in pktgen_if_show()
591 pkt_dev->clone_skb, pkt_dev->odevname); in pktgen_if_show()
593 seq_printf(seq, " flows: %u flowlen: %u\n", pkt_dev->cflows, in pktgen_if_show()
594 pkt_dev->lflow); in pktgen_if_show()
598 pkt_dev->queue_map_min, in pktgen_if_show()
599 pkt_dev->queue_map_max); in pktgen_if_show()
601 if (pkt_dev->skb_priority) in pktgen_if_show()
603 pkt_dev->skb_priority); in pktgen_if_show()
605 if (pkt_dev->flags & F_IPV6) { in pktgen_if_show()
609 &pkt_dev->in6_saddr, in pktgen_if_show()
610 &pkt_dev->min_in6_saddr, &pkt_dev->max_in6_saddr, in pktgen_if_show()
611 &pkt_dev->in6_daddr, in pktgen_if_show()
612 &pkt_dev->min_in6_daddr, &pkt_dev->max_in6_daddr); in pktgen_if_show()
616 pkt_dev->dst_min, pkt_dev->dst_max); in pktgen_if_show()
619 pkt_dev->src_min, pkt_dev->src_max); in pktgen_if_show()
625 is_zero_ether_addr(pkt_dev->src_mac) ? in pktgen_if_show()
626 pkt_dev->odev->dev_addr : pkt_dev->src_mac); in pktgen_if_show()
629 seq_printf(seq, "%pM\n", pkt_dev->dst_mac); in pktgen_if_show()
633 pkt_dev->udp_src_min, pkt_dev->udp_src_max, in pktgen_if_show()
634 pkt_dev->udp_dst_min, pkt_dev->udp_dst_max); in pktgen_if_show()
638 pkt_dev->src_mac_count, pkt_dev->dst_mac_count); in pktgen_if_show()
640 if (pkt_dev->nr_labels) { in pktgen_if_show()
642 for (i = 0; i < pkt_dev->nr_labels; i++) in pktgen_if_show()
643 seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]), in pktgen_if_show()
644 i == pkt_dev->nr_labels-1 ? "\n" : ", "); in pktgen_if_show()
647 if (pkt_dev->vlan_id != 0xffff) in pktgen_if_show()
649 pkt_dev->vlan_id, pkt_dev->vlan_p, in pktgen_if_show()
650 pkt_dev->vlan_cfi); in pktgen_if_show()
652 if (pkt_dev->svlan_id != 0xffff) in pktgen_if_show()
654 pkt_dev->svlan_id, pkt_dev->svlan_p, in pktgen_if_show()
655 pkt_dev->svlan_cfi); in pktgen_if_show()
657 if (pkt_dev->tos) in pktgen_if_show()
658 seq_printf(seq, " tos: 0x%02x\n", pkt_dev->tos); in pktgen_if_show()
660 if (pkt_dev->traffic_class) in pktgen_if_show()
661 seq_printf(seq, " traffic_class: 0x%02x\n", pkt_dev->traffic_class); in pktgen_if_show()
663 if (pkt_dev->burst > 1) in pktgen_if_show()
664 seq_printf(seq, " burst: %d\n", pkt_dev->burst); in pktgen_if_show()
666 if (pkt_dev->node >= 0) in pktgen_if_show()
667 seq_printf(seq, " node: %d\n", pkt_dev->node); in pktgen_if_show()
669 if (pkt_dev->xmit_mode == M_NETIF_RECEIVE) in pktgen_if_show()
671 else if (pkt_dev->xmit_mode == M_QUEUE_XMIT) in pktgen_if_show()
678 if (!pkt_dev->cflows) in pktgen_if_show()
681 if (pkt_dev->flags & (1 << i)) { in pktgen_if_show()
684 if (i == IPSEC_SHIFT && pkt_dev->spi) in pktgen_if_show()
685 seq_printf(seq, "spi:%u ", pkt_dev->spi); in pktgen_if_show()
695 stopped = pkt_dev->running ? ktime_get() : pkt_dev->stopped_at; in pktgen_if_show()
696 idle = pkt_dev->idle_acc; in pktgen_if_show()
701 (unsigned long long)pkt_dev->sofar, in pktgen_if_show()
702 (unsigned long long)pkt_dev->errors); in pktgen_if_show()
704 if (pkt_dev->n_imix_entries > 0) { in pktgen_if_show()
708 for (i = 0; i < pkt_dev->n_imix_entries; i++) { in pktgen_if_show()
710 pkt_dev->imix_entries[i].size, in pktgen_if_show()
711 pkt_dev->imix_entries[i].count_so_far); in pktgen_if_show()
718 (unsigned long long) ktime_to_us(pkt_dev->started_at), in pktgen_if_show()
724 pkt_dev->seq_num, pkt_dev->cur_dst_mac_offset, in pktgen_if_show()
725 pkt_dev->cur_src_mac_offset); in pktgen_if_show()
727 if (pkt_dev->flags & F_IPV6) { in pktgen_if_show()
729 &pkt_dev->cur_in6_saddr, in pktgen_if_show()
730 &pkt_dev->cur_in6_daddr); in pktgen_if_show()
733 &pkt_dev->cur_saddr, &pkt_dev->cur_daddr); in pktgen_if_show()
736 pkt_dev->cur_udp_dst, pkt_dev->cur_udp_src); in pktgen_if_show()
738 seq_printf(seq, " cur_queue_map: %u\n", pkt_dev->cur_queue_map); in pktgen_if_show()
740 seq_printf(seq, " flows: %u\n", pkt_dev->nflows); in pktgen_if_show()
742 if (pkt_dev->result[0]) in pktgen_if_show()
743 seq_printf(seq, "Result: %s\n", pkt_dev->result); in pktgen_if_show()
852 struct pktgen_dev *pkt_dev) in get_imix_entries() argument
858 pkt_dev->n_imix_entries = 0; in get_imix_entries()
864 if (pkt_dev->n_imix_entries >= MAX_IMIX_ENTRIES) in get_imix_entries()
896 pkt_dev->imix_entries[pkt_dev->n_imix_entries].size = size; in get_imix_entries()
897 pkt_dev->imix_entries[pkt_dev->n_imix_entries].weight = weight; in get_imix_entries()
900 pkt_dev->n_imix_entries++; in get_imix_entries()
913 size_t maxlen, struct pktgen_dev *pkt_dev) in get_labels() argument
920 pkt_dev->nr_labels = 0; in get_labels()
939 pkt_dev->labels[n] = htonl(tmp); in get_labels()
940 if (pkt_dev->labels[n] & MPLS_STACK_BOTTOM) in get_labels()
941 pkt_dev->flags |= F_MPLS_RND; in get_labels()
951 pkt_dev->nr_labels = n; in get_labels()
989 struct pktgen_dev *pkt_dev = seq->private; in pktgen_if_write() local
997 pg_result = &(pkt_dev->result[0]); in pktgen_if_write()
1049 if (value != pkt_dev->min_pkt_size) { in pktgen_if_write()
1050 pkt_dev->min_pkt_size = value; in pktgen_if_write()
1051 pkt_dev->cur_pkt_size = value; in pktgen_if_write()
1054 pkt_dev->min_pkt_size); in pktgen_if_write()
1066 if (value != pkt_dev->max_pkt_size) { in pktgen_if_write()
1067 pkt_dev->max_pkt_size = value; in pktgen_if_write()
1068 pkt_dev->cur_pkt_size = value; in pktgen_if_write()
1071 pkt_dev->max_pkt_size); in pktgen_if_write()
1085 if (value != pkt_dev->min_pkt_size) { in pktgen_if_write()
1086 pkt_dev->min_pkt_size = value; in pktgen_if_write()
1087 pkt_dev->max_pkt_size = value; in pktgen_if_write()
1088 pkt_dev->cur_pkt_size = value; in pktgen_if_write()
1090 sprintf(pg_result, "OK: pkt_size=%d", pkt_dev->min_pkt_size); in pktgen_if_write()
1095 if (pkt_dev->clone_skb > 0) in pktgen_if_write()
1099 len = get_imix_entries(&user_buffer[i], max, pkt_dev); in pktgen_if_write()
1103 fill_imix_distribution(pkt_dev); in pktgen_if_write()
1125 pkt_dev->nfrags = value; in pktgen_if_write()
1126 sprintf(pg_result, "OK: frags=%d", pkt_dev->nfrags); in pktgen_if_write()
1136 pkt_dev->delay = ULLONG_MAX; in pktgen_if_write()
1138 pkt_dev->delay = (u64)value; in pktgen_if_write()
1141 (unsigned long long) pkt_dev->delay); in pktgen_if_write()
1152 pkt_dev->delay = pkt_dev->min_pkt_size*8*NSEC_PER_USEC/value; in pktgen_if_write()
1154 pr_info("Delay set at: %llu ns\n", pkt_dev->delay); in pktgen_if_write()
1167 pkt_dev->delay = NSEC_PER_SEC/value; in pktgen_if_write()
1169 pr_info("Delay set at: %llu ns\n", pkt_dev->delay); in pktgen_if_write()
1180 if (value != pkt_dev->udp_src_min) { in pktgen_if_write()
1181 pkt_dev->udp_src_min = value; in pktgen_if_write()
1182 pkt_dev->cur_udp_src = value; in pktgen_if_write()
1184 sprintf(pg_result, "OK: udp_src_min=%u", pkt_dev->udp_src_min); in pktgen_if_write()
1193 if (value != pkt_dev->udp_dst_min) { in pktgen_if_write()
1194 pkt_dev->udp_dst_min = value; in pktgen_if_write()
1195 pkt_dev->cur_udp_dst = value; in pktgen_if_write()
1197 sprintf(pg_result, "OK: udp_dst_min=%u", pkt_dev->udp_dst_min); in pktgen_if_write()
1206 if (value != pkt_dev->udp_src_max) { in pktgen_if_write()
1207 pkt_dev->udp_src_max = value; in pktgen_if_write()
1208 pkt_dev->cur_udp_src = value; in pktgen_if_write()
1210 sprintf(pg_result, "OK: udp_src_max=%u", pkt_dev->udp_src_max); in pktgen_if_write()
1219 if (value != pkt_dev->udp_dst_max) { in pktgen_if_write()
1220 pkt_dev->udp_dst_max = value; in pktgen_if_write()
1221 pkt_dev->cur_udp_dst = value; in pktgen_if_write()
1223 sprintf(pg_result, "OK: udp_dst_max=%u", pkt_dev->udp_dst_max); in pktgen_if_write()
1235 ((pkt_dev->xmit_mode == M_NETIF_RECEIVE) || in pktgen_if_write()
1236 !(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))) in pktgen_if_write()
1238 if (value > 0 && (pkt_dev->n_imix_entries > 0 || in pktgen_if_write()
1239 !(pkt_dev->flags & F_SHARED))) in pktgen_if_write()
1242 pkt_dev->clone_skb = value; in pktgen_if_write()
1244 sprintf(pg_result, "OK: clone_skb=%d", pkt_dev->clone_skb); in pktgen_if_write()
1253 pkt_dev->count = value; in pktgen_if_write()
1255 (unsigned long long)pkt_dev->count); in pktgen_if_write()
1264 if (pkt_dev->src_mac_count != value) { in pktgen_if_write()
1265 pkt_dev->src_mac_count = value; in pktgen_if_write()
1266 pkt_dev->cur_src_mac_offset = 0; in pktgen_if_write()
1269 pkt_dev->src_mac_count); in pktgen_if_write()
1278 if (pkt_dev->dst_mac_count != value) { in pktgen_if_write()
1279 pkt_dev->dst_mac_count = value; in pktgen_if_write()
1280 pkt_dev->cur_dst_mac_offset = 0; in pktgen_if_write()
1283 pkt_dev->dst_mac_count); in pktgen_if_write()
1293 ((pkt_dev->xmit_mode == M_QUEUE_XMIT) || in pktgen_if_write()
1294 ((pkt_dev->xmit_mode == M_START_XMIT) && in pktgen_if_write()
1295 (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))))) in pktgen_if_write()
1298 if (value > 1 && !(pkt_dev->flags & F_SHARED)) in pktgen_if_write()
1301 pkt_dev->burst = value < 1 ? 1 : value; in pktgen_if_write()
1302 sprintf(pg_result, "OK: burst=%u", pkt_dev->burst); in pktgen_if_write()
1312 pkt_dev->node = value; in pktgen_if_write()
1313 sprintf(pg_result, "OK: node=%d", pkt_dev->node); in pktgen_if_write()
1314 if (pkt_dev->page) { in pktgen_if_write()
1315 put_page(pkt_dev->page); in pktgen_if_write()
1316 pkt_dev->page = NULL; in pktgen_if_write()
1336 pkt_dev->xmit_mode = M_START_XMIT; in pktgen_if_write()
1339 if (pkt_dev->clone_skb > 0) in pktgen_if_write()
1342 pkt_dev->xmit_mode = M_NETIF_RECEIVE; in pktgen_if_write()
1347 pkt_dev->last_ok = 1; in pktgen_if_write()
1349 pkt_dev->xmit_mode = M_QUEUE_XMIT; in pktgen_if_write()
1350 pkt_dev->last_ok = 1; in pktgen_if_write()
1383 if (flag == F_SHARED && (pkt_dev->clone_skb || in pktgen_if_write()
1384 pkt_dev->burst > 1)) in pktgen_if_write()
1386 pkt_dev->flags &= ~flag; in pktgen_if_write()
1388 pkt_dev->flags |= flag; in pktgen_if_write()
1391 sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags); in pktgen_if_write()
1396 end = pkt_dev->result + sizeof(pkt_dev->result); in pktgen_if_write()
1415 max = min(sizeof(pkt_dev->dst_min) - 1, count - i); in pktgen_if_write()
1423 if (strcmp(buf, pkt_dev->dst_min) != 0) { in pktgen_if_write()
1424 strscpy_pad(pkt_dev->dst_min, buf); in pktgen_if_write()
1425 pkt_dev->daddr_min = in_aton(pkt_dev->dst_min); in pktgen_if_write()
1426 pkt_dev->cur_daddr = pkt_dev->daddr_min; in pktgen_if_write()
1429 pr_debug("dst_min set to: %s\n", pkt_dev->dst_min); in pktgen_if_write()
1431 sprintf(pg_result, "OK: dst_min=%s", pkt_dev->dst_min); in pktgen_if_write()
1435 max = min(sizeof(pkt_dev->dst_max) - 1, count - i); in pktgen_if_write()
1443 if (strcmp(buf, pkt_dev->dst_max) != 0) { in pktgen_if_write()
1444 strscpy_pad(pkt_dev->dst_max, buf); in pktgen_if_write()
1445 pkt_dev->daddr_max = in_aton(pkt_dev->dst_max); in pktgen_if_write()
1446 pkt_dev->cur_daddr = pkt_dev->daddr_max; in pktgen_if_write()
1449 pr_debug("dst_max set to: %s\n", pkt_dev->dst_max); in pktgen_if_write()
1451 sprintf(pg_result, "OK: dst_max=%s", pkt_dev->dst_max); in pktgen_if_write()
1460 pkt_dev->flags |= F_IPV6; in pktgen_if_write()
1466 in6_pton(buf, -1, pkt_dev->in6_daddr.s6_addr, -1, NULL); in pktgen_if_write()
1467 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_daddr); in pktgen_if_write()
1469 pkt_dev->cur_in6_daddr = pkt_dev->in6_daddr; in pktgen_if_write()
1483 pkt_dev->flags |= F_IPV6; in pktgen_if_write()
1489 in6_pton(buf, -1, pkt_dev->min_in6_daddr.s6_addr, -1, NULL); in pktgen_if_write()
1490 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->min_in6_daddr); in pktgen_if_write()
1492 pkt_dev->cur_in6_daddr = pkt_dev->min_in6_daddr; in pktgen_if_write()
1505 pkt_dev->flags |= F_IPV6; in pktgen_if_write()
1511 in6_pton(buf, -1, pkt_dev->max_in6_daddr.s6_addr, -1, NULL); in pktgen_if_write()
1512 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->max_in6_daddr); in pktgen_if_write()
1526 pkt_dev->flags |= F_IPV6; in pktgen_if_write()
1532 in6_pton(buf, -1, pkt_dev->in6_saddr.s6_addr, -1, NULL); in pktgen_if_write()
1533 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_saddr); in pktgen_if_write()
1535 pkt_dev->cur_in6_saddr = pkt_dev->in6_saddr; in pktgen_if_write()
1544 max = min(sizeof(pkt_dev->src_min) - 1, count - i); in pktgen_if_write()
1552 if (strcmp(buf, pkt_dev->src_min) != 0) { in pktgen_if_write()
1553 strscpy_pad(pkt_dev->src_min, buf); in pktgen_if_write()
1554 pkt_dev->saddr_min = in_aton(pkt_dev->src_min); in pktgen_if_write()
1555 pkt_dev->cur_saddr = pkt_dev->saddr_min; in pktgen_if_write()
1558 pr_debug("src_min set to: %s\n", pkt_dev->src_min); in pktgen_if_write()
1560 sprintf(pg_result, "OK: src_min=%s", pkt_dev->src_min); in pktgen_if_write()
1564 max = min(sizeof(pkt_dev->src_max) - 1, count - i); in pktgen_if_write()
1572 if (strcmp(buf, pkt_dev->src_max) != 0) { in pktgen_if_write()
1573 strscpy_pad(pkt_dev->src_max, buf); in pktgen_if_write()
1574 pkt_dev->saddr_max = in_aton(pkt_dev->src_max); in pktgen_if_write()
1575 pkt_dev->cur_saddr = pkt_dev->saddr_max; in pktgen_if_write()
1578 pr_debug("src_max set to: %s\n", pkt_dev->src_max); in pktgen_if_write()
1580 sprintf(pg_result, "OK: src_max=%s", pkt_dev->src_max); in pktgen_if_write()
1593 if (!mac_pton(valstr, pkt_dev->dst_mac)) in pktgen_if_write()
1596 ether_addr_copy(&pkt_dev->hh[0], pkt_dev->dst_mac); in pktgen_if_write()
1598 sprintf(pg_result, "OK: dstmac %pM", pkt_dev->dst_mac); in pktgen_if_write()
1611 if (!mac_pton(valstr, pkt_dev->src_mac)) in pktgen_if_write()
1614 ether_addr_copy(&pkt_dev->hh[6], pkt_dev->src_mac); in pktgen_if_write()
1616 sprintf(pg_result, "OK: srcmac %pM", pkt_dev->src_mac); in pktgen_if_write()
1621 pktgen_clear_counters(pkt_dev); in pktgen_if_write()
1635 pkt_dev->cflows = value; in pktgen_if_write()
1636 sprintf(pg_result, "OK: flows=%u", pkt_dev->cflows); in pktgen_if_write()
1646 pkt_dev->spi = value; in pktgen_if_write()
1647 sprintf(pg_result, "OK: spi=%u", pkt_dev->spi); in pktgen_if_write()
1657 pkt_dev->lflow = value; in pktgen_if_write()
1658 sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow); in pktgen_if_write()
1668 pkt_dev->queue_map_min = value; in pktgen_if_write()
1669 sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min); in pktgen_if_write()
1679 pkt_dev->queue_map_max = value; in pktgen_if_write()
1680 sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max); in pktgen_if_write()
1688 len = get_labels(&user_buffer[i], max, pkt_dev); in pktgen_if_write()
1693 for (n = 0; n < pkt_dev->nr_labels; n++) in pktgen_if_write()
1695 "%08x%s", ntohl(pkt_dev->labels[n]), in pktgen_if_write()
1696 n == pkt_dev->nr_labels-1 ? "" : ","); in pktgen_if_write()
1698 if (pkt_dev->nr_labels && pkt_dev->vlan_id != 0xffff) { in pktgen_if_write()
1699 pkt_dev->vlan_id = 0xffff; /* turn off VLAN/SVLAN */ in pktgen_if_write()
1700 pkt_dev->svlan_id = 0xffff; in pktgen_if_write()
1715 pkt_dev->vlan_id = value; /* turn on VLAN */ in pktgen_if_write()
1720 if (debug && pkt_dev->nr_labels) in pktgen_if_write()
1723 pkt_dev->nr_labels = 0; /* turn off MPLS */ in pktgen_if_write()
1724 sprintf(pg_result, "OK: vlan_id=%u", pkt_dev->vlan_id); in pktgen_if_write()
1726 pkt_dev->vlan_id = 0xffff; /* turn off VLAN/SVLAN */ in pktgen_if_write()
1727 pkt_dev->svlan_id = 0xffff; in pktgen_if_write()
1741 if ((value <= 7) && (pkt_dev->vlan_id != 0xffff)) { in pktgen_if_write()
1742 pkt_dev->vlan_p = value; in pktgen_if_write()
1743 sprintf(pg_result, "OK: vlan_p=%u", pkt_dev->vlan_p); in pktgen_if_write()
1756 if ((value <= 1) && (pkt_dev->vlan_id != 0xffff)) { in pktgen_if_write()
1757 pkt_dev->vlan_cfi = value; in pktgen_if_write()
1758 sprintf(pg_result, "OK: vlan_cfi=%u", pkt_dev->vlan_cfi); in pktgen_if_write()
1771 if ((value <= 4095) && ((pkt_dev->vlan_id != 0xffff))) { in pktgen_if_write()
1772 pkt_dev->svlan_id = value; /* turn on SVLAN */ in pktgen_if_write()
1777 if (debug && pkt_dev->nr_labels) in pktgen_if_write()
1780 pkt_dev->nr_labels = 0; /* turn off MPLS */ in pktgen_if_write()
1781 sprintf(pg_result, "OK: svlan_id=%u", pkt_dev->svlan_id); in pktgen_if_write()
1783 pkt_dev->vlan_id = 0xffff; /* turn off VLAN/SVLAN */ in pktgen_if_write()
1784 pkt_dev->svlan_id = 0xffff; in pktgen_if_write()
1798 if ((value <= 7) && (pkt_dev->svlan_id != 0xffff)) { in pktgen_if_write()
1799 pkt_dev->svlan_p = value; in pktgen_if_write()
1800 sprintf(pg_result, "OK: svlan_p=%u", pkt_dev->svlan_p); in pktgen_if_write()
1813 if ((value <= 1) && (pkt_dev->svlan_id != 0xffff)) { in pktgen_if_write()
1814 pkt_dev->svlan_cfi = value; in pktgen_if_write()
1815 sprintf(pg_result, "OK: svlan_cfi=%u", pkt_dev->svlan_cfi); in pktgen_if_write()
1831 pkt_dev->tos = tmp_value; in pktgen_if_write()
1832 sprintf(pg_result, "OK: tos=0x%02x", pkt_dev->tos); in pktgen_if_write()
1848 pkt_dev->traffic_class = tmp_value; in pktgen_if_write()
1849 sprintf(pg_result, "OK: traffic_class=0x%02x", pkt_dev->traffic_class); in pktgen_if_write()
1862 pkt_dev->skb_priority = value; in pktgen_if_write()
1864 pkt_dev->skb_priority); in pktgen_if_write()
1868 sprintf(pkt_dev->result, "No such parameter \"%s\"", name); in pktgen_if_write()
1888 const struct pktgen_dev *pkt_dev; in pktgen_thread_show() local
1895 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) in pktgen_thread_show()
1896 if (pkt_dev->running) in pktgen_thread_show()
1897 seq_printf(seq, "%s ", pkt_dev->odevname); in pktgen_thread_show()
1901 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) in pktgen_thread_show()
1902 if (!pkt_dev->running) in pktgen_thread_show()
1903 seq_printf(seq, "%s ", pkt_dev->odevname); in pktgen_thread_show()
2030 struct pktgen_dev *pkt_dev = NULL; in __pktgen_NN_threads() local
2034 pkt_dev = pktgen_find_dev(t, ifname, exact); in __pktgen_NN_threads()
2035 if (pkt_dev) { in __pktgen_NN_threads()
2037 pkt_dev->removal_mark = 1; in __pktgen_NN_threads()
2043 return pkt_dev; in __pktgen_NN_threads()
2051 struct pktgen_dev *pkt_dev = NULL; in pktgen_mark_device() local
2060 pkt_dev = __pktgen_NN_threads(pn, ifname, REMOVE); in pktgen_mark_device()
2061 if (pkt_dev == NULL) in pktgen_mark_device()
2088 struct pktgen_dev *pkt_dev; in pktgen_change_name() local
2091 list_for_each_entry(pkt_dev, &t->if_list, list) { in pktgen_change_name()
2092 if (pkt_dev->odev != dev) in pktgen_change_name()
2095 proc_remove(pkt_dev->entry); in pktgen_change_name()
2097 pkt_dev->entry = proc_create_data(dev->name, 0600, in pktgen_change_name()
2100 pkt_dev); in pktgen_change_name()
2101 if (!pkt_dev->entry) in pktgen_change_name()
2138 struct pktgen_dev *pkt_dev, in pktgen_dev_get_by_name() argument
2159 struct pktgen_dev *pkt_dev, const char *ifname) in pktgen_setup_dev() argument
2165 if (pkt_dev->odev) { in pktgen_setup_dev()
2166 netdev_put(pkt_dev->odev, &pkt_dev->dev_tracker); in pktgen_setup_dev()
2167 pkt_dev->odev = NULL; in pktgen_setup_dev()
2170 odev = pktgen_dev_get_by_name(pn, pkt_dev, ifname); in pktgen_setup_dev()
2183 pkt_dev->odev = odev; in pktgen_setup_dev()
2184 netdev_tracker_alloc(odev, &pkt_dev->dev_tracker, GFP_KERNEL); in pktgen_setup_dev()
2195 static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) in pktgen_setup_inject() argument
2199 if (!pkt_dev->odev) { in pktgen_setup_inject()
2201 sprintf(pkt_dev->result, in pktgen_setup_inject()
2207 ntxq = pkt_dev->odev->real_num_tx_queues; in pktgen_setup_inject()
2209 if (ntxq <= pkt_dev->queue_map_min) { in pktgen_setup_inject()
2211 pkt_dev->queue_map_min, (ntxq ?: 1) - 1, ntxq, in pktgen_setup_inject()
2212 pkt_dev->odevname); in pktgen_setup_inject()
2213 pkt_dev->queue_map_min = (ntxq ?: 1) - 1; in pktgen_setup_inject()
2215 if (pkt_dev->queue_map_max >= ntxq) { in pktgen_setup_inject()
2217 pkt_dev->queue_map_max, (ntxq ?: 1) - 1, ntxq, in pktgen_setup_inject()
2218 pkt_dev->odevname); in pktgen_setup_inject()
2219 pkt_dev->queue_map_max = (ntxq ?: 1) - 1; in pktgen_setup_inject()
2224 if (is_zero_ether_addr(pkt_dev->src_mac)) in pktgen_setup_inject()
2225 ether_addr_copy(&(pkt_dev->hh[6]), pkt_dev->odev->dev_addr); in pktgen_setup_inject()
2228 ether_addr_copy(&(pkt_dev->hh[0]), pkt_dev->dst_mac); in pktgen_setup_inject()
2230 if (pkt_dev->flags & F_IPV6) { in pktgen_setup_inject()
2234 if (pkt_dev->min_pkt_size == 0) { in pktgen_setup_inject()
2235 pkt_dev->min_pkt_size = 14 + sizeof(struct ipv6hdr) in pktgen_setup_inject()
2238 + pkt_dev->pkt_overhead; in pktgen_setup_inject()
2242 if (pkt_dev->cur_in6_saddr.s6_addr[i]) { in pktgen_setup_inject()
2256 idev = __in6_dev_get(pkt_dev->odev); in pktgen_setup_inject()
2264 pkt_dev->cur_in6_saddr = ifp->addr; in pktgen_setup_inject()
2276 if (pkt_dev->min_pkt_size == 0) { in pktgen_setup_inject()
2277 pkt_dev->min_pkt_size = 14 + sizeof(struct iphdr) in pktgen_setup_inject()
2280 + pkt_dev->pkt_overhead; in pktgen_setup_inject()
2283 pkt_dev->saddr_min = 0; in pktgen_setup_inject()
2284 pkt_dev->saddr_max = 0; in pktgen_setup_inject()
2285 if (strlen(pkt_dev->src_min) == 0) { in pktgen_setup_inject()
2290 in_dev = __in_dev_get_rcu(pkt_dev->odev); in pktgen_setup_inject()
2296 pkt_dev->saddr_min = ifa->ifa_address; in pktgen_setup_inject()
2297 pkt_dev->saddr_max = pkt_dev->saddr_min; in pktgen_setup_inject()
2302 pkt_dev->saddr_min = in_aton(pkt_dev->src_min); in pktgen_setup_inject()
2303 pkt_dev->saddr_max = in_aton(pkt_dev->src_max); in pktgen_setup_inject()
2306 pkt_dev->daddr_min = in_aton(pkt_dev->dst_min); in pktgen_setup_inject()
2307 pkt_dev->daddr_max = in_aton(pkt_dev->dst_max); in pktgen_setup_inject()
2310 pkt_dev->cur_pkt_size = pkt_dev->min_pkt_size; in pktgen_setup_inject()
2311 if (pkt_dev->min_pkt_size > pkt_dev->max_pkt_size) in pktgen_setup_inject()
2312 pkt_dev->max_pkt_size = pkt_dev->min_pkt_size; in pktgen_setup_inject()
2314 pkt_dev->cur_dst_mac_offset = 0; in pktgen_setup_inject()
2315 pkt_dev->cur_src_mac_offset = 0; in pktgen_setup_inject()
2316 pkt_dev->cur_saddr = pkt_dev->saddr_min; in pktgen_setup_inject()
2317 pkt_dev->cur_daddr = pkt_dev->daddr_min; in pktgen_setup_inject()
2318 pkt_dev->cur_udp_dst = pkt_dev->udp_dst_min; in pktgen_setup_inject()
2319 pkt_dev->cur_udp_src = pkt_dev->udp_src_min; in pktgen_setup_inject()
2320 pkt_dev->nflows = 0; in pktgen_setup_inject()
2324 static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) in spin() argument
2352 } while (t.task && pkt_dev->running && !signal_pending(current)); in spin()
2357 pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time)); in spin()
2359 pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay); in spin()
2363 static inline void set_pkt_overhead(struct pktgen_dev *pkt_dev) in set_pkt_overhead() argument
2365 pkt_dev->pkt_overhead = 0; in set_pkt_overhead()
2366 pkt_dev->pkt_overhead += pkt_dev->nr_labels*sizeof(u32); in set_pkt_overhead()
2367 pkt_dev->pkt_overhead += VLAN_TAG_SIZE(pkt_dev); in set_pkt_overhead()
2368 pkt_dev->pkt_overhead += SVLAN_TAG_SIZE(pkt_dev); in set_pkt_overhead()
2371 static inline int f_seen(const struct pktgen_dev *pkt_dev, int flow) in f_seen() argument
2373 return !!(pkt_dev->flows[flow].flags & F_INIT); in f_seen()
2376 static inline int f_pick(struct pktgen_dev *pkt_dev) in f_pick() argument
2378 int flow = pkt_dev->curfl; in f_pick()
2380 if (pkt_dev->flags & F_FLOW_SEQ) { in f_pick()
2381 if (pkt_dev->flows[flow].count >= pkt_dev->lflow) { in f_pick()
2383 pkt_dev->flows[flow].count = 0; in f_pick()
2384 pkt_dev->flows[flow].flags = 0; in f_pick()
2385 pkt_dev->curfl += 1; in f_pick()
2386 if (pkt_dev->curfl >= pkt_dev->cflows) in f_pick()
2387 pkt_dev->curfl = 0; /*reset */ in f_pick()
2390 flow = get_random_u32_below(pkt_dev->cflows); in f_pick()
2391 pkt_dev->curfl = flow; in f_pick()
2393 if (pkt_dev->flows[flow].count > pkt_dev->lflow) { in f_pick()
2394 pkt_dev->flows[flow].count = 0; in f_pick()
2395 pkt_dev->flows[flow].flags = 0; in f_pick()
2399 return pkt_dev->curfl; in f_pick()
2407 static void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow) in get_ipsec_sa() argument
2410 struct xfrm_state *x = pkt_dev->flows[flow].x; in get_ipsec_sa()
2411 struct pktgen_net *pn = net_generic(dev_net(pkt_dev->odev), pg_net_id); in get_ipsec_sa()
2415 if (pkt_dev->spi) { in get_ipsec_sa()
2419 x = xfrm_state_lookup_byspi(pn->net, htonl(pkt_dev->spi), AF_INET); in get_ipsec_sa()
2423 (xfrm_address_t *)&pkt_dev->cur_daddr, in get_ipsec_sa()
2424 (xfrm_address_t *)&pkt_dev->cur_saddr, in get_ipsec_sa()
2426 pkt_dev->ipsmode, in get_ipsec_sa()
2427 pkt_dev->ipsproto, 0); in get_ipsec_sa()
2430 pkt_dev->flows[flow].x = x; in get_ipsec_sa()
2431 set_pkt_overhead(pkt_dev); in get_ipsec_sa()
2432 pkt_dev->pkt_overhead += x->props.header_len; in get_ipsec_sa()
2438 static void set_cur_queue_map(struct pktgen_dev *pkt_dev) in set_cur_queue_map() argument
2440 if (pkt_dev->flags & F_QUEUE_MAP_CPU) in set_cur_queue_map()
2441 pkt_dev->cur_queue_map = smp_processor_id(); in set_cur_queue_map()
2443 else if (pkt_dev->queue_map_min <= pkt_dev->queue_map_max) { in set_cur_queue_map()
2446 if (pkt_dev->flags & F_QUEUE_MAP_RND) { in set_cur_queue_map()
2447 t = get_random_u32_inclusive(pkt_dev->queue_map_min, in set_cur_queue_map()
2448 pkt_dev->queue_map_max); in set_cur_queue_map()
2450 t = pkt_dev->cur_queue_map + 1; in set_cur_queue_map()
2451 if (t > pkt_dev->queue_map_max) in set_cur_queue_map()
2452 t = pkt_dev->queue_map_min; in set_cur_queue_map()
2454 pkt_dev->cur_queue_map = t; in set_cur_queue_map()
2456 pkt_dev->cur_queue_map = pkt_dev->cur_queue_map % pkt_dev->odev->real_num_tx_queues; in set_cur_queue_map()
2462 static void mod_cur_headers(struct pktgen_dev *pkt_dev) in mod_cur_headers() argument
2468 if (pkt_dev->cflows) in mod_cur_headers()
2469 flow = f_pick(pkt_dev); in mod_cur_headers()
2472 if (pkt_dev->src_mac_count > 1) { in mod_cur_headers()
2476 if (pkt_dev->flags & F_MACSRC_RND) in mod_cur_headers()
2477 mc = get_random_u32_below(pkt_dev->src_mac_count); in mod_cur_headers()
2479 mc = pkt_dev->cur_src_mac_offset++; in mod_cur_headers()
2480 if (pkt_dev->cur_src_mac_offset >= in mod_cur_headers()
2481 pkt_dev->src_mac_count) in mod_cur_headers()
2482 pkt_dev->cur_src_mac_offset = 0; in mod_cur_headers()
2485 tmp = pkt_dev->src_mac[5] + (mc & 0xFF); in mod_cur_headers()
2486 pkt_dev->hh[11] = tmp; in mod_cur_headers()
2487 tmp = (pkt_dev->src_mac[4] + ((mc >> 8) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2488 pkt_dev->hh[10] = tmp; in mod_cur_headers()
2489 tmp = (pkt_dev->src_mac[3] + ((mc >> 16) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2490 pkt_dev->hh[9] = tmp; in mod_cur_headers()
2491 tmp = (pkt_dev->src_mac[2] + ((mc >> 24) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2492 pkt_dev->hh[8] = tmp; in mod_cur_headers()
2493 tmp = (pkt_dev->src_mac[1] + (tmp >> 8)); in mod_cur_headers()
2494 pkt_dev->hh[7] = tmp; in mod_cur_headers()
2498 if (pkt_dev->dst_mac_count > 1) { in mod_cur_headers()
2502 if (pkt_dev->flags & F_MACDST_RND) in mod_cur_headers()
2503 mc = get_random_u32_below(pkt_dev->dst_mac_count); in mod_cur_headers()
2506 mc = pkt_dev->cur_dst_mac_offset++; in mod_cur_headers()
2507 if (pkt_dev->cur_dst_mac_offset >= in mod_cur_headers()
2508 pkt_dev->dst_mac_count) { in mod_cur_headers()
2509 pkt_dev->cur_dst_mac_offset = 0; in mod_cur_headers()
2513 tmp = pkt_dev->dst_mac[5] + (mc & 0xFF); in mod_cur_headers()
2514 pkt_dev->hh[5] = tmp; in mod_cur_headers()
2515 tmp = (pkt_dev->dst_mac[4] + ((mc >> 8) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2516 pkt_dev->hh[4] = tmp; in mod_cur_headers()
2517 tmp = (pkt_dev->dst_mac[3] + ((mc >> 16) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2518 pkt_dev->hh[3] = tmp; in mod_cur_headers()
2519 tmp = (pkt_dev->dst_mac[2] + ((mc >> 24) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2520 pkt_dev->hh[2] = tmp; in mod_cur_headers()
2521 tmp = (pkt_dev->dst_mac[1] + (tmp >> 8)); in mod_cur_headers()
2522 pkt_dev->hh[1] = tmp; in mod_cur_headers()
2525 if (pkt_dev->flags & F_MPLS_RND) { in mod_cur_headers()
2528 for (i = 0; i < pkt_dev->nr_labels; i++) in mod_cur_headers()
2529 if (pkt_dev->labels[i] & MPLS_STACK_BOTTOM) in mod_cur_headers()
2530 pkt_dev->labels[i] = MPLS_STACK_BOTTOM | in mod_cur_headers()
2535 if ((pkt_dev->flags & F_VID_RND) && (pkt_dev->vlan_id != 0xffff)) { in mod_cur_headers()
2536 pkt_dev->vlan_id = get_random_u32_below(4096); in mod_cur_headers()
2539 if ((pkt_dev->flags & F_SVID_RND) && (pkt_dev->svlan_id != 0xffff)) { in mod_cur_headers()
2540 pkt_dev->svlan_id = get_random_u32_below(4096); in mod_cur_headers()
2543 if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) { in mod_cur_headers()
2544 if (pkt_dev->flags & F_UDPSRC_RND) in mod_cur_headers()
2545 pkt_dev->cur_udp_src = get_random_u32_inclusive(pkt_dev->udp_src_min, in mod_cur_headers()
2546 pkt_dev->udp_src_max - 1); in mod_cur_headers()
2549 pkt_dev->cur_udp_src++; in mod_cur_headers()
2550 if (pkt_dev->cur_udp_src >= pkt_dev->udp_src_max) in mod_cur_headers()
2551 pkt_dev->cur_udp_src = pkt_dev->udp_src_min; in mod_cur_headers()
2555 if (pkt_dev->udp_dst_min < pkt_dev->udp_dst_max) { in mod_cur_headers()
2556 if (pkt_dev->flags & F_UDPDST_RND) { in mod_cur_headers()
2557 pkt_dev->cur_udp_dst = get_random_u32_inclusive(pkt_dev->udp_dst_min, in mod_cur_headers()
2558 pkt_dev->udp_dst_max - 1); in mod_cur_headers()
2560 pkt_dev->cur_udp_dst++; in mod_cur_headers()
2561 if (pkt_dev->cur_udp_dst >= pkt_dev->udp_dst_max) in mod_cur_headers()
2562 pkt_dev->cur_udp_dst = pkt_dev->udp_dst_min; in mod_cur_headers()
2566 if (!(pkt_dev->flags & F_IPV6)) { in mod_cur_headers()
2568 imn = ntohl(pkt_dev->saddr_min); in mod_cur_headers()
2569 imx = ntohl(pkt_dev->saddr_max); in mod_cur_headers()
2573 if (pkt_dev->flags & F_IPSRC_RND) in mod_cur_headers()
2576 t = ntohl(pkt_dev->cur_saddr); in mod_cur_headers()
2582 pkt_dev->cur_saddr = htonl(t); in mod_cur_headers()
2585 if (pkt_dev->cflows && f_seen(pkt_dev, flow)) { in mod_cur_headers()
2586 pkt_dev->cur_daddr = pkt_dev->flows[flow].cur_daddr; in mod_cur_headers()
2588 imn = ntohl(pkt_dev->daddr_min); in mod_cur_headers()
2589 imx = ntohl(pkt_dev->daddr_max); in mod_cur_headers()
2594 if (pkt_dev->flags & F_IPDST_RND) { in mod_cur_headers()
2604 pkt_dev->cur_daddr = s; in mod_cur_headers()
2606 t = ntohl(pkt_dev->cur_daddr); in mod_cur_headers()
2611 pkt_dev->cur_daddr = htonl(t); in mod_cur_headers()
2614 if (pkt_dev->cflows) { in mod_cur_headers()
2615 pkt_dev->flows[flow].flags |= F_INIT; in mod_cur_headers()
2616 pkt_dev->flows[flow].cur_daddr = in mod_cur_headers()
2617 pkt_dev->cur_daddr; in mod_cur_headers()
2618 if (pkt_dev->flags & F_IPSEC) in mod_cur_headers()
2619 get_ipsec_sa(pkt_dev, flow); in mod_cur_headers()
2620 pkt_dev->nflows++; in mod_cur_headers()
2625 if (!ipv6_addr_any(&pkt_dev->min_in6_daddr)) { in mod_cur_headers()
2631 pkt_dev->cur_in6_daddr.s6_addr32[i] = in mod_cur_headers()
2633 pkt_dev->min_in6_daddr.s6_addr32[i]) & in mod_cur_headers()
2634 pkt_dev->max_in6_daddr.s6_addr32[i]); in mod_cur_headers()
2639 if (pkt_dev->min_pkt_size < pkt_dev->max_pkt_size) { in mod_cur_headers()
2642 if (pkt_dev->flags & F_TXSIZE_RND) { in mod_cur_headers()
2643 t = get_random_u32_inclusive(pkt_dev->min_pkt_size, in mod_cur_headers()
2644 pkt_dev->max_pkt_size - 1); in mod_cur_headers()
2646 t = pkt_dev->cur_pkt_size + 1; in mod_cur_headers()
2647 if (t > pkt_dev->max_pkt_size) in mod_cur_headers()
2648 t = pkt_dev->min_pkt_size; in mod_cur_headers()
2650 pkt_dev->cur_pkt_size = t; in mod_cur_headers()
2651 } else if (pkt_dev->n_imix_entries > 0) { in mod_cur_headers()
2654 __u8 entry_index = pkt_dev->imix_distribution[t]; in mod_cur_headers()
2656 entry = &pkt_dev->imix_entries[entry_index]; in mod_cur_headers()
2658 pkt_dev->cur_pkt_size = entry->size; in mod_cur_headers()
2661 set_cur_queue_map(pkt_dev); in mod_cur_headers()
2663 pkt_dev->flows[flow].count++; in mod_cur_headers()
2666 static void fill_imix_distribution(struct pktgen_dev *pkt_dev) in fill_imix_distribution() argument
2674 for (i = 0; i < pkt_dev->n_imix_entries; i++) in fill_imix_distribution()
2675 total_weight += pkt_dev->imix_entries[i].weight; in fill_imix_distribution()
2678 for (i = 0; i < pkt_dev->n_imix_entries - 1; i++) { in fill_imix_distribution()
2679 cumulative_prob += div64_u64(pkt_dev->imix_entries[i].weight * in fill_imix_distribution()
2684 cumulative_probabilites[pkt_dev->n_imix_entries - 1] = 100; in fill_imix_distribution()
2689 pkt_dev->imix_distribution[i] = j; in fill_imix_distribution()
2699 static int pktgen_output_ipsec(struct sk_buff *skb, struct pktgen_dev *pkt_dev) in pktgen_output_ipsec() argument
2701 struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x; in pktgen_output_ipsec()
2703 struct net *net = dev_net(pkt_dev->odev); in pktgen_output_ipsec()
2710 if ((x->props.mode != XFRM_MODE_TRANSPORT) && (pkt_dev->spi == 0)) in pktgen_output_ipsec()
2716 if ((x->props.mode == XFRM_MODE_TUNNEL) && (pkt_dev->spi != 0)) in pktgen_output_ipsec()
2717 skb->_skb_refdst = (unsigned long)&pkt_dev->xdst.u.dst | SKB_DST_NOREF; in pktgen_output_ipsec()
2739 static void free_SAs(struct pktgen_dev *pkt_dev) in free_SAs() argument
2741 if (pkt_dev->cflows) { in free_SAs()
2745 for (i = 0; i < pkt_dev->cflows; i++) { in free_SAs()
2746 struct xfrm_state *x = pkt_dev->flows[i].x; in free_SAs()
2750 pkt_dev->flows[i].x = NULL; in free_SAs()
2756 static int process_ipsec(struct pktgen_dev *pkt_dev, in process_ipsec() argument
2759 if (pkt_dev->flags & F_IPSEC) { in process_ipsec()
2760 struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x; in process_ipsec()
2780 ret = pktgen_output_ipsec(skb, pkt_dev); in process_ipsec()
2787 memcpy(eth, pkt_dev->hh, 2 * ETH_ALEN); in process_ipsec()
2803 static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev) in mpls_push() argument
2807 for (i = 0; i < pkt_dev->nr_labels; i++) in mpls_push()
2808 *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM; in mpls_push()
2820 static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb, in pktgen_finalize_skb() argument
2829 if (pkt_dev->nfrags <= 0) { in pktgen_finalize_skb()
2832 int frags = pkt_dev->nfrags; in pktgen_finalize_skb()
2848 if (unlikely(!pkt_dev->page)) { in pktgen_finalize_skb()
2851 if (pkt_dev->node >= 0 && (pkt_dev->flags & F_NODE)) in pktgen_finalize_skb()
2852 node = pkt_dev->node; in pktgen_finalize_skb()
2853 pkt_dev->page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, 0); in pktgen_finalize_skb()
2854 if (!pkt_dev->page) in pktgen_finalize_skb()
2857 get_page(pkt_dev->page); in pktgen_finalize_skb()
2862 pkt_dev->page, 0, in pktgen_finalize_skb()
2866 pkt_dev->page, 0, frag_len); in pktgen_finalize_skb()
2880 pgh->seq_num = htonl(pkt_dev->seq_num); in pktgen_finalize_skb()
2882 if (pkt_dev->flags & F_NO_TIMESTAMP) { in pktgen_finalize_skb()
2901 struct pktgen_dev *pkt_dev) in pktgen_alloc_skb() argument
2907 size = pkt_dev->cur_pkt_size + 64 + extralen + pkt_dev->pkt_overhead; in pktgen_alloc_skb()
2908 if (pkt_dev->flags & F_NODE) { in pktgen_alloc_skb()
2909 int node = pkt_dev->node >= 0 ? pkt_dev->node : numa_node_id(); in pktgen_alloc_skb()
2928 struct pktgen_dev *pkt_dev) in fill_packet_ipv4() argument
2943 if (pkt_dev->nr_labels) in fill_packet_ipv4()
2946 if (pkt_dev->vlan_id != 0xffff) in fill_packet_ipv4()
2952 mod_cur_headers(pkt_dev); in fill_packet_ipv4()
2953 queue_map = pkt_dev->cur_queue_map; in fill_packet_ipv4()
2955 skb = pktgen_alloc_skb(odev, pkt_dev); in fill_packet_ipv4()
2957 sprintf(pkt_dev->result, "No memory"); in fill_packet_ipv4()
2966 mpls = skb_put(skb, pkt_dev->nr_labels * sizeof(__u32)); in fill_packet_ipv4()
2967 if (pkt_dev->nr_labels) in fill_packet_ipv4()
2968 mpls_push(mpls, pkt_dev); in fill_packet_ipv4()
2970 if (pkt_dev->vlan_id != 0xffff) { in fill_packet_ipv4()
2971 if (pkt_dev->svlan_id != 0xffff) { in fill_packet_ipv4()
2973 *svlan_tci = build_tci(pkt_dev->svlan_id, in fill_packet_ipv4()
2974 pkt_dev->svlan_cfi, in fill_packet_ipv4()
2975 pkt_dev->svlan_p); in fill_packet_ipv4()
2981 *vlan_tci = build_tci(pkt_dev->vlan_id, in fill_packet_ipv4()
2982 pkt_dev->vlan_cfi, in fill_packet_ipv4()
2983 pkt_dev->vlan_p); in fill_packet_ipv4()
2995 skb->priority = pkt_dev->skb_priority; in fill_packet_ipv4()
2997 memcpy(eth, pkt_dev->hh, 12); in fill_packet_ipv4()
3001 datalen = pkt_dev->cur_pkt_size - 14 - 20 - 8 - in fill_packet_ipv4()
3002 pkt_dev->pkt_overhead; in fill_packet_ipv4()
3006 udph->source = htons(pkt_dev->cur_udp_src); in fill_packet_ipv4()
3007 udph->dest = htons(pkt_dev->cur_udp_dst); in fill_packet_ipv4()
3014 iph->tos = pkt_dev->tos; in fill_packet_ipv4()
3016 iph->saddr = pkt_dev->cur_saddr; in fill_packet_ipv4()
3017 iph->daddr = pkt_dev->cur_daddr; in fill_packet_ipv4()
3018 iph->id = htons(pkt_dev->ip_id); in fill_packet_ipv4()
3019 pkt_dev->ip_id++; in fill_packet_ipv4()
3028 pktgen_finalize_skb(pkt_dev, skb, datalen); in fill_packet_ipv4()
3030 if (!(pkt_dev->flags & F_UDPCSUM)) { in fill_packet_ipv4()
3048 if (!process_ipsec(pkt_dev, skb, protocol)) in fill_packet_ipv4()
3056 struct pktgen_dev *pkt_dev) in fill_packet_ipv6() argument
3071 if (pkt_dev->nr_labels) in fill_packet_ipv6()
3074 if (pkt_dev->vlan_id != 0xffff) in fill_packet_ipv6()
3080 mod_cur_headers(pkt_dev); in fill_packet_ipv6()
3081 queue_map = pkt_dev->cur_queue_map; in fill_packet_ipv6()
3083 skb = pktgen_alloc_skb(odev, pkt_dev); in fill_packet_ipv6()
3085 sprintf(pkt_dev->result, "No memory"); in fill_packet_ipv6()
3094 mpls = skb_put(skb, pkt_dev->nr_labels * sizeof(__u32)); in fill_packet_ipv6()
3095 if (pkt_dev->nr_labels) in fill_packet_ipv6()
3096 mpls_push(mpls, pkt_dev); in fill_packet_ipv6()
3098 if (pkt_dev->vlan_id != 0xffff) { in fill_packet_ipv6()
3099 if (pkt_dev->svlan_id != 0xffff) { in fill_packet_ipv6()
3101 *svlan_tci = build_tci(pkt_dev->svlan_id, in fill_packet_ipv6()
3102 pkt_dev->svlan_cfi, in fill_packet_ipv6()
3103 pkt_dev->svlan_p); in fill_packet_ipv6()
3109 *vlan_tci = build_tci(pkt_dev->vlan_id, in fill_packet_ipv6()
3110 pkt_dev->vlan_cfi, in fill_packet_ipv6()
3111 pkt_dev->vlan_p); in fill_packet_ipv6()
3123 skb->priority = pkt_dev->skb_priority; in fill_packet_ipv6()
3125 memcpy(eth, pkt_dev->hh, 12); in fill_packet_ipv6()
3129 datalen = pkt_dev->cur_pkt_size - 14 - in fill_packet_ipv6()
3131 pkt_dev->pkt_overhead; in fill_packet_ipv6()
3139 udph->source = htons(pkt_dev->cur_udp_src); in fill_packet_ipv6()
3140 udph->dest = htons(pkt_dev->cur_udp_dst); in fill_packet_ipv6()
3146 if (pkt_dev->traffic_class) { in fill_packet_ipv6()
3148 *(__be32 *)iph |= htonl(0x60000000 | (pkt_dev->traffic_class << 20)); in fill_packet_ipv6()
3156 iph->daddr = pkt_dev->cur_in6_daddr; in fill_packet_ipv6()
3157 iph->saddr = pkt_dev->cur_in6_saddr; in fill_packet_ipv6()
3163 pktgen_finalize_skb(pkt_dev, skb, datalen); in fill_packet_ipv6()
3165 if (!(pkt_dev->flags & F_UDPCSUM)) { in fill_packet_ipv6()
3186 struct pktgen_dev *pkt_dev) in fill_packet() argument
3188 if (pkt_dev->flags & F_IPV6) in fill_packet()
3189 return fill_packet_ipv6(odev, pkt_dev); in fill_packet()
3191 return fill_packet_ipv4(odev, pkt_dev); in fill_packet()
3194 static void pktgen_clear_counters(struct pktgen_dev *pkt_dev) in pktgen_clear_counters() argument
3196 pkt_dev->seq_num = 1; in pktgen_clear_counters()
3197 pkt_dev->idle_acc = 0; in pktgen_clear_counters()
3198 pkt_dev->sofar = 0; in pktgen_clear_counters()
3199 pkt_dev->tx_bytes = 0; in pktgen_clear_counters()
3200 pkt_dev->errors = 0; in pktgen_clear_counters()
3207 struct pktgen_dev *pkt_dev; in pktgen_run() local
3213 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) { in pktgen_run()
3218 pktgen_setup_inject(pkt_dev); in pktgen_run()
3220 if (pkt_dev->odev) { in pktgen_run()
3221 pktgen_clear_counters(pkt_dev); in pktgen_run()
3222 pkt_dev->skb = NULL; in pktgen_run()
3223 pkt_dev->started_at = pkt_dev->next_tx = ktime_get(); in pktgen_run()
3225 set_pkt_overhead(pkt_dev); in pktgen_run()
3227 strscpy(pkt_dev->result, "Starting"); in pktgen_run()
3228 pkt_dev->running = 1; /* Cranke yeself! */ in pktgen_run()
3231 strscpy(pkt_dev->result, "Error starting"); in pktgen_run()
3259 const struct pktgen_dev *pkt_dev; in thread_is_running() local
3262 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) in thread_is_running()
3263 if (pkt_dev->running) { in thread_is_running()
3341 static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) in show_results() argument
3344 char *p = pkt_dev->result; in show_results()
3345 ktime_t elapsed = ktime_sub(pkt_dev->stopped_at, in show_results()
3346 pkt_dev->started_at); in show_results()
3347 ktime_t idle = ns_to_ktime(pkt_dev->idle_acc); in show_results()
3353 (unsigned long long)pkt_dev->sofar, in show_results()
3354 pkt_dev->cur_pkt_size, nr_frags); in show_results()
3356 pps = div64_u64(pkt_dev->sofar * NSEC_PER_SEC, in show_results()
3359 if (pkt_dev->n_imix_entries > 0) { in show_results()
3364 for (i = 0; i < pkt_dev->n_imix_entries; i++) { in show_results()
3365 entry = &pkt_dev->imix_entries[i]; in show_results()
3370 bps = pps * 8 * pkt_dev->cur_pkt_size; in show_results()
3379 (unsigned long long)pkt_dev->errors); in show_results()
3383 static int pktgen_stop_device(struct pktgen_dev *pkt_dev) in pktgen_stop_device() argument
3385 int nr_frags = pkt_dev->skb ? skb_shinfo(pkt_dev->skb)->nr_frags : -1; in pktgen_stop_device()
3387 if (!pkt_dev->running) { in pktgen_stop_device()
3389 pkt_dev->odevname); in pktgen_stop_device()
3393 pkt_dev->running = 0; in pktgen_stop_device()
3394 kfree_skb(pkt_dev->skb); in pktgen_stop_device()
3395 pkt_dev->skb = NULL; in pktgen_stop_device()
3396 pkt_dev->stopped_at = ktime_get(); in pktgen_stop_device()
3398 show_results(pkt_dev, nr_frags); in pktgen_stop_device()
3405 struct pktgen_dev *pkt_dev, *best = NULL; in next_to_run() local
3408 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) { in next_to_run()
3409 if (!pkt_dev->running) in next_to_run()
3412 best = pkt_dev; in next_to_run()
3413 else if (ktime_compare(pkt_dev->next_tx, best->next_tx) < 0) in next_to_run()
3414 best = pkt_dev; in next_to_run()
3423 struct pktgen_dev *pkt_dev; in pktgen_stop() local
3429 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) { in pktgen_stop()
3430 pktgen_stop_device(pkt_dev); in pktgen_stop()
3487 static void pktgen_resched(struct pktgen_dev *pkt_dev) in pktgen_resched() argument
3492 pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_get(), idle_start)); in pktgen_resched()
3495 static void pktgen_wait_for_skb(struct pktgen_dev *pkt_dev) in pktgen_wait_for_skb() argument
3499 while (refcount_read(&(pkt_dev->skb->users)) != 1) { in pktgen_wait_for_skb()
3504 pktgen_resched(pkt_dev); in pktgen_wait_for_skb()
3508 pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_get(), idle_start)); in pktgen_wait_for_skb()
3511 static void pktgen_xmit(struct pktgen_dev *pkt_dev) in pktgen_xmit() argument
3513 bool skb_shared = !!(READ_ONCE(pkt_dev->flags) & F_SHARED); in pktgen_xmit()
3514 struct net_device *odev = pkt_dev->odev; in pktgen_xmit()
3527 burst = READ_ONCE(pkt_dev->burst); in pktgen_xmit()
3528 clone_skb = READ_ONCE(pkt_dev->clone_skb); in pktgen_xmit()
3533 pktgen_stop_device(pkt_dev); in pktgen_xmit()
3540 if (unlikely(pkt_dev->delay == ULLONG_MAX)) { in pktgen_xmit()
3541 pkt_dev->next_tx = ktime_add_ns(ktime_get(), ULONG_MAX); in pktgen_xmit()
3546 if (!pkt_dev->skb || (pkt_dev->last_ok && in pktgen_xmit()
3547 ++pkt_dev->clone_count >= clone_skb)) { in pktgen_xmit()
3549 kfree_skb(pkt_dev->skb); in pktgen_xmit()
3551 pkt_dev->skb = fill_packet(odev, pkt_dev); in pktgen_xmit()
3552 if (pkt_dev->skb == NULL) { in pktgen_xmit()
3555 pkt_dev->clone_count--; /* back out increment, OOM */ in pktgen_xmit()
3558 pkt_dev->last_pkt_size = pkt_dev->skb->len; in pktgen_xmit()
3559 pkt_dev->clone_count = 0; /* reset counter */ in pktgen_xmit()
3562 if (pkt_dev->delay && pkt_dev->last_ok) in pktgen_xmit()
3563 spin(pkt_dev, pkt_dev->next_tx); in pktgen_xmit()
3565 if (pkt_dev->xmit_mode == M_NETIF_RECEIVE) { in pktgen_xmit()
3566 skb = pkt_dev->skb; in pktgen_xmit()
3574 pkt_dev->errors++; in pktgen_xmit()
3575 pkt_dev->sofar++; in pktgen_xmit()
3576 pkt_dev->seq_num++; in pktgen_xmit()
3578 pkt_dev->skb = NULL; in pktgen_xmit()
3597 } else if (pkt_dev->xmit_mode == M_QUEUE_XMIT) { in pktgen_xmit()
3600 refcount_inc(&pkt_dev->skb->users); in pktgen_xmit()
3602 ret = dev_queue_xmit(pkt_dev->skb); in pktgen_xmit()
3605 pkt_dev->skb = NULL; in pktgen_xmit()
3609 pkt_dev->sofar++; in pktgen_xmit()
3610 pkt_dev->seq_num++; in pktgen_xmit()
3611 pkt_dev->tx_bytes += pkt_dev->last_pkt_size; in pktgen_xmit()
3626 pkt_dev->errors++; in pktgen_xmit()
3628 pkt_dev->odevname, ret); in pktgen_xmit()
3634 txq = skb_get_tx_queue(odev, pkt_dev->skb); in pktgen_xmit()
3641 pkt_dev->last_ok = 0; in pktgen_xmit()
3645 refcount_add(burst, &pkt_dev->skb->users); in pktgen_xmit()
3648 ret = netdev_start_xmit(pkt_dev->skb, odev, txq, --burst > 0); in pktgen_xmit()
3651 pkt_dev->skb = NULL; in pktgen_xmit()
3655 pkt_dev->last_ok = 1; in pktgen_xmit()
3656 pkt_dev->sofar++; in pktgen_xmit()
3657 pkt_dev->seq_num++; in pktgen_xmit()
3658 pkt_dev->tx_bytes += pkt_dev->last_pkt_size; in pktgen_xmit()
3665 pkt_dev->errors++; in pktgen_xmit()
3669 pkt_dev->odevname, ret); in pktgen_xmit()
3670 pkt_dev->errors++; in pktgen_xmit()
3675 refcount_dec(&pkt_dev->skb->users); in pktgen_xmit()
3676 pkt_dev->last_ok = 0; in pktgen_xmit()
3679 WARN_ON(refcount_sub_and_test(burst, &pkt_dev->skb->users)); in pktgen_xmit()
3687 if ((pkt_dev->count != 0) && (pkt_dev->sofar >= pkt_dev->count)) { in pktgen_xmit()
3688 if (pkt_dev->skb) in pktgen_xmit()
3689 pktgen_wait_for_skb(pkt_dev); in pktgen_xmit()
3692 pktgen_stop_device(pkt_dev); in pktgen_xmit()
3703 struct pktgen_dev *pkt_dev = NULL; in pktgen_thread_worker() local
3716 pkt_dev = next_to_run(t); in pktgen_thread_worker()
3718 if (unlikely(!pkt_dev && t->control == 0)) { in pktgen_thread_worker()
3726 if (likely(pkt_dev)) { in pktgen_thread_worker()
3727 pktgen_xmit(pkt_dev); in pktgen_thread_worker()
3730 pktgen_resched(pkt_dev); in pktgen_thread_worker()
3773 struct pktgen_dev *p, *pkt_dev = NULL; in pktgen_find_dev() local
3783 pkt_dev = p; in pktgen_find_dev()
3788 pr_debug("find_dev(%s) returning %p\n", ifname, pkt_dev); in pktgen_find_dev()
3789 return pkt_dev; in pktgen_find_dev()
3797 struct pktgen_dev *pkt_dev) in add_dev_to_thread() argument
3810 if (pkt_dev->pg_thread) { in add_dev_to_thread()
3816 pkt_dev->running = 0; in add_dev_to_thread()
3817 pkt_dev->pg_thread = t; in add_dev_to_thread()
3818 list_add_rcu(&pkt_dev->list, &t->if_list); in add_dev_to_thread()
3829 struct pktgen_dev *pkt_dev; in pktgen_add_device() local
3835 pkt_dev = __pktgen_NN_threads(t->net, ifname, FIND); in pktgen_add_device()
3836 if (pkt_dev) { in pktgen_add_device()
3841 pkt_dev = kzalloc_node(sizeof(struct pktgen_dev), GFP_KERNEL, node); in pktgen_add_device()
3842 if (!pkt_dev) in pktgen_add_device()
3845 strscpy(pkt_dev->odevname, ifname); in pktgen_add_device()
3846 pkt_dev->flows = vzalloc_node(array_size(MAX_CFLOWS, in pktgen_add_device()
3849 if (pkt_dev->flows == NULL) { in pktgen_add_device()
3850 kfree(pkt_dev); in pktgen_add_device()
3854 pkt_dev->removal_mark = 0; in pktgen_add_device()
3855 pkt_dev->nfrags = 0; in pktgen_add_device()
3856 pkt_dev->delay = pg_delay_d; in pktgen_add_device()
3857 pkt_dev->count = pg_count_d; in pktgen_add_device()
3858 pkt_dev->sofar = 0; in pktgen_add_device()
3859 pkt_dev->udp_src_min = 9; /* sink port */ in pktgen_add_device()
3860 pkt_dev->udp_src_max = 9; in pktgen_add_device()
3861 pkt_dev->udp_dst_min = 9; in pktgen_add_device()
3862 pkt_dev->udp_dst_max = 9; in pktgen_add_device()
3863 pkt_dev->vlan_p = 0; in pktgen_add_device()
3864 pkt_dev->vlan_cfi = 0; in pktgen_add_device()
3865 pkt_dev->vlan_id = 0xffff; in pktgen_add_device()
3866 pkt_dev->svlan_p = 0; in pktgen_add_device()
3867 pkt_dev->svlan_cfi = 0; in pktgen_add_device()
3868 pkt_dev->svlan_id = 0xffff; in pktgen_add_device()
3869 pkt_dev->burst = 1; in pktgen_add_device()
3870 pkt_dev->node = NUMA_NO_NODE; in pktgen_add_device()
3871 pkt_dev->flags = F_SHARED; /* SKB shared by default */ in pktgen_add_device()
3873 err = pktgen_setup_dev(t->net, pkt_dev, ifname); in pktgen_add_device()
3876 if (pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING) in pktgen_add_device()
3877 pkt_dev->clone_skb = pg_clone_skb_d; in pktgen_add_device()
3879 pkt_dev->entry = proc_create_data(ifname, 0600, t->net->proc_dir, in pktgen_add_device()
3880 &pktgen_if_proc_ops, pkt_dev); in pktgen_add_device()
3881 if (!pkt_dev->entry) { in pktgen_add_device()
3888 pkt_dev->ipsmode = XFRM_MODE_TRANSPORT; in pktgen_add_device()
3889 pkt_dev->ipsproto = IPPROTO_ESP; in pktgen_add_device()
3896 pkt_dev->dstops.family = AF_INET; in pktgen_add_device()
3897 pkt_dev->xdst.u.dst.dev = pkt_dev->odev; in pktgen_add_device()
3898 dst_init_metrics(&pkt_dev->xdst.u.dst, pktgen_dst_metrics, false); in pktgen_add_device()
3899 pkt_dev->xdst.child = &pkt_dev->xdst.u.dst; in pktgen_add_device()
3900 pkt_dev->xdst.u.dst.ops = &pkt_dev->dstops; in pktgen_add_device()
3903 return add_dev_to_thread(t, pkt_dev); in pktgen_add_device()
3905 netdev_put(pkt_dev->odev, &pkt_dev->dev_tracker); in pktgen_add_device()
3908 free_SAs(pkt_dev); in pktgen_add_device()
3910 vfree(pkt_dev->flows); in pktgen_add_device()
3911 kfree(pkt_dev); in pktgen_add_device()
3969 struct pktgen_dev *pkt_dev) in _rem_dev_from_if_list() argument
3977 if (p == pkt_dev) in _rem_dev_from_if_list()
3984 struct pktgen_dev *pkt_dev) in pktgen_remove_device() argument
3986 pr_debug("remove_device pkt_dev=%p\n", pkt_dev); in pktgen_remove_device()
3988 if (pkt_dev->running) { in pktgen_remove_device()
3990 pktgen_stop_device(pkt_dev); in pktgen_remove_device()
3995 if (pkt_dev->odev) { in pktgen_remove_device()
3996 netdev_put(pkt_dev->odev, &pkt_dev->dev_tracker); in pktgen_remove_device()
3997 pkt_dev->odev = NULL; in pktgen_remove_device()
4004 proc_remove(pkt_dev->entry); in pktgen_remove_device()
4007 _rem_dev_from_if_list(t, pkt_dev); in pktgen_remove_device()
4010 free_SAs(pkt_dev); in pktgen_remove_device()
4012 vfree(pkt_dev->flows); in pktgen_remove_device()
4013 if (pkt_dev->page) in pktgen_remove_device()
4014 put_page(pkt_dev->page); in pktgen_remove_device()
4015 kfree_rcu(pkt_dev, rcu); in pktgen_remove_device()