static int cfrfml_transmit(struct cflayer *layr, struct cfpkt *pkt) { u8 tmp = 0; int ret; struct cfsrvl *service = container_obj(layr); caif_assert(layr->dn != NULL); caif_assert(layr->dn->transmit != NULL); if (!cfsrvl_ready(service, &ret)) return ret; if (!cfpkt_getlen(pkt) > CAIF_MAX_PAYLOAD_SIZE) { pr_err("CAIF: %s():Packet too large - size=%d\n", __func__, cfpkt_getlen(pkt)); return -EOVERFLOW; } if (cfpkt_add_head(pkt, &tmp, 1) < 0) { pr_err("CAIF: %s(): Packet is erroneous!\n", __func__); return -EPROTO; } /* Add info for MUX-layer to route the packet out. */ cfpkt_info(pkt)->channel_id = service->layer.id; /* * To optimize alignment, we add up the size of CAIF header before * payload. */ cfpkt_info(pkt)->hdr_len = 1; cfpkt_info(pkt)->dev_info = &service->dev_info; ret = layr->dn->transmit(layr->dn, pkt); if (ret < 0) cfpkt_extr_head(pkt, &tmp, 1); return ret; }
static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl) { struct cfsrvl *service = container_obj(layr); caif_assert(layr != NULL); caif_assert(layr->dn != NULL); caif_assert(layr->dn->transmit != NULL); if (!service->supports_flowctrl) return 0; switch (ctrl) { case CAIF_MODEMCMD_FLOW_ON_REQ: { struct cfpkt *pkt; struct caif_payload_info *info; u8 flow_on = SRVL_FLOW_ON; pkt = cfpkt_create(SRVL_CTRL_PKT_SIZE); if (!pkt) return -ENOMEM; if (cfpkt_add_head(pkt, &flow_on, 1) < 0) { pr_err("Packet is erroneous!\n"); cfpkt_destroy(pkt); return -EPROTO; } info = cfpkt_info(pkt); info->channel_id = service->layer.id; info->hdr_len = 1; info->dev_info = &service->dev_info; cfpkt_set_prio(pkt, TC_PRIO_CONTROL); return layr->dn->transmit(layr->dn, pkt); } case CAIF_MODEMCMD_FLOW_OFF_REQ: { struct cfpkt *pkt; struct caif_payload_info *info; u8 flow_off = SRVL_FLOW_OFF; pkt = cfpkt_create(SRVL_CTRL_PKT_SIZE); if (!pkt) return -ENOMEM; if (cfpkt_add_head(pkt, &flow_off, 1) < 0) { pr_err("Packet is erroneous!\n"); cfpkt_destroy(pkt); return -EPROTO; } info = cfpkt_info(pkt); info->channel_id = service->layer.id; info->hdr_len = 1; info->dev_info = &service->dev_info; cfpkt_set_prio(pkt, TC_PRIO_CONTROL); return layr->dn->transmit(layr->dn, pkt); } default: break; } return -EINVAL; }
static int cfvei_transmit(struct cflayer *layr, struct cfpkt *pkt) { u8 tmp = 0; struct caif_payload_info *info; int ret; struct cfsrvl *service = container_obj(layr); if (!cfsrvl_ready(service, &ret)) return ret; caif_assert(layr->dn != NULL); caif_assert(layr->dn->transmit != NULL); if (cfpkt_add_head(pkt, &tmp, 1) < 0) { pr_err("CAIF: %s(): Packet is erroneous!\n", __func__); return -EPROTO; } /* Add info-> for MUX-layer to route the packet out. */ info = cfpkt_info(pkt); info->channel_id = service->layer.id; info->hdr_len = 1; info->dev_info = &service->dev_info; ret = layr->dn->transmit(layr->dn, pkt); if (ret < 0) cfpkt_extr_head(pkt, &tmp, 1); return ret; }
static int cfusbl_transmit(struct cflayer *layr, struct cfpkt *pkt) { struct caif_payload_info *info; u8 hpad; u8 zeros[CFUSB_ALIGNMENT]; struct sk_buff *skb; struct cfusbl *usbl = container_of(layr, struct cfusbl, layer); skb = cfpkt_tonative(pkt); skb_reset_network_header(skb); skb->protocol = htons(ETH_P_IP); info = cfpkt_info(pkt); hpad = (info->hdr_len + CFUSB_PAD_DESCR_SZ) & (CFUSB_ALIGNMENT - 1); if (skb_headroom(skb) < ETH_HLEN + CFUSB_PAD_DESCR_SZ + hpad) { pr_warn("Headroom to small\n"); kfree_skb(skb); return -EIO; } memset(zeros, 0, hpad); cfpkt_add_head(pkt, zeros, hpad); cfpkt_add_head(pkt, &hpad, 1); cfpkt_add_head(pkt, usbl->tx_eth_hdr, sizeof(usbl->tx_eth_hdr)); return layr->dn->transmit(layr->dn, pkt); }
static int cfdgml_transmit(struct cflayer *layr, struct cfpkt *pkt) { u8 packet_type; u32 zero = 0; struct caif_payload_info *info; struct cfsrvl *service = container_obj(layr); int ret; if (!cfsrvl_ready(service, &ret)) return ret; /* STE Modem cannot handle more than 1500 bytes datagrams */ if (cfpkt_getlen(pkt) > DGM_MTU) return -EMSGSIZE; cfpkt_add_head(pkt, &zero, 3); packet_type = 0x08; /* B9 set - UNCLASSIFIED */ cfpkt_add_head(pkt, &packet_type, 1); /* Add info for MUX-layer to route the packet out. */ info = cfpkt_info(pkt); info->channel_id = service->layer.id; /* To optimize alignment, we add up the size of CAIF header * before payload. */ info->hdr_len = 4; info->dev_info = &service->dev_info; return layr->dn->transmit(layr->dn, pkt); }
static int cfdgml_transmit(struct cflayer *layr, struct cfpkt *pkt) { u32 zero = 0; struct caif_payload_info *info; struct cfsrvl *service = container_obj(layr); int ret; if (!cfsrvl_ready(service, &ret)) return ret; cfpkt_add_head(pkt, &zero, 4); /* Add info for MUX-layer to route the packet out. */ info = cfpkt_info(pkt); info->channel_id = service->layer.id; /* To optimize alignment, we add up the size of CAIF header * before payload. */ info->hdr_len = 4; info->dev_info = &service->dev_info; ret = layr->dn->transmit(layr->dn, pkt); if (ret < 0) { u32 tmp32; cfpkt_extr_head(pkt, &tmp32, 4); } return ret; }
static int cfdgml_transmit(struct cflayer *layr, struct cfpkt *pkt) { u8 packet_type; u32 zero = 0; struct caif_payload_info *info; struct cfsrvl *service = container_obj(layr); int ret; if (!cfsrvl_ready(service, &ret)) { cfpkt_destroy(pkt); return ret; } /* */ if (cfpkt_getlen(pkt) > DGM_MTU) { cfpkt_destroy(pkt); return -EMSGSIZE; } cfpkt_add_head(pkt, &zero, 3); packet_type = 0x08; /* */ cfpkt_add_head(pkt, &packet_type, 1); /* */ info = cfpkt_info(pkt); info->channel_id = service->layer.id; /* */ info->hdr_len = 4; info->dev_info = &service->dev_info; return layr->dn->transmit(layr->dn, pkt); }
static int cfvei_transmit(struct cflayer *layr, struct cfpkt *pkt) { u8 tmp = 0; struct caif_payload_info *info; int ret; struct cfsrvl *service = container_obj(layr); if (!cfsrvl_ready(service, &ret)) goto err; caif_assert(layr->dn != NULL); caif_assert(layr->dn->transmit != NULL); if (cfpkt_add_head(pkt, &tmp, 1) < 0) { pr_err("Packet is erroneous!\n"); ret = -EPROTO; goto err; } info = cfpkt_info(pkt); info->channel_id = service->layer.id; info->hdr_len = 1; info->dev_info = &service->dev_info; return layr->dn->transmit(layr->dn, pkt); err: cfpkt_destroy(pkt); return ret; }
static int cfdbgl_transmit(struct cflayer *layr, struct cfpkt *pkt) { struct cfsrvl *service = container_obj(layr); struct caif_payload_info *info; int ret; if (!cfsrvl_ready(service, &ret)) return ret; /* Add info for MUX-layer to route the packet out */ info = cfpkt_info(pkt); info->channel_id = service->layer.id; info->dev_info = &service->dev_info; return layr->dn->transmit(layr->dn, pkt); }
static int cfvidl_transmit(struct cflayer *layr, struct cfpkt *pkt) { struct cfsrvl *service = container_obj(layr); struct caif_payload_info *info; u32 videoheader = 0; int ret; if (!cfsrvl_ready(service, &ret)) return ret; cfpkt_add_head(pkt, &videoheader, 4); /* Add info for MUX-layer to route the packet out */ info = cfpkt_info(pkt); info->channel_id = service->layer.id; info->dev_info = &service->dev_info; ret = layr->dn->transmit(layr->dn, pkt); if (ret < 0) cfpkt_extr_head(pkt, &videoheader, 4); return ret; }
static int cfvidl_transmit(struct cflayer *layr, struct cfpkt *pkt) { struct cfsrvl *service = container_obj(layr); struct caif_payload_info *info; u32 videoheader = 0; int ret; if (!cfsrvl_ready(service, &ret)) { cfpkt_destroy(pkt); return ret; } cfpkt_add_head(pkt, &videoheader, 4); /* */ info = cfpkt_info(pkt); info->channel_id = service->layer.id; info->dev_info = &service->dev_info; return layr->dn->transmit(layr->dn, pkt); }