Difference between revisions of "UIP"

From OpenCircuits
Jump to navigation Jump to search
Line 73: Line 73:
  
 
==uIP Ethernet Application==
 
==uIP Ethernet Application==
 +
*The following applications are modified from the demo applications in uIP.
  
 
===DHCP Client===
 
===DHCP Client===
 +
*Use project [http://chungyan5.no-ip.org/vc/?root=dhcpc_8bit dhcpc_8bit]
 
*Enable UDP in "uip-config.h"
 
*Enable UDP in "uip-config.h"
 
       #define UIP_CONF_UDP            1
 
       #define UIP_CONF_UDP            1
 
*Make sure your uip buffer size is large enough (DHCP messages from some servers can be more than 500 bytes). In my setting, I use 1536 in "uip-config.h"
 
*Make sure your uip buffer size is large enough (DHCP messages from some servers can be more than 500 bytes). In my setting, I use 1536 in "uip-config.h"
 
       #define UIP_CONF_BUFFER_SIZE    1536
 
       #define UIP_CONF_BUFFER_SIZE    1536
*Include the dhcpc.h header file in "uip-config.h"
 
      #include "dhcpc.h"
 
*Change PT_WAIT_UNTIL(...) to PT_YIELD_UNTIL(...) in line 259 and 276 in "dhcpc.c" [This is a known bug in dhcpc.c]
 
*In your main loop, initialize your MAC address and DHCP if UIP_FIXEDADDR is 0 in "uip-opt.h", for example:
 
  int main(void)
 
  {
 
      uip_ipaddr_t ipaddr;
 
      struct timer periodic_timer, arp_timer;
 
      struct uip_eth_addr mac = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
 
     
 
      timer_set(&periodic_timer, CLOCK_SECOND / 2);
 
      timer_set(&arp_timer, CLOCK_SECOND * 10);
 
     
 
      tapdev_init();
 
      uip_init();
 
     
 
      uip_setethaddr(mac);
 
      dhcpc_init(&mac, 6);
 
     
 
      while(1){
 
        //normal codes goes here
 
      }
 
  }
 
*Implement dhcpc_configured(). This function will be called after DHCP client has obtained an IP address. Basically, you have to at least set your IP address, subnet mask and default gateway, for example,
 
  void dhcpc_configured(const struct dhcpc_state *s)
 
  {
 
    uip_sethostaddr(s->ipaddr);
 
    uip_setnetmask(s->netmask);
 
    uip_setdraddr(s->default_router);
 
   
 
    //you can print your ip addr to your console/lcd to see if you get a valid ip address
 
  }
 
*An example of using DHCP Client in the dsPic33F development board can be found [http://chungyan5.no-ip.org/vc/tags/1.09.05/demo_posix/common/app_http.c?root=freertos_posix&view=markup here].
 
  
  
 
===Web Server===
 
===Web Server===
*Include the "webserver.h" header file in "uip-config.h"
+
*Use project [http://chungyan5.no-ip.org/vc/?root=webserver_8bit webserver_8bit]
      #include "webserver.h"
 
*Modify httpd-fs.h
 
**HTTPD_FS_STATISTICS set to 0
 
*Create a website using HTML tags with/without Javascript
 
*Modify httpd-fs.c
 
**changed #include "httpd-fsdata.c" to #include <httpd-fsdata.c>
 
*Generate httpd-fsdata.c for your website by executing '''perl makefsdata''' under your web root directory.
 
 
====add-on====
 
====add-on====
 
*The Web Server included in uIP 1.0 has been designed to load/reload the entire page (either html/shtml files) in response to a HTTP GET command, e.g.
 
*The Web Server included in uIP 1.0 has been designed to load/reload the entire page (either html/shtml files) in response to a HTTP GET command, e.g.
Line 130: Line 92:
 
*In consideration of the above issue, a solution is proposed here, so that the webserver can handle this kind of cgi HTTP-request
 
*In consideration of the above issue, a solution is proposed here, so that the webserver can handle this kind of cgi HTTP-request
 
   GET /abc.shtml?val=500.0&button=Set HTTP/1.1
 
   GET /abc.shtml?val=500.0&button=Set HTTP/1.1
*Modify httpd.c
 
**added #include "httpd-hget.h" in line 63
 
**added httpd_hget(s->filename) in line 224
 
*Create httpd-hget.h
 
**added to generate dynamic pages, e.g. /abc.shtml?button=Refresh
 
  #ifndef __HTTPD_HGET_H__
 
  #define __HTTPD_HGET_H__
 
      extern void httpd_hget(char *name);
 
  #endif
 
*Create httpd-hget.c
 
**an example is shown [http://chungyan5.no-ip.org/vc/tags/1.09.05/demo_posix/dspic/dspic33/rackmount/04_uip/uip/httpd-hget.c?root=freertos_posix&view=markup here]
 
  
  
 
===DNS Resolver===
 
===DNS Resolver===
*to be added
+
*Use project [http://chungyan5.no-ip.org/vc/?root=dns_resolv_8bit dns_resolv_8bit]
 +
*The uIP DNS resolver functions are used to lookup a hostname and map it to a numerical IP address. It maintains a list of resolved hostnames that can be queried with the resolv_lookup() function. New hostnames can be resolved using the resolv_query() function.
 +
*When a hostname has been resolved (or found to be non-existant), the resolver code calls a callback function called resolv_found() that must be implemented by the module that uses the resolver.
 +
*Router Setting
 +
**Special attention should be paid to router setting, when the DNS Server address is acquired by DHCP.
 +
**The DNS Resolver module assumes that the DNS server can support DNS TYPE of ANY, MX, CNAME and A. See http://www.networksorcery.com/enp/protocol/dns.htm for definitions of these options.
 +
*In case the router itself does not support these options, the router should be set to deliver a DNS Server address which support these options.
  
  
 
===SMTP Mail Client===
 
===SMTP Mail Client===
*to be added
+
*Use project [http://chungyan5.no-ip.org/vc/?root=smtpc_8bit smtpc_8bit]
 +
*The SMTP client searches the ip address of the mail server by a DNS call. It then logins to the server with the email account name and address using AUTH LOGIN. If login is successful, the mail is sent to the list of recipients.
  
  
Line 155: Line 113:
 
*It belongs to the Application Layer, as in HTTP.
 
*It belongs to the Application Layer, as in HTTP.
 
*If a device is SNMP compatible, any SNMP compatible host system can monitor and control that device.
 
*If a device is SNMP compatible, any SNMP compatible host system can monitor and control that device.
 +
  
 
====Components in a SNMP System====
 
====Components in a SNMP System====

Revision as of 20:57, 16 February 2009

Introduction

  • Developed by Adam Dunkels of the Networked Embedded Systems group at the Swedish Institute of Computer Science.
  • uIP is under the BSD-style license


Bug List

  • DHCP
    • dhcp client fault from buffalo router
    • occasionally cannot access webserver with dhcp
  • DHCP
    • dhcp client fault from main router
    • occasionally cannot access webserver with dhcp
    • possible cause: module tries to get IP configuration when switching on and off too frequently. This causes the router to enter into an unknown state. Even using the static mode with the same IP cannot get Internet access properly. When wait for some time and switch on the module again, the router may have been "reset", and the connection is ok again.


To-Do List

  • 32kB constant limitations
    • see if webserver can be stored in flash in file system
  • SNMP
    • porting snmp to uip
    • reference to lwip
    • a API(or any method) to let other system to talk to our device OR by scpi, modbus
  • SMTP
    • some router cannot used SMTP module
    • the router return its own IP as DNS resolver, and it does support only parsing direct IP function
    • desktop applications (e.g. outlook, thunderbird, webmail) do not use DNS resolver (UDP application) to connect to the mail server, but use TCP/IP to do the job
  • https by SSL


Porting

CVS Repository

Attribute Value
Host uip-stack.cvs.sourceforge.net
Repository Path /cvsroot/uip-stack
Connection Type pserver
User anonymous


Patches

  • Changes made to CVS Repository for porting to freertos_posix
  • uip-patch-1.0-01.diff (minimal)
    • uip.c
      • Comment out all DEBUG_PRINTF(...) in lines 1, 323, 910, 1015, 1070, 1863, 1868, 1869
  • uip-patch-1.0-02.diff (for pic30-elf-gcc compiler v3.01 or above)
    • uip.h
      • Change line 1070 to
        # define HTONS(n) (u16_t)(((((u16_t) (n)) << 8)&0xff00) | ((((u16_t) (n)) >> 8)&0x00ff))
    • psock.c
      • Change line 188 to
        s->sendptr = (u8_t*) buf;
      • Change lines 276, 303 to
        buf_setup(&psock->buf, (u8_t*)(psock->bufptr), psock->bufsize);
      • Change line 334 to
        buf_setup(&psock->buf, (u8_t*)buffer, buffersize);


Implementation

  • Include the following files to use the uIP stack
    • timer.c
    • uip.c
    • uip_arp.c
    • psock.c
  • The following files have been created to port uIP 1.0 to dsPic33F development board using FreeRTOS
  • clock-arch.c: return the os tick counts since the system is turned on.
  • clock-arch.h: a constant specifying the number of os ticks in one second.
  • uip-config.h: configuration for your application.


uIP Ethernet Application

  • The following applications are modified from the demo applications in uIP.

DHCP Client

  • Use project dhcpc_8bit
  • Enable UDP in "uip-config.h"
     #define UIP_CONF_UDP             1
  • Make sure your uip buffer size is large enough (DHCP messages from some servers can be more than 500 bytes). In my setting, I use 1536 in "uip-config.h"
     #define UIP_CONF_BUFFER_SIZE     1536


Web Server

add-on

  • The Web Server included in uIP 1.0 has been designed to load/reload the entire page (either html/shtml files) in response to a HTTP GET command, e.g.
  GET /index.html HTTP/1.1
  GET /abc.shtml HTTP/1.1
  • As a result, if the webpage is required to refresh the dynamic data periodically, the surfing experience will be degraded by the large transfer of datastream.
  • In consideration of the above issue, a solution is proposed here, so that the webserver can handle this kind of cgi HTTP-request
  GET /abc.shtml?val=500.0&button=Set HTTP/1.1


DNS Resolver

  • Use project dns_resolv_8bit
  • The uIP DNS resolver functions are used to lookup a hostname and map it to a numerical IP address. It maintains a list of resolved hostnames that can be queried with the resolv_lookup() function. New hostnames can be resolved using the resolv_query() function.
  • When a hostname has been resolved (or found to be non-existant), the resolver code calls a callback function called resolv_found() that must be implemented by the module that uses the resolver.
  • Router Setting
    • Special attention should be paid to router setting, when the DNS Server address is acquired by DHCP.
    • The DNS Resolver module assumes that the DNS server can support DNS TYPE of ANY, MX, CNAME and A. See http://www.networksorcery.com/enp/protocol/dns.htm for definitions of these options.
  • In case the router itself does not support these options, the router should be set to deliver a DNS Server address which support these options.


SMTP Mail Client

  • Use project smtpc_8bit
  • The SMTP client searches the ip address of the mail server by a DNS call. It then logins to the server with the email account name and address using AUTH LOGIN. If login is successful, the mail is sent to the list of recipients.


SNMP Agent (Not implemented yet)

  • Simple Network Management Protocol (SNMP) is a standard protocol to access variables to remote device via the Internet. Reference in wikipedia.org
  • It belongs to the Application Layer, as in HTTP.
  • If a device is SNMP compatible, any SNMP compatible host system can monitor and control that device.


Components in a SNMP System

  • Network Management Station (NMS)
    • This is a client, initiating SNMP communication.
    • This can be a PC with an NMS software (e.g. NINO), polling data from the SNMP agents periodically.
  • SNMP Agents
    • These are servers, responding to one or multiple NMS requests.
  • Management Information Base (MIB)
    • A special collection of variables managed by the SNMP agents.
    • MIB has a tree-like structure.
    • An Object Identifier (OID) is given for each node.
    • Data are stored at the end-nodes.
    • Private variables may be constructed under the "enterprise" sub-tree.
    • The OID for "enterprise" can be obtained from Internet Assigned Number Authority (IANA).

Abstract Syntax Notation

  • Each MIB variable contains several attributes, such as data type, access type and object identifier.
  • Abstract Syntax Notation version 1 (ASN.1) is a language to define these attributes in SNMP.


Reference

uIP

lwIP

HTML

  • W3 Schools: Learning how to write HTML and JavaScript

SNMP

  • SNMP Link: Information on SNMP Agents
  • IANA: Applying a Private Enterprise Number