Changeset 13905


Ignore:
Timestamp:
2009-01-06T23:19:55+01:00 (9 years ago)
Author:
nbd
Message:

ead: add support for instance ids to prevent interference from packet reception on multiple interfaces

Location:
trunk/package/ead/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/ead/src/ead-client.c

    r13883 r13905  
    6363static int auth_type = EAD_AUTH_DEFAULT; 
    6464static int timeout = EAD_TIMEOUT; 
     65static uint16_t sid = 0; 
    6566 
    6667static void 
     
    158159        if (nid == 0xffff) 
    159160                printf("%04x: %s\n", ntohs(msg->nid), pong->name); 
     161        sid = msg->sid; 
    160162        return true; 
    161163} 
     
    321323 
    322324        msg->magic = htonl(EAD_MAGIC); 
    323         msg->tid = 0; 
     325        msg->sid = 0; 
    324326 
    325327        memset(&local, 0, sizeof(local)); 
  • trunk/package/ead/src/ead.c

    r13902 r13905  
    6666#endif 
    6767 
     68struct ead_instance { 
     69        struct list_head list; 
     70        char ifname[16]; 
     71        int pid; 
     72        char id; 
     73#ifdef linux 
     74        char bridge[16]; 
     75        bool br_check; 
     76#endif 
     77}; 
     78 
    6879static char ethmac[6] = "\x00\x13\x37\x00\x00\x00"; /* last 3 bytes will be randomized */ 
    6980static pcap_t *pcap_fp = NULL; 
    7081static pcap_t *pcap_fp_rx = NULL; 
    71 static const char *ifname = DEFAULT_IFNAME; 
    7282static char pktbuf_b[PCAP_MRU]; 
    7383static struct ead_packet *pktbuf = (struct ead_packet *)pktbuf_b; 
     
    8696static const char *dev_name = DEFAULT_DEVNAME; 
    8797static bool nonfork = false; 
    88  
    89 #ifdef linux 
    90 static const char *brname = NULL; 
    91 #endif 
    92  
    93 struct ead_instance { 
    94         struct list_head list; 
    95         char name[16]; 
    96         int pid; 
    97 #ifdef linux 
    98         char bridge[16]; 
    99         bool br_check; 
    100 #endif 
    101 }; 
     98static struct ead_instance *instance = NULL; 
    10299 
    103100static struct t_pwent tpe = { 
     
    113110static struct t_num A, *B = NULL; 
    114111unsigned char *skey; 
     112 
     113static void 
     114get_random_bytes(void *ptr, int len) 
     115{ 
     116        int fd; 
     117 
     118        fd = open("/dev/urandom", O_RDONLY); 
     119        if (fd < 0) { 
     120                perror("open"); 
     121                exit(1); 
     122        } 
     123        read(fd, ptr, len); 
     124        close(fd); 
     125} 
    115126 
    116127static bool 
     
    540551                return; 
    541552 
     553        if ((type != EAD_TYPE_PING) && 
     554                ((ntohs(pkt->msg.sid) & EAD_INSTANCE_MASK) >> 
     555                 EAD_INSTANCE_SHIFT) != instance->id) 
     556                return; 
     557 
    542558        switch(type) { 
    543559        case EAD_TYPE_PING: 
     
    575591        pktbuf->msg.type = htonl(type + 1); 
    576592        pktbuf->msg.nid = htons(nid); 
     593        pktbuf->msg.sid = pkt->msg.sid; 
    577594        pktbuf->msg.len = 0; 
    578595 
     
    631648        pcap_fp_rx = NULL; 
    632649        do { 
    633                 pcap_fp = pcap_open_live(ifname, PCAP_MRU, 1, PCAP_TIMEOUT, errbuf); 
     650                pcap_fp = pcap_open_live(instance->ifname, PCAP_MRU, 1, PCAP_TIMEOUT, errbuf); 
    634651#ifdef linux 
    635                 if (brname) 
    636                         pcap_fp_rx = pcap_open_live(brname, PCAP_MRU, 1, PCAP_TIMEOUT, errbuf); 
     652                if (instance->bridge[0]) 
     653                        pcap_fp_rx = pcap_open_live(instance->bridge, PCAP_MRU, 1, PCAP_TIMEOUT, errbuf); 
    637654#endif 
    638655                if (!pcap_fp_rx) 
     
    640657                pcap_setfilter(pcap_fp_rx, &pktfilter); 
    641658                if (first && !pcap_fp) { 
    642                         DEBUG(1, "WARNING: unable to open interface '%s'\n", ifname); 
     659                        DEBUG(1, "WARNING: unable to open interface '%s'\n", instance->ifname); 
    643660                        first = false; 
    644661                } 
     
    713730        } 
    714731 
     732        instance = i; 
    715733        signal(SIGCHLD, instance_handle_sigchld); 
    716         ifname = i->name; 
    717 #ifdef linux 
    718         if (i->bridge[0]) 
    719                 brname = i->bridge; 
    720 #endif 
    721734        ead_pcap_reopen(true); 
    722735        ead_pktloop(); 
     
    780793                in = list_entry(p, struct ead_instance, list); 
    781794 
    782                 if (strcmp(in->name, port) != 0) 
     795                if (strcmp(in->ifname, port) != 0) 
    783796                        continue; 
    784797 
     
    788801 
    789802                strncpy(in->bridge, br, sizeof(in->bridge)); 
    790                 DEBUG(2, "assigning port %s to bridge %s\n", in->name, in->bridge); 
     803                DEBUG(2, "assigning port %s to bridge %s\n", in->ifname, in->bridge); 
    791804                stop_server(in, false); 
    792805        } 
     
    818831                        in->br_check = false; 
    819832                } else if (in->bridge[0]) { 
    820                         DEBUG(2, "removing port %s from bridge %s\n", in->name, in->bridge); 
     833                        DEBUG(2, "removing port %s from bridge %s\n", in->ifname, in->bridge); 
    821834                        in->bridge[0] = 0; 
    822835                        stop_server(in, false); 
     
    831844        struct ead_instance *in; 
    832845        struct timeval tv; 
    833         int fd, ch; 
    834846        const char *pidfile = NULL; 
    835847        bool background = false; 
    836848        int n_iface = 0; 
     849        int fd, ch; 
    837850 
    838851        if (argc == 1) 
     
    854867                        memset(in, 0, sizeof(struct ead_instance)); 
    855868                        INIT_LIST_HEAD(&in->list); 
    856                         strncpy(in->name, optarg, sizeof(in->name) - 1); 
     869                        strncpy(in->ifname, optarg, sizeof(in->ifname) - 1); 
    857870                        list_add(&in->list, &instances); 
    858                         n_iface++; 
     871                        in->id = n_iface++; 
    859872                        break; 
    860873                case 'D': 
     
    903916 
    904917        /* randomize the mac address */ 
    905         fd = open("/dev/urandom", O_RDONLY); 
    906         if (fd < 0) { 
    907                 perror("open"); 
    908                 exit(1); 
    909         } 
    910         read(fd, ethmac + 3, 3); 
    911         close(fd); 
     918        get_random_bytes(ethmac + 3, 3); 
    912919        nid = *(((u16_t *) ethmac) + 2); 
    913920 
  • trunk/package/ead/src/ead.h

    r13883 r13905  
    115115#define EAD_ENC_DATA(_msg, _type) (&((_msg)->data[0].enc.data[0]._type)) 
    116116 
     117/* for ead_msg::sid */ 
     118#define EAD_INSTANCE_MASK       0xf000 
     119#define EAD_INSTANCE_SHIFT      12 
     120 
    117121struct ead_msg { 
    118122        uint32_t magic; 
     
    120124        uint32_t type; 
    121125        uint16_t nid; /* node id */ 
    122         uint16_t tid; /* transaction id */ 
     126        uint16_t sid; /* session id */ 
    123127        uint32_t ip; /* source ip for responses from the server */ 
    124128        union { 
Note: See TracChangeset for help on using the changeset viewer.