/src/framework/tcpip/src/tcpip_commands.c

https://github.com/ufanders/wordClock · C · 2009 lines · 1664 code · 285 blank · 60 comment · 335 complexity · 953ba59a5682086cb4df7d625a23936e MD5 · raw file

Large files are truncated click here to view the full file

  1. /*******************************************************************************
  2. TCP/IP commands implementation
  3. Summary:
  4. Module for Microchip TCP/IP Stack
  5. Description:
  6. TCPIP stack commands entities.
  7. Note, this module is based on system command parser
  8. *******************************************************************************/
  9. /*******************************************************************************
  10. File Name: tcpip_commands.c
  11. Copyright Š2012 released Microchip Technology Inc. All rights
  12. reserved.
  13. Microchip licenses to you the right to use, modify, copy and distribute
  14. Software only when embedded on a Microchip microcontroller or digital signal
  15. controller that is integrated into your product or third party product
  16. (pursuant to the sublicense terms in the accompanying license agreement).
  17. You should refer to the license agreement accompanying this Software for
  18. additional information regarding your rights and obligations.
  19. SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS?WITHOUT WARRANTY OF ANY KIND,
  20. EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
  21. MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
  22. IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
  23. CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
  24. OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
  25. INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
  26. CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
  27. SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
  28. (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
  29. *******************************************************************************/
  30. #include "tcpip/src/tcpip_private.h"
  31. #include "tcpip/tcpip_manager.h"
  32. #include "system/tmr/sys_tmr.h"
  33. #if defined(TCPIP_IF_MRF24W)
  34. #include "driver/wifi/mrf24w/drv_wifi.h"
  35. #endif // defined(TCPIP_IF_MRF24W)
  36. #if defined(TCPIP_STACK_COMMAND_ENABLE)
  37. #define TCPIP_THIS_MODULE_ID TCPIP_MODULE_TCPIP_COMMAND
  38. static int initialNetIfs = 0; // Backup interfaces number for stack restart
  39. static TCPIP_HEAP_HANDLE initialHeapH = 0;
  40. #if defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  41. typedef struct
  42. {
  43. size_t stgSize; // size + valid flag
  44. TCPIP_STACK_NET_IF_DCPT netDcptStg; // configuration save
  45. #if defined(TCPIP_STACK_USE_IPV6)
  46. uint8_t restoreBuff[sizeof(TCPIP_NETWORK_CONFIG) + 170]; // buffer to restore the configuration
  47. #else
  48. uint8_t restoreBuff[sizeof(TCPIP_NETWORK_CONFIG) + 120]; // buffer to restore the configuration
  49. #endif // defined(TCPIP_STACK_USE_IPV6)
  50. }TCPIP_COMMAND_STG_DCPT;
  51. static TCPIP_COMMAND_STG_DCPT* pCmdStgDcpt = 0; // store current interface configuration
  52. static TCPIP_NETWORK_CONFIG* pCmdNetConf = 0; // create the array of configurations needed for stack initialization
  53. static bool tcpipCmdPreserveSavedInfo = false; // do not discard the saved data
  54. #endif // defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  55. #if defined(TCPIP_STACK_USE_DNS_SERVER)
  56. typedef enum
  57. {
  58. DNSS_COMD_ADD=0,
  59. DNSS_COMD_DEL,
  60. DNSS_COMD_INFO,
  61. DNSS_COMD_NONE,
  62. }DNSS_COMD_TYPE;
  63. typedef struct
  64. {
  65. char *command;
  66. DNSS_COMD_TYPE val;
  67. }DNSS_COMMAND_MAP;
  68. #endif
  69. static int _Command_AddressService(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv, TCPIP_STACK_ADDRESS_SERVICE_TYPE svcType);
  70. static int _Command_NetInfo(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  71. static int _Command_DefaultInterfaceSet (_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  72. static int CommandDhcpOptions(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  73. static int _Command_DHCPSOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  74. static int _Command_ZcllOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  75. static int _Command_IPAddressSet(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  76. static int _Command_GatewayAddressSet(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  77. static int _Command_PrimaryDNSAddressSet(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  78. static int _Command_BIOSNameSet(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  79. static int _Command_MACAddressSet(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  80. static int _Command_NetworkOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  81. static int _Command_StackOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  82. static int _Command_HeapInfo(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  83. static int CommandArp(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  84. static int _Command_DNSOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  85. static int _Command_DNSSOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  86. static int _Command_MacInfo(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  87. #if defined(TCPIP_STACK_USE_DHCP_SERVER)
  88. static int _Command_DHCPLeaseInfo(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  89. #endif // defined(TCPIP_STACK_USE_DHCP_SERVER)
  90. #if defined(TCPIP_STACK_USE_DNS_SERVER)
  91. static int _Command_AddDelDNSSrvAddress(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  92. static int _Command_ShowDNDServInfo(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  93. #endif
  94. #if defined(TCPIP_STACK_USE_ICMP_CLIENT)
  95. #define TCPIP_COMMAND_ICMP_ECHO_REQUEST_MIN_DELAY 5 // minimum delay between successive echo requests
  96. // ping command task status
  97. typedef enum
  98. {
  99. TCPIP_PING_CMD_IDLE = 0, // ping task is idle
  100. TCPIP_PING_CMD_DNS_GET, // get DNS
  101. TCPIP_PING_CMD_DNS_WAIT, // wait for DNS
  102. TCPIP_PING_CMD_DO_PING, // send pings
  103. }TCPIP_PING_CMD_STAT;
  104. static int CommandPing(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv);
  105. static void CommandPingHandler(TCPIP_NET_HANDLE hNetIf, IPV4_ADDR * remoteIP, void * data);
  106. static void _PingStop(_CMDIO_DEV_NODE* pCmdIO, const void* cmdIoParam);
  107. static tcpipAsyncHandle icmptickH = 0; // tick handle
  108. static char icmpTargetHost[31]; // current target host name
  109. static char icmpTargetAddrStr[17]; // current target address string
  110. static IPV4_ADDR icmpTargetAddr; // current target address
  111. static uint16_t icmpSequenceNo; // current sequence number
  112. static uint16_t icmpIdentifier; // current ID number
  113. static int icmpReqNo; // number of requests to send
  114. static int icmpReqCount; // current request counter
  115. static int icmpAckRecv; // number of acks
  116. static int icmpReqDelay;
  117. static ICMP_HANDLE hIcmp = 0;
  118. static _CMDIO_DEV_NODE* pIcmpCmd = 0;
  119. static const void* icmpCmdIoParam = 0;
  120. uint32_t icmpStartTick;
  121. static TCPIP_NET_HANDLE icmpNetH = 0;
  122. static TCPIP_PING_CMD_STAT icmpCmdStat = TCPIP_PING_CMD_IDLE;
  123. #endif // defined(TCPIP_STACK_USE_ICMP_CLIENT)
  124. // TCPIP stack command table
  125. static const _SYS_CMD_DCPT tcpipCmdTbl[]=
  126. {
  127. {"netinfo", _Command_NetInfo, ": Get network information"},
  128. {"defnet", _Command_DefaultInterfaceSet, ": Set default network interface"},
  129. {"dhcp", CommandDhcpOptions, ": DHCP client commands"},
  130. {"dhcps", _Command_DHCPSOnOff, ": Turn DHCP server on/off"},
  131. {"zcll", _Command_ZcllOnOff, ": Turn ZCLL on/off"},
  132. {"setip", _Command_IPAddressSet, ": Set IP address and mask"},
  133. {"setgw", _Command_GatewayAddressSet, ": Set Gateway address"},
  134. {"setdns", _Command_PrimaryDNSAddressSet, ": Set DNS address"},
  135. {"setbios", _Command_BIOSNameSet, ": Set host's NetBIOS name"},
  136. {"setmac", _Command_MACAddressSet, ": Set MAC address"},
  137. {"if", _Command_NetworkOnOff, ": Bring an interface up/down"},
  138. {"stack", _Command_StackOnOff, ": Stack turn on/off"},
  139. {"heapinfo", _Command_HeapInfo, ": Check heap status"},
  140. #if defined(TCPIP_STACK_USE_DHCP_SERVER)
  141. {"dhcpsinfo", _Command_DHCPLeaseInfo, ": Display DHCP Server Lease Details" },
  142. #endif // defined(TCPIP_STACK_USE_DHCP_SERVER)
  143. #if defined(TCPIP_STACK_USE_ICMP_CLIENT)
  144. {"ping", CommandPing, ": Ping an IP address"},
  145. #endif // defined(TCPIP_STACK_USE_ICMP_CLIENT)
  146. {"arp", CommandArp, ": arp commands"},
  147. {"dnsc", _Command_DNSOnOff, ": Turn DNS client on/off"},
  148. {"dnss", _Command_DNSSOnOff, ": Turn DNS server on/off"},
  149. #if defined(TCPIP_STACK_USE_DNS_SERVER)
  150. {"dnsserv", _Command_AddDelDNSSrvAddress, ": Add DNS server IP address"},
  151. #endif
  152. {"macinfo", _Command_MacInfo, ": Check MAC statistics"},
  153. };
  154. bool TCPIP_Commands_Initialize(const TCPIP_STACK_MODULE_CTRL* const stackCtrl, const TCPIPCMD_MODULE_CONFIG* const pCmdInit)
  155. {
  156. if(stackCtrl->stackAction == TCPIP_STACK_ACTION_IF_UP)
  157. { // interface restart
  158. return true;
  159. }
  160. // stack init
  161. initialNetIfs = stackCtrl->nIfs;
  162. initialHeapH = stackCtrl->memH;
  163. // create command group
  164. if (!_SYS_COMMAND_ADDGRP(tcpipCmdTbl, sizeof(tcpipCmdTbl)/sizeof(*tcpipCmdTbl), "tcpip", ": stack commands"))
  165. {
  166. SYS_ERROR(SYS_ERROR_ERROR, "Failed to create TCPIP Commands\r\n");
  167. return false;
  168. }
  169. #if defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  170. // get storage for interfaces configuration
  171. // cannot be taken from the TCPIP-HEAP because we need it persistent after
  172. // TCPIP_STACK_Deinit() is called!
  173. if(pCmdStgDcpt == 0 && pCmdNetConf == 0)
  174. {
  175. pCmdStgDcpt = (TCPIP_COMMAND_STG_DCPT*)SystemCalloc(initialNetIfs, sizeof(*pCmdStgDcpt));
  176. pCmdNetConf = (TCPIP_NETWORK_CONFIG*)SystemCalloc(initialNetIfs, sizeof(*pCmdNetConf));
  177. if(pCmdStgDcpt == 0 || pCmdNetConf == 0)
  178. { // failure is not considered to be catastrophic
  179. SYS_ERROR(SYS_ERROR_WARN, "Failed to create TCPIP Commands Storage/Config\r\n");
  180. }
  181. }
  182. #endif // defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  183. #if defined(TCPIP_IF_MRF24W) && defined(TCPIP_STACK_COMMANDS_WIFI_ENABLE)
  184. WIFICommandsInit();
  185. #endif
  186. #if defined(TCPIP_STACK_USE_ICMP_CLIENT)
  187. hIcmp = 0;
  188. icmptickH = _TCPIPStackAsyncHandlerRegister(TCPIPCommandsTask, 0, 0);
  189. if(icmptickH == 0)
  190. { // timer is not active now
  191. SYS_ERROR(SYS_ERROR_ERROR, "ICMP tick registration failed\r\n");
  192. return false;
  193. }
  194. // else the timer will start when we send a query
  195. icmpCmdStat = TCPIP_PING_CMD_IDLE;
  196. icmpAckRecv = 0;
  197. #endif // defined(TCPIP_STACK_USE_ICMP_CLIENT)
  198. return true;
  199. }
  200. void TCPIP_Commands_Deinitialize(const TCPIP_STACK_MODULE_CTRL* const stackCtrl)
  201. {
  202. // if(stackCtrl->stackAction == TCPIP_STACK_ACTION_DEINIT) // stack shut down
  203. // if(stackCtrl->stackAction == TCPIP_STACK_ACTION_IF_DOWN) // interface down
  204. if(stackCtrl->stackAction == TCPIP_STACK_ACTION_DEINIT)
  205. { // whole stack is going down
  206. #if defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  207. if(tcpipCmdPreserveSavedInfo == false)
  208. {
  209. SystemFree(pCmdStgDcpt);
  210. SystemFree(pCmdNetConf);
  211. pCmdStgDcpt = 0;
  212. pCmdNetConf = 0;
  213. }
  214. #endif // defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  215. #if defined(TCPIP_STACK_USE_ICMP_CLIENT)
  216. if(icmptickH != 0)
  217. {
  218. _TCPIPStackAsyncHandlerDeRegister(icmptickH);
  219. icmptickH = 0;
  220. }
  221. #endif // defined(TCPIP_STACK_USE_ICMP_CLIENT)
  222. }
  223. }
  224. static int _Command_NetInfo(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  225. {
  226. int i;
  227. TCPIP_NET_HANDLE netH;
  228. IPV4_ADDR ipAddr;
  229. const TCPIP_MAC_ADDR* pMac;
  230. TCPIP_NET_IF* pNetIf;
  231. TCPIP_STACK_MODULE macID;
  232. const char *hostName, *msgAdd;
  233. const void* cmdIoParam = pCmdIO->cmdIoParam;
  234. #if defined(TCPIP_STACK_USE_IPV6)
  235. IPV6_ADDR_STRUCT currIpv6Add;
  236. IPV6_ADDR_HANDLE prevHandle, nextHandle;
  237. char addrBuff[44];
  238. #else
  239. char addrBuff[20];
  240. #endif // defined(TCPIP_STACK_USE_IPV6)
  241. if (argc > 2)
  242. {
  243. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: netinfo\r\n");
  244. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: netinfo\r\n");
  245. return false;
  246. }
  247. for (i=0; i<initialNetIfs; i++)
  248. {
  249. netH = TCPIP_STACK_IndexToNet(i);
  250. pNetIf = _TCPIPStackHandleToNet(netH);
  251. macID = TCPIP_STACK_NetMACId(pNetIf);
  252. (*pCmdIO->pCmdApi->print)(cmdIoParam, "---------- Interface <%s> ---------- \r\n", TCPIP_STACK_MACIdToString(macID));
  253. if(!TCPIP_STACK_NetIsUp(netH))
  254. {
  255. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Interface is down\r\n");
  256. continue;
  257. }
  258. hostName = TCPIP_STACK_NetBIOSName(netH);
  259. #if defined(TCPIP_STACK_USE_NBNS)
  260. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Host Name: %s - NBNS enabled\r\n", hostName);
  261. #else
  262. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Host Name: %s - NBNS disabled \r\n", hostName);
  263. #endif // defined(TCPIP_STACK_USE_NBNS)
  264. ipAddr.Val = TCPIP_STACK_NetAddress(netH);
  265. TCPIP_Helper_IPAddressToString(&ipAddr, addrBuff, sizeof(addrBuff));
  266. (*pCmdIO->pCmdApi->print)(cmdIoParam, "IPv4 Address: %s\r\n", addrBuff);
  267. ipAddr.Val = TCPIP_STACK_NetMask(netH);
  268. TCPIP_Helper_IPAddressToString(&ipAddr, addrBuff, sizeof(addrBuff));
  269. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Mask: %s\r\n", addrBuff);
  270. ipAddr.Val = TCPIP_STACK_NetAddressGateway(netH);
  271. TCPIP_Helper_IPAddressToString(&ipAddr, addrBuff, sizeof(addrBuff));
  272. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Gateway: %s\r\n", addrBuff);
  273. ipAddr.Val = TCPIP_STACK_NetAddressDnsPrimary(netH);
  274. TCPIP_Helper_IPAddressToString(&ipAddr, addrBuff, sizeof(addrBuff));
  275. (*pCmdIO->pCmdApi->print)(cmdIoParam, "DNS: %s\r\n", addrBuff);
  276. pMac = (const TCPIP_MAC_ADDR*)TCPIP_STACK_NetAddressMac(netH);
  277. TCPIP_Helper_MACAddressToString(pMac, addrBuff, sizeof(addrBuff));
  278. (*pCmdIO->pCmdApi->print)(cmdIoParam, "MAC Address: %s\r\n", addrBuff);
  279. // display IPv6 addresses
  280. #if defined(TCPIP_STACK_USE_IPV6)
  281. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "IPv6 Unicast addresses:\r\n");
  282. prevHandle = 0;
  283. do
  284. {
  285. nextHandle = TCPIP_STACK_NetIPv6AddressGet(netH, IPV6_ADDR_TYPE_UNICAST, &currIpv6Add, prevHandle);
  286. if(nextHandle)
  287. { // have a valid address; display it
  288. TCPIP_Helper_IPv6AddressToString(&currIpv6Add.address, addrBuff, sizeof(addrBuff));
  289. (*pCmdIO->pCmdApi->print)(cmdIoParam, " %s\r\n", addrBuff);
  290. prevHandle = nextHandle;
  291. }
  292. }while(nextHandle != 0);
  293. if(prevHandle == 0)
  294. { // no valid address
  295. (*pCmdIO->pCmdApi->msg)(cmdIoParam, " Unknown\r\n");
  296. }
  297. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "IPv6 Multicast addresses:\r\n");
  298. prevHandle = 0;
  299. do
  300. {
  301. nextHandle = TCPIP_STACK_NetIPv6AddressGet(netH, IPV6_ADDR_TYPE_MULTICAST, &currIpv6Add, prevHandle);
  302. if(nextHandle)
  303. { // have a valid address; display it
  304. TCPIP_Helper_IPv6AddressToString(&currIpv6Add.address, addrBuff, sizeof(addrBuff));
  305. (*pCmdIO->pCmdApi->print)(cmdIoParam, " %s\r\n", addrBuff);
  306. prevHandle = nextHandle;
  307. }
  308. }while(nextHandle != 0);
  309. if(prevHandle == 0)
  310. { // no valid address
  311. (*pCmdIO->pCmdApi->msg)(cmdIoParam, " Unknown\r\n");
  312. }
  313. #endif // defined(TCPIP_STACK_USE_IPV6)
  314. if(TCPIP_DHCP_IsEnabled(netH))
  315. {
  316. msgAdd = "dhcp";
  317. }
  318. else if(TCPIP_ZCLL_IsEnabled(netH))
  319. {
  320. msgAdd = "zcll";
  321. }
  322. else if(TCPIP_DHCPS_IsEnabled(netH))
  323. {
  324. msgAdd = "dhcps";
  325. }
  326. else
  327. {
  328. msgAdd = "default IP address";
  329. }
  330. (*pCmdIO->pCmdApi->print)(cmdIoParam, "%s is ON\r\n", msgAdd);
  331. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Link is %s\r\n", TCPIP_STACK_NetIsLinked(netH) ? "UP" : "DOWN");
  332. }
  333. return true;
  334. }
  335. #if defined(TCPIP_STACK_USE_DHCP_SERVER)
  336. static int _Command_DHCPLeaseInfo(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  337. {
  338. TCPIP_NET_HANDLE netH;
  339. TCPIP_DHCPS_LEASE_HANDLE prevLease, nextLease;
  340. TCPIP_DHCPS_LEASE_ENTRY leaseEntry;
  341. char addrBuff[20];
  342. const void* cmdIoParam = pCmdIO->cmdIoParam;
  343. if (argc != 2)
  344. {
  345. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: dhcpsinfo <interface> \r\n");
  346. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: dhcpsinfo PIC32INT \r\n");
  347. return false;
  348. }
  349. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  350. if (netH == 0)
  351. {
  352. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface specified \r\n");
  353. return false;
  354. }
  355. (*pCmdIO->pCmdApi->print)(cmdIoParam,"MAC Address IPAddress RemainingLeaseTime \r\n",0);
  356. prevLease = 0;
  357. do
  358. {
  359. nextLease = TCPIP_DHCPS_LeaseEntryGet(netH, &leaseEntry, prevLease);
  360. if(!nextLease)
  361. {
  362. (*pCmdIO->pCmdApi->print)(cmdIoParam, " \n\r No more entry present \r\n", 0);
  363. }
  364. if(nextLease)
  365. { // valid info
  366. // display info
  367. TCPIP_Helper_MACAddressToString(&leaseEntry.hwAdd, addrBuff, sizeof(addrBuff));
  368. (*pCmdIO->pCmdApi->msg)(cmdIoParam, addrBuff);
  369. TCPIP_Helper_IPAddressToString(&leaseEntry.ipAddress, addrBuff, sizeof(addrBuff));
  370. (*pCmdIO->pCmdApi->print)(cmdIoParam, " %s ", addrBuff);
  371. (*pCmdIO->pCmdApi->print)(cmdIoParam, " %d Secs\r\n", leaseEntry.leaseTime/SYS_TMR_TickPerSecond());
  372. prevLease = nextLease;
  373. }
  374. }while(nextLease != 0);
  375. return true;
  376. }
  377. #endif // defined(TCPIP_STACK_USE_DHCP_SERVER)
  378. static int _Command_DefaultInterfaceSet (_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  379. {
  380. TCPIP_NET_HANDLE netH;
  381. const void* cmdIoParam = pCmdIO->cmdIoParam;
  382. if (argc != 2)
  383. {
  384. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: defnet <interface>\r\n");
  385. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: defnet PIC32INT\r\n");
  386. return false;
  387. }
  388. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  389. if (netH == 0)
  390. {
  391. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface specified \r\n");
  392. return false;
  393. }
  394. if(TCPIP_STACK_NetDefaultSet(netH))
  395. {
  396. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Default interface set successful\r\n");
  397. }
  398. else
  399. {
  400. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Operation not accepted\r\n");
  401. }
  402. return true;
  403. }
  404. static int CommandDhcpOptions(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  405. {
  406. TCPIP_NET_HANDLE netH;
  407. IPV4_ADDR reqIpAddr;
  408. bool dhcpRes;
  409. int opCode = 0;
  410. const void* cmdIoParam = pCmdIO->cmdIoParam;
  411. if (argc < 3)
  412. {
  413. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Usage: %s <interface> <on/off/renew/request> \r\n", argv[0]);
  414. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Ex: %s PIC32INT on \r\n", argv[0]);
  415. return false;
  416. }
  417. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  418. if (netH == 0)
  419. {
  420. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface\r\n");
  421. return false;
  422. }
  423. if (strcmp(argv[2], "on") == 0)
  424. { // turning on a service
  425. opCode = 1;
  426. }
  427. else if (strcmp(argv[2], "off") == 0)
  428. { // turning off a service
  429. opCode = 2;
  430. }
  431. else if (strcmp(argv[2], "renew") == 0)
  432. { // DHCP renew
  433. opCode = 3;
  434. }
  435. else if (strcmp(argv[2], "request") == 0)
  436. { // DHCP request
  437. opCode = 4;
  438. if(argc < 4)
  439. {
  440. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Request needs an IP address\r\n");
  441. return false;
  442. }
  443. if (!TCPIP_Helper_StringToIPAddress(argv[3], &reqIpAddr))
  444. {
  445. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Invalid IP address string \r\n");
  446. return false;
  447. }
  448. }
  449. else
  450. {
  451. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown option\r\n");
  452. return false;
  453. }
  454. switch(opCode)
  455. {
  456. case 1:
  457. dhcpRes = TCPIP_DHCP_Enable(netH);
  458. break;
  459. case 2:
  460. dhcpRes = TCPIP_DHCP_Disable(netH);
  461. break;
  462. case 3:
  463. dhcpRes = TCPIP_DHCP_Renew(netH);
  464. break;
  465. case 4:
  466. dhcpRes = TCPIP_DHCP_Request(netH, reqIpAddr);
  467. break;
  468. default:
  469. dhcpRes = false;
  470. break;
  471. }
  472. (*pCmdIO->pCmdApi->print)(cmdIoParam, "%s %s %s\r\n", argv[0], argv[2], dhcpRes ? "succes" : "fail");
  473. return true;
  474. }
  475. static int _Command_DHCPSOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  476. {
  477. return _Command_AddressService(pCmdIO, argc, argv, TCPIP_STACK_ADDRESS_SERVICE_DHCPS);
  478. }
  479. static int _Command_ZcllOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  480. {
  481. return _Command_AddressService(pCmdIO, argc, argv, TCPIP_STACK_ADDRESS_SERVICE_ZCLL);
  482. }
  483. static int _Command_AddressService(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv, TCPIP_STACK_ADDRESS_SERVICE_TYPE svcType)
  484. {
  485. typedef bool(*addSvcFnc)(TCPIP_NET_HANDLE hNet);
  486. TCPIP_NET_HANDLE netH;
  487. addSvcFnc addFnc;
  488. bool addRes, svcEnable;
  489. const char *msgOK, *msgFail;
  490. const void* cmdIoParam = pCmdIO->cmdIoParam;
  491. if (argc != 3)
  492. {
  493. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Usage: %s <interface> <on/off> \r\n", argv[0]);
  494. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Ex: %s PIC32INT on \r\n", argv[0]);
  495. return false;
  496. }
  497. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  498. if (netH == 0)
  499. {
  500. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface\r\n");
  501. return false;
  502. }
  503. if (memcmp(argv[2], "on", 2) == 0)
  504. { // turning on a service
  505. svcEnable = true;
  506. }
  507. else if (memcmp(argv[2], "off", 2) == 0)
  508. { // turning off a service
  509. svcEnable = false;
  510. }
  511. else
  512. {
  513. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown option\r\n");
  514. return false;
  515. }
  516. switch(svcType)
  517. {
  518. case TCPIP_STACK_ADDRESS_SERVICE_DHCPC:
  519. addFnc = svcEnable?TCPIP_DHCP_Enable:TCPIP_DHCP_Disable;
  520. break;
  521. case TCPIP_STACK_ADDRESS_SERVICE_DHCPS:
  522. addFnc = svcEnable?TCPIP_DHCPS_Enable:TCPIP_DHCPS_Disable;
  523. break;
  524. case TCPIP_STACK_ADDRESS_SERVICE_ZCLL:
  525. addFnc = svcEnable?TCPIP_ZCLL_Enable:TCPIP_ZCLL_Disable;
  526. break;
  527. default:
  528. addFnc = 0; // unknown service; shouldn't happen
  529. break;
  530. }
  531. if(addFnc)
  532. {
  533. msgOK = svcEnable?"enabled":"disabled";
  534. msgFail = svcEnable?"enable":"disable";
  535. addRes = (*addFnc)(netH);
  536. if(addRes)
  537. {
  538. (*pCmdIO->pCmdApi->print)(cmdIoParam, "%s %s\r\n", argv[0], msgOK);
  539. }
  540. else
  541. {
  542. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Failed to %s %s\r\n", msgFail, argv[0]);
  543. }
  544. }
  545. return true;
  546. }
  547. static int _Command_DNSSOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  548. {
  549. typedef bool(*addSvcFnc)(TCPIP_NET_HANDLE hNet);
  550. TCPIP_NET_HANDLE netH;
  551. addSvcFnc addFnc;
  552. bool addRes, svcEnable;
  553. const char *msgOK, *msgFail;
  554. const void* cmdIoParam = pCmdIO->cmdIoParam;
  555. if (argc != 3)
  556. {
  557. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Usage: %s <interface> <on/off> \r\n", argv[0]);
  558. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Ex: %s PIC32INT on \r\n", argv[0]);
  559. return false;
  560. }
  561. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  562. if (netH == 0)
  563. {
  564. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface\r\n");
  565. return false;
  566. }
  567. if (memcmp(argv[2], "on", 2) == 0)
  568. { // turning on a service
  569. svcEnable = true;
  570. }
  571. else if (memcmp(argv[2], "off", 2) == 0)
  572. { // turning off a service
  573. svcEnable = false;
  574. }
  575. else
  576. {
  577. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown option\r\n");
  578. return false;
  579. }
  580. addFnc = svcEnable?TCPIP_DNSS_Enable:TCPIP_DNSS_Disable;
  581. msgOK = svcEnable?"enabled":"disabled";
  582. msgFail = svcEnable?"enable":"disable";
  583. addRes = (*addFnc)(netH);
  584. if(addRes)
  585. {
  586. (*pCmdIO->pCmdApi->print)(cmdIoParam, "%s %s\r\n", argv[0], msgOK);
  587. }
  588. else
  589. {
  590. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Failed to %s %s\r\n", msgFail, argv[0]);
  591. }
  592. return true;
  593. }
  594. static int _Command_DNSOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  595. {
  596. typedef bool(*addSvcFnc)(TCPIP_NET_HANDLE hNet);
  597. TCPIP_NET_HANDLE netH;
  598. addSvcFnc addFnc;
  599. bool addRes, svcEnable;
  600. const char *msgOK, *msgFail;
  601. const void* cmdIoParam = pCmdIO->cmdIoParam;
  602. if (argc != 3)
  603. {
  604. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Usage: %s <interface> <on/off> \r\n", argv[0]);
  605. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Ex: %s PIC32INT on \r\n", argv[0]);
  606. return false;
  607. }
  608. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  609. if (netH == 0)
  610. {
  611. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface\r\n");
  612. return false;
  613. }
  614. if (memcmp(argv[2], "on", 2) == 0)
  615. { // turning on a service
  616. svcEnable = true;
  617. }
  618. else if (memcmp(argv[2], "off", 2) == 0)
  619. { // turning off a service
  620. svcEnable = false;
  621. }
  622. else
  623. {
  624. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown option\r\n");
  625. return false;
  626. }
  627. addFnc = svcEnable?TCPIP_DNS_Enable:TCPIP_DNS_Disable;
  628. msgOK = svcEnable?"enabled":"disabled";
  629. msgFail = svcEnable?"enable":"disable";
  630. addRes = (*addFnc)(netH);
  631. if(addRes)
  632. {
  633. (*pCmdIO->pCmdApi->print)(cmdIoParam, "%s %s\r\n", argv[0], msgOK);
  634. }
  635. else
  636. {
  637. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Failed to %s %s\r\n", msgFail, argv[0]);
  638. }
  639. return true;
  640. }
  641. static int _Command_IPAddressSet(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  642. {
  643. TCPIP_NET_HANDLE netH;
  644. TCPIP_NET_IF* pNetIf;
  645. IP_ADDRESS_TYPE addType;
  646. #if defined(TCPIP_STACK_USE_IPV4)
  647. IPV4_ADDR ipAddr, ipMask;
  648. IPV4_ADDR* pMask;
  649. #endif // defined(TCPIP_STACK_USE_IPV4)
  650. #if defined(TCPIP_STACK_USE_IPV6)
  651. IPV6_ADDR ipv6Addr;
  652. int prefixLen;
  653. #endif // defined(TCPIP_STACK_USE_IPV6)
  654. const void* cmdIoParam = pCmdIO->cmdIoParam;
  655. bool success = false;
  656. if (argc < 3)
  657. {
  658. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: setip <interface> <ipv4/6 address> <ipv4mask/ipv6 prefix len>\r\n");
  659. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: setip PIC32INT 192.168.0.8 255.255.255.0 \r\n");
  660. return false;
  661. }
  662. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  663. if (netH == 0)
  664. {
  665. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface specified \r\n");
  666. return false;
  667. }
  668. pNetIf = _TCPIPStackHandleToNetUp(netH);
  669. if(pNetIf == 0)
  670. {
  671. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "No such interface is up\r\n");
  672. return false;
  673. }
  674. addType = IP_ADDRESS_TYPE_ANY;
  675. #if defined(TCPIP_STACK_USE_IPV4)
  676. if (TCPIP_Helper_StringToIPAddress(argv[2], &ipAddr))
  677. {
  678. addType = IP_ADDRESS_TYPE_IPV4;
  679. }
  680. #endif // defined(TCPIP_STACK_USE_IPV4)
  681. #if defined(TCPIP_STACK_USE_IPV6)
  682. if(TCPIP_Helper_StringToIPv6Address (argv[2], &ipv6Addr))
  683. {
  684. addType = IP_ADDRESS_TYPE_IPV6;
  685. }
  686. #endif // defined(TCPIP_STACK_USE_IPV6)
  687. if(addType == IP_ADDRESS_TYPE_ANY)
  688. {
  689. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Invalid IP address string \r\n");
  690. return false;
  691. }
  692. #if defined(TCPIP_STACK_USE_IPV4)
  693. if(addType == IP_ADDRESS_TYPE_IPV4)
  694. {
  695. if(_TCPIPStackAddressServiceIsRunning(pNetIf) != TCPIP_STACK_ADDRESS_SERVICE_NONE)
  696. {
  697. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "An address service is already running. Stop DHCP, ZCLL, etc. first\r\n");
  698. return false;
  699. }
  700. if(argc > 3)
  701. { // we have net mask too
  702. if (!TCPIP_Helper_StringToIPAddress(argv[3], &ipMask))
  703. {
  704. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Invalid IP mask string \r\n");
  705. return false;
  706. }
  707. pMask = &ipMask;
  708. }
  709. else
  710. {
  711. pMask = 0;
  712. }
  713. if(TCPIP_STACK_NetAddressSet(netH, &ipAddr, pMask, true))
  714. {
  715. success = true;
  716. }
  717. }
  718. #endif // defined(TCPIP_STACK_USE_IPV4)
  719. #if defined(TCPIP_STACK_USE_IPV6)
  720. if(addType == IP_ADDRESS_TYPE_IPV6)
  721. {
  722. if(argc > 3)
  723. { // we have prefix length
  724. prefixLen = atoi(argv[3]);
  725. }
  726. else
  727. {
  728. prefixLen = 0;
  729. }
  730. if(TCPIP_IPV6_UnicastAddressAdd (netH, &ipv6Addr, prefixLen, false) != 0)
  731. {
  732. success = true;
  733. }
  734. }
  735. #endif // defined(TCPIP_STACK_USE_IPV6)
  736. (*pCmdIO->pCmdApi->msg)(cmdIoParam, success ? "Set ip address OK\r\n" : "Set ip address failed\r\n");
  737. return false;
  738. }
  739. static int _Command_GatewayAddressSet(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  740. {
  741. TCPIP_NET_HANDLE netH;
  742. IP_ADDRESS_TYPE addType;
  743. #if defined(TCPIP_STACK_USE_IPV4)
  744. IPV4_ADDR ipGateway;
  745. #endif // defined(TCPIP_STACK_USE_IPV4)
  746. #if defined(TCPIP_STACK_USE_IPV6)
  747. IPV6_ADDR ipv6Gateway;
  748. unsigned long validTime;
  749. #endif // defined(TCPIP_STACK_USE_IPV6)
  750. const void* cmdIoParam = pCmdIO->cmdIoParam;
  751. bool success = false;
  752. if (argc != 3)
  753. {
  754. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: setgw <interface> <ipv4/6 address> <validTime> \r\n");
  755. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: setgw PIC32INT 192.168.0.1 \r\n");
  756. return false;
  757. }
  758. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  759. if (netH == 0)
  760. {
  761. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface specified \r\n");
  762. return false;
  763. }
  764. addType = IP_ADDRESS_TYPE_ANY;
  765. #if defined(TCPIP_STACK_USE_IPV4)
  766. if (TCPIP_Helper_StringToIPAddress(argv[2], &ipGateway))
  767. {
  768. addType = IP_ADDRESS_TYPE_IPV4;
  769. }
  770. #endif // defined(TCPIP_STACK_USE_IPV4)
  771. #if defined(TCPIP_STACK_USE_IPV6)
  772. if(TCPIP_Helper_StringToIPv6Address (argv[2], &ipv6Gateway))
  773. {
  774. addType = IP_ADDRESS_TYPE_IPV6;
  775. }
  776. #endif // defined(TCPIP_STACK_USE_IPV6)
  777. if(addType == IP_ADDRESS_TYPE_ANY)
  778. {
  779. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Invalid IP address string \r\n");
  780. return false;
  781. }
  782. #if defined(TCPIP_STACK_USE_IPV4)
  783. if(addType == IP_ADDRESS_TYPE_IPV4)
  784. {
  785. success = TCPIP_STACK_NetAddressGatewaySet(netH, &ipGateway);
  786. }
  787. #endif // defined(TCPIP_STACK_USE_IPV4)
  788. #if defined(TCPIP_STACK_USE_IPV6)
  789. if(addType == IP_ADDRESS_TYPE_IPV6)
  790. {
  791. if(argc > 3)
  792. { // we have validity time
  793. validTime = (unsigned long)atoi(argv[3]);
  794. }
  795. else
  796. {
  797. validTime = 0;
  798. }
  799. success = TCPIP_IPV6_RouterAddressAdd(netH, &ipv6Gateway, validTime, 0);
  800. }
  801. #endif // defined(TCPIP_STACK_USE_IPV6)
  802. (*pCmdIO->pCmdApi->msg)(cmdIoParam, success ? "Set gateway address OK\r\n" : "Set gateway address failed\r\n");
  803. return false;
  804. }
  805. static int _Command_PrimaryDNSAddressSet(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  806. {
  807. TCPIP_NET_HANDLE netH;
  808. IPV4_ADDR ipDNS;
  809. const void* cmdIoParam = pCmdIO->cmdIoParam;
  810. if (argc != 3) {
  811. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: setdns <interface> <x.x.x.x> \r\n");
  812. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: setdns PIC32INT 255.255.255.0 \r\n");
  813. return false;
  814. }
  815. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  816. if (netH == 0) {
  817. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface specified \r\n");
  818. return false;
  819. }
  820. if (!TCPIP_Helper_StringToIPAddress(argv[2], &ipDNS)) {
  821. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Invalid IP address string \r\n");
  822. return false;
  823. }
  824. if(!TCPIP_STACK_NetAddressDnsPrimarySet(netH, &ipDNS)) {
  825. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Set DNS address failed\r\n");
  826. return false;
  827. }
  828. return true;
  829. }
  830. #if defined(TCPIP_STACK_USE_DNS_SERVER)
  831. static int _Command_AddDelDNSSrvAddress(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  832. {
  833. uint32_t validStarttime=0;
  834. IP_MULTI_ADDRESS ipDNS;
  835. IP_ADDRESS_TYPE addrType;
  836. uint8_t *hostName;
  837. const void* cmdIoParam = pCmdIO->cmdIoParam;
  838. TCPIP_DNS_RESULT res;
  839. DNSS_COMD_TYPE val=DNSS_COMD_NONE;
  840. DNSS_COMMAND_MAP dnssComnd[3]=
  841. {
  842. {"add", DNSS_COMD_ADD,},
  843. {"del",DNSS_COMD_DEL,},
  844. {"info",DNSS_COMD_INFO,},
  845. };
  846. int i=0;
  847. #if defined(TCPIP_STACK_USE_IPV6)
  848. uint8_t addrBuf[44];
  849. #endif
  850. if (argc < 2) {
  851. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: dnsserv <add/del/info> <hostName> <IPType> <x.x.x.x> <lifeTime> \r\n");
  852. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Help: hostName - URL , IPType - 4 for Ipv4 address and 6 for Ipv6 address \r\n");
  853. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Help: LifeTime - The life time in Second for each entry to be used \r\n");
  854. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Help: One IP address per URL at a time will be added \r\n");
  855. return false;
  856. }
  857. for(i=0;i<(sizeof(dnssComnd)/sizeof(DNSS_COMMAND_MAP));i++)
  858. {
  859. if(strcmp(argv[1],dnssComnd[i].command) ==0)
  860. {
  861. val = dnssComnd[i].val;
  862. break;
  863. }
  864. }
  865. switch(val)
  866. {
  867. case DNSS_COMD_ADD:
  868. if (argc < 6) {
  869. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: dnsserv add <hostName> <IPType> <x.x.x.x> <lifeTime> \r\n");
  870. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Help: hostName - URL , IPType - 4 for Ipv4 address and 6 for Ipv6 address \r\n");
  871. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Help: LifeTime - The life time in Second for each entry to be used \r\n");
  872. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Help: One IP address per URL at a time will be added \r\n");
  873. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: dnss add www.xyz.com 4 10.20.30.40 120 \r\n");
  874. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: dnss add www.abc.com 6 2001::101 120 \r\n");
  875. return false;
  876. }
  877. hostName = (uint8_t*)argv[2];
  878. if (memcmp(argv[3], "4", 1) == 0)
  879. { // turning on a service
  880. addrType = IP_ADDRESS_TYPE_IPV4;
  881. }
  882. #if defined(TCPIP_STACK_USE_IPV6)
  883. else if (memcmp(argv[3], "6", 1) == 0)
  884. { // turning off a service
  885. addrType = IP_ADDRESS_TYPE_IPV6;
  886. }
  887. #endif
  888. else
  889. {
  890. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown option\r\n");
  891. return false;
  892. }
  893. if(addrType == IP_ADDRESS_TYPE_IPV4)
  894. {
  895. if (!TCPIP_Helper_StringToIPAddress(argv[4], &ipDNS.v4Add)) {
  896. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Invalid IP address string \r\n");
  897. return false;
  898. }
  899. //dnssCacheEntry.ip4Address.Val = ipDNS.Val;
  900. }
  901. #if defined(TCPIP_STACK_USE_IPV6)
  902. if(addrType == IP_ADDRESS_TYPE_IPV6)
  903. {
  904. strncpy((char*)addrBuf,argv[4],strlen(argv[4]));
  905. if (!TCPIP_Helper_StringToIPv6Address((char*)addrBuf,&ipDNS.v6Add)) {
  906. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Invalid IPv6 address string \r\n");
  907. return false;
  908. }
  909. }
  910. #endif
  911. validStarttime= (unsigned long)atoi((char*)argv[5]);
  912. res = TCPIP_DNSS_EntryAdd((const char*)hostName,addrType,&ipDNS,validStarttime);
  913. switch(res)
  914. {
  915. case DNS_RES_DUPLICATE_ENTRY:
  916. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "The Address is already part of the DNS Cache entry \r\n");
  917. return false;
  918. case DNS_RES_MEMORY_FAIL:
  919. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "No memory available \r\n");
  920. return false;
  921. case DNS_RES_CACHE_FULL:
  922. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "No space to add this entry \r\n");
  923. return false;
  924. case DNS_RES_OK:
  925. return true;
  926. default:
  927. return false;
  928. }
  929. break;
  930. case DNSS_COMD_DEL:
  931. if (argc != 5) {
  932. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: dnsserv del <hostName> <IPType> <x.x.x.x> \r\n");
  933. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Help: hostName - URL , IPType - 4 for Ipv4 address and 6 for Ipv6 address \r\n");
  934. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Help: One IP address per URL at a time will be added \r\n");
  935. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: dnss del www.xyz.com 4 10.20.30.40 \r\n");
  936. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: dnss del www.abc.com 6 2001::101 \r\n");
  937. return false;
  938. }
  939. hostName = (uint8_t*)argv[1];
  940. if (memcmp(argv[2], "4", 1) == 0)
  941. { // turning on a service
  942. addrType = IP_ADDRESS_TYPE_IPV4;
  943. }
  944. #if defined(TCPIP_STACK_USE_IPV6)
  945. else if (memcmp(argv[2], "6", 1) == 0)
  946. { // turning off a service
  947. addrType = IP_ADDRESS_TYPE_IPV6;
  948. }
  949. #endif
  950. else
  951. {
  952. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown option\r\n");
  953. return false;
  954. }
  955. if(addrType == IP_ADDRESS_TYPE_IPV4)
  956. {
  957. if (!TCPIP_Helper_StringToIPAddress(argv[3], &ipDNS.v4Add)) {
  958. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Invalid IPv4 address string \r\n");
  959. return false;
  960. }
  961. }
  962. #if defined(TCPIP_STACK_USE_IPV6)
  963. if(addrType == IP_ADDRESS_TYPE_IPV6)
  964. {
  965. strncpy((char*)addrBuf,argv[3],strlen(argv[3]));
  966. if (!TCPIP_Helper_StringToIPv6Address((char*)addrBuf, &ipDNS.v6Add)) {
  967. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Invalid IPv6 address string \r\n");
  968. return false;
  969. }
  970. }
  971. #endif
  972. res = TCPIP_DNSS_CacheEntryRemove((const char*)hostName,addrType,&ipDNS);
  973. switch(res)
  974. {
  975. case DNS_RES_NO_ENTRY:
  976. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "The Address is not part of the DNS Cache entry \r\n");
  977. return false;
  978. case DNS_RES_MEMORY_FAIL:
  979. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "No memory available \r\n");
  980. return false;
  981. case DNS_RES_CACHE_FULL:
  982. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "No space to add this entry \r\n");
  983. return false;
  984. case DNS_RES_OK:
  985. return true;
  986. default:
  987. return false;
  988. }
  989. break;
  990. case DNSS_COMD_INFO:
  991. _Command_ShowDNDServInfo(pCmdIO,argc,argv);
  992. break;
  993. default:
  994. (*pCmdIO->pCmdApi->print)(cmdIoParam, "Invalid Input Command :[ %s ] \r\n", argv[1]);
  995. return false;
  996. }
  997. return true;
  998. }
  999. static int _Command_ShowDNDServInfo(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  1000. {
  1001. IP_MULTI_ADDRESS ipDNS;
  1002. IP_ADDRESS_TYPE addrType;
  1003. uint8_t *hostName;
  1004. uint8_t ipcount=0;
  1005. int index=0;
  1006. const void* cmdIoParam = pCmdIO->cmdIoParam;
  1007. TCPIP_DNS_RESULT res;
  1008. uint32_t ttlTime=0;
  1009. bool entryPresent=false;
  1010. #if defined(TCPIP_STACK_USE_IPV6)
  1011. uint8_t addrBuf[44];
  1012. #endif
  1013. if (argc != 3) {
  1014. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: dnsserv info <hostname> | <all>\r\n");
  1015. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Help: display the DNS cache entry details \r\n");
  1016. return false;
  1017. }
  1018. hostName = (uint8_t*)argv[2];
  1019. if(strcmp((char*)argv[2],"all")==0)
  1020. {
  1021. index = 0;
  1022. // memset(dnsHostName,0,sizeof(dnsHostName));
  1023. (*pCmdIO->pCmdApi->msg)(cmdIoParam,"HostName IPv4/IPv6Count\r\n");
  1024. while(1)
  1025. {
  1026. res = TCPIP_DNSS_AddressCntGet(index,(uint8_t*)hostName,&ipcount);
  1027. if(res == DNS_RES_OK)
  1028. {
  1029. entryPresent = true;
  1030. (*pCmdIO->pCmdApi->print)(cmdIoParam, "%s %d\r\n",hostName,ipcount);
  1031. }
  1032. if(res == DNS_RES_NO_SERVICE)
  1033. {
  1034. if(entryPresent == false)
  1035. {
  1036. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "No DNS Server Cache entry \r\n");
  1037. }
  1038. entryPresent = false;
  1039. break;
  1040. }
  1041. index++;
  1042. }
  1043. return true;
  1044. }
  1045. addrType = IP_ADDRESS_TYPE_IPV4;
  1046. index = 0;
  1047. (*pCmdIO->pCmdApi->msg)(cmdIoParam,"HostName IPv4Address TTLTime \r\n");
  1048. while(1)
  1049. {
  1050. res = TCPIP_DNSS_EntryGet((uint8_t*)hostName,addrType,index,&ipDNS);
  1051. if(res == DNS_RES_OK)
  1052. {
  1053. (*pCmdIO->pCmdApi->print)(cmdIoParam, "%s %d.%d.%d.%d %d\r\n",hostName,ipDNS.v4Add.v[0],ipDNS.v4Add.v[1],
  1054. ipDNS.v4Add.v[2],ipDNS.v4Add.v[3],ttlTime);
  1055. entryPresent = true;
  1056. }
  1057. else if((res == DNS_RES_NO_SERVICE)|| (res == DNS_RES_NO_ENTRY))
  1058. {
  1059. if(entryPresent == false)
  1060. {
  1061. (*pCmdIO->pCmdApi->print)(cmdIoParam, "[%s] No Ipv4 Address with in DNS Cache entry \r\n",hostName);
  1062. }
  1063. entryPresent = false;
  1064. break;
  1065. }
  1066. index++;
  1067. }
  1068. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "\r\n");
  1069. #if defined(TCPIP_STACK_USE_IPV6)
  1070. addrType = IP_ADDRESS_TYPE_IPV6;
  1071. index = 0;
  1072. (*pCmdIO->pCmdApi->msg)(cmdIoParam,"HostName IPv6Address TTLTime \r\n");
  1073. while(1)
  1074. {
  1075. res = TCPIP_DNSS_EntryGet((uint8_t*)hostName,addrType,index,&ipDNS);
  1076. if(res == DNS_RES_OK)
  1077. {
  1078. TCPIP_Helper_IPv6AddressToString(&ipDNS.v6Add,(char*)addrBuf,sizeof(addrBuf));
  1079. (*pCmdIO->pCmdApi->print)(cmdIoParam, "%s %s %d\r\n",hostName,addrBuf,ttlTime);
  1080. entryPresent = true;
  1081. }
  1082. else if((res == DNS_RES_NO_SERVICE)|| (res == DNS_RES_NO_ENTRY))
  1083. {
  1084. if(entryPresent == false)
  1085. {
  1086. (*pCmdIO->pCmdApi->print)(cmdIoParam, "[%s] No Ipv6 Address DNS Cache entry \r\n",hostName);
  1087. }
  1088. entryPresent = false;
  1089. break;
  1090. }
  1091. index++;
  1092. }
  1093. #endif
  1094. return true;
  1095. }
  1096. #endif
  1097. static int _Command_BIOSNameSet(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  1098. {
  1099. TCPIP_NET_HANDLE netH;
  1100. const char* msg;
  1101. const void* cmdIoParam = pCmdIO->cmdIoParam;
  1102. if (argc != 3)
  1103. {
  1104. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: setbios <interface> <x.x.x.x> \r\n");
  1105. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: setbios PIC32INT MCHPBOARD_29 \r\n");
  1106. return false;
  1107. }
  1108. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  1109. if (netH == 0)
  1110. {
  1111. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface specified \r\n");
  1112. return false;
  1113. }
  1114. if(TCPIP_STACK_NetBiosNameSet(netH, argv[2]))
  1115. {
  1116. msg = "Set BIOS Name OK\r\n";
  1117. }
  1118. else
  1119. {
  1120. msg = "Set BIOS Name failed\r\n";
  1121. }
  1122. (*pCmdIO->pCmdApi->msg)(cmdIoParam, msg);
  1123. return true;
  1124. }
  1125. static int _Command_MACAddressSet(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  1126. {
  1127. TCPIP_NET_HANDLE netH;
  1128. TCPIP_MAC_ADDR macAddr;
  1129. const void* cmdIoParam = pCmdIO->cmdIoParam;
  1130. if (argc != 3) {
  1131. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: setmac <interface> <x:x:x:x:x:x> \r\n");
  1132. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: setmac PIC32INT aa:bb:cc:dd:ee:ff \r\n");
  1133. return false;
  1134. }
  1135. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  1136. if (netH == 0) {
  1137. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface specified \r\n");
  1138. return false;
  1139. }
  1140. (*pCmdIO->pCmdApi->print)(cmdIoParam, "argv[2]: %s\r\n", argv[2]);
  1141. if (!TCPIP_Helper_StringToMACAddress(argv[2], macAddr.v)) {
  1142. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Invalid MAC address string \r\n");
  1143. return false;
  1144. }
  1145. if(!TCPIP_STACK_NetAddressMacSet(netH, &macAddr)) {
  1146. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Set MAC address failed\r\n");
  1147. return false;
  1148. }
  1149. return true;
  1150. }
  1151. static int _Command_NetworkOnOff(_CMDIO_DEV_NODE* pCmdIO, int argc, char** argv)
  1152. {
  1153. bool res = false;
  1154. TCPIP_NET_HANDLE netH;
  1155. #if defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  1156. TCPIP_COMMAND_STG_DCPT* pDcpt;
  1157. TCPIP_NETWORK_CONFIG* pNetConf;
  1158. #endif // defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  1159. uint16_t net_ix = 0;
  1160. const void* cmdIoParam = pCmdIO->cmdIoParam;
  1161. if (argc != 3)
  1162. {
  1163. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Usage: if <interface> <down/up> \r\n");
  1164. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Ex: if PIC32INT down \r\n");
  1165. return false;
  1166. }
  1167. netH = TCPIP_STACK_NetHandleGet(argv[1]);
  1168. if (netH == 0)
  1169. {
  1170. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Unknown interface specified \r\n");
  1171. return false;
  1172. }
  1173. net_ix = TCPIP_STACK_NetIndexGet(netH);
  1174. if (memcmp(argv[2], "up", 2) == 0)
  1175. {
  1176. if(TCPIP_STACK_NetIsUp(netH))
  1177. {
  1178. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "This interface already up\r\n");
  1179. return true;
  1180. }
  1181. #if defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  1182. pNetConf = 0;
  1183. if(pCmdStgDcpt)
  1184. {
  1185. // get the saved network configuration
  1186. pDcpt = pCmdStgDcpt + net_ix;
  1187. if(pDcpt->stgSize)
  1188. { // saved config is valid; restore
  1189. pNetConf = TCPIP_STACK_NetConfigSet(&pDcpt->netDcptStg, pDcpt->restoreBuff, sizeof(pDcpt->restoreBuff), 0);
  1190. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Interface up: configuration " );
  1191. (*pCmdIO->pCmdApi->msg)(cmdIoParam, pNetConf ? "restored\r\n" : "restore failed!\r\n");
  1192. }
  1193. }
  1194. res = TCPIP_STACK_NetUp(netH, pNetConf);
  1195. #else
  1196. res = TCPIP_STACK_NetUp(netH, 0);
  1197. #endif // defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  1198. }
  1199. else if (memcmp(argv[2], "down", 4) == 0)
  1200. {
  1201. if(TCPIP_STACK_NetIsUp(netH) == 0)
  1202. {
  1203. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "This interface already down\r\n");
  1204. return true;
  1205. }
  1206. #if defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  1207. if(pCmdStgDcpt)
  1208. {
  1209. // get the last network configuration so we use it when
  1210. // restart the stack/interface
  1211. pDcpt = pCmdStgDcpt + net_ix;
  1212. pDcpt->stgSize = TCPIP_STACK_NetConfigGet(netH, &pDcpt->netDcptStg, sizeof(pDcpt->netDcptStg), 0);
  1213. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Interface down: configuration saved\r\n");
  1214. }
  1215. #endif // defined(TCPIP_STACK_COMMANDS_STORAGE_ENABLE)
  1216. res = TCPIP_STACK_NetDown(netH);
  1217. }
  1218. else
  1219. {
  1220. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Wrong parameter specified \r\n");
  1221. return false;
  1222. }
  1223. if (res == true)
  1224. {
  1225. (*pCmdIO->pCmdApi->msg)(cmdIoParam, "Operation successful!\r\n");
  1226. }
  1227. else