diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-10-27 14:25:29 -0700 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-10-27 14:25:29 -0700 |
commit | ea01b56bc3f43b268d32d175095a2a930d3b2967 (patch) | |
tree | e3e11bc827541bc983105a731636a78bc30bb5fa /isisd/isis_dlpi.c | |
parent | 0eb78a78cffc4a5c13e2b5daff5fa257b3f1d8d6 (diff) | |
parent | d3e384e4f00aa90db4310f82f3cbe6528e256334 (diff) | |
download | quagga-ea01b56bc3f43b268d32d175095a2a930d3b2967.tar.bz2 quagga-ea01b56bc3f43b268d32d175095a2a930d3b2967.tar.xz |
Merge in latest quagga (0.99.11)
Merge in current upstream version of quagga.
Diffstat (limited to 'isisd/isis_dlpi.c')
-rw-r--r-- | isisd/isis_dlpi.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/isisd/isis_dlpi.c b/isisd/isis_dlpi.c index db4383be..3cbe0b4f 100644 --- a/isisd/isis_dlpi.c +++ b/isisd/isis_dlpi.c @@ -42,8 +42,6 @@ #include "isisd/isis_circuit.h" #include "isisd/isis_flags.h" #include "isisd/isisd.h" -#include "isisd/isis_constants.h" -#include "isisd/isis_circuit.h" #include "isisd/isis_network.h" #include "privs.h" @@ -315,12 +313,23 @@ open_dlpi_dev (struct isis_circuit *circuit) circuit->interface->name); return ISIS_WARNING; } - - /* Try first as Style 1 */ - (void) snprintf(devpath, sizeof (devpath), "/dev/%s", - circuit->interface->name); - unit = -1; - fd = dlpiopen (devpath, &acklen); + + /* Try the vanity node first, if permitted */ + if (getenv("DLPI_DEVONLY") == NULL) + { + (void) snprintf (devpath, sizeof(devpath), "/dev/net/%s", + circuit->interface->name); + fd = dlpiopen (devpath, &acklen); + } + + /* Now try as an ordinary Style 1 node */ + if (fd == -1) + { + (void) snprintf (devpath, sizeof (devpath), "/dev/%s", + circuit->interface->name); + unit = -1; + fd = dlpiopen (devpath, &acklen); + } /* If that fails, try again as Style 2 */ if (fd == -1) @@ -452,11 +461,19 @@ open_dlpi_dev (struct isis_circuit *circuit) if (ioctl (fd, I_PUSH, "pfmod") == 0) { struct packetfilt pfil; + struct strioctl sioc; pfil.Pf_Priority = 0; pfil.Pf_FilterLen = sizeof (pf_filter) / sizeof (u_short); memcpy (pfil.Pf_Filter, pf_filter, sizeof (pf_filter)); - ioctl (fd, PFIOCSETF, &pfil); + /* pfmod does not support transparent ioctls */ + sioc.ic_cmd = PFIOCSETF; + sioc.ic_timout = 5; + sioc.ic_len = sizeof (struct packetfilt); + sioc.ic_dp = (char *)&pfil; + if (ioctl (fd, I_STR, &sioc) == -1) + zlog_warn("%s: could not perform PF_IOCSETF on %s", + __func__, circuit->interface->name); } circuit->fd = fd; |