network_main.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:8k
源码类别:

DSP编程

开发平台:

C/C++

  1. /* ======================================================================== */
  2. /* Basic header files                                                       */
  3. /* ======================================================================== */
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #include "netmain.h"  /*change*/
  9. #include "_oskern.h"  /*change*/
  10. // Build WEB page
  11. extern void AddWebFiles(void);
  12. extern void RemoveWebFiles(void);
  13. //---------------------------------------------------------------------------
  14. // Title String
  15. //
  16. char *VerStr = "nTCP/IP Stack NetCam Examplen";
  17. // Our NETCTRL callback functions
  18. static void   NetworkOpen();
  19. static void   NetworkClose();
  20. static void   NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd );
  21. // Fun reporting function
  22. static void   ServiceReport( uint Item, uint Status, uint Report, HANDLE hCfgEntry );
  23. //---------------------------------------------------------------------------
  24. // Configuration
  25. //
  26. char *HostName    = "mikecam";
  27. //char *LocalIPAddr = "0.0.0.0";          // Set to "0.0.0.0" for DHCP /*change*/
  28. char *LocalIPAddr = "192.168.1.77";          // Set to "0.0.0.0" for DHCP 
  29. char *LocalIPMask = "255.255.255.0";    // Not used when using DHCP
  30. char *GatewayIP   = "192.168.0.1";      // Not used when using DHCP
  31. char *DomainName  = "demo.net";         // Not used when using DHCP
  32. char *DNSServer   = "0.0.0.0";          // Used when set to anything but zero
  33. // Defined in our CDB file
  34. extern uint extHeap;
  35. //
  36. // Main Thread
  37. //
  38. void network_main()
  39. {
  40.     int               rc;
  41.     HANDLE            hCfg;
  42.     CI_SERVICE_HTTP   http;
  43.     //
  44.     // THIS MUST BE THE ABSOLUTE FIRST THING DONE IN AN APPLICATION!!
  45.     //
  46.     NC_SystemOpen();
  47.     _mmBulkAllocSeg( extHeap );
  48.     // Print out our banner
  49.     printf(VerStr);
  50.     // Enable the EDMA interrupt - since the EDMA interrupt
  51.     // is configurable, this one line of code has no home.
  52.     C62_enableIER( 1<<8 );
  53.     //
  54.     // Create and build the system configuration from scratch.
  55.     //
  56.     // Create a new configuration
  57.     hCfg = CfgNew();
  58.     if( !hCfg )
  59.     {
  60.         printf("Unable to create configurationn");
  61.         goto main_exit;
  62.     }
  63.     // We better validate the length of the supplied names
  64.     if( strlen( DomainName ) >= CFG_DOMAIN_MAX ||
  65.         strlen( HostName ) >= CFG_HOSTNAME_MAX )
  66.     {
  67.         printf("Names too longn");
  68.         goto main_exit;
  69.     }
  70.     // Add our global hostname to hCfg (to be claimed in all connected domains)
  71.     CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_HOSTNAME, 0,
  72.                  strlen(HostName), (UINT8 *)HostName, 0 );
  73.     // If the IP address is specified, manually configure IP and Gateway
  74.     if( inet_addr(LocalIPAddr) )
  75.     {
  76.         CI_IPNET NA;
  77.         CI_ROUTE RT;
  78.         IPN      IPTmp;
  79.         // Setup manual IP address
  80.         bzero( &NA, sizeof(NA) );
  81.         NA.IPAddr  = inet_addr(LocalIPAddr);
  82.         NA.IPMask  = inet_addr(LocalIPMask);
  83.         strcpy( NA.Domain, DomainName );
  84.         NA.NetType = 0;
  85.         // Add the address to interface 1
  86.         CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0,
  87.                            sizeof(CI_IPNET), (UINT8 *)&NA, 0 );
  88.         // Add the default gateway. Since it is the default, the
  89.         // destination address and mask are both zero (we go ahead
  90.         // and show the assignment for clarity).
  91.         bzero( &RT, sizeof(RT) );
  92.         RT.IPDestAddr = 0;
  93.         RT.IPDestMask = 0;
  94.         RT.IPGateAddr = inet_addr(GatewayIP);
  95.         // Add the route
  96.         CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0,
  97.                            sizeof(CI_ROUTE), (UINT8 *)&RT, 0 );
  98.         // Manually add the DNS server when specified
  99.         IPTmp = inet_addr(DNSServer);
  100.         if( IPTmp )
  101.             CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER,
  102.                          0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0 );
  103.     }
  104.     // Else we specify DHCP
  105.     else
  106.     {
  107.         CI_SERVICE_DHCPC dhcpc;
  108.         // Specify DHCP Service on IF-1
  109.         bzero( &dhcpc, sizeof(dhcpc) );
  110.         dhcpc.cisargs.Mode   = CIS_FLG_IFIDXVALID;
  111.         dhcpc.cisargs.IfIdx  = 1;
  112.         dhcpc.cisargs.pCbSrv = &ServiceReport;
  113.         CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_DHCPCLIENT, 0,
  114.                      sizeof(dhcpc), (UINT8 *)&dhcpc, 0 );
  115.     }
  116.     // Create RAM based WEB files for HTTP
  117.     AddWebFiles();
  118.     // Specify HTTP service
  119.     bzero( &http, sizeof(http) );
  120.     http.cisargs.IPAddr = INADDR_ANY;
  121.     http.cisargs.pCbSrv = &ServiceReport;
  122.     CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_HTTP, 0,
  123.                  sizeof(http), (UINT8 *)&http, 0 );
  124.     //
  125.     // Configure IPStack/OS Options
  126.     //
  127.     // We don't want to see debug messages less than WARNINGS
  128.     rc = DBG_WARN;
  129.     CfgAddEntry( hCfg, CFGTAG_OS, CFGITEM_OS_DBGPRINTLEVEL,
  130.                  CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
  131.     // Change our socket buffer size to 8704 bytes
  132.     rc = 8760;
  133.     CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKBUFMAX,
  134.                  CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
  135.     //
  136.     // Boot the system using this configuration
  137.     //
  138.     // We keep booting until the function returns 0. This allows
  139.     // us to have a "reboot" command.
  140.     //
  141.     do
  142.     {
  143.         rc = NC_NetStart( hCfg, NetworkOpen, NetworkClose, NetworkIPAddr );
  144.     } while( rc > 0 );
  145.     // Free the WEB files
  146.     RemoveWebFiles();
  147.     // Delete Configuration
  148.     CfgFree( hCfg );
  149.     // Close the OS
  150. main_exit:
  151.     NC_SystemClose();
  152. }
  153. //
  154. // System Task Code
  155. //
  156. //
  157. // NetworkOpen
  158. //
  159. // This function is called after the configuration has booted
  160. //
  161. static void NetworkOpen()
  162. {
  163. }
  164. //
  165. // NetworkClose
  166. //
  167. // This function is called when the network is shutting down,
  168. // or when it no longer has any IP addresses assigned to it.
  169. //
  170. static void NetworkClose()
  171. {
  172. }
  173. extern void tskNetwork();
  174. //
  175. // NetworkIPAddr
  176. //
  177. // This function is called whenever an IP address binding is
  178. // added or removed from the system.
  179. //
  180. static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd )
  181. {
  182.     static uint fSystemReady = 0;
  183.     IPN IPTmp;
  184.     if( fAdd )
  185.         printf("Network Added: ");
  186.     else
  187.         printf("Network Removed: ");
  188.     // Print a message
  189.     IPTmp = ntohl( IPAddr );
  190.     printf("If-%d:%d.%d.%d.%dn", IfIdx,
  191.             (UINT8)(IPTmp>>24)&0xFF, (UINT8)(IPTmp>>16)&0xFF,
  192.             (UINT8)(IPTmp>>8)&0xFF, (UINT8)IPTmp&0xFF );
  193.     // This is a good time to initialize anything that can't
  194.     // run until we have an IP Address
  195.     if( fAdd && !fSystemReady )
  196.     {
  197.         fSystemReady = 1;
  198.         TaskCreate( tskNetwork, "NetRF5", 5, 0x1000, 0, 0, 0 );
  199.     }
  200. }
  201. //
  202. // Service Status Reports
  203. //
  204. // Here's a quick example of using service status updates
  205. //
  206. static char *TaskName[]  = { "Telnet","HTTP","NAT","DHCPS","DHCPC","DNS" };
  207. static char *ReportStr[] = { "","Running","Updated","Complete","Fault" };
  208. static char *StatusStr[] = { "Disabled","Waiting","IPTerm","Failed","Enabled" };
  209. static void ServiceReport( uint Item, uint Status, uint Report, HANDLE h )
  210. {
  211.     printf( "Service Status: %-9s: %-9s: %-9s: %03dn",
  212.             TaskName[Item-1], StatusStr[Status],
  213.             ReportStr[Report/256], Report&0xFF );
  214.     // Example of adding to the DHCP configuration space
  215.     //
  216.     // When using the DHCP clinent, the client has full control over access
  217.     // to the first 256 entries in the CFGTAG_SYSINFO space. Here, we want to
  218.     // manually add a DNS server to the configuration, but we can only do it
  219.     // once DHCP has finished its programming.
  220.     if( Item == CFGITEM_SERVICE_DHCPCLIENT &&
  221.         Status == CIS_SRV_STATUS_ENABLED &&
  222.         (Report == (NETTOOLS_STAT_RUNNING|DHCPCODE_IPADD) ||
  223.          Report == (NETTOOLS_STAT_RUNNING|DHCPCODE_IPRENEW)) )
  224.     {
  225.         IPN IPTmp;
  226.         // Manually add the DNS server when specified
  227.         IPTmp = inet_addr(DNSServer);
  228.         if( IPTmp )
  229.             CfgAddEntry( 0, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER,
  230.                          0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0 );
  231.     }
  232. }