]>
glassweightruler.freedombox.rocks Git - Ventoy.git/blob - VBLADE/vblade-master/linux.c
1 // linux.c: low level access routines for Linux
4 #include <sys/socket.h>
10 #include <features.h> /* for the glibc version number */
11 #if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
12 #include <netpacket/packet.h>
13 #include <net/ethernet.h> /* the L2 protocols */
15 #include <asm/types.h>
16 #include <linux/if_packet.h>
17 #include <linux/if_ether.h> /* The L2 protocols */
21 #include <sys/ioctl.h>
22 #include <sys/types.h>
24 #include <netinet/in.h>
31 int getindx(int, char *);
32 int getea(int, char *, uchar
*);
37 dial(char *eth
, int bufcnt
) // get us a raw connection to an interface
40 struct sockaddr_ll sa
;
41 enum { aoe_type
= 0x88a2 };
43 memset(&sa
, 0, sizeof sa
);
44 s
= socket(PF_PACKET
, SOCK_RAW
, htons(aoe_type
));
46 perror("got bad socket");
54 sa
.sll_family
= AF_PACKET
;
55 sa
.sll_protocol
= htons(0x88a2);
57 n
= bind(s
, (struct sockaddr
*)&sa
, sizeof sa
);
66 } *bpf_program
= create_bpf_program(shelf
, slot
);
67 setsockopt(s
, SOL_SOCKET
, SO_ATTACH_FILTER
, bpf_program
, sizeof(*bpf_program
));
68 free_bpf_program(bpf_program
);
70 n
= bufcnt
* getmtu(s
, eth
);
71 if (setsockopt(s
, SOL_SOCKET
, SO_SNDBUF
, &n
, sizeof(n
)) < 0)
72 perror("setsockopt SOL_SOCKET, SO_SNDBUF");
73 if (setsockopt(s
, SOL_SOCKET
, SO_RCVBUF
, &n
, sizeof(n
)) < 0)
74 perror("setsockopt SOL_SOCKET, SO_RCVBUF");
80 getindx(int s
, char *name
) // return the index of device 'name'
85 snprintf(xx
.ifr_name
, sizeof xx
.ifr_name
, "%s", name
);
86 n
= ioctl(s
, SIOCGIFINDEX
, &xx
);
89 return xx
.ifr_ifindex
;
93 getea(int s
, char *name
, uchar
*ea
)
98 snprintf(xx
.ifr_name
, sizeof xx
.ifr_name
, "%s", name
);
99 n
= ioctl(s
, SIOCGIFHWADDR
, &xx
);
101 perror("Can't get hw addr");
104 memmove(ea
, xx
.ifr_hwaddr
.sa_data
, 6);
109 getmtu(int s
, char *name
)
114 snprintf(xx
.ifr_name
, sizeof xx
.ifr_name
, "%s", name
);
115 n
= ioctl(s
, SIOCGIFMTU
, &xx
);
117 perror("Can't get mtu");
125 getsec(int fd
, uchar
*place
, vlong lba
, int nsec
)
127 return pread(fd
, place
, nsec
* 512, lba
* 512);
131 putsec(int fd
, uchar
*place
, vlong lba
, int nsec
)
133 return pwrite(fd
, place
, nsec
* 512, lba
* 512);
138 getpkt(int fd
, uchar
*buf
, int sz
)
140 return read(fd
, buf
, sz
);
144 putpkt(int fd
, uchar
*buf
, int sz
)
146 return write(fd
, buf
, sz
);
156 n
= ioctl(fd
, BLKGETSIZE64
, &size
);
157 if (n
== -1) { // must not be a block special