Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +4 −1 Original line number Diff line number Diff line Loading @@ -52,10 +52,11 @@ static const struct nla_policy rmnet_policy[IFLA_RMNET_MAX + 2] = { [IFLA_VLAN_EGRESS_QOS] = { .len = sizeof(struct tcmsg) }, }; static int rmnet_is_real_dev_registered(const struct net_device *real_dev) int rmnet_is_real_dev_registered(const struct net_device *real_dev) { return rcu_access_pointer(real_dev->rx_handler) == rmnet_rx_handler; } EXPORT_SYMBOL(rmnet_is_real_dev_registered); /* Needs rtnl lock */ static struct rmnet_port* Loading Loading @@ -416,6 +417,7 @@ struct rmnet_port *rmnet_get_port(struct net_device *real_dev) else return NULL; } EXPORT_SYMBOL(rmnet_get_port); struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id) { Loading @@ -428,6 +430,7 @@ struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id) return NULL; } EXPORT_SYMBOL(rmnet_get_endpoint); int rmnet_add_bridge(struct net_device *rmnet_dev, struct net_device *slave_dev) Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h +2 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ struct rmnet_port { u8 rmnet_mode; struct hlist_head muxed_ep[RMNET_MAX_LOGICAL_EP]; struct net_device *bridge_ep; void *rmnet_perf; u16 egress_agg_size; u16 egress_agg_count; Loading Loading @@ -108,6 +109,7 @@ struct rmnet_priv { void *qos_info; }; int rmnet_is_real_dev_registered(const struct net_device *real_dev); struct rmnet_port *rmnet_get_port(struct net_device *real_dev); struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id); int rmnet_add_bridge(struct net_device *rmnet_dev, Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +46 −18 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ static int rmnet_check_skb_can_gro(struct sk_buff *skb) return -EPROTONOSUPPORT; } static void rmnet_set_skb_proto(struct sk_buff *skb) void rmnet_set_skb_proto(struct sk_buff *skb) { switch (skb->data[0] & 0xF0) { case RMNET_IP_VERSION_4: Loading @@ -60,13 +60,21 @@ static void rmnet_set_skb_proto(struct sk_buff *skb) break; } } EXPORT_SYMBOL(rmnet_set_skb_proto); /* Shs hook handler */ int (*rmnet_shs_skb_entry)(struct sk_buff *skb, struct rmnet_port *port) __rcu __read_mostly; EXPORT_SYMBOL(rmnet_shs_skb_entry); /* Generic handler */ static void rmnet_deliver_skb(struct sk_buff *skb) void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port) { struct rmnet_priv *priv = netdev_priv(skb->dev); int (*rmnet_shs_stamp)(struct sk_buff *skb, struct rmnet_port *port); skb_reset_transport_header(skb); skb_reset_network_header(skb); Loading @@ -75,11 +83,16 @@ rmnet_deliver_skb(struct sk_buff *skb) skb->pkt_type = PACKET_HOST; skb_set_mac_header(skb, 0); rmnet_shs_stamp = rcu_dereference(rmnet_shs_skb_entry); if (rmnet_shs_stamp) rmnet_shs_stamp(skb, port); if (!rmnet_check_skb_can_gro(skb)) gro_cells_receive(&priv->gro_cells, skb); else netif_receive_skb(skb); } EXPORT_SYMBOL(rmnet_deliver_skb); /* MAP handler */ Loading @@ -93,7 +106,7 @@ __rmnet_map_ingress_handler(struct sk_buff *skb, if (RMNET_MAP_GET_CD_BIT(skb)) { if (port->data_format & RMNET_INGRESS_FORMAT_DL_MARKER) { if (!rmnet_map_flow_command(skb, port)) if (!rmnet_map_flow_command(skb, port, false)) return; } Loading Loading @@ -126,18 +139,21 @@ __rmnet_map_ingress_handler(struct sk_buff *skb, } skb_trim(skb, len); rmnet_deliver_skb(skb); rmnet_deliver_skb(skb, port); return; free_skb: kfree_skb(skb); } int (*rmnet_perf_deag_entry)(struct sk_buff *skb, struct rmnet_port *port) __rcu __read_mostly; EXPORT_SYMBOL(rmnet_perf_deag_entry); static void rmnet_map_ingress_handler(struct sk_buff *skb, struct rmnet_port *port) { struct sk_buff *skbn; if (skb->dev->type == ARPHRD_ETHER) { if (pskb_expand_head(skb, ETH_HLEN, 0, GFP_KERNEL)) { Loading @@ -149,19 +165,30 @@ rmnet_map_ingress_handler(struct sk_buff *skb, } if (port->data_format & RMNET_FLAGS_INGRESS_DEAGGREGATION) { int (*rmnet_perf_core_deaggregate)(struct sk_buff *skb, struct rmnet_port *port); /* Deaggregation and freeing of HW originating * buffers is done within here */ rmnet_perf_core_deaggregate = rcu_dereference(rmnet_perf_deag_entry); if (rmnet_perf_core_deaggregate) { rmnet_perf_core_deaggregate(skb, port); } else { struct sk_buff *skbn; while (skb) { struct sk_buff *skb_frag = skb_shinfo(skb)->frag_list; struct sk_buff *skb_frag = skb_shinfo(skb)->frag_list; skb_shinfo(skb)->frag_list = NULL; while ((skbn = rmnet_map_deaggregate(skb, port)) != NULL) __rmnet_map_ingress_handler(skbn, port); consume_skb(skb); skb = skb_frag; } } } else { __rmnet_map_ingress_handler(skb, port); } Loading Loading @@ -258,6 +285,7 @@ rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb) done: return RX_HANDLER_CONSUMED; } EXPORT_SYMBOL(rmnet_rx_handler); /* Modifies packet as per logical endpoint configuration and egress data format * for egress device configured in logical endpoint. Packet is then transmitted Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.h +4 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,10 @@ #include "rmnet_config.h" void rmnet_egress_handler(struct sk_buff *skb); void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port); void rmnet_set_skb_proto(struct sk_buff *skb); 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_ */ drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h +7 −1 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #ifndef _RMNET_MAP_H_ #define _RMNET_MAP_H_ #include "rmnet_config.h" struct rmnet_map_control_command { u8 command_name; Loading Loading @@ -131,6 +132,9 @@ struct rmnet_map_dl_ind { #define RMNET_MAP_GET_LENGTH(Y) (ntohs(((struct rmnet_map_header *) \ (Y)->data)->pkt_len)) #define RMNET_MAP_DEAGGR_SPACING 64 #define RMNET_MAP_DEAGGR_HEADROOM (RMNET_MAP_DEAGGR_SPACING / 2) #define RMNET_MAP_COMMAND_REQUEST 0 #define RMNET_MAP_COMMAND_ACK 1 #define RMNET_MAP_COMMAND_UNSUPPORTED 2 Loading @@ -151,7 +155,9 @@ int rmnet_map_tx_agg_skip(struct sk_buff *skb, int offset); void rmnet_map_tx_aggregate(struct sk_buff *skb, struct rmnet_port *port); void rmnet_map_tx_aggregate_init(struct rmnet_port *port); void rmnet_map_tx_aggregate_exit(struct rmnet_port *port); int rmnet_map_flow_command(struct sk_buff *skb, struct rmnet_port *port); int rmnet_map_flow_command(struct sk_buff *skb, struct rmnet_port *port, bool rmnet_perf); void rmnet_map_cmd_init(struct rmnet_port *port); int rmnet_map_dl_ind_register(struct rmnet_port *port, struct rmnet_map_dl_ind *dl_ind); Loading Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +4 −1 Original line number Diff line number Diff line Loading @@ -52,10 +52,11 @@ static const struct nla_policy rmnet_policy[IFLA_RMNET_MAX + 2] = { [IFLA_VLAN_EGRESS_QOS] = { .len = sizeof(struct tcmsg) }, }; static int rmnet_is_real_dev_registered(const struct net_device *real_dev) int rmnet_is_real_dev_registered(const struct net_device *real_dev) { return rcu_access_pointer(real_dev->rx_handler) == rmnet_rx_handler; } EXPORT_SYMBOL(rmnet_is_real_dev_registered); /* Needs rtnl lock */ static struct rmnet_port* Loading Loading @@ -416,6 +417,7 @@ struct rmnet_port *rmnet_get_port(struct net_device *real_dev) else return NULL; } EXPORT_SYMBOL(rmnet_get_port); struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id) { Loading @@ -428,6 +430,7 @@ struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id) return NULL; } EXPORT_SYMBOL(rmnet_get_endpoint); int rmnet_add_bridge(struct net_device *rmnet_dev, struct net_device *slave_dev) Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h +2 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ struct rmnet_port { u8 rmnet_mode; struct hlist_head muxed_ep[RMNET_MAX_LOGICAL_EP]; struct net_device *bridge_ep; void *rmnet_perf; u16 egress_agg_size; u16 egress_agg_count; Loading Loading @@ -108,6 +109,7 @@ struct rmnet_priv { void *qos_info; }; int rmnet_is_real_dev_registered(const struct net_device *real_dev); struct rmnet_port *rmnet_get_port(struct net_device *real_dev); struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id); int rmnet_add_bridge(struct net_device *rmnet_dev, Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +46 −18 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ static int rmnet_check_skb_can_gro(struct sk_buff *skb) return -EPROTONOSUPPORT; } static void rmnet_set_skb_proto(struct sk_buff *skb) void rmnet_set_skb_proto(struct sk_buff *skb) { switch (skb->data[0] & 0xF0) { case RMNET_IP_VERSION_4: Loading @@ -60,13 +60,21 @@ static void rmnet_set_skb_proto(struct sk_buff *skb) break; } } EXPORT_SYMBOL(rmnet_set_skb_proto); /* Shs hook handler */ int (*rmnet_shs_skb_entry)(struct sk_buff *skb, struct rmnet_port *port) __rcu __read_mostly; EXPORT_SYMBOL(rmnet_shs_skb_entry); /* Generic handler */ static void rmnet_deliver_skb(struct sk_buff *skb) void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port) { struct rmnet_priv *priv = netdev_priv(skb->dev); int (*rmnet_shs_stamp)(struct sk_buff *skb, struct rmnet_port *port); skb_reset_transport_header(skb); skb_reset_network_header(skb); Loading @@ -75,11 +83,16 @@ rmnet_deliver_skb(struct sk_buff *skb) skb->pkt_type = PACKET_HOST; skb_set_mac_header(skb, 0); rmnet_shs_stamp = rcu_dereference(rmnet_shs_skb_entry); if (rmnet_shs_stamp) rmnet_shs_stamp(skb, port); if (!rmnet_check_skb_can_gro(skb)) gro_cells_receive(&priv->gro_cells, skb); else netif_receive_skb(skb); } EXPORT_SYMBOL(rmnet_deliver_skb); /* MAP handler */ Loading @@ -93,7 +106,7 @@ __rmnet_map_ingress_handler(struct sk_buff *skb, if (RMNET_MAP_GET_CD_BIT(skb)) { if (port->data_format & RMNET_INGRESS_FORMAT_DL_MARKER) { if (!rmnet_map_flow_command(skb, port)) if (!rmnet_map_flow_command(skb, port, false)) return; } Loading Loading @@ -126,18 +139,21 @@ __rmnet_map_ingress_handler(struct sk_buff *skb, } skb_trim(skb, len); rmnet_deliver_skb(skb); rmnet_deliver_skb(skb, port); return; free_skb: kfree_skb(skb); } int (*rmnet_perf_deag_entry)(struct sk_buff *skb, struct rmnet_port *port) __rcu __read_mostly; EXPORT_SYMBOL(rmnet_perf_deag_entry); static void rmnet_map_ingress_handler(struct sk_buff *skb, struct rmnet_port *port) { struct sk_buff *skbn; if (skb->dev->type == ARPHRD_ETHER) { if (pskb_expand_head(skb, ETH_HLEN, 0, GFP_KERNEL)) { Loading @@ -149,19 +165,30 @@ rmnet_map_ingress_handler(struct sk_buff *skb, } if (port->data_format & RMNET_FLAGS_INGRESS_DEAGGREGATION) { int (*rmnet_perf_core_deaggregate)(struct sk_buff *skb, struct rmnet_port *port); /* Deaggregation and freeing of HW originating * buffers is done within here */ rmnet_perf_core_deaggregate = rcu_dereference(rmnet_perf_deag_entry); if (rmnet_perf_core_deaggregate) { rmnet_perf_core_deaggregate(skb, port); } else { struct sk_buff *skbn; while (skb) { struct sk_buff *skb_frag = skb_shinfo(skb)->frag_list; struct sk_buff *skb_frag = skb_shinfo(skb)->frag_list; skb_shinfo(skb)->frag_list = NULL; while ((skbn = rmnet_map_deaggregate(skb, port)) != NULL) __rmnet_map_ingress_handler(skbn, port); consume_skb(skb); skb = skb_frag; } } } else { __rmnet_map_ingress_handler(skb, port); } Loading Loading @@ -258,6 +285,7 @@ rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb) done: return RX_HANDLER_CONSUMED; } EXPORT_SYMBOL(rmnet_rx_handler); /* Modifies packet as per logical endpoint configuration and egress data format * for egress device configured in logical endpoint. Packet is then transmitted Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.h +4 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,10 @@ #include "rmnet_config.h" void rmnet_egress_handler(struct sk_buff *skb); void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port); void rmnet_set_skb_proto(struct sk_buff *skb); 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_ */
drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h +7 −1 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #ifndef _RMNET_MAP_H_ #define _RMNET_MAP_H_ #include "rmnet_config.h" struct rmnet_map_control_command { u8 command_name; Loading Loading @@ -131,6 +132,9 @@ struct rmnet_map_dl_ind { #define RMNET_MAP_GET_LENGTH(Y) (ntohs(((struct rmnet_map_header *) \ (Y)->data)->pkt_len)) #define RMNET_MAP_DEAGGR_SPACING 64 #define RMNET_MAP_DEAGGR_HEADROOM (RMNET_MAP_DEAGGR_SPACING / 2) #define RMNET_MAP_COMMAND_REQUEST 0 #define RMNET_MAP_COMMAND_ACK 1 #define RMNET_MAP_COMMAND_UNSUPPORTED 2 Loading @@ -151,7 +155,9 @@ int rmnet_map_tx_agg_skip(struct sk_buff *skb, int offset); void rmnet_map_tx_aggregate(struct sk_buff *skb, struct rmnet_port *port); void rmnet_map_tx_aggregate_init(struct rmnet_port *port); void rmnet_map_tx_aggregate_exit(struct rmnet_port *port); int rmnet_map_flow_command(struct sk_buff *skb, struct rmnet_port *port); int rmnet_map_flow_command(struct sk_buff *skb, struct rmnet_port *port, bool rmnet_perf); void rmnet_map_cmd_init(struct rmnet_port *port); int rmnet_map_dl_ind_register(struct rmnet_port *port, struct rmnet_map_dl_ind *dl_ind); Loading