Changeset 59751a5


Ignore:
Timestamp:
03/23/09 17:01:09 (12 years ago)
Author:
Perry Lorier <perry@…>
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
Message:

have trace_get_source_address() / trace_get_destination_address() return link layer addresses
where possible.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • lib/protocols_l3.c

    rad36006 r59751a5  
    44#include <assert.h>
    55#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
    615
    716libtrace_ip_t *trace_get_ip(libtrace_packet_t *packet)
     
    248257}
    249258
     259/* Extract the source mac address from a frame and bundle it up into a sockaddr */
     260static 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
     288static 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
    250312DLLEXPORT struct sockaddr *trace_get_source_address(
    251313                const libtrace_packet_t *packet, struct sockaddr *addr)
     
    263325
    264326        if (!l3)
    265                 return NULL;
     327                return get_source_l2_address(packet,addr);
    266328
    267329        switch (ethertype) {
     
    296358                }
    297359                default:
     360                        return get_source_l2_address(packet, addr);
     361        }
     362}
     363
     364
     365static 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
     392static 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:
    298409                        return NULL;
    299410        }
     
    315426
    316427        if (!l3)
    317                 return NULL;
     428                return get_destination_l2_address(packet,addr);
    318429
    319430        switch (ethertype) {
     
    348459                }
    349460                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  
    1313#include <sys/socket.h>
    1414#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
     22typedef enum { BITS_PER_SEC, BYTES } display_t;
     23display_t display_as = BYTES;
    1524
    1625int cmp_sockaddr_in6(const struct sockaddr_in6 *a, const struct sockaddr_in6 *b)
     
    2736        return a->sin_addr.s_addr - b->sin_addr.s_addr;
    2837}
     38
     39#ifdef HAVE_NETPACKET_PACKET_H
     40int 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
    2945
    3046int cmp_sockaddr(const struct sockaddr *a, const struct sockaddr *b)
     
    3854                case AF_INET6:
    3955                        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
    4060                case AF_UNSPEC:
    4161                        return 0; /* Can't compare UNSPEC's! */
     
    5272        size_t mybufflen = buffer ? bufflen : sizeof(intbuffer);
    5373        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);
    5688        }
    5789        return mybuf;
     
    94126        flows_t::iterator it;
    95127
    96         if (trace_get_source_address(packet,(struct sockaddr*)&flowkey.sip)==0)
     128        if (trace_get_source_address(packet,(struct sockaddr*)&flowkey.sip)==NULL)
    97129                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)
    99131                flowkey.dip.ss_family = AF_UNSPEC;
    100132        trace_get_transport(packet,&flowkey.protocol, NULL);
     
    112144        ++it->second.packets;
    113145        it->second.bytes+=trace_get_capture_length(packet);
     146
    114147}
    115148
Note: See TracChangeset for help on using the changeset viewer.