1 /* Copyright (c) 2012 Coraid, Inc. See COPYING for GPL terms. */
4 * Ethernet portion of AoE driver
8 #include <linux/hdreg.h>
9 #include <linux/blkdev.h>
10 #include <linux/netdevice.h>
11 #include <linux/moduleparam.h>
12 #include <net/net_namespace.h>
13 #include <asm/unaligned.h>
18 static char *aoe_errlist
[] =
21 "unrecognized command code",
22 "bad argument parameter",
24 "config string present",
32 static char aoe_iflist
[IFLISTSZ
];
33 module_param_string(aoe_iflist
, aoe_iflist
, IFLISTSZ
, 0600);
34 MODULE_PARM_DESC(aoe_iflist
, "aoe_iflist=\"dev1 [dev2 ...]\"");
36 static wait_queue_head_t txwq
;
37 static struct ktstate kts
;
40 static int __init
aoe_iflist_setup(char *str
)
42 strncpy(aoe_iflist
, str
, IFLISTSZ
);
43 aoe_iflist
[IFLISTSZ
- 1] = '\0';
47 __setup("aoe_iflist=", aoe_iflist_setup
);
50 static spinlock_t txlock
;
51 static struct sk_buff_head skbtxq
;
53 /* enters with txlock held */
59 while ((skb
= skb_dequeue(&skbtxq
))) {
60 spin_unlock_irq(&txlock
);
62 spin_lock_irq(&txlock
);
68 is_aoe_netif(struct net_device
*ifp
)
73 if (aoe_iflist
[0] == '\0')
76 p
= aoe_iflist
+ strspn(aoe_iflist
, WHITESPACE
);
77 for (; *p
; p
= q
+ strspn(q
, WHITESPACE
)) {
78 q
= p
+ strcspn(p
, WHITESPACE
);
82 len
= strlen(p
); /* last token in aoe_iflist */
84 if (strlen(ifp
->name
) == len
&& !strncmp(ifp
->name
, p
, len
))
94 set_aoe_iflist(const char __user
*user_str
, size_t size
)
99 if (copy_from_user(aoe_iflist
, user_str
, size
)) {
100 printk(KERN_INFO
"aoe: copy from user failed\n");
103 aoe_iflist
[size
] = 0x00;
108 aoenet_xmit(struct sk_buff_head
*queue
)
110 struct sk_buff
*skb
, *tmp
;
113 skb_queue_walk_safe(queue
, skb
, tmp
) {
114 __skb_unlink(skb
, queue
);
115 spin_lock_irqsave(&txlock
, flags
);
116 skb_queue_tail(&skbtxq
, skb
);
117 spin_unlock_irqrestore(&txlock
, flags
);
123 * (1) len doesn't include the header by default. I want this.
126 aoenet_rcv(struct sk_buff
*skb
, struct net_device
*ifp
, struct packet_type
*pt
, struct net_device
*orig_dev
)
129 struct aoe_atahdr
*ah
;
133 if (dev_net(ifp
) != &init_net
)
136 skb
= skb_share_check(skb
, GFP_ATOMIC
);
139 if (!is_aoe_netif(ifp
))
141 skb_push(skb
, ETH_HLEN
); /* (1) */
142 sn
= sizeof(*h
) + sizeof(*ah
);
143 if (skb
->len
>= sn
) {
144 sn
-= skb_headlen(skb
);
145 if (sn
> 0 && !__pskb_pull_tail(skb
, sn
))
148 h
= (struct aoe_hdr
*) skb
->data
;
149 n
= get_unaligned_be32(&h
->tag
);
150 if ((h
->verfl
& AOEFL_RSP
) == 0 || (n
& 1<<31))
153 if (h
->verfl
& AOEFL_ERR
) {
159 "%s%d.%d@%s; ecode=%d '%s'\n",
160 "aoe: error packet from ",
161 get_unaligned_be16(&h
->major
),
162 h
->minor
, skb
->dev
->name
,
163 h
->err
, aoe_errlist
[n
]);
169 /* ata_rsp may keep skb for later processing or give it back */
170 skb
= aoecmd_ata_rsp(skb
);
176 if (h
->cmd
>= AOECMD_VEND_MIN
)
177 break; /* don't complain about vendor commands */
178 pr_info("aoe: unknown AoE command type 0x%02x\n", h
->cmd
);
189 static struct packet_type aoe_pt __read_mostly
= {
190 .type
= __constant_htons(ETH_P_AOE
),
197 skb_queue_head_init(&skbtxq
);
198 init_waitqueue_head(&txwq
);
199 spin_lock_init(&txlock
);
204 if (aoe_ktstart(&kts
))
206 dev_add_pack(&aoe_pt
);
214 skb_queue_purge(&skbtxq
);
215 dev_remove_pack(&aoe_pt
);