Changeset 59751a5
- Timestamp:
- 03/23/09 17:01:09 (12 years ago)
- Branches:
- 4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, getfragoff, help, libtrace4, master, ndag_format, pfring, rc-4.0.1, rc-4.0.2, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance, ringtimestampfixes
- Children:
- 5dd06d6
- Parents:
- d4242e4
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
lib/protocols_l3.c
rad36006 r59751a5 4 4 #include <assert.h> 5 5 #include <stdlib.h> 6 #include "config.h" 7 8 #ifdef HAVE_NETPACKET_PACKET_H 9 #include <sys/socket.h> 10 #include <netpacket/packet.h> 11 #include <net/ethernet.h> 12 #include <net/if_arp.h> 13 #include <string.h> 14 #endif 6 15 7 16 libtrace_ip_t *trace_get_ip(libtrace_packet_t *packet) … … 248 257 } 249 258 259 /* Extract the source mac address from a frame and bundle it up into a sockaddr */ 260 static struct sockaddr *get_source_ethernet_address( 261 libtrace_ether_t *ethernet, struct sockaddr *addr) 262 { 263 #ifdef HAVE_NETPACKET_PACKET_H 264 /* Use linux's sockaddr_ll structure */ 265 static struct sockaddr_storage dummy; 266 struct sockaddr_ll *l2addr; 267 268 if (addr) 269 l2addr = (struct sockaddr_ll*)addr; 270 else 271 l2addr = (struct sockaddr_ll*)&dummy; 272 273 l2addr->sll_family = AF_PACKET; 274 l2addr->sll_protocol = ethernet->ether_type; 275 l2addr->sll_ifindex = 0; /* Irrelevant */ 276 l2addr->sll_hatype = ARPHRD_ETHER; 277 l2addr->sll_pkttype = PACKET_OTHERHOST; 278 l2addr->sll_halen = 6; 279 memcpy(l2addr->sll_addr,ethernet->ether_shost, 6); 280 281 return (struct sockaddr*)l2addr; 282 #else 283 /* TODO: implement BSD's sockaddr_dl structure, sigh. */ 284 return NULL; 285 #endif 286 } 287 288 static struct sockaddr *get_source_l2_address( 289 const libtrace_packet_t *packet, struct sockaddr *addr) 290 { 291 static struct sockaddr_storage dummy; 292 void *l2; 293 libtrace_linktype_t linktype; 294 uint32_t remaining; 295 296 if (!addr) 297 addr =(struct sockaddr*)&dummy; 298 299 l2=trace_get_layer2(packet, &linktype, &remaining); 300 if (!l2) { 301 return NULL; 302 } 303 304 switch (linktype) { 305 case TRACE_TYPE_ETH: 306 return get_source_ethernet_address((libtrace_ether_t*)l2, addr); 307 default: 308 return NULL; 309 } 310 } 311 250 312 DLLEXPORT struct sockaddr *trace_get_source_address( 251 313 const libtrace_packet_t *packet, struct sockaddr *addr) … … 263 325 264 326 if (!l3) 265 return NULL;327 return get_source_l2_address(packet,addr); 266 328 267 329 switch (ethertype) { … … 296 358 } 297 359 default: 360 return get_source_l2_address(packet, addr); 361 } 362 } 363 364 365 static struct sockaddr *get_destination_ethernet_address( 366 libtrace_ether_t *ethernet, struct sockaddr *addr) 367 { 368 #ifdef HAVE_NETPACKET_PACKET_H 369 /* Use linux's sockaddr_ll structure */ 370 static struct sockaddr_storage dummy; 371 struct sockaddr_ll *l2addr; 372 if (addr) 373 l2addr = (struct sockaddr_ll*)addr; 374 else 375 l2addr = (struct sockaddr_ll*)&dummy; 376 377 l2addr->sll_family = AF_PACKET; 378 l2addr->sll_protocol = ethernet->ether_type; 379 l2addr->sll_ifindex = 0; /* Irrelevant */ 380 l2addr->sll_hatype = ARPHRD_ETHER; 381 l2addr->sll_pkttype = PACKET_OTHERHOST; 382 l2addr->sll_halen = 6; 383 memcpy(l2addr->sll_addr,ethernet->ether_dhost, 6); 384 385 return (struct sockaddr*)l2addr; 386 #else 387 /* TODO: implement BSD's sockaddr_dl structure, sigh. */ 388 return NULL; 389 #endif 390 } 391 392 static struct sockaddr *get_destination_l2_address( 393 const libtrace_packet_t *packet, struct sockaddr *addr) 394 { 395 static struct sockaddr_storage dummy; 396 void *l2; 397 libtrace_linktype_t linktype; 398 uint32_t remaining; 399 if (!addr) 400 addr =(struct sockaddr*)&dummy; 401 l2=trace_get_layer2(packet, &linktype, &remaining); 402 if (!l2) 403 return NULL; 404 405 switch (linktype) { 406 case TRACE_TYPE_ETH: 407 return get_destination_ethernet_address((libtrace_ether_t*)l2, addr); 408 default: 298 409 return NULL; 299 410 } … … 315 426 316 427 if (!l3) 317 return NULL;428 return get_destination_l2_address(packet,addr); 318 429 319 430 switch (ethertype) { … … 348 459 } 349 460 default: 350 return NULL;351 } 352 } 353 354 461 return get_destination_l2_address(packet, addr); 462 } 463 } 464 465 -
tools/tracetop/tracetop.cc
rd4242e4 r59751a5 13 13 #include <sys/socket.h> 14 14 #include <netdb.h> 15 #include "config.h" 16 #ifdef HAVE_NETPACKET_PACKET_H 17 #include <sys/socket.h> 18 #include <netpacket/packet.h> 19 #include <net/ethernet.h> 20 #endif 21 22 typedef enum { BITS_PER_SEC, BYTES } display_t; 23 display_t display_as = BYTES; 15 24 16 25 int cmp_sockaddr_in6(const struct sockaddr_in6 *a, const struct sockaddr_in6 *b) … … 27 36 return a->sin_addr.s_addr - b->sin_addr.s_addr; 28 37 } 38 39 #ifdef HAVE_NETPACKET_PACKET_H 40 int cmp_sockaddr_ll(const struct sockaddr_ll *a, const struct sockaddr_ll *b) 41 { 42 return memcmp(a->sll_addr, b->sll_addr, b->sll_halen); 43 } 44 #endif 29 45 30 46 int cmp_sockaddr(const struct sockaddr *a, const struct sockaddr *b) … … 38 54 case AF_INET6: 39 55 return cmp_sockaddr_in6((struct sockaddr_in6 *)a,(struct sockaddr_in6*)b); 56 #ifdef HAVE_NETPACKET_PACKET_H 57 case AF_PACKET: 58 return cmp_sockaddr_ll((struct sockaddr_ll *)a,(struct sockaddr_ll*)b); 59 #endif 40 60 case AF_UNSPEC: 41 61 return 0; /* Can't compare UNSPEC's! */ … … 52 72 size_t mybufflen = buffer ? bufflen : sizeof(intbuffer); 53 73 int err; 54 if ((err=getnameinfo(a, salen, mybuf, mybufflen, NULL, 0, NI_NUMERICHOST))!=0) { 55 strncpy(mybuf,gai_strerror(err),mybufflen); 74 switch (a->sa_family) { 75 case AF_INET: 76 case AF_INET6: 77 if ((err=getnameinfo(a, salen, mybuf, mybufflen, NULL, 0, NI_NUMERICHOST))!=0) { 78 strncpy(mybuf,gai_strerror(err),mybufflen); 79 } 80 break; 81 #ifdef HAVE_NETPACKET_PACKET_H 82 case AF_PACKET: 83 trace_ether_ntoa(((struct sockaddr_ll*)a)->sll_addr, mybuf); 84 break; 85 #endif 86 default: 87 snprintf(mybuf,mybufflen,"Unknown family %d",a->sa_family); 56 88 } 57 89 return mybuf; … … 94 126 flows_t::iterator it; 95 127 96 if (trace_get_source_address(packet,(struct sockaddr*)&flowkey.sip)== 0)128 if (trace_get_source_address(packet,(struct sockaddr*)&flowkey.sip)==NULL) 97 129 flowkey.sip.ss_family = AF_UNSPEC; 98 if (trace_get_destination_address(packet,(struct sockaddr*)&flowkey.dip)== 0)130 if (trace_get_destination_address(packet,(struct sockaddr*)&flowkey.dip)==NULL) 99 131 flowkey.dip.ss_family = AF_UNSPEC; 100 132 trace_get_transport(packet,&flowkey.protocol, NULL); … … 112 144 ++it->second.packets; 113 145 it->second.bytes+=trace_get_capture_length(packet); 146 114 147 } 115 148
Note: See TracChangeset
for help on using the changeset viewer.