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 heap_id
= heap_data
[i
].heap_id
;
88 if (heap_id
> MAX_HEAP_COUNT
) {
89 fprintf(stderr
, "<%s>: ERROR: heap type does not exists\n",
94 alloc_data
.len
= ion_info
->heap_size
;
95 alloc_data
.heap_id_mask
= 1 << heap_id
;
96 alloc_data
.flags
= ion_info
->flag_type
;
98 /* Allocate memory for this ION client as per heap_type */
99 ret
= ioctl(ionfd
, ION_IOC_ALLOC
, &alloc_data
);
101 fprintf(stderr
, "<%s>: Failed: ION_IOC_ALLOC: %s\n",
102 __func__
, strerror(errno
));
106 /* This will return a valid buffer fd */
107 buffer_fd
= alloc_data
.fd
;
108 maplen
= alloc_data
.len
;
110 if (buffer_fd
< 0 || maplen
<= 0) {
111 fprintf(stderr
, "<%s>: Invalid map data, fd: %d, len: %ld\n",
112 __func__
, buffer_fd
, maplen
);
116 /* Create memory mapped buffer for the buffer fd */
117 map_buffer
= (unsigned char *)mmap(NULL
, maplen
, PROT_READ
|PROT_WRITE
,
118 MAP_SHARED
, buffer_fd
, 0);
119 if (map_buffer
== MAP_FAILED
) {
120 fprintf(stderr
, "<%s>: Failed: mmap: %s\n",
121 __func__
, strerror(errno
));
125 ion_info
->ionfd
= ionfd
;
126 ion_info
->buffd
= buffer_fd
;
127 ion_info
->buffer
= map_buffer
;
128 ion_info
->buflen
= maplen
;
132 munmap(map_buffer
, maplen
);
136 /* in case of error: close the buffer fd */
143 /* In case of error: close the ion client fd */
150 int ion_import_buffer_fd(struct ion_buffer_info
*ion_info
)
153 unsigned char *map_buf
;
154 unsigned long map_len
;
157 fprintf(stderr
, "<%s>: Invalid ion info\n", __func__
);
161 map_len
= ion_info
->buflen
;
162 buffd
= ion_info
->buffd
;
164 if (buffd
< 0 || map_len
<= 0) {
165 fprintf(stderr
, "<%s>: Invalid map data, fd: %d, len: %ld\n",
166 __func__
, buffd
, map_len
);
170 map_buf
= (unsigned char *)mmap(NULL
, map_len
, PROT_READ
|PROT_WRITE
,
171 MAP_SHARED
, buffd
, 0);
172 if (map_buf
== MAP_FAILED
) {
173 printf("<%s>: Failed - mmap: %s\n",
174 __func__
, strerror(errno
));
178 ion_info
->buffer
= map_buf
;
179 ion_info
->buflen
= map_len
;
191 void ion_close_buffer_fd(struct ion_buffer_info
*ion_info
)
194 /* unmap the buffer properly in the end */
195 munmap(ion_info
->buffer
, ion_info
->buflen
);
196 /* close the buffer fd */
197 if (ion_info
->buffd
> 0)
198 close(ion_info
->buffd
);
199 /* Finally, close the client fd */
200 if (ion_info
->ionfd
> 0)
201 close(ion_info
->ionfd
);
205 int socket_send_fd(struct socket_info
*info
)
209 struct socketdata skdata
;
212 fprintf(stderr
, "<%s>: Invalid socket info\n", __func__
);
216 sockfd
= info
->sockfd
;
218 memset(&skdata
, 0, sizeof(skdata
));
220 skdata
.len
= sizeof(skdata
.data
);
221 status
= sendtosocket(sockfd
, &skdata
);
223 fprintf(stderr
, "<%s>: Failed: sendtosocket\n", __func__
);
230 int socket_receive_fd(struct socket_info
*info
)
234 struct socketdata skdata
;
237 fprintf(stderr
, "<%s>: Invalid socket info\n", __func__
);
241 sockfd
= info
->sockfd
;
242 memset(&skdata
, 0, sizeof(skdata
));
243 status
= receivefromsocket(sockfd
, &skdata
);
245 fprintf(stderr
, "<%s>: Failed: receivefromsocket\n", __func__
);
249 fd
= (int)skdata
.data
;