git: carp: Make carp interfaces work like ethernet interfaces
Sepherosa Ziehau
sephe at crater.dragonflybsd.org
Tue Jan 31 22:27:34 PST 2012
commit 24c6e413b468b125c85ed0ae5010dddd6de548ee
Author: Sepherosa Ziehau <sephe at dragonflybsd.org>
Date: Mon Jan 23 16:19:06 2012 +0800
carp: Make carp interfaces work like ethernet interfaces
- Use ether_ifattach() instead of if_attach() to attach carp and carp's
ioctl methed will fallback to ether_ioctl().
- VHID changes will be reflected into the carp's ethernet address.
- Reimplement carp output path.
* carp uses the parent's if_output() i.e. ether_output(), but passes
the carp interface's ifp.
* The ether_output() is adjusted to detect the carp interface and
switch to the carp's parent interface just before performing the
real output.
* ARP resolve will use carp instead of its parent interface, thus
the ARP output's source ethernet address and the sender hardware
address are consistent and loopback on the carp will work as
expected.
- Reimplement carp input path>
* Input interface will be changed to carp if the packet is destined
to the carp's ethernet address.
* If the received packet is broadcast or multicast, all of the carps
on the receiving interface will receive a copy of the packet.
- Fix up gratuitous ARP.
* No gratuitous ARP will be sent for carp upon IP address changes.
* Gratuitous ARP sent by carp use itself as interface not carp's
parent interface.
- Fix up ARP input path. Since ARP request is broadcast packet, parent
interface of the carp will also receive the packet and will reply the
ARP request. If carp and its parent interface have same IP address,
the parent's ARP reply will confuse the ARP requester: the ethernet
address of the IP is no longer carp's ethernet address.
- Rework carp's prefix route addition and deletion.
* Add IP addresses to carp will not add prefix routes
* Bring carp interface up will not add prefix routes for carp's
existing IP addresses
* Carp IP addresses prefix route will be added when carp is master,
and the parent's corresponding IP addresses prefix route will be
deleted.
* Carp IP addresses prefix route will be deleted when carp is no
longer master and the parent's corresponding IP addresses prefix
route will be added back.
- Handle carp parent interface's up/down events.
* When carp's parent is down, we fake up a parent IP address deletion
event for carp.
* When carp's parent is up, we fake up a parent IP address addition
event for carp.
- Stringent checks on CARP proto input path.
- Nullfy ifnet's serialier; carp is protected by global carp token.
- Mark CARP protocol MPSAFE
Idea-from: OpenBSD
Summary of changes:
sys/net/if_ethersubr.c | 63 ++--
sys/netinet/if_ether.c | 85 ++++--
sys/netinet/if_ether.h | 2 +-
sys/netinet/in.c | 21 ++
sys/netinet/in_proto.c | 8 +-
sys/netinet/ip_carp.c | 753 ++++++++++++++++++++++++++--------------------
sys/netinet/ip_carp.h | 13 +-
sys/netinet/raw_ip.c | 14 +
sys/netinet6/in6_proto.c | 2 +-
9 files changed, 571 insertions(+), 390 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/24c6e413b468b125c85ed0ae5010dddd6de548ee
--
DragonFly BSD source repository
More information about the Commits
mailing list