GATE(8) Linux GATE(8)

tc-gate - کُنش دروازه جریان داده در کنترل ترافیک

tc ... action gate [ base-time BASETIME ] [ clockid CLOCKID ] sched-entry <gate state> <interval 1> [ <internal priority> <max octets> ] sched-entry <gate state> <interval 2> [ <internal priority> <max octets> ] sched-entry <gate state> <interval 3> [ <internal priority> <max octets> ] ...... sched-entry <gate state> <interval N> [ <internal priority> <max octets> ]

کُنش GATE به فریم‌های ورودی (ingress) مشخص‌شده اجازه می‌دهد در یک بازه زمانی خاص عبور کنند یا در بازه زمانی خاص دیگری دور ریخته (drop) شوند. فیلتر tc فریم‌های ورودی را پالایش می‌کند، سپس کُنش tc gate مشخص می‌سازد که این فریم‌ها در چه بازه زمانی و به چه میزان بایت می‌توانند به دستگاه ارسال شوند و در چه بازه زمانی باید دور ریخته شوند.

کُنش gate همچنین یک زمان مبنا (base-time) را تخصیص می‌دهد تا مشخص کند فهرست ورودی‌ها از چه زمانی شروع می‌شود. سپس کُنش gate فهرست ورودی‌های دروازه را از زمان مبنای شروع، به صورت چرخه‌ای تکرار می‌کند.

برای شبیه‌سازی نرم‌افزاری، کُنش gate کاربر را ملزم می‌سازد تا نوع ساعت مرجع زمانی را تعیین کند.

لحظه زمانی را بر حسب نانوثانیه مشخص می‌کند و زمان شروع زمان‌بندی را تعریف می‌نماید. اگر base-time زمانی در گذشته باشد، زمان‌بندی در لحظه زیر آغاز خواهد شد:
base-time + (N * cycle-time)

که در آن N کوچک‌ترین عدد صحیحی است به گونه‌ای که زمان حاصل، بزرگ‌تر از زمان فعلی (now) باشد، و cycle-time مجموع تمام بازه‌های زمانی مربوط به ورودی‌های موجود در جدول زمان‌بندی است. در صورتی که base-time تعیین نشود، مقدار پیش‌فرض آن 0 خواهد بود.

ساعتی را مشخص می‌کند که تایمر داخلی qdisc برای اندازه‌گیری زمان و زمان‌بندی رویدادها از آن استفاده می‌نماید. این گزینه در صورتی که کُنش gate برای برون‌سپاری فیلتر به سخت‌افزار (offloading filter) به کار رود معتبر نیست؛ برای نمونه، در دستور tc filter همراه با پارامتر skip_sw.
در یک جدول زمان‌بندی واحد ممکن است چندین پارامتر sched-entry وجود داشته باشد. قالب هر کدام به صورت زیر است:
sched-entry <gate state> <interval> [ <internal priority> <max octets> ]

<gate state>: وضعیت دروازه را مشخص می‌کند؛ 'open' دروازه را باز نگه می‌دارد و 'close' دروازه را می‌بندد.
<interval>: مدت‌زمان این بازه زمانی (time slot) را بر حسب نانوثانیه مشخص می‌کند.
<internal priority>: نشان‌دهنده مقدار اولویت داخلی است که بیانگر صف دریافت داخلی برای این جریان می‌باشد. مقدار -1 به معنای حالت عمومی (wildcard) است. مقادیر <internal priority> و <max octets> می‌توانند حذف شوند که در این حالت برای این <sched-entry>، مقدار پیش‌فرض هر دوی آن‌ها برابر با -1 خواهد بود.
<max octets>: حداکثر حجم داده بر حسب بایت (اکتت) را که می‌تواند در این بازه زمانی عبور کند مشخص می‌نماید. در صورت فراتر رفتن از حد مجاز، بسته‌ها دور ریخته می‌شوند. مقدار -1 به معنای حالت عمومی (wildcard) است. پارامتر <max octets> می‌تواند حذف شود که در این حالت مقدار آن به طور پیش‌فرض برای این <sched-entry> برابر با -1 در نظر گرفته می‌شود.
توجه داشته باشید که اگر وضعیت دروازه در یک sched-entry برابر با 'close' باشد، پارامترهای <internal priority> و <max octets> هیچ مفهومی ندارند؛ چرا که با وضعیت 'close'، تمام فریم‌ها دور ریخته می‌شوند.

مثال زیر نشان می‌دهد که فیلتر tc برای فریم‌هایی که نشانی IP مبدا آن‌ها با 192.168.0.20 مطابقت دارد، در این ورودی زمان‌بندی دروازه را به مدت ۲۰۰ میلی‌ثانیه باز نگه می‌دارد و حجم ترافیک را به ۸ مگابایت محدود می‌کند؛ سپس دروازه ترافیک را به مدت ۱۰۰ میلی‌ثانیه می‌بندد. فریم‌هایی که در وضعیت بسته بودن دروازه برسند، دور ریخته می‌شوند. سپس چرخه، ورودی‌های دروازه را به صورت دوره‌ای اجرا می‌کند. جدول زمان‌بندی در لحظه ۲۰۰٫۰ ثانیه با استفاده از ساعت مرجع CLOCK_TAI آغاز می‌شود. این زمان‌بندی از دو ورودی تشکیل شده است که مدت زمان هر یک از آن‌ها ۳۰۰ میلی‌ثانیه است.

# tc qdisc add dev eth0 ingress
# tc filter add dev eth0 parent ffff: protocol ip \
           flower skip_hw src_ip 192.168.0.20 \
           action gate index 2 clockid CLOCK_TAI \
           base-time 200000000000ns \
           sched-entry open 200000000ns -1 8000000b \
           sched-entry close 100000000ns

دستورهای زیر مثالی برای فیلتر کردن جریانی با آدرس MAC مبدا 10:00:80:00:00:00 از فریم‌های ICMP است که در هر زمان با چرخه ۲۰۰ میلی‌ثانیه دور ریخته می‌شوند؛ همراه با زمان مبنای پیش‌فرض 0 و ساعت CLOCK_TAI به عنوان پیش‌فرض.

# tc qdisc add dev eth0 ingress
# tc filter add dev eth0 parent ffff:  protocol ip \
	flower ip_proto icmp dst_mac 10:00:80:00:00:00 \
	action gate index 12 sched-entry close 200000000ns

Po Liu <Po.Liu@nxp.com>

12 Mar 2020 iproute2