add action

(Logical change 1.66)
diff --git a/tc/f_fw.c b/tc/f_fw.c
index 3c5e3e2..6637126 100644
--- a/tc/f_fw.c
+++ b/tc/f_fw.c
@@ -19,7 +19,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <string.h>
-
+#include <linux/if.h> /* IFNAMSIZ */
 #include "utils.h"
 #include "tc_util.h"
 
@@ -70,6 +70,24 @@
 				return -1;
 			}
 			continue;
+		} else if (matches(*argv, "action") == 0) {
+			NEXT_ARG();
+			if (parse_action(&argc, &argv, TCA_FW_ACT, n)) {
+				fprintf(stderr, "Illegal fw \"action\"\n");
+				return -1;
+			}
+			continue;
+		} else if (strcmp(*argv, "indev") == 0) {
+			char d[IFNAMSIZ+1];
+			memset(d, 0, sizeof (d));
+			argc--;
+			argv++;
+			if (argc < 1) {
+				fprintf(stderr, "Illegal indev\n");
+				return -1;
+			}
+			strncpy(d, *argv, sizeof (d) - 1);
+			addattr_l(n, MAX_MSG, TCA_FW_INDEV, d, strlen(d) + 1);
 		} else if (strcmp(*argv, "help") == 0) {
 			explain();
 			return -1;
@@ -105,6 +123,15 @@
 
 	if (tb[TCA_FW_POLICE])
 		tc_print_police(f, tb[TCA_FW_POLICE]);
+	if (tb[TCA_FW_INDEV]) {
+		struct rtattr *idev = tb[TCA_FW_INDEV];
+		fprintf(f, "input dev %s ",(char *)RTA_DATA(idev));
+	}
+	
+	if (tb[TCA_FW_ACT]) {
+		fprintf(f, "\n");
+		tc_print_action(f, tb[TCA_FW_ACT]);
+	}
 	return 0;
 }