• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /asus-wl-520gu-7.0.1.45/src/router/rp-l2tp/

Lines Matching refs:dgram

3 * dgram.c
17 "$Id: dgram.c,v 1.1.1.1 2008/10/15 03:31:00 james26_jang Exp $";
42 static int dgram_add_random_vector_avp(l2tp_dgram *dgram);
114 /* A free list of L2TP dgram strucures. Allocation of L2TP dgrams
206 l2tp_dgram *dgram;
215 dgram = dgram_free_list;
216 dgram_free_list = dgram->next;
218 dgram = malloc(sizeof(l2tp_dgram));
220 if (!dgram) {
224 dgram->bits = 0;
225 dgram->version = 2;
226 dgram->length = 0;
227 dgram->tid = 0;
228 dgram->sid = 0;
229 dgram->Ns = 0;
230 dgram->Nr = 0;
231 dgram->off_size = 0;
232 dgram->last_random = 0;
233 dgram->payload_len = 0;
234 dgram->cursor = 0;
237 dgram->alloc_len = MAX_PACKET_LEN;
238 dgram->next = NULL;
240 return dgram;
259 l2tp_dgram *dgram = l2tp_dgram_new(MAX_PACKET_LEN);
262 if (!dgram) return NULL;
264 dgram->bits = TYPE_BIT | LENGTH_BIT | SEQUENCE_BIT;
265 dgram->tid = tid;
266 dgram->sid = sid;
267 dgram->msg_type = msg_type;
271 l2tp_dgram_add_avp(dgram, NULL, MANDATORY,
274 return dgram;
280 * dgram -- datagram to free
287 l2tp_dgram_free(l2tp_dgram *dgram)
289 if (!dgram) return;
290 dgram->next = dgram_free_list;
291 dgram_free_list = dgram;
301 * Reads an L2TP datagram off the wire and puts it in dgram. Adjusts
315 l2tp_dgram *dgram;
353 a dgram structure, etc; just call into handler */
426 /* A bit of slop on dgram size */
427 dgram = l2tp_dgram_new(r);
428 if (!dgram) return NULL;
430 dgram->bits = buf[0];
431 dgram->version = buf[1];
434 if (dgram->bits & LENGTH_BIT) {
435 PULL_UINT16(buf, cursor, dgram->length);
436 if (dgram->length > r) {
437 l2tp_set_errmsg("Invalid length field %d greater than received datagram size %d", (int) dgram->length, r);
438 l2tp_dgram_free(dgram);
442 dgram->length = r;
445 PULL_UINT16(buf, cursor, dgram->tid);
446 PULL_UINT16(buf, cursor, dgram->sid);
447 if (dgram->bits & SEQUENCE_BIT) {
448 PULL_UINT16(buf, cursor, dgram->Ns);
449 PULL_UINT16(buf, cursor, dgram->Nr);
451 dgram->Ns = 0;
452 dgram->Nr = 0;
455 if (dgram->bits & OFFSET_BIT) {
456 PULL_UINT16(buf, cursor, dgram->off_size);
458 dgram->off_size = 0;
460 if (cursor > dgram->length) {
461 l2tp_set_errmsg("Invalid length of datagram %d", (int) dgram->length);
462 l2tp_dgram_free(dgram);
466 dgram->payload_len = dgram->length - cursor;
467 memcpy(dgram->data, buf+cursor, dgram->payload_len);
470 if (dgram->bits & OFFSET_BIT) {
472 l2tp_dgram_free(dgram);
477 if (dgram->payload_len == 0) {
478 dgram->msg_type = MESSAGE_ZLB;
481 msg = l2tp_dgram_pull_avp(dgram, NULL, &mandatory, &hidden,
484 l2tp_dgram_free(dgram);
489 l2tp_dgram_free(dgram);
494 l2tp_dgram_free(dgram);
499 l2tp_dgram_free(dgram);
504 l2tp_dgram_free(dgram);
508 dgram->msg_type = ((unsigned int) msg[0]) * 256 +
513 l2tp_debug_describe_dgram(dgram)));
514 return dgram;
520 * dgram -- datagram to send
528 l2tp_dgram_send_to_wire(l2tp_dgram const *dgram,
540 l2tp_debug_describe_dgram(dgram)));
541 buf[0] = dgram->bits;
542 buf[1] = dgram->version;
544 if (dgram->bits & LENGTH_BIT) {
546 PUSH_UINT16(buf, cursor, dgram->length);
548 PUSH_UINT16(buf, cursor, dgram->tid);
549 PUSH_UINT16(buf, cursor, dgram->sid);
550 if (dgram->bits & SEQUENCE_BIT) {
551 PUSH_UINT16(buf, cursor, dgram->Ns);
552 PUSH_UINT16(buf, cursor, dgram->Nr);
554 if (dgram->bits & OFFSET_BIT) {
555 PUSH_UINT16(buf, cursor, dgram->off_size);
557 total_len = cursor + dgram->payload_len;
558 if (dgram->bits & LENGTH_BIT) {
562 memcpy(buf+cursor, dgram->data, dgram->payload_len);
570 * dgram -- the L2TP datagram
584 l2tp_dgram_add_avp(l2tp_dgram *dgram,
611 if (!dgram->last_random) {
613 if (dgram_add_random_vector_avp(dgram) < 0) return -1;
616 random_data = dgram->data + dgram->last_random + 6;
617 random_len = GET_AVP_LEN(dgram->data + dgram->last_random) - 6;
634 if (dgram->cursor + len > dgram->alloc_len) {
639 dgram->data[dgram->cursor] = 0;
641 dgram->data[dgram->cursor] |= AVP_MANDATORY_BIT;
644 dgram->data[dgram->cursor] |= AVP_HIDDEN_BIT;
647 dgram->data[dgram->cursor] |= (len >> 8);
648 dgram->data[dgram->cursor+1] = (len & 0xFF);
649 dgram->data[dgram->cursor+2] = (vendor >> 8);
650 dgram->data[dgram->cursor+3] = (vendor & 0xFF);
651 dgram->data[dgram->cursor+4] = (type >> 8);
652 dgram->data[dgram->cursor+5] = (type & 0xFF);
655 memcpy(dgram->data + dgram->cursor + 6, val, len-6);
659 dgram->last_random = dgram->cursor;
661 dgram->cursor += len;
662 dgram->payload_len = dgram->cursor;
669 * dgram -- the L2TP datagram
684 l2tp_dgram_pull_avp(l2tp_dgram *dgram,
701 if (dgram->cursor >= dgram->payload_len) {
711 *mandatory = dgram->data[dgram->cursor] & AVP_MANDATORY_BIT;
716 *hidden = dgram->data[dgram->cursor] & AVP_HIDDEN_BIT;
717 if (dgram->data[dgram->cursor] & AVP_RESERVED_BITS) {
723 *len = ((unsigned int) (dgram->data[dgram->cursor] & 3)) * 256 +
724 dgram->data[dgram->cursor+1];
730 if (dgram->cursor + *len > dgram->payload_len) {
735 dgram->cursor += 2;
737 PULL_UINT16(dgram->data, dgram->cursor, *vendor);
738 PULL_UINT16(dgram->data, dgram->cursor, *type);
746 dgram->last_random = dgram->cursor - 6;
749 ans = dgram->data + dgram->cursor;
750 dgram->cursor += *len - 6;
770 if (!dgram->last_random) {
784 random_data = dgram->data + dgram->last_random + 6;
785 random_len = GET_AVP_LEN(dgram->data + dgram->last_random) - 6;
956 * dgram -- the datagram
966 * Searches dgram for specific AVP type.
969 l2tp_dgram_search_avp(l2tp_dgram *dgram,
980 size_t cursor = dgram->cursor;
981 size_t last_random = dgram->last_random;
983 val = l2tp_dgram_pull_avp(dgram, tunnel, mandatory, hidden, len,
990 dgram->cursor = cursor;
991 dgram->last_random = last_random;
996 dgram->cursor = cursor;
997 dgram->last_random = last_random;
1056 * dgram -- datagram
1063 dgram_add_random_vector_avp(l2tp_dgram *dgram)
1069 return l2tp_dgram_add_avp(dgram, NULL, MANDATORY, sizeof(buf),