Lines Matching refs:gwj
352 struct cgw_job *gwj = (struct cgw_job *)data; in can_can_gw_rcv() local
375 gwj->deleted_frames++; in can_can_gw_rcv()
379 if (!(gwj->dst.dev->flags & IFF_UP)) { in can_can_gw_rcv()
380 gwj->dropped_frames++; in can_can_gw_rcv()
385 if (!(gwj->flags & CGW_FLAGS_CAN_IIF_TX_OK) && in can_can_gw_rcv()
386 can_skb_prv(skb)->ifindex == gwj->dst.dev->ifindex) in can_can_gw_rcv()
395 if (gwj->mod.modfunc[0]) in can_can_gw_rcv()
401 gwj->dropped_frames++; in can_can_gw_rcv()
409 if (gwj->limit_hops && cgw_hops(nskb) == 1) in can_can_gw_rcv()
410 cgw_hops(nskb) = max_hops - gwj->limit_hops + 1; in can_can_gw_rcv()
412 nskb->dev = gwj->dst.dev; in can_can_gw_rcv()
418 while (modidx < MAX_MODFUNCTIONS && gwj->mod.modfunc[modidx]) in can_can_gw_rcv()
419 (*gwj->mod.modfunc[modidx++])(cf, &gwj->mod); in can_can_gw_rcv()
423 if (gwj->mod.csumfunc.crc8) in can_can_gw_rcv()
424 (*gwj->mod.csumfunc.crc8)(cf, &gwj->mod.csum.crc8); in can_can_gw_rcv()
426 if (gwj->mod.csumfunc.xor) in can_can_gw_rcv()
427 (*gwj->mod.csumfunc.xor)(cf, &gwj->mod.csum.xor); in can_can_gw_rcv()
431 if (!(gwj->flags & CGW_FLAGS_CAN_SRC_TSTAMP)) in can_can_gw_rcv()
435 if (can_send(nskb, gwj->flags & CGW_FLAGS_CAN_ECHO)) in can_can_gw_rcv()
436 gwj->dropped_frames++; in can_can_gw_rcv()
438 gwj->handled_frames++; in can_can_gw_rcv()
441 static inline int cgw_register_filter(struct cgw_job *gwj) in cgw_register_filter() argument
443 return can_rx_register(gwj->src.dev, gwj->ccgw.filter.can_id, in cgw_register_filter()
444 gwj->ccgw.filter.can_mask, can_can_gw_rcv, in cgw_register_filter()
445 gwj, "gw"); in cgw_register_filter()
448 static inline void cgw_unregister_filter(struct cgw_job *gwj) in cgw_unregister_filter() argument
450 can_rx_unregister(gwj->src.dev, gwj->ccgw.filter.can_id, in cgw_unregister_filter()
451 gwj->ccgw.filter.can_mask, can_can_gw_rcv, gwj); in cgw_unregister_filter()
466 struct cgw_job *gwj = NULL; in cgw_notifier() local
471 hlist_for_each_entry_safe(gwj, nx, &cgw_list, list) { in cgw_notifier()
473 if (gwj->src.dev == dev || gwj->dst.dev == dev) { in cgw_notifier()
474 hlist_del(&gwj->list); in cgw_notifier()
475 cgw_unregister_filter(gwj); in cgw_notifier()
476 kmem_cache_free(cgw_cache, gwj); in cgw_notifier()
484 static int cgw_put_job(struct sk_buff *skb, struct cgw_job *gwj, int type, in cgw_put_job() argument
497 rtcan->gwtype = gwj->gwtype; in cgw_put_job()
498 rtcan->flags = gwj->flags; in cgw_put_job()
502 if (gwj->handled_frames) { in cgw_put_job()
503 if (nla_put_u32(skb, CGW_HANDLED, gwj->handled_frames) < 0) in cgw_put_job()
507 if (gwj->dropped_frames) { in cgw_put_job()
508 if (nla_put_u32(skb, CGW_DROPPED, gwj->dropped_frames) < 0) in cgw_put_job()
512 if (gwj->deleted_frames) { in cgw_put_job()
513 if (nla_put_u32(skb, CGW_DELETED, gwj->deleted_frames) < 0) in cgw_put_job()
519 if (gwj->limit_hops) { in cgw_put_job()
520 if (nla_put_u8(skb, CGW_LIM_HOPS, gwj->limit_hops) < 0) in cgw_put_job()
524 if (gwj->mod.modtype.and) { in cgw_put_job()
525 memcpy(&mb.cf, &gwj->mod.modframe.and, sizeof(mb.cf)); in cgw_put_job()
526 mb.modtype = gwj->mod.modtype.and; in cgw_put_job()
531 if (gwj->mod.modtype.or) { in cgw_put_job()
532 memcpy(&mb.cf, &gwj->mod.modframe.or, sizeof(mb.cf)); in cgw_put_job()
533 mb.modtype = gwj->mod.modtype.or; in cgw_put_job()
538 if (gwj->mod.modtype.xor) { in cgw_put_job()
539 memcpy(&mb.cf, &gwj->mod.modframe.xor, sizeof(mb.cf)); in cgw_put_job()
540 mb.modtype = gwj->mod.modtype.xor; in cgw_put_job()
545 if (gwj->mod.modtype.set) { in cgw_put_job()
546 memcpy(&mb.cf, &gwj->mod.modframe.set, sizeof(mb.cf)); in cgw_put_job()
547 mb.modtype = gwj->mod.modtype.set; in cgw_put_job()
552 if (gwj->mod.uid) { in cgw_put_job()
553 if (nla_put_u32(skb, CGW_MOD_UID, gwj->mod.uid) < 0) in cgw_put_job()
557 if (gwj->mod.csumfunc.crc8) { in cgw_put_job()
559 &gwj->mod.csum.crc8) < 0) in cgw_put_job()
563 if (gwj->mod.csumfunc.xor) { in cgw_put_job()
565 &gwj->mod.csum.xor) < 0) in cgw_put_job()
569 if (gwj->gwtype == CGW_TYPE_CAN_CAN) { in cgw_put_job()
571 if (gwj->ccgw.filter.can_id || gwj->ccgw.filter.can_mask) { in cgw_put_job()
573 &gwj->ccgw.filter) < 0) in cgw_put_job()
577 if (nla_put_u32(skb, CGW_SRC_IF, gwj->ccgw.src_idx) < 0) in cgw_put_job()
580 if (nla_put_u32(skb, CGW_DST_IF, gwj->ccgw.dst_idx) < 0) in cgw_put_job()
595 struct cgw_job *gwj = NULL; in cgw_dump_jobs() local
600 hlist_for_each_entry_rcu(gwj, &cgw_list, list) { in cgw_dump_jobs()
604 if (cgw_put_job(skb, gwj, RTM_NEWROUTE, NETLINK_CB(cb->skb).portid, in cgw_dump_jobs()
815 struct cgw_job *gwj; in cgw_create_job() local
844 hlist_for_each_entry(gwj, &cgw_list, list) { in cgw_create_job()
846 if (gwj->mod.uid != mod.uid) in cgw_create_job()
850 if (memcmp(&gwj->ccgw, &ccgw, sizeof(ccgw))) in cgw_create_job()
855 memcpy(&gwj->mod, &mod, sizeof(mod)); in cgw_create_job()
865 gwj = kmem_cache_alloc(cgw_cache, GFP_KERNEL); in cgw_create_job()
866 if (!gwj) in cgw_create_job()
869 gwj->handled_frames = 0; in cgw_create_job()
870 gwj->dropped_frames = 0; in cgw_create_job()
871 gwj->deleted_frames = 0; in cgw_create_job()
872 gwj->flags = r->flags; in cgw_create_job()
873 gwj->gwtype = r->gwtype; in cgw_create_job()
874 gwj->limit_hops = limhops; in cgw_create_job()
877 memcpy(&gwj->mod, &mod, sizeof(mod)); in cgw_create_job()
878 memcpy(&gwj->ccgw, &ccgw, sizeof(ccgw)); in cgw_create_job()
882 gwj->src.dev = __dev_get_by_index(&init_net, gwj->ccgw.src_idx); in cgw_create_job()
884 if (!gwj->src.dev) in cgw_create_job()
887 if (gwj->src.dev->type != ARPHRD_CAN) in cgw_create_job()
890 gwj->dst.dev = __dev_get_by_index(&init_net, gwj->ccgw.dst_idx); in cgw_create_job()
892 if (!gwj->dst.dev) in cgw_create_job()
895 if (gwj->dst.dev->type != ARPHRD_CAN) in cgw_create_job()
900 err = cgw_register_filter(gwj); in cgw_create_job()
902 hlist_add_head_rcu(&gwj->list, &cgw_list); in cgw_create_job()
905 kmem_cache_free(cgw_cache, gwj); in cgw_create_job()
912 struct cgw_job *gwj = NULL; in cgw_remove_all_jobs() local
917 hlist_for_each_entry_safe(gwj, nx, &cgw_list, list) { in cgw_remove_all_jobs()
918 hlist_del(&gwj->list); in cgw_remove_all_jobs()
919 cgw_unregister_filter(gwj); in cgw_remove_all_jobs()
920 kmem_cache_free(cgw_cache, gwj); in cgw_remove_all_jobs()
926 struct cgw_job *gwj = NULL; in cgw_remove_job() local
963 hlist_for_each_entry_safe(gwj, nx, &cgw_list, list) { in cgw_remove_job()
965 if (gwj->flags != r->flags) in cgw_remove_job()
968 if (gwj->limit_hops != limhops) in cgw_remove_job()
972 if (gwj->mod.uid || mod.uid) { in cgw_remove_job()
973 if (gwj->mod.uid != mod.uid) in cgw_remove_job()
977 if (memcmp(&gwj->mod, &mod, sizeof(mod))) in cgw_remove_job()
982 if (memcmp(&gwj->ccgw, &ccgw, sizeof(ccgw))) in cgw_remove_job()
985 hlist_del(&gwj->list); in cgw_remove_job()
986 cgw_unregister_filter(gwj); in cgw_remove_job()
987 kmem_cache_free(cgw_cache, gwj); in cgw_remove_job()