K2.6 patches and update.
[tomato.git] / release / src-rt / wl / nas / nas_bsd.c
blob50ce5055124d919c8c378970adee647306e560fb
1 /*
2 * Network Authentication Service deamon (Linux)
4 * Copyright (C) 2010, Broadcom Corporation
5 * All Rights Reserved.
6 *
7 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
8 * the contents of this file may not be disclosed to third parties, copied
9 * or duplicated in any form, in whole or in part, without the prior
10 * written permission of Broadcom Corporation.
12 * $Id: nas_linux.c 241388 2011-02-18 03:33:22Z stakita $
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <unistd.h>
18 #include <string.h>
19 #include <errno.h>
21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <sys/ioctl.h>
24 #include <sys/time.h>
25 #include <netinet/in.h>
26 #include <net/if.h>
27 #include <net/if_arp.h>
28 #include <arpa/inet.h>
29 #include <signal.h>
30 #include <fcntl.h>
33 #include <typedefs.h>
34 #include <bcmutils.h>
35 #include <bcmnvram.h>
36 #include <proto/ethernet.h>
37 #include <proto/eapol.h>
38 #include <bcmcrypto/md5.h>
39 #include <wlutils.h>
41 #include <nas_wksp.h>
42 #include <eapd.h>
44 static nas_wksp_t * nas_nwksp = NULL;
46 void
47 nas_sleep_ms(uint ms)
49 usleep(1000*ms);
52 void
53 nas_rand128(uint8 *rand128)
55 static int dev_random_fd = -1;
56 struct timeval tv;
57 struct timezone tz;
58 MD5_CTX md5;
59 if (dev_random_fd == -1)
60 /* Use /dev/urandom because /dev/random, when it works at all,
61 * won't return anything when its entropy pool runs short and
62 * we can't control that. /dev/urandom look good enough.
64 dev_random_fd = open("/dev/urandom", O_RDONLY|O_NONBLOCK);
65 if (dev_random_fd != -1)
66 read(dev_random_fd, rand128, 16);
67 else {
68 gettimeofday(&tv, &tz);
69 tv.tv_sec ^= rand();
70 MD5Init(&md5);
71 MD5Update(&md5, (unsigned char *) &tv, sizeof(tv));
72 MD5Update(&md5, (unsigned char *) &tz, sizeof(tz));
73 MD5Final(rand128, &md5);
77 static void
78 hup_hdlr(int sig)
80 if (nas_nwksp)
81 nas_nwksp->flags = NAS_WKSP_FLAG_SHUTDOWN;
82 return;
86 * Configuration APIs
88 int
89 nas_safe_get_conf(char *outval, int outval_size, char *name)
91 char *val;
93 if (name == NULL || outval == NULL) {
94 if (outval)
95 memset(outval, 0, outval_size);
96 return -1;
99 val = nvram_safe_get(name);
100 if (!strcmp(val, ""))
101 memset(outval, 0, outval_size);
102 else
103 snprintf(outval, outval_size, "%s", val);
104 return 0;
107 /* service main entry */
109 main(int argc, char *argv[])
111 /* display usage if nothing is specified */
112 if (argc == 2 &&
113 (!strncmp(argv[1], "-h", 2) ||
114 !strncmp(argv[1], "-H", 2))) {
115 nas_wksp_display_usage();
116 return 0;
119 /* alloc nas/wpa work space */
120 if (!(nas_nwksp = nas_wksp_alloc_workspace())) {
121 NASMSG("Unable to allocate work space memory. Quitting...\n");
122 return 0;
125 if (argc > 1 && nas_wksp_parse_cmd(argc, argv, nas_nwksp)) {
126 NASMSG("Command line parsing error. Quitting...\n");
127 nas_wksp_free_workspace(nas_nwksp);
128 return 0;
130 else {
131 #ifdef BCMDBG
132 /* verbose - 0:no | others:yes */
133 /* for workspace */
134 char debug[8];
135 if (nas_safe_get_conf(debug, sizeof(debug), "nas_dbg") == 0)
136 debug_nwksp = (int)atoi(debug);
137 #endif
140 /* establish a handler to handle SIGTERM. */
141 signal(SIGTERM, hup_hdlr);
143 /* run main loop to dispatch messages */
144 nas_wksp_main_loop(nas_nwksp);
146 return 0;
149 void
150 nas_reset_board()
152 kill(1, SIGTERM);
153 return;