Lines Matching refs:pkt_dev
459 static void pktgen_clear_counters(struct pktgen_dev *pkt_dev);
535 const struct pktgen_dev *pkt_dev = seq->private; in pktgen_if_show() local
541 (unsigned long long)pkt_dev->count, pkt_dev->min_pkt_size, in pktgen_if_show()
542 pkt_dev->max_pkt_size); in pktgen_if_show()
546 pkt_dev->nfrags, (unsigned long long) pkt_dev->delay, in pktgen_if_show()
547 pkt_dev->clone_skb, pkt_dev->odevname); in pktgen_if_show()
549 seq_printf(seq, " flows: %u flowlen: %u\n", pkt_dev->cflows, in pktgen_if_show()
550 pkt_dev->lflow); in pktgen_if_show()
554 pkt_dev->queue_map_min, in pktgen_if_show()
555 pkt_dev->queue_map_max); in pktgen_if_show()
557 if (pkt_dev->skb_priority) in pktgen_if_show()
559 pkt_dev->skb_priority); in pktgen_if_show()
561 if (pkt_dev->flags & F_IPV6) { in pktgen_if_show()
565 &pkt_dev->in6_saddr, in pktgen_if_show()
566 &pkt_dev->min_in6_saddr, &pkt_dev->max_in6_saddr, in pktgen_if_show()
567 &pkt_dev->in6_daddr, in pktgen_if_show()
568 &pkt_dev->min_in6_daddr, &pkt_dev->max_in6_daddr); in pktgen_if_show()
572 pkt_dev->dst_min, pkt_dev->dst_max); in pktgen_if_show()
575 pkt_dev->src_min, pkt_dev->src_max); in pktgen_if_show()
581 is_zero_ether_addr(pkt_dev->src_mac) ? in pktgen_if_show()
582 pkt_dev->odev->dev_addr : pkt_dev->src_mac); in pktgen_if_show()
585 seq_printf(seq, "%pM\n", pkt_dev->dst_mac); in pktgen_if_show()
590 pkt_dev->udp_src_min, pkt_dev->udp_src_max, in pktgen_if_show()
591 pkt_dev->udp_dst_min, pkt_dev->udp_dst_max); in pktgen_if_show()
595 pkt_dev->src_mac_count, pkt_dev->dst_mac_count); in pktgen_if_show()
597 if (pkt_dev->nr_labels) { in pktgen_if_show()
600 for (i = 0; i < pkt_dev->nr_labels; i++) in pktgen_if_show()
601 seq_printf(seq, "%08x%s", ntohl(pkt_dev->labels[i]), in pktgen_if_show()
602 i == pkt_dev->nr_labels-1 ? "\n" : ", "); in pktgen_if_show()
605 if (pkt_dev->vlan_id != 0xffff) in pktgen_if_show()
607 pkt_dev->vlan_id, pkt_dev->vlan_p, in pktgen_if_show()
608 pkt_dev->vlan_cfi); in pktgen_if_show()
610 if (pkt_dev->svlan_id != 0xffff) in pktgen_if_show()
612 pkt_dev->svlan_id, pkt_dev->svlan_p, in pktgen_if_show()
613 pkt_dev->svlan_cfi); in pktgen_if_show()
615 if (pkt_dev->tos) in pktgen_if_show()
616 seq_printf(seq, " tos: 0x%02x\n", pkt_dev->tos); in pktgen_if_show()
618 if (pkt_dev->traffic_class) in pktgen_if_show()
619 seq_printf(seq, " traffic_class: 0x%02x\n", pkt_dev->traffic_class); in pktgen_if_show()
621 if (pkt_dev->burst > 1) in pktgen_if_show()
622 seq_printf(seq, " burst: %d\n", pkt_dev->burst); in pktgen_if_show()
624 if (pkt_dev->node >= 0) in pktgen_if_show()
625 seq_printf(seq, " node: %d\n", pkt_dev->node); in pktgen_if_show()
627 if (pkt_dev->xmit_mode == M_NETIF_RECEIVE) in pktgen_if_show()
632 if (pkt_dev->flags & F_IPV6) in pktgen_if_show()
635 if (pkt_dev->flags & F_IPSRC_RND) in pktgen_if_show()
638 if (pkt_dev->flags & F_IPDST_RND) in pktgen_if_show()
641 if (pkt_dev->flags & F_TXSIZE_RND) in pktgen_if_show()
644 if (pkt_dev->flags & F_UDPSRC_RND) in pktgen_if_show()
647 if (pkt_dev->flags & F_UDPDST_RND) in pktgen_if_show()
650 if (pkt_dev->flags & F_UDPCSUM) in pktgen_if_show()
653 if (pkt_dev->flags & F_NO_TIMESTAMP) in pktgen_if_show()
656 if (pkt_dev->flags & F_MPLS_RND) in pktgen_if_show()
659 if (pkt_dev->flags & F_QUEUE_MAP_RND) in pktgen_if_show()
662 if (pkt_dev->flags & F_QUEUE_MAP_CPU) in pktgen_if_show()
665 if (pkt_dev->cflows) { in pktgen_if_show()
666 if (pkt_dev->flags & F_FLOW_SEQ) in pktgen_if_show()
673 if (pkt_dev->flags & F_IPSEC_ON) { in pktgen_if_show()
675 if (pkt_dev->spi) in pktgen_if_show()
676 seq_printf(seq, "spi:%u", pkt_dev->spi); in pktgen_if_show()
680 if (pkt_dev->flags & F_MACSRC_RND) in pktgen_if_show()
683 if (pkt_dev->flags & F_MACDST_RND) in pktgen_if_show()
686 if (pkt_dev->flags & F_VID_RND) in pktgen_if_show()
689 if (pkt_dev->flags & F_SVID_RND) in pktgen_if_show()
692 if (pkt_dev->flags & F_NODE) in pktgen_if_show()
698 stopped = pkt_dev->running ? ktime_get() : pkt_dev->stopped_at; in pktgen_if_show()
699 idle = pkt_dev->idle_acc; in pktgen_if_show()
704 (unsigned long long)pkt_dev->sofar, in pktgen_if_show()
705 (unsigned long long)pkt_dev->errors); in pktgen_if_show()
709 (unsigned long long) ktime_to_us(pkt_dev->started_at), in pktgen_if_show()
715 pkt_dev->seq_num, pkt_dev->cur_dst_mac_offset, in pktgen_if_show()
716 pkt_dev->cur_src_mac_offset); in pktgen_if_show()
718 if (pkt_dev->flags & F_IPV6) { in pktgen_if_show()
720 &pkt_dev->cur_in6_saddr, in pktgen_if_show()
721 &pkt_dev->cur_in6_daddr); in pktgen_if_show()
724 &pkt_dev->cur_saddr, &pkt_dev->cur_daddr); in pktgen_if_show()
727 pkt_dev->cur_udp_dst, pkt_dev->cur_udp_src); in pktgen_if_show()
729 seq_printf(seq, " cur_queue_map: %u\n", pkt_dev->cur_queue_map); in pktgen_if_show()
731 seq_printf(seq, " flows: %u\n", pkt_dev->nflows); in pktgen_if_show()
733 if (pkt_dev->result[0]) in pktgen_if_show()
734 seq_printf(seq, "Result: %s\n", pkt_dev->result); in pktgen_if_show()
830 static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev) in get_labels() argument
837 pkt_dev->nr_labels = 0; in get_labels()
843 pkt_dev->labels[n] = htonl(tmp); in get_labels()
844 if (pkt_dev->labels[n] & MPLS_STACK_BOTTOM) in get_labels()
845 pkt_dev->flags |= F_MPLS_RND; in get_labels()
855 pkt_dev->nr_labels = n; in get_labels()
864 struct pktgen_dev *pkt_dev = seq->private; in pktgen_if_write() local
872 pg_result = &(pkt_dev->result[0]); in pktgen_if_write()
923 if (value != pkt_dev->min_pkt_size) { in pktgen_if_write()
924 pkt_dev->min_pkt_size = value; in pktgen_if_write()
925 pkt_dev->cur_pkt_size = value; in pktgen_if_write()
928 pkt_dev->min_pkt_size); in pktgen_if_write()
940 if (value != pkt_dev->max_pkt_size) { in pktgen_if_write()
941 pkt_dev->max_pkt_size = value; in pktgen_if_write()
942 pkt_dev->cur_pkt_size = value; in pktgen_if_write()
945 pkt_dev->max_pkt_size); in pktgen_if_write()
959 if (value != pkt_dev->min_pkt_size) { in pktgen_if_write()
960 pkt_dev->min_pkt_size = value; in pktgen_if_write()
961 pkt_dev->max_pkt_size = value; in pktgen_if_write()
962 pkt_dev->cur_pkt_size = value; in pktgen_if_write()
964 sprintf(pg_result, "OK: pkt_size=%u", pkt_dev->min_pkt_size); in pktgen_if_write()
985 pkt_dev->nfrags = value; in pktgen_if_write()
986 sprintf(pg_result, "OK: frags=%u", pkt_dev->nfrags); in pktgen_if_write()
996 pkt_dev->delay = ULLONG_MAX; in pktgen_if_write()
998 pkt_dev->delay = (u64)value; in pktgen_if_write()
1001 (unsigned long long) pkt_dev->delay); in pktgen_if_write()
1012 pkt_dev->delay = pkt_dev->min_pkt_size*8*NSEC_PER_USEC/value; in pktgen_if_write()
1014 pr_info("Delay set at: %llu ns\n", pkt_dev->delay); in pktgen_if_write()
1027 pkt_dev->delay = NSEC_PER_SEC/value; in pktgen_if_write()
1029 pr_info("Delay set at: %llu ns\n", pkt_dev->delay); in pktgen_if_write()
1040 if (value != pkt_dev->udp_src_min) { in pktgen_if_write()
1041 pkt_dev->udp_src_min = value; in pktgen_if_write()
1042 pkt_dev->cur_udp_src = value; in pktgen_if_write()
1044 sprintf(pg_result, "OK: udp_src_min=%u", pkt_dev->udp_src_min); in pktgen_if_write()
1053 if (value != pkt_dev->udp_dst_min) { in pktgen_if_write()
1054 pkt_dev->udp_dst_min = value; in pktgen_if_write()
1055 pkt_dev->cur_udp_dst = value; in pktgen_if_write()
1057 sprintf(pg_result, "OK: udp_dst_min=%u", pkt_dev->udp_dst_min); in pktgen_if_write()
1066 if (value != pkt_dev->udp_src_max) { in pktgen_if_write()
1067 pkt_dev->udp_src_max = value; in pktgen_if_write()
1068 pkt_dev->cur_udp_src = value; in pktgen_if_write()
1070 sprintf(pg_result, "OK: udp_src_max=%u", pkt_dev->udp_src_max); in pktgen_if_write()
1079 if (value != pkt_dev->udp_dst_max) { in pktgen_if_write()
1080 pkt_dev->udp_dst_max = value; in pktgen_if_write()
1081 pkt_dev->cur_udp_dst = value; in pktgen_if_write()
1083 sprintf(pg_result, "OK: udp_dst_max=%u", pkt_dev->udp_dst_max); in pktgen_if_write()
1091 ((pkt_dev->xmit_mode == M_NETIF_RECEIVE) || in pktgen_if_write()
1092 !(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))) in pktgen_if_write()
1095 pkt_dev->clone_skb = value; in pktgen_if_write()
1097 sprintf(pg_result, "OK: clone_skb=%d", pkt_dev->clone_skb); in pktgen_if_write()
1106 pkt_dev->count = value; in pktgen_if_write()
1108 (unsigned long long)pkt_dev->count); in pktgen_if_write()
1117 if (pkt_dev->src_mac_count != value) { in pktgen_if_write()
1118 pkt_dev->src_mac_count = value; in pktgen_if_write()
1119 pkt_dev->cur_src_mac_offset = 0; in pktgen_if_write()
1122 pkt_dev->src_mac_count); in pktgen_if_write()
1131 if (pkt_dev->dst_mac_count != value) { in pktgen_if_write()
1132 pkt_dev->dst_mac_count = value; in pktgen_if_write()
1133 pkt_dev->cur_dst_mac_offset = 0; in pktgen_if_write()
1136 pkt_dev->dst_mac_count); in pktgen_if_write()
1145 if ((value > 1) && (pkt_dev->xmit_mode == M_START_XMIT) && in pktgen_if_write()
1146 (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))) in pktgen_if_write()
1148 pkt_dev->burst = value < 1 ? 1 : value; in pktgen_if_write()
1149 sprintf(pg_result, "OK: burst=%d", pkt_dev->burst); in pktgen_if_write()
1160 pkt_dev->node = value; in pktgen_if_write()
1161 sprintf(pg_result, "OK: node=%d", pkt_dev->node); in pktgen_if_write()
1162 if (pkt_dev->page) { in pktgen_if_write()
1163 put_page(pkt_dev->page); in pktgen_if_write()
1164 pkt_dev->page = NULL; in pktgen_if_write()
1184 pkt_dev->xmit_mode = M_START_XMIT; in pktgen_if_write()
1187 if (pkt_dev->clone_skb > 0) in pktgen_if_write()
1190 pkt_dev->xmit_mode = M_NETIF_RECEIVE; in pktgen_if_write()
1195 pkt_dev->last_ok = 1; in pktgen_if_write()
1200 pkt_dev->clone_skb = 0; in pktgen_if_write()
1221 pkt_dev->flags |= F_IPSRC_RND; in pktgen_if_write()
1224 pkt_dev->flags &= ~F_IPSRC_RND; in pktgen_if_write()
1227 pkt_dev->flags |= F_TXSIZE_RND; in pktgen_if_write()
1230 pkt_dev->flags &= ~F_TXSIZE_RND; in pktgen_if_write()
1233 pkt_dev->flags |= F_IPDST_RND; in pktgen_if_write()
1236 pkt_dev->flags &= ~F_IPDST_RND; in pktgen_if_write()
1239 pkt_dev->flags |= F_UDPSRC_RND; in pktgen_if_write()
1242 pkt_dev->flags &= ~F_UDPSRC_RND; in pktgen_if_write()
1245 pkt_dev->flags |= F_UDPDST_RND; in pktgen_if_write()
1248 pkt_dev->flags &= ~F_UDPDST_RND; in pktgen_if_write()
1251 pkt_dev->flags |= F_MACSRC_RND; in pktgen_if_write()
1254 pkt_dev->flags &= ~F_MACSRC_RND; in pktgen_if_write()
1257 pkt_dev->flags |= F_MACDST_RND; in pktgen_if_write()
1260 pkt_dev->flags &= ~F_MACDST_RND; in pktgen_if_write()
1263 pkt_dev->flags |= F_MPLS_RND; in pktgen_if_write()
1266 pkt_dev->flags &= ~F_MPLS_RND; in pktgen_if_write()
1269 pkt_dev->flags |= F_VID_RND; in pktgen_if_write()
1272 pkt_dev->flags &= ~F_VID_RND; in pktgen_if_write()
1275 pkt_dev->flags |= F_SVID_RND; in pktgen_if_write()
1278 pkt_dev->flags &= ~F_SVID_RND; in pktgen_if_write()
1281 pkt_dev->flags |= F_FLOW_SEQ; in pktgen_if_write()
1284 pkt_dev->flags |= F_QUEUE_MAP_RND; in pktgen_if_write()
1287 pkt_dev->flags &= ~F_QUEUE_MAP_RND; in pktgen_if_write()
1290 pkt_dev->flags |= F_QUEUE_MAP_CPU; in pktgen_if_write()
1293 pkt_dev->flags &= ~F_QUEUE_MAP_CPU; in pktgen_if_write()
1296 pkt_dev->flags |= F_IPSEC_ON; in pktgen_if_write()
1300 pkt_dev->flags &= ~F_IPV6; in pktgen_if_write()
1303 pkt_dev->flags |= F_NODE; in pktgen_if_write()
1306 pkt_dev->flags &= ~F_NODE; in pktgen_if_write()
1309 pkt_dev->flags |= F_UDPCSUM; in pktgen_if_write()
1312 pkt_dev->flags &= ~F_UDPCSUM; in pktgen_if_write()
1315 pkt_dev->flags |= F_NO_TIMESTAMP; in pktgen_if_write()
1318 pkt_dev->flags &= ~F_NO_TIMESTAMP; in pktgen_if_write()
1335 sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags); in pktgen_if_write()
1339 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1); in pktgen_if_write()
1346 if (strcmp(buf, pkt_dev->dst_min) != 0) { in pktgen_if_write()
1347 memset(pkt_dev->dst_min, 0, sizeof(pkt_dev->dst_min)); in pktgen_if_write()
1348 strncpy(pkt_dev->dst_min, buf, len); in pktgen_if_write()
1349 pkt_dev->daddr_min = in_aton(pkt_dev->dst_min); in pktgen_if_write()
1350 pkt_dev->cur_daddr = pkt_dev->daddr_min; in pktgen_if_write()
1353 pr_debug("dst_min set to: %s\n", pkt_dev->dst_min); in pktgen_if_write()
1355 sprintf(pg_result, "OK: dst_min=%s", pkt_dev->dst_min); in pktgen_if_write()
1359 len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1); in pktgen_if_write()
1368 if (strcmp(buf, pkt_dev->dst_max) != 0) { in pktgen_if_write()
1369 memset(pkt_dev->dst_max, 0, sizeof(pkt_dev->dst_max)); in pktgen_if_write()
1370 strncpy(pkt_dev->dst_max, buf, len); in pktgen_if_write()
1371 pkt_dev->daddr_max = in_aton(pkt_dev->dst_max); in pktgen_if_write()
1372 pkt_dev->cur_daddr = pkt_dev->daddr_max; in pktgen_if_write()
1375 pr_debug("dst_max set to: %s\n", pkt_dev->dst_max); in pktgen_if_write()
1377 sprintf(pg_result, "OK: dst_max=%s", pkt_dev->dst_max); in pktgen_if_write()
1385 pkt_dev->flags |= F_IPV6; in pktgen_if_write()
1391 in6_pton(buf, -1, pkt_dev->in6_daddr.s6_addr, -1, NULL); in pktgen_if_write()
1392 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_daddr); in pktgen_if_write()
1394 pkt_dev->cur_in6_daddr = pkt_dev->in6_daddr; in pktgen_if_write()
1408 pkt_dev->flags |= F_IPV6; in pktgen_if_write()
1414 in6_pton(buf, -1, pkt_dev->min_in6_daddr.s6_addr, -1, NULL); in pktgen_if_write()
1415 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->min_in6_daddr); in pktgen_if_write()
1417 pkt_dev->cur_in6_daddr = pkt_dev->min_in6_daddr; in pktgen_if_write()
1430 pkt_dev->flags |= F_IPV6; in pktgen_if_write()
1436 in6_pton(buf, -1, pkt_dev->max_in6_daddr.s6_addr, -1, NULL); in pktgen_if_write()
1437 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->max_in6_daddr); in pktgen_if_write()
1451 pkt_dev->flags |= F_IPV6; in pktgen_if_write()
1457 in6_pton(buf, -1, pkt_dev->in6_saddr.s6_addr, -1, NULL); in pktgen_if_write()
1458 snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_saddr); in pktgen_if_write()
1460 pkt_dev->cur_in6_saddr = pkt_dev->in6_saddr; in pktgen_if_write()
1470 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1); in pktgen_if_write()
1477 if (strcmp(buf, pkt_dev->src_min) != 0) { in pktgen_if_write()
1478 memset(pkt_dev->src_min, 0, sizeof(pkt_dev->src_min)); in pktgen_if_write()
1479 strncpy(pkt_dev->src_min, buf, len); in pktgen_if_write()
1480 pkt_dev->saddr_min = in_aton(pkt_dev->src_min); in pktgen_if_write()
1481 pkt_dev->cur_saddr = pkt_dev->saddr_min; in pktgen_if_write()
1484 pr_debug("src_min set to: %s\n", pkt_dev->src_min); in pktgen_if_write()
1486 sprintf(pg_result, "OK: src_min=%s", pkt_dev->src_min); in pktgen_if_write()
1490 len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1); in pktgen_if_write()
1497 if (strcmp(buf, pkt_dev->src_max) != 0) { in pktgen_if_write()
1498 memset(pkt_dev->src_max, 0, sizeof(pkt_dev->src_max)); in pktgen_if_write()
1499 strncpy(pkt_dev->src_max, buf, len); in pktgen_if_write()
1500 pkt_dev->saddr_max = in_aton(pkt_dev->src_max); in pktgen_if_write()
1501 pkt_dev->cur_saddr = pkt_dev->saddr_max; in pktgen_if_write()
1504 pr_debug("src_max set to: %s\n", pkt_dev->src_max); in pktgen_if_write()
1506 sprintf(pg_result, "OK: src_max=%s", pkt_dev->src_max); in pktgen_if_write()
1518 if (!mac_pton(valstr, pkt_dev->dst_mac)) in pktgen_if_write()
1521 ether_addr_copy(&pkt_dev->hh[0], pkt_dev->dst_mac); in pktgen_if_write()
1523 sprintf(pg_result, "OK: dstmac %pM", pkt_dev->dst_mac); in pktgen_if_write()
1535 if (!mac_pton(valstr, pkt_dev->src_mac)) in pktgen_if_write()
1538 ether_addr_copy(&pkt_dev->hh[6], pkt_dev->src_mac); in pktgen_if_write()
1540 sprintf(pg_result, "OK: srcmac %pM", pkt_dev->src_mac); in pktgen_if_write()
1545 pktgen_clear_counters(pkt_dev); in pktgen_if_write()
1559 pkt_dev->cflows = value; in pktgen_if_write()
1560 sprintf(pg_result, "OK: flows=%u", pkt_dev->cflows); in pktgen_if_write()
1570 pkt_dev->spi = value; in pktgen_if_write()
1571 sprintf(pg_result, "OK: spi=%u", pkt_dev->spi); in pktgen_if_write()
1581 pkt_dev->lflow = value; in pktgen_if_write()
1582 sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow); in pktgen_if_write()
1592 pkt_dev->queue_map_min = value; in pktgen_if_write()
1593 sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min); in pktgen_if_write()
1603 pkt_dev->queue_map_max = value; in pktgen_if_write()
1604 sprintf(pg_result, "OK: queue_map_max=%u", pkt_dev->queue_map_max); in pktgen_if_write()
1611 len = get_labels(&user_buffer[i], pkt_dev); in pktgen_if_write()
1616 for (n = 0; n < pkt_dev->nr_labels; n++) in pktgen_if_write()
1618 "%08x%s", ntohl(pkt_dev->labels[n]), in pktgen_if_write()
1619 n == pkt_dev->nr_labels-1 ? "" : ","); in pktgen_if_write()
1621 if (pkt_dev->nr_labels && pkt_dev->vlan_id != 0xffff) { in pktgen_if_write()
1622 pkt_dev->vlan_id = 0xffff; /* turn off VLAN/SVLAN */ in pktgen_if_write()
1623 pkt_dev->svlan_id = 0xffff; in pktgen_if_write()
1638 pkt_dev->vlan_id = value; /* turn on VLAN */ in pktgen_if_write()
1643 if (debug && pkt_dev->nr_labels) in pktgen_if_write()
1646 pkt_dev->nr_labels = 0; /* turn off MPLS */ in pktgen_if_write()
1647 sprintf(pg_result, "OK: vlan_id=%u", pkt_dev->vlan_id); in pktgen_if_write()
1649 pkt_dev->vlan_id = 0xffff; /* turn off VLAN/SVLAN */ in pktgen_if_write()
1650 pkt_dev->svlan_id = 0xffff; in pktgen_if_write()
1664 if ((value <= 7) && (pkt_dev->vlan_id != 0xffff)) { in pktgen_if_write()
1665 pkt_dev->vlan_p = value; in pktgen_if_write()
1666 sprintf(pg_result, "OK: vlan_p=%u", pkt_dev->vlan_p); in pktgen_if_write()
1679 if ((value <= 1) && (pkt_dev->vlan_id != 0xffff)) { in pktgen_if_write()
1680 pkt_dev->vlan_cfi = value; in pktgen_if_write()
1681 sprintf(pg_result, "OK: vlan_cfi=%u", pkt_dev->vlan_cfi); in pktgen_if_write()
1694 if ((value <= 4095) && ((pkt_dev->vlan_id != 0xffff))) { in pktgen_if_write()
1695 pkt_dev->svlan_id = value; /* turn on SVLAN */ in pktgen_if_write()
1700 if (debug && pkt_dev->nr_labels) in pktgen_if_write()
1703 pkt_dev->nr_labels = 0; /* turn off MPLS */ in pktgen_if_write()
1704 sprintf(pg_result, "OK: svlan_id=%u", pkt_dev->svlan_id); in pktgen_if_write()
1706 pkt_dev->vlan_id = 0xffff; /* turn off VLAN/SVLAN */ in pktgen_if_write()
1707 pkt_dev->svlan_id = 0xffff; in pktgen_if_write()
1721 if ((value <= 7) && (pkt_dev->svlan_id != 0xffff)) { in pktgen_if_write()
1722 pkt_dev->svlan_p = value; in pktgen_if_write()
1723 sprintf(pg_result, "OK: svlan_p=%u", pkt_dev->svlan_p); in pktgen_if_write()
1736 if ((value <= 1) && (pkt_dev->svlan_id != 0xffff)) { in pktgen_if_write()
1737 pkt_dev->svlan_cfi = value; in pktgen_if_write()
1738 sprintf(pg_result, "OK: svlan_cfi=%u", pkt_dev->svlan_cfi); in pktgen_if_write()
1753 pkt_dev->tos = tmp_value; in pktgen_if_write()
1754 sprintf(pg_result, "OK: tos=0x%02x", pkt_dev->tos); in pktgen_if_write()
1769 pkt_dev->traffic_class = tmp_value; in pktgen_if_write()
1770 sprintf(pg_result, "OK: traffic_class=0x%02x", pkt_dev->traffic_class); in pktgen_if_write()
1783 pkt_dev->skb_priority = value; in pktgen_if_write()
1785 pkt_dev->skb_priority); in pktgen_if_write()
1789 sprintf(pkt_dev->result, "No such parameter \"%s\"", name); in pktgen_if_write()
1810 const struct pktgen_dev *pkt_dev; in pktgen_thread_show() local
1817 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) in pktgen_thread_show()
1818 if (pkt_dev->running) in pktgen_thread_show()
1819 seq_printf(seq, "%s ", pkt_dev->odevname); in pktgen_thread_show()
1823 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) in pktgen_thread_show()
1824 if (!pkt_dev->running) in pktgen_thread_show()
1825 seq_printf(seq, "%s ", pkt_dev->odevname); in pktgen_thread_show()
1950 struct pktgen_dev *pkt_dev = NULL; in __pktgen_NN_threads() local
1954 pkt_dev = pktgen_find_dev(t, ifname, exact); in __pktgen_NN_threads()
1955 if (pkt_dev) { in __pktgen_NN_threads()
1957 pkt_dev->removal_mark = 1; in __pktgen_NN_threads()
1963 return pkt_dev; in __pktgen_NN_threads()
1971 struct pktgen_dev *pkt_dev = NULL; in pktgen_mark_device() local
1980 pkt_dev = __pktgen_NN_threads(pn, ifname, REMOVE); in pktgen_mark_device()
1981 if (pkt_dev == NULL) in pktgen_mark_device()
2006 struct pktgen_dev *pkt_dev; in pktgen_change_name() local
2009 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) { in pktgen_change_name()
2010 if (pkt_dev->odev != dev) in pktgen_change_name()
2013 proc_remove(pkt_dev->entry); in pktgen_change_name()
2015 pkt_dev->entry = proc_create_data(dev->name, 0600, in pktgen_change_name()
2018 pkt_dev); in pktgen_change_name()
2019 if (!pkt_dev->entry) in pktgen_change_name()
2055 struct pktgen_dev *pkt_dev, in pktgen_dev_get_by_name() argument
2076 struct pktgen_dev *pkt_dev, const char *ifname) in pktgen_setup_dev() argument
2082 if (pkt_dev->odev) { in pktgen_setup_dev()
2083 dev_put(pkt_dev->odev); in pktgen_setup_dev()
2084 pkt_dev->odev = NULL; in pktgen_setup_dev()
2087 odev = pktgen_dev_get_by_name(pn, pkt_dev, ifname); in pktgen_setup_dev()
2100 pkt_dev->odev = odev; in pktgen_setup_dev()
2111 static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) in pktgen_setup_inject() argument
2115 if (!pkt_dev->odev) { in pktgen_setup_inject()
2117 sprintf(pkt_dev->result, in pktgen_setup_inject()
2123 ntxq = pkt_dev->odev->real_num_tx_queues; in pktgen_setup_inject()
2125 if (ntxq <= pkt_dev->queue_map_min) { in pktgen_setup_inject()
2127 pkt_dev->queue_map_min, (ntxq ?: 1) - 1, ntxq, in pktgen_setup_inject()
2128 pkt_dev->odevname); in pktgen_setup_inject()
2129 pkt_dev->queue_map_min = (ntxq ?: 1) - 1; in pktgen_setup_inject()
2131 if (pkt_dev->queue_map_max >= ntxq) { in pktgen_setup_inject()
2133 pkt_dev->queue_map_max, (ntxq ?: 1) - 1, ntxq, in pktgen_setup_inject()
2134 pkt_dev->odevname); in pktgen_setup_inject()
2135 pkt_dev->queue_map_max = (ntxq ?: 1) - 1; in pktgen_setup_inject()
2140 if (is_zero_ether_addr(pkt_dev->src_mac)) in pktgen_setup_inject()
2141 ether_addr_copy(&(pkt_dev->hh[6]), pkt_dev->odev->dev_addr); in pktgen_setup_inject()
2144 ether_addr_copy(&(pkt_dev->hh[0]), pkt_dev->dst_mac); in pktgen_setup_inject()
2146 if (pkt_dev->flags & F_IPV6) { in pktgen_setup_inject()
2150 if (pkt_dev->min_pkt_size == 0) { in pktgen_setup_inject()
2151 pkt_dev->min_pkt_size = 14 + sizeof(struct ipv6hdr) in pktgen_setup_inject()
2154 + pkt_dev->pkt_overhead; in pktgen_setup_inject()
2158 if (pkt_dev->cur_in6_saddr.s6_addr[i]) { in pktgen_setup_inject()
2172 idev = __in6_dev_get(pkt_dev->odev); in pktgen_setup_inject()
2180 pkt_dev->cur_in6_saddr = ifp->addr; in pktgen_setup_inject()
2192 if (pkt_dev->min_pkt_size == 0) { in pktgen_setup_inject()
2193 pkt_dev->min_pkt_size = 14 + sizeof(struct iphdr) in pktgen_setup_inject()
2196 + pkt_dev->pkt_overhead; in pktgen_setup_inject()
2199 pkt_dev->saddr_min = 0; in pktgen_setup_inject()
2200 pkt_dev->saddr_max = 0; in pktgen_setup_inject()
2201 if (strlen(pkt_dev->src_min) == 0) { in pktgen_setup_inject()
2206 in_dev = __in_dev_get_rcu(pkt_dev->odev); in pktgen_setup_inject()
2209 pkt_dev->saddr_min = in pktgen_setup_inject()
2211 pkt_dev->saddr_max = pkt_dev->saddr_min; in pktgen_setup_inject()
2216 pkt_dev->saddr_min = in_aton(pkt_dev->src_min); in pktgen_setup_inject()
2217 pkt_dev->saddr_max = in_aton(pkt_dev->src_max); in pktgen_setup_inject()
2220 pkt_dev->daddr_min = in_aton(pkt_dev->dst_min); in pktgen_setup_inject()
2221 pkt_dev->daddr_max = in_aton(pkt_dev->dst_max); in pktgen_setup_inject()
2224 pkt_dev->cur_pkt_size = pkt_dev->min_pkt_size; in pktgen_setup_inject()
2225 if (pkt_dev->min_pkt_size > pkt_dev->max_pkt_size) in pktgen_setup_inject()
2226 pkt_dev->max_pkt_size = pkt_dev->min_pkt_size; in pktgen_setup_inject()
2228 pkt_dev->cur_dst_mac_offset = 0; in pktgen_setup_inject()
2229 pkt_dev->cur_src_mac_offset = 0; in pktgen_setup_inject()
2230 pkt_dev->cur_saddr = pkt_dev->saddr_min; in pktgen_setup_inject()
2231 pkt_dev->cur_daddr = pkt_dev->daddr_min; in pktgen_setup_inject()
2232 pkt_dev->cur_udp_dst = pkt_dev->udp_dst_min; in pktgen_setup_inject()
2233 pkt_dev->cur_udp_src = pkt_dev->udp_src_min; in pktgen_setup_inject()
2234 pkt_dev->nflows = 0; in pktgen_setup_inject()
2238 static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) in spin() argument
2249 pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay); in spin()
2270 } while (t.task && pkt_dev->running && !signal_pending(current)); in spin()
2275 pkt_dev->idle_acc += ktime_to_ns(ktime_sub(end_time, start_time)); in spin()
2276 pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay); in spin()
2279 static inline void set_pkt_overhead(struct pktgen_dev *pkt_dev) in set_pkt_overhead() argument
2281 pkt_dev->pkt_overhead = LL_RESERVED_SPACE(pkt_dev->odev); in set_pkt_overhead()
2282 pkt_dev->pkt_overhead += pkt_dev->nr_labels*sizeof(u32); in set_pkt_overhead()
2283 pkt_dev->pkt_overhead += VLAN_TAG_SIZE(pkt_dev); in set_pkt_overhead()
2284 pkt_dev->pkt_overhead += SVLAN_TAG_SIZE(pkt_dev); in set_pkt_overhead()
2287 static inline int f_seen(const struct pktgen_dev *pkt_dev, int flow) in f_seen() argument
2289 return !!(pkt_dev->flows[flow].flags & F_INIT); in f_seen()
2292 static inline int f_pick(struct pktgen_dev *pkt_dev) in f_pick() argument
2294 int flow = pkt_dev->curfl; in f_pick()
2296 if (pkt_dev->flags & F_FLOW_SEQ) { in f_pick()
2297 if (pkt_dev->flows[flow].count >= pkt_dev->lflow) { in f_pick()
2299 pkt_dev->flows[flow].count = 0; in f_pick()
2300 pkt_dev->flows[flow].flags = 0; in f_pick()
2301 pkt_dev->curfl += 1; in f_pick()
2302 if (pkt_dev->curfl >= pkt_dev->cflows) in f_pick()
2303 pkt_dev->curfl = 0; /*reset */ in f_pick()
2306 flow = prandom_u32() % pkt_dev->cflows; in f_pick()
2307 pkt_dev->curfl = flow; in f_pick()
2309 if (pkt_dev->flows[flow].count > pkt_dev->lflow) { in f_pick()
2310 pkt_dev->flows[flow].count = 0; in f_pick()
2311 pkt_dev->flows[flow].flags = 0; in f_pick()
2315 return pkt_dev->curfl; in f_pick()
2324 static void get_ipsec_sa(struct pktgen_dev *pkt_dev, int flow) in get_ipsec_sa() argument
2326 struct xfrm_state *x = pkt_dev->flows[flow].x; in get_ipsec_sa()
2327 struct pktgen_net *pn = net_generic(dev_net(pkt_dev->odev), pg_net_id); in get_ipsec_sa()
2330 if (pkt_dev->spi) { in get_ipsec_sa()
2334 x = xfrm_state_lookup_byspi(pn->net, htonl(pkt_dev->spi), AF_INET); in get_ipsec_sa()
2338 (xfrm_address_t *)&pkt_dev->cur_daddr, in get_ipsec_sa()
2339 (xfrm_address_t *)&pkt_dev->cur_saddr, in get_ipsec_sa()
2341 pkt_dev->ipsmode, in get_ipsec_sa()
2342 pkt_dev->ipsproto, 0); in get_ipsec_sa()
2345 pkt_dev->flows[flow].x = x; in get_ipsec_sa()
2346 set_pkt_overhead(pkt_dev); in get_ipsec_sa()
2347 pkt_dev->pkt_overhead += x->props.header_len; in get_ipsec_sa()
2353 static void set_cur_queue_map(struct pktgen_dev *pkt_dev) in set_cur_queue_map() argument
2356 if (pkt_dev->flags & F_QUEUE_MAP_CPU) in set_cur_queue_map()
2357 pkt_dev->cur_queue_map = smp_processor_id(); in set_cur_queue_map()
2359 else if (pkt_dev->queue_map_min <= pkt_dev->queue_map_max) { in set_cur_queue_map()
2361 if (pkt_dev->flags & F_QUEUE_MAP_RND) { in set_cur_queue_map()
2363 (pkt_dev->queue_map_max - in set_cur_queue_map()
2364 pkt_dev->queue_map_min + 1) in set_cur_queue_map()
2365 + pkt_dev->queue_map_min; in set_cur_queue_map()
2367 t = pkt_dev->cur_queue_map + 1; in set_cur_queue_map()
2368 if (t > pkt_dev->queue_map_max) in set_cur_queue_map()
2369 t = pkt_dev->queue_map_min; in set_cur_queue_map()
2371 pkt_dev->cur_queue_map = t; in set_cur_queue_map()
2373 pkt_dev->cur_queue_map = pkt_dev->cur_queue_map % pkt_dev->odev->real_num_tx_queues; in set_cur_queue_map()
2379 static void mod_cur_headers(struct pktgen_dev *pkt_dev) in mod_cur_headers() argument
2385 if (pkt_dev->cflows) in mod_cur_headers()
2386 flow = f_pick(pkt_dev); in mod_cur_headers()
2389 if (pkt_dev->src_mac_count > 1) { in mod_cur_headers()
2393 if (pkt_dev->flags & F_MACSRC_RND) in mod_cur_headers()
2394 mc = prandom_u32() % pkt_dev->src_mac_count; in mod_cur_headers()
2396 mc = pkt_dev->cur_src_mac_offset++; in mod_cur_headers()
2397 if (pkt_dev->cur_src_mac_offset >= in mod_cur_headers()
2398 pkt_dev->src_mac_count) in mod_cur_headers()
2399 pkt_dev->cur_src_mac_offset = 0; in mod_cur_headers()
2402 tmp = pkt_dev->src_mac[5] + (mc & 0xFF); in mod_cur_headers()
2403 pkt_dev->hh[11] = tmp; in mod_cur_headers()
2404 tmp = (pkt_dev->src_mac[4] + ((mc >> 8) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2405 pkt_dev->hh[10] = tmp; in mod_cur_headers()
2406 tmp = (pkt_dev->src_mac[3] + ((mc >> 16) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2407 pkt_dev->hh[9] = tmp; in mod_cur_headers()
2408 tmp = (pkt_dev->src_mac[2] + ((mc >> 24) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2409 pkt_dev->hh[8] = tmp; in mod_cur_headers()
2410 tmp = (pkt_dev->src_mac[1] + (tmp >> 8)); in mod_cur_headers()
2411 pkt_dev->hh[7] = tmp; in mod_cur_headers()
2415 if (pkt_dev->dst_mac_count > 1) { in mod_cur_headers()
2419 if (pkt_dev->flags & F_MACDST_RND) in mod_cur_headers()
2420 mc = prandom_u32() % pkt_dev->dst_mac_count; in mod_cur_headers()
2423 mc = pkt_dev->cur_dst_mac_offset++; in mod_cur_headers()
2424 if (pkt_dev->cur_dst_mac_offset >= in mod_cur_headers()
2425 pkt_dev->dst_mac_count) { in mod_cur_headers()
2426 pkt_dev->cur_dst_mac_offset = 0; in mod_cur_headers()
2430 tmp = pkt_dev->dst_mac[5] + (mc & 0xFF); in mod_cur_headers()
2431 pkt_dev->hh[5] = tmp; in mod_cur_headers()
2432 tmp = (pkt_dev->dst_mac[4] + ((mc >> 8) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2433 pkt_dev->hh[4] = tmp; in mod_cur_headers()
2434 tmp = (pkt_dev->dst_mac[3] + ((mc >> 16) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2435 pkt_dev->hh[3] = tmp; in mod_cur_headers()
2436 tmp = (pkt_dev->dst_mac[2] + ((mc >> 24) & 0xFF) + (tmp >> 8)); in mod_cur_headers()
2437 pkt_dev->hh[2] = tmp; in mod_cur_headers()
2438 tmp = (pkt_dev->dst_mac[1] + (tmp >> 8)); in mod_cur_headers()
2439 pkt_dev->hh[1] = tmp; in mod_cur_headers()
2442 if (pkt_dev->flags & F_MPLS_RND) { in mod_cur_headers()
2444 for (i = 0; i < pkt_dev->nr_labels; i++) in mod_cur_headers()
2445 if (pkt_dev->labels[i] & MPLS_STACK_BOTTOM) in mod_cur_headers()
2446 pkt_dev->labels[i] = MPLS_STACK_BOTTOM | in mod_cur_headers()
2451 if ((pkt_dev->flags & F_VID_RND) && (pkt_dev->vlan_id != 0xffff)) { in mod_cur_headers()
2452 pkt_dev->vlan_id = prandom_u32() & (4096 - 1); in mod_cur_headers()
2455 if ((pkt_dev->flags & F_SVID_RND) && (pkt_dev->svlan_id != 0xffff)) { in mod_cur_headers()
2456 pkt_dev->svlan_id = prandom_u32() & (4096 - 1); in mod_cur_headers()
2459 if (pkt_dev->udp_src_min < pkt_dev->udp_src_max) { in mod_cur_headers()
2460 if (pkt_dev->flags & F_UDPSRC_RND) in mod_cur_headers()
2461 pkt_dev->cur_udp_src = prandom_u32() % in mod_cur_headers()
2462 (pkt_dev->udp_src_max - pkt_dev->udp_src_min) in mod_cur_headers()
2463 + pkt_dev->udp_src_min; in mod_cur_headers()
2466 pkt_dev->cur_udp_src++; in mod_cur_headers()
2467 if (pkt_dev->cur_udp_src >= pkt_dev->udp_src_max) in mod_cur_headers()
2468 pkt_dev->cur_udp_src = pkt_dev->udp_src_min; in mod_cur_headers()
2472 if (pkt_dev->udp_dst_min < pkt_dev->udp_dst_max) { in mod_cur_headers()
2473 if (pkt_dev->flags & F_UDPDST_RND) { in mod_cur_headers()
2474 pkt_dev->cur_udp_dst = prandom_u32() % in mod_cur_headers()
2475 (pkt_dev->udp_dst_max - pkt_dev->udp_dst_min) in mod_cur_headers()
2476 + pkt_dev->udp_dst_min; in mod_cur_headers()
2478 pkt_dev->cur_udp_dst++; in mod_cur_headers()
2479 if (pkt_dev->cur_udp_dst >= pkt_dev->udp_dst_max) in mod_cur_headers()
2480 pkt_dev->cur_udp_dst = pkt_dev->udp_dst_min; in mod_cur_headers()
2484 if (!(pkt_dev->flags & F_IPV6)) { in mod_cur_headers()
2486 imn = ntohl(pkt_dev->saddr_min); in mod_cur_headers()
2487 imx = ntohl(pkt_dev->saddr_max); in mod_cur_headers()
2490 if (pkt_dev->flags & F_IPSRC_RND) in mod_cur_headers()
2493 t = ntohl(pkt_dev->cur_saddr); in mod_cur_headers()
2499 pkt_dev->cur_saddr = htonl(t); in mod_cur_headers()
2502 if (pkt_dev->cflows && f_seen(pkt_dev, flow)) { in mod_cur_headers()
2503 pkt_dev->cur_daddr = pkt_dev->flows[flow].cur_daddr; in mod_cur_headers()
2505 imn = ntohl(pkt_dev->daddr_min); in mod_cur_headers()
2506 imx = ntohl(pkt_dev->daddr_max); in mod_cur_headers()
2510 if (pkt_dev->flags & F_IPDST_RND) { in mod_cur_headers()
2521 pkt_dev->cur_daddr = s; in mod_cur_headers()
2523 t = ntohl(pkt_dev->cur_daddr); in mod_cur_headers()
2528 pkt_dev->cur_daddr = htonl(t); in mod_cur_headers()
2531 if (pkt_dev->cflows) { in mod_cur_headers()
2532 pkt_dev->flows[flow].flags |= F_INIT; in mod_cur_headers()
2533 pkt_dev->flows[flow].cur_daddr = in mod_cur_headers()
2534 pkt_dev->cur_daddr; in mod_cur_headers()
2536 if (pkt_dev->flags & F_IPSEC_ON) in mod_cur_headers()
2537 get_ipsec_sa(pkt_dev, flow); in mod_cur_headers()
2539 pkt_dev->nflows++; in mod_cur_headers()
2544 if (!ipv6_addr_any(&pkt_dev->min_in6_daddr)) { in mod_cur_headers()
2550 pkt_dev->cur_in6_daddr.s6_addr32[i] = in mod_cur_headers()
2552 pkt_dev->min_in6_daddr.s6_addr32[i]) & in mod_cur_headers()
2553 pkt_dev->max_in6_daddr.s6_addr32[i]); in mod_cur_headers()
2558 if (pkt_dev->min_pkt_size < pkt_dev->max_pkt_size) { in mod_cur_headers()
2560 if (pkt_dev->flags & F_TXSIZE_RND) { in mod_cur_headers()
2562 (pkt_dev->max_pkt_size - pkt_dev->min_pkt_size) in mod_cur_headers()
2563 + pkt_dev->min_pkt_size; in mod_cur_headers()
2565 t = pkt_dev->cur_pkt_size + 1; in mod_cur_headers()
2566 if (t > pkt_dev->max_pkt_size) in mod_cur_headers()
2567 t = pkt_dev->min_pkt_size; in mod_cur_headers()
2569 pkt_dev->cur_pkt_size = t; in mod_cur_headers()
2572 set_cur_queue_map(pkt_dev); in mod_cur_headers()
2574 pkt_dev->flows[flow].count++; in mod_cur_headers()
2584 static int pktgen_output_ipsec(struct sk_buff *skb, struct pktgen_dev *pkt_dev) in pktgen_output_ipsec() argument
2586 struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x; in pktgen_output_ipsec()
2588 struct net *net = dev_net(pkt_dev->odev); in pktgen_output_ipsec()
2594 if ((x->props.mode != XFRM_MODE_TRANSPORT) && (pkt_dev->spi == 0)) in pktgen_output_ipsec()
2600 if ((x->props.mode == XFRM_MODE_TUNNEL) && (pkt_dev->spi != 0)) in pktgen_output_ipsec()
2601 skb->_skb_refdst = (unsigned long)&pkt_dev->dst | SKB_DST_NOREF; in pktgen_output_ipsec()
2623 static void free_SAs(struct pktgen_dev *pkt_dev) in free_SAs() argument
2625 if (pkt_dev->cflows) { in free_SAs()
2628 for (i = 0; i < pkt_dev->cflows; i++) { in free_SAs()
2629 struct xfrm_state *x = pkt_dev->flows[i].x; in free_SAs()
2632 pkt_dev->flows[i].x = NULL; in free_SAs()
2638 static int process_ipsec(struct pktgen_dev *pkt_dev, in process_ipsec() argument
2641 if (pkt_dev->flags & F_IPSEC_ON) { in process_ipsec()
2642 struct xfrm_state *x = pkt_dev->flows[pkt_dev->curfl].x; in process_ipsec()
2661 ret = pktgen_output_ipsec(skb, pkt_dev); in process_ipsec()
2668 memcpy(eth, pkt_dev->hh, 2 * ETH_ALEN); in process_ipsec()
2684 static void mpls_push(__be32 *mpls, struct pktgen_dev *pkt_dev) in mpls_push() argument
2687 for (i = 0; i < pkt_dev->nr_labels; i++) in mpls_push()
2688 *mpls++ = pkt_dev->labels[i] & ~MPLS_STACK_BOTTOM; in mpls_push()
2700 static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb, in pktgen_finalize_skb() argument
2709 if (pkt_dev->nfrags <= 0) { in pktgen_finalize_skb()
2712 int frags = pkt_dev->nfrags; in pktgen_finalize_skb()
2729 if (unlikely(!pkt_dev->page)) { in pktgen_finalize_skb()
2732 if (pkt_dev->node >= 0 && (pkt_dev->flags & F_NODE)) in pktgen_finalize_skb()
2733 node = pkt_dev->node; in pktgen_finalize_skb()
2734 pkt_dev->page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, 0); in pktgen_finalize_skb()
2735 if (!pkt_dev->page) in pktgen_finalize_skb()
2738 get_page(pkt_dev->page); in pktgen_finalize_skb()
2739 skb_frag_set_page(skb, i, pkt_dev->page); in pktgen_finalize_skb()
2759 pgh->seq_num = htonl(pkt_dev->seq_num); in pktgen_finalize_skb()
2761 if (pkt_dev->flags & F_NO_TIMESTAMP) { in pktgen_finalize_skb()
2772 struct pktgen_dev *pkt_dev, in pktgen_alloc_skb() argument
2776 unsigned int size = pkt_dev->cur_pkt_size + 64 + extralen + in pktgen_alloc_skb()
2777 pkt_dev->pkt_overhead; in pktgen_alloc_skb()
2779 if (pkt_dev->flags & F_NODE) { in pktgen_alloc_skb()
2780 int node = pkt_dev->node >= 0 ? pkt_dev->node : numa_node_id(); in pktgen_alloc_skb()
2798 struct pktgen_dev *pkt_dev) in fill_packet_ipv4() argument
2813 if (pkt_dev->nr_labels) in fill_packet_ipv4()
2816 if (pkt_dev->vlan_id != 0xffff) in fill_packet_ipv4()
2822 mod_cur_headers(pkt_dev); in fill_packet_ipv4()
2823 queue_map = pkt_dev->cur_queue_map; in fill_packet_ipv4()
2827 skb = pktgen_alloc_skb(odev, pkt_dev, datalen); in fill_packet_ipv4()
2829 sprintf(pkt_dev->result, "No memory"); in fill_packet_ipv4()
2838 mpls = (__be32 *)skb_put(skb, pkt_dev->nr_labels*sizeof(__u32)); in fill_packet_ipv4()
2839 if (pkt_dev->nr_labels) in fill_packet_ipv4()
2840 mpls_push(mpls, pkt_dev); in fill_packet_ipv4()
2842 if (pkt_dev->vlan_id != 0xffff) { in fill_packet_ipv4()
2843 if (pkt_dev->svlan_id != 0xffff) { in fill_packet_ipv4()
2845 *svlan_tci = build_tci(pkt_dev->svlan_id, in fill_packet_ipv4()
2846 pkt_dev->svlan_cfi, in fill_packet_ipv4()
2847 pkt_dev->svlan_p); in fill_packet_ipv4()
2852 *vlan_tci = build_tci(pkt_dev->vlan_id, in fill_packet_ipv4()
2853 pkt_dev->vlan_cfi, in fill_packet_ipv4()
2854 pkt_dev->vlan_p); in fill_packet_ipv4()
2866 skb->priority = pkt_dev->skb_priority; in fill_packet_ipv4()
2868 memcpy(eth, pkt_dev->hh, 12); in fill_packet_ipv4()
2872 datalen = pkt_dev->cur_pkt_size - 14 - 20 - 8 - in fill_packet_ipv4()
2873 pkt_dev->pkt_overhead; in fill_packet_ipv4()
2877 udph->source = htons(pkt_dev->cur_udp_src); in fill_packet_ipv4()
2878 udph->dest = htons(pkt_dev->cur_udp_dst); in fill_packet_ipv4()
2885 iph->tos = pkt_dev->tos; in fill_packet_ipv4()
2887 iph->saddr = pkt_dev->cur_saddr; in fill_packet_ipv4()
2888 iph->daddr = pkt_dev->cur_daddr; in fill_packet_ipv4()
2889 iph->id = htons(pkt_dev->ip_id); in fill_packet_ipv4()
2890 pkt_dev->ip_id++; in fill_packet_ipv4()
2899 pktgen_finalize_skb(pkt_dev, skb, datalen); in fill_packet_ipv4()
2901 if (!(pkt_dev->flags & F_UDPCSUM)) { in fill_packet_ipv4()
2919 if (!process_ipsec(pkt_dev, skb, protocol)) in fill_packet_ipv4()
2927 struct pktgen_dev *pkt_dev) in fill_packet_ipv6() argument
2942 if (pkt_dev->nr_labels) in fill_packet_ipv6()
2945 if (pkt_dev->vlan_id != 0xffff) in fill_packet_ipv6()
2951 mod_cur_headers(pkt_dev); in fill_packet_ipv6()
2952 queue_map = pkt_dev->cur_queue_map; in fill_packet_ipv6()
2954 skb = pktgen_alloc_skb(odev, pkt_dev, 16); in fill_packet_ipv6()
2956 sprintf(pkt_dev->result, "No memory"); in fill_packet_ipv6()
2965 mpls = (__be32 *)skb_put(skb, pkt_dev->nr_labels*sizeof(__u32)); in fill_packet_ipv6()
2966 if (pkt_dev->nr_labels) in fill_packet_ipv6()
2967 mpls_push(mpls, pkt_dev); in fill_packet_ipv6()
2969 if (pkt_dev->vlan_id != 0xffff) { in fill_packet_ipv6()
2970 if (pkt_dev->svlan_id != 0xffff) { in fill_packet_ipv6()
2972 *svlan_tci = build_tci(pkt_dev->svlan_id, in fill_packet_ipv6()
2973 pkt_dev->svlan_cfi, in fill_packet_ipv6()
2974 pkt_dev->svlan_p); in fill_packet_ipv6()
2979 *vlan_tci = build_tci(pkt_dev->vlan_id, in fill_packet_ipv6()
2980 pkt_dev->vlan_cfi, in fill_packet_ipv6()
2981 pkt_dev->vlan_p); in fill_packet_ipv6()
2993 skb->priority = pkt_dev->skb_priority; in fill_packet_ipv6()
2995 memcpy(eth, pkt_dev->hh, 12); in fill_packet_ipv6()
2999 datalen = pkt_dev->cur_pkt_size - 14 - in fill_packet_ipv6()
3001 pkt_dev->pkt_overhead; in fill_packet_ipv6()
3009 udph->source = htons(pkt_dev->cur_udp_src); in fill_packet_ipv6()
3010 udph->dest = htons(pkt_dev->cur_udp_dst); in fill_packet_ipv6()
3016 if (pkt_dev->traffic_class) { in fill_packet_ipv6()
3018 *(__be32 *)iph |= htonl(0x60000000 | (pkt_dev->traffic_class << 20)); in fill_packet_ipv6()
3026 iph->daddr = pkt_dev->cur_in6_daddr; in fill_packet_ipv6()
3027 iph->saddr = pkt_dev->cur_in6_saddr; in fill_packet_ipv6()
3033 pktgen_finalize_skb(pkt_dev, skb, datalen); in fill_packet_ipv6()
3035 if (!(pkt_dev->flags & F_UDPCSUM)) { in fill_packet_ipv6()
3056 struct pktgen_dev *pkt_dev) in fill_packet() argument
3058 if (pkt_dev->flags & F_IPV6) in fill_packet()
3059 return fill_packet_ipv6(odev, pkt_dev); in fill_packet()
3061 return fill_packet_ipv4(odev, pkt_dev); in fill_packet()
3064 static void pktgen_clear_counters(struct pktgen_dev *pkt_dev) in pktgen_clear_counters() argument
3066 pkt_dev->seq_num = 1; in pktgen_clear_counters()
3067 pkt_dev->idle_acc = 0; in pktgen_clear_counters()
3068 pkt_dev->sofar = 0; in pktgen_clear_counters()
3069 pkt_dev->tx_bytes = 0; in pktgen_clear_counters()
3070 pkt_dev->errors = 0; in pktgen_clear_counters()
3077 struct pktgen_dev *pkt_dev; in pktgen_run() local
3083 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) { in pktgen_run()
3088 pktgen_setup_inject(pkt_dev); in pktgen_run()
3090 if (pkt_dev->odev) { in pktgen_run()
3091 pktgen_clear_counters(pkt_dev); in pktgen_run()
3092 pkt_dev->skb = NULL; in pktgen_run()
3093 pkt_dev->started_at = pkt_dev->next_tx = ktime_get(); in pktgen_run()
3095 set_pkt_overhead(pkt_dev); in pktgen_run()
3097 strcpy(pkt_dev->result, "Starting"); in pktgen_run()
3098 pkt_dev->running = 1; /* Cranke yeself! */ in pktgen_run()
3101 strcpy(pkt_dev->result, "Error starting"); in pktgen_run()
3124 const struct pktgen_dev *pkt_dev; in thread_is_running() local
3127 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) in thread_is_running()
3128 if (pkt_dev->running) { in thread_is_running()
3209 static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) in show_results() argument
3212 char *p = pkt_dev->result; in show_results()
3213 ktime_t elapsed = ktime_sub(pkt_dev->stopped_at, in show_results()
3214 pkt_dev->started_at); in show_results()
3215 ktime_t idle = ns_to_ktime(pkt_dev->idle_acc); in show_results()
3221 (unsigned long long)pkt_dev->sofar, in show_results()
3222 pkt_dev->cur_pkt_size, nr_frags); in show_results()
3224 pps = div64_u64(pkt_dev->sofar * NSEC_PER_SEC, in show_results()
3227 bps = pps * 8 * pkt_dev->cur_pkt_size; in show_results()
3235 (unsigned long long)pkt_dev->errors); in show_results()
3239 static int pktgen_stop_device(struct pktgen_dev *pkt_dev) in pktgen_stop_device() argument
3241 int nr_frags = pkt_dev->skb ? skb_shinfo(pkt_dev->skb)->nr_frags : -1; in pktgen_stop_device()
3243 if (!pkt_dev->running) { in pktgen_stop_device()
3245 pkt_dev->odevname); in pktgen_stop_device()
3249 pkt_dev->running = 0; in pktgen_stop_device()
3250 kfree_skb(pkt_dev->skb); in pktgen_stop_device()
3251 pkt_dev->skb = NULL; in pktgen_stop_device()
3252 pkt_dev->stopped_at = ktime_get(); in pktgen_stop_device()
3254 show_results(pkt_dev, nr_frags); in pktgen_stop_device()
3261 struct pktgen_dev *pkt_dev, *best = NULL; in next_to_run() local
3264 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) { in next_to_run()
3265 if (!pkt_dev->running) in next_to_run()
3268 best = pkt_dev; in next_to_run()
3269 else if (ktime_compare(pkt_dev->next_tx, best->next_tx) < 0) in next_to_run()
3270 best = pkt_dev; in next_to_run()
3279 struct pktgen_dev *pkt_dev; in pktgen_stop() local
3285 list_for_each_entry_rcu(pkt_dev, &t->if_list, list) { in pktgen_stop()
3286 pktgen_stop_device(pkt_dev); in pktgen_stop()
3343 static void pktgen_resched(struct pktgen_dev *pkt_dev) in pktgen_resched() argument
3347 pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_get(), idle_start)); in pktgen_resched()
3350 static void pktgen_wait_for_skb(struct pktgen_dev *pkt_dev) in pktgen_wait_for_skb() argument
3354 while (atomic_read(&(pkt_dev->skb->users)) != 1) { in pktgen_wait_for_skb()
3359 pktgen_resched(pkt_dev); in pktgen_wait_for_skb()
3363 pkt_dev->idle_acc += ktime_to_ns(ktime_sub(ktime_get(), idle_start)); in pktgen_wait_for_skb()
3366 static void pktgen_xmit(struct pktgen_dev *pkt_dev) in pktgen_xmit() argument
3368 unsigned int burst = ACCESS_ONCE(pkt_dev->burst); in pktgen_xmit()
3369 struct net_device *odev = pkt_dev->odev; in pktgen_xmit()
3376 pktgen_stop_device(pkt_dev); in pktgen_xmit()
3383 if (unlikely(pkt_dev->delay == ULLONG_MAX)) { in pktgen_xmit()
3384 pkt_dev->next_tx = ktime_add_ns(ktime_get(), ULONG_MAX); in pktgen_xmit()
3389 if (!pkt_dev->skb || (pkt_dev->last_ok && in pktgen_xmit()
3390 ++pkt_dev->clone_count >= pkt_dev->clone_skb)) { in pktgen_xmit()
3392 kfree_skb(pkt_dev->skb); in pktgen_xmit()
3394 pkt_dev->skb = fill_packet(odev, pkt_dev); in pktgen_xmit()
3395 if (pkt_dev->skb == NULL) { in pktgen_xmit()
3398 pkt_dev->clone_count--; /* back out increment, OOM */ in pktgen_xmit()
3401 pkt_dev->last_pkt_size = pkt_dev->skb->len; in pktgen_xmit()
3402 pkt_dev->clone_count = 0; /* reset counter */ in pktgen_xmit()
3405 if (pkt_dev->delay && pkt_dev->last_ok) in pktgen_xmit()
3406 spin(pkt_dev, pkt_dev->next_tx); in pktgen_xmit()
3408 if (pkt_dev->xmit_mode == M_NETIF_RECEIVE) { in pktgen_xmit()
3409 skb = pkt_dev->skb; in pktgen_xmit()
3416 pkt_dev->errors++; in pktgen_xmit()
3417 pkt_dev->sofar++; in pktgen_xmit()
3418 pkt_dev->seq_num++; in pktgen_xmit()
3439 txq = skb_get_tx_queue(odev, pkt_dev->skb); in pktgen_xmit()
3447 pkt_dev->last_ok = 0; in pktgen_xmit()
3450 atomic_add(burst, &pkt_dev->skb->users); in pktgen_xmit()
3453 ret = netdev_start_xmit(pkt_dev->skb, odev, txq, --burst > 0); in pktgen_xmit()
3457 pkt_dev->last_ok = 1; in pktgen_xmit()
3458 pkt_dev->sofar++; in pktgen_xmit()
3459 pkt_dev->seq_num++; in pktgen_xmit()
3460 pkt_dev->tx_bytes += pkt_dev->last_pkt_size; in pktgen_xmit()
3468 pkt_dev->errors++; in pktgen_xmit()
3472 pkt_dev->odevname, ret); in pktgen_xmit()
3473 pkt_dev->errors++; in pktgen_xmit()
3478 atomic_dec(&(pkt_dev->skb->users)); in pktgen_xmit()
3479 pkt_dev->last_ok = 0; in pktgen_xmit()
3482 atomic_sub(burst, &pkt_dev->skb->users); in pktgen_xmit()
3490 if ((pkt_dev->count != 0) && (pkt_dev->sofar >= pkt_dev->count)) { in pktgen_xmit()
3491 pktgen_wait_for_skb(pkt_dev); in pktgen_xmit()
3494 pktgen_stop_device(pkt_dev); in pktgen_xmit()
3506 struct pktgen_dev *pkt_dev = NULL; in pktgen_thread_worker() local
3519 pkt_dev = next_to_run(t); in pktgen_thread_worker()
3521 if (unlikely(!pkt_dev && t->control == 0)) { in pktgen_thread_worker()
3531 if (likely(pkt_dev)) { in pktgen_thread_worker()
3532 pktgen_xmit(pkt_dev); in pktgen_thread_worker()
3535 pktgen_resched(pkt_dev); in pktgen_thread_worker()
3578 struct pktgen_dev *p, *pkt_dev = NULL; in pktgen_find_dev() local
3588 pkt_dev = p; in pktgen_find_dev()
3593 pr_debug("find_dev(%s) returning %p\n", ifname, pkt_dev); in pktgen_find_dev()
3594 return pkt_dev; in pktgen_find_dev()
3602 struct pktgen_dev *pkt_dev) in add_dev_to_thread() argument
3614 if (pkt_dev->pg_thread) { in add_dev_to_thread()
3620 pkt_dev->running = 0; in add_dev_to_thread()
3621 pkt_dev->pg_thread = t; in add_dev_to_thread()
3622 list_add_rcu(&pkt_dev->list, &t->if_list); in add_dev_to_thread()
3633 struct pktgen_dev *pkt_dev; in pktgen_add_device() local
3639 pkt_dev = __pktgen_NN_threads(t->net, ifname, FIND); in pktgen_add_device()
3640 if (pkt_dev) { in pktgen_add_device()
3645 pkt_dev = kzalloc_node(sizeof(struct pktgen_dev), GFP_KERNEL, node); in pktgen_add_device()
3646 if (!pkt_dev) in pktgen_add_device()
3649 strcpy(pkt_dev->odevname, ifname); in pktgen_add_device()
3650 pkt_dev->flows = vzalloc_node(MAX_CFLOWS * sizeof(struct flow_state), in pktgen_add_device()
3652 if (pkt_dev->flows == NULL) { in pktgen_add_device()
3653 kfree(pkt_dev); in pktgen_add_device()
3657 pkt_dev->removal_mark = 0; in pktgen_add_device()
3658 pkt_dev->nfrags = 0; in pktgen_add_device()
3659 pkt_dev->delay = pg_delay_d; in pktgen_add_device()
3660 pkt_dev->count = pg_count_d; in pktgen_add_device()
3661 pkt_dev->sofar = 0; in pktgen_add_device()
3662 pkt_dev->udp_src_min = 9; /* sink port */ in pktgen_add_device()
3663 pkt_dev->udp_src_max = 9; in pktgen_add_device()
3664 pkt_dev->udp_dst_min = 9; in pktgen_add_device()
3665 pkt_dev->udp_dst_max = 9; in pktgen_add_device()
3666 pkt_dev->vlan_p = 0; in pktgen_add_device()
3667 pkt_dev->vlan_cfi = 0; in pktgen_add_device()
3668 pkt_dev->vlan_id = 0xffff; in pktgen_add_device()
3669 pkt_dev->svlan_p = 0; in pktgen_add_device()
3670 pkt_dev->svlan_cfi = 0; in pktgen_add_device()
3671 pkt_dev->svlan_id = 0xffff; in pktgen_add_device()
3672 pkt_dev->burst = 1; in pktgen_add_device()
3673 pkt_dev->node = -1; in pktgen_add_device()
3675 err = pktgen_setup_dev(t->net, pkt_dev, ifname); in pktgen_add_device()
3678 if (pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING) in pktgen_add_device()
3679 pkt_dev->clone_skb = pg_clone_skb_d; in pktgen_add_device()
3681 pkt_dev->entry = proc_create_data(ifname, 0600, t->net->proc_dir, in pktgen_add_device()
3682 &pktgen_if_fops, pkt_dev); in pktgen_add_device()
3683 if (!pkt_dev->entry) { in pktgen_add_device()
3690 pkt_dev->ipsmode = XFRM_MODE_TRANSPORT; in pktgen_add_device()
3691 pkt_dev->ipsproto = IPPROTO_ESP; in pktgen_add_device()
3698 pkt_dev->dstops.family = AF_INET; in pktgen_add_device()
3699 pkt_dev->dst.dev = pkt_dev->odev; in pktgen_add_device()
3700 dst_init_metrics(&pkt_dev->dst, pktgen_dst_metrics, false); in pktgen_add_device()
3701 pkt_dev->dst.child = &pkt_dev->dst; in pktgen_add_device()
3702 pkt_dev->dst.ops = &pkt_dev->dstops; in pktgen_add_device()
3705 return add_dev_to_thread(t, pkt_dev); in pktgen_add_device()
3707 dev_put(pkt_dev->odev); in pktgen_add_device()
3710 free_SAs(pkt_dev); in pktgen_add_device()
3712 vfree(pkt_dev->flows); in pktgen_add_device()
3713 kfree(pkt_dev); in pktgen_add_device()
3774 struct pktgen_dev *pkt_dev) in _rem_dev_from_if_list() argument
3782 if (p == pkt_dev) in _rem_dev_from_if_list()
3789 struct pktgen_dev *pkt_dev) in pktgen_remove_device() argument
3791 pr_debug("remove_device pkt_dev=%p\n", pkt_dev); in pktgen_remove_device()
3793 if (pkt_dev->running) { in pktgen_remove_device()
3795 pktgen_stop_device(pkt_dev); in pktgen_remove_device()
3800 if (pkt_dev->odev) { in pktgen_remove_device()
3801 dev_put(pkt_dev->odev); in pktgen_remove_device()
3802 pkt_dev->odev = NULL; in pktgen_remove_device()
3808 proc_remove(pkt_dev->entry); in pktgen_remove_device()
3811 _rem_dev_from_if_list(t, pkt_dev); in pktgen_remove_device()
3814 free_SAs(pkt_dev); in pktgen_remove_device()
3816 vfree(pkt_dev->flows); in pktgen_remove_device()
3817 if (pkt_dev->page) in pktgen_remove_device()
3818 put_page(pkt_dev->page); in pktgen_remove_device()
3819 kfree_rcu(pkt_dev, rcu); in pktgen_remove_device()