| 185 | } |
| 186 | |
| 187 | static int |
| 188 | memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg) |
| 189 | { |
| 190 | memif_msg_init_t *i = &msg->init; |
| 191 | struct memif_socket_dev_list_elt *elt; |
| 192 | struct pmd_internals *pmd; |
| 193 | struct rte_eth_dev *dev; |
| 194 | |
| 195 | if (i->version != MEMIF_VERSION) { |
| 196 | memif_msg_enq_disconnect(cc, "Incompatible memif version", 0); |
| 197 | return -1; |
| 198 | } |
| 199 | |
| 200 | if (cc->socket == NULL) { |
| 201 | memif_msg_enq_disconnect(cc, "Device error", 0); |
| 202 | return -1; |
| 203 | } |
| 204 | |
| 205 | /* Find device with requested ID */ |
| 206 | TAILQ_FOREACH(elt, &cc->socket->dev_queue, next) { |
| 207 | dev = elt->dev; |
| 208 | pmd = dev->data->dev_private; |
| 209 | if (((pmd->flags & ETH_MEMIF_FLAG_DISABLED) == 0) && |
| 210 | (pmd->id == i->id) && (pmd->role == MEMIF_ROLE_SERVER)) { |
| 211 | if (pmd->flags & (ETH_MEMIF_FLAG_CONNECTING | |
| 212 | ETH_MEMIF_FLAG_CONNECTED)) { |
| 213 | memif_msg_enq_disconnect(cc, |
| 214 | "Already connected", 0); |
| 215 | return -1; |
| 216 | } |
| 217 | |
| 218 | /* assign control channel to device */ |
| 219 | cc->dev = dev; |
| 220 | pmd->cc = cc; |
| 221 | |
| 222 | if (i->mode != MEMIF_INTERFACE_MODE_ETHERNET) { |
| 223 | memif_msg_enq_disconnect(pmd->cc, |
| 224 | "Only ethernet mode supported", |
| 225 | 0); |
| 226 | return -1; |
| 227 | } |
| 228 | |
| 229 | strlcpy(pmd->remote_name, (char *)i->name, |
| 230 | sizeof(pmd->remote_name)); |
| 231 | |
| 232 | if (*pmd->secret != '\0') { |
| 233 | if (*i->secret == '\0') { |
| 234 | memif_msg_enq_disconnect(pmd->cc, |
| 235 | "Secret required", 0); |
| 236 | return -1; |
| 237 | } |
| 238 | if (strncmp(pmd->secret, (char *)i->secret, |
| 239 | ETH_MEMIF_SECRET_SIZE) != 0) { |
| 240 | memif_msg_enq_disconnect(pmd->cc, |
| 241 | "Incorrect secret", 0); |
| 242 | return -1; |
| 243 | } |
| 244 | } |
no test coverage detected