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: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e65ac4d545
commit
447648128e
@ -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 @@
|
|||||||
#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,
|
|||||||
|
|
||||||
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,
|
|||||||
/* 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,
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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,
|
|||||||
* 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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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:
|
||||||
|
Loading…
Reference in New Issue
Block a user