43
* Look for Relay attribute, and forward it if so...
59
* Look for Relay attribute, and forward it if necessary.
61
vp = pairfind(request->config_items, DHCP2ATTR(270));
64
RADIUS_PACKET relayed;
66
request->reply->code = 0; /* don't reply to the client */
69
* Find the original giaddr.
70
* FIXME: Maybe look in the original packet?
72
* It's invalid to have giaddr=0 AND a relay option
74
giaddr = pairfind(request->packet->vps, 266);
75
if (giaddr && (giaddr->vp_ipaddr == htonl(INADDR_ANY))) {
76
if (pairfind(request->packet->vps, DHCP2ATTR(82))) {
77
RDEBUG("DHCP: Received packet with giaddr = 0 and containing relay option: Discarding packet");
82
* FIXME: Add cache by XID.
84
RDEBUG("DHCP: Cannot yet relay packets with giaddr = 0");
88
if (request->packet->data[3] > 10) {
89
RDEBUG("DHCP: Number of hops is greater than 10: not relaying");
94
* Forward it VERBATIM to the next server, rather
97
memcpy(&relayed, request->packet, sizeof(relayed));
99
relayed.dst_ipaddr.af = AF_INET;
100
relayed.dst_ipaddr.ipaddr.ip4addr.s_addr = vp->vp_ipaddr;
101
relayed.dst_port = request->packet->dst_port;
103
relayed.src_ipaddr = request->packet->dst_ipaddr;
104
relayed.src_port = request->packet->dst_port;
106
relayed.data = rad_malloc(relayed.data_len);
107
memcpy(relayed.data, request->packet->data, request->packet->data_len);
111
* The only field that changes is the number of hops
113
relayed.data[3]++; /* number of hops */
116
* Forward the relayed packet VERBATIM, don't
117
* respond to the client, and forget completely
118
* about this request.
120
fr_dhcp_send(&relayed);
125
vp = pairfind(request->reply->vps, DHCP2ATTR(53)); /* DHCP-Message-Type */
127
request->reply->code = vp->vp_integer;
128
if ((request->reply->code != 0) &&
129
(request->reply->code < PW_DHCP_OFFSET)) {
130
request->reply->code += PW_DHCP_OFFSET;
133
else switch (rcode) {
47
134
case RLM_MODULE_OK:
48
135
case RLM_MODULE_UPDATED:
49
if (request->packet->code == (PW_DHCP_DISCOVER)) {
136
if (request->packet->code == PW_DHCP_DISCOVER) {
50
137
request->reply->code = PW_DHCP_OFFER;
192
* Undocumented extension for testing without
193
* destroying your network!
195
sock->suppress_responses = FALSE;
196
cp = cf_pair_find(cs, "suppress_responses");
200
value = cf_pair_value(cp);
202
if (value && (strcmp(value, "yes") == 0)) {
203
sock->suppress_responses = TRUE;
208
* Initialize the fake client.
210
client = &sock->dhcp_client;
211
memset(client, 0, sizeof(*client));
212
client->ipaddr.af = AF_INET;
213
client->ipaddr.ipaddr.ip4addr.s_addr = INADDR_NONE;
215
client->longname = client->shortname = "dhcp";
216
client->secret = client->shortname;
217
client->nastype = strdup("none");
117
230
RAD_REQUEST_FUNP *pfun, REQUEST **prequest)
119
232
RADIUS_PACKET *packet;
122
235
packet = fr_dhcp_recv(listener->fd);
124
radlog(L_ERR, "%s", librad_errstr);
128
if ((client = client_listener_find(listener,
129
&packet->src_ipaddr)) == NULL) {
131
radlog(L_ERR, "Ignoring request from unknown client %s port %d",
132
inet_ntop(packet->src_ipaddr.af,
133
&packet->src_ipaddr.ipaddr,
134
buffer, sizeof(buffer)),
140
if (!received_request(listener, packet, prequest, client)) {
237
radlog(L_ERR, "%s", fr_strerror());
241
sock = listener->data;
242
if (!received_request(listener, packet, prequest, &sock->dhcp_client)) {
141
243
rad_free(&packet);