סקירה כללית על סטטיסטיקות של ממשקי רשת

ב-Android 4.0, הנתונים הסטטיסטיים שמדווחים על ידי ממשקי הרשת של Linux מתועדים לאורך זמן, ומשמשים לאכיפת מגבלות המכסות ברשת, ליצירת תרשימים שגלויים למשתמשים ועוד.

כל מנהל של מכשיר רשת (כולל Wi-Fi) חייב לפעול בהתאם למחזור החיים הרגיל של מכשיר הליבה, ולהחזיר נתונים סטטיסטיים נכונים דרך dev_get_stats(). במיוחד, הנתונים הסטטיסטיים שמוחזרים חייבים להישאר מונוטוניים לחלוטין בזמן שהממשק פעיל. הנהגים יכולים לאפס את הנתונים הסטטיסטיים רק אחרי שהם משלימים unregister_netdev() או את הפעולה המקבילה שיוצרת אירוע NETDEV_UNREGISTER לקריאות חוזרות (callbacks) שמוגדרות ב-register_netdevice_notifier(), ב-register_inetaddr_notifier() או ב-register_inet6addr_notifier().

בדרך כלל, מפעילי הסלולר מודדים את השימוש בנתונים בשכבת האינטרנט (IP). כדי להתאים את הגישה הזו ל-Android 4.0, אנחנו מסתמכים על העובדה שבמכשירי הליבה שאנחנו מתעניינים בהם, הערכים rx_bytes ו-tx_bytes שמוחזרים על ידי dev_get_stats() הם בדיוק הבייטים שהועברו בשכבת האינטרנט (IP).  אבל אנחנו מבינים שיכול להיות שזה לא המצב במכשירים אחרים. בשלב הזה, התכונה מסתמכת על המאפיין הזה. גם לדרייברים חדשים צריך להיות המאפיין הזה, וערכים של dev_get_stats() לא יכולים לכלול עלויות עיבוד מיותרות של אנוקפסולציה בשכבות רשת נמוכות יותר (כמו כותרות Ethernet), ומומלץ שלא יכללו תעבורת נתונים אחרת (כמו ARP) אלא אם היא זניחה.

מסגרת Android אוספת נתונים סטטיסטיים רק מממשקי רשת שמשויכים ל-NetworkStateTracker ב-ConnectivityService. כך אפשר לזהות באופן ספציפי כל ממשק רשת, כולל הסוג שלו (למשל TYPE_MOBILE או TYPE_WIFI) וזהות המנוי (למשל IMSI).  כל ממשקי הרשת שמשמשים לניתוב נתונים צריכים להיות מיוצגים על ידי NetworkStateTracker כדי שאפשר יהיה לחשב את הנתונים הסטטיסטיים בצורה נכונה.