1. 程式人生 > >linux iptables實現

linux iptables實現

  • struct  xt_info_lock  xt_info_locks[CPU](用於保證讀取修改表中規則的鎖,每個CPU一個鎖)

    struct xt_table *xt_find_table_lock(struct net *net, u_int8_t af, const char *name)
    查詢name指定的表,使用xt[af].mutex加鎖,保證只有一個寫者處理該表。並增加表所在模組的引用計數,防止該表被錯誤釋放。

    void xt_table_unlock(struct xt_table *table)
    與xt_find_table_lock()配對使用,釋放xt[table->af].mutex鎖。

    static inline void xt_info_rdlock_bh(void) 或 static inline void xt_info_rdunlock_bh(void)
    獲取或釋放本CPU的xt_info_locks[cpu]鎖。這個鎖主要是用於防止正被使用的規則表(xt_table_info結構)被釋放。(它與get_counters()進行互斥)

    static inline void xt_info_wrlock(unsigned int cpu) 或 static inline void xt_info_wrunlock(unsigned int cpu)
    獲取指定CPU的xt_info_locks[cpu]鎖。它主要在get_counters()中被呼叫,用於獲取所有CPU的寫鎖,保證所有CPU都已完成了對規則表的引用。

    static void get_counters(const struct xt_table_info *t, struct xt_counters counters[])
    它可以保證其它CPU都已完成了一次對錶中所有規則的引用。因為它要對所有其它CPU呼叫xt_info_wrlock(cpu)函式來獲取其它CPU的xt_info_lock,而其它CPU在讀取表中規則時,要通過xt_info_rdlock_bh獲取各自的xt_info_lock鎖,所有當它獲取完所有其它CPU的xt_info_lock鎖後,就表示其它CPU都已完成了對錶中規則的引用。這就說明了為什麼在do_replace中呼叫完get_counters()後能夠安全的釋放舊的xt_table_info結構。