xdp-trafficgen(8) تولیدکننده ترافیک مبتنی بر XDP xdp-trafficgen(8)

XDP-trafficgen - تولیدکننده ترافیک شبکه مبتنی بر XDP

ابزار XDP-trafficgen یک تولیدکننده بسته است که از زیرسیستم هسته XDP برای تولید بسته‌ها و ارسال آن‌ها از طریق یک رابط شبکه استفاده می‌کند. بسته‌ها به صورت پویا در هسته تولید و ارسال می‌شوند که عملکرد بسیار بالایی (میلیون‌ها بسته در ثانیه به ازای هر هسته پردازنده) فراهم می‌سازد.

ابزار XDP-trafficgen از تولید ترافیک UDP با درگاه‌های مقصد ثابت یا پویا پشتیبانی کرده و همچنین پشتیبانی اولیه‌ای از تولید ترافیک ساختگی TCP روی یک جریان منفرد دارد.

نحو اجرای xdp-trafficgen به صورت زیر است:

Usage: xdp-trafficgen COMMAND [options]
COMMAND can be one of:
       udp         - run in UDP mode
       xsk-udp     - run in UDP mode (using AF_XDP sockets)
       tcp         - run in TCP mode
       probe       - probe kernel support

هر دستور و گزینه‌های آن در ادامه شرح داده شده‌اند. همچنین می‌توانید از xdp-trafficgen COMMAND --help برای مشاهده گزینه‌های هر دستور استفاده کنید.

دستور UDP ترافیک UDP را به سمت یک نشانی IP مقصد مشخص با درگاه مقصد ثابت یا محدوده‌ای از شماره‌های درگاه تولید می‌کند. فقط ترافیک IPv6 پشتیبانی می‌شود و بسته‌های تولیدشده حد جهش (hop limit) معادل ۱ خواهند داشت تا امکان مسیریابی آن‌ها وجود نداشته باشد.

نحو دستور udp عبارت است از:

xdp-trafficgen udp [options] <ifname>

که در آن <ifname> نام رابط مقصد است که بسته‌ها از طریق آن ارسال خواهند شد. توجه داشته باشید که درایور شبکه این رابط باید از هدایت‌های XDP پشتیبانی کند (باید عملیات درایور ndo_xdp_xmit را پیاده‌سازی کرده باشد).

گزینه‌های پشتیبانی‌شده عبارتند از:

تنظیم آدرس MAC مقصد برای بسته‌های تولیدی. پیش‌فرض تولید بسته‌هایی با آدرس MAC تمام صفر است.

تنظیم آدرس MAC مبدا برای بسته‌های تولیدی. پیش‌فرض استفاده از آدرس MAC همان رابط شبکه ارسال‌کننده بسته‌هاست.

نشانی IP مقصد بسته‌های تولیدی. مقدار پیش‌فرض نشانی پیوند-محلی (link-local) fe80::2 است.

نشانی IP مبدا بسته‌های تولیدی. مقدار پیش‌فرض نشانی پیوند-محلی fe80::1 است.

درگاه UDP مقصد برای بسته‌های تولیدی، یا اولین درگاه محدوده در صورت فعال بودن --dyn-ports. مقدار پیش‌فرض 1 است.

درگاه UDP مبدا برای بسته‌های تولیدی. مقدار پیش‌فرض 1 است.

فعال‌سازی حالت درگاه پویا که در آن درگاه مقصد در بازه‌ای به تعداد <num ports> از مبدا --dst-port تغییر می‌کند.

تعداد بسته‌ها برای ارسال قبل از خروج. در صورت عدم تعیین، xdp-trafficgen تا زمان دریافت وقفه به ارسال بسته‌ها ادامه می‌دهد.

اندازه هر بسته UDP ارسالی بر حسب بایت، شامل سرآیند اترنت و چکسام. از آنجا که xdp-trafficgen ترافیک IPv6 تولید می‌کند، حداقل اندازه که مقدار پیش‌فرض نیز هست ۶۶ بایت است.

در نسخه‌های قدیمی‌تر xdp-trafficgen چهار بایت چکسام اترنت که در انتهای بسته اضافه می‌شد به حساب نمی‌آمد، یعنی اندازه ۶۴ مجاز (و پیش‌فرض) بود در حالی که در عمل بسته‌های ۶۸ بایتی ارسال می‌شد. برای رفع این اشکال بدون شکستن تنظیمات کاربران قبلی، مقادیر ۶۴ یا ۶۵ با یک هشدار به مقدار حداقل ۶۶ تغییر می‌یابند به جای اینکه خطایی صادر شود.

تعداد نخ‌های پردازشی همزمان برای ارسال بسته‌ها. در صورت امکان، هر نخ به یک هسته پردازنده مجزا متصل می‌شود. پیش‌فرض 1 است.

نمایش آمار ارسال بسته‌ها در فواصل زمانی مشخص (بر حسب ثانیه).

فعال کردن ثبت لاگ پرجزئیات (-vv: با جزئیات بیشتر).

نمایش اطلاعات نسخه و خروج.

نمایش چکیده‌ای از گزینه‌های در دسترس.

دستور xsk-udp نیز ترافیک UDP تولید می‌کند، اما این کار را با استفاده از سوکت AF_XDP و تولید ترافیک در فضای کاربری (userspace) انجام می‌دهد. از این دستور می‌توان برای آزمایش و ارزیابی عملکرد سوکت‌های AF_XDP در ارسال داده استفاده کرد.

کد این دستور از ابزار xdpsock که قبلاً بخشی از سورس هسته لینوکس و سپس مخزن bpf-examples بوده اقتباس شده است. این دستور معادل گزینه --txonly در ابزار xdpsock است.

نحو این دستور عبارت است از:

xdp-trafficgen xsk-udp [options] <ifname>

گزینه‌های پشتیبانی‌شده عبارتند از:

تنظیم آدرس MAC مقصد برای بسته‌های تولیدی. پیش‌فرض تولید بسته‌هایی با آدرس MAC تمام صفر است.

تنظیم آدرس MAC مبدا برای بسته‌های تولیدی. پیش‌فرض استفاده از آدرس MAC همان رابط ارسال‌کننده است.

افزودن برچسب زمانی (timestamp) به هر بسته با قالبی مشابه ابزار pktgen در هسته.

افزودن برچسب vlan به بسته‌ها با استفاده از ID و PRI تعیین‌شده با گزینه‌های --vlan-id و --vlan-pri.

تنظیم شناسه vlan برای بسته‌ها. فقط در صورت تنظیم گزینه --vlan-tag اثر دارد. پیش‌فرض: 1.

تنظیم اولویت (PRI) vlan برای بسته‌ها. فقط در صورت تنظیم گزینه --vlan-tag اثر دارد. پیش‌فرض: 0.

استفاده از این الگو برای پر کردن داده‌های بسته. الگوی داده به عنوان یک مقدار هگزادسیمال ۳۲ بیتی مشخص می‌شود و پیش‌فرض آن 0 است.

تعیین فاصله زمانی بین فوران‌های بسته (packet bursts) بر حسب میکروثانیه. در هر بازه زمانی، یک دسته بسته به اندازه --batch-size ارسال می‌شود. پیش‌فرض 0 است (ارسال بسته‌ها با حداکثر سرعت ممکن).

انتخاب صف سخت‌افزاری دریافت برای آزمون. سوکت AF_XDP به این صف متصل می‌شود، بدین معنی که xdp-trafficgen تمام بسته‌های ورودی به آن را پردازش خواهد کرد. پیش‌فرض صف 0 است.

تنظیم بازه زمانی پایش برای جمع‌آوری تمامی آمارها و نمایش آن‌ها در خروجی. پیش‌فرض ۲ ثانیه است.

تعیین حداکثر دفعات تلاش مجدد در تکمیل ارسال آخرین بسته‌های آزمون. هنگام پایان آزمایش، برنامه سعی در آزادسازی آخرین توصیف‌کننده‌های حلقه بسته با فواصل ۱ ثانیه‌ای می‌کند. این فقط زمانی کاربرد دارد که --pkt-count تنظیم شده باشد.

تنظیم اندازه فریم‌های حافظه مورد استفاده برای ارسال بسته‌ها. بسته‌ها فارغ از اندازه واقعی روی شبکه، همواره از یک تکه حافظه با این اندازه استفاده می‌کنند. اندازه باید توانی از دو باشد مگر اینکه از فلگ --unaligned استفاده شود. پیش‌فرض ۴۰۹۶ بایت (معادل اندازه صفحه در اکثر سیستم‌ها) است.

تعیین اندازه بسته‌های ارسالی. مقدار باید بین ۶۴ تا ۹۷۲۸ بایت باشد و پیش‌فرض آن ۶۴ است.

تعیین مدت زمان آزمون بر حسب ثانیه. پیش‌فرض 0 است (اجرای بی‌پایان یا تا رسیدن به --pkt-count).

تعیین تعداد کل بسته‌ها برای ارسال پیش از خروج. پیش‌فرض 0 است (اجرای بی‌پایان یا تا رسیدن به سقف زمان --duration).

تعیین اندازه دسته برای حلقه پردازش بسته. این تعداد بسته‌ای است که در هر بار اجرای حلقه به یکباره فرستاده می‌شود. پیش‌فرض ۶۴ بسته است. همچنین به --tx-cycle-time مراجعه کنید.

فعال کردن چاپ آمار وقفه‌ها برای وقفه مرتبط با irq-string در /proc/interrupts. رشته برای یافتن شماره IRQ با تطابق زیررشته استفاده می‌شود. فاقد پیش‌فرض است.

استفاده از فراخوانی سیستمی poll() برای دریافت اعلان آمادگی سوکت جهت ارسال بسته‌های جدید به جای تلاش مداوم در یک حلقه.

عدم تنظیم پرچم XDP_USE_NEED_WAKEUP هنگام اتصال سوکت AF_XDP. این پرچم به طور پیش‌فرض تنظیم است و باعث می‌شود درایور هسته گاهی به خواب رفته و پردازنده را برای پردازش بسته‌ها به برنامه فضای کاربر بسپارد.

پشتیبانی از ارسال بسته‌های ناتراز (unaligned)، یعنی بسته‌هایی که با ابتدای فریم داده تراز نیستند. با این تنظیم، حافظه با صفحات بزرگ (huge pages) برای بافر حافظه فضای کاربر فعال می‌شود و استفاده از اندازه‌های فریم غیر توانی از دو امکان‌پذیر می‌گردد.

فعال کردن حافظه فضای کاربری اشتراکی بین چند سوکت AF_XDP. در این حالت، ۴ سوکت با حافظه بافر یکسان ایجاد شده و بسته‌ها به روش نوبت‌گردشی (round-robin) روی هر یک ارسال می‌شوند.

چاپ آمارهای تکمیلی بسته در هر بازه زمانی خروجی.

عدم چاپ هرگونه آمار در بازه‌های زمانی خروجی.

چاپ آمارهای بیشتر در سطح برنامه در هر بازه خروجی.

انتخاب حالت رونوشت برای بسته‌ها: یکی از مقادیر auto، copy یا zero-copy. پیش‌فرض auto است که انتخاب را به هسته واگذار می‌کند. استفاده از zero-copy نیازمند پشتیبانی هسته و درایور بوده و فقط در حالت native برنامه XDP قابل استفاده است.

انتخاب ساعت مورد استفاده برای رویدادهای زمان‌سنج در برنامه. مقادیر معتبر MONOTONIC، REALTIME، TAI و BOOTTIME هستند و پیش‌فرض MONOTONIC است.

تنظیم سیاست زمان‌بندی (scheduler policy) پیش از اجرا. مقادیر معتبر SCHED_OTHER و SCHED_FIFO هستند و پیش‌فرض SCHED_OTHER است.

تنظیم اولویت زمان‌بندی هنگام استفاده از SCHED_FIFO. پیش‌فرض 0 است.

تنظیم حالت پیوست برنامه XDP (به صورت native یا skb) به رابط شبکه. پیش‌فرض native است. حالت zero-copy فقط در حالت native کار می‌کند.

فعال کردن ثبت لاگ پرجزئیات. دو بار درج آن لاگ کتابخانه‌های زیرین libxdp و libbpf را نیز فعال می‌کند.

نمایش نسخه برنامه و خروج.

نمایش چکیده‌ای از گزینه‌های موجود.

دستور TCP ترافیک ساختگی TCP را در یک جریان منفرد ایجاد می‌کند. این کار مبتنی بر نصب اولیه یک برنامه ورودی XDP بر روی رابط ارسال‌کننده است. سپس یک اتصال سوکت عادی TCP از فضای کاربری برقرار شده و پس از اتمام دست‌تکانی (handshake)، برنامه XDP ارسال ترافیک روی آن جریان را به دست می‌گیرد. برنامه XDP ورودی بسته‌های ACK دریافتی را بررسی کرده و پنجره دریافت را ردیابی می‌کند.

تولیدکننده ترافیک کنترل ازدحام ندارد و ردیابی ارسال مجدد آن بسیار ابتدایی است: هرگونه دریافت ACK تکراری از گیرنده باعث ریست شدن شماره ترتیب ارسال به آخرین مقدار تاییدشده و شروع دوباره از آن نقطه می‌شود. همین اتفاق در صورت عدم پیشرفت پنجره ظرف ۲ ثانیه رخ می‌دهد. بنابراین ترافیک زیادی تولید می‌شود اما در صورت اتلاف بسته، حجم بالایی از آن بازارسالی خواهد بود.

نحو اجرای دستور tcp به صورت زیر است:

xdp-trafficgen tcp [options] -i <ifname> <hostname>

که در آن <ifname> نام رابط مقصد و <hostname> نام میزبان یا نشانی همتا برای اتصال است (تنها IPv6 پشتیبانی می‌شود). توجه داشته باشید درایور این کارت باید از عملیات ndo_xdp_xmit پشتیبانی کند.

گزینه‌های پشتیبانی‌شده عبارتند از:

اتصال به درگاه مقصد <port>. پیش‌فرض 10000 است.

بارگذاری برنامه ورودی XDP در حالت <mode>؛ پیش‌فرض native است (مقادیر معتبر: native, skb, hw).

تعداد بسته‌ها برای ارسال پیش از خروج. در صورت عدم تعیین، ارسال تا دریافت وقفه ادامه می‌یابد.

نمایش آمار ارسال با این بازه زمانی (بر حسب ثانیه).

فعال کردن ثبت لاگ پرجزئیات (-vv: با جزئیات بیشتر).

نمایش اطلاعات نسخه و خروج.

نمایش خلاصه‌ای از گزینه‌های در دسترس.

دستور PROBE قابلیت‌های هسته را بررسی می‌کند تا مشخص شود ویژگی‌های لازم برای اجرای xdp-trafficgen فراهم هستند یا خیر. از این دستور می‌توان جهت آگاهی از سازگاری هسته جاری یا پشتیبانی یک رابط شبکه خاص از ارسال بسته‌های xdp-trafficgen استفاده کرد.

نحو اجرای دستور probe:

xdp-trafficgen probe [options]

پس از بررسی، برنامه نتایج آزمون هسته و (در صورت ارائه نام رابط) پشتیبانی رابط شبکه را چاپ می‌کند. کد خروج در صورت موفقیت همه بررسی‌ها 0 و در غیر این صورت 1 خواهد بود.

توجه داشته باشید که این سنجش به سازوکار گزارش قابلیت‌های XDP در هسته وابسته است که پس از خود پشتیبانی XDP به هسته اضافه شد؛ لذا در برخی نسخه‌های قدیمی هسته ممکن است سنجش ناموفق باشد هرچند ابزار عملاً قادر به ارسال بسته‌ها باشد.

گزینه‌های پشتیبانی‌شده:

بررسی رابط شبکه تعیین‌شده علاوه بر بررسی عمومی هسته.

فعال کردن ثبت لاگ پرجزئیات (-vv: با جزئیات بیشتر).

نمایش اطلاعات نسخه و خروج.

نمایش خلاصه‌ای از گزینه‌های موجود.

لطفاً هرگونه اشکال را در گیت‌هاب گزارش کنید: https://github.com/xdp-project/xdp-tools/issues

برنامه xdp-trafficgen و این صفحه راهنما توسط Toke Høiland-Jørgensen نوشته شده‌اند.

February 19, 2026 V1.6.3