1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #include <sys/types.h> 27 #include <netinet/in.h> 28 29 /* 30 * htonll(), ntohll(), htonl(), ntohl(), htons(), ntohs() 31 * 32 * On little endian machines these functions reverse the byte order of the 33 * input parameter and returns the result. This is to convert the byte order 34 * from host byte order (little endian) to network byte order (big endian), 35 * or vice versa. 36 * 37 * On big endian machines these functions just return the input parameter, 38 * as the host byte order is the same as the network byte order (big endian). 39 */ 40 41 42 #ifdef _LITTLE_ENDIAN 43 uint64_t 44 htonll(uint64_t in) 45 { 46 return ((uint64_t)htonl((in >> 32) & 0xffffffff) | 47 ((uint64_t)htonl(in & 0xffffffff) << 32)); 48 } 49 50 uint64_t 51 ntohll(uint64_t in) 52 { 53 return ((uint64_t)ntohl((in >> 32) & 0xffffffff) | 54 ((uint64_t)ntohl(in & 0xffffffff) << 32)); 55 } 56 57 uint32_t 58 htonl(uint32_t in) 59 { 60 uint32_t i; 61 62 i = (uint32_t)((in & (uint32_t)0xff000000) >> 24) + 63 (uint32_t)((in & (uint32_t)0x00ff0000) >> 8) + 64 (uint32_t)((in & (uint32_t)0x0000ff00) << 8) + 65 (uint32_t)((in & (uint32_t)0x000000ff) << 24); 66 return (i); 67 } 68 69 uint32_t 70 ntohl(uint32_t in) 71 { 72 return (htonl(in)); 73 } 74 75 uint16_t 76 htons(uint16_t in) 77 { 78 register int arg = (int)in; 79 uint16_t i; 80 81 i = (uint16_t)(((arg & 0xff00) >> 8) & 0xff); 82 i |= (uint16_t)((arg & 0xff) << 8); 83 return ((uint16_t)i); 84 } 85 86 uint16_t 87 ntohs(uint16_t in) 88 { 89 return (htons(in)); 90 } 91 92 #else /* _LITTLE_ENDIAN */ 93 94 #if defined(lint) 95 uint64_t 96 htonll(uint64_t in) 97 { 98 return (in); 99 } 100 101 uint64_t 102 ntohll(uint64_t in) 103 { 104 return (in); 105 } 106 107 uint32_t 108 htonl(uint32_t in) 109 { 110 return (in); 111 } 112 113 uint32_t 114 ntohl(uint32_t in) 115 { 116 return (in); 117 } 118 119 uint16_t 120 htons(uint16_t in) 121 { 122 return (in); 123 } 124 125 uint16_t 126 ntohs(uint16_t in) 127 { 128 return (in); 129 } 130 131 #endif /* lint */ 132 #endif /* _LITTLE_ENDIAN */ 133