1 /* Copyright (c) 2013 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 */
55 tx(int id
) __must_hold(&txlock
)
58 struct net_device
*ifp
;
60 while ((skb
= skb_dequeue(&skbtxq
))) {
61 spin_unlock_irq(&txlock
);
63 if (dev_queue_xmit(skb
) == NET_XMIT_DROP
&& net_ratelimit())
64 pr_warn("aoe: packet could not be sent on %s. %s\n",
65 ifp
? ifp
->name
: "netif",
66 "consider increasing tx_queue_len");
67 spin_lock_irq(&txlock
);
73 is_aoe_netif(struct net_device
*ifp
)
78 if (aoe_iflist
[0] == '\0')
81 p
= aoe_iflist
+ strspn(aoe_iflist
, WHITESPACE
);
82 for (; *p
; p
= q
+ strspn(q
, WHITESPACE
)) {
83 q
= p
+ strcspn(p
, WHITESPACE
);
87 len
= strlen(p
); /* last token in aoe_iflist */
89 if (strlen(ifp
->name
) == len
&& !strncmp(ifp
->name
, p
, len
))
99 set_aoe_iflist(const char __user
*user_str
, size_t size
)
101 if (size
>= IFLISTSZ
)
104 if (copy_from_user(aoe_iflist
, user_str
, size
)) {
105 printk(KERN_INFO
"aoe: copy from user failed\n");
108 aoe_iflist
[size
] = 0x00;
113 aoenet_xmit(struct sk_buff_head
*queue
)
115 struct sk_buff
*skb
, *tmp
;
118 skb_queue_walk_safe(queue
, skb
, tmp
) {
119 __skb_unlink(skb
, queue
);
120 spin_lock_irqsave(&txlock
, flags
);
121 skb_queue_tail(&skbtxq
, skb
);
122 spin_unlock_irqrestore(&txlock
, flags
);
128 * (1) len doesn't include the header by default. I want this.
131 aoenet_rcv(struct sk_buff
*skb
, struct net_device
*ifp
, struct packet_type
*pt
, struct net_device
*orig_dev
)
134 struct aoe_atahdr
*ah
;
138 if (dev_net(ifp
) != &init_net
)
141 skb
= skb_share_check(skb
, GFP_ATOMIC
);
144 if (!is_aoe_netif(ifp
))
146 skb_push(skb
, ETH_HLEN
); /* (1) */
147 sn
= sizeof(*h
) + sizeof(*ah
);
148 if (skb
->len
>= sn
) {
149 sn
-= skb_headlen(skb
);
150 if (sn
> 0 && !__pskb_pull_tail(skb
, sn
))
153 h
= (struct aoe_hdr
*) skb
->data
;
154 n
= get_unaligned_be32(&h
->tag
);
155 if ((h
->verfl
& AOEFL_RSP
) == 0 || (n
& 1<<31))
158 if (h
->verfl
& AOEFL_ERR
) {
164 "%s%d.%d@%s; ecode=%d '%s'\n",
165 "aoe: error packet from ",
166 get_unaligned_be16(&h
->major
),
167 h
->minor
, skb
->dev
->name
,
168 h
->err
, aoe_errlist
[n
]);
174 /* ata_rsp may keep skb for later processing or give it back */
175 skb
= aoecmd_ata_rsp(skb
);
181 if (h
->cmd
>= AOECMD_VEND_MIN
)
182 break; /* don't complain about vendor commands */
183 pr_info("aoe: unknown AoE command type 0x%02x\n", h
->cmd
);
194 static struct packet_type aoe_pt __read_mostly
= {
195 .type
= __constant_htons(ETH_P_AOE
),
202 skb_queue_head_init(&skbtxq
);
203 init_waitqueue_head(&txwq
);
204 spin_lock_init(&txlock
);
209 snprintf(kts
.name
, sizeof(kts
.name
), "aoe_tx%d", kts
.id
);
210 if (aoe_ktstart(&kts
))
212 dev_add_pack(&aoe_pt
);
220 skb_queue_purge(&skbtxq
);
221 dev_remove_pack(&aoe_pt
);