caif: set traffic class for caif packets
[linux-3.10.git] / net / caif / caif_socket.c
index 5016fa5..ce47ee9 100644 (file)
@@ -19,7 +19,7 @@
 #include <linux/uaccess.h>
 #include <linux/debugfs.h>
 #include <linux/caif/caif_socket.h>
-#include <linux/atomic.h>
+#include <linux/pkt_sched.h>
 #include <net/sock.h>
 #include <net/tcp_states.h>
 #include <net/caif/caif_layer.h>
@@ -505,6 +505,7 @@ static int transmit_skb(struct sk_buff *skb, struct caifsock *cf_sk,
 
        pkt = cfpkt_fromnative(CAIF_DIR_OUT, skb);
        memset(skb->cb, 0, sizeof(struct caif_payload_info));
+       cfpkt_set_prio(pkt, cf_sk->sk.sk_priority);
 
        if (cf_sk->layer.dn == NULL) {
                kfree_skb(skb);
@@ -1062,6 +1063,18 @@ static int caif_create(struct net *net, struct socket *sock, int protocol,
        /* Store the protocol */
        sk->sk_protocol = (unsigned char) protocol;
 
+       /* Initialize default priority for well-known cases */
+       switch (protocol) {
+       case CAIFPROTO_AT:
+               sk->sk_priority = TC_PRIO_CONTROL;
+               break;
+       case CAIFPROTO_RFM:
+               sk->sk_priority = TC_PRIO_INTERACTIVE_BULK;
+               break;
+       default:
+               sk->sk_priority = TC_PRIO_BESTEFFORT;
+       }
+
        /*
         * Lock in order to try to stop someone from opening the socket
         * too early.
@@ -1081,7 +1094,6 @@ static int caif_create(struct net *net, struct socket *sock, int protocol,
        set_rx_flow_on(cf_sk);
 
        /* Set default options on configuration */
-       cf_sk->sk.sk_priority = CAIF_PRIO_NORMAL;
        cf_sk->conn_req.link_selector = CAIF_LINK_LOW_LATENCY;
        cf_sk->conn_req.protocol = protocol;
        release_sock(&cf_sk->sk);