[alfred] master: alfred: Avoid buffer overflow while querying ARP cache (26ef92b)
by postmaster@open-mesh.org
Repository : ssh://git@open-mesh.org/alfred
On branch : master
>---------------------------------------------------------------
commit 26ef92b456a420869eeffe5ab5c0de77354dd245
Author: Sven Eckelmann <sven(a)narfation.org>
Date: Fri Jan 27 15:10:44 2017 +0100
alfred: Avoid buffer overflow while querying ARP cache
The arpreq.arp_dev is a limited buffer (16 bytes). Avoid that more bytes
from the interface name are copied into this buffer by switching from
strcpy to strncpy.
Fixes: c7da798113a2 ("alfred: IPv4 multicast distribution support.")
Signed-off-by: Sven Eckelmann <sven(a)narfation.org>
Signed-off-by: Simon Wunderlich <sw(a)simonwunderlich.de>
>---------------------------------------------------------------
26ef92b456a420869eeffe5ab5c0de77354dd245
util.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/util.c b/util.c
index 84ab3af..ed83895 100644
--- a/util.c
+++ b/util.c
@@ -92,7 +92,9 @@ int ipv4_arp_request(struct interface *interface, const alfred_addr *addr,
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = addr->ipv4.s_addr;
- strcpy(arpreq.arp_dev, interface->interface);
+ strncpy(arpreq.arp_dev, interface->interface, sizeof(arpreq.arp_dev));
+ arpreq.arp_dev[sizeof(arpreq.arp_dev) - 1] = '\0';
+
if (ioctl(interface->netsock, SIOCGARP, &arpreq) < 0)
return -1;
6 years
[linux-merge]linux integration; annotated tag, v4.10-rc6, created. v4.10-rc6
by postmaster@open-mesh.org
The annotated tag, v4.10-rc6 has been created
at a4ee79b7932655354695e1c449a95cccbe3d0679 (tag)
tagging 566cf877a1fcb6d6dc0126b076aad062054c2637 (commit)
replaces v4.10-rc5
tagged by Linus Torvalds
on Sun Jan 29 14:25:24 2017 -0800
- Shortlog ------------------------------------------------------------
Linux 4.10-rc6
-----BEGIN PGP SIGNATURE-----
iQEcBAABAgAGBQJYjmvUAAoJEHm+PkMAQRiGHIoH/3VaTj7cCJZDnWZ2Wi2enWip
f17zj0oAkFxuSx8XEVD5BKqMfGBCBjPNPwURysfcFVoSHNtHjbEr44VxiPfQj5s2
N+znVm5P9qlFuRA+7dgYUyEKOqcTgyT9jFNpvPF6bgMZDfJoB/wo53UU4lo3drcx
cRe6OT4fEpAbtgbl73kIjOreBRr7oxlMPVEjCVRdL7ssCg+iqow0MEHcSoO7jmtj
tu8hwwBMNh5B0yJRCJKV7Edc1+GHK57ju6rnGr5S2rwnR31omLpvnHJx0Ya6NVCZ
yV3KGQeWm13ifbumMddEnAL61x2hOIzX//BqaZKdy258YPohkNtD8oacnjHnLMc=
=5Rs+
-----END PGP SIGNATURE-----
Sven Eckelmann (1):
batman-adv: Decrease hardif refcnt on fragmentation send error
-----------------------------------------------------------------------
--
linux integration
6 years
[linux-merge]linux integration; annotated tag, batadv-next-for-davem-20170128, created. batadv-next-for-davem-20170128
by postmaster@open-mesh.org
The annotated tag, batadv-next-for-davem-20170128 has been created
at 03316598356d25da8df0ccbc60b2690a0148b423 (tag)
tagging 3e7514afc7d728dd47c5fe9d7a1f5216fe659cda (commit)
replaces batadv-next-for-davem-20170126
tagged by Simon Wunderlich
on Sat Jan 28 11:52:18 2017 +0100
- Shortlog ------------------------------------------------------------
Here are two fixes for batman-adv for net-next:
- fix double call of dev_queue_xmit(), caused by the recent introduction
of net_xmit_eval(), by Sven Eckelmann
- Fix includes for IS_ERR/ERR_PTR, by Sven Eckelmann
-----BEGIN PGP SIGNATURE-----
iQJKBAABCgA0FiEE1ilQI7G+y+fdhnrfoSvjmEKSnqEFAliMd+IWHHN3QHNpbW9u
d3VuZGVybGljaC5kZQAKCRChK+OYQpKeofArD/0RArnwnJLDZbL79oBzuYk3vFWy
/8BhZN+Bw/D6laMpE6yOM3zzDM0H9kvwgVl5ZFx5thmDgBj/cKbB2+2SjiPrQQk1
I4hDFatzo+jEtGIGDv59UsAzxbBPgFjK0ZX61tfEYIUFo3DnbJj/pcxI7+QQvkOK
vc+pyaPcYGViopyLVoy9XTt3ZhpRLdk7rlGE7vl8tydmJXrOGG+GQRbd1Emn1U63
OH/HW94hufD5dK5LsxNj1HhViEs4DPJ55+K9UeKY8caoAfn7tzXlOEdsh9uqXU1p
Zqnk2Q2n2D7/Yvs+umuj+7I1IXzykSfGAJjMv843mHuAloyyMDeDGzMxXFXnZ4Hq
DM4DgAeVcGYjYwLrPaeoLkVPMF/2e0z0S7Hfdzhp5UKk9j+846eyTsdISUEyb73h
vl+qPFc6eJ+PLTb8wMvdnuDuJWTqHDlJ2Id1GadJ86si2ZtYYrmNZp8Sn+YQg0zc
9tVI1jATxv3XU22jCnpwnrXMdDMQBX1crtY4N0MtOz3NqZdexpQR4p5LsC+PB2zJ
2JjAJExGpe4bGWorcRnHTTP5mVRdezB8vE8lKs4iIf40wdGGV3xJxq3xBBGH9S21
IpLcROfshDQfMhntpd42bw2AEDIkz4Vp/GvO8r2YUkQfKPFmX9duilQvi0VRDKNk
FfO6GqDuy6WIGcljgQ==
=iLbv
-----END PGP SIGNATURE-----
Sven Eckelmann (2):
batman-adv: Fix double call of dev_queue_xmit
batman-adv: Fix includes for IS_ERR/ERR_PTR
-----------------------------------------------------------------------
--
linux integration
6 years
[batman-adv] master: batman-adv: Fix includes for IS_ERR/ERR_PTR (61bbb9a)
by postmaster@open-mesh.org
Repository : ssh://git@open-mesh.org/batman-adv
On branch : master
>---------------------------------------------------------------
commit 61bbb9a97bb94f1499a4e0c235fb7465e3bbfae2
Author: Sven Eckelmann <sven(a)narfation.org>
Date: Sat Jan 28 10:23:30 2017 +0100
batman-adv: Fix includes for IS_ERR/ERR_PTR
IS_ERR/ERR_PTR are not defined in linux/device.h but in linux/err.h. The
files using these macros therefore have to include the correct one.
Reported-by: Linus Luessing <linus.luessing(a)web.de>
Signed-off-by: Sven Eckelmann <sven(a)narfation.org>
>---------------------------------------------------------------
61bbb9a97bb94f1499a4e0c235fb7465e3bbfae2
net/batman-adv/debugfs.c | 2 +-
net/batman-adv/tp_meter.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/batman-adv/debugfs.c b/net/batman-adv/debugfs.c
index 5406148..e32ad47 100644
--- a/net/batman-adv/debugfs.c
+++ b/net/batman-adv/debugfs.c
@@ -19,7 +19,7 @@
#include "main.h"
#include <linux/debugfs.h>
-#include <linux/device.h>
+#include <linux/err.h>
#include <linux/errno.h>
#include <linux/export.h>
#include <linux/fs.h>
diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
index 07f64b6..c94ebde 100644
--- a/net/batman-adv/tp_meter.c
+++ b/net/batman-adv/tp_meter.c
@@ -23,7 +23,7 @@
#include <linux/byteorder/generic.h>
#include <linux/cache.h>
#include <linux/compiler.h>
-#include <linux/device.h>
+#include <linux/err.h>
#include <linux/etherdevice.h>
#include <linux/fs.h>
#include <linux/if_ether.h>
6 years
[batman-adv] master: batman-adv: Fix double call of dev_queue_xmit (1709345)
by postmaster@open-mesh.org
Repository : ssh://git@open-mesh.org/batman-adv
On branch : master
>---------------------------------------------------------------
commit 17093459a996f7d5c98f10c10d6d84766bce5a15
Author: Sven Eckelmann <sven(a)narfation.org>
Date: Sat Jan 28 10:12:39 2017 +0100
batman-adv: Fix double call of dev_queue_xmit
The net_xmit_eval has side effects because it is not making sure that e
isn't evaluated twice.
#define net_xmit_eval(e) ((e) == NET_XMIT_CN ? 0 : (e))
The code requested by David Miller [1]
return net_xmit_eval(dev_queue_xmit(skb));
will get transformed into
return ((dev_queue_xmit(skb)) == NET_XMIT_CN ? 0 : (dev_queue_xmit(skb)))
dev_queue_xmit will therefore be tried again (with an already consumed skb)
whenever the return code is not NET_XMIT_CN.
[1] https://lists.open-mesh.org/pipermail/b.a.t.m.a.n/2017-January/016836.html
Fixes: 17efab9867c5 ("batman-adv: Simplify handling of NET_XMIT_CN")
Signed-off-by: Sven Eckelmann <sven(a)narfation.org>
>---------------------------------------------------------------
17093459a996f7d5c98f10c10d6d84766bce5a15
net/batman-adv/send.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/net/batman-adv/send.c b/net/batman-adv/send.c
index d9b2889..1489ec2 100644
--- a/net/batman-adv/send.c
+++ b/net/batman-adv/send.c
@@ -77,6 +77,7 @@ int batadv_send_skb_packet(struct sk_buff *skb,
{
struct batadv_priv *bat_priv;
struct ethhdr *ethhdr;
+ int ret;
bat_priv = netdev_priv(hard_iface->soft_iface);
@@ -115,7 +116,8 @@ int batadv_send_skb_packet(struct sk_buff *skb,
* congestion and traffic shaping, it drops and returns NET_XMIT_DROP
* (which is > 0). This will not be treated as an error.
*/
- return net_xmit_eval(dev_queue_xmit(skb));
+ ret = dev_queue_xmit(skb);
+ return net_xmit_eval(ret);
send_skb_err:
kfree_skb(skb);
return NET_XMIT_DROP;
6 years
[alfred] master: alfred: fix style for sync-period casts (c73e56c)
by postmaster@open-mesh.org
Repository : ssh://git@open-mesh.org/alfred
On branch : master
>---------------------------------------------------------------
commit c73e56c594e9de4c4586945c929db0f7acac90ac
Author: Jonathan Haws <jhaws(a)sdl.usu.edu>
Date: Thu Jan 26 19:23:09 2017 -0700
alfred: fix style for sync-period casts
Signed-off-by: Jonathan Haws <jhaws(a)sdl.usu.edu>
[sw: add Jonathans sign-off, rewrite subject]
Signed-off-by: Simon Wunderlich <sw(a)simonwunderlich.de>
>---------------------------------------------------------------
c73e56c594e9de4c4586945c929db0f7acac90ac
main.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/main.c b/main.c
index 1cabe15..446eecf 100644
--- a/main.c
+++ b/main.c
@@ -276,8 +276,8 @@ static struct globals *alfred_init(int argc, char *argv[])
return NULL;
case 'p':
sync_period = strtod(optarg, NULL);
- globals->sync_period.tv_sec = (int) sync_period;
- globals->sync_period.tv_nsec = (double) (sync_period - (int) sync_period) * 1e9;
+ globals->sync_period.tv_sec = (int)sync_period;
+ globals->sync_period.tv_nsec = (double)(sync_period - (int)sync_period) * 1e9;
printf(" ** Setting sync interval to: %.9f seconds (%ld.%09ld)\n", sync_period, globals->sync_period.tv_sec, globals->sync_period.tv_nsec);
break;
case '4':
6 years
[batman-adv] ecsv/lm_master, master: batman-adv: Simplify handling of NET_XMIT_CN (17efab9)
by postmaster@open-mesh.org
Repository : ssh://git@open-mesh.org/batman-adv
On branches: ecsv/lm_master,master
>---------------------------------------------------------------
commit 17efab9867c519bd2f95eb30a1c54452a0214423
Author: Sven Eckelmann <sven(a)narfation.org>
Date: Thu Jan 26 08:52:50 2017 +0100
batman-adv: Simplify handling of NET_XMIT_CN
The handling of NET_XMIT_CN can be avoided in functions which (indirectly)
are using batadv_send_skb_packet. Instead batadv_send_skb_packet can take
care that the return code of dev_queue_xmit is never NET_XMIT_CN.
NET_XMIT_CN will therefore always be mapped to a NET_XMIT_SUCCESS.
Cc: Gao Feng <gfree.wind(a)gmail.com>
Reported-by: David Miller <davem(a)davemloft.net>
Signed-off-by: Sven Eckelmann <sven(a)narfation.org>
>---------------------------------------------------------------
17efab9867c519bd2f95eb30a1c54452a0214423
net/batman-adv/distributed-arp-table.c | 3 +--
net/batman-adv/fragmentation.c | 2 +-
net/batman-adv/routing.c | 9 +++++----
net/batman-adv/send.c | 2 +-
net/batman-adv/soft-interface.c | 2 +-
net/batman-adv/tp_meter.c | 2 +-
6 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c
index b13c018..1bfd1db 100644
--- a/net/batman-adv/distributed-arp-table.c
+++ b/net/batman-adv/distributed-arp-table.c
@@ -659,8 +659,7 @@ static bool batadv_dat_send_data(struct batadv_priv *bat_priv,
}
send_status = batadv_send_unicast_skb(tmp_skb, neigh_node);
- if (send_status == NET_XMIT_SUCCESS ||
- send_status == NET_XMIT_CN) {
+ if (send_status == NET_XMIT_SUCCESS) {
/* count the sent packet */
switch (packet_subtype) {
case BATADV_P_DAT_DHT_GET:
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
index eb85153..ead18ca 100644
--- a/net/batman-adv/fragmentation.c
+++ b/net/batman-adv/fragmentation.c
@@ -509,7 +509,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
batadv_add_counter(bat_priv, BATADV_CNT_FRAG_TX_BYTES,
skb_fragment->len + ETH_HLEN);
ret = batadv_send_unicast_skb(skb_fragment, neigh_node);
- if (ret != NET_XMIT_SUCCESS && ret != NET_XMIT_CN) {
+ if (ret != NET_XMIT_SUCCESS) {
ret = NET_XMIT_DROP;
goto put_primary_if;
}
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
index bf5a0b9..7fd740b 100644
--- a/net/batman-adv/routing.c
+++ b/net/batman-adv/routing.c
@@ -262,7 +262,7 @@ static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
icmph->ttl = BATADV_TTL;
res = batadv_send_skb_to_orig(skb, orig_node, NULL);
- if (res == NET_XMIT_SUCCESS || res == NET_XMIT_CN)
+ if (res == NET_XMIT_SUCCESS)
ret = NET_RX_SUCCESS;
/* skb was consumed */
@@ -330,7 +330,7 @@ static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
icmp_packet->ttl = BATADV_TTL;
res = batadv_send_skb_to_orig(skb, orig_node, NULL);
- if (res == NET_RX_SUCCESS || res == NET_XMIT_CN)
+ if (res == NET_RX_SUCCESS)
ret = NET_XMIT_SUCCESS;
/* skb was consumed */
@@ -424,7 +424,7 @@ int batadv_recv_icmp_packet(struct sk_buff *skb,
/* route it */
res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
- if (res == NET_XMIT_SUCCESS || res == NET_XMIT_CN)
+ if (res == NET_XMIT_SUCCESS)
ret = NET_RX_SUCCESS;
/* skb was consumed */
@@ -719,8 +719,9 @@ static int batadv_route_unicast_packet(struct sk_buff *skb,
len = skb->len;
res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
+
/* translate transmit result into receive result */
- if (res == NET_XMIT_SUCCESS || res == NET_XMIT_CN) {
+ if (res == NET_XMIT_SUCCESS) {
ret = NET_RX_SUCCESS;
/* skb was transmitted and consumed */
batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
diff --git a/net/batman-adv/send.c b/net/batman-adv/send.c
index d730826..d9b2889 100644
--- a/net/batman-adv/send.c
+++ b/net/batman-adv/send.c
@@ -115,7 +115,7 @@ int batadv_send_skb_packet(struct sk_buff *skb,
* congestion and traffic shaping, it drops and returns NET_XMIT_DROP
* (which is > 0). This will not be treated as an error.
*/
- return dev_queue_xmit(skb);
+ return net_xmit_eval(dev_queue_xmit(skb));
send_skb_err:
kfree_skb(skb);
return NET_XMIT_DROP;
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
index b506781..5d099b2 100644
--- a/net/batman-adv/soft-interface.c
+++ b/net/batman-adv/soft-interface.c
@@ -387,7 +387,7 @@ send:
ret = batadv_send_skb_via_tt(bat_priv, skb, dst_hint,
vid);
}
- if (ret != NET_XMIT_SUCCESS && ret != NET_XMIT_CN)
+ if (ret != NET_XMIT_SUCCESS)
goto dropped_freed;
}
diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
index 392a60d..07f64b6 100644
--- a/net/batman-adv/tp_meter.c
+++ b/net/batman-adv/tp_meter.c
@@ -615,7 +615,7 @@ static int batadv_tp_send_msg(struct batadv_tp_vars *tp_vars, const u8 *src,
batadv_tp_fill_prerandom(tp_vars, data, data_len);
r = batadv_send_skb_to_orig(skb, orig_node, NULL);
- if (r == NET_XMIT_SUCCESS || r == NET_XMIT_CN)
+ if (r == NET_XMIT_SUCCESS)
return 0;
return BATADV_TP_REASON_CANT_SEND;
6 years
[linux-merge]linux integration; annotated tag, batadv-next-for-davem-20170126, created. batadv-next-for-davem-20170126
by postmaster@open-mesh.org
The annotated tag, batadv-next-for-davem-20170126 has been created
at 3fee21c1591afdd2ae2b85c7587f697544358b3c (tag)
tagging c33705188c493b7de3b8dc2956d67de91b444727 (commit)
replaces v4.10-rc1
tagged by Simon Wunderlich
on Thu Jan 26 17:37:28 2017 +0100
- Shortlog ------------------------------------------------------------
This feature/cleanup patchset includes the following patches:
- bump version strings, by Simon Wunderlich
- ignore self-generated loop detect MAC addresses in translation table,
by Simon Wunderlich
- install uapi batman_adv.h header, by Sven Eckelmann
- bump copyright years, by Sven Eckelmann
- Remove an unused variable in translation table code, by Sven Eckelmann
- Handle NET_XMIT_CN like NET_XMIT_SUCCESS (revised according to Davids
suggestion), and a follow up code clean up, by Gao Feng (2 patches)
-----BEGIN PGP SIGNATURE-----
iQJKBAABCgA0FiEE1ilQI7G+y+fdhnrfoSvjmEKSnqEFAliKJcgWHHN3QHNpbW9u
d3VuZGVybGljaC5kZQAKCRChK+OYQpKeoYzFEACGNOZcW2bFFpuE5CZWZpTW1n24
YAY/3C+THc89oUyn7ZbWpZ05HcG+JZXOWCWHaRTnd4UeA+sbki53Ioo52ZGgo79C
7LsyXMMH3F2NrXVEfCK/MUGZcqBAxMd4dcDPsYz5q5osxydjG3hEJLikqOluop3P
JKK9FTEeP2JeoWz9eEf7Io2te6EwcIjo3TRa9f53uyyhPnk5eS2NeSle5axZqS7c
l+NSZVlrrG7oUB0UdzABt5NWOvjDc+Lqp1dkoJo17PHOgXialIfjZOKUlKtjVx6E
06ow2HZaEYCtdlb0awjyPxtIpwiy0szTzJa/h4XtzeQHgbOKIqJWAEb80X7imHVE
aljP7A1uuGm0bcVQ+pq21PX8yLu4RCDPDE5Khu9atkiQP5+sVEdGiJ8Soaw4PmoD
yhDmXshrPGR8u5txN8gaHWG4MHt19645s8dHqHQ7tf5h+mf2QXQ2v/jJQsCV2UfY
vLd/JOD4ZVYWDCspcDdEwGc8KB9r6P31wXuSVjYfkqTFXocdzDr87V7C69CS0U+b
Lzel8oa/eVa2ppR+OhpELxhL2ahO7p1jZI2ix4NHftx5MAV4WJ3RfR2ev2Sf9Ukc
aGjzjuml3JVo2i+11lqiAtOaBK9wDNv1CaC+D2NmC6wpWzWQryNryw3fm2SoH3Xm
S+UoBDZpik+SIEBv3Q==
=cd1Y
-----END PGP SIGNATURE-----
Gao Feng (2):
batman-adv: Remove one condition check in batadv_route_unicast_packet
batman-adv: Treat NET_XMIT_CN as transmit successfully
Simon Wunderlich (2):
batman-adv: Start new development cycle
batman-adv: don't add loop detect macs to TT
Sven Eckelmann (2):
batman-adv: update copyright years for 2017
batman-adv: Remove unused variable in batadv_tt_local_set_flags
-----------------------------------------------------------------------
--
linux integration
6 years
[alfred] master: alfred: IPv4 multicast distribution support. (c7da798)
by postmaster@open-mesh.org
Repository : ssh://git@open-mesh.org/alfred
On branch : master
>---------------------------------------------------------------
commit c7da798113a2a978cf4d45b4aa572d5a6ce17138
Author: Jonathan Haws <jhaws(a)sdl.usu.edu>
Date: Wed Jan 25 18:47:01 2017 -0700
alfred: IPv4 multicast distribution support.
Enabled via -4 expert option where multicast group address is specified.
This option will disable IPv6 communication and is intended for use in
networks which do not support IPv6 addressing.
When this option is enabled, all IPv6 communication is disabled. Combining
IPv4 and IPv6 alfred nodes is unsupported.
Hardware address handling done by submitting queries to the local ARP
cache rather than forcing an ARP request.
Signed-off-by: Jonathan Haws <jhaws(a)sdl.usu.edu>
Reviewed-by: Sven Eckelmann <sven(a)narfation.org>
Signed-off-by: Simon Wunderlich <sw(a)simonwunderlich.de>
>---------------------------------------------------------------
c7da798113a2a978cf4d45b4aa572d5a6ce17138
README | 4 +-
alfred.h | 23 ++++++---
batadv_query.c | 50 +++++++++++-------
batadv_query.h | 6 ++-
client.c | 2 +-
main.c | 10 +++-
man/alfred.8 | 5 ++
netsock.c | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
recv.c | 63 ++++++++++++++++-------
send.c | 48 +++++++++++-------
server.c | 8 +--
unix_sock.c | 2 +-
util.c | 30 +++++++++++
13 files changed, 328 insertions(+), 81 deletions(-)
diff --git a/README b/README
index bc1c3bc..28f3dc9 100644
--- a/README
+++ b/README
@@ -20,7 +20,9 @@ programs to communicate with alfred (done via unix sockets). alfred then takes
care of distributing the local information to other alfred servers on other
nodes. This is done via IPv6 link-local multicast, and does not require any
configuration. A user can request data from alfred, and will receive the
-information available from all alfred servers in the network.
+information available from all alfred servers in the network. Alternatively,
+alfred can be configured to distribute the local information via IPv4 multicast.
+This is configured by setting the IPv4 multicast group address in the -4 option.
Compilation
-----------
diff --git a/alfred.h b/alfred.h
index 2e8db1e..6bdaac7 100644
--- a/alfred.h
+++ b/alfred.h
@@ -48,6 +48,11 @@ enum data_source {
SOURCE_SYNCED = 2,
};
+typedef union {
+ struct in_addr ipv4;
+ struct in6_addr ipv6;
+} alfred_addr;
+
struct dataset {
struct alfred_data data;
unsigned char *buf;
@@ -80,7 +85,7 @@ struct transaction_head {
struct server {
struct ether_addr hwaddr;
- struct in6_addr address;
+ alfred_addr address;
struct timespec last_seen;
uint8_t tq;
};
@@ -100,11 +105,12 @@ enum clientmode {
struct interface {
struct ether_addr hwaddr;
- struct in6_addr address;
+ alfred_addr address;
uint32_t scope_id;
char *interface;
int netsock;
int netsock_mcast;
+ int netsock_arp;
struct hashtable_t *server_hash;
@@ -122,6 +128,7 @@ struct globals {
int clientmode_arg;
int clientmode_version;
int verbose;
+ int ipv4mode;
int unix_sock;
const char *unix_path;
@@ -142,7 +149,7 @@ struct globals {
#define MAX_PAYLOAD ((1 << 16) - 1 - sizeof(struct udphdr))
-extern const struct in6_addr in6addr_localmcast;
+extern alfred_addr alfred_mcast;
/* server.c */
int alfred_server(struct globals *globals);
@@ -169,13 +176,13 @@ static inline bool transaction_finished(struct transaction_head *head)
/* send.c */
int push_data(struct globals *globals, struct interface *interface,
- struct in6_addr *destination, enum data_source max_source_level,
+ alfred_addr *destination, enum data_source max_source_level,
int type_filter, uint16_t tx_id);
int announce_master(struct globals *globals);
int push_local_data(struct globals *globals);
int sync_data(struct globals *globals);
-ssize_t send_alfred_packet(struct interface *interface,
- const struct in6_addr *dest, void *buf, int length);
+ssize_t send_alfred_packet(struct globals *globals, struct interface *interface,
+ const alfred_addr *dest, void *buf, int length);
/* unix_sock.c */
int unix_sock_read(struct globals *globals);
int unix_sock_open_daemon(struct globals *globals);
@@ -195,10 +202,12 @@ int netsock_prepare_select(struct globals *globals, fd_set *fds, int maxsock);
void netsock_check_error(struct globals *globals, fd_set *errfds);
int netsock_receive_packet(struct globals *globals, fd_set *fds);
int netsock_own_address(const struct globals *globals,
- const struct in6_addr *address);
+ const alfred_addr *address);
/* util.c */
int time_diff(struct timespec *tv1, struct timespec *tv2,
struct timespec *tvdiff);
void time_random_seed(void);
uint16_t get_random_id(void);
bool is_valid_ether_addr(uint8_t *addr);
+int ipv4_arp_request(struct interface *interface, const alfred_addr *addr,
+ struct ether_addr *mac);
diff --git a/batadv_query.c b/batadv_query.c
index ac45b9b..6ec086b 100644
--- a/batadv_query.c
+++ b/batadv_query.c
@@ -80,22 +80,22 @@ out:
return ret;
}
-int mac_to_ipv6(const struct ether_addr *mac, struct in6_addr *addr)
+int mac_to_ipv6(const struct ether_addr *mac, alfred_addr *addr)
{
memset(addr, 0, sizeof(*addr));
- addr->s6_addr[0] = 0xfe;
- addr->s6_addr[1] = 0x80;
+ addr->ipv6.s6_addr[0] = 0xfe;
+ addr->ipv6.s6_addr[1] = 0x80;
- addr->s6_addr[8] = mac->ether_addr_octet[0] ^ 0x02;
- addr->s6_addr[9] = mac->ether_addr_octet[1];
- addr->s6_addr[10] = mac->ether_addr_octet[2];
+ addr->ipv6.s6_addr[8] = mac->ether_addr_octet[0] ^ 0x02;
+ addr->ipv6.s6_addr[9] = mac->ether_addr_octet[1];
+ addr->ipv6.s6_addr[10] = mac->ether_addr_octet[2];
- addr->s6_addr[11] = 0xff;
- addr->s6_addr[12] = 0xfe;
+ addr->ipv6.s6_addr[11] = 0xff;
+ addr->ipv6.s6_addr[12] = 0xfe;
- addr->s6_addr[13] = mac->ether_addr_octet[3];
- addr->s6_addr[14] = mac->ether_addr_octet[4];
- addr->s6_addr[15] = mac->ether_addr_octet[5];
+ addr->ipv6.s6_addr[13] = mac->ether_addr_octet[3];
+ addr->ipv6.s6_addr[14] = mac->ether_addr_octet[4];
+ addr->ipv6.s6_addr[15] = mac->ether_addr_octet[5];
return 0;
}
@@ -118,17 +118,29 @@ int is_ipv6_eui64(const struct in6_addr *addr)
return 1;
}
-int ipv6_to_mac(const struct in6_addr *addr, struct ether_addr *mac)
+int ipv6_to_mac(const alfred_addr *addr, struct ether_addr *mac)
{
- if (!is_ipv6_eui64(addr))
+ if (!is_ipv6_eui64(&addr->ipv6))
return -EINVAL;
- mac->ether_addr_octet[0] = addr->s6_addr[8] ^ 0x02;
- mac->ether_addr_octet[1] = addr->s6_addr[9];
- mac->ether_addr_octet[2] = addr->s6_addr[10];
- mac->ether_addr_octet[3] = addr->s6_addr[13];
- mac->ether_addr_octet[4] = addr->s6_addr[14];
- mac->ether_addr_octet[5] = addr->s6_addr[15];
+ mac->ether_addr_octet[0] = addr->ipv6.s6_addr[8] ^ 0x02;
+ mac->ether_addr_octet[1] = addr->ipv6.s6_addr[9];
+ mac->ether_addr_octet[2] = addr->ipv6.s6_addr[10];
+ mac->ether_addr_octet[3] = addr->ipv6.s6_addr[13];
+ mac->ether_addr_octet[4] = addr->ipv6.s6_addr[14];
+ mac->ether_addr_octet[5] = addr->ipv6.s6_addr[15];
+
+ if (!is_valid_ether_addr(mac->ether_addr_octet))
+ return -EINVAL;
+
+ return 0;
+}
+
+int ipv4_to_mac(struct interface *interface,
+ const alfred_addr *addr, struct ether_addr *mac)
+{
+ if (ipv4_arp_request(interface, addr, mac) < 0)
+ return -EINVAL;
if (!is_valid_ether_addr(mac->ether_addr_octet))
return -EINVAL;
diff --git a/batadv_query.h b/batadv_query.h
index 0df8a35..9aa4f0e 100644
--- a/batadv_query.h
+++ b/batadv_query.h
@@ -28,8 +28,10 @@ struct ether_addr *translate_mac(const char *mesh_iface,
const struct ether_addr *mac);
uint8_t get_tq(const char *mesh_iface, struct ether_addr *mac);
int batadv_interface_check(const char *mesh_iface);
-int mac_to_ipv6(const struct ether_addr *mac, struct in6_addr *addr);
-int ipv6_to_mac(const struct in6_addr *addr, struct ether_addr *mac);
+int mac_to_ipv6(const struct ether_addr *mac, alfred_addr *addr);
+int ipv6_to_mac(const alfred_addr *addr, struct ether_addr *mac);
+int ipv4_to_mac(struct interface *interface,
+ const alfred_addr *addr, struct ether_addr *mac);
int is_ipv6_eui64(const struct in6_addr *addr);
#endif
diff --git a/client.c b/client.c
index 357fdb9..4102046 100644
--- a/client.c
+++ b/client.c
@@ -239,7 +239,7 @@ static int check_interface(const char *iface)
return -1;
}
- sock = socket(PF_INET6, SOCK_DGRAM, 0);
+ sock = socket(PF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("can't open socket");
return -1;
diff --git a/main.c b/main.c
index 0d30ea4..1cabe15 100644
--- a/main.c
+++ b/main.c
@@ -19,6 +19,7 @@
*
*/
+#include <arpa/inet.h>
#include <getopt.h>
#include <signal.h>
#include <stdio.h>
@@ -61,6 +62,7 @@ static void alfred_usage(void)
printf(" other masters\n");
printf(" -p, --sync-period [period] set synchronization period, in seconds\n");
printf(" fractional seconds are supported (i.e. 0.2 = 5 Hz)\n");
+ printf(" -4 [group-address] specify IPv4 multicast address and operate in IPv4 mode");
printf("\n");
printf(" -u, --unix-path [path] path to unix socket used for client-server\n");
printf(" communication (default: \""ALFRED_SOCK_PATH_DEFAULT"\")\n");
@@ -196,6 +198,7 @@ static struct globals *alfred_init(int argc, char *argv[])
globals->mesh_iface = "bat0";
globals->unix_path = ALFRED_SOCK_PATH_DEFAULT;
globals->verbose = 0;
+ globals->ipv4mode = 0;
globals->update_command = NULL;
globals->sync_period.tv_sec = ALFRED_INTERVAL;
globals->sync_period.tv_nsec = 0;
@@ -204,7 +207,7 @@ static struct globals *alfred_init(int argc, char *argv[])
time_random_seed();
- while ((opt = getopt_long(argc, argv, "ms:r:hi:b:vV:M:I:u:dc:p:", long_options,
+ while ((opt = getopt_long(argc, argv, "ms:r:hi:b:vV:M:I:u:dc:p:4:", long_options,
&opt_ind)) != -1) {
switch (opt) {
case 'r':
@@ -277,6 +280,11 @@ static struct globals *alfred_init(int argc, char *argv[])
globals->sync_period.tv_nsec = (double) (sync_period - (int) sync_period) * 1e9;
printf(" ** Setting sync interval to: %.9f seconds (%ld.%09ld)\n", sync_period, globals->sync_period.tv_sec, globals->sync_period.tv_nsec);
break;
+ case '4':
+ globals->ipv4mode = 1;
+ inet_pton(AF_INET, optarg, &alfred_mcast.ipv4);
+ printf(" ** IPv4 Multicast Mode: %x\n", alfred_mcast.ipv4.s_addr);
+ break;
case 'h':
default:
alfred_usage();
diff --git a/man/alfred.8 b/man/alfred.8
index 5936e64..a2c3d4c 100644
--- a/man/alfred.8
+++ b/man/alfred.8
@@ -123,6 +123,11 @@ as arguments.
Specify alfred synchronization period, in seconds. If not specified, the default
ALFRED_INTERVAL setting of 10 seconds will be used. Fractional seconds are
supported.
+.TP
+\fB\-4 \fIgroup-address\fP \fP
+Specify the IPv4 multicast group address and enable IPv4 data-sharing (disabling
+IPv6 communication). This option is required on systems that do not support IPv6
+addressing.
.
.SH EXAMPLES
Start an alfred server listening on bridge br0 (assuming that this bridge
diff --git a/netsock.c b/netsock.c
index 86db8a6..c00ea2e 100644
--- a/netsock.c
+++ b/netsock.c
@@ -43,10 +43,12 @@
#include "list.h"
#include "hash.h"
-const struct in6_addr in6addr_localmcast = {{{ 0xff, 0x02, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01 } } };
+alfred_addr alfred_mcast = {
+ .ipv6 = {{{ 0xff, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01 } } }
+};
static int server_compare(void *d1, void *d2)
{
@@ -262,7 +264,7 @@ static int netsock_open(struct interface *interface)
memset(&sin6_mc, 0, sizeof(sin6_mc));
sin6_mc.sin6_port = htons(ALFRED_PORT);
sin6_mc.sin6_family = AF_INET6;
- memcpy(&sin6_mc.sin6_addr, &in6addr_localmcast,
+ memcpy(&sin6_mc.sin6_addr, &alfred_mcast,
sizeof(sin6_mc.sin6_addr));
sin6_mc.sin6_scope_id = interface->scope_id;
@@ -291,7 +293,7 @@ static int netsock_open(struct interface *interface)
goto err;
}
- memcpy(&mreq.ipv6mr_multiaddr, &in6addr_localmcast,
+ memcpy(&mreq.ipv6mr_multiaddr, &alfred_mcast,
sizeof(mreq.ipv6mr_multiaddr));
mreq.ipv6mr_interface = interface->scope_id;
@@ -335,6 +337,134 @@ err:
return -1;
}
+static int netsock_open4(struct interface *interface)
+{
+ int sock;
+ int sock_mc;
+ struct sockaddr_in sin4, sin_mc;
+ struct ip_mreq mreq;
+ struct ifreq ifr;
+ int ret;
+
+ interface->netsock = -1;
+ interface->netsock_mcast = -1;
+
+ sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ if (sock < 0) {
+ perror("ipv4: can't open socket");
+ return -1;
+ }
+
+ sock_mc = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ if (sock_mc < 0) {
+ close(sock);
+ perror("ipv4: can't open mc socket");
+ return -1;
+ }
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, interface->interface, IFNAMSIZ);
+ ifr.ifr_name[IFNAMSIZ - 1] = '\0';
+ if (ioctl(sock_mc, SIOCGIFHWADDR, &ifr) == -1) {
+ perror("ipv4: can't get MAC address");
+ goto err;
+ }
+ memcpy(&interface->hwaddr, &ifr.ifr_hwaddr.sa_data, 6);
+
+ memset(&sin4, 0, sizeof(sin4));
+ sin4.sin_port = htons(ALFRED_PORT);
+ sin4.sin_family = AF_INET;
+ sin4.sin_addr.s_addr = INADDR_ANY;
+
+ memset(&sin_mc, 0, sizeof(sin_mc));
+ sin_mc.sin_port = htons(ALFRED_PORT);
+ sin_mc.sin_family = AF_INET;
+ memcpy(&sin_mc.sin_addr, &alfred_mcast, sizeof(sin_mc.sin_addr));
+
+ enable_raw_bind_capability(1);
+ if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, interface->interface,
+ strlen(interface->interface) + 1)) {
+ perror("ipv4: can't bind to device");
+ goto err;
+ }
+
+ if (setsockopt(sock_mc, SOL_SOCKET, SO_BINDTODEVICE,
+ interface->interface, strlen(interface->interface) + 1)) {
+ perror("ipv4: can't bind to device");
+ goto err;
+ }
+ enable_raw_bind_capability(0);
+
+ ret = 1;
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &ret, sizeof(ret)) < 0) {
+ perror("ipv4: can't set reuse flag");
+ goto err;
+ }
+ if (setsockopt(sock_mc, SOL_SOCKET, SO_REUSEADDR, &ret, sizeof(ret)) < 0) {
+ perror("ipv4: can't set mc reuse flag");
+ goto err;
+ }
+
+ if (bind(sock, (struct sockaddr *)&sin4, sizeof(sin4)) < 0) {
+ perror("ipv4: can't bind");
+ goto err;
+ }
+
+ if (bind(sock_mc, (struct sockaddr *)&sin_mc, sizeof(sin_mc)) < 0) {
+ perror("ipv4: can't bind mc");
+ goto err;
+ }
+
+ memcpy(&mreq.imr_multiaddr, &alfred_mcast.ipv4, sizeof(mreq.imr_multiaddr));
+
+ if (ioctl(sock_mc, SIOCGIFADDR, &ifr) < 0) {
+ perror("ipv4: can't get IP address");
+ goto err;
+ }
+ mreq.imr_interface = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
+ memcpy(&interface->address.ipv4,
+ &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr,
+ sizeof(struct in_addr));
+
+ if (setsockopt(sock_mc, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) {
+ perror("ipv4: can't add multicast membership");
+ goto err;
+ }
+
+ ret = fcntl(sock, F_GETFL, 0);
+ if (ret < 0) {
+ perror("failed to get file status flags");
+ goto err;
+ }
+
+ ret = fcntl(sock, F_SETFL, ret | O_NONBLOCK);
+ if (ret < 0) {
+ perror("failed to set file status flags");
+ goto err;
+ }
+
+ ret = fcntl(sock_mc, F_GETFL, 0);
+ if (ret < 0) {
+ perror("ipv4: failed to get file status flags");
+ goto err;
+ }
+
+ ret = fcntl(sock_mc, F_SETFL, ret | O_NONBLOCK);
+ if (ret < 0) {
+ perror("ipv4: failed to set file status flags");
+ goto err;
+ }
+
+ interface->netsock = sock;
+ interface->netsock_mcast = sock_mc;
+
+ return 0;
+err:
+ close(sock);
+ close(sock_mc);
+ return -1;
+}
+
int netsock_open_all(struct globals *globals)
{
int num_socks = 0;
@@ -342,7 +472,11 @@ int netsock_open_all(struct globals *globals)
struct interface *interface;
list_for_each_entry(interface, &globals->interfaces, list) {
- ret = netsock_open(interface);
+ if (globals->ipv4mode)
+ ret = netsock_open4(interface);
+ else
+ ret = netsock_open(interface);
+
if (ret >= 0)
num_socks++;
}
@@ -355,8 +489,12 @@ void netsock_reopen(struct globals *globals)
struct interface *interface;
list_for_each_entry(interface, &globals->interfaces, list) {
- if (interface->netsock < 0)
- netsock_open(interface);
+ if (interface->netsock < 0) {
+ if (globals->ipv4mode)
+ netsock_open4(interface);
+ else
+ netsock_open(interface);
+ }
}
}
@@ -430,7 +568,7 @@ int netsock_receive_packet(struct globals *globals, fd_set *fds)
}
int netsock_own_address(const struct globals *globals,
- const struct in6_addr *address)
+ const alfred_addr *address)
{
struct interface *interface;
diff --git a/recv.c b/recv.c
index bb8cc05..3fd964d 100644
--- a/recv.c
+++ b/recv.c
@@ -190,7 +190,8 @@ static int finish_alfred_transaction(struct globals *globals,
}
static int process_alfred_push_data(struct globals *globals,
- struct in6_addr *source,
+ struct interface *interface,
+ alfred_addr *source,
struct alfred_push_data_v0 *push)
{
int len;
@@ -200,7 +201,10 @@ static int process_alfred_push_data(struct globals *globals,
struct transaction_packet *transaction_packet;
int found;
- ret = ipv6_to_mac(source, &mac);
+ if (globals->ipv4mode)
+ ret = ipv4_to_mac(interface, source, &mac);
+ else
+ ret = ipv6_to_mac(source, &mac);
if (ret < 0)
goto err;
@@ -260,7 +264,7 @@ err:
static int
process_alfred_announce_master(struct globals *globals,
struct interface *interface,
- struct in6_addr *source,
+ alfred_addr *source,
struct alfred_announce_master_v0 *announce)
{
struct server *server;
@@ -271,7 +275,10 @@ process_alfred_announce_master(struct globals *globals,
len = ntohs(announce->header.length);
- ret = ipv6_to_mac(source, &mac);
+ if (globals->ipv4mode)
+ ret = ipv4_to_mac(interface, source, &mac);
+ else
+ ret = ipv6_to_mac(source, &mac);
if (ret < 0)
return -1;
@@ -316,7 +323,7 @@ process_alfred_announce_master(struct globals *globals,
static int process_alfred_request(struct globals *globals,
struct interface *interface,
- struct in6_addr *source,
+ alfred_addr *source,
struct alfred_request_v0 *request)
{
int len;
@@ -336,7 +343,8 @@ static int process_alfred_request(struct globals *globals,
}
static int process_alfred_status_txend(struct globals *globals,
- struct in6_addr *source,
+ struct interface *interface,
+ alfred_addr *source,
struct alfred_status_v0 *request)
{
struct transaction_head search, *head;
@@ -351,7 +359,10 @@ static int process_alfred_status_txend(struct globals *globals,
if (len != (sizeof(*request) - sizeof(request->header)))
return -1;
- ret = ipv6_to_mac(source, &mac);
+ if (globals->ipv4mode)
+ ret = ipv4_to_mac(interface, source, &mac);
+ else
+ ret = ipv6_to_mac(source, &mac);
if (ret < 0)
return -1;
@@ -389,15 +400,25 @@ int recv_alfred_packet(struct globals *globals, struct interface *interface,
uint8_t buf[MAX_PAYLOAD];
ssize_t length;
struct alfred_tlv *packet;
- struct sockaddr_in6 source;
+ struct sockaddr_in *source;
+ struct sockaddr_in source4;
+ struct sockaddr_in6 source6;
socklen_t sourcelen;
+ alfred_addr alfred_source;
if (interface->netsock < 0)
return -1;
- sourcelen = sizeof(source);
+ if (globals->ipv4mode) {
+ source = (struct sockaddr_in *)&source4;
+ sourcelen = sizeof(source4);
+ } else {
+ source = (struct sockaddr_in *)&source6;
+ sourcelen = sizeof(source6);
+ }
+
length = recvfrom(recv_sock, buf, sizeof(buf), 0,
- (struct sockaddr *)&source, &sourcelen);
+ (struct sockaddr *)source, &sourcelen);
if (length <= 0) {
perror("read from network socket failed");
return -1;
@@ -405,12 +426,18 @@ int recv_alfred_packet(struct globals *globals, struct interface *interface,
packet = (struct alfred_tlv *)buf;
- /* drop packets not sent over link-local ipv6 */
- if (!is_ipv6_eui64(&source.sin6_addr))
- return -1;
+ if (globals->ipv4mode) {
+ memcpy(&alfred_source, &source4.sin_addr, sizeof(source4.sin_addr));
+ } else {
+ memcpy(&alfred_source, &source6.sin6_addr, sizeof(source6.sin6_addr));
+
+ /* drop packets not sent over link-local ipv6 */
+ if (!is_ipv6_eui64(&alfred_source.ipv6))
+ return -1;
+ }
/* drop packets from ourselves */
- if (netsock_own_address(globals, &source.sin6_addr))
+ if (netsock_own_address(globals, &alfred_source))
return -1;
/* drop truncated packets */
@@ -424,20 +451,20 @@ int recv_alfred_packet(struct globals *globals, struct interface *interface,
switch (packet->type) {
case ALFRED_PUSH_DATA:
- process_alfred_push_data(globals, &source.sin6_addr,
+ process_alfred_push_data(globals, interface, &alfred_source,
(struct alfred_push_data_v0 *)packet);
break;
case ALFRED_ANNOUNCE_MASTER:
process_alfred_announce_master(globals, interface,
- &source.sin6_addr,
+ &alfred_source,
(struct alfred_announce_master_v0 *)packet);
break;
case ALFRED_REQUEST:
- process_alfred_request(globals, interface, &source.sin6_addr,
+ process_alfred_request(globals, interface, &alfred_source,
(struct alfred_request_v0 *)packet);
break;
case ALFRED_STATUS_TXEND:
- process_alfred_status_txend(globals, &source.sin6_addr,
+ process_alfred_status_txend(globals, interface, &alfred_source,
(struct alfred_status_v0 *)packet);
break;
default:
diff --git a/send.c b/send.c
index c7a2af2..b566503 100644
--- a/send.c
+++ b/send.c
@@ -42,7 +42,7 @@ int announce_master(struct globals *globals)
announcement.header.version = ALFRED_VERSION;
announcement.header.length = htons(0);
- send_alfred_packet(interface, &in6addr_localmcast,
+ send_alfred_packet(globals, interface, &alfred_mcast,
&announcement, sizeof(announcement));
}
@@ -50,7 +50,7 @@ int announce_master(struct globals *globals)
}
int push_data(struct globals *globals, struct interface *interface,
- struct in6_addr *destination, enum data_source max_source_level,
+ alfred_addr *destination, enum data_source max_source_level,
int type_filter, uint16_t tx_id)
{
struct hash_it_t *hashit = NULL;
@@ -90,7 +90,7 @@ int push_data(struct globals *globals, struct interface *interface,
tlv_length += sizeof(*push) - sizeof(push->header);
push->header.length = htons(tlv_length);
push->tx.seqno = htons(seqno++);
- send_alfred_packet(interface, destination, push,
+ send_alfred_packet(globals, interface, destination, push,
sizeof(*push) + total_length);
total_length = 0;
}
@@ -114,7 +114,7 @@ int push_data(struct globals *globals, struct interface *interface,
tlv_length += sizeof(*push) - sizeof(push->header);
push->header.length = htons(tlv_length);
push->tx.seqno = htons(seqno++);
- send_alfred_packet(interface, destination, push,
+ send_alfred_packet(globals, interface, destination, push,
sizeof(*push) + total_length);
}
@@ -128,7 +128,7 @@ int push_data(struct globals *globals, struct interface *interface,
status_end.tx.id = tx_id;
status_end.tx.seqno = htons(seqno);
- send_alfred_packet(interface, destination, &status_end,
+ send_alfred_packet(globals, interface, destination, &status_end,
sizeof(status_end));
}
@@ -170,24 +170,38 @@ int push_local_data(struct globals *globals)
return 0;
}
-ssize_t send_alfred_packet(struct interface *interface,
- const struct in6_addr *dest, void *buf, int length)
+ssize_t send_alfred_packet(struct globals *globals, struct interface *interface,
+ const alfred_addr *dest, void *buf, int length)
{
ssize_t ret;
- struct sockaddr_in6 dest_addr;
-
- memset(&dest_addr, 0, sizeof(dest_addr));
- dest_addr.sin6_family = AF_INET6;
- dest_addr.sin6_port = htons(ALFRED_PORT);
- dest_addr.sin6_scope_id = interface->scope_id;
- memcpy(&dest_addr.sin6_addr, dest, sizeof(*dest));
+ struct sockaddr *dest_addr;
+ struct sockaddr_in6 dest_addr6;
+ struct sockaddr_in dest_addr4;
+ socklen_t slen;
+
+ if (globals->ipv4mode) {
+ memset(&dest_addr4, 0, sizeof(dest_addr4));
+ dest_addr4.sin_family = AF_INET;
+ dest_addr4.sin_port = htons(ALFRED_PORT);
+ memcpy(&dest_addr4.sin_addr, &dest->ipv4, sizeof(dest->ipv4));
+
+ slen = sizeof(struct sockaddr_in);
+ dest_addr = (struct sockaddr *)&dest_addr4;
+ } else {
+ memset(&dest_addr6, 0, sizeof(dest_addr6));
+ dest_addr6.sin6_family = AF_INET6;
+ dest_addr6.sin6_port = htons(ALFRED_PORT);
+ dest_addr6.sin6_scope_id = interface->scope_id;
+ memcpy(&dest_addr6.sin6_addr, &dest->ipv6, sizeof(dest->ipv6));
+
+ slen = sizeof(struct sockaddr_in6);
+ dest_addr = (struct sockaddr *)&dest_addr6;
+ }
if (interface->netsock < 0)
return 0;
- ret = sendto(interface->netsock, buf, length, 0,
- (struct sockaddr *)&dest_addr,
- sizeof(struct sockaddr_in6));
+ ret = sendto(interface->netsock, buf, length, 0, dest_addr, slen);
if (ret == -EPERM) {
perror("Error during sent");
close(interface->netsock);
diff --git a/server.c b/server.c
index f6e0c8a..2c4042a 100644
--- a/server.c
+++ b/server.c
@@ -218,7 +218,7 @@ static int purge_data(struct globals *globals)
return 0;
}
-static void check_if_socket(struct interface *interface)
+static void check_if_socket(struct interface *interface, struct globals *globals)
{
int sock;
struct ifreq ifr;
@@ -226,7 +226,7 @@ static void check_if_socket(struct interface *interface)
if (interface->netsock < 0)
return;
- sock = socket(PF_INET6, SOCK_DGRAM, 0);
+ sock = socket(PF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("can't open socket");
return;
@@ -240,7 +240,7 @@ static void check_if_socket(struct interface *interface)
goto close;
}
- if (interface->scope_id != (uint32_t)ifr.ifr_ifindex) {
+ if (!globals->ipv4mode && (interface->scope_id != (uint32_t)ifr.ifr_ifindex)) {
fprintf(stderr,
"iface index changed from %"PRIu32" to %d, closing netsock\n",
interface->scope_id, ifr.ifr_ifindex);
@@ -282,7 +282,7 @@ static void check_if_sockets(struct globals *globals)
globals->if_check = now;
list_for_each_entry(interface, &globals->interfaces, list)
- check_if_socket(interface);
+ check_if_socket(interface, globals);
}
static void execute_update_command(struct globals *globals)
diff --git a/unix_sock.c b/unix_sock.c
index 0a819a2..4a8c6e0 100644
--- a/unix_sock.c
+++ b/unix_sock.c
@@ -258,7 +258,7 @@ static int unix_sock_req_data(struct globals *globals,
head->client_socket = client_sock;
head->requested_type = request->requested_type;
- send_alfred_packet(interface, &globals->best_server->address,
+ send_alfred_packet(globals, interface, &globals->best_server->address,
request, sizeof(*request));
return 0;
diff --git a/util.c b/util.c
index ea75643..84ab3af 100644
--- a/util.c
+++ b/util.c
@@ -23,7 +23,10 @@
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
+#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
#include <sys/time.h>
#include <time.h>
#include "alfred.h"
@@ -75,3 +78,30 @@ bool is_valid_ether_addr(uint8_t addr[ETH_ALEN])
return true;
}
+
+int ipv4_arp_request(struct interface *interface, const alfred_addr *addr,
+ struct ether_addr *mac)
+{
+ struct arpreq arpreq;
+ struct sockaddr_in *sin;
+
+ memset(&arpreq, 0, sizeof(arpreq));
+ memset(mac, 0, ETH_ALEN);
+
+ sin = (struct sockaddr_in *)&arpreq.arp_pa;
+ sin->sin_family = AF_INET;
+ sin->sin_addr.s_addr = addr->ipv4.s_addr;
+
+ strcpy(arpreq.arp_dev, interface->interface);
+ if (ioctl(interface->netsock, SIOCGARP, &arpreq) < 0)
+ return -1;
+
+ if (arpreq.arp_flags & ATF_COM) {
+ memcpy(mac, arpreq.arp_ha.sa_data, sizeof(*mac));
+ } else {
+ perror("arp: incomplete");
+ return -1;
+ }
+
+ return 0;
+}
6 years
[alfred] ecsv/copyright, master: alfred: update copyright years for 2017 (7b17b6b)
by postmaster@open-mesh.org
Repository : ssh://git@open-mesh.org/alfred
On branches: ecsv/copyright,master
>---------------------------------------------------------------
commit 7b17b6b9c1d8456e9cd956a1b309fd4db3f26148
Author: Sven Eckelmann <sven(a)narfation.org>
Date: Sun Jan 1 00:00:00 2017 +0100
alfred: update copyright years for 2017
Signed-off-by: Sven Eckelmann <sven(a)narfation.org>
>---------------------------------------------------------------
7b17b6b9c1d8456e9cd956a1b309fd4db3f26148
Makefile | 2 +-
alfred.h | 2 +-
batadv_query.c | 2 +-
batadv_query.h | 2 +-
batman_adv.h | 2 +-
client.c | 2 +-
gpsd/Makefile | 2 +-
gpsd/alfred-gpsd.c | 2 +-
gpsd/alfred-gpsd.h | 2 +-
hash.c | 2 +-
hash.h | 2 +-
main.c | 2 +-
netlink.c | 2 +-
netlink.h | 2 +-
netsock.c | 2 +-
packet.h | 2 +-
recv.c | 2 +-
send.c | 2 +-
server.c | 2 +-
unix_sock.c | 2 +-
util.c | 2 +-
vis/Makefile | 2 +-
vis/vis.c | 2 +-
vis/vis.h | 2 +-
24 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/Makefile b/Makefile
index 552e690..3c88e96 100755
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
#!/usr/bin/make -f
# -*- makefile -*-
#
-# Copyright (C) 2012-2016 B.A.T.M.A.N. contributors
+# Copyright (C) 2012-2017 B.A.T.M.A.N. contributors
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of version 2 of the GNU General Public
diff --git a/alfred.h b/alfred.h
index 44c6f30..2e8db1e 100644
--- a/alfred.h
+++ b/alfred.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/batadv_query.c b/batadv_query.c
index c17132f..ac45b9b 100644
--- a/batadv_query.c
+++ b/batadv_query.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/batadv_query.h b/batadv_query.h
index 320203b..0df8a35 100644
--- a/batadv_query.h
+++ b/batadv_query.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2006-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich, Marek Lindner
*
diff --git a/batman_adv.h b/batman_adv.h
index 734fe83..a83ddb7 100644
--- a/batman_adv.h
+++ b/batman_adv.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2016 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2016-2017 B.A.T.M.A.N. contributors:
*
* Matthias Schiffer
*
diff --git a/client.c b/client.c
index 2a5e8a5..357fdb9 100644
--- a/client.c
+++ b/client.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/gpsd/Makefile b/gpsd/Makefile
index b6172d9..da4a553 100755
--- a/gpsd/Makefile
+++ b/gpsd/Makefile
@@ -1,7 +1,7 @@
#!/usr/bin/make -f
# -*- makefile -*-
#
-# Copyright (C) 2013-2016 B.A.T.M.A.N. contributors
+# Copyright (C) 2013-2017 B.A.T.M.A.N. contributors
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of version 2 of the GNU General Public
diff --git a/gpsd/alfred-gpsd.c b/gpsd/alfred-gpsd.c
index 88f841c..01e61a0 100644
--- a/gpsd/alfred-gpsd.c
+++ b/gpsd/alfred-gpsd.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2013-2017 B.A.T.M.A.N. contributors:
*
* Andrew Lunn, Simon Wunderlich
*
diff --git a/gpsd/alfred-gpsd.h b/gpsd/alfred-gpsd.h
index da7a074..f6be40e 100644
--- a/gpsd/alfred-gpsd.h
+++ b/gpsd/alfred-gpsd.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2013-2017 B.A.T.M.A.N. contributors:
*
* Andrew Lunn, Simon Wunderlich
*
diff --git a/hash.c b/hash.c
index 7669679..5a3cdef 100644
--- a/hash.c
+++ b/hash.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2006-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich, Marek Lindner
*
diff --git a/hash.h b/hash.h
index 24bddb1..f6604d0 100644
--- a/hash.h
+++ b/hash.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2006-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich, Marek Lindner
*
diff --git a/main.c b/main.c
index f1bc9a5..0d30ea4 100644
--- a/main.c
+++ b/main.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/netlink.c b/netlink.c
index 73fab28..1964ab8 100644
--- a/netlink.c
+++ b/netlink.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2009-2017 B.A.T.M.A.N. contributors:
*
* Marek Lindner <mareklindner(a)neomailbox.ch>, Andrew Lunn <andrew(a)lunn.ch>
*
diff --git a/netlink.h b/netlink.h
index 9bc75a1..1c87695 100644
--- a/netlink.h
+++ b/netlink.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2009-2017 B.A.T.M.A.N. contributors:
*
* Marek Lindner <mareklindner(a)neomailbox.ch>, Andrew Lunn <andrew(a)lunn.ch>
*
diff --git a/netsock.c b/netsock.c
index 5d37347..86db8a6 100644
--- a/netsock.c
+++ b/netsock.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/packet.h b/packet.h
index ebb4274..afd3715 100644
--- a/packet.h
+++ b/packet.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich, Sven Eckelmann
*
diff --git a/recv.c b/recv.c
index bd208fd..bb8cc05 100644
--- a/recv.c
+++ b/recv.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/send.c b/send.c
index 70f694c..c7a2af2 100644
--- a/send.c
+++ b/send.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/server.c b/server.c
index 3a0ad8d..f6e0c8a 100644
--- a/server.c
+++ b/server.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/unix_sock.c b/unix_sock.c
index edc7e0b..0a819a2 100644
--- a/unix_sock.c
+++ b/unix_sock.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/util.c b/util.c
index c7e11cc..ea75643 100644
--- a/util.c
+++ b/util.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2012-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/vis/Makefile b/vis/Makefile
index 22483a5..b69672c 100755
--- a/vis/Makefile
+++ b/vis/Makefile
@@ -1,7 +1,7 @@
#!/usr/bin/make -f
# -*- makefile -*-
#
-# Copyright (C) 2013-2016 B.A.T.M.A.N. contributors
+# Copyright (C) 2013-2017 B.A.T.M.A.N. contributors
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of version 2 of the GNU General Public
diff --git a/vis/vis.c b/vis/vis.c
index 22e052b..98ff02f 100644
--- a/vis/vis.c
+++ b/vis/vis.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2013-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
diff --git a/vis/vis.h b/vis/vis.h
index 5386eae..ce04b9e 100644
--- a/vis/vis.h
+++ b/vis/vis.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2016 B.A.T.M.A.N. contributors:
+ * Copyright (C) 2013-2017 B.A.T.M.A.N. contributors:
*
* Simon Wunderlich
*
6 years