netlink: merge nm-netlink.c into nm-netlink-monitor.c
[NetworkManager.git] / src / backends / NetworkManagerGeneric.c
1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
2 /* NetworkManager -- Network link manager
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  *
18  * (C) Copyright 2004 - 2010 Red Hat, Inc.
19  * (C) Copyright 2006 Timothee Lecomte <timothee.lecomte@ens.fr>
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <errno.h>
27 #include <stdio.h>
28 #include <sys/types.h>
29 #include <signal.h>
30 #include <arpa/inet.h>
31 #include <string.h>
32
33 #include "NetworkManagerGeneric.h"
34 #include "nm-system.h"
35 #include "NetworkManagerUtils.h"
36 #include "nm-logging.h"
37 #include "nm-netlink-monitor.h"
38
39 /* Because of a bug in libnl, rtnl.h should be included before route.h */
40 #include <netlink/route/rtnl.h>
41
42 #include <netlink/route/addr.h>
43 #include <netlink/netlink.h>
44
45 /*
46  * nm_generic_enable_loopback
47  *
48  * Bring up the loopback interface
49  *
50  */
51 void nm_generic_enable_loopback (void)
52 {
53         struct nl_handle *      nlh = NULL;
54         struct rtnl_addr *      addr = NULL;
55         struct nl_addr *        nl_addr = NULL;
56         guint32                 binaddr = 0;
57         int                     iface_idx = -1;
58         int                     err;
59
60         nm_system_device_set_up_down_with_iface ("lo", TRUE, NULL);
61
62         nlh = nm_netlink_get_default_handle ();
63         if (!nlh)
64                 return;
65
66         iface_idx = nm_netlink_iface_to_index ("lo");
67         if (iface_idx < 0)
68                 return;
69
70         addr = rtnl_addr_alloc ();
71         if (!addr)
72                 return;
73
74         binaddr = htonl (0x7f000001); /* 127.0.0.1 */
75         nl_addr = nl_addr_build (AF_INET, &binaddr, sizeof(binaddr));
76         if (!nl_addr)
77                 goto out;
78         rtnl_addr_set_local (addr, nl_addr);
79         nl_addr_put (nl_addr);
80
81         binaddr = htonl (0x7fffffff); /* 127.255.255.255 */
82         nl_addr = nl_addr_build (AF_INET, &binaddr, sizeof(binaddr));
83         if (!nl_addr)
84                 goto out;
85         rtnl_addr_set_broadcast (addr, nl_addr);
86         nl_addr_put (nl_addr);
87
88         rtnl_addr_set_prefixlen (addr, 8);
89         rtnl_addr_set_ifindex (addr, iface_idx);
90         rtnl_addr_set_scope (addr, RT_SCOPE_HOST);
91         rtnl_addr_set_label (addr, "lo");
92
93         if ((err = rtnl_addr_add (nlh, addr, 0)) < 0) {
94                 if (err != -EEXIST) {
95                         nm_log_warn (LOGD_CORE, "error %d returned from rtnl_addr_add():\n%s", err, nl_geterror());
96                 }
97         }
98 out:
99         if (addr)
100                 rtnl_addr_put (addr);
101 }
102
103 /*
104  * nm_generic_update_dns
105  *
106  * Make glibc/nscd aware of any changes to the resolv.conf file by
107  * restarting nscd.
108  *
109  */
110 void nm_generic_update_dns (void)
111 {
112 }
113