diff options
Diffstat (limited to 'isisd')
-rw-r--r-- | isisd/dict.c | 5 | ||||
-rw-r--r-- | isisd/isis_dlpi.c | 21 | ||||
-rw-r--r-- | isisd/iso_checksum.c | 97 |
3 files changed, 123 insertions, 0 deletions
diff --git a/isisd/dict.c b/isisd/dict.c index 6c3e1e7f..b2bb5940 100644 --- a/isisd/dict.c +++ b/isisd/dict.c @@ -14,8 +14,13 @@ * into proprietary software; there is no requirement for such software to * contain a copyright notice related to this source. * +<<<<<<< HEAD:isisd/dict.c + * $Id: dict.c,v 1.5 2007/08/07 18:49:18 paul Exp $ + * $Name: $ +======= * $Id$ * $Name$ +>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:isisd/dict.c */ #include <stdlib.h> diff --git a/isisd/isis_dlpi.c b/isisd/isis_dlpi.c index 3cbe0b4f..21512e19 100644 --- a/isisd/isis_dlpi.c +++ b/isisd/isis_dlpi.c @@ -42,6 +42,11 @@ #include "isisd/isis_circuit.h" #include "isisd/isis_flags.h" #include "isisd/isisd.h" +<<<<<<< HEAD:isisd/isis_dlpi.c +#include "isisd/isis_constants.h" +#include "isisd/isis_circuit.h" +======= +>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:isisd/isis_dlpi.c #include "isisd/isis_network.h" #include "privs.h" @@ -313,6 +318,14 @@ open_dlpi_dev (struct isis_circuit *circuit) circuit->interface->name); return ISIS_WARNING; } +<<<<<<< HEAD:isisd/isis_dlpi.c + + /* 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) @@ -330,6 +343,7 @@ open_dlpi_dev (struct isis_circuit *circuit) unit = -1; fd = dlpiopen (devpath, &acklen); } +>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:isisd/isis_dlpi.c /* If that fails, try again as Style 2 */ if (fd == -1) @@ -461,11 +475,17 @@ open_dlpi_dev (struct isis_circuit *circuit) if (ioctl (fd, I_PUSH, "pfmod") == 0) { struct packetfilt pfil; +<<<<<<< HEAD:isisd/isis_dlpi.c +======= struct strioctl sioc; +>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:isisd/isis_dlpi.c pfil.Pf_Priority = 0; pfil.Pf_FilterLen = sizeof (pf_filter) / sizeof (u_short); memcpy (pfil.Pf_Filter, pf_filter, sizeof (pf_filter)); +<<<<<<< HEAD:isisd/isis_dlpi.c + ioctl (fd, PFIOCSETF, &pfil); +======= /* pfmod does not support transparent ioctls */ sioc.ic_cmd = PFIOCSETF; sioc.ic_timout = 5; @@ -474,6 +494,7 @@ open_dlpi_dev (struct isis_circuit *circuit) if (ioctl (fd, I_STR, &sioc) == -1) zlog_warn("%s: could not perform PF_IOCSETF on %s", __func__, circuit->interface->name); +>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:isisd/isis_dlpi.c } circuit->fd = fd; diff --git a/isisd/iso_checksum.c b/isisd/iso_checksum.c index 294fe994..abd101b9 100644 --- a/isisd/iso_checksum.c +++ b/isisd/iso_checksum.c @@ -75,3 +75,100 @@ iso_csum_verify (u_char * buffer, int len, uint16_t * csum) return 0; return 1; } +<<<<<<< HEAD:isisd/iso_checksum.c + +/* + * Creates the checksum. *csum points to the position of the checksum in the + * PDU. + * Based on Annex C.4 of ISO/IEC 8473 + */ +#define FIXED_CODE +u_int16_t +iso_csum_create (u_char * buffer, int len, u_int16_t n) +{ + + u_int8_t *p; + int x; + int y; + u_int32_t mul; + u_int32_t c0; + u_int32_t c1; + u_int16_t checksum; + u_int16_t *csum; + int i, init_len, partial_len; + + checksum = 0; + + /* + * Zero the csum in the packet. + */ + csum = (u_int16_t *) (buffer + n); + *(csum) = checksum; + + p = buffer; + c0 = 0; + c1 = 0; + init_len = len; + + while (len != 0) + { + partial_len = MIN(len, 5803); + + for (i = 0; i < partial_len; i++) + { + c0 = c0 + *(p++); + c1 += c0; + } + + c0 = c0 % 255; + c1 = c1 % 255; + + len -= partial_len; + } + + mul = (init_len - n)*(c0); + +#ifdef FIXED_CODE + x = mul - c0 - c1; + y = c1 - mul - 1; + + if (y > 0) + y++; + if (x < 0) + x--; + + x %= 255; + y %= 255; + + if (x == 0) + x = 255; + if (y == 0) + y = 1; + + checksum = (y << 8) | (x & 0xFF); + +#else + x = mul - c0 - c1; + x %= 255; + + y = c1 - mul - 1; + y %= 255; + + if (x == 0) + x = 255; + if (y == 0) + y = 255; + + checksum = ((y << 8) | x); +#endif + + /* + * Now we write this to the packet + */ + *(csum) = checksum; + + /* return the checksum for user usage */ + return checksum; +} +======= +>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:isisd/iso_checksum.c |