1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) ST-Ericsson AB 2010 4 * Author: Sjur Brendeland 5 */ 6 7 #ifndef CFPKT_H_ 8 #define CFPKT_H_ 9 #include <net/caif/caif_layer.h> 10 #include <linux/types.h> 11 struct cfpkt; 12 13 /* Create a CAIF packet. 14 * len: Length of packet to be created 15 * @return New packet. 16 */ 17 struct cfpkt *cfpkt_create(u16 len); 18 19 /* 20 * Destroy a CAIF Packet. 21 * pkt Packet to be destoyed. 22 */ 23 void cfpkt_destroy(struct cfpkt *pkt); 24 25 /* 26 * Extract header from packet. 27 * 28 * pkt Packet to extract header data from. 29 * data Pointer to copy the header data into. 30 * len Length of head data to copy. 31 * @return zero on success and error code upon failure 32 */ 33 int cfpkt_extr_head(struct cfpkt *pkt, void *data, u16 len); 34 35 static inline u8 cfpkt_extr_head_u8(struct cfpkt *pkt) 36 { 37 u8 tmp; 38 39 cfpkt_extr_head(pkt, &tmp, 1); 40 41 return tmp; 42 } 43 44 static inline u16 cfpkt_extr_head_u16(struct cfpkt *pkt) 45 { 46 __le16 tmp; 47 48 cfpkt_extr_head(pkt, &tmp, 2); 49 50 return le16_to_cpu(tmp); 51 } 52 53 static inline u32 cfpkt_extr_head_u32(struct cfpkt *pkt) 54 { 55 __le32 tmp; 56 57 cfpkt_extr_head(pkt, &tmp, 4); 58 59 return le32_to_cpu(tmp); 60 } 61 62 /* 63 * Peek header from packet. 64 * Reads data from packet without changing packet. 65 * 66 * pkt Packet to extract header data from. 67 * data Pointer to copy the header data into. 68 * len Length of head data to copy. 69 * @return zero on success and error code upon failure 70 */ 71 int cfpkt_peek_head(struct cfpkt *pkt, void *data, u16 len); 72 73 /* 74 * Extract header from trailer (end of packet). 75 * 76 * pkt Packet to extract header data from. 77 * data Pointer to copy the trailer data into. 78 * len Length of header data to copy. 79 * @return zero on success and error code upon failure 80 */ 81 int cfpkt_extr_trail(struct cfpkt *pkt, void *data, u16 len); 82 83 /* 84 * Add header to packet. 85 * 86 * 87 * pkt Packet to add header data to. 88 * data Pointer to data to copy into the header. 89 * len Length of header data to copy. 90 * @return zero on success and error code upon failure 91 */ 92 int cfpkt_add_head(struct cfpkt *pkt, const void *data, u16 len); 93 94 /* 95 * Add trailer to packet. 96 * 97 * 98 * pkt Packet to add trailer data to. 99 * data Pointer to data to copy into the trailer. 100 * len Length of trailer data to copy. 101 * @return zero on success and error code upon failure 102 */ 103 int cfpkt_add_trail(struct cfpkt *pkt, const void *data, u16 len); 104 105 /* 106 * Pad trailer on packet. 107 * Moves data pointer in packet, no content copied. 108 * 109 * pkt Packet in which to pad trailer. 110 * len Length of padding to add. 111 * @return zero on success and error code upon failure 112 */ 113 int cfpkt_pad_trail(struct cfpkt *pkt, u16 len); 114 115 /* 116 * Add a single byte to packet body (tail). 117 * 118 * pkt Packet in which to add byte. 119 * data Byte to add. 120 * @return zero on success and error code upon failure 121 */ 122 int cfpkt_addbdy(struct cfpkt *pkt, const u8 data); 123 124 /* 125 * Add a data to packet body (tail). 126 * 127 * pkt Packet in which to add data. 128 * data Pointer to data to copy into the packet body. 129 * len Length of data to add. 130 * @return zero on success and error code upon failure 131 */ 132 int cfpkt_add_body(struct cfpkt *pkt, const void *data, u16 len); 133 134 /* 135 * Checks whether there are more data to process in packet. 136 * pkt Packet to check. 137 * @return true if more data are available in packet false otherwise 138 */ 139 bool cfpkt_more(struct cfpkt *pkt); 140 141 /* 142 * Checks whether the packet is erroneous, 143 * i.e. if it has been attempted to extract more data than available in packet 144 * or writing more data than has been allocated in cfpkt_create(). 145 * pkt Packet to check. 146 * @return true on error false otherwise 147 */ 148 bool cfpkt_erroneous(struct cfpkt *pkt); 149 150 /* 151 * Get the packet length. 152 * pkt Packet to get length from. 153 * @return Number of bytes in packet. 154 */ 155 u16 cfpkt_getlen(struct cfpkt *pkt); 156 157 /* 158 * Set the packet length, by adjusting the trailer pointer according to length. 159 * pkt Packet to set length. 160 * len Packet length. 161 * @return Number of bytes in packet. 162 */ 163 int cfpkt_setlen(struct cfpkt *pkt, u16 len); 164 165 /* 166 * cfpkt_append - Appends a packet's data to another packet. 167 * dstpkt: Packet to append data into, WILL BE FREED BY THIS FUNCTION 168 * addpkt: Packet to be appended and automatically released, 169 * WILL BE FREED BY THIS FUNCTION. 170 * expectlen: Packet's expected total length. This should be considered 171 * as a hint. 172 * NB: Input packets will be destroyed after appending and cannot be used 173 * after calling this function. 174 * @return The new appended packet. 175 */ 176 struct cfpkt *cfpkt_append(struct cfpkt *dstpkt, struct cfpkt *addpkt, 177 u16 expectlen); 178 179 /* 180 * cfpkt_split - Split a packet into two packets at the specified split point. 181 * pkt: Packet to be split (will contain the first part of the data on exit) 182 * pos: Position to split packet in two parts. 183 * @return The new packet, containing the second part of the data. 184 */ 185 struct cfpkt *cfpkt_split(struct cfpkt *pkt, u16 pos); 186 187 /* 188 * Iteration function, iterates the packet buffers from start to end. 189 * 190 * Checksum iteration function used to iterate buffers 191 * (we may have packets consisting of a chain of buffers) 192 * pkt: Packet to calculate checksum for 193 * iter_func: Function pointer to iteration function 194 * chks: Checksum calculated so far. 195 * buf: Pointer to the buffer to checksum 196 * len: Length of buf. 197 * data: Initial checksum value. 198 * @return Checksum of buffer. 199 */ 200 201 int cfpkt_iterate(struct cfpkt *pkt, 202 u16 (*iter_func)(u16 chks, void *buf, u16 len), 203 u16 data); 204 205 /* Map from a "native" packet (e.g. Linux Socket Buffer) to a CAIF packet. 206 * dir - Direction indicating whether this packet is to be sent or received. 207 * nativepkt - The native packet to be transformed to a CAIF packet 208 * @return The mapped CAIF Packet CFPKT. 209 */ 210 struct cfpkt *cfpkt_fromnative(enum caif_direction dir, void *nativepkt); 211 212 /* Map from a CAIF packet to a "native" packet (e.g. Linux Socket Buffer). 213 * pkt - The CAIF packet to be transformed into a "native" packet. 214 * @return The native packet transformed from a CAIF packet. 215 */ 216 void *cfpkt_tonative(struct cfpkt *pkt); 217 218 /* 219 * Returns packet information for a packet. 220 * pkt Packet to get info from; 221 * @return Packet information 222 */ 223 struct caif_payload_info *cfpkt_info(struct cfpkt *pkt); 224 225 /** cfpkt_set_prio - set priority for a CAIF packet. 226 * 227 * @pkt: The CAIF packet to be adjusted. 228 * @prio: one of TC_PRIO_ constants. 229 */ 230 void cfpkt_set_prio(struct cfpkt *pkt, int prio); 231 232 #endif /* CFPKT_H_ */ 233