Annotation of embedaddon/quagga/pimd/pim_util.c, revision 1.1
1.1 ! misho 1: /*
! 2: PIM for Quagga
! 3: Copyright (C) 2008 Everton da Silva Marques
! 4:
! 5: This program is free software; you can redistribute it and/or modify
! 6: it under the terms of the GNU General Public License as published by
! 7: the Free Software Foundation; either version 2 of the License, or
! 8: (at your option) any later version.
! 9:
! 10: This program is distributed in the hope that it will be useful, but
! 11: WITHOUT ANY WARRANTY; without even the implied warranty of
! 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 13: General Public License for more details.
! 14:
! 15: You should have received a copy of the GNU General Public License
! 16: along with this program; see the file COPYING; if not, write to the
! 17: Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
! 18: MA 02110-1301 USA
! 19:
! 20: $QuaggaId: $Format:%an, %ai, %h$ $
! 21: */
! 22:
! 23: #include <zebra.h>
! 24:
! 25: #include "log.h"
! 26:
! 27: #include "pim_util.h"
! 28:
! 29: /*
! 30: RFC 3376: 4.1.7. QQIC (Querier's Query Interval Code)
! 31:
! 32: If QQIC < 128, QQI = QQIC
! 33: If QQIC >= 128, QQI = (mant | 0x10) << (exp + 3)
! 34:
! 35: 0 1 2 3 4 5 6 7
! 36: +-+-+-+-+-+-+-+-+
! 37: |1| exp | mant |
! 38: +-+-+-+-+-+-+-+-+
! 39:
! 40: Since exp=0..7 then (exp+3)=3..10, then QQI has
! 41: one of the following bit patterns:
! 42:
! 43: exp=0: QQI = 0000.0000.1MMM.M000
! 44: exp=1: QQI = 0000.0001.MMMM.0000
! 45: ...
! 46: exp=6: QQI = 001M.MMM0.0000.0000
! 47: exp=7: QQI = 01MM.MM00.0000.0000
! 48: --------- ---------
! 49: 0x4 0x0 0x0 0x0
! 50: */
! 51: uint8_t igmp_msg_encode16to8(uint16_t value)
! 52: {
! 53: uint8_t code;
! 54:
! 55: if (value < 128) {
! 56: code = value;
! 57: }
! 58: else {
! 59: uint16_t mask = 0x4000;
! 60: uint8_t exp;
! 61: uint16_t mant;
! 62: for (exp = 7; exp > 0; --exp) {
! 63: if (mask & value)
! 64: break;
! 65: mask >>= 1;
! 66: }
! 67: mant = 0x000F & (value >> (exp + 3));
! 68: code = ((uint8_t) 1 << 7) | ((uint8_t) exp << 4) | (uint8_t) mant;
! 69: }
! 70:
! 71: return code;
! 72: }
! 73:
! 74: /*
! 75: RFC 3376: 4.1.7. QQIC (Querier's Query Interval Code)
! 76:
! 77: If QQIC < 128, QQI = QQIC
! 78: If QQIC >= 128, QQI = (mant | 0x10) << (exp + 3)
! 79:
! 80: 0 1 2 3 4 5 6 7
! 81: +-+-+-+-+-+-+-+-+
! 82: |1| exp | mant |
! 83: +-+-+-+-+-+-+-+-+
! 84: */
! 85: uint16_t igmp_msg_decode8to16(uint8_t code)
! 86: {
! 87: uint16_t value;
! 88:
! 89: if (code < 128) {
! 90: value = code;
! 91: }
! 92: else {
! 93: uint16_t mant = (code & 0x0F);
! 94: uint8_t exp = (code & 0x70) >> 4;
! 95: value = (mant | 0x10) << (exp + 3);
! 96: }
! 97:
! 98: return value;
! 99: }
! 100:
! 101: void pim_pkt_dump(const char *label, const uint8_t *buf, int size)
! 102: {
! 103: char dump_buf[1000];
! 104: int i = 0;
! 105: int j = 0;
! 106:
! 107: for (; i < size; ++i, j += 2) {
! 108: int left = sizeof(dump_buf) - j;
! 109: if (left < 4) {
! 110: if (left > 1) {
! 111: strcat(dump_buf + j, "!"); /* mark as truncated */
! 112: }
! 113: break;
! 114: }
! 115: snprintf(dump_buf + j, left, "%02x", buf[i]);
! 116: }
! 117:
! 118: zlog_debug("%s: pkt dump size=%d: %s",
! 119: label,
! 120: size,
! 121: dump_buf);
! 122: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>