Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Dmitry Tarnyagin and committed by
David S. Miller
44764812 e65ac4d5

+36 -3
+8 -1
include/net/caif/cfpkt.h
··· 188 188 */ 189 189 void *cfpkt_tonative(struct cfpkt *pkt); 190 190 191 - 192 191 /* 193 192 * Returns packet information for a packet. 194 193 * pkt Packet to get info from; 195 194 * @return Packet information 196 195 */ 197 196 struct caif_payload_info *cfpkt_info(struct cfpkt *pkt); 197 + 198 + /** cfpkt_set_prio - set priority for a CAIF packet. 199 + * 200 + * @pkt: The CAIF packet to be adjusted. 201 + * @prio: one of TC_PRIO_ constants. 202 + */ 203 + void cfpkt_set_prio(struct cfpkt *pkt, int prio); 204 + 198 205 #endif /* CFPKT_H_ */
+14 -2
net/caif/caif_socket.c
··· 19 19 #include <linux/uaccess.h> 20 20 #include <linux/debugfs.h> 21 21 #include <linux/caif/caif_socket.h> 22 - #include <linux/atomic.h> 22 + #include <linux/pkt_sched.h> 23 23 #include <net/sock.h> 24 24 #include <net/tcp_states.h> 25 25 #include <net/caif/caif_layer.h> ··· 505 505 506 506 pkt = cfpkt_fromnative(CAIF_DIR_OUT, skb); 507 507 memset(skb->cb, 0, sizeof(struct caif_payload_info)); 508 + cfpkt_set_prio(pkt, cf_sk->sk.sk_priority); 508 509 509 510 if (cf_sk->layer.dn == NULL) { 510 511 kfree_skb(skb); ··· 1063 1062 /* Store the protocol */ 1064 1063 sk->sk_protocol = (unsigned char) protocol; 1065 1064 1065 + /* Initialize default priority for well-known cases */ 1066 + switch (protocol) { 1067 + case CAIFPROTO_AT: 1068 + sk->sk_priority = TC_PRIO_CONTROL; 1069 + break; 1070 + case CAIFPROTO_RFM: 1071 + sk->sk_priority = TC_PRIO_INTERACTIVE_BULK; 1072 + break; 1073 + default: 1074 + sk->sk_priority = TC_PRIO_BESTEFFORT; 1075 + } 1076 + 1066 1077 /* 1067 1078 * Lock in order to try to stop someone from opening the socket 1068 1079 * too early. ··· 1094 1081 set_rx_flow_on(cf_sk); 1095 1082 1096 1083 /* Set default options on configuration */ 1097 - cf_sk->sk.sk_priority = CAIF_PRIO_NORMAL; 1098 1084 cf_sk->conn_req.link_selector = CAIF_LINK_LOW_LATENCY; 1099 1085 cf_sk->conn_req.protocol = protocol; 1100 1086 release_sock(&cf_sk->sk);
+4
net/caif/cfctrl.c
··· 9 9 #include <linux/stddef.h> 10 10 #include <linux/spinlock.h> 11 11 #include <linux/slab.h> 12 + #include <linux/pkt_sched.h> 12 13 #include <net/caif/caif_layer.h> 13 14 #include <net/caif/cfpkt.h> 14 15 #include <net/caif/cfctrl.h> ··· 190 189 cfctrl->serv.dev_info.id = physlinkid; 191 190 cfpkt_addbdy(pkt, CFCTRL_CMD_ENUM); 192 191 cfpkt_addbdy(pkt, physlinkid); 192 + cfpkt_set_prio(pkt, TC_PRIO_CONTROL); 193 193 dn->transmit(dn, pkt); 194 194 } 195 195 ··· 283 281 * might arrive with the newly allocated channel ID. 284 282 */ 285 283 cfpkt_info(pkt)->dev_info->id = param->phyid; 284 + cfpkt_set_prio(pkt, TC_PRIO_CONTROL); 286 285 ret = 287 286 dn->transmit(dn, pkt); 288 287 if (ret < 0) { ··· 317 314 cfpkt_addbdy(pkt, CFCTRL_CMD_LINK_DESTROY); 318 315 cfpkt_addbdy(pkt, channelid); 319 316 init_info(cfpkt_info(pkt), cfctrl); 317 + cfpkt_set_prio(pkt, TC_PRIO_CONTROL); 320 318 ret = 321 319 dn->transmit(dn, pkt); 322 320 #ifndef CAIF_NO_LOOP
+7
net/caif/cfpkt_skbuff.c
··· 381 381 memcpy(skb2->data, split, len2nd); 382 382 skb2->tail += len2nd; 383 383 skb2->len += len2nd; 384 + skb2->priority = skb->priority; 384 385 return skb_to_pkt(skb2); 385 386 } 386 387 ··· 395 394 return (struct caif_payload_info *)&pkt_to_skb(pkt)->cb; 396 395 } 397 396 EXPORT_SYMBOL(cfpkt_info); 397 + 398 + void cfpkt_set_prio(struct cfpkt *pkt, int prio) 399 + { 400 + pkt_to_skb(pkt)->priority = prio; 401 + } 402 + EXPORT_SYMBOL(cfpkt_set_prio);
+3
net/caif/cfsrvl.c
··· 11 11 #include <linux/errno.h> 12 12 #include <linux/slab.h> 13 13 #include <linux/module.h> 14 + #include <linux/pkt_sched.h> 14 15 #include <net/caif/caif_layer.h> 15 16 #include <net/caif/cfsrvl.h> 16 17 #include <net/caif/cfpkt.h> ··· 121 120 info->channel_id = service->layer.id; 122 121 info->hdr_len = 1; 123 122 info->dev_info = &service->dev_info; 123 + cfpkt_set_prio(pkt, TC_PRIO_CONTROL); 124 124 return layr->dn->transmit(layr->dn, pkt); 125 125 } 126 126 case CAIF_MODEMCMD_FLOW_OFF_REQ: ··· 142 140 info->channel_id = service->layer.id; 143 141 info->hdr_len = 1; 144 142 info->dev_info = &service->dev_info; 143 + cfpkt_set_prio(pkt, TC_PRIO_CONTROL); 145 144 return layr->dn->transmit(layr->dn, pkt); 146 145 } 147 146 default: