iptables: Update entries offsets
[framework/connectivity/connman.git] / src / iptables.c
index 04f3970..936accc 100644 (file)
@@ -88,7 +88,7 @@ struct ipt_error_target {
 };
 
 struct connman_iptables_entry {
-       int jump_offset;
+       int offset;
 
        struct ipt_entry *entry;
 };
@@ -226,6 +226,29 @@ static GList *find_chain_tail(struct connman_iptables *table,
        return g_list_last(table->entries);
 }
 
+
+static void update_offsets(struct connman_iptables *table)
+{
+       GList *list, *prev;
+       struct connman_iptables_entry *entry, *prev_entry;
+
+       for (list = table->entries; list; list = list->next) {
+               entry = list->data;
+
+               if (list == table->entries) {
+                       entry->offset = 0;
+
+                       continue;
+               }
+
+               prev = list->prev;
+               prev_entry = prev->data;
+
+               entry->offset = prev_entry->offset +
+                                       prev_entry->entry->next_offset;
+       }
+}
+
 static int iptables_add_entry(struct connman_iptables *table,
                                struct ipt_entry *entry, GList *before)
 {
@@ -244,6 +267,8 @@ static int iptables_add_entry(struct connman_iptables *table,
        table->num_entries++;
        table->size += entry->next_offset;
 
+       update_offsets(table);
+
        return 0;
 }