Disable VLAN filtering - Intel I350 (igb driver)

ประมาณ 1 - 2 เดือน ที่ผ่านมา ได้ติดตั้งระบบ RahuNAS ไปกับเครื่อง IBM x3650 M4 ซึ่งแน่นอนว่า เครื่องรุ่นนี้ ไม่สามารถติดตั้ง Debian GNU/Linux 6.0 (Squeeze) ลงไปตรง ๆ ได้ เนื่องจาก Hardware ใหม่ จึงต้องใช้ทางอ้อมคือ ติดตั้ง Debian GNU/Linux testing (jessie) เข้าไป และทำการติดตั้ง Linux KVM เพื่อติดตั้ง Squeeze ข้างในอีกชั้นหนึ่ง

ประเด็นมีอยู่ว่า site ที่นำไปใช้งานเป็น สถาบันอาชีวศึกษาแห่งหนึ่งในจังหวัดสุรินทร์ ซึ่งเป็นสถาบันการศึกษาขนาดกลาง มีความจำเป็นต้องใช้ VLAN ในการบริหารจัดการระบบ และแยกระบบเป็นส่วนย่อย ๆ เพื่อง่ายต่อการดูแล ปัญหาที่พบเบื้องต้นคือ พอยัด network interface เข้า bridge ปรากฎว่า linux guest (rahunas) มองไม่เห็น vlan พยายามแก้อยู่หลายวิธี ทั้ง disable tx/rx vlan offload ก็ไม่หาย ตอนนั้นคิดอะไรไม่ออก จึงพยายามทำ PCI Passthrough ซึ่งก็ได้ผล ส่ง NIC เข้าไปให้ guest ใช้งานเลย

แต่เรื่องไม่จบ เนื่องจากระบบเหมือนจะทำงานปกติ แต่ทว่า ระบบทำงานไปสัก 1 - 2 อาทิตย์ kernel ก็แจ้งปัญหาเกี่ยวกับ DMAR (DMA Relocation) ซึ่งเป็น function ที่เปิดใช้งาน เพื่อให้ทำ PCI Passthrough ได้ (intel_iommu) พยายามแก้ปัญหาอยู่ 2 - 3 รอบ จึงตัดสินใจว่า ถ้าไปทางนี้ต่อไม่ดีแน่

ดังนั้นจึงถอยกลับมาดูว่า เหตุผลที่ทำให้ vlan ไม่ไปโผล่ที่ linux guest เกิดเนื่องจากสาเหตุอะไร จนมาถึงบางอ้อว่า hardware และ driver มีส่วนที่รองรับการทำงานที่ชื่อว่า HW VLAN filtering ซึ่ง driver igb มีการ enable มาโดยปริยาย และค้นต่อไปจนเจอ
https://github.com/intel-ethernet/Open-AVB/commit/6ce0e44954ededc948428b...
ซึ่งเป็น patch สำหรับปิด function นี้ ถึงจะเป็นวิธีที่ไม่ค่อยจะสวยเท่าไร แต่ก็น่าลอง

จัดแจง แก้ igb driver source code แล้วทำการ build เฉพาะ module ด้วยประสบการณ์ที่เคย build ipset (รอดตัวไป ถ้าต้อง build ใหม่ทั้ง kernel ตายคัก ๆ) เสร็จก็จัดการ copy module เข้าไปแทนที่ของเดิม แล้วก็ reboot เครื่อง ด้วยเหตุผลที่ว่า ทุกกระบวนการ remote เข้าไปทำ หุหุ ไม่กลับมานี่งานงอก แต่ผลออกมาคือ ใช้งานได้ (รอดตัวไป)

รอดูอีกอย่างน้อย 2 - 3 อาทิตย์ ถ้าทางสถาบันยังต้องการใช้งานอยู่นะครับ เรื่องการเมืองภายในผมไม่ยุ่ง หน้าที่ของวิศวกรคือแก้ปัญหาระบบ ผมทำหน้าที่ผมอย่างดีที่สุด ด้วยความรู้ความสามารถที่ผมมี

Happy Hacking!