User space +-------+ | CARPd | <-----> Other apps +---+---+ | | - netlink to control ARP LB action | - netlink to talk to ct_sync | - netlink to control QoS rules | - PF_PACKET or raw socket to send/rcv CARP pkts | ----------------------------------- Kernel network I/O etc Apps interface to Carpd to send CARP encapulated packets i was talking about earlier. With that thought lest redraw the diagram: User space +-------+ +-------+ +---------+ | App#X | <-----> | CARPd | <-----> | ctsyncd | +---+---+ +---+---+ +---+-----+ | | | | ------------------------------------------ Kernel network I/O etc So now ct_sync control is not owned by carpd. Rather. ctsync listens to the netlink msgs from the kernel, builds an app msg, passes it carpd which will send it if state is right. Note such a mesage which can be used by apps doesnt exist today, it would need to be defined. Apps could also register callbacks for events such as mastership transitions.