Changes in uspace/srv/net/ethip/pdu.c [9ae6fc7:f0a2720] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/ethip/pdu.c
r9ae6fc7 rf0a2720 46 46 #include "pdu.h" 47 47 48 #define MAC48_BYTES 6 49 48 50 /** Encode Ethernet PDU. */ 49 51 int eth_pdu_encode(eth_frame_t *frame, void **rdata, size_t *rsize) … … 60 62 61 63 hdr = (eth_header_t *)data; 62 addr48(frame->src, hdr->src);63 addr48(frame->dest, hdr->dest);64 mac48_encode(&frame->src, hdr->src); 65 mac48_encode(&frame->dest, hdr->dest); 64 66 hdr->etype_len = host2uint16_t_be(frame->etype_len); 65 67 … … 67 69 frame->size); 68 70 69 log_msg(LOG_DEFAULT, LVL_DEBUG, "Encoded Ethernet frame (%zu bytes)", size); 71 log_msg(LVL_DEBUG, "Encoding Ethernet frame " 72 "src=%" PRIx64 " dest=%" PRIx64 " etype=%x", 73 frame->src.addr, frame->dest.addr, frame->etype_len); 74 log_msg(LVL_DEBUG, "Encoded Ethernet frame (%zu bytes)", size); 70 75 71 76 *rdata = data; … … 79 84 eth_header_t *hdr; 80 85 81 log_msg(L OG_DEFAULT, LVL_DEBUG, "eth_pdu_decode()");86 log_msg(LVL_DEBUG, "eth_pdu_decode()"); 82 87 83 88 if (size < sizeof(eth_header_t)) { 84 log_msg(L OG_DEFAULT, LVL_DEBUG, "PDU too short (%zu)", size);89 log_msg(LVL_DEBUG, "PDU too short (%zu)", size); 85 90 return EINVAL; 86 91 } … … 93 98 return ENOMEM; 94 99 95 addr48(hdr->src,frame->src);96 addr48(hdr->dest,frame->dest);100 mac48_decode(hdr->src, &frame->src); 101 mac48_decode(hdr->dest, &frame->dest); 97 102 frame->etype_len = uint16_t_be2host(hdr->etype_len); 98 103 … … 100 105 frame->size); 101 106 102 log_msg(LOG_DEFAULT, LVL_DEBUG, "Decoded Ethernet frame payload (%zu bytes)", frame->size); 103 104 return EOK; 107 log_msg(LVL_DEBUG, "Decoding Ethernet frame " 108 "src=%" PRIx64 " dest=%" PRIx64 " etype=%x", 109 frame->src.addr, frame->dest.addr, frame->etype_len); 110 log_msg(LVL_DEBUG, "Decoded Ethernet frame payload (%zu bytes)", frame->size); 111 112 return EOK; 113 } 114 115 void mac48_encode(mac48_addr_t *addr, void *buf) 116 { 117 uint64_t val; 118 uint8_t *bbuf = (uint8_t *)buf; 119 int i; 120 121 val = addr->addr; 122 for (i = 0; i < MAC48_BYTES; i++) 123 bbuf[i] = (val >> (8 * (MAC48_BYTES - i - 1))) & 0xff; 124 } 125 126 void mac48_decode(void *data, mac48_addr_t *addr) 127 { 128 uint64_t val; 129 uint8_t *bdata = (uint8_t *)data; 130 int i; 131 132 val = 0; 133 for (i = 0; i < MAC48_BYTES; i++) 134 val |= (uint64_t)bdata[i] << (8 * (MAC48_BYTES - i - 1)); 135 136 addr->addr = val; 105 137 } 106 138 … … 113 145 uint16_t fopcode; 114 146 115 log_msg(L OG_DEFAULT, LVL_DEBUG, "arp_pdu_encode()");147 log_msg(LVL_DEBUG, "arp_pdu_encode()"); 116 148 117 149 size = sizeof(arp_eth_packet_fmt_t); … … 136 168 pfmt->proto_addr_size = IPV4_ADDR_SIZE; 137 169 pfmt->opcode = host2uint16_t_be(fopcode); 138 addr48(packet->sender_hw_addr, pfmt->sender_hw_addr);170 mac48_encode(&packet->sender_hw_addr, pfmt->sender_hw_addr); 139 171 pfmt->sender_proto_addr = 140 host2uint32_t_be(packet->sender_proto_addr );141 addr48(packet->target_hw_addr, pfmt->target_hw_addr);172 host2uint32_t_be(packet->sender_proto_addr.ipv4); 173 mac48_encode(&packet->target_hw_addr, pfmt->target_hw_addr); 142 174 pfmt->target_proto_addr = 143 host2uint32_t_be(packet->target_proto_addr );175 host2uint32_t_be(packet->target_proto_addr.ipv4); 144 176 145 177 *rdata = data; … … 153 185 arp_eth_packet_fmt_t *pfmt; 154 186 155 log_msg(L OG_DEFAULT, LVL_DEBUG, "arp_pdu_decode()");187 log_msg(LVL_DEBUG, "arp_pdu_decode()"); 156 188 157 189 if (size < sizeof(arp_eth_packet_fmt_t)) { 158 log_msg(L OG_DEFAULT, LVL_DEBUG, "ARP PDU too short (%zu)", size);190 log_msg(LVL_DEBUG, "ARP PDU too short (%zu)", size); 159 191 return EINVAL; 160 192 } … … 163 195 164 196 if (uint16_t_be2host(pfmt->hw_addr_space) != AHRD_ETHERNET) { 165 log_msg(L OG_DEFAULT, LVL_DEBUG, "HW address space != %u (%" PRIu16 ")",197 log_msg(LVL_DEBUG, "HW address space != %u (%" PRIu16 ")", 166 198 AHRD_ETHERNET, uint16_t_be2host(pfmt->hw_addr_space)); 167 199 return EINVAL; … … 169 201 170 202 if (uint16_t_be2host(pfmt->proto_addr_space) != 0x0800) { 171 log_msg(L OG_DEFAULT, LVL_DEBUG, "Proto address space != %u (%" PRIu16 ")",203 log_msg(LVL_DEBUG, "Proto address space != %u (%" PRIu16 ")", 172 204 ETYPE_IP, uint16_t_be2host(pfmt->proto_addr_space)); 173 205 return EINVAL; … … 175 207 176 208 if (pfmt->hw_addr_size != ETH_ADDR_SIZE) { 177 log_msg(L OG_DEFAULT, LVL_DEBUG, "HW address size != %zu (%zu)",209 log_msg(LVL_DEBUG, "HW address size != %zu (%zu)", 178 210 (size_t)ETH_ADDR_SIZE, (size_t)pfmt->hw_addr_size); 179 211 return EINVAL; … … 181 213 182 214 if (pfmt->proto_addr_size != IPV4_ADDR_SIZE) { 183 log_msg(L OG_DEFAULT, LVL_DEBUG, "Proto address size != %zu (%zu)",215 log_msg(LVL_DEBUG, "Proto address size != %zu (%zu)", 184 216 (size_t)IPV4_ADDR_SIZE, (size_t)pfmt->proto_addr_size); 185 217 return EINVAL; … … 190 222 case AOP_REPLY: packet->opcode = aop_reply; break; 191 223 default: 192 log_msg(L OG_DEFAULT, LVL_DEBUG, "Invalid ARP opcode (%" PRIu16 ")",224 log_msg(LVL_DEBUG, "Invalid ARP opcode (%" PRIu16 ")", 193 225 uint16_t_be2host(pfmt->opcode)); 194 226 return EINVAL; 195 227 } 196 228 197 addr48(pfmt->sender_hw_addr,packet->sender_hw_addr);198 packet->sender_proto_addr =229 mac48_decode(pfmt->sender_hw_addr, &packet->sender_hw_addr); 230 packet->sender_proto_addr.ipv4 = 199 231 uint32_t_be2host(pfmt->sender_proto_addr); 200 addr48(pfmt->target_hw_addr,packet->target_hw_addr);201 packet->target_proto_addr =232 mac48_decode(pfmt->target_hw_addr, &packet->target_hw_addr); 233 packet->target_proto_addr.ipv4 = 202 234 uint32_t_be2host(pfmt->target_proto_addr); 203 log_msg(LOG_DEFAULT, LVL_DEBUG, "packet->tpa = %x\n", pfmt->target_proto_addr); 204 205 return EOK; 206 } 235 log_msg(LVL_DEBUG, "packet->tpa = %x\n", pfmt->target_proto_addr); 236 237 return EOK; 238 } 239 207 240 208 241 /** @}
Note:
See TracChangeset
for help on using the changeset viewer.