Merge branch 'x86-platform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[firefly-linux-kernel-4.4.55.git] / net / caif / chnl_net.c
index 865690948bbc7da373cbb12a3abd6c787cb1b7cb..20618dd3088b79e0f1528436c7b1c9359f9c9cd6 100644 (file)
@@ -28,6 +28,7 @@
 /* 5 sec. connect timeout */
 #define CONNECT_TIMEOUT (5 * HZ)
 #define CAIF_NET_DEFAULT_QUEUE_LEN 500
+#define UNDEF_CONNID 0xffffffff
 
 /*This list is protected by the rtnl lock. */
 static LIST_HEAD(chnl_net_list);
@@ -72,14 +73,12 @@ static void robust_list_del(struct list_head *delete_node)
 static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
 {
        struct sk_buff *skb;
-       struct chnl_net *priv  = container_of(layr, struct chnl_net, chnl);
+       struct chnl_net *priv;
        int pktlen;
-       int err = 0;
        const u8 *ip_version;
        u8 buf;
 
        priv = container_of(layr, struct chnl_net, chnl);
-
        if (!priv)
                return -EINVAL;
 
@@ -95,8 +94,7 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
 
        /* check the version of IP */
        ip_version = skb_header_pointer(skb, 0, 1, &buf);
-       if (!ip_version)
-               return -EINVAL;
+
        switch (*ip_version >> 4) {
        case 4:
                skb->protocol = htons(ETH_P_IP);
@@ -105,6 +103,7 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
                skb->protocol = htons(ETH_P_IPV6);
                break;
        default:
+               priv->netdev->stats.rx_errors++;
                return -EINVAL;
        }
 
@@ -123,7 +122,7 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
        priv->netdev->stats.rx_packets++;
        priv->netdev->stats.rx_bytes += pktlen;
 
-       return err;
+       return 0;
 }
 
 static int delete_device(struct chnl_net *dev)
@@ -221,11 +220,13 @@ static int chnl_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
        if (skb->len > priv->netdev->mtu) {
                pr_warn("Size of skb exceeded MTU\n");
+               dev->stats.tx_errors++;
                return -ENOSPC;
        }
 
        if (!priv->flowenabled) {
                pr_debug("dropping packets flow off\n");
+               dev->stats.tx_dropped++;
                return NETDEV_TX_BUSY;
        }
 
@@ -240,8 +241,7 @@ static int chnl_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
        /* Send the packet down the stack. */
        result = priv->chnl.dn->transmit(priv->chnl.dn, pkt);
        if (result) {
-               if (result == -EAGAIN)
-                       result = NETDEV_TX_BUSY;
+               dev->stats.tx_dropped++;
                return result;
        }
 
@@ -409,7 +409,7 @@ static void ipcaif_net_setup(struct net_device *dev)
        priv->conn_req.link_selector = CAIF_LINK_HIGH_BANDW;
        priv->conn_req.priority = CAIF_PRIO_LOW;
        /* Insert illegal value */
-       priv->conn_req.sockaddr.u.dgm.connection_id = 0;
+       priv->conn_req.sockaddr.u.dgm.connection_id = UNDEF_CONNID;
        priv->flowenabled = false;
 
        init_waitqueue_head(&priv->netmgmt_wq);
@@ -472,9 +472,11 @@ static int ipcaif_newlink(struct net *src_net, struct net_device *dev,
        else
                list_add(&caifdev->list_field, &chnl_net_list);
 
-       /* Take ifindex as connection-id if null */
-       if (caifdev->conn_req.sockaddr.u.dgm.connection_id == 0)
+       /* Use ifindex as connection id, and use loopback channel default. */
+       if (caifdev->conn_req.sockaddr.u.dgm.connection_id == UNDEF_CONNID) {
                caifdev->conn_req.sockaddr.u.dgm.connection_id = dev->ifindex;
+               caifdev->conn_req.protocol = CAIFPROTO_DATAGRAM_LOOP;
+       }
        return ret;
 }