On Wed, Feb 09, 2011 at 08:25:50PM +0100, Oliver Hartkopp wrote:
> 
> >  net/can/j1939/j1939-ac.c      |  554 ++++++++++++++++
> >  net/can/j1939/j1939-bus.c     |  600 +++++++++++++++++
> >  net/can/j1939/j1939-filter.c  |  230 +++++++
> >  net/can/j1939/j1939-loop.c    |   74 ++
> >  net/can/j1939/j1939-priv.h    |  298 +++++++++
> >  net/can/j1939/j1939-proc.c    |  102 +++
> >  net/can/j1939/j1939-promisc.c |   90 +++
> >  net/can/j1939/j1939-rtnl.c    |  316 +++++++++
> >  net/can/j1939/j1939-socket.c  |  927 ++++++++++++++++++++++++++
> >  net/can/j1939/j1939-stack.c   |  183 +++++
> >  net/can/j1939/j1939-tp.c      | 1465 
> > +++++++++++++++++++++++++++++++++++++++++
> 
> s/j1939-//g
> 
> >  net/can/j1939/j1939.c         |  438 ++++++++++++
> 
> net/can/j1939/main.c
> 
ok, I can live with that :-)
> 
> 
> > +
> > +static int j1939sk_bind(struct socket *sock, struct sockaddr *uaddr, int 
> > len)
> > +{
> > +   struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
> > +   struct j1939_sock *jsk = j1939_sk(sock->sk);
> > +   struct j1939_ecu *ecu = NULL;
> > +   int ret;
> > +
> > +   if (len < required_size(can_addr.j1939, *addr))
> > +           return -EINVAL;
> > +   if (addr->can_family != AF_CAN)
> > +           return -EINVAL;
> > +
> > +   /* lock s.lock first, to avoid circular lock dependancy */
> > +   mutex_lock(&s.lock);
> > +   lock_sock(sock->sk);
> > +   if (jsk->state & JSK_BOUND) {
> > +           ret = -EBUSY;
> > +           if (addr->can_ifindex != jsk->sk.sk_bound_dev_if)
> > +                   goto fail_locked;
> > +           /*
> > +            * do not allow to change addres after first bind(),
> > +            * (it would require updating the j1939_ecu list)
> > +            * but allow the change SA when using dynaddr,
> > +            * and allow to change PGN
> > +            */
> > +           if (!jsk->addr.src ||
> > +                   (jsk->addr.src != addr->can_addr.j1939.name) ||
> > +                   (jsk->addr.pgn != addr->can_addr.j1939.pgn))
> > +                   goto fail_locked;
> > +           /* set to be able to send address claims */
> > +           jsk->addr.sa = addr->can_addr.j1939.addr;
> > +           /* since this socket is bound already, we can skip a lot */
> > +           release_sock(sock->sk);
> > +           return 0;
> > +   }
> 
> mutex_unlock??
thanks!!!
> 
> > +/* lowest layer */
> > +static void j1939_can_recv(struct sk_buff *skb, void *data)
> > +{
> > +   int orig_len;
> > +   struct j1939_sk_buff_cb *sk_addr;
> > +   struct can_frame *can;
> 
> please name it 'cf' or 'msg'
ok
> 
> 
> > +
> > +static int j1939_can_send(struct sk_buff *skb)
> > +{
> > +   int ret, dlc;
> > +   canid_t canid;
> > +   struct j1939_sk_buff_cb *sk_addr;
> > +   struct net_device *netdev = NULL;
> > +   struct can_frame *can;
> > +
> > +   dlc = skb->len;
> > +   if (dlc > 8)
> > +           return -EMSGSIZE;
> > +   ret = pskb_expand_head(skb, SKB_DATA_ALIGN(CAN_HDR),
> > +                   CAN_FTR + (8-dlc), GFP_ATOMIC);
> > +   if (ret < 0)
> > +           return ret;
> > +
> > +   can = (void *)skb_push(skb, CAN_HDR);
> > +   BUG_ON(!can);
> > +   /* make it a full can frame */
> > +   skb_put(skb, CAN_FTR + (8 - dlc));
> 
> why (8 - dlc) ???
I strip the skb to contain only [dlc] bytes.
before returning here, I restore the skb to it's original size.

See pskb_expand_head() called earlier.
> 
> 
> > +
> > +   /* fix the 'always free' policy of can_send */
> > +   skb = skb_get(skb);
> > +   ret = can_send(skb, 1);
> > +   if (!ret)
> > +           /* free when can_send succeedded */
> > +           kfree_skb(skb);
> > +failed:
> > +   if (netdev)
> > +           dev_put(netdev);
> > +   return ret;
> 
> Does 'fix' mean: Make use of the return value??
The 'always free' policy means: When can_send() fails,
the skb is still freed. This works contra-intuitive for
functions making use of that.
'fix' does mean: skb_get(skb) is called, and when can_send
succeeds, kfree_skb() is called to eliminate the effect of skb_get().

Good remark.
> 
> 
> > +static inline struct j1939_ecu *find_ecu(int ifindex, name_t name, int sa)
> > +{
> > +   if (name)
> > +           return j1939_ecu_find_by_name(name, ifindex);
> > +   else if (sa < 0xfe)
> > +           return j1939_ecu_find_by_addr(sa, ifindex);
> > +   return 0;
> > +}
> 
> There are many occurrences of 0xfe or something similar byte values.
> 
> Please use #defines for these j1939 values.

indeed. Need to create a macro for that.
> 
> > +static __exit void j1939_module_exit(void)
> > +{
> > +   j1939flt_module_exit();
> > +   j1939lp_module_exit();
> > +   j1939_promisc_module_exit();
> > +   j1939tp_module_exit();
> > +   j1939ac_module_exit();
> > +   j1939sk_module_exit();
> > +   j1939bus_module_exit();
> > +
> > +   j1939_stack_unregister(&j1939_tx_end);
> > +   unregister_netdevice_notifier(&s.notifier);
> > +
> > +   j1939_stack_module_exit();
> > +   j1939_proc_module_exit();
> > +}
> 
> 
> In general all your j1939 implementation adds 5000+ LOC
is that a good or bad?
> 
> Oliver
I appreciate this review.
Kurt
_______________________________________________
Socketcan-core mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/socketcan-core

Reply via email to