sent to a node to make it take over an ip address
*/
int ctdb_ctrl_takeover_ip(struct ctdb_context *ctdb, struct timeval timeout,
- uint32_t destnode, const char *ip)
+ uint32_t destnode, struct ctdb_public_ip *ip)
{
TDB_DATA data;
int ret;
int32_t res;
- struct sockaddr sa;
- struct sockaddr_in *sin = (struct sockaddr_in *)&sa;
- ZERO_STRUCT(sa);
-#ifdef HAVE_SOCK_SIN_LEN
- sin->sin_len = sizeof(*sin);
-#endif
- sin->sin_family = AF_INET;
- inet_aton(ip, &sin->sin_addr);
-
- data.dsize = sizeof(sa);
- data.dptr = (uint8_t *)&sa;
+ data.dsize = sizeof(*ip);
+ data.dptr = (uint8_t *)ip;
ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_TAKEOVER_IP, 0, data, NULL,
NULL, &res, &timeout, NULL);
sent to a node to make it release an ip address
*/
int ctdb_ctrl_release_ip(struct ctdb_context *ctdb, struct timeval timeout,
- uint32_t destnode, const char *ip)
+ uint32_t destnode, struct ctdb_public_ip *ip)
{
TDB_DATA data;
int ret;
int32_t res;
- struct sockaddr sa;
- struct sockaddr_in *sin = (struct sockaddr_in *)&sa;
-
- ZERO_STRUCT(sa);
-#ifdef HAVE_SOCK_SIN_LEN
- sin->sin_len = sizeof(*sin);
-#endif
- sin->sin_family = AF_INET;
- inet_aton(ip, &sin->sin_addr);
-
- data.dsize = sizeof(sa);
- data.dptr = (uint8_t *)&sa;
+
+ data.dsize = sizeof(*ip);
+ data.dptr = (uint8_t *)ip;
ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_RELEASE_IP, 0, data, NULL,
NULL, &res, &timeout, NULL);
return ctdb_control_set_rsn_nonempty(ctdb, indata, outdata);
case CTDB_CONTROL_TAKEOVER_IP:
- CHECK_CONTROL_DATA_SIZE(sizeof(struct sockaddr));
+ CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_public_ip));
return ctdb_control_takeover_ip(ctdb, c, indata, async_reply);
case CTDB_CONTROL_RELEASE_IP:
- CHECK_CONTROL_DATA_SIZE(sizeof(struct sockaddr));
+ CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_public_ip));
return ctdb_control_release_ip(ctdb, c, indata, async_reply);
case CTDB_CONTROL_DELETE_LOW_RSN:
struct ctdb_req_control *c,
TDB_DATA indata,
bool *async_reply);
-int ctdb_ctrl_takeover_ip(struct ctdb_context *ctdb, struct timeval timeout,
- uint32_t destnode, const char *ip);
int32_t ctdb_control_release_ip(struct ctdb_context *ctdb,
struct ctdb_req_control *c,
TDB_DATA indata,
bool *async_reply);
+
+struct ctdb_public_ip {
+ uint32_t vnn;
+ uint32_t takeover_vnn;
+ struct sockaddr_in sin;
+};
+int ctdb_ctrl_takeover_ip(struct ctdb_context *ctdb, struct timeval timeout,
+ uint32_t destnode, struct ctdb_public_ip *ip);
int ctdb_ctrl_release_ip(struct ctdb_context *ctdb, struct timeval timeout,
- uint32_t destnode, const char *ip);
+ uint32_t destnode, struct ctdb_public_ip *ip);
/* from takeover/system.c */
int ctdb_sys_send_arp(const struct sockaddr_in *saddr, const char *iface);
{
int ret;
struct takeover_callback_state *state;
- struct sockaddr_in *sin = (struct sockaddr_in *)indata.dptr;
- char *ip = inet_ntoa(sin->sin_addr);
+ struct ctdb_public_ip *pip = (struct ctdb_public_ip *)indata.dptr;
+ char *ip = inet_ntoa(pip->sin.sin_addr);
+
+
+ /* update out node table */
+ ctdb->nodes[pip->vnn]->takeover_vnn = pip->takeover_vnn;
/* if our kernel already has this IP, do nothing */
if (ctdb_sys_have_ip(ip)) {
{
int ret;
struct takeover_callback_state *state;
- struct sockaddr_in *sin = (struct sockaddr_in *)indata.dptr;
- char *ip = inet_ntoa(sin->sin_addr);
+ struct ctdb_public_ip *pip = (struct ctdb_public_ip *)indata.dptr;
+ char *ip = inet_ntoa(pip->sin.sin_addr);
+
+ /* update out node table */
+ ctdb->nodes[pip->vnn]->takeover_vnn = pip->takeover_vnn;
if (!ctdb_sys_have_ip(ip)) {
return 0;
{
int i, j;
int ret;
+ struct ctdb_public_ip ip;
/* work out which node will look after each public IP */
for (i=0;i<nodemap->num;i++) {
/* tell this node to delete all of the aliases that it should not have */
for (j=0;j<nodemap->num;j++) {
if (ctdb->nodes[j]->takeover_vnn != nodemap->nodes[i].vnn) {
+ ip.vnn = j;
+ ip.takeover_vnn = ctdb->nodes[j]->takeover_vnn;
+#ifdef HAVE_SOCK_SIN_LEN
+ ip.sin.sin_len = sizeof(*sin);
+#endif
+ ip.sin.sin_family = AF_INET;
+ inet_aton(ctdb->nodes[j]->public_address, &ip.sin.sin_addr);
+
ret = ctdb_ctrl_release_ip(ctdb, TAKEOVER_TIMEOUT(),
nodemap->nodes[i].vnn,
- ctdb->nodes[j]->public_address);
+ &ip);
if (ret != 0) {
DEBUG(0,("Failed to tell vnn %u to release IP %s\n",
nodemap->nodes[i].vnn,
/* this IP won't be taken over */
continue;
}
+ ip.vnn = i;
+ ip.takeover_vnn = ctdb->nodes[i]->takeover_vnn;
+#ifdef HAVE_SOCK_SIN_LEN
+ ip.sin.sin_len = sizeof(*sin);
+#endif
+ ip.sin.sin_family = AF_INET;
+ inet_aton(ctdb->nodes[i]->public_address, &ip.sin.sin_addr);
+
ret = ctdb_ctrl_takeover_ip(ctdb, TAKEOVER_TIMEOUT(),
ctdb->nodes[i]->takeover_vnn,
- ctdb->nodes[i]->public_address);
+ &ip);
if (ret != 0) {
DEBUG(0,("Failed asking vnn %u to take over IP %s\n",
ctdb->nodes[i]->takeover_vnn,