]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blame - src/patches/dhcp-4.2.0-unicast-bootp.patch
openvpn: Fix wrong default port number.
[people/teissler/ipfire-2.x.git] / src / patches / dhcp-4.2.0-unicast-bootp.patch
CommitLineData
78ab9b04
MT
1diff -up dhcp-4.2.0/server/bootp.c.unicast dhcp-4.2.0/server/bootp.c
2--- dhcp-4.2.0/server/bootp.c.unicast 2009-11-20 02:49:03.000000000 +0100
3+++ dhcp-4.2.0/server/bootp.c 2010-07-21 13:40:25.000000000 +0200
4@@ -58,6 +58,7 @@ void bootp (packet)
5 char msgbuf [1024];
6 int ignorep;
7 int peer_has_leases = 0;
8+ int norelay = 0;
9
10 if (packet -> raw -> op != BOOTREQUEST)
11 return;
12@@ -73,7 +74,7 @@ void bootp (packet)
13 ? inet_ntoa (packet -> raw -> giaddr)
14 : packet -> interface -> name);
15
16- if (!locate_network (packet)) {
17+ if ((norelay = locate_network (packet)) == 0) {
18 log_info ("%s: network unknown", msgbuf);
19 return;
20 }
21@@ -390,6 +391,13 @@ void bootp (packet)
22 from, &to, &hto);
23 goto out;
24 }
25+ } else if (norelay == 2) {
26+ to.sin_addr = raw.ciaddr;
27+ to.sin_port = remote_port;
28+ if (fallback_interface) {
29+ result = send_packet (fallback_interface, (struct packet *)0, &raw, outgoing.packet_length, from, &to, &hto);
30+ goto out;
31+ }
32
33 /* If it comes from a client that already knows its address
34 and is not requesting a broadcast response, and we can
35diff -up dhcp-4.2.0/server/dhcp.c.unicast dhcp-4.2.0/server/dhcp.c
36--- dhcp-4.2.0/server/dhcp.c.unicast 2010-06-01 19:29:59.000000000 +0200
37+++ dhcp-4.2.0/server/dhcp.c 2010-07-21 13:40:25.000000000 +0200
38@@ -4185,6 +4185,7 @@ int locate_network (packet)
39 struct data_string data;
40 struct subnet *subnet = (struct subnet *)0;
41 struct option_cache *oc;
42+ int norelay = 0;
43
44 /* See if there's a Relay Agent Link Selection Option, or a
45 * Subnet Selection Option. The Link-Select and Subnet-Select
46@@ -4200,12 +4201,24 @@ int locate_network (packet)
47 from the interface, if there is one. If not, fail. */
48 if (!oc && !packet -> raw -> giaddr.s_addr) {
49 if (packet -> interface -> shared_network) {
50- shared_network_reference
51- (&packet -> shared_network,
52- packet -> interface -> shared_network, MDL);
53- return 1;
54+ struct in_addr any_addr;
55+ any_addr.s_addr = INADDR_ANY;
56+
57+ if (!packet -> packet_type && memcmp(&packet -> raw -> ciaddr, &any_addr, 4)) {
58+ struct iaddr cip;
59+ memcpy(cip.iabuf, &packet -> raw -> ciaddr, 4);
60+ cip.len = 4;
61+ if (!find_grouped_subnet(&subnet, packet->interface->shared_network, cip, MDL))
62+ norelay = 2;
63+ }
64+
65+ if (!norelay) {
66+ shared_network_reference(&packet -> shared_network, packet -> interface -> shared_network, MDL);
67+ return 1;
68+ }
69+ } else {
70+ return 0;
71 }
72- return 0;
73 }
74
75 /* If there's an option indicating link connection, and it's valid,
76@@ -4228,7 +4241,10 @@ int locate_network (packet)
77 data_string_forget (&data, MDL);
78 } else {
79 ia.len = 4;
80- memcpy (ia.iabuf, &packet -> raw -> giaddr, 4);
81+ if (norelay)
82+ memcpy (ia.iabuf, &packet->raw->ciaddr, 4);
83+ else
84+ memcpy (ia.iabuf, &packet->raw->giaddr, 4);
85 }
86
87 /* If we know the subnet on which the IP address lives, use it. */
88@@ -4236,7 +4252,10 @@ int locate_network (packet)
89 shared_network_reference (&packet -> shared_network,
90 subnet -> shared_network, MDL);
91 subnet_dereference (&subnet, MDL);
92- return 1;
93+ if (norelay)
94+ return norelay;
95+ else
96+ return 1;
97 }
98
99 /* Otherwise, fail. */