caif: Use link layer MTU instead of fixed MTU
Previously CAIF supported maximum transfer size of ~4050. The transfer size is now calculated dynamically based on the link layers mtu size. Signed-off-by: Sjur Braendeland@stericsson.com Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
a7da1f55a8
commit
2aa40aef9d
@@ -6,6 +6,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <net/caif/caif_layer.h>
|
||||
#include <net/caif/cfpkt.h>
|
||||
#include <net/caif/cfcnfg.h>
|
||||
@@ -42,6 +43,15 @@ struct cfcnfg_phyinfo {
|
||||
|
||||
/* Information about the physical device */
|
||||
struct dev_info dev_info;
|
||||
|
||||
/* Interface index */
|
||||
int ifindex;
|
||||
|
||||
/* Use Start of frame extension */
|
||||
bool use_stx;
|
||||
|
||||
/* Use Start of frame checksum */
|
||||
bool use_fcs;
|
||||
};
|
||||
|
||||
struct cfcnfg {
|
||||
@@ -249,9 +259,20 @@ static void cfcnfg_linkdestroy_rsp(struct cflayer *layer, u8 channel_id)
|
||||
{
|
||||
}
|
||||
|
||||
int protohead[CFCTRL_SRV_MASK] = {
|
||||
[CFCTRL_SRV_VEI] = 4,
|
||||
[CFCTRL_SRV_DATAGRAM] = 7,
|
||||
[CFCTRL_SRV_UTIL] = 4,
|
||||
[CFCTRL_SRV_RFM] = 3,
|
||||
[CFCTRL_SRV_DBG] = 3,
|
||||
};
|
||||
|
||||
int cfcnfg_add_adaptation_layer(struct cfcnfg *cnfg,
|
||||
struct cfctrl_link_param *param,
|
||||
struct cflayer *adap_layer)
|
||||
struct cflayer *adap_layer,
|
||||
int *ifindex,
|
||||
int *proto_head,
|
||||
int *proto_tail)
|
||||
{
|
||||
struct cflayer *frml;
|
||||
if (adap_layer == NULL) {
|
||||
@@ -277,6 +298,14 @@ int cfcnfg_add_adaptation_layer(struct cfcnfg *cnfg,
|
||||
param->phyid);
|
||||
caif_assert(cnfg->phy_layers[param->phyid].phy_layer->id ==
|
||||
param->phyid);
|
||||
|
||||
*ifindex = cnfg->phy_layers[param->phyid].ifindex;
|
||||
*proto_head =
|
||||
protohead[param->linktype]+
|
||||
(cnfg->phy_layers[param->phyid].use_stx ? 1 : 0);
|
||||
|
||||
*proto_tail = 2;
|
||||
|
||||
/* FIXME: ENUMERATE INITIALLY WHEN ACTIVATING PHYSICAL INTERFACE */
|
||||
cfctrl_enum_req(cnfg->ctrl, param->phyid);
|
||||
return cfctrl_linkup_request(cnfg->ctrl, param, adap_layer);
|
||||
@@ -298,6 +327,8 @@ cfcnfg_linkup_rsp(struct cflayer *layer, u8 channel_id, enum cfctrl_srv serv,
|
||||
struct cfcnfg *cnfg = container_obj(layer);
|
||||
struct cflayer *servicel = NULL;
|
||||
struct cfcnfg_phyinfo *phyinfo;
|
||||
struct net_device *netdev;
|
||||
|
||||
if (adapt_layer == NULL) {
|
||||
pr_debug("CAIF: %s(): link setup response "
|
||||
"but no client exist, send linkdown back\n",
|
||||
@@ -329,8 +360,9 @@ cfcnfg_linkup_rsp(struct cflayer *layer, u8 channel_id, enum cfctrl_srv serv,
|
||||
servicel = cfdgml_create(channel_id, &phyinfo->dev_info);
|
||||
break;
|
||||
case CFCTRL_SRV_RFM:
|
||||
netdev = phyinfo->dev_info.dev;
|
||||
servicel = cfrfml_create(channel_id, &phyinfo->dev_info,
|
||||
RFM_FRAGMENT_SIZE);
|
||||
netdev->mtu);
|
||||
break;
|
||||
case CFCTRL_SRV_UTIL:
|
||||
servicel = cfutill_create(channel_id, &phyinfo->dev_info);
|
||||
@@ -361,8 +393,8 @@ cfcnfg_linkup_rsp(struct cflayer *layer, u8 channel_id, enum cfctrl_srv serv,
|
||||
|
||||
void
|
||||
cfcnfg_add_phy_layer(struct cfcnfg *cnfg, enum cfcnfg_phy_type phy_type,
|
||||
void *dev, struct cflayer *phy_layer, u16 *phyid,
|
||||
enum cfcnfg_phy_preference pref,
|
||||
struct net_device *dev, struct cflayer *phy_layer,
|
||||
u16 *phyid, enum cfcnfg_phy_preference pref,
|
||||
bool fcs, bool stx)
|
||||
{
|
||||
struct cflayer *frml;
|
||||
@@ -416,6 +448,10 @@ cfcnfg_add_phy_layer(struct cfcnfg *cnfg, enum cfcnfg_phy_type phy_type,
|
||||
cnfg->phy_layers[*phyid].dev_info.dev = dev;
|
||||
cnfg->phy_layers[*phyid].phy_layer = phy_layer;
|
||||
cnfg->phy_layers[*phyid].phy_ref_count = 0;
|
||||
cnfg->phy_layers[*phyid].ifindex = dev->ifindex;
|
||||
cnfg->phy_layers[*phyid].use_stx = stx;
|
||||
cnfg->phy_layers[*phyid].use_fcs = fcs;
|
||||
|
||||
phy_layer->type = phy_type;
|
||||
frml = cffrml_create(*phyid, fcs);
|
||||
if (!frml) {
|
||||
|
Reference in New Issue
Block a user