10 #include <linux/kernel.h>
13 #include <linux/netdevice.h>
15 #include <linux/rtnetlink.h>
16 #include <linux/llc.h>
17 #include <linux/slab.h>
18 #include <linux/module.h>
22 #include <asm/unaligned.h>
29 static const struct garp_state_trans {
143 if (attr->
type != type)
145 if (attr->
dlen != len)
146 return attr->
dlen - len;
151 const void *data,
u8 len,
u8 type)
159 d = garp_attr_cmp(attr, data, len, type);
171 const void *data,
u8 len,
u8 type)
180 d = garp_attr_cmp(attr, data, len, type);
198 rb_link_node(&attr->
node, parent, p);
214 #define LLC_RESERVE sizeof(struct llc_pdu_un)
224 gp = (
struct garp_pdu_hdr *)__skb_put(skb,
sizeof(*gp));
233 if (skb_tailroom(app->
pdu) <
sizeof(
u8))
244 garp_pdu_append_end_mark(app);
245 garp_pdu_append_end_mark(app);
249 llc_pdu_init_as_ui_cmd(app->
pdu);
251 app->
app->proto.group_address);
269 if (skb_tailroom(app->
pdu) <
sizeof(*gm))
286 err = garp_pdu_init(app);
291 if (garp_cb(app->
pdu)->cur_type != attr->
type) {
292 if (garp_cb(app->
pdu)->cur_type &&
293 garp_pdu_append_end_mark(app) < 0)
295 if (garp_pdu_append_msg(app, attr->
type) < 0)
299 len =
sizeof(*ga) + attr->
dlen;
300 if (skb_tailroom(app->
pdu) < len)
318 state = garp_applicant_state_table[attr->
state][
event].state;
322 switch (garp_applicant_state_table[attr->
state][event].action) {
335 garp_attr_destroy(app, attr);
346 const void *data,
u8 len,
u8 type)
352 spin_lock_bh(&app->
lock);
353 attr = garp_attr_create(app, data, len, type);
355 spin_unlock_bh(&app->
lock);
359 spin_unlock_bh(&app->
lock);
366 const void *data,
u8 len,
u8 type)
372 spin_lock_bh(&app->
lock);
373 attr = garp_attr_lookup(app, data, len, type);
375 spin_unlock_bh(&app->
lock);
379 spin_unlock_bh(&app->
lock);
404 static void garp_join_timer(
unsigned long data)
408 spin_lock(&app->
lock);
411 spin_unlock(&app->
lock);
413 garp_queue_xmit(app);
414 garp_join_timer_arm(app);
417 static int garp_pdu_parse_end_mark(
struct sk_buff *skb)
419 if (!pskb_may_pull(skb,
sizeof(
u8)))
436 if (!pskb_may_pull(skb,
sizeof(*ga)))
439 if (ga->
len <
sizeof(*ga))
442 if (!pskb_may_pull(skb, ga->
len))
445 dlen =
sizeof(*ga) - ga->
len;
447 if (attrtype > app->
app->maxattr)
474 attr = garp_attr_lookup(app, ga->
data, dlen, attrtype);
485 if (!pskb_may_pull(skb,
sizeof(*gm)))
492 while (skb->
len > 0) {
493 if (garp_pdu_parse_attr(app, skb, gm->
attrtype) < 0)
495 if (garp_pdu_parse_end_mark(skb) < 0)
516 if (!pskb_may_pull(skb,
sizeof(*gp)))
523 spin_lock(&app->
lock);
524 while (skb->
len > 0) {
525 if (garp_pdu_parse_msg(app, skb) < 0)
527 if (garp_pdu_parse_end_mark(skb) < 0)
530 spin_unlock(&app->
lock);
535 static int garp_init_port(
struct net_device *dev)
546 static void garp_release_port(
struct net_device *dev)
567 err = garp_init_port(dev);
585 skb_queue_head_init(&app->
queue);
588 garp_join_timer_arm(app);
594 garp_release_port(dev);
614 garp_queue_xmit(app);
618 garp_release_port(dev);
624 appl->
proto.rcv = garp_pdu_rcv;
625 appl->
proto.data = appl;