Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Aug 1997 09:55:58 -0400
From:      John Woodruff <jjw@us.net>
To:        dhcpd-users@fugue.com, freebsd-hackers@FreeBSD.org
Subject:   isc-dhcpd, FreeBSD, USE_RAW_SEND
Message-ID:  <33F30E6E.2781E494@us.net>

next in thread | raw e-mail | index | archive | help
This is more of a "isc-dhcpd developer" question than most, or
perhaps a "FreeBSD developer" question...

I'm trying to get isc-dhcpd-5.16 to work on a FreeBSD 2.2.2
system with USE_RAW_SEND (for other reasons, I can't put BPF
into the kernel, so the "standard" build won't work; and the
there's only one broadcast ifc so I *think* it should work).

dhcpd has no problem hearing the request and formulating a
reply.  The problem is that I can't seem to get the kernel
to send the reply - it rejects whatever I send.

First, the code in raw.c that setup "auto struct sockaddr_in name"
seemed really bogus since "name" was never used, so I whacked it.
This resulted in EDESTADDRREQ from the final writev().

Then, I hacked in some code to use sendto(). Omitting details:

  buf = grow_raw_buf(sizeof(struct ip)  /*new*/
                   + sizeof(struct udphdr)
                   + len);
  assemble_udp_ip_header (interface, buf, &bufp, from.s_addr,
                          to -> sin_addr.s_addr, to -> sin_port,
                          (unsigned char *)raw, len);
  memcpy((buf+bufp), raw, len);
  bufp += len;
  return sendto(interface->wfdesc,
          buf, bufp, 0,
          (struct sockaddr*)to, sizeof(*to) );

Looking at buf just before the sendto() shows what looks like a
perfectly good IP+UDP+DHCP packet, but now I get EINVAL from
the final sendto().  The IP fields that "man 4 ip" says must be
set correctly seem to indeed be.

  (gdb) run
  Starting program: /home/jjw/dhcp-5.15/./dhcpd -d -f
  Internet Software Consortium DHCPD $Name: BETA_5_16 $ [...]
  Listening on Socket/ep0/207.244.202.0
  Sending on   Raw/ep0/207.244.202.0
  BOOTREQUEST from 0:c0:4f:de:7a:8 via ep0
  BOOTREPLY on 207.244.202.8 to 0:c0:4f:de:7a:8 via ep0

  Breakpoint 1, send_packet (interface=0x2a080, packet=0xefbfd478, 
    raw=0xefbfade8, len=300, from={s_addr = 46855375}, to=0xefbfa9d8, 
    hto=0xefbfa9c0) at raw.c:144
  144             return sendto(interface->wfdesc,
  (gdb) x/20xw buf
  0x48011045      0x00000000      0x9f0f1110      0x02caf4cf
  0xffffffff      0x44004300      0x00003401      0x00060102
  0x002b7ba3      0x00006400      0x00000000      0x08caf4cf
  0x02caf4cf      0x00000000      0xde4fc000      0x0000087a
  0x00000000      0x00000000      0x00000000      0x0000000
  (gdb) c
  sendpkt: Invalid argument

Just in case the sendto wanted an etheraddr, I tried changing
the sizeof(*to) to 6.  Still EINVAL.  Yes, this is running root.

Can someone tell me what I'm doing wrong here?
-- 
John Woodruff, Sr. Network Engineer, US Net - jjw@us.net - 301-572-5926
Washington/Baltimore/Richmond ISP - $6.95/month for full PPP!




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?33F30E6E.2781E494>