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 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_getlen(pkt) > CAIF_MAX_PAYLOAD_SIZE) { pr_warning("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. */ 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 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) { 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); }
int cfpkt_setlen(struct cfpkt *pkt, u16 len) { struct sk_buff *skb = pkt_to_skb(pkt); if (unlikely(is_erronous(pkt))) return -EPROTO; if (likely(len <= skb->len)) { if (unlikely(skb->data_len)) ___pskb_trim(skb, len); else skb_trim(skb, len); return cfpkt_getlen(pkt); } /* Need to expand SKB */ if (unlikely(!cfpkt_pad_trail(pkt, len - skb->len))) PKT_ERROR(pkt, "skb_pad_trail failed\n"); return cfpkt_getlen(pkt); }
int cfpkt_iterate(struct cfpkt *pkt, u16 (*iter_func)(u16, void *, u16), u16 data) { /* * Don't care about the performance hit of linearizing, * Checksum should not be used on high-speed interfaces anyway. */ if (unlikely(is_erronous(pkt))) return -EPROTO; if (unlikely(skb_linearize(&pkt->skb) != 0)) { PKT_ERROR(pkt, "linearize failed\n"); return -EPROTO; } return iter_func(data, pkt->skb.data, cfpkt_getlen(pkt)); }