LINUX.ORG.RU

OpenBSD 4.0 PF code


0

0

	if (direction == PF_OUT) {
		bport = nport = th->th_sport;
		/* check outgoing packet for BINAT/NAT */
		if ((nr = pf_get_translation(pd, m, off, PF_OUT, kif, &nsn,
		    saddr, th->th_sport, daddr, th->th_dport,
		    &pd->naddr, &nport)) != NULL) {
			PF_ACPY(&pd->baddr, saddr, af);
			pf_change_ap(saddr, &th->th_sport, pd->ip_sum,
			    &th->th_sum, &pd->naddr, nport, 0, af);
			rewrite++;
			if (nr->natpass)
				r = NULL;
			pd->nat_rule = nr;
		}
	} else {
		bport = nport = th->th_dport;
		/* check incoming packet for BINAT/RDR */
		if ((nr = pf_get_translation(pd, m, off, PF_IN, kif, &nsn,
		    saddr, th->th_sport, daddr, th->th_dport,
		    &pd->naddr, &nport)) != NULL) {
			PF_ACPY(&pd->baddr, daddr, af);
			pf_change_ap(daddr, &th->th_dport, pd->ip_sum,
			    &th->th_sum, &pd->naddr, nport, 0, af);
			rewrite++;
			if (nr->natpass)
				r = NULL;
			pd->nat_rule = nr;
		}
	}

какой смысл в таком коде? может я чего не понимаю?
★★★★★
Ответ на: комментарий от stassats

да ты шо? :)

и чем же особенно отличаются эти 2 ветви условия? мне интересно: это тупой copy-paste с косметическими исправлениями или такая повторяющаяся стрктура кода имеет какой-то сокральный смысл (произвоительность или ещё что-нибудь)?

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

> да ты шо? :)

Ога 8)

> и чем же особенно отличаются эти 2 ветви условия? мне интересно: это тупой copy-paste с косметическими исправлениями или такая повторяющаяся стрктура кода имеет какой-то сокральный смысл (произвоительность или ещё что-нибудь)?

Перепиши так, чтоб не повторялось, посмотрим, у кого красивее будет :)

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

Вот что вышло у меня, не знаю, что красивее...


int foo;

if (direction == PF_OUT) {
	foo = PF_OUT;
	bport = nport = th->th_sport;
 } else {
	foo = PF_IN;
	bport = nport = th->th_dport;
 }

if ((nr = pf_get_translation(pd, m, off, foo, kif, &nsn,
			     saddr, th->th_sport, daddr, th->th_dport,
			     &pd->naddr, &nport)) != NULL) {
	if (foo == PF_OUT) {
		PF_ACPY(&pd->baddr, saddr, af);
		pf_change_ap(saddr, &th->th_sport, pd->ip_sum,
			     &th->th_sum, &pd->naddr, nport, 0, af);
	} else {
		PF_ACPY(&pd->baddr, daddr, af);
		pf_change_ap(daddr, &th->th_dport, pd->ip_sum,
			     &th->th_sum, &pd->naddr, nport, 0, af);
	}

	rewrite++;
	if (nr->natpass)
		r = NULL;
	pd->nat_rule = nr;
 }

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

Еще + if (foo == PF_IN || foo == PF_OUT) перед if ((nr = pf_get_translation(pd, m, off, foo, kif, &nsn,

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

	if (direction == PF_OUT) {
		bport = nport = th->th_sport;
		boo = &th->th_sport
		foo = saddr
		dir = PF_OUT
	}else{
		bport = nport = th->th_dport;
		boo = &th->th_dport
		dir = PF_IN
		foo = daddr
	}
		if ((nr = pf_get_translation(pd, m, off, dir, kif, &nsn,
		    saddr, th->th_sport, daddr, th->th_dport,
		    &pd->naddr, &nport)) != NULL) {
			PF_ACPY(&pd->baddr, foo, af);
			pf_change_ap(foo, boo, pd->ip_sum,
			    &th->th_sum, &pd->naddr, nport, 0, af);
			rewrite++;
			if (nr->natpass)
				r = NULL;
			pd->nat_rule = nr;
		}


оно может и выглядит странновато, но в случае логической ошибки, мне надо править ОДНО место. Просто моё эстетствующее нутро противится повторению кода

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

в случае PF_INOUT обойдёмся goto :)

Pi ★★★★★
() автор топика

Не знаю как сейчас, но изначально pf был написан во время OpenBSD hackathon - это несколько дней безудержного пьянства (т.е. программирования) с 2-3 часовыми перерывами на сон. Поэтому претензии к качеству нужно поумерить :)

parser ★★
()

Это походу остатки от рефакторинга :)

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