| 1000 | } |
| 1001 | |
| 1002 | int |
| 1003 | memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) |
| 1004 | { |
| 1005 | struct pmd_internals *pmd = dev->data->dev_private; |
| 1006 | struct memif_socket *socket = NULL; |
| 1007 | struct memif_socket_dev_list_elt *elt; |
| 1008 | struct pmd_internals *tmp_pmd; |
| 1009 | struct rte_hash *hash; |
| 1010 | int ret; |
| 1011 | char key[MEMIF_SOCKET_UN_SIZE]; |
| 1012 | |
| 1013 | hash = rte_hash_find_existing(MEMIF_SOCKET_HASH_NAME); |
| 1014 | if (hash == NULL) { |
| 1015 | hash = memif_create_socket_hash(); |
| 1016 | if (hash == NULL) { |
| 1017 | MIF_LOG(ERR, "Failed to create memif socket hash."); |
| 1018 | return -1; |
| 1019 | } |
| 1020 | } |
| 1021 | |
| 1022 | memset(key, 0, MEMIF_SOCKET_UN_SIZE); |
| 1023 | strlcpy(key, socket_filename, MEMIF_SOCKET_UN_SIZE); |
| 1024 | ret = rte_hash_lookup_data(hash, key, (void **)&socket); |
| 1025 | if (ret < 0) { |
| 1026 | socket = memif_socket_create(key, |
| 1027 | (pmd->role == MEMIF_ROLE_CLIENT) ? 0 : 1, |
| 1028 | pmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT, |
| 1029 | pmd->owner_uid, pmd->owner_gid); |
| 1030 | if (socket == NULL) |
| 1031 | return -1; |
| 1032 | ret = rte_hash_add_key_data(hash, key, socket); |
| 1033 | if (ret < 0) { |
| 1034 | MIF_LOG(ERR, "Failed to add socket to socket hash."); |
| 1035 | return ret; |
| 1036 | } |
| 1037 | } |
| 1038 | pmd->socket_filename = socket->filename; |
| 1039 | |
| 1040 | TAILQ_FOREACH(elt, &socket->dev_queue, next) { |
| 1041 | tmp_pmd = elt->dev->data->dev_private; |
| 1042 | if (tmp_pmd->id == pmd->id && tmp_pmd->role == pmd->role) { |
| 1043 | MIF_LOG(ERR, "Two interfaces with the same id (%d) can " |
| 1044 | "not have the same role.", pmd->id); |
| 1045 | return -1; |
| 1046 | } |
| 1047 | } |
| 1048 | |
| 1049 | elt = rte_malloc("pmd-queue", sizeof(struct memif_socket_dev_list_elt), 0); |
| 1050 | if (elt == NULL) { |
| 1051 | MIF_LOG(ERR, "Failed to add device to socket device list."); |
| 1052 | return -1; |
| 1053 | } |
| 1054 | elt->dev = dev; |
| 1055 | TAILQ_INSERT_TAIL(&socket->dev_queue, elt, next); |
| 1056 | |
| 1057 | return 0; |
| 1058 | } |
| 1059 |
no test coverage detected