safi_t safi;
};
-#pragma pack(1)
struct capability_orf_entry
{
struct capability_mp_data mpc;
u_char type;
u_char mode;
} orfs[];
-} __attribute__ ((packed));
-#pragma pack()
+};
struct capability_as4
{
if (prefix->state == EIGRP_FSM_STATE_PASSIVE)
{
- if (!eigrp_metrics_is_same(&prefix->reported_metric,
- &((struct eigrp_neighbor_entry *) prefix->entries->head->data)->total_metric))
+ if (!eigrp_metrics_is_same(prefix->reported_metric,
+ ((struct eigrp_neighbor_entry *) prefix->entries->head->data)->total_metric))
{
prefix->rdistance =
prefix->fdistance =
pe->nt = EIGRP_TOPOLOGY_TYPE_CONNECTED;
pe->state = EIGRP_FSM_STATE_PASSIVE;
- pe->fdistance = eigrp_calculate_metrics (eigrp, &metric);
+ pe->fdistance = eigrp_calculate_metrics (eigrp, metric);
pe->req_action |= EIGRP_FSM_NEED_UPDATE;
eigrp_prefix_entry_add (eigrp->topology_table, pe);
listnode_add(eigrp->topology_changes_internalIPV4, pe);
ne->ei = ei;
ne->reported_metric = metric;
ne->total_metric = metric;
- ne->distance = eigrp_calculate_metrics (eigrp, &metric);
+ ne->distance = eigrp_calculate_metrics (eigrp, metric);
ne->reported_distance = 0;
ne->prefix = pe;
ne->adv_router = eigrp->neighbor_self;
}
u_int32_t
-eigrp_calculate_metrics(struct eigrp *eigrp, struct eigrp_metrics *metric)
+eigrp_calculate_metrics(struct eigrp *eigrp, struct eigrp_metrics metric)
{
uint64_t temp_metric;
temp_metric = 0;
- if(metric->delay == EIGRP_MAX_METRIC)
+ if(metric.delay == EIGRP_MAX_METRIC)
return EIGRP_MAX_METRIC;
// EIGRP Metric = {K1*BW+[(K2*BW)/(256-load)]+(K3*delay)}*{K5/(reliability+K4)}
if (eigrp->k_values[0])
- temp_metric += (eigrp->k_values[0] * metric->bandwith);
+ temp_metric += (eigrp->k_values[0] * metric.bandwith);
if (eigrp->k_values[1])
- temp_metric += ((eigrp->k_values[1] * metric->bandwith)
- / (256 - metric->load));
+ temp_metric += ((eigrp->k_values[1] * metric.bandwith)
+ / (256 - metric.load));
if (eigrp->k_values[2])
- temp_metric += (eigrp->k_values[2] * metric->delay);
+ temp_metric += (eigrp->k_values[2] * metric.delay);
if (eigrp->k_values[3] && !eigrp->k_values[4])
temp_metric *= eigrp->k_values[3];
if (!eigrp->k_values[3] && eigrp->k_values[4])
- temp_metric *= (eigrp->k_values[4] / metric->reliability);
+ temp_metric *= (eigrp->k_values[4] / metric.reliability);
if (eigrp->k_values[3] && eigrp->k_values[4])
- temp_metric *= ((eigrp->k_values[4] / metric->reliability)
+ temp_metric *= ((eigrp->k_values[4] / metric.reliability)
+ eigrp->k_values[3]);
if (temp_metric <= EIGRP_MAX_METRIC)
entry->total_metric.bandwith =
entry->total_metric.bandwith > bw ? bw : entry->total_metric.bandwith;
- return eigrp_calculate_metrics(eigrp, &entry->total_metric);
+ return eigrp_calculate_metrics(eigrp, entry->total_metric);
}
u_char
-eigrp_metrics_is_same(struct eigrp_metrics *metric1,
- struct eigrp_metrics *metric2)
+eigrp_metrics_is_same(struct eigrp_metrics metric1,
+ struct eigrp_metrics metric2)
{
- if ((metric1->bandwith == metric2->bandwith)
- && (metric1->delay == metric2->delay)
- && (metric1->hop_count == metric2->hop_count)
- && (metric1->load == metric2->load)
- && (metric1->reliability == metric2->reliability)
- && (metric1->mtu[0] == metric2->mtu[0])
- && (metric1->mtu[1] == metric2->mtu[1])
- && (metric1->mtu[2] == metric2->mtu[2]))
+ if ((metric1.bandwith == metric2.bandwith)
+ && (metric1.delay == metric2.delay)
+ && (metric1.hop_count == metric2.hop_count)
+ && (metric1.load == metric2.load)
+ && (metric1.reliability == metric2.reliability)
+ && (metric1.mtu[0] == metric2.mtu[0])
+ && (metric1.mtu[1] == metric2.mtu[1])
+ && (metric1.mtu[2] == metric2.mtu[2]))
return 1;
return 0; // if different
unsigned int ifindex);
extern void eigrp_adjust_sndbuflen (struct eigrp *, unsigned int);
-extern u_int32_t eigrp_calculate_metrics (struct eigrp *, struct eigrp_metrics *);
+extern u_int32_t eigrp_calculate_metrics (struct eigrp *, struct eigrp_metrics);
extern u_int32_t eigrp_calculate_total_metrics (struct eigrp *, struct eigrp_neighbor_entry *);
-extern u_char eigrp_metrics_is_same(struct eigrp_metrics *,struct eigrp_metrics *);
+extern u_char eigrp_metrics_is_same(struct eigrp_metrics, struct eigrp_metrics);
extern void eigrp_external_routes_refresh (struct eigrp *, int);
#endif /* EIGRP_NETWORK_H_ */
if (msg->data_type == EIGRP_TLV_IPv4_INT)
{
int_data = msg->data.ipv4_int_type;
- if (eigrp_metrics_is_same(&int_data->metric,&entry->reported_metric))
+ if (eigrp_metrics_is_same(int_data->metric, entry->reported_metric))
{
return 0; // No change
}
change =
entry->reported_distance
- < eigrp_calculate_metrics(eigrp, &int_data->metric) ? 1 :
+ < eigrp_calculate_metrics(eigrp, int_data->metric) ? 1 :
entry->reported_distance
- > eigrp_calculate_metrics(eigrp, &int_data->metric) ? 2 : 3; // Increase : Decrease : No change
+ > eigrp_calculate_metrics(eigrp, int_data->metric) ? 2 : 3; // Increase : Decrease : No change
entry->reported_metric = int_data->metric;
entry->reported_distance =
- eigrp_calculate_metrics(eigrp, &int_data->metric);
+ eigrp_calculate_metrics(eigrp, int_data->metric);
entry->distance = eigrp_calculate_total_metrics(eigrp, entry);
}
else
{
ext_data = msg->data.ipv4_ext_data;
- if (eigrp_metrics_is_same (&ext_data->metric, &entry->reported_metric))
+ if (eigrp_metrics_is_same (ext_data->metric, entry->reported_metric))
return 0;
}
/*
ne->reported_metric = tlv->metric;
ne->reported_distance =
eigrp_calculate_metrics(eigrp,
- &tlv->metric);
+ tlv->metric);
/*
* Filtering
*/
if (eigrp_is_type_redistributed (type))
{
- if (eigrp_metrics_is_same(&metric, &eigrp->dmetric[type]))
+ if (eigrp_metrics_is_same(metric, eigrp->dmetric[type]))
{
eigrp->dmetric[type] = metric;
}
/* Checksum sanity check - FIXME: move to correct place */
/* 12 = sysid+pdu+remtime */
if (iso_csum_verify (STREAM_PNT (circuit->rcv_stream) + 4,
- pdu_len - 12, &hdr->checksum))
+ pdu_len - 12, hdr->checksum,
+ offsetof(struct isis_link_state_hdr, checksum) - 4))
{
zlog_debug ("ISIS-Upd (%s): LSP %s invalid LSP checksum 0x%04x",
circuit->area->area_tag,
*/
int
-iso_csum_verify (u_char * buffer, int len, uint16_t * csum)
+iso_csum_verify (u_char * buffer, int len, uint16_t csum, int offset)
{
u_int16_t checksum;
u_int32_t c0;
u_int32_t c1;
- c0 = *csum & 0xff00;
- c1 = *csum & 0x00ff;
+ c0 = csum & 0xff00;
+ c1 = csum & 0x00ff;
/*
* If both are zero return correct
if (c0 == 0 || c1 == 0)
return 1;
- /* Offset of checksum from the start of the buffer */
- int offset = (u_char *) csum - buffer;
-
checksum = fletcher_checksum(buffer, len, offset);
- if (checksum == *csum)
+ if (checksum == csum)
return 0;
return 1;
}
#ifndef _ZEBRA_ISO_CSUM_H
#define _ZEBRA_ISO_CSUM_H
-int iso_csum_verify (u_char * buffer, int len, uint16_t * csum);
+int iso_csum_verify (u_char * buffer, int len, uint16_t csum, int offset);
#endif /* _ZEBRA_ISO_CSUM_H */