Lines Matching refs:gwj
397 struct cgw_job *gwj = (struct cgw_job *)data; in can_can_gw_rcv() local
403 if (gwj->flags & CGW_FLAGS_CAN_FD) { in can_can_gw_rcv()
428 gwj->deleted_frames++; in can_can_gw_rcv()
432 if (!(gwj->dst.dev->flags & IFF_UP)) { in can_can_gw_rcv()
433 gwj->dropped_frames++; in can_can_gw_rcv()
438 if (!(gwj->flags & CGW_FLAGS_CAN_IIF_TX_OK) && in can_can_gw_rcv()
439 can_skb_prv(skb)->ifindex == gwj->dst.dev->ifindex) in can_can_gw_rcv()
447 if (gwj->mod.modfunc[0]) in can_can_gw_rcv()
453 gwj->dropped_frames++; in can_can_gw_rcv()
461 if (gwj->limit_hops && cgw_hops(nskb) == 1) in can_can_gw_rcv()
462 cgw_hops(nskb) = max_hops - gwj->limit_hops + 1; in can_can_gw_rcv()
464 nskb->dev = gwj->dst.dev; in can_can_gw_rcv()
470 while (modidx < MAX_MODFUNCTIONS && gwj->mod.modfunc[modidx]) in can_can_gw_rcv()
471 (*gwj->mod.modfunc[modidx++])(cf, &gwj->mod); in can_can_gw_rcv()
481 gwj->deleted_frames++; in can_can_gw_rcv()
487 if (gwj->mod.csumfunc.crc8) in can_can_gw_rcv()
488 (*gwj->mod.csumfunc.crc8)(cf, &gwj->mod.csum.crc8); in can_can_gw_rcv()
490 if (gwj->mod.csumfunc.xor) in can_can_gw_rcv()
491 (*gwj->mod.csumfunc.xor)(cf, &gwj->mod.csum.xor); in can_can_gw_rcv()
495 if (!(gwj->flags & CGW_FLAGS_CAN_SRC_TSTAMP)) in can_can_gw_rcv()
499 if (can_send(nskb, gwj->flags & CGW_FLAGS_CAN_ECHO)) in can_can_gw_rcv()
500 gwj->dropped_frames++; in can_can_gw_rcv()
502 gwj->handled_frames++; in can_can_gw_rcv()
505 static inline int cgw_register_filter(struct net *net, struct cgw_job *gwj) in cgw_register_filter() argument
507 return can_rx_register(net, gwj->src.dev, gwj->ccgw.filter.can_id, in cgw_register_filter()
508 gwj->ccgw.filter.can_mask, can_can_gw_rcv, in cgw_register_filter()
509 gwj, "gw", NULL); in cgw_register_filter()
512 static inline void cgw_unregister_filter(struct net *net, struct cgw_job *gwj) in cgw_unregister_filter() argument
514 can_rx_unregister(net, gwj->src.dev, gwj->ccgw.filter.can_id, in cgw_unregister_filter()
515 gwj->ccgw.filter.can_mask, can_can_gw_rcv, gwj); in cgw_unregister_filter()
528 struct cgw_job *gwj = NULL; in cgw_notifier() local
533 hlist_for_each_entry_safe(gwj, nx, &net->can.cgw_list, list) { in cgw_notifier()
534 if (gwj->src.dev == dev || gwj->dst.dev == dev) { in cgw_notifier()
535 hlist_del(&gwj->list); in cgw_notifier()
536 cgw_unregister_filter(net, gwj); in cgw_notifier()
538 kmem_cache_free(cgw_cache, gwj); in cgw_notifier()
546 static int cgw_put_job(struct sk_buff *skb, struct cgw_job *gwj, int type, in cgw_put_job() argument
558 rtcan->gwtype = gwj->gwtype; in cgw_put_job()
559 rtcan->flags = gwj->flags; in cgw_put_job()
563 if (gwj->handled_frames) { in cgw_put_job()
564 if (nla_put_u32(skb, CGW_HANDLED, gwj->handled_frames) < 0) in cgw_put_job()
568 if (gwj->dropped_frames) { in cgw_put_job()
569 if (nla_put_u32(skb, CGW_DROPPED, gwj->dropped_frames) < 0) in cgw_put_job()
573 if (gwj->deleted_frames) { in cgw_put_job()
574 if (nla_put_u32(skb, CGW_DELETED, gwj->deleted_frames) < 0) in cgw_put_job()
580 if (gwj->limit_hops) { in cgw_put_job()
581 if (nla_put_u8(skb, CGW_LIM_HOPS, gwj->limit_hops) < 0) in cgw_put_job()
585 if (gwj->flags & CGW_FLAGS_CAN_FD) { in cgw_put_job()
588 if (gwj->mod.modtype.and) { in cgw_put_job()
589 memcpy(&mb.cf, &gwj->mod.modframe.and, sizeof(mb.cf)); in cgw_put_job()
590 mb.modtype = gwj->mod.modtype.and; in cgw_put_job()
595 if (gwj->mod.modtype.or) { in cgw_put_job()
596 memcpy(&mb.cf, &gwj->mod.modframe.or, sizeof(mb.cf)); in cgw_put_job()
597 mb.modtype = gwj->mod.modtype.or; in cgw_put_job()
602 if (gwj->mod.modtype.xor) { in cgw_put_job()
603 memcpy(&mb.cf, &gwj->mod.modframe.xor, sizeof(mb.cf)); in cgw_put_job()
604 mb.modtype = gwj->mod.modtype.xor; in cgw_put_job()
609 if (gwj->mod.modtype.set) { in cgw_put_job()
610 memcpy(&mb.cf, &gwj->mod.modframe.set, sizeof(mb.cf)); in cgw_put_job()
611 mb.modtype = gwj->mod.modtype.set; in cgw_put_job()
618 if (gwj->mod.modtype.and) { in cgw_put_job()
619 memcpy(&mb.cf, &gwj->mod.modframe.and, sizeof(mb.cf)); in cgw_put_job()
620 mb.modtype = gwj->mod.modtype.and; in cgw_put_job()
625 if (gwj->mod.modtype.or) { in cgw_put_job()
626 memcpy(&mb.cf, &gwj->mod.modframe.or, sizeof(mb.cf)); in cgw_put_job()
627 mb.modtype = gwj->mod.modtype.or; in cgw_put_job()
632 if (gwj->mod.modtype.xor) { in cgw_put_job()
633 memcpy(&mb.cf, &gwj->mod.modframe.xor, sizeof(mb.cf)); in cgw_put_job()
634 mb.modtype = gwj->mod.modtype.xor; in cgw_put_job()
639 if (gwj->mod.modtype.set) { in cgw_put_job()
640 memcpy(&mb.cf, &gwj->mod.modframe.set, sizeof(mb.cf)); in cgw_put_job()
641 mb.modtype = gwj->mod.modtype.set; in cgw_put_job()
647 if (gwj->mod.uid) { in cgw_put_job()
648 if (nla_put_u32(skb, CGW_MOD_UID, gwj->mod.uid) < 0) in cgw_put_job()
652 if (gwj->mod.csumfunc.crc8) { in cgw_put_job()
654 &gwj->mod.csum.crc8) < 0) in cgw_put_job()
658 if (gwj->mod.csumfunc.xor) { in cgw_put_job()
660 &gwj->mod.csum.xor) < 0) in cgw_put_job()
664 if (gwj->gwtype == CGW_TYPE_CAN_CAN) { in cgw_put_job()
665 if (gwj->ccgw.filter.can_id || gwj->ccgw.filter.can_mask) { in cgw_put_job()
667 &gwj->ccgw.filter) < 0) in cgw_put_job()
671 if (nla_put_u32(skb, CGW_SRC_IF, gwj->ccgw.src_idx) < 0) in cgw_put_job()
674 if (nla_put_u32(skb, CGW_DST_IF, gwj->ccgw.dst_idx) < 0) in cgw_put_job()
690 struct cgw_job *gwj = NULL; in cgw_dump_jobs() local
695 hlist_for_each_entry_rcu(gwj, &net->can.cgw_list, list) { in cgw_dump_jobs()
699 if (cgw_put_job(skb, gwj, RTM_NEWROUTE, in cgw_dump_jobs()
993 struct cgw_job *gwj; in cgw_create_job() local
1021 hlist_for_each_entry(gwj, &net->can.cgw_list, list) { in cgw_create_job()
1022 if (gwj->mod.uid != mod.uid) in cgw_create_job()
1026 if (memcmp(&gwj->ccgw, &ccgw, sizeof(ccgw))) in cgw_create_job()
1031 memcpy(&gwj->mod, &mod, sizeof(mod)); in cgw_create_job()
1041 gwj = kmem_cache_alloc(cgw_cache, GFP_KERNEL); in cgw_create_job()
1042 if (!gwj) in cgw_create_job()
1045 gwj->handled_frames = 0; in cgw_create_job()
1046 gwj->dropped_frames = 0; in cgw_create_job()
1047 gwj->deleted_frames = 0; in cgw_create_job()
1048 gwj->flags = r->flags; in cgw_create_job()
1049 gwj->gwtype = r->gwtype; in cgw_create_job()
1050 gwj->limit_hops = limhops; in cgw_create_job()
1053 memcpy(&gwj->mod, &mod, sizeof(mod)); in cgw_create_job()
1054 memcpy(&gwj->ccgw, &ccgw, sizeof(ccgw)); in cgw_create_job()
1058 gwj->src.dev = __dev_get_by_index(net, gwj->ccgw.src_idx); in cgw_create_job()
1060 if (!gwj->src.dev) in cgw_create_job()
1063 if (gwj->src.dev->type != ARPHRD_CAN) in cgw_create_job()
1066 gwj->dst.dev = __dev_get_by_index(net, gwj->ccgw.dst_idx); in cgw_create_job()
1068 if (!gwj->dst.dev) in cgw_create_job()
1071 if (gwj->dst.dev->type != ARPHRD_CAN) in cgw_create_job()
1076 err = cgw_register_filter(net, gwj); in cgw_create_job()
1078 hlist_add_head_rcu(&gwj->list, &net->can.cgw_list); in cgw_create_job()
1081 kmem_cache_free(cgw_cache, gwj); in cgw_create_job()
1088 struct cgw_job *gwj = NULL; in cgw_remove_all_jobs() local
1093 hlist_for_each_entry_safe(gwj, nx, &net->can.cgw_list, list) { in cgw_remove_all_jobs()
1094 hlist_del(&gwj->list); in cgw_remove_all_jobs()
1095 cgw_unregister_filter(net, gwj); in cgw_remove_all_jobs()
1097 kmem_cache_free(cgw_cache, gwj); in cgw_remove_all_jobs()
1105 struct cgw_job *gwj = NULL; in cgw_remove_job() local
1142 hlist_for_each_entry_safe(gwj, nx, &net->can.cgw_list, list) { in cgw_remove_job()
1143 if (gwj->flags != r->flags) in cgw_remove_job()
1146 if (gwj->limit_hops != limhops) in cgw_remove_job()
1150 if (gwj->mod.uid || mod.uid) { in cgw_remove_job()
1151 if (gwj->mod.uid != mod.uid) in cgw_remove_job()
1155 if (memcmp(&gwj->mod, &mod, sizeof(mod))) in cgw_remove_job()
1160 if (memcmp(&gwj->ccgw, &ccgw, sizeof(ccgw))) in cgw_remove_job()
1163 hlist_del(&gwj->list); in cgw_remove_job()
1164 cgw_unregister_filter(net, gwj); in cgw_remove_job()
1166 kmem_cache_free(cgw_cache, gwj); in cgw_remove_job()