/[mdap]/bin/bootpd.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /bin/bootpd.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 61 - (show annotations)
Sat Nov 17 00:12:12 2007 UTC (16 years, 4 months ago) by dpavlin
File MIME type: text/plain
File size: 1911 byte(s)
 r84@brr:  dpavlin | 2007-11-17 00:58:36 +0100
 simpliest possible bootp server (it seems to work)

1 #!/usr/bin/perl
2
3 # based on http://www.perlmonks.org/index.pl?node_id=325248
4
5 use strict;
6 use warnings;
7
8 use IO::Socket::INET;
9 use Net::DHCP::Packet;
10 use Net::DHCP::Constants;
11 use Data::Dump qw/dump/;
12
13 die "need to run $0 as root like this\nsudo $0\n" unless $< == 0;
14
15 my $debug = 1;
16
17 my $sock = IO::Socket::INET->new(
18 LocalPort => 67,
19 # LocalAddr => 'localhost',
20 # LocalAddr => '10.0.0.100',
21 LocalAddr => '0.0.0.0',
22 Proto => 'udp',
23 ReuseAddr => 1,
24 # PeerPort => getservbyname('bootpc', 'udp'),
25 Broadcast => 1,
26 Type => SOCK_DGRAM,
27 ) or die "Failed to bind to socket: $@";
28
29 my $device = 'eth1';
30
31 my $ip = '10.0.0.10';
32 my $ip_server = '10.0.0.100';
33
34 while (1) {
35
36 print "waiting for BOOTP requests on ",$sock->sockhost,":",$sock->sockport,"\n";
37
38 my $buf;
39 $sock->recv($buf, 1024);
40 print "<< peer:",$sock->peerhost,":",$sock->peerport,"\n";
41
42 if (defined $buf) {
43
44 my $dhcp;
45
46 eval { $dhcp = Net::DHCP::Packet->new($buf); };
47 die "can't use request", dump( $buf ) if $@;
48
49 if ( $debug ) {
50 warn "recv: ", $dhcp->toString, "\n\n";
51 }
52
53 my $packet = new Net::DHCP::Packet(
54 Op => BOOTREPLY(),
55 Hops => $dhcp->hops(),
56 Xid => $dhcp->xid(),
57 Flags => $dhcp->flags(),
58 Ciaddr => $dhcp->ciaddr(),
59 Yiaddr => $ip,
60 Siaddr => $ip_server,
61 Giaddr => $dhcp->giaddr(),
62 Chaddr => $dhcp->chaddr(),
63 File => $dhcp->file(),
64 # DHO_DHCP_MESSAGE_TYPE() => DHCPACK(),
65 DHO_SUBNET_MASK() => '255.0.0.0',
66 );
67
68 warn ">> ",$sock->peeraddr,":",$sock->peerport," send $ip with server $ip_server\n",$packet->toString(),"\n";
69
70 my $reply = IO::Socket::INET->new(
71 LocalAddr => '10.0.0.100',
72 LocalPort => 67,
73 Proto => "udp",
74 Broadcast => 1,
75 PeerAddr => '255.255.255.255',
76 PeerPort => 68,
77 Reuse => 1,
78 ) or die "socket: $@";
79
80
81 my $buff = $packet->serialize();
82 $reply->send( $buff, 0 ) or die "Error sending: $!\n";
83
84 } else {
85 print "No bootp request.\n";
86 }
87
88 }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26