109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Copyright (C) ST-Ericsson AB 2010 309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Author: Sjur Brendeland/sjur.brandeland@stericsson.com 409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * License terms: GNU General Public License (GPL) version 2 509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland#ifndef CFPKT_H_ 809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland#define CFPKT_H_ 909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland#include <net/caif/caif_layer.h> 1009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland#include <linux/types.h> 1109009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandstruct cfpkt; 1209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 1309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* Create a CAIF packet. 1409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * len: Length of packet to be created 1509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return New packet. 1609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 1709009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandstruct cfpkt *cfpkt_create(u16 len); 1809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 1909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 2009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Destroy a CAIF Packet. 2109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to be destoyed. 2209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 2309009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandvoid cfpkt_destroy(struct cfpkt *pkt); 2409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 2509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 2609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Extract header from packet. 2709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 2809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to extract header data from. 2909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * data Pointer to copy the header data into. 3009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * len Length of head data to copy. 3109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return zero on success and error code upon failure 3209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 3309009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandint cfpkt_extr_head(struct cfpkt *pkt, void *data, u16 len); 3409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 3509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 3609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Peek header from packet. 3709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Reads data from packet without changing packet. 3809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 3909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to extract header data from. 4009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * data Pointer to copy the header data into. 4109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * len Length of head data to copy. 4209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return zero on success and error code upon failure 4309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 4409009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandint cfpkt_peek_head(struct cfpkt *pkt, void *data, u16 len); 4509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 4609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 4709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Extract header from trailer (end of packet). 4809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 4909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to extract header data from. 5009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * data Pointer to copy the trailer data into. 5109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * len Length of header data to copy. 5209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return zero on success and error code upon failure 5309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 5409009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandint cfpkt_extr_trail(struct cfpkt *pkt, void *data, u16 len); 5509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 5609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 5709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Add header to packet. 5809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 5909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 6009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to add header data to. 6109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * data Pointer to data to copy into the header. 6209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * len Length of header data to copy. 6309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return zero on success and error code upon failure 6409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 6509009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandint cfpkt_add_head(struct cfpkt *pkt, const void *data, u16 len); 6609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 6709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 6809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Add trailer to packet. 6909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 7009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 7109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to add trailer data to. 7209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * data Pointer to data to copy into the trailer. 7309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * len Length of trailer data to copy. 7409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return zero on success and error code upon failure 7509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 7609009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandint cfpkt_add_trail(struct cfpkt *pkt, const void *data, u16 len); 7709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 7809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 7909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Pad trailer on packet. 8009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Moves data pointer in packet, no content copied. 8109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 8209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet in which to pad trailer. 8309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * len Length of padding to add. 8409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return zero on success and error code upon failure 8509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 8609009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandint cfpkt_pad_trail(struct cfpkt *pkt, u16 len); 8709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 8809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 8909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Add a single byte to packet body (tail). 9009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 9109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet in which to add byte. 9209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * data Byte to add. 9309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return zero on success and error code upon failure 9409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 9509009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandint cfpkt_addbdy(struct cfpkt *pkt, const u8 data); 9609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 9709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 9809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Add a data to packet body (tail). 9909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 10009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet in which to add data. 10109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * data Pointer to data to copy into the packet body. 10209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * len Length of data to add. 10309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return zero on success and error code upon failure 10409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 10509009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandint cfpkt_add_body(struct cfpkt *pkt, const void *data, u16 len); 10609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 10709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 10809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Checks whether there are more data to process in packet. 10909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to check. 11009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return true if more data are available in packet false otherwise 11109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 11209009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandbool cfpkt_more(struct cfpkt *pkt); 11309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 11409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 11509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Checks whether the packet is erroneous, 11609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * i.e. if it has been attempted to extract more data than available in packet 11709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * or writing more data than has been allocated in cfpkt_create(). 11809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to check. 11909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return true on error false otherwise 12009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 12109009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandbool cfpkt_erroneous(struct cfpkt *pkt); 12209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 12309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 12409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Get the packet length. 12509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to get length from. 12609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return Number of bytes in packet. 12709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 12809009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandu16 cfpkt_getlen(struct cfpkt *pkt); 12909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 13009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 13109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Set the packet length, by adjusting the trailer pointer according to length. 13209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to set length. 13309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * len Packet length. 13409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return Number of bytes in packet. 13509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 13609009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandint cfpkt_setlen(struct cfpkt *pkt, u16 len); 13709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 13809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 13909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * cfpkt_append - Appends a packet's data to another packet. 14009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * dstpkt: Packet to append data into, WILL BE FREED BY THIS FUNCTION 14109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * addpkt: Packet to be appended and automatically released, 14209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * WILL BE FREED BY THIS FUNCTION. 14309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * expectlen: Packet's expected total length. This should be considered 14409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * as a hint. 14509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * NB: Input packets will be destroyed after appending and cannot be used 14609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * after calling this function. 14709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return The new appended packet. 14809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 14909009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandstruct cfpkt *cfpkt_append(struct cfpkt *dstpkt, struct cfpkt *addpkt, 15009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland u16 expectlen); 15109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 15209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 15309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * cfpkt_split - Split a packet into two packets at the specified split point. 15409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt: Packet to be split (will contain the first part of the data on exit) 15509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pos: Position to split packet in two parts. 15609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return The new packet, containing the second part of the data. 15709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 15809009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandstruct cfpkt *cfpkt_split(struct cfpkt *pkt, u16 pos); 15909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 16009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 16109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Iteration function, iterates the packet buffers from start to end. 16209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * 16309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Checksum iteration function used to iterate buffers 16409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * (we may have packets consisting of a chain of buffers) 16509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt: Packet to calculate checksum for 16609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * iter_func: Function pointer to iteration function 16709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * chks: Checksum calculated so far. 16809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * buf: Pointer to the buffer to checksum 16909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * len: Length of buf. 17009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * data: Initial checksum value. 17109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return Checksum of buffer. 17209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 17309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 17409009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandu16 cfpkt_iterate(struct cfpkt *pkt, 17509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland u16 (*iter_func)(u16 chks, void *buf, u16 len), 17609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland u16 data); 17709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 17809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* Map from a "native" packet (e.g. Linux Socket Buffer) to a CAIF packet. 17909009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * dir - Direction indicating whether this packet is to be sent or received. 18009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * nativepkt - The native packet to be transformed to a CAIF packet 18109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return The mapped CAIF Packet CFPKT. 18209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 18309009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandstruct cfpkt *cfpkt_fromnative(enum caif_direction dir, void *nativepkt); 18409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 18509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* Map from a CAIF packet to a "native" packet (e.g. Linux Socket Buffer). 18609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt - The CAIF packet to be transformed into a "native" packet. 18709009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return The native packet transformed from a CAIF packet. 18809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 18909009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandvoid *cfpkt_tonative(struct cfpkt *pkt); 19009009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 19109009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland 19209009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland/* 19309009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * Returns packet information for a packet. 19409009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * pkt Packet to get info from; 19509009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland * @return Packet information 19609009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland */ 19709009f30de188c847d72039e6250bfea56a0f887Sjur Braendelandstruct caif_payload_info *cfpkt_info(struct cfpkt *pkt); 19809009f30de188c847d72039e6250bfea56a0f887Sjur Braendeland#endif /* CFPKT_H_ */ 199