• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/drivers/staging/otus/
1/*
2 * Copyright (c) 2007-2008 Atheros Communications Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16/*                                                                      */
17/*  Module Name : wrap_pkt.c                                            */
18/*                                                                      */
19/*  Abstract                                                            */
20/*     This module contains wrapper functions for packet handling       */
21/*                                                                      */
22/*  NOTES                                                               */
23/*     Platform dependent.                                              */
24/*                                                                      */
25/************************************************************************/
26
27#include "oal_dt.h"
28#include "usbdrv.h"
29
30#include <linux/netlink.h>
31#include <linux/gfp.h>
32#include <net/iw_handler.h>
33
34
35/* extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER]; 	*/
36extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
37
38
39/***** Rx *****/
40void zfLnxRecv80211(zdev_t *dev, zbuf_t *buf, struct zsAdditionInfo *addInfo)
41{
42	u16_t frameType;
43	u16_t frameCtrl;
44	u16_t frameSubtype;
45	zbuf_t *skb1;
46	struct usbdrv_private *macp = dev->ml_priv;
47
48	/* frameCtrl = zmw_buf_readb(dev, buf, 0);	*/
49	frameCtrl = *(u8_t *)((u8_t *)buf->data);
50	frameType = frameCtrl & 0xf;
51	frameSubtype = frameCtrl & 0xf0;
52
53	if ((frameType == 0x0) && (macp->forwardMgmt)) {
54		switch (frameSubtype) {
55			/* Beacon */
56		case 0x80:
57			/* Probe response */
58		case 0x50:
59			skb1 = skb_copy(buf, GFP_ATOMIC);
60			if (skb1 != NULL) {
61				skb1->dev = dev;
62				skb_reset_mac_header(skb1);
63				skb1->ip_summed = CHECKSUM_NONE;
64				skb1->pkt_type = PACKET_OTHERHOST;
65				/* ETH_P_80211_RAW */
66				skb1->protocol = __constant_htons(0x0019);
67				netif_rx(skb1);
68			}
69			break;
70		default:
71			break;
72		}
73	}
74
75	zfiRecv80211(dev, buf, addInfo);
76	return;
77}
78
79#define ZM_AVOID_UDP_LARGE_PACKET_FAIL
80void zfLnxRecvEth(zdev_t *dev, zbuf_t *buf, u16_t port)
81{
82	struct usbdrv_private *macp = dev->ml_priv;
83#ifdef ZM_AVOID_UDP_LARGE_PACKET_FAIL
84	zbuf_t *new_buf;
85
86	/* new_buf = dev_alloc_skb(2048);	*/
87	new_buf = dev_alloc_skb(buf->len);
88
89	skb_reset_tail_pointer(new_buf);
90
91	skb_put(new_buf, buf->len);
92	memcpy(new_buf->data, buf->data, buf->len);
93
94	/* Free buffer */
95	dev_kfree_skb_any(buf);
96
97	if (port == 0) {
98		new_buf->dev = dev;
99		new_buf->protocol = eth_type_trans(new_buf, dev);
100	} else {
101		/* VAP */
102		if (vap[0].dev != NULL) {
103			new_buf->dev = vap[0].dev;
104			new_buf->protocol = eth_type_trans(new_buf, vap[0].dev);
105		} else {
106			new_buf->dev = dev;
107			new_buf->protocol = eth_type_trans(new_buf, dev);
108		}
109	}
110
111	new_buf->ip_summed = CHECKSUM_NONE;
112	dev->last_rx = jiffies;
113
114	switch (netif_rx(new_buf))
115#else
116	if (port == 0) {
117		buf->dev = dev;
118		buf->protocol = eth_type_trans(buf, dev);
119	} else {
120		/* VAP */
121		if (vap[0].dev != NULL) {
122			buf->dev = vap[0].dev;
123			buf->protocol = eth_type_trans(buf, vap[0].dev);
124		} else {
125			buf->dev = dev;
126			buf->protocol = eth_type_trans(buf, dev);
127		}
128	}
129
130	buf->ip_summed = CHECKSUM_NONE;
131	dev->last_rx = jiffies;
132
133	switch (netif_rx(buf))
134#endif
135	{
136	case NET_RX_DROP:
137		break;
138	default:
139			macp->drv_stats.net_stats.rx_packets++;
140			macp->drv_stats.net_stats.rx_bytes += buf->len;
141		break;
142	}
143
144	return;
145}
146
147/* Leave an empty line below to remove warning message on some compiler */
148