/* 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->pkt_type == PACKET_LOOPBACK) return RX_HANDLER_PASS; dev = skb->dev; port = rmnet_get_port(dev); 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; }
/** * __rmnet_deliver_skb() - Deliver skb * * Determines where to deliver skb. Options are: consume by network stack, * pass to bridge handler, or pass to virtual network device * * Return: * - RX_HANDLER_CONSUMED if packet forwarded or dropped * - RX_HANDLER_PASS if packet is to be consumed by network stack as-is */ static rx_handler_result_t __rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_logical_ep_conf_s *ep) { trace___rmnet_deliver_skb(skb); switch (ep->rmnet_mode) { case RMNET_EPMODE_NONE: return RX_HANDLER_PASS; case RMNET_EPMODE_BRIDGE: return rmnet_bridge_handler(skb, ep); case RMNET_EPMODE_VND: skb_reset_transport_header(skb); skb_reset_network_header(skb); switch (rmnet_vnd_rx_fixup(skb, skb->dev)) { case RX_HANDLER_CONSUMED: return RX_HANDLER_CONSUMED; case RX_HANDLER_PASS: skb->pkt_type = PACKET_HOST; netif_receive_skb(skb); return RX_HANDLER_CONSUMED; } return RX_HANDLER_PASS; default: LOGD("Unkown ep mode %d", ep->rmnet_mode); rmnet_kfree_skb(skb, RMNET_STATS_SKBFREE_DELIVER_NO_EP); return RX_HANDLER_CONSUMED; } }
/* 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; dev = skb->dev; port = rmnet_get_port(dev); switch (port->rmnet_mode) { case RMNET_EPMODE_VND: if (port->ingress_data_format & RMNET_INGRESS_FORMAT_MAP) rmnet_map_ingress_handler(skb, port); break; case RMNET_EPMODE_BRIDGE: rmnet_bridge_handler(skb, port->bridge_ep); break; } done: return RX_HANDLER_CONSUMED; }