10 #include "ipcsocket.h"
13 void write_buffer(void *buffer
, unsigned long len
)
16 unsigned char *ptr
= (unsigned char *)buffer
;
19 fprintf(stderr
, "<%s>: Invalid buffer...\n", __func__
);
23 printf("Fill buffer content:\n");
24 memset(ptr
, 0xfd, len
);
25 for (i
= 0; i
< len
; i
++)
26 printf("0x%x ", ptr
[i
]);
30 void read_buffer(void *buffer
, unsigned long len
)
33 unsigned char *ptr
= (unsigned char *)buffer
;
36 fprintf(stderr
, "<%s>: Invalid buffer...\n", __func__
);
40 printf("Read buffer content:\n");
41 for (i
= 0; i
< len
; i
++)
42 printf("0x%x ", ptr
[i
]);
46 int ion_export_buffer_fd(struct ion_buffer_info
*ion_info
)
48 int i
, ret
, ionfd
, buffer_fd
;
51 unsigned char *map_buffer
;
52 struct ion_allocation_data alloc_data
;
53 struct ion_heap_query query
;
54 struct ion_heap_data heap_data
[MAX_HEAP_COUNT
];
57 fprintf(stderr
, "<%s>: Invalid ion info\n", __func__
);
61 /* Create an ION client */
62 ionfd
= open(ION_DEVICE
, O_RDWR
);
64 fprintf(stderr
, "<%s>: Failed to open ion client: %s\n",
65 __func__
, strerror(errno
));
69 memset(&query
, 0, sizeof(query
));
70 query
.cnt
= MAX_HEAP_COUNT
;
71 query
.heaps
= (unsigned long int)&heap_data
[0];
72 /* Query ION heap_id_mask from ION heap */
73 ret
= ioctl(ionfd
, ION_IOC_HEAP_QUERY
, &query
);
75 fprintf(stderr
, "<%s>: Failed: ION_IOC_HEAP_QUERY: %s\n",
76 __func__
, strerror(errno
));
80 heap_id
= MAX_HEAP_COUNT
+ 1;
81 for (i
= 0; i
< query
.cnt
; i
++) {
82 if (heap_data
[i
].type
== ion_info
->heap_type
) {
83 printf("--------------------------------------\n");
84 printf("heap type: %d\n", heap_data
[i
].type
);
85 printf(" heap id: %d\n", heap_data
[i
].heap_id
);
86 printf("heap name: %s\n", heap_data
[i
].name
);
87 printf("--------------------------------------\n");
88 heap_id
= heap_data
[i
].heap_id
;
93 if (heap_id
> MAX_HEAP_COUNT
) {
94 fprintf(stderr
, "<%s>: ERROR: heap type does not exists\n",
99 alloc_data
.len
= ion_info
->heap_size
;
100 alloc_data
.heap_id_mask
= 1 << heap_id
;
101 alloc_data
.flags
= ion_info
->flag_type
;
103 /* Allocate memory for this ION client as per heap_type */
104 ret
= ioctl(ionfd
, ION_IOC_ALLOC
, &alloc_data
);
106 fprintf(stderr
, "<%s>: Failed: ION_IOC_ALLOC: %s\n",
107 __func__
, strerror(errno
));
111 /* This will return a valid buffer fd */
112 buffer_fd
= alloc_data
.fd
;
113 maplen
= alloc_data
.len
;
115 if (buffer_fd
< 0 || maplen
<= 0) {
116 fprintf(stderr
, "<%s>: Invalid map data, fd: %d, len: %ld\n",
117 __func__
, buffer_fd
, maplen
);
121 /* Create memory mapped buffer for the buffer fd */
122 map_buffer
= (unsigned char *)mmap(NULL
, maplen
, PROT_READ
|PROT_WRITE
,
123 MAP_SHARED
, buffer_fd
, 0);
124 if (map_buffer
== MAP_FAILED
) {
125 fprintf(stderr
, "<%s>: Failed: mmap: %s\n",
126 __func__
, strerror(errno
));
130 ion_info
->ionfd
= ionfd
;
131 ion_info
->buffd
= buffer_fd
;
132 ion_info
->buffer
= map_buffer
;
133 ion_info
->buflen
= maplen
;
137 munmap(map_buffer
, maplen
);
141 /* in case of error: close the buffer fd */
148 /* In case of error: close the ion client fd */
155 int ion_import_buffer_fd(struct ion_buffer_info
*ion_info
)
158 unsigned char *map_buf
;
159 unsigned long map_len
;
162 fprintf(stderr
, "<%s>: Invalid ion info\n", __func__
);
166 map_len
= ion_info
->buflen
;
167 buffd
= ion_info
->buffd
;
169 if (buffd
< 0 || map_len
<= 0) {
170 fprintf(stderr
, "<%s>: Invalid map data, fd: %d, len: %ld\n",
171 __func__
, buffd
, map_len
);
175 map_buf
= (unsigned char *)mmap(NULL
, map_len
, PROT_READ
|PROT_WRITE
,
176 MAP_SHARED
, buffd
, 0);
177 if (map_buf
== MAP_FAILED
) {
178 printf("<%s>: Failed - mmap: %s\n",
179 __func__
, strerror(errno
));
183 ion_info
->buffer
= map_buf
;
184 ion_info
->buflen
= map_len
;
196 void ion_close_buffer_fd(struct ion_buffer_info
*ion_info
)
199 /* unmap the buffer properly in the end */
200 munmap(ion_info
->buffer
, ion_info
->buflen
);
201 /* close the buffer fd */
202 if (ion_info
->buffd
> 0)
203 close(ion_info
->buffd
);
204 /* Finally, close the client fd */
205 if (ion_info
->ionfd
> 0)
206 close(ion_info
->ionfd
);
207 printf("<%s>: buffer release successfully....\n", __func__
);
211 int socket_send_fd(struct socket_info
*info
)
215 struct socketdata skdata
;
218 fprintf(stderr
, "<%s>: Invalid socket info\n", __func__
);
222 sockfd
= info
->sockfd
;
224 memset(&skdata
, 0, sizeof(skdata
));
226 skdata
.len
= sizeof(skdata
.data
);
227 status
= sendtosocket(sockfd
, &skdata
);
229 fprintf(stderr
, "<%s>: Failed: sendtosocket\n", __func__
);
236 int socket_receive_fd(struct socket_info
*info
)
240 struct socketdata skdata
;
243 fprintf(stderr
, "<%s>: Invalid socket info\n", __func__
);
247 sockfd
= info
->sockfd
;
248 memset(&skdata
, 0, sizeof(skdata
));
249 status
= receivefromsocket(sockfd
, &skdata
);
251 fprintf(stderr
, "<%s>: Failed: receivefromsocket\n", __func__
);
255 fd
= (int)skdata
.data
;