Line data Source code
1 : /*
2 : * vr_dpdk_filestore.c - implements a persistent store
3 : * to store/retrieve the VM feature set.
4 : *
5 : * Copyright (c) 2018 Juniper Networks, Inc. All rights reserved.
6 : * Copyright Contributors to the OpenSDN project
7 : */
8 :
9 : #include <fcntl.h>
10 : #include <sys/types.h>
11 : #include <sys/stat.h>
12 : #include <unistd.h>
13 : #include <errno.h>
14 :
15 : #include "vr_dpdk.h"
16 : #define FEATURE_STORE_PATH "/var/lib/contrail/vm_feature"
17 :
18 0 : int vr_dpdk_store_persist_feature(char *tapdev_name, unsigned long feature_set)
19 : {
20 : char fname[NAME_MAX];
21 : struct stat fstat;
22 : FILE *fp;
23 :
24 0 : if (stat(FEATURE_STORE_PATH, &fstat) != 0) {
25 0 : if (mkdir(FEATURE_STORE_PATH, 0755) < 0) {
26 0 : RTE_LOG(ERR, USOCK, "mkdir failed with error %d\n", errno);
27 0 : return -1;
28 : }
29 : }
30 :
31 0 : if (snprintf(fname, NAME_MAX, FEATURE_STORE_PATH"/%s", tapdev_name) < 0)
32 0 : return -1;
33 :
34 : RTE_LOG_DP(DEBUG, USOCK, "Write persistent feature %s\n", fname);
35 :
36 0 : fp = fopen(fname, "w");
37 0 : if (fp == NULL) {
38 0 : return -1;
39 : }
40 0 : rewind(fp);
41 0 : fprintf(fp, "%016lx", feature_set);
42 0 : fclose(fp);
43 0 : return 0;
44 : }
45 :
46 0 : int vr_dpdk_load_persist_feature(char *tapdev_name, unsigned long *feature_set)
47 : {
48 : char fname[NAME_MAX];
49 : struct stat fstat;
50 : FILE *fp;
51 :
52 0 : if (stat(FEATURE_STORE_PATH, &fstat) != 0) {
53 0 : if (mkdir(FEATURE_STORE_PATH, 0755) < 0) {
54 0 : RTE_LOG(ERR, USOCK, "mkdir failed with error %d\n", errno);
55 0 : return -1;
56 : }
57 : }
58 :
59 0 : if (snprintf(fname, NAME_MAX, FEATURE_STORE_PATH"/%s", tapdev_name) < 0)
60 0 : return -1;
61 :
62 : RTE_LOG_DP(DEBUG, USOCK, "Read persistent feature %s\n", fname);
63 :
64 0 : if (stat(fname, &fstat) == 0) {
65 0 : fp = fopen(fname, "r");
66 0 : if (fp == NULL) {
67 0 : return -1;
68 : }
69 0 : rewind(fp);
70 0 : if(fscanf(fp, "%016lx", feature_set) == EOF) {
71 0 : if (errno) {
72 0 : RTE_LOG(ERR, USOCK, "EOF reached with error %d for tapdev %s\n",
73 : errno, tapdev_name);
74 0 : fclose(fp);
75 0 : return -1;
76 : }
77 : }
78 : RTE_LOG_DP(DEBUG, USOCK, "Feature Set Read %lx for tapdev %s\n",
79 : *feature_set, tapdev_name);
80 0 : fclose(fp);
81 0 : return 0;
82 : } else {
83 0 : return -1;
84 : }
85 : }
86 :
87 0 : void vr_dpdk_del_persist_feature(char *tapdev_name)
88 : {
89 : char fname[NAME_MAX];
90 : struct stat fstat;
91 :
92 0 : if (snprintf(fname, NAME_MAX, FEATURE_STORE_PATH"/%s", tapdev_name) < 0)
93 0 : return;
94 :
95 0 : if (stat(fname, &fstat) == 0) {
96 0 : if(unlink(fname)) {
97 0 : RTE_LOG(ERR, USOCK, "Error deleting file %d for tapdev %s\n",
98 : errno, tapdev_name);
99 : }
100 : }
101 : }
|