X-Git-Url: http://rtime.felk.cvut.cz/gitweb/socketcan-devel.git/blobdiff_plain/3b18de779e60d140c8bec0887c055699a7f2aee2..7242dfaaacd11619e0ab730d9e9601112e97c05a:/kernel/2.6/net/can/gw.c diff --git a/kernel/2.6/net/can/gw.c b/kernel/2.6/net/can/gw.c index f09c75a..0c9f869 100644 --- a/kernel/2.6/net/can/gw.c +++ b/kernel/2.6/net/can/gw.c @@ -143,8 +143,8 @@ struct cgw_job { /* modification functions that are invoked in the hot path in can_can_gw_rcv */ -#define MODFUNC(func, op) static void func (struct can_frame *cf, \ - struct cf_mod *mod) { op ; } +#define MODFUNC(func, op) static void func(struct can_frame *cf, \ + struct cf_mod *mod) { op ; } MODFUNC(mod_and_id, cf->can_id &= mod->modframe.and.can_id) MODFUNC(mod_and_dlc, cf->can_dlc &= mod->modframe.and.can_dlc) @@ -174,10 +174,10 @@ static inline void canframecpy(struct can_frame *dst, struct can_frame *src) static int cgw_chk_csum_parms(s8 fr, s8 to, s8 re) { - /* + /* * absolute dlc values 0 .. 7 => 0 .. 7, e.g. data [0] * relative to received dlc -1 .. -8 : - * e.g. for received dlc = 8 + * e.g. for received dlc = 8 * -1 => index = 7 (data[7]) * -3 => index = 5 (data[5]) * -8 => index = 0 (data[0]) @@ -189,7 +189,7 @@ static int cgw_chk_csum_parms(s8 fr, s8 to, s8 re) return 0; else return -EINVAL; -} +} static inline int calc_idx(int idx, int rx_dlc) { @@ -212,10 +212,10 @@ static void cgw_csum_xor_rel(struct can_frame *cf, struct cgw_csum_xor *xor) if (from <= to) { for (i = from; i <= to; i++) - val ^= cf->data[i]; + val ^= cf->data[i]; } else { for (i = from; i >= to; i--) - val ^= cf->data[i]; + val ^= cf->data[i]; } cf->data[res] = val; @@ -444,7 +444,7 @@ static int cgw_notifier(struct notifier_block *nb, hlist_for_each_entry_safe(gwj, n, nx, &cgw_list, list) { - if (gwj->src.dev == dev || gwj->dst.dev == dev) { + if (gwj->src.dev == dev || gwj->dst.dev == dev) { hlist_del(&gwj->list); cgw_unregister_filter(gwj); kfree(gwj); @@ -595,7 +595,7 @@ cont: } /* check for common and gwtype specific attributes */ -static int cgw_parse_attr(struct nlmsghdr *nlh, struct cf_mod *mod, +static int cgw_parse_attr(struct nlmsghdr *nlh, struct cf_mod *mod, u8 gwtype, void *gwtypeattr) { struct nlattr *tb[CGW_MAX+1]; @@ -604,7 +604,7 @@ static int cgw_parse_attr(struct nlmsghdr *nlh, struct cf_mod *mod, int err = 0; /* initialize modification & checksum data space */ - memset(mod, 0, sizeof(*mod)); + memset(mod, 0, sizeof(*mod)); err = nlmsg_parse(nlh, sizeof(struct rtcanmsg), tb, CGW_MAX, NULL); if (err < 0) @@ -743,7 +743,7 @@ static int cgw_parse_attr(struct nlmsghdr *nlh, struct cf_mod *mod, /* check CGW_TYPE_CAN_CAN specific attributes */ struct can_can_gw *ccgw = (struct can_can_gw *)gwtypeattr; - memset(ccgw, 0, sizeof(*ccgw)); + memset(ccgw, 0, sizeof(*ccgw)); /* check for can_filter in attributes */ if (tb[CGW_FILTER] && @@ -821,10 +821,8 @@ static int cgw_create_job(struct sk_buff *skb, struct nlmsghdr *nlh, if (!gwj->src.dev) goto out; - if (gwj->src.dev->type != ARPHRD_CAN) - goto put_src_out; - - if (gwj->src.dev->header_ops) + /* check for CAN netdev not using header_ops - see gw_rcv() */ + if (gwj->src.dev->type != ARPHRD_CAN || gwj->src.dev->header_ops) goto put_src_out; gwj->dst.dev = dev_get_by_index(&init_net, gwj->ccgw.dst_idx); @@ -832,12 +830,10 @@ static int cgw_create_job(struct sk_buff *skb, struct nlmsghdr *nlh, if (!gwj->dst.dev) goto put_src_out; - if (gwj->dst.dev->type != ARPHRD_CAN) + /* check for CAN netdev not using header_ops - see gw_rcv() */ + if (gwj->dst.dev->type != ARPHRD_CAN || gwj->dst.dev->header_ops) goto put_src_dst_out; - - if (gwj->dst.dev->header_ops) - goto put_src_dst_out; - + ASSERT_RTNL(); err = cgw_register_filter(gwj); @@ -940,15 +936,24 @@ static __init int cgw_module_init(void) notifier.notifier_call = cgw_notifier; register_netdevice_notifier(¬ifier); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + if (__rtnl_register(PF_CAN, RTM_GETROUTE, NULL, cgw_dump_jobs, NULL)) { +#else if (__rtnl_register(PF_CAN, RTM_GETROUTE, NULL, cgw_dump_jobs)) { +#endif unregister_netdevice_notifier(¬ifier); kmem_cache_destroy(cgw_cache); return -ENOBUFS; } /* Only the first call to __rtnl_register can fail */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + __rtnl_register(PF_CAN, RTM_NEWROUTE, cgw_create_job, NULL, NULL); + __rtnl_register(PF_CAN, RTM_DELROUTE, cgw_remove_job, NULL, NULL); +#else __rtnl_register(PF_CAN, RTM_NEWROUTE, cgw_create_job, NULL); __rtnl_register(PF_CAN, RTM_DELROUTE, cgw_remove_job, NULL); +#endif return 0; }