Lines Matching refs: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
254 * last DATA chunk of a user message when providing
262 chunk = asoc->stream.si->make_datafrag(asoc, sinfo, len, frag,
264 if (!chunk) {
269 err = sctp_user_addto_chunk(chunk, len, from);
273 chunk->shkey = shkey;
275 /* Put the chunk->skb back into the form expected by send. */
276 __skb_pull(chunk->skb, (__u8 *)chunk->chunk_hdr -
277 chunk->skb->data);
279 sctp_datamsg_assign(msg, chunk);
280 list_add_tail(&chunk->frag_list, &msg->chunks);
286 sctp_chunk_free(chunk);
291 chunk = list_entry(pos, struct sctp_chunk, frag_list);
292 sctp_chunk_free(chunk);
300 int sctp_chunk_abandoned(struct sctp_chunk *chunk)
302 if (!chunk->asoc->peer.prsctp_capable)
305 if (chunk->msg->abandoned)
308 if (!chunk->has_tsn &&
309 !(chunk->chunk_hdr->flags & SCTP_DATA_FIRST_FRAG))
312 if (SCTP_PR_TTL_ENABLED(chunk->sinfo.sinfo_flags) &&
313 time_after(jiffies, chunk->msg->expires_at)) {
315 SCTP_SO(&chunk->asoc->stream,
316 chunk->sinfo.sinfo_stream);
318 if (chunk->sent_count) {
319 chunk->asoc->abandoned_sent[SCTP_PR_INDEX(TTL)]++;
322 chunk->asoc->abandoned_unsent[SCTP_PR_INDEX(TTL)]++;
325 chunk->msg->abandoned = 1;
327 } else if (SCTP_PR_RTX_ENABLED(chunk->sinfo.sinfo_flags) &&
328 chunk->sent_count > chunk->sinfo.sinfo_timetolive) {
330 SCTP_SO(&chunk->asoc->stream,
331 chunk->sinfo.sinfo_stream);
333 chunk->asoc->abandoned_sent[SCTP_PR_INDEX(RTX)]++;
335 chunk->msg->abandoned = 1;
337 } else if (!SCTP_PR_POLICY(chunk->sinfo.sinfo_flags) &&
338 chunk->msg->expires_at &&
339 time_after(jiffies, chunk->msg->expires_at)) {
340 chunk->msg->abandoned = 1;
348 /* This chunk (and consequently entire message) has failed in its sending. */
349 void sctp_chunk_fail(struct sctp_chunk *chunk, int error)
351 chunk->msg->send_failed = 1;
352 chunk->msg->send_error = error;