sdla_ppp.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:104k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2. * sdla_ppp.c WANPIPE(tm) Multiprotocol WAN Link Driver. PPP module.
  3. *
  4. * Author:  Nenad Corbic <ncorbic@sangoma.com>
  5. *
  6. * Copyright: (c) 1995-2001 Sangoma Technologies Inc.
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License
  10. * as published by the Free Software Foundation; either version
  11. * 2 of the License, or (at your option) any later version.
  12. * ============================================================================
  13. * Feb 28, 2001  Nenad Corbic o Updated if_tx_timeout() routine for 
  14. *    2.4.X kernels.
  15. * Nov 29, 2000  Nenad Corbic o Added the 2.4.x kernel support:
  16. *    get_ip_address() function has moved
  17. *    into the ppp_poll() routine. It cannot
  18. *    be called from an interrupt.
  19. * Nov 07, 2000  Nenad Corbic o Added security features for UDP debugging:
  20. *                                 Deny all and specify allowed requests.
  21. * May 02, 2000  Nenad Corbic o Added the dynamic interface shutdown
  22. *                                 option. When the link goes down, the
  23. *                                 network interface IFF_UP flag is reset.
  24. * Mar 06, 2000  Nenad Corbic o Bug Fix: corrupted mbox recovery.
  25. * Feb 25, 2000  Nenad Corbic    o Fixed the FT1 UDP debugger problem.
  26. * Feb 09, 2000  Nenad Coribc    o Shutdown bug fix. update() was called
  27. *                                 with NULL dev pointer: no check.
  28. * Jan 24, 2000  Nenad Corbic    o Disabled use of CMD complete inter.
  29. * Dev 15, 1999  Nenad Corbic    o Fixed up header files for 2.0.X kernels
  30. * Oct 25, 1999  Nenad Corbic    o Support for 2.0.X kernels
  31. *                                 Moved dynamic route processing into 
  32. *                                 a polling routine.
  33. * Oct 07, 1999  Nenad Corbic    o Support for S514 PCI card.  
  34. *               Gideon Hack     o UPD and Updates executed using timer interrupt
  35. * Sep 10, 1999  Nenad Corbic    o Fixed up the /proc statistics
  36. * Jul 20, 1999  Nenad Corbic    o Remove the polling routines and use 
  37. *                                 interrupts instead.
  38. * Sep 17, 1998 Jaspreet Singh o Updates for 2.2.X Kernels.
  39. * Aug 13, 1998 Jaspreet Singh o Improved Line Tracing.
  40. * Jun 22, 1998 David Fong o Added remote IP address assignment
  41. * Mar 15, 1998 Alan Cox o 2.1.8x basic port.
  42. * Apr 16, 1998 Jaspreet Singh o using htons() for the IPX protocol.
  43. * Dec 09, 1997 Jaspreet Singh o Added PAP and CHAP.
  44. * o Implemented new routines like 
  45. *   ppp_set_inbnd_auth(), ppp_set_outbnd_auth(),
  46. *   tokenize() and strstrip().
  47. * Nov 27, 1997 Jaspreet Singh o Added protection against enabling of irqs 
  48. *   while they have been disabled.
  49. * Nov 24, 1997  Jaspreet Singh  o Fixed another RACE condition caused by
  50. *                                 disabling and enabling of irqs.
  51. *                               o Added new counters for stats on disable/enable
  52. *                                 IRQs.
  53. * Nov 10, 1997 Jaspreet Singh o Initialized 'skb->mac.raw' to 'skb->data'
  54. *   before every netif_rx().
  55. * o Free up the device structure in del_if().
  56. * Nov 07, 1997 Jaspreet Singh o Changed the delay to zero for Line tracing
  57. *   command.
  58. * Oct 20, 1997  Jaspreet Singh o Added hooks in for Router UP time.
  59. * Oct 16, 1997 Jaspreet Singh  o The critical flag is used to maintain flow
  60. *   control by avoiding RACE conditions.  The 
  61. *   cli() and restore_flags() are taken out.
  62. *   A new structure, "ppp_private_area", is added 
  63. *   to provide Driver Statistics.   
  64. * Jul 21, 1997  Jaspreet Singh o Protected calls to sdla_peek() by adding 
  65. *   save_flags(), cli() and restore_flags().
  66. * Jul 07, 1997 Jaspreet Singh  o Added configurable TTL for UDP packets
  67. * o Added ability to discard mulitcast and
  68. *   broacast source addressed packets.
  69. * Jun 27, 1997  Jaspreet Singh o Added FT1 monitor capabilities
  70. *   New case (0x25) statement in if_send routine.
  71. *   Added a global variable rCount to keep track
  72. *   of FT1 status enabled on the board.
  73. * May 22, 1997 Jaspreet Singh o Added change in the PPP_SET_CONFIG command for
  74. * 508 card to reflect changes in the new 
  75. * ppp508.sfm for supporting:continous transmission
  76. * of Configure-Request packets without receiving a
  77. * reply 
  78. * OR-ed 0x300 to conf_flags 
  79. *         o Changed connect_tmout from 900 to 0
  80. * May 21, 1997 Jaspreet Singh  o Fixed UDP Management for multiple boards
  81. * Apr 25, 1997  Farhan Thawar    o added UDP Management stuff
  82. * Mar 11, 1997  Farhan Thawar   Version 3.1.1
  83. *                                o fixed (+1) bug in rx_intr()
  84. *                                o changed if_send() to return 0 if
  85. *                                  wandev.critical() is true
  86. *                                o free socket buffer in if_send() if
  87. *                                  returning 0 
  88. * Jan 15, 1997 Gene Kozin Version 3.1.0
  89. *  o implemented exec() entry point
  90. * Jan 06, 1997 Gene Kozin Initial version.
  91. *****************************************************************************/
  92. #include <linux/module.h>
  93. #include <linux/version.h>
  94. #include <linux/kernel.h> /* printk(), and other useful stuff */
  95. #include <linux/stddef.h> /* offsetof(), etc. */
  96. #include <linux/errno.h> /* return codes */
  97. #include <linux/string.h> /* inline memset(), etc. */
  98. #include <linux/slab.h> /* kmalloc(), kfree() */
  99. #include <linux/wanrouter.h> /* WAN router definitions */
  100. #include <linux/wanpipe.h> /* WANPIPE common user API definitions */
  101. #include <linux/if_arp.h> /* ARPHRD_* defines */
  102. #include <asm/byteorder.h> /* htons(), etc. */
  103. #include <linux/in.h> /* sockaddr_in */
  104. #include <linux/inet.h> /* in_aton(), in_ntoa() prototypes */
  105. /* ---- 2.4.X KERNEL SUPPORT -----------------------*/
  106. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  107.  #include <asm/uaccess.h>
  108.  #include <linux/inetdevice.h>
  109.  #include <linux/netdevice.h>
  110. #else
  111.  #include <asm/segment.h>
  112.  #include <net/route.h>          /* Adding new route entries : 2.0.X kernels */
  113. #endif
  114. #include <linux/if.h>
  115. #include <linux/sdla_ppp.h> /* PPP firmware API definitions */
  116. #include <linux/sdlasfm.h> /* S514 Type Definition */
  117. /****** Defines & Macros ****************************************************/
  118. #define PPP_DFLT_MTU 1500 /* default MTU */
  119. #define PPP_MAX_MTU 4000 /* maximum MTU */
  120. #define PPP_HDR_LEN 1
  121. #define MAX_IP_ERRORS 100 
  122. #define CONNECT_TIMEOUT (90*HZ) /* link connection timeout */
  123. #define HOLD_DOWN_TIME (5*HZ) /* link hold down time : Changed from 30 to 5 */
  124. /* For handle_IPXWAN() */
  125. #define CVHexToAscii(b) (((unsigned char)(b) > (unsigned char)9) ? ((unsigned char)'A' + ((unsigned char)(b) - (unsigned char)10)) : ((unsigned char)'0' + (unsigned char)(b)))
  126. /* Macro for enabling/disabling debugging comments */
  127. //#define NEX_DEBUG
  128. #ifdef NEX_DEBUG
  129. #define NEX_PRINTK(format, a...) printk(format, ## a)
  130. #else
  131. #define NEX_PRINTK(format, a...)
  132. #endif /* NEX_DEBUG */ 
  133. #define DCD(a)   ( a & 0x08 ? "HIGH" : "LOW" )
  134. #define CTS(a)   ( a & 0x20 ? "HIGH" : "LOW" )
  135. #define LCP(a)   ( a == 0x09 ? "OPEN" : "CLOSED" )
  136. #define IP(a)    ( a == 0x09 ? "ENABLED" : "DISABLED" )
  137. #define TMR_INT_ENABLED_UPDATE   0x01
  138. #define TMR_INT_ENABLED_PPP_EVENT 0x02
  139. #define TMR_INT_ENABLED_UDP 0x04
  140. #define TMR_INT_ENABLED_CONFIG 0x20
  141. /* Set Configuraton Command Definitions */
  142. #define PERCENT_TX_BUFF 60
  143. #define TIME_BETWEEN_CONF_REQ   30
  144. #define TIME_BETWEEN_PAP_CHAP_REQ 30
  145. #define WAIT_PAP_CHAP_WITHOUT_REPLY     300
  146. #define WAIT_AFTER_DCD_CTS_LOW          5
  147. #define TIME_DCD_CTS_LOW_AFTER_LNK_DOWN 10
  148. #define WAIT_DCD_HIGH_AFTER_ENABLE_COMM 900
  149. #define MAX_CONF_REQ_WITHOUT_REPLY      10
  150. #define MAX_TERM_REQ_WITHOUT_REPLY      2
  151. #define NUM_CONF_NAK_WITHOUT_REPLY      5
  152. #define NUM_AUTH_REQ_WITHOUT_REPLY      10
  153. #define END_OFFSET 0x1F0
  154. #if LINUX_VERSION_CODE < 0x020125
  155. #define test_and_set_bit set_bit
  156. #define net_ratelimit() 1
  157. #endif
  158. /******Data Structures*****************************************************/
  159. /* This structure is placed in the private data area of the device structure.
  160.  * The card structure used to occupy the private area but now the following 
  161.  * structure will incorporate the card structure along with PPP specific data
  162.  */
  163.   
  164. typedef struct ppp_private_area
  165. {
  166. netdevice_t *slave;
  167. sdla_t* card;
  168. unsigned long router_start_time; /*router start time in sec */
  169. unsigned long tick_counter; /*used for 5 second counter*/
  170. unsigned mc; /*multicast support on or off*/
  171. unsigned char enable_IPX;
  172. unsigned long network_number;
  173. unsigned char pap;
  174. unsigned char chap;
  175. unsigned char sysname[31]; /* system name for in-bnd auth*/
  176. unsigned char userid[511]; /* list of user ids */
  177. unsigned char passwd[511]; /* list of passwords */
  178. unsigned protocol; /* SKB Protocol */
  179. u32 ip_local; /* Local IP Address */
  180. u32 ip_remote; /* remote IP Address */
  181. u32 ip_local_tmp;
  182. u32 ip_remote_tmp;
  183. unsigned char timer_int_enabled; /* Who enabled the timer inter*/
  184. unsigned char update_comms_stats; /* Used by update function */
  185. unsigned long curr_trace_addr; /* Trace information */
  186. unsigned long start_trace_addr;
  187. unsigned long end_trace_addr;
  188. unsigned char interface_down; /* Brind down interface when channel 
  189.                                                    goes down */
  190. unsigned long config_wait_timeout; /* After if_open() if in dynamic if mode,
  191.    wait a few seconds before configuring */
  192. unsigned short udp_pkt_lgth;
  193. char  udp_pkt_src;
  194.        char  udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT];
  195. /* PPP specific statistics */
  196. if_send_stat_t if_send_stat;
  197. rx_intr_stat_t rx_intr_stat;
  198. pipe_mgmt_stat_t pipe_mgmt_stat;
  199. unsigned long router_up_time; 
  200. /* Polling task queue. Each interface
  201.          * has its own task queue, which is used
  202.          * to defer events from the interrupt */
  203. struct tq_struct poll_task;
  204. struct timer_list poll_delay_timer;
  205. u8 gateway;
  206. u8 config_ppp;
  207. u8 ip_error;
  208. }ppp_private_area_t;
  209. /* variable for keeping track of enabling/disabling FT1 monitor status */
  210. static int rCount = 0;
  211. extern void disable_irq(unsigned int);
  212. extern void enable_irq(unsigned int);
  213. /****** Function Prototypes *************************************************/
  214. /* WAN link driver entry points. These are called by the WAN router module. */
  215. static int update(wan_device_t *wandev);
  216. static int new_if(wan_device_t *wandev, netdevice_t *dev, wanif_conf_t *conf);
  217. static int del_if(wan_device_t *wandev, netdevice_t *dev);
  218. /* WANPIPE-specific entry points */
  219. static int wpp_exec (struct sdla *card, void *u_cmd, void *u_data);
  220. /* Network device interface */
  221. static int if_init(netdevice_t *dev);
  222. static int if_open(netdevice_t *dev);
  223. static int if_close(netdevice_t *dev);
  224. static int if_header(struct sk_buff *skb, netdevice_t *dev, unsigned short type, 
  225.      void *daddr, void *saddr, unsigned len);
  226. #ifdef LINUX_2_4
  227. static void if_tx_timeout (netdevice_t *dev);
  228. #endif
  229. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  230. static int if_rebuild_hdr(struct sk_buff *skb);
  231. static struct net_device_stats *if_stats(netdevice_t *dev);
  232. #else
  233. static struct enet_statistics *if_stats(netdevice_t *dev);
  234. static int if_rebuild_hdr (void* hdr, netdevice_t* dev, unsigned long raddr,
  235.         struct sk_buff* skb);
  236. #endif
  237. static int if_send(struct sk_buff *skb, netdevice_t *dev);
  238. /* PPP firmware interface functions */
  239. static int ppp_read_version(sdla_t *card, char *str);
  240. static int ppp_set_outbnd_auth(sdla_t *card, ppp_private_area_t *ppp_priv_area);
  241. static int ppp_set_inbnd_auth(sdla_t *card, ppp_private_area_t *ppp_priv_area);
  242. static int ppp_configure(sdla_t *card, void *data);
  243. static int ppp_set_intr_mode(sdla_t *card, unsigned char mode);
  244. static int ppp_comm_enable(sdla_t *card);
  245. static int ppp_comm_disable(sdla_t *card);
  246. static int ppp_comm_disable_shutdown(sdla_t *card);
  247. static int ppp_get_err_stats(sdla_t *card);
  248. static int ppp_send(sdla_t *card, void *data, unsigned len, unsigned proto);
  249. static int ppp_error(sdla_t *card, int err, ppp_mbox_t *mb);
  250. static void wpp_isr(sdla_t *card);
  251. static void rx_intr(sdla_t *card);
  252. static void event_intr(sdla_t *card);
  253. static void timer_intr(sdla_t *card);
  254. /* Background polling routines */
  255. static void process_route(sdla_t *card);
  256. static void retrigger_comm(sdla_t *card);
  257. /* Miscellaneous functions */
  258. static int read_info( sdla_t *card );
  259. static int read_connection_info (sdla_t *card);
  260. static void remove_route( sdla_t *card );
  261. static int config508(netdevice_t *dev, sdla_t *card);
  262. static void show_disc_cause(sdla_t * card, unsigned cause);
  263. static int reply_udp( unsigned char *data, unsigned int mbox_len );
  264. static void process_udp_mgmt_pkt(sdla_t *card, netdevice_t *dev, 
  265. ppp_private_area_t *ppp_priv_area);
  266. static void init_ppp_tx_rx_buff( sdla_t *card );
  267. static int intr_test( sdla_t *card );
  268. static int udp_pkt_type( struct sk_buff *skb , sdla_t *card);
  269. static void init_ppp_priv_struct( ppp_private_area_t *ppp_priv_area);
  270. static void init_global_statistics( sdla_t *card );
  271. static int tokenize(char *str, char **tokens);
  272. static char* strstrip(char *str, char *s);
  273. static int chk_bcast_mcast_addr(sdla_t* card, netdevice_t* dev,
  274. struct sk_buff *skb);
  275. static int config_ppp (sdla_t *);
  276. static void ppp_poll(netdevice_t *);
  277. static void trigger_ppp_poll(netdevice_t *);
  278. static void ppp_poll_delay (unsigned long dev_ptr);
  279. static int Read_connection_info;
  280. static int Intr_test_counter;
  281. static unsigned short available_buffer_space;
  282. /* IPX functions */
  283. static void switch_net_numbers(unsigned char *sendpacket, unsigned long network_number, 
  284.        unsigned char incoming);
  285. static int handle_IPXWAN(unsigned char *sendpacket, char *devname, unsigned char enable_PX, 
  286.  unsigned long network_number, unsigned short proto);
  287. /* Lock Functions */
  288. static void s508_lock (sdla_t *card, unsigned long *smp_flags);
  289. static void s508_unlock (sdla_t *card, unsigned long *smp_flags);
  290. static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card,
  291.                                 struct sk_buff *skb, netdevice_t* dev,
  292.                                 ppp_private_area_t* ppp_priv_area );
  293. static unsigned short calc_checksum (char *data, int len);
  294. static void disable_comm (sdla_t *card);
  295. static int detect_and_fix_tx_bug (sdla_t *card);
  296. /****** Public Functions ****************************************************/
  297. /*============================================================================
  298.  * PPP protocol initialization routine.
  299.  *
  300.  * This routine is called by the main WANPIPE module during setup.  At this
  301.  * point adapter is completely initialized and firmware is running.
  302.  *  o read firmware version (to make sure it's alive)
  303.  *  o configure adapter
  304.  *  o initialize protocol-specific fields of the adapter data space.
  305.  *
  306.  * Return: 0 o.k.
  307.  * < 0 failure.
  308.  */
  309. int wpp_init(sdla_t *card, wandev_conf_t *conf)
  310. {
  311. ppp_flags_t *flags;
  312. union
  313. {
  314. char str[80];
  315. } u;
  316. /* Verify configuration ID */
  317. if (conf->config_id != WANCONFIG_PPP) {
  318. printk(KERN_INFO "%s: invalid configuration ID %u!n",
  319. card->devname, conf->config_id);
  320. return -EINVAL;
  321. }
  322. /* Initialize miscellaneous pointers to structures on the adapter */
  323. switch (card->hw.type) {
  324. case SDLA_S508:
  325. card->mbox =(void*)(card->hw.dpmbase + PPP508_MB_OFFS);
  326. card->flags=(void*)(card->hw.dpmbase + PPP508_FLG_OFFS);
  327. break;
  328. case SDLA_S514:
  329. card->mbox =(void*)(card->hw.dpmbase + PPP514_MB_OFFS);
  330. card->flags=(void*)(card->hw.dpmbase + PPP514_FLG_OFFS);
  331. break;
  332. default:
  333. return -EINVAL;
  334. }
  335. flags = card->flags;
  336. /* Read firmware version.  Note that when adapter initializes, it
  337.  * clears the mailbox, so it may appear that the first command was
  338.  * executed successfully when in fact it was merely erased. To work
  339.  * around this, we execute the first command twice.
  340.  */
  341. if (ppp_read_version(card, NULL) || ppp_read_version(card, u.str))
  342. return -EIO;
  343. printk(KERN_INFO "%s: running PPP firmware v%sn",card->devname, u.str); 
  344. /* Adjust configuration and set defaults */
  345. card->wandev.mtu = (conf->mtu) ?
  346. min_t(unsigned int, conf->mtu, PPP_MAX_MTU) : PPP_DFLT_MTU;
  347. card->wandev.bps = conf->bps;
  348. card->wandev.interface = conf->interface;
  349. card->wandev.clocking = conf->clocking;
  350. card->wandev.station = conf->station;
  351. card->isr = &wpp_isr;
  352. card->poll = NULL; 
  353. card->exec = &wpp_exec;
  354. card->wandev.update = &update;
  355. card->wandev.new_if = &new_if;
  356. card->wandev.del_if = &del_if;
  357.         card->wandev.udp_port   = conf->udp_port;
  358. card->wandev.ttl = conf->ttl;
  359. card->wandev.state      = WAN_DISCONNECTED;
  360. card->disable_comm = &disable_comm;
  361. card->irq_dis_if_send_count = 0;
  362.         card->irq_dis_poll_count = 0;
  363. card->u.p.authenticator = conf->u.ppp.authenticator;
  364. card->u.p.ip_mode  = conf->u.ppp.ip_mode ?
  365.  conf->u.ppp.ip_mode : WANOPT_PPP_STATIC;
  366.         card->TracingEnabled    = 0;
  367. Read_connection_info    = 1;
  368. /* initialize global statistics */
  369. init_global_statistics( card );
  370. if (!card->configured){
  371. int err;
  372. Intr_test_counter = 0;
  373. err = intr_test(card);
  374. if(err || (Intr_test_counter < MAX_INTR_TEST_COUNTER)) {
  375. printk("%s: Interrupt Test Failed, Counter: %in", 
  376. card->devname, Intr_test_counter);
  377. printk( "%s: Please choose another interruptn",card->devname);
  378. return -EIO;
  379. }
  380. printk(KERN_INFO "%s: Interrupt Test Passed, Counter: %in", 
  381. card->devname, Intr_test_counter);
  382. card->configured = 1;
  383. }
  384. ppp_set_intr_mode(card, PPP_INTR_TIMER); 
  385. /* Turn off the transmit and timer interrupt */
  386. flags->imask &= ~PPP_INTR_TIMER;
  387. printk(KERN_INFO "n");
  388. return 0;
  389. }
  390. /******* WAN Device Driver Entry Points *************************************/
  391. /*============================================================================
  392.  * Update device status & statistics.
  393.  */
  394. static int update(wan_device_t *wandev)
  395. {
  396. sdla_t* card = wandev->private;
  397.   netdevice_t* dev;
  398.         volatile ppp_private_area_t *ppp_priv_area;
  399. ppp_flags_t *flags = card->flags;
  400. unsigned long timeout;
  401. /* sanity checks */
  402. if ((wandev == NULL) || (wandev->private == NULL))
  403. return -EFAULT;
  404. if (wandev->state == WAN_UNCONFIGURED)
  405. return -ENODEV;
  406. /* Shutdown bug fix. This function can be
  407.          * called with NULL dev pointer during
  408.          * shutdown 
  409.  */
  410. if ((dev=card->wandev.dev) == NULL){
  411. return -ENODEV;
  412. }
  413. if ((ppp_priv_area=dev->priv) == NULL){
  414. return -ENODEV;
  415. }
  416. ppp_priv_area->update_comms_stats = 2;
  417. ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_UPDATE;
  418. flags->imask |= PPP_INTR_TIMER;
  419. /* wait a maximum of 1 second for the statistics to be updated */ 
  420.         timeout = jiffies;
  421.         for(;;) {
  422. if(ppp_priv_area->update_comms_stats == 0){
  423. break;
  424. }
  425.                 if ((jiffies - timeout) > (1 * HZ)){
  426.      ppp_priv_area->update_comms_stats = 0;
  427.   ppp_priv_area->timer_int_enabled &=
  428. ~TMR_INT_ENABLED_UPDATE; 
  429.   return -EAGAIN;
  430. }
  431.         }
  432. return 0;
  433. }
  434. /*============================================================================
  435.  * Create new logical channel.
  436.  * This routine is called by the router when ROUTER_IFNEW IOCTL is being
  437.  * handled.
  438.  * o parse media- and hardware-specific configuration
  439.  * o make sure that a new channel can be created
  440.  * o allocate resources, if necessary
  441.  * o prepare network device structure for registaration.
  442.  *
  443.  * Return: 0 o.k.
  444.  * < 0 failure (channel will not be created)
  445.  */
  446. static int new_if(wan_device_t *wandev, netdevice_t *dev, wanif_conf_t *conf)
  447. {
  448. sdla_t *card = wandev->private;
  449. ppp_private_area_t *ppp_priv_area;
  450. if (wandev->ndev)
  451. return -EEXIST;
  452. printk(KERN_INFO "%s: Configuring Interface: %sn",
  453. card->devname, conf->name);
  454. if ((conf->name[0] == '') || (strlen(conf->name) > WAN_IFNAME_SZ)) {
  455. printk(KERN_INFO "%s: Invalid interface name!n",
  456. card->devname);
  457. return -EINVAL;
  458. }
  459. /* allocate and initialize private data */
  460. ppp_priv_area = kmalloc(sizeof(ppp_private_area_t), GFP_KERNEL);
  461. if( ppp_priv_area == NULL )
  462. return -ENOMEM;
  463. memset(ppp_priv_area, 0, sizeof(ppp_private_area_t));
  464. ppp_priv_area->card = card; 
  465. /* initialize data */
  466. strcpy(card->u.p.if_name, conf->name);
  467. /* initialize data in ppp_private_area structure */
  468. init_ppp_priv_struct( ppp_priv_area );
  469. ppp_priv_area->mc = conf->mc;
  470. ppp_priv_area->pap = conf->pap;
  471. ppp_priv_area->chap = conf->chap;
  472. /* Option to bring down the interface when 
  473.          * the link goes down */
  474. if (conf->if_down){
  475. set_bit(DYN_OPT_ON,&ppp_priv_area->interface_down);
  476. printk("%s: Dynamic interface configuration enabledn",
  477. card->devname);
  478. /* If no user ids are specified */
  479. if(!strlen(conf->userid) && (ppp_priv_area->pap||ppp_priv_area->chap)){
  480. kfree(ppp_priv_area);
  481. return -EINVAL;
  482. }
  483. /* If no passwords are specified */
  484. if(!strlen(conf->passwd) && (ppp_priv_area->pap||ppp_priv_area->chap)){
  485. kfree(ppp_priv_area);
  486. return -EINVAL;
  487. }
  488. if(strlen(conf->sysname) > 31){
  489. kfree(ppp_priv_area);
  490. return -EINVAL;
  491. }
  492. /* If no system name is specified */
  493. if(!strlen(conf->sysname) && (card->u.p.authenticator)){
  494. kfree(ppp_priv_area);
  495. return -EINVAL;
  496. }
  497. /* copy the data into the ppp private structure */
  498. memcpy(ppp_priv_area->userid, conf->userid, strlen(conf->userid));
  499. memcpy(ppp_priv_area->passwd, conf->passwd, strlen(conf->passwd));
  500. memcpy(ppp_priv_area->sysname, conf->sysname, strlen(conf->sysname));
  501. ppp_priv_area->enable_IPX = conf->enable_IPX;
  502. if (conf->network_number){
  503. ppp_priv_area->network_number = conf->network_number;
  504. }else{
  505. ppp_priv_area->network_number = 0xDEADBEEF;
  506. }
  507. /* Tells us that if this interface is a
  508.          * gateway or not */
  509. if ((ppp_priv_area->gateway = conf->gateway) == WANOPT_YES){
  510. printk(KERN_INFO "%s: Interface %s is set as a gateway.n",
  511. card->devname,card->u.p.if_name);
  512. }
  513. /* prepare network device data space for registration */
  514. #ifdef LINUX_2_4
  515.   strcpy(dev->name,card->u.p.if_name);
  516. #else
  517. dev->name = (char *)kmalloc(strlen(card->u.p.if_name) + 2, GFP_KERNEL); 
  518. if(dev->name == NULL)
  519. {
  520. kfree(ppp_priv_area);
  521. return -ENOMEM;
  522. }
  523. sprintf(dev->name, "%s", card->u.p.if_name);
  524. #endif
  525. dev->init = &if_init;
  526. dev->priv = ppp_priv_area;
  527. dev->mtu = min_t(unsigned int, dev->mtu, card->wandev.mtu);
  528. /* Initialize the polling task routine */
  529. #ifndef LINUX_2_4
  530. ppp_priv_area->poll_task.next = NULL;
  531. #endif
  532. ppp_priv_area->poll_task.sync=0;
  533. ppp_priv_area->poll_task.routine = (void*)(void*)ppp_poll;
  534. ppp_priv_area->poll_task.data = dev;
  535. /* Initialize the polling delay timer */
  536. init_timer(&ppp_priv_area->poll_delay_timer);
  537. ppp_priv_area->poll_delay_timer.data = (unsigned long)dev;
  538. ppp_priv_area->poll_delay_timer.function = ppp_poll_delay;
  539. /* Since we start with dummy IP addresses we can say
  540.  * that route exists */
  541. printk(KERN_INFO "n");
  542. return 0;
  543. }
  544. /*============================================================================
  545.  * Delete logical channel.
  546.  */
  547. static int del_if(wan_device_t *wandev, netdevice_t *dev)
  548. {
  549. return 0;
  550. }
  551. static void disable_comm (sdla_t *card)
  552. {
  553. ppp_comm_disable_shutdown(card);
  554. return;
  555. }
  556. /****** WANPIPE-specific entry points ***************************************/
  557. /*============================================================================
  558.  * Execute adapter interface command.
  559.  */
  560. //FIXME: Why do we need this ????
  561. static int wpp_exec(struct sdla *card, void *u_cmd, void *u_data)
  562. {
  563. ppp_mbox_t *mbox = card->mbox;
  564. int len;
  565. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  566. if (copy_from_user((void*)&mbox->cmd, u_cmd, sizeof(ppp_cmd_t)))
  567. return -EFAULT;
  568. len = mbox->cmd.length;
  569. if (len) {
  570. if( copy_from_user((void*)&mbox->data, u_data, len))
  571. return -EFAULT;
  572. }
  573. /* execute command */
  574. if (!sdla_exec(mbox))
  575. return -EIO;
  576. /* return result */
  577. if( copy_to_user(u_cmd, (void*)&mbox->cmd, sizeof(ppp_cmd_t)))
  578. return -EFAULT;
  579. len = mbox->cmd.length;
  580. if (len && u_data && copy_to_user(u_data, (void*)&mbox->data, len))
  581. return -EFAULT;
  582. #else
  583.         if (!u_cmd || verify_area(VERIFY_WRITE, u_cmd, sizeof(ppp_cmd_t)))
  584.                 return -EFAULT;
  585.         memcpy_fromfs((void*)&mbox->cmd, u_cmd, sizeof(ppp_cmd_t));
  586. len = mbox->cmd.length;
  587.         if (len) {
  588.                 if (!u_data || verify_area(VERIFY_READ, u_data, len))
  589.                         return -EFAULT;
  590.         }
  591.         /* execute command */
  592.         if (!sdla_exec(mbox))
  593.                 return -EIO;
  594.         /* return result */
  595.         memcpy_tofs(u_cmd, (void*)&mbox->cmd, sizeof(ppp_cmd_t));
  596.         len = mbox->cmd.length;
  597.         if (len && u_data && !verify_area(VERIFY_WRITE, u_data, len))
  598.                 memcpy_tofs(u_data, (void*)&mbox->data, len);
  599. #endif
  600. return 0;
  601. }
  602. /****** Network Device Interface ********************************************/
  603. /*============================================================================
  604.  * Initialize Linux network interface.
  605.  *
  606.  * This routine is called only once for each interface, during Linux network
  607.  * interface registration.  Returning anything but zero will fail interface
  608.  * registration.
  609.  */
  610. static int if_init(netdevice_t *dev)
  611. {
  612. ppp_private_area_t *ppp_priv_area = dev->priv;
  613. sdla_t *card = ppp_priv_area->card;
  614. wan_device_t *wandev = &card->wandev;
  615. #ifdef LINUX_2_0
  616. int i;
  617. #endif
  618. /* Initialize device driver entry points */
  619. dev->open = &if_open;
  620. dev->stop = &if_close;
  621. dev->hard_header = &if_header;
  622. dev->rebuild_header = &if_rebuild_hdr;
  623. dev->hard_start_xmit = &if_send;
  624. dev->get_stats = &if_stats;
  625. #ifdef LINUX_2_4
  626. dev->tx_timeout = &if_tx_timeout;
  627. dev->watchdog_timeo = TX_TIMEOUT;
  628. #endif
  629. /* Initialize media-specific parameters */
  630. dev->type = ARPHRD_PPP; /* ARP h/w type */
  631. dev->flags |= IFF_POINTOPOINT;
  632. dev->flags |= IFF_NOARP;
  633. /* Enable Mulitcasting if specified by user*/
  634. if (ppp_priv_area->mc == WANOPT_YES){
  635. dev->flags |= IFF_MULTICAST;
  636. }
  637. #ifdef LINUX_2_0
  638. dev->family = AF_INET;
  639. #endif
  640. dev->mtu = wandev->mtu;
  641. dev->hard_header_len = PPP_HDR_LEN; /* media header length */
  642. /* Initialize hardware parameters (just for reference) */
  643. dev->irq = wandev->irq;
  644. dev->dma = wandev->dma;
  645. dev->base_addr = wandev->ioport;
  646. dev->mem_start = wandev->maddr;
  647. dev->mem_end = wandev->maddr + wandev->msize - 1;
  648.         /* Set transmit buffer queue length */
  649.         dev->tx_queue_len = 100;
  650.    
  651. /* Initialize socket buffers */
  652.       #if !defined(LINUX_2_1) && !defined(LINUX_2_4)
  653.         for (i = 0; i < DEV_NUMBUFFS; ++i)
  654.                 skb_queue_head_init(&dev->buffs[i]);
  655.       #endif
  656. return 0;
  657. }
  658. /*============================================================================
  659.  * Open network interface.
  660.  * o enable communications and interrupts.
  661.  * o prevent module from unloading by incrementing use count
  662.  *
  663.  * Return 0 if O.k. or errno.
  664.  */
  665. static int if_open (netdevice_t *dev)
  666. {
  667. ppp_private_area_t *ppp_priv_area = dev->priv;
  668. sdla_t *card = ppp_priv_area->card;
  669. struct timeval tv;
  670. //unsigned long smp_flags;
  671. if (is_dev_running(dev))
  672. return -EBUSY;
  673. wanpipe_open(card);
  674. #ifdef LINUX_2_4
  675. netif_start_queue(dev);
  676. #else
  677. dev->interrupt = 0;
  678. dev->tbusy = 0;
  679. dev->start = 1;
  680. #endif
  681. do_gettimeofday( &tv );
  682. ppp_priv_area->router_start_time = tv.tv_sec;
  683. /* We cannot configure the card here because we don't
  684.  * have access to the interface IP addresses.
  685.          * Once the interface initilization is complete, we will be
  686.          * able to access the IP addresses.  Therefore,
  687.          * configure the ppp link in the poll routine */
  688. set_bit(0,&ppp_priv_area->config_ppp);
  689. ppp_priv_area->config_wait_timeout=jiffies;
  690. /* Start the PPP configuration after 1sec delay.
  691.  * This will give the interface initilization time
  692.  * to finish its configuration */
  693. del_timer(&ppp_priv_area->poll_delay_timer);
  694. ppp_priv_area->poll_delay_timer.expires = jiffies+HZ;
  695. add_timer(&ppp_priv_area->poll_delay_timer);
  696. return 0;
  697. }
  698. /*============================================================================
  699.  * Close network interface.
  700.  * o if this is the last open, then disable communications and interrupts.
  701.  * o reset flags.
  702.  */
  703. static int if_close(netdevice_t *dev)
  704. {
  705. ppp_private_area_t *ppp_priv_area = dev->priv;
  706. sdla_t *card = ppp_priv_area->card;
  707. stop_net_queue(dev);
  708. #ifndef LINUX_2_4
  709. dev->start=0;
  710. #endif
  711. wanpipe_close(card);
  712. del_timer (&ppp_priv_area->poll_delay_timer);
  713. return 0;
  714. }
  715. /*============================================================================
  716.  * Build media header.
  717.  *
  718.  * The trick here is to put packet type (Ethertype) into 'protocol' field of
  719.  * the socket buffer, so that we don't forget it.  If packet type is not
  720.  * supported, set skb->protocol to 0 and discard packet later.
  721.  *
  722.  * Return: media header length.
  723.  */
  724. static int if_header(struct sk_buff *skb, netdevice_t *dev,
  725. unsigned short type, void *daddr, void *saddr, unsigned len)
  726. {
  727. switch (type)
  728. {
  729. case ETH_P_IP:
  730. case ETH_P_IPX:
  731. skb->protocol = htons(type);
  732. break;
  733. default:
  734. skb->protocol = 0;
  735. }
  736. return PPP_HDR_LEN;
  737. }
  738. /*============================================================================
  739.  * Re-build media header.
  740.  *
  741.  * Return: 1 physical address resolved.
  742.  * 0 physical address not resolved
  743.  */
  744. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  745. static int if_rebuild_hdr (struct sk_buff *skb)
  746. {
  747. netdevice_t *dev = skb->dev;
  748. ppp_private_area_t *ppp_priv_area = dev->priv;
  749. sdla_t *card = ppp_priv_area->card;
  750. printk(KERN_INFO "%s: rebuild_header() called for interface %s!n",
  751. card->devname, dev->name);
  752. return 1;
  753. }
  754. #else
  755. static int if_rebuild_hdr (void* hdr, netdevice_t* dev, unsigned long raddr,
  756.                            struct sk_buff* skb)
  757. {
  758. return 1;
  759. }
  760. #endif
  761. #ifdef LINUX_2_4
  762. /*============================================================================
  763.  * Handle transmit timeout event from netif watchdog
  764.  */
  765. static void if_tx_timeout (netdevice_t *dev)
  766. {
  767.      ppp_private_area_t* chan = dev->priv;
  768. sdla_t *card = chan->card;
  769. /* If our device stays busy for at least 5 seconds then we will
  770.  * kick start the device by making dev->tbusy = 0.  We expect
  771.  * that our device never stays busy more than 5 seconds. So this                 
  772.  * is only used as a last resort.
  773.  */
  774. ++ chan->if_send_stat.if_send_tbusy;
  775. ++card->wandev.stats.collisions;
  776. printk (KERN_INFO "%s: Transmit timed out on %sn", card->devname,dev->name);
  777. ++chan->if_send_stat.if_send_tbusy_timeout;
  778. netif_wake_queue (dev);
  779. }
  780. #endif
  781. /*============================================================================
  782.  * Send a packet on a network interface.
  783.  * o set tbusy flag (marks start of the transmission) to block a timer-based
  784.  *   transmit from overlapping.
  785.  * o check link state. If link is not up, then drop the packet.
  786.  * o execute adapter send command.
  787.  * o free socket buffer
  788.  *
  789.  * Return: 0 complete (socket buffer must be freed)
  790.  * non-0 packet may be re-transmitted (tbusy must be set)
  791.  *
  792.  * Notes:
  793.  * 1. This routine is called either by the protocol stack or by the "net
  794.  *    bottom half" (with interrupts enabled).
  795.  * 2. Setting tbusy flag will inhibit further transmit requests from the
  796.  *    protocol stack and can be used for flow control with protocol layer.
  797.  */
  798. static int if_send (struct sk_buff *skb, netdevice_t *dev)
  799. {
  800. ppp_private_area_t *ppp_priv_area = dev->priv;
  801. sdla_t *card = ppp_priv_area->card;
  802. unsigned char *sendpacket;
  803. unsigned long smp_flags;
  804. ppp_flags_t *flags = card->flags;
  805. int udp_type;
  806. int err=0;
  807. ++ppp_priv_area->if_send_stat.if_send_entry;
  808. #ifdef LINUX_2_4
  809. netif_stop_queue(dev);
  810. #endif
  811. if (skb == NULL) {
  812. /* If we get here, some higher layer thinks we've missed an
  813.  * tx-done interrupt.
  814.  */
  815. printk(KERN_INFO "%s: interface %s got kicked!n",
  816. card->devname, dev->name);
  817. ++ppp_priv_area->if_send_stat.if_send_skb_null;
  818. wake_net_dev(dev);
  819. return 0;
  820. }
  821. #ifndef LINUX_2_4
  822. if (dev->tbusy) {
  823. /* If our device stays busy for at least 5 seconds then we will
  824.  * kick start the device by making dev->tbusy = 0.  We expect 
  825.  * that our device never stays busy more than 5 seconds. So this
  826.  * is only used as a last resort. 
  827.  */
  828.               
  829. ++ppp_priv_area->if_send_stat.if_send_tbusy;
  830.          ++card->wandev.stats.collisions;
  831. if ((jiffies - ppp_priv_area->tick_counter) < (5*HZ)) {
  832. return 1;
  833. }
  834. printk (KERN_INFO "%s: Transmit times out on %sn",card->devname,dev->name);
  835. ++ppp_priv_area->if_send_stat.if_send_tbusy_timeout;
  836. ++card->wandev.stats.collisions;
  837. /* unbusy the card (because only one interface per card)*/
  838. dev->tbusy = 0;
  839. }
  840. #endif
  841. sendpacket = skb->data;
  842. udp_type = udp_pkt_type( skb, card );
  843. if (udp_type == UDP_PTPIPE_TYPE){
  844. if(store_udp_mgmt_pkt(UDP_PKT_FRM_STACK, card, skb, dev,
  845.                                ppp_priv_area)){
  846.                 flags->imask |= PPP_INTR_TIMER;
  847. }
  848. ++ppp_priv_area->if_send_stat.if_send_PIPE_request;
  849. start_net_queue(dev);
  850. return 0;
  851. }
  852. /* Check for broadcast and multicast addresses 
  853.  * If found, drop (deallocate) a packet and return.
  854.  */
  855. if(chk_bcast_mcast_addr(card, dev, skb)){
  856. ++card->wandev.stats.tx_dropped;
  857. wan_dev_kfree_skb(skb,FREE_WRITE);
  858. start_net_queue(dev);
  859. return 0;
  860. }
  861.   if(card->hw.type != SDLA_S514){
  862. s508_lock(card,&smp_flags);
  863. }
  864.      if (test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)) {
  865. printk(KERN_INFO "%s: Critical in if_send: %lxn",
  866. card->wandev.name,card->wandev.critical);
  867. ++card->wandev.stats.tx_dropped;
  868. ++ppp_priv_area->if_send_stat.if_send_critical_non_ISR;
  869. start_net_queue(dev);
  870. goto if_send_exit_crit;
  871. }
  872. if (card->wandev.state != WAN_CONNECTED) {
  873. ++ppp_priv_area->if_send_stat.if_send_wan_disconnected;
  874.          ++card->wandev.stats.tx_dropped;
  875. start_net_queue(dev);
  876.       } else if (!skb->protocol) {
  877. ++ppp_priv_area->if_send_stat.if_send_protocol_error;
  878.          ++card->wandev.stats.tx_errors;
  879. start_net_queue(dev);
  880. } else {
  881. /*If it's IPX change the network numbers to 0 if they're ours.*/
  882. if( skb->protocol == htons(ETH_P_IPX) ) {
  883. if(ppp_priv_area->enable_IPX) {
  884. switch_net_numbers( skb->data, 
  885. ppp_priv_area->network_number, 0);
  886. } else {
  887. ++card->wandev.stats.tx_dropped;
  888. start_net_queue(dev);
  889. goto if_send_exit_crit;
  890. }
  891. }
  892. if (ppp_send(card, skb->data, skb->len, skb->protocol)) {
  893. stop_net_queue(dev);
  894. ++ppp_priv_area->if_send_stat.if_send_adptr_bfrs_full;
  895. ++ppp_priv_area->if_send_stat.if_send_tx_int_enabled;
  896. } else {
  897. ++ppp_priv_area->if_send_stat.if_send_bfr_passed_to_adptr;
  898. ++card->wandev.stats.tx_packets;
  899. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  900. card->wandev.stats.tx_bytes += skb->len;
  901. #endif
  902. start_net_queue(dev);
  903. #ifdef LINUX_2_4
  904. dev->trans_start = jiffies;
  905. #endif
  906. }
  907.      }
  908. if_send_exit_crit:
  909. if (!(err=is_queue_stopped(dev))){
  910.        wan_dev_kfree_skb(skb, FREE_WRITE);
  911. }else{
  912. ppp_priv_area->tick_counter = jiffies;
  913. flags->imask |= PPP_INTR_TXRDY; /* unmask Tx interrupts */
  914. }
  915. clear_bit(SEND_CRIT,&card->wandev.critical);
  916. if(card->hw.type != SDLA_S514){
  917. s508_unlock(card,&smp_flags);
  918. }
  919. return err;
  920. }
  921. /*=============================================================================
  922.  * Store a UDP management packet for later processing.
  923.  */
  924. static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card,
  925.                                 struct sk_buff *skb, netdevice_t* dev,
  926.                                 ppp_private_area_t* ppp_priv_area )
  927. {
  928. int udp_pkt_stored = 0;
  929. if(!ppp_priv_area->udp_pkt_lgth && (skb->len<=MAX_LGTH_UDP_MGNT_PKT)){
  930.          ppp_priv_area->udp_pkt_lgth = skb->len;
  931. ppp_priv_area->udp_pkt_src = udp_pkt_src;
  932.         memcpy(ppp_priv_area->udp_pkt_data, skb->data, skb->len);
  933. ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_UDP;
  934. ppp_priv_area->protocol = skb->protocol;
  935. udp_pkt_stored = 1;
  936. }else{
  937. if (skb->len > MAX_LGTH_UDP_MGNT_PKT){
  938. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  939. printk(KERN_INFO "%s: PIPEMON UDP request too long : %in",
  940. card->devname, skb->len);
  941. #else
  942. printk(KERN_INFO "%s: PIPEMON UDP request too long : %lin",
  943. card->devname, skb->len);
  944. #endif
  945. }else{
  946. printk(KERN_INFO "%s: PIPEMON UPD request already pendingn",
  947. card->devname);
  948. }
  949. ppp_priv_area->udp_pkt_lgth = 0;
  950. }
  951. if(udp_pkt_src == UDP_PKT_FRM_STACK){
  952. wan_dev_kfree_skb(skb, FREE_WRITE);
  953. }else{
  954.                 wan_dev_kfree_skb(skb, FREE_READ);
  955. }
  956. return(udp_pkt_stored);
  957. }
  958. /*============================================================================
  959.  * Reply to UDP Management system.
  960.  * Return length of reply.
  961.  */
  962. static int reply_udp( unsigned char *data, unsigned int mbox_len ) 
  963. {
  964. unsigned short len, udp_length, temp, ip_length;
  965. unsigned long ip_temp;
  966. int even_bound = 0;
  967. ppp_udp_pkt_t *p_udp_pkt = (ppp_udp_pkt_t *)data;
  968.  
  969. /* Set length of packet */
  970. len = sizeof(ip_pkt_t)+ 
  971.       sizeof(udp_pkt_t)+
  972.       sizeof(wp_mgmt_t)+
  973.       sizeof(cblock_t)+
  974.       mbox_len;
  975. /* fill in UDP reply */
  976.    p_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY; 
  977. /* fill in UDP length */
  978. udp_length = sizeof(udp_pkt_t)+ 
  979.      sizeof(wp_mgmt_t)+
  980.      sizeof(cblock_t)+
  981.      mbox_len; 
  982.   
  983.  
  984. /* put it on an even boundary */
  985. if ( udp_length & 0x0001 ) {
  986. udp_length += 1;
  987. len += 1;
  988. even_bound=1;
  989. temp = (udp_length<<8)|(udp_length>>8);
  990. p_udp_pkt->udp_pkt.udp_length = temp;
  991.  
  992. /* swap UDP ports */
  993. temp = p_udp_pkt->udp_pkt.udp_src_port;
  994. p_udp_pkt->udp_pkt.udp_src_port = 
  995. p_udp_pkt->udp_pkt.udp_dst_port; 
  996. p_udp_pkt->udp_pkt.udp_dst_port = temp;
  997. /* add UDP pseudo header */
  998. temp = 0x1100;
  999. *((unsigned short *)(p_udp_pkt->data+mbox_len+even_bound)) = temp;
  1000. temp = (udp_length<<8)|(udp_length>>8);
  1001. *((unsigned short *)(p_udp_pkt->data+mbox_len+even_bound+2)) = temp;
  1002.  
  1003. /* calculate UDP checksum */
  1004. p_udp_pkt->udp_pkt.udp_checksum = 0;
  1005. p_udp_pkt->udp_pkt.udp_checksum = 
  1006. calc_checksum(&data[UDP_OFFSET],udp_length+UDP_OFFSET);
  1007. /* fill in IP length */
  1008. ip_length = udp_length + sizeof(ip_pkt_t);
  1009. temp = (ip_length<<8)|(ip_length>>8);
  1010.    p_udp_pkt->ip_pkt.total_length = temp;
  1011.  
  1012. /* swap IP addresses */
  1013. ip_temp = p_udp_pkt->ip_pkt.ip_src_address;
  1014. p_udp_pkt->ip_pkt.ip_src_address = p_udp_pkt->ip_pkt.ip_dst_address;
  1015. p_udp_pkt->ip_pkt.ip_dst_address = ip_temp;
  1016. /* fill in IP checksum */
  1017. p_udp_pkt->ip_pkt.hdr_checksum = 0;
  1018. p_udp_pkt->ip_pkt.hdr_checksum = calc_checksum(data,sizeof(ip_pkt_t));
  1019. return len;
  1020. } /* reply_udp */
  1021. unsigned short calc_checksum (char *data, int len)
  1022. {
  1023. unsigned short temp; 
  1024. unsigned long sum=0;
  1025. int i;
  1026. for( i = 0; i <len; i+=2 ) {
  1027. memcpy(&temp,&data[i],2);
  1028. sum += (unsigned long)temp;
  1029. }
  1030. while (sum >> 16 ) {
  1031. sum = (sum & 0xffffUL) + (sum >> 16);
  1032. }
  1033. temp = (unsigned short)sum;
  1034. temp = ~temp;
  1035. if( temp == 0 ) 
  1036. temp = 0xffff;
  1037. return temp;
  1038. }
  1039. /*
  1040.    If incoming is 0 (outgoing)- if the net numbers is ours make it 0
  1041.    if incoming is 1 - if the net number is 0 make it ours 
  1042. */
  1043. static void switch_net_numbers(unsigned char *sendpacket, unsigned long network_number, unsigned char incoming)
  1044. {
  1045. unsigned long pnetwork_number;
  1046. pnetwork_number = (unsigned long)((sendpacket[6] << 24) + 
  1047.   (sendpacket[7] << 16) + (sendpacket[8] << 8) + 
  1048.   sendpacket[9]);
  1049. if (!incoming) {
  1050. //If the destination network number is ours, make it 0
  1051. if( pnetwork_number == network_number) {
  1052. sendpacket[6] = sendpacket[7] = sendpacket[8] = 
  1053.  sendpacket[9] = 0x00;
  1054. }
  1055. } else {
  1056. //If the incoming network is 0, make it ours
  1057. if( pnetwork_number == 0) {
  1058. sendpacket[6] = (unsigned char)(network_number >> 24);
  1059. sendpacket[7] = (unsigned char)((network_number & 
  1060.  0x00FF0000) >> 16);
  1061. sendpacket[8] = (unsigned char)((network_number & 
  1062.  0x0000FF00) >> 8);
  1063. sendpacket[9] = (unsigned char)(network_number & 
  1064.  0x000000FF);
  1065. }
  1066. }
  1067. pnetwork_number = (unsigned long)((sendpacket[18] << 24) + 
  1068.   (sendpacket[19] << 16) + (sendpacket[20] << 8) + 
  1069.   sendpacket[21]);
  1070. if( !incoming ) {
  1071. //If the source network is ours, make it 0
  1072. if( pnetwork_number == network_number) {
  1073. sendpacket[18] = sendpacket[19] = sendpacket[20] = 
  1074.  sendpacket[21] = 0x00;
  1075. }
  1076. } else {
  1077. //If the source network is 0, make it ours
  1078. if( pnetwork_number == 0 ) {
  1079. sendpacket[18] = (unsigned char)(network_number >> 24);
  1080. sendpacket[19] = (unsigned char)((network_number & 
  1081.  0x00FF0000) >> 16);
  1082. sendpacket[20] = (unsigned char)((network_number & 
  1083.  0x0000FF00) >> 8);
  1084. sendpacket[21] = (unsigned char)(network_number & 
  1085.  0x000000FF);
  1086. }
  1087. }
  1088. } /* switch_net_numbers */
  1089. /*============================================================================
  1090.  * Get ethernet-style interface statistics.
  1091.  * Return a pointer to struct net_device_stats.
  1092.  */
  1093. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1094. static struct net_device_stats *if_stats(netdevice_t *dev)
  1095. #else
  1096. static struct enet_statistics *if_stats(netdevice_t *dev)
  1097. #endif
  1098. {
  1099. ppp_private_area_t *ppp_priv_area = dev->priv;
  1100. sdla_t* card;
  1101. if( ppp_priv_area == NULL )
  1102. return NULL;
  1103. card = ppp_priv_area->card;
  1104. return &card->wandev.stats;
  1105. }
  1106. /****** PPP Firmware Interface Functions ************************************/
  1107. /*============================================================================
  1108.  * Read firmware code version.
  1109.  * Put code version as ASCII string in str. 
  1110.  */
  1111. static int ppp_read_version(sdla_t *card, char *str)
  1112. {
  1113. ppp_mbox_t *mb = card->mbox;
  1114. int err;
  1115. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  1116. mb->cmd.command = PPP_READ_CODE_VERSION;
  1117. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1118. if (err != CMD_OK)
  1119.  
  1120. ppp_error(card, err, mb);
  1121. else if (str) {
  1122. int len = mb->cmd.length;
  1123. memcpy(str, mb->data, len);
  1124. str[len] = '';
  1125. }
  1126. return err;
  1127. }
  1128. /*===========================================================================
  1129.  * Set Out-Bound Authentication.
  1130. */
  1131. static int ppp_set_outbnd_auth (sdla_t *card, ppp_private_area_t *ppp_priv_area)
  1132. {
  1133. ppp_mbox_t *mb = card->mbox;
  1134. int err;
  1135. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  1136. memset(&mb->data, 0, (strlen(ppp_priv_area->userid) + 
  1137. strlen(ppp_priv_area->passwd) + 2 ) );
  1138. memcpy(mb->data, ppp_priv_area->userid, strlen(ppp_priv_area->userid));
  1139. memcpy((mb->data + strlen(ppp_priv_area->userid) + 1), 
  1140. ppp_priv_area->passwd, strlen(ppp_priv_area->passwd));
  1141. mb->cmd.length  = strlen(ppp_priv_area->userid) + 
  1142. strlen(ppp_priv_area->passwd) + 2 ;
  1143. mb->cmd.command = PPP_SET_OUTBOUND_AUTH;
  1144. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1145. if (err != CMD_OK)
  1146. ppp_error(card, err, mb);
  1147. return err;
  1148. }
  1149. /*===========================================================================
  1150.  * Set In-Bound Authentication.
  1151. */
  1152. static int ppp_set_inbnd_auth (sdla_t *card, ppp_private_area_t *ppp_priv_area)
  1153. {
  1154. ppp_mbox_t *mb = card->mbox;
  1155. int err, i;
  1156. char* user_tokens[32];
  1157. char* pass_tokens[32];
  1158. int userids, passwds;
  1159. int add_ptr;
  1160. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  1161. memset(&mb->data, 0, 1008);
  1162. memcpy(mb->data, ppp_priv_area->sysname, 
  1163. strlen(ppp_priv_area->sysname));
  1164. /* Parse the userid string and the password string and build a string
  1165.    to copy it to the data area of the command structure.   The string
  1166.    will look like "SYS_NAME<NULL>USER1<NULL>PASS1<NULL>USER2<NULL>PASS2
  1167.    ....<NULL> " 
  1168.  */
  1169. userids = tokenize( ppp_priv_area->userid, user_tokens);
  1170. passwds = tokenize( ppp_priv_area->passwd, pass_tokens);
  1171. if (userids != passwds){
  1172. printk(KERN_INFO "%s: Number of passwords does not equal the number of user idsn", card->devname);
  1173. return 1;
  1174. }
  1175. add_ptr = strlen(ppp_priv_area->sysname) + 1;
  1176. for (i=0; i<userids; i++){
  1177. memcpy((mb->data + add_ptr), user_tokens[i], 
  1178. strlen(user_tokens[i]));
  1179. memcpy((mb->data + add_ptr + strlen(user_tokens[i]) + 1), 
  1180. pass_tokens[i], strlen(pass_tokens[i]));
  1181. add_ptr = add_ptr + strlen(user_tokens[i]) + 1 + 
  1182. strlen(pass_tokens[i]) + 1;
  1183. }
  1184. mb->cmd.length  = add_ptr + 1;
  1185. mb->cmd.command = PPP_SET_INBOUND_AUTH;
  1186. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1187. if (err != CMD_OK)
  1188. ppp_error(card, err, mb);
  1189. return err;
  1190. }
  1191. /*============================================================================
  1192.  * Tokenize string.
  1193.  *      Parse a string of the following syntax:
  1194.  *              <arg1>,<arg2>,...
  1195.  *      and fill array of tokens with pointers to string elements.
  1196.  *
  1197.  */
  1198. static int tokenize (char *str, char **tokens)
  1199. {
  1200.         int cnt = 0;
  1201.         tokens[0] = strtok(str, "/");
  1202.         while (tokens[cnt] && (cnt < 32 - 1))
  1203.         {
  1204.                 tokens[cnt] = strstrip(tokens[cnt], " t");
  1205.                 tokens[++cnt] = strtok(NULL, "/");
  1206.         }
  1207. return cnt;
  1208. }
  1209. /*============================================================================
  1210.  * Strip leading and trailing spaces off the string str.
  1211.  */
  1212. static char* strstrip (char *str, char* s)
  1213. {
  1214.         char *eos = str + strlen(str);          /* -> end of string */
  1215.         while (*str && strchr(s, *str))
  1216.                 ++str                           /* strip leading spaces */
  1217.         ;
  1218.         while ((eos > str) && strchr(s, *(eos - 1)))
  1219.                 --eos                           /* strip trailing spaces */
  1220.         ;
  1221.         *eos = '';
  1222.         return str;
  1223. }
  1224. /*============================================================================
  1225.  * Configure PPP firmware.
  1226.  */
  1227. static int ppp_configure(sdla_t *card, void *data)
  1228. {
  1229. ppp_mbox_t *mb = card->mbox;
  1230. int data_len = sizeof(ppp508_conf_t); 
  1231. int err;
  1232. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  1233. memcpy(mb->data, data, data_len);
  1234. mb->cmd.length  = data_len;
  1235. mb->cmd.command = PPP_SET_CONFIG;
  1236. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1237. if (err != CMD_OK) 
  1238. ppp_error(card, err, mb);
  1239. return err;
  1240. }
  1241. /*============================================================================
  1242.  * Set interrupt mode.
  1243.  */
  1244. static int ppp_set_intr_mode(sdla_t *card, unsigned char mode)
  1245. {
  1246. ppp_mbox_t *mb = card->mbox;
  1247.         ppp_intr_info_t *ppp_intr_data = (ppp_intr_info_t *) &mb->data[0];
  1248. int err;
  1249. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  1250. ppp_intr_data->i_enable = mode;
  1251. ppp_intr_data->irq = card->hw.irq;
  1252. mb->cmd.length = 2;
  1253.        /* If timer has been enabled, set the timer delay to 1sec */
  1254.        if (mode & 0x80){
  1255.         ppp_intr_data->timer_len = 250; //5;//100; //250;
  1256.                 mb->cmd.length = 4;
  1257.         }
  1258. mb->cmd.command = PPP_SET_INTR_FLAGS;
  1259. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1260. if (err != CMD_OK) 
  1261. ppp_error(card, err, mb);
  1262.  
  1263. return err;
  1264. }
  1265. /*============================================================================
  1266.  * Enable communications.
  1267.  */
  1268. static int ppp_comm_enable(sdla_t *card)
  1269. {
  1270. ppp_mbox_t *mb = card->mbox;
  1271. int err;
  1272. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  1273. mb->cmd.command = PPP_COMM_ENABLE;
  1274. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1275. if (err != CMD_OK) 
  1276. ppp_error(card, err, mb);
  1277. else
  1278. card->u.p.comm_enabled = 1;
  1279. return err;
  1280. }
  1281. /*============================================================================
  1282.  * Disable communications.
  1283.  */
  1284. static int ppp_comm_disable(sdla_t *card)
  1285. {
  1286. ppp_mbox_t *mb = card->mbox;
  1287. int err;
  1288. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  1289. mb->cmd.command = PPP_COMM_DISABLE;
  1290. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1291. if (err != CMD_OK) 
  1292. ppp_error(card, err, mb);
  1293. else
  1294. card->u.p.comm_enabled = 0;
  1295. return err;
  1296. }
  1297. static int ppp_comm_disable_shutdown(sdla_t *card)
  1298. {
  1299. ppp_mbox_t *mb = card->mbox;
  1300. ppp_intr_info_t *ppp_intr_data;
  1301. int err;
  1302. if (!mb){
  1303. return 1;
  1304. }
  1305. ppp_intr_data = (ppp_intr_info_t *) &mb->data[0];
  1306. /* Disable all interrupts */
  1307. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  1308. ppp_intr_data->i_enable = 0;
  1309. ppp_intr_data->irq = card->hw.irq;
  1310. mb->cmd.length = 2;
  1311. mb->cmd.command = PPP_SET_INTR_FLAGS;
  1312. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1313. /* Disable communicatinons */
  1314. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  1315. mb->cmd.command = PPP_COMM_DISABLE;
  1316. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1317. card->u.p.comm_enabled = 0;
  1318. return 0;
  1319. }
  1320. /*============================================================================
  1321.  * Get communications error statistics.
  1322.  */
  1323. static int ppp_get_err_stats(sdla_t *card)
  1324. {
  1325. ppp_mbox_t *mb = card->mbox;
  1326. int err;
  1327. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  1328. mb->cmd.command = PPP_READ_ERROR_STATS;
  1329. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1330. if (err == CMD_OK) {
  1331. ppp_err_stats_t* stats = (void*)mb->data;
  1332. card->wandev.stats.rx_over_errors    = stats->rx_overrun;
  1333. card->wandev.stats.rx_crc_errors     = stats->rx_bad_crc;
  1334. card->wandev.stats.rx_missed_errors  = stats->rx_abort;
  1335. card->wandev.stats.rx_length_errors  = stats->rx_lost;
  1336. card->wandev.stats.tx_aborted_errors = stats->tx_abort;
  1337. } else 
  1338. ppp_error(card, err, mb);
  1339. return err;
  1340. }
  1341. /*============================================================================
  1342.  * Send packet.
  1343.  * Return: 0 - o.k.
  1344.  * 1 - no transmit buffers available
  1345.  */
  1346. static int ppp_send (sdla_t *card, void *data, unsigned len, unsigned proto)
  1347. {
  1348. ppp_buf_ctl_t *txbuf = card->u.p.txbuf;
  1349. if (txbuf->flag)
  1350.                 return 1;
  1351. sdla_poke(&card->hw, txbuf->buf.ptr, data, len);
  1352. txbuf->length = len; /* frame length */
  1353. if (proto == htons(ETH_P_IPX))
  1354. txbuf->proto = 0x01; /* protocol ID */
  1355. else
  1356. txbuf->proto = 0x00; /* protocol ID */
  1357. txbuf->flag = 1; /* start transmission */
  1358. /* Update transmit buffer control fields */
  1359. card->u.p.txbuf = ++txbuf;
  1360. if ((void*)txbuf > card->u.p.txbuf_last)
  1361. card->u.p.txbuf = card->u.p.txbuf_base;
  1362. return 0;
  1363. }
  1364. /****** Firmware Error Handler **********************************************/
  1365. /*============================================================================
  1366.  * Firmware error handler.
  1367.  * This routine is called whenever firmware command returns non-zero
  1368.  * return code.
  1369.  *
  1370.  * Return zero if previous command has to be cancelled.
  1371.  */
  1372. static int ppp_error(sdla_t *card, int err, ppp_mbox_t *mb)
  1373. {
  1374. unsigned cmd = mb->cmd.command;
  1375. switch (err) {
  1376. case CMD_TIMEOUT:
  1377. printk(KERN_ERR "%s: command 0x%02X timed out!n",
  1378. card->devname, cmd);
  1379. break;
  1380. default:
  1381. printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!n"
  1382. , card->devname, cmd, err);
  1383. }
  1384. return 0;
  1385. }
  1386. /****** Interrupt Handlers **************************************************/
  1387. /*============================================================================
  1388.  * PPP interrupt service routine.
  1389.  */
  1390. static void wpp_isr (sdla_t *card)
  1391. {
  1392. ppp_flags_t *flags = card->flags;
  1393. char *ptr = &flags->iflag;
  1394. netdevice_t *dev = card->wandev.dev;
  1395. int i;
  1396. card->in_isr = 1;
  1397. ++card->statistics.isr_entry;
  1398. if (!dev && flags->iflag != PPP_INTR_CMD){
  1399. card->in_isr = 0;
  1400. flags->iflag = 0;
  1401. return;
  1402. }
  1403. if (test_bit(PERI_CRIT, (void*)&card->wandev.critical)) {
  1404. card->in_isr = 0;
  1405. flags->iflag = 0;
  1406. return;
  1407. }
  1408. if(card->hw.type != SDLA_S514){
  1409. if (test_bit(SEND_CRIT, (void*)&card->wandev.critical)) {
  1410. ++card->statistics.isr_already_critical;
  1411. printk (KERN_INFO "%s: Critical while in ISR!n",
  1412. card->devname);
  1413. card->in_isr = 0;
  1414. flags->iflag = 0;
  1415. return;
  1416. }
  1417. }
  1418. switch (flags->iflag) {
  1419. case PPP_INTR_RXRDY: /* receive interrupt  0x01  (bit 0)*/
  1420. ++card->statistics.isr_rx;
  1421. rx_intr(card);
  1422. break;
  1423. case PPP_INTR_TXRDY: /* transmit interrupt  0x02 (bit 1)*/
  1424. ++card->statistics.isr_tx;
  1425. flags->imask &= ~PPP_INTR_TXRDY;
  1426. wake_net_dev(dev);
  1427. break;
  1428. case PPP_INTR_CMD:      /* interface command completed */
  1429. ++Intr_test_counter;
  1430. ++card->statistics.isr_intr_test;
  1431. break;
  1432. case PPP_INTR_MODEM:    /* modem status change (DCD, CTS) 0x04 (bit 2)*/
  1433. case PPP_INTR_DISC:   /* Data link disconnected 0x10  (bit 4)*/
  1434. case PPP_INTR_OPEN:    /* Data link open 0x20  (bit 5)*/
  1435. case PPP_INTR_DROP_DTR: /* DTR drop timeout expired  0x40 bit 6 */
  1436. event_intr(card);
  1437. break;
  1438. case PPP_INTR_TIMER:
  1439. timer_intr(card);
  1440. break;  
  1441. default: /* unexpected interrupt */
  1442. ++card->statistics.isr_spurious;
  1443. printk(KERN_INFO "%s: spurious interrupt 0x%02X!n", 
  1444. card->devname, flags->iflag);
  1445. printk(KERN_INFO "%s: ID Bytes = ",card->devname);
  1446.   for(i = 0; i < 8; i ++)
  1447. printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i));
  1448. printk(KERN_INFO "n");
  1449. }
  1450. card->in_isr = 0;
  1451. flags->iflag = 0;
  1452. return;
  1453. }
  1454. /*============================================================================
  1455.  * Receive interrupt handler.
  1456.  */
  1457. static void rx_intr(sdla_t *card)
  1458. {
  1459. ppp_buf_ctl_t *rxbuf = card->rxmb;
  1460. netdevice_t *dev = card->wandev.dev;
  1461. ppp_private_area_t *ppp_priv_area;
  1462. struct sk_buff *skb;
  1463. unsigned len;
  1464. void *buf;
  1465. int i;
  1466.         ppp_flags_t *flags = card->flags;
  1467.         char *ptr = &flags->iflag;
  1468. int udp_type;
  1469. if (rxbuf->flag != 0x01) {
  1470. printk(KERN_INFO 
  1471. "%s: corrupted Rx buffer @ 0x%X, flag = 0x%02X!n", 
  1472. card->devname, (unsigned)rxbuf, rxbuf->flag);
  1473. printk(KERN_INFO "%s: ID Bytes = ",card->devname);
  1474.  
  1475. for(i = 0; i < 8; i ++)
  1476. printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i));
  1477. printk(KERN_INFO "n");
  1478. ++card->statistics.rx_intr_corrupt_rx_bfr;
  1479. /* Bug Fix: Mar 6 2000
  1480.                  * If we get a corrupted mailbox, it means that driver 
  1481.                  * is out of sync with the firmware. There is no recovery.
  1482.                  * If we don't turn off all interrupts for this card
  1483.                  * the machine will crash. 
  1484.                  */
  1485. printk(KERN_INFO "%s: Critical router failure ...!!!n", card->devname);
  1486. printk(KERN_INFO "Please contact Sangoma Technologies !n");
  1487. ppp_set_intr_mode(card,0);
  1488. return;
  1489. }
  1490.       
  1491. if (dev && is_dev_running(dev) && dev->priv){
  1492. len  = rxbuf->length;
  1493. ppp_priv_area = dev->priv;
  1494. /* Allocate socket buffer */
  1495. skb = dev_alloc_skb(len);
  1496. if (skb != NULL) {
  1497. /* Copy data to the socket buffer */
  1498. unsigned addr = rxbuf->buf.ptr;
  1499. if ((addr + len) > card->u.p.rx_top + 1) {
  1500. unsigned tmp = card->u.p.rx_top - addr + 1;
  1501. buf = skb_put(skb, tmp);
  1502. sdla_peek(&card->hw, addr, buf, tmp);
  1503. addr = card->u.p.rx_base;
  1504. len -= tmp;
  1505. }
  1506. buf = skb_put(skb, len);
  1507. sdla_peek(&card->hw, addr, buf, len);
  1508. /* Decapsulate packet */
  1509.          switch (rxbuf->proto) {
  1510. case 0x00:
  1511. skb->protocol = htons(ETH_P_IP);
  1512. break;
  1513. case 0x01:
  1514. skb->protocol = htons(ETH_P_IPX);
  1515. break;
  1516. }
  1517. udp_type = udp_pkt_type( skb, card );
  1518. if (udp_type == UDP_PTPIPE_TYPE){
  1519. /* Handle a UDP Request in Timer Interrupt */
  1520. if(store_udp_mgmt_pkt(UDP_PKT_FRM_NETWORK, card, skb, dev,
  1521.                                 ppp_priv_area)){
  1522.                 flags->imask |= PPP_INTR_TIMER;
  1523. }
  1524. ++ppp_priv_area->rx_intr_stat.rx_intr_PIPE_request;
  1525. } else if (handle_IPXWAN(skb->data,card->devname, 
  1526.  ppp_priv_area->enable_IPX, 
  1527.  ppp_priv_area->network_number, 
  1528.  skb->protocol)) {
  1529. /* Handle an IPXWAN packet */
  1530. if( ppp_priv_area->enable_IPX) {
  1531. /* Make sure we are not already sending */
  1532. if (!test_bit(SEND_CRIT, &card->wandev.critical)){
  1533.   ppp_send(card, skb->data, skb->len, htons(ETH_P_IPX));
  1534. }
  1535. wan_dev_kfree_skb(skb,FREE_READ);
  1536. } else {
  1537. ++card->wandev.stats.rx_dropped;
  1538. }
  1539. } else {
  1540. /* Pass data up the protocol stack */
  1541.      skb->dev = dev;
  1542. skb->mac.raw  = skb->data;
  1543.      ++card->wandev.stats.rx_packets;
  1544. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1545. card->wandev.stats.rx_bytes += skb->len;
  1546. #endif
  1547.      ++ppp_priv_area->rx_intr_stat.rx_intr_bfr_passed_to_stack;
  1548. netif_rx(skb);
  1549. }
  1550. } else {
  1551. if (net_ratelimit()){
  1552. printk(KERN_INFO "%s: no socket buffers available!n",
  1553. card->devname);
  1554. }
  1555. ++card->wandev.stats.rx_dropped;
  1556. ++ppp_priv_area->rx_intr_stat.rx_intr_no_socket;
  1557. }
  1558. } else {
  1559. ++card->statistics.rx_intr_dev_not_started;
  1560. }
  1561. /* Release buffer element and calculate a pointer to the next one */
  1562. rxbuf->flag = 0x00;
  1563. card->rxmb = ++rxbuf;
  1564. if ((void*)rxbuf > card->u.p.rxbuf_last)
  1565. card->rxmb = card->u.p.rxbuf_base;
  1566. }
  1567. void event_intr (sdla_t *card)
  1568. {
  1569.   netdevice_t* dev = card->wandev.dev;
  1570.         ppp_private_area_t* ppp_priv_area = dev->priv;
  1571. volatile ppp_flags_t *flags = card->flags;
  1572. switch (flags->iflag){
  1573. case PPP_INTR_MODEM:    /* modem status change (DCD, CTS) 0x04  (bit 2)*/
  1574. if (net_ratelimit()){
  1575. printk (KERN_INFO "%s: Modem status: DCD=%s CTS=%sn",
  1576. card->devname, DCD(flags->mstatus), CTS(flags->mstatus));
  1577. }
  1578. break;
  1579. case PPP_INTR_DISC:   /* Data link disconnected 0x10  (bit 4)*/
  1580. NEX_PRINTK (KERN_INFO "Data link disconnected intr Cause %Xn",
  1581.        flags->disc_cause);
  1582. if (flags->disc_cause &
  1583. (PPP_LOCAL_TERMINATION | PPP_DCD_CTS_DROP |
  1584. PPP_REMOTE_TERMINATION)) {
  1585. if (card->u.p.ip_mode == WANOPT_PPP_PEER) { 
  1586. set_bit(0,&Read_connection_info);
  1587. }
  1588. wanpipe_set_state(card, WAN_DISCONNECTED);
  1589. show_disc_cause(card, flags->disc_cause);
  1590. ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_PPP_EVENT;
  1591. flags->imask |= PPP_INTR_TIMER;
  1592. trigger_ppp_poll(dev);
  1593. }
  1594. break;
  1595. case PPP_INTR_OPEN:    /* Data link open 0x20  (bit 5)*/
  1596. NEX_PRINTK (KERN_INFO "%s: PPP Link Open, LCP=%s IP=%sn",
  1597. card->devname,LCP(flags->lcp_state),
  1598. IP(flags->ip_state));
  1599. if (flags->lcp_state == 0x09 && 
  1600.                            (flags->ip_state == 0x09 || flags->ipx_state == 0x09)){
  1601.                                 /* Initialize the polling timer and set the state
  1602.                                  * to WAN_CONNNECTED */
  1603. /* BUG FIX: When the protocol restarts, during heavy 
  1604.                                  * traffic, board tx buffers and driver tx buffers
  1605.                                  * can go out of sync.  This checks the condition
  1606.                                  * and if the tx buffers are out of sync, the 
  1607.                                  * protocols are restarted. 
  1608.                                  * I don't know why the board tx buffer is out
  1609.                                  * of sync. It could be that a packets is tx
  1610.                                  * while the link is down, but that is not 
  1611.                                  * possible. The other possiblility is that the
  1612.                                  * firmware doesn't reinitialize properly.
  1613.                                  * FIXME: A better fix should be found.
  1614.                                  */ 
  1615. if (detect_and_fix_tx_bug(card)){
  1616. ppp_comm_disable(card);
  1617. wanpipe_set_state(card, WAN_DISCONNECTED);
  1618. ppp_priv_area->timer_int_enabled |= 
  1619. TMR_INT_ENABLED_PPP_EVENT;
  1620. flags->imask |= PPP_INTR_TIMER;
  1621. break;
  1622. }
  1623. card->state_tick = jiffies;
  1624. wanpipe_set_state(card, WAN_CONNECTED);
  1625. NEX_PRINTK(KERN_INFO "CON: L Tx: %lx  B Tx: %lx || L Rx %lx B Rx %lxn",
  1626. (unsigned long)card->u.p.txbuf, *card->u.p.txbuf_next,
  1627. (unsigned long)card->rxmb, *card->u.p.rxbuf_next);
  1628. /* Tell timer interrupt that PPP event occured */
  1629. ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_PPP_EVENT;
  1630. flags->imask |= PPP_INTR_TIMER;
  1631. /* If we are in PEER mode, we must first obtain the
  1632.  * IP information and then go into the poll routine */
  1633. if (card->u.p.ip_mode != WANOPT_PPP_PEER){
  1634. trigger_ppp_poll(dev);
  1635. }
  1636. }
  1637.                     break;
  1638. case PPP_INTR_DROP_DTR: /* DTR drop timeout expired  0x40 bit 6 */
  1639. NEX_PRINTK(KERN_INFO "DTR Drop Timeout Interrrupt n"); 
  1640. if (card->u.p.ip_mode == WANOPT_PPP_PEER) { 
  1641. set_bit(0,&Read_connection_info);
  1642. }
  1643. wanpipe_set_state(card, WAN_DISCONNECTED);
  1644. show_disc_cause(card, flags->disc_cause);
  1645. ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_PPP_EVENT;
  1646. flags->imask |= PPP_INTR_TIMER;
  1647. trigger_ppp_poll(dev);
  1648. break;
  1649. default:
  1650. printk(KERN_INFO "%s: Error, Invalid PPP Eventn",card->devname);
  1651. }
  1652. }
  1653. /* TIMER INTERRUPT */
  1654. void timer_intr (sdla_t *card)
  1655. {
  1656.         netdevice_t* dev = card->wandev.dev;
  1657.         ppp_private_area_t* ppp_priv_area = dev->priv;
  1658. ppp_flags_t *flags = card->flags;
  1659. if (ppp_priv_area->timer_int_enabled & TMR_INT_ENABLED_CONFIG){
  1660. if (!config_ppp(card)){
  1661. ppp_priv_area->timer_int_enabled &= 
  1662. ~TMR_INT_ENABLED_CONFIG;
  1663. }
  1664. }
  1665. /* Update statistics */
  1666. if (ppp_priv_area->timer_int_enabled & TMR_INT_ENABLED_UPDATE){
  1667. ppp_get_err_stats(card);
  1668.                 if(!(--ppp_priv_area->update_comms_stats)){
  1669. ppp_priv_area->timer_int_enabled &= 
  1670. ~TMR_INT_ENABLED_UPDATE;
  1671. }
  1672. }
  1673. /* PPIPEMON UDP request */
  1674. if (ppp_priv_area->timer_int_enabled & TMR_INT_ENABLED_UDP){
  1675. process_udp_mgmt_pkt(card,dev, ppp_priv_area);
  1676. ppp_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_UDP;
  1677. }
  1678. /* PPP Event */
  1679. if (ppp_priv_area->timer_int_enabled & TMR_INT_ENABLED_PPP_EVENT){
  1680. if (card->wandev.state == WAN_DISCONNECTED){
  1681. retrigger_comm(card);
  1682. }
  1683. /* If the state is CONNECTING, it means that communicatins were
  1684.    * enabled. When the remote side enables its comminication we
  1685.    * should get an interrupt PPP_INTR_OPEN, thus turn off polling 
  1686.  */
  1687. else if (card->wandev.state == WAN_CONNECTING){
  1688. /* Turn off the timer interrupt */
  1689. ppp_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_PPP_EVENT;
  1690. }
  1691. /* If state is connected and we are in PEER mode 
  1692.    * poll for an IP address which will be provided by remote end.
  1693.    */
  1694. else if ((card->wandev.state == WAN_CONNECTED && 
  1695.      card->u.p.ip_mode == WANOPT_PPP_PEER) && 
  1696.      test_bit(0,&Read_connection_info)){
  1697. card->state_tick = jiffies;
  1698. if (read_connection_info (card)){
  1699. printk(KERN_INFO "%s: Failed to read PEER IP Addressesn",
  1700. card->devname);
  1701. }else{
  1702. clear_bit(0,&Read_connection_info);
  1703. set_bit(1,&Read_connection_info);
  1704. trigger_ppp_poll(dev);
  1705. }
  1706. }else{
  1707. //FIXME Put the comment back int
  1708. ppp_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_PPP_EVENT;
  1709. }
  1710. }/* End of PPP_EVENT */
  1711. /* Only disable the timer interrupt if there are no udp, statistic */
  1712. /* updates or events pending */
  1713.         if(!ppp_priv_area->timer_int_enabled) {
  1714.                 flags->imask &= ~PPP_INTR_TIMER;
  1715.         }
  1716. }
  1717. static int handle_IPXWAN(unsigned char *sendpacket, char *devname, unsigned char enable_IPX, unsigned long network_number, unsigned short proto)
  1718. {
  1719. int i;
  1720. if( proto == htons(ETH_P_IPX) ) {
  1721. //It's an IPX packet
  1722. if(!enable_IPX) {
  1723. //Return 1 so we don't pass it up the stack.
  1724. return 1;
  1725. }
  1726. } else {
  1727. //It's not IPX so pass it up the stack.
  1728. return 0;
  1729. }
  1730. if( sendpacket[16] == 0x90 &&
  1731.     sendpacket[17] == 0x04)
  1732. {
  1733. //It's IPXWAN
  1734. if( sendpacket[2] == 0x02 &&
  1735.     sendpacket[34] == 0x00)
  1736. {
  1737. //It's a timer request packet
  1738. printk(KERN_INFO "%s: Received IPXWAN Timer Request packetn",devname);
  1739. //Go through the routing options and answer no to every
  1740. //option except Unnumbered RIP/SAP
  1741. for(i = 41; sendpacket[i] == 0x00; i += 5)
  1742. {
  1743. //0x02 is the option for Unnumbered RIP/SAP
  1744. if( sendpacket[i + 4] != 0x02)
  1745. {
  1746. sendpacket[i + 1] = 0;
  1747. }
  1748. }
  1749. //Skip over the extended Node ID option
  1750. if( sendpacket[i] == 0x04 )
  1751. {
  1752. i += 8;
  1753. }
  1754. //We also want to turn off all header compression opt.
  1755. for(; sendpacket[i] == 0x80 ;)
  1756. {
  1757. sendpacket[i + 1] = 0;
  1758. i += (sendpacket[i + 2] << 8) + (sendpacket[i + 3]) + 4;
  1759. }
  1760. //Set the packet type to timer response
  1761. sendpacket[34] = 0x01;
  1762. printk(KERN_INFO "%s: Sending IPXWAN Timer Responsen",devname);
  1763. }
  1764. else if( sendpacket[34] == 0x02 )
  1765. {
  1766. //This is an information request packet
  1767. printk(KERN_INFO "%s: Received IPXWAN Information Request packetn",devname);
  1768. //Set the packet type to information response
  1769. sendpacket[34] = 0x03;
  1770. //Set the router name
  1771. sendpacket[51] = 'P';
  1772. sendpacket[52] = 'T';
  1773. sendpacket[53] = 'P';
  1774. sendpacket[54] = 'I';
  1775. sendpacket[55] = 'P';
  1776. sendpacket[56] = 'E';
  1777. sendpacket[57] = '-';
  1778. sendpacket[58] = CVHexToAscii(network_number >> 28);
  1779. sendpacket[59] = CVHexToAscii((network_number & 0x0F000000)>> 24);
  1780. sendpacket[60] = CVHexToAscii((network_number & 0x00F00000)>> 20);
  1781. sendpacket[61] = CVHexToAscii((network_number & 0x000F0000)>> 16);
  1782. sendpacket[62] = CVHexToAscii((network_number & 0x0000F000)>> 12);
  1783. sendpacket[63] = CVHexToAscii((network_number & 0x00000F00)>> 8);
  1784. sendpacket[64] = CVHexToAscii((network_number & 0x000000F0)>> 4);
  1785. sendpacket[65] = CVHexToAscii(network_number & 0x0000000F);
  1786. for(i = 66; i < 99; i+= 1)
  1787. {
  1788. sendpacket[i] = 0;
  1789. }
  1790. printk(KERN_INFO "%s: Sending IPXWAN Information Response packetn",devname);
  1791. }
  1792. else
  1793. {
  1794. printk(KERN_INFO "%s: Unknown IPXWAN packet!n",devname);
  1795. return 0;
  1796. }
  1797. //Set the WNodeID to our network address
  1798. sendpacket[35] = (unsigned char)(network_number >> 24);
  1799. sendpacket[36] = (unsigned char)((network_number & 0x00FF0000) >> 16);
  1800. sendpacket[37] = (unsigned char)((network_number & 0x0000FF00) >> 8);
  1801. sendpacket[38] = (unsigned char)(network_number & 0x000000FF);
  1802. return 1;
  1803. } else {
  1804. //If we get here's its an IPX-data packet, so it'll get passed up the stack.
  1805. //switch the network numbers
  1806. switch_net_numbers(sendpacket, network_number, 1);
  1807. return 0;
  1808. }
  1809. }
  1810. /****** Background Polling Routines  ****************************************/
  1811. /* All polling functions are invoked by the TIMER interrupt in the wpp_isr 
  1812.  * routine.  
  1813.  */
  1814. /*============================================================================
  1815.  * Monitor active link phase.
  1816.  */
  1817. static void process_route (sdla_t *card)
  1818. {
  1819. ppp_flags_t *flags = card->flags;
  1820. netdevice_t *dev = card->wandev.dev;
  1821. ppp_private_area_t *ppp_priv_area = dev->priv;
  1822. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1823. if ((card->u.p.ip_mode == WANOPT_PPP_PEER) &&
  1824.     (flags->ip_state == 0x09)){ 
  1825. /* We get ip_local from the firmware in PEER mode.
  1826.          * Therefore, if ip_local is 0, we failed to obtain
  1827.            * the remote IP address. */
  1828. if (ppp_priv_area->ip_local == 0) 
  1829. return;
  1830. printk(KERN_INFO "%s: IPCP State Opened.n", card->devname);
  1831. if (read_info( card )) {
  1832.     printk(KERN_INFO 
  1833. "%s: An error occurred in IP assignment.n", 
  1834. card->devname);
  1835. } else {
  1836. struct in_device *in_dev = dev->ip_ptr;
  1837. if (in_dev != NULL ) {
  1838. struct in_ifaddr *ifa = in_dev->ifa_list;
  1839. printk(KERN_INFO "%s: Assigned Lcl. Addr: %sn", 
  1840. card->devname, in_ntoa(ifa->ifa_local));
  1841. printk(KERN_INFO "%s: Assigned Rmt. Addr: %sn", 
  1842. card->devname, in_ntoa(ifa->ifa_address));
  1843. }else{
  1844. printk(KERN_INFO 
  1845. "%s: Error: Failed to add a route for PPP interface %sn",
  1846. card->devname,dev->name);
  1847. }
  1848. }
  1849. }
  1850. #else
  1851. if ((card->u.p.ip_mode == WANOPT_PPP_PEER) &&
  1852.     (flags->ip_state == 0x09)){ 
  1853. if (ppp_priv_area->ip_local == 0)
  1854. return;
  1855. printk(KERN_INFO "%s: IPCP State Opened.n", card->devname);
  1856. if (read_info( card )) {
  1857. printk(KERN_INFO 
  1858. "%s: An error occurred in IP assignment.n", 
  1859. card->devname);
  1860. } else {
  1861. printk(KERN_INFO "%s: Assigned Lcl. Addr: %sn", 
  1862. card->devname, in_ntoa(dev->pa_addr));
  1863. printk(KERN_INFO "%s: Assigned Rmt. Addr: %sn", 
  1864. card->devname, in_ntoa(dev->pa_dstaddr));
  1865. }
  1866. }
  1867. #endif
  1868. }
  1869. /*============================================================================
  1870.  * Monitor physical link disconnected phase.
  1871.  *  o if interface is up and the hold-down timeout has expired, then retry
  1872.  *    connection.
  1873.  */
  1874. static void retrigger_comm(sdla_t *card)
  1875. {
  1876. netdevice_t *dev = card->wandev.dev;
  1877. if (dev && ((jiffies - card->state_tick) > HOLD_DOWN_TIME)) {
  1878. wanpipe_set_state(card, WAN_CONNECTING);
  1879. if(ppp_comm_enable(card) == CMD_OK){
  1880. init_ppp_tx_rx_buff( card );
  1881. }          
  1882. }
  1883. }
  1884. /****** Miscellaneous Functions *********************************************/
  1885. /*============================================================================
  1886.  * Configure S508 adapter.
  1887.  */
  1888. static int config508(netdevice_t *dev, sdla_t *card)
  1889. {
  1890. ppp508_conf_t cfg;
  1891. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1892. struct in_device *in_dev = dev->ip_ptr;
  1893. #endif
  1894. ppp_private_area_t *ppp_priv_area = dev->priv;
  1895. /* Prepare PPP configuration structure */
  1896. memset(&cfg, 0, sizeof(ppp508_conf_t));
  1897. if (card->wandev.clocking)
  1898. cfg.line_speed = card->wandev.bps;
  1899. if (card->wandev.interface == WANOPT_RS232)
  1900. cfg.conf_flags |= INTERFACE_LEVEL_RS232;
  1901.         cfg.conf_flags  |= DONT_TERMINATE_LNK_MAX_CONFIG; /*send Configure-Request packets forever*/
  1902. cfg.txbuf_percent = PERCENT_TX_BUFF; /* % of Tx bufs */
  1903. cfg.mtu_local = card->wandev.mtu;
  1904. cfg.mtu_remote = card->wandev.mtu;                  /*    Default   */
  1905. cfg.restart_tmr = TIME_BETWEEN_CONF_REQ;        /*    30 = 3sec */
  1906. cfg.auth_rsrt_tmr = TIME_BETWEEN_PAP_CHAP_REQ;         /*    30 = 3sec */
  1907. cfg.auth_wait_tmr = WAIT_PAP_CHAP_WITHOUT_REPLY;       /*   300 = 30s  */
  1908. cfg.mdm_fail_tmr = WAIT_AFTER_DCD_CTS_LOW;            /*     5 = 0.5s */
  1909. cfg.dtr_drop_tmr = TIME_DCD_CTS_LOW_AFTER_LNK_DOWN;   /*    10 = 1s   */
  1910. cfg.connect_tmout = WAIT_DCD_HIGH_AFTER_ENABLE_COMM;   /*   900 = 90s  */
  1911. cfg.conf_retry = MAX_CONF_REQ_WITHOUT_REPLY;        /*    10 = 1s   */
  1912. cfg.term_retry = MAX_TERM_REQ_WITHOUT_REPLY;      /*     2 times  */
  1913. cfg.fail_retry = NUM_CONF_NAK_WITHOUT_REPLY;        /*     5 times  */
  1914. cfg.auth_retry = NUM_AUTH_REQ_WITHOUT_REPLY;        /*     10 times */   
  1915. if( !card->u.p.authenticator ) {
  1916. printk(KERN_INFO "%s: Device is not configured as an authenticatorn", 
  1917. card->devname);
  1918. cfg.auth_options = NO_AUTHENTICATION;
  1919. }else{
  1920. printk(KERN_INFO "%s: Device is configured as an authenticatorn", 
  1921. card->devname);
  1922. cfg.auth_options = INBOUND_AUTH;
  1923. }
  1924. if( ppp_priv_area->pap == WANOPT_YES){
  1925. cfg.auth_options |=PAP_AUTH;
  1926. printk(KERN_INFO "%s: Pap enabledn", card->devname);
  1927. }
  1928. if( ppp_priv_area->chap == WANOPT_YES){
  1929. cfg.auth_options |= CHAP_AUTH;
  1930. printk(KERN_INFO "%s: Chap enabledn", card->devname);
  1931. }
  1932. if (ppp_priv_area->enable_IPX == WANOPT_YES){
  1933. printk(KERN_INFO "%s: Enabling IPX Protocoln",card->devname);
  1934. cfg.ipx_options = ENABLE_IPX | ROUTING_PROT_DEFAULT;
  1935. }else{
  1936. cfg.ipx_options  = DISABLE_IPX;
  1937. }
  1938. switch (card->u.p.ip_mode) {
  1939. case WANOPT_PPP_STATIC:
  1940. printk(KERN_INFO "%s: PPP IP Mode: STATICn",card->devname);
  1941. cfg.ip_options = L_AND_R_IP_NO_ASSIG | 
  1942.     ENABLE_IP;
  1943. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1944. cfg.ip_local = in_dev->ifa_list->ifa_local;
  1945. cfg.ip_remote = in_dev->ifa_list->ifa_address;
  1946. #else
  1947. cfg.ip_local = dev->pa_addr;
  1948. cfg.ip_remote = dev->pa_dstaddr;
  1949. #endif
  1950. /* Debugging code used to check that IP addresses
  1951.                          * obtained from the kernel are correct */
  1952. {
  1953. char laddr[20];
  1954. char raddr[20];
  1955. strcpy(laddr,in_ntoa(cfg.ip_local));
  1956. strcpy(raddr,in_ntoa(cfg.ip_remote));
  1957.                         NEX_PRINTK(KERN_INFO "Local %s Remote %s Name %sn",
  1958. laddr,raddr, dev->name);
  1959. }
  1960. break;
  1961. case WANOPT_PPP_HOST:
  1962. printk(KERN_INFO "%s: PPP IP Mode: HOSTn",card->devname);
  1963. cfg.ip_options = L_IP_LOCAL_ASSIG |
  1964.   R_IP_LOCAL_ASSIG | 
  1965.   ENABLE_IP;
  1966. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1967. cfg.ip_local = in_dev->ifa_list->ifa_local;
  1968. cfg.ip_remote = in_dev->ifa_list->ifa_address;
  1969. #else
  1970. cfg.ip_local = dev->pa_addr;
  1971. cfg.ip_remote = dev->pa_dstaddr;
  1972. #endif
  1973. /* Debugging code used to check that IP addresses
  1974.                          * obtained from the kernel are correct */
  1975. {
  1976. char laddr[20];
  1977. char raddr[20];
  1978. strcpy(laddr,in_ntoa(cfg.ip_local));
  1979. strcpy(raddr,in_ntoa(cfg.ip_remote));
  1980.                         NEX_PRINTK (KERN_INFO "Local %s Remote %s Name %sn",
  1981. laddr,raddr, dev->name);
  1982. }
  1983. break;
  1984. case WANOPT_PPP_PEER:
  1985. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1986. printk(KERN_INFO "%s: PPP IP Mode: PEERn",card->devname);
  1987. cfg.ip_options = L_IP_REMOTE_ASSIG | 
  1988.   R_IP_REMOTE_ASSIG | 
  1989.   ENABLE_IP;
  1990. cfg.ip_local = 0x00;
  1991. cfg.ip_remote = 0x00;
  1992. break;
  1993. #else
  1994. /* No PEER support for 2.0.X kernels, drop down to default
  1995.      * condition */
  1996. printk(KERN_INFO "%s: ERROR, PEER mode is not supported in 2.0.X kernelsn",
  1997. card->devname);
  1998. #endif
  1999. default:
  2000. printk(KERN_INFO "%s: ERROR: Unsupported PPP Mode Selectedn",
  2001. card->devname);
  2002. printk(KERN_INFO "%s:        PPP IP Modes: STATIC, PEER or HOSTn",
  2003. card->devname);
  2004. return 1;
  2005. }
  2006. return ppp_configure(card, &cfg);
  2007. }
  2008. /*============================================================================
  2009.  * Show disconnection cause.
  2010.  */
  2011. static void show_disc_cause(sdla_t *card, unsigned cause)
  2012. {
  2013. if (cause & 0x0802) 
  2014. printk(KERN_INFO "%s: link terminated by peern", 
  2015. card->devname);
  2016. else if (cause & 0x0004) 
  2017. printk(KERN_INFO "%s: link terminated by usern", 
  2018. card->devname);
  2019. else if (cause & 0x0008) 
  2020. printk(KERN_INFO "%s: authentication failedn", card->devname);
  2021. else if (cause & 0x0010) 
  2022. printk(KERN_INFO 
  2023. "%s: authentication protocol negotiation failedn", 
  2024. card->devname);
  2025. else if (cause & 0x0020) 
  2026. printk(KERN_INFO
  2027. "%s: peer's request for authentication rejectedn",
  2028. card->devname);
  2029. else if (cause & 0x0040) 
  2030. printk(KERN_INFO "%s: MRU option rejected by peern", 
  2031. card->devname);
  2032. else if (cause & 0x0080) 
  2033. printk(KERN_INFO "%s: peer's MRU was too smalln", 
  2034. card->devname);
  2035. else if (cause & 0x0100) 
  2036. printk(KERN_INFO "%s: failed to negotiate peer's LCP optionsn",
  2037. card->devname);
  2038. else if (cause & 0x0200) 
  2039. printk(KERN_INFO "%s: failed to negotiate peer's IPCP optionsn"
  2040. , card->devname);
  2041. else if (cause & 0x0400) 
  2042. printk(KERN_INFO 
  2043. "%s: failed to negotiate peer's IPXCP optionsn",
  2044. card->devname);
  2045. }
  2046. /*=============================================================================
  2047.  * Process UDP call of type PTPIPEAB.
  2048.  */
  2049. static void process_udp_mgmt_pkt(sdla_t *card, netdevice_t *dev, 
  2050.  ppp_private_area_t *ppp_priv_area ) 
  2051. {
  2052. unsigned char buf2[5];
  2053. unsigned char *buf;
  2054. unsigned int frames, len;
  2055. struct sk_buff *new_skb;
  2056. unsigned short data_length, buffer_length, real_len;
  2057. unsigned long data_ptr;
  2058. int udp_mgmt_req_valid = 1;
  2059. ppp_mbox_t *mbox = card->mbox;
  2060. struct timeval tv;
  2061. int err;
  2062. ppp_udp_pkt_t *ppp_udp_pkt = (ppp_udp_pkt_t*)&ppp_priv_area->udp_pkt_data;
  2063. memcpy(&buf2, &card->wandev.udp_port, 2 );
  2064. if(ppp_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK) {
  2065. switch(ppp_udp_pkt->cblock.command) {
  2066. case PPIPE_GET_IBA_DATA:
  2067. case PPP_READ_CONFIG:
  2068. case PPP_GET_CONNECTION_INFO:
  2069. case PPIPE_ROUTER_UP_TIME:
  2070. case PPP_READ_STATISTICS:
  2071. case PPP_READ_ERROR_STATS:
  2072. case PPP_READ_PACKET_STATS:
  2073. case PPP_READ_LCP_STATS:
  2074. case PPP_READ_IPCP_STATS:
  2075. case PPP_READ_IPXCP_STATS:
  2076. case PPP_READ_PAP_STATS:
  2077. case PPP_READ_CHAP_STATS:
  2078. case PPP_READ_CODE_VERSION:
  2079. udp_mgmt_req_valid = 1;
  2080. break;
  2081.    
  2082. default:
  2083. udp_mgmt_req_valid = 0;
  2084. break;
  2085. }
  2086.    if(!udp_mgmt_req_valid) {
  2087.     
  2088. /* set length to 0 */
  2089.      ppp_udp_pkt->cblock.length = 0x00;
  2090.      /* set return code */
  2091.      ppp_udp_pkt->cblock.result = 0xCD; 
  2092. ++ppp_priv_area->pipe_mgmt_stat.UDP_PIPE_mgmt_direction_err;
  2093. if (net_ratelimit()){
  2094. printk(KERN_INFO 
  2095. "%s: Warning, Illegal UDP command attempted from network: %xn",
  2096. card->devname,ppp_udp_pkt->cblock.command);
  2097. }
  2098.     } else {
  2099. /* Initialize the trace element */
  2100. trace_element_t trace_element;     
  2101. switch (ppp_udp_pkt->cblock.command){
  2102. /* PPIPE_ENABLE_TRACING */
  2103.      case PPIPE_ENABLE_TRACING:
  2104. if (!card->TracingEnabled) {
  2105.     
  2106. /* OPERATE_DATALINE_MONITOR */
  2107.      mbox->cmd.command = PPP_DATALINE_MONITOR;
  2108.      mbox->cmd.length = 0x01;
  2109.      mbox->data[0] = ppp_udp_pkt->data[0];
  2110.      err = sdla_exec(mbox) ? 
  2111. mbox->cmd.result : CMD_TIMEOUT;
  2112.    
  2113. if (err != CMD_OK) { 
  2114.         
  2115. ppp_error(card, err, mbox);
  2116.          card->TracingEnabled = 0;
  2117.         
  2118. /* set the return code */
  2119.          ppp_udp_pkt->cblock.result = mbox->cmd.result;
  2120.          mbox->cmd.length = 0;
  2121.          break;
  2122.      } 
  2123. sdla_peek(&card->hw, 0xC000, &buf2, 2);
  2124.     
  2125. ppp_priv_area->curr_trace_addr = 0;
  2126.      memcpy(&ppp_priv_area->curr_trace_addr, &buf2, 2);
  2127.      ppp_priv_area->start_trace_addr = 
  2128. ppp_priv_area->curr_trace_addr;
  2129. ppp_priv_area->end_trace_addr = 
  2130. ppp_priv_area->start_trace_addr + END_OFFSET;
  2131.     
  2132. /* MAX_SEND_BUFFER_SIZE - 28 (IP header) 
  2133.    - 32 (ppipemon CBLOCK) */
  2134.      available_buffer_space = MAX_LGTH_UDP_MGNT_PKT - 
  2135.  sizeof(ip_pkt_t)-
  2136.  sizeof(udp_pkt_t)-
  2137.  sizeof(wp_mgmt_t)-
  2138.  sizeof(cblock_t);
  2139.            }
  2140.            ppp_udp_pkt->cblock.result = 0;
  2141.            mbox->cmd.length = 0;
  2142.            card->TracingEnabled = 1;
  2143.            break;
  2144.    
  2145. /* PPIPE_DISABLE_TRACING */
  2146. case PPIPE_DISABLE_TRACING:
  2147.       
  2148. if(card->TracingEnabled) {
  2149.    
  2150. /* OPERATE_DATALINE_MONITOR */
  2151.      mbox->cmd.command = 0x33;
  2152.      mbox->cmd.length = 1;
  2153.      mbox->data[0] = 0x00;
  2154.      err = sdla_exec(mbox) ? 
  2155. mbox->cmd.result : CMD_TIMEOUT;
  2156.           
  2157. /*set return code*/
  2158. ppp_udp_pkt->cblock.result = 0;
  2159. mbox->cmd.length = 0;
  2160. card->TracingEnabled = 0;
  2161. break;
  2162.    
  2163. /* PPIPE_GET_TRACE_INFO */
  2164. case PPIPE_GET_TRACE_INFO:
  2165. if(!card->TracingEnabled) {
  2166. /* set return code */
  2167.      ppp_udp_pkt->cblock.result = 1;
  2168.      mbox->cmd.length = 0;
  2169. }     
  2170. buffer_length = 0;
  2171. /* frames < 62, where 62 is the number of trace
  2172.    information elements.  There is in total 496
  2173.    bytes of space and each trace information
  2174.    element is 8 bytes. 
  2175.  */
  2176. for ( frames=0; frames<62; frames++) {
  2177. trace_pkt_t *trace_pkt = (trace_pkt_t *)
  2178. &ppp_udp_pkt->data[buffer_length];
  2179. /* Read the whole trace packet */
  2180. sdla_peek(&card->hw, ppp_priv_area->curr_trace_addr, 
  2181.   &trace_element, sizeof(trace_element_t));
  2182. /* no data on board so exit */
  2183. if( trace_element.opp_flag == 0x00 ) 
  2184. break;
  2185.       
  2186. data_ptr = trace_element.trace_data_ptr;
  2187. /* See if there is actual data on the trace buffer */
  2188. if (data_ptr){
  2189. data_length = trace_element.trace_length;
  2190. }else{
  2191. data_length = 0;
  2192. ppp_udp_pkt->data[0] |= 0x02;
  2193. }
  2194. //FIXME: Do we need this check
  2195. if ((available_buffer_space - buffer_length) 
  2196.      < (sizeof(trace_element_t)+1)){
  2197. /*indicate we have more frames 
  2198.  * on board and exit 
  2199.  */
  2200. ppp_udp_pkt->data[0] |= 0x02;
  2201. break;
  2202. }
  2203. trace_pkt->status = trace_element.trace_type;
  2204. trace_pkt->time_stamp = trace_element.trace_time_stamp;
  2205. trace_pkt->real_length = trace_element.trace_length;
  2206. real_len = trace_element.trace_length;
  2207. if(data_ptr == 0){
  2208. trace_pkt->data_avail = 0x00;
  2209. }else{
  2210. /* we can take it next time */
  2211. if ((available_buffer_space - buffer_length)<
  2212. (real_len + sizeof(trace_pkt_t))){
  2213. ppp_udp_pkt->data[0] |= 0x02;
  2214. break;
  2215. trace_pkt->data_avail = 0x01;
  2216. /* get the data */
  2217. sdla_peek(&card->hw, data_ptr, 
  2218.   &trace_pkt->data,
  2219.   real_len);
  2220. }
  2221. /* zero the opp flag to 
  2222.    show we got the frame */
  2223. buf2[0] = 0x00;
  2224. sdla_poke(&card->hw, ppp_priv_area->curr_trace_addr,
  2225.   &buf2, 1);
  2226. /* now move onto the next 
  2227.    frame */
  2228. ppp_priv_area->curr_trace_addr += 8;
  2229. /* check if we passed the last address */
  2230. if ( ppp_priv_area->curr_trace_addr >= 
  2231. ppp_priv_area->end_trace_addr){
  2232. ppp_priv_area->curr_trace_addr = 
  2233. ppp_priv_area->start_trace_addr;
  2234. }
  2235.  
  2236. /* update buffer length and make sure its even */ 
  2237. if ( trace_pkt->data_avail == 0x01 ) {
  2238. buffer_length += real_len - 1;
  2239. }
  2240.  
  2241. /* for the header */
  2242. buffer_length += 8;
  2243. if( buffer_length & 0x0001 )
  2244. buffer_length += 1;
  2245. }
  2246. /* ok now set the total number of frames passed
  2247.    in the high 5 bits */
  2248. ppp_udp_pkt->data[0] |= (frames << 2);
  2249.  
  2250. /* set the data length */
  2251. mbox->cmd.length = buffer_length;
  2252. ppp_udp_pkt->cblock.length = buffer_length;
  2253.  
  2254. /* set return code */
  2255. ppp_udp_pkt->cblock.result = 0;
  2256.           break;
  2257.     /* PPIPE_GET_IBA_DATA */
  2258. case PPIPE_GET_IBA_DATA:
  2259.         
  2260. mbox->cmd.length = 0x09;
  2261. sdla_peek(&card->hw, 0xF003, &ppp_udp_pkt->data, 
  2262. mbox->cmd.length);
  2263.         
  2264. /* set the length of the data */
  2265. ppp_udp_pkt->cblock.length = 0x09;
  2266. /* set return code */
  2267. ppp_udp_pkt->cblock.result = 0x00;
  2268. ppp_udp_pkt->cblock.result = 0;
  2269. break;
  2270. /* PPIPE_FT1_READ_STATUS */
  2271. case PPIPE_FT1_READ_STATUS:
  2272. sdla_peek(&card->hw, 0xF020, &ppp_udp_pkt->data[0], 2);
  2273. ppp_udp_pkt->cblock.length = mbox->cmd.length = 2;
  2274. ppp_udp_pkt->cblock.result = 0;
  2275. break;
  2276. case PPIPE_FLUSH_DRIVER_STATS:   
  2277. init_ppp_priv_struct( ppp_priv_area );
  2278. init_global_statistics( card );
  2279. mbox->cmd.length = 0;
  2280. ppp_udp_pkt->cblock.result = 0;
  2281. break;
  2282. case PPIPE_ROUTER_UP_TIME:
  2283. do_gettimeofday( &tv );
  2284. ppp_priv_area->router_up_time = tv.tv_sec - 
  2285. ppp_priv_area->router_start_time;
  2286. *(unsigned long *)&ppp_udp_pkt->data = ppp_priv_area->router_up_time;
  2287. mbox->cmd.length = 4;
  2288. ppp_udp_pkt->cblock.result = 0;
  2289. break;
  2290. /* PPIPE_DRIVER_STATISTICS */   
  2291. case PPIPE_DRIVER_STAT_IFSEND:
  2292. memcpy(&ppp_udp_pkt->data, &ppp_priv_area->if_send_stat, 
  2293. sizeof(if_send_stat_t));
  2294. ppp_udp_pkt->cblock.result = 0;
  2295. ppp_udp_pkt->cblock.length = sizeof(if_send_stat_t);
  2296. mbox->cmd.length = sizeof(if_send_stat_t);
  2297. break;
  2298. case PPIPE_DRIVER_STAT_INTR:
  2299. memcpy(&ppp_udp_pkt->data, &card->statistics, 
  2300. sizeof(global_stats_t));
  2301. memcpy(&ppp_udp_pkt->data+sizeof(global_stats_t),
  2302. &ppp_priv_area->rx_intr_stat,
  2303. sizeof(rx_intr_stat_t));
  2304. ppp_udp_pkt->cblock.result = 0;
  2305. ppp_udp_pkt->cblock.length = sizeof(global_stats_t)+
  2306.      sizeof(rx_intr_stat_t);
  2307. mbox->cmd.length = ppp_udp_pkt->cblock.length;
  2308. break;
  2309. case PPIPE_DRIVER_STAT_GEN:
  2310. memcpy( &ppp_udp_pkt->data,
  2311. &ppp_priv_area->pipe_mgmt_stat,
  2312. sizeof(pipe_mgmt_stat_t));
  2313. memcpy(&ppp_udp_pkt->data+sizeof(pipe_mgmt_stat_t), 
  2314.        &card->statistics, sizeof(global_stats_t));
  2315. ppp_udp_pkt->cblock.result = 0;
  2316. ppp_udp_pkt->cblock.length = sizeof(global_stats_t)+
  2317.      sizeof(rx_intr_stat_t);
  2318. mbox->cmd.length = ppp_udp_pkt->cblock.length;
  2319. break;
  2320. /* FT1 MONITOR STATUS */
  2321.     case FT1_MONITOR_STATUS_CTRL:
  2322. /* Enable FT1 MONITOR STATUS */
  2323.          if( ppp_udp_pkt->data[0] == 1) {
  2324. if( rCount++ != 0 ) {
  2325.          ppp_udp_pkt->cblock.result = 0;
  2326.            mbox->cmd.length = 1;
  2327.    break;
  2328.      }
  2329.        }
  2330.        /* Disable FT1 MONITOR STATUS */
  2331.        if( ppp_udp_pkt->data[0] == 0) {
  2332.            if( --rCount != 0) {
  2333.    ppp_udp_pkt->cblock.result = 0;
  2334.    mbox->cmd.length = 1;
  2335.    break;
  2336.          } 
  2337.        } 
  2338. goto udp_dflt_cmd;
  2339. /* WARNING: FIXME: This should be fixed.
  2340.  * The FT1 Status Ctrl doesn't have a break
  2341.                  * statment.  Thus, no code must be inserted
  2342.                  * HERE: between default and above case statement */
  2343. default:
  2344. udp_dflt_cmd:
  2345.         
  2346. /* it's a board command */
  2347. mbox->cmd.command = ppp_udp_pkt->cblock.command;
  2348. mbox->cmd.length = ppp_udp_pkt->cblock.length;
  2349.  
  2350. if(mbox->cmd.length) {
  2351. memcpy(&mbox->data,(unsigned char *)ppp_udp_pkt->data,
  2352.        mbox->cmd.length);
  2353.        } 
  2354.           
  2355. /* run the command on the board */
  2356. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2357. if (err != CMD_OK) {
  2358.      ppp_error(card, err, mbox);
  2359.      ++ppp_priv_area->pipe_mgmt_stat.
  2360.  UDP_PIPE_mgmt_adptr_cmnd_timeout;
  2361. break;
  2362. }
  2363.           
  2364.    ++ppp_priv_area->pipe_mgmt_stat.UDP_PIPE_mgmt_adptr_cmnd_OK;
  2365. /* copy the result back to our buffer */
  2366. memcpy(&ppp_udp_pkt->cblock,mbox, sizeof(cblock_t));
  2367.           
  2368. if(mbox->cmd.length) {
  2369. memcpy(&ppp_udp_pkt->data,&mbox->data,mbox->cmd.length);
  2370. } /* end of switch */
  2371.       } /* end of else */
  2372.       /* Fill UDP TTL */
  2373.       ppp_udp_pkt->ip_pkt.ttl = card->wandev.ttl; 
  2374.       len = reply_udp(ppp_priv_area->udp_pkt_data, mbox->cmd.length);
  2375.       if (ppp_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK) {
  2376. /* Make sure we are not already sending */
  2377. if (!test_bit(SEND_CRIT,&card->wandev.critical)){
  2378. ++ppp_priv_area->pipe_mgmt_stat.UDP_PIPE_mgmt_passed_to_adptr;
  2379. ppp_send(card,ppp_priv_area->udp_pkt_data,len,ppp_priv_area->protocol);
  2380. }
  2381. } else {
  2382. /* Pass it up the stack
  2383.         Allocate socket buffer */
  2384. if ((new_skb = dev_alloc_skb(len)) != NULL) {
  2385.     
  2386. /* copy data into new_skb */
  2387.         buf = skb_put(new_skb, len);
  2388.         memcpy(buf,ppp_priv_area->udp_pkt_data, len);
  2389.      ++ppp_priv_area->pipe_mgmt_stat.UDP_PIPE_mgmt_passed_to_stack;
  2390.              /* Decapsulate packet and pass it up the protocol 
  2391.    stack */
  2392.      new_skb->protocol = htons(ETH_P_IP);
  2393.              new_skb->dev = dev;
  2394.      new_skb->mac.raw  = new_skb->data;
  2395. netif_rx(new_skb);
  2396. } else {
  2397.     
  2398. ++ppp_priv_area->pipe_mgmt_stat.UDP_PIPE_mgmt_no_socket;
  2399. printk(KERN_INFO "no socket buffers available!n");
  2400.    }
  2401.      }
  2402. ppp_priv_area->udp_pkt_lgth = 0;
  2403. return; 
  2404. }
  2405. /*=============================================================================
  2406.  * Initial the ppp_private_area structure.
  2407.  */
  2408. static void init_ppp_priv_struct( ppp_private_area_t *ppp_priv_area )
  2409. {
  2410. memset(&ppp_priv_area->if_send_stat, 0, sizeof(if_send_stat_t));
  2411. memset(&ppp_priv_area->rx_intr_stat, 0, sizeof(rx_intr_stat_t));
  2412. memset(&ppp_priv_area->pipe_mgmt_stat, 0, sizeof(pipe_mgmt_stat_t));
  2413. }
  2414. /*============================================================================
  2415.  * Initialize Global Statistics
  2416.  */
  2417. static void init_global_statistics( sdla_t *card )
  2418. {
  2419. memset(&card->statistics, 0, sizeof(global_stats_t));
  2420. }
  2421. /*============================================================================
  2422.  * Initialize Receive and Transmit Buffers.
  2423.  */
  2424. static void init_ppp_tx_rx_buff( sdla_t *card )
  2425. {
  2426. ppp508_buf_info_t* info;
  2427. if (card->hw.type == SDLA_S514) {
  2428. info = (void*)(card->hw.dpmbase + PPP514_BUF_OFFS);
  2429.         card->u.p.txbuf_base = (void*)(card->hw.dpmbase +
  2430. info->txb_ptr);
  2431.                 card->u.p.txbuf_last = (ppp_buf_ctl_t*)card->u.p.txbuf_base +
  2432.                         (info->txb_num - 1);
  2433.                 card->u.p.rxbuf_base = (void*)(card->hw.dpmbase +
  2434.                         info->rxb_ptr);
  2435.                 card->u.p.rxbuf_last = (ppp_buf_ctl_t*)card->u.p.rxbuf_base +
  2436.                         (info->rxb_num - 1);
  2437. } else {
  2438. info = (void*)(card->hw.dpmbase + PPP508_BUF_OFFS);
  2439. card->u.p.txbuf_base = (void*)(card->hw.dpmbase +
  2440. (info->txb_ptr - PPP508_MB_VECT));
  2441. card->u.p.txbuf_last = (ppp_buf_ctl_t*)card->u.p.txbuf_base +
  2442. (info->txb_num - 1);
  2443. card->u.p.rxbuf_base = (void*)(card->hw.dpmbase +
  2444. (info->rxb_ptr - PPP508_MB_VECT));
  2445. card->u.p.rxbuf_last = (ppp_buf_ctl_t*)card->u.p.rxbuf_base +
  2446. (info->rxb_num - 1);
  2447. }
  2448. card->u.p.txbuf_next = (unsigned long*)&info->txb_nxt; 
  2449. card->u.p.rxbuf_next = (unsigned long*)&info->rxb1_ptr;
  2450. card->u.p.rx_base = info->rxb_base;
  2451.         card->u.p.rx_top  = info->rxb_end;
  2452.       
  2453. card->u.p.txbuf = card->u.p.txbuf_base;
  2454. card->rxmb = card->u.p.rxbuf_base;
  2455. }
  2456. /*=============================================================================
  2457.  * Read Connection Information (ie for Remote IP address assginment).
  2458.  * Called when ppp interface connected.
  2459.  */
  2460. static int read_info( sdla_t *card )
  2461. {
  2462. netdevice_t *dev = card->wandev.dev;
  2463. ppp_private_area_t *ppp_priv_area = dev->priv;
  2464. int err;
  2465. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  2466. struct ifreq if_info;
  2467. struct sockaddr_in *if_data1, *if_data2;
  2468. mm_segment_t fs;
  2469. #else
  2470. #ifdef _DYNAMIC_ROUTE_20X_SUPPORT_
  2471.         struct rtentry route;
  2472. #endif
  2473. #endif
  2474. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  2475. /* Set Local and remote addresses */
  2476. memset(&if_info, 0, sizeof(if_info));
  2477. strcpy(if_info.ifr_name, dev->name);
  2478. fs = get_fs();
  2479. set_fs(get_ds());     /* get user space block */ 
  2480. /* Change the local and remote ip address of the interface.
  2481.  * This will also add in the destination route.
  2482.  */
  2483. if_data1 = (struct sockaddr_in *)&if_info.ifr_addr;
  2484. if_data1->sin_addr.s_addr = ppp_priv_area->ip_local;
  2485. if_data1->sin_family = AF_INET;
  2486. err = devinet_ioctl( SIOCSIFADDR, &if_info );
  2487. if_data2 = (struct sockaddr_in *)&if_info.ifr_dstaddr;
  2488. if_data2->sin_addr.s_addr = ppp_priv_area->ip_remote;
  2489. if_data2->sin_family = AF_INET;
  2490. err = devinet_ioctl( SIOCSIFDSTADDR, &if_info );
  2491. set_fs(fs);           /* restore old block */
  2492. #else
  2493. /* FIXME: Dynamic Routing in 2.0.X kernels is not
  2494.          * supported. Sorry ! I'll come back to it when I get
  2495.          * a chance. */
  2496. printk(KERN_INFO "%s: ERROR, Dynamic routing is not supported in 2.0.X kernelsn",
  2497. card->devname);
  2498. printk(KERN_INFO "%s:        Please use the STATIC IP mode!n",
  2499. card->devname);
  2500. err = 0;
  2501. #ifdef _DYNAMIC_ROUTE_20X_SUPPORT_
  2502. dev->pa_dstaddr = ppp_priv_area->ip_remote;
  2503. dev->pa_addr = ppp_priv_area->ip_local;
  2504. memset(&route, 0, sizeof(route));
  2505. route.rt_dev = dev->name;
  2506. route.rt_flags = 0;
  2507. ((struct sockaddr_in *)&(route.rt_dst))->sin_addr.s_addr =
  2508. dev->pa_dstaddr;
  2509. ((struct sockaddr_in *)&(route.rt_dst))->sin_family = AF_INET;
  2510. ((struct sockaddr_in *)&(route.rt_genmask))->sin_addr.s_addr =
  2511. 0xFFFFFFFF;
  2512. ((struct sockaddr_in *)&(route.rt_genmask))->sin_family =
  2513. AF_INET;
  2514. err = ip_rt_new(&route);
  2515. #endif
  2516. #endif
  2517. if (err) {
  2518. printk (KERN_INFO "%s: Adding of route failed: %in",
  2519. card->devname,err);
  2520. printk (KERN_INFO "%s: Local : %sn",
  2521. card->devname,in_ntoa(ppp_priv_area->ip_local));
  2522. printk (KERN_INFO "%s: Remote: %sn",
  2523. card->devname,in_ntoa(ppp_priv_area->ip_remote));
  2524. }
  2525. return err;
  2526. }
  2527. /*=============================================================================
  2528.  * Remove Dynamic Route.
  2529.  * Called when ppp interface disconnected.
  2530.  */
  2531. static void remove_route( sdla_t *card )
  2532. {
  2533. netdevice_t *dev = card->wandev.dev;
  2534. long ip_addr;
  2535. int err;
  2536. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  2537.         mm_segment_t fs;
  2538. struct ifreq if_info;
  2539. struct sockaddr_in *if_data1;
  2540.         struct in_device *in_dev = dev->ip_ptr;
  2541.         struct in_ifaddr *ifa = in_dev->ifa_list;
  2542. #else
  2543. unsigned long fs = 0;
  2544.         struct rtentry route;
  2545. #endif
  2546. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  2547. ip_addr = ifa->ifa_local;
  2548. /* Set Local and remote addresses */
  2549. memset(&if_info, 0, sizeof(if_info));
  2550. strcpy(if_info.ifr_name, dev->name);
  2551. #endif
  2552. fs = get_fs();
  2553.         set_fs(get_ds());     /* get user space block */ 
  2554. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  2555. /* Change the local ip address of the interface to 0.
  2556.  * This will also delete the destination route.
  2557.  */
  2558. if_data1 = (struct sockaddr_in *)&if_info.ifr_addr;
  2559. if_data1->sin_addr.s_addr = 0;
  2560. if_data1->sin_family = AF_INET;
  2561. err = devinet_ioctl( SIOCSIFADDR, &if_info );
  2562. #else
  2563. ip_addr = dev->pa_addr;
  2564. dev->pa_dstaddr = 0;
  2565. memset(&route, 0, sizeof(route));
  2566. route.rt_dev = dev->name;
  2567. route.rt_flags = 0;
  2568. ((struct sockaddr_in *)&(route.rt_dst))->sin_addr.s_addr =
  2569. dev->pa_dstaddr;
  2570. ((struct sockaddr_in *)&(route.rt_dst))->sin_family = AF_INET;
  2571. ((struct sockaddr_in *)&(route.rt_genmask))->sin_addr.s_addr =
  2572. 0xFFFFFFFF;
  2573.         ((struct sockaddr_in *)&(route.rt_genmask))->sin_family =
  2574. AF_INET;
  2575. err = ip_rt_kill(&route);
  2576. #endif
  2577.         set_fs(fs);           /* restore old block */
  2578. if (err) {
  2579. printk (KERN_INFO "%s: Deleting dynamic route failed %d!n",
  2580.  card->devname, err);
  2581. return;
  2582. }else{
  2583. printk (KERN_INFO "%s: PPP Deleting dynamic route %s successfulyn",
  2584. card->devname, in_ntoa(ip_addr));
  2585. }
  2586. return;
  2587. }
  2588. /*=============================================================================
  2589.  * Perform the Interrupt Test by running the READ_CODE_VERSION command MAX_INTR
  2590.  * _TEST_COUNTER times.
  2591.  */
  2592. static int intr_test( sdla_t *card )
  2593. {
  2594. ppp_mbox_t *mb = card->mbox;
  2595. int err,i;
  2596. err = ppp_set_intr_mode( card, 0x08 );
  2597. if (err == CMD_OK) { 
  2598. for (i = 0; i < MAX_INTR_TEST_COUNTER; i ++) {
  2599. /* Run command READ_CODE_VERSION */
  2600. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  2601. mb->cmd.length  = 0;
  2602. mb->cmd.command = PPP_READ_CODE_VERSION;
  2603. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  2604. if (err != CMD_OK) 
  2605. ppp_error(card, err, mb);
  2606. }
  2607. }
  2608. else return err;
  2609. err = ppp_set_intr_mode( card, 0 );
  2610. if (err != CMD_OK) 
  2611. return err;
  2612. return 0;
  2613. }
  2614. /*==============================================================================
  2615.  * Determine what type of UDP call it is. DRVSTATS or PTPIPEAB ?
  2616.  */
  2617. static int udp_pkt_type( struct sk_buff *skb, sdla_t *card )
  2618. {
  2619. unsigned char *sendpacket;
  2620. unsigned char buf2[5]; 
  2621. ppp_udp_pkt_t *ppp_udp_pkt = (ppp_udp_pkt_t *)skb->data; 
  2622. sendpacket = skb->data;
  2623. memcpy(&buf2, &card->wandev.udp_port, 2);
  2624. if(  ppp_udp_pkt->ip_pkt.ver_inet_hdr_length  == 0x45 &&        /* IP packet */ 
  2625. sendpacket[9]  == 0x11 &&        /* UDP packet */
  2626. sendpacket[22] == buf2[1] &&     /* UDP Port */
  2627. sendpacket[23] == buf2[0] &&
  2628. sendpacket[36] == 0x01 ) {
  2629. if (    sendpacket[28] == 0x50 &&    /* PTPIPEAB: Signature */ 
  2630. sendpacket[29] == 0x54 &&      
  2631. sendpacket[30] == 0x50 &&      
  2632. sendpacket[31] == 0x49 &&      
  2633. sendpacket[32] == 0x50 &&      
  2634. sendpacket[33] == 0x45 &&      
  2635. sendpacket[34] == 0x41 &&      
  2636. sendpacket[35] == 0x42 ){ 
  2637. return UDP_PTPIPE_TYPE;
  2638. } else if(sendpacket[28] == 0x44 &&  /* DRVSTATS: Signature */
  2639. sendpacket[29] == 0x52 &&      
  2640.        sendpacket[30] == 0x56 &&      
  2641.        sendpacket[31] == 0x53 &&      
  2642.        sendpacket[32] == 0x54 &&      
  2643.        sendpacket[33] == 0x41 &&      
  2644.        sendpacket[34] == 0x54 &&      
  2645.        sendpacket[35] == 0x53 ){
  2646. return UDP_DRVSTATS_TYPE;
  2647. } else
  2648. return UDP_INVALID_TYPE;
  2649. } else
  2650. return UDP_INVALID_TYPE;
  2651. }
  2652. /*============================================================================
  2653.  * Check to see if the packet to be transmitted contains a broadcast or
  2654.  * multicast source IP address.
  2655.  */
  2656. static int chk_bcast_mcast_addr(sdla_t *card, netdevice_t* dev,
  2657. struct sk_buff *skb)
  2658. {
  2659. u32 src_ip_addr;
  2660.         u32 broadcast_ip_addr = 0;
  2661. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  2662.         struct in_device *in_dev;
  2663. #endif
  2664.         /* read the IP source address from the outgoing packet */
  2665.         src_ip_addr = *(u32 *)(skb->data + 12);
  2666. /* read the IP broadcast address for the device */
  2667. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  2668.         in_dev = dev->ip_ptr;
  2669.         if(in_dev != NULL) {
  2670.                 struct in_ifaddr *ifa= in_dev->ifa_list;
  2671.                 if(ifa != NULL)
  2672.                         broadcast_ip_addr = ifa->ifa_broadcast;
  2673.                 else
  2674.                         return 0;
  2675.         }
  2676. #else
  2677.         broadcast_ip_addr = dev->pa_brdaddr;
  2678. #endif
  2679.  
  2680.         /* check if the IP Source Address is a Broadcast address */
  2681.         if((dev->flags & IFF_BROADCAST) && (src_ip_addr == broadcast_ip_addr)) {
  2682.                 printk(KERN_INFO "%s: Broadcast Source Address silently discardedn",
  2683. card->devname);
  2684.                 return 1;
  2685.         } 
  2686.         /* check if the IP Source Address is a Multicast address */
  2687.         if((ntohl(src_ip_addr) >= 0xE0000001) &&
  2688. (ntohl(src_ip_addr) <= 0xFFFFFFFE)) {
  2689.                 printk(KERN_INFO "%s: Multicast Source Address silently discardedn",
  2690. card->devname);
  2691.                 return 1;
  2692.         }
  2693.         return 0;
  2694. }
  2695. void s508_lock (sdla_t *card, unsigned long *smp_flags)
  2696. {
  2697. #if defined(__SMP__) || defined(LINUX_2_4)
  2698. spin_lock_irqsave(&card->wandev.lock, *smp_flags);
  2699. #else
  2700. disable_irq(card->hw.irq);
  2701. #endif                                                                     
  2702. }
  2703. void s508_unlock (sdla_t *card, unsigned long *smp_flags)
  2704. {
  2705. #if defined(__SMP__) || defined(LINUX_2_4)
  2706.         spin_unlock_irqrestore(&card->wandev.lock, *smp_flags);
  2707. #else
  2708. enable_irq(card->hw.irq);
  2709. #endif           
  2710. }
  2711. static int read_connection_info (sdla_t *card)
  2712. {
  2713. ppp_mbox_t *mb = card->mbox;
  2714. netdevice_t *dev = card->wandev.dev;
  2715. ppp_private_area_t *ppp_priv_area = dev->priv;
  2716. ppp508_connect_info_t *ppp508_connect_info;
  2717. int err;
  2718. memset(&mb->cmd, 0, sizeof(ppp_cmd_t));
  2719. mb->cmd.length  = 0;
  2720. mb->cmd.command = PPP_GET_CONNECTION_INFO;
  2721. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  2722. if (err != CMD_OK) { 
  2723. ppp_error(card, err, mb);
  2724. ppp_priv_area->ip_remote = 0;
  2725. ppp_priv_area->ip_local = 0;
  2726. }
  2727. else {
  2728. ppp508_connect_info = (ppp508_connect_info_t *)mb->data;
  2729. ppp_priv_area->ip_remote = ppp508_connect_info->ip_remote;
  2730. ppp_priv_area->ip_local = ppp508_connect_info->ip_local;
  2731. NEX_PRINTK(KERN_INFO "READ CONNECTION GOT IP ADDRESS %x, %xn",
  2732. ppp_priv_area->ip_remote,
  2733. ppp_priv_area->ip_local);
  2734. }
  2735. return err;
  2736. }
  2737. /*===============================================================================
  2738.  * config_ppp
  2739.  *
  2740.  * Configure the ppp protocol and enable communications.
  2741.  *
  2742.  *    The if_open function binds this function to the poll routine.
  2743.  *      Therefore, this function will run every time the ppp interface
  2744.  *      is brought up.  
  2745.  *      
  2746.  * If the communications are not enabled, proceed to configure
  2747.  *      the card and enable communications.
  2748.  *
  2749.  *      If the communications are enabled, it means that the interface
  2750.  *      was shutdown by ether the user or driver. In this case, we 
  2751.  *      have to check that the IP addresses have not changed.  If
  2752.  *      the IP addresses changed, we have to reconfigure the firmware
  2753.  *      and update the changed IP addresses.  Otherwise, just exit.
  2754.  */
  2755. static int config_ppp (sdla_t *card)
  2756. {
  2757. netdevice_t *dev = card->wandev.dev;
  2758. ppp_flags_t *flags = card->flags;
  2759. ppp_private_area_t *ppp_priv_area = dev->priv;
  2760. if (card->u.p.comm_enabled){
  2761. if (ppp_priv_area->ip_local_tmp != ppp_priv_area->ip_local ||
  2762.     ppp_priv_area->ip_remote_tmp != ppp_priv_area->ip_remote){
  2763. /* The IP addersses have changed, we must
  2764.                          * stop the communications and reconfigure
  2765.                          * the card. Reason: the firmware must know
  2766.                          * the local and remote IP addresses. */
  2767. disable_comm(card);
  2768. wanpipe_set_state(card, WAN_DISCONNECTED);
  2769. printk(KERN_INFO 
  2770. "%s: IP addresses changed!n",
  2771. card->devname);
  2772. printk(KERN_INFO "%s: Restarting communications ...n",
  2773. card->devname);
  2774. }else{ 
  2775. /* IP addresses are the same and the link is up, 
  2776.                          * we dont have to do anything here. Therefore, exit */
  2777. return 0;
  2778. }
  2779. }
  2780. /* Record the new IP addreses */
  2781. ppp_priv_area->ip_local = ppp_priv_area->ip_local_tmp;
  2782. ppp_priv_area->ip_remote = ppp_priv_area->ip_remote_tmp;
  2783. if (config508(dev, card)){
  2784. printk(KERN_INFO "%s: Failed to configure PPP devicen",
  2785. card->devname);
  2786. return 0;
  2787. }
  2788. if (ppp_set_intr_mode(card, PPP_INTR_RXRDY|
  2789.      PPP_INTR_TXRDY|
  2790.      PPP_INTR_MODEM|
  2791.      PPP_INTR_DISC |
  2792.      PPP_INTR_OPEN |
  2793.      PPP_INTR_DROP_DTR |
  2794. PPP_INTR_TIMER)) {
  2795. printk(KERN_INFO "%s: Failed to configure board interrupts !n", 
  2796. card->devname);
  2797. return 0;
  2798. }
  2799.         /* Turn off the transmit and timer interrupt */
  2800. flags->imask &= ~(PPP_INTR_TXRDY | PPP_INTR_TIMER) ;
  2801. /* If you are not the authenticator and any one of the protocol is 
  2802.  * enabled then we call the set_out_bound_authentication.
  2803.  */
  2804. if ( !card->u.p.authenticator  && (ppp_priv_area->pap || ppp_priv_area->chap)) {
  2805. if ( ppp_set_outbnd_auth(card, ppp_priv_area) ){
  2806. printk(KERN_INFO "%s: Outbound authentication failed !n",
  2807. card->devname);
  2808. return 0;
  2809. }
  2810. /* If you are the authenticator and any one of the protocol is enabled
  2811.  * then we call the set_in_bound_authentication.
  2812.  */
  2813. if (card->u.p.authenticator && (ppp_priv_area->pap || ppp_priv_area->chap)){
  2814. if (ppp_set_inbnd_auth(card, ppp_priv_area)){
  2815. printk(KERN_INFO "%s: Inbound authentication failed !n",
  2816. card->devname);
  2817. return 0;
  2818. }
  2819. }
  2820. /* If we fail to enable communications here it's OK,
  2821.  * since the DTR timer will cause a disconnected, which
  2822.  * will retrigger communication in timer_intr() */
  2823. if (ppp_comm_enable(card) == CMD_OK) {
  2824. wanpipe_set_state(card, WAN_CONNECTING);
  2825. init_ppp_tx_rx_buff(card);
  2826. }
  2827. return 0; 
  2828. }
  2829. /*============================================================
  2830.  * ppp_poll
  2831.  *
  2832.  * Rationale:
  2833.  *  We cannot manipulate the routing tables, or
  2834.  *      ip addresses withing the interrupt. Therefore
  2835.  *      we must perform such actons outside an interrupt 
  2836.  *      at a later time. 
  2837.  *
  2838.  * Description:
  2839.  * PPP polling routine, responsible for 
  2840.  *      shutting down interfaces upon disconnect
  2841.  *      and adding/removing routes. 
  2842.  *      
  2843.  * Usage:        
  2844.  *  This function is executed for each ppp  
  2845.  *  interface through a tq_schedule bottom half.
  2846.  *      
  2847.  *      trigger_ppp_poll() function is used to kick
  2848.  *      the ppp_poll routine.  
  2849.  */
  2850. static void ppp_poll (netdevice_t *dev)
  2851. {
  2852. ppp_private_area_t *ppp_priv_area; 
  2853. sdla_t *card;
  2854. u8 check_gateway=0;
  2855. ppp_flags_t *flags;
  2856. if (!dev || (ppp_priv_area = dev->priv) == NULL)
  2857. return;
  2858. card = ppp_priv_area->card;
  2859. flags = card->flags;
  2860. /* Shutdown is in progress, stop what you are 
  2861.  * doing and get out */
  2862. if (test_bit(PERI_CRIT,&card->wandev.critical)){
  2863. clear_bit(POLL_CRIT,&card->wandev.critical);
  2864. return;
  2865. }
  2866. /* if_open() function has triggered the polling routine
  2867.  * to determine the configured IP addresses.  Once the
  2868.  * addresses are found, trigger the chdlc configuration */
  2869. if (test_bit(0,&ppp_priv_area->config_ppp)){
  2870. ppp_priv_area->ip_local_tmp  = get_ip_address(dev,WAN_LOCAL_IP);
  2871. ppp_priv_area->ip_remote_tmp = get_ip_address(dev,WAN_POINTOPOINT_IP);
  2872. if (ppp_priv_area->ip_local_tmp == ppp_priv_area->ip_remote_tmp && 
  2873.             card->u.p.ip_mode == WANOPT_PPP_HOST){
  2874. if (++ppp_priv_area->ip_error > MAX_IP_ERRORS){
  2875. printk(KERN_INFO "n%s: --- WARNING ---n",
  2876. card->devname);
  2877. printk(KERN_INFO "%s: The local IP address is the same as then",
  2878. card->devname);
  2879. printk(KERN_INFO "%s: Point-to-Point IP address.n",
  2880. card->devname);
  2881. printk(KERN_INFO "%s: --- WARNING ---nn",
  2882. card->devname);
  2883. }else{
  2884. clear_bit(POLL_CRIT,&card->wandev.critical);
  2885. ppp_priv_area->poll_delay_timer.expires = jiffies+HZ;
  2886. add_timer(&ppp_priv_area->poll_delay_timer);
  2887. return;
  2888. }
  2889. }
  2890. ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_CONFIG;
  2891. flags->imask |= PPP_INTR_TIMER;
  2892. ppp_priv_area->ip_error=0;
  2893. clear_bit(0,&ppp_priv_area->config_ppp);
  2894. clear_bit(POLL_CRIT,&card->wandev.critical);
  2895. return;
  2896. }
  2897. /* Dynamic interface implementation, as well as dynamic
  2898.  * routing.  */
  2899. switch (card->wandev.state) {
  2900. case WAN_DISCONNECTED:
  2901. /* If the dynamic interface configuration is on, and interface 
  2902.  * is up, then bring down the netowrk interface */
  2903. if (test_bit(DYN_OPT_ON,&ppp_priv_area->interface_down) &&
  2904.     !test_bit(DEV_DOWN,&ppp_priv_area->interface_down) &&
  2905.     card->wandev.dev->flags & IFF_UP){
  2906. printk(KERN_INFO "%s: Interface %s down.n",
  2907. card->devname,card->wandev.dev->name);
  2908. change_dev_flags(card->wandev.dev,
  2909. (card->wandev.dev->flags&~IFF_UP));
  2910. set_bit(DEV_DOWN,&ppp_priv_area->interface_down);
  2911. }else{
  2912. /* We need to check if the local IP address is
  2913.                      * zero. If it is, we shouldn't try to remove it.
  2914.                    * For some reason the kernel crashes badly if 
  2915.                    * we try to remove the route twice */
  2916. if (card->wandev.dev->flags & IFF_UP && 
  2917.          get_ip_address(card->wandev.dev,WAN_LOCAL_IP) &&
  2918.          card->u.p.ip_mode == WANOPT_PPP_PEER){
  2919. remove_route(card);
  2920. }
  2921. }
  2922. break;
  2923. case WAN_CONNECTED:
  2924. /* In SMP machine this code can execute before the interface
  2925.  * comes up.  In this case, we must make sure that we do not
  2926.  * try to bring up the interface before dev_open() is finished */
  2927. /* DEV_DOWN will be set only when we bring down the interface
  2928.  * for the very first time. This way we know that it was us
  2929.  * that brought the interface down */
  2930. if (test_bit(DYN_OPT_ON,&ppp_priv_area->interface_down) &&
  2931.             test_bit(DEV_DOWN,  &ppp_priv_area->interface_down) &&
  2932.       !(card->wandev.dev->flags & IFF_UP)){
  2933. printk(KERN_INFO "%s: Interface %s up.n",
  2934. card->devname,card->wandev.dev->name);
  2935. change_dev_flags(card->wandev.dev,(card->wandev.dev->flags|IFF_UP));
  2936. clear_bit(DEV_DOWN,&ppp_priv_area->interface_down);
  2937. check_gateway=1;
  2938. }
  2939. if ((card->u.p.ip_mode == WANOPT_PPP_PEER) && 
  2940.     test_bit(1,&Read_connection_info)) { 
  2941. process_route(card);
  2942. clear_bit(1,&Read_connection_info);
  2943. check_gateway=1;
  2944. }
  2945. if (ppp_priv_area->gateway && check_gateway)
  2946. add_gateway(card,dev);
  2947. break;
  2948. }
  2949. clear_bit(POLL_CRIT,&card->wandev.critical);
  2950. return;
  2951. }
  2952. /*============================================================
  2953.  * trigger_ppp_poll
  2954.  *
  2955.  * Description:
  2956.  *  Add a ppp_poll() task into a tq_scheduler bh handler
  2957.  *      for a specific interface.  This will kick
  2958.  *      the ppp_poll() routine at a later time. 
  2959.  *
  2960.  * Usage:
  2961.  *  Interrupts use this to defer a taks to 
  2962.  *      a polling routine.
  2963.  *
  2964.  */
  2965. static void trigger_ppp_poll (netdevice_t *dev)
  2966. {
  2967. ppp_private_area_t *ppp_priv_area;
  2968. if ((ppp_priv_area=dev->priv) != NULL){ 
  2969. sdla_t *card = ppp_priv_area->card;
  2970. if (test_bit(PERI_CRIT,&card->wandev.critical)){
  2971. return;
  2972. }
  2973. if (test_and_set_bit(POLL_CRIT,&card->wandev.critical)){
  2974. return;
  2975. }
  2976. #ifdef LINUX_2_4
  2977. schedule_task(&ppp_priv_area->poll_task);
  2978. #else
  2979. queue_task(&ppp_priv_area->poll_task, &tq_scheduler);
  2980. #endif
  2981. }
  2982. return;
  2983. }
  2984. static void ppp_poll_delay (unsigned long dev_ptr)
  2985. {
  2986. netdevice_t *dev = (netdevice_t *)dev_ptr;
  2987. trigger_ppp_poll(dev);
  2988. }
  2989. /*============================================================
  2990.  * detect_and_fix_tx_bug
  2991.  *
  2992.  * Description:
  2993.  * On connect, if the board tx buffer ptr is not the same
  2994.  *      as the driver tx buffer ptr, we found a firmware bug.
  2995.  *      Report the bug to the above layer.  To fix the
  2996.  *      error restart communications again.
  2997.  *
  2998.  * Usage:
  2999.  *
  3000.  */
  3001. static int detect_and_fix_tx_bug (sdla_t *card)
  3002. {
  3003. if (((unsigned long)card->u.p.txbuf_base&0xFFF) != ((*card->u.p.txbuf_next)&0xFFF)){
  3004. NEX_PRINTK(KERN_INFO "Major Error, Fix the bugn");
  3005. return 1;
  3006. }
  3007. return 0;
  3008. }
  3009. MODULE_LICENSE("GPL");
  3010. /****** End *****************************************************************/