Commit 44764812 authored by Dmitry Tarnyagin's avatar Dmitry Tarnyagin Committed by David S. Miller

caif: set traffic class for caif packets

Set traffic class for CAIF packets, based on socket
priority, CAIF protocol type, or type of message.

Traffic class mapping for different packet types:
 - control:       TC_PRIO_CONTROL;
 - flow control:  TC_PRIO_CONTROL;
 - at:            TC_PRIO_CONTROL;
 - rfm:           TC_PRIO_INTERACTIVE_BULK;
 - other sockets: equals to socket's TC;
 - network data:  no change.
Signed-off-by: default avatarDmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e65ac4d5
...@@ -188,11 +188,18 @@ struct cfpkt *cfpkt_fromnative(enum caif_direction dir, void *nativepkt); ...@@ -188,11 +188,18 @@ struct cfpkt *cfpkt_fromnative(enum caif_direction dir, void *nativepkt);
*/ */
void *cfpkt_tonative(struct cfpkt *pkt); void *cfpkt_tonative(struct cfpkt *pkt);
/* /*
* Returns packet information for a packet. * Returns packet information for a packet.
* pkt Packet to get info from; * pkt Packet to get info from;
* @return Packet information * @return Packet information
*/ */
struct caif_payload_info *cfpkt_info(struct cfpkt *pkt); struct caif_payload_info *cfpkt_info(struct cfpkt *pkt);
/** cfpkt_set_prio - set priority for a CAIF packet.
*
* @pkt: The CAIF packet to be adjusted.
* @prio: one of TC_PRIO_ constants.
*/
void cfpkt_set_prio(struct cfpkt *pkt, int prio);
#endif /* CFPKT_H_ */ #endif /* CFPKT_H_ */
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/caif/caif_socket.h> #include <linux/caif/caif_socket.h>
#include <linux/atomic.h> #include <linux/pkt_sched.h>
#include <net/sock.h> #include <net/sock.h>
#include <net/tcp_states.h> #include <net/tcp_states.h>
#include <net/caif/caif_layer.h> #include <net/caif/caif_layer.h>
...@@ -505,6 +505,7 @@ static int transmit_skb(struct sk_buff *skb, struct caifsock *cf_sk, ...@@ -505,6 +505,7 @@ static int transmit_skb(struct sk_buff *skb, struct caifsock *cf_sk,
pkt = cfpkt_fromnative(CAIF_DIR_OUT, skb); pkt = cfpkt_fromnative(CAIF_DIR_OUT, skb);
memset(skb->cb, 0, sizeof(struct caif_payload_info)); memset(skb->cb, 0, sizeof(struct caif_payload_info));
cfpkt_set_prio(pkt, cf_sk->sk.sk_priority);
if (cf_sk->layer.dn == NULL) { if (cf_sk->layer.dn == NULL) {
kfree_skb(skb); kfree_skb(skb);
...@@ -1062,6 +1063,18 @@ static int caif_create(struct net *net, struct socket *sock, int protocol, ...@@ -1062,6 +1063,18 @@ static int caif_create(struct net *net, struct socket *sock, int protocol,
/* Store the protocol */ /* Store the protocol */
sk->sk_protocol = (unsigned char) 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 * Lock in order to try to stop someone from opening the socket
* too early. * too early.
...@@ -1081,7 +1094,6 @@ static int caif_create(struct net *net, struct socket *sock, int protocol, ...@@ -1081,7 +1094,6 @@ static int caif_create(struct net *net, struct socket *sock, int protocol,
set_rx_flow_on(cf_sk); set_rx_flow_on(cf_sk);
/* Set default options on configuration */ /* 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.link_selector = CAIF_LINK_LOW_LATENCY;
cf_sk->conn_req.protocol = protocol; cf_sk->conn_req.protocol = protocol;
release_sock(&cf_sk->sk); release_sock(&cf_sk->sk);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/pkt_sched.h>
#include <net/caif/caif_layer.h> #include <net/caif/caif_layer.h>
#include <net/caif/cfpkt.h> #include <net/caif/cfpkt.h>
#include <net/caif/cfctrl.h> #include <net/caif/cfctrl.h>
...@@ -189,6 +190,7 @@ void cfctrl_enum_req(struct cflayer *layer, u8 physlinkid) ...@@ -189,6 +190,7 @@ void cfctrl_enum_req(struct cflayer *layer, u8 physlinkid)
cfctrl->serv.dev_info.id = physlinkid; cfctrl->serv.dev_info.id = physlinkid;
cfpkt_addbdy(pkt, CFCTRL_CMD_ENUM); cfpkt_addbdy(pkt, CFCTRL_CMD_ENUM);
cfpkt_addbdy(pkt, physlinkid); cfpkt_addbdy(pkt, physlinkid);
cfpkt_set_prio(pkt, TC_PRIO_CONTROL);
dn->transmit(dn, pkt); dn->transmit(dn, pkt);
} }
...@@ -281,6 +283,7 @@ int cfctrl_linkup_request(struct cflayer *layer, ...@@ -281,6 +283,7 @@ int cfctrl_linkup_request(struct cflayer *layer,
* might arrive with the newly allocated channel ID. * might arrive with the newly allocated channel ID.
*/ */
cfpkt_info(pkt)->dev_info->id = param->phyid; cfpkt_info(pkt)->dev_info->id = param->phyid;
cfpkt_set_prio(pkt, TC_PRIO_CONTROL);
ret = ret =
dn->transmit(dn, pkt); dn->transmit(dn, pkt);
if (ret < 0) { if (ret < 0) {
...@@ -314,6 +317,7 @@ int cfctrl_linkdown_req(struct cflayer *layer, u8 channelid, ...@@ -314,6 +317,7 @@ int cfctrl_linkdown_req(struct cflayer *layer, u8 channelid,
cfpkt_addbdy(pkt, CFCTRL_CMD_LINK_DESTROY); cfpkt_addbdy(pkt, CFCTRL_CMD_LINK_DESTROY);
cfpkt_addbdy(pkt, channelid); cfpkt_addbdy(pkt, channelid);
init_info(cfpkt_info(pkt), cfctrl); init_info(cfpkt_info(pkt), cfctrl);
cfpkt_set_prio(pkt, TC_PRIO_CONTROL);
ret = ret =
dn->transmit(dn, pkt); dn->transmit(dn, pkt);
#ifndef CAIF_NO_LOOP #ifndef CAIF_NO_LOOP
......
...@@ -381,6 +381,7 @@ struct cfpkt *cfpkt_split(struct cfpkt *pkt, u16 pos) ...@@ -381,6 +381,7 @@ struct cfpkt *cfpkt_split(struct cfpkt *pkt, u16 pos)
memcpy(skb2->data, split, len2nd); memcpy(skb2->data, split, len2nd);
skb2->tail += len2nd; skb2->tail += len2nd;
skb2->len += len2nd; skb2->len += len2nd;
skb2->priority = skb->priority;
return skb_to_pkt(skb2); return skb_to_pkt(skb2);
} }
...@@ -394,3 +395,9 @@ struct caif_payload_info *cfpkt_info(struct cfpkt *pkt) ...@@ -394,3 +395,9 @@ struct caif_payload_info *cfpkt_info(struct cfpkt *pkt)
return (struct caif_payload_info *)&pkt_to_skb(pkt)->cb; return (struct caif_payload_info *)&pkt_to_skb(pkt)->cb;
} }
EXPORT_SYMBOL(cfpkt_info); EXPORT_SYMBOL(cfpkt_info);
void cfpkt_set_prio(struct cfpkt *pkt, int prio)
{
pkt_to_skb(pkt)->priority = prio;
}
EXPORT_SYMBOL(cfpkt_set_prio);
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pkt_sched.h>
#include <net/caif/caif_layer.h> #include <net/caif/caif_layer.h>
#include <net/caif/cfsrvl.h> #include <net/caif/cfsrvl.h>
#include <net/caif/cfpkt.h> #include <net/caif/cfpkt.h>
...@@ -120,6 +121,7 @@ static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl) ...@@ -120,6 +121,7 @@ static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)
info->channel_id = service->layer.id; info->channel_id = service->layer.id;
info->hdr_len = 1; info->hdr_len = 1;
info->dev_info = &service->dev_info; info->dev_info = &service->dev_info;
cfpkt_set_prio(pkt, TC_PRIO_CONTROL);
return layr->dn->transmit(layr->dn, pkt); return layr->dn->transmit(layr->dn, pkt);
} }
case CAIF_MODEMCMD_FLOW_OFF_REQ: case CAIF_MODEMCMD_FLOW_OFF_REQ:
...@@ -140,6 +142,7 @@ static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl) ...@@ -140,6 +142,7 @@ static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)
info->channel_id = service->layer.id; info->channel_id = service->layer.id;
info->hdr_len = 1; info->hdr_len = 1;
info->dev_info = &service->dev_info; info->dev_info = &service->dev_info;
cfpkt_set_prio(pkt, TC_PRIO_CONTROL);
return layr->dn->transmit(layr->dn, pkt); return layr->dn->transmit(layr->dn, pkt);
} }
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment