Lines Matching defs:chunk
7 * This file contains the code relating the chunk abstraction.
60 struct sctp_chunk *chunk;
65 list_for_each_entry(chunk, &msg->chunks, frag_list)
66 sctp_chunk_free(chunk);
76 struct sctp_chunk *chunk;
83 chunk = list_entry(pos, struct sctp_chunk, frag_list);
86 sctp_chunk_put(chunk);
90 asoc = chunk->asoc;
92 sent = chunk->has_tsn ? SCTP_DATA_SENT : SCTP_DATA_UNSENT;
96 ev = sctp_ulpevent_make_send_failed(asoc, chunk, sent,
104 ev = sctp_ulpevent_make_send_failed_event(asoc, chunk,
111 sctp_chunk_put(chunk);
131 /* Assign a chunk to this datamsg. */
132 static void sctp_datamsg_assign(struct sctp_datamsg *msg, struct sctp_chunk *chunk)
135 chunk->msg = msg;
139 /* A data chunk can have a maximum payload of (2^16 - 20). Break
154 struct sctp_chunk *chunk;
171 /* This is the biggest possible DATA chunk that can fit into
255 * last DATA chunk of a user message when providing
263 chunk = asoc->stream.si->make_datafrag(asoc, sinfo, len, frag,
265 if (!chunk) {
270 err = sctp_user_addto_chunk(chunk, len, from);
274 chunk->shkey = shkey;
276 /* Put the chunk->skb back into the form expected by send. */
277 __skb_pull(chunk->skb, (__u8 *)chunk->chunk_hdr -
278 chunk->skb->data);
280 sctp_datamsg_assign(msg, chunk);
281 list_add_tail(&chunk->frag_list, &msg->chunks);
287 sctp_chunk_free(chunk);
292 chunk = list_entry(pos, struct sctp_chunk, frag_list);
293 sctp_chunk_free(chunk);
301 int sctp_chunk_abandoned(struct sctp_chunk *chunk)
303 if (!chunk->asoc->peer.prsctp_capable)
306 if (chunk->msg->abandoned)
309 if (!chunk->has_tsn &&
310 !(chunk->chunk_hdr->flags & SCTP_DATA_FIRST_FRAG))
313 if (SCTP_PR_TTL_ENABLED(chunk->sinfo.sinfo_flags) &&
314 time_after(jiffies, chunk->msg->expires_at)) {
316 SCTP_SO(&chunk->asoc->stream,
317 chunk->sinfo.sinfo_stream);
319 if (chunk->sent_count) {
320 chunk->asoc->abandoned_sent[SCTP_PR_INDEX(TTL)]++;
323 chunk->asoc->abandoned_unsent[SCTP_PR_INDEX(TTL)]++;
326 chunk->msg->abandoned = 1;
328 } else if (SCTP_PR_RTX_ENABLED(chunk->sinfo.sinfo_flags) &&
329 chunk->sent_count > chunk->sinfo.sinfo_timetolive) {
331 SCTP_SO(&chunk->asoc->stream,
332 chunk->sinfo.sinfo_stream);
334 chunk->asoc->abandoned_sent[SCTP_PR_INDEX(RTX)]++;
336 chunk->msg->abandoned = 1;
338 } else if (!SCTP_PR_POLICY(chunk->sinfo.sinfo_flags) &&
339 chunk->msg->expires_at &&
340 time_after(jiffies, chunk->msg->expires_at)) {
341 chunk->msg->abandoned = 1;
349 /* This chunk (and consequently entire message) has failed in its sending. */
350 void sctp_chunk_fail(struct sctp_chunk *chunk, int error)
352 chunk->msg->send_failed = 1;
353 chunk->msg->send_error = error;