OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Ralf S. Engelschall
Root: /e/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-src Date: 26-Dec-2004 10:45:11
Branch: HEAD Handle: 2004122609451000
Modified files:
openpkg-src/vrrpd rc.vrrpd vrrpd.patch vrrpd.spec
Log:
start vrrpd ultra-early and apply vendor patches for carrier state
change handling
Summary:
Revision Changes Path
1.18 +2 -4 openpkg-src/vrrpd/rc.vrrpd
1.3 +366 -0 openpkg-src/vrrpd/vrrpd.patch
1.35 +1 -1 openpkg-src/vrrpd/vrrpd.spec
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-src/vrrpd/rc.vrrpd
============================================================================
$ cvs diff -u -r1.17 -r1.18 rc.vrrpd
--- openpkg-src/vrrpd/rc.vrrpd 6 Jul 2004 11:18:38 -0000 1.17
+++ openpkg-src/vrrpd/rc.vrrpd 26 Dec 2004 09:45:10 -0000 1.18
@@ -25,12 +25,12 @@
echo "vrrpd_usable=\"$vrrpd_usable\""
echo "vrrpd_active=\"$vrrpd_active\""
-%start -u @l_susr@
+%start -p 50 -u @l_susr@
rcService vrrpd enable yes || exit 0
rcService vrrpd active yes && exit 0
@l_prefix@/sbin/vrrpd >/dev/null 2>&1
-%stop -u @l_susr@
+%stop -p 950 -u @l_susr@
rcService vrrpd enable yes || exit 0
rcService vrrpd active no && exit 0
vrrpd_signal TERM
@@ -44,8 +44,6 @@
%daily -u @l_susr@
rcService vrrpd enable yes || exit 0
-
- # rotate logfiles
shtool rotate -f \
-n ${vrrpd_log_numfiles} -s ${vrrpd_log_minsize} -d \
-z ${vrrpd_log_complevel} -o @l_susr@ -g @l_mgrp@ -m 644 \
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/vrrpd/vrrpd.patch
============================================================================
$ cvs diff -u -r1.2 -r1.3 vrrpd.patch
--- openpkg-src/vrrpd/vrrpd.patch 14 Oct 2004 08:18:59 -0000 1.2
+++ openpkg-src/vrrpd/vrrpd.patch 26 Dec 2004 09:45:10 -0000 1.3
@@ -18,3 +18,369 @@
#define IPPROTO_VRRP 112
#define MAX_IP_ALIAS 255
+-----------------------------------------------------------------------------
+
+The following changes are backported from the vendor CVS as of 05-Mar-2004
+to fix the Ethernet carrier state change handling. This is very important
+for some FreeBSD network drivers like bge(4) and em(4).
+
+Index: vrrp_conf.c
+--- vrrp_conf.c.orig 2003-01-30 12:50:55 +0100
++++ vrrp_conf.c 2004-12-26 10:38:24 +0100
+@@ -141,12 +141,15 @@
+ }
+ if (lstat(name, &st) == -1) {
+ syslog(LOG_ERR, "cannot call lstat(): %m");
++ fclose(stream);
+ return NULL;
+ }
+ if ((st.st_mode & S_IFMT) != S_IFREG) {
+ syslog(LOG_ERR, "%s is not a regular file", name);
++ fclose(stream);
+ return NULL;
+ }
++
+ return stream;
+ }
+
+Index: vrrp_define.h
+--- vrrp_define.h.orig 2004-12-26 10:38:10 +0100
++++ vrrp_define.h 2004-12-26 10:38:24 +0100
+@@ -50,6 +50,7 @@
+ #define VRRP_USEC_COEFF 1000000
+ #define VRRP_CONF_MAX_ARGS 255
+ #define VRRP_DEFAULT_ADV_INT 1
++#define VRRP_DEFAULT_CARRIER_TIMEOUT 10
+ #define VRRP_PROTOCOL_MAX_VRID 255
+ #define VRRP_CONF_FILE_NAME "/usr/local/etc/freevrrpd.conf"
+ #define VRRP_MONCIRCUIT_MONDELAY 5000000
+Index: vrrp_functions.h
+--- vrrp_functions.h.orig 2003-01-30 12:50:55 +0100
++++ vrrp_functions.h 2004-12-26 10:38:24 +0100
+@@ -58,7 +58,7 @@
+ void vrrp_network_close_bpf(struct vrrp_vr *);
+ void vrrp_network_initialize(void);
+ char vrrp_network_open_socket(struct vrrp_vr *);
+-int vrrp_network_send_packet(char *, int, int, int);
++ssize_t vrrp_network_send_packet(char *, int, int, int);
+ u_int vrrp_network_vrrphdr_len(struct vrrp_vr *);
+ void vrrp_network_init_ethhdr(char *, struct vrrp_vr *);
+ void vrrp_network_init_iphdr(char *, struct vrrp_vr *);
+@@ -114,6 +114,6 @@
+ void vrrp_thread_mutex_unlock(void);
+ void vrrp_thread_mutex_lock_bpf(void);
+ void vrrp_thread_mutex_unlock_bpf(void);
+-void vrrp_thread_launch_vrrprouter(int *);
++void vrrp_thread_launch_vrrprouter(void **);
+ char vrrp_thread_initialize(void);
+ char vrrp_thread_create_vrid(struct vrrp_vr *);
+Index: vrrp_interface.c
+--- vrrp_interface.c.orig 2003-01-30 12:50:55 +0100
++++ vrrp_interface.c 2004-12-26 10:38:24 +0100
+@@ -50,10 +50,10 @@
+ char
+ vrrp_interface_ethaddr_set(char *if_name, struct ether_addr * ethaddr)
+ {
++#if defined(SIOCSIFLLADDR)
+ int sd;
+ struct ifreq ifr;
+
+-#if defined(SIOCSIFLLADDR)
+ bzero(&ifr, sizeof(ifr));
+ sd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (sd == -1) {
+Index: vrrp_main.c
+--- vrrp_main.c.orig 2003-01-30 12:50:55 +0100
++++ vrrp_main.c 2004-12-26 10:38:24 +0100
+@@ -76,6 +76,7 @@
+ vr->vr_if->alive = 1;
+ vr->vr_if->nberrors = 0;
+ vr->vr_if->reportsyslog = 0;
++ vr->vr_if->carrier_timeout = VRRP_DEFAULT_CARRIER_TIMEOUT;
+ }
+
+ return;
+Index: vrrp_moncircuit.c
+--- vrrp_moncircuit.c.orig 2003-01-30 12:50:56 +0100
++++ vrrp_moncircuit.c 2004-12-26 10:38:24 +0100
+@@ -90,6 +90,7 @@
+ int numvrid, numvrid2;
+ int cpt;
+ int sd;
++ int returnCode;
+
+ sd = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sd < 0) {
+@@ -100,7 +101,10 @@
+ for (;;) {
+ numvrid = 0;
+ while (vr_ptr[numvrid]) {
+- if ((vrrp_moncircuit_interface_status(sd,
vr_ptr[numvrid]->vr_if->if_name) == 1) && (! vr_ptr[numvrid]->fault)) {
++ vrrp_thread_mutex_lock_monitor();
++ returnCode = vrrp_moncircuit_interface_status(sd,
vr_ptr[numvrid]->vr_if->if_name);
++ vrrp_thread_mutex_unlock_monitor();
++ if ((returnCode == 1) && (! vr_ptr[numvrid]->fault)) {
+ if (vr_ptr[numvrid]->vr_if->nberrors <
VRRP_MONCIRCUIT_MAX_ERRORS) {
+ if (! vr_ptr[numvrid]->vr_if->alive) {
+ vr_ptr[numvrid]->vr_if->alive =
1;
+Index: vrrp_moncircuit.h
+--- vrrp_moncircuit.h.orig 2003-01-30 12:50:55 +0100
++++ vrrp_moncircuit.h 2004-12-26 10:38:24 +0100
+@@ -37,12 +37,14 @@
+
+ #include "vrrp_proto.h"
+ #include "vrrp_define.h"
++#include "vrrp_thread.h"
+
+ /* externals */
+ extern struct vrrp_vr *vr_ptr[VRRP_PROTOCOL_MAX_VRID];
+ extern u_char vr_ptr_pos;
+
+ /* Functions */
+-void vrrp_moncircuit_monitor_thread(int **args);
++void vrrp_moncircuit_monitor_thread(int **);
++int vrrp_moncircuit_interface_status(int, char *);
+
+ #endif
+Index: vrrp_network.c
+--- vrrp_network.c.orig 2003-01-30 12:50:55 +0100
++++ vrrp_network.c 2004-12-26 10:38:24 +0100
+@@ -124,18 +124,18 @@
+ return 0;
+ }
+
+-int
++ssize_t
+ vrrp_network_send_packet(char *buffer, int sizebuf, int sd_bpf, int log)
+ {
+ /* struct sockaddr_in addr; */
+- size_t octets;
++ ssize_t octets;
+
+ vrrp_thread_mutex_lock_bpf();
+ vrrp_network_flush_bpf(sd_bpf);
+ octets = write(sd_bpf, buffer, sizebuf);
+ vrrp_network_flush_bpf(sd_bpf);
+ vrrp_thread_mutex_unlock_bpf();
+- if (octets == -1) {
++ if (octets < 0) {
+ if (log)
+ syslog(LOG_ERR, "can't write to bpf socket descriptor
(pseudo_device bpf not activated in kernel ?)");
+ return -1;
+@@ -221,7 +221,7 @@
+ {
+ u_char *buffer;
+ u_int len = ETHER_HDR_LEN + sizeof(struct ip) +
vrrp_network_vrrphdr_len(vr);
+- int error;
++ ssize_t bytes = 0;
+
+ buffer = (u_char *) malloc(len);
+ bzero(buffer, len);
+@@ -230,17 +230,17 @@
+ vrrp_network_init_ethhdr(buffer, vr);
+ vrrp_network_init_vrrphdr(buffer, vr);
+
+- error = vrrp_network_send_packet(buffer, len, vr->sd_bpf, ! vr->fault);
+- if (error < 0) {
++ if (vr->fault)
++ bytes = vrrp_network_send_packet(buffer, len, vr->sd_bpf, 0);
++ else
++ bytes = vrrp_network_send_packet(buffer, len, vr->sd_bpf, 1);
++ if (bytes < 0) {
++ syslog(LOG_ERR, "There is a big problem here !");
+ vr->fault = 1;
+ free(buffer);
+ return -1;
+ }
+- else {
+- if (vr->fault)
+- vr->fault = 0;
+- }
+-
++ vr->fault = 0;
+ free(buffer);
+
+ return 0;
+Index: vrrp_proto.h
+--- vrrp_proto.h.orig 2003-01-30 12:50:55 +0100
++++ vrrp_proto.h 2004-12-26 10:38:24 +0100
+@@ -73,6 +73,7 @@
+ struct ether_addr ethaddr;
+ struct ether_addr actualethaddr;
+ struct vrrp_ethaddr_list *p, *d;
++ int carrier_timeout;
+ };
+
+ struct vrrp_vip {
+Index: vrrp_state.c
+--- vrrp_state.c.orig 2003-05-09 12:29:11 +0200
++++ vrrp_state.c 2004-12-26 10:38:24 +0100
+@@ -51,11 +51,15 @@
+ char
+ vrrp_state_set_master(struct vrrp_vr * vr)
+ {
++ int returnCode = 0;
++ int counter = 0;
++
+ /* Tester si sd_bpf n'est pas egal a -1 */
+
+ vrrp_list_add(vr, &vr->ethaddr);
+ vrrp_network_send_advertisement(vr);
+ vrrp_thread_mutex_lock();
++ vrrp_thread_mutex_lock_monitor();
+ if (vrrp_interface_down(vr->vr_if->if_name) == -1) {
+ vrrp_thread_mutex_unlock();
+ return -1;
+@@ -73,9 +77,18 @@
+ vrrp_thread_mutex_unlock();
+ return -1;
+ }
+- vrrp_thread_mutex_unlock();
++
++ /* Some NICs will reset (eg: bge/em) and wait some seconds before
becoming carrier again */
++ /* So we must wait for carrier */
++ for (counter = 0; (counter < vr->vr_if->carrier_timeout) && (returnCode
!= 1); counter++) {
++ returnCode = vrrp_moncircuit_interface_status(vr->sd,
vr->vr_if->if_name);
++ sleep(1);
++ }
++
++ vrrp_thread_mutex_unlock_monitor();
+ if (vrrp_network_send_gratuitous_arp_ips(vr, &vr->ethaddr) == -1)
+ return -1;
++ vrrp_thread_mutex_unlock();
+ if (vrrp_misc_calcul_tminterval(&vr->tm.adv_tm, vr->adv_int) == -1)
+ return -1;
+ vr->state = VRRP_STATE_MASTER;
+@@ -95,10 +108,13 @@
+ vrrp_state_set_backup(struct vrrp_vr * vr)
+ {
+ struct ether_addr ethaddr;
++ int returnCode = 0;
++ int counter = 0;
+
+ vrrp_thread_mutex_lock();
+ vrrp_interface_vripaddr_delete(vr);
+ ethaddr = vrrp_list_get_last(vr);
++ vrrp_thread_mutex_lock_monitor();
+ if (vrrp_interface_down(vr->vr_if->if_name) == -1) {
+ vrrp_thread_mutex_unlock();
+ return -1;
+@@ -112,6 +128,15 @@
+ vrrp_thread_mutex_unlock();
+ return -1;
+ }
++
++ /* Some NICs will reset (eg: bge/em) and wait some seconds before
becoming carrier again */
++ /* So we must wait for carrier */
++ for (counter = 0; (counter < vr->vr_if->carrier_timeout) && (returnCode
!= 1); counter++) {
++ returnCode = vrrp_moncircuit_interface_status(vr->sd,
vr->vr_if->if_name);
++ sleep(1);
++ }
++ vrrp_thread_mutex_unlock_monitor();
++
+ if (vrrp_network_send_gratuitous_arp_ips(vr, ðaddr) == -1)
+ return -1;
+ vrrp_thread_mutex_unlock();
+Index: vrrp_state.h
+--- vrrp_state.h.orig 2003-01-30 12:50:56 +0100
++++ vrrp_state.h 2004-12-26 10:38:24 +0100
+@@ -49,3 +49,5 @@
+ #include "vrrp_define.h"
+ #include "vrrp_proto.h"
+ #include "vrrp_functions.h"
++#include "vrrp_moncircuit.h"
++#include "vrrp_thread.h"
+Index: vrrp_thread.c
+--- vrrp_thread.c.orig 2003-01-30 12:50:56 +0100
++++ vrrp_thread.c 2004-12-26 10:38:24 +0100
+@@ -36,7 +36,7 @@
+ #include "vrrp_thread.h"
+ #include "vrrp_moncircuit.h"
+
+-pthread_mutex_t pth_mutex, pth_mutex_bpf;
++pthread_mutex_t pth_mutex, pth_mutex_bpf, pth_mutex_monitor;
+
+ void
+ vrrp_thread_mutex_lock(void)
+@@ -70,8 +70,22 @@
+ return;
+ }
+
++void vrrp_thread_mutex_lock_monitor(void)
++{
++ pthread_mutex_lock(&pth_mutex_monitor);
++
++ return;
++}
++
++void vrrp_thread_mutex_unlock_monitor(void)
++{
++ pthread_mutex_unlock(&pth_mutex_monitor);
++
++ return;
++}
++
+ void
+-vrrp_thread_launch_vrrprouter(int *args)
++vrrp_thread_launch_vrrprouter(void *args[2])
+ {
+ struct vrrp_vr *vr = (struct vrrp_vr *)args[0];
+ sem_t *sem = (sem_t *)args[1];
+@@ -116,9 +130,9 @@
+ vrrp_thread_create_vrid(struct vrrp_vr * vr)
+ {
+ pthread_t pth;
+- pthread_attr_t pth_attr = NULL;
++ pthread_attr_t pth_attr;
+ sem_t sem;
+- int *args[2];
++ void *args[2];
+
+ if (sem_init(&sem, 0, 0) == -1) {
+ syslog(LOG_ERR, "can't initialize an unnamed semaphore [ SEM,
0, 0 ]");
+@@ -132,8 +146,8 @@
+ syslog(LOG_ERR, "can't set thread attributes [ PTH_ATTR,
PTHREAD_CREATE_DETACHED ]");
+ return -1;
+ }
+- args[0] = (int *)vr;
+- args[1] = (int *)&sem;
++ args[0] = vr;
++ args[1] = &sem;
+ if (pthread_create(&pth, &pth_attr, (void
*)&vrrp_thread_launch_vrrprouter, args) != 0) {
+ syslog(LOG_ERR, "can't create new thread [ PTH, PTH_ATTR,
VRRP_THREAD_READ_SOCKET ]");
+ return -1;
+@@ -147,10 +161,10 @@
+ int vrrp_thread_create_moncircuit(void)
+ {
+ pthread_t pth;
+- pthread_attr_t pth_attr = NULL;
++ pthread_attr_t pth_attr;
+ sem_t sem;
+ int delay = VRRP_MONCIRCUIT_MONDELAY;
+- int *args[2];
++ void *args[2];
+
+ if (sem_init(&sem, 0, 0) == -1) {
+ syslog(LOG_ERR, "can't initialize an unnamed semaphore [ SEM,
0, 0 ]");
+@@ -164,8 +178,8 @@
+ syslog(LOG_ERR, "can't set thread attributes [ PTH_ATTR,
PTHREAD_CREATE_DETACHED ]");
+ return -1;
+ }
+- args[0] = (int *)&delay;
+- args[1] = (int *)&sem;
++ args[0] = &delay;
++ args[1] = &sem;
+ if (pthread_create(&pth, &pth_attr, (void
*)&vrrp_moncircuit_monitor_thread, args) != 0) {
+ syslog(LOG_ERR, "can't create new thread [ PTH, PTH_ATTR,
VRRP_THREAD_READ_SOCKET ]");
+ return -1;
+Index: vrrp_thread.h
+--- vrrp_thread.h.orig 2003-01-30 12:50:56 +0100
++++ vrrp_thread.h 2004-12-26 10:38:24 +0100
+@@ -46,5 +46,7 @@
+
+ /* Functions */
+ int vrrp_thread_create_moncircuit(void);
++void vrrp_thread_mutex_lock_monitor(void);
++void vrrp_thread_mutex_unlock_monitor(void);
+
+ #endif
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/vrrpd/vrrpd.spec
============================================================================
$ cvs diff -u -r1.34 -r1.35 vrrpd.spec
--- openpkg-src/vrrpd/vrrpd.spec 26 Oct 2004 17:41:17 -0000 1.34
+++ openpkg-src/vrrpd/vrrpd.spec 26 Dec 2004 09:45:10 -0000 1.35
@@ -36,7 +36,7 @@
Group: Network
License: BSD
Version: 0.8.7
-Release: 20041026
+Release: 20041226
# package options
%option with_fsl yes
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [email protected]