
Packets are now sent over a dedicated MHI channel when indicated by the DFC driver. New dedicated channel is controlled by rmnet driver. Buffers are allocated and supplied to it as needed from a recyclable pool for RX on the channel, and packets will be sent to it and freed manually once the channel indicates that they have been sent. Low latency packets can be aggregated like standard QMAP packets, but have their own aggregation state to prevent mixing default and low latency flows, and to allow each type of flow to use their own send functions (i.e. dev_queue_xmit() versus rmnet_ll_send_skb()). Low latency packets also have their own load-balancing scheme, and do not need to use the SHS module for balancing. To facilitate this, we mark the low latency packets with a non-zero priority value upon receipt from the MHI chainnel and avoid sending any such marked packets to the SHS ingress hook. DFC has been updated with a new netlink message type to handle swapping a list of bearers from one channel to another. The actual swap is performed asynchronously, and separate netlink ACKs will be sent to the userspace socket when the switch has been completed. Change-Id: I93861d4b004f399ba203d76a71b2f01fa5c0d5d2 Signed-off-by: Sean Tranchetti <stranche@codeaurora.org>
37 lines
1.2 KiB
C
37 lines
1.2 KiB
C
/* Copyright (c) 2013, 2016-2017, 2019-2021, The Linux Foundation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 and
|
|
* only version 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* RMNET Data ingress/egress handler
|
|
*
|
|
*/
|
|
|
|
#ifndef _RMNET_HANDLERS_H_
|
|
#define _RMNET_HANDLERS_H_
|
|
|
|
#include "rmnet_config.h"
|
|
|
|
enum rmnet_packet_context {
|
|
RMNET_NET_RX_CTX,
|
|
RMNET_WQ_CTX,
|
|
};
|
|
|
|
void rmnet_egress_handler(struct sk_buff *skb, bool low_latency);
|
|
void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port);
|
|
void rmnet_deliver_skb_wq(struct sk_buff *skb, struct rmnet_port *port,
|
|
enum rmnet_packet_context ctx);
|
|
void rmnet_set_skb_proto(struct sk_buff *skb);
|
|
bool rmnet_slow_start_on(u32 hash_key);
|
|
rx_handler_result_t _rmnet_map_ingress_handler(struct sk_buff *skb,
|
|
struct rmnet_port *port);
|
|
rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb);
|
|
|
|
#endif /* _RMNET_HANDLERS_H_ */
|