Commit 4bd49851 authored by ml's avatar ml

Added support for net version 7

parent d24baefa
...@@ -65,6 +65,7 @@ static void sendVolumes (gdb_sNode*, pool_tRef); ...@@ -65,6 +65,7 @@ static void sendVolumes (gdb_sNode*, pool_tRef);
static void sendVolumesR (gdb_sNode*, net_sVolumes*, unsigned int); static void sendVolumesR (gdb_sNode*, net_sVolumes*, unsigned int);
static void volumes (qcom_sGet*); static void volumes (qcom_sGet*);
static void volumesR (qcom_sGet*); static void volumesR (qcom_sGet*);
static void volumes7 (qcom_sGet*);
#if 0 #if 0
static void linkEvent (pwr_tUInt32, net_eEvent); static void linkEvent (pwr_tUInt32, net_eEvent);
static void sendIdAck (gdb_sNode*); static void sendIdAck (gdb_sNode*);
...@@ -74,7 +75,7 @@ static void volumesR (qcom_sGet*); ...@@ -74,7 +75,7 @@ static void volumesR (qcom_sGet*);
/* Dispatcher for 'net_cMsgClass' messages. */ /* Dispatcher for 'net_cMsgClass' messages. */
static char *cMsg[net_eMsg_] = { static char *cMsg[net_eMsg_end] = {
"error", "error",
"id", "id",
"idAck", "idAck",
...@@ -104,9 +105,11 @@ static char *cMsg[net_eMsg_] = { ...@@ -104,9 +105,11 @@ static char *cMsg[net_eMsg_] = {
"getCclass", "getCclass",
"getCclassR", "getCclassR",
"getGclass", "getGclass",
"getGclassR" "getGclassR",
"net_eMsg_",
"volumes7"
}; };
static void (*fromApplication[net_eMsg_])(qcom_sGet *) = { static void (*fromApplication[net_eMsg_end])(qcom_sGet *) = {
netError, netError,
id, id,
id, id,
...@@ -136,7 +139,9 @@ static void (*fromApplication[net_eMsg_])(qcom_sGet *) = { ...@@ -136,7 +139,9 @@ static void (*fromApplication[net_eMsg_])(qcom_sGet *) = {
cmvolsm_GetCclass, cmvolsm_GetCclass,
bugError, /* net_eMsg_GetCclassR will never reach neth */ bugError, /* net_eMsg_GetCclassR will never reach neth */
cmvolsm_GetGclass, cmvolsm_GetGclass,
bugError /* net_eMsg_GetGclassR will never reach neth */ bugError, /* net_eMsg_GetGclassR will never reach neth */
bugError, /* net_eMsg_ */
volumes7
}; };
int int
...@@ -417,6 +422,7 @@ id ( ...@@ -417,6 +422,7 @@ id (
gdb_sNode *np; gdb_sNode *np;
gdb_sNode *nid_np; gdb_sNode *nid_np;
net_eEvent event; net_eEvent event;
pwr_tBoolean cclassSupport = TRUE;
gdb_AssumeUnlocked; gdb_AssumeUnlocked;
...@@ -439,12 +445,26 @@ id ( ...@@ -439,12 +445,26 @@ id (
return; return;
} }
if (mp->node.netver != net_cVersion) { if (mp->node.netver != net_cVersion) {
errh_Error("Proview net protocol version differs, '%s' ignored version: %d, node: %s", if (mp->node.netver == 7) {
cMsg[get->type.s], mp->node.netver, cclassSupport = FALSE;
cdh_NodeIdToString(NULL, get->sender.nid, 0, 0)); errh_Warning("Accepting older net protocol version, '%s' old version: %d, my version: %d, node: %s",
return; cMsg[get->type.s], mp->node.netver, net_cVersion,
cdh_NodeIdToString(NULL, get->sender.nid, 0, 0));
} else if (mp->node.netver > net_cVersion) {
errh_Warning("Accepting newer net protocol version, '%s' new version: %d, my version: %d, node: %s",
cMsg[get->type.s], mp->node.netver, net_cVersion,
cdh_NodeIdToString(NULL, get->sender.nid, 0, 0));
} else {
errh_Error("Proview net protocol version not supported, '%s' ignored version: %d, my version: %d, node: %s",
cMsg[get->type.s], mp->node.netver, net_cVersion,
cdh_NodeIdToString(NULL, get->sender.nid, 0, 0));
return;
}
} }
if (get->type.s == net_eMsg_id) if (get->type.s == net_eMsg_id)
event = net_eEvent_id; event = net_eEvent_id;
else else
...@@ -457,6 +477,8 @@ id ( ...@@ -457,6 +477,8 @@ id (
nid_np = hash_Search(&sts, gdbroot->nid_ht, &mp->hdr.nid); nid_np = hash_Search(&sts, gdbroot->nid_ht, &mp->hdr.nid);
if (nid_np == NULL) { if (nid_np == NULL) {
np->nid = mp->hdr.nid; np->nid = mp->hdr.nid;
np->netver = mp->node.netver;
np->cclassSupport = cclassSupport;
hash_Insert(&sts, gdbroot->nid_ht, np); hash_Insert(&sts, gdbroot->nid_ht, np);
} else if (nid_np != np ) { } else if (nid_np != np ) {
errh_Warning("New node (%s), attempts to appear as node (%s), '%s' ignored...", errh_Warning("New node (%s), attempts to appear as node (%s), '%s' ignored...",
...@@ -840,6 +862,7 @@ sendVolumes ( ...@@ -840,6 +862,7 @@ sendVolumes (
{ {
pwr_tStatus sts; pwr_tStatus sts;
net_sVolumes *mp; net_sVolumes *mp;
net_sVolumes7 *m7p;
qcom_sQid tgt; qcom_sQid tgt;
pwr_tUInt32 size; pwr_tUInt32 size;
int i; int i;
...@@ -848,6 +871,8 @@ sendVolumes ( ...@@ -848,6 +871,8 @@ sendVolumes (
pool_sQlink *vlStart; pool_sQlink *vlStart;
gdb_sVolume *vp; gdb_sVolume *vp;
int maxVol = ((net_cSizeLarge - sizeof(*mp)) / sizeof(mp->g[0])) + 1; int maxVol = ((net_cSizeLarge - sizeof(*mp)) / sizeof(mp->g[0])) + 1;
pwr_tBoolean cclassSupport;
net_eMsg msgtype;
if (gdbroot->db->log.b.messages) { if (gdbroot->db->log.b.messages) {
errh_Info("Sending 'volumes' to %s (%s)", errh_Info("Sending 'volumes' to %s (%s)",
...@@ -856,6 +881,8 @@ sendVolumes ( ...@@ -856,6 +881,8 @@ sendVolumes (
gdb_ScopeLock { gdb_ScopeLock {
cclassSupport = np->cclassSupport;
if (vr == pool_cNRef) { if (vr == pool_cNRef) {
vlStart = pool_Qsucc(NULL, gdbroot->pool, &gdbroot->my_node->own_lh); vlStart = pool_Qsucc(NULL, gdbroot->pool, &gdbroot->my_node->own_lh);
} else { } else {
...@@ -867,20 +894,43 @@ sendVolumes ( ...@@ -867,20 +894,43 @@ sendVolumes (
for ( for (
nVol = 0, vl = vlStart; nVol = 0, vl = vlStart;
nVol < maxVol && vl != &gdbroot->my_node->own_lh; nVol < maxVol && vl != &gdbroot->my_node->own_lh;
nVol++, vl = pool_Qsucc(NULL, gdbroot->pool, vl) vl = pool_Qsucc(NULL, gdbroot->pool, vl)
); ) {
if (!cclassSupport) {
vp = pool_Qitem(vl, gdb_sVolume, l.own_ll);
if (vp->l.flags.b.classvol)
continue;
}
nVol++;
}
size = sizeof(*mp) + ((nVol - 1) * sizeof(mp->g[0])); if (!cclassSupport)
size = sizeof(*m7p) + ((nVol - 1) * sizeof(m7p->g[0]));
else
size = sizeof(*mp) + ((nVol - 1) * sizeof(mp->g[0]));
mp = (net_sVolumes *) malloc(size); mp = (net_sVolumes *) malloc(size);
if (mp == NULL) break; if (mp == NULL) break;
m7p = (net_sVolumes7 *) mp;
for ( for (
i = 0, vl = vlStart; i = 0, vl = vlStart;
i < nVol && vl != &gdbroot->my_node->own_lh; i < nVol && vl != &gdbroot->my_node->own_lh;
i++, vl = pool_Qsucc(NULL, gdbroot->pool, vl) vl = pool_Qsucc(NULL, gdbroot->pool, vl)
) { ) {
vp = pool_Qitem(vl, gdb_sVolume, l.own_ll); vp = pool_Qitem(vl, gdb_sVolume, l.own_ll);
mp->g[i] = vp->g;
if (!cclassSupport) {
if (vp->l.flags.b.classvol)
continue;
else {
memcpy(&m7p->g[i], &vp->g, sizeof(m7p->g[0]));
}
} else
mp->g[i] = vp->g;
i++;
} }
mp->count = i; mp->count = i;
...@@ -900,7 +950,12 @@ sendVolumes ( ...@@ -900,7 +950,12 @@ sendVolumes (
tgt.nid = np->nid; tgt.nid = np->nid;
tgt.qix = net_cProcHandler; tgt.qix = net_cProcHandler;
if (!net_Put(&sts, &tgt, mp, net_eMsg_volumes, size)) if (!cclassSupport)
msgtype = net_eMsg_volumes7;
else
msgtype = net_eMsg_volumes;
if (!net_Put(&sts, &tgt, mp, msgtype, size))
errh_Error("Sending 'volumes' to %s (%s)\n%m", errh_Error("Sending 'volumes' to %s (%s)\n%m",
np->name, cdh_NodeIdToString(NULL, np->nid, 0, 0), sts); np->name, cdh_NodeIdToString(NULL, np->nid, 0, 0), sts);
...@@ -1016,6 +1071,57 @@ volumes ( ...@@ -1016,6 +1071,57 @@ volumes (
if (vmp->ctx == pool_cNRef) if (vmp->ctx == pool_cNRef)
nodeUp(np); nodeUp(np);
} }
/* Receive a list of all volumes owned by the sending node.
* Neth version 7 of net_sVolumes
*/
static void
volumes7 (
qcom_sGet *get
)
{
net_sVolumes7 *v7mp = (net_sVolumes7 *) get->data;
net_sVolumes *vmp;
void *origdata;
int i;
int size;
pwr_tBoolean ok = 1;
size = sizeof(*vmp) + ((v7mp->count - 1) * sizeof(vmp->g[0]));
vmp = (net_sVolumes *) malloc(size);
if (vmp == NULL) {
errh_Error("Failed to allocate 'volumes7' from nid %d, count %d",
get->sender.nid, v7mp->count);
return;
}
for (i = 0; i < v7mp->count; i++) {
if (v7mp->g[i].cid == pwr_eClass_ClassVolume) {
/* this should never happen */
errh_Error("Node, nid %d, net version 7 sent Class Volumes",
get->sender.nid);
ok = 0;
break;
} else {
memcpy(&vmp->g[i], &v7mp->g[i], sizeof(v7mp->g[0]));
/* The time is only used for class volumes */
memset(&vmp->g[i].time, 0, sizeof(vmp->g[0].time));
}
}
if (ok) {
origdata = get->data;
get->data = vmp;
volumes(get);
get->data = origdata;
}
free(vmp);
}
/* Receive a list of all volumes the remote node have mounted. */ /* Receive a list of all volumes the remote node have mounted. */
...@@ -1050,6 +1156,7 @@ volumesR ( ...@@ -1050,6 +1156,7 @@ volumesR (
sendVolumes(np, mp->ctx); sendVolumes(np, mp->ctx);
} }
#if 0 #if 0
/* This is the link state machine /* This is the link state machine
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment