Annotation of embedaddon/igmpproxy/src/lib.c, revision 1.1
1.1 ! misho 1: /*
! 2: ** igmpproxy - IGMP proxy based multicast router
! 3: ** Copyright (C) 2005 Johnny Egeland <johnny@rlo.org>
! 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,
! 11: ** but WITHOUT ANY WARRANTY; without even the implied warranty of
! 12: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 13: ** GNU 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; if not, write to the Free Software
! 17: ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! 18: **
! 19: **----------------------------------------------------------------------------
! 20: **
! 21: ** This software is derived work from the following software. The original
! 22: ** source code has been modified from it's original state by the author
! 23: ** of igmpproxy.
! 24: **
! 25: ** smcroute 0.92 - Copyright (C) 2001 Carsten Schill <carsten@cschill.de>
! 26: ** - Licensed under the GNU General Public License, version 2
! 27: **
! 28: ** mrouted 3.9-beta3 - COPYRIGHT 1989 by The Board of Trustees of
! 29: ** Leland Stanford Junior University.
! 30: ** - Original license can be found in the Stanford.txt file.
! 31: **
! 32: */
! 33:
! 34: #include "igmpproxy.h"
! 35:
! 36: /*
! 37: * Exported variables.
! 38: */
! 39: char s1[19]; /* buffers to hold the string representations */
! 40: char s2[19]; /* of IP addresses, to be passed to inet_fmt() */
! 41: char s3[19]; /* or inet_fmts(). */
! 42: char s4[19];
! 43:
! 44: /*
! 45: ** Formats 'InAdr' into a dotted decimal string.
! 46: **
! 47: ** returns: - pointer to 'St'
! 48: **
! 49: */
! 50: char *fmtInAdr( char *St, struct in_addr InAdr ) {
! 51: sprintf( St, "%u.%u.%u.%u",
! 52: ((uint8_t *)&InAdr.s_addr)[ 0 ],
! 53: ((uint8_t *)&InAdr.s_addr)[ 1 ],
! 54: ((uint8_t *)&InAdr.s_addr)[ 2 ],
! 55: ((uint8_t *)&InAdr.s_addr)[ 3 ] );
! 56:
! 57: return St;
! 58: }
! 59:
! 60: /*
! 61: * Convert an IP address in u_long (network) format into a printable string.
! 62: */
! 63: char *inetFmt(uint32_t addr, char *s) {
! 64: register u_char *a;
! 65:
! 66: a = (u_char *)&addr;
! 67: sprintf(s, "%u.%u.%u.%u", a[0], a[1], a[2], a[3]);
! 68: return(s);
! 69: }
! 70:
! 71:
! 72: /*
! 73: * Convert an IP subnet number in u_long (network) format into a printable
! 74: * string including the netmask as a number of bits.
! 75: */
! 76: char *inetFmts(uint32_t addr, uint32_t mask, char *s) {
! 77: register u_char *a, *m;
! 78: int bits;
! 79:
! 80: if ((addr == 0) && (mask == 0)) {
! 81: sprintf(s, "default");
! 82: return(s);
! 83: }
! 84: a = (u_char *)&addr;
! 85: m = (u_char *)&mask;
! 86: bits = 33 - ffs(ntohl(mask));
! 87:
! 88: if (m[3] != 0) sprintf(s, "%u.%u.%u.%u/%d", a[0], a[1], a[2], a[3],
! 89: bits);
! 90: else if (m[2] != 0) sprintf(s, "%u.%u.%u/%d", a[0], a[1], a[2], bits);
! 91: else if (m[1] != 0) sprintf(s, "%u.%u/%d", a[0], a[1], bits);
! 92: else sprintf(s, "%u/%d", a[0], bits);
! 93:
! 94: return(s);
! 95: }
! 96:
! 97: /*
! 98: * inet_cksum extracted from:
! 99: * P I N G . C
! 100: *
! 101: * Author -
! 102: * Mike Muuss
! 103: * U. S. Army Ballistic Research Laboratory
! 104: * December, 1983
! 105: * Modified at Uc Berkeley
! 106: *
! 107: * (ping.c) Status -
! 108: * Public Domain. Distribution Unlimited.
! 109: *
! 110: * I N _ C K S U M
! 111: *
! 112: * Checksum routine for Internet Protocol family headers (C Version)
! 113: *
! 114: */
! 115: uint16_t inetChksum(uint16_t *addr, int len) {
! 116: register int nleft = len;
! 117: register uint16_t *w = addr;
! 118: uint16_t answer = 0;
! 119: register int32_t sum = 0;
! 120:
! 121: /*
! 122: * Our algorithm is simple, using a 32 bit accumulator (sum),
! 123: * we add sequential 16 bit words to it, and at the end, fold
! 124: * back all the carry bits from the top 16 bits into the lower
! 125: * 16 bits.
! 126: */
! 127: while (nleft > 1) {
! 128: sum += *w++;
! 129: nleft -= 2;
! 130: }
! 131:
! 132: /* mop up an odd byte, if necessary */
! 133: if (nleft == 1) {
! 134: *(uint8_t *) (&answer) = *(uint8_t *)w ;
! 135: sum += answer;
! 136: }
! 137:
! 138: /*
! 139: * add back carry outs from top 16 bits to low 16 bits
! 140: */
! 141: sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
! 142: sum += (sum >> 16); /* add carry */
! 143: answer = ~sum; /* truncate to 16 bits */
! 144: return(answer);
! 145: }
! 146:
! 147:
! 148:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>