---
src/connman.h | 4 ++
src/ipconfig.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 93 insertions(+), 0 deletions(-)
diff --git a/src/connman.h b/src/connman.h
index e2b0f1c..2d03a8e 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -249,6 +249,10 @@ int __connman_ipconfig_load(struct connman_ipconfig
*ipconfig,
int __connman_ipconfig_save(struct connman_ipconfig *ipconfig,
GKeyFile *keyfile, const char *identifier, const char *prefix);
+int __connman_ipconfig_set_rp_filter(struct connman_ipconfig *ipconfig);
+void __connman_ipconfig_unset_rp_filter(struct connman_ipconfig *ipconfig,
+ int old_value);
+
#include <connman/utsname.h>
int __connman_utsname_set_hostname(const char *hostname);
diff --git a/src/ipconfig.c b/src/ipconfig.c
index fd858a1..f0827f3 100644
--- a/src/ipconfig.c
+++ b/src/ipconfig.c
@@ -452,6 +452,95 @@ static void set_ipv6_privacy(gchar *ifname, int value)
fclose(f);
}
+static int get_rp_filter(const gchar *ifname)
+{
+ gchar *path;
+ FILE *f;
+ int value = -EINVAL, tmp;
+
+ if (ifname == NULL)
+ path = g_strdup("/proc/sys/net/ipv4/conf/all/rp_filter");
+ else
+ path = g_strdup_printf(
+ "/proc/sys/net/ipv4/conf/%s/rp_filter", ifname);
+
+ if (path == NULL)
+ return -ENOMEM;
+
+ f = fopen(path, "r");
+
+ g_free(path);
+
+ if (f != NULL) {
+ if (fscanf(f, "%d", &tmp) == 1)
+ value = tmp;
+ fclose(f);
+ }
+
+ return value;
+}
+
+static void set_rp_filter(const gchar *ifname, int value)
+{
+ gchar *path;
+ FILE *f;
+
+ if (ifname == NULL)
+ path = g_strdup("/proc/sys/net/ipv4/conf/all/rp_filter");
+ else
+ path = g_strdup_printf(
+ "/proc/sys/net/ipv4/conf/%s/rp_filter", ifname);
+
+ if (path == NULL)
+ return;
+
+ f = fopen(path, "r+");
+
+ g_free(path);
+
+ if (f == NULL)
+ return;
+
+ fprintf(f, "%d", value);
+
+ fclose(f);
+}
+
+int __connman_ipconfig_set_rp_filter(struct connman_ipconfig *ipconfig)
+{
+ const char *ifname = NULL;
+ int value;
+
+ if (ipconfig != NULL)
+ ifname = connman_ipconfig_get_ifname(ipconfig);
+
+ value = get_rp_filter(ifname);
+
+ if (value < 0)
+ return value;
+
+ set_rp_filter(ifname, 2);
+
+ connman_info("iface %s rp_filter set to %d",
+ ifname ? ifname : "<all>", 2);
+
+ return value;
+}
+
+void __connman_ipconfig_unset_rp_filter(struct connman_ipconfig *ipconfig,
+ int old_value)
+{
+ const char *ifname = NULL;
+
+ if (ipconfig != NULL)
+ ifname = connman_ipconfig_get_ifname(ipconfig);
+
+ set_rp_filter(ifname, old_value);
+
+ connman_info("iface %s rp_filter restored to %d",
+ ifname ? ifname : "<all>", old_value);
+}
+
static void free_ipdevice(gpointer data)
{
struct connman_ipdevice *ipdevice = data;
--
1.7.1
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman