اگرچه استاندارد POSIX به مرور زمان در حال معرفی توابع استاندارد جانشین (wrapper) به جای ioctl است، اما در حوزهٔ برنامهنویسی شبکه، ioctl همچنان برای پیادهسازی قابلیتهای وابسته به سیستم نقشی کلیدی ایفا میکند.
در این فصل، با نوشتن تابعی که هنگام شروع برنامه اطلاعات تمام اینترفیسهای هاست را استخراج میکند، با کاربردهای ioctl در برنامهنویسی شبکه آشنا خواهیم شد.
فهرست مطالب
تابع ioctl عملیاتهای Socket عملیاتهای File پیکربندی Interface تابع get_ifi_info عملیاتهای Interface عملیاتهای ARP Cache عملیاتهای Routing Table
تابع ioctl
تابع ioctl سه آرگومان دریافت میکند:
- fd: توصیفکننده فایل (file descriptor) باز شده
- request: کد دستوری که نوع عملیات اجرایی را مشخص میکند
- …: آرگومانها و پارامترهای لازم برای اجرای درخواست request
درخواستها (request) و آرگومانهای مرتبط با شبکه در ioctl را میتوان به صورت زیر دستهبندی کرد:
Socket Operations
- SIOCATMARK: اگر اشارهگر خواندن سوکت روی علامت out-of-band قرار داشته باشد، مقداری غیرصفر و در غیر این صورت ۰ را در آرگومان سوم برمیگرداند؛ معادل sockatmark در POSIX (فصل ۲۴)
- SIOCSPGRP: تعیین شناسه فرایند یا گروهی که سیگنالهای SIGIO و SIGURG مربوط به سوکت را دریافت میکنند؛ معادل F_SETOWN در fcntl
- SIOCGPGRP: دریافت شناسه فرایند یا گروه دریافتکننده سیگنالهای SIGIO و SIGURG سوکت؛ معادل F_GETOWN در fcntl
File Operations
از میان عملیاتهای مربوط به فایل، مواردی که روی سوکتها نیز قابل اعمال هستند عبارتند از:
- FIONBIO: فعال یا غیرفعال کردن حالت غیرمسدودکننده (non-blocking) سوکت؛ معادل F_SETFL در fcntl
- FIOASYNC: فعال یا غیرفعال کردن فلگ ناهمگام (asynchronous) سوکت؛ معادل F_SETFL در fcntl
- FIONREAD: برگرداندن تعداد بایتهای موجود در بافر دریافت سوکت از طریق آرگومان سوم
- FIOSETOWN: عملکردی مشابه SIOCSPGRP؛ معادل F_SETOWN در fcntl
- FIOGETOWN: عملکردی مشابه SIOCGPGRP؛ معادل F_GETOWN در fcntl
Interface Configuration
بسیاری از برنامههایی که با اینترفیسهای شبکه سیستم کار میکنند، در اولین گام از درخواست SIOCGIFCONF برای دریافت فهرست کامل اینترفیسهای پیکربندیشده روی سیستم استفاده میکنند.
- فراخوانی درخواست SIOCGIFCONF با استفاده از ساختار ifconf، ساختارهای ifreq را بازمیگرداند.
- سایر درخواستهای بخش ۱۷.۱ از ساختار ifreq بهدستآمده استفاده میکنند.
get_ifi_info Function
در این بخش تابعی به نام get_ifi_info پیادهسازی میکنیم که در این فصل و فصل ۱۸ کاربرد دارد. این تابع فهرستی از تمامی اینترفیسهای فعال (UP) را برمیگرداند و برای این منظور در این فصل از SIOCGIFCONF استفاده میشود.
Interface Operations
درخواست SIOCGIFCONF نام و آدرس سوکت اختصاصیافته به هر اینترفیس را بازمیگرداند.
برای دریافت یا تغییر سایر ویژگیهای اینترفیس، باید از درخواستهای SIOCGxxx یا SIOCSxxx استفاده کرد.
- درخواستهای SIOCGxxx معمولاً توسط ابزار netstat صادر میشوند.
- درخواستهای SIOCSxxx بیشتر از سوی ابزار ifconfig ارسال میشوند و نیازمند دسترسی ریشه (superuser) هستند.
شرح هر یک از این درخواستها:
- SIOCGIFADDR: بازگرداندن آدرس unicast در فیلد ifr_addr
- SIOCSIFADDR: تنظیم آدرس unicast در ifr_addr (پس از تنظیم، فرایند راهاندازی اولیه اینترفیس فراخوانی میشود)
- SIOCGIFFLAGS: دریافت فلگهای وضعیت اینترفیس در ifr_flags
- SIOCSIFFLAGS: تنظیم فلگهای اینترفیس در ifr_flags
- SIOCGIFDSTADDR: دریافت آدرس نقطه به نقطه (P2P) در ifr_dstaddr
- SIOCSIFDSTADDR: تنظیم آدرس نقطه به نقطه (P2P) در ifr_dstaddr
- SIOCGIFBRDADDR: دریافت آدرس برودکست در ifr_broadaddr
- SIOCSIFBRDADDR: تنظیم آدرس برودکست در ifr_broadaddr
- SIOCGIFNETMASK: دریافت ماسک زیرشبکه (subnet mask) در ifr_addr
- SIOCSIFNETMASK: تنظیم ماسک زیرشبکه (subnet mask) در ifr_addr
- SIOCGIFMETRIC: دریافت مقدار متریک اینترفیس در ifr_metric
- SIOCSIFMETRIC: تنظیم مقدار متریک اینترفیس در ifr_metric
متریک اینترفیس در تصمیمگیریهای مسیریابی (routing) مورد استفاده قرار میگیرد.
پروتکلهای مسیریابی بر اساس متریک اینترفیس، بهینهترین مسیر را انتخاب میکنند؛ به عنوان نمونه، پروتکل RIP (Routing Information Protocol) از تعداد گامها (hop count) به عنوان متریک بهره میبرد تا مسیری با کمترین گام را پیدا کند.
ARP Cache Operations
اگرچه در برخی سیستمها مدیریت جدول کش ARP (Address Resolution Protocol) از طریق ioctl انجام میشود، اما روش استاندارد و متداول برای دسترسی به آن، استفاده از سوکتهای مسیریابی است (فصل ۱۸).
- SIOCSARP: افزودن یا ویرایش ورودی در کش ARP
- SIOCDARP: حذف یک مدخل از کش ARP
- SIOCGARP: دریافت و خواندن اطلاعات کش ARP
Routing Tale Operations
برخی از سیستمها دستورات ioctl را برای دستکاری جدول مسیریابی ارائه میدهند، با این حال برای این عملیات نیز عموماً از سوکتهای مسیریابی استفاده میشود (فصل ۱۸).
- SIOCADDRT: افزودن یک ورودی جدید به جدول مسیریابی
- SIOCDELRT: حذف ورودی از جدول مسیریابی
از آنجا که دستوری برای خواندن کامل جدول مسیریابی در ioctl وجود ندارد، ابزارهایی مانند netstat اطلاعات جدول را مستقیماً از حافظه هسته (/dev/kmem) استخراج میکنند.
요약
دستورات ioctl در برنامهنویسی شبکه را میتوان در ۱+۵ دسته کلی خلاصه کرد:
- عملیاتهای سوکت (Socket Operations)
- عملیاتهای فایل (File Operations)
- عملیاتهای اینترفیس (Interface Operations)
- عملیاتهای جدول ARP
- عملیاتهای جدول مسیریابی (Routing Table Operations)
- سیستم STREAMS (فصل ۳۱)