DhcpServer library for mbed-os.

Fork of DhcpServer by Daiki Kato

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(&eth, "HostName");


Library in Beta!

This library is in Beta.
このライブラリはβ版です。

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?

UserRevisionLine numberNew 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 }