projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Releasing 1.0.19.
[tinc]
/
src
/
route.c
diff --git
a/src/route.c
b/src/route.c
index
b2e1b7b
..
74ad9a3
100644
(file)
--- a/
src/route.c
+++ b/
src/route.c
@@
-1,7
+1,7
@@
/*
route.c -- routing
Copyright (C) 2000-2005 Ivo Timmermans,
/*
route.c -- routing
Copyright (C) 2000-2005 Ivo Timmermans,
- 2000-201
0
Guus Sliepen <guus@tinc-vpn.org>
+ 2000-201
2
Guus Sliepen <guus@tinc-vpn.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@
-34,12
+34,12
@@
rmode_t routing_mode = RMODE_ROUTER;
fmode_t forwarding_mode = FMODE_INTERNAL;
rmode_t routing_mode = RMODE_ROUTER;
fmode_t forwarding_mode = FMODE_INTERNAL;
-bool decrement_ttl = true;
+bmode_t broadcast_mode = BMODE_MST;
+bool decrement_ttl = false;
bool directonly = false;
bool priorityinheritance = false;
int macexpire = 600;
bool overwrite_mac = false;
bool directonly = false;
bool priorityinheritance = false;
int macexpire = 600;
bool overwrite_mac = false;
-bool broadcast = true;
mac_t mymac = {{0xFE, 0xFD, 0, 0, 0, 0}};
/* Sizes of various headers */
mac_t mymac = {{0xFE, 0xFD, 0, 0, 0, 0}};
/* Sizes of various headers */
@@
-400,6
+400,11
@@
static void route_ipv4_unicast(node_t *source, vpn_packet_t *packet) {
packet->priority = packet->data[15];
via = (subnet->owner->via == myself) ? subnet->owner->nexthop : subnet->owner->via;
packet->priority = packet->data[15];
via = (subnet->owner->via == myself) ? subnet->owner->nexthop : subnet->owner->via;
+
+ if(via == source) {
+ ifdebug(TRAFFIC) logger(LOG_ERR, "Routing loop for packet from %s (%s)!", source->name, source->hostname);
+ return;
+ }
if(directonly && subnet->owner != via)
return route_ipv4_unreachable(source, packet, ICMP_DEST_UNREACH, ICMP_NET_ANO);
if(directonly && subnet->owner != via)
return route_ipv4_unreachable(source, packet, ICMP_DEST_UNREACH, ICMP_NET_ANO);
@@
-425,7
+430,7
@@
static void route_ipv4(node_t *source, vpn_packet_t *packet) {
if(!checklength(source, packet, ether_size + ip_size))
return;
if(!checklength(source, packet, ether_size + ip_size))
return;
- if(broadcast && (((packet->data[30] & 0xf0) == 0xe0) || (
+ if(broadcast
_mode
&& (((packet->data[30] & 0xf0) == 0xe0) || (
packet->data[30] == 255 &&
packet->data[31] == 255 &&
packet->data[32] == 255 &&
packet->data[30] == 255 &&
packet->data[31] == 255 &&
packet->data[32] == 255 &&
@@
-552,6
+557,11
@@
static void route_ipv6_unicast(node_t *source, vpn_packet_t *packet) {
via = (subnet->owner->via == myself) ? subnet->owner->nexthop : subnet->owner->via;
via = (subnet->owner->via == myself) ? subnet->owner->nexthop : subnet->owner->via;
+ if(via == source) {
+ ifdebug(TRAFFIC) logger(LOG_ERR, "Routing loop for packet from %s (%s)!", source->name, source->hostname);
+ return;
+ }
+
if(directonly && subnet->owner != via)
return route_ipv6_unreachable(source, packet, ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_ADMIN);
if(directonly && subnet->owner != via)
return route_ipv6_unreachable(source, packet, ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_ADMIN);
@@
-717,7
+727,7
@@
static void route_ipv6(node_t *source, vpn_packet_t *packet) {
return;
}
return;
}
- if(broadcast && packet->data[38] == 255)
+ if(broadcast
_mode
&& packet->data[38] == 255)
broadcast_packet(source, packet);
else
route_ipv6_unicast(source, packet);
broadcast_packet(source, packet);
else
route_ipv6_unicast(source, packet);
@@
-807,8
+817,7
@@
static void route_mac(node_t *source, vpn_packet_t *packet) {
subnet = lookup_subnet_mac(NULL, &dest);
if(!subnet) {
subnet = lookup_subnet_mac(NULL, &dest);
if(!subnet) {
- if(broadcast)
- broadcast_packet(source, packet);
+ broadcast_packet(source, packet);
return;
}
return;
}