Lines Matching defs:app

148 static struct garp_attr *garp_attr_lookup(const struct garp_applicant *app,
151 struct rb_node *parent = app->gid.rb_node;
168 static struct garp_attr *garp_attr_create(struct garp_applicant *app,
171 struct rb_node *parent = NULL, **p = &app->gid.rb_node;
197 rb_insert_color(&attr->node, &app->gid);
201 static void garp_attr_destroy(struct garp_applicant *app, struct garp_attr *attr)
203 rb_erase(&attr->node, &app->gid);
207 static void garp_attr_destroy_all(struct garp_applicant *app)
212 for (node = rb_first(&app->gid);
216 garp_attr_destroy(app, attr);
220 static int garp_pdu_init(struct garp_applicant *app)
226 skb = alloc_skb(app->dev->mtu + LL_RESERVED_SPACE(app->dev),
231 skb->dev = app->dev;
233 skb_reserve(skb, LL_RESERVED_SPACE(app->dev) + LLC_RESERVE);
238 app->pdu = skb;
242 static int garp_pdu_append_end_mark(struct garp_applicant *app)
244 if (skb_tailroom(app->pdu) < sizeof(u8))
246 __skb_put_u8(app->pdu, GARP_END_MARK);
250 static void garp_pdu_queue(struct garp_applicant *app)
252 if (!app->pdu)
255 garp_pdu_append_end_mark(app);
256 garp_pdu_append_end_mark(app);
258 llc_pdu_header_init(app->pdu, LLC_PDU_TYPE_U, LLC_SAP_BSPAN,
260 llc_pdu_init_as_ui_cmd(app->pdu);
261 llc_mac_hdr_init(app->pdu, app->dev->dev_addr,
262 app->app->proto.group_address);
264 skb_queue_tail(&app->queue, app->pdu);
265 app->pdu = NULL;
268 static void garp_queue_xmit(struct garp_applicant *app)
272 while ((skb = skb_dequeue(&app->queue)))
276 static int garp_pdu_append_msg(struct garp_applicant *app, u8 attrtype)
280 if (skb_tailroom(app->pdu) < sizeof(*gm))
282 gm = __skb_put(app->pdu, sizeof(*gm));
284 garp_cb(app->pdu)->cur_type = attrtype;
288 static int garp_pdu_append_attr(struct garp_applicant *app,
296 if (!app->pdu) {
297 err = garp_pdu_init(app);
302 if (garp_cb(app->pdu)->cur_type != attr->type) {
303 if (garp_cb(app->pdu)->cur_type &&
304 garp_pdu_append_end_mark(app) < 0)
306 if (garp_pdu_append_msg(app, attr->type) < 0)
311 if (skb_tailroom(app->pdu) < len)
313 ga = __skb_put(app->pdu, len);
320 garp_pdu_queue(app);
324 static void garp_attr_event(struct garp_applicant *app,
339 if (garp_pdu_append_attr(app, attr, GARP_JOIN_IN) < 0)
343 garp_pdu_append_attr(app, attr, GARP_LEAVE_EMPTY);
346 garp_attr_destroy(app, attr);
360 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]);
363 spin_lock_bh(&app->lock);
364 attr = garp_attr_create(app, data, len, type);
366 spin_unlock_bh(&app->lock);
369 garp_attr_event(app, attr, GARP_EVENT_REQ_JOIN);
370 spin_unlock_bh(&app->lock);
380 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]);
383 spin_lock_bh(&app->lock);
384 attr = garp_attr_lookup(app, data, len, type);
386 spin_unlock_bh(&app->lock);
389 garp_attr_event(app, attr, GARP_EVENT_REQ_LEAVE);
390 spin_unlock_bh(&app->lock);
394 static void garp_gid_event(struct garp_applicant *app, enum garp_event event)
399 for (node = rb_first(&app->gid);
403 garp_attr_event(app, attr, event);
407 static void garp_join_timer_arm(struct garp_applicant *app)
412 mod_timer(&app->join_timer, jiffies + delay);
417 struct garp_applicant *app = from_timer(app, t, join_timer);
419 spin_lock(&app->lock);
420 garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU);
421 garp_pdu_queue(app);
422 spin_unlock(&app->lock);
424 garp_queue_xmit(app);
425 garp_join_timer_arm(app);
439 static int garp_pdu_parse_attr(struct garp_applicant *app, struct sk_buff *skb,
458 if (attrtype > app->app->maxattr)
465 garp_gid_event(app, GARP_EVENT_R_LEAVE_EMPTY);
485 attr = garp_attr_lookup(app, ga->data, dlen, attrtype);
488 garp_attr_event(app, attr, event);
492 static int garp_pdu_parse_msg(struct garp_applicant *app, struct sk_buff *skb)
504 if (garp_pdu_parse_attr(app, skb, gm->attrtype) < 0)
517 struct garp_applicant *app;
523 app = rcu_dereference(port->applicants[appl->type]);
524 if (!app)
534 spin_lock(&app->lock);
536 if (garp_pdu_parse_msg(app, skb) < 0)
541 spin_unlock(&app->lock);
572 struct garp_applicant *app;
584 app = kzalloc(sizeof(*app), GFP_KERNEL);
585 if (!app)
592 app->dev = dev;
593 app->app = appl;
594 app->gid = RB_ROOT;
595 spin_lock_init(&app->lock);
596 skb_queue_head_init(&app->queue);
597 rcu_assign_pointer(dev->garp_port->applicants[appl->type], app);
598 timer_setup(&app->join_timer, garp_join_timer, 0);
599 garp_join_timer_arm(app);
603 kfree(app);
614 struct garp_applicant *app = rtnl_dereference(port->applicants[appl->type]);
622 timer_shutdown_sync(&app->join_timer);
624 spin_lock_bh(&app->lock);
625 garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU);
626 garp_attr_destroy_all(app);
627 garp_pdu_queue(app);
628 spin_unlock_bh(&app->lock);
630 garp_queue_xmit(app);
633 kfree_rcu(app, rcu);