📄 pktgen.c
字号:
if (len < 0) { return len; } i += len; if (value == 0x7FFFFFFF) { pkt_dev->delay_us = 0x7FFFFFFF; pkt_dev->delay_ns = 0; } else { pkt_dev->delay_us = value / 1000; pkt_dev->delay_ns = value % 1000; } sprintf(pg_result, "OK: delay=%u", 1000 * pkt_dev->delay_us + pkt_dev->delay_ns); return count; } if (!strcmp(name, "udp_src_min")) { len = num_arg(&user_buffer[i], 10, &value); if (len < 0) { return len; } i += len; if (value != pkt_dev->udp_src_min) { pkt_dev->udp_src_min = value; pkt_dev->cur_udp_src = value; } sprintf(pg_result, "OK: udp_src_min=%u", pkt_dev->udp_src_min); return count; } if (!strcmp(name, "udp_dst_min")) { len = num_arg(&user_buffer[i], 10, &value); if (len < 0) { return len; } i += len; if (value != pkt_dev->udp_dst_min) { pkt_dev->udp_dst_min = value; pkt_dev->cur_udp_dst = value; } sprintf(pg_result, "OK: udp_dst_min=%u", pkt_dev->udp_dst_min); return count; } if (!strcmp(name, "udp_src_max")) { len = num_arg(&user_buffer[i], 10, &value); if (len < 0) { return len; } i += len; if (value != pkt_dev->udp_src_max) { pkt_dev->udp_src_max = value; pkt_dev->cur_udp_src = value; } sprintf(pg_result, "OK: udp_src_max=%u", pkt_dev->udp_src_max); return count; } if (!strcmp(name, "udp_dst_max")) { len = num_arg(&user_buffer[i], 10, &value); if (len < 0) { return len; } i += len; if (value != pkt_dev->udp_dst_max) { pkt_dev->udp_dst_max = value; pkt_dev->cur_udp_dst = value; } sprintf(pg_result, "OK: udp_dst_max=%u", pkt_dev->udp_dst_max); return count; } if (!strcmp(name, "clone_skb")) { len = num_arg(&user_buffer[i], 10, &value); if (len < 0) { return len; } i += len; pkt_dev->clone_skb = value; sprintf(pg_result, "OK: clone_skb=%d", pkt_dev->clone_skb); return count; } if (!strcmp(name, "count")) { len = num_arg(&user_buffer[i], 10, &value); if (len < 0) { return len; } i += len; pkt_dev->count = value; sprintf(pg_result, "OK: count=%llu", (unsigned long long)pkt_dev->count); return count; } if (!strcmp(name, "src_mac_count")) { len = num_arg(&user_buffer[i], 10, &value); if (len < 0) { return len; } i += len; if (pkt_dev->src_mac_count != value) { pkt_dev->src_mac_count = value; pkt_dev->cur_src_mac_offset = 0; } sprintf(pg_result, "OK: src_mac_count=%d", pkt_dev->src_mac_count); return count; } if (!strcmp(name, "dst_mac_count")) { len = num_arg(&user_buffer[i], 10, &value); if (len < 0) { return len; } i += len; if (pkt_dev->dst_mac_count != value) { pkt_dev->dst_mac_count = value; pkt_dev->cur_dst_mac_offset = 0; } sprintf(pg_result, "OK: dst_mac_count=%d", pkt_dev->dst_mac_count); return count; } if (!strcmp(name, "flag")) { char f[32]; memset(f, 0, 32); len = strn_len(&user_buffer[i], sizeof(f) - 1); if (len < 0) { return len; } if (copy_from_user(f, &user_buffer[i], len)) return -EFAULT; i += len; if (strcmp(f, "IPSRC_RND") == 0) pkt_dev->flags |= F_IPSRC_RND; else if (strcmp(f, "!IPSRC_RND") == 0) pkt_dev->flags &= ~F_IPSRC_RND; else if (strcmp(f, "TXSIZE_RND") == 0) pkt_dev->flags |= F_TXSIZE_RND; else if (strcmp(f, "!TXSIZE_RND") == 0) pkt_dev->flags &= ~F_TXSIZE_RND; else if (strcmp(f, "IPDST_RND") == 0) pkt_dev->flags |= F_IPDST_RND; else if (strcmp(f, "!IPDST_RND") == 0) pkt_dev->flags &= ~F_IPDST_RND; else if (strcmp(f, "UDPSRC_RND") == 0) pkt_dev->flags |= F_UDPSRC_RND; else if (strcmp(f, "!UDPSRC_RND") == 0) pkt_dev->flags &= ~F_UDPSRC_RND; else if (strcmp(f, "UDPDST_RND") == 0) pkt_dev->flags |= F_UDPDST_RND; else if (strcmp(f, "!UDPDST_RND") == 0) pkt_dev->flags &= ~F_UDPDST_RND; else if (strcmp(f, "MACSRC_RND") == 0) pkt_dev->flags |= F_MACSRC_RND; else if (strcmp(f, "!MACSRC_RND") == 0) pkt_dev->flags &= ~F_MACSRC_RND; else if (strcmp(f, "MACDST_RND") == 0) pkt_dev->flags |= F_MACDST_RND; else if (strcmp(f, "!MACDST_RND") == 0) pkt_dev->flags &= ~F_MACDST_RND; else if (strcmp(f, "MPLS_RND") == 0) pkt_dev->flags |= F_MPLS_RND; else if (strcmp(f, "!MPLS_RND") == 0) pkt_dev->flags &= ~F_MPLS_RND; else if (strcmp(f, "VID_RND") == 0) pkt_dev->flags |= F_VID_RND; else if (strcmp(f, "!VID_RND") == 0) pkt_dev->flags &= ~F_VID_RND; else if (strcmp(f, "SVID_RND") == 0) pkt_dev->flags |= F_SVID_RND; else if (strcmp(f, "!SVID_RND") == 0) pkt_dev->flags &= ~F_SVID_RND; else if (strcmp(f, "FLOW_SEQ") == 0) pkt_dev->flags |= F_FLOW_SEQ; else if (strcmp(f, "QUEUE_MAP_RND") == 0) pkt_dev->flags |= F_QUEUE_MAP_RND; else if (strcmp(f, "!QUEUE_MAP_RND") == 0) pkt_dev->flags &= ~F_QUEUE_MAP_RND;#ifdef CONFIG_XFRM else if (strcmp(f, "IPSEC") == 0) pkt_dev->flags |= F_IPSEC_ON;#endif else if (strcmp(f, "!IPV6") == 0) pkt_dev->flags &= ~F_IPV6; else { sprintf(pg_result, "Flag -:%s:- unknown\nAvailable flags, (prepend ! to un-set flag):\n%s", f, "IPSRC_RND, IPDST_RND, UDPSRC_RND, UDPDST_RND, " "MACSRC_RND, MACDST_RND, TXSIZE_RND, IPV6, MPLS_RND, VID_RND, SVID_RND, FLOW_SEQ, IPSEC\n"); return count; } sprintf(pg_result, "OK: flags=0x%x", pkt_dev->flags); return count; } if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) { len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1); if (len < 0) { return len; } if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; buf[len] = 0; if (strcmp(buf, pkt_dev->dst_min) != 0) { memset(pkt_dev->dst_min, 0, sizeof(pkt_dev->dst_min)); strncpy(pkt_dev->dst_min, buf, len); pkt_dev->daddr_min = in_aton(pkt_dev->dst_min); pkt_dev->cur_daddr = pkt_dev->daddr_min; } if (debug) printk(KERN_DEBUG "pktgen: dst_min set to: %s\n", pkt_dev->dst_min); i += len; sprintf(pg_result, "OK: dst_min=%s", pkt_dev->dst_min); return count; } if (!strcmp(name, "dst_max")) { len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1); if (len < 0) { return len; } if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; buf[len] = 0; if (strcmp(buf, pkt_dev->dst_max) != 0) { memset(pkt_dev->dst_max, 0, sizeof(pkt_dev->dst_max)); strncpy(pkt_dev->dst_max, buf, len); pkt_dev->daddr_max = in_aton(pkt_dev->dst_max); pkt_dev->cur_daddr = pkt_dev->daddr_max; } if (debug) printk(KERN_DEBUG "pktgen: dst_max set to: %s\n", pkt_dev->dst_max); i += len; sprintf(pg_result, "OK: dst_max=%s", pkt_dev->dst_max); return count; } if (!strcmp(name, "dst6")) { len = strn_len(&user_buffer[i], sizeof(buf) - 1); if (len < 0) return len; pkt_dev->flags |= F_IPV6; if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; buf[len] = 0; scan_ip6(buf, pkt_dev->in6_daddr.s6_addr); fmt_ip6(buf, pkt_dev->in6_daddr.s6_addr); ipv6_addr_copy(&pkt_dev->cur_in6_daddr, &pkt_dev->in6_daddr); if (debug) printk(KERN_DEBUG "pktgen: dst6 set to: %s\n", buf); i += len; sprintf(pg_result, "OK: dst6=%s", buf); return count; } if (!strcmp(name, "dst6_min")) { len = strn_len(&user_buffer[i], sizeof(buf) - 1); if (len < 0) return len; pkt_dev->flags |= F_IPV6; if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; buf[len] = 0; scan_ip6(buf, pkt_dev->min_in6_daddr.s6_addr); fmt_ip6(buf, pkt_dev->min_in6_daddr.s6_addr); ipv6_addr_copy(&pkt_dev->cur_in6_daddr, &pkt_dev->min_in6_daddr); if (debug) printk(KERN_DEBUG "pktgen: dst6_min set to: %s\n", buf); i += len; sprintf(pg_result, "OK: dst6_min=%s", buf); return count; } if (!strcmp(name, "dst6_max")) { len = strn_len(&user_buffer[i], sizeof(buf) - 1); if (len < 0) return len; pkt_dev->flags |= F_IPV6; if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; buf[len] = 0; scan_ip6(buf, pkt_dev->max_in6_daddr.s6_addr); fmt_ip6(buf, pkt_dev->max_in6_daddr.s6_addr); if (debug) printk(KERN_DEBUG "pktgen: dst6_max set to: %s\n", buf); i += len; sprintf(pg_result, "OK: dst6_max=%s", buf); return count; } if (!strcmp(name, "src6")) { len = strn_len(&user_buffer[i], sizeof(buf) - 1); if (len < 0) return len; pkt_dev->flags |= F_IPV6; if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; buf[len] = 0; scan_ip6(buf, pkt_dev->in6_saddr.s6_addr); fmt_ip6(buf, pkt_dev->in6_saddr.s6_addr); ipv6_addr_copy(&pkt_dev->cur_in6_saddr, &pkt_dev->in6_saddr); if (debug) printk(KERN_DEBUG "pktgen: src6 set to: %s\n", buf); i += len; sprintf(pg_result, "OK: src6=%s", buf); return count; } if (!strcmp(name, "src_min")) { len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1); if (len < 0) { return len; } if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; buf[len] = 0; if (strcmp(buf, pkt_dev->src_min) != 0) { memset(pkt_dev->src_min, 0, sizeof(pkt_dev->src_min)); strncpy(pkt_dev->src_min, buf, len); pkt_dev->saddr_min = in_aton(pkt_dev->src_min); pkt_dev->cur_saddr = pkt_dev->saddr_min; } if (debug) printk(KERN_DEBUG "pktgen: src_min set to: %s\n", pkt_dev->src_min); i += len; sprintf(pg_result, "OK: src_min=%s", pkt_dev->src_min); return count; } if (!strcmp(name, "src_max")) { len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1); if (len < 0) { return len; } if (copy_from_user(buf, &user_buffer[i], len)) return -EFAULT; buf[len] = 0; if (strcmp(buf, pkt_dev->src_max) != 0) { memset(pkt_dev->src_max, 0, sizeof(pkt_dev->src_max)); strncpy(pkt_dev->src_max, buf, len); pkt_dev->saddr_max = in_aton(pkt_dev->src_max); pkt_dev->cur_saddr = pkt_dev->saddr_max; } if (debug) printk(KERN_DEBUG "pktgen: src_max set to: %s\n", pkt_dev->src_max); i += len; sprintf(pg_result, "OK: src_max=%s", pkt_dev->src_max); return count; } if (!strcmp(name, "dst_mac")) { char *v = valstr; unsigned char old_dmac[ETH_ALEN]; unsigned char *m = pkt_dev->dst_mac; memcpy(old_dmac, pkt_dev->dst_mac, ETH_ALEN); len = strn_len(&user_buffer[i], sizeof(valstr) - 1); if (len < 0) { return len; } memset(valstr, 0, sizeof(valstr)); if (copy_from_user(valstr, &user_buffer[i], len)) return -EFAULT; i += len; for (*m = 0; *v && m < pkt_dev->dst_mac + 6; v++) { if (*v >= '0' && *v <= '9') { *m *= 16; *m += *v - '0'; } if (*v >= 'A' && *v <= 'F') { *m *= 16; *m += *v - 'A' + 10; } if (*v >= 'a' && *v <= 'f') { *m *= 16; *m += *v - 'a' + 10; } if (*v == ':') { m++; *m = 0; } } /* Set up Dest MAC */ if (compare_ether_addr(old_dmac, pkt_dev->dst_mac)) memcpy(&(pkt_dev->hh[0]), pkt_dev->dst_mac, ETH_ALEN); sprintf(pg_result, "OK: dstmac"); return count; } if (!strcmp(name, "src_mac")) { char *v = valstr; unsigned char old_smac[ETH_ALEN]; unsigned char *m = pkt_dev->src_mac; memcpy(old_smac, pkt_dev->src_mac, ETH_ALEN); len = strn_len(&user_buffer[i], sizeof(valstr) - 1); if (len < 0) { return len; } memset(valstr, 0, sizeof(valstr)); if (copy_from_user(valstr, &user_buffer[i], len)) return -EFAULT; i += len; for (*m = 0; *v && m < pkt_dev->src_mac + 6; v++) { if (*v >= '0' && *v <= '9') { *m *= 16; *m += *v - '0'; } if (*v >= 'A' && *v <= 'F') { *m *= 16; *m += *v - 'A' + 10; } if (*v >= 'a' && *v <= 'f') { *m *= 16; *m += *v - 'a' + 10; } if (*v == ':') { m++; *m = 0; } } /* Set up Src MAC */ if (compare_ether_addr(old_smac, pkt_dev->src_mac)) memcpy(&(pkt_dev->hh[6]), pkt_dev->src_mac, ETH_ALEN); sprintf(pg_result, "OK: srcmac"); return count; } if (!strcmp(name, "clear_counters")) { pktgen_clear_counters(pkt_dev); sprintf(pg_result, "OK: Clearing counters.\n"); return count; } if (!strcmp(name, "flows")) { len = num_arg(&user_buffer[i], 10, &value); if (len < 0) { return len; } i += len; if (value > MAX_CFLOWS) value = MAX_CFLOWS; pkt_dev->cflows = value; sprintf(pg_result, "OK: flows=%u", pkt_dev->cflows); return count; } if (!strcmp(name, "flowlen")) { len = num_arg(&user_buffer[i], 10, &value); if (len < 0) { return len; } i += len; pkt_dev->lflow = value; sprintf(pg_result, "OK: flowlen=%u", pkt_dev->lflow); return count; } if (!strcmp(name, "queue_map_min")) { len = num_arg(&user_buffer[i], 5, &value); if (len < 0) { return len; } i += len; pkt_dev->queue_map_min = value; sprintf(pg_result, "OK: queue_map_min=%u", pkt_dev->queue_map_min); return count; } if (!strcmp(name, "queue_map_max")) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -