LINUX.ORG.RU

af_llc.c без хедер-файла

 ,


0

1

Продолжаю ковырять внутренности ядра. Теперь такой вопрос: есть файл net/llc/af_llc.c. Я заметил, что всё что содержится в этом файле не используется в других файлах. Нет никакого хедер-файла, который бы описывал функции/процедуры из af_llc.c. Вот с какой целью это может сделано?


Ответ на: комментарий от Anoxemian

Может быть. Но файл достаточно большой — 1282 строки. Должно же хоть что-то где-то использоваться?

czan
() автор топика

Видим

module_init(llc2_init);

идём в llc2_init, там

	rc = sock_register(&llc_ui_family_ops);

llc_ui_family_ops:

static const struct proto_ops llc_ui_ops = {
	.family	     = PF_LLC,
	.owner       = THIS_MODULE,
	.release     = llc_ui_release,
	.bind	     = llc_ui_bind,
	.connect     = llc_ui_connect,
	.socketpair  = sock_no_socketpair,
	.accept      = llc_ui_accept,
	.getname     = llc_ui_getname,
	.poll	     = datagram_poll,
	.ioctl       = llc_ui_ioctl,
	.listen      = llc_ui_listen,
	.shutdown    = llc_ui_shutdown,
	.setsockopt  = llc_ui_setsockopt,
	.getsockopt  = llc_ui_getsockopt,
	.sendmsg     = llc_ui_sendmsg,
	.recvmsg     = llc_ui_recvmsg,
	.mmap	     = sock_no_mmap,
	.sendpage    = sock_no_sendpage,
};

Я заметил, что всё что содержится в этом файле не используется в других файлах. Нет никакого хедер-файла, который бы описывал функции/процедуры из af_llc.c.

Не обязательно знать имя функции, чтобы её вызывать.

utf8nowhere ★★★
()
Ответ на: комментарий от utf8nowhere

И такое есть? Здорово! Не знал. Ещё вопрос:

	rc = sock_register(&llc_ui_family_ops);

ведёт на

static const struct net_proto_family llc_ui_family_ops = {
	.family = PF_LLC,
	.create = llc_ui_create,
	.owner	= THIS_MODULE,
};

А llc_ui_create ведёт на

static int llc_ui_create(struct net *net, struct socket *sock, int protocol,
			 int kern)
{
	struct sock *sk;
	int rc = -ESOCKTNOSUPPORT;

	if (!ns_capable(net->user_ns, CAP_NET_RAW))
		return -EPERM;

	if (!net_eq(net, &init_net))
		return -EAFNOSUPPORT;

	if (likely(sock->type == SOCK_DGRAM || sock->type == SOCK_STREAM)) {
		rc = -ENOMEM;
		sk = llc_sk_alloc(net, PF_LLC, GFP_KERNEL, &llc_proto, kern);
		if (sk) {
			rc = 0;
			llc_ui_sk_init(sock, sk);
		}
	}
	return rc;
}

Где llc_ui_sk_init(sock, sk); ведёт на

static void llc_ui_sk_init(struct socket *sock, struct sock *sk)
{
	sock_graft(sk, sock);
	sk->sk_type	= sock->type;
	sock->ops	= &llc_ui_ops;
}

И тут уже приходим к llc_ui_ops?

czan
() автор топика
Ответ на: комментарий от czan

почему без хидеров?

В linux/include/uapi/linux/llc.h описание структуры «struct sockaddr_llc»

глянь в этом же файле на «struct proto_ops llc_ui_ops».

Ты впервые видишь реализацию ООП на С ?

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от czan

И такое есть? Здорово!

?

Ещё вопрос:

	rc = sock_register(&llc_ui_family_ops);

ведёт на…

Да, я промахнулся при копипастинге и скопировал не то. Но в конце концов до llc_ui_ops дело доходит.

utf8nowhere ★★★
()
Ответ на: комментарий от vel

Посмотрел

struct sockaddr_llc {
	__kernel_sa_family_t sllc_family; /* AF_LLC */
	__kernel_sa_family_t sllc_arphrd; /* ARPHRD_ETHER */
	unsigned char   sllc_test;
	unsigned char   sllc_xid;
	unsigned char	sllc_ua;	/* UA data, only for SOCK_STREAM. */
	unsigned char   sllc_sap;
	unsigned char   sllc_mac[IFHWADDRLEN];
	unsigned char   __pad[__LLC_SOCK_SIZE__ -
			      sizeof(__kernel_sa_family_t) * 2 -
			      sizeof(unsigned char) * 4 - IFHWADDRLEN];
};

Не сильно понятно что это значит. Да, я про реализацию ООП в C знаю не много.

czan
() автор топика
Ответ на: комментарий от utf8nowhere

Я про module_init, module_exit вообще ничего не знал.

czan
() автор топика
Ответ на: комментарий от czan

Сокет работает с адресам. Структура адреса описана. А все методы - абстрактные.

Вот так выглядит реализация ООП на С.

vel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.