DhcpServer library for mbed-os.
Fork of DhcpServer by
mbedボードをDHCPサーバとして使用するためのライブラリです。mbedボードとPCを直結する際などに使用してください。
このクラスは5つのIPアドレスを割り当てられることができます。
IPアドレスの上位3バイトはサーバーアドレスと同じで、下の1バイトは、10-14が割り当てられます。
例えば、サーバーアドレスが"192.168.0.1"の場合、IPアドレスは"192.168.0.10"~"192.168.0.14"が割り当てられます。
EthernetInterfaceでconnectを実行した後に、DhcpServerを使用してください。
EthernetInterface eth; eth.init("192.168.0.1", "255.255.255.0", "192.168.0.1"); eth.connect(); DhcpServer dhcp_server(ð, "HostName");
Library in Beta!
This library is in Beta.
このライブラリはβ版です。
DhcpServer.cpp@2:4a34731d231e, 2017-06-20 (annotated)
- Committer:
- dkato
- Date:
- Tue Jun 20 10:32:37 2017 +0000
- Revision:
- 2:4a34731d231e
- Parent:
- 0:1c2747611cab
- Child:
- 3:bdea854c0ec8
Supports mbed os 5
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dkato | 0:1c2747611cab | 1 | #include "mbed.h" |
dkato | 0:1c2747611cab | 2 | #include "rtos.h" |
dkato | 0:1c2747611cab | 3 | #include "lwip/netif.h" |
dkato | 2:4a34731d231e | 4 | #include "TCPSocket.h" |
dkato | 2:4a34731d231e | 5 | #include "TCPServer.h" |
dkato | 2:4a34731d231e | 6 | #include "SocketAddress.h" |
dkato | 0:1c2747611cab | 7 | #include "UDPSocket.h" |
dkato | 2:4a34731d231e | 8 | #include "prot/ip4.h" |
dkato | 2:4a34731d231e | 9 | #include "prot/dhcp.h" |
dkato | 0:1c2747611cab | 10 | #include "DhcpServer.h" |
dkato | 0:1c2747611cab | 11 | |
dkato | 0:1c2747611cab | 12 | #define IP_ADDER_START (10) |
dkato | 0:1c2747611cab | 13 | |
dkato | 0:1c2747611cab | 14 | #define OFS_XID (4) |
dkato | 0:1c2747611cab | 15 | #define OFS_YIADDR (16) |
dkato | 0:1c2747611cab | 16 | #define OFS_SIADDR (20) |
dkato | 0:1c2747611cab | 17 | #define OFS_CHADDR (28) |
dkato | 0:1c2747611cab | 18 | #define OFS_SNAME (44) |
dkato | 0:1c2747611cab | 19 | #define OFS_COOKIE (236) |
dkato | 0:1c2747611cab | 20 | #define OFS_OPTIONS (240) |
dkato | 0:1c2747611cab | 21 | |
dkato | 2:4a34731d231e | 22 | void DhcpServer::dhcp_process(void) { |
dkato | 2:4a34731d231e | 23 | SocketAddress client; |
dkato | 0:1c2747611cab | 24 | int cnt; |
dkato | 0:1c2747611cab | 25 | int tbl_index; |
dkato | 2:4a34731d231e | 26 | int option; |
dkato | 2:4a34731d231e | 27 | nsapi_addr_t addr; |
dkato | 2:4a34731d231e | 28 | const char mac_no_use[6] = {0, 0, 0, 0, 0, 0}; |
dkato | 0:1c2747611cab | 29 | |
dkato | 0:1c2747611cab | 30 | dhcp_server.bind(67); |
dkato | 2:4a34731d231e | 31 | option = 1; |
dkato | 2:4a34731d231e | 32 | dhcp_server.setsockopt(0xfff, 0x0020, &option, sizeof(option)); |
dkato | 0:1c2747611cab | 33 | |
dkato | 0:1c2747611cab | 34 | while (true) { |
dkato | 2:4a34731d231e | 35 | int n = dhcp_server.recvfrom(&client, receivebuff, 500); |
dkato | 0:1c2747611cab | 36 | if (n > 0) { |
dkato | 2:4a34731d231e | 37 | addr.version = NSAPI_IPv4; |
dkato | 2:4a34731d231e | 38 | addr.bytes[0] = 255; |
dkato | 2:4a34731d231e | 39 | addr.bytes[1] = 255; |
dkato | 2:4a34731d231e | 40 | addr.bytes[2] = 255; |
dkato | 2:4a34731d231e | 41 | addr.bytes[3] = 255; |
dkato | 2:4a34731d231e | 42 | client.set_addr(addr); |
dkato | 2:4a34731d231e | 43 | client.set_port(68); |
dkato | 0:1c2747611cab | 44 | |
dkato | 0:1c2747611cab | 45 | sendbuff[OFS_XID + 0] = receivebuff[OFS_XID + 0]; |
dkato | 0:1c2747611cab | 46 | sendbuff[OFS_XID + 1] = receivebuff[OFS_XID + 1]; |
dkato | 0:1c2747611cab | 47 | sendbuff[OFS_XID + 2] = receivebuff[OFS_XID + 2]; |
dkato | 0:1c2747611cab | 48 | sendbuff[OFS_XID + 3] = receivebuff[OFS_XID + 3]; |
dkato | 0:1c2747611cab | 49 | |
dkato | 0:1c2747611cab | 50 | tbl_index = -1; |
dkato | 0:1c2747611cab | 51 | for (cnt = 0; cnt < CONNECT_NUM; cnt++) { |
dkato | 0:1c2747611cab | 52 | if (memcmp(&receivebuff[OFS_CHADDR], chaddr_tbl[cnt], 6) == 0) { |
dkato | 0:1c2747611cab | 53 | tbl_index = cnt; |
dkato | 0:1c2747611cab | 54 | break; |
dkato | 0:1c2747611cab | 55 | } |
dkato | 0:1c2747611cab | 56 | } |
dkato | 0:1c2747611cab | 57 | if (tbl_index == -1) { |
dkato | 0:1c2747611cab | 58 | sendbuff[OFS_YIADDR + 0] = 0; |
dkato | 0:1c2747611cab | 59 | sendbuff[OFS_YIADDR + 1] = 0; |
dkato | 0:1c2747611cab | 60 | sendbuff[OFS_YIADDR + 2] = 0; |
dkato | 0:1c2747611cab | 61 | sendbuff[OFS_YIADDR + 3] = 0; |
dkato | 0:1c2747611cab | 62 | } else { |
dkato | 0:1c2747611cab | 63 | sendbuff[OFS_YIADDR + 0] = sendbuff[OFS_SIADDR + 0]; |
dkato | 0:1c2747611cab | 64 | sendbuff[OFS_YIADDR + 1] = sendbuff[OFS_SIADDR + 1]; |
dkato | 0:1c2747611cab | 65 | sendbuff[OFS_YIADDR + 2] = sendbuff[OFS_SIADDR + 2]; |
dkato | 0:1c2747611cab | 66 | sendbuff[OFS_YIADDR + 3] = IP_ADDER_START + tbl_index; |
dkato | 0:1c2747611cab | 67 | } |
dkato | 0:1c2747611cab | 68 | |
dkato | 0:1c2747611cab | 69 | sendbuff[OFS_CHADDR + 0] = receivebuff[OFS_CHADDR + 0]; |
dkato | 0:1c2747611cab | 70 | sendbuff[OFS_CHADDR + 1] = receivebuff[OFS_CHADDR + 1]; |
dkato | 0:1c2747611cab | 71 | sendbuff[OFS_CHADDR + 2] = receivebuff[OFS_CHADDR + 2]; |
dkato | 0:1c2747611cab | 72 | sendbuff[OFS_CHADDR + 3] = receivebuff[OFS_CHADDR + 3]; |
dkato | 0:1c2747611cab | 73 | sendbuff[OFS_CHADDR + 4] = receivebuff[OFS_CHADDR + 4]; |
dkato | 0:1c2747611cab | 74 | sendbuff[OFS_CHADDR + 5] = receivebuff[OFS_CHADDR + 5]; |
dkato | 0:1c2747611cab | 75 | |
dkato | 0:1c2747611cab | 76 | if (receivebuff[OFS_OPTIONS + 2] == DHCP_DISCOVER) { |
dkato | 0:1c2747611cab | 77 | sendbuff[OFS_OPTIONS + 2] = DHCP_OFFER; |
dkato | 0:1c2747611cab | 78 | if (tbl_index == -1) { |
dkato | 0:1c2747611cab | 79 | for (cnt = 0; cnt < CONNECT_NUM; cnt++) { |
dkato | 0:1c2747611cab | 80 | if (memcmp( chaddr_tbl[cnt], mac_no_use, 6) == 0) { |
dkato | 0:1c2747611cab | 81 | tbl_index = cnt; |
dkato | 0:1c2747611cab | 82 | break; |
dkato | 0:1c2747611cab | 83 | } |
dkato | 0:1c2747611cab | 84 | } |
dkato | 0:1c2747611cab | 85 | } |
dkato | 0:1c2747611cab | 86 | if (tbl_index != -1) { |
dkato | 0:1c2747611cab | 87 | chaddr_tbl[tbl_index][0] = receivebuff[OFS_CHADDR + 0]; |
dkato | 0:1c2747611cab | 88 | chaddr_tbl[tbl_index][1] = receivebuff[OFS_CHADDR + 1]; |
dkato | 0:1c2747611cab | 89 | chaddr_tbl[tbl_index][2] = receivebuff[OFS_CHADDR + 2]; |
dkato | 0:1c2747611cab | 90 | chaddr_tbl[tbl_index][3] = receivebuff[OFS_CHADDR + 3]; |
dkato | 0:1c2747611cab | 91 | chaddr_tbl[tbl_index][4] = receivebuff[OFS_CHADDR + 4]; |
dkato | 0:1c2747611cab | 92 | chaddr_tbl[tbl_index][5] = receivebuff[OFS_CHADDR + 5]; |
dkato | 0:1c2747611cab | 93 | sendbuff[OFS_YIADDR + 0] = sendbuff[OFS_SIADDR + 0]; |
dkato | 0:1c2747611cab | 94 | sendbuff[OFS_YIADDR + 1] = sendbuff[OFS_SIADDR + 1]; |
dkato | 0:1c2747611cab | 95 | sendbuff[OFS_YIADDR + 2] = sendbuff[OFS_SIADDR + 2]; |
dkato | 0:1c2747611cab | 96 | sendbuff[OFS_YIADDR + 3] = IP_ADDER_START + tbl_index; |
dkato | 0:1c2747611cab | 97 | } |
dkato | 2:4a34731d231e | 98 | dhcp_server.sendto(client, sendbuff, 300); |
dkato | 0:1c2747611cab | 99 | } else if (receivebuff[OFS_OPTIONS + 2] == DHCP_REQUEST) { |
dkato | 0:1c2747611cab | 100 | if (tbl_index != -1) { |
dkato | 0:1c2747611cab | 101 | sendbuff[OFS_OPTIONS + 2] = DHCP_ACK; |
dkato | 0:1c2747611cab | 102 | } else { |
dkato | 0:1c2747611cab | 103 | sendbuff[OFS_OPTIONS + 2] = DHCP_NAK; |
dkato | 0:1c2747611cab | 104 | } |
dkato | 2:4a34731d231e | 105 | dhcp_server.sendto(client, sendbuff, 300); |
dkato | 0:1c2747611cab | 106 | } else if (receivebuff[OFS_OPTIONS + 2] == DHCP_RELEASE) { |
dkato | 0:1c2747611cab | 107 | if (tbl_index != -1) { |
dkato | 0:1c2747611cab | 108 | memset(chaddr_tbl[tbl_index], 0, 6); |
dkato | 0:1c2747611cab | 109 | } |
dkato | 0:1c2747611cab | 110 | } else { |
dkato | 0:1c2747611cab | 111 | // do nothing |
dkato | 0:1c2747611cab | 112 | } |
dkato | 0:1c2747611cab | 113 | } |
dkato | 0:1c2747611cab | 114 | } |
dkato | 0:1c2747611cab | 115 | } |
dkato | 0:1c2747611cab | 116 | |
dkato | 2:4a34731d231e | 117 | DhcpServer::DhcpServer(NetworkInterface *net, char * name) : |
dkato | 2:4a34731d231e | 118 | dhcp_server(net), dhcpThread(osPriorityNormal, (1024 * 8)) { |
dkato | 2:4a34731d231e | 119 | uint32_t i; |
dkato | 2:4a34731d231e | 120 | uint32_t len; |
dkato | 2:4a34731d231e | 121 | uint32_t ofs; |
dkato | 0:1c2747611cab | 122 | |
dkato | 2:4a34731d231e | 123 | receivebuff = new char[500]; |
dkato | 2:4a34731d231e | 124 | sendbuff = new char[300]; |
dkato | 2:4a34731d231e | 125 | memset(sendbuff, 0, 300); |
dkato | 2:4a34731d231e | 126 | memset(chaddr_tbl, 0, sizeof(chaddr_tbl)); |
dkato | 2:4a34731d231e | 127 | |
dkato | 2:4a34731d231e | 128 | sscanf(net->get_ip_address(), "%d.%d.%d.%d", (int *)&sendbuff[OFS_SIADDR + 0], (int *)&sendbuff[OFS_SIADDR + 1], |
dkato | 0:1c2747611cab | 129 | (int *)&sendbuff[OFS_SIADDR + 2], (int *)&sendbuff[OFS_SIADDR + 3]); |
dkato | 0:1c2747611cab | 130 | |
dkato | 0:1c2747611cab | 131 | len = strlen(name); |
dkato | 0:1c2747611cab | 132 | for (i = 0; (i < len) && (i < DHCP_SNAME_LEN); i++) { |
dkato | 0:1c2747611cab | 133 | sendbuff[OFS_SNAME + i] = name[i]; |
dkato | 0:1c2747611cab | 134 | } |
dkato | 0:1c2747611cab | 135 | |
dkato | 0:1c2747611cab | 136 | sendbuff[0] = 0x02; |
dkato | 0:1c2747611cab | 137 | sendbuff[1] = 0x01; |
dkato | 0:1c2747611cab | 138 | sendbuff[2] = 0x06; |
dkato | 0:1c2747611cab | 139 | sendbuff[3] = 0x00; |
dkato | 0:1c2747611cab | 140 | |
dkato | 0:1c2747611cab | 141 | sendbuff[OFS_COOKIE + 0] = 0x63; |
dkato | 0:1c2747611cab | 142 | sendbuff[OFS_COOKIE + 1] = 0x82; |
dkato | 0:1c2747611cab | 143 | sendbuff[OFS_COOKIE + 2] = 0x53; |
dkato | 0:1c2747611cab | 144 | sendbuff[OFS_COOKIE + 3] = 0x63; |
dkato | 0:1c2747611cab | 145 | |
dkato | 0:1c2747611cab | 146 | ofs = OFS_OPTIONS; |
dkato | 0:1c2747611cab | 147 | sendbuff[ofs++] = DHCP_OPTION_MESSAGE_TYPE; |
dkato | 0:1c2747611cab | 148 | sendbuff[ofs++] = DHCP_OPTION_MESSAGE_TYPE_LEN; |
dkato | 0:1c2747611cab | 149 | sendbuff[ofs++] = 0; |
dkato | 0:1c2747611cab | 150 | |
dkato | 0:1c2747611cab | 151 | sendbuff[ofs++] = DHCP_OPTION_SERVER_ID; |
dkato | 0:1c2747611cab | 152 | sendbuff[ofs++] = 0x04; |
dkato | 0:1c2747611cab | 153 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 0]; |
dkato | 0:1c2747611cab | 154 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 1]; |
dkato | 0:1c2747611cab | 155 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 2]; |
dkato | 0:1c2747611cab | 156 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 3]; |
dkato | 0:1c2747611cab | 157 | |
dkato | 0:1c2747611cab | 158 | sendbuff[ofs++] = DHCP_OPTION_LEASE_TIME; |
dkato | 0:1c2747611cab | 159 | sendbuff[ofs++] = 0x04; |
dkato | 0:1c2747611cab | 160 | sendbuff[ofs++] = 0x00; |
dkato | 0:1c2747611cab | 161 | sendbuff[ofs++] = 0x01; |
dkato | 0:1c2747611cab | 162 | sendbuff[ofs++] = 0x4e; |
dkato | 0:1c2747611cab | 163 | sendbuff[ofs++] = 0x20; |
dkato | 0:1c2747611cab | 164 | |
dkato | 0:1c2747611cab | 165 | sendbuff[ofs++] = DHCP_OPTION_SUBNET_MASK; |
dkato | 0:1c2747611cab | 166 | sendbuff[ofs++] = 0x04; |
dkato | 0:1c2747611cab | 167 | sendbuff[ofs++] = 0xff; |
dkato | 0:1c2747611cab | 168 | sendbuff[ofs++] = 0xff; |
dkato | 0:1c2747611cab | 169 | sendbuff[ofs++] = 0xff; |
dkato | 0:1c2747611cab | 170 | sendbuff[ofs++] = 0xf0; |
dkato | 0:1c2747611cab | 171 | |
dkato | 0:1c2747611cab | 172 | sendbuff[ofs++] = DHCP_OPTION_ROUTER; |
dkato | 0:1c2747611cab | 173 | sendbuff[ofs++] = 0x04; |
dkato | 0:1c2747611cab | 174 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 0]; |
dkato | 0:1c2747611cab | 175 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 1]; |
dkato | 0:1c2747611cab | 176 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 2]; |
dkato | 0:1c2747611cab | 177 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 3]; |
dkato | 0:1c2747611cab | 178 | |
dkato | 0:1c2747611cab | 179 | sendbuff[ofs++] = DHCP_OPTION_DNS_SERVER; |
dkato | 0:1c2747611cab | 180 | sendbuff[ofs++] = 0x04; |
dkato | 0:1c2747611cab | 181 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 0]; |
dkato | 0:1c2747611cab | 182 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 1]; |
dkato | 0:1c2747611cab | 183 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 2]; |
dkato | 0:1c2747611cab | 184 | sendbuff[ofs++] = sendbuff[OFS_SIADDR + 3]; |
dkato | 0:1c2747611cab | 185 | |
dkato | 0:1c2747611cab | 186 | sendbuff[ofs++] = 0xff; |
dkato | 0:1c2747611cab | 187 | |
dkato | 2:4a34731d231e | 188 | dhcpThread.start(callback(this, &DhcpServer::dhcp_process)); |
dkato | 0:1c2747611cab | 189 | } |
dkato | 0:1c2747611cab | 190 | |
dkato | 0:1c2747611cab | 191 | DhcpServer::~DhcpServer() { |
dkato | 2:4a34731d231e | 192 | delete [] receivebuff; |
dkato | 2:4a34731d231e | 193 | delete [] sendbuff; |
dkato | 0:1c2747611cab | 194 | } |