📄 c_dhcps.c
字号:
/*
* Copyright 2006 by Texas Instruments Incorporated.
* All rights reserved. Property of Texas Instruments Incorporated.
* Restricted rights to use, duplicate or disclose this code are
* granted through contract.
*
* @(#) TCP/IP_Network_Developers_Kit 1.91.00.08 08-22-2006 (ndk-a08)
*/
//--------------------------------------------------------------------------
// IP Stack Client Demo
//--------------------------------------------------------------------------
// Client.c
//
// Stack initialization functions
//
// Author: Michael A. Denio
// Copyright 2000, 2001 by Texas Instruments Inc.
//--------------------------------------------------------------------------
#include <stdio.h>
#include <netmain.h>
#include <_stack.h>
#include "..\..\..\tools\common\console\console.h"
#include "..\..\..\tools\common\servers\servers.h"
#include "client.h"
// When set, runs a DNS server to respond to local name requests
#define LOCAL_DNS_SERVER 1
// When USE_OLD_SERVERS set to zero, server daemon is used
#define USE_OLD_SERVERS 0
//---------------------------------------------------------------------------
// Title String
//
char *VerStr = "\nTCP/IP Stack Example Client\n";
// Our NETCTRL callback functions
static void NetworkOpen();
static void NetworkClose();
static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd );
// Fun reporting function
static void ServiceReport( uint Item, uint Status, uint Report, HANDLE hCfgEntry );
//---------------------------------------------------------------------------
// Configuration
//
static char *LocalIpAddr = "192.168.1.10";
static char *LocalIpMask = "255.255.255.0";
static char *DhcpPoolBase = "192.168.1.100";
static char *HostName = "cpndk";
static char *DomainName = "home.net";
static char *DNSServer = "0.0.0.0"; // Used when set to anything but zero
static char *GatewayIP = "192.168.1.1"; // Used when set to anything but zero
//---------------------------------------------------------------------
// Main Entry Point
//---------------------------------------------------------------------
int main()
{}
//
// Main Thread
//
int StackTest()
{
int rc;
HANDLE hCfg;
CI_SERVICE_TELNET telnet;
CI_SERVICE_HTTP http;
//
// THIS MUST BE THE ABSOLUTE FIRST THING DONE IN AN APPLICATION!!
//
rc = NC_SystemOpen( NC_PRIORITY_LOW, NC_OPMODE_INTERRUPT );
if( rc )
{
printf("NC_SystemOpen Failed (%d)\n",rc);
for(;;);
}
// Print out our banner
printf(VerStr);
// Enable the EDMA interrupt - since the EDMA interrupt
// is configurable, this one line of code has no home.
//
// NOTE: This code is not required for DM642, nor any
// driver environment that does not use EMDA sharing.
// However, it doesn't hurt to turn it on.
C62_enableIER( 1<<8 );
//
// Create and build the system configuration from scratch.
//
// Create a new configuration
hCfg = CfgNew();
if( !hCfg )
{
printf("Unable to create configuration\n");
goto main_exit;
}
// We better validate the length of the supplied names
if( strlen( DomainName ) >= CFG_DOMAIN_MAX ||
strlen( HostName ) >= CFG_HOSTNAME_MAX )
{
printf("Names too long\n");
goto main_exit;
}
// Add our global hostname to hCfg (to be claimed in all connected domains)
CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_HOSTNAME, 0,
strlen(HostName), (UINT8 *)HostName, 0 );
// If the IP address is specified, manually configure IP
if( inet_addr(LocalIpAddr) )
{
CI_IPNET NA;
// Setup manual IP address
bzero( &NA, sizeof(NA) );
NA.IPAddr = inet_addr(LocalIpAddr);
NA.IPMask = inet_addr(LocalIpMask);
strcpy( NA.Domain, DomainName );
NA.NetType = CFG_NETTYPE_DHCPS;
// Add the virtual tag is using local DNS server
if( LOCAL_DNS_SERVER )
NA.NetType |= CFG_NETTYPE_VIRTUAL;
// Add the address to interface 1
CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0,
sizeof(CI_IPNET), (UINT8 *)&NA, 0 );
}
// If the IP gateway is specified, manually Gateway
if( inet_addr(GatewayIP) )
{
CI_ROUTE RT;
// Add the default gateway. Since it is the default, the
// destination address and mask are both zero (we go ahead
// and show the assignment for clarity).
bzero( &RT, sizeof(RT) );
RT.IPDestAddr = 0;
RT.IPDestMask = 0;
RT.IPGateAddr = inet_addr(GatewayIP);
// Add the route
CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0,
sizeof(CI_ROUTE), (UINT8 *)&RT, 0 );
}
// If the DNS server is specified, add it
if( inet_addr(DNSServer) )
{
IPN IPTmp;
// Manually add the DNS server when specified
IPTmp = inet_addr(DNSServer);
if( IPTmp )
CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER,
0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0 );
}
// Specify DHCPS Service
{
CI_SERVICE_DHCPS dhcps;
bzero( &dhcps, sizeof(dhcps) );
dhcps.cisargs.Mode = CIS_FLG_IFIDXVALID;
dhcps.cisargs.IfIdx = 1;
dhcps.cisargs.pCbSrv = &ServiceReport;
// If running the DNS server, report it and local domain name to clients
if( LOCAL_DNS_SERVER )
dhcps.param.Flags = DHCPS_FLG_LOCALDNS | DHCPS_FLG_LOCALDOMAIN;
// Select the appropriate DHCP pool
dhcps.param.PoolBase = inet_addr(DhcpPoolBase);
dhcps.param.PoolCount = 16;
CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_DHCPSERVER, 0,
sizeof(dhcps), (UINT8 *)&dhcps, 0 );
}
// If not in "physical" mode, specify DNS Server service
if( LOCAL_DNS_SERVER )
{
CI_SERVICE_DNSSERVER dnss;
bzero( &dnss, sizeof(dnss) );
dnss.cisargs.IPAddr = INADDR_ANY;
dnss.cisargs.pCbSrv = &ServiceReport;
CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_DNSSERVER, 0,
sizeof(dnss), (UINT8 *)&dnss, 0 );
}
// Specify TELNET service for our Console example
bzero( &telnet, sizeof(telnet) );
telnet.cisargs.IPAddr = INADDR_ANY;
telnet.cisargs.pCbSrv = &ServiceReport;
telnet.param.MaxCon = 2;
telnet.param.Callback = &ConsoleOpen;
CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_TELNET, 0,
sizeof(telnet), (UINT8 *)&telnet, 0 );
// Create RAM based WEB files for HTTP
AddWebFiles();
// HTTP Authentication
{
CI_ACCT CA;
// Name our authentication group for HTTP (Max size = 31)
// This is the authentication "realm" name returned by the HTTP
// server when authentication is required on group 1.
CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_SYSINFO_REALM1,
0, 30, (UINT8 *)"DSP_CLIENT_DEMO_AUTHENTICATE1", 0 );
// Create a sample user account who is a member of realm 1.
// The username and password are just "username" and "password"
strcpy( CA.Username, "username" );
strcpy( CA.Password, "password" );
CA.Flags = CFG_ACCTFLG_CH1; // Make a member of realm 1
rc = CfgAddEntry( hCfg, CFGTAG_ACCT, CFGITEM_ACCT_REALM,
0, sizeof(CI_ACCT), (UINT8 *)&CA, 0 );
}
// Specify HTTP service
bzero( &http, sizeof(http) );
http.cisargs.IPAddr = INADDR_ANY;
http.cisargs.pCbSrv = &ServiceReport;
CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_HTTP, 0,
sizeof(http), (UINT8 *)&http, 0 );
//
// Configure IPStack/OS Options
//
// We don't want to see debug messages less than WARNINGS
rc = DBG_WARN;
CfgAddEntry( hCfg, CFGTAG_OS, CFGITEM_OS_DBGPRINTLEVEL,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
//
// This code sets up the TCP and UDP buffer sizes
// (Note 8192 is actually the default. This code is here to
// illustrate how the buffer and limit sizes are configured.)
//
// TCP Transmit buffer size
rc = 8192;
CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPTXBUF,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
// TCP Receive buffer size (copy mode)
rc = 8192;
CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPRXBUF,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
// TCP Receive limit (non-copy mode)
rc = 8192;
CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPRXLIMIT,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
// UDP Receive limit
rc = 8192;
CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKUDPRXLIMIT,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
//
// Boot the system using this configuration
//
// We keep booting until the function returns 0. This allows
// us to have a "reboot" command.
//
do
{
rc = NC_NetStart( hCfg, NetworkOpen, NetworkClose, NetworkIPAddr );
} while( rc > 0 );
// Free the WEB files
RemoveWebFiles();
// Delete Configuration
CfgFree( hCfg );
// Close the OS
main_exit:
NC_SystemClose();
return(0);
}
#if USE_OLD_SERVERS
//
// System Task Code [ Traditional Servers ]
//
static HANDLE hEcho=0,hData=0,hNull=0,hOob=0;
//
// NetworkOpen
//
// This function is called after the configuration has booted
//
static void NetworkOpen()
{
// Create our local servers
hEcho = TaskCreate( echosrv, "EchoSrv", OS_TASKPRINORM, 0x1400, 0, 0, 0 );
hData = TaskCreate( datasrv, "DataSrv", OS_TASKPRINORM, 0x1400, 0, 0, 0 );
hNull = TaskCreate( nullsrv, "NullSrv", OS_TASKPRINORM, 0x1400, 0, 0, 0 );
hOob = TaskCreate( oobsrv, "OobSrv", OS_TASKPRINORM, 0x1000, 0, 0, 0 );
}
//
// NetworkClose
//
// This function is called when the network is shutting down,
// or when it no longer has any IP addresses assigned to it.
//
static void NetworkClose()
{
fdCloseSession( hOob );
fdCloseSession( hNull );
fdCloseSession( hData );
fdCloseSession( hEcho );
// Kill any active console
ConsoleClose();
// If we opened NETCTRL as NC_PRIORITY_HIGH, we can't
// kill our task threads until we've given them the
// opportunity to shutdown. We do this by manually
// setting our task priority to NC_PRIORITY_LOW.
TaskSetPri( TaskSelf(), NC_PRIORITY_LOW );
TaskDestroy( hOob );
TaskDestroy( hNull );
TaskDestroy( hData );
TaskDestroy( hEcho );
}
#else
//
// System Task Code [ Server Daemon Servers ]
//
static HANDLE hEcho=0,hEchoUdp=0,hData=0,hNull=0,hOob=0;
//
// NetworkOpen
//
// This function is called after the configuration has booted
//
static void NetworkOpen()
{
// Create our local servers
hEcho = DaemonNew( SOCK_STREAMNC, 0, 7, dtask_tcp_echo,
OS_TASKPRINORM, OS_TASKSTKNORM, 0, 3 );
hEchoUdp = DaemonNew( SOCK_DGRAM, 0, 7, dtask_udp_echo,
OS_TASKPRINORM, OS_TASKSTKNORM, 0, 1 );
hData = DaemonNew( SOCK_STREAM, 0, 1000, dtask_tcp_datasrv,
OS_TASKPRINORM, OS_TASKSTKNORM, 0, 3 );
hNull = DaemonNew( SOCK_STREAMNC, 0, 1001, dtask_tcp_nullsrv,
OS_TASKPRINORM, OS_TASKSTKNORM, 0, 3 );
hOob = DaemonNew( SOCK_STREAMNC, 0, 999, dtask_tcp_oobsrv,
OS_TASKPRINORM, OS_TASKSTKNORM, 0, 3 );
}
//
// NetworkClose
//
// This function is called when the network is shutting down,
// or when it no longer has any IP addresses assigned to it.
//
static void NetworkClose()
{
DaemonFree( hOob );
DaemonFree( hNull );
DaemonFree( hData );
DaemonFree( hEchoUdp );
DaemonFree( hEcho );
// Kill any active console
ConsoleClose();
}
#endif
//
// NetworkIPAddr
//
// This function is called whenever an IP address binding is
// added or removed from the system.
//
static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd )
{
static uint fAddGroups = 0;
IPN IPTmp;
if( fAdd )
printf("Network Added: ");
else
printf("Network Removed: ");
// Print a message
IPTmp = ntohl( IPAddr );
printf("If-%d:%d.%d.%d.%d\n", IfIdx,
(UINT8)(IPTmp>>24)&0xFF, (UINT8)(IPTmp>>16)&0xFF,
(UINT8)(IPTmp>>8)&0xFF, (UINT8)IPTmp&0xFF );
// This is a good time to join any multicast group we require
if( fAdd && !fAddGroups )
{
fAddGroups = 1;
// IGMPJoinHostGroup( inet_addr("224.0.0.2"), 1 );
}
}
//
// Service Status Reports
//
// Here's a quick example of using service status updates
//
static char *TaskName[] = { "Telnet","HTTP","NAT","DHCPS","DHCPC","DNS" };
static char *ReportStr[] = { "","Running","Updated","Complete","Fault" };
static char *StatusStr[] = { "Disabled","Waiting","IPTerm","Failed","Enabled" };
static void ServiceReport( uint Item, uint Status, uint Report, HANDLE h )
{
printf( "Service Status: %-9s: %-9s: %-9s: %03d\n",
TaskName[Item-1], StatusStr[Status],
ReportStr[Report/256], Report&0xFF );
//
// Example of adding to the DHCP configuration space
//
// When using the DHCP client, the client has full control over access
// to the first 256 entries in the CFGTAG_SYSINFO space.
//
// Note that the DHCP client will erase all CFGTAG_SYSINFO tags except
// CFGITEM_DHCP_HOSTNAME. If the application needs to keep manual
// entries in the DHCP tag range, then the code to maintain them should
// be placed here.
//
// Here, we want to manually add a DNS server to the configuration, but
// we can only do it once DHCP has finished its programming.
//
if( Item == CFGITEM_SERVICE_DHCPCLIENT &&
Status == CIS_SRV_STATUS_ENABLED &&
(Report == (NETTOOLS_STAT_RUNNING|DHCPCODE_IPADD) ||
Report == (NETTOOLS_STAT_RUNNING|DHCPCODE_IPRENEW)) )
{
IPN IPTmp;
// Manually add the DNS server when specified
IPTmp = inet_addr(DNSServer);
if( IPTmp )
CfgAddEntry( 0, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER,
0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0 );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -