FORGOT YOUR DETAILS?

CREATE ACCOUNT

Unison Help

  1. Unison Kernel
    1. Pthreads
      1. pthread_create()
      2. pthread_exit()
      3. pthread_self()
      4. pthread_equal()
      5. pthread_join()
      6. pthread_detach()
      7. pthread_setschedparam()
      8. pthread_getschedparam()
      9. pthread_attr_init()
      10. pthread_attr_destroy()
      11. pthread_attr_setstackaddr()
      12. pthread_attr_getstackaddr()
      13. pthread_attr_setstacksize()
      14. pthread_attr_getstacksize()
      15. pthread_attr_setschedparam()
      16. pthread_attr_getschedparam()
      17. pthread_attr_setdetachstate()
      18. pthread_attr_getdetachstate()
      19. pthread_stackinfo()
      20. pthread_setprio()
      21. pthread_getprio()
      22. sched_get_priority_max()
      23. sched_get_priority_min()
      24. sched_yield()
    2. Pthread Cancellation
      1. pthread_cleanup_pop()
      2. pthread_cleanup_push()
      3. pthread_cancel()
      4. pthread_setcanceltype()
      5. pthread_setcancelstate()
      6. pthread_testcancel()
    3. Mutex
      1. pthread_mutex_init()
      2. pthread_mutex_destroy()
      3. pthread_mutex_lock()
      4. pthread_mutex_trylock()
      5. pthread_mutex_unlock()
    4. Semaphores
      1. sem_open()
      2. sem_close()
      3. sem_unlink()
      4. sem_init()
      5. sem_destroy()
      6. sem_wait()
      7. sem_trywait()
      8. sem_timedwait()
      9. sem_post()
      10. sem_getvalue()
    5. Message Queues
      1. mq_open()
      2. mq_close()
      3. mq_unlink()
      4. mq_send()
      5. mq_receive()
      6. mq_notify()
      7. mq_setattr()
      8. mq_getattr()
      9. mq_timedreceive()
      10. mq_timedsend()
    6. Conditional Variables
      1. pthread_cond_init()
      2. pthread_cond_destroy()
      3. pthread_cond_wait()
      4. pthread_cond_timedwait()
      5. pthread_cond_signal()
      6. pthread_cond_broadcast()
      7. pthread_condattr_init()
      8. pthread_condattr_destroy()
    7. Barriers
      1. pthread_barrier_init()
      2. pthread_barrier_destroy()
      3. pthread_barrier_wait()
    8. Timers
      1. timer_create()
      2. timer_delete()
      3. timer_settime()
      4. timer_gettime()
      5. timer_getoverrun()
      6. timer_tick()
      7. nanosleep()
    9. Clocks
      1. time()
      2. uptime()
      3. sleep()
      4. clock_settime()
      5. clock_gettime()
      6. clock_getres()
      7. clock_init()
    10. Memory Allocation
      1. POSIX.1
        1. malloc()
        2. free()
      2. Variable Length (Pools)
        1. pool_create()
        2. pool_destroy()
        3. pool_alloc()
        4. pool_free()
      3. Fixed Length (Partitions)
        1. pt_create()
        2. pt_destroy()
        3. pt_getblock()
        4. pt_freeblock()
    11. Rendezvous
      1. mr_init()
      2. mr_send()
      3. mr_receive()
      4. mr_reply()
      5. mr_sigrecv()
      6. mr_sigpost()
    12. Interrupts
      1. interrupts
      2. i_disable()
      3. i_restore()
    13. Directory Services
      1. dir_register()
      2. dir_deregister()
      3. dir_lookup()
      4. dir_lookup_string()
    14. Miscellaneous
      1. checkIstack()
      2. NanoStart() or DSPexec_Start()
      3. _isrStackFill
      4. Kernel Scaling
      5. kfatal()
      6. kalloc()
      7. kfree()
      8. mpu or mmu
      9. pthreadStackFill
      10. thread_numb()
      11. thread_utilization_start()
      12. thread_utilization_stop()
      13. xprintf()
      14. xputs()
      15. xputchar()
  2. Unison I/O Library
    1. accept()
    2. bind()
    3. chmod()
    4. close()
    5. connect()
    6. creat()
    7. fstat()
    8. getpeername()
    9. getsockname()
    10. getsockopt()
    11. ioctl()
    12. link()
    13. listen()
    14. lseek()
    15. mkdir()
    16. mkfs()
    17. mount()
    18. open()
    19. read()
    20. recv()
    21. recvfrom()
    22. rename()
    23. renameat()
    24. rmdir()
    25. select()
    26. send()
    27. sendto()
    28. setsockopt()
    29. shutdown()
    30. socket()
    31. stat()
    32. sync()
    33. umount()
    34. unlink()
    35. write()
  3. Unison STDIO Library
    1. STDIO Library Calls
      1. clearerr()
      2. dprintf()
      3. fclose()
      4. fdopen()
      5. feof()
      6. ferror()
      7. fileno()
      8. fflush()
      9. fgetc()
      10. fgetpos()
      11. fgets()
      12. fopen()
      13. fprintf()
      14. fputc()
      15. fputs()
      16. fread()
      17. freopen()
      18. fscanf()
      19. fseek()
      20. fseeko()
      21. fsetpos()
      22. ftell()
      23. ftello()
      24. fwrite()
      25. getc()
      26. getc_unlocked()
      27. getchar()
      28. getchar_unlocked()
      29. getdelim()
      30. getline()
      31. gets()
      32. get_stderr_ptr()
      33. get_stdin_ptr()
      34. get_stdout_ptr()
      35. noperprintf()
      36. perprintf()
      37. perror()
      38. posix_compat()
      39. printf()
      40. putc()
      41. putc_unlocked()
      42. putchar()
      43. putchar_unlocked()
      44. puts()
      45. remove()
      46. rewind()
      47. scanf()
      48. setbuf()
      49. setvbuf()
      50. snprintf()
      51. sprintf()
      52. sscanf()
      53. stderr_init()
      54. stderr_close()
      55. stdin_init()
      56. stdin_close()
      57. stdout_init()
      58. stdout_close()
      59. vdprintf()
      60. vscanf()
      61. vsscanf()
      62. vfscanf()
      63. vprintf()
      64. vsnprintf()
      65. vsprintf()
      66. vfprintf()
      67. ungetc()
    2. Do-nothing Stubs
      1. ctermid()
      2. flockfile()
      3. fmemopen()
      4. ftrylockfile()
      5. open_memstream()
      6. pclose()
      7. popen()
      8. tempnam()
      9. tmpfile()
      10. tmpnam()
  4. Unison LIBC Library
    1. LIBC Library Calls
      1. assert()
      2. realloc()
      3. strcasecmp()
      4. strdup()
      5. strncasecmp()
      6. strftime()
    2. Do-nothing Stubs
      1. abort()
      2. execve()
      3. exit()
      4. _Exit()
      5. fork()
      6. getpid()
      7. isatty()
      8. kill()
      9. sbrk()
      10. times()
      11. wait()
    3. Do-nothing Wide-character Stubs
      1. <wchar.h>
      2. <wctype.h>
  5. Unison I/O Servers
    1. File Servers
      1. Multimedia File Server - fsys
      2. FAT File System - fatfs
      3. NAND File Server - nandfsys
      4. NOR File Server - norfsys
      5. Network File Server - nfs
  6. Graphics, Camera, Video, Audio
    1. Vendor Graphics
    2. Prism++ Graphics
    3. ADPCM Services - adpcmd
    4. Camera
  7. Network Protocols
    1. TCP and UDP Server - tcpd
      1. IPv4 only server
      2. IPv4/IPv6 server
    2. DHCP Client Service - dhcp client
    3. DHCP Server - dhcpd
    4. Telnet Server - telnetd
    5. Tiny FTP Server - tftpd
    6. Point to Point - pppd
    7. Network Translation - NAT with PAT
    8. Firewall
      1. Packet filter: pf
      2. Packet filter control: pfctl
      3. Fitler rules: pf.filtering
      4. Translation rules: pf.nat
    9. Tiny HTTP Server - thttpd
    10. Tiny HTTP Server with TLS
    11. POP3 Server
    12. Simple Mail Transfer Protocol Services (SMTP)
    13. Bootp Protocol
    14. File Transfer Protocol Server (FTP)
    15. File Transfer Client Services
    16. RPC / XDR
    17. DNS Client
    18. HTTP/HTTPS Client
    19. REST Client
    20. AutoIP Service - autoip client
    21. mDNS server - mdnsd
    22. SNTP Client
    23. SNMP Agent - Snmpd server
    24. SSL/TLS library
    25. SSH server
    26. IP security
      1. IPsec description
      2. IPsec administration: ipsecadm
      3. Virtual Private Network: VPN
    27. Power Control
      1. Motor and Motion Control Servers
      2. PWM, Encoders
    28. Serial I/O
      1. Asynchronous Serial I/O Server - ttyserver
      2. CAN Server - cand
      3. I2C Server - i2cd
      4. I2S Server - i2sd
    29. System Services
      1. Power Management Servers
      2. Login Service - login_services
      3. XML
      4. POSIX Shell and Login Service - posh
    30. Universal Serial Bus (USB)
      1. USB Server
      2. USB Device Server
      3. USB Embedded Host Server
    31. Wireless
      1. Wireless Servers and Drivers
      2. 802.15.4 Radio Servers
      3. TCP/v6 with 6loWPAN
      4. ZigBee
      5. BlueTooth Server
      6. 802.11 Wi-Fi
      7. GPRS, UHF and GPS Radio Servers
    32. Remedy Tools for Unison
      1. Remedy Data Logging and Event Display Tools
      2. Remedy Diagnostics
      3. Remedy Flash Downloader/Bootloader
      4. Remedy Power On Self Test - POST
      5. Remedy OS Object Viewer
      6. Remedy Remote Control Tools

7.6. Point to Point - pppd #

NAME

PPP Server – pppd

SYNOPSIS

#include <netinet/ppp.h>

DESCRIPTION

Point-to-Point Protocol (PPP) is a data link protocol commonly used in establishing a direct connection between two networking nodes. It uses Link Control Protocol (LCP) to negotiate connection capabilities and to establish, configure, and test the link.

A TCP server talks across Ethernet to communicate to other nodes on a subnet when using IPv4. If the node that a user wants to communicate with is not on the subnet, then the packet will be routed through the gateway node to the remote node. To perform this tcp-server supports packet routing between interfaces.

If a subnet is remote, and is connected via a wireless link like GPRS or another wireless or wireline link, two more aspects come into play. First the protocol to communicate over serial lines must be used. It is called PPP. Now the node which hosts PPP and another Ethernet becomes a gateway and must route packets between the inerfaces.

The second aspect of setting up a serial link is that there is generally a modem which must be initialized and connected first before the network is setup. If there is a link failure on the modem, this link failure must be communicated and the modem restarted before the link can be brought back up. The command set that is used is called an AT command set for historical reasons. These are relatively standard commands widely used for a variety of purposes in communications and industrial control.

Together with pppd can be used Network Address Translation (NAT) mechanism. Node can connect to the ISP and provide access to the Internet all the nodes on the LAN via NAT. This technology presents in two Unison components: simple NAT and packet filter pf.

Pppd requires a configuration record for initialization related to authentication which is setup by an interface call or with direct structure modification.

The basic features of the pppd are:

    1. • PPP

 

    1. • Good authentication

 

    1. • A PPP implementation architecture which enables modem configuration using AT or other commands before PPP is run.

 

    1. • Off the shelf authentication

 

    1. • User management features

 

The basic steps for configuration pppd are:

    1. 1. Call

pppInit()

    1. to start the server.

 

    1. 2. Modify values in the

ppp_settings

    1. structure.

 

    1. 3. Setup the authorization using

pppSetAuth()

    1. .

 

    1. 4. Use

pppOpen

    1. to start the link using a particular serial line, specifying the callback function for errors handling.

 

    5. Now you should be up and running.

To get the status while the link is up, call pppIOCTL().

If errors occur, the callback function is called with and error code and the application programmer must take appropriate action. If an error occurs because the link went down, the connection is automatically closed.

To close the link at any time, simply call pppClose() or pppSIGHUP() if the serial link has been dropped.

User functions

void pppInit(void);
Initialize the PPP subsystem.

void pppSetAuth(enum pppAuthType authType, const char *user, const char *passwd);
Set the authorization: authentication type, user name and password. Authentication can be:

    enum pppAuthType {
        PPPAUTHTYPE_NONE,
        PPPAUTHTYPE_ANY,
        PPPAUTHTYPE_PAP,
        PPPAUTHTYPE_CHAP
    };

int pppOpen(char *tty_name, int prio, void (*linkStatusCB)(void *ctx, int errCode, void *arg), void *linkStatusCtx);
Open a new PPP connection using the given I/O device tty_name. This initializes the PPP control block and start PPP thread with priority prio. When errors will occur will be called callback function linkStatusCB with linkStatusCtx context and appropriate error code and argument. Error code can be:

    /* Error codes. */
    #define PPPERR_NONE 0               /* No error. */
    #define PPPERR_PARAM -1             /* Invalid parameter. */
    #define PPPERR_OPEN -2              /* Unable to open PPP session. */
    #define PPPERR_DEVICE -3            /* Invalid I/O device for PPP. */
    #define PPPERR_ALLOC -4             /* Unable to allocate resources. */
    #define PPPERR_USER -5              /* User interrupt. */
    #define PPPERR_CONNECT -6           /* Connection lost. */
    #define PPPERR_AUTHFAIL -7          /* Failed authentication challenge. */
    #define PPPERR_PROTOCOL -8          /* Failed to meet protocol. */

int pppClose(int pd);
Close a PPP connection and release the descriptor. Any outstanding packets in the queues are dropped. Return 0 on success, an error code on failure.
Note:
pppClose() is a friendly way to shutdown the link, and inform the other end that we have shutdown.

void pppSigHUP(int pd);
Indicate to the PPP process that the line has disconnected.
Note:
pppSigHUP() is to be used when the serial link has been dropped. Maybe the communication to the modem has died.

int pppIOCtl(int pd, int cmd, void *arg);
Get and set parameters for the given connection. Return 0 on success, an error code on failure.
Possible commands:
PPPCTLG_UPSTATUS – get the up status – 0 down else up
PPPCTLS_ERRCODE – set the error code
PPPCTLG_ERRCODE – get the error code
PPPCTLG_FD – get the fd associated with the ppp
PPPCTLG_STATS – get the ppp statistics

Structure for pppd statistics:

    struct pppd_stats {
        unsigned long   pkts_in;
        unsigned long   pkts_out;
        unsigned long   pkts_drop;
        unsigned long   pkts_lenerr;
        unsigned long   pkts_chkerr;
    };

u_int pppMTU(int pd);
Return the Maximum Transmission Unit for the given PPP connection.

struct ppp_addrs *pppGetIP(int pd);
Get all IP addresses for PPP connection.

    struct ppp_addrs {
        struct in_addr our_ipaddr, his_ipaddr, netmask, dns1, dns2;
    };

void pppSetServerDefaultIP(uint_32 ip);
Set default IP addresses for PPP server. Some PPP servers do not send to client self IP-address, so pppd use default address, defined by user.

Additional parameters

pppd has some additional parameters in structure ppp_settings:
ppp_settings.idle_time_limit – shut down link if idle for this long
ppp_settings.maxconnect – maximum connect time (seconds)
ppp_settings.flow_ctl – flow control mode
Flow control codes:

    #define FLCTL_NONE      0
    #define FLCTL_XONXOFF   1
    #define FLCTL_CRTSCTS   2

Connection close callbacks

If a connection is closed, the callback gets called twice in most cases. The following is a summary of the conditions and the errors generated.

Closed by the remote side.
ISP normally closes ppp connection. User will get 2 callback events:
– PPPERR_CONNECT (Connection lost)
– PPPERR_PROTOCOL (Failed to meet protocol)

Closed by user command.
User closed connection by command pppClose(). User will get 2 callback events:
– PPPERR_CONNECT (Connection lost)
– PPPERR_USER (User interrupt)

Closed by user max time connect expired.
User can set max time for the connection:
ppp_settings.maxconnect = 10; // time in seconds
User will get 2 callback events:
– PPPERR_CONNECT (Connection lost)
– PPPERR_PROTOCOL (Failed to meet protocol)

Closed by link failure.
pppd automatically sends control link packets. If pppd does not get a response from remote side, the user will get 2 callback events:
– PPPERR_CONNECT (Connection lost)
– PPPERR_PROTOCOL (Failed to meet protocol)

After any close event, the user can open the modem tty port and try to reconnect to ISP using AT commands.

 

EXAMPLE

Setup and start pppd:

int start_pppd(void)
{
	int i, res;

	// Init PPP structures
	pppInit();

	// Init other PPP options
	pppSetAuth(PPPAUTHTYPE_PAP, "user", "passwd");
	ppp_settings.flow_ctl = FLCTL_XONXOFF;


	// Start PPP thread
	ppp_id = pppOpen("/dev/ttyS2", PPPD_PRIO, ppp_callback, (void*)1);


	// check while PPP set status to 'up'
	if (ppp_id >= 0)
	{
		for (i = 0; i < 5; i++)
		{
			sleep(1);
			pppIOCtl(ppp_id, PPPCTLG_UPSTATUS, &res);
			if (res == 1)
				break;
		}
		if (i == 5)
		{
			pppClose(ppp_id);
			sleep(5);
			return -1;
		}
	}
	else
		return -1;

	return 0;
}

Callback function:

void ppp_callback(void *ctx, int errCode, void *arg)
{
	struct ppp_addrs *addr;
	struct pppd_stats *stat;

	printf("   ***   ppp_callback: ctx: 0x%x, err: %d, arg: 0x%x\n", (int)ctx, errCode, (int)arg);

	switch (errCode)
	{
		case PPPERR_NONE:
			printf("No error.\n");
			addr = (struct ppp_addrs *)arg;
			printf("   ***   our ipaddr = %s\n", inet_ntoa(addr->our_ipaddr));
			printf("   ***   his ipaddr = %s\n", inet_ntoa(addr->his_ipaddr));
			printf("   ***   netmask = %s\n", inet_ntoa(addr->netmask));
			printf("   ***   dns1 = %s\n", inet_ntoa(addr->dns1));
			printf("   ***   dns2 = %s\n", inet_ntoa(addr->dns2));
			break;
		case PPPERR_PARAM:
			printf("Invalid parameter.\n");
			break;
		case PPPERR_OPEN:
			printf("Unable to open PPP session.\n");
			break;
		case PPPERR_DEVICE:
			printf("Invalid I/O device for PPP.\n");
			break;
		case PPPERR_ALLOC:
			printf("Unable to allocate resources.\n");
			break;
		case PPPERR_USER:
			printf("User interrupt.\n");
			break;
		case PPPERR_CONNECT:
			printf("Connection lost.\n");
			pppIOCtl(ppp_id, PPPCTLG_STATS, &stat);
			printf("   ***   in packets = %lu\n", stat->pkts_in);
			printf("   ***   out packets = %lu\n", stat->pkts_out);
			printf("   ***   drop packets = %lu\n", stat->pkts_drop);
			printf("   ***   len error packets = %lu\n", stat->pkts_lenerr);
			printf("   ***   checksum error packets = %lu\n", stat->pkts_chkerr);
			break;
		case PPPERR_AUTHFAIL:
			printf("Failed authentication challenge.\n");
			break;
		case PPPERR_PROTOCOL:
			printf("Failed to meet protocol.\n");
			break;
		default:
			printf("Unknown callback!!!\n");
			break;
	}
}

NOTES

There is a demo PPP available for the Unison and DSPnano NAT which is found in installdir/demos.

SEE ALSO

tcpd, tcpd_dual, simple NAT, pf

Home page (Servers)

 

Suggest Edit

CONTACT US

TO GET YOUR PROJECT STARTED

TOP