// SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2013-2018, 2021, The Linux Foundation. All rights reserved. * * RMNET Data ingress/egress handler
*/
if (bridge_dev) {
skb->dev = bridge_dev;
dev_queue_xmit(skb);
}
}
/* Ingress / Egress Entry Points */
/* Processes packet as per ingress data format for receiving device. Logical * endpoint is determined from packet inspection. Packet is then sent to the * egress device listed in the logical endpoint configuration.
*/
rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb)
{ struct sk_buff *skb = *pskb; struct rmnet_port *port; struct net_device *dev;
if (!skb) goto done;
if (skb_linearize(skb)) {
kfree_skb(skb); goto done;
}
if (skb->pkt_type == PACKET_LOOPBACK) return RX_HANDLER_PASS;
dev = skb->dev;
port = rmnet_get_port_rcu(dev); if (unlikely(!port)) {
dev_core_stats_rx_nohandler_inc(skb->dev);
kfree_skb(skb); goto done;
}
switch (port->rmnet_mode) { case RMNET_EPMODE_VND:
rmnet_map_ingress_handler(skb, port); break; case RMNET_EPMODE_BRIDGE:
rmnet_bridge_handler(skb, port->bridge_ep); break;
}
done: return RX_HANDLER_CONSUMED;
}
/* Modifies packet as per logical endpoint configuration and egress data format * for egress device configured in logical endpoint. Packet is then transmitted * on the egress device.
*/ void rmnet_egress_handler(struct sk_buff *skb)
{ struct net_device *orig_dev; struct rmnet_port *port; struct rmnet_priv *priv;
u8 mux_id; int err;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.