From 2417d97ebb68bd397e2efd2aaca22fcb004d259a Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Mon, 18 Jul 2011 17:33:08 +0000 Subject: [PATCH 001/452] - Export each thread's individual resource usage in in struct kinfo_proc's ki_rusage member when KERN_PROC_INC_THREAD is passed to one of the process sysctls. - Correctly account for the current thread's cputime in the thread when doing the runtime fixup in calcru(). - Use TIDs as the key to lookup the previous thread to compute IO stat deltas in IO mode in top when thread display is enabled. Reviewed by: kib Approved by: re (kib) --- sys/kern/kern_proc.c | 5 +++++ sys/kern/kern_resource.c | 40 ++++++++++++++++++++++++++++++++++------ sys/sys/resourcevar.h | 1 + usr.bin/top/machine.c | 17 +++++++++++++++-- 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 4f1dc4567f1..aac8b393797 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -848,6 +848,8 @@ fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp, int preferthread) kp->ki_tdaddr = td; PROC_LOCK_ASSERT(p, MA_OWNED); + if (preferthread) + PROC_SLOCK(p); thread_lock(td); if (td->td_wmesg != NULL) strlcpy(kp->ki_wmesg, td->td_wmesg, sizeof(kp->ki_wmesg)); @@ -899,6 +901,7 @@ fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp, int preferthread) kp->ki_pri.pri_user = td->td_user_pri; if (preferthread) { + rufetchtd(td, &kp->ki_rusage); kp->ki_runtime = cputick2usec(td->td_rux.rux_runtime); kp->ki_pctcpu = sched_pctcpu(td); kp->ki_estcpu = td->td_estcpu; @@ -911,6 +914,8 @@ fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp, int preferthread) kp->ki_siglist = td->td_siglist; kp->ki_sigmask = td->td_sigmask; thread_unlock(td); + if (preferthread) + PROC_SUNLOCK(p); } /* diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index 1062703b682..78a25ebaad9 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -813,7 +813,7 @@ void calcru(struct proc *p, struct timeval *up, struct timeval *sp) { struct thread *td; - uint64_t u; + uint64_t runtime, u; PROC_LOCK_ASSERT(p, MA_OWNED); PROC_SLOCK_ASSERT(p, MA_OWNED); @@ -826,7 +826,9 @@ calcru(struct proc *p, struct timeval *up, struct timeval *sp) td = curthread; if (td->td_proc == p) { u = cpu_ticks(); - p->p_rux.rux_runtime += u - PCPU_GET(switchtime); + runtime = u - PCPU_GET(switchtime); + td->td_runtime += runtime; + td->td_incruntime += runtime; PCPU_SET(switchtime, u); } /* Make sure the per-thread stats are current. */ @@ -838,6 +840,34 @@ calcru(struct proc *p, struct timeval *up, struct timeval *sp) calcru1(p, &p->p_rux, up, sp); } +/* Collect resource usage for a single thread. */ +void +rufetchtd(struct thread *td, struct rusage *ru) +{ + struct proc *p; + uint64_t runtime, u; + + p = td->td_proc; + PROC_SLOCK_ASSERT(p, MA_OWNED); + THREAD_LOCK_ASSERT(td, MA_OWNED); + /* + * If we are getting stats for the current thread, then add in the + * stats that this thread has accumulated in its current time slice. + * We reset the thread and CPU state as if we had performed a context + * switch right here. + */ + if (td == curthread) { + u = cpu_ticks(); + runtime = u - PCPU_GET(switchtime); + td->td_runtime += runtime; + td->td_incruntime += runtime; + PCPU_SET(switchtime, u); + } + ruxagg(p, td); + *ru = td->td_ru; + calcru1(p, &td->td_rux, &ru->ru_utime, &ru->ru_stime); +} + static void calcru1(struct proc *p, struct rusage_ext *ruxp, struct timeval *up, struct timeval *sp) @@ -955,12 +985,10 @@ kern_getrusage(struct thread *td, int who, struct rusage *rup) case RUSAGE_THREAD: PROC_SLOCK(p); - ruxagg(p, td); - PROC_SUNLOCK(p); thread_lock(td); - *rup = td->td_ru; - calcru1(p, &td->td_rux, &rup->ru_utime, &rup->ru_stime); + rufetchtd(td, rup); thread_unlock(td); + PROC_SUNLOCK(p); break; default: diff --git a/sys/sys/resourcevar.h b/sys/sys/resourcevar.h index f17d95f644d..d091d85e8bf 100644 --- a/sys/sys/resourcevar.h +++ b/sys/sys/resourcevar.h @@ -136,6 +136,7 @@ void rucollect(struct rusage *ru, struct rusage *ru2); void rufetch(struct proc *p, struct rusage *ru); void rufetchcalc(struct proc *p, struct rusage *ru, struct timeval *up, struct timeval *sp); +void rufetchtd(struct thread *td, struct rusage *ru); void ruxagg(struct proc *p, struct thread *td); int suswintr(void *base, int word); struct uidinfo diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c index 02dc8472ad4..1f8a002ba9f 100644 --- a/usr.bin/top/machine.c +++ b/usr.bin/top/machine.c @@ -235,6 +235,7 @@ static int *pcpu_cpu_states; static int compare_jid(const void *a, const void *b); static int compare_pid(const void *a, const void *b); +static int compare_tid(const void *a, const void *b); static const char *format_nice(const struct kinfo_proc *pp); static void getsysctl(const char *name, void *ptr, size_t len); static int swapmode(int *retavail, int *retfree); @@ -557,7 +558,7 @@ get_old_proc(struct kinfo_proc *pp) * cache it. */ oldpp = bsearch(&pp, previous_pref, previous_proc_count, - sizeof(*previous_pref), compare_pid); + sizeof(*previous_pref), ps.thread ? compare_tid : compare_pid); if (oldpp == NULL) { pp->ki_udata = NOPROC; return (NULL); @@ -652,7 +653,7 @@ get_process_info(struct system_info *si, struct process_select *sel, previous_pref[i] = &previous_procs[i]; bcopy(pbase, previous_procs, nproc * sizeof(*previous_procs)); qsort(previous_pref, nproc, sizeof(*previous_pref), - compare_pid); + ps.thread ? compare_tid : compare_pid); } previous_proc_count = nproc; @@ -1059,6 +1060,18 @@ compare_pid(const void *p1, const void *p2) return ((*pp1)->ki_pid - (*pp2)->ki_pid); } +static int +compare_tid(const void *p1, const void *p2) +{ + const struct kinfo_proc * const *pp1 = p1; + const struct kinfo_proc * const *pp2 = p2; + + if ((*pp2)->ki_tid < 0 || (*pp1)->ki_tid < 0) + abort(); + + return ((*pp1)->ki_tid - (*pp2)->ki_tid); +} + /* * proc_compare - comparison function for "qsort" * Compares the resource consumption of two processes using five From 54257e2cbdf727f10826292b624281e39287f945 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Mon, 18 Jul 2011 19:23:50 +0000 Subject: [PATCH 002/452] Disable gvmat64.S, the assembler version of longest_match for now. PR: kern/154073 MFC after: 3 days Approved by: re (kib) --- lib/libz/Makefile | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/libz/Makefile b/lib/libz/Makefile index c03a1c3ca60..8ae9aeb4929 100644 --- a/lib/libz/Makefile +++ b/lib/libz/Makefile @@ -42,16 +42,16 @@ CFLAGS+= -DASMV -DNO_UNDERLINE ACFLAGS+= -Wa,--noexecstack .endif -.if ${MACHINE_ARCH} == "amd64" -.PATH: ${.CURDIR}/contrib/gcc_gvmat64 -SRCS+= gvmat64.S -CFLAGS+= -DASMV -DNO_UNDERLINE -ACFLAGS+= -Wa,--noexecstack -.if ${CC:T:Mclang} == "clang" -# XXX: clang integrated-as doesn't grok .intel_syntax directives yet -ACFLAGS+= ${.IMPSRC:T:Mgvmat64.S:C/^.+$/-no-integrated-as/} -.endif -.endif +#.if ${MACHINE_ARCH} == "amd64" +#.PATH: ${.CURDIR}/contrib/gcc_gvmat64 +#SRCS+= gvmat64.S +#CFLAGS+= -DASMV -DNO_UNDERLINE +#ACFLAGS+= -Wa,--noexecstack +#.if ${CC:T:Mclang} == "clang" +## XXX: clang integrated-as doesn't grok .intel_syntax directives yet +#ACFLAGS+= ${.IMPSRC:T:Mgvmat64.S:C/^.+$/-no-integrated-as/} +#.endif +#.endif VERSION_DEF= ${.CURDIR}/Versions.def SYMBOL_MAPS= ${.CURDIR}/Symbol.map From 8953ac43348a6f1931df7a0f876b130f27a4fae9 Mon Sep 17 00:00:00 2001 From: Sergey Kandaurov Date: Mon, 18 Jul 2011 19:42:18 +0000 Subject: [PATCH 003/452] sintrcnt/sintrnames is the address of the size, not the actual size. Use them appropriately to fetch the actual size. That fixes vmstat -i with kvm backend. Submitted by: peter Approved by: re (kib) --- usr.bin/vmstat/vmstat.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/usr.bin/vmstat/vmstat.c b/usr.bin/vmstat/vmstat.c index 39e71fab8d3..ba5df87a445 100644 --- a/usr.bin/vmstat/vmstat.c +++ b/usr.bin/vmstat/vmstat.c @@ -1153,8 +1153,8 @@ dointr(void) uptime = getuptime(); if (kd != NULL) { - intrcntlen = namelist[X_SINTRCNT].n_value; - inamlen = namelist[X_SINTRNAMES].n_value; + kread(X_SINTRCNT, &intrcntlen, sizeof(intrcntlen)); + kread(X_SINTRNAMES, &inamlen, sizeof(inamlen)); if ((intrcnt = malloc(intrcntlen)) == NULL || (intrname = malloc(inamlen)) == NULL) err(1, "malloc()"); From 925af54487d1c8cafc0dbb5ceee2ed1e49285249 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Mon, 18 Jul 2011 20:06:15 +0000 Subject: [PATCH 004/452] Rename ki_ocomm to ki_tdname and OCOMMLEN to TDNAMLEN. Provide backward compatibility defines under BURN_BRIDGES. Suggested by: jhb Reviewed by: emaste Sponsored by: Sandvine Incorporated Approved by: re (kib) --- bin/ps/keyword.c | 4 ++-- bin/ps/print.c | 14 +++++++------- lib/libkvm/kvm_proc.c | 4 ++-- sys/compat/freebsd32/freebsd32.h | 2 +- sys/kern/kern_proc.c | 4 ++-- sys/sys/user.h | 9 +++++++-- usr.bin/procstat/procstat_kstack.c | 6 +++--- usr.bin/procstat/procstat_threads.c | 6 +++--- usr.bin/top/machine.c | 8 ++++---- 9 files changed, 31 insertions(+), 26 deletions(-) diff --git a/bin/ps/keyword.c b/bin/ps/keyword.c index c4467561bf3..7dbaa4fe74c 100644 --- a/bin/ps/keyword.c +++ b/bin/ps/keyword.c @@ -82,7 +82,7 @@ static VAR var[] = { {"class", "CLASS", NULL, LJUST, loginclass, s_loginclass, MAXLOGNAME-1, 0, CHAR, NULL, 0}, {"comm", "COMMAND", NULL, LJUST, ucomm, s_comm, - COMMLEN + OCOMMLEN + 1, 0, CHAR, NULL, 0}, + COMMLEN + TDNAMLEN + 1, 0, CHAR, NULL, 0}, {"command", "COMMAND", NULL, COMM|LJUST|USER, command, NULL, 16, 0, CHAR, NULL, 0}, {"cpu", "CPU", NULL, 0, kvar, NULL, 3, KOFF(ki_estcpu), UINT, "d", @@ -212,7 +212,7 @@ static VAR var[] = { {"tt", "TT ", NULL, 0, tname, NULL, 4, 0, CHAR, NULL, 0}, {"tty", "TTY", NULL, LJUST, longtname, NULL, 8, 0, CHAR, NULL, 0}, {"ucomm", "UCOMM", NULL, LJUST, ucomm, s_comm, - COMMLEN + OCOMMLEN + 1, 0, CHAR, NULL, 0}, + COMMLEN + TDNAMLEN + 1, 0, CHAR, NULL, 0}, {"uid", "UID", NULL, 0, kvar, NULL, UIDLEN, KOFF(ki_uid), UINT, UIDFMT, 0}, {"upr", "UPR", NULL, 0, upr, NULL, 3, 0, CHAR, NULL, 0}, diff --git a/bin/ps/print.c b/bin/ps/print.c index 02c6112d546..7d1d1902b9b 100644 --- a/bin/ps/print.c +++ b/bin/ps/print.c @@ -136,7 +136,7 @@ command(KINFO *k, VARENT *ve) (void)printf("%s", k->ki_d.prefix); (void)printf("%s", k->ki_p->ki_comm); if (showthreads && k->ki_p->ki_numthreads > 1) - (void)printf("/%s", k->ki_p->ki_ocomm); + (void)printf("/%s", k->ki_p->ki_tdname); } else (void)printf("%-*s", v->width, k->ki_p->ki_comm); return; @@ -190,7 +190,7 @@ command(KINFO *k, VARENT *ve) void ucomm(KINFO *k, VARENT *ve) { - char tmpbuff[COMMLEN + OCOMMLEN + 2]; + char tmpbuff[COMMLEN + TDNAMLEN + 2]; VAR *v; v = ve->var; @@ -199,12 +199,12 @@ ucomm(KINFO *k, VARENT *ve) (void)printf("%s", k->ki_d.prefix); (void)printf("%s", k->ki_p->ki_comm); if (showthreads && k->ki_p->ki_numthreads > 1) - printf("/%s", k->ki_p->ki_ocomm); + printf("/%s", k->ki_p->ki_tdname); } else { bzero(tmpbuff, sizeof(tmpbuff)); if (showthreads && k->ki_p->ki_numthreads > 1) sprintf(tmpbuff, "%s/%s", k->ki_p->ki_comm, - k->ki_p->ki_ocomm); + k->ki_p->ki_tdname); else sprintf(tmpbuff, "%s", k->ki_p->ki_comm); (void)printf("%-*s", v->width, tmpbuff); @@ -218,7 +218,7 @@ tdnam(KINFO *k, VARENT *ve) v = ve->var; if (showthreads && k->ki_p->ki_numthreads > 1) - (void)printf("%-*s", v->width, k->ki_p->ki_ocomm); + (void)printf("%-*s", v->width, k->ki_p->ki_tdname); else (void)printf("%-*s", v->width, " "); } @@ -943,12 +943,12 @@ loginclass(KINFO *k, VARENT *ve) int s_comm(KINFO *k) { - char tmpbuff[COMMLEN + OCOMMLEN + 2]; + char tmpbuff[COMMLEN + TDNAMLEN + 2]; bzero(tmpbuff, sizeof(tmpbuff)); if (showthreads && k->ki_p->ki_numthreads > 1) sprintf(tmpbuff, "%s/%s", k->ki_p->ki_comm, - k->ki_p->ki_ocomm); + k->ki_p->ki_tdname); else sprintf(tmpbuff, "%s", k->ki_p->ki_comm); return (strlen(tmpbuff)); diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c index 338d217e71c..876af50e98e 100644 --- a/lib/libkvm/kvm_proc.c +++ b/lib/libkvm/kvm_proc.c @@ -426,10 +426,10 @@ nopgrp: kp->ki_lastcpu = mtd.td_lastcpu; kp->ki_wchan = mtd.td_wchan; if (mtd.td_name[0] != 0) - strlcpy(kp->ki_ocomm, mtd.td_name, MAXCOMLEN); + strlcpy(kp->ki_tdname, mtd.td_name, MAXCOMLEN); kp->ki_oncpu = mtd.td_oncpu; if (mtd.td_name[0] != '\0') - strlcpy(kp->ki_ocomm, mtd.td_name, sizeof(kp->ki_ocomm)); + strlcpy(kp->ki_tdname, mtd.td_name, sizeof(kp->ki_tdname)); kp->ki_pctcpu = 0; kp->ki_rqindex = 0; } else { diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h index 82bdc53c049..5d1a269df4e 100644 --- a/sys/compat/freebsd32/freebsd32.h +++ b/sys/compat/freebsd32/freebsd32.h @@ -310,7 +310,7 @@ struct kinfo_proc32 { char ki_rqindex; u_char ki_oncpu; u_char ki_lastcpu; - char ki_ocomm[OCOMMLEN+1]; + char ki_tdname[TDNAMLEN+1]; char ki_wmesg[WMESGLEN+1]; char ki_login[LOGNAMELEN+1]; char ki_lockname[LOCKNAMELEN+1]; diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index aac8b393797..91b14a93150 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -855,7 +855,7 @@ fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp, int preferthread) strlcpy(kp->ki_wmesg, td->td_wmesg, sizeof(kp->ki_wmesg)); else bzero(kp->ki_wmesg, sizeof(kp->ki_wmesg)); - strlcpy(kp->ki_ocomm, td->td_name, sizeof(kp->ki_ocomm)); + strlcpy(kp->ki_tdname, td->td_name, sizeof(kp->ki_tdname)); if (TD_ON_LOCK(td)) { kp->ki_kiflag |= KI_LOCKBLOCK; strlcpy(kp->ki_lockname, td->td_lockname, @@ -1059,7 +1059,7 @@ freebsd32_kinfo_proc_out(const struct kinfo_proc *ki, struct kinfo_proc32 *ki32) CP(*ki, *ki32, ki_rqindex); CP(*ki, *ki32, ki_oncpu); CP(*ki, *ki32, ki_lastcpu); - bcopy(ki->ki_ocomm, ki32->ki_ocomm, OCOMMLEN + 1); + bcopy(ki->ki_tdname, ki32->ki_tdname, TDNAMLEN + 1); bcopy(ki->ki_wmesg, ki32->ki_wmesg, WMESGLEN + 1); bcopy(ki->ki_login, ki32->ki_login, LOGNAMELEN + 1); bcopy(ki->ki_lockname, ki32->ki_lockname, LOCKNAMELEN + 1); diff --git a/sys/sys/user.h b/sys/sys/user.h index 644f9113edd..1863f86ffe9 100644 --- a/sys/sys/user.h +++ b/sys/sys/user.h @@ -95,13 +95,18 @@ #define WMESGLEN 8 /* size of returned wchan message */ #define LOCKNAMELEN 8 /* size of returned lock name */ -#define OCOMMLEN 16 /* size of returned thread name */ +#define TDNAMLEN 16 /* size of returned thread name */ #define COMMLEN 19 /* size of returned ki_comm name */ #define KI_EMULNAMELEN 16 /* size of returned ki_emul */ #define KI_NGROUPS 16 /* number of groups in ki_groups */ #define LOGNAMELEN 17 /* size of returned ki_login */ #define LOGINCLASSLEN 17 /* size of returned ki_loginclass */ +#ifndef BURN_BRIDGES +#define OCOMMLEN TDNAMLEN +#define ki_ocomm ki_tdname +#endif + /* Flags for the process credential. */ #define KI_CRF_CAPABILITY_MODE 0x00000001 /* @@ -167,7 +172,7 @@ struct kinfo_proc { char ki_rqindex; /* Run queue index */ u_char ki_oncpu; /* Which cpu we are on */ u_char ki_lastcpu; /* Last cpu we were on */ - char ki_ocomm[OCOMMLEN+1]; /* thread name */ + char ki_tdname[TDNAMLEN+1]; /* thread name */ char ki_wmesg[WMESGLEN+1]; /* wchan message */ char ki_login[LOGNAMELEN+1]; /* setlogin name */ char ki_lockname[LOCKNAMELEN+1]; /* lock name */ diff --git a/usr.bin/procstat/procstat_kstack.c b/usr.bin/procstat/procstat_kstack.c index fd2b9ab22c4..d8872628da9 100644 --- a/usr.bin/procstat/procstat_kstack.c +++ b/usr.bin/procstat/procstat_kstack.c @@ -213,9 +213,9 @@ procstat_kstack(struct kinfo_proc *kipp, int kflag) printf("%5d ", kipp->ki_pid); printf("%6d ", kkstp->kkst_tid); printf("%-16s ", kipp->ki_comm); - printf("%-16s ", (strlen(kipp->ki_ocomm) && - (strcmp(kipp->ki_comm, kipp->ki_ocomm) != 0)) ? - kipp->ki_ocomm : "-"); + printf("%-16s ", (strlen(kipp->ki_tdname) && + (strcmp(kipp->ki_comm, kipp->ki_tdname) != 0)) ? + kipp->ki_tdname : "-"); switch (kkstp->kkst_state) { case KKST_STATE_RUNNING: diff --git a/usr.bin/procstat/procstat_threads.c b/usr.bin/procstat/procstat_threads.c index 7633608feeb..ffd659c0064 100644 --- a/usr.bin/procstat/procstat_threads.c +++ b/usr.bin/procstat/procstat_threads.c @@ -86,9 +86,9 @@ procstat_threads(struct kinfo_proc *kipp) printf("%6d ", kipp->ki_tid); printf("%-16s ", strlen(kipp->ki_comm) ? kipp->ki_comm : "-"); - printf("%-16s ", (strlen(kipp->ki_ocomm) && - (strcmp(kipp->ki_comm, kipp->ki_ocomm) != 0)) ? - kipp->ki_ocomm : "-"); + printf("%-16s ", (strlen(kipp->ki_tdname) && + (strcmp(kipp->ki_comm, kipp->ki_tdname) != 0)) ? + kipp->ki_tdname : "-"); if (kipp->ki_oncpu != 255) printf("%3d ", kipp->ki_oncpu); else if (kipp->ki_lastcpu != 255) diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c index 1f8a002ba9f..94feb9a6d05 100644 --- a/usr.bin/top/machine.c +++ b/usr.bin/top/machine.c @@ -833,8 +833,8 @@ format_next_process(caddr_t handle, char *(*get_userid)(int), int flags) if (!(flags & FMT_SHOWARGS)) { if (ps.thread && pp->ki_flag & P_HADTHREADS && - pp->ki_ocomm[0]) { - snprintf(cmdbuf, cmdlengthdelta, "{%s}", pp->ki_ocomm); + pp->ki_tdname[0]) { + snprintf(cmdbuf, cmdlengthdelta, "{%s}", pp->ki_tdname); } else { snprintf(cmdbuf, cmdlengthdelta, "%s", pp->ki_comm); } @@ -844,9 +844,9 @@ format_next_process(caddr_t handle, char *(*get_userid)(int), int flags) (args = kvm_getargv(kd, pp, cmdlengthdelta)) == NULL || !(*args)) { if (ps.thread && pp->ki_flag & P_HADTHREADS && - pp->ki_ocomm[0]) { + pp->ki_tdname[0]) { snprintf(cmdbuf, cmdlengthdelta, - "{%s}", pp->ki_ocomm); + "{%s}", pp->ki_tdname); } else { snprintf(cmdbuf, cmdlengthdelta, "[%s]", pp->ki_comm); From 8bd9dc088ea834738fb438463e280eb5d47bddf8 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Mon, 18 Jul 2011 20:07:29 +0000 Subject: [PATCH 005/452] Fix building of 32-bit compat libraries on amd64 with clang, and using -g, by reverting r219139. The LLVM PR referenced in that revision was fixed in the mean time, and we imported a clang snapshot soon afterwards, so the temporary workaround of disabling clang's integrated assembler is no longer needed. In this particular case, using e.g. DEBUG_FLAGS=-g causes clang to output certain directives into assembly that our version of GNU as chokes on. Reported by: dougb Approved by: re (kib) --- lib/libc/stdlib/Makefile.inc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc index d5b151c9c36..3627294d0b3 100644 --- a/lib/libc/stdlib/Makefile.inc +++ b/lib/libc/stdlib/Makefile.inc @@ -51,7 +51,3 @@ MLINKS+=tsearch.3 tdelete.3 tsearch.3 tfind.3 tsearch.3 twalk.3 CFLAGS+= -DMALLOC_PRODUCTION .endif -.if ${CC:T:Mclang} == "clang" -# XXX: Temporary workaround for LLVM PR 9352 -CFLAGS+= ${.IMPSRC:T:Mmalloc.c:C/^.+$/-no-integrated-as/} -.endif From c618a5222e79253859f619c1962e84931ae54921 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Mon, 18 Jul 2011 20:57:43 +0000 Subject: [PATCH 006/452] Constantly print the command name and if set include the thread name in per-thread mode. Discussed with: jhb Obtained from: Ed Maste at Sandvine Incorporated Sponsored by: Sandvine Incorporated MFC after: 1 week Approved by: re (kib) --- usr.bin/top/machine.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c index 94feb9a6d05..5e53d5b36ed 100644 --- a/usr.bin/top/machine.c +++ b/usr.bin/top/machine.c @@ -834,7 +834,8 @@ format_next_process(caddr_t handle, char *(*get_userid)(int), int flags) if (!(flags & FMT_SHOWARGS)) { if (ps.thread && pp->ki_flag & P_HADTHREADS && pp->ki_tdname[0]) { - snprintf(cmdbuf, cmdlengthdelta, "{%s}", pp->ki_tdname); + snprintf(cmdbuf, cmdlengthdelta, "%s{%s}", pp->ki_comm, + pp->ki_tdname); } else { snprintf(cmdbuf, cmdlengthdelta, "%s", pp->ki_comm); } @@ -846,7 +847,7 @@ format_next_process(caddr_t handle, char *(*get_userid)(int), int flags) if (ps.thread && pp->ki_flag & P_HADTHREADS && pp->ki_tdname[0]) { snprintf(cmdbuf, cmdlengthdelta, - "{%s}", pp->ki_tdname); + "[%s{%s}]", pp->ki_comm, pp->ki_tdname); } else { snprintf(cmdbuf, cmdlengthdelta, "[%s]", pp->ki_comm); @@ -890,12 +891,23 @@ format_next_process(caddr_t handle, char *(*get_userid)(int), int flags) dst--; *dst = '\0'; - if (strcmp(cmd, pp->ki_comm) != 0 ) - snprintf(cmdbuf, cmdlengthdelta, - "%s (%s)",argbuf, pp->ki_comm); - else - strlcpy(cmdbuf, argbuf, cmdlengthdelta); - + if (strcmp(cmd, pp->ki_comm) != 0 ) { + if (ps.thread && pp->ki_flag & P_HADTHREADS && + pp->ki_tdname[0]) + snprintf(cmdbuf, cmdlengthdelta, + "%s (%s){%s}", argbuf, pp->ki_comm, + pp->ki_tdname); + else + snprintf(cmdbuf, cmdlengthdelta, + "%s (%s)", argbuf, pp->ki_comm); + } else { + if (ps.thread && pp->ki_flag & P_HADTHREADS && + pp->ki_tdname[0]) + snprintf(cmdbuf, cmdlengthdelta, + "%s{%s}", argbuf, pp->ki_tdname); + else + strlcpy(cmdbuf, argbuf, cmdlengthdelta); + } free(argbuf); } } From 834377fe2ded06485f80a727846e990622f56f71 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Mon, 18 Jul 2011 21:08:14 +0000 Subject: [PATCH 007/452] Tweak the interactive description of CPU vs WCPU. PR: bin/158819 Submitted by: arundel Approved by: re (kib) --- contrib/top/top.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/top/top.c b/contrib/top/top.c index 4e4d86ded07..1a017a3cd20 100644 --- a/contrib/top/top.c +++ b/contrib/top/top.c @@ -1029,8 +1029,8 @@ restart: case CMD_wcputog: ps.wcpu = !ps.wcpu; new_message(MT_standout | MT_delayed, - " Displaying %sCPU", - ps.wcpu ? "W" : ""); + " Displaying %s CPU", + ps.wcpu ? "weighted" : "raw"); header_text = format_header(uname_field); reset_display(); putchar('\r'); From fcc3d62fa50d0433048a71d54e385ef75ec06011 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Mon, 18 Jul 2011 21:15:47 +0000 Subject: [PATCH 008/452] Rework the dynamic per-CPU stats code a bit. Always set 'statics->ncpus' to the maximum number of CPUs to ensure that lcpustates[] array is always allocated to the maximum size. Previously, if top was started without per-CPU stats it would allocate a smaller lcpustates[] array. When per-CPU stats were then enabled, it would overflow the array and trash the cpustates_columns[] array causing the CPU stats to be printed in the wrong locations. Approved by: re (kib) MFC after: 1 week --- contrib/top/display.c | 16 ++++++++++++++-- contrib/top/top.c | 2 +- usr.bin/top/machine.c | 8 +++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/contrib/top/display.c b/contrib/top/display.c index a5a4e9e9f42..89795c05e4d 100644 --- a/contrib/top/display.c +++ b/contrib/top/display.c @@ -156,18 +156,30 @@ int display_updatecpus(statics) struct statics *statics; { + register int *lp; register int lines; register int i; /* call resize to do the dirty work */ lines = display_resize(); - num_cpus = statics->ncpus; + if (pcpu_stats) + num_cpus = statics->ncpus; + else + num_cpus = 1; cpustates_column = 5; /* CPU: */ if (num_cpus != 1) cpustates_column += 2; /* CPU 0: */ for (i = num_cpus; i > 9; i /= 10) cpustates_column++; + /* fill the "last" array with all -1s, to insure correct updating */ + lp = lcpustates; + i = num_cpustates * num_cpus; + while (--i >= 0) + { + *lp++ = -1; + } + return(lines); } @@ -197,7 +209,7 @@ struct statics *statics; num_swap = string_count(swap_names); lswap = (int *)malloc(num_swap * sizeof(int)); num_cpustates = string_count(cpustate_names); - lcpustates = (int *)malloc(num_cpustates * sizeof(int) * num_cpus); + lcpustates = (int *)malloc(num_cpustates * sizeof(int) * statics->ncpus); cpustate_columns = (int *)malloc(num_cpustates * sizeof(int)); memory_names = statics->memory_names; diff --git a/contrib/top/top.c b/contrib/top/top.c index 1a017a3cd20..e7e27d54a97 100644 --- a/contrib/top/top.c +++ b/contrib/top/top.c @@ -1094,7 +1094,7 @@ restart: new_message(MT_standout | MT_delayed, " Displaying %sCPU statistics.", pcpu_stats ? "per-" : "global "); - toggle_pcpustats(&statics); + toggle_pcpustats(); max_topn = display_updatecpus(&statics); reset_display(); putchar('\r'); diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c index 5e53d5b36ed..b815ffc67e7 100644 --- a/usr.bin/top/machine.c +++ b/usr.bin/top/machine.c @@ -241,7 +241,7 @@ static void getsysctl(const char *name, void *ptr, size_t len); static int swapmode(int *retavail, int *retfree); void -toggle_pcpustats(struct statics *statics) +toggle_pcpustats(void) { if (ncpus == 1) @@ -256,7 +256,6 @@ toggle_pcpustats(struct statics *statics) y_header += ncpus - 1; /* 6 */ y_procs += ncpus - 1; /* 7 */ Header_lines += ncpus - 1; /* 7 */ - statics->ncpus = ncpus; } else { y_mem = 3; y_swap = 4; @@ -265,7 +264,6 @@ toggle_pcpustats(struct statics *statics) y_header = 6; y_procs = 7; Header_lines = 7; - statics->ncpus = 1; } } @@ -356,10 +354,10 @@ machine_init(struct statics *statics, char do_unames) pcpu_cp_old = calloc(1, size); pcpu_cp_diff = calloc(1, size); pcpu_cpu_states = calloc(1, size); - statics->ncpus = 1; + statics->ncpus = ncpus; if (pcpu_stats) - toggle_pcpustats(statics); + toggle_pcpustats(); /* all done! */ return (0); From 68b739cd6f5af9b2f4f03fe7bb9627dee6e03c42 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Tue, 19 Jul 2011 00:37:24 +0000 Subject: [PATCH 009/452] Add the possibility to specify from kernel configs MAXCPU value. This patch is going to help in cases like mips flavours where you want a more granular support on MAXCPU. No MFC is previewed for this patch. Tested by: pluknet Approved by: re (kib) --- sys/amd64/include/param.h | 2 ++ sys/arm/include/param.h | 2 ++ sys/conf/NOTES | 4 ++++ sys/conf/options | 1 + sys/i386/include/param.h | 2 ++ sys/ia64/include/param.h | 2 ++ sys/mips/include/param.h | 2 ++ sys/powerpc/include/param.h | 2 ++ sys/sparc64/include/param.h | 2 ++ 9 files changed, 19 insertions(+) diff --git a/sys/amd64/include/param.h b/sys/amd64/include/param.h index 9a742f94e9b..74d4d21827b 100644 --- a/sys/amd64/include/param.h +++ b/sys/amd64/include/param.h @@ -64,7 +64,9 @@ #endif #if defined(SMP) || defined(KLD_MODULE) +#ifndef MAXCPU #define MAXCPU 32 +#endif #else #define MAXCPU 1 #endif diff --git a/sys/arm/include/param.h b/sys/arm/include/param.h index 1694bc43c5e..96a70388f1f 100644 --- a/sys/arm/include/param.h +++ b/sys/arm/include/param.h @@ -61,7 +61,9 @@ #define MID_MACHINE MID_ARM6 #if defined(SMP) || defined(KLD_MODULE) +#ifndef MAXCPU #define MAXCPU 2 +#endif #else #define MAXCPU 1 #endif /* SMP || KLD_MODULE */ diff --git a/sys/conf/NOTES b/sys/conf/NOTES index d3951e34fc2..0753c1d5c46 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -213,6 +213,10 @@ options SCHED_STATS # Mandatory: options SMP # Symmetric MultiProcessor Kernel +# MAXCPU defines the maximum number of CPUs that can boot in the system. +# A default value should be already present, for every architecture. +options MAXCPU=32 + # ADAPTIVE_MUTEXES changes the behavior of blocking mutexes to spin # if the thread that currently owns the mutex is executing on another # CPU. This behaviour is enabled by default, so this option can be used diff --git a/sys/conf/options b/sys/conf/options index 9f1ac80dbb9..b8f9958ca6f 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -570,6 +570,7 @@ DFLTPHYS opt_global.h DIAGNOSTIC opt_global.h INVARIANT_SUPPORT opt_global.h INVARIANTS opt_global.h +MAXCPU opt_global.h MAXPHYS opt_global.h MCLSHIFT opt_global.h MUTEX_DEBUG opt_global.h diff --git a/sys/i386/include/param.h b/sys/i386/include/param.h index d95fcf3fd08..6a0495c4c95 100644 --- a/sys/i386/include/param.h +++ b/sys/i386/include/param.h @@ -68,7 +68,9 @@ #define MID_MACHINE MID_I386 #if defined(SMP) || defined(KLD_MODULE) +#ifndef MAXCPU #define MAXCPU 32 +#endif #else #define MAXCPU 1 #endif /* SMP || KLD_MODULE */ diff --git a/sys/ia64/include/param.h b/sys/ia64/include/param.h index 36b27e04890..a3684ab09e3 100644 --- a/sys/ia64/include/param.h +++ b/sys/ia64/include/param.h @@ -62,7 +62,9 @@ #endif #if defined(SMP) || defined(KLD_MODULE) +#ifndef MAXCPU #define MAXCPU 32 +#endif #else #define MAXCPU 1 #endif diff --git a/sys/mips/include/param.h b/sys/mips/include/param.h index 0b1ea9837af..5f25c81c98f 100644 --- a/sys/mips/include/param.h +++ b/sys/mips/include/param.h @@ -87,7 +87,9 @@ #ifdef SMP #define MAXSMPCPU 32 +#ifndef MAXCPU #define MAXCPU MAXSMPCPU +#endif #else #define MAXSMPCPU 1 #define MAXCPU 1 diff --git a/sys/powerpc/include/param.h b/sys/powerpc/include/param.h index 06b131c2a67..f95cc089472 100644 --- a/sys/powerpc/include/param.h +++ b/sys/powerpc/include/param.h @@ -68,7 +68,9 @@ #endif #if defined(SMP) || defined(KLD_MODULE) +#ifndef MAXCPU #define MAXCPU 8 +#endif #else #define MAXCPU 1 #endif /* SMP || KLD_MODULE */ diff --git a/sys/sparc64/include/param.h b/sys/sparc64/include/param.h index af026b293f2..9d11a2fc11e 100644 --- a/sys/sparc64/include/param.h +++ b/sys/sparc64/include/param.h @@ -50,7 +50,9 @@ #define MID_MACHINE MID_SPARC64 #if defined(SMP) || defined(KLD_MODULE) +#ifndef MAXCPU #define MAXCPU 16 +#endif #else #define MAXCPU 1 #endif /* SMP || KLD_MODULE */ From 732772c7011a4d51329d719dd8bb11e516d55141 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Tue, 19 Jul 2011 12:41:57 +0000 Subject: [PATCH 010/452] On 64 bit architectures size_t is 8 bytes, thus it should use an 8 bytes storage. Fix the sintrcnt/sintrnames specification. No MFC is previewed for this patch. Reported, reviewed and tested by: marcel Approved by: re (kib) --- sys/ia64/ia64/locore.S | 4 ++-- sys/mips/mips/exception.S | 8 ++++++++ sys/powerpc/aim/locore64.S | 4 ++-- sys/sparc64/sparc64/exception.S | 4 ++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/sys/ia64/ia64/locore.S b/sys/ia64/ia64/locore.S index d4c1190f5d8..f79ca68f37c 100644 --- a/sys/ia64/ia64/locore.S +++ b/sys/ia64/ia64/locore.S @@ -207,13 +207,13 @@ intr_n = 1 intr_n = intr_n + 1 .endr EXPORT(sintrnames) - .word INTRCNT_COUNT * INTRNAME_LEN + data8 INTRCNT_COUNT * INTRNAME_LEN .align 8 EXPORT(intrcnt) .fill INTRCNT_COUNT, 8, 0 EXPORT(sintrcnt) - .word INTRCNT_COUNT + data8 INTRCNT_COUNT * 8 .text // in0: image base diff --git a/sys/mips/mips/exception.S b/sys/mips/mips/exception.S index ed7554bc7c0..6eafbdcc640 100644 --- a/sys/mips/mips/exception.S +++ b/sys/mips/mips/exception.S @@ -1140,13 +1140,21 @@ END(MipsFPTrap) intrnames: .space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 sintrnames: +#ifdef __mips_n64 + .quad INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 +#else .word INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 +#endif .align 4 intrcnt: .space INTRCNT_COUNT * 4 * 2 sintrcnt: +#ifdef __mips_n64 + .quad INTRCNT_COUNT * 4 * 2 +#else .word INTRCNT_COUNT * 4 * 2 +#endif /* diff --git a/sys/powerpc/aim/locore64.S b/sys/powerpc/aim/locore64.S index 9a54b79a4cd..64e4e628e9d 100644 --- a/sys/powerpc/aim/locore64.S +++ b/sys/powerpc/aim/locore64.S @@ -91,13 +91,13 @@ GLOBAL(esym) GLOBAL(intrnames) .space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 GLOBAL(sintrnames) - .word INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 + .quad INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 .align 4 GLOBAL(intrcnt) .space INTRCNT_COUNT * 4 * 2 GLOBAL(sintrcnt) - .word INTRCNT_COUNT * 4 * 2 + .quad INTRCNT_COUNT * 4 * 2 .text .globl btext diff --git a/sys/sparc64/sparc64/exception.S b/sys/sparc64/sparc64/exception.S index fa2f2d5cfd4..222ddeadd21 100644 --- a/sys/sparc64/sparc64/exception.S +++ b/sys/sparc64/sparc64/exception.S @@ -375,13 +375,13 @@ END(rsf_fatal) intrnames: .space IV_MAX * (MAXCOMLEN + 1) sintrnames: - .word IV_MAX * (MAXCOMLEN + 1) + .quad IV_MAX * (MAXCOMLEN + 1) .globl intrcnt, sintrcnt intrcnt: .space IV_MAX * 8 sintrcnt: - .word IV_MAX * 8 + .quad IV_MAX * 8 .text From 786ef92b7b0c86c4e0c92509abade475a7be9631 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Tue, 19 Jul 2011 13:00:30 +0000 Subject: [PATCH 011/452] Bump MAXCPU for amd64, ia64 and XLP mips appropriately. From now on, default values for FreeBSD will be 64 maxiumum supported CPUs on amd64 and ia64 and 128 for XLP. All the other architectures seem already capped appropriately (with the exception of sparc64 which needs further support on jalapeno flavour). Bump __FreeBSD_version in order to reflect KBI/KPI brekage introduced during the infrastructure cleanup for supporting MAXCPU > 32. This covers cpumask_t retiral too. The switch is considered completed at the present time, so for whatever bug you may experience that is reconducible to that area, please report immediately. Requested by: marcel, jchandra Tested by: pluknet, sbruno Approved by: re (kib) --- sys/amd64/include/param.h | 2 +- sys/ia64/include/param.h | 2 +- sys/mips/conf/XLP | 1 + sys/mips/conf/XLP64 | 1 + sys/mips/conf/XLPN32 | 1 + sys/sys/param.h | 2 +- 6 files changed, 6 insertions(+), 3 deletions(-) diff --git a/sys/amd64/include/param.h b/sys/amd64/include/param.h index 74d4d21827b..6dbeb403592 100644 --- a/sys/amd64/include/param.h +++ b/sys/amd64/include/param.h @@ -65,7 +65,7 @@ #if defined(SMP) || defined(KLD_MODULE) #ifndef MAXCPU -#define MAXCPU 32 +#define MAXCPU 64 #endif #else #define MAXCPU 1 diff --git a/sys/ia64/include/param.h b/sys/ia64/include/param.h index a3684ab09e3..d996441f624 100644 --- a/sys/ia64/include/param.h +++ b/sys/ia64/include/param.h @@ -63,7 +63,7 @@ #if defined(SMP) || defined(KLD_MODULE) #ifndef MAXCPU -#define MAXCPU 32 +#define MAXCPU 64 #endif #else #define MAXCPU 1 diff --git a/sys/mips/conf/XLP b/sys/mips/conf/XLP index 6843534b72f..48d8df35f26 100644 --- a/sys/mips/conf/XLP +++ b/sys/mips/conf/XLP @@ -36,6 +36,7 @@ options SCHED_ULE # ULE scheduler options SMP options PREEMPTION # Enable kernel thread preemption #options FULL_PREEMPTION # Enable kernel thread preemption +options MAXCPU=128 # XLP can probe 128 CPUs options INET # InterNETworking options INET6 # IPv6 communications protocols options FFS # Berkeley Fast Filesystem diff --git a/sys/mips/conf/XLP64 b/sys/mips/conf/XLP64 index 997a1f61c7f..d70098e88cc 100644 --- a/sys/mips/conf/XLP64 +++ b/sys/mips/conf/XLP64 @@ -38,6 +38,7 @@ options SCHED_ULE # ULE scheduler options SMP options PREEMPTION # Enable kernel thread preemption #options FULL_PREEMPTION # Enable kernel thread preemption +options MAXCPU=128 # XLP can probe 128 CPUs options INET # InterNETworking options INET6 # IPv6 communications protocols options FFS # Berkeley Fast Filesystem diff --git a/sys/mips/conf/XLPN32 b/sys/mips/conf/XLPN32 index 97c73a80d69..81cd17f5fec 100644 --- a/sys/mips/conf/XLPN32 +++ b/sys/mips/conf/XLPN32 @@ -37,6 +37,7 @@ options SCHED_ULE # ULE scheduler options SMP options PREEMPTION # Enable kernel thread preemption #options FULL_PREEMPTION # Enable kernel thread preemption +options MAXCPU=128 # XLP can probe 128 CPUs options INET # InterNETworking options INET6 # IPv6 communications protocols options FFS # Berkeley Fast Filesystem diff --git a/sys/sys/param.h b/sys/sys/param.h index 4f54eaca13a..fbb43dfcf76 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -58,7 +58,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 900039 /* Master, propagated to newvers */ +#define __FreeBSD_version 900040 /* Master, propagated to newvers */ #ifdef _KERNEL #define P_OSREL_SIGSEGV 700004 From edf26ab83e5d4f274cfee43495472aef14b39b93 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Tue, 19 Jul 2011 14:57:59 +0000 Subject: [PATCH 012/452] Remove pc_name member of struct pcpu. pc_name is only included when KTR option is and it does introduce a subdle KBI breakage that totally breaks vmstat when world and kernel are not in sync. Besides, it is not used somewhere. In collabouration with: pluknet Reviewed by: jhb Approved by: re (kib) --- sys/kern/subr_pcpu.c | 3 --- sys/sys/pcpu.h | 3 --- 2 files changed, 6 deletions(-) diff --git a/sys/kern/subr_pcpu.c b/sys/kern/subr_pcpu.c index ec6b590d25d..ba76bb249ec 100644 --- a/sys/kern/subr_pcpu.c +++ b/sys/kern/subr_pcpu.c @@ -92,9 +92,6 @@ pcpu_init(struct pcpu *pcpu, int cpuid, size_t size) cpu_pcpu_init(pcpu, cpuid, size); pcpu->pc_rm_queue.rmq_next = &pcpu->pc_rm_queue; pcpu->pc_rm_queue.rmq_prev = &pcpu->pc_rm_queue; -#ifdef KTR - snprintf(pcpu->pc_name, sizeof(pcpu->pc_name), "CPU %d", cpuid); -#endif } void diff --git a/sys/sys/pcpu.h b/sys/sys/pcpu.h index b25fcc89cb0..e39f07baacc 100644 --- a/sys/sys/pcpu.h +++ b/sys/sys/pcpu.h @@ -165,9 +165,6 @@ struct pcpu { u_int pc_cpuid; /* This cpu number */ STAILQ_ENTRY(pcpu) pc_allcpu; struct lock_list_entry *pc_spinlocks; -#ifdef KTR - char pc_name[PCPU_NAME_LEN]; /* String name for KTR */ -#endif struct vmmeter pc_cnt; /* VM stats counters */ long pc_cp_time[CPUSTATES]; /* statclock ticks */ struct device *pc_device; From 2ad10b365ca430a5a9a45c0793de3aabf0ae41f9 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 19 Jul 2011 15:22:35 +0000 Subject: [PATCH 013/452] This patch enables listing DFS related flags when 'ifconfig -v wlanX list channel' is run. The following new options are introduced: * D: channel requires DFS * R: channel has a radar event * I: channel has detected inteference * C: the CAC period has completed on a channel that requires it (ie, DFS + PASSIVE.) It's relevant for developing, debugging and using the DFS and interference options. Approved by: re (bz) --- sbin/ifconfig/ifieee80211.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/sbin/ifconfig/ifieee80211.c b/sbin/ifconfig/ifieee80211.c index 2104e0d79b3..b33604ffcec 100644 --- a/sbin/ifconfig/ifieee80211.c +++ b/sbin/ifconfig/ifieee80211.c @@ -3451,10 +3451,21 @@ print_chaninfo(const struct ieee80211_channel *c, int verb) { char buf[14]; + if (verb) + printf("Channel %3u : %u%c%c%c%c%c MHz%-14.14s", + ieee80211_mhz2ieee(c->ic_freq, c->ic_flags), c->ic_freq, + IEEE80211_IS_CHAN_PASSIVE(c) ? '*' : ' ', + IEEE80211_IS_CHAN_DFS(c) ? 'D' : ' ', + IEEE80211_IS_CHAN_RADAR(c) ? 'R' : ' ', + IEEE80211_IS_CHAN_CWINT(c) ? 'I' : ' ', + IEEE80211_IS_CHAN_CACDONE(c) ? 'C' : ' ', + get_chaninfo(c, verb, buf, sizeof(buf))); + else printf("Channel %3u : %u%c MHz%-14.14s", - ieee80211_mhz2ieee(c->ic_freq, c->ic_flags), c->ic_freq, - IEEE80211_IS_CHAN_PASSIVE(c) ? '*' : ' ', - get_chaninfo(c, verb, buf, sizeof(buf))); + ieee80211_mhz2ieee(c->ic_freq, c->ic_flags), c->ic_freq, + IEEE80211_IS_CHAN_PASSIVE(c) ? '*' : ' ', + get_chaninfo(c, verb, buf, sizeof(buf))); + } static int From 886bbec19949f6175bdecb2db86804c6f8320145 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 19 Jul 2011 15:24:44 +0000 Subject: [PATCH 014/452] This sets the BSS channel for each VAP for the given interface. It's only relevant in STA mode. The CSA forces a channel switch for the interface, but doesn't update the VAP channel. Approved by: re (bz) --- sys/net80211/ieee80211_proto.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sys/net80211/ieee80211_proto.c b/sys/net80211/ieee80211_proto.c index 8c8ee529815..7092034777b 100644 --- a/sys/net80211/ieee80211_proto.c +++ b/sys/net80211/ieee80211_proto.c @@ -1501,6 +1501,11 @@ ieee80211_csa_startswitch(struct ieee80211com *ic, ieee80211_notify_csa(ic, c, mode, count); } +/* + * Complete the channel switch by transitioning all CSA VAPs to RUN. + * This is called by both the completion and cancellation functions + * so each VAP is placed back in the RUN state and can thus transmit. + */ static void csa_completeswitch(struct ieee80211com *ic) { @@ -1518,6 +1523,12 @@ csa_completeswitch(struct ieee80211com *ic) * Complete an 802.11h channel switch started by ieee80211_csa_startswitch. * We clear state and move all vap's in CSA state to RUN state * so they can again transmit. + * + * Although this may not be completely correct, update the BSS channel + * for each VAP to the newly configured channel. The setcurchan sets + * the current operating channel for the interface (so the radio does + * switch over) but the VAP BSS isn't updated, leading to incorrectly + * reported information via ioctl. */ void ieee80211_csa_completeswitch(struct ieee80211com *ic) @@ -1527,6 +1538,10 @@ ieee80211_csa_completeswitch(struct ieee80211com *ic) KASSERT(ic->ic_flags & IEEE80211_F_CSAPENDING, ("csa not pending")); ieee80211_setcurchan(ic, ic->ic_csa_newchan); + TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) + if (vap->iv_state == IEEE80211_S_CSA) + vap->iv_bss->ni_chan = ic->ic_curchan; + csa_completeswitch(ic); } From 6338c57958b2acb79e0a459b84a4357f77993ae3 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Tue, 19 Jul 2011 16:50:55 +0000 Subject: [PATCH 015/452] Remove explicit MAXCPU usage from sys/pcpu.h avoiding a namespace pollution. That is a step further in the direction of building correct policies for userland and modules on how to deal with the number of maxcpus at runtime. Reported by: jhb Reviewed and tested by: pluknet Approved by: re (kib) --- sys/kern/sched_ule.c | 2 +- sys/sys/pcpu.h | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c index 05267f3d6ad..9bfb9e76224 100644 --- a/sys/kern/sched_ule.c +++ b/sys/kern/sched_ule.c @@ -84,7 +84,7 @@ dtrace_vtime_switch_func_t dtrace_vtime_switch_func; #define TS_NAME_LEN (MAXCOMLEN + sizeof(" td ") + sizeof(__XSTRING(UINT_MAX))) #define TDQ_NAME_LEN (sizeof("sched lock ") + sizeof(__XSTRING(MAXCPU))) -#define TDQ_LOADNAME_LEN (PCPU_NAME_LEN + sizeof(" load")) +#define TDQ_LOADNAME_LEN (sizeof("CPU ") + sizeof(__XSTRING(MAXCPU)) - 1 + sizeof(" load")) /* * Thread scheduler specific section. All fields are protected diff --git a/sys/sys/pcpu.h b/sys/sys/pcpu.h index e39f07baacc..4a4ec005c0f 100644 --- a/sys/sys/pcpu.h +++ b/sys/sys/pcpu.h @@ -146,8 +146,6 @@ struct rm_queue { struct rm_queue* volatile rmq_prev; }; -#define PCPU_NAME_LEN (sizeof("CPU ") + sizeof(__XSTRING(MAXCPU)) - 1) - /* * This structure maps out the global data that needs to be kept on a * per-cpu basis. The members are accessed via the PCPU_GET/SET/PTR @@ -200,7 +198,7 @@ struct pcpu { STAILQ_HEAD(cpuhead, pcpu); extern struct cpuhead cpuhead; -extern struct pcpu *cpuid_to_pcpu[MAXCPU]; +extern struct pcpu *cpuid_to_pcpu[]; #define curcpu PCPU_GET(cpuid) #define curproc (curthread->td_proc) From 6f16ec31f72527c46b246bc939fe5fcb366d1eb5 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 20 Jul 2011 00:36:47 +0000 Subject: [PATCH 016/452] Fix brokenness introduced by my last commit. Approved by: re (implicit) --- sys/net80211/ieee80211_proto.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/net80211/ieee80211_proto.c b/sys/net80211/ieee80211_proto.c index 7092034777b..8dee3f7f32d 100644 --- a/sys/net80211/ieee80211_proto.c +++ b/sys/net80211/ieee80211_proto.c @@ -1533,6 +1533,8 @@ csa_completeswitch(struct ieee80211com *ic) void ieee80211_csa_completeswitch(struct ieee80211com *ic) { + struct ieee80211vap *vap; + IEEE80211_LOCK_ASSERT(ic); KASSERT(ic->ic_flags & IEEE80211_F_CSAPENDING, ("csa not pending")); From 2168aaa506e673458dfc1a93d9690f5bc3d8c1a4 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 20 Jul 2011 05:59:28 +0000 Subject: [PATCH 017/452] This patch removes a check in ifconfig which disables HT/40 channels on frequency bands with DFS. All Atheros chipsets >= AR9001 support radar event detection on HT40 extension channels. This should be a chipset specific item rather than enforced in the regulatory domain database. In addition, it's irrelevant for STA mode, as the radar detection is done by the access point, not the STA. Approved by: re (kib) --- sbin/ifconfig/ifieee80211.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/sbin/ifconfig/ifieee80211.c b/sbin/ifconfig/ifieee80211.c index b33604ffcec..77fcc8c2e9f 100644 --- a/sbin/ifconfig/ifieee80211.c +++ b/sbin/ifconfig/ifieee80211.c @@ -2027,18 +2027,6 @@ regdomain_addchans(struct ieee80211req_chaninfo *ci, "HT40 channel\n", freq); continue; } - /* - * DFS and HT40 don't mix. This should be - * expressed in the regdomain database but - * just in case enforce it here. - */ - if ((chanFlags & IEEE80211_CHAN_HT40) && - (flags & IEEE80211_CHAN_DFS)) { - if (verbose) - printf("%u: skip, HT40+DFS " - "not permitted\n", freq); - continue; - } /* NB: HT attribute comes from caller */ flags &= ~IEEE80211_CHAN_HT; flags |= chanFlags & IEEE80211_CHAN_HT; From c30b9b51697c4e90459d26bfbdf3d7ab0c81b5c2 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Wed, 20 Jul 2011 09:53:35 +0000 Subject: [PATCH 018/452] Export capability information via sysctls. When reporting on a capability, flag the fact that it is a capability, but also unwrap to report all of the usual information about the underlying file. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- sys/kern/kern_descrip.c | 32 ++++++++++++++++++++++++++++++++ sys/sys/user.h | 6 +++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 829ece218b0..f3f9cbcaf46 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -2946,6 +2946,22 @@ sysctl_kern_proc_ofiledesc(SYSCTL_HANDLER_ARGS) so = NULL; tp = NULL; kif->kf_fd = i; + +#ifdef CAPABILITIES + /* + * When reporting a capability, most fields will be from the + * underlying object, but do mark as a capability. With + * ofiledesc, we don't have a field to export the cap_rights_t, + * but we do with the new filedesc. + */ + if (fp->f_type == DTYPE_CAPABILITY) { + kif->kf_flags |= KF_FLAG_CAPABILITY; + (void)cap_funwrap(fp, 0, &fp); + } +#else + KASSERT(fp->f_type != DTYPE_CAPABILITY, + ("sysctl_kern_proc_ofiledesc: saw capability")); +#endif switch (fp->f_type) { case DTYPE_VNODE: kif->kf_type = KF_TYPE_VNODE; @@ -3262,6 +3278,22 @@ sysctl_kern_proc_filedesc(SYSCTL_HANDLER_ARGS) if ((fp = fdp->fd_ofiles[i]) == NULL) continue; data = NULL; + +#ifdef CAPABILITIES + /* + * When reporting a capability, most fields will be from the + * underlying object, but do mark as a capability and export + * the capability rights mask. + */ + if (fp->f_type == DTYPE_CAPABILITY) { + kif->kf_flags |= KF_FLAG_CAPABILITY; + kif->kf_cap_rights = cap_rights(fp); + (void)cap_funwrap(fp, 0, &fp); + } +#else /* !CAPABILITIES */ + KASSERT(fp->f_type != DTYPE_CAPABILITY, + ("sysctl_kern_proc_filedesc: saw capability")); +#endif switch (fp->f_type) { case DTYPE_VNODE: type = KF_TYPE_VNODE; diff --git a/sys/sys/user.h b/sys/sys/user.h index 1863f86ffe9..ecf4ea94013 100644 --- a/sys/sys/user.h +++ b/sys/sys/user.h @@ -251,6 +251,7 @@ struct user { #define KF_TYPE_SHM 8 #define KF_TYPE_SEM 9 #define KF_TYPE_PTS 10 +/* no KF_TYPE_CAPABILITY (11), since capabilities wrap other file objects */ #define KF_TYPE_UNKNOWN 255 #define KF_VTYPE_VNON 0 @@ -286,6 +287,7 @@ struct user { #define KF_FLAG_TRUNC 0x00001000 #define KF_FLAG_EXCL 0x00002000 #define KF_FLAG_EXEC 0x00004000 +#define KF_FLAG_CAPABILITY 0x00008000 /* * Old format. Has variable hidden padding due to alignment. @@ -378,7 +380,9 @@ struct kinfo_file { } kf_un; uint16_t kf_status; /* Status flags. */ uint16_t kf_pad1; /* Round to 32 bit alignment. */ - int _kf_ispare[7]; /* Space for more stuff. */ + int _kf_ispare0; /* Space for more stuff. */ + cap_rights_t kf_cap_rights; /* Capability rights. */ + int _kf_ispare[4]; /* Space for more stuff. */ /* Truncated before copyout in sysctl */ char kf_path[PATH_MAX]; /* Path to file, if any. */ }; From e2e849485f77dd4607659fee2a2228bb67f6bb93 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 20 Jul 2011 12:46:58 +0000 Subject: [PATCH 019/452] These two are ath_hal regulatory domain updates from the Atheros reference driver. * Australia should use FCC3_WORLD * Add some new SKUs; these are just the EEPROM values and haven't been fully defined yet. As such they won't affect anything. Obtained from: Atheros Approved by: re (kib) --- sys/dev/ath/ath_hal/ah_regdomain/ah_rd_ctry.h | 4 +- .../ath/ath_hal/ah_regdomain/ah_rd_regenum.h | 100 +++++++++++++----- 2 files changed, 76 insertions(+), 28 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah_regdomain/ah_rd_ctry.h b/sys/dev/ath/ath_hal/ah_regdomain/ah_rd_ctry.h index a85bd92d41f..af4824c3b5a 100644 --- a/sys/dev/ath/ath_hal/ah_regdomain/ah_rd_ctry.h +++ b/sys/dev/ath/ath_hal/ah_regdomain/ah_rd_ctry.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting - * Copyright (c) 2005-2006 Atheros Communications, Inc. + * Copyright (c) 2005-2011 Atheros Communications, Inc. * All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any @@ -34,7 +34,7 @@ static COUNTRY_CODE_TO_ENUM_RD allCountries[] = { { CTRY_ALGERIA, NULL1_WORLD }, { CTRY_ARGENTINA, APL3_WORLD }, { CTRY_ARMENIA, ETSI4_WORLD }, - { CTRY_AUSTRALIA, FCC2_WORLD }, + { CTRY_AUSTRALIA, FCC3_WORLD }, { CTRY_AUSTRIA, ETSI1_WORLD }, { CTRY_AZERBAIJAN, ETSI4_WORLD }, { CTRY_BAHRAIN, APL6_WORLD }, diff --git a/sys/dev/ath/ath_hal/ah_regdomain/ah_rd_regenum.h b/sys/dev/ath/ath_hal/ah_regdomain/ah_rd_regenum.h index f68743b078b..bc569cb00a3 100644 --- a/sys/dev/ath/ath_hal/ah_regdomain/ah_rd_regenum.h +++ b/sys/dev/ath/ath_hal/ah_regdomain/ah_rd_regenum.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting - * Copyright (c) 2005-2006 Atheros Communications, Inc. + * Copyright (c) 2005-2011 Atheros Communications, Inc. * All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any @@ -46,6 +46,7 @@ enum { FCC1_WORLD = 0x11, /* Hong Kong */ FCC4_FCCA = 0x12, /* USA - Public Safety */ FCC5_FCCB = 0x13, /* USA w/ 1/2 and 1/4 width channels */ + FCC6_FCCA = 0x14, /* Canada for AP only */ FCC2_FCCA = 0x20, /* Canada */ FCC2_WORLD = 0x21, /* Australia & HK */ @@ -62,6 +63,8 @@ enum { ETSI4_ETSIC = 0x38, ETSI5_WORLD = 0x39, ETSI6_WORLD = 0x34, /* Bulgaria */ + ETSI8_WORLD = 0x3D, /* Russia */ + ETSI9_WORLD = 0x3E, /* Ukraine */ ETSI_RESERVED = 0x33, /* Reserved (Do not used) */ MKK1_MKKA = 0x40, /* Japan (JP1) */ @@ -77,8 +80,9 @@ enum { MKK1_MKKA1 = 0x4A, /* Japan (JE1) */ MKK1_MKKA2 = 0x4B, /* Japan (JE2) */ MKK1_MKKC = 0x4C, /* Japan (MKK1_MKKA,except Ch14) */ + APL2_FCCA = 0x4D, /* Mobile customer */ - APL3_FCCA = 0x50, + APL3_FCCA = 0x50, APL1_WORLD = 0x52, /* Latin America */ APL1_FCCA = 0x53, APL1_APLA = 0x54, @@ -86,9 +90,10 @@ enum { APL2_ETSIC = 0x56, /* Venezuela */ APL5_WORLD = 0x58, /* Chile */ APL6_WORLD = 0x5B, /* Singapore */ - APL7_FCCA = 0x5C, /* Taiwan 5.47 Band */ - APL8_WORLD = 0x5D, /* Malaysia 5GHz */ - APL9_WORLD = 0x5E, /* Korea 5GHz */ + APL7_FCCA = 0x5C, /* Taiwan 5.47 Band */ + APL8_WORLD = 0x5D, /* Malaysia 5GHz */ + APL9_WORLD = 0x5E, /* Korea 5GHz; before 11/2007; now APs only */ + APL10_WORLD = 0x5F, /* Korea 5GHz; After 11/2007; STAs only */ /* * World mode SKUs @@ -97,16 +102,17 @@ enum { WOR1_WORLD = 0x61, /* World1 (WO1 SKU) */ WOR2_WORLD = 0x62, /* World2 (WO2 SKU) */ WOR3_WORLD = 0x63, /* World3 (WO3 SKU) */ - WOR4_WORLD = 0x64, /* World4 (WO4 SKU) */ - WOR5_ETSIC = 0x65, /* World5 (WO5 SKU) */ + WOR4_WORLD = 0x64, /* World4 (WO4 SKU) */ + WOR5_ETSIC = 0x65, /* World5 (WO5 SKU) */ WOR01_WORLD = 0x66, /* World0-1 (WW0-1 SKU) */ WOR02_WORLD = 0x67, /* World0-2 (WW0-2 SKU) */ EU1_WORLD = 0x68, /* Same as World0-2 (WW0-2 SKU), except active scan ch1-13. No ch14 */ - WOR9_WORLD = 0x69, /* World9 (WO9 SKU) */ - WORA_WORLD = 0x6A, /* WorldA (WOA SKU) */ + WOR9_WORLD = 0x69, /* World9 (WO9 SKU) */ + WORA_WORLD = 0x6A, /* WorldA (WOA SKU) */ WORB_WORLD = 0x6B, /* WorldB (WOB SKU) */ + WORC_WORLD = 0x6C, /* WorldC (WOC SKU) */ MKK3_MKKB = 0x80, /* Japan UNI-1 even + MKKB */ MKK3_MKKA2 = 0x81, /* Japan UNI-1 even + MKKA2 */ @@ -132,17 +138,48 @@ enum { MKK8_MKKA2 = 0x90, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKA2 */ MKK8_MKKC = 0x91, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKC */ - /* Following definitions are used only by s/w to map old - * Japan SKUs. + MKK14_MKKA1 = 0x92, /* Japan UNI-1 even + UNI-1 odd + 4.9GHz + MKKA1 */ + MKK15_MKKA1 = 0x93, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + 4.9GHz + MKKA1 */ + + MKK10_FCCA = 0xD0, /* Japan UNI-1 even + UNI-2 + 4.9GHz + FCCA */ + MKK10_MKKA1 = 0xD1, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKA1 */ + MKK10_MKKC = 0xD2, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKC */ + MKK10_MKKA2 = 0xD3, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKA2 */ + + MKK11_MKKA = 0xD4, /* Japan UNI-1 even + UNI-2 + mid-band + 4.9GHz + MKKA */ + MKK11_FCCA = 0xD5, /* Japan UNI-1 even + UNI-2 + mid-band + 4.9GHz + FCCA */ + MKK11_MKKA1 = 0xD6, /* Japan UNI-1 even + UNI-2 + mid-band + 4.9GHz + MKKA1 */ + MKK11_MKKC = 0xD7, /* Japan UNI-1 even + UNI-2 + mid-band + 4.9GHz + MKKC */ + MKK11_MKKA2 = 0xD8, /* Japan UNI-1 even + UNI-2 + mid-band + 4.9GHz + MKKA2 */ + + MKK12_MKKA = 0xD9, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + 4.9GHz + MKKA */ + MKK12_FCCA = 0xDA, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + 4.9GHz + FCCA */ + MKK12_MKKA1 = 0xDB, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + 4.9GHz + MKKA1 */ + MKK12_MKKC = 0xDC, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + 4.9GHz + MKKC */ + MKK12_MKKA2 = 0xDD, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + 4.9GHz + MKKA2 */ + + MKK13_MKKB = 0xDE, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKB + All passive + no adhoc */ + + /* + * Following definitions are used only by s/w to map old + * Japan SKUs. */ - MKK3_MKKA = 0xF0, /* Japan UNI-1 even + MKKA */ - MKK3_MKKA1 = 0xF1, /* Japan UNI-1 even + MKKA1 */ - MKK3_FCCA = 0xF2, /* Japan UNI-1 even + FCCA */ - MKK4_MKKA = 0xF3, /* Japan UNI-1 even + UNI-2 + MKKA */ - MKK4_MKKA1 = 0xF4, /* Japan UNI-1 even + UNI-2 + MKKA1 */ - MKK4_FCCA = 0xF5, /* Japan UNI-1 even + UNI-2 + FCCA */ - MKK9_MKKA = 0xF6, /* Japan UNI-1 even + 4.9GHz */ - MKK10_MKKA = 0xF7, /* Japan UNI-1 even + UNI-2 + 4.9GHz */ + MKK3_MKKA = 0xF0, /* Japan UNI-1 even + MKKA */ + MKK3_MKKA1 = 0xF1, /* Japan UNI-1 even + MKKA1 */ + MKK3_FCCA = 0xF2, /* Japan UNI-1 even + FCCA */ + MKK4_MKKA = 0xF3, /* Japan UNI-1 even + UNI-2 + MKKA */ + MKK4_MKKA1 = 0xF4, /* Japan UNI-1 even + UNI-2 + MKKA1 */ + MKK4_FCCA = 0xF5, /* Japan UNI-1 even + UNI-2 + FCCA */ + MKK9_MKKA = 0xF6, /* Japan UNI-1 even + 4.9GHz */ + MKK10_MKKA = 0xF7, /* Japan UNI-1 even + UNI-2 + 4.9GHz */ + MKK6_MKKA1 = 0xF8, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKA1 */ + MKK6_FCCA = 0xF9, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + FCCA */ + MKK7_MKKA1 = 0xFA, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKA1 */ + MKK7_FCCA = 0xFB, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + FCCA */ + MKK9_FCCA = 0xFC, /* Japan UNI-1 even + 4.9GHz + FCCA */ + MKK9_MKKA1 = 0xFD, /* Japan UNI-1 even + 4.9GHz + MKKA1 */ + MKK9_MKKC = 0xFE, /* Japan UNI-1 even + 4.9GHz + MKKC */ + MKK9_MKKA2 = 0xFF, /* Japan UNI-1 even + 4.9GHz + MKKA2 */ /* * Regulator domains ending in a number (e.g. APL1, @@ -157,8 +194,10 @@ enum { APL4 = 0x0450, /* Jordan */ APL5 = 0x0550, /* Chile */ APL6 = 0x0650, /* Singapore */ + APL7 = 0x0750, /* Taiwan, disable ch52 */ APL8 = 0x0850, /* Malaysia */ - APL9 = 0x0950, /* Korea (South) ROC 3 */ + APL9 = 0x0950, /* Korea. Before 11/2007. Now used only by APs */ + APL10 = 0x1050, /* Korea. After 11/2007. For STAs only */ ETSI1 = 0x0130, /* Europe & others */ ETSI2 = 0x0230, /* Europe & others */ @@ -166,16 +205,19 @@ enum { ETSI4 = 0x0430, /* Europe & others */ ETSI5 = 0x0530, /* Europe & others */ ETSI6 = 0x0630, /* Europe & others */ + ETSI8 = 0x0830, /* Russia */ + ETSI9 = 0x0930, /* Ukraine */ ETSIA = 0x0A30, /* France */ ETSIB = 0x0B30, /* Israel */ ETSIC = 0x0C30, /* Latin America */ FCC1 = 0x0110, /* US & others */ FCC2 = 0x0120, /* Canada, Australia & New Zealand */ - FCC3 = 0x0160, /* US w/new middle band & DFS */ - FCC4 = 0x0165, /* US Public Safety */ - FCC5 = 0x0166, /* US w/ 1/2 and 1/4 width channels */ - FCCA = 0x0A10, + FCC3 = 0x0160, /* US w/new middle band & DFS */ + FCC4 = 0x0165, /* US Public Safety */ + FCC5 = 0x0166, /* US w/ 1/2 and 1/4 width channels */ + FCC6 = 0x0610, /* Canada and Australia */ + FCCA = 0x0A10, FCCB = 0x0A11, /* US w/ 1/2 and 1/4 width channels */ APLD = 0x0D50, /* South Korea */ @@ -188,8 +230,14 @@ enum { MKK6 = 0x0640, /* Japan (UNI-1 odd + UNI-1 even) */ MKK7 = 0x0740, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 */ MKK8 = 0x0840, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 + mid-band) */ - MKK9 = 0x0940, /* Japan (UNI-1 even + 4.9 GHZ) */ - MKK10 = 0x0B40, /* Japan (UNI-1 even + UNI-2 + 4.9 GHZ) */ + MKK9 = 0x0940, /* Japan (UNI-1 even + 4.9 GHZ) */ + MKK10 = 0x0B40, /* Japan (UNI-1 even + UNI-2 + 4.9 GHZ) */ + MKK11 = 0x1140, /* Japan (UNI-1 even + UNI-2 + 4.9 GHZ) */ + MKK12 = 0x1240, /* Japan (UNI-1 even + UNI-2 + 4.9 GHZ) */ + MKK13 = 0x0C40, /* Same as MKK8 but all passive and no adhoc 11a */ + MKK14 = 0x1440, /* Japan UNI-1 even + UNI-1 odd + 4.9GHz */ + MKK15 = 0x1540, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + 4.9GHz */ + MKKA = 0x0A40, /* Japan */ MKKC = 0x0A50, From 1b7270658f354729c66a9c872f37cb8f194b09e5 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Wed, 20 Jul 2011 13:29:39 +0000 Subject: [PATCH 020/452] Add cap_new(2) and cap_getrights(2) symbols to libc. These system calls have already been implemented in the kernel; now we hook up libc symbols so userspace can drive them. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- lib/libc/sys/Makefile.inc | 3 +- lib/libc/sys/Symbol.map | 2 + lib/libc/sys/cap_new.2 | 474 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 478 insertions(+), 1 deletion(-) create mode 100644 lib/libc/sys/cap_new.2 diff --git a/lib/libc/sys/Makefile.inc b/lib/libc/sys/Makefile.inc index 008180af366..ddc157ee1b5 100644 --- a/lib/libc/sys/Makefile.inc +++ b/lib/libc/sys/Makefile.inc @@ -77,7 +77,7 @@ ${SPSEUDO}: MAN+= abort2.2 accept.2 access.2 acct.2 adjtime.2 \ aio_cancel.2 aio_error.2 aio_read.2 aio_return.2 \ aio_suspend.2 aio_waitcomplete.2 aio_write.2 \ - bind.2 brk.2 cap_enter.2 chdir.2 chflags.2 \ + bind.2 brk.2 cap_enter.2 cap_new.2 chdir.2 chflags.2 \ chmod.2 chown.2 chroot.2 clock_gettime.2 close.2 closefrom.2 \ connect.2 cpuset.2 cpuset_getaffinity.2 dup.2 execve.2 _exit.2 \ extattr_get_file.2 fcntl.2 fhopen.2 flock.2 fork.2 fsync.2 \ @@ -119,6 +119,7 @@ MAN+= sctp_generic_recvmsg.2 sctp_generic_sendmsg.2 sctp_peeloff.2 \ MLINKS+=access.2 eaccess.2 access.2 faccessat.2 MLINKS+=brk.2 sbrk.2 MLINKS+=cap_enter.2 cap_getmode.2 +MLINKS+=cap_new.2 cap_getrights.2 MLINKS+=chdir.2 fchdir.2 MLINKS+=chflags.2 fchflags.2 chflags.2 lchflags.2 MLINKS+=chmod.2 fchmod.2 chmod.2 fchmodat.2 chmod.2 lchmod.2 diff --git a/lib/libc/sys/Symbol.map b/lib/libc/sys/Symbol.map index cd31f24e4a8..547a2cff972 100644 --- a/lib/libc/sys/Symbol.map +++ b/lib/libc/sys/Symbol.map @@ -363,6 +363,8 @@ FBSD_1.1 { FBSD_1.2 { cap_enter; cap_getmode; + cap_new; + cap_getrights; getloginclass; posix_fallocate; rctl_get_racct; diff --git a/lib/libc/sys/cap_new.2 b/lib/libc/sys/cap_new.2 new file mode 100644 index 00000000000..7710e12abdf --- /dev/null +++ b/lib/libc/sys/cap_new.2 @@ -0,0 +1,474 @@ +.\" +.\" Copyright (c) 2008-2010 Robert N. M. Watson +.\" All rights reserved. +.\" +.\" This software was developed at the University of Cambridge Computer +.\" Laboratory with support from a grant from Google, Inc. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd July 20, 2011 +.Dt CAP_NEW 2 +.Os +.Sh NAME +.Nm cap_new , +.Nm cap_getrights +.Nd System calls to manipulate capabilities +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In sys/capability.h +.Ft int +.Fn cap_new "int fd" "cap_rights_t rights" +.Ft int +.Fn cap_getrights "int fd" "cap_rights_t *rightsp" +.Sh DESCRIPTION +Capabilities are special file descriptors derived from an existing file +descriptor, such as one returned by +.Xr fhopen 2 , +.Xr kqueue 2 , +.Xr mq_open 2 , +.Xr open 2 , +.Xr pipe 2 , +.Xr shm_open 2 , +.Xr socket 2 , +or +.Xr socketpair 2 , +but with a restricted set of permitted operations determined by a rights +mask set when the capability is created. +These restricted rights cannot be changed after the capability is created, +although further capabilities with yet more restricted rights may be created +from an existing capability. +In every other sense, a capability behaves in the same way as the file +descriptor it was created from. +.Pp +.Fn cap_new +creates a new capability for the existing file descriptor +.Fa fd , +and returns a file descriptor for it. +Operations on the capability will be limited to those permitted by +.Fa rights , +which is static for the lifetime of the capability. +If +.Fa fd +refers to an existing capability, then +.Fa rights +must be equal to or a subset of the rights on that capability. +As with +.Xr dup 2 +and +.Xr dup2 2 , +many properties are shared between the new capability and the existing file +descriptor, including open file flags, blocking disposition, and file offset. +Many applications will prefer to use the +.Xr cap_limitfd 3 +library call, part of +.Xr libcapsicum 3 , +as it offers a more convenient interface. +.Pp +.Fn cap_getrights +queries the rights associated with the capability referred to by file +descriptor +.Fa fd . +.Pp +These system calls, when combined with +.Xr cap_enter 2 , +may be used to construct process sandboxes with highly granular rights +assignment. +.Sh RIGHTS +The following rights may be specified in a new capability rights mask: +.Bl -tag -width CAP_EXTATTR_DELETE +.It Dv CAP_ACCEPT +Permit +.Xr accept 2 . +.It Dv CAP_ACL_CHECK +Permit checking of an ACL on a file descriptor; there is no cross-reference +for this system call. +.It Dv CAP_ACL_DELETE +Permit +.Xr acl_delete_fd_np 2 . +.It Dv CAP_ACL_GET +Permit +.Xr acl_get_fd 2 +and +.Xr acl_get_fd_np 2 . +.It Dv CAP_ACL_SET +Permit +.Xr acl_set_fd 2 +and +.Xr acl_set_fd_np 2 . +.It Dv CAP_BIND +Permit +.Xr bind 2 . +Note that sockets can also become bound implicitly as a result of +.Xr connect 2 +or +.Xr send 2 , +and that socket options set with +.Xr setsockopt 2 +may also affect binding behavior. +.It Dv CAP_CONNECT +Permit +.Xr connect 2 ; +also required for +.Xr sendto 2 +with a non-NULL destination address. +.It Dv CAP_EVENT +Permit +.Xr select 2 , +.Xr poll 2 , +and +.Xr kevent 2 +to be used in monitoring the file descriptor for events. +.It Dv CAP_FEXECVE +Permit +.Xr fexecve 2 ; +.Dv CAP_READ +will also be required. +.It Dv CAP_EXTATTR_DELETE +Permit +.Xr extattr_delete_fd 2 . +.It Dv CAP_EXTATTR_GET +Permit +.Xr extattr_get_fd 2 . +.It Dv CAP_EXTATTR_LIST +Permit +.Xr extattr_list_fd 2 . +.It Dv CAP_EXTATTR_SET +Permit +.Xr extattr_set_fd 2 . +.It Dv CAP_FCHDIR +Permit +.Xr fchdir 2 . +.It Dv CAP_FCHFLAGS +Permit +.Xr fchflags 2 . +.It Dv CAP_FCHMOD +Permit +.Xr fchmod 2 . +.It Dv CAP_FCHOWN +Permit +.Xr fchown 2 . +.It Dv CAP_FCNTL +Permit +.Xr fcntl 2 ; +be aware that this call provides indirect access to other operations, such as +.Xr flock 2 . +.It Dv CAP_FLOCK +Permit +.Xr flock 2 +and related calls. +.It Dv CAP_FPATHCONF +Permit +.Xr fpathconf 2 . +.It Dv CAP_FSCK +Permit UFS background-fsck operations on the descriptor. +.It Dv CAP_FSTAT +Permit +.Xr fstat 2 . +.It Dv CAP_FSTATFS +Permit +.Xr fstatfs 2 . +.It Dv CAP_FSYNC +Permit +.Xr aio_fsync 2 +and +.Xr fsync 2 . +.Pp +.It Dv CAP_FTRUNCATE +Permit +.Xr ftruncate 2 . +.It Dv CAP_FUTIMES +Permit +.Xr futimes 2 . +.It Dv CAP_GETPEERNAME +Permit +.Xr getpeername 2 . +.It Dv CAP_GETSOCKNAME +Permit +.Xr getsockname 2 . +.It Dv CAP_GETSOCKOPT +Permit +.Xr getsockopt 2 . +.It Dv CAP_IOCTL +Permit +.Xr ioctl 2 . +Be aware that this system call has enormous scope, including potentially +global scope for some objects. +.It Dv CAP_KEVENT +Permit +.Xr kevent 2 ; +.Dv CAP_EVENT +is also required on file descriptors that will be monitored using +.Xr kevent 2 . +.It Dv CAP_LISTEN +Permit +.Xr listen 2 ; +not much use (generally) without +.Dv CAP_BIND . +.It Dv CAP_LOOKUP +Permit the file descriptor to be used as a starting directory for calls such +as +.Xr linkat 2 , +.Xr openat 2 , +and +.Xr unlinkat 2 . +Note that these calls are not available in capability mode as they manipulate +a global name space; see +.Xr cap_enter 2 +for details. +.It Dv CAP_MAC_GET +Permit +.Xr mac_get_fd 2 . +.It Dv CAP_MAC_SET +Permit +.Xr mac_set_fd 2 . +.It Dv CAP_MMAP +Permit +.Xr mmap 2 ; +specific invocations may also require +.Dv CAP_READ +or +.Dv CAP_WRITE . +.Pp +.It Dv CAP_PDGETPID +Permit +.Xr pdgetpid 2 . +.It Dv CAP_PDKILL +Permit +.Xr pdkill 2 . +.It Dv CAP_PDWAIT +Permit +.Xr pdwait 2 . +.It Dv CAP_PEELOFF +Permit +.Xr sctp_peeloff 2 . +.It Dv CAP_READ +Allow +.Xr aio_read 2 , +.Xr pread 2 , +.Xr read 2 , +.Xr recv 2 , +.Xr recvfrom 2 , +.Xr recvmsg 2 , +and related system calls. +.Pp +For files and other seekable objects, +.Dv CAP_SEEK +may also be required. +.It Dv CAP_REVOKE +Permit +.Xr frevoke 2 +in certain ABI compatibility modes that support this system call. +.It Dv CAP_SEEK +Permit operations that seek on the file descriptor, such as +.Xr lseek 2 , +but also required for I/O system calls that modify the file offset, such as +.Xr read 2 +and +.Xr write 2 . +.It Dv CAP_SEM_GETVALUE +Permit +.Xr sem_getvalue 3 . +.It Dv CAP_SEM_POST +Permit +.Xr sem_post 3 . +.It Dv CAP_SEM_WAIT +Permit +.Xr sem_wait 3 +and +.Xr sem_trywait 3 . +.It Dv CAP_SETSOCKOPT +Permit +.Xr setsockopt 2 ; +this controls various aspects of socket behavior and may affect binding, +connecting, and other behaviors with global scope. +.It Dv CAP_SHUTDOWN +Permit explicit +.Xr shutdown 2 ; +closing the socket will also generally shut down any connections on it. +.It Dv CAP_TTYHOOK +Allow configuration of TTY hooks, such as +.Xr snp 4 , +on the file descriptor. +.It Dv CAP_WRITE +Allow +.Xr aio_write 2 , +.Xr pwrite 2 , +.Xr send 2 , +.Xr sendmsg 2 , +.Xr sendto 2 , +.Xr write 2 , +and related system calls. +.Pp +For files and other seekable objects, +.Dv CAP_SEEK +may also be required. +.Pp +For +.Xr sendto 2 +with a non-NULL connection address, +.Dv CAP_CONNECT +is also required. +.El +.Sh CAVEAT +The +.Fn cap_new +system call and the capabilities it creates may be used to assign +fine-grained rights to sandboxed processes running in capability mode. +However, the semantics of objects accessed via file descriptors are complex, +so caution should be exercised in passing object capabilities into sandboxes. +.Sh RETURN VALUES +If successful, +.Fn cap_new +returns a non-negative integer, termed a file descriptor. +It returns -1 on failure, and sets +.Va errno +to indicate the error. +.Pp +.Rv -std cap_getrights +.Sh ERRORS +.Fn cap_new +may return the following errors: +.Bl -tag -width Er +.It Bq Er EBADF +The +.Fa fd +argument is not a valid active descriptor. +.It Bq Er EINVAL +An invalid right has been requested in +.Fa rights . +.It Bq Er EMFILE +The process has already reached its limit for open file descriptors. +.It Bq Er ENFILE +The system file table is full. +.It Bq Er EPERM +.Fa rights +contains requested rights not present in the current rights mask associated +with the capability referenced by +.Fa fd , +if any. +.El +.Pp +.Fn cap_getrights +may return the following errors: +.Bl -tag -width Er +.It Bq Er EBADF +The +.Fa fd +argument is not a valid active descriptor. +.It Bq Er EINVAL +The +.Fa fd +argument is not a capability. +.El +.Sh SEE ALSO +.Xr accept 2 , +.Xr acl_delete_fd_np 2 , +.Xr acl_get_fd 2 , +.Xr acl_get_fd_np 2 , +.Xr acl_set_fd_np 2 , +.Xr aio_read 2 , +.Xr aio_fsync 2 , +.Xr aio_write 2 , +.Xr bind 2 , +.Xr cap_enter 2 , +.Xr connect 2 , +.Xr dup 2 , +.Xr dup2 2 , +.Xr extattr_delete_fd 2 , +.Xr extattr_get_fd 2 , +.Xr extattr_list_fd 2 , +.Xr extattr_set_fd 2 , +.Xr fchflags 2 , +.Xr fchown 2 , +.Xr fcntl 2 , +.Xr fexecve 2 , +.Xr fhopen 2 , +.Xr flock 2 , +.Xr fpathconf 2 , +.Xr fstat 2 , +.Xr fstatfs 2 , +.Xr fsync 2 , +.Xr ftruncate 2 , +.Xr futimes 2 , +.Xr getpeername 2 , +.Xr getsockname 2 , +.Xr getsockopt 2 , +.Xr ioctl 2 , +.Xr kevent 2 , +.Xr kqueue 2 , +.Xr linkat 2 , +.Xr listen 2 , +.Xr mac_get_fd 2 , +.Xr mac_set_fd 2 , +.Xr mmap 2 , +.Xr mq_open 2 , +.Xr open 2 , +.Xr openat 2 , +.Xr pdgetpid 2 , +.Xr pdkill 2 , +.Xr pdwait 2 , +.Xr pipe 2 , +.Xr poll 2 , +.Xr pread 2 , +.Xr pwrite 2 , +.Xr read 2 , +.Xr recv 2 , +.Xr recvfrom 2 , +.Xr recvmsg 2 , +.Xr sctp_peeloff 2 , +.Xr select 2 , +.Xr send 2 , +.Xr sendmsg 2 , +.Xr sendto 2 , +.Xr setsockopt 2 , +.Xr shm_open 2 , +.Xr shutdown 2 , +.Xr socket 2 , +.Xr socketpair 2 , +.Xr unlinkat 2 , +.Xr write 2 , +.Xr cap_limitfd 3 , +.Xr libcapsicum 3 , +.Xr sem_getvalue 3 , +.Xr sem_post 3 , +.Xr sem_trywait 3 , +.Xr sem_wait 3 , +.Xr snp 4 +.Sh HISTORY +Support for capabilities and capabilities mode was developed as part of the +.Tn TrustedBSD +Project. +.Sh BUGS +This man page should list the set of permitted system calls more specifically +for each capability right. +.Pp +Capability rights sometimes have unclear indirect impacts, which should be +documented, or at least hinted at. +.Sh AUTHORS +These functions and the capability facility were created by +.An "Robert N. M. Watson" +at the University of Cambridge Computer Laboratory with support from a grant +from Google, Inc. From 7b4f570ca17b9f20805b4ff7b39317d864aed6e3 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Wed, 20 Jul 2011 15:18:24 +0000 Subject: [PATCH 021/452] Note that the "kernel" variable in loader.conf is the name of a directory containing a kernel under /boot and that it's default value is "kernel" not "/boot/kernel/kernel". PR: docs/158992 Reported by: Wayne Mitchell wayne.mitchell.iz at gmail Approved by: re (kib) MFC after: 1 week --- sys/boot/forth/loader.conf.5 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sys/boot/forth/loader.conf.5 b/sys/boot/forth/loader.conf.5 index c8c61c6dd07..fa83c8f48a6 100644 --- a/sys/boot/forth/loader.conf.5 +++ b/sys/boot/forth/loader.conf.5 @@ -23,7 +23,7 @@ .\" SUCH DAMAGE. .\" .\" $FreeBSD$ -.Dd January 16, 2008 +.Dd July 20, 2011 .Dt LOADER.CONF 5 .Os .Sh NAME @@ -107,6 +107,9 @@ present file. Name of the kernel to be loaded. If no kernel name is set, no additional modules will be loaded. +The name must be a subdirectory of +.Pa /boot +that contains a kernel. .It Ar kernel_options Flags to be passed to the kernel. .It Ar password @@ -190,7 +193,7 @@ replacing it with .Dq spinning character (useful for embedded products and such). .It Va kernel -.Pq Dq Pa /boot/kernel/kernel +.Pq Dq kernel .It Va loader_conf_files .Pq Dq Pa /boot/loader.conf /boot/loader.conf.local .It Va splash_bmp_load From b1ad061e42f8f854a7692d5a59eaeebcb05bfc06 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Wed, 20 Jul 2011 16:53:32 +0000 Subject: [PATCH 022/452] Add a new field to in-core znode, z_rdev, to represent device nodes. PR: kern/159010 Reviewed by: mm@ Approved by: re (kib) MFC after: 2 weeks --- .../opensolaris/uts/common/fs/zfs/sys/zfs_znode.h | 1 + .../contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c | 2 +- .../contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c | 10 ++++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h index d3955d7eee7..1badcd0901d 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h @@ -209,6 +209,7 @@ typedef struct znode { boolean_t z_is_sa; /* are we native sa? */ /* FreeBSD-specific field. */ struct task z_task; + dev_t z_rdev; } znode_t; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index 588ea855936..5e20ac20277 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -2694,7 +2694,7 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr, vap->va_nlink = MIN(links, UINT32_MAX); /* nlink_t limit! */ vap->va_size = zp->z_size; vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; -// vap->va_rdev = zfs_cmpldev(pzp->zp_rdev); + vap->va_rdev = zp->z_rdev; vap->va_seq = zp->z_seq; vap->va_flags = 0; /* FreeBSD: Reset chflags(2) flags. */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c index 1f3d0b2a31f..da322703483 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c @@ -700,6 +700,16 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz, case VDIR: zp->z_zn_prefetch = B_TRUE; /* z_prefetch default is enabled */ break; + case VBLK: + case VCHR: + { + uint64_t rdev; + VERIFY(sa_lookup(zp->z_sa_hdl, SA_ZPL_RDEV(zfsvfs), + &rdev, sizeof (rdev)) == 0); + + zp->z_rdev = zfs_cmpldev(rdev); + } + break; case VFIFO: vp->v_op = &zfs_fifoops; break; From 1b57ae60a726b5583bdad7b0bdcdf9fb3719dc7e Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Wed, 20 Jul 2011 18:51:18 +0000 Subject: [PATCH 023/452] Merge from r224217: Bump MAXCPU to 64. Approved by: re (kib) --- sys/sparc64/include/param.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/sparc64/include/param.h b/sys/sparc64/include/param.h index 9d11a2fc11e..66bb3045130 100644 --- a/sys/sparc64/include/param.h +++ b/sys/sparc64/include/param.h @@ -51,7 +51,7 @@ #if defined(SMP) || defined(KLD_MODULE) #ifndef MAXCPU -#define MAXCPU 16 +#define MAXCPU 64 #endif #else #define MAXCPU 1 From 14bd1ee52cf56b90009bf73d06fd6b07805b9b07 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Thu, 21 Jul 2011 06:55:43 +0000 Subject: [PATCH 024/452] Add new USB ID to u3g driver. Approved by: re (kib) Submitted by: Nick Hibma MFC after: 3 days --- sys/dev/usb/serial/u3g.c | 1 + sys/dev/usb/usbdevs | 1 + 2 files changed, 2 insertions(+) diff --git a/sys/dev/usb/serial/u3g.c b/sys/dev/usb/serial/u3g.c index 31e8e112e19..f1c1f7d318e 100644 --- a/sys/dev/usb/serial/u3g.c +++ b/sys/dev/usb/serial/u3g.c @@ -293,6 +293,7 @@ static const STRUCT_USB_HOST_ID u3g_devs[] = { U3G_DEV(LONGCHEER, WM66, U3GINIT_HUAWEI), U3G_DEV(LONGCHEER, DISK, U3GINIT_TCT), U3G_DEV(LONGCHEER, W14, 0), + U3G_DEV(LONGCHEER, XSSTICK, 0), U3G_DEV(MERLIN, V620, 0), U3G_DEV(NEOTEL, PRIME, 0), U3G_DEV(NOVATEL, E725, 0), diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs index 386e5461daa..72922f916ba 100644 --- a/sys/dev/usb/usbdevs +++ b/sys/dev/usb/usbdevs @@ -2110,6 +2110,7 @@ product LOGITEC RT2870_3 0x0164 RT2870 product LONGCHEER WM66 0x6061 Longcheer WM66 HSDPA product LONGCHEER W14 0x9603 Mobilcom W14 product LONGCHEER DISK 0xf000 Driver disk +product LONGCHEER XSSTICK 0x9605 4G Systems XSStick P14 /* Lucent products */ From e8e6035991ff91c21505fb95bdd3187ad0943a3d Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Thu, 21 Jul 2011 08:31:55 +0000 Subject: [PATCH 025/452] This re-enables HT40 channels for use when DFS is enabled. These should be disabled for the AR5416 in hostap/mesh/ibss mode, as the AR5416 doesn't have support for radar detection on the ext channel of a HT40 setup. Later chips do. Approved by: re (kib) --- sys/dev/ath/ath_hal/ah_regdomain.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/dev/ath/ath_hal/ah_regdomain.c b/sys/dev/ath/ath_hal/ah_regdomain.c index 9aae3324a00..43f2b9ba1bd 100644 --- a/sys/dev/ath/ath_hal/ah_regdomain.c +++ b/sys/dev/ath/ath_hal/ah_regdomain.c @@ -526,6 +526,7 @@ getchannels(struct ath_hal *ah, "skip ecm channel\n"); continue; } +#if 0 if ((fband->useDfs & dfsMask) && (cm->flags & IEEE80211_CHAN_HT40)) { /* NB: DFS and HT40 don't mix */ @@ -533,6 +534,7 @@ getchannels(struct ath_hal *ah, "skip HT40 chan, DFS required\n"); continue; } +#endif /* * Make sure that channel separation * meets the requirement. From 64d6d2d3fc2a550c1691fe798837e80b743b2070 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Thu, 21 Jul 2011 08:35:10 +0000 Subject: [PATCH 026/452] Break out the PLL setup into (mostly) per-chip methods, rather than polluting the AR5416 code with later chipset support. Note: ar9280InitPLL() supports Merlin (AR9280) and later (AR9285, AR9287.) Submitted by: ssgriffonuser@gmail.com Approved by: re (kib) --- sys/dev/ath/ath_hal/ar5416/ar5416_reset.c | 64 ++++------------------ sys/dev/ath/ath_hal/ar9001/ar9160_attach.c | 23 ++++++++ sys/dev/ath/ath_hal/ar9002/ar9280.h | 3 +- sys/dev/ath/ath_hal/ar9002/ar9280_attach.c | 35 ++++++++++++ sys/dev/ath/ath_hal/ar9002/ar9285_attach.c | 2 + sys/dev/ath/ath_hal/ar9002/ar9287_attach.c | 2 + 6 files changed, 76 insertions(+), 53 deletions(-) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c b/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c index 1da686a3df0..c21692eca33 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c @@ -1423,60 +1423,20 @@ ar5416UpdateChainMasks(struct ath_hal *ah, HAL_BOOL is_ht) void ar5416InitPLL(struct ath_hal *ah, const struct ieee80211_channel *chan) { - uint32_t pll; + uint32_t pll = AR_RTC_PLL_REFDIV_5 | AR_RTC_PLL_DIV2; + if (chan != AH_NULL) { + if (IEEE80211_IS_CHAN_HALF(chan)) + pll |= SM(0x1, AR_RTC_PLL_CLKSEL); + else if (IEEE80211_IS_CHAN_QUARTER(chan)) + pll |= SM(0x2, AR_RTC_PLL_CLKSEL); - if (AR_SREV_MERLIN_20(ah) && - chan != AH_NULL && IEEE80211_IS_CHAN_5GHZ(chan)) { - /* - * PLL WAR for Merlin 2.0/2.1 - * When doing fast clock, set PLL to 0x142c - * Else, set PLL to 0x2850 to prevent reset-to-reset variation - */ - pll = IS_5GHZ_FAST_CLOCK_EN(ah, chan) ? 0x142c : 0x2850; - } else if (AR_SREV_MERLIN_10_OR_LATER(ah)) { - pll = SM(0x5, AR_RTC_SOWL_PLL_REFDIV); - if (chan != AH_NULL) { - if (IEEE80211_IS_CHAN_HALF(chan)) - pll |= SM(0x1, AR_RTC_SOWL_PLL_CLKSEL); - else if (IEEE80211_IS_CHAN_QUARTER(chan)) - pll |= SM(0x2, AR_RTC_SOWL_PLL_CLKSEL); - - if (IEEE80211_IS_CHAN_5GHZ(chan)) - pll |= SM(0x28, AR_RTC_SOWL_PLL_DIV); - else - pll |= SM(0x2c, AR_RTC_SOWL_PLL_DIV); - - } else - pll |= SM(0x2c, AR_RTC_SOWL_PLL_DIV); - } else if (AR_SREV_SOWL_10_OR_LATER(ah)) { - pll = SM(0x5, AR_RTC_SOWL_PLL_REFDIV); - if (chan != AH_NULL) { - if (IEEE80211_IS_CHAN_HALF(chan)) - pll |= SM(0x1, AR_RTC_SOWL_PLL_CLKSEL); - else if (IEEE80211_IS_CHAN_QUARTER(chan)) - pll |= SM(0x2, AR_RTC_SOWL_PLL_CLKSEL); - - if (IEEE80211_IS_CHAN_5GHZ(chan)) - pll |= SM(0x50, AR_RTC_SOWL_PLL_DIV); - else - pll |= SM(0x58, AR_RTC_SOWL_PLL_DIV); - } else - pll |= SM(0x58, AR_RTC_SOWL_PLL_DIV); - } else { - pll = AR_RTC_PLL_REFDIV_5 | AR_RTC_PLL_DIV2; - if (chan != AH_NULL) { - if (IEEE80211_IS_CHAN_HALF(chan)) - pll |= SM(0x1, AR_RTC_PLL_CLKSEL); - else if (IEEE80211_IS_CHAN_QUARTER(chan)) - pll |= SM(0x2, AR_RTC_PLL_CLKSEL); - - if (IEEE80211_IS_CHAN_5GHZ(chan)) - pll |= SM(0xa, AR_RTC_PLL_DIV); - else - pll |= SM(0xb, AR_RTC_PLL_DIV); - } else + if (IEEE80211_IS_CHAN_5GHZ(chan)) + pll |= SM(0xa, AR_RTC_PLL_DIV); + else pll |= SM(0xb, AR_RTC_PLL_DIV); - } + } else + pll |= SM(0xb, AR_RTC_PLL_DIV); + OS_REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll); /* TODO: diff --git a/sys/dev/ath/ath_hal/ar9001/ar9160_attach.c b/sys/dev/ath/ath_hal/ar9001/ar9160_attach.c index a87d1adc0e7..2234eb35bfb 100644 --- a/sys/dev/ath/ath_hal/ar9001/ar9160_attach.c +++ b/sys/dev/ath/ath_hal/ar9001/ar9160_attach.c @@ -86,6 +86,28 @@ ar9160AniSetup(struct ath_hal *ah) ar5416AniAttach(ah, &aniparams, &aniparams, AH_TRUE); } +static void +ar9160InitPLL(struct ath_hal *ah, const struct ieee80211_channel *chan) +{ + uint32_t pll = SM(0x5, AR_RTC_SOWL_PLL_REFDIV); + if (chan != AH_NULL) { + if (IEEE80211_IS_CHAN_HALF(chan)) + pll |= SM(0x1, AR_RTC_SOWL_PLL_CLKSEL); + else if (IEEE80211_IS_CHAN_QUARTER(chan)) + pll |= SM(0x2, AR_RTC_SOWL_PLL_CLKSEL); + + if (IEEE80211_IS_CHAN_5GHZ(chan)) + pll |= SM(0x50, AR_RTC_SOWL_PLL_DIV); + else + pll |= SM(0x58, AR_RTC_SOWL_PLL_DIV); + } else + pll |= SM(0x58, AR_RTC_SOWL_PLL_DIV); + + OS_REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll); + OS_DELAY(RTC_PLL_SETTLE_DELAY); + OS_REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_SLEEP_DERIVED_CLK); +} + /* * Attach for an AR9160 part. */ @@ -118,6 +140,7 @@ ar9160Attach(uint16_t devid, HAL_SOFTC sc, /* XXX override with 9160 specific state */ /* override 5416 methods for our needs */ + AH5416(ah)->ah_initPLL = ar9160InitPLL; AH5416(ah)->ah_cal.iqCalData.calData = &ar9160_iq_cal; AH5416(ah)->ah_cal.adcGainCalData.calData = &ar9160_adc_gain_cal; diff --git a/sys/dev/ath/ath_hal/ar9002/ar9280.h b/sys/dev/ath/ath_hal/ar9002/ar9280.h index 3ac8fd5c23b..e383918abbf 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9280.h +++ b/sys/dev/ath/ath_hal/ar9002/ar9280.h @@ -59,5 +59,6 @@ struct ath_hal; HAL_BOOL ar9280SetAntennaSwitch(struct ath_hal *, HAL_ANT_SETTING); void ar9280SpurMitigate(struct ath_hal *, const struct ieee80211_channel *); - +void ar9280InitPLL(struct ath_hal *ah, + const struct ieee80211_channel *chan); #endif /* _ATH_AR9280_H_ */ diff --git a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c index 3743c219511..79c3fb1691f 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c @@ -99,6 +99,39 @@ ar9280AniSetup(struct ath_hal *ah) ar5416AniAttach(ah, &aniparams, &aniparams, AH_TRUE); } +void +ar9280InitPLL(struct ath_hal *ah, const struct ieee80211_channel *chan) +{ + uint32_t pll = SM(0x5, AR_RTC_SOWL_PLL_REFDIV); + + if (AR_SREV_MERLIN_20(ah) && + chan != AH_NULL && IEEE80211_IS_CHAN_5GHZ(chan)) { + /* + * PLL WAR for Merlin 2.0/2.1 + * When doing fast clock, set PLL to 0x142c + * Else, set PLL to 0x2850 to prevent reset-to-reset variation + */ + pll = IS_5GHZ_FAST_CLOCK_EN(ah, chan) ? 0x142c : 0x2850; + } else if (AR_SREV_MERLIN_10_OR_LATER(ah)) { + pll = SM(0x5, AR_RTC_SOWL_PLL_REFDIV); + if (chan != AH_NULL) { + if (IEEE80211_IS_CHAN_HALF(chan)) + pll |= SM(0x1, AR_RTC_SOWL_PLL_CLKSEL); + else if (IEEE80211_IS_CHAN_QUARTER(chan)) + pll |= SM(0x2, AR_RTC_SOWL_PLL_CLKSEL); + if (IEEE80211_IS_CHAN_5GHZ(chan)) + pll |= SM(0x28, AR_RTC_SOWL_PLL_DIV); + else + pll |= SM(0x2c, AR_RTC_SOWL_PLL_DIV); + } else + pll |= SM(0x2c, AR_RTC_SOWL_PLL_DIV); + } + + OS_REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll); + OS_DELAY(RTC_PLL_SETTLE_DELAY); + OS_REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_SLEEP_DERIVED_CLK); +} + /* XXX shouldn't be here! */ #define EEP_MINOR(_ah) \ (AH_PRIVATE(_ah)->ah_eeversion & AR5416_EEP_VER_MINOR_MASK) @@ -138,6 +171,8 @@ ar9280Attach(uint16_t devid, HAL_SOFTC sc, /* XXX override with 9280 specific state */ /* override 5416 methods for our needs */ + AH5416(ah)->ah_initPLL = ar9280InitPLL; + ah->ah_setAntennaSwitch = ar9280SetAntennaSwitch; ah->ah_configPCIE = ar9280ConfigPCIE; diff --git a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c index 2547148f838..02c7b9892aa 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c @@ -136,6 +136,8 @@ ar9285Attach(uint16_t devid, HAL_SOFTC sc, /* XXX override with 9285 specific state */ /* override 5416 methods for our needs */ + AH5416(ah)->ah_initPLL = ar9280InitPLL; + ah->ah_setAntennaSwitch = ar9285SetAntennaSwitch; ah->ah_configPCIE = ar9285ConfigPCIE; ah->ah_setTxPower = ar9285SetTransmitPower; diff --git a/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c index ed9feb8fe75..78400f52f95 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c @@ -137,6 +137,8 @@ ar9287Attach(uint16_t devid, HAL_SOFTC sc, /* XXX override with 9280 specific state */ /* override 5416 methods for our needs */ + AH5416(ah)->ah_initPLL = ar9280InitPLL; + ah->ah_setAntennaSwitch = ar9287SetAntennaSwitch; ah->ah_configPCIE = ar9287ConfigPCIE; From 09ac182ca55f5ac73b467896476f158aa476c9a3 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Thu, 21 Jul 2011 14:16:42 +0000 Subject: [PATCH 027/452] Modify the radar API a little to be easier to "change" via run-time tools. * introduce pe_enabled, which (will) indicate whether the radar detection stuff is enabled or not. Right now it's incorrectly set, based on something previously written. I'll sort it out later. * Don't set HAL_PHYERR_PARAM_ENABLE in pe_relstep to say whether radar detection is on. * Return whether blockradar, fir128 and enmaxrssi is enabled. * Change some of the phyerr params to be integers rather than HAL_BOOL so they can be set to the NOPARAM value when the setup function is called. This is in line with other radar parameters. * Add new configuration parameters for fir128, blockradar and enmaxrssi, rather than defaulting to off, on and on respectively. Approved by: re (kib) --- sys/dev/ath/ath_hal/ah.h | 9 ++++--- sys/dev/ath/ath_hal/ar5416/ar5416_misc.c | 32 ++++++++++++++++++++---- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h index f81e6aab273..cbf9d165137 100644 --- a/sys/dev/ath/ath_hal/ah.h +++ b/sys/dev/ath/ath_hal/ah.h @@ -718,17 +718,18 @@ typedef struct { u_int32_t pe_relpwr; /* Relative power threshold in 0.5dB steps */ u_int32_t pe_relstep; /* Pulse Relative step threshold in 0.5dB steps */ u_int32_t pe_maxlen; /* Max length of radar sign in 0.8us units */ - HAL_BOOL pe_usefir128; /* Use the average in-band power measured over 128 cycles */ - HAL_BOOL pe_blockradar; /* + int32_t pe_usefir128; /* Use the average in-band power measured over 128 cycles */ + int32_t pe_blockradar; /* * Enable to block radar check if pkt detect is done via OFDM * weak signal detect or pkt is detected immediately after tx * to rx transition */ - HAL_BOOL pe_enmaxrssi; /* + int32_t pe_enmaxrssi; /* * Enable to use the max rssi instead of the last rssi during * fine gain changes for radar detection */ - HAL_BOOL pe_extchannel; /* Enable DFS on ext channel */ + int32_t pe_extchannel; /* Enable DFS on ext channel */ + int32_t pe_enabled; /* Whether radar detection is enabled */ } HAL_PHYERR_PARAM; #define HAL_PHYERR_PARAM_NOVAL 65535 diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c index 6266b581353..e44fd9f6bb8 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c @@ -617,10 +617,20 @@ ar5416GetDfsThresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe) temp = val & AR_PHY_RADAR_1_RELSTEP_CHECK; pe->pe_relstep = MS(val, AR_PHY_RADAR_1_RELSTEP_THRESH); if (temp) - pe->pe_relstep |= HAL_PHYERR_PARAM_ENABLE; + pe->pe_enabled = 1; + else + pe->pe_enabled = 0; + pe->pe_maxlen = MS(val, AR_PHY_RADAR_1_MAXLEN); pe->pe_extchannel = !! (OS_REG_READ(ah, AR_PHY_RADAR_EXT) & AR_PHY_RADAR_EXT_ENA); + + pe->pe_usefir128 = !! (OS_REG_READ(ah, AR_PHY_RADAR_1) & + AR_PHY_RADAR_1_USE_FIR128); + pe->pe_blockradar = !! (OS_REG_READ(ah, AR_PHY_RADAR_1) & + AR_PHY_RADAR_1_BLOCK_CHECK); + pe->pe_enmaxrssi = !! (OS_REG_READ(ah, AR_PHY_RADAR_1) & + AR_PHY_RADAR_1_MAX_RRSSI); } /* @@ -660,8 +670,20 @@ ar5416EnableDfs(struct ath_hal *ah, HAL_PHYERR_PARAM *pe) OS_REG_WRITE(ah, AR_PHY_RADAR_0, val | AR_PHY_RADAR_0_ENA); - val = OS_REG_READ(ah, AR_PHY_RADAR_1); - val |= (AR_PHY_RADAR_1_MAX_RRSSI | AR_PHY_RADAR_1_BLOCK_CHECK); + if (pe->pe_usefir128 == 0) + OS_REG_SET_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_USE_FIR128); + else if (pe->pe_usefir128 == 1) + OS_REG_CLR_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_USE_FIR128); + + if (pe->pe_enmaxrssi == 0) + OS_REG_SET_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_MAX_RRSSI); + else if (pe->pe_enmaxrssi == 1) + OS_REG_CLR_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_MAX_RRSSI); + + if (pe->pe_blockradar == 0) + OS_REG_SET_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_BLOCK_CHECK); + else if (pe->pe_blockradar == 1) + OS_REG_CLR_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_BLOCK_CHECK); if (pe->pe_maxlen != HAL_PHYERR_PARAM_NOVAL) { val &= ~AR_PHY_RADAR_1_MAXLEN; @@ -674,9 +696,9 @@ ar5416EnableDfs(struct ath_hal *ah, HAL_PHYERR_PARAM *pe) * it should check the channel is HT/40 and HAL_CAP_EXT_CHAN_DFS * is available. */ - if (pe->pe_extchannel) + if (pe->pe_extchannel == 1) OS_REG_SET_BIT(ah, AR_PHY_RADAR_EXT, AR_PHY_RADAR_EXT_ENA); - else + else if (pe->pe_extchannel == 0) OS_REG_CLR_BIT(ah, AR_PHY_RADAR_EXT, AR_PHY_RADAR_EXT_ENA); if (pe->pe_relstep != HAL_PHYERR_PARAM_NOVAL) { From f51c84eaf6cb192c4008815acb618cab42b3a2c6 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Thu, 21 Jul 2011 14:25:12 +0000 Subject: [PATCH 028/452] This links in the ath dfs ioctl into the driver and defines the ioctl interface for DFS modules to use. Since there's no open source dfs code yet, this doesn't introduce any operational changes. Approved by: re (kib) --- sys/dev/ath/if_ath.c | 3 +++ sys/dev/ath/if_athioctl.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index 35592d9b47a..ec54079356e 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -5344,6 +5344,9 @@ ath_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) case SIOCGATHDIAG: error = ath_ioctl_diag(sc, (struct ath_diag *) ifr); break; + case SIOCGATHPHYERR: + error = ath_ioctl_phyerr(sc,(struct ath_diag*) ifr); + break; #endif case SIOCGIFADDR: error = ether_ioctl(ifp, cmd, data); diff --git a/sys/dev/ath/if_athioctl.h b/sys/dev/ath/if_athioctl.h index 98dd03791d9..4b50d0d8265 100644 --- a/sys/dev/ath/if_athioctl.h +++ b/sys/dev/ath/if_athioctl.h @@ -154,6 +154,7 @@ struct ath_diag { }; #define SIOCGATHDIAG _IOWR('i', 138, struct ath_diag) +#define SIOCGATHPHYERR _IOWR('i', 140, struct ath_diag) /* * Radio capture format. @@ -205,4 +206,34 @@ struct ath_tx_radiotap_header { int8_t wt_chan_maxpow; } __packed; +/* + * DFS ioctl commands + */ + +#define DFS_SET_THRESH 2 +#define DFS_GET_THRESH 3 +#define DFS_RADARDETECTS 6 + +/* + * DFS ioctl parameter types + */ +#define DFS_PARAM_FIRPWR 1 +#define DFS_PARAM_RRSSI 2 +#define DFS_PARAM_HEIGHT 3 +#define DFS_PARAM_PRSSI 4 +#define DFS_PARAM_INBAND 5 +#define DFS_PARAM_NOL 6 /* XXX not used in FreeBSD */ +#define DFS_PARAM_RELSTEP_EN 7 +#define DFS_PARAM_RELSTEP 8 +#define DFS_PARAM_RELPWR_EN 9 +#define DFS_PARAM_RELPWR 10 +#define DFS_PARAM_MAXLEN 11 +#define DFS_PARAM_USEFIR128 12 +#define DFS_PARAM_BLOCKRADAR 13 +#define DFS_PARAM_MAXRSSI_EN 14 + +/* FreeBSD-specific start at 32 */ +#define DFS_PARAM_ENABLE 32 +#define DFS_PARAM_EN_EXTCH 33 + #endif /* _DEV_ATH_ATHIOCTL_H */ From c03b5ad6a9202f3fbb8cc741af72bb49b4b6c599 Mon Sep 17 00:00:00 2001 From: "George V. Neville-Neil" Date: Thu, 21 Jul 2011 16:32:13 +0000 Subject: [PATCH 029/452] Make both stpcpy and strcpy be assembly language implementations on amd64. Submitted by: Guillaume Morin (guillaume at morinfr.org) Reviewed by: kib, jhb Approved by: re (bz) MFC after: 1 month --- lib/libc/amd64/string/Makefile.inc | 2 +- lib/libc/amd64/string/{strcpy.S => stpcpy.S} | 40 ++++++++++---------- lib/libc/amd64/string/strcpy.c | 38 +++++++++++++++++++ 3 files changed, 60 insertions(+), 20 deletions(-) rename lib/libc/amd64/string/{strcpy.S => stpcpy.S} (83%) create mode 100644 lib/libc/amd64/string/strcpy.c diff --git a/lib/libc/amd64/string/Makefile.inc b/lib/libc/amd64/string/Makefile.inc index f5d69d60fbc..46571ab0766 100644 --- a/lib/libc/amd64/string/Makefile.inc +++ b/lib/libc/amd64/string/Makefile.inc @@ -1,4 +1,4 @@ # $FreeBSD$ MDSRCS+= bcmp.S bcopy.S bzero.S memcmp.S memcpy.S memmove.S memset.S \ - strcat.S strcmp.S strcpy.S + strcat.S strcmp.S stpcpy.S strcpy.c diff --git a/lib/libc/amd64/string/strcpy.S b/lib/libc/amd64/string/stpcpy.S similarity index 83% rename from lib/libc/amd64/string/strcpy.S rename to lib/libc/amd64/string/stpcpy.S index 5feb9254716..c8772f8386c 100644 --- a/lib/libc/amd64/string/strcpy.S +++ b/lib/libc/amd64/string/stpcpy.S @@ -1,17 +1,14 @@ /* - * Written by J.T. Conklin + * Adapted by Guillaume Morin from strcpy.S + * written by J.T. Conklin * Public domain. */ #include __FBSDID("$FreeBSD$"); -#if 0 - RCSID("$NetBSD: strcpy.S,v 1.3 2004/07/19 20:04:41 drochner Exp $") -#endif - /* - * This strcpy implementation copies a byte at a time until the + * This stpcpy implementation copies a byte at a time until the * source pointer is aligned to a word boundary, it then copies by * words until it finds a word containing a zero byte, and finally * copies by bytes until the end of the string is reached. @@ -23,10 +20,11 @@ __FBSDID("$FreeBSD$"); * requirements. */ -ENTRY(strcpy) - movq %rdi,%rax - movabsq $0x0101010101010101,%r8 - movabsq $0x8080808080808080,%r9 + .globl stpcpy,__stpcpy +ENTRY(stpcpy) +__stpcpy: + movabsq $0x0101010101010101,%r8 + movabsq $0x8080808080808080,%r9 /* * Align source to a word boundary. @@ -41,6 +39,8 @@ ENTRY(strcpy) incq %rdi testb %dl,%dl jne .Lalign + movq %rdi,%rax + dec %rax ret .p2align 4 @@ -61,54 +61,56 @@ ENTRY(strcpy) */ movb %dl,(%rdi) - incq %rdi testb %dl,%dl /* 1st byte == 0? */ je .Ldone + incq %rdi shrq $8,%rdx movb %dl,(%rdi) - incq %rdi testb %dl,%dl /* 2nd byte == 0? */ je .Ldone + incq %rdi shrq $8,%rdx movb %dl,(%rdi) - incq %rdi testb %dl,%dl /* 3rd byte == 0? */ je .Ldone + incq %rdi shrq $8,%rdx movb %dl,(%rdi) - incq %rdi testb %dl,%dl /* 4th byte == 0? */ je .Ldone + incq %rdi shrq $8,%rdx movb %dl,(%rdi) - incq %rdi testb %dl,%dl /* 5th byte == 0? */ je .Ldone + incq %rdi shrq $8,%rdx movb %dl,(%rdi) - incq %rdi testb %dl,%dl /* 6th byte == 0? */ je .Ldone + incq %rdi shrq $8,%rdx movb %dl,(%rdi) - incq %rdi testb %dl,%dl /* 7th byte == 0? */ je .Ldone + incq %rdi shrq $8,%rdx movb %dl,(%rdi) incq %rdi testb %dl,%dl /* 8th byte == 0? */ jne .Lword_aligned + decq %rdi .Ldone: + movq %rdi,%rax ret -END(strcpy) - +END(stpcpy) + .section .note.GNU-stack,"",%progbits diff --git a/lib/libc/amd64/string/strcpy.c b/lib/libc/amd64/string/strcpy.c new file mode 100644 index 00000000000..11a24eb2cf3 --- /dev/null +++ b/lib/libc/amd64/string/strcpy.c @@ -0,0 +1,38 @@ +/* + * Copyright 2011 George V. Neville-Neil. All rights reserved. + * + * The compilation of software known as FreeBSD is distributed under the + * following terms: + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +char *__stpcpy(char * __restrict, const char * __restrict); + +char * +strcpy(char * __restrict to, const char * __restrict from) +{ + __stpcpy(to, from); + return(to); +} From 23454425b752913f512fd6af02103a4beb62aa7a Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Thu, 21 Jul 2011 19:39:40 +0000 Subject: [PATCH 030/452] Fix `diskinfo -t` operation for disks smaller then 8GB or bigger then 2TB. Tested to work with 1.44MB floppy, 4GB USB stick and 4TB disk array. Approved by: re (kib) --- usr.sbin/diskinfo/diskinfo.c | 49 ++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/usr.sbin/diskinfo/diskinfo.c b/usr.sbin/diskinfo/diskinfo.c index 168a9098262..554b09e9c2d 100644 --- a/usr.sbin/diskinfo/diskinfo.c +++ b/usr.sbin/diskinfo/diskinfo.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -171,7 +172,7 @@ static char sector[65536]; static char mega[1024 * 1024]; static void -rdsect(int fd, u_int blockno, u_int sectorsize) +rdsect(int fd, off_t blockno, u_int sectorsize) { int error; @@ -232,21 +233,27 @@ TR(double count) static void speeddisk(int fd, off_t mediasize, u_int sectorsize) { - int i; - uint b0, b1, sectorcount; + int bulk, i; + off_t b0, b1, sectorcount, step; sectorcount = mediasize / sectorsize; + step = 1ULL << (flsll(sectorcount / (4 * 200)) - 1); + if (step > 16384) + step = 16384; + bulk = mediasize / (1024 * 1024); + if (bulk > 100) + bulk = 100; printf("Seek times:\n"); printf("\tFull stroke:\t"); b0 = 0; - b1 = sectorcount - 1 - 16384; + b1 = sectorcount - step; T0(); for (i = 0; i < 125; i++) { rdsect(fd, b0, sectorsize); - b0 += 16384; + b0 += step; rdsect(fd, b1, sectorsize); - b1 -= 16384; + b1 -= step; } TN(250); @@ -256,9 +263,9 @@ speeddisk(int fd, off_t mediasize, u_int sectorsize) T0(); for (i = 0; i < 125; i++) { rdsect(fd, b0, sectorsize); - b0 += 16384; + b0 += step; rdsect(fd, b1, sectorsize); - b1 += 16384; + b1 += step; } TN(250); printf("\tQuarter stroke:\t"); @@ -267,9 +274,9 @@ speeddisk(int fd, off_t mediasize, u_int sectorsize) T0(); for (i = 0; i < 250; i++) { rdsect(fd, b0, sectorsize); - b0 += 16384; + b0 += step; rdsect(fd, b1, sectorsize); - b1 += 16384; + b1 += step; } TN(500); @@ -278,7 +285,7 @@ speeddisk(int fd, off_t mediasize, u_int sectorsize) T0(); for (i = 0; i < 400; i++) { rdsect(fd, b0, sectorsize); - b0 += 16384; + b0 += step; } TN(400); @@ -287,7 +294,7 @@ speeddisk(int fd, off_t mediasize, u_int sectorsize) T0(); for (i = 0; i < 400; i++) { rdsect(fd, b0, sectorsize); - b0 -= 16384; + b0 -= step; } TN(400); @@ -301,7 +308,7 @@ speeddisk(int fd, off_t mediasize, u_int sectorsize) TN(2048); printf("\tSeq inner:\t"); - b0 = sectorcount - 2048 - 1; + b0 = sectorcount - 2048; T0(); for (i = 0; i < 2048; i++) { rdsect(fd, b0, sectorsize); @@ -313,28 +320,28 @@ speeddisk(int fd, off_t mediasize, u_int sectorsize) printf("\toutside: "); rdsect(fd, 0, sectorsize); T0(); - for (i = 0; i < 100; i++) { + for (i = 0; i < bulk; i++) { rdmega(fd); } - TR(100 * 1024); + TR(bulk * 1024); printf("\tmiddle: "); - b0 = sectorcount / 2; + b0 = sectorcount / 2 - bulk * (1024*1024 / sectorsize) / 2 - 1; rdsect(fd, b0, sectorsize); T0(); - for (i = 0; i < 100; i++) { + for (i = 0; i < bulk; i++) { rdmega(fd); } - TR(100 * 1024); + TR(bulk * 1024); printf("\tinside: "); - b0 = sectorcount - 100 * (1024*1024 / sectorsize) - 1;; + b0 = sectorcount - bulk * (1024*1024 / sectorsize) - 1;; rdsect(fd, b0, sectorsize); T0(); - for (i = 0; i < 100; i++) { + for (i = 0; i < bulk; i++) { rdmega(fd); } - TR(100 * 1024); + TR(bulk * 1024); printf("\n"); return; From b447d101fa4b4bf03024cf16af46b89e70cabf46 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Thu, 21 Jul 2011 20:01:51 +0000 Subject: [PATCH 031/452] A different implementation of r224231 proposed by pjd@, which does not require change in the znode structure. Specifically, it queries rdev from the znode in the same sa_bulk_lookup already done in zfs_getattr(). Submitted by: pjd (with some revisions) Reviewed by: pjd, mm Approved by: re (kib) --- .../opensolaris/uts/common/fs/zfs/sys/zfs_znode.h | 1 - .../contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c | 10 +++++++--- .../contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c | 4 +++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h index 1badcd0901d..d3955d7eee7 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h @@ -209,7 +209,6 @@ typedef struct znode { boolean_t z_is_sa; /* are we native sa? */ /* FreeBSD-specific field. */ struct task z_task; - dev_t z_rdev; } znode_t; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index 5e20ac20277..091cab108ae 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -2642,11 +2642,11 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr, uint32_t blksize; u_longlong_t nblocks; uint64_t links; - uint64_t mtime[2], ctime[2], crtime[2]; + uint64_t mtime[2], ctime[2], crtime[2], rdev; xvattr_t *xvap = (xvattr_t *)vap; /* vap may be an xvattr_t * */ xoptattr_t *xoap = NULL; boolean_t skipaclchk = (flags & ATTR_NOACLCHECK) ? B_TRUE : B_FALSE; - sa_bulk_attr_t bulk[3]; + sa_bulk_attr_t bulk[4]; int count = 0; ZFS_ENTER(zfsvfs); @@ -2657,6 +2657,9 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL, &mtime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, &ctime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, &crtime, 16); + if (vp->v_type == VBLK || vp->v_type == VCHR) + SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_RDEV(zfsvfs), NULL, + &rdev, 8); if ((error = sa_bulk_lookup(zp->z_sa_hdl, bulk, count)) != 0) { ZFS_EXIT(zfsvfs); @@ -2694,7 +2697,8 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr, vap->va_nlink = MIN(links, UINT32_MAX); /* nlink_t limit! */ vap->va_size = zp->z_size; vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; - vap->va_rdev = zp->z_rdev; + if (vp->v_type == VBLK || vp->v_type == VCHR) + vap->va_rdev = zfs_cmpldev(rdev); vap->va_seq = zp->z_seq; vap->va_flags = 0; /* FreeBSD: Reset chflags(2) flags. */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c index da322703483..0898e94ea6c 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c @@ -700,6 +700,7 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz, case VDIR: zp->z_zn_prefetch = B_TRUE; /* z_prefetch default is enabled */ break; +#ifdef sun case VBLK: case VCHR: { @@ -707,9 +708,10 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz, VERIFY(sa_lookup(zp->z_sa_hdl, SA_ZPL_RDEV(zfsvfs), &rdev, sizeof (rdev)) == 0); - zp->z_rdev = zfs_cmpldev(rdev); + vp->v_rdev = zfs_cmpldev(rdev); } break; +#endif /* sun */ case VFIFO: vp->v_op = &zfs_fifoops; break; From 101b7b5daa7e084cc81e72cb90369ca02cd61af8 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Thu, 21 Jul 2011 20:02:22 +0000 Subject: [PATCH 032/452] Bring the code more in-line with OpenSolaris source to ease future port. Reviewed by: pjd, mm Approved by: re (kib) --- .../opensolaris/uts/common/fs/zfs/zfs_vnops.c | 11 +++++++++-- .../opensolaris/uts/common/fs/zfs/zfs_znode.c | 12 ++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index 091cab108ae..3e040310680 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -2688,7 +2688,11 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr, mutex_enter(&zp->z_lock); vap->va_type = IFTOVT(zp->z_mode); vap->va_mode = zp->z_mode & ~S_IFMT; -// vap->va_fsid = zp->z_zfsvfs->z_vfs->vfs_dev; +#ifdef sun + vap->va_fsid = zp->z_zfsvfs->z_vfs->vfs_dev; +#else + vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; +#endif vap->va_nodeid = zp->z_id; if ((vp->v_flag & VROOT) && zfs_show_ctldir(zp)) links = zp->z_links + 1; @@ -2696,9 +2700,12 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr, links = zp->z_links; vap->va_nlink = MIN(links, UINT32_MAX); /* nlink_t limit! */ vap->va_size = zp->z_size; - vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; +#ifdef sun + vap->va_rdev = vp->v_rdev; +#else if (vp->v_type == VBLK || vp->v_type == VCHR) vap->va_rdev = zfs_cmpldev(rdev); +#endif vap->va_seq = zp->z_seq; vap->va_flags = 0; /* FreeBSD: Reset chflags(2) flags. */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c index 0898e94ea6c..29ca446d946 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c @@ -713,6 +713,10 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz, break; #endif /* sun */ case VFIFO: +#ifdef sun + case VSOCK: + case VDOOR: +#endif /* sun */ vp->v_op = &zfs_fifoops; break; case VREG: @@ -721,6 +725,14 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz, vp->v_op = &zfs_shareops; } break; +#ifdef sun + case VLNK: + vn_setops(vp, zfs_symvnodeops); + break; + default: + vn_setops(vp, zfs_evnodeops); + break; +#endif /* sun */ } if (vp->v_type != VFIFO) VN_LOCK_ASHARE(vp); From a388fa682361585f8ae0004b0e39847135ac236a Mon Sep 17 00:00:00 2001 From: "George V. Neville-Neil" Date: Thu, 21 Jul 2011 20:06:14 +0000 Subject: [PATCH 033/452] Remove incorrect attribution. Approved by: re (kib) Pointed out by: brueffer Pointy hat to: gnn --- lib/libc/amd64/string/stpcpy.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libc/amd64/string/stpcpy.S b/lib/libc/amd64/string/stpcpy.S index c8772f8386c..52ac69c5f7e 100644 --- a/lib/libc/amd64/string/stpcpy.S +++ b/lib/libc/amd64/string/stpcpy.S @@ -1,5 +1,5 @@ /* - * Adapted by Guillaume Morin from strcpy.S + * Adapted by Guillaume Morin from strcpy.S * written by J.T. Conklin * Public domain. */ From e9f91b2b2ae7953781ff2878f8d862c31d71ec4c Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Thu, 21 Jul 2011 20:43:43 +0000 Subject: [PATCH 034/452] Allow non-fixed endpoints for a producer address range if the length of the resource covers the entire range. Some BIOSes appear to mark endpoints as non-fixed incorrectly (non-fixed endpoints are supposed to be used in _PRS when OSPM is allowed to allocate a certain chunk of address space within a larger range, I don't believe it is supposed to be used for _CRS). Approved by: re (kib) --- sys/dev/acpica/acpi_pcib_acpi.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sys/dev/acpica/acpi_pcib_acpi.c b/sys/dev/acpica/acpi_pcib_acpi.c index 99e3f1f75cb..b96ced52f90 100644 --- a/sys/dev/acpica/acpi_pcib_acpi.c +++ b/sys/dev/acpica/acpi_pcib_acpi.c @@ -207,9 +207,11 @@ acpi_pcib_producer_handler(ACPI_RESOURCE *res, void *context) length = res->Data.ExtAddress64.AddressLength; break; } - if (length == 0 || - res->Data.Address.MinAddressFixed != ACPI_ADDRESS_FIXED || - res->Data.Address.MaxAddressFixed != ACPI_ADDRESS_FIXED) + if (length == 0) + break; + if (min + length - 1 != max && + (res->Data.Address.MinAddressFixed != ACPI_ADDRESS_FIXED || + res->Data.Address.MaxAddressFixed != ACPI_ADDRESS_FIXED)) break; flags = 0; switch (res->Data.Address.ResourceType) { From 6b7a28575f45ac83ca75242b9345e6b3bd247e8a Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Thu, 21 Jul 2011 21:08:33 +0000 Subject: [PATCH 035/452] Declare more capability method rights. This is a complete set of rights that can be held in a capability's rights mask. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- sys/sys/capability.h | 69 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/sys/sys/capability.h b/sys/sys/capability.h index dee2e7a6a51..b6561c7d3d5 100644 --- a/sys/sys/capability.h +++ b/sys/sys/capability.h @@ -53,11 +53,78 @@ * mmap() and aio*() system calls will need special attention as they may * involve reads or writes depending a great deal on context. */ + +/* General file I/O. */ #define CAP_READ 0x0000000000000001ULL /* read/recv */ #define CAP_WRITE 0x0000000000000002ULL /* write/send */ #define CAP_MMAP 0x0000000000000004ULL /* mmap */ #define CAP_MAPEXEC 0x0000000000000008ULL /* mmap(2) as exec */ -#define CAP_MASK_VALID 0x000000000000000fULL +#define CAP_FEXECVE 0x0000000000000010ULL +#define CAP_FSYNC 0x0000000000000020ULL +#define CAP_FTRUNCATE 0x0000000000000040ULL +#define CAP_SEEK 0x0000000000000080ULL + +/* VFS methods. */ +#define CAP_FCHFLAGS 0x0000000000000100ULL +#define CAP_FCHDIR 0x0000000000000200ULL +#define CAP_FCHMOD 0x0000000000000400ULL +#define CAP_FCHOWN 0x0000000000000800ULL +#define CAP_FCNTL 0x0000000000001000ULL +#define CAP_FPATHCONF 0x0000000000002000ULL +#define CAP_FLOCK 0x0000000000004000ULL +#define CAP_FSCK 0x0000000000008000ULL +#define CAP_FSTAT 0x0000000000010000ULL +#define CAP_FSTATFS 0x0000000000020000ULL +#define CAP_FUTIMES 0x0000000000040000ULL + +/* Extended attributes. */ +#define CAP_EXTATTR_DELETE 0x0000000000080000ULL +#define CAP_EXTATTR_GET 0x0000000000100000ULL +#define CAP_EXTATTR_LIST 0x0000000000200000ULL +#define CAP_EXTATTR_SET 0x0000000000400000ULL + +/* Access Control Lists. */ +#define CAP_ACL_CHECK 0x0000000000800000ULL +#define CAP_ACL_DELETE 0x0000000001000000ULL +#define CAP_ACL_GET 0x0000000002000000ULL +#define CAP_ACL_SET 0x0000000004000000ULL + +/* Socket operations. */ +#define CAP_ACCEPT 0x0000000008000000ULL +#define CAP_BIND 0x0000000010000000ULL +#define CAP_CONNECT 0x0000000020000000ULL +#define CAP_GETPEERNAME 0x0000000040000000ULL +#define CAP_GETSOCKNAME 0x0000000080000000ULL +#define CAP_GETSOCKOPT 0x0000000100000000ULL +#define CAP_LISTEN 0x0000000200000000ULL +#define CAP_PEELOFF 0x0000000400000000ULL +#define CAP_SETSOCKOPT 0x0000000800000000ULL +#define CAP_SHUTDOWN 0x0000001000000000ULL + +#define CAP_SOCK_ALL \ + (CAP_ACCEPT | CAP_BIND | CAP_CONNECT \ + | CAP_GETPEERNAME | CAP_GETSOCKNAME | CAP_GETSOCKOPT \ + | CAP_LISTEN | CAP_PEELOFF | CAP_SETSOCKOPT | CAP_SHUTDOWN) + +/* Mandatory Access Control. */ +#define CAP_MAC_GET 0x0000002000000000ULL +#define CAP_MAC_SET 0x0000004000000000ULL + +/* Methods on semaphores. */ +#define CAP_SEM_GETVALUE 0x0000008000000000ULL +#define CAP_SEM_POST 0x0000010000000000ULL +#define CAP_SEM_WAIT 0x0000020000000000ULL + +/* Events - maybe we need a post/get distinction? */ +#define CAP_EVENT 0x0000040000000000ULL +#define CAP_KEVENT 0x0000080000000000ULL + +/* Strange and powerful rights that should not be given lightly. */ +#define CAP_IOCTL 0x0000100000000000ULL +#define CAP_TTYHOOK 0x0000200000000000ULL + +/* The mask of all valid method rights. */ +#define CAP_MASK_VALID 0x00003fffffffffffULL #ifdef _KERNEL From 93819160245004909533be701b33b849a31d4843 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Fri, 22 Jul 2011 09:34:31 +0000 Subject: [PATCH 036/452] Add athradar, an implementation of the radar parameter diagnostic API. This is a reimplementation from scratch. Approved by: re (kib) --- tools/tools/ath/Makefile | 1 + tools/tools/ath/athradar/Makefile | 16 ++ tools/tools/ath/athradar/athradar.c | 287 ++++++++++++++++++++++++++++ 3 files changed, 304 insertions(+) create mode 100644 tools/tools/ath/athradar/Makefile create mode 100644 tools/tools/ath/athradar/athradar.c diff --git a/tools/tools/ath/Makefile b/tools/tools/ath/Makefile index e5b9d3c6f2f..03269bc88e6 100644 --- a/tools/tools/ath/Makefile +++ b/tools/tools/ath/Makefile @@ -2,5 +2,6 @@ SUBDIR= arcode athdebug athdecode athkey athpoke athprom athrd athregs SUBDIR+= athstats ath_ee_v14_print ath_prom_read ath_ee_v4k_print +SUBDIR+= athradar .include diff --git a/tools/tools/ath/athradar/Makefile b/tools/tools/ath/athradar/Makefile new file mode 100644 index 00000000000..23d3012f234 --- /dev/null +++ b/tools/tools/ath/athradar/Makefile @@ -0,0 +1,16 @@ +# $FreeBSD$ + +PROG= athradar + +.include <../Makefile.inc> + +SRCS= athradar.c +SRCS+= opt_ah.h +CLEANFILES+= opt_ah.h + +opt_ah.h: + echo "#define AH_DEBUG 1" > opt_ah.h + echo "#define AH_DEBUG_COUNTRY 1" >> opt_ah.h + echo "#define AH_SUPPORT_AR5416 1" >> opt_ah.h + +.include diff --git a/tools/tools/ath/athradar/athradar.c b/tools/tools/ath/athradar/athradar.c new file mode 100644 index 00000000000..472692d457f --- /dev/null +++ b/tools/tools/ath/athradar/athradar.c @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2011 Adrian Chadd, Xenion Pty Ltd. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include "diag.h" + +#include "ah.h" +#include "ah_internal.h" + +#ifndef ATH_DEFAULT +#define ATH_DEFAULT "ath0" +#endif + +#include +#include +#include +#include +#include +#include +#include + +struct radarhandler { + struct ath_diag atd; + int s; + struct ifreq ifr; + int ah_devid; +}; + +int +radar_opendev(struct radarhandler *radar, const char *devid) +{ + HAL_REVS revs; + + radar->s = socket(AF_INET, SOCK_DGRAM, 0); + if (radar->s < 0) { + warn("socket"); + return 0; + } + + strncpy(radar->atd.ad_name, devid, sizeof (radar->atd.ad_name)); + + /* Get the hardware revision, just to verify things are working */ + radar->atd.ad_id = HAL_DIAG_REVS; + radar->atd.ad_out_data = (caddr_t) &revs; + radar->atd.ad_out_size = sizeof(revs); + if (ioctl(radar->s, SIOCGATHDIAG, &radar->atd) < 0) { + warn(radar->atd.ad_name); + return 0; + } + radar->ah_devid = revs.ah_devid; + return 1; +} + +void +radar_closedev(struct radarhandler *radar) +{ + close(radar->s); + radar->s = -1; +} + +void +radarset(struct radarhandler *radar, int op, u_int32_t param) +{ + HAL_PHYERR_PARAM pe; + + pe.pe_firpwr = HAL_PHYERR_PARAM_NOVAL; + pe.pe_rrssi = HAL_PHYERR_PARAM_NOVAL; + pe.pe_height = HAL_PHYERR_PARAM_NOVAL; + pe.pe_prssi = HAL_PHYERR_PARAM_NOVAL; + pe.pe_inband = HAL_PHYERR_PARAM_NOVAL; + pe.pe_enabled = HAL_PHYERR_PARAM_NOVAL; + + pe.pe_relpwr = HAL_PHYERR_PARAM_NOVAL; + pe.pe_relstep = HAL_PHYERR_PARAM_NOVAL; + pe.pe_maxlen = HAL_PHYERR_PARAM_NOVAL; + pe.pe_usefir128 = HAL_PHYERR_PARAM_NOVAL; + pe.pe_blockradar = HAL_PHYERR_PARAM_NOVAL; + pe.pe_enmaxrssi = HAL_PHYERR_PARAM_NOVAL; + + pe.pe_extchannel = HAL_PHYERR_PARAM_NOVAL; + + switch (op) { + case DFS_PARAM_ENABLE: + pe.pe_enabled = param; + break; + case DFS_PARAM_FIRPWR: + pe.pe_firpwr = param; + break; + case DFS_PARAM_RRSSI: + pe.pe_rrssi = param; + break; + case DFS_PARAM_HEIGHT: + pe.pe_height = param; + break; + case DFS_PARAM_PRSSI: + pe.pe_prssi = param; + break; + case DFS_PARAM_INBAND: + pe.pe_inband = param; + break; + case DFS_PARAM_RELPWR: + pe.pe_relpwr = param; + break; + case DFS_PARAM_RELSTEP: + pe.pe_relstep = param; + break; + case DFS_PARAM_MAXLEN: + pe.pe_maxlen = param; + break; + case DFS_PARAM_USEFIR128: + pe.pe_usefir128 = param; + break; + case DFS_PARAM_BLOCKRADAR: + pe.pe_blockradar = param; + break; + case DFS_PARAM_MAXRSSI_EN: + pe.pe_enmaxrssi = param; + break; + case DFS_PARAM_EN_EXTCH: + pe.pe_extchannel = param; + break; + } + radar->atd.ad_id = DFS_SET_THRESH | ATH_DIAG_IN; + radar->atd.ad_out_data = NULL; + radar->atd.ad_out_size = 0; + radar->atd.ad_in_data = (caddr_t) &pe; + radar->atd.ad_in_size = sizeof(HAL_PHYERR_PARAM); + if (ioctl(radar->s, SIOCGATHPHYERR, &radar->atd) < 0) + err(1, radar->atd.ad_name); +} + +static void +radar_get(struct radarhandler *radar) +{ + HAL_PHYERR_PARAM pe; + + radar->atd.ad_id = DFS_GET_THRESH | ATH_DIAG_DYN; + memset(&pe, 0, sizeof(pe)); + + radar->atd.ad_in_data = NULL; + radar->atd.ad_in_size = 0; + radar->atd.ad_out_data = (caddr_t) &pe; + radar->atd.ad_out_size = sizeof(pe); + + if (ioctl(radar->s, SIOCGATHPHYERR, &radar->atd) < 0) + err(1, radar->atd.ad_name); + + printf("Radar parameters (raw):\n"); + printf(" pe_enabled: %d\n", pe.pe_enabled); + printf(" pe_firpwr: %d\n", pe.pe_firpwr); + printf(" pe_rrssi: %d\n", pe.pe_rrssi); + printf(" pe_height: %d\n", pe.pe_height); + printf(" pe_prssi: %d\n", pe.pe_prssi); + printf(" pe_inband: %d\n", pe.pe_inband); + printf(" pe_relpwr: %d\n", pe.pe_relpwr); + printf(" pe_relstep: %d\n", pe.pe_relstep); + printf(" pe_maxlen: %d\n", pe.pe_maxlen); + printf(" pe_usefir128: %d\n", pe.pe_usefir128); + printf(" pe_blockradar: %d\n", pe.pe_blockradar); + printf(" pe_enmaxrssi: %d\n", pe.pe_enmaxrssi); + printf(" pe_extchannel: %d\n", pe.pe_extchannel); +} + +static int +radar_set_param(struct radarhandler *radar, const char *param, const char *val) +{ + int v; + + v = atoi(val); + + if (strcmp(param, "firpwr") == 0) { + radarset(radar, DFS_PARAM_FIRPWR, v); + } else if (strcmp(param, "rrssi") == 0) { + radarset(radar, DFS_PARAM_RRSSI, v); + } else if (strcmp(param, "height") == 0) { + radarset(radar, DFS_PARAM_HEIGHT, v); + } else if (strcmp(param, "prssi") == 0) { + radarset(radar, DFS_PARAM_PRSSI, v); + } else if (strcmp(param, "inband") == 0) { + radarset(radar, DFS_PARAM_INBAND, v); + } else if (strcmp(param, "relpwr") == 0) { + radarset(radar, DFS_PARAM_RELPWR, v); + } else if (strcmp(param, "relstep") == 0) { + radarset(radar, DFS_PARAM_RELSTEP, v); + } else if (strcmp(param, "maxlen") == 0) { + radarset(radar, DFS_PARAM_MAXLEN, v); + } else if (strcmp(param, "extchannel") == 0) { + radarset(radar, DFS_PARAM_EN_EXTCH, v); + } else { + return 0; + } + + return 1; +} + +void +usage(const char *progname) +{ + printf("Usage:\n"); + printf("\t%s: [-i ] ()\n", progname); + printf("\t%s: [-h]\n", progname); + printf("\n"); + printf("Valid commands:\n"); + printf("\tget:\t\tGet current radar parameters\n"); + printf("\tset :\t\tSet radar parameter\n"); +} + +int +main(int argc, char *argv[]) +{ + struct radarhandler radar; + const char *devname = ATH_DEFAULT; + const char *progname = argv[0]; + + memset(&radar, 0, sizeof(radar)); + + /* Parse command line options */ + if (argc >= 2 && strcmp(argv[1], "-h") == 0) { + usage(progname); + exit(0); + } + if (argc >= 2 && strcmp(argv[1], "-?") == 0) { + usage(progname); + exit(0); + } + + if (argc >= 2 && strcmp(argv[1], "-i") == 0) { + if (argc == 2) { + usage(progname); + exit(127); + } + devname = argv[2]; + argc -= 2; argv += 2; + } + + /* At this point we require at least one command */ + if (argc == 1) { + usage(progname); + exit(127); + } + + if (radar_opendev(&radar, devname) == 0) + exit(127); + + if (strcasecmp(argv[1], "get") == 0) { + radar_get(&radar); + } else if (strcasecmp(argv[1], "set") == 0) { + if (argc < 4) { + usage(progname); + exit(127); + } + if (radar_set_param(&radar, argv[2], argv[3]) == 0) { + usage(progname); + exit(127); + } + } else { + usage(progname); + exit(127); + } + + /* wrap up */ + radar_closedev(&radar); + exit(0); +} From c5f2a23c79e32b35d739b562d27b1054419a396b Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Fri, 22 Jul 2011 09:39:49 +0000 Subject: [PATCH 037/452] Implement a basic radar parameter API in the dfs_null module. Since no actual radar data is ever handled, this won't do anything. It's mostly here as a reference for those who wish to experiment with radar detection. Approved by: re (kib) --- sys/dev/ath/ath_dfs/null/dfs_null.c | 74 +++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/sys/dev/ath/ath_dfs/null/dfs_null.c b/sys/dev/ath/ath_dfs/null/dfs_null.c index 2f050a40d1c..b5c85bf63bb 100644 --- a/sys/dev/ath/ath_dfs/null/dfs_null.c +++ b/sys/dev/ath/ath_dfs/null/dfs_null.c @@ -61,7 +61,7 @@ __FBSDID("$FreeBSD$"); #include #ifdef INET -#include +#include #include #endif @@ -141,12 +141,80 @@ ath_dfs_tasklet_needed(struct ath_softc *sc, struct ieee80211_channel *chan) } /* - * Handle ioctl requests from the diagnostic interface + * Handle ioctl requests from the diagnostic interface. + * + * The initial part of this code resembles ath_ioctl_diag(); + * it's likely a good idea to reduce duplication between + * these two routines. */ int ath_ioctl_phyerr(struct ath_softc *sc, struct ath_diag *ad) { - return 1; + unsigned int id = ad->ad_id & ATH_DIAG_ID; + void *indata = NULL; + void *outdata = NULL; + u_int32_t insize = ad->ad_in_size; + u_int32_t outsize = ad->ad_out_size; + int error = 0; + HAL_PHYERR_PARAM peout; + HAL_PHYERR_PARAM *pe; + + if (ad->ad_id & ATH_DIAG_IN) { + /* + * Copy in data. + */ + indata = malloc(insize, M_TEMP, M_NOWAIT); + if (indata == NULL) { + error = ENOMEM; + goto bad; + } + error = copyin(ad->ad_in_data, indata, insize); + if (error) + goto bad; + } + if (ad->ad_id & ATH_DIAG_DYN) { + /* + * Allocate a buffer for the results (otherwise the HAL + * returns a pointer to a buffer where we can read the + * results). Note that we depend on the HAL leaving this + * pointer for us to use below in reclaiming the buffer; + * may want to be more defensive. + */ + outdata = malloc(outsize, M_TEMP, M_NOWAIT); + if (outdata == NULL) { + error = ENOMEM; + goto bad; + } + } + switch (id) { + case DFS_SET_THRESH: + if (insize < sizeof(HAL_PHYERR_PARAM)) { + error = -EINVAL; + break; + } + pe = (HAL_PHYERR_PARAM *) indata; + ath_hal_enabledfs(sc->sc_ah, pe); + break; + case DFS_GET_THRESH: + memset(&peout, 0, sizeof(peout)); + outsize = sizeof(HAL_PHYERR_PARAM); + ath_hal_getdfsthresh(sc->sc_ah, &peout); + pe = (HAL_PHYERR_PARAM *) outdata; + memcpy(pe, &peout, sizeof(*pe)); + break; + default: + error = -EINVAL; + } + if (outsize < ad->ad_out_size) + ad->ad_out_size = outsize; + if (outdata && copyout(outdata, ad->ad_out_data, ad->ad_out_size)) + error = -EFAULT; +bad: + if ((ad->ad_id & ATH_DIAG_IN) && indata != NULL) + free(indata, M_TEMP); + if ((ad->ad_id & ATH_DIAG_DYN) && outdata != NULL) + free(outdata, M_TEMP); + return error; } /* From 7a270867e75c82d5fc891b560eaa04495c5ff348 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Fri, 22 Jul 2011 12:50:21 +0000 Subject: [PATCH 038/452] Turn on AUDIT_ARG_RIGHTS() for cap_new(2). Now that the code is in place to audit capability method rights, start using it to audit the 'rights' argument to cap_new(2). Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- sys/kern/sys_capability.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/sys/kern/sys_capability.c b/sys/kern/sys_capability.c index 04f98d8290c..6ca960269d6 100644 --- a/sys/kern/sys_capability.c +++ b/sys/kern/sys_capability.c @@ -224,9 +224,7 @@ cap_new(struct thread *td, struct cap_new_args *uap) cap_rights_t rights = uap->rights; AUDIT_ARG_FD(fd); -#ifdef notyet /* capability auditing will follow in a few commits */ AUDIT_ARG_RIGHTS(rights); -#endif error = fget(td, fd, &fp); if (error) return (error); From ff11fd7fa7dbc11f794b81db26037a9368f46248 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Fri, 22 Jul 2011 15:37:23 +0000 Subject: [PATCH 039/452] Add missing XHCI early takeover code. The XHCI takeover code is supposed to disable the BIOS from using the XHCI controller after bootup. Approved by: re (kib) Reported by: Mike Tancsa MFC after: 1 week --- sys/dev/pci/pci.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c index 7eb84e6e5ee..9ebb8486913 100644 --- a/sys/dev/pci/pci.c +++ b/sys/dev/pci/pci.c @@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -2956,6 +2957,68 @@ ehci_early_takeover(device_t self) bus_release_resource(self, SYS_RES_MEMORY, rid, res); } +/* Perform early XHCI takeover from SMM. */ +static void +xhci_early_takeover(device_t self) +{ + struct resource *res; + uint32_t cparams; + uint32_t eec; + uint8_t eecp; + uint8_t bios_sem; + uint8_t offs; + int rid; + int i; + + rid = PCIR_BAR(0); + res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, RF_ACTIVE); + if (res == NULL) + return; + + cparams = bus_read_4(res, XHCI_HCSPARAMS0); + + eec = -1; + + /* Synchronise with the BIOS if it owns the controller. */ + for (eecp = XHCI_HCS0_XECP(cparams) << 2; eecp != 0 && XHCI_XECP_NEXT(eec); + eecp += XHCI_XECP_NEXT(eec) << 2) { + eec = bus_read_4(res, eecp); + + if (XHCI_XECP_ID(eec) != XHCI_ID_USB_LEGACY) + continue; + + bios_sem = bus_read_1(res, eecp + XHCI_XECP_BIOS_SEM); + if (bios_sem == 0) + continue; + + if (bootverbose) + printf("xhci early: " + "SMM active, request owner change\n"); + + bus_write_1(res, eecp + XHCI_XECP_OS_SEM, 1); + + /* wait a maximum of 5 second */ + + for (i = 0; (i < 5000) && (bios_sem != 0); i++) { + DELAY(1000); + bios_sem = bus_read_1(res, eecp + + XHCI_XECP_BIOS_SEM); + } + + if (bios_sem != 0) { + if (bootverbose) + printf("xhci early: " + "SMM does not respond\n"); + } + + /* Disable interrupts */ + offs = bus_read_1(res, XHCI_CAPLENGTH); + bus_write_4(res, offs + XHCI_USBCMD, 0); + bus_read_4(res, offs + XHCI_USBSTS); + } + bus_release_resource(self, SYS_RES_MEMORY, rid, res); +} + void pci_add_resources(device_t bus, device_t dev, int force, uint32_t prefetchmask) { @@ -3002,7 +3065,9 @@ pci_add_resources(device_t bus, device_t dev, int force, uint32_t prefetchmask) if (pci_usb_takeover && pci_get_class(dev) == PCIC_SERIALBUS && pci_get_subclass(dev) == PCIS_SERIALBUS_USB) { - if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_EHCI) + if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_XHCI) + xhci_early_takeover(dev); + else if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_EHCI) ehci_early_takeover(dev); else if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_OHCI) ohci_early_takeover(dev); From dd60e051f711b0f0dc969c84363a879326e0fde9 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Fri, 22 Jul 2011 16:37:04 +0000 Subject: [PATCH 040/452] - Use mutex to serialize index/data register pair usage, when accessing SATA registers. Unserialized access under heavy load caused wrong speed reporting and potentially could cause device loss. - To free memory and other resources (including above), allocated during chipinit() method call on attach, add new chipdeinit() method, called during driver detach. Submitted by: Andrew Boyer (initial version) Approved by: re (kib) MFC after: 1 week --- sys/dev/ata/ata-pci.c | 6 ++-- sys/dev/ata/ata-pci.h | 3 ++ sys/dev/ata/chipsets/ata-acard.c | 19 ++++++++++- sys/dev/ata/chipsets/ata-acerlabs.c | 25 +++++++++++++- sys/dev/ata/chipsets/ata-intel.c | 52 +++++++++++++++++++++++++---- sys/dev/ata/chipsets/ata-promise.c | 2 +- 6 files changed, 94 insertions(+), 13 deletions(-) diff --git a/sys/dev/ata/ata-pci.c b/sys/dev/ata/ata-pci.c index cf579f80f2d..374612ec88b 100644 --- a/sys/dev/ata/ata-pci.c +++ b/sys/dev/ata/ata-pci.c @@ -49,8 +49,7 @@ __FBSDID("$FreeBSD$"); #include #include -/* local vars */ -static MALLOC_DEFINE(M_ATAPCI, "ata_pci", "ATA driver PCI"); +MALLOC_DEFINE(M_ATAPCI, "ata_pci", "ATA driver PCI"); /* misc defines */ #define IOMASK 0xfffffffc @@ -146,13 +145,14 @@ ata_pci_detach(device_t dev) device_delete_child(dev, children[i]); free(children, M_TEMP); } - if (ctlr->r_irq) { bus_teardown_intr(dev, ctlr->r_irq, ctlr->handle); bus_release_resource(dev, SYS_RES_IRQ, ctlr->r_irq_rid, ctlr->r_irq); if (ctlr->r_irq_rid != ATA_IRQ_RID) pci_release_msi(dev); } + if (ctlr->chipdeinit != NULL) + ctlr->chipdeinit(dev); if (ctlr->r_res2) bus_release_resource(dev, ctlr->r_type2, ctlr->r_rid2, ctlr->r_res2); if (ctlr->r_res1) diff --git a/sys/dev/ata/ata-pci.h b/sys/dev/ata/ata-pci.h index 51064f6d7d5..3b90498e961 100644 --- a/sys/dev/ata/ata-pci.h +++ b/sys/dev/ata/ata-pci.h @@ -55,6 +55,7 @@ struct ata_pci_controller { int channels; int ichannels; int (*chipinit)(device_t); + int (*chipdeinit)(device_t); int (*suspend)(device_t); int (*resume)(device_t); int (*ch_attach)(device_t); @@ -579,6 +580,8 @@ int ata_sii_chipinit(device_t); /* externs */ extern devclass_t ata_pci_devclass; +MALLOC_DECLARE(M_ATAPCI); + /* macro for easy definition of all driver module stuff */ #define ATA_DECLARE_DRIVER(dname) \ static device_method_t __CONCAT(dname,_methods)[] = { \ diff --git a/sys/dev/ata/chipsets/ata-acard.c b/sys/dev/ata/chipsets/ata-acard.c index bb81c48dc4c..761ec546efb 100644 --- a/sys/dev/ata/chipsets/ata-acard.c +++ b/sys/dev/ata/chipsets/ata-acard.c @@ -59,6 +59,7 @@ struct ata_serialize { /* local prototypes */ static int ata_acard_chipinit(device_t dev); +static int ata_acard_chipdeinit(device_t dev); static int ata_acard_ch_attach(device_t dev); static int ata_acard_status(device_t dev); static int ata_acard_850_setmode(device_t dev, int target, int mode); @@ -93,6 +94,7 @@ ata_acard_probe(device_t dev) ata_set_desc(dev); ctlr->chipinit = ata_acard_chipinit; + ctlr->chipdeinit = ata_acard_chipdeinit; return (BUS_PROBE_DEFAULT); } @@ -111,7 +113,7 @@ ata_acard_chipinit(device_t dev) ctlr->setmode = ata_acard_850_setmode; ctlr->locking = ata_serialize; serial = malloc(sizeof(struct ata_serialize), - M_TEMP, M_WAITOK | M_ZERO); + M_ATAPCI, M_WAITOK | M_ZERO); ata_serialize_init(serial); ctlr->chipset_data = serial; } @@ -120,6 +122,21 @@ ata_acard_chipinit(device_t dev) return 0; } +static int +ata_acard_chipdeinit(device_t dev) +{ + struct ata_pci_controller *ctlr = device_get_softc(dev); + struct ata_serialize *serial; + + if (ctlr->chip->cfg1 == ATP_OLD) { + serial = ctlr->chipset_data; + mtx_destroy(&serial->locked_mtx); + free(serial, M_ATAPCI); + ctlr->chipset_data = NULL; + } + return (0); +} + static int ata_acard_ch_attach(device_t dev) { diff --git a/sys/dev/ata/chipsets/ata-acerlabs.c b/sys/dev/ata/chipsets/ata-acerlabs.c index 79e9d1192b1..9d528daa999 100644 --- a/sys/dev/ata/chipsets/ata-acerlabs.c +++ b/sys/dev/ata/chipsets/ata-acerlabs.c @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_ali_chipinit(device_t dev); +static int ata_ali_chipdeinit(device_t dev); static int ata_ali_ch_attach(device_t dev); static int ata_ali_sata_ch_attach(device_t dev); static void ata_ali_reset(device_t dev); @@ -95,6 +96,7 @@ ata_ali_probe(device_t dev) ata_set_desc(dev); ctlr->chipinit = ata_ali_chipinit; + ctlr->chipdeinit = ata_ali_chipdeinit; return (BUS_PROBE_DEFAULT); } @@ -122,7 +124,7 @@ ata_ali_chipinit(device_t dev) return 0; /* Allocate resources for later use by channel attach routines. */ - res = malloc(sizeof(struct ali_sata_resources), M_TEMP, M_WAITOK); + res = malloc(sizeof(struct ali_sata_resources), M_ATAPCI, M_WAITOK); for (i = 0; i < 4; i++) { rid = PCIR_BAR(i); res->bars[i] = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, @@ -172,6 +174,27 @@ ata_ali_chipinit(device_t dev) return 0; } +static int +ata_ali_chipdeinit(device_t dev) +{ + struct ata_pci_controller *ctlr = device_get_softc(dev); + struct ali_sata_resources *res; + int i; + + if (ctlr->chip->cfg2 == ALI_SATA) { + res = ctlr->chipset_data; + for (i = 0; i < 4; i++) { + if (res->bars[i] != NULL) { + bus_release_resource(dev, SYS_RES_IOPORT, + PCIR_BAR(i), res->bars[i]); + } + } + free(res, M_ATAPCI); + ctlr->chipset_data = NULL; + } + return (0); +} + static int ata_ali_ch_attach(device_t dev) { diff --git a/sys/dev/ata/chipsets/ata-intel.c b/sys/dev/ata/chipsets/ata-intel.c index e128051b502..c5c22cb9e8b 100644 --- a/sys/dev/ata/chipsets/ata-intel.c +++ b/sys/dev/ata/chipsets/ata-intel.c @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_intel_chipinit(device_t dev); +static int ata_intel_chipdeinit(device_t dev); static int ata_intel_ch_attach(device_t dev); static void ata_intel_reset(device_t dev); static int ata_intel_old_setmode(device_t dev, int target, int mode); @@ -85,6 +86,18 @@ static void ata_intel_31244_reset(device_t dev); #define INTEL_6CH2 8 #define INTEL_ICH7 16 +struct ata_intel_data { + struct mtx lock; + u_char smap[4]; +}; + +#define ATA_INTEL_SMAP(ctlr, ch) \ + &((struct ata_intel_data *)((ctlr)->chipset_data))->smap[(ch)->unit * 2] +#define ATA_INTEL_LOCK(ctlr) \ + mtx_lock(&((struct ata_intel_data *)((ctlr)->chipset_data))->lock) +#define ATA_INTEL_UNLOCK(ctlr) \ + mtx_unlock(&((struct ata_intel_data *)((ctlr)->chipset_data))->lock) + /* * Intel chipset support functions */ @@ -206,6 +219,7 @@ ata_intel_probe(device_t dev) ata_set_desc(dev); ctlr->chipinit = ata_intel_chipinit; + ctlr->chipdeinit = ata_intel_chipdeinit; return (BUS_PROBE_DEFAULT); } @@ -213,11 +227,14 @@ static int ata_intel_chipinit(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(dev); + struct ata_intel_data *data; if (ata_setup_interrupt(dev, ata_generic_intr)) return ENXIO; - ctlr->chipset_data = NULL; + data = malloc(sizeof(struct ata_intel_data), M_ATAPCI, M_WAITOK | M_ZERO); + mtx_init(&data->lock, "Intel SATA lock", NULL, MTX_DEF); + ctlr->chipset_data = (void *)data; /* good old PIIX needs special treatment (not implemented) */ if (ctlr->chip->chipid == ATA_I82371FB) { @@ -304,6 +321,19 @@ ata_intel_chipinit(device_t dev) return 0; } +static int +ata_intel_chipdeinit(device_t dev) +{ + struct ata_pci_controller *ctlr = device_get_softc(dev); + struct ata_intel_data *data; + + data = ctlr->chipset_data; + mtx_destroy(&data->lock); + free(data, M_ATAPCI); + ctlr->chipset_data = NULL; + return (0); +} + static int ata_intel_ch_attach(device_t dev) { @@ -329,7 +359,7 @@ ata_intel_ch_attach(device_t dev) ch->flags |= ATA_ALWAYS_DMASTAT; if (ctlr->chip->max_dma >= ATA_SA150) { - smap = (u_char *)&ctlr->chipset_data + ch->unit * 2; + smap = ATA_INTEL_SMAP(ctlr, ch); map = pci_read_config(device_get_parent(dev), 0x90, 1); if (ctlr->chip->cfg1 & INTEL_ICH5) { map &= 0x07; @@ -415,7 +445,7 @@ ata_intel_reset(device_t dev) return (ata_generic_reset(dev)); /* Do hard-reset on respective SATA ports. */ - smap = (u_char *)&ctlr->chipset_data + ch->unit * 2; + smap = ATA_INTEL_SMAP(ctlr, ch); mask = 1 << smap[0]; if ((ch->flags & ATA_NO_SLAVE) == 0) mask |= (1 << smap[1]); @@ -605,7 +635,7 @@ ata_intel_sata_ahci_read(device_t dev, int port, int reg, u_int32_t *result) ctlr = device_get_softc(parent); ch = device_get_softc(dev); port = (port == 1) ? 1 : 0; - smap = (u_char *)&ctlr->chipset_data + ch->unit * 2; + smap = ATA_INTEL_SMAP(ctlr, ch); offset = 0x100 + smap[port] * 0x80; switch (reg) { case ATA_SSTATUS: @@ -635,7 +665,7 @@ ata_intel_sata_cscr_read(device_t dev, int port, int reg, u_int32_t *result) parent = device_get_parent(dev); ctlr = device_get_softc(parent); ch = device_get_softc(dev); - smap = (u_char *)&ctlr->chipset_data + ch->unit * 2; + smap = ATA_INTEL_SMAP(ctlr, ch); port = (port == 1) ? 1 : 0; switch (reg) { case ATA_SSTATUS: @@ -650,9 +680,11 @@ ata_intel_sata_cscr_read(device_t dev, int port, int reg, u_int32_t *result) default: return (EINVAL); } + ATA_INTEL_LOCK(ctlr); pci_write_config(parent, 0xa0, 0x50 + smap[port] * 0x10 + reg * 4, 4); *result = pci_read_config(parent, 0xa4, 4); + ATA_INTEL_UNLOCK(ctlr); return (0); } @@ -680,8 +712,10 @@ ata_intel_sata_sidpr_read(device_t dev, int port, int reg, u_int32_t *result) default: return (EINVAL); } + ATA_INTEL_LOCK(ctlr); ATA_IDX_OUTL(ch, ATA_IDX_ADDR, ((ch->unit * 2 + port) << 8) + reg); *result = ATA_IDX_INL(ch, ATA_IDX_DATA); + ATA_INTEL_UNLOCK(ctlr); return (0); } @@ -698,7 +732,7 @@ ata_intel_sata_ahci_write(device_t dev, int port, int reg, u_int32_t value) ctlr = device_get_softc(parent); ch = device_get_softc(dev); port = (port == 1) ? 1 : 0; - smap = (u_char *)&ctlr->chipset_data + ch->unit * 2; + smap = ATA_INTEL_SMAP(ctlr, ch); offset = 0x100 + smap[port] * 0x80; switch (reg) { case ATA_SSTATUS: @@ -728,7 +762,7 @@ ata_intel_sata_cscr_write(device_t dev, int port, int reg, u_int32_t value) parent = device_get_parent(dev); ctlr = device_get_softc(parent); ch = device_get_softc(dev); - smap = (u_char *)&ctlr->chipset_data + ch->unit * 2; + smap = ATA_INTEL_SMAP(ctlr, ch); port = (port == 1) ? 1 : 0; switch (reg) { case ATA_SSTATUS: @@ -743,9 +777,11 @@ ata_intel_sata_cscr_write(device_t dev, int port, int reg, u_int32_t value) default: return (EINVAL); } + ATA_INTEL_LOCK(ctlr); pci_write_config(parent, 0xa0, 0x50 + smap[port] * 0x10 + reg * 4, 4); pci_write_config(parent, 0xa4, value, 4); + ATA_INTEL_UNLOCK(ctlr); return (0); } @@ -773,8 +809,10 @@ ata_intel_sata_sidpr_write(device_t dev, int port, int reg, u_int32_t value) default: return (EINVAL); } + ATA_INTEL_LOCK(ctlr); ATA_IDX_OUTL(ch, ATA_IDX_ADDR, ((ch->unit * 2 + port) << 8) + reg); ATA_IDX_OUTL(ch, ATA_IDX_DATA, value); + ATA_INTEL_UNLOCK(ctlr); return (0); } diff --git a/sys/dev/ata/chipsets/ata-promise.c b/sys/dev/ata/chipsets/ata-promise.c index bee7bbad89e..2f8b2a5ec13 100644 --- a/sys/dev/ata/chipsets/ata-promise.c +++ b/sys/dev/ata/chipsets/ata-promise.c @@ -280,7 +280,7 @@ ata_promise_chipinit(device_t dev) /* setup host packet controls */ hpkt = malloc(sizeof(struct ata_promise_sx4), - M_TEMP, M_NOWAIT | M_ZERO); + M_ATAPCI, M_NOWAIT | M_ZERO); mtx_init(&hpkt->mtx, "ATA promise HPKT lock", NULL, MTX_DEF); TAILQ_INIT(&hpkt->queue); hpkt->busy = 0; From 2e34c19b93b2b08c20b5544203c68c8d9a685107 Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Fri, 22 Jul 2011 16:42:12 +0000 Subject: [PATCH 041/452] Fix the following bugs related to the SCTP support of netstat: * Correctly handle -a. * -A isn't supported. * Show all closed 1-to-1 and 1-to-many style sockets. * Show all listening 1-to-many style sockets. * Use consistent formatting for -W. PR: 150642 Approved by: re@ MFC after: 4 weeks. --- usr.bin/netstat/sctp.c | 317 ++++++++++++++++++++++++++--------------- 1 file changed, 204 insertions(+), 113 deletions(-) diff --git a/usr.bin/netstat/sctp.c b/usr.bin/netstat/sctp.c index 32cf321af4c..d5ad70e6580 100644 --- a/usr.bin/netstat/sctp.c +++ b/usr.bin/netstat/sctp.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2001-2007, by Weongyo Jeong. All rights reserved. + * Copyright (c) 2011, by Michael Tuexen. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -63,7 +64,6 @@ __FBSDID("$FreeBSD$"); #ifdef SCTP -void inetprint(struct in_addr *, int, const char *, int); static void sctp_statesprint(uint32_t state); #define NETSTAT_SCTP_STATES_CLOSED 0x0 @@ -102,6 +102,124 @@ struct xraddr_entry { LIST_ENTRY(xraddr_entry) xraddr_entries; }; +/* + * Construct an Internet address representation. + * If numeric_addr has been supplied, give + * numeric value, otherwise try for symbolic name. + */ +static char * +inetname(struct in_addr *inp) +{ + char *cp; + static char line[MAXHOSTNAMELEN]; + struct hostent *hp; + struct netent *np; + + cp = 0; + if (!numeric_addr && inp->s_addr != INADDR_ANY) { + int net = inet_netof(*inp); + int lna = inet_lnaof(*inp); + + if (lna == INADDR_ANY) { + np = getnetbyaddr(net, AF_INET); + if (np) + cp = np->n_name; + } + if (cp == 0) { + hp = gethostbyaddr((char *)inp, sizeof (*inp), AF_INET); + if (hp) { + cp = hp->h_name; + trimdomain(cp, strlen(cp)); + } + } + } + if (inp->s_addr == INADDR_ANY) + strcpy(line, "*"); + else if (cp) { + strlcpy(line, cp, sizeof(line)); + } else { + inp->s_addr = ntohl(inp->s_addr); +#define C(x) ((u_int)((x) & 0xff)) + sprintf(line, "%u.%u.%u.%u", C(inp->s_addr >> 24), + C(inp->s_addr >> 16), C(inp->s_addr >> 8), C(inp->s_addr)); + inp->s_addr = htonl(inp->s_addr); + } + return (line); +} + +#ifdef INET6 +static char ntop_buf[INET6_ADDRSTRLEN]; + +static char * +inet6name(struct in6_addr *in6p) +{ + char *cp; + static char line[50]; + struct hostent *hp; + static char domain[MAXHOSTNAMELEN]; + static int first = 1; + + if (first && !numeric_addr) { + first = 0; + if (gethostname(domain, MAXHOSTNAMELEN) == 0 && + (cp = index(domain, '.'))) + (void) strcpy(domain, cp + 1); + else + domain[0] = 0; + } + cp = 0; + if (!numeric_addr && !IN6_IS_ADDR_UNSPECIFIED(in6p)) { + hp = gethostbyaddr((char *)in6p, sizeof(*in6p), AF_INET6); + if (hp) { + if ((cp = index(hp->h_name, '.')) && + !strcmp(cp + 1, domain)) + *cp = 0; + cp = hp->h_name; + } + } + if (IN6_IS_ADDR_UNSPECIFIED(in6p)) + strcpy(line, "*"); + else if (cp) + strcpy(line, cp); + else + sprintf(line, "%s", + inet_ntop(AF_INET6, (void *)in6p, ntop_buf, + sizeof(ntop_buf))); + return (line); +} +#endif + +static void +sctp_print_address(union sctp_sockstore *address, int port, int num_port) +{ + struct servent *sp = 0; + char line[80], *cp; + int width; + + switch (address->sa.sa_family) { + case AF_INET: + sprintf(line, "%.*s.", Wflag ? 39 : 16, inetname(&address->sin.sin_addr)); + break; +#ifdef INET6 + case AF_INET6: + sprintf(line, "%.*s.", Wflag ? 39 : 16, inet6name(&address->sin6.sin6_addr)); + break; +#endif + default: + sprintf(line, "%.*s.", Wflag ? 39 : 16, ""); + break; + } + cp = index(line, '\0'); + if (!num_port && port) + sp = getservbyport((int)port, "sctp"); + if (sp || port == 0) + sprintf(cp, "%.15s ", sp ? sp->s_name : "*"); + else + sprintf(cp, "%d ", ntohs((u_short)port)); + width = Wflag ? 45 : 22; + printf("%-*.*s ", width, width, line); +} + static int sctp_skip_xinpcb_ifneed(char *buf, const size_t buflen, size_t *offset) { @@ -150,18 +268,14 @@ sctp_skip_xinpcb_ifneed(char *buf, const size_t buflen, size_t *offset) } static void -sctp_process_tcb(struct xsctp_tcb *xstcb, const char *name, +sctp_process_tcb(struct xsctp_tcb *xstcb, char *buf, const size_t buflen, size_t *offset, int *indent) { int i, xl_total = 0, xr_total = 0, x_max; - struct sockaddr *sa; struct xsctp_raddr *xraddr; struct xsctp_laddr *xladdr; struct xladdr_entry *prev_xl = NULL, *xl = NULL, *xl_tmp; struct xraddr_entry *prev_xr = NULL, *xr = NULL, *xr_tmp; -#ifdef INET6 - struct sockaddr_in6 *in6; -#endif LIST_INIT(&xladdr_head); LIST_INIT(&xraddr_head); @@ -220,38 +334,22 @@ sctp_process_tcb(struct xsctp_tcb *xstcb, const char *name, x_max = (xl_total > xr_total) ? xl_total : xr_total; for (i = 0; i < x_max; i++) { if (((*indent == 0) && i > 0) || *indent > 0) - printf("%-11s ", " "); + printf("%-12s ", " "); if (xl != NULL) { - sa = &(xl->xladdr->address.sa); - if ((sa->sa_family) == AF_INET) - inetprint(&((struct sockaddr_in *)sa)->sin_addr, - htons(xstcb->local_port), - name, numeric_port); -#ifdef INET6 - else { - in6 = (struct sockaddr_in6 *)sa; - inet6print(&in6->sin6_addr, - htons(xstcb->local_port), - name, numeric_port); + sctp_print_address(&(xl->xladdr->address), + htons(xstcb->local_port), numeric_port); + } else { + if (Wflag) { + printf("%-45s ", " "); + } else { + printf("%-22s ", " "); } -#endif } if (xr != NULL && !Lflag) { - sa = &(xr->xraddr->address.sa); - if ((sa->sa_family) == AF_INET) - inetprint(&((struct sockaddr_in *)sa)->sin_addr, - htons(xstcb->remote_port), - name, numeric_port); -#ifdef INET6 - else { - in6 = (struct sockaddr_in6 *)sa; - inet6print(&in6->sin6_addr, - htons(xstcb->remote_port), - name, numeric_port); - } -#endif + sctp_print_address(&(xr->xraddr->address), + htons(xstcb->remote_port), numeric_port); } if (xl != NULL) @@ -285,53 +383,21 @@ out: } } -#ifdef SCTP_DEBUG -uint32_t sctp_pdup[64]; -int sctp_pcnt = 0; -#endif - static void -sctp_process_inpcb(struct xsctp_inpcb *xinpcb, const char *name, +sctp_process_inpcb(struct xsctp_inpcb *xinpcb, char *buf, const size_t buflen, size_t *offset) { - int offset_backup, indent = 0, xladdr_total = 0, is_listening = 0; + int indent = 0, xladdr_total = 0, is_listening = 0; static int first = 1; - char *tname; + char *tname, *pname; struct xsctp_tcb *xstcb; struct xsctp_laddr *xladdr; - struct sockaddr *sa; -#ifdef INET6 - struct sockaddr_in6 *in6; -#endif + size_t offset_laddr; + int process_closed; - if ((xinpcb->flags & SCTP_PCB_FLAGS_TCPTYPE) == - SCTP_PCB_FLAGS_TCPTYPE && xinpcb->maxqlen > 0) + if (xinpcb->maxqlen > 0) is_listening = 1; - if (!Lflag && !is_listening && - !(xinpcb->flags & SCTP_PCB_FLAGS_CONNECTED)) { -#ifdef SCTP_DEBUG - int i, found = 0; - - for (i = 0; i < sctp_pcnt; i++) { - if (sctp_pdup[i] == xinpcb->flags) { - found = 1; - break; - } - } - if (!found) { - sctp_pdup[sctp_pcnt++] = xinpcb->flags; - if (sctp_pcnt >= 64) - sctp_pcnt = 0; - printf("[0x%08x]", xinpcb->flags); - } -#endif - offset_backup = *offset; - if (!sctp_skip_xinpcb_ifneed(buf, buflen, offset)) - return; - *offset = offset_backup; - } - if (first) { if (!Lflag) { printf("Active SCTP associations"); @@ -340,90 +406,115 @@ sctp_process_inpcb(struct xsctp_inpcb *xinpcb, const char *name, } else printf("Current listen queue sizes (qlen/maxqlen)"); putchar('\n'); - if (Aflag) - printf("%-8.8s ", "Socket"); if (Lflag) - printf("%-5.5s %-5.5s %-8.8s %-22.22s\n", + printf("%-6.6s %-5.5s %-8.8s %-22.22s\n", "Proto", "Type", "Listen", "Local Address"); else - printf((Aflag && !Wflag) ? - "%-5.5s %-5.5s %-18.18s %-18.18s %s\n" : - "%-5.5s %-5.5s %-22.22s %-22.22s %s\n", - "Proto", "Type", - "Local Address", "Foreign Address", - "(state)"); + if (Wflag) + printf("%-6.6s %-5.5s %-45.45s %-45.45s %s\n", + "Proto", "Type", + "Local Address", "Foreign Address", + "(state)"); + else + printf("%-6.6s %-5.5s %-22.22s %-22.22s %s\n", + "Proto", "Type", + "Local Address", "Foreign Address", + "(state)"); first = 0; } - if (Lflag && xinpcb->maxqlen == 0) { + xladdr = (struct xsctp_laddr *)(buf + *offset); + if (Lflag && !is_listening) { sctp_skip_xinpcb_ifneed(buf, buflen, offset); return; } - if (Aflag) - printf("%8lx ", (u_long)xinpcb); - printf("%-5.5s ", name); + if (xinpcb->flags & SCTP_PCB_FLAGS_BOUND_V6) { + /* Can't distinguish between sctp46 and sctp6 */ + pname = "sctp46"; + } else { + pname = "sctp4"; + } if (xinpcb->flags & SCTP_PCB_FLAGS_TCPTYPE) tname = "1to1"; else if (xinpcb->flags & SCTP_PCB_FLAGS_UDPTYPE) tname = "1toN"; else - return; - - printf("%-5.5s ", tname); + tname = "????"; if (Lflag) { char buf1[9]; snprintf(buf1, 9, "%hu/%hu", xinpcb->qlen, xinpcb->maxqlen); + printf("%-6.6s %-5.5s ", pname, tname); printf("%-8.8s ", buf1); } - /* - * process the local address. This routine are used for Lflag. - */ + + offset_laddr = *offset; + process_closed = 0; +retry: while (*offset < buflen) { xladdr = (struct xsctp_laddr *)(buf + *offset); *offset += sizeof(struct xsctp_laddr); - if (xladdr->last == 1) + if (xladdr->last) { + if (aflag && !Lflag && (xladdr_total == 0) && process_closed) { + printf("%-6.6s %-5.5s ", pname, tname); + if (Wflag) { + printf("%-91.91s CLOSED", " "); + } else { + printf("%-45.45s CLOSED", " "); + } + } + if (process_closed || is_listening) { + putchar('\n'); + } break; + } - if (!Lflag && !is_listening) + if (!Lflag && !is_listening && !process_closed) continue; - if (xladdr_total != 0) + if (xladdr_total == 0) { + printf("%-6.6s %-5.5s ", pname, tname); + } else { putchar('\n'); - if (xladdr_total > 0) printf((Lflag) ? - "%-20.20s " : "%-11.11s ", " "); - - sa = &(xladdr->address.sa); - if ((sa->sa_family) == AF_INET) - inetprint(&((struct sockaddr_in *)sa)->sin_addr, - htons(xinpcb->local_port), name, numeric_port); -#ifdef INET6 - else { - in6 = (struct sockaddr_in6 *)sa; - inet6print(&in6->sin6_addr, - htons(xinpcb->local_port), name, numeric_port); + "%-21.21s " : "%-12.12s ", " "); + } + sctp_print_address(&(xladdr->address), + htons(xinpcb->local_port), numeric_port); + if (aflag && !Lflag && xladdr_total == 0) { + if (Wflag) { + if (process_closed) { + printf("%-45.45s CLOSED", " "); + } else { + printf("%-45.45s LISTEN", " "); + } + } else { + if (process_closed) { + printf("%-22.22s CLOSED", " "); + } else { + printf("%-22.22s LISTEN", " "); + } + } } -#endif - - if (!Lflag && xladdr_total == 0 && is_listening == 1) - printf("%-22.22s LISTEN", " "); - xladdr_total++; } xstcb = (struct xsctp_tcb *)(buf + *offset); *offset += sizeof(struct xsctp_tcb); + if (aflag && (xladdr_total == 0) && xstcb->last && !process_closed) { + process_closed = 1; + *offset = offset_laddr; + goto retry; + } while (xstcb->last == 0 && *offset < buflen) { - sctp_process_tcb(xstcb, name, buf, buflen, offset, &indent); + printf("%-6.6s %-5.5s ", pname, tname); + sctp_process_tcb(xstcb, buf, buflen, offset, &indent); indent++; xstcb = (struct xsctp_tcb *)(buf + *offset); *offset += sizeof(struct xsctp_tcb); } - - putchar('\n'); } /* @@ -461,7 +552,7 @@ sctp_protopr(u_long off __unused, xinpcb = (struct xsctp_inpcb *)(buf + offset); offset += sizeof(struct xsctp_inpcb); while (xinpcb->last == 0 && offset < len) { - sctp_process_inpcb(xinpcb, name, buf, (const size_t)len, + sctp_process_inpcb(xinpcb, buf, (const size_t)len, &offset); xinpcb = (struct xsctp_inpcb *)(buf + offset); From 2621f2c43fafc51d701cbd84f888272fad66ae6d Mon Sep 17 00:00:00 2001 From: Kirk McKusick Date: Fri, 22 Jul 2011 18:03:33 +0000 Subject: [PATCH 042/452] Default debugging error messages to off for journaled soft updates sysctls. Delete limiting on output of these sysctls. Approved by: re (kib) --- sys/ufs/ffs/ffs_alloc.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index 82506fbe3be..283db174db4 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -2447,7 +2447,7 @@ static SYSCTL_NODE(_vfs_ffs, FFS_SET_BUFOUTPUT, setbufoutput, CTLFLAG_WR, #define DEBUG 1 #ifdef DEBUG -static int fsckcmds = 1; +static int fsckcmds = 0; SYSCTL_INT(_debug, OID_AUTO, fsckcmds, CTLFLAG_RW, &fsckcmds, 0, ""); #endif /* DEBUG */ @@ -2470,7 +2470,6 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) struct file *fp, *vfp; int vfslocked, filetype, error; static struct fileops *origops, bufferedops; - static int outcnt = 0; if (req->newlen > sizeof cmd) return (EBADRPC); @@ -2755,7 +2754,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) break; } #ifdef DEBUG - if (fsckcmds && outcnt++ < 100) { + if (fsckcmds) { printf("%s: update inode %jd\n", mp->mnt_stat.f_mntonname, (intmax_t)cmd.value); } @@ -2857,7 +2856,6 @@ buffered_write(fp, uio, active_cred, flags, td) struct fs *fs; int error, vfslocked; daddr_t lbn; - static int outcnt = 0; /* * The devvp is associated with the /dev filesystem. To discover @@ -2875,7 +2873,7 @@ buffered_write(fp, uio, active_cred, flags, td) if ((flags & FOF_OFFSET) == 0) uio->uio_offset = fp->f_offset; #ifdef DEBUG - if (fsckcmds && outcnt++ < 100) { + if (fsckcmds) { printf("%s: buffered write for block %jd\n", fs->fs_fsmnt, (intmax_t)btodb(uio->uio_offset)); } From ab1779e30e54510dd891c83f7cd5bf47a170c6a4 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Fri, 22 Jul 2011 21:08:19 +0000 Subject: [PATCH 043/452] Revert the apparently-unecessary module_path twiddling from r223917 Approved by: re (kib) --- etc/rc.d/kld | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/etc/rc.d/kld b/etc/rc.d/kld index cd2fbab9c41..946ec6951ce 100755 --- a/etc/rc.d/kld +++ b/etc/rc.d/kld @@ -41,24 +41,11 @@ kld_start() { [ -n "$kld_list" ] || return - local _kernel_path _module_path _kld _path - - _kernel_path=`$SYSCTL_N kern.bootfile` - _kernel_path="${_kernel_path%/*}" - - _module_path=`$SYSCTL_N kern.module_path` - _module_path="${_module_path#*\;}" - _module_path="$_kernel_path `ltr $_module_path \; ' '`" + local _kld echo 'Loading kernel modules:' for _kld in $kld_list ; do - for _path in $_module_path ; do - if [ -x "${_path}/${_kld}.ko" ]; then - load_kld -e ${_kld}.ko ${_path}/${_kld}.ko - continue 2 - fi - done - warn "${_kld}.ko not found in $_module_path" + load_kld -e ${_kld}.ko $_kld done } From c36bb43ca663977cd5ab32d9aaaebe66bf7ec388 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Sat, 23 Jul 2011 22:11:40 +0000 Subject: [PATCH 044/452] Do not try to execute FLUSHCACHE on close and print extra messages for invalidated (considered lost) ada device. Exactly same already done for the da devices. Approved by: re (kib) MFC after: 1 week --- sys/cam/ata/ata_da.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c index ed0dbef444d..46ae21882f1 100644 --- a/sys/cam/ata/ata_da.c +++ b/sys/cam/ata/ata_da.c @@ -425,7 +425,8 @@ adaclose(struct disk *dp) softc = (struct ada_softc *)periph->softc; /* We only sync the cache if the drive is capable of it. */ - if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) { + if ((softc->flags & ADA_FLAG_CAN_FLUSHCACHE) != 0 && + (softc->flags & ADA_FLAG_PACK_INVALID) == 0) { ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); cam_fill_ataio(&ccb->ataio, @@ -1361,7 +1362,8 @@ adadone(struct cam_periph *periph, union ccb *done_ccb) return; } if (error != 0) { - if (error == ENXIO) { + if (error == ENXIO && + (softc->flags & ADA_FLAG_PACK_INVALID) == 0) { /* * Catastrophic error. Mark our pack as * invalid. From 5d5140280b5689c629efc2e663867592d49bb7bc Mon Sep 17 00:00:00 2001 From: Glen Barber Date: Sat, 23 Jul 2011 22:55:32 +0000 Subject: [PATCH 045/452] Fix various broken links in manual pages. Submitted by: Michiel Overtoom (motoom % xs4all nl) PR: 159130 159131 159132 159133 159134 159135 159136 159137 158138 159144 Approved by: re (kib) MFC after: 3 days --- share/man/man4/dc.4 | 4 ++-- share/man/man4/gif.4 | 4 ++-- share/man/man4/lmc.4 | 4 +--- share/man/man4/mpt.4 | 4 ++-- share/man/man4/rue.4 | 6 +++--- share/man/man4/stf.4 | 4 ++-- share/man/man4/wi.4 | 4 ++-- share/man/man5/reiserfs.5 | 3 +-- share/man/man8/crash.8 | 4 ++-- usr.sbin/faithd/faithd.8 | 4 ++-- 10 files changed, 19 insertions(+), 22 deletions(-) diff --git a/share/man/man4/dc.4 b/share/man/man4/dc.4 index 6628d735028..3a565fc0d7a 100644 --- a/share/man/man4/dc.4 +++ b/share/man/man4/dc.4 @@ -30,7 +30,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 16, 2005 +.Dd July 23, 2011 .Dt DC 4 .Os .Sh NAME @@ -357,7 +357,7 @@ the card should be configured correctly. .Re .Rs .%T Davicom DM9102 data sheet -.%U http://www.davicom8.com +.%U http://www.davicom.com.tw/userfile/24247/DM9102H-DS-F01-021508.pdf .Re .Rs .%T Intel 21143 Hardware Reference Manual diff --git a/share/man/man4/gif.4 b/share/man/man4/gif.4 index 43605dfa7fd..bb6c7849266 100644 --- a/share/man/man4/gif.4 +++ b/share/man/man4/gif.4 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 8, 2009 +.Dd July 23, 2011 .Dt GIF 4 .Os .Sh NAME @@ -198,7 +198,7 @@ to 1. .%B RFC2893 .%T Transition Mechanisms for IPv6 Hosts and Routers .%D August 2000 -.%U ftp://ftp.isi.edu/in-notes/rfc2893.txt +.%U http://www.ietf.org/rfc/rfc2893.txt .Re .Rs .%A Sally Floyd diff --git a/share/man/man4/lmc.4 b/share/man/man4/lmc.4 index 073f9b10921..439a10fcc70 100644 --- a/share/man/man4/lmc.4 +++ b/share/man/man4/lmc.4 @@ -43,7 +43,7 @@ .\" this program; if not, write to the Free Software Foundation, Inc., 59 .\" Temple Place - Suite 330, Boston, MA 02111-1307, USA. .\" -.Dd May 20, 2006 +.Dd July 23, 2011 .Dt LMC 4 .Os .\" @@ -723,8 +723,6 @@ Thus, cable length does not affect data/clock timing. .Xr ngctl 8 , .Xr ping 8 , .Xr ifnet 9 -.Pp -.Pa http://www.sbei.com/ .\" .Sh HISTORY .\" diff --git a/share/man/man4/mpt.4 b/share/man/man4/mpt.4 index 50ae0c6713a..4983759fb50 100644 --- a/share/man/man4/mpt.4 +++ b/share/man/man4/mpt.4 @@ -35,7 +35,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 13, 2010 +.Dd July 23, 2011 .Dt MPT 4 .Os .Sh NAME @@ -161,7 +161,7 @@ can take on - no separate compilation is required. .Xr gmultipath 8 .Rs .%T "LSI Logic Website" -.%U http://www.lsilogic.com/ +.%U http://www.lsi.com/ .Re .Sh HISTORY The diff --git a/share/man/man4/rue.4 b/share/man/man4/rue.4 index e8f69ecd8b4..06f91e8a0a0 100644 --- a/share/man/man4/rue.4 +++ b/share/man/man4/rue.4 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 16, 2005 +.Dd July 23, 2011 .Dt RUE 4 .Os .Sh NAME @@ -139,8 +139,8 @@ The driver failed to allocate an mbuf for the receiver ring. .Xr ng_ether 4 , .Xr ifconfig 8 .Rs -.%T "ReakTek RTL8150 data sheet" -.%U ftp://ftp.realtek.com.tw/lancard/data_sheet/8150/ +.%T "RealTek RTL8150 data sheet" +.%U http://pdf.seekdatasheet.com/2008714/200807142333305235.pdf .Re .Sh HISTORY The diff --git a/share/man/man4/stf.4 b/share/man/man4/stf.4 index 660e33edae9..1178e03bb30 100644 --- a/share/man/man4/stf.4 +++ b/share/man/man4/stf.4 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 27, 2001 +.Dd July 23, 2011 .Dt STF 4 .Os .Sh NAME @@ -230,7 +230,7 @@ and not to use your 6to4 prefix as a source. .Xr inet 4 , .Xr inet6 4 .Pp -.Pa http://www.6bone.net/6bone_6to4.html +.Pa http://www.ipv6day.org/action.php?n=En.IPv6day .Rs .%A Brian Carpenter .%A Keith Moore diff --git a/share/man/man4/wi.4 b/share/man/man4/wi.4 index 1e1a2bc74cf..c8b49a581a6 100644 --- a/share/man/man4/wi.4 +++ b/share/man/man4/wi.4 @@ -31,7 +31,7 @@ .\" $FreeBSD$ .\" $OpenBSD: wi.4tbl,v 1.14 2002/04/29 19:53:50 jsyn Exp $ .\" -.Dd January 4, 2010 +.Dd July 23, 2011 .Dt WI 4 .Os .Sh NAME @@ -319,7 +319,7 @@ command. .Xr wpa_supplicant 8 . .Rs .%T HCF Light programming specification -.%U http://www.wavelan.com +.%U http://web.archive.org/web/20040130141721/http://wavelan.com/ .Re .Sh HISTORY The diff --git a/share/man/man5/reiserfs.5 b/share/man/man5/reiserfs.5 index dd7757cecf1..2f3eaeefbf0 100644 --- a/share/man/man5/reiserfs.5 +++ b/share/man/man5/reiserfs.5 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 16, 2006 +.Dd July 23, 2011 .Dt REISERFS 5 .Os .Sh NAME @@ -71,7 +71,6 @@ first appeared in .An -nosplit The ReiserFS kernel implementation was written by .An Hans Reiser -.Pq Pa http://www.namesys.com/ , and ported to .Fx by diff --git a/share/man/man8/crash.8 b/share/man/man8/crash.8 index 94a0ecce0ea..d2904435e08 100644 --- a/share/man/man8/crash.8 +++ b/share/man/man8/crash.8 @@ -36,7 +36,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 2, 1996 +.Dd July 23, 2011 .Dt CRASH 8 .Os .Sh NAME @@ -207,7 +207,7 @@ the panic message is printed. For more details consult the chapter on kernel debugging in the .%B "FreeBSD Developers' Handbook" -.Pq Pa http://www.FreeBSD.org/ . +.Pq Pa http://www.freebsd.org/doc/en/books/developers-handbook/ . .Sh SEE ALSO .Xr kgdb 1 , .Xr dumpon 8 , diff --git a/usr.sbin/faithd/faithd.8 b/usr.sbin/faithd/faithd.8 index 25c118dbf12..f47c17f88a9 100644 --- a/usr.sbin/faithd/faithd.8 +++ b/usr.sbin/faithd/faithd.8 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 9, 2010 +.Dd July 23, 2011 .Dt FAITHD 8 .Os .Sh NAME @@ -368,7 +368,7 @@ setting. .%A Kazu Yamamoto .%T "An IPv6-to-IPv4 transport relay translator" .%B RFC3142 -.%U ftp://ftp.isi.edu/in-notes/rfc3142.txt +.%U http://www.ietf.org/rfc/rfc3142.txt .%D June 2001 .Re .\" From 1f897ce116ef644e2560c342f3dce1d143f485a8 Mon Sep 17 00:00:00 2001 From: Glen Barber Date: Sun, 24 Jul 2011 03:34:38 +0000 Subject: [PATCH 046/452] Document the potential for jail escape. Submitted by: Vedad KAJTAZ (vedad % kajtaz net) PR: 142341 Reviewed by: bz, rwatson Rewording by: rwatson Approved by: re (kensmith) MFC after: 3 days --- usr.sbin/jail/jail.8 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/usr.sbin/jail/jail.8 b/usr.sbin/jail/jail.8 index 893efd84da5..8ed913a1eb0 100644 --- a/usr.sbin/jail/jail.8 +++ b/usr.sbin/jail/jail.8 @@ -34,7 +34,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 17, 2010 +.Dd July 23, 2011 .Dt JAIL 8 .Os .Sh NAME @@ -907,3 +907,10 @@ Currently, the simplest answer is to minimize services offered on the host, possibly limiting it to services offered from .Xr inetd 8 which is easily configurable. +.Sh NOTES +Great care should be taken when managing directories visible within the jail. +For example, if a jailed process has its current working directory set to a +directory that is moved out of the jail's chroot, then the process may gain +access to the file space outside of the jail. +It is recommended that directories always be copied, rather than moved, out +of a jail. From 6beb3bb4ebbe8089ceacb464aeffcf3f01c64312 Mon Sep 17 00:00:00 2001 From: Kirk McKusick Date: Sun, 24 Jul 2011 17:43:09 +0000 Subject: [PATCH 047/452] This update changes the mnt_flag field in the mount structure from 32 bits to 64 bits and eliminates the unused mnt_xflag field. The existing mnt_flag field is completely out of bits, so this update gives us room to expand. Note that the f_flags field in the statfs structure is already 64 bits, so the expanded mnt_flag field can be exported without having to make any changes in the statfs structure. Approved by: re (bz) --- sys/fs/cd9660/iso.h | 2 +- sys/fs/msdosfs/msdosfsmount.h | 2 +- sys/fs/ntfs/ntfs.h | 2 +- sys/fs/smbfs/smbfs.h | 2 +- sys/kern/kern_jail.c | 4 +- sys/kern/vfs_mount.c | 3 +- sys/sys/mount.h | 72 +++++++++++++++++------------------ 7 files changed, 44 insertions(+), 43 deletions(-) diff --git a/sys/fs/cd9660/iso.h b/sys/fs/cd9660/iso.h index 0988bf6b406..89322e74dab 100644 --- a/sys/fs/cd9660/iso.h +++ b/sys/fs/cd9660/iso.h @@ -220,7 +220,7 @@ enum ISO_FTYPE { ISO_FTYPE_DEFAULT, ISO_FTYPE_9660, ISO_FTYPE_RRIP, #endif struct iso_mnt { - int im_flags; + uint64_t im_flags; struct mount *im_mountp; struct cdev *im_dev; diff --git a/sys/fs/msdosfs/msdosfsmount.h b/sys/fs/msdosfs/msdosfsmount.h index 417923fa805..673095ed69f 100644 --- a/sys/fs/msdosfs/msdosfsmount.h +++ b/sys/fs/msdosfs/msdosfsmount.h @@ -103,7 +103,7 @@ struct msdosfsmount { u_int pm_fatdiv; /* offset computation */ u_int pm_curfat; /* current fat for FAT32 (0 otherwise) */ u_int *pm_inusemap; /* ptr to bitmap of in-use clusters */ - u_int pm_flags; /* see below */ + uint64_t pm_flags; /* see below */ void *pm_u2w; /* Local->Unicode iconv handle */ void *pm_w2u; /* Unicode->Local iconv handle */ void *pm_u2d; /* Unicode->DOS iconv handle */ diff --git a/sys/fs/ntfs/ntfs.h b/sys/fs/ntfs/ntfs.h index 4f6431f3715..8415222297b 100644 --- a/sys/fs/ntfs/ntfs.h +++ b/sys/fs/ntfs/ntfs.h @@ -250,7 +250,7 @@ struct ntfsmount { uid_t ntm_uid; gid_t ntm_gid; mode_t ntm_mode; - u_int ntm_flag; + uint64_t ntm_flag; cn_t ntm_cfree; struct ntvattrdef *ntm_ad; int ntm_adnum; diff --git a/sys/fs/smbfs/smbfs.h b/sys/fs/smbfs/smbfs.h index 4be0a55c76b..84c79a12f89 100644 --- a/sys/fs/smbfs/smbfs.h +++ b/sys/fs/smbfs/smbfs.h @@ -80,7 +80,7 @@ struct smbmount { struct mount * sm_mp; struct smbnode * sm_root; struct ucred * sm_owner; - u_int sm_flags; + uint64_t sm_flags; long sm_nextino; struct smb_share * sm_share; /* struct simplelock sm_npslock;*/ diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c index 358d67394e4..584334af3ad 100644 --- a/sys/kern/kern_jail.c +++ b/sys/kern/kern_jail.c @@ -540,8 +540,8 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) #ifdef INET6 int ip6s, redo_ip6; #endif - unsigned pr_flags, ch_flags; - unsigned pr_allow, ch_allow, tallow; + uint64_t pr_allow, ch_allow, pr_flags, ch_flags; + unsigned tallow; char numbuf[12]; error = priv_check(td, PRIV_JAIL_SET); diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 5edf0f52acb..5d6892c5e9b 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -1496,7 +1496,8 @@ vfs_getopts(struct vfsoptlist *opts, const char *name, int *error) } int -vfs_flagopt(struct vfsoptlist *opts, const char *name, u_int *w, u_int val) +vfs_flagopt(struct vfsoptlist *opts, const char *name, uint64_t *w, + uint64_t val) { struct vfsopt *opt; diff --git a/sys/sys/mount.h b/sys/sys/mount.h index d6366071b91..c325734b4a4 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -166,8 +166,7 @@ struct mount { int mnt_nvnodelistsize; /* (i) # of vnodes */ int mnt_writeopcount; /* (i) write syscalls pending */ int mnt_kern_flag; /* (i) kernel only flags */ - u_int mnt_flag; /* (i) flags shared with user */ - u_int mnt_xflag; /* (i) more flags shared with user */ + uint64_t mnt_flag; /* (i) flags shared with user */ u_int mnt_noasync; /* (i) # noasync overrides */ struct vfsoptlist *mnt_opt; /* current mount options */ struct vfsoptlist *mnt_optnew; /* new options passed to fs */ @@ -224,43 +223,43 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); /* * User specifiable flags, stored in mnt_flag. */ -#define MNT_RDONLY 0x00000001 /* read only filesystem */ -#define MNT_SYNCHRONOUS 0x00000002 /* filesystem written synchronously */ -#define MNT_NOEXEC 0x00000004 /* can't exec from filesystem */ -#define MNT_NOSUID 0x00000008 /* don't honor setuid bits on fs */ -#define MNT_UNION 0x00000020 /* union with underlying filesystem */ -#define MNT_ASYNC 0x00000040 /* filesystem written asynchronously */ -#define MNT_SUIDDIR 0x00100000 /* special handling of SUID on dirs */ -#define MNT_SOFTDEP 0x00200000 /* soft updates being done */ -#define MNT_NOSYMFOLLOW 0x00400000 /* do not follow symlinks */ -#define MNT_GJOURNAL 0x02000000 /* GEOM journal support enabled */ -#define MNT_MULTILABEL 0x04000000 /* MAC support for individual objects */ -#define MNT_ACLS 0x08000000 /* ACL support enabled */ -#define MNT_NOATIME 0x10000000 /* disable update of file access time */ -#define MNT_NOCLUSTERR 0x40000000 /* disable cluster read */ -#define MNT_NOCLUSTERW 0x80000000 /* disable cluster write */ -#define MNT_NFS4ACLS 0x00000010 +#define MNT_RDONLY 0x0000000000000001ULL /* read only filesystem */ +#define MNT_SYNCHRONOUS 0x0000000000000002ULL /* fs written synchronously */ +#define MNT_NOEXEC 0x0000000000000004ULL /* can't exec from filesystem */ +#define MNT_NOSUID 0x0000000000000008ULL /* don't honor setuid fs bits */ +#define MNT_NFS4ACLS 0x0000000000000010ULL /* enable NFS version 4 ACLs */ +#define MNT_UNION 0x0000000000000020ULL /* union with underlying fs */ +#define MNT_ASYNC 0x0000000000000040ULL /* fs written asynchronously */ +#define MNT_SUIDDIR 0x0000000000100000ULL /* special SUID dir handling */ +#define MNT_SOFTDEP 0x0000000000200000ULL /* using soft updates */ +#define MNT_NOSYMFOLLOW 0x0000000000400000ULL /* do not follow symlinks */ +#define MNT_GJOURNAL 0x0000000002000000ULL /* GEOM journal support enabled */ +#define MNT_MULTILABEL 0x0000000004000000ULL /* MAC support for objects */ +#define MNT_ACLS 0x0000000008000000ULL /* ACL support enabled */ +#define MNT_NOATIME 0x0000000010000000ULL /* dont update file access time */ +#define MNT_NOCLUSTERR 0x0000000040000000ULL /* disable cluster read */ +#define MNT_NOCLUSTERW 0x0000000080000000ULL /* disable cluster write */ /* * NFS export related mount flags. */ -#define MNT_EXRDONLY 0x00000080 /* exported read only */ -#define MNT_EXPORTED 0x00000100 /* filesystem is exported */ -#define MNT_DEFEXPORTED 0x00000200 /* exported to the world */ -#define MNT_EXPORTANON 0x00000400 /* use anon uid mapping for everyone */ -#define MNT_EXKERB 0x00000800 /* exported with Kerberos uid mapping */ -#define MNT_EXPUBLIC 0x20000000 /* public export (WebNFS) */ +#define MNT_EXRDONLY 0x0000000000000080ULL /* exported read only */ +#define MNT_EXPORTED 0x0000000000000100ULL /* filesystem is exported */ +#define MNT_DEFEXPORTED 0x0000000000000200ULL /* exported to the world */ +#define MNT_EXPORTANON 0x0000000000000400ULL /* anon uid mapping for all */ +#define MNT_EXKERB 0x0000000000000800ULL /* exported with Kerberos */ +#define MNT_EXPUBLIC 0x0000000020000000ULL /* public export (WebNFS) */ /* * Flags set by internal operations, * but visible to the user. * XXX some of these are not quite right.. (I've never seen the root flag set) */ -#define MNT_LOCAL 0x00001000 /* filesystem is stored locally */ -#define MNT_QUOTA 0x00002000 /* quotas are enabled on filesystem */ -#define MNT_ROOTFS 0x00004000 /* identifies the root filesystem */ -#define MNT_USER 0x00008000 /* mounted by a user */ -#define MNT_IGNORE 0x00800000 /* do not show entry in df */ +#define MNT_LOCAL 0x0000000000001000ULL /* filesystem is stored locally */ +#define MNT_QUOTA 0x0000000000002000ULL /* quotas are enabled on fs */ +#define MNT_ROOTFS 0x0000000000004000ULL /* identifies the root fs */ +#define MNT_USER 0x0000000000008000ULL /* mounted by a user */ +#define MNT_IGNORE 0x0000000000800000ULL /* do not show entry in df */ /* * Mask of flags that are visible to statfs(). @@ -293,12 +292,12 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); * XXX: MNT_BYFSID collides with MNT_ACLS, but because MNT_ACLS is only used for * mount(2) and MNT_BYFSID is only used for unmount(2) it's harmless. */ -#define MNT_UPDATE 0x00010000 /* not a real mount, just an update */ -#define MNT_DELEXPORT 0x00020000 /* delete export host lists */ -#define MNT_RELOAD 0x00040000 /* reload filesystem data */ -#define MNT_FORCE 0x00080000 /* force unmount or readonly change */ -#define MNT_SNAPSHOT 0x01000000 /* snapshot the filesystem */ -#define MNT_BYFSID 0x08000000 /* specify filesystem by ID. */ +#define MNT_UPDATE 0x0000000000010000ULL /* not real mount, just update */ +#define MNT_DELEXPORT 0x0000000000020000ULL /* delete export host lists */ +#define MNT_RELOAD 0x0000000000040000ULL /* reload filesystem data */ +#define MNT_FORCE 0x0000000000080000ULL /* force unmount or readonly */ +#define MNT_SNAPSHOT 0x0000000001000000ULL /* snapshot the filesystem */ +#define MNT_BYFSID 0x0000000008000000ULL /* specify filesystem by ID. */ #define MNT_CMDFLAGS (MNT_UPDATE | MNT_DELEXPORT | MNT_RELOAD | \ MNT_FORCE | MNT_SNAPSHOT | MNT_BYFSID) /* @@ -715,7 +714,8 @@ void vfs_event_signal(fsid_t *, u_int32_t, intptr_t); void vfs_freeopts(struct vfsoptlist *opts); void vfs_deleteopt(struct vfsoptlist *opts, const char *name); int vfs_buildopts(struct uio *auio, struct vfsoptlist **options); -int vfs_flagopt(struct vfsoptlist *opts, const char *name, u_int *w, u_int val); +int vfs_flagopt(struct vfsoptlist *opts, const char *name, uint64_t *w, + uint64_t val); int vfs_getopt(struct vfsoptlist *, const char *, void **, int *); int vfs_getopt_pos(struct vfsoptlist *opts, const char *name); char *vfs_getopts(struct vfsoptlist *, const char *, int *error); From d716efa9f7241a56fbcb1f0cf6139e5a58f66341 Mon Sep 17 00:00:00 2001 From: Kirk McKusick Date: Sun, 24 Jul 2011 18:27:09 +0000 Subject: [PATCH 048/452] Move the MNTK_SUJ flag in mnt_kern_flag to MNT_SUJ in mnt_flag so that it is visible to userland programs. This change enables the `mount' command with no arguments to be able to show if a filesystem is mounted using journaled soft updates as opposed to just normal soft updates. Approved by: re (bz) --- sbin/mount/mount.c | 5 +++-- sys/kern/vfs_subr.c | 3 +-- sys/sys/mount.h | 4 ++-- sys/ufs/ffs/ffs_softdep.c | 38 +++++++++++++++++++------------------- sys/ufs/ffs/ffs_vfsops.c | 3 +++ sys/ufs/ufs/inode.h | 2 +- 6 files changed, 29 insertions(+), 26 deletions(-) diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index 2229419bc2c..61d17471150 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -109,6 +109,7 @@ static struct opt { { MNT_NOCLUSTERW, "noclusterw" }, { MNT_SUIDDIR, "suiddir" }, { MNT_SOFTDEP, "soft-updates" }, + { MNT_SUJ, "journaled soft-updates" }, { MNT_MULTILABEL, "multilabel" }, { MNT_ACLS, "acls" }, { MNT_NFS4ACLS, "nfsv4acls" }, @@ -316,7 +317,7 @@ main(int argc, char *argv[]) rval = 0; switch (argc) { case 0: - if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) + if ((mntsize = getmntinfo(&mntbuf, MNT_WAIT)) == 0) err(1, "getmntinfo"); if (all) { while ((fs = getfsent()) != NULL) { @@ -665,7 +666,7 @@ getmntpt(const char *name) struct statfs *mntbuf; int i, mntsize; - mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); + mntsize = getmntinfo(&mntbuf, MNT_WAIT); for (i = mntsize - 1; i >= 0; i--) { if (strcmp(mntbuf[i].f_mntfromname, name) == 0 || strcmp(mntbuf[i].f_mntonname, name) == 0) diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 934745b433b..a9fe8d10773 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -2841,6 +2841,7 @@ DB_SHOW_COMMAND(mount, db_show_mount) MNT_FLAG(MNT_ASYNC); MNT_FLAG(MNT_SUIDDIR); MNT_FLAG(MNT_SOFTDEP); + MNT_FLAG(MNT_SUJ); MNT_FLAG(MNT_NOSYMFOLLOW); MNT_FLAG(MNT_GJOURNAL); MNT_FLAG(MNT_MULTILABEL); @@ -2866,7 +2867,6 @@ DB_SHOW_COMMAND(mount, db_show_mount) MNT_FLAG(MNT_FORCE); MNT_FLAG(MNT_SNAPSHOT); MNT_FLAG(MNT_BYFSID); - MNT_FLAG(MNT_SOFTDEP); #undef MNT_FLAG if (flags != 0) { if (buf[0] != '\0') @@ -2894,7 +2894,6 @@ DB_SHOW_COMMAND(mount, db_show_mount) MNT_KERN_FLAG(MNTK_REFEXPIRE); MNT_KERN_FLAG(MNTK_EXTENDED_SHARED); MNT_KERN_FLAG(MNTK_SHARED_WRITES); - MNT_KERN_FLAG(MNTK_SUJ); MNT_KERN_FLAG(MNTK_UNMOUNT); MNT_KERN_FLAG(MNTK_MWAIT); MNT_KERN_FLAG(MNTK_SUSPEND); diff --git a/sys/sys/mount.h b/sys/sys/mount.h index c325734b4a4..ecaf7b888b0 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -239,6 +239,7 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); #define MNT_NOATIME 0x0000000010000000ULL /* dont update file access time */ #define MNT_NOCLUSTERR 0x0000000040000000ULL /* disable cluster read */ #define MNT_NOCLUSTERW 0x0000000080000000ULL /* disable cluster write */ +#define MNT_SUJ 0x0000000100000000ULL /* using journaled soft updates */ /* * NFS export related mount flags. @@ -267,7 +268,7 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); * but the 'mount' program may need changing to handle this. */ #define MNT_VISFLAGMASK (MNT_RDONLY | MNT_SYNCHRONOUS | MNT_NOEXEC | \ - MNT_NOSUID | MNT_UNION | \ + MNT_NOSUID | MNT_UNION | MNT_SUJ | \ MNT_ASYNC | MNT_EXRDONLY | MNT_EXPORTED | \ MNT_DEFEXPORTED | MNT_EXPORTANON| MNT_EXKERB | \ MNT_LOCAL | MNT_USER | MNT_QUOTA | \ @@ -324,7 +325,6 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); #define MNTK_REFEXPIRE 0x00000020 /* refcount expiring is happening */ #define MNTK_EXTENDED_SHARED 0x00000040 /* Allow shared locking for more ops */ #define MNTK_SHARED_WRITES 0x00000080 /* Allow shared locking for writes */ -#define MNTK_SUJ 0x00000100 /* Softdep journaling enabled */ #define MNTK_UNMOUNT 0x01000000 /* unmount in progress */ #define MNTK_MWAIT 0x02000000 /* waiting for unmount to finish */ #define MNTK_SUSPEND 0x08000000 /* request write suspension */ diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index fccb2969734..8f1923a6028 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -2423,11 +2423,11 @@ softdep_unmount(mp) MNT_ILOCK(mp); mp->mnt_flag &= ~MNT_SOFTDEP; - if ((mp->mnt_kern_flag & MNTK_SUJ) == 0) { + if ((mp->mnt_flag & MNT_SUJ) == 0) { MNT_IUNLOCK(mp); return; } - mp->mnt_kern_flag &= ~MNTK_SUJ; + mp->mnt_flag &= ~MNT_SUJ; MNT_IUNLOCK(mp); journal_unmount(mp); } @@ -2637,7 +2637,7 @@ journal_mount(mp, fs, cred) out: if (error == 0) { MNT_ILOCK(mp); - mp->mnt_kern_flag |= MNTK_SUJ; + mp->mnt_flag |= MNT_SUJ; MNT_IUNLOCK(mp); /* * Only validate the journal contents if the @@ -3060,7 +3060,7 @@ softdep_flushjournal(mp) struct jblocks *jblocks; struct ufsmount *ump; - if ((mp->mnt_kern_flag & MNTK_SUJ) == 0) + if ((mp->mnt_flag & MNT_SUJ) == 0) return; ump = VFSTOUFS(mp); jblocks = ump->softdep_jblocks; @@ -3096,7 +3096,7 @@ softdep_process_journal(mp, needwk, flags) int off; int devbsize; - if ((mp->mnt_kern_flag & MNTK_SUJ) == 0) + if ((mp->mnt_flag & MNT_SUJ) == 0) return; ump = VFSTOUFS(mp); fs = ump->um_fs; @@ -3827,7 +3827,7 @@ newfreework(ump, freeblks, parent, lbn, nb, frags, off, journal) freework->fw_blkno = nb; freework->fw_frags = frags; freework->fw_indir = NULL; - freework->fw_ref = ((UFSTOVFS(ump)->mnt_kern_flag & MNTK_SUJ) == 0 || + freework->fw_ref = ((UFSTOVFS(ump)->mnt_flag & MNT_SUJ) == 0 || lbn >= -NXADDR) ? 0 : NINDIR(ump->um_fs) + 1; freework->fw_start = freework->fw_off = off; if (journal) @@ -4681,7 +4681,7 @@ softdep_setup_inomapdep(bp, ip, newinum, mode) * Allocate the journal reference add structure so that the bitmap * can be dependent on it. */ - if (mp->mnt_kern_flag & MNTK_SUJ) { + if (mp->mnt_flag & MNT_SUJ) { jaddref = newjaddref(ip, newinum, 0, 0, mode); jaddref->ja_state |= NEWBLOCK; } @@ -4734,7 +4734,7 @@ softdep_setup_blkmapdep(bp, mp, newblkno, frags, oldfrags) * Add it to the dependency list for the buffer holding * the cylinder group map from which it was allocated. */ - if (mp->mnt_kern_flag & MNTK_SUJ) { + if (mp->mnt_flag & MNT_SUJ) { jnewblk = malloc(sizeof(*jnewblk), M_JNEWBLK, M_SOFTDEP_FLAGS); workitem_alloc(&jnewblk->jn_list, D_JNEWBLK, mp); jnewblk->jn_jsegdep = newjsegdep(&jnewblk->jn_list); @@ -5199,7 +5199,7 @@ newfreefrag(ip, blkno, size, lbn) freefrag->ff_blkno = blkno; freefrag->ff_fragsize = size; - if ((ip->i_ump->um_mountp->mnt_kern_flag & MNTK_SUJ) != 0) { + if ((ip->i_ump->um_mountp->mnt_flag & MNT_SUJ) != 0) { freefrag->ff_jdep = (struct worklist *) newjfreefrag(freefrag, ip, blkno, size, lbn); } else { @@ -7254,7 +7254,7 @@ freework_freeblock(freework) freeblks = freework->fw_freeblks; ump = VFSTOUFS(freeblks->fb_list.wk_mp); fs = ump->um_fs; - needj = freeblks->fb_list.wk_mp->mnt_kern_flag & MNTK_SUJ; + needj = (freeblks->fb_list.wk_mp->mnt_flag & MNT_SUJ) != 0; bsize = lfragtosize(fs, freework->fw_frags); LIST_INIT(&wkhd); /* @@ -7674,7 +7674,7 @@ indir_trunc(freework, dbn, lbn) ufs1fmt = 0; } level = lbn_level(lbn); - needj = UFSTOVFS(ump)->mnt_kern_flag & MNTK_SUJ; + needj = (UFSTOVFS(ump)->mnt_flag & MNT_SUJ) != 0; lbnadd = lbn_offset(fs, level); nblocks = btodb(fs->fs_bsize); nfreework = freework; @@ -7860,7 +7860,7 @@ setup_newdir(dap, newinum, dinum, newdirbp, mkdirp) mkdir2->md_state = ATTACHED | MKDIR_PARENT; mkdir2->md_diradd = dap; mkdir2->md_jaddref = NULL; - if ((mp->mnt_kern_flag & MNTK_SUJ) == 0) { + if ((mp->mnt_flag & MNT_SUJ) == 0) { mkdir1->md_state |= DEPCOMPLETE; mkdir2->md_state |= DEPCOMPLETE; } @@ -7900,7 +7900,7 @@ setup_newdir(dap, newinum, dinum, newdirbp, mkdirp) * been satisfied and mkdir2 can be freed. */ inodedep_lookup(mp, dinum, 0, &inodedep); - if (mp->mnt_kern_flag & MNTK_SUJ) { + if (mp->mnt_flag & MNT_SUJ) { if (inodedep == NULL) panic("setup_newdir: Lost parent."); jaddref = (struct jaddref *)TAILQ_LAST(&inodedep->id_inoreflst, @@ -8031,7 +8031,7 @@ softdep_setup_directory_add(bp, dp, diroffset, newinum, newdirbp, isnewblk) * written place it on the bufwait list, otherwise do the post-inode * write processing to put it on the id_pendinghd list. */ - if (mp->mnt_kern_flag & MNTK_SUJ) { + if (mp->mnt_flag & MNT_SUJ) { jaddref = (struct jaddref *)TAILQ_LAST(&inodedep->id_inoreflst, inoreflst); KASSERT(jaddref != NULL && jaddref->ja_parent == dp->i_number, @@ -8047,7 +8047,7 @@ softdep_setup_directory_add(bp, dp, diroffset, newinum, newdirbp, isnewblk) * Add the journal entries for . and .. links now that the primary * link is written. */ - if (mkdir1 != NULL && mp->mnt_kern_flag & MNTK_SUJ) { + if (mkdir1 != NULL && (mp->mnt_flag & MNT_SUJ)) { jaddref = (struct jaddref *)TAILQ_PREV(&jaddref->ja_ref, inoreflst, if_deps); KASSERT(jaddref != NULL && @@ -8144,7 +8144,7 @@ softdep_change_directoryentry_offset(bp, dp, base, oldloc, newloc, entrysize) * determine if any affected adds or removes are present in the * journal. */ - if (mp->mnt_kern_flag & MNTK_SUJ) { + if (mp->mnt_flag & MNT_SUJ) { flags = DEPALLOC; jmvref = newjmvref(dp, de->d_ino, dp->i_offset + (oldloc - base), @@ -8865,7 +8865,7 @@ softdep_setup_directory_change(bp, dp, ip, newinum, isrmdir) * processing to put it on the id_pendinghd list. */ inodedep_lookup(mp, newinum, DEPALLOC, &inodedep); - if (mp->mnt_kern_flag & MNTK_SUJ) { + if (mp->mnt_flag & MNT_SUJ) { jaddref = (struct jaddref *)TAILQ_LAST(&inodedep->id_inoreflst, inoreflst); KASSERT(jaddref != NULL && jaddref->ja_parent == dp->i_number, @@ -8928,7 +8928,7 @@ softdep_setup_sbupdate(ump, fs, bp) struct sbdep *sbdep; struct worklist *wk; - if ((ump->um_mountp->mnt_kern_flag & MNTK_SUJ) == 0) + if ((ump->um_mountp->mnt_flag & MNT_SUJ) == 0) return; LIST_FOREACH(wk, &bp->b_dep, wk_list) if (wk->wk_type == D_SBDEP) @@ -9046,7 +9046,7 @@ unlinked_inodedep(mp, inodedep) { struct ufsmount *ump; - if ((mp->mnt_kern_flag & MNTK_SUJ) == 0) + if ((mp->mnt_flag & MNT_SUJ) == 0) return; ump = VFSTOUFS(mp); ump->um_fs->fs_fmod = 1; diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 35852bf9410..7f57c841cc1 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -1389,6 +1389,9 @@ ffs_statfs(mp, sbp) fs = ump->um_fs; if (fs->fs_magic != FS_UFS1_MAGIC && fs->fs_magic != FS_UFS2_MAGIC) panic("ffs_statfs"); + /* Don't export MNT_SOFTDEP when MNT_SUJ is in use */ + if ((sbp->f_flags & (MNT_SOFTDEP | MNT_SUJ)) == (MNT_SOFTDEP | MNT_SUJ)) + sbp->f_flags &= ~MNT_SOFTDEP; sbp->f_version = STATFS_VERSION; sbp->f_bsize = fs->fs_fsize; sbp->f_iosize = fs->fs_bsize; diff --git a/sys/ufs/ufs/inode.h b/sys/ufs/ufs/inode.h index 7adcc73e1b4..943e303f75d 100644 --- a/sys/ufs/ufs/inode.h +++ b/sys/ufs/ufs/inode.h @@ -176,7 +176,7 @@ struct indir { /* Determine if soft dependencies are being done */ #define DOINGSOFTDEP(vp) ((vp)->v_mount->mnt_flag & MNT_SOFTDEP) #define DOINGASYNC(vp) ((vp)->v_mount->mnt_kern_flag & MNTK_ASYNC) -#define DOINGSUJ(vp) ((vp)->v_mount->mnt_kern_flag & MNTK_SUJ) +#define DOINGSUJ(vp) ((vp)->v_mount->mnt_flag & MNT_SUJ) /* This overlays the fid structure (see mount.h). */ struct ufid { From 7a0b13ed28443e669cf479791ad96cce3d95e17c Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Mon, 25 Jul 2011 09:12:48 +0000 Subject: [PATCH 049/452] remove RESTARTABLE_PANICS option This is done per request/suggestion from John Baldwin who introduced the option. Trying to resume normal system operation after a panic is very unpredictable and dangerous. It will become even more dangerous when we allow a thread in panic(9) to penetrate all lock contexts. I understand that the only purpose of this option was for testing scenarios potentially resulting in panic. Suggested by: jhb Reviewed by: attilio, jhb X-MFC-After: never Approved by: re (kib) --- sys/conf/NOTES | 10 ---------- sys/conf/options | 1 - sys/kern/kern_shutdown.c | 9 --------- sys/netgraph/ng_ether.c | 3 --- sys/netgraph/ng_mppc.c | 3 --- sys/netgraph/ng_parse.c | 12 ------------ sys/sys/systm.h | 4 ---- 7 files changed, 42 deletions(-) diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 0753c1d5c46..4a9ec35d038 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -498,16 +498,6 @@ options DIAGNOSTIC # options REGRESSION -# -# RESTARTABLE_PANICS allows one to continue from a panic as if it were -# a call to the debugger to continue from a panic as instead. It is only -# useful if a kernel debugger is present. To restart from a panic, reset -# the panicstr variable to NULL and continue execution. This option is -# for development use only and should NOT be used in production systems -# to "workaround" a panic. -# -#options RESTARTABLE_PANICS - # # This option lets some drivers co-exist that can't co-exist in a running # system. This is used to be able to compile all kernel code in one go for diff --git a/sys/conf/options b/sys/conf/options index b8f9958ca6f..f7026c13417 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -579,7 +579,6 @@ LOCK_PROFILING opt_global.h LOCK_PROFILING_FAST opt_global.h MSIZE opt_global.h REGRESSION opt_global.h -RESTARTABLE_PANICS opt_global.h RWLOCK_NOINLINE opt_global.h SX_NOINLINE opt_global.h VFS_BIO_DEBUG opt_global.h diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c index 60e854fe340..7621b151d9b 100644 --- a/sys/kern/kern_shutdown.c +++ b/sys/kern/kern_shutdown.c @@ -585,15 +585,6 @@ panic(const char *fmt, ...) kdb_backtrace(); if (debugger_on_panic) kdb_enter(KDB_WHY_PANIC, "panic"); -#ifdef RESTARTABLE_PANICS - /* See if the user aborted the panic, in which case we continue. */ - if (panicstr == NULL) { -#ifdef SMP - atomic_store_rel_int(&panic_cpu, NOCPU); -#endif - return; - } -#endif #endif /*thread_lock(td); */ td->td_flags |= TDF_INPANIC; diff --git a/sys/netgraph/ng_ether.c b/sys/netgraph/ng_ether.c index afedaa37a8f..15e8b2d3625 100644 --- a/sys/netgraph/ng_ether.c +++ b/sys/netgraph/ng_ether.c @@ -604,9 +604,6 @@ ng_ether_rcvdata(hook_p hook, item_p item) NG_FREE_ITEM(item); panic("%s: weird hook", __func__); -#ifdef RESTARTABLE_PANICS /* so we don't get an error msg in LINT */ - return (0); -#endif } /* diff --git a/sys/netgraph/ng_mppc.c b/sys/netgraph/ng_mppc.c index 75194e8df18..cb6531619d3 100644 --- a/sys/netgraph/ng_mppc.c +++ b/sys/netgraph/ng_mppc.c @@ -404,9 +404,6 @@ ng_mppc_rcvdata(hook_p hook, item_p item) /* Oops */ panic("%s: unknown hook", __func__); -#ifdef RESTARTABLE_PANICS - return (EINVAL); -#endif } /* diff --git a/sys/netgraph/ng_parse.c b/sys/netgraph/ng_parse.c index 1215df124b5..fbbefc62d98 100644 --- a/sys/netgraph/ng_parse.c +++ b/sys/netgraph/ng_parse.c @@ -374,9 +374,6 @@ ng_int8_unparse(const struct ng_parse_type *type, break; default: panic("%s: unknown type", __func__); -#ifdef RESTARTABLE_PANICS - return(0); -#endif } if ((error = ng_parse_append(&cbuf, &cbuflen, fmt, fval)) != 0) return (error); @@ -473,9 +470,6 @@ ng_int16_unparse(const struct ng_parse_type *type, break; default: panic("%s: unknown type", __func__); -#ifdef RESTARTABLE_PANICS - return(0); -#endif } if ((error = ng_parse_append(&cbuf, &cbuflen, fmt, fval)) != 0) return (error); @@ -575,9 +569,6 @@ ng_int32_unparse(const struct ng_parse_type *type, break; default: panic("%s: unknown type", __func__); -#ifdef RESTARTABLE_PANICS - return(0); -#endif } if ((error = ng_parse_append(&cbuf, &cbuflen, fmt, fval)) != 0) return (error); @@ -673,9 +664,6 @@ ng_int64_unparse(const struct ng_parse_type *type, break; default: panic("%s: unknown type", __func__); -#ifdef RESTARTABLE_PANICS - return(0); -#endif } if ((error = ng_parse_append(&cbuf, &cbuflen, fmt, fval)) != 0) return (error); diff --git a/sys/sys/systm.h b/sys/sys/systm.h index 8b0de573f6f..7e537ee4a08 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -160,11 +160,7 @@ void *hashinit_flags(int count, struct malloc_type *type, void *phashinit(int count, struct malloc_type *type, u_long *nentries); void g_waitidle(void); -#ifdef RESTARTABLE_PANICS -void panic(const char *, ...) __printflike(1, 2); -#else void panic(const char *, ...) __dead2 __printflike(1, 2); -#endif void cpu_boot(int); void cpu_flush_dcache(void *, size_t); From 42f227047589d03c5a27339cbf7aa2aee6b9553e Mon Sep 17 00:00:00 2001 From: Andreas Tobler Date: Mon, 25 Jul 2011 20:10:01 +0000 Subject: [PATCH 050/452] This a follow up commit from r224216 for powerpc 32-bit. Increase the storage size for sintrcnt/sintrnames to .long. Reviewed by: nwhitehorn Approved by: re (kib) --- sys/powerpc/aim/locore32.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/powerpc/aim/locore32.S b/sys/powerpc/aim/locore32.S index ed74af2fc71..020d22d4913 100644 --- a/sys/powerpc/aim/locore32.S +++ b/sys/powerpc/aim/locore32.S @@ -91,13 +91,13 @@ GLOBAL(esym) GLOBAL(intrnames) .space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 GLOBAL(sintrnames) - .word INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 + .long INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 .align 4 GLOBAL(intrcnt) .space INTRCNT_COUNT * 4 * 2 GLOBAL(sintrcnt) - .word INTRCNT_COUNT * 4 * 2 + .long INTRCNT_COUNT * 4 * 2 .text .globl btext From ded85b30377d2aaaa4bd83a91a5b892615a389da Mon Sep 17 00:00:00 2001 From: Craig Rodrigues Date: Mon, 25 Jul 2011 21:52:17 +0000 Subject: [PATCH 051/452] Document the tftp.blksize variable added in src/lib/libstand/tftp.c. Approved by: re (kib) Requested by: maxim --- sys/boot/forth/loader.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sys/boot/forth/loader.conf b/sys/boot/forth/loader.conf index 759d62cf3fd..46a1bbefbe8 100644 --- a/sys/boot/forth/loader.conf +++ b/sys/boot/forth/loader.conf @@ -55,6 +55,11 @@ module_path="/boot/modules" # Set the module search path #prompt="\\${interpret}" # Set the command prompt #root_disk_unit="0" # Force the root disk unit number #rootdev="disk1s1a" # Set the root filesystem +#tftp.blksize="1428" # Set the RFC 2348 TFTP block size. + # If the TFTP server does not support RFC 2348, + # the block size is set to 512. If the value + # is out of range ( < 8 || > 9008 ) an error is + # returned. ############################################################## From d8048725e07d68a8c178a3d0624a9acc1bc853b9 Mon Sep 17 00:00:00 2001 From: Ken Smith Date: Tue, 26 Jul 2011 04:00:00 +0000 Subject: [PATCH 052/452] Looks like we're ready for 9.0-BETA1 builds. Approved by: re (implicit) --- sys/conf/newvers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/conf/newvers.sh b/sys/conf/newvers.sh index 9681c7904d4..6c08cd66589 100644 --- a/sys/conf/newvers.sh +++ b/sys/conf/newvers.sh @@ -32,7 +32,7 @@ TYPE="FreeBSD" REVISION="9.0" -BRANCH="CURRENT" +BRANCH="BETA1" if [ "X${BRANCH_OVERRIDE}" != "X" ]; then BRANCH=${BRANCH_OVERRIDE} fi From b5cb9d4fa6e0366527a68e0c27793bb2096bdbda Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Thu, 28 Jul 2011 03:01:22 +0000 Subject: [PATCH 053/452] To inet or not two inet. Unbreak static IPv4 configuration. If you tried you were stuck in an endless loop. Reported by: kensmith Approved by: re (kib) for BETA1 Pointy hat to: bz - wonder why I had not tested legacy IP thoroughly.. --- usr.sbin/bsdinstall/scripts/netconfig_ipv4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.sbin/bsdinstall/scripts/netconfig_ipv4 b/usr.sbin/bsdinstall/scripts/netconfig_ipv4 index 72dc0ee8ad9..6b479ad043f 100755 --- a/usr.sbin/bsdinstall/scripts/netconfig_ipv4 +++ b/usr.sbin/bsdinstall/scripts/netconfig_ipv4 @@ -78,7 +78,7 @@ echo $INTERFACE $IF_CONFIG | if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then . $BSDINSTALL_TMPETC/._rc.conf.net - ifconfig $INTERFACE inet `eval echo \\\$ifconfig_$INTERFACE` + ifconfig $INTERFACE `eval echo \\\$ifconfig_$INTERFACE` route delete -inet default route add -inet default $defaultrouter fi From f49a230f9c1cbc9d8a54a1edf86515fb4300fb04 Mon Sep 17 00:00:00 2001 From: Benedict Reuschling Date: Thu, 28 Jul 2011 11:41:55 +0000 Subject: [PATCH 054/452] Add a section to the jail chapter that explains why it is not recommended to allow root users in the jail to access the host system. PR: docs/156853 Submitted by: crees Patch by: crees Approved by: re (kib) for BETA1 --- usr.sbin/jail/jail.8 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/usr.sbin/jail/jail.8 b/usr.sbin/jail/jail.8 index 8ed913a1eb0..41d0e46c257 100644 --- a/usr.sbin/jail/jail.8 +++ b/usr.sbin/jail/jail.8 @@ -34,7 +34,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 23, 2011 +.Dd July 28, 2011 .Dt JAIL 8 .Os .Sh NAME @@ -914,3 +914,8 @@ directory that is moved out of the jail's chroot, then the process may gain access to the file space outside of the jail. It is recommended that directories always be copied, rather than moved, out of a jail. +.Pp +It is also not recommended that users allowed root in the jail be allowed +access to the host system. +For example, a root user in a jail can create a setuid root utility that +could be run in the host system to achieve elevated privileges. From 76e54f993cd5d90117234cebfffb466e410753d4 Mon Sep 17 00:00:00 2001 From: Benedict Reuschling Date: Thu, 28 Jul 2011 12:23:32 +0000 Subject: [PATCH 055/452] Revert my last change to this file, as BETA1 is not announced yet. Pointed out by: kib Pointy hat to: me Approved by: re (kib, implicit) --- usr.sbin/jail/jail.8 | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/usr.sbin/jail/jail.8 b/usr.sbin/jail/jail.8 index 41d0e46c257..8ed913a1eb0 100644 --- a/usr.sbin/jail/jail.8 +++ b/usr.sbin/jail/jail.8 @@ -34,7 +34,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 28, 2011 +.Dd July 23, 2011 .Dt JAIL 8 .Os .Sh NAME @@ -914,8 +914,3 @@ directory that is moved out of the jail's chroot, then the process may gain access to the file space outside of the jail. It is recommended that directories always be copied, rather than moved, out of a jail. -.Pp -It is also not recommended that users allowed root in the jail be allowed -access to the host system. -For example, a root user in a jail can create a setuid root utility that -could be run in the host system to achieve elevated privileges. From 87e255ac52df209599578d5af2fb6843afa62a1e Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Fri, 29 Jul 2011 18:35:10 +0000 Subject: [PATCH 056/452] - Staticize functions as appropriate and comment out unused ones. - Sprinkle some const where appropriate. - Consistently use target_id_t for the target parameter of mpt_map_physdisk() and mpt_is_raid_volume(). - Fix some whitespace bugs. Approved by: re (kib) --- sys/dev/mpt/mpt.c | 66 ++++++++++++++++++++++++++++------------- sys/dev/mpt/mpt.h | 16 +++------- sys/dev/mpt/mpt_cam.c | 24 +++++++-------- sys/dev/mpt/mpt_debug.c | 43 ++++++++++++++++++++------- sys/dev/mpt/mpt_pci.c | 10 ++++++- sys/dev/mpt/mpt_raid.c | 53 +++++++++++++++++++++++---------- sys/dev/mpt/mpt_raid.h | 20 ++----------- sys/dev/mpt/mpt_user.c | 16 +++++----- 8 files changed, 152 insertions(+), 96 deletions(-) diff --git a/sys/dev/mpt/mpt.c b/sys/dev/mpt/mpt.c index fb24025ecff..9dfd73b2b3b 100644 --- a/sys/dev/mpt/mpt.c +++ b/sys/dev/mpt/mpt.c @@ -301,66 +301,75 @@ mpt_modevent(module_t mod, int type, void *data) return (error); } -int +static int mpt_stdload(struct mpt_personality *pers) { + /* Load is always successful. */ return (0); } -int +static int mpt_stdprobe(struct mpt_softc *mpt) { + /* Probe is always successful. */ return (0); } -int +static int mpt_stdattach(struct mpt_softc *mpt) { + /* Attach is always successful. */ return (0); } -int +static int mpt_stdenable(struct mpt_softc *mpt) { + /* Enable is always successful. */ return (0); } -void +static void mpt_stdready(struct mpt_softc *mpt) { + } - -int +static int mpt_stdevent(struct mpt_softc *mpt, request_t *req, MSG_EVENT_NOTIFY_REPLY *msg) { + mpt_lprt(mpt, MPT_PRT_DEBUG, "mpt_stdevent: 0x%x\n", msg->Event & 0xFF); /* Event was not for us. */ return (0); } -void +static void mpt_stdreset(struct mpt_softc *mpt, int type) { + } -void +static void mpt_stdshutdown(struct mpt_softc *mpt) { + } -void +static void mpt_stddetach(struct mpt_softc *mpt) { + } -int +static int mpt_stdunload(struct mpt_personality *pers) { + /* Unload is always successful. */ return (0); } @@ -383,7 +392,6 @@ mpt_postattach(void *unused) } SYSINIT(mptdev, SI_SUB_CONFIGURE, SI_ORDER_MIDDLE, mpt_postattach, NULL); - /******************************* Bus DMA Support ******************************/ void mpt_map_rquest(void *arg, bus_dma_segment_t *segs, int nseg, int error) @@ -478,6 +486,7 @@ static int mpt_default_reply_handler(struct mpt_softc *mpt, request_t *req, uint32_t reply_desc, MSG_DEFAULT_REPLY *reply_frame) { + mpt_prt(mpt, "Default Handler Called: req=%p:%u reply_descriptor=%x frame=%p\n", req, req->serno, reply_desc, reply_frame); @@ -494,8 +503,8 @@ static int mpt_config_reply_handler(struct mpt_softc *mpt, request_t *req, uint32_t reply_desc, MSG_DEFAULT_REPLY *reply_frame) { - if (req != NULL) { + if (req != NULL) { if (reply_frame != NULL) { MSG_CONFIG *cfgp; MSG_CONFIG_REPLY *reply; @@ -528,6 +537,7 @@ static int mpt_handshake_reply_handler(struct mpt_softc *mpt, request_t *req, uint32_t reply_desc, MSG_DEFAULT_REPLY *reply_frame) { + /* Nothing to be done. */ return (TRUE); } @@ -650,6 +660,7 @@ static int mpt_core_event(struct mpt_softc *mpt, request_t *req, MSG_EVENT_NOTIFY_REPLY *msg) { + mpt_lprt(mpt, MPT_PRT_DEBUG, "mpt_core_event: 0x%x\n", msg->Event & 0xFF); switch(msg->Event & 0xFF) { @@ -870,6 +881,7 @@ mpt_complete_request_chain(struct mpt_softc *mpt, struct req_queue *chain, void mpt_dump_reply_frame(struct mpt_softc *mpt, MSG_DEFAULT_REPLY *reply_frame) { + mpt_prt(mpt, "Address Reply:\n"); mpt_print_reply(reply_frame); } @@ -881,12 +893,14 @@ static __inline uint32_t mpt_rd_intr(struct mpt_softc *mpt); static __inline uint32_t mpt_rd_db(struct mpt_softc *mpt) { + return mpt_read(mpt, MPT_OFFSET_DOORBELL); } static __inline uint32_t mpt_rd_intr(struct mpt_softc *mpt) { + return mpt_read(mpt, MPT_OFFSET_INTR_STATUS); } @@ -895,6 +909,7 @@ static int mpt_wait_db_ack(struct mpt_softc *mpt) { int i; + for (i=0; i < MPT_MAX_WAIT; i++) { if (!MPT_DB_IS_BUSY(mpt_rd_intr(mpt))) { maxwait_ack = i > maxwait_ack ? i : maxwait_ack; @@ -910,6 +925,7 @@ static int mpt_wait_db_int(struct mpt_softc *mpt) { int i; + for (i = 0; i < MPT_MAX_WAIT; i++) { if (MPT_DB_INTR(mpt_rd_intr(mpt))) { maxwait_int = i > maxwait_int ? i : maxwait_int; @@ -925,6 +941,7 @@ void mpt_check_doorbell(struct mpt_softc *mpt) { uint32_t db = mpt_rd_db(mpt); + if (MPT_STATE(db) != MPT_DB_STATE_RUNNING) { mpt_prt(mpt, "Device not running\n"); mpt_print_db(db); @@ -956,6 +973,7 @@ static int mpt_download_fw(struct mpt_softc *mpt); static int mpt_soft_reset(struct mpt_softc *mpt) { + mpt_lprt(mpt, MPT_PRT_DEBUG, "soft reset\n"); /* Have to use hard reset if we are not in Running state */ @@ -1019,6 +1037,7 @@ mpt_enable_diag_mode(struct mpt_softc *mpt) static void mpt_disable_diag_mode(struct mpt_softc *mpt) { + mpt_write(mpt, MPT_OFFSET_SEQUENCE, 0xFFFFFFFF); } @@ -1094,6 +1113,7 @@ mpt_hard_reset(struct mpt_softc *mpt) static void mpt_core_ioc_reset(struct mpt_softc *mpt, int type) { + /* * Complete all pending requests with a status * appropriate for an IOC reset. @@ -1102,7 +1122,6 @@ mpt_core_ioc_reset(struct mpt_softc *mpt, int type) MPI_IOCSTATUS_INVALID_STATE); } - /* * Reset the IOC when needed. Try software command first then if needed * poke at the magic diagnostic reset. Note that a hard reset resets @@ -1263,6 +1282,7 @@ retry: void mpt_send_cmd(struct mpt_softc *mpt, request_t *req) { + if (mpt->verbose > MPT_PRT_DEBUG2) { mpt_dump_request(mpt, req); } @@ -2110,6 +2130,7 @@ mpt_send_event_request(struct mpt_softc *mpt, int onoff) void mpt_enable_ints(struct mpt_softc *mpt) { + /* Unmask every thing except door bell int */ mpt_write(mpt, MPT_OFFSET_INTR_MASK, MPT_INTR_DB_MASK); } @@ -2120,6 +2141,7 @@ mpt_enable_ints(struct mpt_softc *mpt) void mpt_disable_ints(struct mpt_softc *mpt) { + /* Mask all interrupts */ mpt_write(mpt, MPT_OFFSET_INTR_MASK, MPT_INTR_REPLY_MASK | MPT_INTR_DB_MASK); @@ -2219,7 +2241,7 @@ mpt_detach(struct mpt_softc *mpt) return (0); } -int +static int mpt_core_load(struct mpt_personality *pers) { int i; @@ -2245,7 +2267,7 @@ mpt_core_load(struct mpt_personality *pers) * Initialize per-instance driver data and perform * initial controller configuration. */ -int +static int mpt_core_attach(struct mpt_softc *mpt) { int val, error; @@ -2276,9 +2298,10 @@ mpt_core_attach(struct mpt_softc *mpt) return (error); } -int +static int mpt_core_enable(struct mpt_softc *mpt) { + /* * We enter with the IOC enabled, but async events * not enabled, ports not enabled and interrupts @@ -2326,13 +2349,14 @@ mpt_core_enable(struct mpt_softc *mpt) return (0); } -void +static void mpt_core_shutdown(struct mpt_softc *mpt) { + mpt_disable_ints(mpt); } -void +static void mpt_core_detach(struct mpt_softc *mpt) { int val; @@ -2351,9 +2375,10 @@ mpt_core_detach(struct mpt_softc *mpt) mpt_dma_buf_free(mpt); } -int +static int mpt_core_unload(struct mpt_personality *pers) { + /* Unload is always successful. */ return (0); } @@ -2575,6 +2600,7 @@ static void mpt_dma_buf_free(struct mpt_softc *mpt) { int i; + if (mpt->request_dmat == 0) { mpt_lprt(mpt, MPT_PRT_DEBUG, "already released dma memory\n"); return; diff --git a/sys/dev/mpt/mpt.h b/sys/dev/mpt/mpt.h index d12c307c803..8a20e82b92d 100644 --- a/sys/dev/mpt/mpt.h +++ b/sys/dev/mpt/mpt.h @@ -1075,16 +1075,6 @@ mpt_complete_request_chain(struct mpt_softc *, struct req_queue *, u_int); int mpt_reset(struct mpt_softc *, int /*reinit*/); /****************************** Debugging ************************************/ -typedef struct mpt_decode_entry { - char *name; - u_int value; - u_int mask; -} mpt_decode_entry_t; - -int mpt_decode_value(mpt_decode_entry_t *table, u_int num_entries, - const char *name, u_int value, u_int *cur_column, - u_int wrap_point); - void mpt_dump_data(struct mpt_softc *, const char *, void *, int); void mpt_dump_request(struct mpt_softc *, request_t *); @@ -1110,17 +1100,21 @@ do { \ mpt_prt(mpt, __VA_ARGS__); \ } while (0) +#if 0 #define mpt_lprtc(mpt, level, ...) \ do { \ if (level <= (mpt)->verbose) \ mpt_prtc(mpt, __VA_ARGS__); \ } while (0) +#endif #else void mpt_lprt(struct mpt_softc *, int, const char *, ...) __printflike(3, 4); +#if 0 void mpt_lprtc(struct mpt_softc *, int, const char *, ...) __printflike(3, 4); #endif +#endif void mpt_prt(struct mpt_softc *, const char *, ...) __printflike(2, 3); void mpt_prtc(struct mpt_softc *, const char *, ...) @@ -1277,7 +1271,6 @@ void mpt_check_doorbell(struct mpt_softc *mpt); void mpt_dump_reply_frame(struct mpt_softc *mpt, MSG_DEFAULT_REPLY *reply_frame); -void mpt_set_config_regs(struct mpt_softc *); int mpt_issue_cfg_req(struct mpt_softc */*mpt*/, request_t */*req*/, cfgparms_t *params, bus_addr_t /*addr*/, bus_size_t/*len*/, @@ -1331,6 +1324,5 @@ char *mpt_ioc_diag(uint32_t diag); void mpt_req_state(mpt_req_state_t state); void mpt_print_config_request(void *vmsg); void mpt_print_request(void *vmsg); -void mpt_print_scsi_io_request(MSG_SCSI_IO_REQUEST *msg); void mpt_dump_sgl(SGE_IO_UNION *se, int offset); #endif /* _MPT_H_ */ diff --git a/sys/dev/mpt/mpt_cam.c b/sys/dev/mpt/mpt_cam.c index 1b997d155a2..f54ed7f24c3 100644 --- a/sys/dev/mpt/mpt_cam.c +++ b/sys/dev/mpt/mpt_cam.c @@ -193,7 +193,7 @@ MODULE_DEPEND(mpt_cam, cam, 1, 1, 1); int mpt_enable_sata_wc = -1; TUNABLE_INT("hw.mpt.enable_sata_wc", &mpt_enable_sata_wc); -int +static int mpt_cam_probe(struct mpt_softc *mpt) { int role; @@ -215,7 +215,7 @@ mpt_cam_probe(struct mpt_softc *mpt) return (ENODEV); } -int +static int mpt_cam_attach(struct mpt_softc *mpt) { struct cam_devq *devq; @@ -509,7 +509,6 @@ mpt_read_config_info_fc(struct mpt_softc *mpt) static int mpt_set_initial_config_fc(struct mpt_softc *mpt) { - CONFIG_PAGE_FC_PORT_1 fc; U32 fl; int r, doit = 0; @@ -881,8 +880,8 @@ static int mpt_sata_pass_reply_handler(struct mpt_softc *mpt, request_t *req, uint32_t reply_desc, MSG_DEFAULT_REPLY *reply_frame) { - if (req != NULL) { + if (req != NULL) { if (reply_frame != NULL) { req->IOCStatus = le16toh(reply_frame->IOCStatus); } @@ -1114,7 +1113,7 @@ mpt_set_initial_config_spi(struct mpt_softc *mpt) return (0); } -int +static int mpt_cam_enable(struct mpt_softc *mpt) { int error; @@ -1151,9 +1150,10 @@ out: return (error); } -void +static void mpt_cam_ready(struct mpt_softc *mpt) { + /* * If we're in target mode, hang out resources now * so we don't cause the world to hang talking to us. @@ -1171,7 +1171,7 @@ mpt_cam_ready(struct mpt_softc *mpt) mpt->ready = 1; } -void +static void mpt_cam_detach(struct mpt_softc *mpt) { mpt_handler_t handler; @@ -1842,8 +1842,6 @@ bad: memset(se, 0,sizeof (*se)); se->Address = htole32(dm_segs->ds_addr); - - MPI_pSGE_SET_LENGTH(se, dm_segs->ds_len); tf = flags; if (seg == first_lim - 1) { @@ -1958,9 +1956,6 @@ bad: memset(se, 0, sizeof (*se)); se->Address = htole32(dm_segs->ds_addr); - - - MPI_pSGE_SET_LENGTH(se, dm_segs->ds_len); tf = flags; if (seg == this_seg_lim - 1) { @@ -3045,6 +3040,7 @@ mpt_fc_els_reply_handler(struct mpt_softc *mpt, request_t *req, static void mpt_cam_ioc_reset(struct mpt_softc *mpt, int type) { + /* * The pending list is already run down by * the generic handler. Perform the same @@ -3974,6 +3970,7 @@ mpt_spawn_recovery_thread(struct mpt_softc *mpt) static void mpt_terminate_recovery_thread(struct mpt_softc *mpt) { + if (mpt->recovery_thread == NULL) { return; } @@ -4377,6 +4374,7 @@ mpt_add_target_commands(struct mpt_softc *mpt) static int mpt_enable_lun(struct mpt_softc *mpt, target_id_t tgt, lun_id_t lun) { + if (tgt == CAM_TARGET_WILDCARD && lun == CAM_LUN_WILDCARD) { mpt->twildcard = 1; } else if (lun >= MPT_MAX_LUNS) { @@ -4402,6 +4400,7 @@ static int mpt_disable_lun(struct mpt_softc *mpt, target_id_t tgt, lun_id_t lun) { int i; + if (tgt == CAM_TARGET_WILDCARD && lun == CAM_LUN_WILDCARD) { mpt->twildcard = 0; } else if (lun >= MPT_MAX_LUNS) { @@ -5286,6 +5285,7 @@ mpt_tgt_dump_tgt_state(struct mpt_softc *mpt, request_t *req) static void mpt_tgt_dump_req_state(struct mpt_softc *mpt, request_t *req) { + mpt_prt(mpt, "req %p:%u index %u (%x) state %x\n", req, req->serno, req->index, req->index, req->state); mpt_tgt_dump_tgt_state(mpt, req); diff --git a/sys/dev/mpt/mpt_debug.c b/sys/dev/mpt/mpt_debug.c index e7f75faa5b4..dd70dc9d816 100644 --- a/sys/dev/mpt/mpt_debug.c +++ b/sys/dev/mpt/mpt_debug.c @@ -285,6 +285,7 @@ mpt_scsi_state(int code) } return buf; } + static char * mpt_scsi_status(int code) { @@ -298,10 +299,11 @@ mpt_scsi_status(int code) snprintf(buf, sizeof buf, "Unknown (0x%08x)", code); return buf; } -static char * + +static const char * mpt_who(int who_init) { - char *who; + const char *who; switch (who_init) { case MPT_DB_INIT_NOONE: who = "No One"; break; @@ -315,10 +317,10 @@ mpt_who(int who_init) return who; } -static char * +static const char * mpt_state(u_int32_t mb) { - char *text; + const char *text; switch (MPT_STATE(mb)) { case MPT_DB_STATE_RESET: text = "Reset"; break; @@ -347,6 +349,7 @@ mpt_scsi_tm_type(int code) void mpt_print_db(u_int32_t mb) { + printf("mpt mailbox: (0x%x) State %s WhoInit %s\n", mb, mpt_state(mb), mpt_who(MPT_WHO(mb))); } @@ -357,6 +360,7 @@ mpt_print_db(u_int32_t mb) static void mpt_print_reply_hdr(MSG_DEFAULT_REPLY *msg) { + printf("%s Reply @ %p\n", mpt_ioc_function(msg->Function), msg); printf("\tIOC Status %s\n", mpt_ioc_status(msg->IOCStatus)); printf("\tIOCLogInfo 0x%08x\n", msg->IOCLogInfo); @@ -368,6 +372,7 @@ mpt_print_reply_hdr(MSG_DEFAULT_REPLY *msg) static void mpt_print_init_reply(MSG_IOC_INIT_REPLY *msg) { + mpt_print_reply_hdr((MSG_DEFAULT_REPLY *)msg); printf("\tWhoInit %s\n", mpt_who(msg->WhoInit)); printf("\tMaxDevices 0x%02x\n", msg->MaxDevices); @@ -377,6 +382,7 @@ mpt_print_init_reply(MSG_IOC_INIT_REPLY *msg) static void mpt_print_ioc_facts(MSG_IOC_FACTS_REPLY *msg) { + mpt_print_reply_hdr((MSG_DEFAULT_REPLY *)msg); printf("\tIOCNumber %d\n", msg->IOCNumber); printf("\tMaxChainDepth %d\n", msg->MaxChainDepth); @@ -402,6 +408,7 @@ mpt_print_ioc_facts(MSG_IOC_FACTS_REPLY *msg) static void mpt_print_enable_reply(MSG_PORT_ENABLE_REPLY *msg) { + mpt_print_reply_hdr((MSG_DEFAULT_REPLY *)msg); printf("\tPort: %d\n", msg->PortNumber); } @@ -409,6 +416,7 @@ mpt_print_enable_reply(MSG_PORT_ENABLE_REPLY *msg) static void mpt_print_scsi_io_reply(MSG_SCSI_IO_REPLY *msg) { + mpt_print_reply_hdr((MSG_DEFAULT_REPLY *)msg); printf("\tBus: %d\n", msg->Bus); printf("\tTargetID %d\n", msg->TargetID); @@ -420,11 +428,10 @@ mpt_print_scsi_io_reply(MSG_SCSI_IO_REPLY *msg) printf("\tResponseInfo 0x%08x\n", msg->ResponseInfo); } - - static void mpt_print_event_notice(MSG_EVENT_NOTIFY_REPLY *msg) { + mpt_print_reply_hdr((MSG_DEFAULT_REPLY *)msg); printf("\tEvent: %s\n", mpt_ioc_event(msg->Event)); printf("\tEventContext 0x%04x\n", msg->EventContext); @@ -517,7 +524,7 @@ mpt_print_request_hdr(MSG_REQUEST_HEADER *req) printf("\tMsgContext 0x%08x\n", req->MsgContext); } -void +static void mpt_print_scsi_io_request(MSG_SCSI_IO_REQUEST *orig_msg) { MSG_SCSI_IO_REQUEST local, *msg = &local; @@ -575,6 +582,7 @@ mpt_print_scsi_io_request(MSG_SCSI_IO_REQUEST *orig_msg) static void mpt_print_scsi_tmf_request(MSG_SCSI_TASK_MGMT *msg) { + mpt_print_request_hdr((MSG_REQUEST_HEADER *)msg); printf("\tLun 0x%02x\n", msg->LUN[1]); printf("\tTaskType %s\n", mpt_scsi_tm_type(msg->TaskType)); @@ -585,6 +593,7 @@ mpt_print_scsi_tmf_request(MSG_SCSI_TASK_MGMT *msg) static void mpt_print_scsi_target_assist_request(PTR_MSG_TARGET_ASSIST_REQUEST msg) { + mpt_print_request_hdr((MSG_REQUEST_HEADER *)msg); printf("\tStatusCode 0x%02x\n", msg->StatusCode); printf("\tTargetAssist 0x%02x\n", msg->TargetAssistFlags); @@ -600,6 +609,7 @@ static void mpt_print_scsi_target_status_send_request(MSG_TARGET_STATUS_SEND_REQUEST *msg) { SGE_IO_UNION x; + mpt_print_request_hdr((MSG_REQUEST_HEADER *)msg); printf("\tStatusCode 0x%02x\n", msg->StatusCode); printf("\tStatusFlags 0x%02x\n", msg->StatusFlags); @@ -637,7 +647,14 @@ mpt_print_request(void *vreq) } } -int +#if 0 +typedef struct mpt_decode_entry { + char *name; + u_int value; + u_int mask; +} mpt_decode_entry_t; + +static int mpt_decode_value(mpt_decode_entry_t *table, u_int num_entries, const char *name, u_int value, u_int *cur_column, u_int wrap_point) @@ -689,7 +706,7 @@ mpt_decode_value(mpt_decode_entry_t *table, u_int num_entries, return (printed); } -static mpt_decode_entry_t req_state_parse_table[] = { +static const mpt_decode_entry_t req_state_parse_table[] = { { "REQ_FREE", 0x00, 0xff }, { "REQ_ALLOCATED", 0x01, 0x01 }, { "REQ_QUEUED", 0x02, 0x02 }, @@ -698,13 +715,15 @@ static mpt_decode_entry_t req_state_parse_table[] = { { "REQ_NEED_WAKEUP", 0x10, 0x10 } }; -void +static void mpt_req_state(mpt_req_state_t state) { + mpt_decode_value(req_state_parse_table, NUM_ELEMENTS(req_state_parse_table), "REQ_STATE", state, NULL, 80); } +#endif #define LAST_SGE ( \ MPI_SGE_FLAGS_END_OF_LIST | \ @@ -805,6 +824,7 @@ mpt_dump_data(struct mpt_softc *mpt, const char *msg, void *addr, int len) { int offset; uint8_t *cp = addr; + mpt_prt(mpt, "%s:", msg); for (offset = 0; offset < len; offset++) { if ((offset & 0xf) == 0) { @@ -820,6 +840,7 @@ mpt_dump_request(struct mpt_softc *mpt, request_t *req) { uint32_t *pReq = req->req_vbuf; int o; + #if __FreeBSD_version >= 500000 mpt_prt(mpt, "Send Request %d (%jx):", req->index, (uintmax_t) req->req_pbuf); @@ -850,6 +871,7 @@ mpt_lprt(struct mpt_softc *mpt, int level, const char *fmt, ...) } } +#if 0 void mpt_lprtc(struct mpt_softc *mpt, int level, const char *fmt, ...) { @@ -861,6 +883,7 @@ mpt_lprtc(struct mpt_softc *mpt, int level, const char *fmt, ...) } } #endif +#endif void mpt_prt(struct mpt_softc *mpt, const char *fmt, ...) diff --git a/sys/dev/mpt/mpt_pci.c b/sys/dev/mpt/mpt_pci.c index f7201b613e6..7e3211b4722 100644 --- a/sys/dev/mpt/mpt_pci.c +++ b/sys/dev/mpt/mpt_pci.c @@ -201,6 +201,9 @@ static int mpt_pci_shutdown(device_t); static int mpt_dma_mem_alloc(struct mpt_softc *mpt); static void mpt_dma_mem_free(struct mpt_softc *mpt); static void mpt_read_config_regs(struct mpt_softc *mpt); +#if 0 +static void mpt_set_config_regs(struct mpt_softc *mpt); +#endif static void mpt_pci_intr(void *); static device_method_t mpt_methods[] = { @@ -404,6 +407,7 @@ mpt_link_peer(struct mpt_softc *mpt) static void mpt_unlink_peer(struct mpt_softc *mpt) { + if (mpt->mpt2) { mpt->mpt2->mpt2 = NULL; } @@ -654,6 +658,7 @@ bad: static void mpt_free_bus_resources(struct mpt_softc *mpt) { + if (mpt->ih) { bus_teardown_intr(mpt->dev, mpt->pci_irq, mpt->ih); mpt->ih = NULL; @@ -827,6 +832,7 @@ mpt_dma_mem_free(struct mpt_softc *mpt) static void mpt_read_config_regs(struct mpt_softc *mpt) { + mpt->pci_cfg.Command = pci_read_config(mpt->dev, PCIR_COMMAND, 2); mpt->pci_cfg.LatencyTimer_LineSize = pci_read_config(mpt->dev, PCIR_CACHELNSZ, 2); @@ -840,8 +846,9 @@ mpt_read_config_regs(struct mpt_softc *mpt) mpt->pci_cfg.PMCSR = pci_read_config(mpt->dev, 0x44, 4); } +#if 0 /* Sets modifiable config registers */ -void +static void mpt_set_config_regs(struct mpt_softc *mpt) { uint32_t val; @@ -880,6 +887,7 @@ mpt_set_config_regs(struct mpt_softc *mpt) pci_write_config(mpt->dev, PCIR_INTLINE, mpt->pci_cfg.IntLine, 1); pci_write_config(mpt->dev, 0x44, mpt->pci_cfg.PMCSR, 4); } +#endif static void mpt_pci_intr(void *arg) diff --git a/sys/dev/mpt/mpt_raid.c b/sys/dev/mpt/mpt_raid.c index 11650ed7f7c..07eadfb34d3 100644 --- a/sys/dev/mpt/mpt_raid.c +++ b/sys/dev/mpt/mpt_raid.c @@ -81,7 +81,6 @@ struct mpt_raid_action_result #define REQ_IOCSTATUS(req) ((req)->IOCStatus & MPI_IOCSTATUS_MASK) - static mpt_probe_handler_t mpt_raid_probe; static mpt_attach_handler_t mpt_raid_attach; static mpt_enable_handler_t mpt_raid_enable; @@ -125,9 +124,25 @@ static void mpt_adjust_queue_depth(struct mpt_softc *, struct mpt_raid_volume *, static void mpt_raid_sysctl_attach(struct mpt_softc *); #endif +static const char *mpt_vol_type(struct mpt_raid_volume *vol); +static const char *mpt_vol_state(struct mpt_raid_volume *vol); +static const char *mpt_disk_state(struct mpt_raid_disk *disk); +static void mpt_vol_prt(struct mpt_softc *mpt, struct mpt_raid_volume *vol, + const char *fmt, ...); +static void mpt_disk_prt(struct mpt_softc *mpt, struct mpt_raid_disk *disk, + const char *fmt, ...); + +static int mpt_issue_raid_req(struct mpt_softc *mpt, + struct mpt_raid_volume *vol, struct mpt_raid_disk *disk, request_t *req, + u_int Action, uint32_t ActionDataWord, bus_addr_t addr, bus_size_t len, + int write, int wait); + +static int mpt_refresh_raid_data(struct mpt_softc *mpt); +static void mpt_schedule_raid_refresh(struct mpt_softc *mpt); + static uint32_t raid_handler_id = MPT_HANDLER_ID_NONE; -const char * +static const char * mpt_vol_type(struct mpt_raid_volume *vol) { switch (vol->config_page->VolumeType) { @@ -142,7 +157,7 @@ mpt_vol_type(struct mpt_raid_volume *vol) } } -const char * +static const char * mpt_vol_state(struct mpt_raid_volume *vol) { switch (vol->config_page->VolumeStatus.State) { @@ -157,7 +172,7 @@ mpt_vol_state(struct mpt_raid_volume *vol) } } -const char * +static const char * mpt_disk_state(struct mpt_raid_disk *disk) { switch (disk->config_page.PhysDiskStatus.State) { @@ -182,7 +197,7 @@ mpt_disk_state(struct mpt_raid_disk *disk) } } -void +static void mpt_vol_prt(struct mpt_softc *mpt, struct mpt_raid_volume *vol, const char *fmt, ...) { @@ -196,7 +211,7 @@ mpt_vol_prt(struct mpt_softc *mpt, struct mpt_raid_volume *vol, va_end(ap); } -void +static void mpt_disk_prt(struct mpt_softc *mpt, struct mpt_raid_disk *disk, const char *fmt, ...) { @@ -254,16 +269,17 @@ mpt_raid_async(void *callback_arg, u_int32_t code, } } -int +static int mpt_raid_probe(struct mpt_softc *mpt) { + if (mpt->ioc_page2 == NULL || mpt->ioc_page2->MaxPhysDisks == 0) { return (ENODEV); } return (0); } -int +static int mpt_raid_attach(struct mpt_softc *mpt) { struct ccb_setasync csa; @@ -307,13 +323,14 @@ cleanup: return (error); } -int +static int mpt_raid_enable(struct mpt_softc *mpt) { + return (0); } -void +static void mpt_raid_detach(struct mpt_softc *mpt) { struct ccb_setasync csa; @@ -338,6 +355,7 @@ mpt_raid_detach(struct mpt_softc *mpt) static void mpt_raid_ioc_reset(struct mpt_softc *mpt, int type) { + /* Nothing to do yet. */ } @@ -570,7 +588,7 @@ mpt_raid_reply_frame_handler(struct mpt_softc *mpt, request_t *req, /* * Utiltity routine to perform a RAID action command; */ -int +static int mpt_issue_raid_req(struct mpt_softc *mpt, struct mpt_raid_volume *vol, struct mpt_raid_disk *disk, request_t *req, u_int Action, uint32_t ActionDataWord, bus_addr_t addr, bus_size_t len, @@ -719,6 +737,7 @@ mpt_raid_thread(void *arg) static void mpt_raid_quiesce_timeout(void *arg) { + /* Complete the CCB with error */ /* COWWWW */ } @@ -776,7 +795,7 @@ mpt_raid_quiesce_disk(struct mpt_softc *mpt, struct mpt_raid_disk *mpt_disk, /* XXX Ignores that there may be multiple busses/IOCs involved. */ cam_status -mpt_map_physdisk(struct mpt_softc *mpt, union ccb *ccb, u_int *tgt) +mpt_map_physdisk(struct mpt_softc *mpt, union ccb *ccb, target_id_t *tgt) { struct mpt_raid_disk *mpt_disk; @@ -793,7 +812,7 @@ mpt_map_physdisk(struct mpt_softc *mpt, union ccb *ccb, u_int *tgt) /* XXX Ignores that there may be multiple busses/IOCs involved. */ int -mpt_is_raid_volume(struct mpt_softc *mpt, int tgt) +mpt_is_raid_volume(struct mpt_softc *mpt, target_id_t tgt) { CONFIG_PAGE_IOC_2_RAID_VOL *ioc_vol; CONFIG_PAGE_IOC_2_RAID_VOL *ioc_last_vol; @@ -1305,7 +1324,7 @@ mpt_refresh_raid_vol(struct mpt_softc *mpt, struct mpt_raid_volume *mpt_vol, * be updated by our event handler. Interesting changes are displayed * to the console. */ -int +static int mpt_refresh_raid_data(struct mpt_softc *mpt) { CONFIG_PAGE_IOC_2_RAID_VOL *ioc_vol; @@ -1565,9 +1584,10 @@ mpt_raid_timer(void *arg) #endif } -void +static void mpt_schedule_raid_refresh(struct mpt_softc *mpt) { + callout_reset(&mpt->raid_timer, MPT_RAID_SYNC_REPORT_INTERVAL, mpt_raid_timer, mpt); } @@ -1719,7 +1739,8 @@ mpt_raid_set_vol_mwce(struct mpt_softc *mpt, mpt_raid_mwce_t mwce) MPT_UNLOCK(mpt); return (0); } -const char *mpt_vol_mwce_strs[] = + +static const char *mpt_vol_mwce_strs[] = { "On", "Off", diff --git a/sys/dev/mpt/mpt_raid.h b/sys/dev/mpt/mpt_raid.h index bc5aa7dd9fe..05d2be119ac 100644 --- a/sys/dev/mpt/mpt_raid.h +++ b/sys/dev/mpt/mpt_raid.h @@ -53,29 +53,13 @@ typedef enum { MPT_RAID_MWCE_NC } mpt_raid_mwce_t; -const char *mpt_vol_type(struct mpt_raid_volume *); -const char *mpt_vol_state(struct mpt_raid_volume *); -const char *mpt_disk_state(struct mpt_raid_disk *); -void -mpt_vol_prt(struct mpt_softc *, struct mpt_raid_volume *, const char *fmt, ...); -void -mpt_disk_prt(struct mpt_softc *, struct mpt_raid_disk *, const char *, ...); - -int -mpt_issue_raid_req(struct mpt_softc *, struct mpt_raid_volume *, - struct mpt_raid_disk *, request_t *, u_int, uint32_t, bus_addr_t, - bus_size_t, int, int); - -cam_status -mpt_map_physdisk(struct mpt_softc *, union ccb *, target_id_t *); -int mpt_is_raid_volume(struct mpt_softc *, int); +cam_status mpt_map_physdisk(struct mpt_softc *, union ccb *, target_id_t *); +int mpt_is_raid_volume(struct mpt_softc *, target_id_t); #if 0 cam_status mpt_raid_quiesce_disk(struct mpt_softc *, struct mpt_raid_disk *, request_t *); #endif -int mpt_refresh_raid_data(struct mpt_softc *); -void mpt_schedule_raid_refresh(struct mpt_softc *); void mpt_raid_free_mem(struct mpt_softc *); static __inline void diff --git a/sys/dev/mpt/mpt_user.c b/sys/dev/mpt/mpt_user.c index e6a9d1f5e60..78762c75118 100644 --- a/sys/dev/mpt/mpt_user.c +++ b/sys/dev/mpt/mpt_user.c @@ -94,7 +94,7 @@ static MALLOC_DEFINE(M_MPTUSER, "mpt_user", "Buffers for mpt(4) ioctls"); static uint32_t user_handler_id = MPT_HANDLER_ID_NONE; -int +static int mpt_user_probe(struct mpt_softc *mpt) { @@ -102,7 +102,7 @@ mpt_user_probe(struct mpt_softc *mpt) return (0); } -int +static int mpt_user_attach(struct mpt_softc *mpt) { mpt_handler_t handler; @@ -131,19 +131,20 @@ mpt_user_attach(struct mpt_softc *mpt) return (0); } -int +static int mpt_user_enable(struct mpt_softc *mpt) { return (0); } -void +static void mpt_user_ready(struct mpt_softc *mpt) { + } -int +static int mpt_user_event(struct mpt_softc *mpt, request_t *req, MSG_EVENT_NOTIFY_REPLY *msg) { @@ -152,12 +153,13 @@ mpt_user_event(struct mpt_softc *mpt, request_t *req, return (0); } -void +static void mpt_user_reset(struct mpt_softc *mpt, int type) { + } -void +static void mpt_user_detach(struct mpt_softc *mpt) { mpt_handler_t handler; From ec3e6e77a14adfe0003269d39caa4cf1e221d3e5 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Fri, 29 Jul 2011 18:38:31 +0000 Subject: [PATCH 057/452] - Send the RELSIM_ADJUST_OPENINGS in response to a MPI_EVENT_QUEUE_FULL using the right SIM in case the HBA is RAID-capable but the target in question is not a hot spare or member of a RAID volume. - Report the loss and addition of SAS and SATA targets detected via PHY link status changes and signalled by MPI_EVENT_SAS_DEVICE_STATUS_CHANGE to cam(4) as lost devices and trigger rescans as appropriate. Without this it can take quite some time until a lost device actually is no longer tried to be used, if it ever stops. [1] - Handle MPI_EVENT_IR2, MPI_EVENT_LOG_ENTRY_ADDED, MPI_EVENT_SAS_DISCOVERY and MPI_EVENT_SAS_PHY_LINK_STATUS silently as these serve no additional purpose beyond adding cryptic entries to logs. Thanks to Hans-Joerg Sirtl for providing one of the HBAs these changes were developed with and RIP to the mainboard that didn't survive testing them. PR: 157534 [1] Approved by: re (kib) MFC after: 2 weeks --- sys/dev/mpt/mpt_cam.c | 68 ++++++++++++++++++++++++++++++++++++++++-- sys/dev/mpt/mpt_raid.c | 19 ++++++++++++ sys/dev/mpt/mpt_raid.h | 1 + 3 files changed, 86 insertions(+), 2 deletions(-) diff --git a/sys/dev/mpt/mpt_cam.c b/sys/dev/mpt/mpt_cam.c index f54ed7f24c3..10856721ef8 100644 --- a/sys/dev/mpt/mpt_cam.c +++ b/sys/dev/mpt/mpt_cam.c @@ -2538,7 +2538,8 @@ mpt_cam_event(struct mpt_softc *mpt, request_t *req, pqf->CurrentDepth = le16toh(pqf->CurrentDepth); mpt_prt(mpt, "QUEUE FULL EVENT: Bus 0x%02x Target 0x%02x Depth " "%d\n", pqf->Bus, pqf->TargetID, pqf->CurrentDepth); - if (mpt->phydisk_sim) { + if (mpt->phydisk_sim && mpt_is_raid_member(mpt, + pqf->TargetID) != 0) { sim = mpt->phydisk_sim; } else { sim = mpt->sim; @@ -2570,9 +2571,72 @@ mpt_cam_event(struct mpt_softc *mpt, request_t *req, mpt_prt(mpt, "IR resync update %d completed\n", (data0 >> 16) & 0xff); break; + case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE: + { + union ccb *ccb; + struct cam_sim *sim; + struct cam_path *tmppath; + PTR_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE psdsc; + + psdsc = (PTR_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE)msg->Data; + if (mpt->phydisk_sim && mpt_is_raid_member(mpt, + psdsc->TargetID) != 0) + sim = mpt->phydisk_sim; + else + sim = mpt->sim; + switch(psdsc->ReasonCode) { + case MPI_EVENT_SAS_DEV_STAT_RC_ADDED: + MPTLOCK_2_CAMLOCK(mpt); + ccb = xpt_alloc_ccb_nowait(); + if (ccb == NULL) { + mpt_prt(mpt, + "unable to alloc CCB for rescan\n"); + CAMLOCK_2_MPTLOCK(mpt); + break; + } + if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, + cam_sim_path(sim), psdsc->TargetID, + CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + CAMLOCK_2_MPTLOCK(mpt); + mpt_prt(mpt, + "unable to create path for rescan\n"); + xpt_free_ccb(ccb); + break; + } + xpt_rescan(ccb); + CAMLOCK_2_MPTLOCK(mpt); + break; + case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING: + MPTLOCK_2_CAMLOCK(mpt); + if (xpt_create_path(&tmppath, NULL, cam_sim_path(sim), + psdsc->TargetID, CAM_LUN_WILDCARD) != + CAM_REQ_CMP) { + mpt_prt(mpt, + "unable to create path for async event"); + CAMLOCK_2_MPTLOCK(mpt); + break; + } + xpt_async(AC_LOST_DEVICE, tmppath, NULL); + xpt_free_path(tmppath); + CAMLOCK_2_MPTLOCK(mpt); + break; + case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET: + break; + default: + mpt_lprt(mpt, MPT_PRT_WARN, + "SAS device status change: Bus: 0x%02x TargetID: " + "0x%02x ReasonCode: 0x%02x\n", psdsc->TargetID, + psdsc->Bus, psdsc->ReasonCode); + break; + } + break; + } case MPI_EVENT_EVENT_CHANGE: case MPI_EVENT_INTEGRATED_RAID: - case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE: + case MPI_EVENT_IR2: + case MPI_EVENT_LOG_ENTRY_ADDED: + case MPI_EVENT_SAS_DISCOVERY: + case MPI_EVENT_SAS_PHY_LINK_STATUS: case MPI_EVENT_SAS_SES: break; default: diff --git a/sys/dev/mpt/mpt_raid.c b/sys/dev/mpt/mpt_raid.c index 07eadfb34d3..8000a0103ed 100644 --- a/sys/dev/mpt/mpt_raid.c +++ b/sys/dev/mpt/mpt_raid.c @@ -810,6 +810,25 @@ mpt_map_physdisk(struct mpt_softc *mpt, union ccb *ccb, target_id_t *tgt) return (-1); } +/* XXX Ignores that there may be multiple busses/IOCs involved. */ +int +mpt_is_raid_member(struct mpt_softc *mpt, target_id_t tgt) +{ + struct mpt_raid_disk *mpt_disk; + int i; + + if (mpt->ioc_page2 == NULL || mpt->ioc_page2->MaxPhysDisks == 0) + return (0); + for (i = 0; i < mpt->ioc_page2->MaxPhysDisks; i++) { + mpt_disk = &mpt->raid_disks[i]; + if ((mpt_disk->flags & MPT_RDF_ACTIVE) != 0 && + mpt_disk->config_page.PhysDiskID == tgt) + return (1); + } + return (0); + +} + /* XXX Ignores that there may be multiple busses/IOCs involved. */ int mpt_is_raid_volume(struct mpt_softc *mpt, target_id_t tgt) diff --git a/sys/dev/mpt/mpt_raid.h b/sys/dev/mpt/mpt_raid.h index 05d2be119ac..2047707b155 100644 --- a/sys/dev/mpt/mpt_raid.h +++ b/sys/dev/mpt/mpt_raid.h @@ -54,6 +54,7 @@ typedef enum { } mpt_raid_mwce_t; cam_status mpt_map_physdisk(struct mpt_softc *, union ccb *, target_id_t *); +int mpt_is_raid_member(struct mpt_softc *, target_id_t); int mpt_is_raid_volume(struct mpt_softc *, target_id_t); #if 0 cam_status From c0ca022a34d9bf47a853fff582122ce372265c8d Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Fri, 29 Jul 2011 20:24:04 +0000 Subject: [PATCH 058/452] Properly initialize an error variable to avoid returning uninitialized data when 'show drives' succeeds, often resulting in a failing exit code even though the command worked fine. Reviewed by: bz Approved by: re (kib) MFC after: 3 days --- usr.sbin/mfiutil/mfi_show.c | 1 + 1 file changed, 1 insertion(+) diff --git a/usr.sbin/mfiutil/mfi_show.c b/usr.sbin/mfiutil/mfi_show.c index d1f007145ea..ee19e8635ba 100644 --- a/usr.sbin/mfiutil/mfi_show.c +++ b/usr.sbin/mfiutil/mfi_show.c @@ -533,6 +533,7 @@ show_drives(int ac, char **av) MFI_DNAME_ES)); printf("\n"); } + error = 0; error: free(list); close(fd); From a07e846be07a1452c785c572b9227b78db3e2579 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Fri, 29 Jul 2011 20:30:28 +0000 Subject: [PATCH 059/452] In some cases failed SATA disks may report their presence, but don't respond to any commands. I've found that because of multiple command retries, each of which cause 30s timeout, bus reset and another retry or requeue for many commands, it may take ages to eventually drop the failed device. The odd thing is that those retries continue even after XPT considered device as dead and invalidated it. This patch makes cam_periph_error() to block any command retries after periph was marked as invalid. With that patch all activity completes in 1-2 minutes, just after several timeouts, required to consider device death. This should make ZFS, gmirror, graid, etc. operation more robust. Reviewed by: mjacob@ on scsi@ Approved by: re (kib) --- sys/cam/cam_periph.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c index f63077220e6..67c2d01125d 100644 --- a/sys/cam/cam_periph.c +++ b/sys/cam/cam_periph.c @@ -1550,7 +1550,8 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, * make sure we actually have retries available. */ if ((err_action & SSQ_DECREMENT_COUNT) != 0) { - if (ccb->ccb_h.retry_count > 0) + if (ccb->ccb_h.retry_count > 0 && + (periph->flags & CAM_PERIPH_INVALID) == 0) ccb->ccb_h.retry_count--; else { *action_string = "Retries exhausted"; @@ -1718,6 +1719,7 @@ int cam_periph_error(union ccb *ccb, cam_flags camflags, u_int32_t sense_flags, union ccb *save_ccb) { + struct cam_periph *periph; const char *action_string; cam_status status; int frozen; @@ -1725,7 +1727,8 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, int openings; u_int32_t relsim_flags; u_int32_t timeout = 0; - + + periph = xpt_path_periph(ccb->ccb_h.path); action_string = NULL; status = ccb->ccb_h.status; frozen = (status & CAM_DEV_QFRZN) != 0; @@ -1787,9 +1790,9 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, xpt_print(ccb->ccb_h.path, "Data overrun\n"); printed++; } - error = EIO; /* we have to kill the command */ /* decrement the number of retries */ - if (ccb->ccb_h.retry_count > 0) { + if (ccb->ccb_h.retry_count > 0 && + (periph->flags & CAM_PERIPH_INVALID) == 0) { ccb->ccb_h.retry_count--; error = ERESTART; } else { @@ -1808,7 +1811,8 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, struct cam_path *newpath; if ((camflags & CAM_RETRY_SELTO) != 0) { - if (ccb->ccb_h.retry_count > 0) { + if (ccb->ccb_h.retry_count > 0 && + (periph->flags & CAM_PERIPH_INVALID) == 0) { ccb->ccb_h.retry_count--; error = ERESTART; @@ -1826,10 +1830,11 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, timeout = periph_selto_delay; break; } + action_string = "Retries exhausted"; } error = ENXIO; /* Should we do more if we can't create the path?? */ - if (xpt_create_path(&newpath, xpt_path_periph(ccb->ccb_h.path), + if (xpt_create_path(&newpath, periph, xpt_path_path_id(ccb->ccb_h.path), xpt_path_target_id(ccb->ccb_h.path), CAM_LUN_WILDCARD) != CAM_REQ_CMP) @@ -1874,11 +1879,16 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, /* FALLTHROUGH */ case CAM_REQUEUE_REQ: /* Unconditional requeue */ - error = ERESTART; if (bootverbose && printed == 0) { xpt_print(ccb->ccb_h.path, "Request requeued\n"); printed++; } + if ((periph->flags & CAM_PERIPH_INVALID) == 0) + error = ERESTART; + else { + action_string = "Retries exhausted"; + error = EIO; + } break; case CAM_RESRC_UNAVAIL: /* Wait a bit for the resource shortage to abate. */ @@ -1893,7 +1903,8 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, /* FALLTHROUGH */ default: /* decrement the number of retries */ - if (ccb->ccb_h.retry_count > 0) { + if (ccb->ccb_h.retry_count > 0 && + (periph->flags & CAM_PERIPH_INVALID) == 0) { ccb->ccb_h.retry_count--; error = ERESTART; if (bootverbose && printed == 0) { From 1ed6aaf99ec4323555be03ffcaccdccaae958481 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Fri, 29 Jul 2011 20:32:27 +0000 Subject: [PATCH 060/452] Add control for ATA disk read-ahead, alike to the previously added write cache control. Some controller BIOS'es tend to disable read-ahead, that dramatically reduces read performance. Previously ata(4) always enabled read-ahead unconditionally. Approved by: re (kib) --- sys/cam/ata/ata_da.c | 113 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 102 insertions(+), 11 deletions(-) diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c index 46ae21882f1..c0be395cc28 100644 --- a/sys/cam/ata/ata_da.c +++ b/sys/cam/ata/ata_da.c @@ -69,6 +69,7 @@ __FBSDID("$FreeBSD$"); #define ATA_MAX_28BIT_LBA 268435455UL typedef enum { + ADA_STATE_RAHEAD, ADA_STATE_WCACHE, ADA_STATE_NORMAL } ada_state; @@ -94,7 +95,8 @@ typedef enum { } ada_quirks; typedef enum { - ADA_CCB_WCACHE = 0x01, + ADA_CCB_RAHEAD = 0x01, + ADA_CCB_WCACHE = 0x02, ADA_CCB_BUFFER_IO = 0x03, ADA_CCB_WAITING = 0x04, ADA_CCB_DUMP = 0x05, @@ -132,6 +134,7 @@ struct ada_softc { int outstanding_cmds; int trim_max_ranges; int trim_running; + int read_ahead; int write_cache; #ifdef ADA_TEST_FAILURE int force_read_error; @@ -294,10 +297,19 @@ static void adaresume(void *arg); #define ADA_DEFAULT_SPINDOWN_SUSPEND 1 #endif +#ifndef ADA_DEFAULT_READ_AHEAD +#define ADA_DEFAULT_READ_AHEAD 1 +#endif + #ifndef ADA_DEFAULT_WRITE_CACHE #define ADA_DEFAULT_WRITE_CACHE 1 #endif +#define ADA_RA (softc->read_ahead >= 0 ? \ + softc->read_ahead : ada_read_ahead) +#define ADA_WC (softc->write_cache >= 0 ? \ + softc->write_cache : ada_write_cache) + /* * Most platforms map firmware geometry to actual, but some don't. If * not overridden, default to nothing. @@ -312,6 +324,7 @@ static int ada_default_timeout = ADA_DEFAULT_TIMEOUT; static int ada_send_ordered = ADA_DEFAULT_SEND_ORDERED; static int ada_spindown_shutdown = ADA_DEFAULT_SPINDOWN_SHUTDOWN; static int ada_spindown_suspend = ADA_DEFAULT_SPINDOWN_SUSPEND; +static int ada_read_ahead = ADA_DEFAULT_READ_AHEAD; static int ada_write_cache = ADA_DEFAULT_WRITE_CACHE; SYSCTL_NODE(_kern_cam, OID_AUTO, ada, CTLFLAG_RD, 0, @@ -334,6 +347,9 @@ TUNABLE_INT("kern.cam.ada.spindown_shutdown", &ada_spindown_shutdown); SYSCTL_INT(_kern_cam_ada, OID_AUTO, spindown_suspend, CTLFLAG_RW, &ada_spindown_suspend, 0, "Spin down upon suspend"); TUNABLE_INT("kern.cam.ada.spindown_suspend", &ada_spindown_suspend); +SYSCTL_INT(_kern_cam_ada, OID_AUTO, read_ahead, CTLFLAG_RW, + &ada_read_ahead, 0, "Enable disk read-ahead"); +TUNABLE_INT("kern.cam.ada.read_ahead", &ada_read_ahead); SYSCTL_INT(_kern_cam_ada, OID_AUTO, write_cache, CTLFLAG_RW, &ada_write_cache, 0, "Enable disk write cache"); TUNABLE_INT("kern.cam.ada.write_cache", &ada_write_cache); @@ -737,16 +753,19 @@ adaasync(void *callback_arg, u_int32_t code, softc = (struct ada_softc *)periph->softc; cam_periph_async(periph, code, path, arg); - if (ada_write_cache < 0 && softc->write_cache < 0) - break; if (softc->state != ADA_STATE_NORMAL) break; xpt_setup_ccb(&cgd.ccb_h, periph->path, CAM_PRIORITY_NORMAL); cgd.ccb_h.func_code = XPT_GDEV_TYPE; xpt_action((union ccb *)&cgd); - if ((cgd.ident_data.support.command1 & ATA_SUPPORT_WRITECACHE) == 0) - break; - softc->state = ADA_STATE_WCACHE; + if (ADA_RA >= 0 && + cgd.ident_data.support.command1 & ATA_SUPPORT_LOOKAHEAD) + softc->state = ADA_STATE_RAHEAD; + else if (ADA_WC >= 0 && + cgd.ident_data.support.command1 & ATA_SUPPORT_WRITECACHE) + softc->state = ADA_STATE_WCACHE; + else + break; cam_periph_acquire(periph); cam_freeze_devq_arg(periph->path, RELSIM_RELEASE_RUNLEVEL, CAM_RL_DEV + 1); @@ -788,6 +807,9 @@ adasysctlinit(void *context, int pending) return; } + SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), + OID_AUTO, "read_ahead", CTLFLAG_RW | CTLFLAG_MPSAFE, + &softc->read_ahead, 0, "Enable disk read ahead."); SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "write_cache", CTLFLAG_RW | CTLFLAG_MPSAFE, &softc->write_cache, 0, "Enable disk write cache."); @@ -922,6 +944,10 @@ adaregister(struct cam_periph *periph, void *arg) quirks = softc->quirks; TUNABLE_INT_FETCH(announce_buf, &quirks); softc->quirks = quirks; + softc->read_ahead = -1; + snprintf(announce_buf, sizeof(announce_buf), + "kern.cam.ada.%d.read_ahead", periph->unit_number); + TUNABLE_INT_FETCH(announce_buf, &softc->read_ahead); softc->write_cache = -1; snprintf(announce_buf, sizeof(announce_buf), "kern.cam.ada.%d.write_cache", periph->unit_number); @@ -1044,7 +1070,14 @@ adaregister(struct cam_periph *periph, void *arg) (ADA_DEFAULT_TIMEOUT * hz) / ADA_ORDEREDTAG_INTERVAL, adasendorderedtag, softc); - if ((ada_write_cache >= 0 || softc->write_cache >= 0) && + if (ADA_RA >= 0 && + cgd->ident_data.support.command1 & ATA_SUPPORT_LOOKAHEAD) { + softc->state = ADA_STATE_RAHEAD; + cam_periph_acquire(periph); + cam_freeze_devq_arg(periph->path, + RELSIM_RELEASE_RUNLEVEL, CAM_RL_DEV + 1); + xpt_schedule(periph, CAM_PRIORITY_DEV); + } else if (ADA_WC >= 0 && cgd->ident_data.support.command1 & ATA_SUPPORT_WRITECACHE) { softc->state = ADA_STATE_WCACHE; cam_periph_acquire(periph); @@ -1317,8 +1350,19 @@ out: adaschedule(periph); break; } + case ADA_STATE_RAHEAD: case ADA_STATE_WCACHE: { + if (softc->flags & ADA_FLAG_PACK_INVALID) { + softc->state = ADA_STATE_NORMAL; + xpt_release_ccb(start_ccb); + cam_release_devq(periph->path, + RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_DEV + 1, FALSE); + adaschedule(periph); + cam_periph_release_locked(periph); + return; + } + cam_fill_ataio(ataio, 1, adadone, @@ -1328,10 +1372,15 @@ out: 0, ada_default_timeout*1000); - ata_28bit_cmd(ataio, ATA_SETFEATURES, (softc->write_cache > 0 || - (softc->write_cache < 0 && ada_write_cache)) ? - ATA_SF_ENAB_WCACHE : ATA_SF_DIS_WCACHE, 0, 0); - start_ccb->ccb_h.ccb_state = ADA_CCB_WCACHE; + if (softc->state == ADA_STATE_RAHEAD) { + ata_28bit_cmd(ataio, ATA_SETFEATURES, ADA_RA ? + ATA_SF_ENAB_RCACHE : ATA_SF_DIS_RCACHE, 0, 0); + start_ccb->ccb_h.ccb_state = ADA_CCB_RAHEAD; + } else { + ata_28bit_cmd(ataio, ATA_SETFEATURES, ADA_WC ? + ATA_SF_ENAB_WCACHE : ATA_SF_DIS_WCACHE, 0, 0); + start_ccb->ccb_h.ccb_state = ADA_CCB_WCACHE; + } xpt_action(start_ccb); break; } @@ -1343,6 +1392,7 @@ adadone(struct cam_periph *periph, union ccb *done_ccb) { struct ada_softc *softc; struct ccb_ataio *ataio; + struct ccb_getdev *cgd; softc = (struct ada_softc *)periph->softc; ataio = &done_ccb->ataio; @@ -1423,6 +1473,47 @@ adadone(struct cam_periph *periph, union ccb *done_ccb) biodone(bp); break; } + case ADA_CCB_RAHEAD: + { + if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { + if (adaerror(done_ccb, 0, 0) == ERESTART) { + return; + } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { + cam_release_devq(done_ccb->ccb_h.path, + /*relsim_flags*/0, + /*reduction*/0, + /*timeout*/0, + /*getcount_only*/0); + } + } + + /* + * Since our peripheral may be invalidated by an error + * above or an external event, we must release our CCB + * before releasing the reference on the peripheral. + * The peripheral will only go away once the last reference + * is removed, and we need it around for the CCB release + * operation. + */ + cgd = (struct ccb_getdev *)done_ccb; + xpt_setup_ccb(&cgd->ccb_h, periph->path, CAM_PRIORITY_NORMAL); + cgd->ccb_h.func_code = XPT_GDEV_TYPE; + xpt_action((union ccb *)cgd); + if (ADA_WC >= 0 && + cgd->ident_data.support.command1 & ATA_SUPPORT_WRITECACHE) { + softc->state = ADA_STATE_WCACHE; + xpt_release_ccb(done_ccb); + xpt_schedule(periph, CAM_PRIORITY_DEV); + return; + } + softc->state = ADA_STATE_NORMAL; + xpt_release_ccb(done_ccb); + cam_release_devq(periph->path, + RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_DEV + 1, FALSE); + adaschedule(periph); + cam_periph_release_locked(periph); + return; + } case ADA_CCB_WCACHE: { if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { From 2d33cc7688caa1a8f870ad21f859903d115d1603 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Fri, 29 Jul 2011 20:35:23 +0000 Subject: [PATCH 061/452] In some cases, at least on Marvell 88SE912x controllers, Current Command Slot field of the PxCMD register may point to an empty command slot. That breaks command timeout detection logic, making impossible to find what command actually caused timeout, and leading to infinite wait. Workaround that by checking whether pointed command slot is really used and can timeout in its time. And if not, fallback to the dumb algorithm used with FBS -- let all commands to time out and then fail all of them. Approved by: re (kib) MFC after: 1 week --- sys/dev/ahci/ahci.c | 20 ++++++++++++++------ sys/dev/ahci/ahci.h | 1 + 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c index 0bc094edcce..1d6185dce83 100644 --- a/sys/dev/ahci/ahci.c +++ b/sys/dev/ahci/ahci.c @@ -1879,12 +1879,13 @@ ahci_execute_transaction(struct ahci_slot *slot) device_printf(dev, "Poll timeout on slot %d port %d\n", slot->slot, port); device_printf(dev, "is %08x cs %08x ss %08x " - "rs %08x tfd %02x serr %08x\n", + "rs %08x tfd %02x serr %08x cmd %08x\n", ATA_INL(ch->r_mem, AHCI_P_IS), ATA_INL(ch->r_mem, AHCI_P_CI), ATA_INL(ch->r_mem, AHCI_P_SACT), ch->rslots, ATA_INL(ch->r_mem, AHCI_P_TFD), - ATA_INL(ch->r_mem, AHCI_P_SERR)); + ATA_INL(ch->r_mem, AHCI_P_SERR), + ATA_INL(ch->r_mem, AHCI_P_CMD)); et = AHCI_ERR_TIMEOUT; } @@ -1960,8 +1961,12 @@ ahci_timeout(struct ahci_slot *slot) ccs = (ATA_INL(ch->r_mem, AHCI_P_CMD) & AHCI_P_CMD_CCS_MASK) >> AHCI_P_CMD_CCS_SHIFT; if ((sstatus & (1 << slot->slot)) != 0 || ccs == slot->slot || - ch->fbs_enabled) + ch->fbs_enabled || ch->wrongccs) slot->state = AHCI_SLOT_EXECUTING; + else if ((ch->rslots & (1 << ccs)) == 0) { + ch->wrongccs = 1; + slot->state = AHCI_SLOT_EXECUTING; + } callout_reset(&slot->timeout, (int)slot->ccb->ccb_h.timeout * hz / 2000, @@ -1971,10 +1976,12 @@ ahci_timeout(struct ahci_slot *slot) device_printf(dev, "Timeout on slot %d port %d\n", slot->slot, slot->ccb->ccb_h.target_id & 0x0f); - device_printf(dev, "is %08x cs %08x ss %08x rs %08x tfd %02x serr %08x\n", + device_printf(dev, "is %08x cs %08x ss %08x rs %08x tfd %02x " + "serr %08x cmd %08x\n", ATA_INL(ch->r_mem, AHCI_P_IS), ATA_INL(ch->r_mem, AHCI_P_CI), ATA_INL(ch->r_mem, AHCI_P_SACT), ch->rslots, - ATA_INL(ch->r_mem, AHCI_P_TFD), ATA_INL(ch->r_mem, AHCI_P_SERR)); + ATA_INL(ch->r_mem, AHCI_P_TFD), ATA_INL(ch->r_mem, AHCI_P_SERR), + ATA_INL(ch->r_mem, AHCI_P_CMD)); /* Handle frozen command. */ if (ch->frozen) { @@ -1987,7 +1994,7 @@ ahci_timeout(struct ahci_slot *slot) } xpt_done(fccb); } - if (!ch->fbs_enabled) { + if (!ch->fbs_enabled && !ch->wrongccs) { /* Without FBS we know real timeout source. */ ch->fatalerr = 1; /* Handle command with timeout. */ @@ -2585,6 +2592,7 @@ ahci_reset(device_t dev) xpt_release_simq(ch->sim, TRUE); ch->eslots = 0; ch->toslots = 0; + ch->wrongccs = 0; ch->fatalerr = 0; /* Tell the XPT about the event */ xpt_async(AC_BUS_RESET, ch->path, NULL); diff --git a/sys/dev/ahci/ahci.h b/sys/dev/ahci/ahci.h index 3ace69fff92..559c67ab0e4 100644 --- a/sys/dev/ahci/ahci.h +++ b/sys/dev/ahci/ahci.h @@ -426,6 +426,7 @@ struct ahci_channel { int resetting; /* Hard-reset in progress. */ int resetpolldiv; /* Hard-reset poll divider. */ int listening; /* SUD bit is cleared. */ + int wrongccs; /* CCS field in CMD was wrong */ union ccb *frozen; /* Frozen command */ struct callout pm_timer; /* Power management events */ struct callout reset_timer; /* Hard-reset timeout */ From 7ea00a6866aefc2d9755bd544bfab4170490ac4b Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Fri, 29 Jul 2011 20:38:06 +0000 Subject: [PATCH 062/452] Make ums(4) driver more picky, not attaching to "mouses" with absolute coordinates, such as digitizers and touch-screens, leaving these devices to uhid(4) and user-level. Specially patched xf86-input-mouse driver can handle them, that isn't done and can't be done properly with ums(4) because of mouse(4) protocol limitations. Approved by: re (kib) --- sys/dev/usb/input/ums.c | 48 ++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/sys/dev/usb/input/ums.c b/sys/dev/usb/input/ums.c index 3c4f36e21ab..12d9e89a2eb 100644 --- a/sys/dev/usb/input/ums.c +++ b/sys/dev/usb/input/ums.c @@ -367,7 +367,9 @@ ums_probe(device_t dev) { struct usb_attach_arg *uaa = device_get_ivars(dev); void *d_ptr; - int error; + struct hid_data *hd; + struct hid_item hi; + int error, mdepth, found; uint16_t d_len; DPRINTFN(11, "\n"); @@ -388,14 +390,44 @@ ums_probe(device_t dev) if (error) return (ENXIO); - if (hid_is_collection(d_ptr, d_len, - HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE))) - error = BUS_PROBE_DEFAULT; - else - error = ENXIO; - + hd = hid_start_parse(d_ptr, d_len, 1 << hid_input); + if (hd == NULL) + return (0); + mdepth = 0; + found = 0; + while (hid_get_item(hd, &hi)) { + switch (hi.kind) { + case hid_collection: + if (mdepth != 0) + mdepth++; + else if (hi.collection == 1 && + hi.usage == + HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE)) + mdepth++; + break; + case hid_endcollection: + if (mdepth != 0) + mdepth--; + break; + case hid_input: + if (mdepth == 0) + break; + if (hi.usage == + HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X) && + (hi.flags & MOUSE_FLAGS_MASK) == MOUSE_FLAGS) + found++; + if (hi.usage == + HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_Y) && + (hi.flags & MOUSE_FLAGS_MASK) == MOUSE_FLAGS) + found++; + break; + default: + break; + } + } + hid_end_parse(hd); free(d_ptr, M_TEMP); - return (error); + return (found ? BUS_PROBE_DEFAULT : ENXIO); } static void From f9da901e774bdcb0fd82779e9fecd8c9bfb7a7a7 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Fri, 29 Jul 2011 23:55:17 +0000 Subject: [PATCH 063/452] Reset the NIC if ANI is enabled or disabled. Although this may not be what the original sysctl was designed to do, it feels a bit more "expected". Before, if ANI is disabled, the initial ANI parameters are still written to the hardware, even if they're not enabled. "ANI enabled" would then adjust the noise immunity parameters dynamically. Disabling ANI would simply leave the existing noise immunity parameters where they are, and disable the dynamic part. The problem is that disabling ANI doesn't leave the hardware in a consistent, predictable state - so asking a user to disable ANI wouldn't actually reset the NIC to a consistent set of PHY signal detection parameters, resulting in an unpredictable/unreliable outcome. This makes it difficult to get reliable debugging information from the user. Approved by: re (kib) --- sys/dev/ath/if_ath_sysctl.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/sys/dev/ath/if_ath_sysctl.c b/sys/dev/ath/if_ath_sysctl.c index e3c9966b8f5..ea6f949bdbe 100644 --- a/sys/dev/ath/if_ath_sysctl.c +++ b/sys/dev/ath/if_ath_sysctl.c @@ -354,7 +354,21 @@ ath_sysctl_intmit(SYSCTL_HANDLER_ARGS) error = sysctl_handle_int(oidp, &intmit, 0, req); if (error || !req->newptr) return error; - return !ath_hal_setintmit(sc->sc_ah, intmit) ? EINVAL : 0; + + /* reusing error; 1 here means "good"; 0 means "fail" */ + error = ath_hal_setintmit(sc->sc_ah, intmit); + if (! error) + return EINVAL; + + /* + * Reset the hardware here - disabling ANI in the HAL + * doesn't reset ANI related registers, so it'll leave + * things in an inconsistent state. + */ + if (sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING) + ath_reset(sc->sc_ifp); + + return 0; } #ifdef IEEE80211_SUPPORT_TDMA From fddf7baebea4f9843f9d7d7cd5b974c0ad252bfa Mon Sep 17 00:00:00 2001 From: Kirk McKusick Date: Sat, 30 Jul 2011 00:43:18 +0000 Subject: [PATCH 064/452] Update to -r224294 to ensure that only one of MNT_SUJ or MNT_SOFTDEP is set so that mount can revert back to using MNT_NOWAIT when doing getmntinfo. Approved by: re (kib) --- sbin/mount/mount.c | 4 ++-- sys/ufs/ffs/ffs_alloc.c | 4 ++-- sys/ufs/ffs/ffs_softdep.c | 39 ++++++++++++++++++++------------------- sys/ufs/ffs/ffs_vfsops.c | 15 ++++++--------- sys/ufs/ffs/ffs_vnops.c | 3 +-- sys/ufs/ufs/inode.h | 8 +++++--- 6 files changed, 36 insertions(+), 37 deletions(-) diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index 61d17471150..6e8f3b5c63e 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -317,7 +317,7 @@ main(int argc, char *argv[]) rval = 0; switch (argc) { case 0: - if ((mntsize = getmntinfo(&mntbuf, MNT_WAIT)) == 0) + if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) err(1, "getmntinfo"); if (all) { while ((fs = getfsent()) != NULL) { @@ -666,7 +666,7 @@ getmntpt(const char *name) struct statfs *mntbuf; int i, mntsize; - mntsize = getmntinfo(&mntbuf, MNT_WAIT); + mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); for (i = mntsize - 1; i >= 0; i--) { if (strcmp(mntbuf[i].f_mntfromname, name) == 0 || strcmp(mntbuf[i].f_mntonname, name) == 0) diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index 283db174db4..f6d0366b9ac 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -1967,7 +1967,7 @@ ffs_blkfree_cg(ump, fs, devvp, bno, size, inum, dephd) ACTIVECLEAR(fs, cg); UFS_UNLOCK(ump); mp = UFSTOVFS(ump); - if (mp->mnt_flag & MNT_SOFTDEP && devvp->v_type != VREG) + if (MOUNTEDSOFTDEP(mp) && devvp->v_type != VREG) softdep_setup_blkfree(UFSTOVFS(ump), bp, bno, numfrags(fs, size), dephd); bdwrite(bp); @@ -2217,7 +2217,7 @@ ffs_freefile(ump, fs, devvp, ino, mode, wkhd) fs->fs_fmod = 1; ACTIVECLEAR(fs, cg); UFS_UNLOCK(ump); - if (UFSTOVFS(ump)->mnt_flag & MNT_SOFTDEP && devvp->v_type != VREG) + if (MOUNTEDSOFTDEP(UFSTOVFS(ump)) && devvp->v_type != VREG) softdep_setup_inofree(UFSTOVFS(ump), bp, ino + cg * fs->fs_ipg, wkhd); bdwrite(bp); diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index 8f1923a6028..58d8ba9fc94 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -1364,7 +1364,7 @@ softdep_flush(void) mtx_lock(&mountlist_mtx); for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) { nmp = TAILQ_NEXT(mp, mnt_list); - if ((mp->mnt_flag & MNT_SOFTDEP) == 0) + if (MOUNTEDSOFTDEP(mp) == 0) continue; if (vfs_busy(mp, MBF_NOWAIT | MBF_MNTLSTLOCK)) continue; @@ -2423,7 +2423,7 @@ softdep_unmount(mp) MNT_ILOCK(mp); mp->mnt_flag &= ~MNT_SOFTDEP; - if ((mp->mnt_flag & MNT_SUJ) == 0) { + if (MOUNTEDSUJ(mp) == 0) { MNT_IUNLOCK(mp); return; } @@ -2638,6 +2638,7 @@ out: if (error == 0) { MNT_ILOCK(mp); mp->mnt_flag |= MNT_SUJ; + mp->mnt_flag &= ~MNT_SOFTDEP; MNT_IUNLOCK(mp); /* * Only validate the journal contents if the @@ -3060,7 +3061,7 @@ softdep_flushjournal(mp) struct jblocks *jblocks; struct ufsmount *ump; - if ((mp->mnt_flag & MNT_SUJ) == 0) + if (MOUNTEDSUJ(mp) == 0) return; ump = VFSTOUFS(mp); jblocks = ump->softdep_jblocks; @@ -3096,7 +3097,7 @@ softdep_process_journal(mp, needwk, flags) int off; int devbsize; - if ((mp->mnt_flag & MNT_SUJ) == 0) + if (MOUNTEDSUJ(mp) == 0) return; ump = VFSTOUFS(mp); fs = ump->um_fs; @@ -3827,8 +3828,8 @@ newfreework(ump, freeblks, parent, lbn, nb, frags, off, journal) freework->fw_blkno = nb; freework->fw_frags = frags; freework->fw_indir = NULL; - freework->fw_ref = ((UFSTOVFS(ump)->mnt_flag & MNT_SUJ) == 0 || - lbn >= -NXADDR) ? 0 : NINDIR(ump->um_fs) + 1; + freework->fw_ref = (MOUNTEDSUJ(UFSTOVFS(ump)) == 0 || lbn >= -NXADDR) + ? 0 : NINDIR(ump->um_fs) + 1; freework->fw_start = freework->fw_off = off; if (journal) newjfreeblk(freeblks, lbn, nb, frags); @@ -4681,7 +4682,7 @@ softdep_setup_inomapdep(bp, ip, newinum, mode) * Allocate the journal reference add structure so that the bitmap * can be dependent on it. */ - if (mp->mnt_flag & MNT_SUJ) { + if (MOUNTEDSUJ(mp)) { jaddref = newjaddref(ip, newinum, 0, 0, mode); jaddref->ja_state |= NEWBLOCK; } @@ -4734,7 +4735,7 @@ softdep_setup_blkmapdep(bp, mp, newblkno, frags, oldfrags) * Add it to the dependency list for the buffer holding * the cylinder group map from which it was allocated. */ - if (mp->mnt_flag & MNT_SUJ) { + if (MOUNTEDSUJ(mp)) { jnewblk = malloc(sizeof(*jnewblk), M_JNEWBLK, M_SOFTDEP_FLAGS); workitem_alloc(&jnewblk->jn_list, D_JNEWBLK, mp); jnewblk->jn_jsegdep = newjsegdep(&jnewblk->jn_list); @@ -5199,7 +5200,7 @@ newfreefrag(ip, blkno, size, lbn) freefrag->ff_blkno = blkno; freefrag->ff_fragsize = size; - if ((ip->i_ump->um_mountp->mnt_flag & MNT_SUJ) != 0) { + if (MOUNTEDSUJ(UFSTOVFS(ip->i_ump))) { freefrag->ff_jdep = (struct worklist *) newjfreefrag(freefrag, ip, blkno, size, lbn); } else { @@ -7254,7 +7255,7 @@ freework_freeblock(freework) freeblks = freework->fw_freeblks; ump = VFSTOUFS(freeblks->fb_list.wk_mp); fs = ump->um_fs; - needj = (freeblks->fb_list.wk_mp->mnt_flag & MNT_SUJ) != 0; + needj = MOUNTEDSUJ(freeblks->fb_list.wk_mp) != 0; bsize = lfragtosize(fs, freework->fw_frags); LIST_INIT(&wkhd); /* @@ -7674,7 +7675,7 @@ indir_trunc(freework, dbn, lbn) ufs1fmt = 0; } level = lbn_level(lbn); - needj = (UFSTOVFS(ump)->mnt_flag & MNT_SUJ) != 0; + needj = MOUNTEDSUJ(UFSTOVFS(ump)) != 0; lbnadd = lbn_offset(fs, level); nblocks = btodb(fs->fs_bsize); nfreework = freework; @@ -7860,7 +7861,7 @@ setup_newdir(dap, newinum, dinum, newdirbp, mkdirp) mkdir2->md_state = ATTACHED | MKDIR_PARENT; mkdir2->md_diradd = dap; mkdir2->md_jaddref = NULL; - if ((mp->mnt_flag & MNT_SUJ) == 0) { + if (MOUNTEDSUJ(mp) == 0) { mkdir1->md_state |= DEPCOMPLETE; mkdir2->md_state |= DEPCOMPLETE; } @@ -7900,7 +7901,7 @@ setup_newdir(dap, newinum, dinum, newdirbp, mkdirp) * been satisfied and mkdir2 can be freed. */ inodedep_lookup(mp, dinum, 0, &inodedep); - if (mp->mnt_flag & MNT_SUJ) { + if (MOUNTEDSUJ(mp)) { if (inodedep == NULL) panic("setup_newdir: Lost parent."); jaddref = (struct jaddref *)TAILQ_LAST(&inodedep->id_inoreflst, @@ -8031,7 +8032,7 @@ softdep_setup_directory_add(bp, dp, diroffset, newinum, newdirbp, isnewblk) * written place it on the bufwait list, otherwise do the post-inode * write processing to put it on the id_pendinghd list. */ - if (mp->mnt_flag & MNT_SUJ) { + if (MOUNTEDSUJ(mp)) { jaddref = (struct jaddref *)TAILQ_LAST(&inodedep->id_inoreflst, inoreflst); KASSERT(jaddref != NULL && jaddref->ja_parent == dp->i_number, @@ -8047,7 +8048,7 @@ softdep_setup_directory_add(bp, dp, diroffset, newinum, newdirbp, isnewblk) * Add the journal entries for . and .. links now that the primary * link is written. */ - if (mkdir1 != NULL && (mp->mnt_flag & MNT_SUJ)) { + if (mkdir1 != NULL && MOUNTEDSUJ(mp)) { jaddref = (struct jaddref *)TAILQ_PREV(&jaddref->ja_ref, inoreflst, if_deps); KASSERT(jaddref != NULL && @@ -8144,7 +8145,7 @@ softdep_change_directoryentry_offset(bp, dp, base, oldloc, newloc, entrysize) * determine if any affected adds or removes are present in the * journal. */ - if (mp->mnt_flag & MNT_SUJ) { + if (MOUNTEDSUJ(mp)) { flags = DEPALLOC; jmvref = newjmvref(dp, de->d_ino, dp->i_offset + (oldloc - base), @@ -8865,7 +8866,7 @@ softdep_setup_directory_change(bp, dp, ip, newinum, isrmdir) * processing to put it on the id_pendinghd list. */ inodedep_lookup(mp, newinum, DEPALLOC, &inodedep); - if (mp->mnt_flag & MNT_SUJ) { + if (MOUNTEDSUJ(mp)) { jaddref = (struct jaddref *)TAILQ_LAST(&inodedep->id_inoreflst, inoreflst); KASSERT(jaddref != NULL && jaddref->ja_parent == dp->i_number, @@ -8928,7 +8929,7 @@ softdep_setup_sbupdate(ump, fs, bp) struct sbdep *sbdep; struct worklist *wk; - if ((ump->um_mountp->mnt_flag & MNT_SUJ) == 0) + if (MOUNTEDSUJ(UFSTOVFS(ump)) == 0) return; LIST_FOREACH(wk, &bp->b_dep, wk_list) if (wk->wk_type == D_SBDEP) @@ -9046,7 +9047,7 @@ unlinked_inodedep(mp, inodedep) { struct ufsmount *ump; - if ((mp->mnt_flag & MNT_SUJ) == 0) + if (MOUNTEDSUJ(mp) == 0) return; ump = VFSTOUFS(mp); ump->um_fs->fs_fmod = 1; diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 7f57c841cc1..4f688a2aa94 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -281,7 +281,7 @@ ffs_mount(struct mount *mp) flags = WRITECLOSE; if (mp->mnt_flag & MNT_FORCE) flags |= FORCECLOSE; - if (mp->mnt_flag & MNT_SOFTDEP) { + if (MOUNTEDSOFTDEP(mp)) { error = softdep_flushfiles(mp, flags, td); } else { error = ffs_flushfiles(mp, flags, td); @@ -307,7 +307,7 @@ ffs_mount(struct mount *mp) vfs_write_resume(mp); return (error); } - if (mp->mnt_flag & MNT_SOFTDEP) + if (MOUNTEDSOFTDEP(mp)) softdep_unmount(mp); DROP_GIANT(); g_topology_lock(); @@ -411,7 +411,7 @@ ffs_mount(struct mount *mp) * Softdep_mount() clears it in an initial mount * or ro->rw remount. */ - if (mp->mnt_flag & MNT_SOFTDEP) { + if (MOUNTEDSOFTDEP(mp)) { /* XXX: Reset too late ? */ MNT_ILOCK(mp); mp->mnt_flag &= ~MNT_ASYNC; @@ -443,7 +443,7 @@ ffs_mount(struct mount *mp) fs->fs_fsmnt); return (EINVAL); } - KASSERT((mp->mnt_flag & MNT_SOFTDEP) == 0, + KASSERT(MOUNTEDSOFTDEP(mp) == 0, ("soft updates enabled on read-only file system")); DROP_GIANT(); g_topology_lock(); @@ -530,7 +530,7 @@ ffs_mount(struct mount *mp) return (error); } if (fsckpid > 0) { - KASSERT((mp->mnt_flag & MNT_SOFTDEP) == 0, + KASSERT(MOUNTEDSOFTDEP(mp) == 0, ("soft updates enabled on read-only file system")); ump = VFSTOUFS(mp); fs = ump->um_fs; @@ -1247,7 +1247,7 @@ ffs_unmount(mp, mntflags) vn_start_write(NULL, &mp, V_WAIT); } } - if (mp->mnt_flag & MNT_SOFTDEP) + if (MOUNTEDSOFTDEP(mp)) error = softdep_flushfiles(mp, flags, td); else error = ffs_flushfiles(mp, flags, td); @@ -1389,9 +1389,6 @@ ffs_statfs(mp, sbp) fs = ump->um_fs; if (fs->fs_magic != FS_UFS1_MAGIC && fs->fs_magic != FS_UFS2_MAGIC) panic("ffs_statfs"); - /* Don't export MNT_SOFTDEP when MNT_SUJ is in use */ - if ((sbp->f_flags & (MNT_SOFTDEP | MNT_SUJ)) == (MNT_SOFTDEP | MNT_SUJ)) - sbp->f_flags &= ~MNT_SOFTDEP; sbp->f_version = STATFS_VERSION; sbp->f_bsize = fs->fs_fsize; sbp->f_iosize = fs->fs_bsize; diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index 9f528dac997..81c7af40811 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -187,8 +187,7 @@ retry: error = ffs_syncvnode(vp, ap->a_waitfor); if (error) return (error); - if (ap->a_waitfor == MNT_WAIT && - (vp->v_mount->mnt_flag & MNT_SOFTDEP)) { + if (ap->a_waitfor == MNT_WAIT && DOINGSOFTDEP(vp)) { error = softdep_fsync(vp); if (error) return (error); diff --git a/sys/ufs/ufs/inode.h b/sys/ufs/ufs/inode.h index 943e303f75d..6f3d6f9853e 100644 --- a/sys/ufs/ufs/inode.h +++ b/sys/ufs/ufs/inode.h @@ -174,9 +174,11 @@ struct indir { #define ITOV(ip) ((ip)->i_vnode) /* Determine if soft dependencies are being done */ -#define DOINGSOFTDEP(vp) ((vp)->v_mount->mnt_flag & MNT_SOFTDEP) -#define DOINGASYNC(vp) ((vp)->v_mount->mnt_kern_flag & MNTK_ASYNC) -#define DOINGSUJ(vp) ((vp)->v_mount->mnt_flag & MNT_SUJ) +#define DOINGSOFTDEP(vp) ((vp)->v_mount->mnt_flag & (MNT_SOFTDEP | MNT_SUJ)) +#define MOUNTEDSOFTDEP(mp) ((mp)->mnt_flag & (MNT_SOFTDEP | MNT_SUJ)) +#define DOINGASYNC(vp) ((vp)->v_mount->mnt_kern_flag & MNTK_ASYNC) +#define DOINGSUJ(vp) ((vp)->v_mount->mnt_flag & MNT_SUJ) +#define MOUNTEDSUJ(mp) ((mp)->mnt_flag & MNT_SUJ) /* This overlays the fid structure (see mount.h). */ struct ufid { From 86354c8d3810d21453af04990b7a14235a0241f3 Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Sat, 30 Jul 2011 00:51:36 +0000 Subject: [PATCH 065/452] Mount memsticks read-only by default to prevent them being filled by user modifications and subsequently preventing a functioning installation. Approved by: re (kib) --- release/amd64/make-memstick.sh | 2 +- release/i386/make-memstick.sh | 2 +- release/powerpc/make-memstick.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/release/amd64/make-memstick.sh b/release/amd64/make-memstick.sh index 42f56f74f2a..f26b79dbf7f 100755 --- a/release/amd64/make-memstick.sh +++ b/release/amd64/make-memstick.sh @@ -32,7 +32,7 @@ if [ -e ${2} ]; then exit 1 fi -echo '/dev/gpt/FreeBSD_Install / ufs rw,noatime 1 1' > ${1}/etc/fstab +echo '/dev/gpt/FreeBSD_Install / ufs ro,noatime 1 1' > ${1}/etc/fstab rm -f ${tempfile} makefs -B little ${tempfile} ${1} if [ $? -ne 0 ]; then diff --git a/release/i386/make-memstick.sh b/release/i386/make-memstick.sh index 42f56f74f2a..f26b79dbf7f 100755 --- a/release/i386/make-memstick.sh +++ b/release/i386/make-memstick.sh @@ -32,7 +32,7 @@ if [ -e ${2} ]; then exit 1 fi -echo '/dev/gpt/FreeBSD_Install / ufs rw,noatime 1 1' > ${1}/etc/fstab +echo '/dev/gpt/FreeBSD_Install / ufs ro,noatime 1 1' > ${1}/etc/fstab rm -f ${tempfile} makefs -B little ${tempfile} ${1} if [ $? -ne 0 ]; then diff --git a/release/powerpc/make-memstick.sh b/release/powerpc/make-memstick.sh index 27c54f41e18..2277af072fc 100755 --- a/release/powerpc/make-memstick.sh +++ b/release/powerpc/make-memstick.sh @@ -32,7 +32,7 @@ if [ -e ${2} ]; then exit 1 fi -echo '/dev/da0s3 / ufs rw,noatime 1 1' > ${1}/etc/fstab +echo '/dev/da0s3 / ufs ro,noatime 1 1' > ${1}/etc/fstab rm -f ${tempfile} makefs -B big ${tempfile} ${1} if [ $? -ne 0 ]; then From 02d9c7407f5c2c9341a68ec10e63d5e365033504 Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Sat, 30 Jul 2011 00:52:13 +0000 Subject: [PATCH 066/452] Fix an error that could cause sysctl -a to enter an infinite loop in the event of a broken or busy fan due to returning incorrect error codes from the FCU sysctl handler. Reported by: Path Mather 1 Approved by: re (kib) --- sys/powerpc/powermac/fcu.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sys/powerpc/powermac/fcu.c b/sys/powerpc/powermac/fcu.c index eb43ff23e1b..cf5b4662a60 100644 --- a/sys/powerpc/powermac/fcu.c +++ b/sys/powerpc/powermac/fcu.c @@ -282,14 +282,14 @@ fcu_fan_set_rpm(struct fcu_fan *fan, int rpm) fan->setpoint = rpm; } else { device_printf(fan->dev, "Unknown fan type: %d\n", fan->type); - return (-1); + return (ENXIO); } buf[0] = rpm >> (8 - fcu_rpm_shift); buf[1] = rpm << fcu_rpm_shift; if (fcu_write(sc->sc_dev, sc->sc_addr, reg, buf, 2) < 0) - return (-1); + return (EIO); return (0); } @@ -377,7 +377,7 @@ fcu_fan_set_pwm(struct fcu_fan *fan, int pwm) buf[0] = (pwm * 2550) / 1000; if (fcu_write(sc->sc_dev, sc->sc_addr, reg, buf, 1) < 0) - return (-1); + return (EIO); return (0); } @@ -536,12 +536,12 @@ fcu_fanrpm_sysctl(SYSCTL_HANDLER_ARGS) if (fan->type == FCU_FAN_RPM) { rpm = fcu_fan_get_rpm(fan); if (rpm < 0) - return (-1); + return (EIO); error = sysctl_handle_int(oidp, &rpm, 0, req); } else { error = fcu_fan_get_pwm(fcu, fan, &pwm, &rpm); if (error < 0) - return (-1); + return (EIO); switch (arg2 & 0xff00) { case FCU_PWM_SYSCTL_PWM: @@ -552,7 +552,7 @@ fcu_fanrpm_sysctl(SYSCTL_HANDLER_ARGS) break; default: /* This should never happen */ - error = -1; + return (EINVAL); }; } From caa19d50d13f2189f399f4bcff8163753fb7ea9d Mon Sep 17 00:00:00 2001 From: Pyun YongHyeon Date: Sat, 30 Jul 2011 01:06:12 +0000 Subject: [PATCH 067/452] Add new device id of D-Link DGE-530T Rev. C controller. DGE-503T Rev A1 and B1 is supported by sk(4) but the DGE-530T Rev. C controller is re-branded RealTek 8169 controller. PR: kern/159116 Approved by: re (kib) --- sys/dev/re/if_re.c | 2 ++ sys/pci/if_rlreg.h | 1 + 2 files changed, 3 insertions(+) diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c index 37dd62fa617..3c45cc97d9c 100644 --- a/sys/dev/re/if_re.c +++ b/sys/dev/re/if_re.c @@ -174,6 +174,8 @@ TUNABLE_INT("hw.re.prefer_iomap", &prefer_iomap); static struct rl_type re_devs[] = { { DLINK_VENDORID, DLINK_DEVICEID_528T, 0, "D-Link DGE-528(T) Gigabit Ethernet Adapter" }, + { DLINK_VENDORID, DLINK_DEVICEID_530T_REVC, 0, + "D-Link DGE-530(T) Gigabit Ethernet Adapter" }, { RT_VENDORID, RT_DEVICEID_8139, 0, "RealTek 8139C+ 10/100BaseTX" }, { RT_VENDORID, RT_DEVICEID_8101E, 0, diff --git a/sys/pci/if_rlreg.h b/sys/pci/if_rlreg.h index 6ecba714955..3a9da2e4d41 100644 --- a/sys/pci/if_rlreg.h +++ b/sys/pci/if_rlreg.h @@ -1042,6 +1042,7 @@ struct rl_softc { * D-Link DFE-5280T device ID */ #define DLINK_DEVICEID_528T 0x4300 +#define DLINK_DEVICEID_530T_REVC 0x4302 /* * D-Link DFE-690TXD device ID From 827660cf9aa2701da6a31c8704ef31ed591f5d49 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sat, 30 Jul 2011 13:18:48 +0000 Subject: [PATCH 068/452] Fix the AR9280 initial AGC calibration code. It looks like this was mixed up with the AR9285 calibration code. This code is now more in line with what Linux ath9k and Atheros reference drivers do. Obtained from: Atheros Approved by: re (kib) --- sys/dev/ath/ath_hal/ar5416/ar5416_cal.c | 45 ++++++++++++------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c b/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c index 1356c7d1081..af7b732183f 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c @@ -186,36 +186,22 @@ ar5416RunInitCals(struct ath_hal *ah, int init_cal_count) } #endif + +/* + * AGC calibration for the AR5416, AR9130, AR9160, AR9280. + */ HAL_BOOL ar5416InitCalHardware(struct ath_hal *ah, const struct ieee80211_channel *chan) { + if (AR_SREV_MERLIN_10_OR_LATER(ah)) { + /* Disable ADC */ + OS_REG_CLR_BIT(ah, AR_PHY_ADC_CTL, + AR_PHY_ADC_CTL_OFF_PWDADC); + /* Enable Rx Filter Cal */ - OS_REG_CLR_BIT(ah, AR_PHY_ADC_CTL, AR_PHY_ADC_CTL_OFF_PWDADC); OS_REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_FLTR_CAL); - - /* Clear the carrier leak cal bit */ - OS_REG_CLR_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_CL_CAL_ENABLE); - - /* kick off the cal */ - OS_REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL); - - /* Poll for offset calibration complete */ - if (!ath_hal_wait(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL, 0)) { - HALDEBUG(ah, HAL_DEBUG_ANY, - "%s: offset calibration failed to complete in 1ms; " - "noisy environment?\n", __func__); - return AH_FALSE; - } - - /* Set the cl cal bit and rerun the cal a 2nd time */ - /* Enable Rx Filter Cal */ - OS_REG_CLR_BIT(ah, AR_PHY_ADC_CTL, AR_PHY_ADC_CTL_OFF_PWDADC); - OS_REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, - AR_PHY_AGC_CONTROL_FLTR_CAL); - - OS_REG_SET_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_CL_CAL_ENABLE); } /* Calibrate the AGC */ @@ -229,6 +215,16 @@ ar5416InitCalHardware(struct ath_hal *ah, const struct ieee80211_channel *chan) return AH_FALSE; } + if (AR_SREV_MERLIN_10_OR_LATER(ah)) { + /* Enable ADC */ + OS_REG_SET_BIT(ah, AR_PHY_ADC_CTL, + AR_PHY_ADC_CTL_OFF_PWDADC); + + /* Disable Rx Filter Cal */ + OS_REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, + AR_PHY_AGC_CONTROL_FLTR_CAL); + } + return AH_TRUE; } @@ -247,7 +243,8 @@ ar5416InitCal(struct ath_hal *ah, const struct ieee80211_channel *chan) /* Do initial chipset-specific calibration */ if (! AH5416(ah)->ah_cal_initcal(ah, chan)) { - HALDEBUG(ah, HAL_DEBUG_ANY, "%s: initial chipset calibration did " + HALDEBUG(ah, HAL_DEBUG_ANY, + "%s: initial chipset calibration did " "not complete in time; noisy environment?\n", __func__); return AH_FALSE; } From c86c3aa3d989e26dd7f07bef51bec950e95a7727 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sat, 30 Jul 2011 13:21:33 +0000 Subject: [PATCH 069/452] I noticed that the Merlin NICs I had (AR9220, AR9280) never completed the ADC calibrations if the NIC is in 5ghz 11a or 5ghz HT/20 modes. I've been told that the dual-ADC is only engaged in turbo/40mhz modes. Since Sowl (AR9160) seems to return valid-looking calibration data in 5ghz 20MHz modes, I'm only disabling it for Merlin for now. It may turn out I can disable it for all chipsets and only enable it for 40MHz modes. Approved by: re (kib) --- sys/dev/ath/ath_hal/ar5416/ar5416_cal.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c b/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c index af7b732183f..e0ebda1748f 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c @@ -73,8 +73,15 @@ ar5416IsCalSupp(struct ath_hal *ah, const struct ieee80211_channel *chan, case ADC_GAIN_CAL: case ADC_DC_CAL: /* Run ADC Gain Cal for either 5ghz any or 2ghz HT40 */ - if (IEEE80211_IS_CHAN_5GHZ(chan)) - return AH_TRUE; + /* + * Merlin (AR9280) doesn't ever complete ADC calibrations + * in 5ghz non-HT40 mode (ie, HT20, 11a). For now, disable + * it for Merlin only until further information is + * available. + */ + if (! AR_SREV_MERLIN(ah)) + if (IEEE80211_IS_CHAN_5GHZ(chan)) + return AH_TRUE; if (IEEE80211_IS_CHAN_HT40(chan)) return AH_TRUE; return AH_FALSE; From 1bee2ec756f2ea5255f9f68dd58c1ceae1a2f56c Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Sat, 30 Jul 2011 13:22:44 +0000 Subject: [PATCH 070/452] MFprojects/hid: - Fix usbhidctl and usbhidaction to handle HID devices with multiple report ids, such as multimedia keyboards. - Add collection type and report id to the `usbhidctl -r` output. They are important for proper device understanding and debugging. - Fix usbhidaction tool to properly handle items having report_count more then 1. Approved by: re (kib) MFC after: 2 weeks --- lib/libusbhid/parse.c | 12 ++++--- usr.bin/usbhidaction/usbhidaction.c | 28 ++++++++++++--- usr.bin/usbhidctl/usbhid.c | 54 +++++++++++++++++++++-------- 3 files changed, 69 insertions(+), 25 deletions(-) diff --git a/lib/libusbhid/parse.c b/lib/libusbhid/parse.c index ce034b191a6..d2b49d40cc9 100644 --- a/lib/libusbhid/parse.c +++ b/lib/libusbhid/parse.c @@ -322,6 +322,8 @@ hid_get_item(hid_data_t s, hid_item_t *h) * one and one item: */ c->report_count = 1; + c->usage_minimum = 0; + c->usage_maximum = 0; } else { s->ncount = 1; } @@ -512,13 +514,14 @@ hid_report_size(report_desc_t r, enum hid_kind k, int id) uint32_t temp; uint32_t hpos; uint32_t lpos; + int report_id = 0; hpos = 0; lpos = 0xFFFFFFFF; memset(&h, 0, sizeof h); for (d = hid_start_parse(r, 1 << k, id); hid_get_item(d, &h); ) { - if (h.report_ID == id && h.kind == k) { + if ((h.report_ID == id || id < 0) && h.kind == k) { /* compute minimum */ if (lpos > h.pos) lpos = h.pos; @@ -527,6 +530,8 @@ hid_report_size(report_desc_t r, enum hid_kind k, int id) /* compute maximum */ if (hpos < temp) hpos = temp; + if (h.report_ID != 0) + report_id = 1; } } hid_end_parse(d); @@ -537,11 +542,8 @@ hid_report_size(report_desc_t r, enum hid_kind k, int id) else temp = hpos - lpos; - if (id) - temp += 8; - /* return length in bytes rounded up */ - return ((temp + 7) / 8); + return ((temp + 7) / 8 + report_id); } int diff --git a/usr.bin/usbhidaction/usbhidaction.c b/usr.bin/usbhidaction/usbhidaction.c index 142e3cc8a3a..c71a8fe7cec 100644 --- a/usr.bin/usbhidaction/usbhidaction.c +++ b/usr.bin/usbhidaction/usbhidaction.c @@ -92,12 +92,12 @@ main(int argc, char **argv) char buf[100]; char devnamebuf[PATH_MAX]; struct command *cmd; - int reportid; + int reportid = -1; demon = 1; ignore = 0; dieearly = 0; - while ((ch = getopt(argc, argv, "c:def:ip:t:v")) != -1) { + while ((ch = getopt(argc, argv, "c:def:ip:r:t:v")) != -1) { switch(ch) { case 'c': conf = optarg; @@ -117,6 +117,9 @@ main(int argc, char **argv) case 'p': pidfile = optarg; break; + case 'r': + reportid = atoi(optarg); + break; case 't': table = optarg; break; @@ -146,14 +149,13 @@ main(int argc, char **argv) fd = open(dev, O_RDWR); if (fd < 0) err(1, "%s", dev); - reportid = hid_get_report_id(fd); repd = hid_get_report_desc(fd); if (repd == NULL) err(1, "hid_get_report_desc() failed"); commands = parse_conf(conf, repd, reportid, ignore); - sz = (size_t)hid_report_size(repd, hid_input, reportid); + sz = (size_t)hid_report_size(repd, hid_input, -1); if (verbose) printf("report size %zu\n", sz); @@ -198,7 +200,23 @@ main(int argc, char **argv) } #endif for (cmd = commands; cmd; cmd = cmd->next) { - val = hid_get_data(buf, &cmd->item); + if (cmd->item.report_ID != 0 && + buf[0] != cmd->item.report_ID) + continue; + if (cmd->item.flags & HIO_VARIABLE) + val = hid_get_data(buf, &cmd->item); + else { + uint32_t pos = cmd->item.pos; + for (i = 0; i < cmd->item.report_count; i++) { + val = hid_get_data(buf, &cmd->item); + if (val == cmd->value) + break; + cmd->item.pos += cmd->item.report_size; + } + cmd->item.pos = pos; + val = (i < cmd->item.report_count) ? + cmd->value : -1; + } if (cmd->value != val && cmd->anyvalue == 0) goto next; if ((cmd->debounce == 0) || diff --git a/usr.bin/usbhidctl/usbhid.c b/usr.bin/usbhidctl/usbhid.c index 2ac947d2a5f..281078d3de2 100644 --- a/usr.bin/usbhidctl/usbhid.c +++ b/usr.bin/usbhidctl/usbhid.c @@ -46,7 +46,6 @@ int verbose = 0; int all = 0; int noname = 0; int hexdump = 0; -static int reportid; char **names; int nnames; @@ -101,11 +100,12 @@ dumpitem(const char *label, struct hid_item *h) { if ((h->flags & HIO_CONST) && !verbose) return; - printf("%s size=%d count=%d page=%s usage=%s%s", label, - h->report_size, h->report_count, + printf("%s rid=%d size=%d count=%d page=%s usage=%s%s%s", label, + h->report_ID, h->report_size, h->report_count, hid_usage_page(HID_PAGE(h->usage)), hid_usage_in_page(h->usage), - h->flags & HIO_CONST ? " Const" : ""); + h->flags & HIO_CONST ? " Const" : "", + h->flags & HIO_VARIABLE ? "" : " Array"); printf(", logical range %d..%d", h->logical_minimum, h->logical_maximum); if (h->physical_minimum != h->physical_maximum) @@ -116,6 +116,24 @@ dumpitem(const char *label, struct hid_item *h) printf("\n"); } +static const char * +hid_collection_type(int32_t type) +{ + static char num[8]; + + switch (type) { + case 0: return ("Physical"); + case 1: return ("Application"); + case 2: return ("Logical"); + case 3: return ("Report"); + case 4: return ("Named_Array"); + case 5: return ("Usage_Switch"); + case 6: return ("Usage_Modifier"); + } + snprintf(num, sizeof(num), "0x%02x", type); + return (num); +} + void dumpitems(report_desc_t r) { @@ -123,10 +141,11 @@ dumpitems(report_desc_t r) struct hid_item h; int size; - for (d = hid_start_parse(r, ~0, reportid); hid_get_item(d, &h); ) { + for (d = hid_start_parse(r, ~0, -1); hid_get_item(d, &h); ) { switch (h.kind) { case hid_collection: - printf("Collection page=%s usage=%s\n", + printf("Collection type=%s page=%s usage=%s\n", + hid_collection_type(h.collection), hid_usage_page(HID_PAGE(h.usage)), hid_usage_in_page(h.usage)); break; @@ -145,13 +164,13 @@ dumpitems(report_desc_t r) } } hid_end_parse(d); - size = hid_report_size(r, hid_input, 0); + size = hid_report_size(r, hid_input, -1); printf("Total input size %d bytes\n", size); - size = hid_report_size(r, hid_output, 0); + size = hid_report_size(r, hid_output, -1); printf("Total output size %d bytes\n", size); - size = hid_report_size(r, hid_feature, 0); + size = hid_report_size(r, hid_feature, -1); printf("Total feature size %d bytes\n", size); } @@ -180,14 +199,17 @@ prdata(u_char *buf, struct hid_item *h) pos = h->pos; for (i = 0; i < h->report_count; i++) { data = hid_get_data(buf, h); + if (i > 0) + printf(" "); if (h->logical_minimum < 0) printf("%d", (int)data); else printf("%u", data); if (hexdump) printf(" [0x%x]", data); - pos += h->report_size; + h->pos += h->report_size; } + h->pos = pos; } void @@ -202,7 +224,7 @@ dumpdata(int f, report_desc_t rd, int loop) char namebuf[10000], *namep; hids = 0; - for (d = hid_start_parse(rd, 1<next) { + if (n->report_ID != 0 && dbuf[0] != n->report_ID) + continue; namep = namebuf; namep += sprintf(namep, "%s:%s.", hid_usage_page(HID_PAGE(n->collection)), @@ -242,7 +266,7 @@ dumpdata(int f, report_desc_t rd, int loop) if (all || gotname(namebuf)) { if (!noname) printf("%s=", namebuf); - prdata(dbuf + (reportid != 0), n); + prdata(dbuf, n); printf("\n"); } } From f1ef788d6f5a94ca2abb84b59fbf9a09a3a38d8e Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sat, 30 Jul 2011 13:25:11 +0000 Subject: [PATCH 071/452] Bring over AR5416 specific RX filter get/set routines. This in particular fixes radar PHY handling - on the AR5212 NIC, one enables the AR_PHY_ERR_RADAR bit in AR_PHY_ERR; the AR5416 and later also needs a bit set in AR_RX_FILTER. A follow-up commit is needed to convert the AR5416 ANI code to use this particular method, as it's currently using the AR5212 methods directly. Obtained from: Atheros Approved by: re (kib) --- sys/dev/ath/ath_hal/ar5416/ar5416.h | 2 ++ sys/dev/ath/ath_hal/ar5416/ar5416_attach.c | 2 ++ sys/dev/ath/ath_hal/ar5416/ar5416_recv.c | 40 ++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416.h b/sys/dev/ath/ath_hal/ar5416/ar5416.h index e5294b0634b..5422f700053 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416.h @@ -218,6 +218,8 @@ extern HAL_BOOL ar5416ResetKeyCacheEntry(struct ath_hal *ah, uint16_t entry); extern HAL_BOOL ar5416SetKeyCacheEntry(struct ath_hal *ah, uint16_t entry, const HAL_KEYVAL *k, const uint8_t *mac, int xorKey); +extern uint32_t ar5416GetRxFilter(struct ath_hal *ah); +extern void ar5416SetRxFilter(struct ath_hal *ah, uint32_t bits); extern void ar5416StartPcuReceive(struct ath_hal *ah); extern void ar5416StopPcuReceive(struct ath_hal *ah); extern HAL_BOOL ar5416SetupRxDesc(struct ath_hal *, diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c index 607f97ab481..0f8744f68bd 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c @@ -117,6 +117,8 @@ ar5416InitState(struct ath_hal_5416 *ahp5416, uint16_t devid, HAL_SOFTC sc, ah->ah_resetTxQueue = ar5416ResetTxQueue; /* Receive Functions */ + ah->ah_getRxFilter = ar5416GetRxFilter; + ah->ah_setRxFilter = ar5416SetRxFilter; ah->ah_startPcuReceive = ar5416StartPcuReceive; ah->ah_stopPcuReceive = ar5416StopPcuReceive; ah->ah_setupRxDesc = ar5416SetupRxDesc; diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c b/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c index 8a7f3bae3db..289da427eb4 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c @@ -26,6 +26,46 @@ #include "ar5416/ar5416reg.h" #include "ar5416/ar5416desc.h" +/* + * Get the receive filter. + */ +uint32_t +ar5416GetRxFilter(struct ath_hal *ah) +{ + uint32_t bits = OS_REG_READ(ah, AR_RX_FILTER); + uint32_t phybits = OS_REG_READ(ah, AR_PHY_ERR); + + if (phybits & AR_PHY_ERR_RADAR) + bits |= HAL_RX_FILTER_PHYRADAR; + if (phybits & (AR_PHY_ERR_OFDM_TIMING | AR_PHY_ERR_CCK_TIMING)) + bits |= HAL_RX_FILTER_PHYERR; + return bits; +} + +/* + * Set the receive filter. + */ +void +ar5416SetRxFilter(struct ath_hal *ah, u_int32_t bits) +{ + uint32_t phybits; + + OS_REG_WRITE(ah, AR_RX_FILTER, (bits & 0xffff)); + phybits = 0; + if (bits & HAL_RX_FILTER_PHYRADAR) + phybits |= AR_PHY_ERR_RADAR; + if (bits & HAL_RX_FILTER_PHYERR) + phybits |= AR_PHY_ERR_OFDM_TIMING | AR_PHY_ERR_CCK_TIMING; + OS_REG_WRITE(ah, AR_PHY_ERR, phybits); + if (phybits) { + OS_REG_WRITE(ah, AR_RXCFG, + OS_REG_READ(ah, AR_RXCFG) | AR_RXCFG_ZLFDMA); + } else { + OS_REG_WRITE(ah, AR_RXCFG, + OS_REG_READ(ah, AR_RXCFG) &~ AR_RXCFG_ZLFDMA); + } +} + /* * Start receive at the PCU engine */ From e875139a4fd4128fc43e8edb7d81c2e6a8e4fc7d Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sat, 30 Jul 2011 13:30:24 +0000 Subject: [PATCH 072/452] Fix ANI handling to work correctly when (trying) to receive radar errors. * Teach the AR5212/AR5416 ANI code to use the RX filter methods, rather than calling the RX filter routines directly. * Make HAL_ANI_PRESENT and HAL_ANI_MODE unconditionally available, regardless of whether ah_ani_function is masking it. * (Mostly) fully disable ANI if interference mitigation is disabled. When disabled, the ANI code doesn't touch any ANI/PHY registers, leaving them the default value. This is in line with what the Atheros reference driver does. * Correctly set the ANI parameters during ANI reset, rather than when ANI is enabled. In this way, if ANI is disabled or enabled whilst the NIC is not active (and there's no current channel), bogus parameters or a NULL pointer deference doesn't occur. There's still some lingering issues - notably, the MIB events/interrupts aren't fully disabled, so MIB interrupts still occur. I'll worry about that later. Approved by: re (kib) --- sys/dev/ath/ath_hal/ar5212/ar5212_ani.c | 40 +++++++++--- sys/dev/ath/ath_hal/ar5416/ar5416_ani.c | 83 ++++++++++++++++++------- 2 files changed, 93 insertions(+), 30 deletions(-) diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_ani.c b/sys/dev/ath/ath_hal/ar5212/ar5212_ani.c index c0ebd952c21..b101306a635 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_ani.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_ani.c @@ -222,7 +222,14 @@ ar5212AniControl(struct ath_hal *ah, HAL_ANI_CMD cmd, int param) typedef int TABLE[]; struct ath_hal_5212 *ahp = AH5212(ah); struct ar5212AniState *aniState = ahp->ah_curani; - const struct ar5212AniParams *params = aniState->params; + const struct ar5212AniParams *params = AH_NULL; + + /* + * This function may be called before there's a current + * channel (eg to disable ANI.) + */ + if (aniState != AH_NULL) + params = aniState->params; OS_MARK(ah, AH_MARK_ANI_CONTROL, cmd); @@ -343,8 +350,8 @@ ar5212AniControl(struct ath_hal *ah, HAL_ANI_CMD cmd, int param) ahp->ah_procPhyErr &= ~HAL_ANI_ENA; /* Turn off HW counters if we have them */ ar5212AniDetach(ah); - ar5212SetRxFilter(ah, - ar5212GetRxFilter(ah) &~ HAL_RX_FILTER_PHYERR); + ah->ah_setRxFilter(ah, + ah->ah_getRxFilter(ah) &~ HAL_RX_FILTER_PHYERR); } else { /* normal/auto mode */ /* don't mess with state if already enabled */ if (ahp->ah_procPhyErr & HAL_ANI_ENA) @@ -358,8 +365,8 @@ ar5212AniControl(struct ath_hal *ah, HAL_ANI_CMD cmd, int param) ahp->ah_curani->params: &ahp->ah_aniParams24 /*XXX*/); } else { - ar5212SetRxFilter(ah, - ar5212GetRxFilter(ah) | HAL_RX_FILTER_PHYERR); + ah->ah_setRxFilter(ah, + ah->ah_getRxFilter(ah) | HAL_RX_FILTER_PHYERR); } ahp->ah_procPhyErr |= HAL_ANI_ENA; } @@ -609,8 +616,20 @@ ar5212AniReset(struct ath_hal *ah, const struct ieee80211_channel *chan, /* * Turn off PHY error frame delivery while we futz with settings. */ - rxfilter = ar5212GetRxFilter(ah); - ar5212SetRxFilter(ah, rxfilter &~ HAL_RX_FILTER_PHYERR); + rxfilter = ah->ah_getRxFilter(ah); + ah->ah_setRxFilter(ah, rxfilter &~ HAL_RX_FILTER_PHYERR); + + /* + * If ANI is disabled at this point, don't set the default + * ANI parameter settings - leave the HAL settings there. + * This is (currently) needed for reliable radar detection. + */ + if (! ANI_ENA(ah)) { + HALDEBUG(ah, HAL_DEBUG_ANI, "%s: ANI disabled\n", + __func__); + goto finish; + } + /* * Automatic processing is done only in station mode right now. */ @@ -644,10 +663,15 @@ ar5212AniReset(struct ath_hal *ah, const struct ieee80211_channel *chan, ar5212AniControl(ah, HAL_ANI_FIRSTEP_LEVEL, 0); ichan->privFlags |= CHANNEL_ANI_SETUP; } + /* + * In case the counters haven't yet been setup; set them up. + */ + enableAniMIBCounters(ah, ahp->ah_curani->params); ar5212AniRestart(ah, aniState); +finish: /* restore RX filter mask */ - ar5212SetRxFilter(ah, rxfilter); + ah->ah_setRxFilter(ah, rxfilter); } /* diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c b/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c index e2c8592a13b..5af6b240b6c 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c @@ -156,6 +156,8 @@ ar5416AniAttach(struct ath_hal *ah, const struct ar5212AniParams *params24, /* * Cleanup any ANI state setup. + * + * This doesn't restore registers to their default settings! */ void ar5416AniDetach(struct ath_hal *ah) @@ -173,7 +175,43 @@ ar5416AniControl(struct ath_hal *ah, HAL_ANI_CMD cmd, int param) typedef int TABLE[]; struct ath_hal_5212 *ahp = AH5212(ah); struct ar5212AniState *aniState = ahp->ah_curani; - const struct ar5212AniParams *params = aniState->params; + const struct ar5212AniParams *params = AH_NULL; + + /* + * This function may be called before there's a current + * channel (eg to disable ANI.) + */ + if (aniState != AH_NULL) + params = aniState->params; + + OS_MARK(ah, AH_MARK_ANI_CONTROL, cmd); + + /* These commands can't be disabled */ + if (cmd == HAL_ANI_PRESENT) + return AH_TRUE; + + if (cmd == HAL_ANI_MODE) { + if (param == 0) { + ahp->ah_procPhyErr &= ~HAL_ANI_ENA; + /* Turn off HW counters if we have them */ + ar5416AniDetach(ah); + } else { /* normal/auto mode */ + /* don't mess with state if already enabled */ + if (! (ahp->ah_procPhyErr & HAL_ANI_ENA)) { + /* Enable MIB Counters */ + /* + * XXX use 2.4ghz params if no channel is + * available + */ + enableAniMIBCounters(ah, + ahp->ah_curani != AH_NULL ? + ahp->ah_curani->params: + &ahp->ah_aniParams24); + ahp->ah_procPhyErr |= HAL_ANI_ENA; + } + } + return AH_TRUE; + } /* Check whether the particular function is enabled */ if (((1 << cmd) & AH5416(ah)->ah_ani_function) == 0) { @@ -183,7 +221,6 @@ ar5416AniControl(struct ath_hal *ah, HAL_ANI_CMD cmd, int param) return AH_FALSE; } - OS_MARK(ah, AH_MARK_ANI_CONTROL, cmd); switch (cmd) { case HAL_ANI_NOISE_IMMUNITY_LEVEL: { @@ -317,23 +354,6 @@ ar5416AniControl(struct ath_hal *ah, HAL_ANI_CMD cmd, int param) aniState->spurImmunityLevel = level; break; } - case HAL_ANI_PRESENT: - break; - case HAL_ANI_MODE: - if (param == 0) { - ahp->ah_procPhyErr &= ~HAL_ANI_ENA; - /* Turn off HW counters if we have them */ - ar5416AniDetach(ah); - } else { /* normal/auto mode */ - /* don't mess with state if already enabled */ - if (ahp->ah_procPhyErr & HAL_ANI_ENA) - break; - /* Enable MIB Counters */ - enableAniMIBCounters(ah, ahp->ah_curani != AH_NULL ? - ahp->ah_curani->params: &ahp->ah_aniParams24 /*XXX*/); - ahp->ah_procPhyErr |= HAL_ANI_ENA; - } - break; #ifdef AH_PRIVATE_DIAG case HAL_ANI_PHYERR_RESET: ahp->ah_stats.ast_ani_ofdmerrs = 0; @@ -548,8 +568,21 @@ ar5416AniReset(struct ath_hal *ah, const struct ieee80211_channel *chan, /* * Turn off PHY error frame delivery while we futz with settings. */ - rxfilter = ar5212GetRxFilter(ah); - ar5212SetRxFilter(ah, rxfilter &~ HAL_RX_FILTER_PHYERR); + rxfilter = ah->ah_getRxFilter(ah); + ah->ah_setRxFilter(ah, rxfilter &~ HAL_RX_FILTER_PHYERR); + + /* + * If ANI is disabled at this point, don't set the default + * ANI parameter settings - leave the HAL settings there. + * This is (currently) needed for reliable radar detection. + */ + if (! ANI_ENA(ah)) { + HALDEBUG(ah, HAL_DEBUG_ANI, "%s: ANI disabled\n", + __func__); + goto finish; + } + + /* * Automatic processing is done only in station mode right now. */ @@ -583,10 +616,16 @@ ar5416AniReset(struct ath_hal *ah, const struct ieee80211_channel *chan, ar5416AniControl(ah, HAL_ANI_FIRSTEP_LEVEL, 0); ichan->privFlags |= CHANNEL_ANI_SETUP; } + + /* + * In case the counters haven't yet been setup; set them up. + */ + enableAniMIBCounters(ah, aniState->params); ar5416AniRestart(ah, aniState); +finish: /* restore RX filter mask */ - ar5212SetRxFilter(ah, rxfilter); + ah->ah_setRxFilter(ah, rxfilter); } /* From 78b72aff33a0f97e5883f8e9eede9443fb588c1a Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sat, 30 Jul 2011 13:31:27 +0000 Subject: [PATCH 073/452] Fix the initial calibration sample count when doing ADC calibrations. Obtained from: Atheros Approved by: re (kib) --- sys/dev/ath/ath_hal/ar9002/ar9280_attach.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c index 79c3fb1691f..4f4b8baf2b4 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c @@ -42,14 +42,14 @@ static const HAL_PERCAL_DATA ar9280_iq_cal = { /* single sample */ static const HAL_PERCAL_DATA ar9280_adc_gain_cal = { /* single sample */ .calName = "ADC Gain", .calType = ADC_GAIN_CAL, .calNumSamples = MIN_CAL_SAMPLES, - .calCountMax = PER_MIN_LOG_COUNT, + .calCountMax = PER_MAX_LOG_COUNT, .calCollect = ar5416AdcGainCalCollect, .calPostProc = ar5416AdcGainCalibration }; static const HAL_PERCAL_DATA ar9280_adc_dc_cal = { /* single sample */ .calName = "ADC DC", .calType = ADC_DC_CAL, .calNumSamples = MIN_CAL_SAMPLES, - .calCountMax = PER_MIN_LOG_COUNT, + .calCountMax = PER_MAX_LOG_COUNT, .calCollect = ar5416AdcDcCalCollect, .calPostProc = ar5416AdcDcCalibration }; From 0a5f264d607daa1b5f544f2122ad90434eafb2ea Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 30 Jul 2011 13:33:05 +0000 Subject: [PATCH 074/452] Introduce a tunable to disable the time consuming parts of bootup memtesting, which can easily save seconds to minutes of boot time. The tunable name is kept general to allow reusing the code in alternate frameworks. Requested by: many Discussed on: arch (a while a go) Obtained from: Sandvine Incorporated Reviewed by: sbruno Approved by: re (kib) MFC after: 2 weeks --- sys/amd64/amd64/machdep.c | 13 ++++++++++++- sys/i386/i386/machdep.c | 13 ++++++++++++- sys/pc98/pc98/machdep.c | 13 ++++++++++++- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index f90ad03a591..00aa47247b0 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -1309,7 +1309,7 @@ getmemsize(caddr_t kmdp, u_int64_t first) { int i, physmap_idx, pa_indx, da_indx; vm_paddr_t pa, physmap[PHYSMAP_SIZE]; - u_long physmem_tunable; + u_long physmem_tunable, memtest, tmpul; pt_entry_t *pte; struct bios_smap *smapbase, *smap, *smapend; u_int32_t smapsize; @@ -1371,6 +1371,14 @@ getmemsize(caddr_t kmdp, u_int64_t first) if (TUNABLE_ULONG_FETCH("hw.physmem", &physmem_tunable)) Maxmem = atop(physmem_tunable); + /* + * By default keep the memtest enabled. Use a general name so that + * one could eventually do more with the code than just disable it. + */ + memtest = 1; + if (TUNABLE_ULONG_FETCH("hw.memtest.tests", &tmpul)) + memtest = tmpul; + /* * Don't allow MAXMEM or hw.physmem to extend the amount of memory * in the system. @@ -1433,6 +1441,8 @@ getmemsize(caddr_t kmdp, u_int64_t first) goto do_dump_avail; page_bad = FALSE; + if (memtest == 0) + goto skip_memtest; /* * map page into kernel: valid, read/write,non-cacheable @@ -1470,6 +1480,7 @@ getmemsize(caddr_t kmdp, u_int64_t first) */ *(int *)ptr = tmp; +skip_memtest: /* * Adjust array of valid/good pages. */ diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index 91050c43bee..73e75513768 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -2132,7 +2132,7 @@ static void getmemsize(int first) { int has_smap, off, physmap_idx, pa_indx, da_indx; - u_long physmem_tunable; + u_long physmem_tunable, memtest, tmpul; vm_paddr_t physmap[PHYSMAP_SIZE]; pt_entry_t *pte; quad_t dcons_addr, dcons_size; @@ -2339,6 +2339,14 @@ physmap_done: if (has_smap && Maxmem > atop(physmap[physmap_idx + 1])) Maxmem = atop(physmap[physmap_idx + 1]); + /* + * By default keep the memtest enabled. Use a general name so that + * one could eventually do more with the code than just disable it. + */ + memtest = 1; + if (TUNABLE_ULONG_FETCH("hw.memtest.tests", &tmpul)) + memtest = tmpul; + if (atop(physmap[physmap_idx + 1]) != Maxmem && (boothowto & RB_VERBOSE)) printf("Physical memory use set to %ldK\n", Maxmem * 4); @@ -2402,6 +2410,8 @@ physmap_done: goto do_dump_avail; page_bad = FALSE; + if (memtest == 0) + goto skip_memtest; /* * map page into kernel: valid, read/write,non-cacheable @@ -2439,6 +2449,7 @@ physmap_done: */ *(int *)ptr = tmp; +skip_memtest: /* * Adjust array of valid/good pages. */ diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c index 8bcb618759a..22131a625b8 100644 --- a/sys/pc98/pc98/machdep.c +++ b/sys/pc98/pc98/machdep.c @@ -1855,7 +1855,7 @@ static void getmemsize(int first) { int off, physmap_idx, pa_indx, da_indx; - u_long physmem_tunable; + u_long physmem_tunable, memtest, tmpul; vm_paddr_t physmap[PHYSMAP_SIZE]; pt_entry_t *pte; quad_t dcons_addr, dcons_size; @@ -1915,6 +1915,14 @@ getmemsize(int first) if (TUNABLE_ULONG_FETCH("hw.physmem", &physmem_tunable)) Maxmem = atop(physmem_tunable); + /* + * By default keep the memtest enabled. Use a general name so that + * one could eventually do more with the code than just disable it. + */ + memtest = 1; + if (TUNABLE_ULONG_FETCH("hw.memtest.tests", &tmpul)) + memtest = tmpul; + if (atop(physmap[physmap_idx + 1]) != Maxmem && (boothowto & RB_VERBOSE)) printf("Physical memory use set to %ldK\n", Maxmem * 4); @@ -1991,6 +1999,8 @@ getmemsize(int first) goto do_dump_avail; page_bad = FALSE; + if (memtest == 0) + goto skip_memtest; /* * map page into kernel: valid, read/write,non-cacheable @@ -2028,6 +2038,7 @@ getmemsize(int first) */ *(int *)ptr = tmp; +skip_memtest: /* * Adjust array of valid/good pages. */ From bb40c7e83f852a7e4d457e7d2ebe3c51d253db06 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sat, 30 Jul 2011 13:34:57 +0000 Subject: [PATCH 075/452] Fix AR5416 radar parameter initialisation. * I messed up the order of parameter true/false; oops! * AR_PHY_RADAR_1 was being written at the wrong place, and was writing potential garbage to the hardware. Approved by: re (kib) --- sys/dev/ath/ath_hal/ar5416/ar5416_misc.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c index e44fd9f6bb8..740d61fd49c 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c @@ -670,26 +670,27 @@ ar5416EnableDfs(struct ath_hal *ah, HAL_PHYERR_PARAM *pe) OS_REG_WRITE(ah, AR_PHY_RADAR_0, val | AR_PHY_RADAR_0_ENA); - if (pe->pe_usefir128 == 0) - OS_REG_SET_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_USE_FIR128); - else if (pe->pe_usefir128 == 1) + if (pe->pe_usefir128 == 1) OS_REG_CLR_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_USE_FIR128); + else if (pe->pe_usefir128 == 0) + OS_REG_SET_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_USE_FIR128); - if (pe->pe_enmaxrssi == 0) + if (pe->pe_enmaxrssi == 1) OS_REG_SET_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_MAX_RRSSI); - else if (pe->pe_enmaxrssi == 1) + else if (pe->pe_enmaxrssi == 0) OS_REG_CLR_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_MAX_RRSSI); - if (pe->pe_blockradar == 0) + if (pe->pe_blockradar == 1) OS_REG_SET_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_BLOCK_CHECK); - else if (pe->pe_blockradar == 1) + else if (pe->pe_blockradar == 0) OS_REG_CLR_BIT(ah, AR_PHY_RADAR_1, AR_PHY_RADAR_1_BLOCK_CHECK); if (pe->pe_maxlen != HAL_PHYERR_PARAM_NOVAL) { + val = OS_REG_READ(ah, AR_PHY_RADAR_1); val &= ~AR_PHY_RADAR_1_MAXLEN; val |= SM(pe->pe_maxlen, AR_PHY_RADAR_1_MAXLEN); + OS_REG_WRITE(ah, AR_PHY_RADAR_1, val); } - OS_REG_WRITE(ah, AR_PHY_RADAR_1, val); /* * Enable HT/40 if the upper layer asks; From b649b13f03ce99f1125547730706b875720c159d Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sat, 30 Jul 2011 13:37:38 +0000 Subject: [PATCH 076/452] Prepare for embedded use of the AR9285/AR9287. Calibration/PCI data that's written to flash (rather than EEPROM attached to the NIC) is typically already in host-endian. The existing checks end up swapping 16 bit words incorrectly - the correct solution would be to read the magic value and determine the EEPROM endianness from that. (This is what Linux does.) This doesn't completely enable embedded use of the AR9285/AR9287 - notably, the EEPROM read methods need to be made generic and available to all EEPROM drivers. I'll worry about that later. Approved by: re (kib) --- sys/dev/ath/ath_hal/ah_eeprom_9287.c | 23 +++++++++++++++++------ sys/dev/ath/ath_hal/ah_eeprom_v4k.c | 22 ++++++++++++++++------ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah_eeprom_9287.c b/sys/dev/ath/ath_hal/ah_eeprom_9287.c index 40550939bb6..099fe34b2b1 100644 --- a/sys/dev/ath/ath_hal/ah_eeprom_9287.c +++ b/sys/dev/ath/ath_hal/ah_eeprom_9287.c @@ -298,11 +298,18 @@ ath_hal_9287EepromAttach(struct ath_hal *ah) uint32_t sum; HALASSERT(ee == AH_NULL); - - if (!ath_hal_eepromRead(ah, AR5416_EEPROM_MAGIC_OFFSET, &magic)) { - HALDEBUG(ah, HAL_DEBUG_ANY, - "%s Error reading Eeprom MAGIC\n", __func__); - return HAL_EEREAD; + + /* + * Don't check magic if we're supplied with an EEPROM block, + * typically this is from Howl but it may also be from later + * boards w/ an embedded WMAC. + */ + if (ah->ah_eepromdata == NULL) { + if (!ath_hal_eepromRead(ah, AR5416_EEPROM_MAGIC_OFFSET, &magic)) { + HALDEBUG(ah, HAL_DEBUG_ANY, + "%s Error reading Eeprom MAGIC\n", __func__); + return HAL_EEREAD; + } } HALDEBUG(ah, HAL_DEBUG_ATTACH, "%s Eeprom Magic = 0x%x\n", __func__, magic); @@ -328,7 +335,11 @@ ath_hal_9287EepromAttach(struct ath_hal *ah) } } /* Convert to eeprom native eeprom endian format */ - if (isBigEndian()) { + /* + * XXX this is likely incorrect but will do for now + * XXX to get embedded boards working. + */ + if (ah->ah_eepromdata == NULL && isBigEndian()) { for (w = 0; w < NW(HAL_EEPROM_9287); w++) eep_data[w] = __bswap16(eep_data[w]); } diff --git a/sys/dev/ath/ath_hal/ah_eeprom_v4k.c b/sys/dev/ath/ath_hal/ah_eeprom_v4k.c index 36a6e736f21..348ab607130 100644 --- a/sys/dev/ath/ath_hal/ah_eeprom_v4k.c +++ b/sys/dev/ath/ath_hal/ah_eeprom_v4k.c @@ -288,11 +288,17 @@ ath_hal_v4kEepromAttach(struct ath_hal *ah) uint32_t sum; HALASSERT(ee == AH_NULL); - - if (!ath_hal_eepromRead(ah, AR5416_EEPROM_MAGIC_OFFSET, &magic)) { - HALDEBUG(ah, HAL_DEBUG_ANY, - "%s Error reading Eeprom MAGIC\n", __func__); - return HAL_EEREAD; + /* + * Don't check magic if we're supplied with an EEPROM block, + * typically this is from Howl but it may also be from later + * boards w/ an embedded WMAC. + */ + if (ah->ah_eepromdata == NULL) { + if (!ath_hal_eepromRead(ah, AR5416_EEPROM_MAGIC_OFFSET, &magic)) { + HALDEBUG(ah, HAL_DEBUG_ANY, + "%s Error reading Eeprom MAGIC\n", __func__); + return HAL_EEREAD; + } } HALDEBUG(ah, HAL_DEBUG_ATTACH, "%s Eeprom Magic = 0x%x\n", __func__, magic); @@ -318,7 +324,11 @@ ath_hal_v4kEepromAttach(struct ath_hal *ah) } } /* Convert to eeprom native eeprom endian format */ - if (isBigEndian()) { + /* + * XXX this is likely incorrect but will do for now + * XXX to get embedded boards working. + */ + if (ah->ah_eepromdata == NULL && isBigEndian()) { for (w = 0; w < NW(struct ar5416eeprom_4k); w++) eep_data[w] = __bswap16(eep_data[w]); } From 7239f9f75bf1a529ab3dbf1f5d927acb475d0d5b Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sat, 30 Jul 2011 13:45:12 +0000 Subject: [PATCH 077/452] Introduce the FRAC_5G EEPROM parameter. This seems to indicate whether to program the NIC for fractional 5ghz mode (ie, 5mhz spaced channels, rather than 10 or 20mhz spacing) or not. The default (0) seems to mean "only program fractional mode if needed". A different value (eg 1) seems to always enable fractional 5ghz mode regardless of the frequency. Obtained from: Atheros Approved by: re (kib) --- sys/dev/ath/ath_hal/ah_eeprom.h | 1 + sys/dev/ath/ath_hal/ah_eeprom_v14.c | 6 ++++++ sys/dev/ath/ath_hal/ah_eeprom_v14.h | 5 ++++- sys/dev/ath/ath_hal/ar9002/ar9280.c | 20 +++++++++++++++----- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah_eeprom.h b/sys/dev/ath/ath_hal/ah_eeprom.h index 2ca058982f3..b77fb6427c0 100644 --- a/sys/dev/ath/ath_hal/ah_eeprom.h +++ b/sys/dev/ath/ath_hal/ah_eeprom.h @@ -104,6 +104,7 @@ enum { AR_EEP_PWDCLKIND, /* uint8_t* */ AR_EEP_TEMPSENSE_SLOPE, /* int8_t* */ AR_EEP_TEMPSENSE_SLOPE_PAL_ON, /* int8_t* */ + AR_EEP_FRAC_N_5G, /* uint8_t* */ }; typedef struct { diff --git a/sys/dev/ath/ath_hal/ah_eeprom_v14.c b/sys/dev/ath/ath_hal/ah_eeprom_v14.c index fdddea10605..37e973c1692 100644 --- a/sys/dev/ath/ath_hal/ah_eeprom_v14.c +++ b/sys/dev/ath/ath_hal/ah_eeprom_v14.c @@ -97,6 +97,12 @@ v14EepromGet(struct ath_hal *ah, int param, void *val) return HAL_OK; } else return HAL_EIO; + case AR_EEP_FRAC_N_5G: + if (IS_VERS(>=, AR5416_EEP_MINOR_VER_22)) { + *(uint8_t *) val = pBase->frac_n_5g; + } else + *(uint8_t *) val = 0; + return HAL_OK; case AR_EEP_AMODE: HALASSERT(val == AH_NULL); return pBase->opCapFlags & AR5416_OPFLAGS_11A ? diff --git a/sys/dev/ath/ath_hal/ah_eeprom_v14.h b/sys/dev/ath/ath_hal/ah_eeprom_v14.h index 6061b2f85d3..7b2c898ce6e 100644 --- a/sys/dev/ath/ath_hal/ah_eeprom_v14.h +++ b/sys/dev/ath/ath_hal/ah_eeprom_v14.h @@ -187,7 +187,10 @@ typedef struct BaseEepHeader { uint8_t rcChainMask; /* "1" if the card is an HB93 1x2 */ uint8_t desiredScaleCCK; uint8_t pwr_table_offset; - uint8_t frac_n_5g; + uint8_t frac_n_5g; /* + * bit 0: indicates that fracN synth + * mode applies to all 5G channels + */ uint8_t futureBase[21]; } __packed BASE_EEP_HEADER; // 64 B diff --git a/sys/dev/ath/ath_hal/ar9002/ar9280.c b/sys/dev/ath/ath_hal/ar9002/ar9280.c index f1bb4fe3f6b..99fd1d790d2 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9280.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9280.c @@ -76,6 +76,7 @@ ar9280SetChannel(struct ath_hal *ah, const struct ieee80211_channel *chan) uint32_t freq, ndiv, channelSel = 0, channelFrac = 0, reg32 = 0; CHAN_CENTERS centers; uint32_t refDivA = 24; + uint8_t frac_n_5g; OS_MARK(ah, AH_MARK_SETCHANNEL, chan->ic_freq); @@ -85,6 +86,9 @@ ar9280SetChannel(struct ath_hal *ah, const struct ieee80211_channel *chan) reg32 = OS_REG_READ(ah, AR_PHY_SYNTH_CONTROL); reg32 &= 0xc0000000; + if (ath_hal_eepromGet(ah, AR_EEP_FRAC_N_5G, &frac_n_5g) != HAL_OK) + frac_n_5g = 0; + if (freq < 4800) { /* 2 GHz, fractional mode */ uint32_t txctl; @@ -106,11 +110,16 @@ ar9280SetChannel(struct ath_hal *ah, const struct ieee80211_channel *chan) bMode = 0; fracMode = 0; - if ((freq % 20) == 0) { - aModeRefSel = 3; - } else if ((freq % 10) == 0) { - aModeRefSel = 2; - } else { + switch (frac_n_5g) { + case 0: + if ((freq % 20) == 0) { + aModeRefSel = 3; + } else if ((freq % 10) == 0) { + aModeRefSel = 2; + } + if (aModeRefSel) break; + case 1: + default: aModeRefSel = 0; /* Enable 2G (fractional) mode for channels which are 5MHz spaced */ fracMode = 1; @@ -121,6 +130,7 @@ ar9280SetChannel(struct ath_hal *ah, const struct ieee80211_channel *chan) OS_A_REG_RMW_FIELD(ah, AR_AN_SYNTH9, AR_AN_SYNTH9_REFDIVA, refDivA); } + if (!fracMode) { ndiv = (freq * (refDivA >> aModeRefSel))/60; channelSel = ndiv & 0x1ff; From 99271119d37075269e8e025cd86957804c53fc5c Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sat, 30 Jul 2011 13:46:41 +0000 Subject: [PATCH 078/452] Fix incorrect error reporting during the dfs ioctl function. Approved by: re (kib) --- sys/dev/ath/ath_dfs/null/dfs_null.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sys/dev/ath/ath_dfs/null/dfs_null.c b/sys/dev/ath/ath_dfs/null/dfs_null.c index b5c85bf63bb..a3bae914585 100644 --- a/sys/dev/ath/ath_dfs/null/dfs_null.c +++ b/sys/dev/ath/ath_dfs/null/dfs_null.c @@ -189,7 +189,7 @@ ath_ioctl_phyerr(struct ath_softc *sc, struct ath_diag *ad) switch (id) { case DFS_SET_THRESH: if (insize < sizeof(HAL_PHYERR_PARAM)) { - error = -EINVAL; + error = EINVAL; break; } pe = (HAL_PHYERR_PARAM *) indata; @@ -203,12 +203,12 @@ ath_ioctl_phyerr(struct ath_softc *sc, struct ath_diag *ad) memcpy(pe, &peout, sizeof(*pe)); break; default: - error = -EINVAL; + error = EINVAL; } if (outsize < ad->ad_out_size) ad->ad_out_size = outsize; if (outdata && copyout(outdata, ad->ad_out_data, ad->ad_out_size)) - error = -EFAULT; + error = EFAULT; bad: if ((ad->ad_id & ATH_DIAG_IN) && indata != NULL) free(indata, M_TEMP); From 889dffba25274e85d91681018860fd415b017252 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sat, 30 Jul 2011 14:12:37 +0000 Subject: [PATCH 079/452] Fix the devmtx lock leak from make_dev(9) when the old device cloning failed due to invalid or duplicated path being generated. Reviewed by: jh Approved by: re (kensmith) MFC after: 1 week --- sys/kern/kern_conf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index a4d90c78218..8da16d288b3 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -764,7 +764,8 @@ make_dev_credv(int flags, struct cdev **dres, struct cdevsw *devsw, int unit, LIST_REMOVE(dev, si_list); dev_unlock(); devfs_free(dev); - } + } else + dev_unlock(); return (res); } } From 339772b0039724319baf5bbdb3bb70dfd551f3d3 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sat, 30 Jul 2011 14:13:57 +0000 Subject: [PATCH 080/452] Fix a race in the device pager allocation. If another thread won and allocated the device pager for the given handle, then the object fictitious pages list and the object membership in the global object list still need to be initialized. Otherwise, dev_pager_dealloc() will traverse uninitialized pointers. Reported and tested by: pho Reviewed by: jhb Approved by: re (kensmith) MFC after: 1 week --- sys/vm/device_pager.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c index 411482a3cc2..d46d17055b6 100644 --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -147,6 +147,7 @@ dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, object1 = vm_object_allocate(OBJT_DEVICE, pindex); object1->flags |= OBJ_COLORED; object1->pg_color = atop(paddr) - OFF_TO_IDX(off - PAGE_SIZE); + TAILQ_INIT(&object1->un_pager.devp.devp_pglist); mtx_lock(&dev_pager_mtx); object = vm_pager_object_lookup(&dev_pager_object_list, handle); if (object != NULL) { @@ -159,7 +160,6 @@ dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, object = object1; object1 = NULL; object->handle = handle; - TAILQ_INIT(&object->un_pager.devp.devp_pglist); TAILQ_INSERT_TAIL(&dev_pager_object_list, object, pager_object_list); } @@ -169,7 +169,14 @@ dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, } mtx_unlock(&dev_pager_mtx); dev_relthread(dev, ref); - vm_object_deallocate(object1); + if (object1 != NULL) { + object1->handle = object1; + mtx_lock(&dev_pager_mtx); + TAILQ_INSERT_TAIL(&dev_pager_object_list, object1, + pager_object_list); + mtx_unlock(&dev_pager_mtx); + vm_object_deallocate(object1); + } return (object); } From 6cf3367c6d3ffb9f640957ab0ddd50667a0780bb Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sat, 30 Jul 2011 17:27:29 +0000 Subject: [PATCH 081/452] Fix invalid assertion of C++ external static data member declarations as anonymous namespaces are local to the current translation. GCC PR: c++/33094 Reviewed by: uqs Approved by: re (kib) Obtained from: gcc (branches/redhat/gcc-4_1-branch, rev. 129554, GPLv2) MFC after: 1 week --- contrib/gcc/cp/ChangeLog | 6 ++++++ contrib/gcc/cp/decl.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/contrib/gcc/cp/ChangeLog b/contrib/gcc/cp/ChangeLog index 39875472b86..7cd1fb4d7a8 100644 --- a/contrib/gcc/cp/ChangeLog +++ b/contrib/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-09-29 Jason Merrill + + PR c++/33094 + * decl.c (make_rtl_for_nonlocal_decl): It's ok for a member + constant to not have DECL_EXTERNAL if it's file-local. + 2007-08-24 Jakub Jelinek PR c++/31941 diff --git a/contrib/gcc/cp/decl.c b/contrib/gcc/cp/decl.c index b837b145153..4e3c6e9bc4a 100644 --- a/contrib/gcc/cp/decl.c +++ b/contrib/gcc/cp/decl.c @@ -4968,7 +4968,7 @@ make_rtl_for_nonlocal_decl (tree decl, tree init, const char* asmspec) /* An in-class declaration of a static data member should be external; it is only a declaration, and not a definition. */ if (init == NULL_TREE) - gcc_assert (DECL_EXTERNAL (decl)); + gcc_assert (DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl)); } /* We don't create any RTL for local variables. */ From b8596ed3acd5e028f8914d9c72218e2dbfc0bf7d Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sat, 30 Jul 2011 17:40:11 +0000 Subject: [PATCH 082/452] Fix accidential dos-style endings to unix-style line endings from last commit (r224523) to match the version approved by re@ Approved by: re (implicit) --- contrib/gcc/cp/ChangeLog | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/gcc/cp/ChangeLog b/contrib/gcc/cp/ChangeLog index 7cd1fb4d7a8..7629e8b10d9 100644 --- a/contrib/gcc/cp/ChangeLog +++ b/contrib/gcc/cp/ChangeLog @@ -1,9 +1,9 @@ -2007-09-29 Jason Merrill - - PR c++/33094 - * decl.c (make_rtl_for_nonlocal_decl): It's ok for a member - constant to not have DECL_EXTERNAL if it's file-local. - +2007-09-29 Jason Merrill + + PR c++/33094 + * decl.c (make_rtl_for_nonlocal_decl): It's ok for a member + constant to not have DECL_EXTERNAL if it's file-local. + 2007-08-24 Jakub Jelinek PR c++/31941 From 3036062f0c67c890fa5a1eab9ad009298c143108 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sat, 30 Jul 2011 17:44:06 +0000 Subject: [PATCH 083/452] Fix wrong initialization of "cmd" for calling the jail/unjail ioctl. Reviewed by: pjd@, delphij@ Approved by: re (kib) MFC after: 3 days --- cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c index 82f4925bd32..381f5edb1c5 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c @@ -4289,7 +4289,8 @@ zfs_jail(zfs_handle_t *zhp, int jailid, int attach) libzfs_handle_t *hdl = zhp->zfs_hdl; zfs_cmd_t zc = { 0 }; char errbuf[1024]; - int cmd, ret; + unsigned long cmd; + int ret; if (attach) { (void) snprintf(errbuf, sizeof (errbuf), From 4e1407c428ce40f16d07e4f6024b10a141464b3e Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sat, 30 Jul 2011 19:00:31 +0000 Subject: [PATCH 084/452] Fix serious bug in ZIL that can lead to pool corruption in the case of a held dataset during remount. Detailed description is available at: https://www.illumos.org/issues/883 illumos-gate revision: 13380:161b964a0e10 Reviewed by: pjd Approved by: re (kib) Obtained from: Illumos (Bug #883) MFC after: 3 days --- cddl/contrib/opensolaris/cmd/ztest/ztest.c | 35 ++++++++++++++++ .../opensolaris/uts/common/fs/zfs/zil.c | 41 +++++++++++-------- 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/cddl/contrib/opensolaris/cmd/ztest/ztest.c b/cddl/contrib/opensolaris/cmd/ztest/ztest.c index 62c98f40719..d90961e50a8 100644 --- a/cddl/contrib/opensolaris/cmd/ztest/ztest.c +++ b/cddl/contrib/opensolaris/cmd/ztest/ztest.c @@ -205,6 +205,7 @@ typedef struct ztest_od { */ typedef struct ztest_ds { objset_t *zd_os; + rwlock_t zd_zilog_lock; zilog_t *zd_zilog; uint64_t zd_seq; ztest_od_t *zd_od; /* debugging aid */ @@ -238,6 +239,7 @@ ztest_func_t ztest_dmu_commit_callbacks; ztest_func_t ztest_zap; ztest_func_t ztest_zap_parallel; ztest_func_t ztest_zil_commit; +ztest_func_t ztest_zil_remount; ztest_func_t ztest_dmu_read_write_zcopy; ztest_func_t ztest_dmu_objset_create_destroy; ztest_func_t ztest_dmu_prealloc; @@ -273,6 +275,7 @@ ztest_info_t ztest_info[] = { { ztest_zap_parallel, 100, &zopt_always }, { ztest_split_pool, 1, &zopt_always }, { ztest_zil_commit, 1, &zopt_incessant }, + { ztest_zil_remount, 1, &zopt_sometimes }, { ztest_dmu_read_write_zcopy, 1, &zopt_often }, { ztest_dmu_objset_create_destroy, 1, &zopt_often }, { ztest_dsl_prop_get_set, 1, &zopt_often }, @@ -986,6 +989,7 @@ ztest_zd_init(ztest_ds_t *zd, objset_t *os) zd->zd_seq = 0; dmu_objset_name(os, zd->zd_name); + VERIFY(rwlock_init(&zd->zd_zilog_lock, USYNC_THREAD, NULL) == 0); VERIFY(_mutex_init(&zd->zd_dirobj_lock, USYNC_THREAD, NULL) == 0); for (int l = 0; l < ZTEST_OBJECT_LOCKS; l++) @@ -1965,6 +1969,8 @@ ztest_io(ztest_ds_t *zd, uint64_t object, uint64_t offset) if (ztest_random(2) == 0) io_type = ZTEST_IO_WRITE_TAG; + (void) rw_rdlock(&zd->zd_zilog_lock); + switch (io_type) { case ZTEST_IO_WRITE_TAG: @@ -2000,6 +2006,8 @@ ztest_io(ztest_ds_t *zd, uint64_t object, uint64_t offset) break; } + (void) rw_unlock(&zd->zd_zilog_lock); + umem_free(data, blocksize); } @@ -2054,6 +2062,8 @@ ztest_zil_commit(ztest_ds_t *zd, uint64_t id) { zilog_t *zilog = zd->zd_zilog; + (void) rw_rdlock(&zd->zd_zilog_lock); + zil_commit(zilog, ztest_random(ZTEST_OBJECTS)); /* @@ -2065,6 +2075,31 @@ ztest_zil_commit(ztest_ds_t *zd, uint64_t id) ASSERT(zd->zd_seq <= zilog->zl_commit_lr_seq); zd->zd_seq = zilog->zl_commit_lr_seq; mutex_exit(&zilog->zl_lock); + + (void) rw_unlock(&zd->zd_zilog_lock); +} + +/* + * This function is designed to simulate the operations that occur during a + * mount/unmount operation. We hold the dataset across these operations in an + * attempt to expose any implicit assumptions about ZIL management. + */ +/* ARGSUSED */ +void +ztest_zil_remount(ztest_ds_t *zd, uint64_t id) +{ + objset_t *os = zd->zd_os; + + (void) rw_wrlock(&zd->zd_zilog_lock); + + /* zfsvfs_teardown() */ + zil_close(zd->zd_zilog); + + /* zfsvfs_setup() */ + VERIFY(zil_open(os, ztest_get_data) == zd->zd_zilog); + zil_replay(os, zd, ztest_replay_vector); + + (void) rw_unlock(&zd->zd_zilog_lock); } /* diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c index 5c7b22e2a3f..515e613c27b 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011 by Delphix. All rights reserved. */ /* Portions Copyright 2010 Robert Milkowski */ @@ -567,7 +568,7 @@ zil_destroy(zilog_t *zilog, boolean_t keep_first) if (!list_is_empty(&zilog->zl_lwb_list)) { ASSERT(zh->zh_claim_txg == 0); - ASSERT(!keep_first); + VERIFY(!keep_first); while ((lwb = list_head(&zilog->zl_lwb_list)) != NULL) { list_remove(&zilog->zl_lwb_list, lwb); if (lwb->lwb_buf != NULL) @@ -1668,20 +1669,9 @@ zil_alloc(objset_t *os, zil_header_t *zh_phys) void zil_free(zilog_t *zilog) { - lwb_t *head_lwb; - zilog->zl_stop_sync = 1; - /* - * After zil_close() there should only be one lwb with a buffer. - */ - head_lwb = list_head(&zilog->zl_lwb_list); - if (head_lwb) { - ASSERT(head_lwb == list_tail(&zilog->zl_lwb_list)); - list_remove(&zilog->zl_lwb_list, head_lwb); - zio_buf_free(head_lwb->lwb_buf, head_lwb->lwb_sz); - kmem_cache_free(zil_lwb_cache, head_lwb); - } + ASSERT(list_is_empty(&zilog->zl_lwb_list)); list_destroy(&zilog->zl_lwb_list); avl_destroy(&zilog->zl_vdev_tree); @@ -1721,6 +1711,10 @@ zil_open(objset_t *os, zil_get_data_t *get_data) { zilog_t *zilog = dmu_objset_zil(os); + ASSERT(zilog->zl_clean_taskq == NULL); + ASSERT(zilog->zl_get_data == NULL); + ASSERT(list_is_empty(&zilog->zl_lwb_list)); + zilog->zl_get_data = get_data; zilog->zl_clean_taskq = taskq_create("zil_clean", 1, minclsyspri, 2, 2, TASKQ_PREPOPULATE); @@ -1734,7 +1728,7 @@ zil_open(objset_t *os, zil_get_data_t *get_data) void zil_close(zilog_t *zilog) { - lwb_t *tail_lwb; + lwb_t *lwb; uint64_t txg = 0; zil_commit(zilog, 0); /* commit all itx */ @@ -1746,9 +1740,9 @@ zil_close(zilog_t *zilog) * destroy the zl_clean_taskq. */ mutex_enter(&zilog->zl_lock); - tail_lwb = list_tail(&zilog->zl_lwb_list); - if (tail_lwb != NULL) - txg = tail_lwb->lwb_max_txg; + lwb = list_tail(&zilog->zl_lwb_list); + if (lwb != NULL) + txg = lwb->lwb_max_txg; mutex_exit(&zilog->zl_lock); if (txg) txg_wait_synced(zilog->zl_dmu_pool, txg); @@ -1756,6 +1750,19 @@ zil_close(zilog_t *zilog) taskq_destroy(zilog->zl_clean_taskq); zilog->zl_clean_taskq = NULL; zilog->zl_get_data = NULL; + + /* + * We should have only one LWB left on the list; remove it now. + */ + mutex_enter(&zilog->zl_lock); + lwb = list_head(&zilog->zl_lwb_list); + if (lwb != NULL) { + ASSERT(lwb == list_tail(&zilog->zl_lwb_list)); + list_remove(&zilog->zl_lwb_list, lwb); + zio_buf_free(lwb->lwb_buf, lwb->lwb_sz); + kmem_cache_free(zil_lwb_cache, lwb); + } + mutex_exit(&zilog->zl_lock); } /* From 35edc498539841454c5d73fdf2b4f3fbbd2aa891 Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Sat, 30 Jul 2011 20:29:39 +0000 Subject: [PATCH 085/452] smp_rendezvous: master cpu should wait until all slaves are fully done This is a followup to r222032 and a reimplementation of it. While that revision fixed the race for the smp_rv_waiters[2] exit sentinel, it still left a possibility for a target CPU to access stale or wrong smp_rv_func_arg in smp_rv_teardown_func. To fix this race the slave CPUs signal when they are really fully done with the rendezvous and the master CPU waits until all slaves are done. Diagnosed by: kib Reviewed by: jhb, mlaier, neel Approved by: re (kib) MFC after: 2 weeks --- sys/kern/subr_smp.c | 54 +++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c index d0c5deff04e..87d536c4e56 100644 --- a/sys/kern/subr_smp.c +++ b/sys/kern/subr_smp.c @@ -109,8 +109,7 @@ static void (*volatile smp_rv_setup_func)(void *arg); static void (*volatile smp_rv_action_func)(void *arg); static void (*volatile smp_rv_teardown_func)(void *arg); static void *volatile smp_rv_func_arg; -static volatile int smp_rv_waiters[3]; -static volatile int smp_rv_generation; +static volatile int smp_rv_waiters[4]; /* * Shared mutex to restrict busywaits between smp_rendezvous() and @@ -321,7 +320,6 @@ smp_rendezvous_action(void) void (*local_setup_func)(void*); void (*local_action_func)(void*); void (*local_teardown_func)(void*); - int generation; #ifdef INVARIANTS int owepreempt; #endif @@ -336,7 +334,6 @@ smp_rendezvous_action(void) local_setup_func = smp_rv_setup_func; local_action_func = smp_rv_action_func; local_teardown_func = smp_rv_teardown_func; - generation = smp_rv_generation; /* * Use a nested critical section to prevent any preemptions @@ -382,32 +379,28 @@ smp_rendezvous_action(void) if (local_action_func != NULL) local_action_func(local_func_arg); - /* - * Signal that the main action has been completed. If a - * full exit rendezvous is requested, then all CPUs will - * wait here until all CPUs have finished the main action. - * - * Note that the write by the last CPU to finish the action - * may become visible to different CPUs at different times. - * As a result, the CPU that initiated the rendezvous may - * exit the rendezvous and drop the lock allowing another - * rendezvous to be initiated on the same CPU or a different - * CPU. In that case the exit sentinel may be cleared before - * all CPUs have noticed causing those CPUs to hang forever. - * Workaround this by using a generation count to notice when - * this race occurs and to exit the rendezvous in that case. - */ - MPASS(generation == smp_rv_generation); - atomic_add_int(&smp_rv_waiters[2], 1); if (local_teardown_func != smp_no_rendevous_barrier) { - while (smp_rv_waiters[2] < smp_rv_ncpus && - generation == smp_rv_generation) + /* + * Signal that the main action has been completed. If a + * full exit rendezvous is requested, then all CPUs will + * wait here until all CPUs have finished the main action. + */ + atomic_add_int(&smp_rv_waiters[2], 1); + while (smp_rv_waiters[2] < smp_rv_ncpus) cpu_spinwait(); if (local_teardown_func != NULL) local_teardown_func(local_func_arg); } + /* + * Signal that the rendezvous is fully completed by this CPU. + * This means that no member of smp_rv_* pseudo-structure will be + * accessed by this target CPU after this point; in particular, + * memory pointed by smp_rv_func_arg. + */ + atomic_add_int(&smp_rv_waiters[3], 1); + td->td_critnest--; KASSERT(owepreempt == td->td_owepreempt, ("rendezvous action changed td_owepreempt")); @@ -441,8 +434,6 @@ smp_rendezvous_cpus(cpuset_t map, mtx_lock_spin(&smp_ipi_mtx); - atomic_add_acq_int(&smp_rv_generation, 1); - /* Pass rendezvous parameters via global variables. */ smp_rv_ncpus = ncpus; smp_rv_setup_func = setup_func; @@ -451,6 +442,7 @@ smp_rendezvous_cpus(cpuset_t map, smp_rv_func_arg = arg; smp_rv_waiters[1] = 0; smp_rv_waiters[2] = 0; + smp_rv_waiters[3] = 0; atomic_store_rel_int(&smp_rv_waiters[0], 0); /* @@ -466,13 +458,13 @@ smp_rendezvous_cpus(cpuset_t map, smp_rendezvous_action(); /* - * If the caller did not request an exit barrier to be enforced - * on each CPU, ensure that this CPU waits for all the other - * CPUs to finish the rendezvous. + * Ensure that the master CPU waits for all the other + * CPUs to finish the rendezvous, so that smp_rv_* + * pseudo-structure and the arg are guaranteed to not + * be in use. */ - if (teardown_func == smp_no_rendevous_barrier) - while (atomic_load_acq_int(&smp_rv_waiters[2]) < ncpus) - cpu_spinwait(); + while (atomic_load_acq_int(&smp_rv_waiters[3]) < ncpus) + cpu_spinwait(); mtx_unlock_spin(&smp_ipi_mtx); } From 235cc4c620ca84a405047b98950f7828183cc6a6 Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Sat, 30 Jul 2011 20:42:14 +0000 Subject: [PATCH 086/452] update smp related documentation after recent changes Remove references to machdep.hlt_logical_cpus and machdep.hlt_cpus sysctls and tunables. Document machdep.hyperthreading_allowed and hint.lapic.X.disabled tunables. Prompted by: ru Proofreading: bf Reviewed by: jhb Approved by: re (kib) --- .../doc/en_US.ISO8859-1/hardware/article.sgml | 6 ++---- share/man/man4/smp.4 | 14 ++++++------- tools/tools/sysdoc/tunables.mdoc | 20 ++++--------------- 3 files changed, 13 insertions(+), 27 deletions(-) diff --git a/release/doc/en_US.ISO8859-1/hardware/article.sgml b/release/doc/en_US.ISO8859-1/hardware/article.sgml index 1352086d631..20bfdeaaddd 100644 --- a/release/doc/en_US.ISO8859-1/hardware/article.sgml +++ b/release/doc/en_US.ISO8859-1/hardware/article.sgml @@ -196,10 +196,8 @@ Because this naive scheduling can result in suboptimal performance, under certain circumstances it may be useful to disable the logical processors with the the - machdep.hlt_logical_cpus sysctl variable. - It is also possible to halt any CPU in the idle loop with the - machdep.hlt_cpus sysctl variable. The - &man.smp.4; manual page has more details. + machdep.hyperthreading_allowed tunable. + The &man.smp.4; manual page has more details. &os; will take advantage of Physical Address Extensions (PAE) support on CPUs that support this feature. A kernel diff --git a/share/man/man4/smp.4 b/share/man/man4/smp.4 index 84c01bfeaa2..5d0d983be18 100644 --- a/share/man/man4/smp.4 +++ b/share/man/man4/smp.4 @@ -63,10 +63,10 @@ the read-only sysctl variable .Pp .Fx allows specific CPUs on a multi-processor system to be disabled. -The sysctl variable -.Va machdep.hlt_cpus -is an integer bitmask denoting CPUs to halt, counting from 0. -Setting a bit to 1 will result in the corresponding CPU being +This can be done using the +.Va hint.lapic.X.disabled +tunable, where X is the APIC ID of a CPU. +Setting this tunable to 1 will result in the corresponding CPU being disabled. .Pp The @@ -122,12 +122,12 @@ tasks on CPUs that are closely grouped together. supports hyperthreading on Intel CPU's on the i386 and AMD64 platforms. Since using logical CPUs can cause performance penalties under certain loads, the logical CPUs can be disabled by setting the -.Va machdep.hlt_logical_cpus -sysctl to one. -Note that this operation is different from the mechanism used by the +.Va machdep.hyperthreading_allowed +tunable to zero. .Xr cpuset 1 . .Sh SEE ALSO .Xr mptable 1 , +.Xr loader 8 , .Xr sysctl 8 , .Xr condvar 9 , .Xr msleep 9 , diff --git a/tools/tools/sysdoc/tunables.mdoc b/tools/tools/sysdoc/tunables.mdoc index 429e9dc7888..35ef9c06723 100644 --- a/tools/tools/sysdoc/tunables.mdoc +++ b/tools/tools/sysdoc/tunables.mdoc @@ -1233,24 +1233,12 @@ machdep.disable_mtrrs machdep.guessed_bootdev --- -machdep.hlt_cpus +machdep.hyperthreading_allowed bool -This option will permit the halting -of CPUs. -For instance, to halt CPU 0, -machdep.htl_cpus=1 can be used. -It is possible to halt two CPUs by providing -a comma separated list (i.e: cpu1,cpu2). - ---- -machdep.hlt_logical_cpus -bool - -This keeps the logical CPUs halted in the idle loop. -By default the logical CPUs are halted at startup. -It is also possible to halt any cpu in the idle loop now -using machdep.hlt_cpus. +Setting this tunable to zero disables +the use of additional logical processors +provided by Intel HTT technology. --- machdep.panic_on_nmi From 88e14bfb6ac9fd88b8664c8b208aa8669a596784 Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Sat, 30 Jul 2011 21:09:45 +0000 Subject: [PATCH 087/452] fix a typo/tautology in the release documentation Approved by: re (kib) MFC after: 1 week --- release/doc/en_US.ISO8859-1/hardware/article.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/doc/en_US.ISO8859-1/hardware/article.sgml b/release/doc/en_US.ISO8859-1/hardware/article.sgml index 20bfdeaaddd..cff4007629b 100644 --- a/release/doc/en_US.ISO8859-1/hardware/article.sgml +++ b/release/doc/en_US.ISO8859-1/hardware/article.sgml @@ -195,7 +195,7 @@ resources between logical processors within the same CPU. Because this naive scheduling can result in suboptimal performance, under certain circumstances it may be useful to - disable the logical processors with the the + disable the logical processors with the machdep.hyperthreading_allowed tunable. The &man.smp.4; manual page has more details. From 10a6c3584ae2ac78634847ec75366cfde9d9f6cc Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Sat, 30 Jul 2011 21:42:53 +0000 Subject: [PATCH 088/452] Higher-priority initialization request can eat request scheduling done from adaclose(). Add immediate_priority check into adaschedule() to restore it. Approved by: re (kib) MFC after: 1 week --- sys/cam/ata/ata_da.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c index c0be395cc28..b1d5ea83eb5 100644 --- a/sys/cam/ata/ata_da.c +++ b/sys/cam/ata/ata_da.c @@ -484,12 +484,20 @@ static void adaschedule(struct cam_periph *periph) { struct ada_softc *softc = (struct ada_softc *)periph->softc; + uint32_t prio; + /* Check if cam_periph_getccb() was called. */ + prio = periph->immediate_priority; + + /* Check if we have more work to do. */ if (bioq_first(&softc->bio_queue) || (!softc->trim_running && bioq_first(&softc->trim_queue))) { - /* Have more work to do, so ensure we stay scheduled */ - xpt_schedule(periph, CAM_PRIORITY_NORMAL); + prio = CAM_PRIORITY_NORMAL; } + + /* Schedule CCB if any of above is true. */ + if (prio != CAM_PRIORITY_NONE) + xpt_schedule(periph, prio); } /* From d1907de2bad0da59dffc9f2be8cc32d0dccf3e27 Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Sat, 30 Jul 2011 22:57:38 +0000 Subject: [PATCH 089/452] The new NFS client failed to vput() the new vnode if a setattr failed after the file was created in nfs_create(). This would probably only happen during a forced dismount. The old NFS client does have a vput() for this case. Detected by pho during recent testing, where an open syscall returned with a vnode still locked. Tested by: pho Approved by: re (kib) MFC after: 2 weeks --- sys/fs/nfsclient/nfs_clvnops.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c index a69c76e8e30..7e87b6e71a1 100644 --- a/sys/fs/nfsclient/nfs_clvnops.c +++ b/sys/fs/nfsclient/nfs_clvnops.c @@ -1596,6 +1596,8 @@ again: if (attrflag) (void) nfscl_loadattrcache(&newvp, &nfsva, NULL, NULL, 0, 1); + if (error != 0) + vput(newvp); } } if (!error) { From 89e250512df089947a78429dfc684b160d8dca92 Mon Sep 17 00:00:00 2001 From: Joel Dahl Date: Sat, 30 Jul 2011 23:09:52 +0000 Subject: [PATCH 090/452] Add a better description, a few examples and a couple of minor fixes. Reviewed by: brueffer Approved by: re (kib) --- share/man/man4/pcm.4 | 210 ++++++++++++++++++++++++++++++++----------- 1 file changed, 156 insertions(+), 54 deletions(-) diff --git a/share/man/man4/pcm.4 b/share/man/man4/pcm.4 index 710ec13340c..bb33a6800a5 100644 --- a/share/man/man4/pcm.4 +++ b/share/man/man4/pcm.4 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 13, 2009 +.Dd July 31, 2011 .Dt SOUND 4 .Os .Sh NAME @@ -41,7 +41,121 @@ kernel configuration file: .Bd -ragged -offset indent .Cd "device sound" .Ed +.Sh DESCRIPTION +The +.Nm +driver is the main component of the +.Fx sound system. +It works in conjunction with a bridge device driver on supported devices +and provides PCM audio record and playback once it attaches. +Each bridge device driver supports a specific set of audio chipsets and +needs to be enabled together with the +.Nm +driver. +PCI and ISA PnP audio devices identify themselves so users are usually not +required to add anything to +.Pa /boot/device.hints . .Pp +Some of the main features of the +.Nm +driver are: multichannel audio, per-application +volume control, dynamic mixing through virtual sound channels, true full +duplex operation, bit perfect audio, rate conversion and low latency +modes. +.Pp +The +.Nm +driver is enabled by default, along with several bridge device drivers. +Those not enabled by default can be loaded during runtime with +.Xr kldload 8 +or during boot via +.Xr loader.conf 5 . +The following bridge device drivers are available: +.Pp +.Bl -bullet -compact +.It +.Xr snd_ad1816 4 +.It +.Xr snd_ai2s 4 (enabled by default on powerpc) +.It +.Xr snd_als4000 4 +.It +.Xr snd_atiixp 4 +.It +.Xr snd_audiocs 4 (enabled by default on sparc64) +.It +.Xr snd_cmi 4 +.It +.Xr snd_cs4281 4 +.It +.Xr snd_csa 4 +.It +.Xr snd_davbus 4 (enabled by default on powerpc) +.It +.Xr snd_ds1 4 +.It +.Xr snd_emu10k1 4 +.It +.Xr snd_emu10kx 4 +.It +.Xr snd_envy24 4 +.It +.Xr snd_envy24ht 4 +.It +.Xr snd_es137x 4 (enabled by default on amd64, i386, sparc64) +.It +.Xr snd_ess 4 +.It +.Xr snd_fm801 4 +.It +.Xr snd_gusc 4 +.It +.Xr snd_hda 4 (enabled by default on amd64, i386) +.It +.Xr snd_ich 4 (enabled by default on amd64, i386) +.It +.Xr snd_maestro 4 +.It +.Xr snd_maestro3 4 +.It +.Xr snd_mss 4 +.It +.Xr snd_neomagic 4 +.It +snd_sb16 +.It +snd_sb8 +.It +.Xr snd_sbc 4 +.It +.Xr snd_solo 4 +.It +.Xr snd_spicds 4 +.It +.Xr snd_t4dwave 4 (enabled by default on sparc64) +.It +.Xr snd_uaudio 4 (enabled by default on amd64, i386, powerpc, sparc64) +.It +.Xr snd_via8233 4 (enabled by default on amd64, i386) +.It +.Xr snd_via82c686 4 +.It +.Xr snd_vibes 4 +.El +.Pp +Refer to the manual page for each bridge device driver for driver specific +settings and information. +.Ss Legacy Hardware +For old legacy +.Tn ISA +cards, the driver looks for +.Tn MSS +cards at addresses +.Dv 0x530 +and +.Dv 0x604 . +These values can be overridden in +.Pa /boot/device.hints . Non-PnP sound cards require the following lines in .Xr device.hints 5 : .Bd -literal -offset indent @@ -50,33 +164,6 @@ hint.pcm.0.irq="5" hint.pcm.0.drq="1" hint.pcm.0.flags="0x0" .Ed -.Sh DESCRIPTION -The -.Nm -driver provides support for -.Tn PCM -audio play and capture. -This driver also supports various -.Tn PCI , -.Tn ISA , -.Tn WSS/MSS -compatible -sound cards, AC97 mixer and High Definition Audio. -Once the -.Nm -driver attaches, supported devices provide audio record and -playback channels. -The -.Fx -sound system provides dynamic mixing -.Dq VCHAN -and rate conversion -.Dq soft formats . -True full duplex operation is available on most sound cards. -.Pp -If the sound card is supported by a bridge driver, the -.Nm -driver works in conjunction with the bridge driver. .Pp Apart from the usual parameters, the flags field is used to specify the secondary @@ -85,24 +172,6 @@ channel (generally used for capture in full duplex cards). Flags are set to 0 for cards not using a secondary .Tn DMA channel, or to 0x10 + C to specify channel C. -.Pp -The driver does its best to recognize the installed hardware and drive -it correctly so the user is not required to add several lines in -.Pa /boot/device.hints . -For -.Tn PCI -and -.Tn ISA -.Tn PnP -cards this is actually easy -since they identify themselves. -For legacy -.Tn ISA -cards, the driver looks for -.Tn MSS -cards at addresses 0x530 and 0x604 (unless overridden -in -.Pa /boot/device.hints ) . .Ss Boot Variables In general, the module .Pa snd_foo @@ -119,17 +188,18 @@ utility. Options which can be specified in .Pa /boot/loader.conf include: -.Bl -tag -width ".Va snd_emu10k1_load" -offset indent +.Bl -tag -width ".Va snd_driver_load" -offset indent .It Va snd_driver_load .Pq Dq Li NO If set to .Dq Li YES , this option loads all available drivers. -.It Va snd_emu10k1_load +.It Va snd_hda_load .Pq Dq Li NO If set to .Dq Li YES , -only the SoundBlaster 5.1 driver and dependent modules will be loaded. +only the Intel High Definition Audio bridge device driver and dependent +modules will be loaded. .It Va snd_foo_load .Pq Dq Li NO If set to @@ -155,8 +225,9 @@ This provides a base interface for related multichannel support. Multichannel audio works both with and without .Tn VCHANs . -Most bridge device drivers are still missing multichannel matrixing support -, but in most cases this should be trivial to implement. +.Pp +Most bridge device drivers are still missing multichannel matrixing +support, but in most cases this should be trivial to implement. Use the .Va dev.pcm.%d.[play|rec].vchanformat .Xr sysctl(8) @@ -173,7 +244,7 @@ controls (bass and treble). Commonly used for ear-candy or frequency compensation due to the vast difference in hardware quality. EQ is disabled by default, but can be enabled with the -.Va hint.pcm. Ns Ao Ar X Ac Ns Va .eq +.Va hint.pcm.%d.eq tunable. .Ss VCHANs Each device can optionally support more playback and recording channels @@ -208,13 +279,13 @@ driver. The following tunables can not be changed during runtime using .Xr sysctl 8 . .Bl -tag -width indent -.It Va hint.pcm. Ns Ao Ar X Ac Ns Va .eq +.It Va hint.pcm.%d.eq Set to 1 or 0 to explicitly enable (1) or disable (0) the equalizer. Requires a driver reload if changed. Enabling this will make bass and treble controls appear in mixer applications. This tunable is undefined by default. Equalizing is disabled by default. -.It Va hint.pcm. Ns Ao Ar X Ac Ns Va .vpc +.It Va hint.pcm.%d.vpc Set to 1 or 0 to explicitly enable (1) or disable (0) the .Tn VPC feature. @@ -512,6 +583,9 @@ On devices that have more than one recording source (ie: mic and line), there is a corresponding .Pa /dev/dsp%d.r%d device. +The +.Xr mixer 8 +utility can be used to start and stop recording from an specific device. .Ss Statistics Channel statistics are only kept while the device is open. So with situations involving overruns and underruns, consider the output @@ -586,6 +660,31 @@ For specific sound card access, please instead use .Pa /dev/dsp or .Pa /dev/dsp%d . +.Sh EXAMPLES +Use the sound metadriver to load all +.Nm +bridge device drivers at once +(for example if it is unclear which the correct driver to use is): +.Pp +.Dl kldload snd_driver +.Pp +Load a specific bridge device driver, in this case the Intel +High Definition Audio driver: +.Pp +.Dl kldload snd_hda +.Pp +Check the status of all detected +.Nm +devices: +.Pp +.Dl cat /dev/sndstat +.Pp +Change the default sound device, in this case to the second device. +This is handy if there are multiple +.Nm +devices available: +.Pp +.Dl sysctl hw.snd.default_unit=1 .Sh DIAGNOSTICS .Bl -diag .It pcm%d:play:%d:dsp%d.p%d: play interrupt timeout, channel dead @@ -596,12 +695,14 @@ A device node is not created properly. .El .Sh SEE ALSO .Xr snd_ad1816 4 , +.Xr snd_ai2s 4 , .Xr snd_als4000 4 , .Xr snd_atiixp 4 , .Xr snd_audiocs 4 , .Xr snd_cmi 4 , .Xr snd_cs4281 4 , .Xr snd_csa 4 , +.Xr snd_davbus 4 , .Xr snd_ds1 4 , .Xr snd_emu10k1 4 , .Xr snd_emu10kx 4 , @@ -630,6 +731,7 @@ A device node is not created properly. .Xr loader.conf 5 , .Xr dmesg 8 , .Xr kldload 8 , +.Xr mixer 8 , .Xr sysctl 8 .Rs .%T "Cookbook formulae for audio EQ biquad filter coefficients, by Robert Bristow-Johnson" From cfc3f4678732508085d8ae92e57ce1e1921fb803 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Sun, 31 Jul 2011 03:00:00 +0000 Subject: [PATCH 091/452] Backout r223115 which potentially caused a POLA violation, by restoring historic behavior (create the default base directory in pw.conf) before I came up with a better fix for this. Requested by: nwhitehorn Approved by: re (kib) --- usr.sbin/pw/pw_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.sbin/pw/pw_user.c b/usr.sbin/pw/pw_user.c index b93ca663070..db33746651f 100644 --- a/usr.sbin/pw/pw_user.c +++ b/usr.sbin/pw/pw_user.c @@ -163,7 +163,7 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args) * If we'll need to use it or we're updating it, * then create the base home directory if necessary */ - if ((arg != NULL || getarg(args, 'm') != NULL) && (getarg(args, 'd') == NULL)) { + if (arg != NULL || getarg(args, 'm') != NULL) { int l = strlen(cnf->home); if (l > 1 && cnf->home[l-1] == '/') /* Shave off any trailing path delimiter */ From 38bd7db313319ea40187c2bbc74862e0518aa98d Mon Sep 17 00:00:00 2001 From: Craig Rodrigues Date: Sun, 31 Jul 2011 03:12:20 +0000 Subject: [PATCH 092/452] In the old TFTP server, there was an undocumented behavior where the block counter would rollover to 0 if a file larger than 65535 blocks was transferred. With the default block size of 512 octets per block, this is a file size of approximately 32 megabytes. The new TFTP server code would report an error and stop transferring the file if a file was larger than 65535 blocks. This patch restores the old TFTP server's behavior to the new TFTP server code. If a TFTP client transfers a file larger than 65535 blocks, and does *not* specify the "rollover" option, then automatically rollover the block counter to 0 every time we reach 65535 blocks. This restores interoperability with the FreeBSD 6 TFTP client. Without this change, if a FreeBSD 6 TFTP client tried to retrieve a file larger than 65535 blocks from a FreeBSD 9 TFTP server , the transfer would fail. The same file could be retrieved successfully if the same FreeBSD 6 TFTP client was used against a FreeBSD 6 TFTP server. Approved by: re (kib) Tested by: Pawan Gupta , Obtained from: Juniper Networks --- libexec/tftpd/tftp-transfer.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/libexec/tftpd/tftp-transfer.c b/libexec/tftpd/tftp-transfer.c index fd0e00d9409..d0c8a95665a 100644 --- a/libexec/tftpd/tftp-transfer.c +++ b/libexec/tftpd/tftp-transfer.c @@ -129,14 +129,16 @@ tftp_send(int peer, uint16_t *block, struct tftp_stats *ts) (*block)++; if (oldblock > *block) { if (options[OPT_ROLLOVER].o_request == NULL) { - tftp_log(LOG_ERR, - "Block rollover but not allowed."); - send_error(peer, EBADOP); - gettimeofday(&(ts->tstop), NULL); - return; + /* + * "rollover" option not specified in + * tftp client. Default to rolling block + * counter to 0. + */ + *block = 0; + } else { + *block = atoi(options[OPT_ROLLOVER].o_request); } - *block = atoi(options[OPT_ROLLOVER].o_request); ts->rollovers++; } gettimeofday(&(ts->tstop), NULL); @@ -196,14 +198,16 @@ tftp_receive(int peer, uint16_t *block, struct tftp_stats *ts, (*block)++; if (oldblock > *block) { if (options[OPT_ROLLOVER].o_request == NULL) { - tftp_log(LOG_ERR, - "Block rollover but not allowed."); - send_error(peer, EBADOP); - gettimeofday(&(ts->tstop), NULL); - return; + /* + * "rollover" option not specified in + * tftp client. Default to rolling block + * counter to 0. + */ + *block = 0; + } else { + *block = atoi(options[OPT_ROLLOVER].o_request); } - *block = atoi(options[OPT_ROLLOVER].o_request); ts->rollovers++; } From 46d20cbcf1a953bfc32eb2b5104ec09427bb88f8 Mon Sep 17 00:00:00 2001 From: Craig Rodrigues Date: Sun, 31 Jul 2011 03:18:36 +0000 Subject: [PATCH 093/452] Pull in some wording to the tftpd.8 man page from NetBSD, with some slight changes: ========================================================================================= http://cvsweb.netbsd.org/bsdweb.cgi/src/libexec/tftpd/tftpd.8?only_with_tag=MAIN#rev1.22 Revision 1.22 or diffs], Fri Jan 8 21:05:14 2010 UTC (18 months, 2 weeks ago) by christos Patrick Welche - add -p pathsep option - make wrap to zero work, but produce a warning While here: - fix gcc warnings, in particular variable clobbered warnings (compiling with fewer warnings does not really fix the problem) ========================================================================================= These wording changes clarify the default rollover behavior as a "kludge". Also, the block numbers and octet counts for 65535 blocks and 32767 blocks are more accurate than the existing documented numbers. Requested by: Pawan Gupta Obtained from: Juniper Networks Approved by: re (kib) --- libexec/tftpd/tftpd.8 | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/libexec/tftpd/tftpd.8 b/libexec/tftpd/tftpd.8 index 96bd24cbb6d..7c3da085b77 100644 --- a/libexec/tftpd/tftpd.8 +++ b/libexec/tftpd/tftpd.8 @@ -300,8 +300,15 @@ and .Xr tftp 1 code to support RFC2348. .Sh NOTES -Files larger than 33488896 octets (65535 blocks) cannot be transferred -without client and server supporting the TFTP blocksize option (RFC2348), +Files larger than 33,553,919 octets (65535 blocks, last one <512 +octets) cannot be correctly transferred without client and server +supporting blocksize negotiation (RFCs 2347 and 2348), or the non-standard TFTP rollover option. +As a kludge, +.Nm +accepts a sequence of block number which wrap to zero after 65535, +even if the rollover option is not specified. .Pp -Many tftp clients will not transfer files over 16744448 octets (32767 blocks). +Many tftp clients will not transfer files over 16,776,703 octets +(32767 blocks), as they incorrectly count the block number using +a signed rather than unsigned 16-bit integer. From 6eec7effeb3145c48b6fc99f1ecf4f7549b1cfbf Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sun, 31 Jul 2011 03:33:02 +0000 Subject: [PATCH 094/452] Add some more phyerr bits. Obtained from: Atheros Approved by: re (kib) --- sys/dev/ath/ath_hal/ah_desc.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sys/dev/ath/ath_hal/ah_desc.h b/sys/dev/ath/ath_hal/ah_desc.h index bd3e6a821e9..4651fc2d7cc 100644 --- a/sys/dev/ath/ath_hal/ah_desc.h +++ b/sys/dev/ath/ath_hal/ah_desc.h @@ -158,6 +158,12 @@ enum { HAL_PHYERR_CCK_RATE_ILLEGAL = 27, /* */ HAL_PHYERR_CCK_SERVICE = 30, /* */ HAL_PHYERR_CCK_RESTART = 31, /* */ + HAL_PHYERR_CCK_LENGTH_ILLEGAL = 32, /* */ + HAL_PHYERR_CCK_POWER_DROP = 33, /* */ + /* AR5416 and later */ + HAL_PHYERR_HT_CRC_ERROR = 34, /* */ + HAL_PHYERR_HT_LENGTH_ILLEGAL = 35, /* */ + HAL_PHYERR_HT_RATE_ILLEGAL = 36, /* */ }; /* value found in rs_keyix to mark invalid entries */ From 44ade163cea6b700c75816b7880f62f5b1c7ce3e Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sun, 31 Jul 2011 05:01:42 +0000 Subject: [PATCH 095/452] Add extra flags for the radar event API. (They're not used by any public code at the current time.) Approved by: re (kib) --- sys/dev/ath/ath_hal/ah.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h index cbf9d165137..711ef4a9784 100644 --- a/sys/dev/ath/ath_hal/ah.h +++ b/sys/dev/ath/ath_hal/ah.h @@ -747,6 +747,9 @@ typedef enum { } HAL_QUIET_FLAG; #define HAL_DFS_EVENT_PRICH 0x0000001 +#define HAL_DFS_EVENT_EXTCH 0x0000002 +#define HAL_DFS_EVENT_EXTEARLY 0x0000004 +#define HAL_DFS_EVENT_ISDC 0x0000008 struct dfs_event { uint64_t re_full_ts; /* 64-bit full timestamp from interrupt time */ From ab7aca78ca8385aa6f99fdee558c2be120f82513 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sun, 31 Jul 2011 05:59:33 +0000 Subject: [PATCH 096/452] Fix typo! Approved by: re (kib) --- sys/dev/ath/if_athvar.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index 3bc85226601..6b148c316ca 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -651,7 +651,7 @@ void ath_intr(void *); #define ath_hal_gettxchainmask(_ah, _ptxchainmask) \ (ath_hal_getcapability(_ah, HAL_CAP_TX_CHAINMASK, 0, _ptxchainmask)) #define ath_hal_split4ktrans(_ah) \ - (ath_hal_getcapability(_ah, HAP_CAP_SPLIT_4KB_TRANS, 0, NULL) == HAL_OK) + (ath_hal_getcapability(_ah, HAL_CAP_SPLIT_4KB_TRANS, 0, NULL) == HAL_OK) #define ath_hal_self_linked_final_rxdesc(_ah) \ (ath_hal_getcapability(_ah, HAL_CAP_RXDESC_SELFLINK, 0, NULL) == HAL_OK) #define ath_hal_gtxto_supported(_ah) \ From 45abcd6c9ca8cbe2ac1a44f4023658f50085c971 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sun, 31 Jul 2011 08:01:41 +0000 Subject: [PATCH 097/452] Implement the 4KB split transaction workaround for Merlin (AR9280). The AR9280 apparently has an issue with descriptors which straddle a page boundary (4k). I'm not yet sure whether I should use PAGE_SIZE in the calculations or whether I should use 4096; the reference code uses 4096. This patch fiddles with descriptor allocation so a descriptor entry doesn't straddle a 4kb address boundary. The descriptor memory allocation is made larger to contain extra descriptors and then the descriptor address is advanced to the next 4kb boundary where needed. I've tested this both on Merlin (AR9280) and non-Merlin (in this case, AR9160.) Obtained from: Linux, Atheros Approved by: re (kib) --- sys/dev/ath/if_ath.c | 45 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index ec54079356e..0d1a9046ad4 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -2937,16 +2937,36 @@ ath_descdma_setup(struct ath_softc *sc, { #define DS2PHYS(_dd, _ds) \ ((_dd)->dd_desc_paddr + ((caddr_t)(_ds) - (caddr_t)(_dd)->dd_desc)) +#define ATH_DESC_4KB_BOUND_CHECK(_daddr, _len) \ + ((((u_int32_t)(_daddr) & 0xFFF) > (0x1000 - (_len))) ? 1 : 0) struct ifnet *ifp = sc->sc_ifp; - struct ath_desc *ds; + uint8_t *ds; struct ath_buf *bf; int i, bsize, error; + int desc_len; + + desc_len = sizeof(struct ath_desc); DPRINTF(sc, ATH_DEBUG_RESET, "%s: %s DMA: %u buffers %u desc/buf\n", __func__, name, nbuf, ndesc); dd->dd_name = name; - dd->dd_desc_len = sizeof(struct ath_desc) * nbuf * ndesc; + dd->dd_desc_len = desc_len * nbuf * ndesc; + + device_printf(sc->sc_dev, "desc_len: %d, nbuf=%d, ndesc=%d; dd_desc_len=%d\n", + desc_len, nbuf, ndesc, dd->dd_desc_len); + + /* + * Merlin work-around: + * Descriptors that cross the 4KB boundary can't be used. + * Assume one skipped descriptor per 4KB page. + */ + if (! ath_hal_split4ktrans(sc->sc_ah)) { + int numdescpage = 4096 / (desc_len * ndesc); + dd->dd_desc_len = (nbuf / numdescpage + 1) * 4096; + device_printf(sc->sc_dev, "numdescpage: %d, new dd_desc_len=%d\n", + numdescpage, dd->dd_desc_len); + } /* * Setup DMA descriptor area. @@ -2995,7 +3015,7 @@ ath_descdma_setup(struct ath_softc *sc, goto fail2; } - ds = dd->dd_desc; + ds = (uint8_t *) dd->dd_desc; DPRINTF(sc, ATH_DEBUG_RESET, "%s: %s DMA map: %p (%lu) -> %p (%lu)\n", __func__, dd->dd_name, ds, (u_long) dd->dd_desc_len, (caddr_t) dd->dd_desc_paddr, /*XXX*/ (u_long) dd->dd_desc_len); @@ -3011,9 +3031,23 @@ ath_descdma_setup(struct ath_softc *sc, dd->dd_bufptr = bf; STAILQ_INIT(head); - for (i = 0; i < nbuf; i++, bf++, ds += ndesc) { - bf->bf_desc = ds; + for (i = 0; i < nbuf; i++, bf++, ds += (ndesc * desc_len)) { + bf->bf_desc = (struct ath_desc *) ds; bf->bf_daddr = DS2PHYS(dd, ds); + if (! ath_hal_split4ktrans(sc->sc_ah)) { + /* + * Merlin WAR: Skip descriptor addresses which + * cause 4KB boundary crossing along any point + * in the descriptor. + */ + if (ATH_DESC_4KB_BOUND_CHECK(bf->bf_daddr, + desc_len * ndesc)) { + /* Start at the next page */ + ds += 0x1000 - (bf->bf_daddr & 0xFFF); + bf->bf_desc = (struct ath_desc *) ds; + bf->bf_daddr = DS2PHYS(dd, ds); + } + } error = bus_dmamap_create(sc->sc_dmat, BUS_DMA_NOWAIT, &bf->bf_dmamap); if (error != 0) { @@ -3036,6 +3070,7 @@ fail0: memset(dd, 0, sizeof(*dd)); return error; #undef DS2PHYS +#undef ATH_DESC_4KB_BOUND_CHECK } static void From 4b326fda7249a28ac41e187ddb60b8a273270e61 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sun, 31 Jul 2011 08:13:25 +0000 Subject: [PATCH 098/452] Remove two debugging printf()s which snuck in during the testing of the last commit. Approved by: re (kib) Pointy-hat-to: adrian@ --- sys/dev/ath/if_ath.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index 0d1a9046ad4..41657100ca4 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -2953,9 +2953,6 @@ ath_descdma_setup(struct ath_softc *sc, dd->dd_name = name; dd->dd_desc_len = desc_len * nbuf * ndesc; - device_printf(sc->sc_dev, "desc_len: %d, nbuf=%d, ndesc=%d; dd_desc_len=%d\n", - desc_len, nbuf, ndesc, dd->dd_desc_len); - /* * Merlin work-around: * Descriptors that cross the 4KB boundary can't be used. @@ -2964,8 +2961,6 @@ ath_descdma_setup(struct ath_softc *sc, if (! ath_hal_split4ktrans(sc->sc_ah)) { int numdescpage = 4096 / (desc_len * ndesc); dd->dd_desc_len = (nbuf / numdescpage + 1) * 4096; - device_printf(sc->sc_dev, "numdescpage: %d, new dd_desc_len=%d\n", - numdescpage, dd->dd_desc_len); } /* From 062393fe005fc6fa3c9eee92abc2ea5d02bc0f9e Mon Sep 17 00:00:00 2001 From: Gleb Smirnoff Date: Sun, 31 Jul 2011 13:49:15 +0000 Subject: [PATCH 099/452] Don't leak kld_sx lock in kldunloadf(). Approved by: re (kib) --- sys/kern/kern_linker.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index f91925475b2..4337c953713 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -1116,8 +1116,9 @@ kern_kldunload(struct thread *td, int fileid, int flags) PMC_CALL_HOOK(td, PMC_FN_KLD_UNLOAD, (void *) &pkm); KLD_UNLOCK_READ(); } else -#else KLD_UNLOCK(); +#else + KLD_UNLOCK(); #endif CURVNET_RESTORE(); return (error); From dd3e0d69ff9f9a18d1ea644209404178cd161017 Mon Sep 17 00:00:00 2001 From: Glen Barber Date: Sun, 31 Jul 2011 15:23:21 +0000 Subject: [PATCH 100/452] mdoc(7) fix for the pcm(4) manual Spotted by: manlint Approved by: re (kib) --- share/man/man4/pcm.4 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/man/man4/pcm.4 b/share/man/man4/pcm.4 index bb33a6800a5..2244da4e6b0 100644 --- a/share/man/man4/pcm.4 +++ b/share/man/man4/pcm.4 @@ -45,7 +45,8 @@ kernel configuration file: The .Nm driver is the main component of the -.Fx sound system. +.Fx +sound system. It works in conjunction with a bridge device driver on supported devices and provides PCM audio record and playback once it attaches. Each bridge device driver supports a specific set of audio chipsets and From 73f895fcf6b4790ac4251b6e49cf306374e564d2 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sun, 31 Jul 2011 16:16:25 +0000 Subject: [PATCH 101/452] Disable the RXORN/RXEOL interrupts if RXEOL occurs, preventing an interrupt storm. This is easily triggered by flipping on and off tcpdump -y IEEE802_11_RADIO w/ witness enabled. This causes a whole lot of console IO and when you're attached to a serial console (eg on my AR7161 embedded board), the RX interrupt doesn't get called quickly enough and the RX queue fills up. This wasn't a problem in the past because of the self-linked RX descriptor trick - the RX would never hit the "end" of the RX descriptor list. However this isn't possible for 802.11n (see previous commit history for why.) Both Linux ath9k and the Atheros reference driver code do this; I'm just looking now for where they then restart the PCU receive. Right now the RX will just stop until the interface is reset. Obtained from: Linux, Atheros Approved by: re (kib) --- sys/dev/ath/if_ath.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index 41657100ca4..7655c594976 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -1395,6 +1395,12 @@ ath_intr(void *arg) * least on older hardware revs. */ sc->sc_stats.ast_rxeol++; + /* + * Disable RXEOL/RXORN - prevent an interrupt + * storm until the PCU logic can be reset. + */ + sc->sc_imask &= ~(HAL_INT_RXEOL | HAL_INT_RXORN); + ath_hal_intrset(ah, sc->sc_imask); sc->sc_rxlink = NULL; } if (status & HAL_INT_TXURN) { From 9668a15a6acd7a2603a7cfd3d6b6b426b4993886 Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Sun, 31 Jul 2011 18:26:47 +0000 Subject: [PATCH 102/452] Fix r224187: .word defines a 16-bit object and size_t is defined as a 32-bit intergal. Use .long to define sintrcnt and sintrname. Approved by: re (blanket) --- sys/powerpc/booke/locore.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/powerpc/booke/locore.S b/sys/powerpc/booke/locore.S index 216962d09e3..70a7dcdaae9 100644 --- a/sys/powerpc/booke/locore.S +++ b/sys/powerpc/booke/locore.S @@ -790,12 +790,12 @@ GLOBAL(kernload) GLOBAL(intrnames) .space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 GLOBAL(sintrnames) - .word INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 + .long INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 .align 4 GLOBAL(intrcnt) .space INTRCNT_COUNT * 4 * 2 GLOBAL(sintrcnt) - .word INTRCNT_COUNT * 4 * 2 + .long INTRCNT_COUNT * 4 * 2 #include From f1a8a358465ee074b0482c6c709242151d8a3e9f Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Sun, 31 Jul 2011 18:30:38 +0000 Subject: [PATCH 103/452] Fix r222813: we need to include sys/cpuset.h. because the PIC interface uses cpuset_t. While here, fix the redundant inclusion of sys/bus.h and order the includes. Approved by: re (blanket) --- sys/powerpc/mpc85xx/atpic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/powerpc/mpc85xx/atpic.c b/sys/powerpc/mpc85xx/atpic.c index e1d0b39a681..a792e54491b 100644 --- a/sys/powerpc/mpc85xx/atpic.c +++ b/sys/powerpc/mpc85xx/atpic.c @@ -28,11 +28,11 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include #include #include -#include #include -#include #include #include From 67ad01694a19f7a7171d40662cc693e7cf490b5a Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Sun, 31 Jul 2011 18:34:38 +0000 Subject: [PATCH 104/452] Apply r221124 to Book-E: switch to the new NFS client. Approved by: re (blanket) --- sys/powerpc/conf/MPC85XX | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/powerpc/conf/MPC85XX b/sys/powerpc/conf/MPC85XX index 13decf70268..9964a340fbe 100644 --- a/sys/powerpc/conf/MPC85XX +++ b/sys/powerpc/conf/MPC85XX @@ -43,7 +43,7 @@ options MD_ROOT options MPC85XX options MSDOSFS options NFS_ROOT -options NFSCLIENT +options NFSCL options NFSLOCKD options PROCFS options PSEUDOFS From 6b3dfc6ab0f07d32f9294e78d46407ed605b5be5 Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Sun, 31 Jul 2011 20:06:11 +0000 Subject: [PATCH 105/452] Fix rename in the new NFS server so that it does not require a recursive vnode lock on the directory for the case where the new file name is in the same directory as the old one. The patch handles this as a special case, recognized by the new directory having the same file handle as the old one and just VREF()s the old dir vnode for this case, instead of doing a second VFS_FHTOVP() to get it. This is required so that the server will work for file systems like msdosfs, that do not support recursive vnode locking. This problem was discovered during recent testing by pho@ when exporting an msdosfs file system via the new NFS server. Tested by: pho Reviewed by: zkirsch Approved by: re (kib) MFC after: 2 weeks --- sys/fs/nfsserver/nfs_nfsdserv.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index b6a365d6127..436d44c34d7 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -1425,6 +1425,7 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram, struct nfsrvfh tfh; char *bufp, *tbufp = NULL; u_long *hashp; + fhandle_t fh; if (nd->nd_repstat) { nfsrv_wcc(nd, fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft); @@ -1450,19 +1451,34 @@ nfsrvd_rename(struct nfsrv_descript *nd, int isdgram, tnes = *toexp; tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred, p, 0); } else { + tfh.nfsrvfh_len = 0; error = nfsrv_mtofh(nd, &tfh); + if (error == 0) + error = nfsvno_getfh(dp, &fh, p); if (error) { vput(dp); /* todp is always NULL except NFSv4 */ nfsvno_relpathbuf(&fromnd); goto out; } - nd->nd_cred->cr_uid = nd->nd_saveduid; - nfsd_fhtovp(nd, &tfh, LK_EXCLUSIVE, &tdp, &tnes, NULL, 0, p); - if (tdp) { + + /* If this is the same file handle, just VREF() the vnode. */ + if (tfh.nfsrvfh_len == NFSX_MYFH && + !NFSBCMP(tfh.nfsrvfh_data, &fh, NFSX_MYFH)) { + VREF(dp); + tdp = dp; + tnes = *exp; tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, nd->nd_cred, p, 1); - NFSVOPUNLOCK(tdp, 0); + } else { + nd->nd_cred->cr_uid = nd->nd_saveduid; + nfsd_fhtovp(nd, &tfh, LK_EXCLUSIVE, &tdp, &tnes, NULL, + 0, p); + if (tdp) { + tdirfor_ret = nfsvno_getattr(tdp, &tdirfor, + nd->nd_cred, p, 1); + NFSVOPUNLOCK(tdp, 0); + } } } NFSNAMEICNDSET(&tond.ni_cnd, nd->nd_cred, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART); From fa53ff8858a99d1e54472bd9a7ba38815b2a1e5f Mon Sep 17 00:00:00 2001 From: Glen Barber Date: Sun, 31 Jul 2011 21:04:47 +0000 Subject: [PATCH 106/452] Update vfs_getopt(9) to reflect 32-bit to 64-bit change from r224290. PR: 159324 Submitted by: Brandon Gooch (jamesbrandongooch % gmail ! com) Approved by: re (kib) --- share/man/man9/vfs_getopt.9 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/share/man/man9/vfs_getopt.9 b/share/man/man9/vfs_getopt.9 index 8d8d3b3d7ba..09db47c7929 100644 --- a/share/man/man9/vfs_getopt.9 +++ b/share/man/man9/vfs_getopt.9 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 2, 2009 +.Dd July 31, 2011 .Dt VFS_GETOPT 9 .Os .Sh NAME @@ -51,7 +51,7 @@ .Fn vfs_getops "struct vfsoptlist *opts" "const char *name" "int *error" .Ft int .Fo vfs_flagopt -.Fa "struct vfsoptlist *opts" "const char *name" "u_int *flags" "u_int flag" +.Fa "struct vfsoptlist *opts" "const char *name" "uint64_t *flags" "uint64_t flag" .Fc .Ft int .Fo vfs_scanopt From 83c03ed27d83258cebf3fa276580a105a7c457f9 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Mon, 1 Aug 2011 08:22:40 +0000 Subject: [PATCH 107/452] Correctly link bsdcpio and bsdtar against libmd and libcrpyto by applying the change from r221472 (libarchive). Reviewed by: kientzle Approved by: re (kib) MFC after: 3 days --- usr.bin/cpio/Makefile | 7 +++++-- usr.bin/tar/Makefile | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/usr.bin/cpio/Makefile b/usr.bin/cpio/Makefile index 5868e5236cb..4c2bddb1564 100644 --- a/usr.bin/cpio/Makefile +++ b/usr.bin/cpio/Makefile @@ -19,11 +19,14 @@ CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../../lib/libarchive/libarchive_fe # statically linked, cannot use -lcrypto, and are size sensitive. CFLAGS+= -DSMALLER .endif -DPADD= ${LIBARCHIVE} ${LIBZ} ${LIBBZ2} ${LIBMD} ${LIBLZMA} ${LIBBSDXML} -LDADD= -larchive -lz -lbz2 -lmd -llzma -lbsdxml +DPADD= ${LIBARCHIVE} ${LIBZ} ${LIBBZ2} ${LIBLZMA} ${LIBBSDXML} +LDADD= -larchive -lz -lbz2 -llzma -lbsdxml .if ${MK_OPENSSL} != "no" DPADD+= ${LIBCRYPTO} LDADD+= -lcrypto +.else +DPADD+= ${LIBMD} +LDADD+= -lmd .endif SYMLINKS=bsdcpio ${BINDIR}/cpio diff --git a/usr.bin/tar/Makefile b/usr.bin/tar/Makefile index ef21e4461fc..3cd4ec37099 100644 --- a/usr.bin/tar/Makefile +++ b/usr.bin/tar/Makefile @@ -18,12 +18,16 @@ SRCS+= err.c \ matching.c \ pathmatch.c -DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ} ${LIBMD} ${LIBLZMA} ${LIBBSDXML} -LDADD= -larchive -lbz2 -lz -lmd -llzma -lbsdxml +DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ} ${LIBLZMA} ${LIBBSDXML} +LDADD= -larchive -lbz2 -lz -llzma -lbsdxml .if ${MK_OPENSSL} != "no" DPADD+= ${LIBCRYPTO} LDADD+= -lcrypto +.else +DPADD+= ${LIBMD} +LDADD+= -lmd .endif + CFLAGS+= -DBSDTAR_VERSION_STRING=\"${BSDTAR_VERSION_STRING}\" CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../../lib/libarchive From 4d066e45193575e1a4be55cd930cd612a07d9039 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Mon, 1 Aug 2011 08:52:05 +0000 Subject: [PATCH 108/452] Fix markup. Approved by: re (hrs) --- share/man/man9/taskqueue.9 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/man/man9/taskqueue.9 b/share/man/man9/taskqueue.9 index 9a517e89469..f45a149e189 100644 --- a/share/man/man9/taskqueue.9 +++ b/share/man/man9/taskqueue.9 @@ -188,7 +188,8 @@ The count is cleared, and the old value returned in the reference parameter .Fa pendp , -if it is non- Dv NULL . +if it is non- +.Dv NULL . If the task is currently running, .Dv EBUSY is returned, otherwise 0. From 1882360b9b0fbd7f4ddcd6fb35674ec309b2a738 Mon Sep 17 00:00:00 2001 From: Sergey Kandaurov Date: Mon, 1 Aug 2011 09:43:35 +0000 Subject: [PATCH 109/452] Get rid of MAXCPU knowledge used for internal needs only. Switch to dynamic memory allocation to hold per-CPU memory types data (sized to mp_maxid for UMA, and to mp_maxcpus for malloc to match the kernel). That fixes libmemstat with arbitrary large MAXCPU values and therefore eliminates MEMSTAT_ERROR_TOOMANYCPUS error type. Reviewed by: jhb Approved by: re (kib) --- lib/libmemstat/libmemstat.3 | 6 +----- lib/libmemstat/memstat.c | 14 +++++++----- lib/libmemstat/memstat.h | 7 ------ lib/libmemstat/memstat_internal.h | 13 +++++------ lib/libmemstat/memstat_malloc.c | 36 +++++++++++++------------------ lib/libmemstat/memstat_uma.c | 29 ++++++++----------------- 6 files changed, 41 insertions(+), 64 deletions(-) diff --git a/lib/libmemstat/libmemstat.3 b/lib/libmemstat/libmemstat.3 index c4817ae1258..d7a000c481c 100644 --- a/lib/libmemstat/libmemstat.3 +++ b/lib/libmemstat/libmemstat.3 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 27, 2005 +.Dd July 21, 2011 .Dt LIBMEMSTAT 3 .Os .Sh NAME @@ -412,10 +412,6 @@ values of .Er EACCES or .Er EPERM . -.It Dv MEMSTAT_ERROR_TOOMANYCPUS -Returned if the compile-time limit on the number of CPUs in -.Nm -is lower than the number of CPUs returned by a statistics data source. .It Dv MEMSTAT_ERROR_DATAERROR Returned if .Nm diff --git a/lib/libmemstat/memstat.c b/lib/libmemstat/memstat.c index 1a08d3f4d46..c7957c8b576 100644 --- a/lib/libmemstat/memstat.c +++ b/lib/libmemstat/memstat.c @@ -49,8 +49,6 @@ memstat_strerror(int error) return ("Version mismatch"); case MEMSTAT_ERROR_PERMISSION: return ("Permission denied"); - case MEMSTAT_ERROR_TOOMANYCPUS: - return ("Too many CPUs"); case MEMSTAT_ERROR_DATAERROR: return ("Data format error"); case MEMSTAT_ERROR_KVM: @@ -99,6 +97,8 @@ _memstat_mtl_empty(struct memory_type_list *list) struct memory_type *mtp; while ((mtp = LIST_FIRST(&list->mtl_list))) { + free(mtp->mt_percpu_alloc); + free(mtp->mt_percpu_cache); LIST_REMOVE(mtp, mt_list); free(mtp); } @@ -147,7 +147,7 @@ memstat_mtl_find(struct memory_type_list *list, int allocator, */ struct memory_type * _memstat_mt_allocate(struct memory_type_list *list, int allocator, - const char *name) + const char *name, int maxcpus) { struct memory_type *mtp; @@ -158,6 +158,10 @@ _memstat_mt_allocate(struct memory_type_list *list, int allocator, bzero(mtp, sizeof(*mtp)); mtp->mt_allocator = allocator; + mtp->mt_percpu_alloc = malloc(sizeof(struct mt_percpu_alloc_s) * + maxcpus); + mtp->mt_percpu_cache = malloc(sizeof(struct mt_percpu_cache_s) * + maxcpus); strlcpy(mtp->mt_name, name, MEMTYPE_MAXNAME); LIST_INSERT_HEAD(&list->mtl_list, mtp, mt_list); return (mtp); @@ -171,7 +175,7 @@ _memstat_mt_allocate(struct memory_type_list *list, int allocator, * libmemstat(3) internal function. */ void -_memstat_mt_reset_stats(struct memory_type *mtp) +_memstat_mt_reset_stats(struct memory_type *mtp, int maxcpus) { int i; @@ -193,7 +197,7 @@ _memstat_mt_reset_stats(struct memory_type *mtp) mtp->mt_zonefree = 0; mtp->mt_kegfree = 0; - for (i = 0; i < MEMSTAT_MAXCPU; i++) { + for (i = 0; i < maxcpus; i++) { mtp->mt_percpu_alloc[i].mtp_memalloced = 0; mtp->mt_percpu_alloc[i].mtp_memfreed = 0; mtp->mt_percpu_alloc[i].mtp_numallocs = 0; diff --git a/lib/libmemstat/memstat.h b/lib/libmemstat/memstat.h index e973f1a52db..cca75b32092 100644 --- a/lib/libmemstat/memstat.h +++ b/lib/libmemstat/memstat.h @@ -29,12 +29,6 @@ #ifndef _MEMSTAT_H_ #define _MEMSTAT_H_ -/* - * Number of CPU slots in library-internal data structures. This should be - * at least the value of MAXCPU from param.h. - */ -#define MEMSTAT_MAXCPU 32 - /* * Amount of caller data to maintain for each caller data slot. Applications * must not request more than this number of caller save data, or risk @@ -70,7 +64,6 @@ #define MEMSTAT_ERROR_NOMEMORY 1 /* Out of memory. */ #define MEMSTAT_ERROR_VERSION 2 /* Unsupported version. */ #define MEMSTAT_ERROR_PERMISSION 3 /* Permission denied. */ -#define MEMSTAT_ERROR_TOOMANYCPUS 4 /* Too many CPUs. */ #define MEMSTAT_ERROR_DATAERROR 5 /* Error in stat data. */ #define MEMSTAT_ERROR_KVM 6 /* See kvm_geterr() for err. */ #define MEMSTAT_ERROR_KVM_NOSYMBOL 7 /* Symbol not available. */ diff --git a/lib/libmemstat/memstat_internal.h b/lib/libmemstat/memstat_internal.h index b7fdd7197cf..2416e09b115 100644 --- a/lib/libmemstat/memstat_internal.h +++ b/lib/libmemstat/memstat_internal.h @@ -92,7 +92,7 @@ struct memory_type { * Per-CPU measurements fall into two categories: per-CPU allocation, * and per-CPU cache state. */ - struct { + struct mt_percpu_alloc_s { uint64_t mtp_memalloced;/* Per-CPU mt_memalloced. */ uint64_t mtp_memfreed; /* Per-CPU mt_memfreed. */ uint64_t mtp_numallocs; /* Per-CPU mt_numallocs. */ @@ -100,11 +100,11 @@ struct memory_type { uint64_t mtp_sizemask; /* Per-CPU mt_sizemask. */ void *mtp_caller_pointer[MEMSTAT_MAXCALLER]; uint64_t mtp_caller_uint64[MEMSTAT_MAXCALLER]; - } mt_percpu_alloc[MEMSTAT_MAXCPU]; + } *mt_percpu_alloc; - struct { + struct mt_percpu_cache_s { uint64_t mtp_free; /* Per-CPU cache free items. */ - } mt_percpu_cache[MEMSTAT_MAXCPU]; + } *mt_percpu_cache; LIST_ENTRY(memory_type) mt_list; /* List of types. */ }; @@ -119,7 +119,8 @@ struct memory_type_list { void _memstat_mtl_empty(struct memory_type_list *list); struct memory_type *_memstat_mt_allocate(struct memory_type_list *list, - int allocator, const char *name); -void _memstat_mt_reset_stats(struct memory_type *mtp); + int allocator, const char *name, int maxcpus); +void _memstat_mt_reset_stats(struct memory_type *mtp, + int maxcpus); #endif /* !_MEMSTAT_INTERNAL_H_ */ diff --git a/lib/libmemstat/memstat_malloc.c b/lib/libmemstat/memstat_malloc.c index 28a48c66054..1fd362114eb 100644 --- a/lib/libmemstat/memstat_malloc.c +++ b/lib/libmemstat/memstat_malloc.c @@ -96,11 +96,6 @@ retry: return (-1); } - if (maxcpus > MEMSTAT_MAXCPU) { - list->mtl_error = MEMSTAT_ERROR_TOOMANYCPUS; - return (-1); - } - size = sizeof(count); if (sysctlbyname("kern.malloc_count", &count, &size, NULL, 0) < 0) { if (errno == EACCES || errno == EPERM) @@ -160,12 +155,6 @@ retry: return (-1); } - if (mtshp->mtsh_maxcpus > MEMSTAT_MAXCPU) { - list->mtl_error = MEMSTAT_ERROR_TOOMANYCPUS; - free(buffer); - return (-1); - } - /* * For the remainder of this function, we are quite trusting about * the layout of structures and sizes, since we've determined we have @@ -184,7 +173,7 @@ retry: mtp = NULL; if (mtp == NULL) mtp = _memstat_mt_allocate(list, ALLOCATOR_MALLOC, - mthp->mth_name); + mthp->mth_name, maxcpus); if (mtp == NULL) { _memstat_mtl_empty(list); free(buffer); @@ -195,7 +184,7 @@ retry: /* * Reset the statistics on a current node. */ - _memstat_mt_reset_stats(mtp); + _memstat_mt_reset_stats(mtp, maxcpus); for (j = 0; j < maxcpus; j++) { mtsp = (struct malloc_type_stats *)p; @@ -295,7 +284,7 @@ memstat_kvm_malloc(struct memory_type_list *list, void *kvm_handle) void *kmemstatistics; int hint_dontsearch, j, mp_maxcpus, ret; char name[MEMTYPE_MAXNAME]; - struct malloc_type_stats mts[MEMSTAT_MAXCPU], *mtsp; + struct malloc_type_stats *mts, *mtsp; struct malloc_type_internal *mtip; struct malloc_type type, *typep; kvm_t *kvm; @@ -322,11 +311,6 @@ memstat_kvm_malloc(struct memory_type_list *list, void *kvm_handle) return (-1); } - if (mp_maxcpus > MEMSTAT_MAXCPU) { - list->mtl_error = MEMSTAT_ERROR_TOOMANYCPUS; - return (-1); - } - ret = kread_symbol(kvm, X_KMEMSTATISTICS, &kmemstatistics, sizeof(kmemstatistics), 0); if (ret != 0) { @@ -334,10 +318,17 @@ memstat_kvm_malloc(struct memory_type_list *list, void *kvm_handle) return (-1); } + mts = malloc(sizeof(struct malloc_type_stats) * mp_maxcpus); + if (mts == NULL) { + list->mtl_error = MEMSTAT_ERROR_NOMEMORY; + return (-1); + } + for (typep = kmemstatistics; typep != NULL; typep = type.ks_next) { ret = kread(kvm, typep, &type, sizeof(type), 0); if (ret != 0) { _memstat_mtl_empty(list); + free(mts); list->mtl_error = ret; return (-1); } @@ -345,6 +336,7 @@ memstat_kvm_malloc(struct memory_type_list *list, void *kvm_handle) MEMTYPE_MAXNAME); if (ret != 0) { _memstat_mtl_empty(list); + free(mts); list->mtl_error = ret; return (-1); } @@ -358,6 +350,7 @@ memstat_kvm_malloc(struct memory_type_list *list, void *kvm_handle) sizeof(struct malloc_type_stats), 0); if (ret != 0) { _memstat_mtl_empty(list); + free(mts); list->mtl_error = ret; return (-1); } @@ -368,9 +361,10 @@ memstat_kvm_malloc(struct memory_type_list *list, void *kvm_handle) mtp = NULL; if (mtp == NULL) mtp = _memstat_mt_allocate(list, ALLOCATOR_MALLOC, - name); + name, mp_maxcpus); if (mtp == NULL) { _memstat_mtl_empty(list); + free(mts); list->mtl_error = MEMSTAT_ERROR_NOMEMORY; return (-1); } @@ -379,7 +373,7 @@ memstat_kvm_malloc(struct memory_type_list *list, void *kvm_handle) * This logic is replicated from kern_malloc.c, and should * be kept in sync. */ - _memstat_mt_reset_stats(mtp); + _memstat_mt_reset_stats(mtp, mp_maxcpus); for (j = 0; j < mp_maxcpus; j++) { mtsp = &mts[j]; mtp->mt_memalloced += mtsp->mts_memalloced; diff --git a/lib/libmemstat/memstat_uma.c b/lib/libmemstat/memstat_uma.c index 485a4f27990..58a08cfddbc 100644 --- a/lib/libmemstat/memstat_uma.c +++ b/lib/libmemstat/memstat_uma.c @@ -79,7 +79,7 @@ memstat_sysctl_uma(struct memory_type_list *list, int flags) struct uma_type_header *uthp; struct uma_percpu_stat *upsp; struct memory_type *mtp; - int count, hint_dontsearch, i, j, maxcpus; + int count, hint_dontsearch, i, j, maxcpus, maxid; char *buffer, *p; size_t size; @@ -93,24 +93,19 @@ memstat_sysctl_uma(struct memory_type_list *list, int flags) * from the header. */ retry: - size = sizeof(maxcpus); - if (sysctlbyname("kern.smp.maxcpus", &maxcpus, &size, NULL, 0) < 0) { + size = sizeof(maxid); + if (sysctlbyname("kern.smp.maxid", &maxid, &size, NULL, 0) < 0) { if (errno == EACCES || errno == EPERM) list->mtl_error = MEMSTAT_ERROR_PERMISSION; else list->mtl_error = MEMSTAT_ERROR_DATAERROR; return (-1); } - if (size != sizeof(maxcpus)) { + if (size != sizeof(maxid)) { list->mtl_error = MEMSTAT_ERROR_DATAERROR; return (-1); } - if (maxcpus > MEMSTAT_MAXCPU) { - list->mtl_error = MEMSTAT_ERROR_TOOMANYCPUS; - return (-1); - } - size = sizeof(count); if (sysctlbyname("vm.zone_count", &count, &size, NULL, 0) < 0) { if (errno == EACCES || errno == EPERM) @@ -125,7 +120,7 @@ retry: } size = sizeof(*uthp) + count * (sizeof(*uthp) + sizeof(*upsp) * - maxcpus); + (maxid + 1)); buffer = malloc(size); if (buffer == NULL) { @@ -170,12 +165,6 @@ retry: return (-1); } - if (ushp->ush_maxcpus > MEMSTAT_MAXCPU) { - list->mtl_error = MEMSTAT_ERROR_TOOMANYCPUS; - free(buffer); - return (-1); - } - /* * For the remainder of this function, we are quite trusting about * the layout of structures and sizes, since we've determined we have @@ -194,7 +183,7 @@ retry: mtp = NULL; if (mtp == NULL) mtp = _memstat_mt_allocate(list, ALLOCATOR_UMA, - uthp->uth_name); + uthp->uth_name, maxid + 1); if (mtp == NULL) { _memstat_mtl_empty(list); free(buffer); @@ -205,7 +194,7 @@ retry: /* * Reset the statistics on a current node. */ - _memstat_mt_reset_stats(mtp); + _memstat_mt_reset_stats(mtp, maxid + 1); mtp->mt_numallocs = uthp->uth_allocs; mtp->mt_numfrees = uthp->uth_frees; @@ -398,7 +387,7 @@ memstat_kvm_uma(struct memory_type_list *list, void *kvm_handle) mtp = NULL; if (mtp == NULL) mtp = _memstat_mt_allocate(list, ALLOCATOR_UMA, - name); + name, mp_maxid + 1); if (mtp == NULL) { free(ucp_array); _memstat_mtl_empty(list); @@ -408,7 +397,7 @@ memstat_kvm_uma(struct memory_type_list *list, void *kvm_handle) /* * Reset the statistics on a current node. */ - _memstat_mt_reset_stats(mtp); + _memstat_mt_reset_stats(mtp, mp_maxid + 1); mtp->mt_numallocs = uz.uz_allocs; mtp->mt_numfrees = uz.uz_frees; mtp->mt_failures = uz.uz_fails; From c94a66f8ae4edcb662c4da5bdb5e306ac087d6a9 Mon Sep 17 00:00:00 2001 From: Sergey Kandaurov Date: Mon, 1 Aug 2011 11:24:55 +0000 Subject: [PATCH 110/452] Add missing MODULE_VERSION() definition to protect against duplicating module loads. PR: kern/159345 Reported by: Eugene Grosbein Tested by: Eugene Grosbein Approved by: re (kib) MFC after: 1 week --- sys/net/if_lagg.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c index d540966ab4c..6a3eb93e5a5 100644 --- a/sys/net/if_lagg.c +++ b/sys/net/if_lagg.c @@ -208,6 +208,7 @@ static moduledata_t lagg_mod = { }; DECLARE_MODULE(if_lagg, lagg_mod, SI_SUB_PSEUDO, SI_ORDER_ANY); +MODULE_VERSION(if_lagg, 1); #if __FreeBSD_version >= 800000 /* From 217e3abc037aa9f1c0aa70c50c01bfa5f1a49f5d Mon Sep 17 00:00:00 2001 From: Gleb Smirnoff Date: Mon, 1 Aug 2011 13:41:38 +0000 Subject: [PATCH 111/452] Add missing break; in r223593. Submitted by: sem Pointy hat to: glebius Approved by: re (kib) --- sys/netinet/ip_divert.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c index 29a5d424fdd..234cae27579 100644 --- a/sys/netinet/ip_divert.c +++ b/sys/netinet/ip_divert.c @@ -410,6 +410,7 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin, } ip6->ip6_plen = ntohs(ip6->ip6_plen); + break; } #endif default: From ad4887a72a6beb22cb95124ea8e4878929546271 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Mon, 1 Aug 2011 14:50:31 +0000 Subject: [PATCH 112/452] Fix integer overflow in txg_delay() by initializing the variable "timeout" as clock_t. Filed as Illumos Bug #1313 Reviewed by: avg Approved by: re (kib) MFC after: 3 days --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/txg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/txg.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/txg.c index 0885f27116d..7f9b933e7d1 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/txg.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/txg.c @@ -488,7 +488,7 @@ void txg_delay(dsl_pool_t *dp, uint64_t txg, int ticks) { tx_state_t *tx = &dp->dp_tx; - int timeout = ddi_get_lbolt() + ticks; + clock_t timeout = ddi_get_lbolt() + ticks; /* don't delay if this txg could transition to quiesing immediately */ if (tx->tx_open_txg > txg || From abd51cd84a0be6a17af1d82da5fc5190df429a31 Mon Sep 17 00:00:00 2001 From: Joel Dahl Date: Mon, 1 Aug 2011 15:56:40 +0000 Subject: [PATCH 113/452] I've rewritten most of this file so assign the copyright to me. Approved by: re (kib) --- share/man/man4/pcm.4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/man/man4/pcm.4 b/share/man/man4/pcm.4 index 2244da4e6b0..333033d1a3a 100644 --- a/share/man/man4/pcm.4 +++ b/share/man/man4/pcm.4 @@ -1,5 +1,5 @@ .\" -.\" Copyright (c) 1998, Luigi Rizzo +.\" Copyright (c) 2009-2011 Joel Dahl .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without From d0a724c5ea93e561bccfbe91219710009bc553e4 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Mon, 1 Aug 2011 19:07:03 +0000 Subject: [PATCH 114/452] Fix the LK_NOSHARE lockmgr flag interaction with LK_UPGRADE and LK_DOWNGRADE lock ops. Namely, the ops should be NOP since LK_NOSHARE locks are always exclusive. Reported by: rmacklem Reviewed by: attilio Tested by: pho Approved by: re (kensmith) MFC after: 1 week --- sys/kern/kern_lock.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/sys/kern/kern_lock.c b/sys/kern/kern_lock.c index 8e5546ee307..73118726e3a 100644 --- a/sys/kern/kern_lock.c +++ b/sys/kern/kern_lock.c @@ -477,8 +477,18 @@ __lockmgr_args(struct lock *lk, u_int flags, struct lock_object *ilk, return (0); } - if (op == LK_SHARED && (lk->lock_object.lo_flags & LK_NOSHARE)) - op = LK_EXCLUSIVE; + if (lk->lock_object.lo_flags & LK_NOSHARE) { + switch (op) { + case LK_SHARED: + op = LK_EXCLUSIVE; + break; + case LK_UPGRADE: + case LK_DOWNGRADE: + _lockmgr_assert(lk, KA_XLOCKED | KA_NOTRECURSED, + file, line); + return (0); + } + } wakeup_swapper = 0; switch (op) { From dda4f960873c2234cf5d4f63b8acafbd17201b3d Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Mon, 1 Aug 2011 19:12:15 +0000 Subject: [PATCH 115/452] Implement the linprocfs swaps file, providing information about the configured swap devices in the Linux-compatible format. Based on the submission by: Robert Millan PR: kern/159281 Reviewed by: bde Approved by: re (kensmith) MFC after: 2 weeks --- sys/compat/linprocfs/linprocfs.c | 29 +++++++++++++++ sys/vm/swap_pager.c | 64 ++++++++++++++++++++------------ sys/vm/swap_pager.h | 3 +- 3 files changed, 72 insertions(+), 24 deletions(-) diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c index 692c5a38af5..8832d3d7937 100644 --- a/sys/compat/linprocfs/linprocfs.c +++ b/sys/compat/linprocfs/linprocfs.c @@ -502,6 +502,33 @@ linprocfs_dostat(PFS_FILL_ARGS) return (0); } +static int +linprocfs_doswaps(PFS_FILL_ARGS) +{ + struct xswdev xsw; + uintmax_t total, used; + int n; + char devname[SPECNAMELEN + 1]; + + sbuf_printf(sb, "Filename\t\t\t\tType\t\tSize\tUsed\tPriority\n"); + mtx_lock(&Giant); + for (n = 0; ; n++) { + if (swap_dev_info(n, &xsw, devname, sizeof(devname)) != 0) + break; + total = (uintmax_t)xsw.xsw_nblks * PAGE_SIZE / 1024; + used = (uintmax_t)xsw.xsw_used * PAGE_SIZE / 1024; + + /* + * The space and not tab after the device name is on + * purpose. Linux does so. + */ + sbuf_printf(sb, "/dev/%-34s unknown\t\t%jd\t%jd\t-1\n", + devname, total, used); + } + mtx_unlock(&Giant); + return (0); +} + /* * Filler function for proc/uptime */ @@ -1490,6 +1517,8 @@ linprocfs_init(PFS_INIT_ARGS) NULL, NULL, NULL, 0); pfs_create_file(root, "stat", &linprocfs_dostat, NULL, NULL, NULL, PFS_RD); + pfs_create_file(root, "swaps", &linprocfs_doswaps, + NULL, NULL, NULL, PFS_RD); pfs_create_file(root, "uptime", &linprocfs_douptime, NULL, NULL, NULL, PFS_RD); pfs_create_file(root, "version", &linprocfs_doversion, diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index f421e4fa788..9a818e7b645 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -2365,35 +2365,53 @@ swap_pager_status(int *total, int *used) mtx_unlock(&sw_dev_mtx); } +int +swap_dev_info(int name, struct xswdev *xs, char *devname, size_t len) +{ + struct swdevt *sp; + char *tmp_devname; + int error, n; + + n = 0; + error = ENOENT; + mtx_lock(&sw_dev_mtx); + TAILQ_FOREACH(sp, &swtailq, sw_list) { + if (n != name) { + n++; + continue; + } + xs->xsw_version = XSWDEV_VERSION; + xs->xsw_dev = sp->sw_dev; + xs->xsw_flags = sp->sw_flags; + xs->xsw_nblks = sp->sw_nblks; + xs->xsw_used = sp->sw_used; + if (devname != NULL) { + if (vn_isdisk(sp->sw_vp, NULL)) + tmp_devname = sp->sw_vp->v_rdev->si_name; + else + tmp_devname = "[file]"; + strncpy(devname, tmp_devname, len); + } + error = 0; + break; + } + mtx_unlock(&sw_dev_mtx); + return (error); +} + static int sysctl_vm_swap_info(SYSCTL_HANDLER_ARGS) { - int *name = (int *)arg1; - int error, n; struct xswdev xs; - struct swdevt *sp; + int error; - if (arg2 != 1) /* name length */ + if (arg2 != 1) /* name length */ return (EINVAL); - - n = 0; - mtx_lock(&sw_dev_mtx); - TAILQ_FOREACH(sp, &swtailq, sw_list) { - if (n == *name) { - mtx_unlock(&sw_dev_mtx); - xs.xsw_version = XSWDEV_VERSION; - xs.xsw_dev = sp->sw_dev; - xs.xsw_flags = sp->sw_flags; - xs.xsw_nblks = sp->sw_nblks; - xs.xsw_used = sp->sw_used; - - error = SYSCTL_OUT(req, &xs, sizeof(xs)); - return (error); - } - n++; - } - mtx_unlock(&sw_dev_mtx); - return (ENOENT); + error = swap_dev_info(*(int *)arg1, &xs, NULL, 0); + if (error != 0) + return (error); + error = SYSCTL_OUT(req, &xs, sizeof(xs)); + return (error); } SYSCTL_INT(_vm, OID_AUTO, nswapdev, CTLFLAG_RD, &nswapdev, 0, diff --git a/sys/vm/swap_pager.h b/sys/vm/swap_pager.h index c3366e8e877..5c716d95c4e 100644 --- a/sys/vm/swap_pager.h +++ b/sys/vm/swap_pager.h @@ -75,7 +75,8 @@ struct swdevt { extern int swap_pager_full; extern int swap_pager_avail; -struct swdevt; +struct xswdev; +int swap_dev_info(int name, struct xswdev *xs, char *devname, size_t len); void swap_pager_copy(vm_object_t, vm_object_t, vm_pindex_t, int); void swap_pager_freespace(vm_object_t, vm_pindex_t, vm_size_t); void swap_pager_swap_init(void); From 1f855199286876b4a6b1b372591783639579a883 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Mon, 1 Aug 2011 21:12:41 +0000 Subject: [PATCH 116/452] Add PCI ID for RocketRAID 4321 and 4322. A FreeNAS user have tested the change on RocketRAID 4322. Sponsored by: iXsystems, Inc. MFC after: 3 days Approved by: re (kib) --- share/man/man4/hptiop.4 | 6 +++++- sys/dev/hptiop/hptiop.c | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/share/man/man4/hptiop.4 b/share/man/man4/hptiop.4 index 83d356be861..77fab0cd613 100644 --- a/share/man/man4/hptiop.4 +++ b/share/man/man4/hptiop.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 12, 2007 +.Dd August 1, 2011 .Dt HPTIOP 4 .Os .Sh NAME @@ -60,6 +60,10 @@ driver supports the following SAS and SATA RAID controllers: .It HighPoint RocketRAID 4320 .It +HighPoint RocketRAID 4321 +.It +HighPoint RocketRAID 4322 +.It HighPoint RocketRAID 3220 .It HighPoint RocketRAID 3320 diff --git a/sys/dev/hptiop/hptiop.c b/sys/dev/hptiop/hptiop.c index 77a4ccd5b4c..49ffcefe6c5 100644 --- a/sys/dev/hptiop/hptiop.c +++ b/sys/dev/hptiop/hptiop.c @@ -1269,6 +1269,8 @@ static int hptiop_probe(device_t dev) id = pci_get_device(dev); switch (id) { + case 0x4322: + case 0x4321: case 0x4320: sas = 1; case 0x3220: From f0720ed5f83d956846b999aa395d4697503d21cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulrich=20Sp=C3=B6rlein?= Date: Mon, 1 Aug 2011 22:21:18 +0000 Subject: [PATCH 117/452] Fix broken mdoc. Found by: manlint Approved by: re (kib) --- contrib/bsnmp/snmp_usm/snmp_usm.3 | 2 +- usr.bin/unzip/unzip.1 | 2 +- usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 | 61 +++++++++++++-------- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/contrib/bsnmp/snmp_usm/snmp_usm.3 b/contrib/bsnmp/snmp_usm/snmp_usm.3 index 830cacd3d91..9927f6e7f65 100755 --- a/contrib/bsnmp/snmp_usm/snmp_usm.3 +++ b/contrib/bsnmp/snmp_usm/snmp_usm.3 @@ -115,7 +115,7 @@ allowed. This column is used to create new USM user entries or delete existing ones from the table. .El -.EL +.El .Sh FILES .Bl -tag -width "XXXXXXXXX" .It Pa /usr/share/snmp/defs/usm_tree.def diff --git a/usr.bin/unzip/unzip.1 b/usr.bin/unzip/unzip.1 index 7fee8522afe..d1155547bf3 100644 --- a/usr.bin/unzip/unzip.1 +++ b/usr.bin/unzip/unzip.1 @@ -112,7 +112,7 @@ and .Fl u may be specified. If specified filename is -.Va Qq - , +.Qq - , then data is read from .Va stdin . .Sh ENVIRONMENT diff --git a/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 b/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 index aa3f911e94a..97ef694ba32 100644 --- a/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 +++ b/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 @@ -126,7 +126,7 @@ The options are as follows (not all apply to all three programs): .Bl -tag -width ".It Fl D Ar options" .It Fl A Ar options Authentication options to use with SNMPv3 PDUs -.Bl -tag -width +.Bl -tag -width \& .It Cm proto=[md5|sha] The protocol to use when calculating the PDU message digest. .It Cm key=authkey @@ -147,7 +147,7 @@ The maximum allowed length is 65535 according to the Structure of Management Information (SMIv2). .It Fl C Ar options The context to query with SNMPv3 PDUs. -.Bl -tag -width +.Bl -tag -width \& .It Cm context=name The context name. Default is "" (empty). .It Cm context-engine=engine-id @@ -172,19 +172,21 @@ Print a short help text with default values for various options. Load each MIB description file from the given list to translate symbolic object names to their numerical representation and vice versa. Use the other options to obtain a non-default behaviour: -.Bl -tag -width +.Bl -tag -width \& .It Cm cut=OID Specifies the initial OID that was cut by .Xr gensnmpdef 1 when producing the MIB description file. The default value is .iso(1).org(3).dod(6) which is what should have been -used for all the files installed under /usr/share/snmp/defs/ . -Use this only if you generated your own files, providing a '-c' option to +used for all the files installed under /usr/share/snmp/defs. +Use this only if you generated your own files, providing a +.Fl c +option to .Xr gensnmpdef 1 . .It Cm path=filedir The directory where files in the list will be searched. The default is -.Pa /usr/share/snmp/defs/ . +.Pa /usr/share/snmp/defs Ns . .It Cm file=filelist A comma separated list of files to which the two options above will apply. .El @@ -206,7 +208,7 @@ will search to translate numerical OIDs to their symbolic object names. Multiple files can be provided either giving this option multiple times or a comma separated list of file names. If a filename begins with a letter the default directory, -/usr/share/snmp/defs/ , +/usr/share/snmp/defs, will be searched. .It Fl K Calculate and display the localized authentication and privacy keys @@ -239,7 +241,7 @@ representation and the value. In addition to the short output verbose prints the type before the value. .It Fl P Ar options Privacy options to use with SNMPv3 PDUs -.Bl -tag -width +.Bl -tag -width \& .It Cm proto=[aes|des] The protocol to use when encypting/decrypting SNMPv3 PDU data. .It Cm key=privkey @@ -257,9 +259,11 @@ not respond after the first try. Default is 3. .It Fl s Ar [trans::] Ns Ar [community@] Ns Ar [server] Ns Ar [:port] Each of the server specification components is optional but at least one -has to be provided if '-s' option is used. +has to be provided if +.Ar s +option is used. The server specification is constructed in the following manner: -.Bl -tag -width +.Bl -tag -width \& .It Cm trans:: Transport type may be one of udp, stream or dgram. If this option is not provided an udp inet/inet6 socket will be used, which @@ -277,11 +281,16 @@ and the default "private" community string will be used for .It Cm server This might be either the IP address or the hostname where the agent is listening. -The default is 'localhost'. +The default is +.Qq localhost . .It Cm port The destination port to send the requests to. This is useful if the SNMP agent listens on a non-default port. -Default is given by the 'snmp' entry in /etc/services, port 161. +Default is given by the +.Qq snmp +entry in +.Pa /etc/services , +port 161. .El .It Fl t Ar timeout Number of seconds before resending a request packet if the agent does @@ -289,7 +298,7 @@ not respond. The default value is 3 seconds. .It Fl U Ar options User credentials when sending SNMPv3 PDUs. -.Bl -tag -width +.Bl -tag -width \& .It Cm engine=id The Engine ID of the SNMP agent represented as a binary octet string. .It Cm engine-boots=value @@ -331,14 +340,16 @@ at .iso(1).org(3).dod(6).internet(1).mgmt(2).mib2(1) . .Pp Any of the formats used to print a single variable is valid as input OID: -.Bl -tag -width +.Bl -tag -width \& .It 1.3.6.1.2.1.25.1.1.0 .It sysDescr .It ifPhysAddress.1 .It ifRcvAddressStatus.2.6.255.255.255.255.255.255 .It ifRcvAddressType[2,ff:ff:ff:ff:ff:ff] .It ifRcvAddressStatus[Integer:1,OctetString:ff:ff:ff:ff:ff:ff] -(requires '-o verbose' option) +(requires +.Fl o Ar verbose +option) .El .Pp Square brackets are used to denote an entry's indexes. @@ -350,34 +361,39 @@ The object identifier with its syntax type and value that is to be set. At least one such string OID=[syntax:]value should be provided to .Nm bsnmpset to be able to send a request. -.Bl -tag -width +.Bl -tag -width \& .It Cm OID OID may be input as a string, a string followed by a random number of integers (suboids) separated by dots, a sequence of integers separated by dots - that is -if '-n' options is used - and in such case a syntax is required for every value, +if +.Ar n +options is used - and in such case a syntax is required for every value, or a string followed by square brackets (used to denote an entry's indexes) and corresponding indexes. Any of formats used to print a single variable by .Nm bsnmpset is valid for inpit OID as well: -.Bl -tag -width +.Bl -tag -width \& .It 1.3.6.1.2.1.25.1.1.0=TimeTicks:537615486 -.It sysLocation=OctetString:"@ Home" (with '-o verbose' option) +.It sysLocation=OctetString:"@ Home" (with Fl o Ar verbose No option) .It sysLocation.0="@ Home" .It 1.3.6.1.2.1.2.2.1.6.1=OctetString:ffffffffffff .It ifPhysAddress.1="00:02:b3:1d:1c:a3" .It ifRcvAddressStatus.1.6.255.255.255.255.255.255=1 .It "ifRcvAddressStatus[Integer:1,OctetString:ff:ff:ff:ff:ff:ff]=Integer:1" -(with '-o verbose' option) +(with +.Fl o Ar verbose +option) .El .It Cm syntax -where syntax string is one of : +where syntax string is one of: Integer, OctetString, OID, IpAddress, Counter32, Gauge, TimeTicks, Counter64. .It Cm value -The value to be set - IP address in form of u.u.u.u - for example +The value to be set - IP address in form of u.u.u.u - for example 1.3.1.6.1.2.0=IpAddress:192.168.0.1, strings require inverted-commas if they contain any special characters or spaces, all other numeric types don't. .El +.El .Sh ENVIRONMENT .Nm , .Nm bsnmpwalk @@ -395,6 +411,7 @@ Specifies a default SNMP USM user name. Specifies the SNMP USM plain text password to use when calculating localized authentication and privacy keys. If this variable exists in the environment, SMNPv3 is the default version to use for outgoing requests. +.El .Sh SEE ALSO .Xr gensnmpdef 1 .Sh AUTHORS From 12eab787f3836054bcc0f65d3218bc1c42e20c73 Mon Sep 17 00:00:00 2001 From: Glen Barber Date: Tue, 2 Aug 2011 01:48:45 +0000 Subject: [PATCH 118/452] Provide a more user friendly URL to the IETF site in gif(4). Pointed out by: dougb MFC after: 3 days Approved by: re (hrs) --- share/man/man4/gif.4 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/share/man/man4/gif.4 b/share/man/man4/gif.4 index bb6c7849266..453b4bdb1c5 100644 --- a/share/man/man4/gif.4 +++ b/share/man/man4/gif.4 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 23, 2011 +.Dd August 1, 2011 .Dt GIF 4 .Os .Sh NAME @@ -198,7 +198,7 @@ to 1. .%B RFC2893 .%T Transition Mechanisms for IPv6 Hosts and Routers .%D August 2000 -.%U http://www.ietf.org/rfc/rfc2893.txt +.%U http://tools.ietf.org/html/rfc2893 .Re .Rs .%A Sally Floyd From 1fdadc0fb6c564b3ecf14abc41cfd2fce9703fff Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 2 Aug 2011 02:46:03 +0000 Subject: [PATCH 119/452] Fix a corner case in RXEOL handling which was likely introduced by yours truly. Before 802.11n, the RX descriptor list would employ the "self-linked tail descriptor" trick which linked the last descriptor back to itself. This way, the RX engine would never hit the "end" of the list and stop processing RX (and assert RXEOL) as it never hit a descriptor whose next pointer was 0. It would just keep overwriting the last descriptor until the software freed up some more RX descriptors and chained them onto the end. For 802.11n, this needs to stop as a self-linked RX descriptor tickles the block-ack logic into ACK'ing whatever frames are received into that self-linked descriptor - so in very busy periods, you could end up with A-MPDU traffic that is ACKed but never received by the 802.11 stack. This would cause some confusion as the ADDBA windows would suddenly be out of sync. So when that occured here, the last descriptor would be hit and the PCU logic would stop. It would only start again when the RX descriptor list was updated and the PCU RX engine was re-tickled. That wasn't being done, so RXEOL would be continuously asserted and no RX would continue. This patch introduces a new flag - sc->sc_kickpcu - which when set, signals the RX task to kick the PCU after its processed whatever packets it can. This way completed packets aren't discarded. In case some other task gets called which resets the hardware, don't update sc->sc_imask - instead, just update the hardware interrupt mask directly and let either ath_rx_proc() or ath_reset() restore the imask to its former setting. Note: this bug was only triggered when doing a whole lot of frame snooping with serial console IO in the RX task. This would defer interrupt processing enough to cause an RX descriptor overflow. It doesn't happen in normal conditions. Approved by: re (kib, blanket) --- sys/dev/ath/if_ath.c | 36 ++++++++++++++++++++++++++++++++++-- sys/dev/ath/if_athvar.h | 3 ++- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index 7655c594976..782b790a3a0 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -1389,6 +1389,7 @@ ath_intr(void *arg) } } if (status & HAL_INT_RXEOL) { + int imask = sc->sc_imask; /* * NB: the hardware should re-read the link when * RXE bit is written, but it doesn't work at @@ -1398,10 +1399,22 @@ ath_intr(void *arg) /* * Disable RXEOL/RXORN - prevent an interrupt * storm until the PCU logic can be reset. + * In case the interface is reset some other + * way before "sc_kickpcu" is called, don't + * modify sc_imask - that way if it is reset + * by a call to ath_reset() somehow, the + * interrupt mask will be correctly reprogrammed. */ - sc->sc_imask &= ~(HAL_INT_RXEOL | HAL_INT_RXORN); - ath_hal_intrset(ah, sc->sc_imask); + imask &= ~(HAL_INT_RXEOL | HAL_INT_RXORN); + ath_hal_intrset(ah, imask); + /* + * Enqueue an RX proc, to handled whatever + * is in the RX queue. + * This will then kick the PCU. + */ + taskqueue_enqueue(sc->sc_tq, &sc->sc_rxtask); sc->sc_rxlink = NULL; + sc->sc_kickpcu = 1; } if (status & HAL_INT_TXURN) { sc->sc_stats.ast_txurn++; @@ -3776,6 +3789,25 @@ rx_next: if (ath_dfs_tasklet_needed(sc, sc->sc_curchan)) taskqueue_enqueue(sc->sc_tq, &sc->sc_dfstask); + /* + * Now that all the RX frames were handled that + * need to be handled, kick the PCU if there's + * been an RXEOL condition. + */ + if (sc->sc_kickpcu) { + sc->sc_kickpcu = 0; + ath_stoprecv(sc); + sc->sc_imask |= (HAL_INT_RXEOL | HAL_INT_RXORN); + if (ath_startrecv(sc) != 0) { + if_printf(ifp, + "%s: couldn't restart RX after RXEOL; resetting\n", + __func__); + ath_reset(ifp); + return; + } + ath_hal_intrset(ah, sc->sc_imask); + } + if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) { #ifdef IEEE80211_SUPPORT_SUPERG ieee80211_ff_age_all(ic, 100); diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index 6b148c316ca..ce370f73d44 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -254,7 +254,8 @@ struct ath_softc { sc_tdma : 1,/* TDMA in use */ sc_setcca : 1,/* set/clr CCA with TDMA */ sc_resetcal : 1,/* reset cal state next trip */ - sc_rxslink : 1;/* do self-linked final descriptor */ + sc_rxslink : 1,/* do self-linked final descriptor */ + sc_kickpcu : 1;/* kick PCU RX on next RX proc */ uint32_t sc_eerd; /* regdomain from EEPROM */ uint32_t sc_eecc; /* country code from EEPROM */ /* rate tables */ From df6f430410d8a228def89a3945abe579f30576b1 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Tue, 2 Aug 2011 11:07:47 +0000 Subject: [PATCH 120/452] Do not force AHCI mode on NVIDIA MCP89 SATA controllers. Recent Apple Mac with this chipset does not initialize AHCI mode unless it is started from EFI loader. However, legacy ATA mode works. Submitted by: jkim@ (original version) Approved by: re (kib) MFC after: 1 week --- sys/dev/ahci/ahci.c | 2 +- sys/dev/ata/chipsets/ata-nvidia.c | 24 +++++++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c index 1d6185dce83..ccb4bc0835a 100644 --- a/sys/dev/ahci/ahci.c +++ b/sys/dev/ahci/ahci.c @@ -264,7 +264,7 @@ static struct { {0x0abe10de, 0x00, "NVIDIA MCP79", AHCI_Q_NOAA}, {0x0abf10de, 0x00, "NVIDIA MCP79", AHCI_Q_NOAA}, {0x0d8410de, 0x00, "NVIDIA MCP89", AHCI_Q_NOAA}, - {0x0d8510de, 0x00, "NVIDIA MCP89", AHCI_Q_NOAA}, + {0x0d8510de, 0x00, "NVIDIA MCP89", AHCI_Q_NOFORCE|AHCI_Q_NOAA}, {0x0d8610de, 0x00, "NVIDIA MCP89", AHCI_Q_NOAA}, {0x0d8710de, 0x00, "NVIDIA MCP89", AHCI_Q_NOAA}, {0x0d8810de, 0x00, "NVIDIA MCP89", AHCI_Q_NOAA}, diff --git a/sys/dev/ata/chipsets/ata-nvidia.c b/sys/dev/ata/chipsets/ata-nvidia.c index b1da6f0eccc..2edc0f1471d 100644 --- a/sys/dev/ata/chipsets/ata-nvidia.c +++ b/sys/dev/ata/chipsets/ata-nvidia.c @@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_nvidia_chipinit(device_t dev); static int ata_nvidia_ch_attach(device_t dev); +static int ata_nvidia_ch_attach_dumb(device_t dev); static int ata_nvidia_status(device_t dev); static void ata_nvidia_reset(device_t dev); static int ata_nvidia_setmode(device_t dev, int target, int mode); @@ -62,6 +63,7 @@ static int ata_nvidia_setmode(device_t dev, int target, int mode); #define NV4 0x01 #define NVQ 0x02 #define NVAHCI 0x04 +#define NVNOFORCE 0x08 /* @@ -158,7 +160,7 @@ ata_nvidia_probe(device_t dev) { ATA_NFORCE_MCP79_AA, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, { ATA_NFORCE_MCP79_AB, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, { ATA_NFORCE_MCP89_A0, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, - { ATA_NFORCE_MCP89_A1, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_A1, 0, NVAHCI|NVNOFORCE, 0, ATA_SA300, "nForce MCP89" }, { ATA_NFORCE_MCP89_A2, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, { ATA_NFORCE_MCP89_A3, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, { ATA_NFORCE_MCP89_A4, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, @@ -178,7 +180,9 @@ ata_nvidia_probe(device_t dev) return ENXIO; ata_set_desc(dev); - if (ctlr->chip->cfg1 & NVAHCI) + if ((ctlr->chip->cfg1 & NVAHCI) && + ((ctlr->chip->cfg1 & NVNOFORCE) == 0 || + pci_get_subclass(dev) != PCIS_STORAGE_IDE)) ctlr->chipinit = ata_ahci_chipinit; else ctlr->chipinit = ata_nvidia_chipinit; @@ -193,7 +197,10 @@ ata_nvidia_chipinit(device_t dev) if (ata_setup_interrupt(dev, ata_generic_intr)) return ENXIO; - if (ctlr->chip->max_dma >= ATA_SA150) { + if (ctlr->chip->cfg1 & NVAHCI) { + ctlr->ch_attach = ata_nvidia_ch_attach_dumb; + ctlr->setmode = ata_sata_setmode; + } else if (ctlr->chip->max_dma >= ATA_SA150) { if (pci_read_config(dev, PCIR_BAR(5), 1) & 1) ctlr->r_type2 = SYS_RES_IOPORT; else @@ -264,6 +271,17 @@ ata_nvidia_ch_attach(device_t dev) return 0; } +static int +ata_nvidia_ch_attach_dumb(device_t dev) +{ + struct ata_channel *ch = device_get_softc(dev); + + if (ata_pci_ch_attach(dev)) + return ENXIO; + ch->flags |= ATA_SATA; + return 0; +} + static int ata_nvidia_status(device_t dev) { From e498ea90378a3567c1176af1e54b1f977b08e888 Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Tue, 2 Aug 2011 11:24:42 +0000 Subject: [PATCH 121/452] Fix a LOR in the NFS client which could cause a deadlock. This was reported to the mailing list freebsd-net@freebsd.org on July 21, 2011 under the subject "LOR with nfsclient sillyrename". The LOR occurred when nfs_inactive() called vrele(sp->s_dvp) while holding the vnode lock on the file in s_dvp. This patch modifies the client so that it performs the vrele(sp->s_dvp) as a separate task to avoid the LOR. This fix was discussed with jhb@ and kib@, who both proposed variations of it. Tested by: pho, jlott at averesystems.com Submitted by: jhb (earlier version) Reviewed by: kib Approved by: re (kib) MFC after: 2 weeks --- sys/nfsclient/nfs_node.c | 21 +++++++++++++++++++-- sys/nfsclient/nfsnode.h | 2 ++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/sys/nfsclient/nfs_node.c b/sys/nfsclient/nfs_node.c index 5b43b3d653b..afe3341ba6c 100644 --- a/sys/nfsclient/nfs_node.c +++ b/sys/nfsclient/nfs_node.c @@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -59,6 +60,8 @@ __FBSDID("$FreeBSD$"); static uma_zone_t nfsnode_zone; +static void nfs_freesillyrename(void *arg, __unused int pending); + #define TRUE 1 #define FALSE 0 @@ -185,6 +188,20 @@ nfs_nget(struct mount *mntp, nfsfh_t *fhp, int fhsize, struct nfsnode **npp, int return (0); } +/* + * Do the vrele(sp->s_dvp) as a separate task in order to avoid a + * deadlock because of a LOR when vrele() locks the directory vnode. + */ +static void +nfs_freesillyrename(void *arg, __unused int pending) +{ + struct sillyrename *sp; + + sp = arg; + vrele(sp->s_dvp); + free(sp, M_NFSREQ); +} + int nfs_inactive(struct vop_inactive_args *ap) { @@ -207,8 +224,8 @@ nfs_inactive(struct vop_inactive_args *ap) */ (sp->s_removeit)(sp); crfree(sp->s_cred); - vrele(sp->s_dvp); - free((caddr_t)sp, M_NFSREQ); + TASK_INIT(&sp->s_task, 0, nfs_freesillyrename, sp); + taskqueue_enqueue(taskqueue_thread, &sp->s_task); mtx_lock(&np->n_mtx); } np->n_flag &= NMODIFIED; diff --git a/sys/nfsclient/nfsnode.h b/sys/nfsclient/nfsnode.h index 19c1c474ecc..8e35fdd3456 100644 --- a/sys/nfsclient/nfsnode.h +++ b/sys/nfsclient/nfsnode.h @@ -36,6 +36,7 @@ #ifndef _NFSCLIENT_NFSNODE_H_ #define _NFSCLIENT_NFSNODE_H_ +#include #if !defined(_NFSCLIENT_NFS_H_) && !defined(_KERNEL) #include #endif @@ -45,6 +46,7 @@ * can be removed by nfs_inactive() */ struct sillyrename { + struct task s_task; struct ucred *s_cred; struct vnode *s_dvp; int (*s_removeit)(struct sillyrename *sp); From d32cac295cc310ad4d46867b10a75aa100406680 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Tue, 2 Aug 2011 11:28:33 +0000 Subject: [PATCH 122/452] Fix panic in zfs_read() if IO_SYNC flag supplied by checking for zfsvfs->z_log before calling zil_commit(). [1] Do not call zfs_read() from zfs_getextattr() with the IO_SYNC flag. Submitted by: Alexander Zagrebin [1] Reviewed by: pjd@ Approved by: re (kib) MFC after: 3 days --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index 3e040310680..14b68238627 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -612,7 +612,8 @@ zfs_read(vnode_t *vp, uio_t *uio, int ioflag, cred_t *cr, caller_context_t *ct) /* * If we're in FRSYNC mode, sync out this znode before reading it. */ - if (ioflag & FRSYNC || zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS) + if (zfsvfs->z_log && + (ioflag & FRSYNC || zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)) zil_commit(zfsvfs->z_log, zp->z_id); /* @@ -6340,7 +6341,7 @@ vop_getextattr { if (error == 0) *ap->a_size = (size_t)va.va_size; } else if (ap->a_uio != NULL) - error = VOP_READ(vp, ap->a_uio, IO_UNIT | IO_SYNC, ap->a_cred); + error = VOP_READ(vp, ap->a_uio, IO_UNIT, ap->a_cred); VOP_UNLOCK(vp, 0); vn_close(vp, flags, ap->a_cred, td); From e2eb210c094453ad4a3904470dfedb2ef9bcff25 Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Tue, 2 Aug 2011 11:28:42 +0000 Subject: [PATCH 123/452] Fix a LOR in the NFS client which could cause a deadlock. This was reported to the mailing list freebsd-net@freebsd.org on July 21, 2011 under the subject "LOR with nfsclient sillyrename". The LOR occurred when nfs_inactive() called vrele(sp->s_dvp) while holding the vnode lock on the file in s_dvp. This patch modifies the client so that it performs the vrele(sp->s_dvp) as a separate task to avoid the LOR. This fix was discussed with jhb@ and kib@, who both proposed variations of it. Tested by: pho, jlott at averesystems.com Submitted by: jhb (earlier version) Reviewed by: kib Approved by: re (kib) MFC after: 2 weeks --- sys/fs/nfsclient/nfs_clnode.c | 21 +++++++++++++++++++-- sys/fs/nfsclient/nfsnode.h | 3 +++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/sys/fs/nfsclient/nfs_clnode.c b/sys/fs/nfsclient/nfs_clnode.c index d15de6e9c7b..5e7185df212 100644 --- a/sys/fs/nfsclient/nfs_clnode.c +++ b/sys/fs/nfsclient/nfs_clnode.c @@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -65,6 +66,8 @@ MALLOC_DECLARE(M_NEWNFSREQ); uma_zone_t newnfsnode_zone; +static void nfs_freesillyrename(void *arg, __unused int pending); + void ncl_nhinit(void) { @@ -186,6 +189,20 @@ ncl_nget(struct mount *mntp, u_int8_t *fhp, int fhsize, struct nfsnode **npp, return (0); } +/* + * Do the vrele(sp->s_dvp) as a separate task in order to avoid a + * deadlock because of a LOR when vrele() locks the directory vnode. + */ +static void +nfs_freesillyrename(void *arg, __unused int pending) +{ + struct sillyrename *sp; + + sp = arg; + vrele(sp->s_dvp); + free(sp, M_NEWNFSREQ); +} + int ncl_inactive(struct vop_inactive_args *ap) { @@ -220,8 +237,8 @@ ncl_inactive(struct vop_inactive_args *ap) */ ncl_removeit(sp, vp); crfree(sp->s_cred); - vrele(sp->s_dvp); - FREE((caddr_t)sp, M_NEWNFSREQ); + TASK_INIT(&sp->s_task, 0, nfs_freesillyrename, sp); + taskqueue_enqueue(taskqueue_thread, &sp->s_task); mtx_lock(&np->n_mtx); } np->n_flag &= NMODIFIED; diff --git a/sys/fs/nfsclient/nfsnode.h b/sys/fs/nfsclient/nfsnode.h index 1d1c89c7d4b..c29805d5efe 100644 --- a/sys/fs/nfsclient/nfsnode.h +++ b/sys/fs/nfsclient/nfsnode.h @@ -35,11 +35,14 @@ #ifndef _NFSCLIENT_NFSNODE_H_ #define _NFSCLIENT_NFSNODE_H_ +#include + /* * Silly rename structure that hangs off the nfsnode until the name * can be removed by nfs_inactive() */ struct sillyrename { + struct task s_task; struct ucred *s_cred; struct vnode *s_dvp; long s_namlen; From e2133e0a40540ece16e6ee8474d651f040774b55 Mon Sep 17 00:00:00 2001 From: Glen Barber Date: Tue, 2 Aug 2011 11:35:28 +0000 Subject: [PATCH 124/452] Provide a more user friendly URL to the IETF site in faithd(8). Pointed out by: dougb Approved by: re (kib) MFC after: 3 days --- usr.sbin/faithd/faithd.8 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/usr.sbin/faithd/faithd.8 b/usr.sbin/faithd/faithd.8 index f47c17f88a9..827d00e81e9 100644 --- a/usr.sbin/faithd/faithd.8 +++ b/usr.sbin/faithd/faithd.8 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 23, 2011 +.Dd August 2, 2011 .Dt FAITHD 8 .Os .Sh NAME @@ -368,7 +368,7 @@ setting. .%A Kazu Yamamoto .%T "An IPv6-to-IPv4 transport relay translator" .%B RFC3142 -.%U http://www.ietf.org/rfc/rfc3142.txt +.%U http://tools.ietf.org/html/rfc3142 .%D June 2001 .Re .\" From 2b5bf115aea115a6cb8eed9af38204b718311aac Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Tue, 2 Aug 2011 15:35:43 +0000 Subject: [PATCH 125/452] Add support for Juniper's loader. The difference between FreeBSD's and Juniper's loader is that Juniper's loader maps all of the kernel and preloaded modules at the right virtual address before jumping into the kernel. FreeBSD's loader simply maps 16MB using the physical address and expects the kernel to jump through hoops to relocate itself to it's virtual address. The problem with the FreeBSD loader's approach is that it typically maps too much or too little. There's no harm if it's too much (other than wasting space), but if it's too little then the kernel will simply not boot, because the first thing the kernel needs is the bootinfo structure, which is never mapped in that case. The page fault that early is fatal. The changes constitute: 1. Do not remap the kernel in locore.S. We're mapped where we need to be so we can pretty much call into C code after setting up the stack. 2. With kernload and kernload_ap not set in locore.S, we need to set them in pmap.c: kernload gets defined when we preserve the TLB1. Here we also determine the size of the kernel mapped. kernload_ap is set first thing in the pmap_bootstrap() method. 3. Fix tlb1_map_region() and its use to properly externd the mapped kernel size to include low-level data structures. Approved by: re (blanket) Obtained from: Juniper Networks, Inc --- sys/powerpc/booke/locore.S | 29 +---- sys/powerpc/booke/platform_bare.c | 14 +- sys/powerpc/booke/pmap.c | 204 ++++++++++++++++-------------- 3 files changed, 125 insertions(+), 122 deletions(-) diff --git a/sys/powerpc/booke/locore.S b/sys/powerpc/booke/locore.S index 70a7dcdaae9..95e50b06b52 100644 --- a/sys/powerpc/booke/locore.S +++ b/sys/powerpc/booke/locore.S @@ -83,8 +83,7 @@ __start: * locore registers use: * r1 : stack pointer * r2 : trace pointer (AP only, for early diagnostics) - * r3-r26 : scratch registers - * r27 : kernload + * r3-r27 : scratch registers * r28 : temp TLB1 entry * r29 : initial TLB1 entry we started in * r30-r31 : arguments (metadata pointer) @@ -116,6 +115,9 @@ __start: li %r3, 0 bl tlb_inval_all + cmpwi %r30, 0 + beq done_mapping + /* * Locate the TLB1 entry that maps this code */ @@ -171,7 +173,6 @@ __start: bl 3f 3: mflr %r4 /* Use current address */ rlwinm %r4, %r4, 0, 0, 7 /* 16MB alignment mask */ - mr %r27, %r4 /* Keep kernel load address */ ori %r4, %r4, (MAS3_SX | MAS3_SW | MAS3_SR)@l mtspr SPR_MAS3, %r4 /* Set RPN and protection */ isync @@ -197,23 +198,7 @@ __start: mr %r3, %r28 bl tlb1_inval_entry -/* - * Save kernel load address for later use. - */ - lis %r3, kernload@ha - addi %r3, %r3, kernload@l - stw %r27, 0(%r3) -#ifdef SMP - /* - * APs need a separate copy of kernload info within the __boot_page - * area so they can access this value very early, before their TLBs - * are fully set up and the kernload global location is available. - */ - lis %r3, kernload_ap@ha - addi %r3, %r3, kernload_ap@l - stw %r27, 0(%r3) - msync -#endif +done_mapping: /* * Setup a temporary stack @@ -257,7 +242,7 @@ __start: __boot_page: bl 1f -kernload_ap: +GLOBAL(kernload_ap): .long 0 /* @@ -785,8 +770,6 @@ tmpstack: */ #define INTRCNT_COUNT 256 /* max(HROWPIC_IRQMAX,OPENPIC_IRQMAX) */ -GLOBAL(kernload) - .long 0 GLOBAL(intrnames) .space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 GLOBAL(sintrnames) diff --git a/sys/powerpc/booke/platform_bare.c b/sys/powerpc/booke/platform_bare.c index d76664e7f92..2ec50d24d54 100644 --- a/sys/powerpc/booke/platform_bare.c +++ b/sys/powerpc/booke/platform_bare.c @@ -56,7 +56,7 @@ __FBSDID("$FreeBSD$"); #ifdef SMP extern void *ap_pcpu; extern uint8_t __boot_page[]; /* Boot page body */ -extern uint32_t kernload; /* Kernel physical load address */ +extern uint32_t kernload_ap; /* Kernel physical load address */ #endif extern uint32_t *bootinfo; @@ -178,9 +178,13 @@ bare_timebase_freq(platform_t plat, struct cpuref *cpuref) phandle_t cpus, child; pcell_t freq; - if (bootinfo != NULL) { - /* Backward compatibility. See 8-STABLE. */ - ticks = bootinfo[3] >> 3; + if (bootinfo != NULL) + if (bootinfo[0] == 1) { + /* Backward compatibility. See 8-STABLE. */ + ticks = bootinfo[3] >> 3; + } else { + /* Compatbility with Juniper's loader. */ + ticks = bootinfo[5] >> 3; } else ticks = 0; @@ -268,7 +272,7 @@ bare_smp_start_cpu(platform_t plat, struct pcpu *pc) /* * Set BPTR to the physical address of the boot page */ - bptr = ((uint32_t)__boot_page - KERNBASE) + kernload; + bptr = ((uint32_t)__boot_page - KERNBASE) + kernload_ap; ccsr_write4(OCP85XX_BPTR, (bptr >> 12) | 0x80000000); /* diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c index 18068fcd5ce..3a7786e5b51 100644 --- a/sys/powerpc/booke/pmap.c +++ b/sys/powerpc/booke/pmap.c @@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -111,8 +112,13 @@ extern int dumpsys_minidump; extern unsigned char _etext[]; extern unsigned char _end[]; -/* Kernel physical load address. */ -extern uint32_t kernload; +extern uint32_t *bootinfo; + +#ifdef SMP +extern uint32_t kernload_ap; +#endif + +vm_paddr_t kernload; vm_offset_t kernstart; vm_size_t kernsize; @@ -196,7 +202,7 @@ static void tlb_print_entry(int, uint32_t, uint32_t, uint32_t, uint32_t); static int tlb1_set_entry(vm_offset_t, vm_offset_t, vm_size_t, uint32_t); static void tlb1_write_entry(unsigned int); static int tlb1_iomapped(int, vm_paddr_t, vm_size_t, vm_offset_t *); -static vm_size_t tlb1_mapin_region(vm_offset_t, vm_offset_t, vm_size_t); +static vm_size_t tlb1_mapin_region(vm_offset_t, vm_paddr_t, vm_size_t); static vm_size_t tsize2size(unsigned int); static unsigned int size2tsize(vm_size_t); @@ -962,19 +968,37 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend) debugf("mmu_booke_bootstrap: entered\n"); +#ifdef SMP + kernload_ap = kernload; +#endif + + /* Initialize invalidation mutex */ mtx_init(&tlbivax_mutex, "tlbivax", NULL, MTX_SPIN); /* Read TLB0 size and associativity. */ tlb0_get_tlbconf(); - /* Align kernel start and end address (kernel image). */ + /* + * Align kernel start and end address (kernel image). + * Note that kernel end does not necessarily relate to kernsize. + * kernsize is the size of the kernel that is actually mapped. + */ kernstart = trunc_page(start); data_start = round_page(kernelend); - kernsize = data_start - kernstart; - data_end = data_start; + /* + * Addresses of preloaded modules (like file systems) use + * physical addresses. Make sure we relocate those into + * virtual addresses. + */ + preload_addr_relocate = kernstart - kernload; + + /* Allocate the dynamic per-cpu area. */ + dpcpu = (void *)data_end; + data_end += DPCPU_SIZE; + /* Allocate space for the message buffer. */ msgbufp = (struct msgbuf *)data_end; data_end += msgbufsize; @@ -983,11 +1007,6 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend) data_end = round_page(data_end); - /* Allocate the dynamic per-cpu area. */ - dpcpu = (void *)data_end; - data_end += DPCPU_SIZE; - dpcpu_init(dpcpu, 0); - /* Allocate space for ptbl_bufs. */ ptbl_bufs = (struct ptbl_buf *)data_end; data_end += sizeof(struct ptbl_buf) * PTBL_BUFS; @@ -1005,22 +1024,19 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend) debugf(" kernel pdir at 0x%08x end = 0x%08x\n", kernel_pdir, data_end); debugf(" data_end: 0x%08x\n", data_end); - if (data_end - kernstart > 0x1000000) { - data_end = (data_end + 0x3fffff) & ~0x3fffff; - tlb1_mapin_region(kernstart + 0x1000000, - kernload + 0x1000000, data_end - kernstart - 0x1000000); - } else - data_end = (data_end + 0xffffff) & ~0xffffff; - + if (data_end - kernstart > kernsize) { + kernsize += tlb1_mapin_region(kernstart + kernsize, + kernload + kernsize, (data_end - kernstart) - kernsize); + } + data_end = kernstart + kernsize; debugf(" updated data_end: 0x%08x\n", data_end); - kernsize += data_end - data_start; - /* * Clear the structures - note we can only do it safely after the * possible additional TLB1 translations are in place (above) so that * all range up to the currently calculated 'data_end' is covered. */ + dpcpu_init(dpcpu, 0); memset((void *)ptbl_bufs, 0, sizeof(struct ptbl_buf) * PTBL_SIZE); memset((void *)kernel_pdir, 0, kernel_ptbls * PTBL_PAGES * PAGE_SIZE); @@ -2926,22 +2942,6 @@ tlb1_set_entry(vm_offset_t va, vm_offset_t pa, vm_size_t size, return (0); } -static int -tlb1_entry_size_cmp(const void *a, const void *b) -{ - const vm_size_t *sza; - const vm_size_t *szb; - - sza = a; - szb = b; - if (*sza > *szb) - return (-1); - else if (*sza < *szb) - return (1); - else - return (0); -} - /* * Map in contiguous RAM region into the TLB1 using maximum of * KERNEL_REGION_MAX_TLB_ENTRIES entries. @@ -2950,64 +2950,60 @@ tlb1_entry_size_cmp(const void *a, const void *b) * used by all allocated entries. */ vm_size_t -tlb1_mapin_region(vm_offset_t va, vm_offset_t pa, vm_size_t size) +tlb1_mapin_region(vm_offset_t va, vm_paddr_t pa, vm_size_t size) { - vm_size_t entry_size[KERNEL_REGION_MAX_TLB_ENTRIES]; - vm_size_t mapped_size, sz, esz; - unsigned int log; - int i; + vm_size_t pgs[KERNEL_REGION_MAX_TLB_ENTRIES]; + vm_size_t mapped, pgsz, base, mask; + int idx, nents; - CTR4(KTR_PMAP, "%s: region size = 0x%08x va = 0x%08x pa = 0x%08x", - __func__, size, va, pa); + /* Round up to the next 1M */ + size = (size + (1 << 20) - 1) & ~((1 << 20) - 1); - mapped_size = 0; - sz = size; - memset(entry_size, 0, sizeof(entry_size)); - - /* Calculate entry sizes. */ - for (i = 0; i < KERNEL_REGION_MAX_TLB_ENTRIES && sz > 0; i++) { - - /* Largest region that is power of 4 and fits within size */ - log = ilog2(sz) / 2; - esz = 1 << (2 * log); - - /* If this is last entry cover remaining size. */ - if (i == KERNEL_REGION_MAX_TLB_ENTRIES - 1) { - while (esz < sz) - esz = esz << 2; + mapped = 0; + idx = 0; + base = va; + pgsz = 64*1024*1024; + while (mapped < size) { + while (mapped < size && idx < KERNEL_REGION_MAX_TLB_ENTRIES) { + while (pgsz > (size - mapped)) + pgsz >>= 2; + pgs[idx++] = pgsz; + mapped += pgsz; } - entry_size[i] = esz; - mapped_size += esz; - if (esz < sz) - sz -= esz; - else - sz = 0; + /* We under-map. Correct for this. */ + if (mapped < size) { + while (pgs[idx - 1] == pgsz) { + idx--; + mapped -= pgsz; + } + /* XXX We may increase beyond out starting point. */ + pgsz <<= 2; + pgs[idx++] = pgsz; + mapped += pgsz; + } } - /* Sort entry sizes, required to get proper entry address alignment. */ - qsort(entry_size, KERNEL_REGION_MAX_TLB_ENTRIES, - sizeof(vm_size_t), tlb1_entry_size_cmp); - - /* Load TLB1 entries. */ - for (i = 0; i < KERNEL_REGION_MAX_TLB_ENTRIES; i++) { - esz = entry_size[i]; - if (!esz) - break; - - CTR5(KTR_PMAP, "%s: entry %d: sz = 0x%08x (va = 0x%08x " - "pa = 0x%08x)", __func__, tlb1_idx, esz, va, pa); - - tlb1_set_entry(va, pa, esz, _TLB_ENTRY_MEM); - - va += esz; - pa += esz; + nents = idx; + mask = pgs[0] - 1; + /* Align address to the boundary */ + if (va & mask) { + va = (va + mask) & ~mask; + pa = (pa + mask) & ~mask; } - CTR3(KTR_PMAP, "%s: mapped size 0x%08x (wasted space 0x%08x)", - __func__, mapped_size, mapped_size - size); + for (idx = 0; idx < nents; idx++) { + pgsz = pgs[idx]; + debugf("%u: %x -> %x, size=%x\n", idx, pa, va, pgsz); + tlb1_set_entry(va, pa, pgsz, _TLB_ENTRY_MEM); + pa += pgsz; + va += pgsz; + } - return (mapped_size); + mapped = (va - base); + debugf("mapped size 0x%08x (wasted space 0x%08x)\n", + mapped, mapped - size); + return (mapped); } /* @@ -3017,19 +3013,39 @@ tlb1_mapin_region(vm_offset_t va, vm_offset_t pa, vm_size_t size) void tlb1_init(vm_offset_t ccsrbar) { - uint32_t mas0; + uint32_t mas0, mas1, mas3; + uint32_t tsz; + u_int i; - /* TLB1[0] is used to map the kernel. Save that entry. */ - mas0 = MAS0_TLBSEL(1) | MAS0_ESEL(0); - mtspr(SPR_MAS0, mas0); - __asm __volatile("isync; tlbre"); + if (bootinfo != NULL && bootinfo[0] != 1) { + tlb1_idx = *((uint16_t *)(bootinfo + 8)); + } else + tlb1_idx = 1; - tlb1[0].mas1 = mfspr(SPR_MAS1); - tlb1[0].mas2 = mfspr(SPR_MAS2); - tlb1[0].mas3 = mfspr(SPR_MAS3); + /* The first entry/entries are used to map the kernel. */ + for (i = 0; i < tlb1_idx; i++) { + mas0 = MAS0_TLBSEL(1) | MAS0_ESEL(i); + mtspr(SPR_MAS0, mas0); + __asm __volatile("isync; tlbre"); - /* Map in CCSRBAR in TLB1[1] */ - tlb1_idx = 1; + mas1 = mfspr(SPR_MAS1); + if ((mas1 & MAS1_VALID) == 0) + continue; + + mas3 = mfspr(SPR_MAS3); + + tlb1[i].mas1 = mas1; + tlb1[i].mas2 = mfspr(SPR_MAS2); + tlb1[i].mas3 = mas3; + + if (i == 0) + kernload = mas3 & MAS3_RPN; + + tsz = (mas1 & MAS1_TSIZE_MASK) >> MAS1_TSIZE_SHIFT; + kernsize += (tsz > 0) ? tsize2size(tsz) : 0; + } + + /* Map in CCSRBAR. */ tlb1_set_entry(CCSRBAR_VA, ccsrbar, CCSRBAR_SIZE, _TLB_ENTRY_IO); /* Setup TLB miss defaults */ From 5bfc249c2cecbe96aea17defde473a92cdfccb85 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Tue, 2 Aug 2011 17:49:27 +0000 Subject: [PATCH 126/452] Fix for arm and mips case the size of storage for sintrcnt/sintrnames. It seems that "info as" is not much precise on what expect by pseudo-op .word, by the way. No MFC is previewed for this patch. Tested by: andreast, pluknet Approved by: re (kib) --- sys/arm/arm/irq_dispatch.S | 4 ++-- sys/arm/sa11x0/sa11x0_irq.S | 2 +- sys/mips/mips/exception.S | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sys/arm/arm/irq_dispatch.S b/sys/arm/arm/irq_dispatch.S index e3577565ed3..c919de006bf 100644 --- a/sys/arm/arm/irq_dispatch.S +++ b/sys/arm/arm/irq_dispatch.S @@ -109,9 +109,9 @@ _C_LABEL(intrnames): _C_LABEL(intrcnt): .space NIRQ * 4 _C_LABEL(sintrnames): - .word NIRQ * (MAXCOMLEN + 1) + .int NIRQ * (MAXCOMLEN + 1) _C_LABEL(sintrcnt): - .word NIRQ * 4 + .int NIRQ * 4 .global _C_LABEL(current_intr_depth) _C_LABEL(current_intr_depth): diff --git a/sys/arm/sa11x0/sa11x0_irq.S b/sys/arm/sa11x0/sa11x0_irq.S index 3cc3d14f7c3..1cacc2ddf84 100644 --- a/sys/arm/sa11x0/sa11x0_irq.S +++ b/sys/arm/sa11x0/sa11x0_irq.S @@ -122,7 +122,7 @@ ENTRY(sa11x0_activateirqs) .global _C_LABEL(intrnames), _C_LABEL(sintrnames) _C_LABEL(intrnames): _C_LABEL(sintrnames): - .word 0 + .int 0 .globl _C_LABEL(intrcnt), _C_LABEL(sintrcnt) diff --git a/sys/mips/mips/exception.S b/sys/mips/mips/exception.S index 6eafbdcc640..729391e1efc 100644 --- a/sys/mips/mips/exception.S +++ b/sys/mips/mips/exception.S @@ -1143,7 +1143,7 @@ sintrnames: #ifdef __mips_n64 .quad INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 #else - .word INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 + .int INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 #endif .align 4 @@ -1153,7 +1153,7 @@ sintrcnt: #ifdef __mips_n64 .quad INTRCNT_COUNT * 4 * 2 #else - .word INTRCNT_COUNT * 4 * 2 + .int INTRCNT_COUNT * 4 * 2 #endif From eb46c93fa398d26c5a836b7243e84e2be77b650d Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 2 Aug 2011 18:12:19 +0000 Subject: [PATCH 127/452] Corrections for the iBCS2 support that seems to regressed from 4.x times. In particular: - fix format specifiers in the DPRINTFs; - do not use kernel_map for temporal mapping backed by the vnode, this cannot work since kernel map is a system map. Use exec_map instead. - ignore error code from an attempt to insert the hole. If supposed hole is located at the region already populated by .bss, it is not an error. - correctly translate vm error codes to errno, when appropriate. Reported and tested by: Rich Naill Approved by: re (kensmith) MFC after: 1 week --- sys/i386/ibcs2/imgact_coff.c | 64 +++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/sys/i386/ibcs2/imgact_coff.c b/sys/i386/ibcs2/imgact_coff.c index 4a3cb95f8d4..44a243cac83 100644 --- a/sys/i386/ibcs2/imgact_coff.c +++ b/sys/i386/ibcs2/imgact_coff.c @@ -91,9 +91,10 @@ load_coff_section(struct vmspace *vmspace, struct vnode *vp, vm_offset_t offset, map_len = round_page(offset + filsz) - trunc_page(map_offset); } - DPRINTF(("%s(%d): vm_mmap(&vmspace->vm_map, &0x%08lx, 0x%x, 0x%x, " + DPRINTF(("%s(%d): vm_mmap(&vmspace->vm_map, &0x%08jx, 0x%x, 0x%x, " "VM_PROT_ALL, MAP_PRIVATE | MAP_FIXED, OBJT_VNODE, vp, 0x%x)\n", - __FILE__, __LINE__, map_addr, map_len, prot, map_offset)); + __FILE__, __LINE__, (uintmax_t)map_addr, map_len, prot, + map_offset)); if ((error = vm_mmap(&vmspace->vm_map, &map_addr, @@ -123,16 +124,16 @@ load_coff_section(struct vmspace *vmspace, struct vnode *vp, vm_offset_t offset, map_addr = trunc_page((vm_offset_t)vmaddr + filsz); map_len = round_page((vm_offset_t)vmaddr + memsz) - map_addr; - DPRINTF(("%s(%d): vm_map_find(&vmspace->vm_map, NULL, 0, &0x%08lx,0x%x, FALSE, VM_PROT_ALL, VM_PROT_ALL, 0)\n", __FILE__, __LINE__, map_addr, map_len)); + DPRINTF(("%s(%d): vm_map_find(&vmspace->vm_map, NULL, 0, &0x%08jx,0x%x, VMFS_NO_SPACE, VM_PROT_ALL, VM_PROT_ALL, 0)\n", __FILE__, __LINE__, (uintmax_t)map_addr, map_len)); if (map_len != 0) { error = vm_map_find(&vmspace->vm_map, NULL, 0, &map_addr, - map_len, FALSE, VM_PROT_ALL, VM_PROT_ALL, 0); + map_len, VMFS_NO_SPACE, VM_PROT_ALL, VM_PROT_ALL, 0); if (error) - return error; + return (vm_mmap_to_errno(error)); } - if ((error = vm_mmap(kernel_map, + if ((error = vm_mmap(exec_map, (vm_offset_t *) &data_buf, PAGE_SIZE, VM_PROT_READ, @@ -145,7 +146,7 @@ load_coff_section(struct vmspace *vmspace, struct vnode *vp, vm_offset_t offset, error = copyout(data_buf, (caddr_t) map_addr, copy_len); - if (vm_map_remove(kernel_map, + if (vm_map_remove(exec_map, (vm_offset_t) data_buf, (vm_offset_t) data_buf + PAGE_SIZE)) panic("load_coff_section vm_map_remove failed"); @@ -213,7 +214,7 @@ coff_load_file(struct thread *td, char *name) */ VOP_UNLOCK(vp, 0); - if ((error = vm_mmap(kernel_map, + if ((error = vm_mmap(exec_map, (vm_offset_t *) &ptr, PAGE_SIZE, VM_PROT_READ, @@ -279,7 +280,7 @@ coff_load_file(struct thread *td, char *name) error = 0; dealloc_and_fail: - if (vm_map_remove(kernel_map, + if (vm_map_remove(exec_map, (vm_offset_t) ptr, (vm_offset_t) ptr + PAGE_SIZE)) panic("%s vm_map_remove failed", __func__); @@ -306,7 +307,7 @@ exec_coff_imgact(imgp) unsigned long text_offset = 0, text_address = 0, text_size = 0; unsigned long data_offset = 0, data_address = 0, data_size = 0; unsigned long bss_size = 0; - caddr_t hole; + vm_offset_t hole; if (fhdr->f_magic != I386_COFF || !(fhdr->f_flags & F_EXEC)) { @@ -343,9 +344,9 @@ exec_coff_imgact(imgp) for (i = 0; i < nscns; i++) { - DPRINTF(("i = %d, scns[i].s_name = %s, scns[i].s_vaddr = %08lx, " - "scns[i].s_scnptr = %d\n", i, scns[i].s_name, - scns[i].s_vaddr, scns[i].s_scnptr)); + DPRINTF(("i = %d, s_name = %s, s_vaddr = %08lx, " + "s_scnptr = %ld s_size = %lx\n", i, scns[i].s_name, + scns[i].s_vaddr, scns[i].s_scnptr, scns[i].s_size)); if (scns[i].s_flags & STYP_NOLOAD) { /* * A section that is not loaded, for whatever @@ -372,12 +373,12 @@ exec_coff_imgact(imgp) int len = round_page(scns[i].s_size + PAGE_SIZE); int j; - if ((error = vm_mmap(kernel_map, + if ((error = vm_mmap(exec_map, (vm_offset_t *) &buf, len, VM_PROT_READ, VM_PROT_READ, - 0, + MAP_SHARED, OBJT_VNODE, imgp->vp, foff)) != 0) { @@ -411,12 +412,16 @@ exec_coff_imgact(imgp) error = coff_load_file( FIRST_THREAD_IN_PROC(imgp->proc), libname); - if (error) + if (error) { + printf( + "error %d loading coff shared library %s\n", + error, libname); break; + } } free(libbuf, M_TEMP); } - if (vm_map_remove(kernel_map, + if (vm_map_remove(exec_map, (vm_offset_t) buf, (vm_offset_t) buf + len)) panic("exec_coff_imgact vm_map_remove failed"); @@ -429,7 +434,7 @@ exec_coff_imgact(imgp) */ DPRINTF(("%s(%d): load_coff_section(vmspace, " - "imgp->vp, %08lx, %08lx, 0x%x, 0x%x, 0x%x)\n", + "imgp->vp, %08lx, %08lx, 0x%lx, 0x%lx, 0x%x)\n", __FILE__, __LINE__, text_offset, text_address, text_size, text_size, VM_PROT_READ | VM_PROT_EXECUTE)); if ((error = load_coff_section(vmspace, imgp->vp, @@ -446,7 +451,7 @@ exec_coff_imgact(imgp) DPRINTF(("%s(%d): load_coff_section(vmspace, " - "imgp->vp, 0x%08lx, 0x%08lx, 0x%x, 0x%x, 0x%x)\n", + "imgp->vp, 0x%08lx, 0x%08lx, 0x%lx, 0x%lx, 0x%x)\n", __FILE__, __LINE__, data_offset, data_address, data_size + bss_size, data_size, VM_PROT_ALL)); if ((error = load_coff_section(vmspace, imgp->vp, @@ -467,26 +472,25 @@ exec_coff_imgact(imgp) vmspace->vm_taddr = (caddr_t)(void *)(uintptr_t)text_address; vmspace->vm_daddr = (caddr_t)(void *)(uintptr_t)data_address; - hole = (caddr_t)trunc_page((vm_offset_t)vmspace->vm_daddr) + ctob(vmspace->vm_dsize); + hole = trunc_page((vm_offset_t)vmspace->vm_daddr + + ctob(vmspace->vm_dsize)); - - DPRINTF(("%s(%d): vm_map_find(&vmspace->vm_map, NULL, 0, &0x%08lx, PAGE_SIZE, FALSE, VM_PROT_ALL, VM_PROT_ALL, 0)\n", - __FILE__, __LINE__, hole)); + DPRINTF(("%s(%d): vm_map_find(&vmspace->vm_map, NULL, 0, &0x%jx, PAGE_SIZE, FALSE, VM_PROT_ALL, VM_PROT_ALL, 0)\n", + __FILE__, __LINE__, (uintmax_t)hole)); DPRINTF(("imgact: error = %d\n", error)); - error = vm_map_find(&vmspace->vm_map, NULL, 0, - (vm_offset_t *) &hole, PAGE_SIZE, FALSE, - VM_PROT_ALL, VM_PROT_ALL, 0); - - DPRINTF(("IBCS2: start vm_dsize = 0x%x, vm_daddr = 0x%x end = 0x%x\n", + vm_map_find(&vmspace->vm_map, NULL, 0, + (vm_offset_t *)&hole, PAGE_SIZE, VMFS_NO_SPACE, + VM_PROT_ALL, VM_PROT_ALL, 0); + DPRINTF(("IBCS2: start vm_dsize = 0x%x, vm_daddr = 0x%p end = 0x%p\n", ctob(vmspace->vm_dsize), vmspace->vm_daddr, ctob(vmspace->vm_dsize) + vmspace->vm_daddr )); - DPRINTF(("%s(%d): returning successfully!\n", __FILE__, __LINE__)); + DPRINTF(("%s(%d): returning %d!\n", __FILE__, __LINE__, error)); fail: vn_lock(imgp->vp, LK_EXCLUSIVE | LK_RETRY); - return error; + return (error); } /* From f6c1d63e47e42b811f1b9f615f6bca28490b6258 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Tue, 2 Aug 2011 19:13:56 +0000 Subject: [PATCH 128/452] For mount, discover f_mntonname from supplied path argument using vn_fullpath_global(). This fixes f_mntonname if mounting inside chroot, jail or with relative path as argument. For unmount in jail, use vn_fullpath_global() to discover global path from supplied path argument. This fixes unmount in jail. Reviewed by: pjd, kib Approved by: re (kib) MFC after: 2 weeks --- sys/kern/vfs_mount.c | 49 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 5d6892c5e9b..d601c568652 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -745,7 +745,6 @@ static int vfs_domount_first( struct thread *td, /* Calling thread. */ struct vfsconf *vfsp, /* File system type. */ - char *fspath, /* Mount path. */ struct vnode *vp, /* Vnode to be covered. */ int fsflags, /* Flags common to all filesystems. */ struct vfsoptlist **optlist /* Options local to the filesystem. */ @@ -754,12 +753,25 @@ vfs_domount_first( struct vattr va; struct mount *mp; struct vnode *newdp; + char *fspath, *fbuf; int error; mtx_assert(&Giant, MA_OWNED); ASSERT_VOP_ELOCKED(vp, __func__); KASSERT((fsflags & MNT_UPDATE) == 0, ("MNT_UPDATE shouldn't be here")); + /* Construct global filesystem path from vp. */ + error = vn_fullpath_global(td, vp, &fspath, &fbuf); + if (error != 0) { + vput(vp); + return (error); + } + if (strlen(fspath) >= MNAMELEN) { + vput(vp); + free(fbuf, M_TEMP); + return (ENAMETOOLONG); + } + /* * If the user is not root, ensure that they own the directory * onto which we are attempting to mount. @@ -781,12 +793,14 @@ vfs_domount_first( } if (error != 0) { vput(vp); + free(fbuf, M_TEMP); return (error); } VOP_UNLOCK(vp, 0); /* Allocate and initialize the filesystem. */ mp = vfs_mount_alloc(vp, vfsp, fspath, td->td_ucred); + free(fbuf, M_TEMP); /* XXXMAC: pass to vfs_mount_alloc? */ mp->mnt_optnew = *optlist; /* Set the mount level flags. */ @@ -1069,12 +1083,10 @@ vfs_domount( mtx_lock(&Giant); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; - if ((fsflags & MNT_UPDATE) == 0) { - error = vfs_domount_first(td, vfsp, fspath, vp, fsflags, - optlist); - } else { + if ((fsflags & MNT_UPDATE) == 0) + error = vfs_domount_first(td, vfsp, vp, fsflags, optlist); + else error = vfs_domount_update(td, vp, fsflags, optlist); - } mtx_unlock(&Giant); ASSERT_VI_UNLOCKED(vp, __func__); @@ -1105,7 +1117,8 @@ unmount(td, uap) } */ *uap; { struct mount *mp; - char *pathbuf; + struct nameidata nd; + char *pathbuf, *rpathbuf, *fbuf; int error, id0, id1; AUDIT_ARG_VALUE(uap->flags); @@ -1140,6 +1153,28 @@ unmount(td, uap) mtx_unlock(&mountlist_mtx); } else { AUDIT_ARG_UPATH1(td, pathbuf); + /* + * If we are jailed and this is not a root jail try to find + * global path for path argument. + */ + if (jailed(td->td_ucred) && + td->td_ucred->cr_prison->pr_root != rootvnode) { + NDINIT(&nd, LOOKUP, + FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, + UIO_SYSSPACE, pathbuf, td); + if (namei(&nd) == 0) { + NDFREE(&nd, NDF_ONLY_PNBUF); + if (vn_fullpath_global(td, nd.ni_vp, &rpathbuf, + &fbuf) == 0) { + if (strlen(rpathbuf) < MNAMELEN) { + strlcpy(pathbuf, rpathbuf, + MNAMELEN); + } + free(fbuf, M_TEMP); + } + vput(nd.ni_vp); + } + } mtx_lock(&mountlist_mtx); TAILQ_FOREACH_REVERSE(mp, &mountlist, mntlist, mnt_list) { if (strcmp(mp->mnt_stat.f_mntonname, pathbuf) == 0) From 435d46675d86e84c1af413750dbc93db91bf1903 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Tue, 2 Aug 2011 19:44:40 +0000 Subject: [PATCH 129/452] Always disable mount and unmount for jails with enforce_statfs==2. A working statfs(2) is required for umount(8) in jail. Reviewed by: pjd, kib Approved by: re (kib) MFC after: 2 weeks --- sys/kern/kern_jail.c | 3 ++- usr.sbin/jail/jail.8 | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c index 584334af3ad..050563be9a9 100644 --- a/sys/kern/kern_jail.c +++ b/sys/kern/kern_jail.c @@ -3858,7 +3858,8 @@ prison_priv_check(struct ucred *cred, int priv) case PRIV_VFS_UNMOUNT: case PRIV_VFS_MOUNT_NONUSER: case PRIV_VFS_MOUNT_OWNER: - if (cred->cr_prison->pr_allow & PR_ALLOW_MOUNT) + if (cred->cr_prison->pr_allow & PR_ALLOW_MOUNT && + cred->cr_prison->pr_enforce_statfs < 2) return (0); else return (EPERM); diff --git a/usr.sbin/jail/jail.8 b/usr.sbin/jail/jail.8 index 8ed913a1eb0..c5a2245b0a3 100644 --- a/usr.sbin/jail/jail.8 +++ b/usr.sbin/jail/jail.8 @@ -393,6 +393,9 @@ The .Xr lsvfs 1 command can be used to find file system types available for mount from within a jail. +This permission is effective only if +.Va enforce_statfs +is set to a value lower than 2. .It Va allow.quotas The prison root may administer quotas on the jail's filesystem(s). This includes filesystems that the jail may share with other jails or @@ -746,9 +749,11 @@ It is not possible to or .Xr umount 8 any file system inside a jail unless the file system is marked -jail-friendly and the jail's +jail-friendly, the jail's .Va allow.mount -parameter is set. +parameter is set and the jail's +.Va enforce_statfs +parameter is lower than 2. .Pp Multiple jails sharing the same file system can influence each other. For example a user in one jail can fill the file system also From d7f74bdca7cbe04ec3556d9a8a74f0218696a03c Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Tue, 2 Aug 2011 23:06:59 +0000 Subject: [PATCH 130/452] There's no ':' after GLOBAL(). Missed due to no SMP testing. Approved by: re (blanket) --- sys/powerpc/booke/locore.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/powerpc/booke/locore.S b/sys/powerpc/booke/locore.S index 95e50b06b52..58e722ec092 100644 --- a/sys/powerpc/booke/locore.S +++ b/sys/powerpc/booke/locore.S @@ -242,7 +242,7 @@ done_mapping: __boot_page: bl 1f -GLOBAL(kernload_ap): +GLOBAL(kernload_ap) .long 0 /* From d50c56183e3666420cc3c028d72ea842b3130305 Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Tue, 2 Aug 2011 23:33:44 +0000 Subject: [PATCH 131/452] It's invalid to use GLOBAL() for kernload_ap, as the macro switches to the .data section. We need kernload_ap in the boot page. Approved by: re (blanket) --- sys/powerpc/booke/locore.S | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/powerpc/booke/locore.S b/sys/powerpc/booke/locore.S index 58e722ec092..293eec34bdd 100644 --- a/sys/powerpc/booke/locore.S +++ b/sys/powerpc/booke/locore.S @@ -242,7 +242,8 @@ done_mapping: __boot_page: bl 1f -GLOBAL(kernload_ap) + .globl kernload_ap +kernload_ap: .long 0 /* From 5ce36fdb77d24c0805eae170a31a322a70afb7af Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Tue, 2 Aug 2011 23:49:23 +0000 Subject: [PATCH 132/452] Cross a T and dot an I: o Fix awkward use of braces in combination with mis-indentation. A mistake, that happened to yield the right behaviour? o Fix typo in comment. No functional change. Approved by: re (blanket) --- sys/powerpc/booke/platform_bare.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sys/powerpc/booke/platform_bare.c b/sys/powerpc/booke/platform_bare.c index 2ec50d24d54..ca3cfa2e845 100644 --- a/sys/powerpc/booke/platform_bare.c +++ b/sys/powerpc/booke/platform_bare.c @@ -178,13 +178,14 @@ bare_timebase_freq(platform_t plat, struct cpuref *cpuref) phandle_t cpus, child; pcell_t freq; - if (bootinfo != NULL) + if (bootinfo != NULL) { if (bootinfo[0] == 1) { /* Backward compatibility. See 8-STABLE. */ ticks = bootinfo[3] >> 3; } else { - /* Compatbility with Juniper's loader. */ + /* Compatibility with Juniper's loader. */ ticks = bootinfo[5] >> 3; + } } else ticks = 0; From 52227d94dfff236e4397868f2629f063811bcd8a Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 3 Aug 2011 06:51:14 +0000 Subject: [PATCH 133/452] Remove the EEPROM minor >= 19 check for txgaintype; that's only needed for Merlin / v14 eeprom formats. Approved by: re (kib, blanket) --- sys/dev/ath/ath_hal/ah_eeprom_v4k.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah_eeprom_v4k.c b/sys/dev/ath/ath_hal/ah_eeprom_v4k.c index 348ab607130..927f08e394d 100644 --- a/sys/dev/ath/ath_hal/ah_eeprom_v4k.c +++ b/sys/dev/ath/ath_hal/ah_eeprom_v4k.c @@ -75,8 +75,7 @@ v4kEepromGet(struct ath_hal *ah, int param, void *val) case AR_EEP_RXGAIN_TYPE: return AR5416_EEP_RXGAIN_ORIG; case AR_EEP_TXGAIN_TYPE: - return IS_VERS(>=, AR5416_EEP_MINOR_VER_19) ? - pBase->txGainType : AR5416_EEP_TXGAIN_ORIG; + return pBase->txGainType; case AR_EEP_OL_PWRCTRL: HALASSERT(val == AH_NULL); return HAL_EIO; From a8375da0d32591f81e799a2bcebebc4ba918ed12 Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Wed, 3 Aug 2011 09:55:59 +0000 Subject: [PATCH 134/452] fix a serious bug in libproc's proc_attach proc_attach always frees any struct proc_handle data that it allocates, but that is supposed to be done only in error conditions. PR: bin/158431 Approved by: re (kib) MFC after: 1 week --- lib/libproc/proc_create.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/libproc/proc_create.c b/lib/libproc/proc_create.c index c372a4771a9..9bd24a232b2 100644 --- a/lib/libproc/proc_create.c +++ b/lib/libproc/proc_create.c @@ -79,12 +79,11 @@ proc_attach(pid_t pid, int flags, struct proc_handle **pphdl) else phdl->status = PS_STOP; +out: if (error) proc_free(phdl); else *pphdl = phdl; -out: - proc_free(phdl); return (error); } From b1698e1f6b48cfe30f7efd6c97726c155fa62ec5 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 3 Aug 2011 13:36:14 +0000 Subject: [PATCH 135/452] * Fix a clash in structure naming which occurs with (closed source) radar detection code. This is just to make porting the atheros radar code easier. * add a missing space. Approved by: re (kib, blanket) --- sys/dev/ath/ath_hal/ah.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h index 711ef4a9784..58d63486677 100644 --- a/sys/dev/ath/ath_hal/ah.h +++ b/sys/dev/ath/ath_hal/ah.h @@ -751,14 +751,14 @@ typedef enum { #define HAL_DFS_EVENT_EXTEARLY 0x0000004 #define HAL_DFS_EVENT_ISDC 0x0000008 -struct dfs_event { +struct hal_dfs_event { uint64_t re_full_ts; /* 64-bit full timestamp from interrupt time */ uint32_t re_ts; /* Original 15 bit recv timestamp */ uint8_t re_rssi; /* rssi of radar event */ uint8_t re_dur; /* duration of radar pulse */ uint32_t re_flags; /* Flags (see above) */ }; -typedef struct dfs_event HAL_DFS_EVENT; +typedef struct hal_dfs_event HAL_DFS_EVENT; typedef struct { @@ -769,7 +769,7 @@ typedef struct int ah_dma_beacon_response_time;/* in TU's */ int ah_sw_beacon_response_time; /* in TU's */ int ah_additional_swba_backoff; /* in TU's */ -}HAL_OPS_CONFIG; +} HAL_OPS_CONFIG; /* * Hardware Access Layer (HAL) API. From 844537c1e0d0f8766e4559e6b9604ac5f7ad0c50 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 3 Aug 2011 13:39:11 +0000 Subject: [PATCH 136/452] Add in a dirty hack that allows for AR9280/AR9285/AR9287 embedded systems, in the same way that AR9130 embedded systems work. This isn't -everything- that is required - the PCI glue still needs to be taught about the eepromdata hint, along the same lines as the AHB glue. Approved by: re (kib, blanket) --- sys/dev/ath/ath_hal/ar9002/ar9280_attach.c | 8 ++++++++ sys/dev/ath/ath_hal/ar9002/ar9285_attach.c | 10 +++++++++- sys/dev/ath/ath_hal/ar9002/ar9287_attach.c | 8 ++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c index 4f4b8baf2b4..014838b967e 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c @@ -28,6 +28,8 @@ #include "ar5416/ar5416reg.h" #include "ar5416/ar5416phy.h" +#include "ar9001/ar9130_eeprom.h" + #include "ar9002/ar9280v1.ini" #include "ar9002/ar9280v2.ini" #include "ar9002/ar9280_olc.h" @@ -191,6 +193,12 @@ ar9280Attach(uint16_t devid, HAL_SOFTC sc, AH5416(ah)->ah_rx_chainmask = AR9280_DEFAULT_RXCHAINMASK; AH5416(ah)->ah_tx_chainmask = AR9280_DEFAULT_TXCHAINMASK; + if (eepromdata) { + AH_PRIVATE((ah))->ah_eepromRead = ar9130EepromRead; + AH_PRIVATE((ah))->ah_eepromWrite = NULL; + ah->ah_eepromdata = eepromdata; + } + if (!ar5416SetResetReg(ah, HAL_RESET_POWER_ON)) { /* reset chip */ HALDEBUG(ah, HAL_DEBUG_ANY, "%s: couldn't reset chip\n", diff --git a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c index 02c7b9892aa..4301d0968f4 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c @@ -29,6 +29,8 @@ #include "ar5416/ar5416reg.h" #include "ar5416/ar5416phy.h" +#include "ar9001/ar9130_eeprom.h" + #include "ar9002/ar9285.ini" #include "ar9002/ar9285v2.ini" #include "ar9002/ar9280v2.ini" /* XXX ini for tx/rx gain */ @@ -153,7 +155,13 @@ ar9285Attach(uint16_t devid, HAL_SOFTC sc, AH5416(ah)->ah_writeIni = ar9285WriteIni; AH5416(ah)->ah_rx_chainmask = AR9285_DEFAULT_RXCHAINMASK; AH5416(ah)->ah_tx_chainmask = AR9285_DEFAULT_TXCHAINMASK; - + + if (eepromdata) { + AH_PRIVATE((ah))->ah_eepromRead = ar9130EepromRead; + AH_PRIVATE((ah))->ah_eepromWrite = NULL; + ah->ah_eepromdata = eepromdata; + } + ahp->ah_maxTxTrigLev = MAX_TX_FIFO_THRESHOLD >> 1; if (!ar5416SetResetReg(ah, HAL_RESET_POWER_ON)) { diff --git a/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c index 78400f52f95..96a3fde1e91 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c @@ -30,6 +30,8 @@ #include "ar5416/ar5416reg.h" #include "ar5416/ar5416phy.h" +#include "ar9001/ar9130_eeprom.h" + #include "ar9002/ar9287_cal.h" #include "ar9002/ar9287_reset.h" #include "ar9002/ar9287_olc.h" @@ -168,6 +170,12 @@ ar9287Attach(uint16_t devid, HAL_SOFTC sc, AH5416(ah)->ah_rx_chainmask = AR9287_DEFAULT_RXCHAINMASK; AH5416(ah)->ah_tx_chainmask = AR9287_DEFAULT_TXCHAINMASK; + if (eepromdata) { + AH_PRIVATE((ah))->ah_eepromRead = ar9130EepromRead; + AH_PRIVATE((ah))->ah_eepromWrite = NULL; + ah->ah_eepromdata = eepromdata; + } + if (!ar5416SetResetReg(ah, HAL_RESET_POWER_ON)) { /* reset chip */ HALDEBUG(ah, HAL_DEBUG_ANY, "%s: couldn't reset chip\n", From 06521fbb495acc8b88e7af3e8c5e69b5d4f332d9 Mon Sep 17 00:00:00 2001 From: Zack Kirsch Date: Wed, 3 Aug 2011 18:50:19 +0000 Subject: [PATCH 137/452] Fix an NFS server issue where it was not correctly setting the eof flag when a READ had hit the end of the file. Also, clean up some cruft in the code. Approved by: re (kib) Reviewed by: rmacklem MFC after: 2 weeks --- sys/fs/nfsserver/nfs_nfsdserv.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index 436d44c34d7..d234e91816f 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -620,7 +620,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram, vnode_t vp, NFSPROC_T *p, struct nfsexstuff *exp) { u_int32_t *tl; - int error = 0, cnt, len, getret = 1, reqlen, eof = 0; + int error = 0, cnt, getret = 1, reqlen, eof = 0; mbuf_t m2, m3; struct nfsvattr nva; off_t off = 0x0; @@ -714,11 +714,11 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram, eof = 1; } else if (reqlen == 0) cnt = 0; - else if ((off + reqlen) > nva.na_size) + else if ((off + reqlen) >= nva.na_size) { cnt = nva.na_size - off; - else + eof = 1; + } else cnt = reqlen; - len = NFSM_RNDUP(cnt); m3 = NULL; if (cnt > 0) { nd->nd_repstat = nfsvno_read(vp, off, cnt, nd->nd_cred, p, @@ -748,7 +748,7 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram, *tl++ = txdr_unsigned(cnt); } else NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED); - if (len < reqlen || eof) + if (eof) *tl++ = newnfs_true; else *tl++ = newnfs_false; From 8998619212f3a1c489079256ef1f6a26a7d7612c Mon Sep 17 00:00:00 2001 From: Brooks Davis Date: Wed, 3 Aug 2011 19:14:22 +0000 Subject: [PATCH 138/452] Add support for dynamically adjusted buffers to allow the full use of the bandwidth of long fat pipes (i.e. 100Mbps+ trans-oceanic or trans-continental links). Bandwidth-delay products up to 64MB are supported. Also add support (not compiled by default) for the None cypher. The None cypher can only be enabled on non-interactive sessions (those without a pty where -T was not used) and must be enabled in both the client and server configuration files and on the client command line. Additionally, the None cypher will only be activated after authentication is complete. To enable the None cypher you must add -DNONE_CIPHER_ENABLED to CFLAGS via the make command line or in /etc/make.conf. This code is a style(9) compliant version of these features extracted from the patches published at: http://www.psc.edu/networking/projects/hpn-ssh/ Merging this patch has been a collaboration between me and Bjoern. Reviewed by: bz Approved by: re (kib), des (maintainer) --- crypto/openssh/README.hpn | 120 +++++++++++++++++++++++++++++++++++ crypto/openssh/buffer.c | 10 ++- crypto/openssh/buffer.h | 3 + crypto/openssh/channels.c | 98 ++++++++++++++++++++++++---- crypto/openssh/channels.h | 10 +++ crypto/openssh/cipher.c | 14 +++- crypto/openssh/clientloop.c | 36 ++++++++--- crypto/openssh/compat.c | 11 ++++ crypto/openssh/compat.h | 2 + crypto/openssh/kex.c | 26 +++++++- crypto/openssh/kex.h | 5 ++ crypto/openssh/misc.c | 32 ++++++++++ crypto/openssh/misc.h | 2 + crypto/openssh/myproposal.h | 5 ++ crypto/openssh/packet.c | 26 ++++++++ crypto/openssh/packet.h | 7 ++ crypto/openssh/readconf.c | 92 +++++++++++++++++++++++++++ crypto/openssh/readconf.h | 12 ++++ crypto/openssh/servconf.c | 66 +++++++++++++++++++ crypto/openssh/servconf.h | 10 +++ crypto/openssh/serverloop.c | 15 ++++- crypto/openssh/session.c | 18 ++++-- crypto/openssh/sftp.1 | 3 +- crypto/openssh/sftp.c | 3 +- crypto/openssh/ssh.c | 54 +++++++++++++++- crypto/openssh/sshconnect.c | 30 ++++++++- crypto/openssh/sshconnect2.c | 34 ++++++++++ crypto/openssh/sshd.c | 19 +++++- crypto/openssh/sshd_config | 12 ++++ crypto/openssh/version.c | 10 +-- crypto/openssh/version.h | 5 +- 31 files changed, 747 insertions(+), 43 deletions(-) create mode 100644 crypto/openssh/README.hpn diff --git a/crypto/openssh/README.hpn b/crypto/openssh/README.hpn new file mode 100644 index 00000000000..674827fb6b4 --- /dev/null +++ b/crypto/openssh/README.hpn @@ -0,0 +1,120 @@ +Notes: + +NONE CIPHER: + To use the NONE option you must have the NoneEnabled switch set on the server + and you MUST have *both* NoneEnabled and NoneSwitch set to yes on the client. + The NONE feature works with ALL ssh subsystems (as far as we can tell) + as long as there is no tty allocated. + If a user uses the -T switch to prevent a tty being created the NONE cipher + will be disabled. + + +PERFORMANCE: + The performance increase will only be as good as the network and TCP stack + tuning on the reciever side of the connection allows. As a rule of thumb a + user will need at least 10Mb/s connection with a 100ms RTT to see a doubling + of performance. + The HPN-SSH home page http://www.psc.edu/networking/projects/hpn-ssh + describes this in greater detail. + + +BUFFER SIZES: +- if HPN is disabled the receive buffer size will be set to the OpenSSH default + of 64K. + +- if a HPN system connects to a non-HPN system the receive buffer will + be set to the HPNBufferSize value. The default is 2MB but user adjustable. + +- If a HPN to HPN connection is established a number of different things might + happen based on the user options and conditions. + + Conditions: HPNBufferSize NOT Set, TCPRcvBufPoll enabled, TCPRcvBuf NOT Set + Result: HPN Buffer Size = up to 64MB + This is the default state. The HPN buffer size will grow to a maximum of + 64MB as the TCP receive buffer grows. The maximum HPN Buffer size of 64MB + is geared towards 10GigE transcontinental connections. + + Conditions: HPNBufferSize NOT Set, TCPRcvBufPoll disabled, TCPRcvBuf NOT Set + Result: HPN Buffer Size = TCP receive buffer value. + Users on non-autotuning systesm should disable TCPRcvBufPoll in the + ssh_cofig and sshd_config + + Conditions: HPNBufferSize SET, TCPRcvBufPoll disabled, TCPRcvBuf NOT Set + Result: HPN Buffer Size = minmum of TCP receive buffer and HPNBufferSize. + This would be the system defined TCP receive buffer (RWIN). + + Conditions: HPNBufferSize SET, TCPRcvBufPoll disabled, TCPRcvBuf SET + Result: HPN Buffer Size = minmum of TCPRcvBuf and HPNBufferSize. + Generally there is no need to set both. + + Conditions: HPNBufferSize SET, TCPRcvBufPoll enabled, TCPRcvBuf NOT Set + Result: HPN Buffer Size = grows to HPNBufferSize + The buffer will grow up to the maximum size specified here. + + Conditions: HPNBufferSize SET, TCPRcvBufPoll enabled, TCPRcvBuf SET + Result: HPN Buffer Size = minmum of TCPRcvBuf and HPNBufferSize. + Generally there is no need to set both of these, especially on autotuning + systems. However, if the users wishes to override the autotuning this would + be one way to do it. + + Conditions: HPNBufferSize NOT Set, TCPRcvBufPoll enabled, TCPRcvBuf SET + Result: HPN Buffer Size = TCPRcvBuf. + This will override autotuning and set the TCP recieve buffer to the user + defined value. + + +HPN SPECIFIC CONFIGURATION OPTIONS: + +- HPNDisabled=[yes/no] client/server + In some situations, such as transfers on a local area network, the impact + of the HPN code produces a net decrease in performance. In these cases it is + helpful to disable the HPN functionality. By default HPNDisabled is set to no. + +- HPNBufferSize=[int]KB client/server + This is the default buffer size the HPN functionality uses when interacting + with non-HPN SSH installations. Conceptually this is similar to the TcpRcvBuf + option as applied to the internal SSH flow control. This value can range from + 1KB to 64MB (1-65536). Use of oversized or undersized buffers can cause + performance problems depending on the roud trip time of the network path. + The default size of this buffer is 2MB. + +- TcpRcvBufPoll=[yes/no] client/server + Enable or disable the polling of the TCP receive buffer through the life + of the connection. You would want to make sure that this option is enabled + for systems making use of autotuning kernels (linux 2.4.24+, 2.6, MS Vista, + FreeBSD 7.x and later). Default is yes. + +- TcpRcvBuf=[int]KB client + Set the TCP socket receive buffer to n Kilobytes. It can be set up to the + maximum socket size allowed by the system. This is useful in situations where + the TCP receive window is set low but the maximum buffer size is set higher + (as is typical). This works on a per TCP connection basis. You can also use + this to artifically limit the transfer rate of the connection. In these cases + the throughput will be no more than n/RTT. The minimum buffer size is 1KB. + Default is the current system wide TCP receive buffer size. + +- NoneEnabled=[yes/no] client/server + Enable or disable the use of the None cipher. Care must always be used when + enabling this as it will allow users to send data in the clear. However, it + is important to note that authentication information remains encrypted even + if this option is enabled. Set to no by default. + +- NoneSwitch=[yes/no] client + Switch the encryption cipher being used to the None cipher after + authentication takes place. NoneEnabled must be enabled on both the client + and server side of the connection. When the connection switches to the NONE + cipher a warning is sent to STDERR. The connection attempt will fail with an + error if a client requests a NoneSwitch from the server that does not + explicitly have NoneEnabled set to yes. + Note: The NONE cipher cannot be used in interactive (shell) sessions and it + will fail silently. Set to no by default. + + +CREDITS: + + This patch was conceived, designed, and led by Chris Rapier (rapier@psc.edu) + The majority of the actual coding for versions up to HPN12v1 was performed + by Michael Stevens (mstevens@andrew.cmu.edu). + The MT-AES-CTR cipher was implemented by Ben Bennet (ben@psc.edu). + This work was financed, in part, by Cisco System, Inc., the National Library + of Medicine, and the National Science Foundation. diff --git a/crypto/openssh/buffer.c b/crypto/openssh/buffer.c index ae9700344d2..a3202c601d5 100644 --- a/crypto/openssh/buffer.c +++ b/crypto/openssh/buffer.c @@ -1,4 +1,5 @@ /* $OpenBSD: buffer.c,v 1.32 2010/02/09 03:56:28 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -25,7 +26,7 @@ #include "log.h" #define BUFFER_MAX_CHUNK 0x100000 -#define BUFFER_MAX_LEN 0xa00000 +#define BUFFER_MAX_LEN 0x4000000 /* 64MB */ #define BUFFER_ALLOCSZ 0x008000 /* Initializes the buffer structure. */ @@ -165,6 +166,13 @@ buffer_len(const Buffer *buffer) return buffer->end - buffer->offset; } +/* Returns the maximum number of bytes of data that may be in the buffer. */ +u_int +buffer_get_max_len(void) +{ + return (BUFFER_MAX_LEN); +} + /* Gets data from the beginning of the buffer. */ int diff --git a/crypto/openssh/buffer.h b/crypto/openssh/buffer.h index e2a9dd1002a..c35f53fe428 100644 --- a/crypto/openssh/buffer.h +++ b/crypto/openssh/buffer.h @@ -1,4 +1,5 @@ /* $OpenBSD: buffer.h,v 1.21 2010/08/31 11:54:45 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen @@ -46,6 +47,8 @@ int buffer_get_ret(Buffer *, void *, u_int); int buffer_consume_ret(Buffer *, u_int); int buffer_consume_end_ret(Buffer *, u_int); +u_int buffer_get_max_len(void); + #include void buffer_put_bignum(Buffer *, const BIGNUM *); diff --git a/crypto/openssh/channels.c b/crypto/openssh/channels.c index 6abe2d01273..bf7072a1c0e 100644 --- a/crypto/openssh/channels.c +++ b/crypto/openssh/channels.c @@ -1,4 +1,5 @@ /* $OpenBSD: channels.c,v 1.310 2010/11/24 01:24:14 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -170,6 +171,11 @@ static void port_open_helper(Channel *c, char *rtype); static int connect_next(struct channel_connect *); static void channel_connect_ctx_free(struct channel_connect *); +/* -- HPN */ + +static int hpn_disabled = 0; +static u_int buffer_size = CHAN_HPN_MIN_WINDOW_DEFAULT; + /* -- channel core */ Channel * @@ -309,6 +315,7 @@ channel_new(char *ctype, int type, int rfd, int wfd, int efd, c->self = found; c->type = type; c->ctype = ctype; + c->dynamic_window = 0; c->local_window = window; c->local_window_max = window; c->local_consumed = 0; @@ -808,11 +815,46 @@ channel_pre_open_13(Channel *c, fd_set *readset, fd_set *writeset) FD_SET(c->sock, writeset); } +static u_int +channel_tcpwinsz(void) +{ + u_int32_t tcpwinsz; + socklen_t optsz; + int ret, sd; + u_int maxlen; + + /* If we are not on a socket return 128KB. */ + if (!packet_connection_is_on_socket()) + return (128 * 1024); + + tcpwinsz = 0; + optsz = sizeof(tcpwinsz); + sd = packet_get_connection_in(); + ret = getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &tcpwinsz, &optsz); + + /* Return no more than the maximum buffer size. */ + maxlen = buffer_get_max_len(); + if ((ret == 0) && tcpwinsz > maxlen) + tcpwinsz = maxlen; + /* In case getsockopt() failed return a minimum. */ + if (tcpwinsz == 0) + tcpwinsz = CHAN_TCP_WINDOW_DEFAULT; + debug2("tcpwinsz: %d for connection: %d", tcpwinsz, sd); + return (tcpwinsz); +} + static void channel_pre_open(Channel *c, fd_set *readset, fd_set *writeset) { - u_int limit = compat20 ? c->remote_window : packet_get_maxsize(); + u_int limit; + /* Check buffer limits. */ + if (!c->tcpwinsz || c->dynamic_window > 0) + c->tcpwinsz = channel_tcpwinsz(); + + limit = MIN(compat20 ? c->remote_window : packet_get_maxsize(), + 2 * c->tcpwinsz); + if (c->istate == CHAN_INPUT_OPEN && limit > 0 && buffer_len(&c->input) < limit && @@ -1789,14 +1831,25 @@ channel_check_window(Channel *c) c->local_maxpacket*3) || c->local_window < c->local_window_max/2) && c->local_consumed > 0) { + u_int addition = 0; + + /* Adjust max window size if we are in a dynamic environment. */ + if (c->dynamic_window && c->tcpwinsz > c->local_window_max) { + /* + * Grow the window somewhat aggressively to maintain + * pressure. + */ + addition = 1.5 * (c->tcpwinsz - c->local_window_max); + c->local_window_max += addition; + } packet_start(SSH2_MSG_CHANNEL_WINDOW_ADJUST); packet_put_int(c->remote_id); - packet_put_int(c->local_consumed); + packet_put_int(c->local_consumed + addition); packet_send(); debug2("channel %d: window %d sent adjust %d", c->self, c->local_window, c->local_consumed); - c->local_window += c->local_consumed; + c->local_window += c->local_consumed + addition; c->local_consumed = 0; } return 1; @@ -2634,6 +2687,15 @@ channel_set_af(int af) IPv4or6 = af; } +void +channel_set_hpn(int disabled, u_int buf_size) +{ + hpn_disabled = disabled; + buffer_size = buf_size; + debug("HPN Disabled: %d, HPN Buffer Size: %d", + hpn_disabled, buffer_size); +} + static int channel_setup_fwd_listener(int type, const char *listen_addr, u_short listen_port, int *allocated_listen_port, @@ -2786,10 +2848,18 @@ channel_setup_fwd_listener(int type, const char *listen_addr, *allocated_listen_port); } - /* Allocate a channel number for the socket. */ - c = channel_new("port listener", type, sock, sock, -1, - CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, - 0, "port listener", 1); + /* + * Allocate a channel number for the socket. Explicitly test + * for hpn disabled option. If true use smaller window size. + */ + if (hpn_disabled) + c = channel_new("port listener", type, sock, sock, -1, + CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, + 0, "port listener", 1); + else + c = channel_new("port listener", type, sock, sock, -1, + buffer_size, CHAN_TCP_PACKET_DEFAULT, + 0, "port listener", 1); c->path = xstrdup(host); c->host_port = port_to_connect; c->listening_port = listen_port; @@ -3334,10 +3404,16 @@ x11_create_display_inet(int x11_display_offset, int x11_use_localhost, *chanids = xcalloc(num_socks + 1, sizeof(**chanids)); for (n = 0; n < num_socks; n++) { sock = socks[n]; - nc = channel_new("x11 listener", - SSH_CHANNEL_X11_LISTENER, sock, sock, -1, - CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT, - 0, "X11 inet listener", 1); + if (hpn_disabled) + nc = channel_new("x11 listener", + SSH_CHANNEL_X11_LISTENER, sock, sock, -1, + CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT, + 0, "X11 inet listener", 1); + else + nc = channel_new("x11 listener", + SSH_CHANNEL_X11_LISTENER, sock, sock, -1, + buffer_size, CHAN_X11_PACKET_DEFAULT, + 0, "X11 inet listener", 1); nc->single_connection = single_connection; (*chanids)[n] = nc->self; } diff --git a/crypto/openssh/channels.h b/crypto/openssh/channels.h index 0680ed00e46..a967a7e1aa9 100644 --- a/crypto/openssh/channels.h +++ b/crypto/openssh/channels.h @@ -1,4 +1,5 @@ /* $OpenBSD: channels.h,v 1.104 2010/05/14 23:29:23 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen @@ -125,6 +126,8 @@ struct Channel { u_int local_window_max; u_int local_consumed; u_int local_maxpacket; + u_int tcpwinsz; + int dynamic_window; int extended_usage; int single_connection; @@ -162,11 +165,15 @@ struct Channel { /* default window/packet sizes for tcp/x11-fwd-channel */ #define CHAN_SES_PACKET_DEFAULT (32*1024) #define CHAN_SES_WINDOW_DEFAULT (64*CHAN_SES_PACKET_DEFAULT) + #define CHAN_TCP_PACKET_DEFAULT (32*1024) #define CHAN_TCP_WINDOW_DEFAULT (64*CHAN_TCP_PACKET_DEFAULT) + #define CHAN_X11_PACKET_DEFAULT (16*1024) #define CHAN_X11_WINDOW_DEFAULT (4*CHAN_X11_PACKET_DEFAULT) +#define CHAN_HPN_MIN_WINDOW_DEFAULT (2*1024*1024) + /* possible input states */ #define CHAN_INPUT_OPEN 0 #define CHAN_INPUT_WAIT_DRAIN 1 @@ -294,4 +301,7 @@ void chan_rcvd_ieof(Channel *); void chan_write_failed(Channel *); void chan_obuf_empty(Channel *); +/* hpn handler */ +void channel_set_hpn(int, u_int); + #endif diff --git a/crypto/openssh/cipher.c b/crypto/openssh/cipher.c index bb5c0ac3a2c..28afa4597f0 100644 --- a/crypto/openssh/cipher.c +++ b/crypto/openssh/cipher.c @@ -1,4 +1,5 @@ /* $OpenBSD: cipher.c,v 1.82 2009/01/26 09:58:15 markus Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -163,7 +164,12 @@ ciphers_valid(const char *names) for ((p = strsep(&cp, CIPHER_SEP)); p && *p != '\0'; (p = strsep(&cp, CIPHER_SEP))) { c = cipher_by_name(p); - if (c == NULL || c->number != SSH_CIPHER_SSH2) { +#ifdef NONE_CIPHER_ENABLED + if (c == NULL || (c->number != SSH_CIPHER_SSH2 && + c->number != SSH_CIPHER_NONE)) { +#else + if (c == NULL || (c->number != SSH_CIPHER_SSH2)) { +#endif debug("bad cipher %s [%s]", p, names); xfree(cipher_list); return 0; @@ -337,6 +343,9 @@ cipher_get_keyiv(CipherContext *cc, u_char *iv, u_int len) int evplen; switch (c->number) { +#ifdef NONE_CIPHER_ENABLED + case SSH_CIPHER_NONE: +#endif case SSH_CIPHER_SSH2: case SSH_CIPHER_DES: case SSH_CIPHER_BLOWFISH: @@ -371,6 +380,9 @@ cipher_set_keyiv(CipherContext *cc, u_char *iv) int evplen = 0; switch (c->number) { +#ifdef NONE_CIPHER_ENABLED + case SSH_CIPHER_NONE: +#endif case SSH_CIPHER_SSH2: case SSH_CIPHER_DES: case SSH_CIPHER_BLOWFISH: diff --git a/crypto/openssh/clientloop.c b/crypto/openssh/clientloop.c index f6c1444a385..05487f266d6 100644 --- a/crypto/openssh/clientloop.c +++ b/crypto/openssh/clientloop.c @@ -1,4 +1,5 @@ /* $OpenBSD: clientloop.c,v 1.231 2011/01/16 12:05:59 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1768,9 +1769,14 @@ client_request_x11(const char *request_type, int rchan) sock = x11_connect_display(); if (sock < 0) return NULL; - c = channel_new("x11", - SSH_CHANNEL_X11_OPEN, sock, sock, -1, - CHAN_TCP_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT, 0, "x11", 1); + if (options.hpn_disabled) + c = channel_new("x11", SSH_CHANNEL_X11_OPEN, sock, sock, -1, + CHAN_TCP_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT, + 0, "x11", 1); + else + c = channel_new("x11", SSH_CHANNEL_X11_OPEN, sock, sock, -1, + options.hpn_buffer_size, CHAN_X11_PACKET_DEFAULT, + 0, "x11", 1); c->force_drain = 1; return c; } @@ -1790,10 +1796,16 @@ client_request_agent(const char *request_type, int rchan) sock = ssh_get_authentication_socket(); if (sock < 0) return NULL; - c = channel_new("authentication agent connection", - SSH_CHANNEL_OPEN, sock, sock, -1, - CHAN_X11_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, - "authentication agent connection", 1); + if (options.hpn_disabled) + c = channel_new("authentication agent connection", + SSH_CHANNEL_OPEN, sock, sock, -1, + CHAN_X11_WINDOW_DEFAULT, CHAN_TCP_WINDOW_DEFAULT, 0, + "authentication agent connection", 1); + else + c = channel_new("authentication agent connection", + SSH_CHANNEL_OPEN, sock, sock, -1, + options.hpn_buffer_size, options.hpn_buffer_size, 0, + "authentication agent connection", 1); c->force_drain = 1; return c; } @@ -1820,8 +1832,14 @@ client_request_tun_fwd(int tun_mode, int local_tun, int remote_tun) return -1; } - c = channel_new("tun", SSH_CHANNEL_OPENING, fd, fd, -1, - CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, "tun", 1); + if (options.hpn_disabled) + c = channel_new("tun", SSH_CHANNEL_OPENING, fd, fd, -1, + CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, + 0, "tun", 1); + else + c = channel_new("tun", SSH_CHANNEL_OPENING, fd, fd, -1, + options.hpn_buffer_size, CHAN_TCP_PACKET_DEFAULT, + 0, "tun", 1); c->datagram = 1; #if defined(SSH_TUN_FILTER) diff --git a/crypto/openssh/compat.c b/crypto/openssh/compat.c index df3541df70e..d685f6dc9ae 100644 --- a/crypto/openssh/compat.c +++ b/crypto/openssh/compat.c @@ -1,4 +1,5 @@ /* $OpenBSD: compat.c,v 1.78 2008/09/11 14:22:37 markus Exp $ */ +/* $FreeBSD$ */ /* * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl. All rights reserved. * @@ -170,6 +171,16 @@ compat_datafellows(const char *version) strlen(check[i].pat), 0) == 1) { debug("match: %s pat %s", version, check[i].pat); datafellows = check[i].bugs; + /* + * Check to see if the remote side is OpenSSH and not + * HPN. It is utterly strange to check it from the + * version string and expose the option that way. + */ + if (strstr(version,"OpenSSH") != NULL && + strstr(version,"hpn") == NULL) { + datafellows |= SSH_BUG_LARGEWINDOW; + debug("Remote is not HPN-aware"); + } return; } } diff --git a/crypto/openssh/compat.h b/crypto/openssh/compat.h index 16cf282a7ae..b8405267fde 100644 --- a/crypto/openssh/compat.h +++ b/crypto/openssh/compat.h @@ -1,4 +1,5 @@ /* $OpenBSD: compat.h,v 1.42 2008/09/11 14:22:37 markus Exp $ */ +/* $FReeBSD$ */ /* * Copyright (c) 1999, 2000, 2001 Markus Friedl. All rights reserved. @@ -58,6 +59,7 @@ #define SSH_OLD_FORWARD_ADDR 0x01000000 #define SSH_BUG_RFWD_ADDR 0x02000000 #define SSH_NEW_OPENSSH 0x04000000 +#define SSH_BUG_LARGEWINDOW 0x08000000 void enable_compat13(void); void enable_compat20(void); diff --git a/crypto/openssh/kex.c b/crypto/openssh/kex.c index c65e28f94de..ca3c4206a10 100644 --- a/crypto/openssh/kex.c +++ b/crypto/openssh/kex.c @@ -1,4 +1,5 @@ /* $OpenBSD: kex.c,v 1.86 2010/09/22 05:01:29 djm Exp $ */ +/* $FreeBSD$ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * @@ -90,8 +91,13 @@ kex_names_valid(const char *names) return 1; } -/* put algorithm proposal into buffer */ +/* Put algorithm proposal into buffer. */ +#ifndef NONE_CIPHER_ENABLED static void +#else +/* Also used in sshconnect2.c. */ +void +#endif kex_prop2buf(Buffer *b, char *proposal[PROPOSAL_MAX]) { u_int i; @@ -407,6 +413,9 @@ kex_choose_conf(Kex *kex) int nenc, nmac, ncomp; u_int mode, ctos, need; int first_kex_follows, type; +#ifdef NONE_CIPHER_ENABLED + int auth_flag; +#endif my = kex_buf2prop(&kex->my, NULL); peer = kex_buf2prop(&kex->peer, &first_kex_follows); @@ -430,6 +439,10 @@ kex_choose_conf(Kex *kex) } /* Algorithm Negotiation */ +#ifdef NONE_CIPHER_ENABLED + auth_flag = packet_get_authentication_state(); + debug ("AUTH STATE is %d", auth_flag); +#endif for (mode = 0; mode < MODE_MAX; mode++) { newkeys = xcalloc(1, sizeof(*newkeys)); kex->newkeys[mode] = newkeys; @@ -441,6 +454,17 @@ kex_choose_conf(Kex *kex) choose_enc (&newkeys->enc, cprop[nenc], sprop[nenc]); choose_mac (&newkeys->mac, cprop[nmac], sprop[nmac]); choose_comp(&newkeys->comp, cprop[ncomp], sprop[ncomp]); +#ifdef NONE_CIPHER_ENABLED + debug("REQUESTED ENC.NAME is '%s'", newkeys->enc.name); + if (strcmp(newkeys->enc.name, "none") == 0) { + debug("Requesting NONE. Authflag is %d", auth_flag); + if (auth_flag == 1) + debug("None requested post authentication."); + else + fatal("Pre-authentication none cipher requests " + "are not allowed."); + } +#endif debug("kex: %s %s %s %s", ctos ? "client->server" : "server->client", newkeys->enc.name, diff --git a/crypto/openssh/kex.h b/crypto/openssh/kex.h index 7373d3c789f..fc5bdf6e03a 100644 --- a/crypto/openssh/kex.h +++ b/crypto/openssh/kex.h @@ -1,4 +1,5 @@ /* $OpenBSD: kex.h,v 1.52 2010/09/22 05:01:29 djm Exp $ */ +/* $FreeBSD$ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. @@ -140,6 +141,10 @@ struct Kex { int kex_names_valid(const char *); +#ifdef NONE_CIPHER_ENABLED +void kex_prop2buf(Buffer *, char *[PROPOSAL_MAX]); +#endif + Kex *kex_setup(char *[PROPOSAL_MAX]); void kex_finish(Kex *); diff --git a/crypto/openssh/misc.c b/crypto/openssh/misc.c index 919b04e6b7a..1fc3ae74cb8 100644 --- a/crypto/openssh/misc.c +++ b/crypto/openssh/misc.c @@ -1,4 +1,5 @@ /* $OpenBSD: misc.c,v 1.84 2010/11/21 01:01:13 djm Exp $ */ +/* $FreeBSD$ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2005,2006 Damien Miller. All rights reserved. @@ -996,3 +997,34 @@ sock_set_v6only(int s) error("setsockopt IPV6_V6ONLY: %s", strerror(errno)); #endif } + +void +sock_get_rcvbuf(int *size, int rcvbuf) +{ + int sock, socksize; + socklen_t socksizelen = sizeof(socksize); + + /* + * Create a socket but do not connect it. We use it + * only to get the rcv socket size. + */ + sock = socket(AF_INET6, SOCK_STREAM, 0); + if (sock < 0) + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) + return; + + /* + * If the tcp_rcv_buf option is set and passed in, attempt to set the + * buffer size to its value. + */ + if (rcvbuf) + setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void *)&rcvbuf, + sizeof(rcvbuf)); + + if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, + &socksize, &socksizelen) == 0) + if (size != NULL) + *size = socksize; + close(sock); +} diff --git a/crypto/openssh/misc.h b/crypto/openssh/misc.h index 65cf4a6163f..19149ed3fc2 100644 --- a/crypto/openssh/misc.h +++ b/crypto/openssh/misc.h @@ -1,4 +1,5 @@ /* $OpenBSD: misc.h,v 1.47 2010/11/21 01:01:13 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen @@ -36,6 +37,7 @@ void sanitise_stdfd(void); void ms_subtract_diff(struct timeval *, int *); void ms_to_timeval(struct timeval *, int); void sock_set_v6only(int); +void sock_get_rcvbuf(int *, int); struct passwd *pwcopy(struct passwd *); const char *ssh_gai_strerror(int); diff --git a/crypto/openssh/myproposal.h b/crypto/openssh/myproposal.h index 2c43607a7bd..30948c2f9e2 100644 --- a/crypto/openssh/myproposal.h +++ b/crypto/openssh/myproposal.h @@ -1,4 +1,5 @@ /* $OpenBSD: myproposal.h,v 1.27 2010/09/01 22:42:13 djm Exp $ */ +/* $FreeBSD$ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -75,6 +76,10 @@ "arcfour256,arcfour128," \ "aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc," \ "aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se" +#ifdef NONE_CIPHER_ENABLED +#define KEX_ENCRYPT_INCLUDE_NONE KEX_DEFAULT_ENCRYPT \ + ",none" +#endif #define KEX_DEFAULT_MAC \ "hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160," \ "hmac-ripemd160@openssh.com," \ diff --git a/crypto/openssh/packet.c b/crypto/openssh/packet.c index b4e01f716b4..6f2bdc390af 100644 --- a/crypto/openssh/packet.c +++ b/crypto/openssh/packet.c @@ -1,4 +1,5 @@ /* $OpenBSD: packet.c,v 1.172 2010/11/13 23:27:50 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -195,6 +196,9 @@ struct session_state { }; static struct session_state *active_state, *backup_state; +#ifdef NONE_CIPHER_ENABLED +static int rekey_requested = 0; +#endif static struct session_state * alloc_session_state(void) @@ -1861,12 +1865,26 @@ packet_send_ignore(int nbytes) } } +#ifdef NONE_CIPHER_ENABLED +void +packet_request_rekeying(void) +{ + rekey_requested = 1; +} +#endif + #define MAX_PACKETS (1U<<31) int packet_need_rekeying(void) { if (datafellows & SSH_BUG_NOREKEY) return 0; +#ifdef NONE_CIPHER_ENABLED + if (rekey_requested == 1) { + rekey_requested = 0; + return 1; + } +#endif return (active_state->p_send.packets > MAX_PACKETS) || (active_state->p_read.packets > MAX_PACKETS) || @@ -1958,3 +1976,11 @@ packet_restore_state(void) add_recv_bytes(len); } } + +#ifdef NONE_CIPHER_ENABLED +int +packet_get_authentication_state(void) +{ + return (active_state->after_authentication); +} +#endif diff --git a/crypto/openssh/packet.h b/crypto/openssh/packet.h index d516aae8d49..16e33cdcd53 100644 --- a/crypto/openssh/packet.h +++ b/crypto/openssh/packet.h @@ -1,4 +1,5 @@ /* $OpenBSD: packet.h,v 1.55 2010/11/13 23:27:50 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen @@ -38,6 +39,9 @@ void packet_set_interactive(int, int, int); int packet_is_interactive(void); void packet_set_server(void); void packet_set_authenticated(void); +#ifdef NONE_CIPHER_ENABLED +int packet_get_authentication_state(void); +#endif void packet_start(u_char); void packet_put_char(int ch); @@ -117,6 +121,9 @@ do { \ } while (0) int packet_need_rekeying(void); +#ifdef NONE_CIPHER_ENABLED +void packet_request_rekeying(void); +#endif void packet_set_rekey_limit(u_int32_t); void packet_backup_state(void); diff --git a/crypto/openssh/readconf.c b/crypto/openssh/readconf.c index 43779afe791..17a93a64124 100644 --- a/crypto/openssh/readconf.c +++ b/crypto/openssh/readconf.c @@ -1,4 +1,5 @@ /* $OpenBSD: readconf.c,v 1.190 2010/11/13 23:27:50 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -138,6 +139,10 @@ typedef enum { oTunnel, oTunnelDevice, oLocalCommand, oPermitLocalCommand, oVisualHostKey, oUseRoaming, oZeroKnowledgePasswordAuthentication, oKexAlgorithms, oIPQoS, + oHPNDisabled, oHPNBufferSize, oTcpRcvBufPoll, oTcpRcvBuf, +#ifdef NONE_CIPHER_ENABLED + oNoneEnabled, oNoneSwitch, +#endif oVersionAddendum, oDeprecated, oUnsupported } OpCodes; @@ -249,6 +254,14 @@ static struct { #endif { "kexalgorithms", oKexAlgorithms }, { "ipqos", oIPQoS }, + { "hpndisabled", oHPNDisabled }, + { "hpnbuffersize", oHPNBufferSize }, + { "tcprcvbufpoll", oTcpRcvBufPoll }, + { "tcprcvbuf", oTcpRcvBuf }, +#ifdef NONE_CIPHER_ENABLED + { "noneenabled", oNoneEnabled }, + { "noneswitch", oNoneSwitch }, +#endif { "versionaddendum", oVersionAddendum }, { NULL, oBadOption } @@ -1021,6 +1034,47 @@ parse_int: } while (arg != NULL && *arg != '\0'); break; + case oHPNDisabled: + intptr = &options->hpn_disabled; + goto parse_flag; + + case oHPNBufferSize: + intptr = &options->hpn_buffer_size; + goto parse_int; + + case oTcpRcvBufPoll: + intptr = &options->tcp_rcv_buf_poll; + goto parse_flag; + + case oTcpRcvBuf: + intptr = &options->tcp_rcv_buf; + goto parse_int; + +#ifdef NONE_CIPHER_ENABLED + case oNoneEnabled: + intptr = &options->none_enabled; + goto parse_flag; + + /* + * We check to see if the command comes from the command line or not. + * If it does then enable it otherwise fail. NONE must never be a + * default configuration. + */ + case oNoneSwitch: + if (strcmp(filename,"command-line") == 0) { + intptr = &options->none_switch; + goto parse_flag; + } else { + debug("NoneSwitch directive found in %.200s.", + filename); + error("NoneSwitch is found in %.200s.\n" + "You may only use this configuration option " + "from the command line", filename); + error("Continuing..."); + return 0; + } +#endif + case oDeprecated: debug("%s line %d: Deprecated option \"%s\"", filename, linenum, keyword); @@ -1181,6 +1235,14 @@ initialize_options(Options * options) options->zero_knowledge_password_authentication = -1; options->ip_qos_interactive = -1; options->ip_qos_bulk = -1; + options->hpn_disabled = -1; + options->hpn_buffer_size = -1; + options->tcp_rcv_buf_poll = -1; + options->tcp_rcv_buf = -1; +#ifdef NONE_CIPHER_ENABLED + options->none_enabled = -1; + options->none_switch = -1; +#endif } /* @@ -1345,6 +1407,36 @@ fill_default_options(Options * options) /* options->hostname will be set in the main program if appropriate */ /* options->host_key_alias should not be set by default */ /* options->preferred_authentications will be set in ssh */ + if (options->hpn_disabled == -1) + options->hpn_disabled = 0; + if (options->hpn_buffer_size > -1) + { + u_int maxlen; + + /* If a user tries to set the size to 0 set it to 1KB. */ + if (options->hpn_buffer_size == 0) + options->hpn_buffer_size = 1024; + /* Limit the buffer to BUFFER_MAX_LEN. */ + maxlen = buffer_get_max_len(); + if (options->hpn_buffer_size > (maxlen / 1024)) { + debug("User requested buffer larger than %ub: %ub. " + "Request reverted to %ub", maxlen, + options->hpn_buffer_size * 1024, maxlen); + options->hpn_buffer_size = maxlen; + } + debug("hpn_buffer_size set to %d", options->hpn_buffer_size); + } + if (options->tcp_rcv_buf == 0) + options->tcp_rcv_buf = 1; + if (options->tcp_rcv_buf > -1) + options->tcp_rcv_buf *= 1024; + if (options->tcp_rcv_buf_poll == -1) + options->tcp_rcv_buf_poll = 1; +#ifdef NONE_CIPHER_ENABLED + /* options->none_enabled must not be set by default */ + if (options->none_switch == -1) + options->none_switch = 0; +#endif } /* diff --git a/crypto/openssh/readconf.h b/crypto/openssh/readconf.h index ee160dfe7b1..195f6e74d62 100644 --- a/crypto/openssh/readconf.h +++ b/crypto/openssh/readconf.h @@ -1,4 +1,5 @@ /* $OpenBSD: readconf.h,v 1.88 2010/11/13 23:27:50 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen @@ -132,6 +133,17 @@ typedef struct { int use_roaming; + int hpn_disabled; /* Switch to disable HPN buffer management. */ + int hpn_buffer_size; /* User definable size for HPN buffer + * window. */ + int tcp_rcv_buf_poll; /* Option to poll recv buf every window + * transfer. */ + int tcp_rcv_buf; /* User switch to set tcp recv buffer. */ + +#ifdef NONE_CIPHER_ENABLED + int none_enabled; /* Allow none to be used */ + int none_switch; /* Use none cipher */ +#endif } Options; #define SSHCTL_MASTER_NO 0 diff --git a/crypto/openssh/servconf.c b/crypto/openssh/servconf.c index c742e13098c..96761e7251d 100644 --- a/crypto/openssh/servconf.c +++ b/crypto/openssh/servconf.c @@ -1,4 +1,5 @@ /* $OpenBSD: servconf.c,v 1.213 2010/11/13 23:27:50 djm Exp $ */ +/* $FreeBSD$ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -141,6 +142,12 @@ initialize_server_options(ServerOptions *options) options->authorized_principals_file = NULL; options->ip_qos_interactive = -1; options->ip_qos_bulk = -1; + options->hpn_disabled = -1; + options->hpn_buffer_size = -1; + options->tcp_rcv_buf_poll = -1; +#ifdef NONE_CIPHER_ENABLED + options->none_enabled = -1; +#endif } void @@ -283,6 +290,37 @@ fill_default_server_options(ServerOptions *options) options->ip_qos_interactive = IPTOS_LOWDELAY; if (options->ip_qos_bulk == -1) options->ip_qos_bulk = IPTOS_THROUGHPUT; + if (options->hpn_disabled == -1) + options->hpn_disabled = 0; + if (options->hpn_buffer_size == -1) { + /* + * HPN buffer size option not explicitly set. Try to figure + * out what value to use or resort to default. + */ + options->hpn_buffer_size = CHAN_SES_WINDOW_DEFAULT; + if (!options->hpn_disabled) { + sock_get_rcvbuf(&options->hpn_buffer_size, 0); + debug ("HPN Buffer Size: %d", options->hpn_buffer_size); + } + } else { + /* + * In the case that the user sets both values in a + * contradictory manner hpn_disabled overrrides hpn_buffer_size. + */ + if (options->hpn_disabled <= 0) { + u_int maxlen; + + maxlen = buffer_get_max_len(); + if (options->hpn_buffer_size == 0) + options->hpn_buffer_size = 1; + /* Limit the maximum buffer to BUFFER_MAX_LEN. */ + if (options->hpn_buffer_size > maxlen / 1024) + options->hpn_buffer_size = maxlen; + else + options->hpn_buffer_size *= 1024; + } else + options->hpn_buffer_size = CHAN_TCP_WINDOW_DEFAULT; + } /* Turn privilege separation on by default */ if (use_privsep == -1) @@ -330,6 +368,10 @@ typedef enum { sZeroKnowledgePasswordAuthentication, sHostCertificate, sRevokedKeys, sTrustedUserCAKeys, sAuthorizedPrincipalsFile, sKexAlgorithms, sIPQoS, + sHPNDisabled, sHPNBufferSize, sTcpRcvBufPoll, +#ifdef NONE_CIPHER_ENABLED + sNoneEnabled, +#endif sVersionAddendum, sDeprecated, sUnsupported } ServerOpCodes; @@ -455,6 +497,12 @@ static struct { { "authorizedprincipalsfile", sAuthorizedPrincipalsFile, SSHCFG_ALL }, { "kexalgorithms", sKexAlgorithms, SSHCFG_GLOBAL }, { "ipqos", sIPQoS, SSHCFG_ALL }, + { "hpndisabled", sHPNDisabled, SSHCFG_ALL }, + { "hpnbuffersize", sHPNBufferSize, SSHCFG_ALL }, + { "tcprcvbufpoll", sTcpRcvBufPoll, SSHCFG_ALL }, +#ifdef NONE_CIPHER_ENABLED + { "noneenabled", sNoneEnabled, SSHCFG_ALL }, +#endif { "versionaddendum", sVersionAddendum, SSHCFG_GLOBAL }, { NULL, sBadOption, 0 } }; @@ -1409,6 +1457,24 @@ process_server_config_line(ServerOptions *options, char *line, } while (arg != NULL && *arg != '\0'); break; + case sHPNDisabled: + intptr = &options->hpn_disabled; + goto parse_flag; + + case sHPNBufferSize: + intptr = &options->hpn_buffer_size; + goto parse_int; + + case sTcpRcvBufPoll: + intptr = &options->tcp_rcv_buf_poll; + goto parse_flag; + +#ifdef NONE_CIPHER_ENABLED + case sNoneEnabled: + intptr = &options->none_enabled; + goto parse_flag; +#endif + case sDeprecated: logit("%s line %d: Deprecated option %s", filename, linenum, arg); diff --git a/crypto/openssh/servconf.h b/crypto/openssh/servconf.h index 5a058a41644..f6aadac3a80 100644 --- a/crypto/openssh/servconf.h +++ b/crypto/openssh/servconf.h @@ -1,4 +1,5 @@ /* $OpenBSD: servconf.h,v 1.95 2010/11/13 23:27:50 djm Exp $ */ +/* $OpenBSD$ */ /* * Author: Tatu Ylonen @@ -160,6 +161,15 @@ typedef struct { char *revoked_keys_file; char *trusted_user_ca_keys; char *authorized_principals_file; + + int hpn_disabled; /* Disable HPN functionality. */ + int hpn_buffer_size; /* Set HPN buffer size - default 2MB.*/ + int tcp_rcv_buf_poll; /* Poll TCP rcv window in autotuning + * kernels. */ + +#ifdef NONE_CIPHER_ENABLED + int none_enabled; /* Enable NONE cipher switch. */ +#endif } ServerOptions; void initialize_server_options(ServerOptions *); diff --git a/crypto/openssh/serverloop.c b/crypto/openssh/serverloop.c index 8be01c5c37c..7606937cca3 100644 --- a/crypto/openssh/serverloop.c +++ b/crypto/openssh/serverloop.c @@ -1,4 +1,5 @@ /* $OpenBSD: serverloop.c,v 1.159 2009/05/28 16:50:16 andreas Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -726,7 +727,7 @@ server_loop(pid_t pid, int fdin_arg, int fdout_arg, int fderr_arg) /* Wait until all output has been sent to the client. */ drain_output(); - debug("End of interactive session; stdin %ld, stdout (read %ld, sent %ld), stderr %ld bytes.", + debug("End of interactive session; stdin %ld, stdout (read %ld, " "sent %ld), stderr %ld bytes.", stdin_bytes, fdout_bytes, stdout_bytes, stderr_bytes); /* Free and clear the buffers. */ @@ -998,8 +999,14 @@ server_request_tun(void) sock = tun_open(tun, mode); if (sock < 0) goto done; - c = channel_new("tun", SSH_CHANNEL_OPEN, sock, sock, -1, - CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, "tun", 1); + if (options.hpn_disabled) + c = channel_new("tun", SSH_CHANNEL_OPEN, sock, sock, -1, + CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, + "tun", 1); + else + c = channel_new("tun", SSH_CHANNEL_OPEN, sock, sock, -1, + options.hpn_buffer_size, CHAN_TCP_PACKET_DEFAULT, 0, + "tun", 1); c->datagram = 1; #if defined(SSH_TUN_FILTER) if (mode == SSH_TUNMODE_POINTOPOINT) @@ -1035,6 +1042,8 @@ server_request_session(void) c = channel_new("session", SSH_CHANNEL_LARVAL, -1, -1, -1, /*window size*/0, CHAN_SES_PACKET_DEFAULT, 0, "server-session", 1); + if (!options.hpn_disabled && options.tcp_rcv_buf_poll) + c->dynamic_window = 1; if (session_open(the_authctxt, c->self) != 1) { debug("session open failed, free channel %d", c->self); channel_free(c); diff --git a/crypto/openssh/session.c b/crypto/openssh/session.c index 242a86190f2..b04e629974b 100644 --- a/crypto/openssh/session.c +++ b/crypto/openssh/session.c @@ -1,4 +1,5 @@ /* $OpenBSD: session.c,v 1.258 2010/11/25 04:10:09 djm Exp $ */ +/* $FreeBSD$ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -232,7 +233,10 @@ auth_input_request_forwarding(struct passwd * pw) goto authsock_err; } - /* Allocate a channel for the authentication agent socket. */ + /* + * Allocate a channel for the authentication agent socket. + * Ignore HPN on that one given no improvement expected. + */ nc = channel_new("auth socket", SSH_CHANNEL_AUTH_SOCKET, sock, sock, -1, CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT, @@ -2283,10 +2287,14 @@ session_set_fds(Session *s, int fdin, int fdout, int fderr, int ignore_fderr, */ if (s->chanid == -1) fatal("no channel for session %d", s->self); - channel_set_fds(s->chanid, - fdout, fdin, fderr, - ignore_fderr ? CHAN_EXTENDED_IGNORE : CHAN_EXTENDED_READ, - 1, is_tty, CHAN_SES_WINDOW_DEFAULT); + if (options.hpn_disabled) + channel_set_fds(s->chanid, fdout, fdin, fderr, + ignore_fderr ? CHAN_EXTENDED_IGNORE : CHAN_EXTENDED_READ, + 1, is_tty, CHAN_SES_WINDOW_DEFAULT); + else + channel_set_fds(s->chanid, fdout, fdin, fderr, + ignore_fderr ? CHAN_EXTENDED_IGNORE : CHAN_EXTENDED_READ, + 1, is_tty, options.hpn_buffer_size); } /* diff --git a/crypto/openssh/sftp.1 b/crypto/openssh/sftp.1 index 6b506fec8d6..41694829180 100644 --- a/crypto/openssh/sftp.1 +++ b/crypto/openssh/sftp.1 @@ -242,7 +242,8 @@ diagnostic messages from Specify how many requests may be outstanding at any one time. Increasing this may slightly improve file transfer speed but will increase memory usage. -The default is 64 outstanding requests. +The default is 256 outstanding requests providing for 8MB +of outstanding data with a 32KB buffer. .It Fl r Recursively copy entire directories when uploading and downloading. Note that diff --git a/crypto/openssh/sftp.c b/crypto/openssh/sftp.c index ab667f5a55e..0fb420a8979 100644 --- a/crypto/openssh/sftp.c +++ b/crypto/openssh/sftp.c @@ -1,4 +1,5 @@ /* $OpenBSD: sftp.c,v 1.132 2010/12/04 00:18:01 djm Exp $ */ +/* $FreeBSD$ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -69,7 +70,7 @@ typedef void EditLine; #include "sftp-client.h" #define DEFAULT_COPY_BUFLEN 32768 /* Size of buffer for up/download */ -#define DEFAULT_NUM_REQUESTS 64 /* # concurrent outstanding requests */ +#define DEFAULT_NUM_REQUESTS 256 /* # concurrent outstanding requests */ /* File to read commands from */ FILE* infile; diff --git a/crypto/openssh/ssh.c b/crypto/openssh/ssh.c index c9b29fb6b8a..1d21f933615 100644 --- a/crypto/openssh/ssh.c +++ b/crypto/openssh/ssh.c @@ -1,4 +1,5 @@ /* $OpenBSD: ssh.c,v 1.356 2011/01/06 22:23:53 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -546,6 +547,15 @@ main(int ac, char **av) break; case 'T': no_tty_flag = 1; +#ifdef NONE_CIPHER_ENABLED + /* + * Ensure that the user does not try to backdoor a + * NONE cipher switch on an interactive session by + * explicitly disabling it if the user asks for a + * session without a tty. + */ + options.none_switch = 0; +#endif break; case 'o': dummy = 1; @@ -1368,9 +1378,46 @@ ssh_session2_open(void) if (!isatty(err)) set_nonblock(err); - window = CHAN_SES_WINDOW_DEFAULT; + /* + * We need to check to see what to do about buffer sizes here. + * - In an HPN to non-HPN connection we want to limit the window size to + * something reasonable in case the far side has the large window bug. + * - In an HPN to HPN connection we want to use the max window size but + * allow the user to override it. + * - Lastly if HPN is disabled then use the ssh standard window size. + * + * We cannot just do a getsockopt() here and set the ssh window to that + * as in case of autotuning of socket buffers the window would get stuck + * at the initial buffer size, generally less than 96k. Therefore we + * need to set the maximum ssh window size to the maximum HPN buffer + * size unless the user has set TcpRcvBufPoll to no. In that case we + * can just set the window to the minimum of HPN buffer size and TCP + * receive buffer size. + */ + if (tty_flag) + options.hpn_buffer_size = CHAN_SES_WINDOW_DEFAULT; + else + options.hpn_buffer_size = CHAN_HPN_MIN_WINDOW_DEFAULT; + + if (datafellows & SSH_BUG_LARGEWINDOW) { + debug("HPN to Non-HPN Connection"); + } else if (options.tcp_rcv_buf_poll <= 0) { + sock_get_rcvbuf(&options.hpn_buffer_size, 0); + debug("HPNBufferSize set to TCP RWIN: %d", + options.hpn_buffer_size); + } else if (options.tcp_rcv_buf > 0) { + sock_get_rcvbuf(&options.hpn_buffer_size, + options.tcp_rcv_buf); + debug("HPNBufferSize set to user TCPRcvBuf: %d", + options.hpn_buffer_size); + } + debug("Final hpn_buffer_size = %d", options.hpn_buffer_size); + channel_set_hpn(options.hpn_disabled, options.hpn_buffer_size); + window = options.hpn_buffer_size; + packetmax = CHAN_SES_PACKET_DEFAULT; if (tty_flag) { + window = CHAN_SES_WINDOW_DEFAULT; window >>= 1; packetmax >>= 1; } @@ -1378,7 +1425,10 @@ ssh_session2_open(void) "session", SSH_CHANNEL_OPENING, in, out, err, window, packetmax, CHAN_EXTENDED_WRITE, "client-session", /*nonblock*/0); - + if (!options.hpn_disabled && options.tcp_rcv_buf_poll > 0) { + c->dynamic_window = 1; + debug("Enabled Dynamic Window Scaling\n"); + } debug3("ssh_session2_open: channel_new: %d", c->self); channel_send_open(c->self); diff --git a/crypto/openssh/sshconnect.c b/crypto/openssh/sshconnect.c index 3e55b5dd09a..0615b44f149 100644 --- a/crypto/openssh/sshconnect.c +++ b/crypto/openssh/sshconnect.c @@ -182,6 +182,29 @@ ssh_kill_proxy_command(void) kill(proxy_command_pid, SIGHUP); } +/* + * Set TCP receive buffer if requested. + * Note: tuning needs to happen after the socket is created but before the + * connection happens so winscale is negotiated properly. + */ +static void +ssh_set_socket_recvbuf(int sock) +{ + void *buf = (void *)&options.tcp_rcv_buf; + int socksize, sz = sizeof(options.tcp_rcv_buf); + socklen_t len = sizeof(int); + + debug("setsockopt attempting to set SO_RCVBUF to %d", + options.tcp_rcv_buf); + if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, buf, sz) >= 0) { + getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &socksize, &len); + debug("setsockopt SO_RCVBUF: %.100s %d", strerror(errno), + socksize); + } else + error("Couldn't set socket receive buffer to %d: %.100s", + options.tcp_rcv_buf, strerror(errno)); +} + /* * Creates a (possibly privileged) socket for use as the ssh connection. */ @@ -205,6 +228,8 @@ ssh_create_socket(int privileged, struct addrinfo *ai) strerror(errno)); else debug("Allocated local port %d.", p); + if (options.tcp_rcv_buf > 0) + ssh_set_socket_recvbuf(sock); return sock; } sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); @@ -214,6 +239,9 @@ ssh_create_socket(int privileged, struct addrinfo *ai) } fcntl(sock, F_SETFD, FD_CLOEXEC); + if (options.tcp_rcv_buf > 0) + ssh_set_socket_recvbuf(sock); + /* Bind the socket to an alternative local IP address */ if (options.bind_address == NULL) return sock; @@ -557,7 +585,7 @@ ssh_exchange_identification(int timeout_ms) snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s%s", compat20 ? PROTOCOL_MAJOR_2 : PROTOCOL_MAJOR_1, compat20 ? PROTOCOL_MINOR_2 : minor1, - SSH_VERSION, compat20 ? "\r\n" : "\n"); + SSH_RELEASE, compat20 ? "\r\n" : "\n"); if (roaming_atomicio(vwrite, connection_out, buf, strlen(buf)) != strlen(buf)) fatal("write: %.100s", strerror(errno)); diff --git a/crypto/openssh/sshconnect2.c b/crypto/openssh/sshconnect2.c index 3cb9b101cb8..7352276fd95 100644 --- a/crypto/openssh/sshconnect2.c +++ b/crypto/openssh/sshconnect2.c @@ -1,4 +1,5 @@ /* $OpenBSD: sshconnect2.c,v 1.186 2010/11/29 23:45:51 djm Exp $ */ +/* $FreeBSD$ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -81,6 +82,16 @@ extern char *client_version_string; extern char *server_version_string; extern Options options; +#ifdef NONE_CIPHER_ENABLED +extern Kex *xxx_kex; + +/* + * tty_flag is set in ssh.c so we can use it here. If set then prevent + * the switch to the null cipher. + */ + +extern int tty_flag; +#endif /* * SSH2 key exchange @@ -419,6 +430,29 @@ ssh_userauth2(const char *local_user, const char *server_user, char *host, pubkey_cleanup(&authctxt); dispatch_range(SSH2_MSG_USERAUTH_MIN, SSH2_MSG_USERAUTH_MAX, NULL); +#ifdef NONE_CIPHER_ENABLED + /* + * If the user explicitly requests to use the none cipher enable it + * post authentication and only if the right conditions are met: both + * of the NONE switches must be true and there must be no tty allocated. + */ + if (options.none_switch == 1 && options.none_enabled == 1) { + if (!tty_flag) { + debug("Requesting none cipher re-keying..."); + myproposal[PROPOSAL_ENC_ALGS_STOC] = "none"; + myproposal[PROPOSAL_ENC_ALGS_CTOS] = "none"; + kex_prop2buf(&xxx_kex->my, myproposal); + packet_request_rekeying(); + fprintf(stderr, "WARNING: enabled NONE cipher\n"); + } else { + /* Requested NONE cipher on an interactive session. */ + debug("Cannot switch to NONE cipher with tty " + "allocated"); + fprintf(stderr, "NONE cipher switch disabled given " + "a TTY is allocated\n"); + } + } +#endif debug("Authentication succeeded (%s).", authctxt.method->name); } diff --git a/crypto/openssh/sshd.c b/crypto/openssh/sshd.c index 18d2d8e88be..a6c9943e4fa 100644 --- a/crypto/openssh/sshd.c +++ b/crypto/openssh/sshd.c @@ -1,4 +1,5 @@ /* $OpenBSD: sshd.c,v 1.381 2011/01/11 06:13:10 djm Exp $ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -429,7 +430,7 @@ sshd_exchange_identification(int sock_in, int sock_out) minor = PROTOCOL_MINOR_1; } snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s%s", major, minor, - SSH_VERSION, newline); + SSH_RELEASE, newline); server_version_string = xstrdup(buf); /* Send our protocol version identification. */ @@ -1011,6 +1012,8 @@ server_listen(void) int ret, listen_sock, on = 1; struct addrinfo *ai; char ntop[NI_MAXHOST], strport[NI_MAXSERV]; + int socksize; + socklen_t len; for (ai = options.listen_addrs; ai; ai = ai->ai_next) { if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) @@ -1051,6 +1054,11 @@ server_listen(void) debug("Bind to port %s on %s.", strport, ntop); + len = sizeof(socksize); + getsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &socksize, &len); + debug("Server TCP RWIN socket size: %d", socksize); + debug("HPN Buffer Size: %d", options.hpn_buffer_size); + /* Bind the socket to the desired port. */ if (bind(listen_sock, ai->ai_addr, ai->ai_addrlen) < 0) { error("Bind to port %s on %s failed: %.200s.", @@ -1960,6 +1968,9 @@ main(int ac, char **av) /* Log the connection. */ verbose("Connection from %.500s port %d", remote_ip, remote_port); + /* Set HPN options for the child. */ + channel_set_hpn(options.hpn_disabled, options.hpn_buffer_size); + /* * We don't want to listen forever unless the other side * successfully authenticates itself. So we set up an alarm which is @@ -2319,6 +2330,12 @@ do_ssh2_kex(void) if (options.ciphers != NULL) { myproposal[PROPOSAL_ENC_ALGS_CTOS] = myproposal[PROPOSAL_ENC_ALGS_STOC] = options.ciphers; +#ifdef NONE_CIPHER_ENABLED + } else if (options.none_enabled == 1) { + debug ("WARNING: None cipher enabled"); + myproposal[PROPOSAL_ENC_ALGS_CTOS] = + myproposal[PROPOSAL_ENC_ALGS_STOC] = KEX_ENCRYPT_INCLUDE_NONE; +#endif } myproposal[PROPOSAL_ENC_ALGS_CTOS] = compat_cipher_proposal(myproposal[PROPOSAL_ENC_ALGS_CTOS]); diff --git a/crypto/openssh/sshd_config b/crypto/openssh/sshd_config index 7858e78c51a..f5079513bbb 100644 --- a/crypto/openssh/sshd_config +++ b/crypto/openssh/sshd_config @@ -117,6 +117,18 @@ # override default of no subsystems Subsystem sftp /usr/libexec/sftp-server +# Disable HPN tuning improvements. +#HPNDisabled no + +# Buffer size for HPN to non-HPN connections. +#HPNBufferSize 2048 + +# TCP receive socket buffer polling for HPN. Disable on non autotuning kernels. +#TcpRcvBufPoll yes + +# Allow the use of the NONE cipher. +#NoneEnabled no + # Example of overriding settings on a per-user basis #Match User anoncvs # X11Forwarding no diff --git a/crypto/openssh/version.c b/crypto/openssh/version.c index 88361ae651a..3cb4b7a13ab 100644 --- a/crypto/openssh/version.c +++ b/crypto/openssh/version.c @@ -40,7 +40,7 @@ const char * ssh_version_get(void) { if (version == NULL) - version = xstrdup(SSH_VERSION_BASE " " SSH_VERSION_ADDENDUM); + version = xstrdup(SSH_VERSION); return (version); } @@ -50,11 +50,13 @@ ssh_version_set_addendum(const char *add) { size_t size; if (add != NULL) { - size = strlen(SSH_VERSION_BASE) + 1 + strlen(add) + 1; + size = strlen(SSH_VERSION_BASE) + strlen(SSH_VERSION_HPN) + 1 + + strlen(add) + 1; newvers = xmalloc(size); - snprintf(newvers, size, "%s %s", SSH_VERSION_BASE, add); + snprintf(newvers, size, "%s %s", SSH_VERSION_BASE, + SSH_VERSION_HPN, add); } else { - newvers = xstrdup(SSH_VERSION_BASE); + newvers = xstrdup(SSH_VERSION_BASE SSH_VERSION_HPN); } if (version != NULL) xfree(version); diff --git a/crypto/openssh/version.h b/crypto/openssh/version.h index 00dbdf3f692..a1548929092 100644 --- a/crypto/openssh/version.h +++ b/crypto/openssh/version.h @@ -3,10 +3,11 @@ #ifndef SSH_VERSION -#define SSH_VERSION (ssh_version_get()) -#define SSH_RELEASE (ssh_version_get()) #define SSH_VERSION_BASE "OpenSSH_5.8p2" #define SSH_VERSION_ADDENDUM "FreeBSD-20110503" +#define SSH_VERSION_HPN "_hpn13v11" +#define SSH_VERSION SSH_VERSION_BASE SSH_VERSION_HPN " " SSH_VERSION_ADDENDUM +#define SSH_RELEASE (ssh_version_get()) const char *ssh_version_get(void); void ssh_version_set_addendum(const char *); From a9c153d0339de07002ca4bd0b2b86ba9cf2cd8ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulrich=20Sp=C3=B6rlein?= Date: Wed, 3 Aug 2011 19:26:57 +0000 Subject: [PATCH 139/452] Unbreak catman(1) by removing calls to col(1). col(1) was mangling the SGR escapes and is not strictly required. See r222647, r222648, r222650, and r222653 for more details. Reported by: delphij Reviewed by: ru Approved by: re (kib) MFC after: 3 weeks --- usr.bin/catman/catman.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.bin/catman/catman.c b/usr.bin/catman/catman.c index c17a091593c..b79c56217e0 100644 --- a/usr.bin/catman/catman.c +++ b/usr.bin/catman/catman.c @@ -432,7 +432,7 @@ process_page(char *mandir, char *src, char *cat, enum Ziptype zipped) } snprintf(tmp_file, sizeof tmp_file, "%s.tmp", cat); snprintf(cmd, sizeof cmd, - "%scat %s | tbl | nroff -T%s -man | col | %s > %s.tmp", + "%scat %s | tbl | nroff -T%s -man | %s > %s.tmp", zipped == BZIP ? BZ2CAT_CMD : zipped == GZIP ? GZCAT_CMD : "", src, nroff_device, zipped == BZIP ? BZ2_CMD : zipped == GZIP ? GZ_CMD : "cat", From ca85e9482aa4d92ab9da1852b69cc56ae1bec21c Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Wed, 3 Aug 2011 20:21:00 +0000 Subject: [PATCH 141/452] The result of a joint work between rrs@ and myself at the IETF: * Decouple the path supervision using a separate HB timer per path. * Add support for potentially failed state. * Bring back RTO.min to 1 second. * Accept packets on IP-addresses already announced via an ASCONF * While there: do some cleanups. Approved by: re@ MFC after: 2 months. --- lib/libc/net/sctp_sys_calls.c | 3 + sys/netinet/sctp.h | 22 +- sys/netinet/sctp_asconf.c | 45 +-- sys/netinet/sctp_cc_functions.c | 361 ++-------------------- sys/netinet/sctp_constants.h | 30 +- sys/netinet/sctp_header.h | 3 +- sys/netinet/sctp_indata.c | 175 ++++++++--- sys/netinet/sctp_input.c | 102 ++++--- sys/netinet/sctp_output.c | 458 ++++++++++------------------ sys/netinet/sctp_output.h | 2 +- sys/netinet/sctp_pcb.c | 82 +++-- sys/netinet/sctp_pcb.h | 4 +- sys/netinet/sctp_structs.h | 21 +- sys/netinet/sctp_sysctl.c | 37 +-- sys/netinet/sctp_sysctl.h | 28 +- sys/netinet/sctp_timer.c | 406 +++++++------------------ sys/netinet/sctp_timer.h | 6 +- sys/netinet/sctp_uio.h | 28 +- sys/netinet/sctp_usrreq.c | 512 +++++++++++++++++++++++++------- sys/netinet/sctp_var.h | 5 +- sys/netinet/sctputil.c | 180 +++-------- sys/netinet6/sctp6_usrreq.c | 27 +- 22 files changed, 1095 insertions(+), 1442 deletions(-) diff --git a/lib/libc/net/sctp_sys_calls.c b/lib/libc/net/sctp_sys_calls.c index 27664bc51c2..0d721d5e71d 100644 --- a/lib/libc/net/sctp_sys_calls.c +++ b/lib/libc/net/sctp_sys_calls.c @@ -410,6 +410,9 @@ sctp_opt_info(int sd, sctp_assoc_t id, int opt, void *arg, socklen_t * size) case SCTP_DEFAULT_PRINFO: ((struct sctp_default_prinfo *)arg)->pr_assoc_id = id; break; + case SCTP_PEER_ADDR_THLDS: + ((struct sctp_paddrthlds *)arg)->spt_assoc_id = id; + break; case SCTP_MAX_BURST: ((struct sctp_assoc_value *)arg)->assoc_id = id; break; diff --git a/sys/netinet/sctp.h b/sys/netinet/sctp.h index 3c8cf364ca6..11aa02a0a56 100644 --- a/sys/netinet/sctp.h +++ b/sys/netinet/sctp.h @@ -119,6 +119,7 @@ struct sctp_paramhdr { #define SCTP_RECVNXTINFO 0x00000020 #define SCTP_DEFAULT_SNDINFO 0x00000021 #define SCTP_DEFAULT_PRINFO 0x00000022 +#define SCTP_PEER_ADDR_THLDS 0x00000023 /* * read-only options @@ -564,7 +565,6 @@ struct sctp_error_unrecognized_chunk { #define SCTP_BLK_LOGGING_ENABLE 0x00000001 #define SCTP_CWND_MONITOR_ENABLE 0x00000002 #define SCTP_CWND_LOGGING_ENABLE 0x00000004 -#define SCTP_EARLYFR_LOGGING_ENABLE 0x00000010 #define SCTP_FLIGHT_LOGGING_ENABLE 0x00000020 #define SCTP_FR_LOGGING_ENABLE 0x00000040 #define SCTP_LOCK_LOGGING_ENABLE 0x00000080 @@ -572,23 +572,23 @@ struct sctp_error_unrecognized_chunk { #define SCTP_MBCNT_LOGGING_ENABLE 0x00000200 #define SCTP_MBUF_LOGGING_ENABLE 0x00000400 #define SCTP_NAGLE_LOGGING_ENABLE 0x00000800 -#define SCTP_RECV_RWND_LOGGING_ENABLE 0x00001000 +#define SCTP_RECV_RWND_LOGGING_ENABLE 0x00001000 #define SCTP_RTTVAR_LOGGING_ENABLE 0x00002000 #define SCTP_SACK_LOGGING_ENABLE 0x00004000 -#define SCTP_SACK_RWND_LOGGING_ENABLE 0x00008000 +#define SCTP_SACK_RWND_LOGGING_ENABLE 0x00008000 #define SCTP_SB_LOGGING_ENABLE 0x00010000 #define SCTP_STR_LOGGING_ENABLE 0x00020000 #define SCTP_WAKE_LOGGING_ENABLE 0x00040000 #define SCTP_LOG_MAXBURST_ENABLE 0x00080000 #define SCTP_LOG_RWND_ENABLE 0x00100000 -#define SCTP_LOG_SACK_ARRIVALS_ENABLE 0x00200000 -#define SCTP_LTRACE_CHUNK_ENABLE 0x00400000 -#define SCTP_LTRACE_ERROR_ENABLE 0x00800000 -#define SCTP_LAST_PACKET_TRACING 0x01000000 -#define SCTP_THRESHOLD_LOGGING 0x02000000 -#define SCTP_LOG_AT_SEND_2_SCTP 0x04000000 -#define SCTP_LOG_AT_SEND_2_OUTQ 0x08000000 -#define SCTP_LOG_TRY_ADVANCE 0x10000000 +#define SCTP_LOG_SACK_ARRIVALS_ENABLE 0x00200000 +#define SCTP_LTRACE_CHUNK_ENABLE 0x00400000 +#define SCTP_LTRACE_ERROR_ENABLE 0x00800000 +#define SCTP_LAST_PACKET_TRACING 0x01000000 +#define SCTP_THRESHOLD_LOGGING 0x02000000 +#define SCTP_LOG_AT_SEND_2_SCTP 0x04000000 +#define SCTP_LOG_AT_SEND_2_OUTQ 0x08000000 +#define SCTP_LOG_TRY_ADVANCE 0x10000000 #undef SCTP_PACKED diff --git a/sys/netinet/sctp_asconf.c b/sys/netinet/sctp_asconf.c index a6db580f6ab..69f9cf19567 100644 --- a/sys/netinet/sctp_asconf.c +++ b/sys/netinet/sctp_asconf.c @@ -198,8 +198,9 @@ sctp_asconf_error_response(uint32_t id, uint16_t cause, uint8_t * error_tlv, static struct mbuf * sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, - struct sctp_tcb *stcb, int response_required) + struct sctp_tcb *stcb, int send_hb, int response_required) { + struct sctp_nets *net; struct mbuf *m_reply = NULL; struct sockaddr_storage sa_source, sa_store; struct sctp_paramhdr *ph; @@ -284,7 +285,7 @@ sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, SCTPDBG_ADDR(SCTP_DEBUG_ASCONF1, sa); } /* add the address */ - if (sctp_add_remote_addr(stcb, sa, SCTP_DONOT_SETSCOPE, + if (sctp_add_remote_addr(stcb, sa, &net, SCTP_DONOT_SETSCOPE, SCTP_ADDR_DYNAMIC_ADDED) != 0) { SCTPDBG(SCTP_DEBUG_ASCONF1, "process_asconf_add_ip: error adding address\n"); @@ -298,10 +299,12 @@ sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, m_reply = sctp_asconf_success_response(aph->correlation_id); } - sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, - NULL, SCTP_FROM_SCTP_ASCONF + SCTP_LOC_1); + sctp_timer_start(SCTP_TIMER_TYPE_PATHMTURAISE, stcb->sctp_ep, stcb, net); sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, - stcb, NULL); + stcb, net); + if (send_hb) { + sctp_send_hb(stcb, net, SCTP_SO_NOT_LOCKED); + } } return m_reply; } @@ -554,7 +557,12 @@ sctp_process_asconf_set_primary(struct mbuf *m, "process_asconf_set_primary: primary address set\n"); /* notify upper layer */ sctp_ulp_notify(SCTP_NOTIFY_ASCONF_SET_PRIMARY, stcb, 0, sa, SCTP_SO_NOT_LOCKED); - + if ((stcb->asoc.primary_destination->dest_state & SCTP_ADDR_REACHABLE) && + (!(stcb->asoc.primary_destination->dest_state & SCTP_ADDR_PF)) && + (stcb->asoc.alternate)) { + sctp_free_remote_addr(stcb->asoc.alternate); + stcb->asoc.alternate = NULL; + } if (response_required) { m_reply = sctp_asconf_success_response(aph->correlation_id); } @@ -622,7 +630,7 @@ sctp_handle_asconf(struct mbuf *m, unsigned int offset, struct sctp_asconf_ack_chunk *ack_cp; struct sctp_asconf_paramhdr *aph, *ack_aph; struct sctp_ipv6addr_param *p_addr; - unsigned int asconf_limit; + unsigned int asconf_limit, cnt; int error = 0; /* did an error occur? */ /* asconf param buffer */ @@ -717,6 +725,7 @@ sctp_handle_asconf(struct mbuf *m, unsigned int offset, goto send_reply; } /* process through all parameters */ + cnt = 0; while (aph != NULL) { unsigned int param_length, param_type; @@ -749,7 +758,8 @@ sctp_handle_asconf(struct mbuf *m, unsigned int offset, case SCTP_ADD_IP_ADDRESS: asoc->peer_supports_asconf = 1; m_result = sctp_process_asconf_add_ip(m, aph, stcb, - error); + (cnt < SCTP_BASE_SYSCTL(sctp_hb_maxburst)), error); + cnt++; break; case SCTP_DEL_IP_ADDRESS: asoc->peer_supports_asconf = 1; @@ -1959,7 +1969,7 @@ sctp_addr_mgmt_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int status; - if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) == 0 && + if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) == 0 || sctp_is_feature_off(inp, SCTP_PCB_FLAGS_DO_ASCONF)) { /* subset bound, no ASCONF allowed case, so ignore */ return; @@ -2075,8 +2085,7 @@ sctp_addr_mgmt_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, sctp_timer_start(SCTP_TIMER_TYPE_ASCONF, inp, stcb, stcb->asoc.primary_destination); #else - sctp_send_asconf(stcb, stcb->asoc.primary_destination, - addr_locked); + sctp_send_asconf(stcb, NULL, addr_locked); #endif } } @@ -2328,8 +2337,7 @@ sctp_asconf_iterator_stcb(struct sctp_inpcb *inp, struct sctp_tcb *stcb, * If we have queued params in the open state, send out an ASCONF. */ if (num_queued > 0) { - sctp_send_asconf(stcb, stcb->asoc.primary_destination, - SCTP_ADDR_NOT_LOCKED); + sctp_send_asconf(stcb, NULL, SCTP_ADDR_NOT_LOCKED); } } @@ -2384,8 +2392,7 @@ sctp_set_primary_ip_address_sa(struct sctp_tcb *stcb, struct sockaddr *sa) stcb->sctp_ep, stcb, stcb->asoc.primary_destination); #else - sctp_send_asconf(stcb, stcb->asoc.primary_destination, - SCTP_ADDR_NOT_LOCKED); + sctp_send_asconf(stcb, NULL, SCTP_ADDR_NOT_LOCKED); #endif } } else { @@ -2421,8 +2428,7 @@ sctp_set_primary_ip_address(struct sctp_ifa *ifa) stcb->sctp_ep, stcb, stcb->asoc.primary_destination); #else - sctp_send_asconf(stcb, stcb->asoc.primary_destination, - SCTP_ADDR_NOT_LOCKED); + sctp_send_asconf(stcb, NULL, SCTP_ADDR_NOT_LOCKED); #endif } } @@ -2965,8 +2971,7 @@ sctp_process_initack_addresses(struct sctp_tcb *stcb, struct mbuf *m, stcb->sctp_ep, stcb, stcb->asoc.primary_destination); #else - sctp_send_asconf(stcb, stcb->asoc.primary_destination, - SCTP_ADDR_NOT_LOCKED); + sctp_send_asconf(stcb, NULL, SCTP_ADDR_NOT_LOCKED); #endif } } @@ -3540,5 +3545,5 @@ sctp_asconf_send_nat_state_update(struct sctp_tcb *stcb, } skip_rest: /* Now we must send the asconf into the queue */ - sctp_send_asconf(stcb, net, 0); + sctp_send_asconf(stcb, net, SCTP_ADDR_NOT_LOCKED); } diff --git a/sys/netinet/sctp_cc_functions.c b/sys/netinet/sctp_cc_functions.c index 85beb6adaae..b1596cccdbb 100644 --- a/sys/netinet/sctp_cc_functions.c +++ b/sys/netinet/sctp_cc_functions.c @@ -728,40 +728,6 @@ sctp_cwnd_update_after_sack_common(struct sctp_tcb *stcb, } } #endif - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - /* - * So, first of all do we need to have a Early FR - * timer running? - */ - if ((!TAILQ_EMPTY(&asoc->sent_queue) && - (net->ref_count > 1) && - (net->flight_size < net->cwnd)) || - (reneged_all)) { - /* - * yes, so in this case stop it if its - * running, and then restart it. Reneging - * all is a special case where we want to - * run the Early FR timer and then force the - * last few unacked to be sent, causing us - * to illicit a sack with gaps to force out - * the others. - */ - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck2); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_20); - } - SCTP_STAT_INCR(sctps_earlyfrstrid); - sctp_timer_start(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net); - } else { - /* No, stop it if its running */ - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck3); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_21); - } - } - } /* if nothing was acked on this destination skip it */ if (net->net_ack == 0) { if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { @@ -769,51 +735,6 @@ sctp_cwnd_update_after_sack_common(struct sctp_tcb *stcb, } continue; } - if (net->net_ack2 > 0) { - /* - * Karn's rule applies to clearing error count, this - * is optional. - */ - net->error_count = 0; - if ((net->dest_state & SCTP_ADDR_NOT_REACHABLE) == - SCTP_ADDR_NOT_REACHABLE) { - /* addr came good */ - net->dest_state &= ~SCTP_ADDR_NOT_REACHABLE; - net->dest_state |= SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, - SCTP_RECEIVED_SACK, (void *)net, SCTP_SO_NOT_LOCKED); - /* now was it the primary? if so restore */ - if (net->dest_state & SCTP_ADDR_WAS_PRIMARY) { - (void)sctp_set_primary_addr(stcb, (struct sockaddr *)NULL, net); - } - } - /* - * JRS 5/14/07 - If CMT PF is on and the destination - * is in PF state, set the destination to active - * state and set the cwnd to one or two MTU's based - * on whether PF1 or PF2 is being used. - * - * Should we stop any running T3 timer here? - */ - if ((asoc->sctp_cmt_on_off > 0) && - (asoc->sctp_cmt_pf > 0) && - ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) { - net->dest_state &= ~SCTP_ADDR_PF; - old_cwnd = net->cwnd; - net->cwnd = net->mtu * asoc->sctp_cmt_pf; - SDT_PROBE(sctp, cwnd, net, ack, - stcb->asoc.my_vtag, ((stcb->sctp_ep->sctp_lport << 16) | (stcb->rport)), net, - old_cwnd, net->cwnd); - SCTPDBG(SCTP_DEBUG_INDATA1, "Destination %p moved from PF to reachable with cwnd %d.\n", - net, net->cwnd); - /* - * Since the cwnd value is explicitly set, - * skip the code that updates the cwnd - * value. - */ - goto skip_cwnd_update; - } - } #ifdef JANA_CMT_FAST_RECOVERY /* * CMT fast recovery code @@ -833,7 +754,7 @@ sctp_cwnd_update_after_sack_common(struct sctp_tcb *stcb, * If we are in loss recovery we skip any cwnd * update */ - goto skip_cwnd_update; + return; } /* * Did any measurements go on for this network? @@ -856,7 +777,7 @@ sctp_cwnd_update_after_sack_common(struct sctp_tcb *stcb, if (net->cc_mod.rtcc.lbw) { if (cc_bw_limit(stcb, net, nbw)) { /* Hold here, no update */ - goto skip_cwnd_update; + continue; } } else { uint64_t vtag, probepoint; @@ -1049,26 +970,24 @@ sctp_cwnd_update_after_sack_common(struct sctp_tcb *stcb, SCTP_CWND_LOG_NO_CUMACK); } } -skip_cwnd_update: - /* - * NOW, according to Karn's rule do we need to restore the - * RTO timer back? Check our net_ack2. If not set then we - * have a ambiguity.. i.e. all data ack'd was sent to more - * than one place. - */ - if (net->net_ack2) { - /* restore any doubled timers */ - net->RTO = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv; - if (net->RTO < stcb->asoc.minrto) { - net->RTO = stcb->asoc.minrto; - } - if (net->RTO > stcb->asoc.maxrto) { - net->RTO = stcb->asoc.maxrto; - } - } } } +static void +sctp_cwnd_update_exit_pf_common(struct sctp_tcb *stcb, struct sctp_nets *net) +{ + int old_cwnd; + + old_cwnd = net->cwnd; + net->cwnd = net->mtu; + SDT_PROBE(sctp, cwnd, net, ack, + stcb->asoc.my_vtag, ((stcb->sctp_ep->sctp_lport << 16) | (stcb->rport)), net, + old_cwnd, net->cwnd); + SCTPDBG(SCTP_DEBUG_INDATA1, "Destination %p moved from PF to reachable with cwnd %d.\n", + net, net->cwnd); +} + + static void sctp_cwnd_update_after_timeout(struct sctp_tcb *stcb, struct sctp_nets *net) { @@ -1343,32 +1262,6 @@ sctp_cwnd_update_after_output(struct sctp_tcb *stcb, } } -static void -sctp_cwnd_update_after_fr_timer(struct sctp_inpcb *inp, - struct sctp_tcb *stcb, struct sctp_nets *net) -{ - int old_cwnd = net->cwnd; - - sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_EARLY_FR_TMR, SCTP_SO_NOT_LOCKED); - /* - * make a small adjustment to cwnd and force to CA. - */ - if (net->cwnd > net->mtu) - /* drop down one MTU after sending */ - net->cwnd -= net->mtu; - if (net->cwnd < net->ssthresh) - /* still in SS move to CA */ - net->ssthresh = net->cwnd - 1; - SDT_PROBE(sctp, cwnd, net, fr, - stcb->asoc.my_vtag, - ((stcb->sctp_ep->sctp_lport << 16) | (stcb->rport)), - net, - old_cwnd, net->cwnd); - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) { - sctp_log_cwnd(stcb, net, (old_cwnd - net->cwnd), SCTP_CWND_LOG_FROM_FR); - } -} - static void sctp_cwnd_update_after_sack(struct sctp_tcb *stcb, struct sctp_association *asoc, @@ -1858,40 +1751,6 @@ sctp_hs_cwnd_update_after_sack(struct sctp_tcb *stcb, } } #endif - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - /* - * So, first of all do we need to have a Early FR - * timer running? - */ - if ((!TAILQ_EMPTY(&asoc->sent_queue) && - (net->ref_count > 1) && - (net->flight_size < net->cwnd)) || - (reneged_all)) { - /* - * yes, so in this case stop it if its - * running, and then restart it. Reneging - * all is a special case where we want to - * run the Early FR timer and then force the - * last few unacked to be sent, causing us - * to illicit a sack with gaps to force out - * the others. - */ - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck2); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_20); - } - SCTP_STAT_INCR(sctps_earlyfrstrid); - sctp_timer_start(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net); - } else { - /* No, stop it if its running */ - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck3); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_21); - } - } - } /* if nothing was acked on this destination skip it */ if (net->net_ack == 0) { if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { @@ -1899,47 +1758,6 @@ sctp_hs_cwnd_update_after_sack(struct sctp_tcb *stcb, } continue; } - if (net->net_ack2 > 0) { - /* - * Karn's rule applies to clearing error count, this - * is optional. - */ - net->error_count = 0; - if ((net->dest_state & SCTP_ADDR_NOT_REACHABLE) == - SCTP_ADDR_NOT_REACHABLE) { - /* addr came good */ - net->dest_state &= ~SCTP_ADDR_NOT_REACHABLE; - net->dest_state |= SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, - SCTP_RECEIVED_SACK, (void *)net, SCTP_SO_NOT_LOCKED); - /* now was it the primary? if so restore */ - if (net->dest_state & SCTP_ADDR_WAS_PRIMARY) { - (void)sctp_set_primary_addr(stcb, (struct sockaddr *)NULL, net); - } - } - /* - * JRS 5/14/07 - If CMT PF is on and the destination - * is in PF state, set the destination to active - * state and set the cwnd to one or two MTU's based - * on whether PF1 or PF2 is being used. - * - * Should we stop any running T3 timer here? - */ - if ((asoc->sctp_cmt_on_off > 0) && - (asoc->sctp_cmt_pf > 0) && - ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) { - net->dest_state &= ~SCTP_ADDR_PF; - net->cwnd = net->mtu * asoc->sctp_cmt_pf; - SCTPDBG(SCTP_DEBUG_INDATA1, "Destination %p moved from PF to reachable with cwnd %d.\n", - net, net->cwnd); - /* - * Since the cwnd value is explicitly set, - * skip the code that updates the cwnd - * value. - */ - goto skip_cwnd_update; - } - } #ifdef JANA_CMT_FAST_RECOVERY /* * CMT fast recovery code @@ -1959,7 +1777,7 @@ sctp_hs_cwnd_update_after_sack(struct sctp_tcb *stcb, * If we are in loss recovery we skip any cwnd * update */ - goto skip_cwnd_update; + return; } /* * CMT: CUC algorithm. Update cwnd if pseudo-cumack has @@ -2004,23 +1822,6 @@ sctp_hs_cwnd_update_after_sack(struct sctp_tcb *stcb, SCTP_CWND_LOG_NO_CUMACK); } } -skip_cwnd_update: - /* - * NOW, according to Karn's rule do we need to restore the - * RTO timer back? Check our net_ack2. If not set then we - * have a ambiguity.. i.e. all data ack'd was sent to more - * than one place. - */ - if (net->net_ack2) { - /* restore any doubled timers */ - net->RTO = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv; - if (net->RTO < stcb->asoc.minrto) { - net->RTO = stcb->asoc.minrto; - } - if (net->RTO > stcb->asoc.maxrto) { - net->RTO = stcb->asoc.maxrto; - } - } } } @@ -2340,40 +2141,6 @@ sctp_htcp_cwnd_update_after_sack(struct sctp_tcb *stcb, } } #endif - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - /* - * So, first of all do we need to have a Early FR - * timer running? - */ - if ((!TAILQ_EMPTY(&asoc->sent_queue) && - (net->ref_count > 1) && - (net->flight_size < net->cwnd)) || - (reneged_all)) { - /* - * yes, so in this case stop it if its - * running, and then restart it. Reneging - * all is a special case where we want to - * run the Early FR timer and then force the - * last few unacked to be sent, causing us - * to illicit a sack with gaps to force out - * the others. - */ - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck2); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_20); - } - SCTP_STAT_INCR(sctps_earlyfrstrid); - sctp_timer_start(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net); - } else { - /* No, stop it if its running */ - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck3); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_21); - } - } - } /* if nothing was acked on this destination skip it */ if (net->net_ack == 0) { if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { @@ -2381,47 +2148,6 @@ sctp_htcp_cwnd_update_after_sack(struct sctp_tcb *stcb, } continue; } - if (net->net_ack2 > 0) { - /* - * Karn's rule applies to clearing error count, this - * is optional. - */ - net->error_count = 0; - if ((net->dest_state & SCTP_ADDR_NOT_REACHABLE) == - SCTP_ADDR_NOT_REACHABLE) { - /* addr came good */ - net->dest_state &= ~SCTP_ADDR_NOT_REACHABLE; - net->dest_state |= SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, - SCTP_RECEIVED_SACK, (void *)net, SCTP_SO_NOT_LOCKED); - /* now was it the primary? if so restore */ - if (net->dest_state & SCTP_ADDR_WAS_PRIMARY) { - (void)sctp_set_primary_addr(stcb, (struct sockaddr *)NULL, net); - } - } - /* - * JRS 5/14/07 - If CMT PF is on and the destination - * is in PF state, set the destination to active - * state and set the cwnd to one or two MTU's based - * on whether PF1 or PF2 is being used. - * - * Should we stop any running T3 timer here? - */ - if ((asoc->sctp_cmt_on_off > 0) && - (asoc->sctp_cmt_pf > 0) && - ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) { - net->dest_state &= ~SCTP_ADDR_PF; - net->cwnd = net->mtu * asoc->sctp_cmt_pf; - SCTPDBG(SCTP_DEBUG_INDATA1, "Destination %p moved from PF to reachable with cwnd %d.\n", - net, net->cwnd); - /* - * Since the cwnd value is explicitly set, - * skip the code that updates the cwnd - * value. - */ - goto skip_cwnd_update; - } - } #ifdef JANA_CMT_FAST_RECOVERY /* * CMT fast recovery code @@ -2441,7 +2167,7 @@ sctp_htcp_cwnd_update_after_sack(struct sctp_tcb *stcb, * If we are in loss recovery we skip any cwnd * update */ - goto skip_cwnd_update; + return; } /* * CMT: CUC algorithm. Update cwnd if pseudo-cumack has @@ -2457,23 +2183,6 @@ sctp_htcp_cwnd_update_after_sack(struct sctp_tcb *stcb, SCTP_CWND_LOG_NO_CUMACK); } } -skip_cwnd_update: - /* - * NOW, according to Karn's rule do we need to restore the - * RTO timer back? Check our net_ack2. If not set then we - * have a ambiguity.. i.e. all data ack'd was sent to more - * than one place. - */ - if (net->net_ack2) { - /* restore any doubled timers */ - net->RTO = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv; - if (net->RTO < stcb->asoc.minrto) { - net->RTO = stcb->asoc.minrto; - } - if (net->RTO > stcb->asoc.maxrto) { - net->RTO = stcb->asoc.maxrto; - } - } } } @@ -2565,30 +2274,6 @@ sctp_htcp_cwnd_update_after_timeout(struct sctp_tcb *stcb, } } -static void -sctp_htcp_cwnd_update_after_fr_timer(struct sctp_inpcb *inp, - struct sctp_tcb *stcb, struct sctp_nets *net) -{ - int old_cwnd; - - old_cwnd = net->cwnd; - - sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_EARLY_FR_TMR, SCTP_SO_NOT_LOCKED); - net->cc_mod.htcp_ca.last_cong = sctp_get_tick_count(); - /* - * make a small adjustment to cwnd and force to CA. - */ - if (net->cwnd > net->mtu) - /* drop down one MTU after sending */ - net->cwnd -= net->mtu; - if (net->cwnd < net->ssthresh) - /* still in SS move to CA */ - net->ssthresh = net->cwnd - 1; - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) { - sctp_log_cwnd(stcb, net, (old_cwnd - net->cwnd), SCTP_CWND_LOG_FROM_FR); - } -} - static void sctp_htcp_cwnd_update_after_ecn_echo(struct sctp_tcb *stcb, struct sctp_nets *net, int in_window, int num_pkt_lost) @@ -2618,42 +2303,42 @@ struct sctp_cc_functions sctp_cc_functions[] = { { .sctp_set_initial_cc_param = sctp_set_initial_cc_param, .sctp_cwnd_update_after_sack = sctp_cwnd_update_after_sack, + .sctp_cwnd_update_exit_pf = sctp_cwnd_update_exit_pf_common, .sctp_cwnd_update_after_fr = sctp_cwnd_update_after_fr, .sctp_cwnd_update_after_timeout = sctp_cwnd_update_after_timeout, .sctp_cwnd_update_after_ecn_echo = sctp_cwnd_update_after_ecn_echo, .sctp_cwnd_update_after_packet_dropped = sctp_cwnd_update_after_packet_dropped, .sctp_cwnd_update_after_output = sctp_cwnd_update_after_output, - .sctp_cwnd_update_after_fr_timer = sctp_cwnd_update_after_fr_timer }, { .sctp_set_initial_cc_param = sctp_set_initial_cc_param, .sctp_cwnd_update_after_sack = sctp_hs_cwnd_update_after_sack, + .sctp_cwnd_update_exit_pf = sctp_cwnd_update_exit_pf_common, .sctp_cwnd_update_after_fr = sctp_hs_cwnd_update_after_fr, .sctp_cwnd_update_after_timeout = sctp_cwnd_update_after_timeout, .sctp_cwnd_update_after_ecn_echo = sctp_cwnd_update_after_ecn_echo, .sctp_cwnd_update_after_packet_dropped = sctp_cwnd_update_after_packet_dropped, .sctp_cwnd_update_after_output = sctp_cwnd_update_after_output, - .sctp_cwnd_update_after_fr_timer = sctp_cwnd_update_after_fr_timer }, { .sctp_set_initial_cc_param = sctp_htcp_set_initial_cc_param, .sctp_cwnd_update_after_sack = sctp_htcp_cwnd_update_after_sack, + .sctp_cwnd_update_exit_pf = sctp_cwnd_update_exit_pf_common, .sctp_cwnd_update_after_fr = sctp_htcp_cwnd_update_after_fr, .sctp_cwnd_update_after_timeout = sctp_htcp_cwnd_update_after_timeout, .sctp_cwnd_update_after_ecn_echo = sctp_htcp_cwnd_update_after_ecn_echo, .sctp_cwnd_update_after_packet_dropped = sctp_cwnd_update_after_packet_dropped, .sctp_cwnd_update_after_output = sctp_cwnd_update_after_output, - .sctp_cwnd_update_after_fr_timer = sctp_htcp_cwnd_update_after_fr_timer }, { .sctp_set_initial_cc_param = sctp_set_rtcc_initial_cc_param, .sctp_cwnd_update_after_sack = sctp_cwnd_update_rtcc_after_sack, + .sctp_cwnd_update_exit_pf = sctp_cwnd_update_exit_pf_common, .sctp_cwnd_update_after_fr = sctp_cwnd_update_after_fr, .sctp_cwnd_update_after_timeout = sctp_cwnd_update_after_timeout, .sctp_cwnd_update_after_ecn_echo = sctp_cwnd_update_rtcc_after_ecn_echo, .sctp_cwnd_update_after_packet_dropped = sctp_cwnd_update_after_packet_dropped, .sctp_cwnd_update_after_output = sctp_cwnd_update_after_output, - .sctp_cwnd_update_after_fr_timer = sctp_cwnd_update_after_fr_timer, .sctp_cwnd_update_packet_transmitted = sctp_cwnd_update_rtcc_packet_transmitted, .sctp_cwnd_update_tsn_acknowledged = sctp_cwnd_update_rtcc_tsn_acknowledged, .sctp_cwnd_new_transmission_begins = sctp_cwnd_new_rtcc_transmission_begins, diff --git a/sys/netinet/sctp_constants.h b/sys/netinet/sctp_constants.h index 6c2df1693fb..4087c8d266d 100644 --- a/sys/netinet/sctp_constants.h +++ b/sys/netinet/sctp_constants.h @@ -416,7 +416,7 @@ __FBSDID("$FreeBSD$"); #define SCTP_STR_RESET_IN_REQUEST 0x000e #define SCTP_STR_RESET_TSN_REQUEST 0x000f #define SCTP_STR_RESET_RESPONSE 0x0010 -#define SCTP_STR_RESET_ADD_STREAMS 0x0011 +#define SCTP_STR_RESET_ADD_STREAMS 0x0011 #define SCTP_MAX_RESET_PARAMS 2 #define SCTP_STREAM_RESET_TSN_DELTA 0x1000 @@ -508,14 +508,10 @@ __FBSDID("$FreeBSD$"); /* SCTP reachability state for each address */ #define SCTP_ADDR_REACHABLE 0x001 -#define SCTP_ADDR_NOT_REACHABLE 0x002 #define SCTP_ADDR_NOHB 0x004 #define SCTP_ADDR_BEING_DELETED 0x008 #define SCTP_ADDR_NOT_IN_ASSOC 0x010 -#define SCTP_ADDR_WAS_PRIMARY 0x020 -#define SCTP_ADDR_SWITCH_PRIMARY 0x040 #define SCTP_ADDR_OUT_OF_SCOPE 0x080 -#define SCTP_ADDR_DOUBLE_SWITCH 0x100 #define SCTP_ADDR_UNCONFIRMED 0x200 #define SCTP_ADDR_REQ_PRIMARY 0x400 /* JRS 5/13/07 - Added potentially failed state for CMT PF */ @@ -579,14 +575,13 @@ __FBSDID("$FreeBSD$"); #define SCTP_TIMER_TYPE_EVENTWAKE 13 #define SCTP_TIMER_TYPE_STRRESET 14 #define SCTP_TIMER_TYPE_INPKILL 15 -#define SCTP_TIMER_TYPE_EARLYFR 17 -#define SCTP_TIMER_TYPE_ASOCKILL 18 -#define SCTP_TIMER_TYPE_ADDR_WQ 19 -#define SCTP_TIMER_TYPE_ZERO_COPY 20 -#define SCTP_TIMER_TYPE_ZCOPY_SENDQ 21 -#define SCTP_TIMER_TYPE_PRIM_DELETED 22 +#define SCTP_TIMER_TYPE_ASOCKILL 16 +#define SCTP_TIMER_TYPE_ADDR_WQ 17 +#define SCTP_TIMER_TYPE_ZERO_COPY 18 +#define SCTP_TIMER_TYPE_ZCOPY_SENDQ 19 +#define SCTP_TIMER_TYPE_PRIM_DELETED 20 /* add new timers here - and increment LAST */ -#define SCTP_TIMER_TYPE_LAST 23 +#define SCTP_TIMER_TYPE_LAST 21 #define SCTP_IS_TIMER_TYPE_VALID(t) (((t) > SCTP_TIMER_TYPE_NONE) && \ ((t) < SCTP_TIMER_TYPE_LAST)) @@ -655,16 +650,17 @@ __FBSDID("$FreeBSD$"); #define SCTP_DEFAULT_SECRET_LIFE_SEC 3600 #define SCTP_RTO_UPPER_BOUND (60000) /* 60 sec in ms */ -#define SCTP_RTO_LOWER_BOUND (300) /* 0.3 sec is ms */ +#define SCTP_RTO_LOWER_BOUND (1000) /* 1 sec is ms */ #define SCTP_RTO_INITIAL (3000) /* 3 sec in ms */ #define SCTP_INP_KILL_TIMEOUT 20/* number of ms to retry kill of inpcb */ #define SCTP_ASOC_KILL_TIMEOUT 10 /* number of ms to retry kill of inpcb */ -#define SCTP_DEF_MAX_INIT 8 -#define SCTP_DEF_MAX_SEND 10 -#define SCTP_DEF_MAX_PATH_RTX 5 +#define SCTP_DEF_MAX_INIT 8 +#define SCTP_DEF_MAX_SEND 10 +#define SCTP_DEF_MAX_PATH_RTX 5 +#define SCTP_DEF_PATH_PF_THRESHOLD SCTP_DEF_MAX_PATH_RTX #define SCTP_DEF_PMTU_RAISE_SEC 600 /* 10 min between raise attempts */ @@ -679,7 +675,7 @@ __FBSDID("$FreeBSD$"); /* Send window update (incr * this > hiwat). Should be a power of 2 */ #define SCTP_MINIMAL_RWND (4096) /* minimal rwnd */ -#define SCTP_ADDRMAX 24 +#define SCTP_ADDRMAX 16 /* SCTP DEBUG Switch parameters */ #define SCTP_DEBUG_TIMER1 0x00000001 diff --git a/sys/netinet/sctp_header.h b/sys/netinet/sctp_header.h index dc8d9178505..1aff6a1485e 100644 --- a/sys/netinet/sctp_header.h +++ b/sys/netinet/sctp_header.h @@ -98,9 +98,10 @@ struct sctp_heartbeat_info_param { uint32_t time_value_2; uint32_t random_value1; uint32_t random_value2; - uint16_t user_req; uint8_t addr_family; uint8_t addr_len; + /* make sure that this structure is 4 byte aligned */ + uint8_t padding[2]; char address[SCTP_ADDRMAX]; } SCTP_PACKED; diff --git a/sys/netinet/sctp_indata.c b/sys/netinet/sctp_indata.c index e142a3e5246..48b79fb89da 100644 --- a/sys/netinet/sctp_indata.c +++ b/sys/netinet/sctp_indata.c @@ -2434,7 +2434,8 @@ sctp_sack_check(struct sctp_tcb *stcb, int was_a_gap, int *abort_flag) sctp_timer_stop(SCTP_TIMER_TYPE_RECV, stcb->sctp_ep, stcb, NULL, SCTP_FROM_SCTP_INDATA + SCTP_LOC_18); } - sctp_send_shutdown(stcb, stcb->asoc.primary_destination); + sctp_send_shutdown(stcb, + ((stcb->asoc.alternate) ? stcb->asoc.alternate : stcb->asoc.primary_destination)); sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED); } else { int is_a_gap; @@ -4054,9 +4055,50 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, } /* JRS - Use the congestion control given in the CC module */ - if ((asoc->last_acked_seq != cumack) && (ecne_seen == 0)) + if ((asoc->last_acked_seq != cumack) && (ecne_seen == 0)) { + TAILQ_FOREACH(net, &asoc->nets, sctp_next) { + if (net->net_ack2 > 0) { + /* + * Karn's rule applies to clearing error + * count, this is optional. + */ + net->error_count = 0; + if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { + /* addr came good */ + net->dest_state |= SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, + SCTP_RECEIVED_SACK, (void *)net, SCTP_SO_NOT_LOCKED); + } + if (net == stcb->asoc.primary_destination) { + if (stcb->asoc.alternate) { + /* + * release the alternate, + * primary is good + */ + sctp_free_remote_addr(stcb->asoc.alternate); + stcb->asoc.alternate = NULL; + } + } + if (net->dest_state & SCTP_ADDR_PF) { + net->dest_state &= ~SCTP_ADDR_PF; + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_INPUT + SCTP_LOC_3); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); + asoc->cc_functions.sctp_cwnd_update_exit_pf(stcb, net); + /* Done with this net */ + net->net_ack = 0; + } + /* restore any doubled timers */ + net->RTO = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv; + if (net->RTO < stcb->asoc.minrto) { + net->RTO = stcb->asoc.minrto; + } + if (net->RTO > stcb->asoc.maxrto) { + net->RTO = stcb->asoc.maxrto; + } + } + } asoc->cc_functions.sctp_cwnd_update_after_sack(stcb, asoc, 1, 0, 0); - + } asoc->last_acked_seq = cumack; if (TAILQ_EMPTY(&asoc->sent_queue)) { @@ -4127,13 +4169,6 @@ again: stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_22); } - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck4); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_23); - } - } } } if ((j == 0) && @@ -4222,6 +4257,8 @@ again: stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_24; sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_RESPONSE_TO_USER_REQ, oper, SCTP_SO_NOT_LOCKED); } else { + struct sctp_nets *netp; + if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { SCTP_STAT_DECR_GAUGE32(sctps_currestab); @@ -4229,26 +4266,36 @@ again: SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); sctp_stop_timers_for_shutdown(stcb); - sctp_send_shutdown(stcb, - stcb->asoc.primary_destination); + if (asoc->alternate) { + netp = asoc->alternate; + } else { + netp = asoc->primary_destination; + } + sctp_send_shutdown(stcb, netp); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, - stcb->sctp_ep, stcb, asoc->primary_destination); + stcb->sctp_ep, stcb, netp); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, - stcb->sctp_ep, stcb, asoc->primary_destination); + stcb->sctp_ep, stcb, netp); } } else if ((SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED) && (asoc->stream_queue_cnt == 0)) { + struct sctp_nets *netp; + + if (asoc->alternate) { + netp = asoc->alternate; + } else { + netp = asoc->primary_destination; + } if (asoc->state & SCTP_STATE_PARTIAL_MSG_LEFT) { goto abort_out_now; } SCTP_STAT_DECR_GAUGE32(sctps_currestab); SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_ACK_SENT); SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); - sctp_send_shutdown_ack(stcb, - stcb->asoc.primary_destination); + sctp_send_shutdown_ack(stcb, netp); sctp_stop_timers_for_shutdown(stcb); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNACK, - stcb->sctp_ep, stcb, asoc->primary_destination); + stcb->sctp_ep, stcb, netp); } } /*********************************************/ @@ -4380,7 +4427,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, num_dup, SCTP_LOG_NEW_SACK); } - if ((num_dup) && (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_FR_LOGGING_ENABLE | SCTP_EARLYFR_LOGGING_ENABLE))) { + if ((num_dup) && (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE)) { uint16_t i; uint32_t *dupdata, dblock; @@ -4468,13 +4515,6 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, TAILQ_FOREACH(net, &asoc->nets, sctp_next) { sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_26); - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck1); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_26); - } - } net->partial_bytes_acked = 0; net->flight_size = 0; } @@ -4830,20 +4870,54 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, asoc->saw_sack_with_nr_frags = 0; /* JRS - Use the congestion control given in the CC module */ - if (ecne_seen == 0) + if (ecne_seen == 0) { + TAILQ_FOREACH(net, &asoc->nets, sctp_next) { + if (net->net_ack2 > 0) { + /* + * Karn's rule applies to clearing error + * count, this is optional. + */ + net->error_count = 0; + if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { + /* addr came good */ + net->dest_state |= SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, + SCTP_RECEIVED_SACK, (void *)net, SCTP_SO_NOT_LOCKED); + } + if (net == stcb->asoc.primary_destination) { + if (stcb->asoc.alternate) { + /* + * release the alternate, + * primary is good + */ + sctp_free_remote_addr(stcb->asoc.alternate); + stcb->asoc.alternate = NULL; + } + } + if (net->dest_state & SCTP_ADDR_PF) { + net->dest_state &= ~SCTP_ADDR_PF; + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_INPUT + SCTP_LOC_3); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); + asoc->cc_functions.sctp_cwnd_update_exit_pf(stcb, net); + /* Done with this net */ + net->net_ack = 0; + } + /* restore any doubled timers */ + net->RTO = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv; + if (net->RTO < stcb->asoc.minrto) { + net->RTO = stcb->asoc.minrto; + } + if (net->RTO > stcb->asoc.maxrto) { + net->RTO = stcb->asoc.maxrto; + } + } + } asoc->cc_functions.sctp_cwnd_update_after_sack(stcb, asoc, accum_moved, reneged_all, will_exit_fast_recovery); - + } if (TAILQ_EMPTY(&asoc->sent_queue)) { /* nothing left in-flight */ TAILQ_FOREACH(net, &asoc->nets, sctp_next) { /* stop all timers */ - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck4); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_29); - } - } sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_30); net->flight_size = 0; @@ -4918,6 +4992,13 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_RESPONSE_TO_USER_REQ, oper, SCTP_SO_NOT_LOCKED); return; } else { + struct sctp_nets *netp; + + if (asoc->alternate) { + netp = asoc->alternate; + } else { + netp = asoc->primary_destination; + } if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { SCTP_STAT_DECR_GAUGE32(sctps_currestab); @@ -4925,27 +5006,32 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); sctp_stop_timers_for_shutdown(stcb); - sctp_send_shutdown(stcb, - stcb->asoc.primary_destination); + sctp_send_shutdown(stcb, netp); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, - stcb->sctp_ep, stcb, asoc->primary_destination); + stcb->sctp_ep, stcb, netp); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, - stcb->sctp_ep, stcb, asoc->primary_destination); + stcb->sctp_ep, stcb, netp); } return; } else if ((SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED) && (asoc->stream_queue_cnt == 0)) { + struct sctp_nets *netp; + + if (asoc->alternate) { + netp = asoc->alternate; + } else { + netp = asoc->primary_destination; + } if (asoc->state & SCTP_STATE_PARTIAL_MSG_LEFT) { goto abort_out_now; } SCTP_STAT_DECR_GAUGE32(sctps_currestab); SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_ACK_SENT); SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); - sctp_send_shutdown_ack(stcb, - stcb->asoc.primary_destination); + sctp_send_shutdown_ack(stcb, netp); sctp_stop_timers_for_shutdown(stcb); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNACK, - stcb->sctp_ep, stcb, asoc->primary_destination); + stcb->sctp_ep, stcb, netp); return; } } @@ -5056,13 +5142,6 @@ again: stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_22); } - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck4); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_23); - } - } } } if ((j == 0) && diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c index 4c4d779b39d..d8f0ae53970 100644 --- a/sys/netinet/sctp_input.c +++ b/sys/netinet/sctp_input.c @@ -537,6 +537,7 @@ sctp_handle_heartbeat_ack(struct sctp_heartbeat_chunk *cp, struct sctp_nets *r_net, *f_net; struct timeval tv; int req_prim = 0; + uint16_t old_error_counter; #ifdef INET struct sockaddr_in *sin; @@ -599,7 +600,6 @@ sctp_handle_heartbeat_ack(struct sctp_heartbeat_chunk *cp, r_net->dest_state &= ~SCTP_ADDR_UNCONFIRMED; if (r_net->dest_state & SCTP_ADDR_REQ_PRIMARY) { stcb->asoc.primary_destination = r_net; - r_net->dest_state &= ~SCTP_ADDR_WAS_PRIMARY; r_net->dest_state &= ~SCTP_ADDR_REQ_PRIMARY; f_net = TAILQ_FIRST(&stcb->asoc.nets); if (f_net != r_net) { @@ -616,44 +616,37 @@ sctp_handle_heartbeat_ack(struct sctp_heartbeat_chunk *cp, } sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_CONFIRMED, stcb, 0, (void *)r_net, SCTP_SO_NOT_LOCKED); + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, r_net, SCTP_FROM_SCTP_INPUT + SCTP_LOC_3); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, r_net); } + old_error_counter = r_net->error_count; r_net->error_count = 0; r_net->hb_responded = 1; tv.tv_sec = cp->heartbeat.hb_info.time_value_1; tv.tv_usec = cp->heartbeat.hb_info.time_value_2; - if (r_net->dest_state & SCTP_ADDR_NOT_REACHABLE) { - r_net->dest_state &= ~SCTP_ADDR_NOT_REACHABLE; - r_net->dest_state |= SCTP_ADDR_REACHABLE; - sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, - SCTP_HEARTBEAT_SUCCESS, (void *)r_net, SCTP_SO_NOT_LOCKED); - /* now was it the primary? if so restore */ - if (r_net->dest_state & SCTP_ADDR_WAS_PRIMARY) { - (void)sctp_set_primary_addr(stcb, (struct sockaddr *)NULL, r_net); - } - } - /* - * JRS 5/14/07 - If CMT PF is on and the destination is in PF state, - * set the destination to active state and set the cwnd to one or - * two MTU's based on whether PF1 or PF2 is being used. If a T3 - * timer is running, for the destination, stop the timer because a - * PF-heartbeat was received. - */ - if ((stcb->asoc.sctp_cmt_on_off > 0) && - (stcb->asoc.sctp_cmt_pf > 0) && - ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) { - if (SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { - sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, - stcb, net, - SCTP_FROM_SCTP_INPUT + SCTP_LOC_5); - } - net->dest_state &= ~SCTP_ADDR_PF; - net->cwnd = net->mtu * stcb->asoc.sctp_cmt_pf; - SCTPDBG(SCTP_DEBUG_INPUT1, "Destination %p moved from PF to reachable with cwnd %d.\n", - net, net->cwnd); - } /* Now lets do a RTO with this */ r_net->RTO = sctp_calculate_rto(stcb, &stcb->asoc, r_net, &tv, sctp_align_safe_nocopy, SCTP_RTT_FROM_NON_DATA); + if (!(r_net->dest_state & SCTP_ADDR_REACHABLE)) { + r_net->dest_state |= SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, + SCTP_HEARTBEAT_SUCCESS, (void *)r_net, SCTP_SO_NOT_LOCKED); + } + if (r_net->dest_state & SCTP_ADDR_PF) { + r_net->dest_state &= ~SCTP_ADDR_PF; + stcb->asoc.cc_functions.sctp_cwnd_update_exit_pf(stcb, net); + } + if (old_error_counter > 0) { + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, r_net, SCTP_FROM_SCTP_INPUT + SCTP_LOC_3); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, r_net); + } + if (r_net == stcb->asoc.primary_destination) { + if (stcb->asoc.alternate) { + /* release the alternate, primary is good */ + sctp_free_remote_addr(stcb->asoc.alternate); + stcb->asoc.alternate = NULL; + } + } /* Mobility adaptation */ if (req_prim) { if ((sctp_is_mobility_feature_on(stcb->sctp_ep, @@ -824,6 +817,35 @@ sctp_handle_abort(struct sctp_abort_chunk *cp, SCTPDBG(SCTP_DEBUG_INPUT2, "sctp_handle_abort: finished\n"); } +static void +sctp_start_net_timers(struct sctp_tcb *stcb) +{ + uint32_t cnt_hb_sent; + struct sctp_nets *net; + + cnt_hb_sent = 0; + TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { + /* + * For each network start: 1) A pmtu timer. 2) A HB timer 3) + * If the dest in unconfirmed send a hb as well if under + * max_hb_burst have been sent. + */ + sctp_timer_start(SCTP_TIMER_TYPE_PATHMTURAISE, stcb->sctp_ep, stcb, net); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); + if ((net->dest_state & SCTP_ADDR_UNCONFIRMED) && + (cnt_hb_sent < SCTP_BASE_SYSCTL(sctp_hb_maxburst))) { + sctp_send_hb(stcb, net, SCTP_SO_NOT_LOCKED); + cnt_hb_sent++; + } + } + if (cnt_hb_sent) { + sctp_chunk_output(stcb->sctp_ep, stcb, + SCTP_OUTPUT_FROM_COOKIE_ACK, + SCTP_SO_NOT_LOCKED); + } +} + + static void sctp_handle_shutdown(struct sctp_shutdown_chunk *cp, struct sctp_tcb *stcb, struct sctp_nets *net, int *abort_flag) @@ -916,7 +938,7 @@ sctp_handle_shutdown(struct sctp_shutdown_chunk *cp, } else { /* no outstanding data to send, so move on... */ /* send SHUTDOWN-ACK */ - sctp_send_shutdown_ack(stcb, stcb->asoc.primary_destination); + sctp_send_shutdown_ack(stcb, net); /* move to SHUTDOWN-ACK-SENT state */ if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { @@ -2685,7 +2707,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, /* TSNH! Huh, why do I need to add this address here? */ int ret; - ret = sctp_add_remote_addr(*stcb, to, SCTP_DONOT_SETSCOPE, + ret = sctp_add_remote_addr(*stcb, to, NULL, SCTP_DONOT_SETSCOPE, SCTP_IN_COOKIE_PROC); netl = sctp_findnet(*stcb, to); } @@ -2697,10 +2719,7 @@ sctp_handle_cookie_echo(struct mbuf *m, int iphlen, int offset, send_int_conf = 1; } } - if (*stcb) { - sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, *inp_p, - *stcb, NULL); - } + sctp_start_net_timers(*stcb); if ((*inp_p)->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { if (!had_a_existing_tcb || (((*inp_p)->sctp_flags & SCTP_PCB_FLAGS_CONNECTED) == 0)) { @@ -2890,6 +2909,7 @@ sctp_handle_cookie_ack(struct sctp_cookie_ack_chunk *cp, /* state change only needed when I am in right state */ SCTPDBG(SCTP_DEBUG_INPUT2, "moving to OPEN state\n"); SCTP_SET_STATE(asoc, SCTP_STATE_OPEN); + sctp_start_net_timers(stcb); if (asoc->state & SCTP_STATE_SHUTDOWN_PENDING) { sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, asoc->primary_destination); @@ -3380,7 +3400,7 @@ process_chunk_drop(struct sctp_tcb *stcb, struct sctp_chunk_desc *desc, * Only retransmit if we KNOW we wont destroy the * tcb */ - (void)sctp_send_hb(stcb, 1, net, SCTP_SO_NOT_LOCKED); + sctp_send_hb(stcb, net, SCTP_SO_NOT_LOCKED); } break; case SCTP_SHUTDOWN: @@ -3999,8 +4019,7 @@ strres_nochunk: /* setup chunk parameters */ chk->sent = SCTP_DATAGRAM_UNSENT; chk->snd_count = 0; - chk->whoTo = stcb->asoc.primary_destination; - atomic_add_int(&chk->whoTo->ref_count, 1); + chk->whoTo = NULL; ch = mtod(chk->data, struct sctp_chunkhdr *); ch->chunk_type = SCTP_STREAM_RESET; @@ -4630,8 +4649,7 @@ process_control_chunks: if ((stcb != NULL) && (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_ACK_SENT)) { - sctp_send_shutdown_ack(stcb, - stcb->asoc.primary_destination); + sctp_send_shutdown_ack(stcb, NULL); *offset = length; sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_CONTROL_PROC, SCTP_SO_NOT_LOCKED); if (locked_tcb) { diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index 043b3b274c3..803c3094573 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -3543,7 +3543,8 @@ sctp_process_cmsgs_for_init(struct sctp_tcb *stcb, struct mbuf *control, int *er *error = EINVAL; return (-1); } - if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { + if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin, NULL, + SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { *error = ENOBUFS; return (1); } @@ -3574,13 +3575,15 @@ sctp_process_cmsgs_for_init(struct sctp_tcb *stcb, struct mbuf *control, int *er *error = EINVAL; return (-1); } - if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { + if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin, NULL, + SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { *error = ENOBUFS; return (1); } } else #endif - if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin6, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { + if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin6, NULL, + SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { *error = ENOBUFS; return (1); } @@ -3828,28 +3831,7 @@ sctp_handle_no_route(struct sctp_tcb *stcb, (void *)net, so_locked); net->dest_state &= ~SCTP_ADDR_REACHABLE; - net->dest_state |= SCTP_ADDR_NOT_REACHABLE; - /* - * JRS 5/14/07 - If a destination is - * unreachable, the PF bit is turned off. - * This allows an unambiguous use of the PF - * bit for destinations that are reachable - * but potentially failed. If the - * destination is set to the unreachable - * state, also set the destination to the PF - * state. - */ - /* - * Add debug message here if destination is - * not in PF state. - */ - /* Stop any running T3 timers here? */ - if ((stcb->asoc.sctp_cmt_on_off > 0) && - (stcb->asoc.sctp_cmt_pf > 0)) { - net->dest_state &= ~SCTP_ADDR_PF; - SCTPDBG(SCTP_DEBUG_OUTPUT1, "Destination %p moved from PF to unreachable.\n", - net); - } + net->dest_state &= ~SCTP_ADDR_PF; } } if (stcb) { @@ -3859,14 +3841,16 @@ sctp_handle_no_route(struct sctp_tcb *stcb, alt = sctp_find_alternate_net(stcb, net, 0); if (alt != net) { - if (sctp_set_primary_addr(stcb, (struct sockaddr *)NULL, alt) == 0) { - net->dest_state |= SCTP_ADDR_WAS_PRIMARY; - if (net->ro._s_addr) { - sctp_free_ifa(net->ro._s_addr); - net->ro._s_addr = NULL; - } - net->src_addr_selected = 0; + if (stcb->asoc.alternate) { + sctp_free_remote_addr(stcb->asoc.alternate); } + stcb->asoc.alternate = alt; + atomic_add_int(&stcb->asoc.alternate->ref_count, 1); + if (net->ro._s_addr) { + sctp_free_ifa(net->ro._s_addr); + net->ro._s_addr = NULL; + } + net->src_addr_selected = 0; } } } @@ -6498,6 +6482,7 @@ sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, int added_control = 0; int un_sent, do_chunk_output = 1; struct sctp_association *asoc; + struct sctp_nets *net; ca = (struct sctp_copy_all *)ptr; if (ca->m == NULL) { @@ -6531,6 +6516,11 @@ sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, m = NULL; } SCTP_TCB_LOCK_ASSERT(stcb); + if (stcb->asoc.alternate) { + net = stcb->asoc.alternate; + } else { + net = stcb->asoc.primary_destination; + } if (ca->sndrcv.sinfo_flags & SCTP_ABORT) { /* Abort this assoc with m as the user defined reason */ if (m) { @@ -6569,7 +6559,7 @@ sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, } } else { if (m) { - ret = sctp_msg_append(stcb, stcb->asoc.primary_destination, m, + ret = sctp_msg_append(stcb, net, m, &ca->sndrcv, 1); } asoc = &stcb->asoc; @@ -6596,14 +6586,14 @@ sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, * only send SHUTDOWN the first time * through */ - sctp_send_shutdown(stcb, stcb->asoc.primary_destination); + sctp_send_shutdown(stcb, net); if (SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) { SCTP_STAT_DECR_GAUGE32(sctps_currestab); } SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb, - asoc->primary_destination); + net); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, asoc->primary_destination); added_control = 1; @@ -7733,13 +7723,13 @@ sctp_med_chunk_output(struct sctp_inpcb *inp, struct sctp_auth_chunk *auth = NULL; uint16_t auth_keyid; int override_ok = 1; + int skip_fill_up = 0; int data_auth_reqd = 0; /* * JRS 5/14/07 - Add flag for whether a heartbeat is sent to the * destination. */ - int pf_hbflag = 0; int quit_now = 0; *num_out = 0; @@ -7806,7 +7796,22 @@ nothing_to_send: max_send_per_dest = SCTP_SB_LIMIT_SND(stcb->sctp_socket) / asoc->numnets; else max_send_per_dest = 0; + if (no_data_chunks == 0) { + /* How many non-directed chunks are there? */ + TAILQ_FOREACH(chk, &asoc->send_queue, sctp_next) { + if (chk->whoTo == NULL) { + /* + * We already have non-directed chunks on + * the queue, no need to do a fill-up. + */ + skip_fill_up = 1; + break; + } + } + + } if ((no_data_chunks == 0) && + (skip_fill_up == 0) && (!stcb->asoc.ss_functions.sctp_ss_is_empty(stcb, asoc))) { TAILQ_FOREACH(net, &asoc->nets, sctp_next) { /* @@ -7821,8 +7826,10 @@ nothing_to_send: * copy by reference (we hope). */ net->window_probe = 0; - if ((net->dest_state & SCTP_ADDR_NOT_REACHABLE) || - (net->dest_state & SCTP_ADDR_UNCONFIRMED)) { + if ((net != stcb->asoc.alternate) && + ((net->dest_state & SCTP_ADDR_PF) || + (!(net->dest_state & SCTP_ADDR_REACHABLE)) || + (net->dest_state & SCTP_ADDR_UNCONFIRMED))) { if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { sctp_log_cwnd(stcb, net, 1, SCTP_CWND_LOG_FILL_OUTQ_CALLED); @@ -7833,16 +7840,6 @@ nothing_to_send: (net->flight_size == 0)) { (*stcb->asoc.cc_functions.sctp_cwnd_new_transmission_begins) (stcb, net); } - if ((asoc->sctp_cmt_on_off == 0) && - (asoc->primary_destination != net) && - (net->ref_count < 2)) { - /* nothing can be in queue for this guy */ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { - sctp_log_cwnd(stcb, net, 2, - SCTP_CWND_LOG_FILL_OUTQ_CALLED); - } - continue; - } if (net->flight_size >= net->cwnd) { /* skip this network, no room - can't fill */ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { @@ -7886,6 +7883,16 @@ nothing_to_send: } else { start_at = TAILQ_FIRST(&asoc->nets); } + TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { + if (chk->whoTo == NULL) { + if (asoc->alternate) { + chk->whoTo = asoc->alternate; + } else { + chk->whoTo = asoc->primary_destination; + } + atomic_add_int(&chk->whoTo->ref_count, 1); + } + } old_start_at = NULL; again_one_more_time: for (net = start_at; net != NULL; net = TAILQ_NEXT(net, sctp_next)) { @@ -7896,15 +7903,6 @@ again_one_more_time: break; } tsns_sent = 0xa; - if ((asoc->sctp_cmt_on_off == 0) && - (asoc->primary_destination != net) && - (net->ref_count < 2)) { - /* - * Ref-count of 1 so we cannot have data or control - * queued to this address. Skip it (non-CMT). - */ - continue; - } if (TAILQ_EMPTY(&asoc->control_send_queue) && TAILQ_EMPTY(&asoc->asconf_send_queue) && (net->flight_size >= net->cwnd)) { @@ -8266,15 +8264,8 @@ again_one_more_time: (chk->rec.chunk_id.id == SCTP_ECN_CWR) || (chk->rec.chunk_id.id == SCTP_PACKET_DROPPED) || (chk->rec.chunk_id.id == SCTP_ASCONF_ACK)) { - if (chk->rec.chunk_id.id == SCTP_HEARTBEAT_REQUEST) { hbflag = 1; - /* - * JRS 5/14/07 - Set the - * flag to say a heartbeat - * is being sent. - */ - pf_hbflag = 1; } /* remove these chunks at the end */ if ((chk->rec.chunk_id.id == SCTP_SELECTIVE_ACK) || @@ -8408,7 +8399,7 @@ again_one_more_time: } /* JRI: if dest is in PF state, do not send data to it */ if ((asoc->sctp_cmt_on_off > 0) && - (asoc->sctp_cmt_pf > 0) && + (net != stcb->asoc.alternate) && (net->dest_state & SCTP_ADDR_PF)) { goto no_data_fill; } @@ -8486,6 +8477,17 @@ again_one_more_time: /* Don't send the chunk on this net */ continue; } + if (asoc->sctp_cmt_on_off == 0) { + if ((asoc->alternate) && + (asoc->alternate != net) && + (chk->whoTo == NULL)) { + continue; + } else if ((net != asoc->primary_destination) && + (asoc->alternate == NULL) && + (chk->whoTo == NULL)) { + continue; + } + } if ((chk->send_size > omtu) && ((chk->flags & CHUNK_FLAGS_FRAGMENT_OK) == 0)) { /*- * strange, we have a chunk that is @@ -8646,18 +8648,6 @@ no_data_fill: * restart it. */ sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net); - } else if ((asoc->sctp_cmt_on_off > 0) && - (asoc->sctp_cmt_pf > 0) && - pf_hbflag && - ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF) && - (!SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer))) { - /* - * JRS 5/14/07 - If a HB has been sent to a - * PF destination and no T3 timer is - * currently running, start the T3 timer to - * track the HBs that were sent. - */ - sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, net); } /* Now send it, if there is anything to send :> */ if ((error = sctp_lowlevel_chunk_output(inp, @@ -8747,24 +8737,6 @@ no_data_fill: } SCTP_STAT_INCR_BY(sctps_senddata, bundle_at); sctp_clean_up_datalist(stcb, asoc, data_list, bundle_at, net); - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - if (net->flight_size < net->cwnd) { - /* start or restart it */ - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, inp, stcb, net, - SCTP_FROM_SCTP_OUTPUT + SCTP_LOC_2); - } - SCTP_STAT_INCR(sctps_earlyfrstrout); - sctp_timer_start(SCTP_TIMER_TYPE_EARLYFR, inp, stcb, net); - } else { - /* stop it if its running */ - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpout); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, inp, stcb, net, - SCTP_FROM_SCTP_OUTPUT + SCTP_LOC_3); - } - } - } } if (one_chunk) { break; @@ -8833,8 +8805,7 @@ sctp_queue_op_err(struct sctp_tcb *stcb, struct mbuf *op_err) chk->flags = 0; chk->asoc = &stcb->asoc; chk->data = op_err; - chk->whoTo = chk->asoc->primary_destination; - atomic_add_int(&chk->whoTo->ref_count, 1); + chk->whoTo = NULL; hdr = mtod(op_err, struct sctp_chunkhdr *); hdr->chunk_type = SCTP_OPERATION_ERROR; hdr->chunk_flags = 0; @@ -8929,7 +8900,7 @@ sctp_send_cookie_echo(struct mbuf *m, chk->flags = CHUNK_FLAGS_FRAGMENT_OK; chk->asoc = &stcb->asoc; chk->data = cookie; - chk->whoTo = chk->asoc->primary_destination; + chk->whoTo = net; atomic_add_int(&chk->whoTo->ref_count, 1); TAILQ_INSERT_HEAD(&chk->asoc->control_send_queue, chk, sctp_next); chk->asoc->ctrl_queue_cnt++; @@ -9039,10 +9010,10 @@ sctp_send_cookie_ack(struct sctp_tcb *stcb) chk->data = cookie_ack; if (chk->asoc->last_control_chunk_from != NULL) { chk->whoTo = chk->asoc->last_control_chunk_from; + atomic_add_int(&chk->whoTo->ref_count, 1); } else { - chk->whoTo = chk->asoc->primary_destination; + chk->whoTo = NULL; } - atomic_add_int(&chk->whoTo->ref_count, 1); hdr = mtod(cookie_ack, struct sctp_chunkhdr *); hdr->chunk_type = SCTP_COOKIE_ACK; hdr->chunk_flags = 0; @@ -9084,8 +9055,9 @@ sctp_send_shutdown_ack(struct sctp_tcb *stcb, struct sctp_nets *net) chk->asoc = &stcb->asoc; chk->data = m_shutdown_ack; chk->whoTo = net; - atomic_add_int(&net->ref_count, 1); - + if (chk->whoTo) { + atomic_add_int(&chk->whoTo->ref_count, 1); + } ack_cp = mtod(m_shutdown_ack, struct sctp_shutdown_ack_chunk *); ack_cp->ch.chunk_type = SCTP_SHUTDOWN_ACK; ack_cp->ch.chunk_flags = 0; @@ -9126,8 +9098,9 @@ sctp_send_shutdown(struct sctp_tcb *stcb, struct sctp_nets *net) chk->asoc = &stcb->asoc; chk->data = m_shutdown; chk->whoTo = net; - atomic_add_int(&net->ref_count, 1); - + if (chk->whoTo) { + atomic_add_int(&chk->whoTo->ref_count, 1); + } shutdown_cp = mtod(m_shutdown, struct sctp_shutdown_chunk *); shutdown_cp->ch.chunk_type = SCTP_SHUTDOWN; shutdown_cp->ch.chunk_flags = 0; @@ -9178,7 +9151,9 @@ sctp_send_asconf(struct sctp_tcb *stcb, struct sctp_nets *net, int addr_locked) chk->flags = CHUNK_FLAGS_FRAGMENT_OK; chk->asoc = &stcb->asoc; chk->whoTo = net; - atomic_add_int(&chk->whoTo->ref_count, 1); + if (chk->whoTo) { + atomic_add_int(&chk->whoTo->ref_count, 1); + } TAILQ_INSERT_TAIL(&chk->asoc->asconf_send_queue, chk, sctp_next); chk->asoc->ctrl_queue_cnt++; return; @@ -9208,17 +9183,27 @@ sctp_send_asconf_ack(struct sctp_tcb *stcb) net = sctp_find_alternate_net(stcb, stcb->asoc.last_control_chunk_from, 0); if (net == NULL) { /* no alternate */ - if (stcb->asoc.last_control_chunk_from == NULL) - net = stcb->asoc.primary_destination; - else + if (stcb->asoc.last_control_chunk_from == NULL) { + if (stcb->asoc.alternate) { + net = stcb->asoc.alternate; + } else { + net = stcb->asoc.primary_destination; + } + } else { net = stcb->asoc.last_control_chunk_from; + } } } else { /* normal case */ - if (stcb->asoc.last_control_chunk_from == NULL) - net = stcb->asoc.primary_destination; - else + if (stcb->asoc.last_control_chunk_from == NULL) { + if (stcb->asoc.alternate) { + net = stcb->asoc.alternate; + } else { + net = stcb->asoc.primary_destination; + } + } else { net = stcb->asoc.last_control_chunk_from; + } } latest_ack->last_sent_to = net; @@ -9256,6 +9241,9 @@ sctp_send_asconf_ack(struct sctp_tcb *stcb) chk->copy_by_ref = 0; chk->whoTo = net; + if (chk->whoTo) { + atomic_add_int(&chk->whoTo->ref_count, 1); + } chk->data = m_ack; chk->send_size = 0; /* Get size */ @@ -9267,7 +9255,6 @@ sctp_send_asconf_ack(struct sctp_tcb *stcb) chk->snd_count = 0; chk->flags |= CHUNK_FLAGS_FRAGMENT_OK; /* XXX */ chk->asoc = &stcb->asoc; - atomic_add_int(&chk->whoTo->ref_count, 1); TAILQ_INSERT_TAIL(&chk->asoc->control_send_queue, chk, sctp_next); chk->asoc->ctrl_queue_cnt++; @@ -9797,7 +9784,11 @@ sctp_timer_validation(struct sctp_inpcb *inp, SCTP_TCB_LOCK_ASSERT(stcb); /* Gak, we did not have a timer somewhere */ SCTPDBG(SCTP_DEBUG_OUTPUT3, "Deadlock avoided starting timer on a dest at retran\n"); - sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, asoc->primary_destination); + if (asoc->alternate) { + sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, asoc->alternate); + } else { + sctp_timer_start(SCTP_TIMER_TYPE_SEND, inp, stcb, asoc->primary_destination); + } return (ret); } @@ -9945,8 +9936,7 @@ sctp_chunk_output(struct sctp_inpcb *inp, #endif /* Check for bad destinations, if they exist move chunks around. */ TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - if ((net->dest_state & SCTP_ADDR_NOT_REACHABLE) == - SCTP_ADDR_NOT_REACHABLE) { + if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { /*- * if possible move things off of this address we * still may send below due to the dormant state but @@ -9956,16 +9946,6 @@ sctp_chunk_output(struct sctp_inpcb *inp, */ if (net->ref_count > 1) sctp_move_chunks_from_net(stcb, net); - } else if ((asoc->sctp_cmt_on_off > 0) && - (asoc->sctp_cmt_pf > 0) && - ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) { - /* - * JRS 5/14/07 - If CMT PF is on and the current - * destination is in PF state, move all queued data - * to an alternate desination. - */ - if (net->ref_count > 1) - sctp_move_chunks_from_net(stcb, net); } else { /*- * if ((asoc->sat_network) || (net->addr_is_local)) @@ -10123,10 +10103,9 @@ send_forward_tsn(struct sctp_tcb *stcb, chk->sent = SCTP_DATAGRAM_UNSENT; chk->snd_count = 0; /* Do we correct its output location? */ - if (chk->whoTo != asoc->primary_destination) { + if (chk->whoTo) { sctp_free_remote_addr(chk->whoTo); - chk->whoTo = asoc->primary_destination; - atomic_add_int(&chk->whoTo->ref_count, 1); + chk->whoTo = NULL; } goto sctp_fill_in_rest; } @@ -10150,8 +10129,6 @@ send_forward_tsn(struct sctp_tcb *stcb, SCTP_BUF_RESV_UF(chk->data, SCTP_MIN_OVERHEAD); chk->sent = SCTP_DATAGRAM_UNSENT; chk->snd_count = 0; - chk->whoTo = asoc->primary_destination; - atomic_add_int(&chk->whoTo->ref_count, 1); TAILQ_INSERT_TAIL(&asoc->control_send_queue, chk, sctp_next); asoc->ctrl_queue_cnt++; sctp_fill_in_rest: @@ -10346,8 +10323,10 @@ sctp_send_sack(struct sctp_tcb *stcb, int so_locked sctp_m_freem(a_chk->data); a_chk->data = NULL; } - sctp_free_remote_addr(a_chk->whoTo); - a_chk->whoTo = NULL; + if (a_chk->whoTo) { + sctp_free_remote_addr(a_chk->whoTo); + a_chk->whoTo = NULL; + } break; } } @@ -10379,13 +10358,13 @@ sctp_send_sack(struct sctp_tcb *stcb, int so_locked a_chk->whoTo = NULL; if ((asoc->numduptsns) || - (asoc->last_data_chunk_from->dest_state & SCTP_ADDR_NOT_REACHABLE)) { + (!(asoc->last_data_chunk_from->dest_state & SCTP_ADDR_REACHABLE))) { /*- * Ok, we have some duplicates or the destination for the * sack is unreachable, lets see if we can select an * alternate than asoc->last_data_chunk_from */ - if ((!(asoc->last_data_chunk_from->dest_state & SCTP_ADDR_NOT_REACHABLE)) && + if ((asoc->last_data_chunk_from->dest_state & SCTP_ADDR_REACHABLE) && (asoc->used_alt_onsack > asoc->numnets)) { /* We used an alt last time, don't this time */ a_chk->whoTo = NULL; @@ -10710,6 +10689,7 @@ sctp_send_abort_tcb(struct sctp_tcb *stcb, struct mbuf *operr, int so_locked int sz; uint32_t auth_offset = 0; struct sctp_auth_chunk *auth = NULL; + struct sctp_nets *net; /*- * Add an AUTH chunk, if chunk requires it and save the offset into @@ -10750,16 +10730,19 @@ sctp_send_abort_tcb(struct sctp_tcb *stcb, struct mbuf *operr, int so_locked /* Put AUTH chunk at the front of the chain */ SCTP_BUF_NEXT(m_end) = m_abort; } - + if (stcb->asoc.alternate) { + net = stcb->asoc.alternate; + } else { + net = stcb->asoc.primary_destination; + } /* fill in the ABORT chunk */ abort = mtod(m_abort, struct sctp_abort_chunk *); abort->ch.chunk_type = SCTP_ABORT_ASSOCIATION; abort->ch.chunk_flags = 0; abort->ch.chunk_length = htons(sizeof(*abort) + sz); - (void)sctp_lowlevel_chunk_output(stcb->sctp_ep, stcb, - stcb->asoc.primary_destination, - (struct sockaddr *)&stcb->asoc.primary_destination->ro._l_addr, + (void)sctp_lowlevel_chunk_output(stcb->sctp_ep, stcb, net, + (struct sockaddr *)&net->ro._l_addr, m_out, auth_offset, auth, stcb->asoc.authinfo.active_keyid, 1, 0, NULL, 0, stcb->sctp_ep->sctp_lport, stcb->rport, htonl(stcb->asoc.peer_vtag), stcb->asoc.primary_destination->port, so_locked, NULL, NULL); @@ -11030,120 +11013,22 @@ sctp_send_shutdown_complete2(struct mbuf *m, int iphlen, struct sctphdr *sh, } -static struct sctp_nets * -sctp_select_hb_destination(struct sctp_tcb *stcb, struct timeval *now) -{ - struct sctp_nets *net, *hnet; - int ms_goneby, highest_ms, state_overide = 0; - - (void)SCTP_GETTIME_TIMEVAL(now); - highest_ms = 0; - hnet = NULL; - SCTP_TCB_LOCK_ASSERT(stcb); - TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - if ( - ((net->dest_state & SCTP_ADDR_NOHB) && ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0)) || - (net->dest_state & SCTP_ADDR_OUT_OF_SCOPE) - ) { - /* - * Skip this guy from consideration if HB is off AND - * its confirmed - */ - continue; - } - if (sctp_destination_is_reachable(stcb, (struct sockaddr *)&net->ro._l_addr) == 0) { - /* skip this dest net from consideration */ - continue; - } - if (net->last_sent_time.tv_sec) { - /* Sent to so we subtract */ - ms_goneby = (now->tv_sec - net->last_sent_time.tv_sec) * 1000; - } else - /* Never been sent to */ - ms_goneby = 0x7fffffff; - /*- - * When the address state is unconfirmed but still - * considered reachable, we HB at a higher rate. Once it - * goes confirmed OR reaches the "unreachable" state, thenw - * we cut it back to HB at a more normal pace. - */ - if ((net->dest_state & (SCTP_ADDR_UNCONFIRMED | SCTP_ADDR_NOT_REACHABLE)) == SCTP_ADDR_UNCONFIRMED) { - state_overide = 1; - } else { - state_overide = 0; - } - - if ((((unsigned int)ms_goneby >= net->RTO) || (state_overide)) && - (ms_goneby > highest_ms)) { - highest_ms = ms_goneby; - hnet = net; - } - } - if (hnet && - ((hnet->dest_state & (SCTP_ADDR_UNCONFIRMED | SCTP_ADDR_NOT_REACHABLE)) == SCTP_ADDR_UNCONFIRMED)) { - state_overide = 1; - } else { - state_overide = 0; - } - - if (hnet && highest_ms && (((unsigned int)highest_ms >= hnet->RTO) || state_overide)) { - /*- - * Found the one with longest delay bounds OR it is - * unconfirmed and still not marked unreachable. - */ - SCTPDBG(SCTP_DEBUG_OUTPUT4, "net:%p is the hb winner -", hnet); -#ifdef SCTP_DEBUG - if (hnet) { - SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT4, - (struct sockaddr *)&hnet->ro._l_addr); - } else { - SCTPDBG(SCTP_DEBUG_OUTPUT4, " none\n"); - } -#endif - /* update the timer now */ - hnet->last_sent_time = *now; - return (hnet); - } - /* Nothing to HB */ - return (NULL); -} - -int -sctp_send_hb(struct sctp_tcb *stcb, int user_req, struct sctp_nets *u_net, int so_locked +void +sctp_send_hb(struct sctp_tcb *stcb, struct sctp_nets *net, int so_locked #if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) SCTP_UNUSED #endif ) { struct sctp_tmit_chunk *chk; - struct sctp_nets *net; struct sctp_heartbeat_chunk *hb; struct timeval now; SCTP_TCB_LOCK_ASSERT(stcb); - if (user_req == 0) { - net = sctp_select_hb_destination(stcb, &now); - if (net == NULL) { - /*- - * All our busy none to send to, just start the - * timer again. - */ - if (stcb->asoc.state == 0) { - return (0); - } - sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, - stcb->sctp_ep, - stcb, - net); - return (0); - } - } else { - net = u_net; - if (net == NULL) { - return (0); - } - (void)SCTP_GETTIME_TIMEVAL(&now); + if (net == NULL) { + return; } + (void)SCTP_GETTIME_TIMEVAL(&now); switch (net->ro._l_addr.sa.sa_family) { #ifdef INET case AF_INET: @@ -11154,12 +11039,12 @@ sctp_send_hb(struct sctp_tcb *stcb, int user_req, struct sctp_nets *u_net, int s break; #endif default: - return (0); + return; } sctp_alloc_a_chunk(stcb, chk); if (chk == NULL) { SCTPDBG(SCTP_DEBUG_OUTPUT4, "Gak, can't get a chunk for hb\n"); - return (0); + return; } chk->copy_by_ref = 0; chk->rec.chunk_id.id = SCTP_HEARTBEAT_REQUEST; @@ -11170,7 +11055,7 @@ sctp_send_hb(struct sctp_tcb *stcb, int user_req, struct sctp_nets *u_net, int s chk->data = sctp_get_mbuf_for_msg(chk->send_size, 0, M_DONTWAIT, 1, MT_HEADER); if (chk->data == NULL) { sctp_free_a_chunk(stcb, chk, so_locked); - return (0); + return; } SCTP_BUF_RESV_UF(chk->data, SCTP_MIN_OVERHEAD); SCTP_BUF_LEN(chk->data) = chk->send_size; @@ -11191,7 +11076,6 @@ sctp_send_hb(struct sctp_tcb *stcb, int user_req, struct sctp_nets *u_net, int s hb->heartbeat.hb_info.time_value_1 = now.tv_sec; hb->heartbeat.hb_info.time_value_2 = now.tv_usec; /* Did our user request this one, put it in */ - hb->heartbeat.hb_info.user_req = user_req; hb->heartbeat.hb_info.addr_family = net->ro._l_addr.sa.sa_family; hb->heartbeat.hb_info.addr_len = net->ro._l_addr.sa.sa_len; if (net->dest_state & SCTP_ADDR_UNCONFIRMED) { @@ -11221,57 +11105,14 @@ sctp_send_hb(struct sctp_tcb *stcb, int user_req, struct sctp_nets *u_net, int s break; #endif default: - return (0); + return; break; } - - /* - * JRS 5/14/07 - In CMT PF, the T3 timer is used to track - * PF-heartbeats. Because of this, threshold management is done by - * the t3 timer handler, and does not need to be done upon the send - * of a PF-heartbeat. If CMT PF is on and the destination to which a - * heartbeat is being sent is in PF state, do NOT do threshold - * management. - */ - if ((stcb->asoc.sctp_cmt_pf == 0) || - ((net->dest_state & SCTP_ADDR_PF) != SCTP_ADDR_PF)) { - /* ok we have a destination that needs a beat */ - /* lets do the theshold management Qiaobing style */ - if (sctp_threshold_management(stcb->sctp_ep, stcb, net, - stcb->asoc.max_send_times)) { - /*- - * we have lost the association, in a way this is - * quite bad since we really are one less time since - * we really did not send yet. This is the down side - * to the Q's style as defined in the RFC and not my - * alternate style defined in the RFC. - */ - if (chk->data != NULL) { - sctp_m_freem(chk->data); - chk->data = NULL; - } - /* - * Here we do NOT use the macro since the - * association is now gone. - */ - if (chk->whoTo) { - sctp_free_remote_addr(chk->whoTo); - chk->whoTo = NULL; - } - sctp_free_a_chunk((struct sctp_tcb *)NULL, chk, so_locked); - return (-1); - } - } net->hb_responded = 0; TAILQ_INSERT_TAIL(&stcb->asoc.control_send_queue, chk, sctp_next); stcb->asoc.ctrl_queue_cnt++; SCTP_STAT_INCR(sctps_sendheartbeat); - /*- - * Call directly med level routine to put out the chunk. It will - * always tumble out control chunks aka HB but it may even tumble - * out data too. - */ - return (1); + return; } void @@ -11282,6 +11123,9 @@ sctp_send_ecn_echo(struct sctp_tcb *stcb, struct sctp_nets *net, struct sctp_ecne_chunk *ecne; struct sctp_tmit_chunk *chk; + if (net == NULL) { + return; + } asoc = &stcb->asoc; SCTP_TCB_LOCK_ASSERT(stcb); TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { @@ -11323,6 +11167,7 @@ sctp_send_ecn_echo(struct sctp_tcb *stcb, struct sctp_nets *net, chk->snd_count = 0; chk->whoTo = net; atomic_add_int(&chk->whoTo->ref_count, 1); + stcb->asoc.ecn_echo_cnt_onq++; ecne = mtod(chk->data, struct sctp_ecne_chunk *); ecne->ch.chunk_type = SCTP_ECN_ECHO; @@ -11477,10 +11322,10 @@ jump_out: if (net) { /* we should hit here */ chk->whoTo = net; + atomic_add_int(&chk->whoTo->ref_count, 1); } else { - chk->whoTo = asoc->primary_destination; + chk->whoTo = NULL; } - atomic_add_int(&chk->whoTo->ref_count, 1); chk->rec.chunk_id.id = SCTP_PACKET_DROPPED; chk->rec.chunk_id.can_take_data = 1; drp->ch.chunk_type = SCTP_PACKET_DROPPED; @@ -11518,8 +11363,9 @@ sctp_send_cwr(struct sctp_tcb *stcb, struct sctp_nets *net, uint32_t high_tsn, u asoc = &stcb->asoc; SCTP_TCB_LOCK_ASSERT(stcb); - - + if (net == NULL) { + return; + } TAILQ_FOREACH(chk, &asoc->control_send_queue, sctp_next) { if ((chk->rec.chunk_id.id == SCTP_ECN_CWR) && (net == chk->whoTo)) { /* @@ -11849,9 +11695,12 @@ sctp_send_str_reset_req(struct sctp_tcb *stcb, /* setup chunk parameters */ chk->sent = SCTP_DATAGRAM_UNSENT; chk->snd_count = 0; - chk->whoTo = asoc->primary_destination; + if (stcb->asoc.alternate) { + chk->whoTo = stcb->asoc.alternate; + } else { + chk->whoTo = stcb->asoc.primary_destination; + } atomic_add_int(&chk->whoTo->ref_count, 1); - ch = mtod(chk->data, struct sctp_chunkhdr *); ch->chunk_type = SCTP_STREAM_RESET; ch->chunk_flags = 0; @@ -12910,7 +12759,11 @@ sctp_lower_sosend(struct socket *so, goto out_unlocked; } } else { - net = stcb->asoc.primary_destination; + if (stcb->asoc.alternate) { + net = stcb->asoc.alternate; + } else { + net = stcb->asoc.primary_destination; + } } atomic_add_int(&stcb->total_sends, 1); /* Keep the stcb from being freed under our feet */ @@ -13579,15 +13432,22 @@ dataless_eof: if ((SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) && (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_RECEIVED) && (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { + struct sctp_nets *netp; + + if (stcb->asoc.alternate) { + netp = stcb->asoc.alternate; + } else { + netp = stcb->asoc.primary_destination; + } /* only send SHUTDOWN the first time through */ - sctp_send_shutdown(stcb, stcb->asoc.primary_destination); + sctp_send_shutdown(stcb, netp); if (SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) { SCTP_STAT_DECR_GAUGE32(sctps_currestab); } SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb, - asoc->primary_destination); + netp); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, asoc->primary_destination); } diff --git a/sys/netinet/sctp_output.h b/sys/netinet/sctp_output.h index 5cbadf34909..68a08c11c95 100644 --- a/sys/netinet/sctp_output.h +++ b/sys/netinet/sctp_output.h @@ -155,7 +155,7 @@ void send_forward_tsn(struct sctp_tcb *, struct sctp_association *); void sctp_send_sack(struct sctp_tcb *, int); -int sctp_send_hb(struct sctp_tcb *, int, struct sctp_nets *, int); +void sctp_send_hb(struct sctp_tcb *, struct sctp_nets *, int); void sctp_send_ecn_echo(struct sctp_tcb *, struct sctp_nets *, uint32_t); diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c index 70593655fdc..728fa7c6974 100644 --- a/sys/netinet/sctp_pcb.c +++ b/sys/netinet/sctp_pcb.c @@ -1096,8 +1096,15 @@ sctp_does_stcb_own_this_addr(struct sctp_tcb *stcb, struct sockaddr *to) continue; } LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { - if (sctp_is_addr_restricted(stcb, sctp_ifa)) + if (sctp_is_addr_restricted(stcb, sctp_ifa) && + (!sctp_is_addr_pending(stcb, sctp_ifa))) { + /* + * We allow pending addresses, where + * we have sent an asconf-add to be + * considered valid. + */ continue; + } switch (sctp_ifa->address.sa.sa_family) { #ifdef INET case AF_INET: @@ -1155,7 +1162,13 @@ sctp_does_stcb_own_this_addr(struct sctp_tcb *stcb, struct sockaddr *to) struct sctp_laddr *laddr; LIST_FOREACH(laddr, &stcb->sctp_ep->sctp_addr_list, sctp_nxt_addr) { - if (sctp_is_addr_restricted(stcb, laddr->ifa)) { + if (sctp_is_addr_restricted(stcb, laddr->ifa) && + (!sctp_is_addr_pending(stcb, laddr->ifa))) { + /* + * We allow pending addresses, where we have + * sent an asconf-add to be considered + * valid. + */ continue; } if (laddr->ifa->address.sa.sa_family != to->sa_family) { @@ -2614,6 +2627,7 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id) m->max_init_times = SCTP_BASE_SYSCTL(sctp_init_rtx_max_default); m->max_send_times = SCTP_BASE_SYSCTL(sctp_assoc_rtx_max_default); m->def_net_failure = SCTP_BASE_SYSCTL(sctp_path_rtx_max_default); + m->def_net_pf_threshold = SCTP_BASE_SYSCTL(sctp_path_pf_threshold); m->sctp_sws_sender = SCTP_SWS_SENDER_DEF; m->sctp_sws_receiver = SCTP_SWS_RECEIVER_DEF; m->max_burst = SCTP_BASE_SYSCTL(sctp_max_burst_default); @@ -2768,7 +2782,6 @@ sctp_move_pcb_and_assoc(struct sctp_inpcb *old_inp, struct sctp_inpcb *new_inp, * all of them. */ - stcb->asoc.hb_timer.ep = (void *)new_inp; stcb->asoc.dack_timer.ep = (void *)new_inp; stcb->asoc.asconf_timer.ep = (void *)new_inp; stcb->asoc.strreset_timer.ep = (void *)new_inp; @@ -2780,7 +2793,6 @@ sctp_move_pcb_and_assoc(struct sctp_inpcb *old_inp, struct sctp_inpcb *new_inp, TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { net->pmtu_timer.ep = (void *)new_inp; net->rxt_timer.ep = (void *)new_inp; - net->fr_timer.ep = (void *)new_inp; } SCTP_INP_WUNLOCK(new_inp); SCTP_INP_WUNLOCK(old_inp); @@ -3452,11 +3464,18 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from) } if ((SCTP_GET_STATE(&asoc->asoc) != SCTP_STATE_SHUTDOWN_SENT) && (SCTP_GET_STATE(&asoc->asoc) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { + struct sctp_nets *netp; + + if (asoc->asoc.alternate) { + netp = asoc->asoc.alternate; + } else { + netp = asoc->asoc.primary_destination; + } /* * there is nothing queued to send, * so I send shutdown */ - sctp_send_shutdown(asoc, asoc->asoc.primary_destination); + sctp_send_shutdown(asoc, netp); if ((SCTP_GET_STATE(&asoc->asoc) == SCTP_STATE_OPEN) || (SCTP_GET_STATE(&asoc->asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { SCTP_STAT_DECR_GAUGE32(sctps_currestab); @@ -3464,7 +3483,7 @@ sctp_inpcb_free(struct sctp_inpcb *inp, int immediate, int from) SCTP_SET_STATE(&asoc->asoc, SCTP_STATE_SHUTDOWN_SENT); SCTP_CLEAR_SUBSTATE(&asoc->asoc, SCTP_STATE_SHUTDOWN_PENDING); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, asoc->sctp_ep, asoc, - asoc->asoc.primary_destination); + netp); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, asoc->sctp_ep, asoc, asoc->asoc.primary_destination); sctp_chunk_output(inp, asoc, SCTP_OUTPUT_FROM_SHUT_TMR, SCTP_SO_LOCKED); @@ -3808,7 +3827,7 @@ sctp_is_address_on_local_host(struct sockaddr *addr, uint32_t vrf_id) */ int sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, - int set_scope, int from) + struct sctp_nets **netp, int set_scope, int from) { /* * The following is redundant to the same lines in the @@ -3942,7 +3961,7 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, return (-1); } SCTP_INCR_RADDR_COUNT(); - bzero(net, sizeof(*net)); + bzero(net, sizeof(struct sctp_nets)); (void)SCTP_GETTIME_TIMEVAL(&net->start_time); memcpy(&net->ro._l_addr, newaddr, newaddr->sa_len); switch (newaddr->sa_family) { @@ -3968,6 +3987,7 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, addr_inscope = 1; } net->failure_threshold = stcb->asoc.def_net_failure; + net->pf_threshold = stcb->asoc.def_net_pf_threshold; if (addr_inscope == 0) { net->dest_state = (SCTP_ADDR_REACHABLE | SCTP_ADDR_OUT_OF_SCOPE); @@ -4003,10 +4023,16 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, if (newaddr->sa_family == AF_INET6) net->tos_flowlabel = stcb->asoc.default_flowlabel; #endif + if (sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_DONOT_HEARTBEAT)) { + net->dest_state |= SCTP_ADDR_NOHB; + } else { + net->dest_state &= ~SCTP_ADDR_NOHB; + } + net->heart_beat_delay = stcb->asoc.heart_beat_delay; /* Init the timer structure */ SCTP_OS_TIMER_INIT(&net->rxt_timer.timer); - SCTP_OS_TIMER_INIT(&net->fr_timer.timer); SCTP_OS_TIMER_INIT(&net->pmtu_timer.timer); + SCTP_OS_TIMER_INIT(&net->hb_timer.timer); /* Now generate a route for this guy */ #ifdef INET6 @@ -4153,8 +4179,6 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, /* No route to current primary adopt new primary */ stcb->asoc.primary_destination = net; } - sctp_timer_start(SCTP_TIMER_TYPE_PATHMTURAISE, stcb->sctp_ep, stcb, - net); /* Validate primary is first */ net = TAILQ_FIRST(&stcb->asoc.nets); if ((net != stcb->asoc.primary_destination) && @@ -4169,6 +4193,9 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, TAILQ_INSERT_HEAD(&stcb->asoc.nets, stcb->asoc.primary_destination, sctp_next); } + if (netp) { + *netp = net; + } return (0); } @@ -4393,7 +4420,7 @@ sctp_aloc_assoc(struct sctp_inpcb *inp, struct sockaddr *firstaddr, LIST_INSERT_HEAD(head, stcb, sctp_asocs); SCTP_INP_INFO_WUNLOCK(); - if ((err = sctp_add_remote_addr(stcb, firstaddr, SCTP_DO_SETSCOPE, SCTP_ALLOC_ASOC))) { + if ((err = sctp_add_remote_addr(stcb, firstaddr, NULL, SCTP_DO_SETSCOPE, SCTP_ALLOC_ASOC))) { /* failure.. memory error? */ if (asoc->strmout) { SCTP_FREE(asoc->strmout, SCTP_M_STRMO); @@ -4418,7 +4445,6 @@ sctp_aloc_assoc(struct sctp_inpcb *inp, struct sockaddr *firstaddr, return (NULL); } /* Init all the timers */ - SCTP_OS_TIMER_INIT(&asoc->hb_timer.timer); SCTP_OS_TIMER_INIT(&asoc->dack_timer.timer); SCTP_OS_TIMER_INIT(&asoc->strreset_timer.timer); SCTP_OS_TIMER_INIT(&asoc->asconf_timer.timer); @@ -4488,6 +4514,10 @@ out: /* Clear net */ asoc->last_control_chunk_from = NULL; } + if (net == stcb->asoc.alternate) { + sctp_free_remote_addr(stcb->asoc.alternate); + stcb->asoc.alternate = NULL; + } sctp_free_remote_addr(net); } @@ -4699,6 +4729,10 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre /* there is no asoc, really TSNH :-0 */ return (1); } + if (stcb->asoc.alternate) { + sctp_free_remote_addr(stcb->asoc.alternate); + stcb->asoc.alternate = NULL; + } /* TEMP CODE */ if (stcb->freed_from_where == 0) { /* Only record the first place free happened from */ @@ -4737,8 +4771,6 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre } } /* now clean up any other timers */ - (void)SCTP_OS_TIMER_STOP(&asoc->hb_timer.timer); - asoc->hb_timer.self = NULL; (void)SCTP_OS_TIMER_STOP(&asoc->dack_timer.timer); asoc->dack_timer.self = NULL; (void)SCTP_OS_TIMER_STOP(&asoc->strreset_timer.timer); @@ -4762,12 +4794,12 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre (void)SCTP_OS_TIMER_STOP(&asoc->delete_prim_timer.timer); asoc->delete_prim_timer.self = NULL; TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - (void)SCTP_OS_TIMER_STOP(&net->fr_timer.timer); - net->fr_timer.self = NULL; (void)SCTP_OS_TIMER_STOP(&net->rxt_timer.timer); net->rxt_timer.self = NULL; (void)SCTP_OS_TIMER_STOP(&net->pmtu_timer.timer); net->pmtu_timer.self = NULL; + (void)SCTP_OS_TIMER_STOP(&net->hb_timer.timer); + net->hb_timer.self = NULL; } /* Now the read queue needs to be cleaned up (only once) */ if ((stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0) { @@ -4935,7 +4967,6 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre * Now restop the timers to be sure this is paranoia at is finest! */ (void)SCTP_OS_TIMER_STOP(&asoc->strreset_timer.timer); - (void)SCTP_OS_TIMER_STOP(&asoc->hb_timer.timer); (void)SCTP_OS_TIMER_STOP(&asoc->dack_timer.timer); (void)SCTP_OS_TIMER_STOP(&asoc->strreset_timer.timer); (void)SCTP_OS_TIMER_STOP(&asoc->asconf_timer.timer); @@ -4943,9 +4974,9 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre (void)SCTP_OS_TIMER_STOP(&asoc->autoclose_timer.timer); (void)SCTP_OS_TIMER_STOP(&asoc->delayed_event_timer.timer); TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - (void)SCTP_OS_TIMER_STOP(&net->fr_timer.timer); (void)SCTP_OS_TIMER_STOP(&net->rxt_timer.timer); (void)SCTP_OS_TIMER_STOP(&net->pmtu_timer.timer); + (void)SCTP_OS_TIMER_STOP(&net->hb_timer.timer); } asoc->strreset_timer.type = SCTP_TIMER_TYPE_NONE; @@ -6189,7 +6220,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, #ifdef INET case AF_INET: if (stcb->asoc.ipv4_addr_legal) { - if (sctp_add_remote_addr(stcb, sa, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_2)) { + if (sctp_add_remote_addr(stcb, sa, NULL, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_2)) { return (-1); } } @@ -6198,7 +6229,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, #ifdef INET6 case AF_INET6: if (stcb->asoc.ipv6_addr_legal) { - if (sctp_add_remote_addr(stcb, sa, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_3)) { + if (sctp_add_remote_addr(stcb, sa, NULL, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_3)) { return (-2); } } @@ -6289,7 +6320,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, /* the assoc was freed? */ return (-7); } - if (sctp_add_remote_addr(stcb, sa, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_4)) { + if (sctp_add_remote_addr(stcb, sa, NULL, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_4)) { return (-8); } } else if (stcb_tmp == stcb) { @@ -6376,7 +6407,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, * we must add the address, no scope * set */ - if (sctp_add_remote_addr(stcb, sa, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_5)) { + if (sctp_add_remote_addr(stcb, sa, NULL, SCTP_DONOT_SETSCOPE, SCTP_LOAD_ADDR_5)) { return (-17); } } else if (stcb_tmp == stcb) { @@ -6748,7 +6779,10 @@ sctp_set_primary_addr(struct sctp_tcb *stcb, struct sockaddr *sa, return (0); } stcb->asoc.primary_destination = net; - net->dest_state &= ~SCTP_ADDR_WAS_PRIMARY; + if (!(net->dest_state & SCTP_ADDR_PF) && (stcb->asoc.alternate)) { + sctp_free_remote_addr(stcb->asoc.alternate); + stcb->asoc.alternate = NULL; + } net = TAILQ_FIRST(&stcb->asoc.nets); if (net != stcb->asoc.primary_destination) { /* diff --git a/sys/netinet/sctp_pcb.h b/sys/netinet/sctp_pcb.h index 783968191af..a7f5580e26e 100644 --- a/sys/netinet/sctp_pcb.h +++ b/sys/netinet/sctp_pcb.h @@ -293,6 +293,8 @@ struct sctp_pcb { uint16_t def_net_failure; + uint16_t def_net_pf_threshold; + /* number of streams to pre-open on a association */ uint16_t pre_open_stream_count; uint16_t max_open_streams_intome; @@ -582,7 +584,7 @@ void sctp_remove_laddr(struct sctp_laddr *); void sctp_del_local_addr_ep(struct sctp_inpcb *, struct sctp_ifa *); -int sctp_add_remote_addr(struct sctp_tcb *, struct sockaddr *, int, int); +int sctp_add_remote_addr(struct sctp_tcb *, struct sockaddr *, struct sctp_nets **, int, int); void sctp_remove_net(struct sctp_tcb *, struct sctp_nets *); diff --git a/sys/netinet/sctp_structs.h b/sys/netinet/sctp_structs.h index 0f9bcaf5268..df3898f064d 100644 --- a/sys/netinet/sctp_structs.h +++ b/sys/netinet/sctp_structs.h @@ -251,6 +251,7 @@ struct sctp_nets { * structure shared by all. */ struct sctp_timer pmtu_timer; + struct sctp_timer hb_timer; /* * The following two in combination equate to a route entry for v6 @@ -273,7 +274,6 @@ struct sctp_nets { /* This is used for SHUTDOWN/SHUTDOWN-ACK/SEND or INIT timers */ struct sctp_timer rxt_timer; - struct sctp_timer fr_timer; /* for early fr */ /* last time in seconds I sent to it */ struct timeval last_sent_time; @@ -327,12 +327,15 @@ struct sctp_nets { uint32_t marked_retrans;/* number or DATA chunks marked for timer * based retransmissions */ uint32_t marked_fastretrans; + uint32_t heart_beat_delay; /* Heart Beat delay in ms */ /* if this guy is ok or not ... status */ uint16_t dest_state; - /* number of transmit failures to down this guy */ + /* number of timeouts to consider the destination unreachable */ uint16_t failure_threshold; - /* error stats on destination */ + /* number of timeouts to consider the destination potentially failed */ + uint16_t pf_threshold; + /* error stats on the destination */ uint16_t error_count; /* UDP port number in case of UDP tunneling */ uint16_t port; @@ -661,6 +664,7 @@ struct sctp_cc_functions { void (*sctp_cwnd_update_after_sack) (struct sctp_tcb *stcb, struct sctp_association *asoc, int accum_moved, int reneged_all, int will_exit); + void (*sctp_cwnd_update_exit_pf) (struct sctp_tcb *stcb, struct sctp_nets *net); void (*sctp_cwnd_update_after_fr) (struct sctp_tcb *stcb, struct sctp_association *asoc); void (*sctp_cwnd_update_after_timeout) (struct sctp_tcb *stcb, @@ -672,8 +676,6 @@ struct sctp_cc_functions { uint32_t * bottle_bw, uint32_t * on_queue); void (*sctp_cwnd_update_after_output) (struct sctp_tcb *stcb, struct sctp_nets *net, int burst_limit); - void (*sctp_cwnd_update_after_fr_timer) (struct sctp_inpcb *inp, - struct sctp_tcb *stcb, struct sctp_nets *net); void (*sctp_cwnd_update_packet_transmitted) (struct sctp_tcb *stcb, struct sctp_nets *net); void (*sctp_cwnd_update_tsn_acknowledged) (struct sctp_nets *net, @@ -753,7 +755,6 @@ struct sctp_association { struct sctp_nonpad_sndrcvinfo def_send; /* timers and such */ - struct sctp_timer hb_timer; /* hb timer */ struct sctp_timer dack_timer; /* Delayed ack timer */ struct sctp_timer asconf_timer; /* asconf */ struct sctp_timer strreset_timer; /* stream reset */ @@ -828,6 +829,7 @@ struct sctp_association { uint8_t *mapping_array; /* primary destination to use */ struct sctp_nets *primary_destination; + struct sctp_nets *alternate; /* If primary is down or PF */ /* For CMT */ struct sctp_nets *last_net_cmt_send_started; /* last place I got a data chunk from */ @@ -1023,8 +1025,8 @@ struct sctp_association { unsigned int size_on_all_streams; unsigned int cnt_on_all_streams; - /* Heart Beat delay in ticks */ - unsigned int heart_beat_delay; + /* Heart Beat delay in ms */ + uint32_t heart_beat_delay; /* autoclose */ unsigned int sctp_autoclose_ticks; @@ -1094,6 +1096,8 @@ struct sctp_association { uint16_t def_net_failure; + uint16_t def_net_pf_threshold; + /* * lock flag: 0 is ok to send, 1+ (duals as a retran count) is * awaiting ACK @@ -1133,7 +1137,6 @@ struct sctp_association { uint8_t last_flags_delivered; uint8_t hb_ect_randombit; uint8_t hb_random_idx; - uint8_t hb_is_disabled; /* is the hb disabled? */ uint8_t default_tos; uint8_t asconf_del_pending; /* asconf delete last addr pending */ diff --git a/sys/netinet/sctp_sysctl.c b/sys/netinet/sctp_sysctl.c index bb7b6e265d2..25d75f88e08 100644 --- a/sys/netinet/sctp_sysctl.c +++ b/sys/netinet/sctp_sysctl.c @@ -83,16 +83,14 @@ sctp_init_sysctls() SCTP_BASE_SYSCTL(sctp_init_rtx_max_default) = SCTPCTL_INIT_RTX_MAX_DEFAULT; SCTP_BASE_SYSCTL(sctp_assoc_rtx_max_default) = SCTPCTL_ASSOC_RTX_MAX_DEFAULT; SCTP_BASE_SYSCTL(sctp_path_rtx_max_default) = SCTPCTL_PATH_RTX_MAX_DEFAULT; + SCTP_BASE_SYSCTL(sctp_path_pf_threshold) = SCTPCTL_PATH_PF_THRESHOLD_DEFAULT; SCTP_BASE_SYSCTL(sctp_add_more_threshold) = SCTPCTL_ADD_MORE_ON_OUTPUT_DEFAULT; SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default) = SCTPCTL_OUTGOING_STREAMS_DEFAULT; SCTP_BASE_SYSCTL(sctp_cmt_on_off) = SCTPCTL_CMT_ON_OFF_DEFAULT; /* EY */ SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) = SCTPCTL_NR_SACK_ON_OFF_DEFAULT; SCTP_BASE_SYSCTL(sctp_cmt_use_dac) = SCTPCTL_CMT_USE_DAC_DEFAULT; - SCTP_BASE_SYSCTL(sctp_cmt_pf) = SCTPCTL_CMT_PF_DEFAULT; SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst) = SCTPCTL_CWND_MAXBURST_DEFAULT; - SCTP_BASE_SYSCTL(sctp_early_fr) = SCTPCTL_EARLY_FAST_RETRAN_DEFAULT; - SCTP_BASE_SYSCTL(sctp_early_fr_msec) = SCTPCTL_EARLY_FAST_RETRAN_MSEC_DEFAULT; SCTP_BASE_SYSCTL(sctp_asconf_auth_nochk) = SCTPCTL_ASCONF_AUTH_NOCHK_DEFAULT; SCTP_BASE_SYSCTL(sctp_auth_disable) = SCTPCTL_AUTH_DISABLE_DEFAULT; SCTP_BASE_SYSCTL(sctp_nat_friendly) = SCTPCTL_NAT_FRIENDLY_DEFAULT; @@ -494,6 +492,7 @@ sctp_assoclist(SYSCTL_HANDLER_ARGS) xraddr.active = ((net->dest_state & SCTP_ADDR_REACHABLE) == SCTP_ADDR_REACHABLE); xraddr.confirmed = ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0); xraddr.heartbeat_enabled = ((net->dest_state & SCTP_ADDR_NOHB) == 0); + xraddr.potentially_failed = ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF); xraddr.rto = net->RTO; xraddr.max_path_rtx = net->failure_threshold; xraddr.rtx = net->marked_retrans; @@ -502,6 +501,7 @@ sctp_assoclist(SYSCTL_HANDLER_ARGS) xraddr.flight_size = net->flight_size; xraddr.mtu = net->mtu; xraddr.rtt = net->rtt / 1000; + xraddr.heartbeat_interval = net->heart_beat_delay; xraddr.start_time.tv_sec = (uint32_t) net->start_time.tv_sec; xraddr.start_time.tv_usec = (uint32_t) net->start_time.tv_usec; SCTP_INP_RUNLOCK(inp); @@ -633,16 +633,14 @@ sysctl_sctp_check(SYSCTL_HANDLER_ARGS) RANGECHK(SCTP_BASE_SYSCTL(sctp_init_rtx_max_default), SCTPCTL_INIT_RTX_MAX_MIN, SCTPCTL_INIT_RTX_MAX_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_assoc_rtx_max_default), SCTPCTL_ASSOC_RTX_MAX_MIN, SCTPCTL_ASSOC_RTX_MAX_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_path_rtx_max_default), SCTPCTL_PATH_RTX_MAX_MIN, SCTPCTL_PATH_RTX_MAX_MAX); + RANGECHK(SCTP_BASE_SYSCTL(sctp_path_pf_threshold), SCTPCTL_PATH_PF_THRESHOLD_MIN, SCTPCTL_PATH_PF_THRESHOLD_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_add_more_threshold), SCTPCTL_ADD_MORE_ON_OUTPUT_MIN, SCTPCTL_ADD_MORE_ON_OUTPUT_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default), SCTPCTL_OUTGOING_STREAMS_MIN, SCTPCTL_OUTGOING_STREAMS_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_on_off), SCTPCTL_CMT_ON_OFF_MIN, SCTPCTL_CMT_ON_OFF_MAX); /* EY */ RANGECHK(SCTP_BASE_SYSCTL(sctp_nr_sack_on_off), SCTPCTL_NR_SACK_ON_OFF_MIN, SCTPCTL_NR_SACK_ON_OFF_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_use_dac), SCTPCTL_CMT_USE_DAC_MIN, SCTPCTL_CMT_USE_DAC_MAX); - RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_pf), SCTPCTL_CMT_PF_MIN, SCTPCTL_CMT_PF_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst), SCTPCTL_CWND_MAXBURST_MIN, SCTPCTL_CWND_MAXBURST_MAX); - RANGECHK(SCTP_BASE_SYSCTL(sctp_early_fr), SCTPCTL_EARLY_FAST_RETRAN_MIN, SCTPCTL_EARLY_FAST_RETRAN_MAX); - RANGECHK(SCTP_BASE_SYSCTL(sctp_early_fr_msec), SCTPCTL_EARLY_FAST_RETRAN_MSEC_MIN, SCTPCTL_EARLY_FAST_RETRAN_MSEC_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_asconf_auth_nochk), SCTPCTL_ASCONF_AUTH_NOCHK_MIN, SCTPCTL_ASCONF_AUTH_NOCHK_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_auth_disable), SCTPCTL_AUTH_DISABLE_MIN, SCTPCTL_AUTH_DISABLE_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_nat_friendly), SCTPCTL_NAT_FRIENDLY_MIN, SCTPCTL_NAT_FRIENDLY_MAX); @@ -793,17 +791,6 @@ sysctl_stat_get(SYSCTL_HANDLER_ARGS) sb.sctps_timoautoclose += sarry->sctps_timoautoclose; sb.sctps_timoassockill += sarry->sctps_timoassockill; sb.sctps_timoinpkill += sarry->sctps_timoinpkill; - sb.sctps_earlyfrstart += sarry->sctps_earlyfrstart; - sb.sctps_earlyfrstop += sarry->sctps_earlyfrstop; - sb.sctps_earlyfrmrkretrans += sarry->sctps_earlyfrmrkretrans; - sb.sctps_earlyfrstpout += sarry->sctps_earlyfrstpout; - sb.sctps_earlyfrstpidsck1 += sarry->sctps_earlyfrstpidsck1; - sb.sctps_earlyfrstpidsck2 += sarry->sctps_earlyfrstpidsck2; - sb.sctps_earlyfrstpidsck3 += sarry->sctps_earlyfrstpidsck3; - sb.sctps_earlyfrstpidsck4 += sarry->sctps_earlyfrstpidsck4; - sb.sctps_earlyfrstrid += sarry->sctps_earlyfrstrid; - sb.sctps_earlyfrstrout += sarry->sctps_earlyfrstrout; - sb.sctps_earlyfrstrtmr += sarry->sctps_earlyfrstrtmr; sb.sctps_hdrops += sarry->sctps_hdrops; sb.sctps_badsum += sarry->sctps_badsum; sb.sctps_noport += sarry->sctps_noport; @@ -994,6 +981,10 @@ SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, path_rtx_max, CTLTYPE_UINT | CTLFLAG_ &SCTP_BASE_SYSCTL(sctp_path_rtx_max_default), 0, sysctl_sctp_check, "IU", SCTPCTL_PATH_RTX_MAX_DESC); +SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, path_pf_threshold, CTLTYPE_UINT | CTLFLAG_RW, + &SCTP_BASE_SYSCTL(sctp_path_pf_threshold), 0, sysctl_sctp_check, "IU", + SCTPCTL_PATH_PF_THRESHOLD_DESC); + SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, add_more_on_output, CTLTYPE_UINT | CTLFLAG_RW, &SCTP_BASE_SYSCTL(sctp_add_more_threshold), 0, sysctl_sctp_check, "IU", SCTPCTL_ADD_MORE_ON_OUTPUT_DESC); @@ -1014,22 +1005,10 @@ SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, cmt_use_dac, CTLTYPE_UINT | CTLFLAG_R &SCTP_BASE_SYSCTL(sctp_cmt_use_dac), 0, sysctl_sctp_check, "IU", SCTPCTL_CMT_USE_DAC_DESC); -SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, cmt_pf, CTLTYPE_UINT | CTLFLAG_RW, - &SCTP_BASE_SYSCTL(sctp_cmt_pf), 0, sysctl_sctp_check, "IU", - SCTPCTL_CMT_PF_DESC); - SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, cwnd_maxburst, CTLTYPE_UINT | CTLFLAG_RW, &SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst), 0, sysctl_sctp_check, "IU", SCTPCTL_CWND_MAXBURST_DESC); -SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, early_fast_retran, CTLTYPE_UINT | CTLFLAG_RW, - &SCTP_BASE_SYSCTL(sctp_early_fr), 0, sysctl_sctp_check, "IU", - SCTPCTL_EARLY_FAST_RETRAN_DESC); - -SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, early_fast_retran_msec, CTLTYPE_UINT | CTLFLAG_RW, - &SCTP_BASE_SYSCTL(sctp_early_fr_msec), 0, sysctl_sctp_check, "IU", - SCTPCTL_EARLY_FAST_RETRAN_MSEC_DESC); - SYSCTL_VNET_PROC(_net_inet_sctp, OID_AUTO, asconf_auth_nochk, CTLTYPE_UINT | CTLFLAG_RW, &SCTP_BASE_SYSCTL(sctp_asconf_auth_nochk), 0, sysctl_sctp_check, "IU", SCTPCTL_ASCONF_AUTH_NOCHK_DESC); diff --git a/sys/netinet/sctp_sysctl.h b/sys/netinet/sctp_sysctl.h index 6429d594fec..f62679f8e64 100644 --- a/sys/netinet/sctp_sysctl.h +++ b/sys/netinet/sctp_sysctl.h @@ -74,16 +74,14 @@ struct sctp_sysctl { uint32_t sctp_init_rtx_max_default; uint32_t sctp_assoc_rtx_max_default; uint32_t sctp_path_rtx_max_default; + uint32_t sctp_path_pf_threshold; uint32_t sctp_add_more_threshold; uint32_t sctp_nr_outgoing_streams_default; uint32_t sctp_cmt_on_off; uint32_t sctp_cmt_use_dac; /* EY 5/5/08 - nr_sack flag variable */ uint32_t sctp_nr_sack_on_off; - uint32_t sctp_cmt_pf; uint32_t sctp_use_cwnd_based_maxburst; - uint32_t sctp_early_fr; - uint32_t sctp_early_fr_msec; uint32_t sctp_asconf_auth_nochk; uint32_t sctp_auth_disable; uint32_t sctp_nat_friendly; @@ -322,6 +320,12 @@ struct sctp_sysctl { #define SCTPCTL_PATH_RTX_MAX_MAX 0xFFFFFFFF #define SCTPCTL_PATH_RTX_MAX_DEFAULT SCTP_DEF_MAX_PATH_RTX +/* path_pf_threshold: threshold for considering the path potentially failed */ +#define SCTPCTL_PATH_PF_THRESHOLD_DESC "Default potentially failed threshold" +#define SCTPCTL_PATH_PF_THRESHOLD_MIN 0 +#define SCTPCTL_PATH_PF_THRESHOLD_MAX 0xFFFF +#define SCTPCTL_PATH_PF_THRESHOLD_DEFAULT SCTPCTL_PATH_PF_THRESHOLD_MAX + /* add_more_on_output: When space-wise is it worthwhile to try to add more to a socket send buffer */ #define SCTPCTL_ADD_MORE_ON_OUTPUT_DESC "When space-wise is it worthwhile to try to add more to a socket send buffer" #define SCTPCTL_ADD_MORE_ON_OUTPUT_MIN 0 @@ -352,30 +356,12 @@ struct sctp_sysctl { #define SCTPCTL_CMT_USE_DAC_MAX 1 #define SCTPCTL_CMT_USE_DAC_DEFAULT 0 -/* JRS 5/2107 - CMT PF type flag */ -#define SCTPCTL_CMT_PF_DESC "CMT PF type flag" -#define SCTPCTL_CMT_PF_MIN 0 -#define SCTPCTL_CMT_PF_MAX 2 -#define SCTPCTL_CMT_PF_DEFAULT 0 - /* cwnd_maxburst: Use a CWND adjusting maxburst */ #define SCTPCTL_CWND_MAXBURST_DESC "Use a CWND adjusting maxburst" #define SCTPCTL_CWND_MAXBURST_MIN 0 #define SCTPCTL_CWND_MAXBURST_MAX 1 #define SCTPCTL_CWND_MAXBURST_DEFAULT 1 -/* early_fast_retran: Early Fast Retransmit with timer */ -#define SCTPCTL_EARLY_FAST_RETRAN_DESC "Early Fast Retransmit with timer" -#define SCTPCTL_EARLY_FAST_RETRAN_MIN 0 -#define SCTPCTL_EARLY_FAST_RETRAN_MAX 0xFFFFFFFF -#define SCTPCTL_EARLY_FAST_RETRAN_DEFAULT 0 - -/* early_fast_retran_msec: Early Fast Retransmit minimum timer value */ -#define SCTPCTL_EARLY_FAST_RETRAN_MSEC_DESC "Early Fast Retransmit minimum timer value" -#define SCTPCTL_EARLY_FAST_RETRAN_MSEC_MIN 0 -#define SCTPCTL_EARLY_FAST_RETRAN_MSEC_MAX 0xFFFFFFFF -#define SCTPCTL_EARLY_FAST_RETRAN_MSEC_DEFAULT SCTP_MINFR_MSEC_TIMER - /* asconf_auth_nochk: Disable SCTP ASCONF AUTH requirement */ #define SCTPCTL_ASCONF_AUTH_NOCHK_DESC "Disable SCTP ASCONF AUTH requirement" #define SCTPCTL_ASCONF_AUTH_NOCHK_MIN 0 diff --git a/sys/netinet/sctp_timer.c b/sys/netinet/sctp_timer.c index 133af4aed45..a33e7924b22 100644 --- a/sys/netinet/sctp_timer.c +++ b/sys/netinet/sctp_timer.c @@ -54,103 +54,6 @@ __FBSDID("$FreeBSD$"); #include -void -sctp_early_fr_timer(struct sctp_inpcb *inp, - struct sctp_tcb *stcb, - struct sctp_nets *net) -{ - struct sctp_tmit_chunk *chk, *pchk; - struct timeval now, min_wait, tv; - unsigned int cur_rto, cnt = 0, cnt_resend = 0; - - /* an early FR is occuring. */ - (void)SCTP_GETTIME_TIMEVAL(&now); - /* get cur rto in micro-seconds */ - if (net->lastsa == 0) { - /* Hmm no rtt estimate yet? */ - cur_rto = stcb->asoc.initial_rto >> 2; - } else { - - cur_rto = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv; - } - if (cur_rto < SCTP_BASE_SYSCTL(sctp_early_fr_msec)) { - cur_rto = SCTP_BASE_SYSCTL(sctp_early_fr_msec); - } - cur_rto *= 1000; - tv.tv_sec = cur_rto / 1000000; - tv.tv_usec = cur_rto % 1000000; - min_wait = now; - timevalsub(&min_wait, &tv); - if (min_wait.tv_sec < 0 || min_wait.tv_usec < 0) { - /* - * if we hit here, we don't have enough seconds on the clock - * to account for the RTO. We just let the lower seconds be - * the bounds and don't worry about it. This may mean we - * will mark a lot more than we should. - */ - min_wait.tv_sec = min_wait.tv_usec = 0; - } - TAILQ_FOREACH_REVERSE_SAFE(chk, &stcb->asoc.sent_queue, sctpchunk_listhead, sctp_next, pchk) { - if (chk->whoTo != net) { - continue; - } - if (chk->sent == SCTP_DATAGRAM_RESEND) - cnt_resend++; - else if ((chk->sent > SCTP_DATAGRAM_UNSENT) && - (chk->sent < SCTP_DATAGRAM_RESEND)) { - /* pending, may need retran */ - if (chk->sent_rcv_time.tv_sec > min_wait.tv_sec) { - /* - * we have reached a chunk that was sent - * some seconds past our min.. forget it we - * will find no more to send. - */ - continue; - } else if (chk->sent_rcv_time.tv_sec == min_wait.tv_sec) { - /* - * we must look at the micro seconds to - * know. - */ - if (chk->sent_rcv_time.tv_usec >= min_wait.tv_usec) { - /* - * ok it was sent after our boundary - * time. - */ - continue; - } - } - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_EARLYFR_LOGGING_ENABLE) { - sctp_log_fr(chk->rec.data.TSN_seq, chk->snd_count, - 4, SCTP_FR_MARKED_EARLY); - } - SCTP_STAT_INCR(sctps_earlyfrmrkretrans); - chk->sent = SCTP_DATAGRAM_RESEND; - sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt); - /* double book size since we are doing an early FR */ - chk->book_size_scale++; - cnt += chk->send_size; - if ((cnt + net->flight_size) > net->cwnd) { - /* Mark all we could possibly resend */ - break; - } - } - } - if (cnt) { - /* - * JRS - Use the congestion control given in the congestion - * control module - */ - stcb->asoc.cc_functions.sctp_cwnd_update_after_fr_timer(inp, stcb, net); - } else if (cnt_resend) { - sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_EARLY_FR_TMR, SCTP_SO_NOT_LOCKED); - } - /* Restart it? */ - if (net->flight_size < net->cwnd) { - SCTP_STAT_INCR(sctps_earlyfrstrtmr); - sctp_timer_start(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net); - } -} - void sctp_audit_retranmission_queue(struct sctp_association *asoc) { @@ -195,44 +98,23 @@ sctp_threshold_management(struct sctp_inpcb *inp, struct sctp_tcb *stcb, /* We had a threshold failure */ if (net->dest_state & SCTP_ADDR_REACHABLE) { net->dest_state &= ~SCTP_ADDR_REACHABLE; - net->dest_state |= SCTP_ADDR_NOT_REACHABLE; net->dest_state &= ~SCTP_ADDR_REQ_PRIMARY; - if (net == stcb->asoc.primary_destination) { - net->dest_state |= SCTP_ADDR_WAS_PRIMARY; - } - /* - * JRS 5/14/07 - If a destination is - * unreachable, the PF bit is turned off. - * This allows an unambiguous use of the PF - * bit for destinations that are reachable - * but potentially failed. If the - * destination is set to the unreachable - * state, also set the destination to the PF - * state. - */ - /* - * Add debug message here if destination is - * not in PF state. - */ - /* Stop any running T3 timers here? */ - if ((stcb->asoc.sctp_cmt_on_off > 0) && - (stcb->asoc.sctp_cmt_pf > 0)) { - net->dest_state &= ~SCTP_ADDR_PF; - SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from PF to unreachable.\n", - net); - } + net->dest_state &= ~SCTP_ADDR_PF; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_FAILED_THRESHOLD, (void *)net, SCTP_SO_NOT_LOCKED); } + } else if ((net->pf_threshold < net->failure_threshold) && + (net->error_count > net->pf_threshold)) { + if (!(net->dest_state & SCTP_ADDR_PF)) { + net->dest_state |= SCTP_ADDR_PF; + net->last_active = sctp_get_tick_count(); + sctp_send_hb(stcb, net, SCTP_SO_NOT_LOCKED); + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_TIMER + SCTP_LOC_3); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); + } } - /*********HOLD THIS COMMENT FOR PATCH OF ALTERNATE - *********ROUTING CODE - */ - /*********HOLD THIS COMMENT FOR END OF PATCH OF ALTERNATE - *********ROUTING CODE - */ } if (stcb == NULL) return (0); @@ -407,31 +289,10 @@ sctp_find_alternate_net(struct sctp_tcb *stcb, } } } - /* - * JRS 5/14/07 - After all destination have been considered - * as alternates, check to see if there was some active - * destination (not in PF state). If not, check to see if - * there was some PF destination with the minimum number of - * errors. If not, return the original destination. If - * there is a min_errors_net, remove the PF flag from that - * destination, set the cwnd to one or two MTUs, and return - * the destination as an alt. If there was some active - * destination with a highest cwnd, return the destination - * as an alt. - */ if (max_cwnd_net == NULL) { if (min_errors_net == NULL) { return (net); } - min_errors_net->dest_state &= ~SCTP_ADDR_PF; - min_errors_net->cwnd = min_errors_net->mtu * stcb->asoc.sctp_cmt_pf; - if (SCTP_OS_TIMER_PENDING(&min_errors_net->rxt_timer.timer)) { - sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, - stcb, min_errors_net, - SCTP_FROM_SCTP_TIMER + SCTP_LOC_2); - } - SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from PF to active with %d errors.\n", - min_errors_net, min_errors_net->error_count); return (min_errors_net); } else { return (max_cwnd_net); @@ -646,15 +507,12 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb, /* get cur rto in micro-seconds */ cur_rto = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv; cur_rto *= 1000; - if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) { + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { sctp_log_fr(cur_rto, stcb->asoc.peers_rwnd, window_probe, SCTP_FR_T3_MARK_TIME); - sctp_log_fr(net->flight_size, - SCTP_OS_TIMER_PENDING(&net->fr_timer.timer), - SCTP_OS_TIMER_ACTIVE(&net->fr_timer.timer), - SCTP_FR_CWND_REPORT); + sctp_log_fr(net->flight_size, 0, 0, SCTP_FR_CWND_REPORT); sctp_log_fr(net->flight_size, net->cwnd, stcb->asoc.total_flight, SCTP_FR_CWND_REPORT); } tv.tv_sec = cur_rto / 1000000; @@ -670,7 +528,7 @@ sctp_mark_all_for_resend(struct sctp_tcb *stcb, */ min_wait.tv_sec = min_wait.tv_usec = 0; } - if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) { + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { sctp_log_fr(cur_rto, now.tv_sec, now.tv_usec, SCTP_FR_T3_MARK_TIME); sctp_log_fr(0, min_wait.tv_sec, min_wait.tv_usec, SCTP_FR_T3_MARK_TIME); } @@ -717,7 +575,7 @@ start_again: */ /* validate its been outstanding long enough */ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) { + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { sctp_log_fr(chk->rec.data.TSN_seq, chk->sent_rcv_time.tv_sec, chk->sent_rcv_time.tv_usec, @@ -729,7 +587,7 @@ start_again: * some seconds past our min.. forget it we * will find no more to send. */ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) { + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { sctp_log_fr(0, chk->sent_rcv_time.tv_sec, chk->sent_rcv_time.tv_usec, @@ -747,12 +605,6 @@ start_again: * ok it was sent after our boundary * time. */ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) { - sctp_log_fr(0, - chk->sent_rcv_time.tv_sec, - chk->sent_rcv_time.tv_usec, - SCTP_FR_T3_STOPPED); - } continue; } } @@ -791,7 +643,7 @@ start_again: tsnfirst = chk->rec.data.TSN_seq; } tsnlast = chk->rec.data.TSN_seq; - if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) { + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { sctp_log_fr(chk->rec.data.TSN_seq, chk->snd_count, 0, SCTP_FR_T3_MARKED); } @@ -860,7 +712,7 @@ start_again: /* we did not subtract the same things? */ audit_tf = 1; } - if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_EARLYFR_LOGGING_ENABLE | SCTP_FR_LOGGING_ENABLE)) { + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { sctp_log_fr(tsnfirst, tsnlast, num_mk, SCTP_FR_T3_TIMEOUT); } #ifdef SCTP_DEBUG @@ -978,40 +830,72 @@ sctp_t3rxt_timer(struct sctp_inpcb *inp, win_probe = 0; } - /* - * JRS 5/14/07 - If CMT PF is on and the destination if not already - * in PF state, set the destination to PF state and store the - * current time as the time that the destination was last active. In - * addition, find an alternate destination with PF-based - * find_alt_net(). - */ - if ((stcb->asoc.sctp_cmt_on_off > 0) && - (stcb->asoc.sctp_cmt_pf > 0)) { - if ((net->dest_state & SCTP_ADDR_PF) != SCTP_ADDR_PF) { - net->dest_state |= SCTP_ADDR_PF; - net->last_active = sctp_get_tick_count(); - SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from active to PF.\n", - net); + if (win_probe == 0) { + /* We don't do normal threshold management on window probes */ + if (sctp_threshold_management(inp, stcb, net, + stcb->asoc.max_send_times)) { + /* Association was destroyed */ + return (1); + } else { + if (net != stcb->asoc.primary_destination) { + /* send a immediate HB if our RTO is stale */ + struct timeval now; + unsigned int ms_goneby; + + (void)SCTP_GETTIME_TIMEVAL(&now); + if (net->last_sent_time.tv_sec) { + ms_goneby = (now.tv_sec - net->last_sent_time.tv_sec) * 1000; + } else { + ms_goneby = 0; + } + if ((net->dest_state & SCTP_ADDR_PF) == 0) { + if ((ms_goneby > net->RTO) || (net->RTO == 0)) { + /* + * no recent feed back in an + * RTO or more, request a + * RTT update + */ + sctp_send_hb(stcb, net, SCTP_SO_NOT_LOCKED); + } + } + } } - alt = sctp_find_alternate_net(stcb, net, 2); - } else if (stcb->asoc.sctp_cmt_on_off > 0) { + } else { /* - * CMT: Using RTX_SSTHRESH policy for CMT. If CMT is being - * used, then pick dest with largest ssthresh for any - * retransmission. + * For a window probe we don't penalize the net's but only + * the association. This may fail it if SACKs are not coming + * back. If sack's are coming with rwnd locked at 0, we will + * continue to hold things waiting for rwnd to raise */ - alt = sctp_find_alternate_net(stcb, net, 1); - /* - * CUCv2: If a different dest is picked for the - * retransmission, then new (rtx-)pseudo_cumack needs to be - * tracked for orig dest. Let CUCv2 track new (rtx-) - * pseudo-cumack always. - */ - net->find_pseudo_cumack = 1; - net->find_rtx_pseudo_cumack = 1; - } else { /* CMT is OFF */ + if (sctp_threshold_management(inp, stcb, NULL, + stcb->asoc.max_send_times)) { + /* Association was destroyed */ + return (1); + } + } + if (stcb->asoc.sctp_cmt_on_off > 0) { + if (net->pf_threshold < net->failure_threshold) { + alt = sctp_find_alternate_net(stcb, net, 2); + } else { + /* + * CMT: Using RTX_SSTHRESH policy for CMT. If CMT is + * being used, then pick dest with largest ssthresh + * for any retransmission. + */ + alt = sctp_find_alternate_net(stcb, net, 1); + /* + * CUCv2: If a different dest is picked for the + * retransmission, then new (rtx-)pseudo_cumack + * needs to be tracked for orig dest. Let CUCv2 + * track new (rtx-) pseudo-cumack always. + */ + net->find_pseudo_cumack = 1; + net->find_rtx_pseudo_cumack = 1; + } + } else { alt = sctp_find_alternate_net(stcb, net, 0); } + num_mk = 0; num_abandoned = 0; (void)sctp_mark_all_for_resend(stcb, net, alt, win_probe, @@ -1033,52 +917,8 @@ sctp_t3rxt_timer(struct sctp_inpcb *inp, /* Backoff the timer and cwnd */ sctp_backoff_on_timeout(stcb, net, win_probe, num_mk, num_abandoned); - if (win_probe == 0) { - /* We don't do normal threshold management on window probes */ - if (sctp_threshold_management(inp, stcb, net, - stcb->asoc.max_send_times)) { - /* Association was destroyed */ - return (1); - } else { - if (net != stcb->asoc.primary_destination) { - /* send a immediate HB if our RTO is stale */ - struct timeval now; - unsigned int ms_goneby; - - (void)SCTP_GETTIME_TIMEVAL(&now); - if (net->last_sent_time.tv_sec) { - ms_goneby = (now.tv_sec - net->last_sent_time.tv_sec) * 1000; - } else { - ms_goneby = 0; - } - if ((ms_goneby > net->RTO) || (net->RTO == 0)) { - /* - * no recent feed back in an RTO or - * more, request a RTT update - */ - if (sctp_send_hb(stcb, 1, net, SCTP_SO_NOT_LOCKED) < 0) - /* - * Less than 0 means we lost - * the assoc - */ - return (1); - } - } - } - } else { - /* - * For a window probe we don't penalize the net's but only - * the association. This may fail it if SACKs are not coming - * back. If sack's are coming with rwnd locked at 0, we will - * continue to hold things waiting for rwnd to raise - */ - if (sctp_threshold_management(inp, stcb, NULL, - stcb->asoc.max_send_times)) { - /* Association was destroyed */ - return (1); - } - } - if (net->dest_state & SCTP_ADDR_NOT_REACHABLE) { + if ((!(net->dest_state & SCTP_ADDR_REACHABLE)) || + (net->dest_state & SCTP_ADDR_PF)) { /* Move all pending over too */ sctp_move_chunks_from_net(stcb, net); @@ -1106,23 +946,12 @@ sctp_t3rxt_timer(struct sctp_inpcb *inp, * change-primary then this flag must be cleared * from any net structures. */ - if (sctp_set_primary_addr(stcb, - (struct sockaddr *)NULL, - alt) == 0) { - net->dest_state |= SCTP_ADDR_WAS_PRIMARY; + if (stcb->asoc.alternate) { + sctp_free_remote_addr(stcb->asoc.alternate); } + stcb->asoc.alternate = alt; + atomic_add_int(&stcb->asoc.alternate->ref_count, 1); } - } else if ((stcb->asoc.sctp_cmt_on_off > 0) && - (stcb->asoc.sctp_cmt_pf > 0) && - ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF)) { - /* - * JRS 5/14/07 - If the destination hasn't failed completely - * but is in PF state, a PF-heartbeat needs to be sent - * manually. - */ - if (sctp_send_hb(stcb, 1, net, SCTP_SO_NOT_LOCKED) < 0) - /* Return less than 0 means we lost the association */ - return (1); } /* * Special case for cookie-echo'ed case, we don't do output but must @@ -1324,7 +1153,7 @@ sctp_strreset_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb, atomic_add_int(&alt->ref_count, 1); } } - if (net->dest_state & SCTP_ADDR_NOT_REACHABLE) { + if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { /* * If the address went un-reachable, we need to move to * alternates for ALL chk's in queue @@ -1414,7 +1243,7 @@ sctp_asconf_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb, sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt); chk->sent = SCTP_DATAGRAM_RESEND; } - if (net->dest_state & SCTP_ADDR_NOT_REACHABLE) { + if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { /* * If the address went un-reachable, we need to move * to the alternate for ALL chunks in queue @@ -1569,11 +1398,15 @@ sctp_audit_stream_queues_for_size(struct sctp_inpcb *inp, int sctp_heartbeat_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb, - struct sctp_nets *net, int cnt_of_unconf) + struct sctp_nets *net) { - int ret; + uint8_t net_was_pf; + net_was_pf = 0; if (net) { + if (net->dest_state & SCTP_ADDR_PF) { + net_was_pf = 1; + } if (net->hb_responded == 0) { if (net->ro._s_addr) { /* @@ -1585,6 +1418,10 @@ sctp_heartbeat_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb, net->src_addr_selected = 0; } sctp_backoff_on_timeout(stcb, net, 1, 0, 0); + if (sctp_threshold_management(inp, stcb, net, stcb->asoc.max_send_times)) { + /* Assoc is over */ + return (1); + } } /* Zero PBA, if it needs it */ if (net->partial_bytes_acked) { @@ -1596,41 +1433,13 @@ sctp_heartbeat_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb, (TAILQ_EMPTY(&stcb->asoc.sent_queue))) { sctp_audit_stream_queues_for_size(inp, stcb); } - /* Send a new HB, this will do threshold managment, pick a new dest */ - if (cnt_of_unconf == 0) { - if (sctp_send_hb(stcb, 0, NULL, SCTP_SO_NOT_LOCKED) < 0) { - return (1); - } - } else { + if (!(net->dest_state & SCTP_ADDR_NOHB) && + !((net_was_pf == 0) && (net->dest_state & SCTP_ADDR_PF))) { /* - * this will send out extra hb's up to maxburst if there are - * any unconfirmed addresses. + * when move to PF during threshold mangement, a HB has been + * queued in that routine */ - uint32_t cnt_sent = 0; - - TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - if ((net->dest_state & SCTP_ADDR_UNCONFIRMED) && - (net->dest_state & SCTP_ADDR_REACHABLE)) { - cnt_sent++; - if (net->hb_responded == 0) { - /* Did we respond last time? */ - if (net->ro._s_addr) { - sctp_free_ifa(net->ro._s_addr); - net->ro._s_addr = NULL; - net->src_addr_selected = 0; - } - } - ret = sctp_send_hb(stcb, 1, net, SCTP_SO_NOT_LOCKED); - if (ret < 0) - return 1; - else if (ret == 0) { - break; - } - if (SCTP_BASE_SYSCTL(sctp_hb_maxburst) && - (cnt_sent >= SCTP_BASE_SYSCTL(sctp_hb_maxburst))) - break; - } - } + sctp_send_hb(stcb, net, SCTP_SO_NOT_LOCKED); } return (0); } @@ -1733,7 +1542,14 @@ sctp_autoclose_timer(struct sctp_inpcb *inp, */ if (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) { /* only send SHUTDOWN 1st time thru */ - sctp_send_shutdown(stcb, stcb->asoc.primary_destination); + struct sctp_nets *netp; + + if (stcb->asoc.alternate) { + netp = stcb->asoc.alternate; + } else { + netp = stcb->asoc.primary_destination; + } + sctp_send_shutdown(stcb, netp); if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { SCTP_STAT_DECR_GAUGE32(sctps_currestab); @@ -1742,10 +1558,10 @@ sctp_autoclose_timer(struct sctp_inpcb *inp, SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb, - asoc->primary_destination); + netp); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, - asoc->primary_destination); + netp); } } } else { diff --git a/sys/netinet/sctp_timer.h b/sys/netinet/sctp_timer.h index 5857291da89..7b1341a3cf4 100644 --- a/sys/netinet/sctp_timer.h +++ b/sys/netinet/sctp_timer.h @@ -42,10 +42,6 @@ __FBSDID("$FreeBSD$"); #define SCTP_RTT_SHIFT 3 #define SCTP_RTT_VAR_SHIFT 2 -void -sctp_early_fr_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb, - struct sctp_nets *net); - struct sctp_nets * sctp_find_alternate_net(struct sctp_tcb *, struct sctp_nets *, int mode); @@ -65,7 +61,7 @@ sctp_shutdown_timer(struct sctp_inpcb *, struct sctp_tcb *, struct sctp_nets *); int sctp_heartbeat_timer(struct sctp_inpcb *, struct sctp_tcb *, - struct sctp_nets *, int); + struct sctp_nets *); int sctp_cookie_timer(struct sctp_inpcb *, struct sctp_tcb *, diff --git a/sys/netinet/sctp_uio.h b/sys/netinet/sctp_uio.h index 9b9acbfc6f6..d4a0df183f9 100644 --- a/sys/netinet/sctp_uio.h +++ b/sys/netinet/sctp_uio.h @@ -329,7 +329,8 @@ struct sctp_paddr_change { #define SCTP_ADDR_CONFIRMED 0x0006 #define SCTP_ACTIVE 0x0001 /* SCTP_ADDR_REACHABLE */ -#define SCTP_INACTIVE 0x0002 /* SCTP_ADDR_NOT_REACHABLE */ +#define SCTP_INACTIVE 0x0002 /* neither SCTP_ADDR_REACHABLE nor + * SCTP_ADDR_UNCONFIRMED */ #define SCTP_UNCONFIRMED 0x0200 /* SCTP_ADDR_UNCONFIRMED */ /* remote error events */ @@ -516,6 +517,13 @@ struct sctp_paddrparams { #define SPP_IPV6_FLOWLABEL 0x00000100 #define SPP_IPV4_TOS 0x00000200 +struct sctp_paddrthlds { + sctp_assoc_t spt_assoc_id; + struct sockaddr_storage spt_address; + uint16_t spt_pathmaxrxt; + uint16_t spt_pathpfthld; +}; + struct sctp_paddrinfo { struct sockaddr_storage spinfo_address; sctp_assoc_t spinfo_assoc_id; @@ -978,18 +986,8 @@ struct sctpstat { * fired */ uint32_t sctps_timoassockill; /* Number of asoc free timers expired */ uint32_t sctps_timoinpkill; /* Number of inp free timers expired */ - /* Early fast retransmission counters */ - uint32_t sctps_earlyfrstart; - uint32_t sctps_earlyfrstop; - uint32_t sctps_earlyfrmrkretrans; - uint32_t sctps_earlyfrstpout; - uint32_t sctps_earlyfrstpidsck1; - uint32_t sctps_earlyfrstpidsck2; - uint32_t sctps_earlyfrstpidsck3; - uint32_t sctps_earlyfrstpidsck4; - uint32_t sctps_earlyfrstrid; - uint32_t sctps_earlyfrstrout; - uint32_t sctps_earlyfrstrtmr; + /* former early FR counters */ + uint32_t sctps_spare[11]; /* others */ uint32_t sctps_hdrops; /* packet shorter than header */ uint32_t sctps_badsum; /* checksum error */ @@ -1162,9 +1160,11 @@ struct xsctp_raddr { uint8_t active; /* sctpAssocLocalRemEntry 3 */ uint8_t confirmed; /* */ uint8_t heartbeat_enabled; /* sctpAssocLocalRemEntry 4 */ + uint8_t potentially_failed; struct sctp_timeval start_time; /* sctpAssocLocalRemEntry 8 */ uint32_t rtt; - uint32_t extra_padding[32]; /* future */ + uint32_t heartbeat_interval; + uint32_t extra_padding[31]; /* future */ }; #define SCTP_MAX_LOGGING_SIZE 30000 diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index ab87772f0d4..275e9a284f6 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -275,33 +275,8 @@ sctp_notify(struct sctp_inpcb *inp, */ if (net->dest_state & SCTP_ADDR_REACHABLE) { /* Ok that destination is NOT reachable */ - SCTP_PRINTF("ICMP (thresh %d/%d) takes interface %p down\n", - net->error_count, - net->failure_threshold, - net); - net->dest_state &= ~SCTP_ADDR_REACHABLE; - net->dest_state |= SCTP_ADDR_NOT_REACHABLE; - /* - * JRS 5/14/07 - If a destination is unreachable, - * the PF bit is turned off. This allows an - * unambiguous use of the PF bit for destinations - * that are reachable but potentially failed. If the - * destination is set to the unreachable state, also - * set the destination to the PF state. - */ - /* - * Add debug message here if destination is not in - * PF state. - */ - /* Stop any running T3 timers here? */ - if ((stcb->asoc.sctp_cmt_on_off > 0) && - (stcb->asoc.sctp_cmt_pf > 0)) { - net->dest_state &= ~SCTP_ADDR_PF; - SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from PF to unreachable.\n", - net); - } - net->error_count = net->failure_threshold + 1; + net->dest_state &= ~SCTP_ADDR_PF; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_FAILED_THRESHOLD, (void *)net, SCTP_SO_NOT_LOCKED); @@ -837,9 +812,15 @@ sctp_disconnect(struct socket *so) if ((SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) && (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { /* only send SHUTDOWN 1st time thru */ + struct sctp_nets *netp; + + if (stcb->asoc.alternate) { + netp = stcb->asoc.alternate; + } else { + netp = stcb->asoc.primary_destination; + } sctp_stop_timers_for_shutdown(stcb); - sctp_send_shutdown(stcb, - stcb->asoc.primary_destination); + sctp_send_shutdown(stcb, netp); sctp_chunk_output(stcb->sctp_ep, stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_LOCKED); if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { @@ -848,11 +829,10 @@ sctp_disconnect(struct socket *so) SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, - stcb->sctp_ep, stcb, - asoc->primary_destination); + stcb->sctp_ep, stcb, netp); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, - stcb->sctp_ep, stcb, - asoc->primary_destination); + stcb->sctp_ep, stcb, netp); + } } else { /* @@ -865,9 +845,17 @@ sctp_disconnect(struct socket *so) * we will allow user data to be sent first * and move to SHUTDOWN-PENDING */ + struct sctp_nets *netp; + + if (stcb->asoc.alternate) { + netp = stcb->asoc.alternate; + } else { + netp = stcb->asoc.primary_destination; + } + asoc->state |= SCTP_STATE_SHUTDOWN_PENDING; sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, - asoc->primary_destination); + netp); if (asoc->locked_on_sending) { /* Locked to send out the data */ struct sctp_stream_queue_pending *sp; @@ -1047,9 +1035,15 @@ sctp_shutdown(struct socket *so) /* there is nothing queued to send, so I'm done... */ if (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) { /* only send SHUTDOWN the first time through */ + struct sctp_nets *netp; + + if (stcb->asoc.alternate) { + netp = stcb->asoc.alternate; + } else { + netp = stcb->asoc.primary_destination; + } sctp_stop_timers_for_shutdown(stcb); - sctp_send_shutdown(stcb, - stcb->asoc.primary_destination); + sctp_send_shutdown(stcb, netp); sctp_chunk_output(stcb->sctp_ep, stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_LOCKED); if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { @@ -1058,20 +1052,26 @@ sctp_shutdown(struct socket *so) SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, - stcb->sctp_ep, stcb, - asoc->primary_destination); + stcb->sctp_ep, stcb, netp); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, - stcb->sctp_ep, stcb, - asoc->primary_destination); + stcb->sctp_ep, stcb, netp); } } else { /* * we still got (or just got) data to send, so set * SHUTDOWN_PENDING */ + struct sctp_nets *netp; + + if (stcb->asoc.alternate) { + netp = stcb->asoc.alternate; + } else { + netp = stcb->asoc.primary_destination; + } + asoc->state |= SCTP_STATE_SHUTDOWN_PENDING; sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, - asoc->primary_destination); + netp); if (asoc->locked_on_sending) { /* Locked to send out the data */ @@ -2389,7 +2389,7 @@ flags_out: } } if (stcb) { - /* Applys to the specific association */ + /* Applies to the specific association */ paddrp->spp_flags = 0; if (net) { int ovh; @@ -2400,7 +2400,7 @@ flags_out: ovh = SCTP_MED_V4_OVERHEAD; } - + paddrp->spp_hbinterval = net->heart_beat_delay; paddrp->spp_pathmaxrxt = net->failure_threshold; paddrp->spp_pathmtu = net->mtu - ovh; /* get flags for HB */ @@ -2444,11 +2444,12 @@ flags_out: paddrp->spp_flags |= SPP_IPV6_FLOWLABEL; #endif /* default settings should be these */ - if (stcb->asoc.hb_is_disabled == 0) { - paddrp->spp_flags |= SPP_HB_ENABLE; - } else { + if (sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_DONOT_HEARTBEAT)) { paddrp->spp_flags |= SPP_HB_DISABLE; + } else { + paddrp->spp_flags |= SPP_HB_ENABLE; } + paddrp->spp_hbinterval = stcb->asoc.heart_beat_delay; TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { if (SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) { cnt++; @@ -2458,7 +2459,6 @@ flags_out: paddrp->spp_flags |= SPP_PMTUD_ENABLE; } } - paddrp->spp_hbinterval = stcb->asoc.heart_beat_delay; paddrp->spp_assoc_id = sctp_get_associd(stcb); SCTP_TCB_UNLOCK(stcb); } else { @@ -3080,6 +3080,95 @@ flags_out: } break; } + case SCTP_PEER_ADDR_THLDS: + { + struct sctp_paddrthlds *thlds; + struct sctp_nets *net; + + SCTP_CHECK_AND_CAST(thlds, optval, struct sctp_paddrthlds, *optsize); + SCTP_FIND_STCB(inp, stcb, thlds->spt_assoc_id); + + net = NULL; + if (stcb) { + net = sctp_findnet(stcb, (struct sockaddr *)&thlds->spt_address); + } else { + /* + * We increment here since + * sctp_findassociation_ep_addr() wil do a + * decrement if it finds the stcb as long as + * the locked tcb (last argument) is NOT a + * TCB.. aka NULL. + */ + SCTP_INP_INCR_REF(inp); + stcb = sctp_findassociation_ep_addr(&inp, (struct sockaddr *)&thlds->spt_address, &net, NULL, NULL); + if (stcb == NULL) { + SCTP_INP_DECR_REF(inp); + } + } + if (stcb && (net == NULL)) { + struct sockaddr *sa; + + sa = (struct sockaddr *)&thlds->spt_address; +#ifdef INET + if (sa->sa_family == AF_INET) { + struct sockaddr_in *sin; + + sin = (struct sockaddr_in *)sa; + if (sin->sin_addr.s_addr) { + error = EINVAL; + SCTP_TCB_UNLOCK(stcb); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, error); + break; + } + } else +#endif +#ifdef INET6 + if (sa->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6; + + sin6 = (struct sockaddr_in6 *)sa; + if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { + error = EINVAL; + SCTP_TCB_UNLOCK(stcb); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, error); + break; + } + } else +#endif + { + error = EAFNOSUPPORT; + SCTP_TCB_UNLOCK(stcb); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, error); + break; + } + } + if (stcb) { + if (net) { + thlds->spt_pathmaxrxt = net->failure_threshold; + thlds->spt_pathpfthld = net->pf_threshold; + } else { + thlds->spt_pathmaxrxt = stcb->asoc.def_net_failure; + thlds->spt_pathpfthld = stcb->asoc.def_net_pf_threshold; + } + thlds->spt_assoc_id = sctp_get_associd(stcb); + SCTP_TCB_UNLOCK(stcb); + } else { + if (thlds->spt_assoc_id == SCTP_FUTURE_ASSOC) { + /* Use endpoint defaults */ + SCTP_INP_RLOCK(inp); + thlds->spt_pathmaxrxt = inp->sctp_ep.def_net_failure; + thlds->spt_pathpfthld = inp->sctp_ep.def_net_pf_threshold; + SCTP_INP_RUNLOCK(inp); + } else { + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); + error = EINVAL; + } + } + if (error == 0) { + *optsize = sizeof(struct sctp_paddrthlds); + } + break; + } default: SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOPROTOOPT); error = ENOPROTOOPT; @@ -3138,6 +3227,12 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, */ if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { /* only valid for bound all sockets */ + if ((SCTP_BASE_SYSCTL(sctp_auto_asconf) == 0) && + (*mopt != 0)) { + /* forbidden by admin */ + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EPERM); + return (EPERM); + } set_opt = SCTP_PCB_FLAGS_AUTO_ASCONF; } else { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); @@ -4368,7 +4463,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, break; } case SCTP_PEER_ADDR_PARAMS: - /* Applys to the specific association */ + /* Applies to the specific association */ { struct sctp_paddrparams *paddrp; struct sctp_nets *net; @@ -4459,29 +4554,33 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, ovh = SCTP_MED_V4_OVERHEAD; } - if (paddrp->spp_hbinterval) - stcb->asoc.heart_beat_delay = paddrp->spp_hbinterval; - else if (paddrp->spp_flags & SPP_HB_TIME_IS_ZERO) - stcb->asoc.heart_beat_delay = 0; - /* network sets ? */ if (net) { /************************NET SPECIFIC SET ******************/ - if (paddrp->spp_flags & SPP_HB_DEMAND) { - /* on demand HB */ - if (sctp_send_hb(stcb, 1, net, SCTP_SO_LOCKED) < 0) { - /* asoc destroyed */ - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); - error = EINVAL; - break; - } - } if (paddrp->spp_flags & SPP_HB_DISABLE) { + if (!(net->dest_state & SCTP_ADDR_UNCONFIRMED) && + !(net->dest_state & SCTP_ADDR_NOHB)) { + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net, + SCTP_FROM_SCTP_USRREQ + SCTP_LOC_10); + } net->dest_state |= SCTP_ADDR_NOHB; } if (paddrp->spp_flags & SPP_HB_ENABLE) { + if (paddrp->spp_hbinterval) { + net->heart_beat_delay = paddrp->spp_hbinterval; + } else if (paddrp->spp_flags & SPP_HB_TIME_IS_ZERO) { + net->heart_beat_delay = 0; + } + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net, + SCTP_FROM_SCTP_USRREQ + SCTP_LOC_10); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net); net->dest_state &= ~SCTP_ADDR_NOHB; } + if (paddrp->spp_flags & SPP_HB_DEMAND) { + /* on demand HB */ + sctp_send_hb(stcb, net, SCTP_SO_LOCKED); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net); + } if ((paddrp->spp_flags & SPP_PMTUD_DISABLE) && (paddrp->spp_pathmtu >= SCTP_SMALLEST_PMTU)) { if (SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) { sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net, @@ -4499,8 +4598,33 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, sctp_timer_start(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net); } } - if (paddrp->spp_pathmaxrxt) + if (paddrp->spp_pathmaxrxt) { + if (net->dest_state & SCTP_ADDR_PF) { + if (net->error_count > paddrp->spp_pathmaxrxt) { + net->dest_state &= ~SCTP_ADDR_PF; + } + } else { + if ((net->error_count <= paddrp->spp_pathmaxrxt) && + (net->error_count > net->pf_threshold)) { + net->dest_state |= SCTP_ADDR_PF; + sctp_send_hb(stcb, net, SCTP_SO_LOCKED); + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_TIMER + SCTP_LOC_3); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); + } + } + if (net->dest_state & SCTP_ADDR_REACHABLE) { + if (net->error_count > paddrp->spp_pathmaxrxt) { + net->dest_state &= ~SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + } + } else { + if (net->error_count <= paddrp->spp_pathmaxrxt) { + net->dest_state |= SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + } + } net->failure_threshold = paddrp->spp_pathmaxrxt; + } #ifdef INET if (paddrp->spp_flags & SPP_IPV4_TOS) { if (net->ro._l_addr.sin.sin_family == AF_INET) { @@ -4517,13 +4641,67 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, #endif } else { /************************ASSOC ONLY -- NO NET SPECIFIC SET ******************/ - if (paddrp->spp_pathmaxrxt) + if (paddrp->spp_pathmaxrxt) { stcb->asoc.def_net_failure = paddrp->spp_pathmaxrxt; - + TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { + if (net->dest_state & SCTP_ADDR_PF) { + if (net->error_count > paddrp->spp_pathmaxrxt) { + net->dest_state &= ~SCTP_ADDR_PF; + } + } else { + if ((net->error_count <= paddrp->spp_pathmaxrxt) && + (net->error_count > net->pf_threshold)) { + net->dest_state |= SCTP_ADDR_PF; + sctp_send_hb(stcb, net, SCTP_SO_LOCKED); + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_TIMER + SCTP_LOC_3); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); + } + } + if (net->dest_state & SCTP_ADDR_REACHABLE) { + if (net->error_count > paddrp->spp_pathmaxrxt) { + net->dest_state &= ~SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + } + } else { + if (net->error_count <= paddrp->spp_pathmaxrxt) { + net->dest_state |= SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + } + } + net->failure_threshold = paddrp->spp_pathmaxrxt; + } + } if (paddrp->spp_flags & SPP_HB_ENABLE) { + if (paddrp->spp_hbinterval) { + stcb->asoc.heart_beat_delay = paddrp->spp_hbinterval; + } else if (paddrp->spp_flags & SPP_HB_TIME_IS_ZERO) { + stcb->asoc.heart_beat_delay = 0; + } /* Turn back on the timer */ - stcb->asoc.hb_is_disabled = 0; - sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net); + TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { + if (paddrp->spp_hbinterval) { + net->heart_beat_delay = paddrp->spp_hbinterval; + } else if (paddrp->spp_flags & SPP_HB_TIME_IS_ZERO) { + net->heart_beat_delay = 0; + } + if (net->dest_state & SCTP_ADDR_NOHB) { + net->dest_state &= ~SCTP_ADDR_NOHB; + } + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net, + SCTP_FROM_SCTP_USRREQ + SCTP_LOC_10); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net); + } + } + if (paddrp->spp_flags & SPP_HB_DISABLE) { + /* Turn back on the timer */ + TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { + if (!(net->dest_state & SCTP_ADDR_NOHB)) { + net->dest_state |= SCTP_ADDR_NOHB; + if (!(net->dest_state & SCTP_ADDR_UNCONFIRMED)) { + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net, SCTP_FROM_SCTP_USRREQ + SCTP_LOC_10); + } + } + } } if ((paddrp->spp_flags & SPP_PMTUD_DISABLE) && (paddrp->spp_pathmtu >= SCTP_SMALLEST_PMTU)) { TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { @@ -4546,41 +4724,25 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } } } - if (paddrp->spp_flags & SPP_HB_DISABLE) { - int cnt_of_unconf = 0; - struct sctp_nets *lnet; - - stcb->asoc.hb_is_disabled = 1; - TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) { - if (lnet->dest_state & SCTP_ADDR_UNCONFIRMED) { - cnt_of_unconf++; - } - } - /* - * stop the timer ONLY if we - * have no unconfirmed - * addresses - */ - if (cnt_of_unconf == 0) { - TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net, - SCTP_FROM_SCTP_USRREQ + SCTP_LOC_11); - } - } - } - if (paddrp->spp_flags & SPP_HB_ENABLE) { - /* start up the timer. */ - TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net); - } - } #ifdef INET - if (paddrp->spp_flags & SPP_IPV4_TOS) + if (paddrp->spp_flags & SPP_IPV4_TOS) { + TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { + if (net->ro._l_addr.sin.sin_family == AF_INET) { + net->tos_flowlabel = paddrp->spp_ipv4_tos & 0x000000fc; + } + } stcb->asoc.default_tos = paddrp->spp_ipv4_tos & 0x000000fc; + } #endif #ifdef INET6 - if (paddrp->spp_flags & SPP_IPV6_FLOWLABEL) + if (paddrp->spp_flags & SPP_IPV6_FLOWLABEL) { + TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { + if (net->ro._l_addr.sin6.sin6_family == AF_INET6) { + net->tos_flowlabel = paddrp->spp_ipv6_flowlabel; + } + } stcb->asoc.default_flowlabel = paddrp->spp_ipv6_flowlabel; + } #endif } @@ -4605,8 +4767,12 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_HEARTBEAT] = MSEC_TO_TICKS(paddrp->spp_hbinterval); } if (paddrp->spp_flags & SPP_HB_ENABLE) { + if (paddrp->spp_flags & SPP_HB_TIME_IS_ZERO) { + inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_HEARTBEAT] = 0; + } else if (paddrp->spp_hbinterval) { + inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_HEARTBEAT] = MSEC_TO_TICKS(paddrp->spp_hbinterval); + } sctp_feature_off(inp, SCTP_PCB_FLAGS_DONOT_HEARTBEAT); - } else if (paddrp->spp_flags & SPP_HB_DISABLE) { sctp_feature_on(inp, SCTP_PCB_FLAGS_DONOT_HEARTBEAT); } @@ -4769,10 +4935,12 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, (!(net->dest_state & SCTP_ADDR_UNCONFIRMED))) { /* Ok we need to set it */ if (sctp_set_primary_addr(stcb, (struct sockaddr *)NULL, net) == 0) { - if (net->dest_state & SCTP_ADDR_SWITCH_PRIMARY) { - net->dest_state |= SCTP_ADDR_DOUBLE_SWITCH; + if ((stcb->asoc.alternate) && + (!(net->dest_state & SCTP_ADDR_PF)) && + (net->dest_state & SCTP_ADDR_REACHABLE)) { + sctp_free_remote_addr(stcb->asoc.alternate); + stcb->asoc.alternate = NULL; } - net->dest_state |= SCTP_ADDR_SWITCH_PRIMARY; } } } else { @@ -4930,7 +5098,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, error = EINVAL; break; } - if (td != NULL && (error = prison_local_ip6(td->td_ucred, &(((struct sockaddr_in6 *)(addrs->addr))->sin6_addr), + if (td != NULL && + (error = prison_local_ip6(td->td_ucred, + &(((struct sockaddr_in6 *)(addrs->addr))->sin6_addr), (SCTP_IPV6_V6ONLY(inp) != 0))) != 0) { SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_USRREQ, error); break; @@ -5170,6 +5340,146 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } break; } + case SCTP_PEER_ADDR_THLDS: + /* Applies to the specific association */ + { + struct sctp_paddrthlds *thlds; + struct sctp_nets *net; + + SCTP_CHECK_AND_CAST(thlds, optval, struct sctp_paddrthlds, optsize); + SCTP_FIND_STCB(inp, stcb, thlds->spt_assoc_id); + net = NULL; + if (stcb) { + net = sctp_findnet(stcb, (struct sockaddr *)&thlds->spt_assoc_id); + } else { + /* + * We increment here since + * sctp_findassociation_ep_addr() wil do a + * decrement if it finds the stcb as long as + * the locked tcb (last argument) is NOT a + * TCB.. aka NULL. + */ + SCTP_INP_INCR_REF(inp); + stcb = sctp_findassociation_ep_addr(&inp, + (struct sockaddr *)&thlds->spt_assoc_id, + &net, NULL, NULL); + if (stcb == NULL) { + SCTP_INP_DECR_REF(inp); + } + } + if (stcb && (net == NULL)) { + struct sockaddr *sa; + + sa = (struct sockaddr *)&thlds->spt_assoc_id; +#ifdef INET + if (sa->sa_family == AF_INET) { + + struct sockaddr_in *sin; + + sin = (struct sockaddr_in *)sa; + if (sin->sin_addr.s_addr) { + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); + SCTP_TCB_UNLOCK(stcb); + error = EINVAL; + break; + } + } else +#endif +#ifdef INET6 + if (sa->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6; + + sin6 = (struct sockaddr_in6 *)sa; + if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); + SCTP_TCB_UNLOCK(stcb); + error = EINVAL; + break; + } + } else +#endif + { + error = EAFNOSUPPORT; + SCTP_TCB_UNLOCK(stcb); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, error); + break; + } + } + if (stcb) { + if (net) { + if (net->dest_state & SCTP_ADDR_PF) { + if ((net->failure_threshold > thlds->spt_pathmaxrxt) || + (net->failure_threshold <= thlds->spt_pathpfthld)) { + net->dest_state &= ~SCTP_ADDR_PF; + } + } else { + if ((net->failure_threshold > thlds->spt_pathpfthld) && + (net->failure_threshold <= thlds->spt_pathmaxrxt)) { + net->dest_state |= SCTP_ADDR_PF; + sctp_send_hb(stcb, net, SCTP_SO_LOCKED); + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_TIMER + SCTP_LOC_3); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); + } + } + if (net->dest_state & SCTP_ADDR_REACHABLE) { + if (net->failure_threshold > thlds->spt_pathmaxrxt) { + net->dest_state &= ~SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + } + } else { + if (net->failure_threshold <= thlds->spt_pathmaxrxt) { + net->dest_state |= SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + } + } + net->failure_threshold = thlds->spt_pathmaxrxt; + net->pf_threshold = thlds->spt_pathpfthld; + } else { + TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { + if (net->dest_state & SCTP_ADDR_PF) { + if ((net->failure_threshold > thlds->spt_pathmaxrxt) || + (net->failure_threshold <= thlds->spt_pathpfthld)) { + net->dest_state &= ~SCTP_ADDR_PF; + } + } else { + if ((net->failure_threshold > thlds->spt_pathpfthld) && + (net->failure_threshold <= thlds->spt_pathmaxrxt)) { + net->dest_state |= SCTP_ADDR_PF; + sctp_send_hb(stcb, net, SCTP_SO_LOCKED); + sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_TIMER + SCTP_LOC_3); + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); + } + } + if (net->dest_state & SCTP_ADDR_REACHABLE) { + if (net->failure_threshold > thlds->spt_pathmaxrxt) { + net->dest_state &= ~SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + } + } else { + if (net->failure_threshold <= thlds->spt_pathmaxrxt) { + net->dest_state |= SCTP_ADDR_REACHABLE; + sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, SCTP_RESPONSE_TO_USER_REQ, net, SCTP_SO_LOCKED); + } + } + net->failure_threshold = thlds->spt_pathmaxrxt; + net->pf_threshold = thlds->spt_pathpfthld; + } + stcb->asoc.def_net_failure = thlds->spt_pathmaxrxt; + stcb->asoc.def_net_pf_threshold = thlds->spt_pathpfthld; + } + } else { + if (thlds->spt_assoc_id == SCTP_FUTURE_ASSOC) { + SCTP_INP_WLOCK(inp); + inp->sctp_ep.def_net_failure = thlds->spt_pathmaxrxt; + inp->sctp_ep.def_net_pf_threshold = thlds->spt_pathpfthld; + SCTP_INP_WUNLOCK(inp); + } else { + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); + error = EINVAL; + } + } + break; + } default: SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOPROTOOPT); error = ENOPROTOOPT; diff --git a/sys/netinet/sctp_var.h b/sys/netinet/sctp_var.h index e48dfe49da1..b41f5c8303d 100644 --- a/sys/netinet/sctp_var.h +++ b/sys/netinet/sctp_var.h @@ -179,7 +179,6 @@ extern struct pr_usrreqs sctp_usrreqs; if (SCTP_DECREMENT_AND_CHECK_REFCOUNT(&(__net)->ref_count)) { \ (void)SCTP_OS_TIMER_STOP(&(__net)->rxt_timer.timer); \ (void)SCTP_OS_TIMER_STOP(&(__net)->pmtu_timer.timer); \ - (void)SCTP_OS_TIMER_STOP(&(__net)->fr_timer.timer); \ if ((__net)->ro.ro_rt) { \ RTFREE((__net)->ro.ro_rt); \ (__net)->ro.ro_rt = NULL; \ @@ -189,7 +188,7 @@ extern struct pr_usrreqs sctp_usrreqs; (__net)->ro._s_addr = NULL; \ } \ (__net)->src_addr_selected = 0; \ - (__net)->dest_state = SCTP_ADDR_NOT_REACHABLE; \ + (__net)->dest_state &= ~SCTP_ADDR_REACHABLE; \ SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_net), (__net)); \ SCTP_DECR_RADDR_COUNT(); \ } \ @@ -312,6 +311,8 @@ extern struct pr_usrreqs sctp_usrreqs; #endif +#define SCTP_PF_ENABLED(_net) (_net->pf_threshold < _net->failure_threshold) +#define SCTP_NET_IS_PF(_net) (_net->pf_threshold < _net->error_count) struct sctp_nets; struct sctp_inpcb; diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index 9a8bd2e9dd1..9beedbb52ef 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -739,15 +739,14 @@ sctp_stop_timers_for_shutdown(struct sctp_tcb *stcb) asoc = &stcb->asoc; - (void)SCTP_OS_TIMER_STOP(&asoc->hb_timer.timer); (void)SCTP_OS_TIMER_STOP(&asoc->dack_timer.timer); (void)SCTP_OS_TIMER_STOP(&asoc->strreset_timer.timer); (void)SCTP_OS_TIMER_STOP(&asoc->asconf_timer.timer); (void)SCTP_OS_TIMER_STOP(&asoc->autoclose_timer.timer); (void)SCTP_OS_TIMER_STOP(&asoc->delayed_event_timer.timer); TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - (void)SCTP_OS_TIMER_STOP(&net->fr_timer.timer); (void)SCTP_OS_TIMER_STOP(&net->pmtu_timer.timer); + (void)SCTP_OS_TIMER_STOP(&net->hb_timer.timer); } } @@ -921,7 +920,7 @@ sctp_init_asoc(struct sctp_inpcb *m, struct sctp_tcb *stcb, asoc->sctp_cmt_on_off = m->sctp_cmt_on_off; asoc->ecn_allowed = m->sctp_ecn_enable; asoc->sctp_nr_sack_on_off = (uint8_t) SCTP_BASE_SYSCTL(sctp_nr_sack_on_off); - asoc->sctp_cmt_pf = (uint8_t) SCTP_BASE_SYSCTL(sctp_cmt_pf); + asoc->sctp_cmt_pf = (uint8_t) 0; asoc->sctp_frag_point = m->sctp_frag_point; asoc->sctp_features = m->sctp_features; #ifdef INET @@ -946,11 +945,6 @@ sctp_init_asoc(struct sctp_inpcb *m, struct sctp_tcb *stcb, asoc->peer_vtag_nonce = sctp_select_a_tag(m, stcb->sctp_ep->sctp_lport, stcb->rport, 0); asoc->vrf_id = vrf_id; - if (sctp_is_feature_on(m, SCTP_PCB_FLAGS_DONOT_HEARTBEAT)) - asoc->hb_is_disabled = 1; - else - asoc->hb_is_disabled = 0; - #ifdef SCTP_ASOCLOG_OF_TSNS asoc->tsn_in_at = 0; asoc->tsn_out_at = 0; @@ -989,6 +983,7 @@ sctp_init_asoc(struct sctp_inpcb *m, struct sctp_tcb *stcb, asoc->max_init_times = m->sctp_ep.max_init_times; asoc->max_send_times = m->sctp_ep.max_send_times; asoc->def_net_failure = m->sctp_ep.def_net_failure; + asoc->def_net_pf_threshold = m->sctp_ep.def_net_pf_threshold; asoc->free_chunk_cnt = 0; asoc->iam_blocking = 0; @@ -1632,11 +1627,10 @@ sctp_timeout_handler(void *t) case SCTP_TIMER_TYPE_RECV: if ((stcb == NULL) || (inp == NULL)) { break; - } { - SCTP_STAT_INCR(sctps_timosack); - stcb->asoc.timosack++; - sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED); } + SCTP_STAT_INCR(sctps_timosack); + stcb->asoc.timosack++; + sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED); #ifdef SCTP_AUDITING_ENABLED sctp_auditing(4, inp, stcb, net); #endif @@ -1658,33 +1652,20 @@ sctp_timeout_handler(void *t) sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SHUT_TMR, SCTP_SO_NOT_LOCKED); break; case SCTP_TIMER_TYPE_HEARTBEAT: - { - struct sctp_nets *lnet; - int cnt_of_unconf = 0; - - if ((stcb == NULL) || (inp == NULL)) { - break; - } - SCTP_STAT_INCR(sctps_timoheartbeat); - stcb->asoc.timoheartbeat++; - TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) { - if ((lnet->dest_state & SCTP_ADDR_UNCONFIRMED) && - (lnet->dest_state & SCTP_ADDR_REACHABLE)) { - cnt_of_unconf++; - } - } - if (cnt_of_unconf == 0) { - if (sctp_heartbeat_timer(inp, stcb, lnet, - cnt_of_unconf)) { - /* no need to unlock on tcb its gone */ - goto out_decr; - } - } + if ((stcb == NULL) || (inp == NULL) || (net == NULL)) { + break; + } + SCTP_STAT_INCR(sctps_timoheartbeat); + stcb->asoc.timoheartbeat++; + if (sctp_heartbeat_timer(inp, stcb, net)) { + /* no need to unlock on tcb its gone */ + goto out_decr; + } #ifdef SCTP_AUDITING_ENABLED - sctp_auditing(4, inp, stcb, lnet); + sctp_auditing(4, inp, stcb, net); #endif - sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, - stcb->sctp_ep, stcb, lnet); + if (!(net->dest_state & SCTP_ADDR_NOHB)) { + sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_HB_TMR, SCTP_SO_NOT_LOCKED); } break; @@ -1780,14 +1761,6 @@ sctp_timeout_handler(void *t) SCTP_STAT_INCR(sctps_timostrmrst); sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_STRRST_TMR, SCTP_SO_NOT_LOCKED); break; - case SCTP_TIMER_TYPE_EARLYFR: - /* Need to do FR of things for net */ - if ((stcb == NULL) || (inp == NULL)) { - break; - } - SCTP_STAT_INCR(sctps_timoearlyfr); - sctp_early_fr_timer(inp, stcb, net); - break; case SCTP_TIMER_TYPE_ASCONF: if ((stcb == NULL) || (inp == NULL)) { break; @@ -1898,7 +1871,7 @@ void sctp_timer_start(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net) { - int to_ticks; + uint32_t to_ticks; struct sctp_timer *tmr; if ((t_type != SCTP_TIMER_TYPE_ADDR_WQ) && (inp == NULL)) @@ -1985,71 +1958,38 @@ sctp_timer_start(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, * though we use a different timer. We also add the HB timer * PLUS a random jitter. */ - if ((inp == NULL) || (stcb == NULL)) { + if ((inp == NULL) || (stcb == NULL) || (net == NULL)) { return; } else { uint32_t rndval; - uint8_t this_random; - int cnt_of_unconf = 0; - struct sctp_nets *lnet; + uint32_t jitter; - TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) { - if ((lnet->dest_state & SCTP_ADDR_UNCONFIRMED) && - (lnet->dest_state & SCTP_ADDR_REACHABLE)) { - cnt_of_unconf++; - } - } - if (cnt_of_unconf) { - net = lnet = NULL; - (void)sctp_heartbeat_timer(inp, stcb, lnet, cnt_of_unconf); - } - if (stcb->asoc.hb_random_idx > 3) { - rndval = sctp_select_initial_TSN(&inp->sctp_ep); - memcpy(stcb->asoc.hb_random_values, &rndval, - sizeof(stcb->asoc.hb_random_values)); - stcb->asoc.hb_random_idx = 0; - } - this_random = stcb->asoc.hb_random_values[stcb->asoc.hb_random_idx]; - stcb->asoc.hb_random_idx++; - stcb->asoc.hb_ect_randombit = 0; - /* - * this_random will be 0 - 256 ms RTO is in ms. - */ - if ((stcb->asoc.hb_is_disabled) && - (cnt_of_unconf == 0)) { + if ((net->dest_state & SCTP_ADDR_NOHB) && + !(net->dest_state & SCTP_ADDR_UNCONFIRMED)) { return; } - if (net) { - int delay; - - delay = stcb->asoc.heart_beat_delay; - TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) { - if ((lnet->dest_state & SCTP_ADDR_UNCONFIRMED) && - ((lnet->dest_state & SCTP_ADDR_OUT_OF_SCOPE) == 0) && - (lnet->dest_state & SCTP_ADDR_REACHABLE)) { - delay = 0; - } - } - if (net->RTO == 0) { - /* Never been checked */ - to_ticks = this_random + stcb->asoc.initial_rto + delay; - } else { - /* set rto_val to the ms */ - to_ticks = delay + net->RTO + this_random; - } + if (net->RTO == 0) { + to_ticks = stcb->asoc.initial_rto; } else { - if (cnt_of_unconf) { - to_ticks = this_random + stcb->asoc.initial_rto; - } else { - to_ticks = stcb->asoc.heart_beat_delay + this_random + stcb->asoc.initial_rto; - } + to_ticks = net->RTO; + } + rndval = sctp_select_initial_TSN(&inp->sctp_ep); + jitter = rndval % to_ticks; + if (jitter >= (to_ticks >> 1)) { + to_ticks = to_ticks + (jitter - (to_ticks >> 1)); + } else { + to_ticks = to_ticks - jitter; + } + if (!(net->dest_state & SCTP_ADDR_UNCONFIRMED) && + !(net->dest_state & SCTP_ADDR_PF)) { + to_ticks += net->heart_beat_delay; } /* * Now we must convert the to_ticks that are now in * ms to ticks. */ to_ticks = MSEC_TO_TICKS(to_ticks); - tmr = &stcb->asoc.hb_timer; + tmr = &net->hb_timer; } break; case SCTP_TIMER_TYPE_COOKIE: @@ -2150,35 +2090,6 @@ sctp_timer_start(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, } tmr = &stcb->asoc.strreset_timer; break; - - case SCTP_TIMER_TYPE_EARLYFR: - { - unsigned int msec; - - if ((stcb == NULL) || (net == NULL)) { - return; - } - if (net->flight_size > net->cwnd) { - /* no need to start */ - return; - } - SCTP_STAT_INCR(sctps_earlyfrstart); - if (net->lastsa == 0) { - /* Hmm no rtt estimate yet? */ - msec = stcb->asoc.initial_rto >> 2; - } else { - msec = ((net->lastsa >> 2) + net->lastsv) >> 1; - } - if (msec < SCTP_BASE_SYSCTL(sctp_early_fr_msec)) { - msec = SCTP_BASE_SYSCTL(sctp_early_fr_msec); - if (msec < SCTP_MINFR_MSEC_FLOOR) { - msec = SCTP_MINFR_MSEC_FLOOR; - } - } - to_ticks = MSEC_TO_TICKS(msec); - tmr = &net->fr_timer; - } - break; case SCTP_TIMER_TYPE_ASCONF: /* * Here the timer comes from the stcb but its value is from @@ -2273,13 +2184,6 @@ sctp_timer_stop(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, case SCTP_TIMER_TYPE_ADDR_WQ: tmr = &SCTP_BASE_INFO(addr_wq_timer); break; - case SCTP_TIMER_TYPE_EARLYFR: - if ((stcb == NULL) || (net == NULL)) { - return; - } - tmr = &net->fr_timer; - SCTP_STAT_INCR(sctps_earlyfrstop); - break; case SCTP_TIMER_TYPE_SEND: if ((stcb == NULL) || (net == NULL)) { return; @@ -2305,10 +2209,10 @@ sctp_timer_stop(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, tmr = &net->rxt_timer; break; case SCTP_TIMER_TYPE_HEARTBEAT: - if (stcb == NULL) { + if ((stcb == NULL) || (net == NULL)) { return; } - tmr = &stcb->asoc.hb_timer; + tmr = &net->hb_timer; break; case SCTP_TIMER_TYPE_COOKIE: if ((stcb == NULL) || (net == NULL)) { @@ -6209,7 +6113,7 @@ sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, #ifdef INET case AF_INET: incr = sizeof(struct sockaddr_in); - if (sctp_add_remote_addr(stcb, sa, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { + if (sctp_add_remote_addr(stcb, sa, NULL, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { /* assoc gone no un-lock */ SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOBUFS); (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_USRREQ + SCTP_LOC_7); @@ -6222,7 +6126,7 @@ sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, #ifdef INET6 case AF_INET6: incr = sizeof(struct sockaddr_in6); - if (sctp_add_remote_addr(stcb, sa, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { + if (sctp_add_remote_addr(stcb, sa, NULL, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { /* assoc gone no un-lock */ SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOBUFS); (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_USRREQ + SCTP_LOC_8); diff --git a/sys/netinet6/sctp6_usrreq.c b/sys/netinet6/sctp6_usrreq.c index 62efcd6bae9..7512f5b9f25 100644 --- a/sys/netinet6/sctp6_usrreq.c +++ b/sys/netinet6/sctp6_usrreq.c @@ -420,33 +420,8 @@ sctp6_notify(struct sctp_inpcb *inp, */ if (net->dest_state & SCTP_ADDR_REACHABLE) { /* Ok that destination is NOT reachable */ - SCTP_PRINTF("ICMP (thresh %d/%d) takes interface %p down\n", - net->error_count, - net->failure_threshold, - net); - net->dest_state &= ~SCTP_ADDR_REACHABLE; - net->dest_state |= SCTP_ADDR_NOT_REACHABLE; - /* - * JRS 5/14/07 - If a destination is unreachable, - * the PF bit is turned off. This allows an - * unambiguous use of the PF bit for destinations - * that are reachable but potentially failed. If the - * destination is set to the unreachable state, also - * set the destination to the PF state. - */ - /* - * Add debug message here if destination is not in - * PF state. - */ - /* Stop any running T3 timers here? */ - if ((stcb->asoc.sctp_cmt_on_off > 0) && - (stcb->asoc.sctp_cmt_pf > 0)) { - net->dest_state &= ~SCTP_ADDR_PF; - SCTPDBG(SCTP_DEBUG_TIMER4, "Destination %p moved from PF to unreachable.\n", - net); - } - net->error_count = net->failure_threshold + 1; + net->dest_state &= ~SCTP_ADDR_PF; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_DOWN, stcb, SCTP_FAILED_THRESHOLD, (void *)net, SCTP_SO_NOT_LOCKED); From 8eb43d357c6e72a7fc89933059fdbfaf7829197c Mon Sep 17 00:00:00 2001 From: Brooks Davis Date: Wed, 3 Aug 2011 20:21:52 +0000 Subject: [PATCH 142/452] Fix two more $FreeBSD$ keywords. Reported by: pluknet Approved by: re (implicit) --- crypto/openssh/compat.h | 2 +- crypto/openssh/servconf.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/openssh/compat.h b/crypto/openssh/compat.h index b8405267fde..57f38f5f979 100644 --- a/crypto/openssh/compat.h +++ b/crypto/openssh/compat.h @@ -1,5 +1,5 @@ /* $OpenBSD: compat.h,v 1.42 2008/09/11 14:22:37 markus Exp $ */ -/* $FReeBSD$ */ +/* $FreeBSD$ */ /* * Copyright (c) 1999, 2000, 2001 Markus Friedl. All rights reserved. diff --git a/crypto/openssh/servconf.h b/crypto/openssh/servconf.h index f6aadac3a80..cfa8e4b082b 100644 --- a/crypto/openssh/servconf.h +++ b/crypto/openssh/servconf.h @@ -1,5 +1,5 @@ /* $OpenBSD: servconf.h,v 1.95 2010/11/13 23:27:50 djm Exp $ */ -/* $OpenBSD$ */ +/* $FreeBSD$ */ /* * Author: Tatu Ylonen From 625b09b02154fbfd34da1f14ad7f36ef9fefa697 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 3 Aug 2011 23:57:38 +0000 Subject: [PATCH 143/452] Undo this for now. It's "right", but it means everything will rely on the ar9130 code. Since at least one kernel config specifies individual ath HAL chips rather than just "device ath_hal" (arm/AVILA), I'm doing this so people aren't caught out when they update to -HEAD or 9.0 and discover their ath setup doesn't compile. I'll revisit this with a proper fix sometime before 9.0-RELEASE. Approved by: re (kib, blanket) Pointed out by: ray@ Pointy hat to: adrian@ --- sys/dev/ath/ath_hal/ar9002/ar9280_attach.c | 8 -------- sys/dev/ath/ath_hal/ar9002/ar9285_attach.c | 10 +--------- sys/dev/ath/ath_hal/ar9002/ar9287_attach.c | 8 -------- 3 files changed, 1 insertion(+), 25 deletions(-) diff --git a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c index 014838b967e..4f4b8baf2b4 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9280_attach.c @@ -28,8 +28,6 @@ #include "ar5416/ar5416reg.h" #include "ar5416/ar5416phy.h" -#include "ar9001/ar9130_eeprom.h" - #include "ar9002/ar9280v1.ini" #include "ar9002/ar9280v2.ini" #include "ar9002/ar9280_olc.h" @@ -193,12 +191,6 @@ ar9280Attach(uint16_t devid, HAL_SOFTC sc, AH5416(ah)->ah_rx_chainmask = AR9280_DEFAULT_RXCHAINMASK; AH5416(ah)->ah_tx_chainmask = AR9280_DEFAULT_TXCHAINMASK; - if (eepromdata) { - AH_PRIVATE((ah))->ah_eepromRead = ar9130EepromRead; - AH_PRIVATE((ah))->ah_eepromWrite = NULL; - ah->ah_eepromdata = eepromdata; - } - if (!ar5416SetResetReg(ah, HAL_RESET_POWER_ON)) { /* reset chip */ HALDEBUG(ah, HAL_DEBUG_ANY, "%s: couldn't reset chip\n", diff --git a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c index 4301d0968f4..02c7b9892aa 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9285_attach.c @@ -29,8 +29,6 @@ #include "ar5416/ar5416reg.h" #include "ar5416/ar5416phy.h" -#include "ar9001/ar9130_eeprom.h" - #include "ar9002/ar9285.ini" #include "ar9002/ar9285v2.ini" #include "ar9002/ar9280v2.ini" /* XXX ini for tx/rx gain */ @@ -155,13 +153,7 @@ ar9285Attach(uint16_t devid, HAL_SOFTC sc, AH5416(ah)->ah_writeIni = ar9285WriteIni; AH5416(ah)->ah_rx_chainmask = AR9285_DEFAULT_RXCHAINMASK; AH5416(ah)->ah_tx_chainmask = AR9285_DEFAULT_TXCHAINMASK; - - if (eepromdata) { - AH_PRIVATE((ah))->ah_eepromRead = ar9130EepromRead; - AH_PRIVATE((ah))->ah_eepromWrite = NULL; - ah->ah_eepromdata = eepromdata; - } - + ahp->ah_maxTxTrigLev = MAX_TX_FIFO_THRESHOLD >> 1; if (!ar5416SetResetReg(ah, HAL_RESET_POWER_ON)) { diff --git a/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c b/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c index 96a3fde1e91..78400f52f95 100644 --- a/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c +++ b/sys/dev/ath/ath_hal/ar9002/ar9287_attach.c @@ -30,8 +30,6 @@ #include "ar5416/ar5416reg.h" #include "ar5416/ar5416phy.h" -#include "ar9001/ar9130_eeprom.h" - #include "ar9002/ar9287_cal.h" #include "ar9002/ar9287_reset.h" #include "ar9002/ar9287_olc.h" @@ -170,12 +168,6 @@ ar9287Attach(uint16_t devid, HAL_SOFTC sc, AH5416(ah)->ah_rx_chainmask = AR9287_DEFAULT_RXCHAINMASK; AH5416(ah)->ah_tx_chainmask = AR9287_DEFAULT_TXCHAINMASK; - if (eepromdata) { - AH_PRIVATE((ah))->ah_eepromRead = ar9130EepromRead; - AH_PRIVATE((ah))->ah_eepromWrite = NULL; - ah->ah_eepromdata = eepromdata; - } - if (!ar5416SetResetReg(ah, HAL_RESET_POWER_ON)) { /* reset chip */ HALDEBUG(ah, HAL_DEBUG_ANY, "%s: couldn't reset chip\n", From 9f0f0b4d4c1b20853baea15be8e05c09ac4a465a Mon Sep 17 00:00:00 2001 From: Ruslan Ermilov Date: Thu, 4 Aug 2011 08:50:33 +0000 Subject: [PATCH 144/452] Clean up markup. Approved by: re (kib) --- usr.bin/man/man.1 | 61 +++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/usr.bin/man/man.1 b/usr.bin/man/man.1 index a9002ece8ad..d8486bd3acb 100644 --- a/usr.bin/man/man.1 +++ b/usr.bin/man/man.1 @@ -34,7 +34,7 @@ .Sh SYNOPSIS .Nm .Op Fl adho -.Op Fl t | Fl w +.Op Fl t | w .Op Fl M Ar manpath .Op Fl P Ar pager .Op Fl S Ar mansect @@ -73,9 +73,9 @@ environment variable. .It Fl P Ar pager Use specified pager. Defaults to -.Ic "less -sR" +.Dq Li "less -sR" if color support is enabled, or -.Ic "more -s" . +.Dq Li "more -s" . Overrides the .Ev MANPAGER environment variable, which in turn overrides the @@ -84,7 +84,7 @@ environment variable. .It Fl S Ar mansect Restricts manual sections searched to the specified colon delimited list. Defaults to -.Va 1:1aout:8:2:3:n:4:5:6:7:9:l . +.Dq Li 1:1aout:8:2:3:n:4:5:6:7:9:l . Overrides the .Ev MANSECT environment variable. @@ -125,12 +125,13 @@ Overrides the and .Ev LANG environment variables. -.It Fl p Op Ar eprtv +.It Fl p Op Cm eprtv Use the list of given preprocessors before running .Xr nroff 1 or .Xr troff 1 . Valid preprocessors arguments: +.Pp .Bl -tag -width indent -compact .It Cm e .Xr eqn 1 @@ -143,6 +144,7 @@ Valid preprocessors arguments: .It Cm v .Xr vgrind 1 .El +.Pp Overrides the .Ev MANROFFSEQ environment variable. @@ -161,35 +163,31 @@ The utility supports manual pages in different locales. The search behavior is dictated by the first of three environment variables with a nonempty string: -.Ev LC_ALL , -.Ev LC_CTYPE , +.Ev LC_ALL , LC_CTYPE , or .Ev LANG . If set, .Nm will search for locale specific manual pages using the following logic: -.Bl -item -compact -offset indent -.Sm off +.Pp +.Bl -item -offset indent -compact .It -.Va lang _ -.Va country . -.Va charset +.Va lang Ns _ Ns Va country Ns . Ns Va charset .It -.Va lang . -.Va charset +.Va lang Ns . Ns Va charset .It -.Li en . -.Va charset -.Sm on +.Li en Ns . Ns Va charset .El +.Pp For example, if .Ev LC_ALL is set to -.Va ja_JP.eucJP , +.Dq Li ja_JP.eucJP , .Nm will search the following paths when considering section 1 manual pages in .Pa /usr/share/man : -.Bl -item -compact -offset indent +.Pp +.Bl -item -offset indent -compact .It .Pa /usr/share/man/ja_JP.eucJP/man1 .It @@ -213,15 +211,16 @@ environment variables. For example, if .Ev MACHINE_ARCH is set to -.Va i386 +.Dq Li i386 and .Ev MACHINE is set to -.Va pc98 , +.Dq Li pc98 , .Nm will search the following paths when considering section 4 manual pages in .Pa /usr/share/man : -.Bl -item -compact -offset indent +.Pp +.Bl -item -offset indent -compact .It .Pa /usr/share/man/man4/pc98 .It @@ -234,12 +233,12 @@ The .Nm utility also supports displaying a specific manual page if passed a path to the file as long as it contains a -.Sq / +.Ql / character. .Sh ENVIRONMENT The following environment variables affect the execution of .Nm : -.Bl -tag -width ".Ev MANPATH" +.Bl -tag -width ".Ev MANROFFSEQ" .It Ev LC_ALL , LC_CTYPE , LANG Used to find locale specific manual pages. Valid values can be found by running the @@ -254,9 +253,9 @@ option. .It Ev MACHINE_ARCH , MACHINE Used to find platform specific manual pages. If unset, the output of -.Ic "sysctl hw.machine_arch" +.Dq Li "sysctl hw.machine_arch" and -.Ic "sysctl hw.machine" +.Dq Li "sysctl hw.machine" is used respectively. See .Sx IMPLEMENTATION NOTES @@ -299,14 +298,14 @@ If set, enables color support. Program used to display files. .Pp If unset, and color support is enabled, -.Ic "less -sR" +.Dq Li "less -sR" is used. .Pp If unset, and color support is disabled, then .Ev PAGER is used. If that has no value either, -.Ic "more -s" +.Dq Li "more -s" is used. .El .Sh FILES @@ -317,11 +316,11 @@ System configuration file. Local configuration files. .El .Sh SEE ALSO -.Xr intro 1 , .Xr apropos 1 , +.Xr intro 1 , .Xr locale 1 , .Xr manpath 1 , -.Xr man.conf 5 , .Xr nroff 1 , .Xr troff 1 , -.Xr whatis 1 +.Xr whatis 1 , +.Xr man.conf 5 From cf933f5bf9dca52eba28a9cf21172b79fdcfcf04 Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Thu, 4 Aug 2011 14:18:09 +0000 Subject: [PATCH 145/452] Don't try to free() an address returned by mmap(). This appears to be triggered by the same .o being included twice on the command line. Found by: Nima Misaghian at Sandvine Reviewed by: kientzle, kaiw Approved by: re MFC after: 1 week --- usr.bin/ar/write.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/usr.bin/ar/write.c b/usr.bin/ar/write.c index 5b6d36953e1..ca348c2892f 100644 --- a/usr.bin/ar/write.c +++ b/usr.bin/ar/write.c @@ -58,6 +58,7 @@ static struct ar_obj *create_obj_from_file(struct bsdar *bsdar, const char *name, time_t mtime); static void create_symtab_entry(struct bsdar *bsdar, void *maddr, size_t size); +static void free_obj(struct bsdar *bsdar, struct ar_obj *obj); static void insert_obj(struct bsdar *bsdar, struct ar_obj *obj, struct ar_obj *pos); static void read_objs(struct bsdar *bsdar, const char *archive, @@ -209,6 +210,22 @@ giveup: return (NULL); } +/* + * Free object itself and its associated allocations. + */ +static void +free_obj(struct bsdar *bsdar, struct ar_obj *obj) +{ + if (obj->fd == -1) + free(obj->maddr); + else + if (obj->maddr != NULL && munmap(obj->maddr, obj->size)) + bsdar_warnc(bsdar, errno, + "can't munmap file: %s", obj->name); + free(obj->name); + free(obj); +} + /* * Insert obj to the tail, or before/after the pos obj. */ @@ -474,11 +491,8 @@ write_archive(struct bsdar *bsdar, char mode) *av); TAILQ_REMOVE(&bsdar->v_obj, obj, objs); - if (mode == 'd' || mode == 'r') { - free(obj->maddr); - free(obj->name); - free(obj); - } + if (mode == 'd' || mode == 'r') + free_obj(bsdar, obj); if (mode == 'm') insert_obj(bsdar, obj, pos); @@ -525,15 +539,8 @@ write_cleanup(struct bsdar *bsdar) struct ar_obj *obj, *obj_temp; TAILQ_FOREACH_SAFE(obj, &bsdar->v_obj, objs, obj_temp) { - if (obj->fd == -1) - free(obj->maddr); - else - if (obj->maddr != NULL && munmap(obj->maddr, obj->size)) - bsdar_warnc(bsdar, errno, - "can't munmap file: %s", obj->name); TAILQ_REMOVE(&bsdar->v_obj, obj, objs); - free(obj->name); - free(obj); + free_obj(bsdar, obj); } free(bsdar->as); From f8c6c2cf5a36b26d250e9bb9e0ed182ee8cdb86d Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Thu, 4 Aug 2011 14:20:13 +0000 Subject: [PATCH 146/452] Flesh out the cap_test regression test. Add more regression testing, some of which is expected to fail until we commit more kernel implementation. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- tools/regression/security/cap_test/Makefile | 17 +- tools/regression/security/cap_test/cap_test.c | 85 +++- tools/regression/security/cap_test/cap_test.h | 127 +++++- .../security/cap_test/cap_test_capmode.c | 420 ++++-------------- .../security/cap_test/cap_test_sysctl.c | 14 +- 5 files changed, 319 insertions(+), 344 deletions(-) diff --git a/tools/regression/security/cap_test/Makefile b/tools/regression/security/cap_test/Makefile index 86d495ce71c..49e308e74bd 100644 --- a/tools/regression/security/cap_test/Makefile +++ b/tools/regression/security/cap_test/Makefile @@ -1,9 +1,22 @@ # $FreeBSD$ PROG= cap_test -SRCS= cap_test.c cap_test_capmode.c cap_test_sysctl.c +SRCS= cap_test.c \ + cap_test_capmode.c \ + cap_test_capabilities.c \ + cap_test_fcntl.c \ + cap_test_sysctl.c WARNS= 3 NO_MAN= -CFLAGS+= -DMACHINE=\"${MACHINE}\" + +# Use headers and libc from the build, if available. +KERNCONF?= GENERIC +OBJROOT= ${.OBJDIR}/../../../../ +OBJKERN= ${OBJROOT}/sys/${KERNCONF} + +SRCROOT= ${.CURDIR}/../../../../ + +CFLAGS+= -DMACHINE=\"${MACHINE}\" -I${OBJKERN} -I${SRCROOT}/sys +LDFLAGS+= -L${OBJROOT}/lib/libc -lc .include diff --git a/tools/regression/security/cap_test/cap_test.c b/tools/regression/security/cap_test/cap_test.c index 5a2dc15532e..fb344067233 100644 --- a/tools/regression/security/cap_test/cap_test.c +++ b/tools/regression/security/cap_test/cap_test.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2008-2011 Robert N. M. Watson + * Copyright (c) 2011 Jonathan Anderson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,19 +30,89 @@ #include __FBSDID("$FreeBSD$"); +#include + +#include +#include #include +#include +#include #include "cap_test.h" +/* Initialize a named test. Requires test_NAME() function to be declared. */ +#define TEST_INIT(name) { #name, test_##name, FAILED } + +/* All of the tests that can be run. */ +struct test all_tests[] = { + TEST_INIT(capmode), + TEST_INIT(capabilities), + TEST_INIT(fcntl), + TEST_INIT(sysctl), +}; +size_t test_count = sizeof(all_tests) / sizeof(struct test); + int main(int argc, char *argv[]) { - test_capmode(); - test_sysctl(); + /* - test_capabilities(); - test_syscalls(); - test_fcntl(); - */ - exit(0); + * If no tests have been specified at the command line, run them all. + */ + if (argc == 1) { + printf("1..%ld\n", test_count); + + for (size_t i = 0; i < test_count; i++) + execute(i + 1, all_tests + i); + return (0); + } + + /* + * Otherwise, run only the specified tests. + */ + printf("1..%d\n", argc - 1); + for (int i = 1; i < argc; i++) + { + int found = 0; + for (size_t j = 0; j < test_count; j++) { + if (strncmp(argv[i], all_tests[j].t_name, + strlen(argv[i])) == 0) { + found = 1; + execute(i, all_tests + j); + break; + } + } + + if (found == 0) + errx(-1, "No such test '%s'", argv[i]); + } + + return (0); +} + +int +execute(int id, struct test *t) { + int result; + + pid_t pid = fork(); + if (pid < 0) + err(-1, "fork"); + if (pid) { + /* Parent: wait for result from child. */ + int status; + while (waitpid(pid, &status, 0) != pid) {} + if (WIFEXITED(status)) + result = WEXITSTATUS(status); + else + result = FAILED; + } else { + /* Child process: run the test. */ + exit(t->t_run()); + } + + printf("%s %d - %s\n", + (result == PASSED) ? "ok" : "not ok", + id, t->t_name); + + return (result); } diff --git a/tools/regression/security/cap_test/cap_test.h b/tools/regression/security/cap_test/cap_test.h index 18fa8147ee8..1839e01c482 100644 --- a/tools/regression/security/cap_test/cap_test.h +++ b/tools/regression/security/cap_test/cap_test.h @@ -1,5 +1,6 @@ /*- * Copyright (c) 2008-2011 Robert N. M. Watson + * Copyright (c) 2011 Jonathan Anderson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,10 +30,126 @@ #ifndef CAP_TEST_H #define CAP_TEST_H -void test_capmode(void); -void test_capabilities(void); -void test_syscalls(void); -void test_sysctl(void); -void test_fcntl(void); +#include + +/* + * Define a file required by a test. The test can't complete without the file, + * so if we don't have it, just die. + */ +#define REQUIRE(fd) do { \ + if ((fd) < 0) \ + err(-1, "%s:%d: Missing required file '%s'", \ + __FILE__, __LINE__, #fd); \ +} while (0) + +/* Whether a test passed or failed. */ +#define PASSED 0 +#define FAILED 1 + +/* A test has failed; print a message and clear the 'success' flag. */ +#define FAIL(...) do { \ + warn(__VA_ARGS__); \ + success = FAILED; \ +} while (0) + +/* As above, but do not print the errno message. */ +#define FAILX(...) do { \ + warnx(__VA_ARGS__); \ + success = FAILED; \ +} while (0) + +/* Like an assertion, but don't kill the test, just fail and keep going. */ +#define CHECK(condition) do { \ + if (!(condition)) \ + FAILX("%s:%d: Assertion '%s' failed", \ + __func__, __LINE__, #condition); \ +} while (0) + +/* Make sure that a system call's return value is >= 0. */ +#define CHECK_SYSCALL_SUCCEEDS(syscall, ...) do { \ + if (syscall(__VA_ARGS__) < 0) \ + FAIL("%s() at line %d: %s failed", \ + __func__, __LINE__, #syscall); \ +} while (0) + +/* Make sure that a system call fails with the correct errno. */ +#define CHECK_SYSCALL_FAILS(expected_errno, syscall, ...) do { \ + if (syscall(__VA_ARGS__) < 0) { \ + if (errno != expected_errno) \ + FAIL("%s() at line %d: %s", \ + __func__, __LINE__, #syscall); \ + } else { \ + FAILX("%s() at line %d: %s succeeded; it should've failed", \ + __func__, __LINE__, #syscall); \ + } \ +} while (0) + +/* Make sure that a system call fails, but not with a particular errno. */ +#define CHECK_SYSCALL_FAILS_BUT_NOT_WITH(bad_errno, syscall, ...) do { \ + if (syscall(__VA_ARGS__) < 0) { \ + if (errno == bad_errno) \ + FAIL("%s() at line %d: %s", \ + __func__, __LINE__, #syscall); \ + } else { \ + FAILX("%s() at line %d: %s succeeded; it should've failed", \ + __func__, __LINE__, #syscall); \ + } \ +} while (0) + +/* A system call should fail with ECAPMODE. */ +#define CHECK_CAPMODE(...) \ + CHECK_SYSCALL_FAILS(ECAPMODE, __VA_ARGS__) + +/* A system call should fail, but not with ECAPMODE. */ +#define CHECK_NOT_CAPMODE(...) \ + CHECK_SYSCALL_FAILS_BUT_NOT_WITH(ECAPMODE, __VA_ARGS__) + +/* A system call should fail with ENOTCAPABLE. */ +#define CHECK_NOTCAPABLE(...) \ + CHECK_SYSCALL_FAILS(ENOTCAPABLE, __VA_ARGS__) + +/* Ensure that 'rights' are a subset of 'max'. */ +#define CHECK_RIGHTS(rights, max) do { \ + if ((success == PASSED) && (rights != max)) \ + FAILX("Rights of opened file (%jx) > maximum (%jx)", \ + (cap_rights_t) rights, (cap_rights_t) max); \ +} while (0) + +/* Create a capability from a file descriptor, make sure it succeeds. */ +#define MAKE_CAPABILITY(to, from, rights) do { \ + cap_rights_t _rights; \ + REQUIRE(to = cap_new(from, rights)); \ + CHECK_SYSCALL_SUCCEEDS(cap_getrights, to, &_rights); \ + if ((success == PASSED) && (_rights != (rights))) \ + FAILX("New capability's rights (%jx) != %jx", \ + _rights, (cap_rights_t) (rights)); \ +} while (0) + +/* + * A top-level test should take no arguments and return an integer value, + * either PASSED or FAILED. + * + * Errors such as SIGSEGV will be caught and interpreted as FAILED. + */ +typedef int (*test_function)(void); + +/* Information about a test. */ +struct test { + char *t_name; + test_function t_run; + int t_result; +}; + +/* + * Run a test in a child process so that cap_enter(2) doesn't mess up + * subsequent tests. + */ +int execute(int id, struct test*); + +int test_capmode(void); +int test_capabilities(void); +int test_syscalls(void); +int test_sysctl(void); +int test_fcntl(void); #endif /* CAP_TEST_H */ diff --git a/tools/regression/security/cap_test/cap_test_capmode.c b/tools/regression/security/cap_test/cap_test_capmode.c index 9d20dec083e..37319901baa 100644 --- a/tools/regression/security/cap_test/cap_test_capmode.c +++ b/tools/regression/security/cap_test/cap_test_capmode.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2008-2009 Robert N. M. Watson + * Copyright (c) 2011 Jonathan Anderson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,163 +38,121 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include -#include #include #include #include #include -#include #include -#include #include #include #include #include -/* Need to check machine-dependent sysarch(). */ -#define ARCH_IS(s) (!strncmp(s, MACHINE, sizeof(s) + 1)) - #include "cap_test.h" -void +#define CHECK_SYSCALL_VOID_NOT_ECAPMODE(syscall, ...) do { \ + errno = 0; \ + (void)syscall(__VA_ARGS__); \ + if (errno == ECAPMODE) \ + FAIL("capmode: %s failed with ECAPMODE", #syscall); \ +} while (0) + +int test_capmode(void) { - struct sockaddr_in sin; struct statfs statfs; struct stat sb; - ssize_t len; long sysarch_arg = 0; - int fd, fd_close, fd_dir, fd_file, fd_socket, fd2[2], ret; + int fd_close, fd_dir, fd_file, fd_socket, fd2[2]; + int success = PASSED; pid_t pid, wpid; char ch; - fd_file = open("/tmp/cap_test_syscalls", O_RDWR|O_CREAT, 0644); - if (fd_file < 0) - err(-1, "test_syscalls:prep: open cap_test_syscalls"); + /* Open some files to play with. */ + REQUIRE(fd_file = open("/tmp/cap_capmode", O_RDWR|O_CREAT, 0644)); + REQUIRE(fd_close = open("/dev/null", O_RDWR)); + REQUIRE(fd_dir = open("/tmp", O_RDONLY)); + REQUIRE(fd_socket = socket(PF_INET, SOCK_DGRAM, 0)); - fd_close = open("/dev/null", O_RDWR); - if (fd_close < 0) - err(-1, "test_syscalls:prep: open /dev/null"); - - fd_dir = open("/tmp", O_RDONLY); - if (fd_dir < 0) - err(-1, "test_syscalls:prep: open /tmp"); - - fd_socket = socket(PF_INET, SOCK_DGRAM, 0); - if (fd_socket < 0) - err(-1, "test_syscalls:prep: socket"); - - if (cap_enter() < 0) - err(-1, "test_syscalls:prep: cap_enter"); - - - bzero(&sin, sizeof(sin)); - sin.sin_len = sizeof(sin); - sin.sin_family = AF_INET; + /* Enter capability mode. */ + REQUIRE(cap_enter()); /* - * Here begin the tests, sorted roughly alphabetically by system call - * name. + * System calls that are not permitted in capability mode. */ - fd = accept(fd_socket, NULL, NULL); - if (fd < 0) { - if (errno == ECAPMODE) - warnx("test_syscalls:accept"); - } else { - warnx("test_syscalls:accept succeeded"); - close(fd); - } + CHECK_CAPMODE(access, "/tmp/cap_capmode_access", F_OK); + CHECK_CAPMODE(acct, "/tmp/cap_capmode_acct"); + CHECK_CAPMODE(bind, PF_INET, NULL, 0); + CHECK_CAPMODE(chdir, "/tmp/cap_capmode_chdir"); + CHECK_CAPMODE(chflags, "/tmp/cap_capmode_chflags", UF_NODUMP); + CHECK_CAPMODE(chmod, "/tmp/cap_capmode_chmod", 0644); + CHECK_CAPMODE(chown, "/tmp/cap_capmode_chown", -1, -1); + CHECK_CAPMODE(chroot, "/tmp/cap_capmode_chroot"); + CHECK_CAPMODE(connect, PF_INET, NULL, 0); + CHECK_CAPMODE(creat, "/tmp/cap_capmode_creat", 0644); + CHECK_CAPMODE(fchdir, fd_dir); + CHECK_CAPMODE(getfsstat, &statfs, sizeof(statfs), MNT_NOWAIT); + CHECK_CAPMODE(link, "/tmp/foo", "/tmp/bar"); + CHECK_CAPMODE(lstat, "/tmp/cap_capmode_lstat", &sb); + CHECK_CAPMODE(mknod, "/tmp/capmode_mknod", 06440, 0); + CHECK_CAPMODE(mount, "procfs", "/not_mounted", 0, NULL); + CHECK_CAPMODE(open, "/dev/null", O_RDWR); + CHECK_CAPMODE(readlink, "/tmp/cap_capmode_readlink", NULL, 0); + CHECK_CAPMODE(revoke, "/tmp/cap_capmode_revoke"); + CHECK_CAPMODE(stat, "/tmp/cap_capmode_stat", &sb); + CHECK_CAPMODE(symlink, + "/tmp/cap_capmode_symlink_from", + "/tmp/cap_capmode_symlink_to"); + CHECK_CAPMODE(unlink, "/tmp/cap_capmode_unlink"); + CHECK_CAPMODE(unmount, "/not_mounted", 0); - if (access("/tmp/cap_test_syscalls_access", F_OK) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:access"); - } else - warnx("test_syscalls:access succeeded"); + /* + * System calls that are permitted in capability mode. + */ + CHECK_SYSCALL_SUCCEEDS(close, fd_close); + CHECK_SYSCALL_SUCCEEDS(dup, fd_file); + CHECK_SYSCALL_SUCCEEDS(fstat, fd_file, &sb); + CHECK_SYSCALL_SUCCEEDS(lseek, fd_file, SEEK_SET, 0); + CHECK_SYSCALL_SUCCEEDS(msync, &fd_file, 8192, MS_ASYNC); + CHECK_SYSCALL_SUCCEEDS(profil, NULL, 0, 0, 0); + CHECK_SYSCALL_SUCCEEDS(read, fd_file, &ch, sizeof(ch)); + CHECK_SYSCALL_SUCCEEDS(recvfrom, fd_socket, NULL, 0, 0, NULL, NULL); + CHECK_SYSCALL_SUCCEEDS(setuid, getuid()); + CHECK_SYSCALL_SUCCEEDS(write, fd_file, &ch, sizeof(ch)); - if (acct("/tmp/cap_test_syscalls_acct") < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:acct"); - } else - warnx("test_syscalls:acct succeeded"); + /* + * These calls will fail for lack of e.g. a proper name to send to, + * but they are allowed in capability mode, so errno != ECAPMODE. + */ + CHECK_NOT_CAPMODE(accept, fd_socket, NULL, NULL); + CHECK_NOT_CAPMODE(getpeername, fd_socket, NULL, NULL); + CHECK_NOT_CAPMODE(getsockname, fd_socket, NULL, NULL); + CHECK_NOT_CAPMODE(fchflags, fd_file, UF_NODUMP); + CHECK_NOT_CAPMODE(recvmsg, fd_socket, NULL, 0); + CHECK_NOT_CAPMODE(sendmsg, fd_socket, NULL, 0); + CHECK_NOT_CAPMODE(sendto, fd_socket, NULL, 0, 0, NULL, 0); - if (bind(PF_INET, (struct sockaddr *)&sin, sizeof(sin)) < 0) { - if (errno != ECAPMODE) - warn("test_syscall:bind"); - } else - warnx("test_syscall:bind succeeded"); - - if (chdir("/tmp/cap_test_syscalls_chdir") < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:chdir"); - } else - warnx("test_syscalls:chdir succeeded"); - - if (chflags("/tmp/cap_test_syscalls_chflags", UF_NODUMP) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:chflags"); - } else - warnx("test_syscalls:chflags succeeded"); - - if (chmod("/tmp/cap_test_syscalls_chmod", 0644) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:chmod"); - } else - warnx("test_syscalls:chmod succeeded"); - - if (chown("/tmp/cap_test_syscalls_chown", -1, -1) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:chown"); - } else - warnx("test_syscalls:chown succeeded"); - - if (chroot("/tmp/cap_test_syscalls_chroot") < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:chroot"); - } else - warnx("test_syscalls:chroot succeeded"); - - if (close(fd_close)) { - if (errno == ECAPMODE) - warnx("test_syscalls:close"); - else - warn("test_syscalls:close"); - } - - if (connect(PF_INET, (struct sockaddr *)&sin, sizeof(sin)) < 0) { - if (errno != ECAPMODE) - warn("test_syscall:connect"); - } else - warnx("test_syscall:connect succeeded"); - - fd = creat("/tmp/cap_test_syscalls_creat", 0644); - if (fd >= 0) { - warnx("test_syscalls:creat succeeded"); - close(fd); - } else if (errno != ECAPMODE) - warn("test_syscalls:creat"); - - fd = dup(fd_file); - if (fd < 0) { - if (errno == ECAPMODE) - warnx("test_syscalls:dup"); - } else - close(fd); - - if (fchdir(fd_dir) < 0) { - if (errno != ECAPMODE) - warn("test_syscall:fchdir"); - } else - warnx("test_syscalls:fchdir succeeded"); - - if (fchflags(fd_file, UF_NODUMP) < 0) { - if (errno == ECAPMODE) - warnx("test_syscall:fchflags"); - } + /* + * System calls which should be allowed in capability mode, but which + * don't return errors, and are thus difficult to check. + * + * We will try anyway, by checking errno. + */ + CHECK_SYSCALL_VOID_NOT_ECAPMODE(getegid); + CHECK_SYSCALL_VOID_NOT_ECAPMODE(geteuid); + CHECK_SYSCALL_VOID_NOT_ECAPMODE(getgid); + CHECK_SYSCALL_VOID_NOT_ECAPMODE(getpid); + CHECK_SYSCALL_VOID_NOT_ECAPMODE(getppid); + CHECK_SYSCALL_VOID_NOT_ECAPMODE(getuid); + /* + * Finally, tests for system calls that don't fit the pattern very well. + */ pid = fork(); if (pid >= 0) { if (pid == 0) { @@ -202,225 +161,40 @@ test_capmode(void) wpid = waitpid(pid, NULL, 0); if (wpid < 0) { if (errno != ECAPMODE) - warn("test_syscalls:waitpid"); + FAIL("capmode:waitpid"); } else - warnx("test_syscalls:waitpid succeeded"); + FAIL("capmode:waitpid succeeded"); } } else - warn("test_syscalls:fork"); - - if (fstat(fd_file, &sb) < 0) { - if (errno == ECAPMODE) - warnx("test_syscalls:fstat"); - } - - /* - * getegid() can't return an error but check for it anyway. - */ - errno = 0; - (void)getegid(); - if (errno == ECAPMODE) - warnx("test_syscalls:getegid"); - - /* - * geteuid() can't return an error but check for it anyway. - */ - errno = 0; - geteuid(); - if (errno == ECAPMODE) - warnx("test_syscalls:geteuid"); - - if (getfsstat(&statfs, sizeof(statfs), MNT_NOWAIT) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:getfsstat"); - } else - warnx("test_syscalls:getfsstat succeeded"); - - /* - * getgid() can't return an error but check for it anyway. - */ - errno = 0; - getgid(); - if (errno == ECAPMODE) - warnx("test_syscalls:getgid"); - - if (getpeername(fd_socket, NULL, NULL) < 0) { - if (errno == ECAPMODE) - warnx("test_syscalls:getpeername"); - } + FAIL("capmode:fork"); if (getlogin() == NULL) - warn("test_sycalls:getlogin %d", errno); - - /* - * getpid() can't return an error but check for it anyway. - */ - errno = 0; - (void)getpid(); - if (errno == ECAPMODE) - warnx("test_syscalls:getpid"); - - /* - * getppid() can't return an error but check for it anyway. - */ - errno = 0; - (void)getppid(); - if (errno == ECAPMODE) - warnx("test_syscalls:getppid"); + FAIL("test_sycalls:getlogin %d", errno); if (getsockname(fd_socket, NULL, NULL) < 0) { if (errno == ECAPMODE) - warnx("test_syscalls:getsockname"); + FAIL("capmode:getsockname"); } - /* - * getuid() can't return an error but check for it anyway. - */ - errno = 0; - (void)getuid(); - if (errno == ECAPMODE) - warnx("test_syscalls:getuid"); - /* XXXRW: ktrace */ - if (link("/tmp/foo", "/tmp/bar") < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:link"); - } else - warnx("test_syscalls:link succeeded"); - - ret = lseek(fd_file, SEEK_SET, 0); - if (ret < 0) { - if (errno == ECAPMODE) - warnx("test_syscalls:lseek"); - else - warn("test_syscalls:lseek"); - } - - if (lstat("/tmp/cap_test_syscalls_lstat", &sb) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:lstat"); - } else - warnx("test_syscalls:lstat succeeded"); - - if (mknod("/tmp/test_syscalls_mknod", 06440, 0) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:mknod"); - } else - warnx("test_syscalls:mknod succeeded"); - - /* - * mount() is a bit tricky but do our best. - */ - if (mount("procfs", "/not_mounted", 0, NULL) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:mount"); - } else - warnx("test_syscalls:mount succeeded"); - - if (msync(&fd_file, 8192, MS_ASYNC) < 0) { - if (errno == ECAPMODE) - warnx("test_syscalls:msync"); - } - - fd = open("/dev/null", O_RDWR); - if (fd >= 0) { - warnx("test_syscalls:open succeeded"); - close(fd); - } - if (pipe(fd2) == 0) { close(fd2[0]); close(fd2[1]); } else if (errno == ECAPMODE) - warnx("test_syscalls:pipe"); - - if (profil(NULL, 0, 0, 0) < 0) { - if (errno == ECAPMODE) - warnx("test_syscalls:profile"); - } + FAIL("capmode:pipe"); /* XXXRW: ptrace. */ - len = read(fd_file, &ch, sizeof(ch)); - if (len < 0 && errno == ECAPMODE) - warnx("test_syscalls:read"); - - if (readlink("/tmp/cap_test_syscalls_readlink", NULL, 0) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:readlink"); - } else - warnx("test_syscalls:readlink succeeded"); - - len = recvfrom(fd_socket, NULL, 0, 0, NULL, NULL); - if (len < 0 && errno == ECAPMODE) - warnx("test_syscalls:recvfrom"); - - len = recvmsg(fd_socket, NULL, 0); - if (len < 0 && errno == ECAPMODE) - warnx("test_syscalls:recvmsg"); - - if (revoke("/tmp/cap_test_syscalls_revoke") < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:revoke"); - } else - warnx("test_syscalls:revoke succeeded"); - - len = sendmsg(fd_socket, NULL, 0); - if (len < 0 && errno == ECAPMODE) - warnx("test_syscalls:sendmsg"); - - len = sendto(fd_socket, NULL, 0, 0, NULL, 0); - if (len < 0 && errno == ECAPMODE) - warn("test_syscalls:sendto(NULL)"); - - if (setuid(getuid()) < 0) { - if (errno == ECAPMODE) - warnx("test_syscalls:setuid"); - } - - if (stat("/tmp/cap_test_syscalls_stat", &sb) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:stat"); - } else - warnx("test_syscalls:stat succeeded"); - - if (symlink("/tmp/cap_test_syscalls_symlink_from", - "/tmp/cap_test_syscalls_symlink_to") < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:symlink"); - } else - warnx("test_syscalls:symlink succeeded"); - /* sysarch() is, by definition, architecture-dependent */ - if (ARCH_IS("i386") || ARCH_IS("amd64")) { - if (sysarch(I386_SET_IOPERM, &sysarch_arg) != -1) - warnx("test_syscalls:sysarch succeeded"); - else if (errno != ECAPMODE) - warn("test_syscalls:sysarch errno != ECAPMODE"); - - /* XXXJA: write a test for arm */ - } else { - warnx("test_syscalls:no sysarch() test for architecture '%s'", MACHINE); - } +#if defined (__amd64__) || defined (__i386__) + CHECK_CAPMODE(sysarch, I386_SET_IOPERM, &sysarch_arg); +#else + /* XXXJA: write a test for arm */ + FAIL("capmode:no sysarch() test for current architecture"); +#endif /* XXXRW: No error return from sync(2) to test. */ - if (unlink("/tmp/cap_test_syscalls_unlink") < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:unlink"); - } else - warnx("test_syscalls:unlink succeeded"); - - if (unmount("/not_mounted", 0) < 0) { - if (errno != ECAPMODE) - warn("test_syscalls:unmount"); - } else - warnx("test_syscalls:unmount succeeded"); - - len = write(fd_file, &ch, sizeof(ch)); - if (len < 0 && errno == ECAPMODE) - warnx("test_syscalls:write"); - - exit(0); + return (success); } diff --git a/tools/regression/security/cap_test/cap_test_sysctl.c b/tools/regression/security/cap_test/cap_test_sysctl.c index 4376eec30a2..5ec6dafe086 100644 --- a/tools/regression/security/cap_test/cap_test_sysctl.c +++ b/tools/regression/security/cap_test/cap_test_sysctl.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2008-2011 Robert N. M. Watson + * Copyright (c) 2011 Jonathan Anderson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,11 +36,11 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include -#include #include #include #include @@ -50,18 +51,17 @@ __FBSDID("$FreeBSD$"); * Certain sysctls are permitted in capability mode, but most are not. Test * for the ones that should be, and try one or two that shouldn't. */ -void +int test_sysctl(void) { - int error, i, oid[2]; + int i, oid[2]; + int success = PASSED; size_t len; oid[0] = CTL_KERN; oid[1] = KERN_OSRELDATE; len = sizeof(i); - error = sysctl(oid, 2, &i, &len, NULL, 0); - if (error) - warnx("capmode and kern.osreldate failed error %d", errno); + CHECK(sysctl(oid, 2, &i, &len, NULL, 0) == 0); - exit(0); + return (success); } From 63788cdff409380413917b735e0a0ff8b28dd3fc Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Thu, 4 Aug 2011 14:38:30 +0000 Subject: [PATCH 147/452] The release/pc98/mkisoimages.sh added as part of r221466 now also takes "-b" to indicate the creation of a bootable image. Approved by: re (kib) --- release/Makefile.sysinstall | 4 ---- 1 file changed, 4 deletions(-) diff --git a/release/Makefile.sysinstall b/release/Makefile.sysinstall index 71a0a573fc6..c59ea736ecf 100644 --- a/release/Makefile.sysinstall +++ b/release/Makefile.sysinstall @@ -349,12 +349,8 @@ EXTRAS+= cdrom.1 cdrom.2 cdrom.3 .if defined(MAKE_ISOS) EXTRAS+= iso.1 .endif -.if ${TARGET} == "pc98" -BOOTABLE="-G" -.else BOOTABLE="-b" .endif -.endif .if !defined(NODOC) DOCREL= doc.1 doc.2 From da7496721e66113b3b46435c67e245e7b5c53d65 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Thu, 4 Aug 2011 17:17:57 +0000 Subject: [PATCH 148/452] Flesh out the cap_test regression test. Add more regression testing, some of which is expected to fail until we commit more kernel implementation. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- tools/regression/security/cap_test/cap_test.t | 11 + .../security/cap_test/cap_test_capabilities.c | 260 ++++++++++++++++++ .../security/cap_test/cap_test_fcntl.c | 117 ++++++++ 3 files changed, 388 insertions(+) create mode 100644 tools/regression/security/cap_test/cap_test.t create mode 100644 tools/regression/security/cap_test/cap_test_capabilities.c create mode 100644 tools/regression/security/cap_test/cap_test_fcntl.c diff --git a/tools/regression/security/cap_test/cap_test.t b/tools/regression/security/cap_test/cap_test.t new file mode 100644 index 00000000000..8185161f702 --- /dev/null +++ b/tools/regression/security/cap_test/cap_test.t @@ -0,0 +1,11 @@ +#!/bin/sh +# +# $FreeBSD$ +# + +if test -z "${DIR}" ; then DIR=$( make -V .OBJDIR ); fi +if test -z "${DIR}" ; then DIR=$( dirname $0 ); fi + +make > /dev/null || exit 1 +$DIR/cap_test $* + diff --git a/tools/regression/security/cap_test/cap_test_capabilities.c b/tools/regression/security/cap_test/cap_test_capabilities.c new file mode 100644 index 00000000000..444bcbd17f4 --- /dev/null +++ b/tools/regression/security/cap_test/cap_test_capabilities.c @@ -0,0 +1,260 @@ +/*- + * Copyright (c) 2009-2011 Robert N. M. Watson + * Copyright (c) 2011 Jonathan Anderson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Test whether various operations on capabilities are properly masked for + * various object types. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "cap_test.h" + +#define SYSCALL_FAIL(syscall, message) \ + FAIL("%s:\t%s (rights 0x%jx)", #syscall, message, rights) + +/* + * Ensure that, if the capability had enough rights for the system call to + * pass, then it did. Otherwise, ensure that the errno is ENOTCAPABLE; + * capability restrictions should kick in before any other error logic. + */ +#define CHECK_RESULT(syscall, rights_needed, succeeded) do { \ + if ((rights & (rights_needed)) == (rights_needed)) { \ + if (!(succeeded)) \ + SYSCALL_FAIL(syscall, "failed"); \ + } else { \ + if (succeeded) \ + FAILX("%s:\tsucceeded when it shouldn't have" \ + " (rights 0x%jx)", #syscall, rights); \ + else if (errno != ENOTCAPABLE) \ + SYSCALL_FAIL(syscall, "errno != ENOTCAPABLE"); \ + } \ +} while (0) + +/* + * As above, but for the special mmap() case: unmap after successful mmap(). + */ +#define CHECK_MMAP_RESULT(rights_needed) do { \ + if ((rights & (rights_needed)) == (rights_needed)) { \ + if (p == MAP_FAILED) \ + SYSCALL_FAIL(mmap, "failed"); \ + else \ + (void)munmap(p, getpagesize()); \ + } else { \ + if (p != MAP_FAILED) { \ + FAILX("%s:\tsucceeded when it shouldn't have" \ + " (rights 0x%jx)", "mmap", rights); \ + (void)munmap(p, getpagesize()); \ + } else if (errno != ENOTCAPABLE) \ + SYSCALL_FAIL(syscall, "errno != ENOTCAPABLE"); \ + } \ +} while (0) + +/* + * Given a file descriptor, create a capability with specific rights and + * make sure only those rights work. +*/ +static int +try_file_ops(int fd, cap_rights_t rights) +{ + struct stat sb; + struct statfs sf; + int fd_cap, fd_capcap; + ssize_t ssize, ssize2; + off_t off; + void *p; + char ch; + int ret; + int success = PASSED; + + REQUIRE(fd_cap = cap_new(fd, rights)); + REQUIRE(fd_capcap = cap_new(fd_cap, rights)); + CHECK(fd_capcap != fd_cap); + + ssize = read(fd_cap, &ch, sizeof(ch)); + CHECK_RESULT(read, CAP_READ | CAP_SEEK, ssize >= 0); + + ssize = pread(fd_cap, &ch, sizeof(ch), 0); + ssize2 = pread(fd_cap, &ch, sizeof(ch), 0); + CHECK_RESULT(pread, CAP_READ, ssize >= 0); + CHECK(ssize == ssize2); + + ssize = write(fd_cap, &ch, sizeof(ch)); + CHECK_RESULT(write, CAP_WRITE | CAP_SEEK, ssize >= 0); + + ssize = pwrite(fd_cap, &ch, sizeof(ch), 0); + CHECK_RESULT(pwrite, CAP_WRITE, ssize >= 0); + + off = lseek(fd_cap, 0, SEEK_SET); + CHECK_RESULT(lseek, CAP_SEEK, off >= 0); + + ret = fchflags(fd_cap, UF_NODUMP); + CHECK_RESULT(fchflags, CAP_FCHFLAGS, ret == 0); + + ret = fstat(fd_cap, &sb); + CHECK_RESULT(fstat, CAP_FSTAT, ret == 0); + + p = mmap(NULL, getpagesize(), PROT_READ, MAP_SHARED, fd_cap, 0); + CHECK_MMAP_RESULT(CAP_MMAP | CAP_READ); + + p = mmap(NULL, getpagesize(), PROT_WRITE, MAP_SHARED, fd_cap, 0); + CHECK_MMAP_RESULT(CAP_MMAP | CAP_WRITE); + + p = mmap(NULL, getpagesize(), PROT_EXEC, MAP_SHARED, fd_cap, 0); + CHECK_MMAP_RESULT(CAP_MMAP | CAP_MAPEXEC); + + p = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, + fd_cap, 0); + CHECK_MMAP_RESULT(CAP_MMAP | CAP_READ | CAP_WRITE); + + p = mmap(NULL, getpagesize(), PROT_READ | PROT_EXEC, MAP_SHARED, + fd_cap, 0); + CHECK_MMAP_RESULT(CAP_MMAP | CAP_READ | CAP_MAPEXEC); + + p = mmap(NULL, getpagesize(), PROT_EXEC | PROT_WRITE, MAP_SHARED, + fd_cap, 0); + CHECK_MMAP_RESULT(CAP_MMAP | CAP_MAPEXEC | CAP_WRITE); + + p = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_SHARED, fd_cap, 0); + CHECK_MMAP_RESULT(CAP_MMAP | CAP_READ | CAP_WRITE | CAP_MAPEXEC); + + ret = fsync(fd_cap); + CHECK_RESULT(fsync, CAP_FSYNC, ret == 0); + + ret = fchown(fd_cap, -1, -1); + CHECK_RESULT(fchown, CAP_FCHOWN, ret == 0); + + ret = fchmod(fd_cap, 0644); + CHECK_RESULT(fchmod, CAP_FCHMOD, ret == 0); + + /* XXX flock */ + + ret = ftruncate(fd_cap, 0); + CHECK_RESULT(ftruncate, CAP_FTRUNCATE, ret == 0); + + ret = fstatfs(fd_cap, &sf); + CHECK_RESULT(fstatfs, CAP_FSTATFS, ret == 0); + + ret = fpathconf(fd_cap, _PC_NAME_MAX); + CHECK_RESULT(fpathconf, CAP_FPATHCONF, ret >= 0); + + ret = futimes(fd_cap, NULL); + CHECK_RESULT(futimes, CAP_FUTIMES, ret == 0); + + /* XXX select / poll / kqueue */ + + close (fd_cap); + return (success); +} + +#define TRY(fd, rights) \ +do { \ + if (success == PASSED) \ + success = try_file_ops(fd, rights); \ + else \ + /* We've already failed, but try the test anyway. */ \ + try_file_ops(fd, rights); \ +} while (0) + +int +test_capabilities(void) +{ + int fd; + int success = PASSED; + + fd = open("/tmp/cap_test", O_RDWR | O_CREAT, 0644); + if (fd < 0) + err(-1, "open"); + + if (cap_enter() < 0) + err(-1, "cap_enter"); + + /* XXX: Really want to try all combinations. */ + TRY(fd, CAP_READ); + TRY(fd, CAP_READ | CAP_SEEK); + TRY(fd, CAP_WRITE); + TRY(fd, CAP_WRITE | CAP_SEEK); + TRY(fd, CAP_READ | CAP_WRITE); + TRY(fd, CAP_READ | CAP_WRITE | CAP_SEEK); + TRY(fd, CAP_SEEK); + TRY(fd, CAP_FCHFLAGS); + TRY(fd, CAP_IOCTL); + TRY(fd, CAP_FSTAT); + TRY(fd, CAP_MMAP); + TRY(fd, CAP_MMAP | CAP_READ); + TRY(fd, CAP_MMAP | CAP_WRITE); + TRY(fd, CAP_MMAP | CAP_MAPEXEC); + TRY(fd, CAP_MMAP | CAP_READ | CAP_WRITE); + TRY(fd, CAP_MMAP | CAP_READ | CAP_MAPEXEC); + TRY(fd, CAP_MMAP | CAP_MAPEXEC | CAP_WRITE); + TRY(fd, CAP_MMAP | CAP_READ | CAP_WRITE | CAP_MAPEXEC); + TRY(fd, CAP_FCNTL); + TRY(fd, CAP_EVENT); + TRY(fd, CAP_KEVENT); + TRY(fd, CAP_FSYNC); + TRY(fd, CAP_FCHOWN); + TRY(fd, CAP_FCHMOD); + TRY(fd, CAP_FTRUNCATE); + TRY(fd, CAP_FLOCK); + TRY(fd, CAP_FSTATFS); + TRY(fd, CAP_FPATHCONF); + TRY(fd, CAP_FUTIMES); + TRY(fd, CAP_ACL_GET); + TRY(fd, CAP_ACL_SET); + TRY(fd, CAP_ACL_DELETE); + TRY(fd, CAP_ACL_CHECK); + TRY(fd, CAP_EXTATTR_GET); + TRY(fd, CAP_EXTATTR_SET); + TRY(fd, CAP_EXTATTR_DELETE); + TRY(fd, CAP_EXTATTR_LIST); + TRY(fd, CAP_MAC_GET); + TRY(fd, CAP_MAC_SET); + + /* + * Socket-specific. + */ + TRY(fd, CAP_GETPEERNAME); + TRY(fd, CAP_GETSOCKNAME); + TRY(fd, CAP_ACCEPT); + + return (success); +} diff --git a/tools/regression/security/cap_test/cap_test_fcntl.c b/tools/regression/security/cap_test/cap_test_fcntl.c new file mode 100644 index 00000000000..1d12ebdfdb4 --- /dev/null +++ b/tools/regression/security/cap_test/cap_test_fcntl.c @@ -0,0 +1,117 @@ +/*- + * Copyright (c) 2009-2011 Robert N. M. Watson + * Copyright (c) 2011 Jonathan Anderson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Test that fcntl works in capability mode. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "cap_test.h" + +/* A filename->descriptor mapping. */ +struct fd { + char *f_name; + int f_fd; +}; + +/* + * Ensure that fcntl() works consistently for both regular file descriptors and + * capability-wrapped ones. + */ +int +test_fcntl(void) +{ + int success = PASSED; + cap_rights_t rights = CAP_READ | CAP_FCNTL; + + /* + * Open some files of different types, and wrap them in capabilities. + */ + struct fd files[] = { + { "file", open("/etc/passwd", O_RDONLY) }, + { "socket", socket(PF_LOCAL, SOCK_STREAM, 0) }, + { "SHM", shm_open(SHM_ANON, O_RDWR, 0600) }, + }; + REQUIRE(files[0].f_fd); + REQUIRE(files[1].f_fd); + REQUIRE(files[2].f_fd); + + struct fd caps[] = { + { "file cap", cap_new(files[0].f_fd, rights) }, + { "socket cap", cap_new(files[1].f_fd, rights) }, + { "SHM cap", cap_new(files[2].f_fd, rights) }, + }; + REQUIRE(caps[0].f_fd); + REQUIRE(caps[1].f_fd); + REQUIRE(caps[2].f_fd); + + struct fd all[] = { + files[0], caps[0], + files[1], caps[1], + files[2], caps[2], + }; + const size_t len = sizeof(all) / sizeof(struct fd); + + REQUIRE(cap_enter()); + + /* + * Ensure that we can fcntl() all the files that we opened above. + */ + for (size_t i = 0; i < len; i++) + { + struct fd f = all[i]; + int cap; + + CHECK_SYSCALL_SUCCEEDS(fcntl, f.f_fd, F_GETFL, 0); + REQUIRE(cap = cap_new(f.f_fd, CAP_READ)); + if (fcntl(f.f_fd, F_GETFL, 0) == -1) + FAIL("Error calling fcntl('%s', F_GETFL)", f.f_name); + else + CHECK_NOTCAPABLE(fcntl, cap, F_GETFL, 0); + } + + return (success); +} + From 5388625fff217e2fd4cf56cec838c3877bec4f3a Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Fri, 5 Aug 2011 11:12:50 +0000 Subject: [PATCH 149/452] The change in r224615 didn't take into account that vn_fullpath_global() doesn't operate on locked vnode. This could cause a panic. Fix by unlocking vnode, re-locking afterwards and verifying that it wasn't renamed or deleted. To improve readability and reduce code size, move code to a new static function vfs_verify_global_path(). In addition, fix missing giant unlock in unmount(). Reported by: David Wolfskill Reviewed by: kib Approved by: re (bz) MFC after: 2 weeks --- sys/kern/vfs_mount.c | 99 ++++++++++++++++++++++++++++++-------------- 1 file changed, 68 insertions(+), 31 deletions(-) diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index d601c568652..8f7b18f5ccd 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -361,6 +361,60 @@ vfs_mergeopts(struct vfsoptlist *toopts, struct vfsoptlist *oldopts) vfs_sanitizeopts(toopts); } +/* + * Verify vnode's global path + */ +static int +vfs_verify_global_path(struct thread *td, struct vnode *vp, char *fspath) +{ + struct nameidata nd; + struct vnode *vp1; + char *rpath, *fbuf; + int error; + + ASSERT_VOP_ELOCKED(vp, __func__); + + /* Construct global filesystem path from vp. */ + VOP_UNLOCK(vp, 0); + error = vn_fullpath_global(td, vp, &rpath, &fbuf); + if (error != 0) { + vrele(vp); + return (error); + } + if (strlen(rpath) >= MNAMELEN) { + vrele(vp); + error = ENAMETOOLONG; + goto out; + } + + /* + * Re-lookup the vnode by path. As a side effect, the vnode is + * relocked. If vnode was renamed, return ENOENT. + */ + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, + UIO_SYSSPACE, fspath, td); + error = namei(&nd); + if (error != 0) { + vrele(vp); + goto out; + } + if (NDHASGIANT(&nd)) + mtx_unlock(&Giant); + NDFREE(&nd, NDF_ONLY_PNBUF); + vp1 = nd.ni_vp; + vrele(vp); + if (vp1 != vp) { + vput(vp1); + error = ENOENT; + goto out; + } + + strlcpy(fspath,rpath,MNAMELEN); +out: + free(fbuf, M_TEMP); + return (error); +} + /* * Mount a filesystem. */ @@ -745,6 +799,7 @@ static int vfs_domount_first( struct thread *td, /* Calling thread. */ struct vfsconf *vfsp, /* File system type. */ + char *fspath, /* Mount path. */ struct vnode *vp, /* Vnode to be covered. */ int fsflags, /* Flags common to all filesystems. */ struct vfsoptlist **optlist /* Options local to the filesystem. */ @@ -753,25 +808,12 @@ vfs_domount_first( struct vattr va; struct mount *mp; struct vnode *newdp; - char *fspath, *fbuf; int error; mtx_assert(&Giant, MA_OWNED); ASSERT_VOP_ELOCKED(vp, __func__); KASSERT((fsflags & MNT_UPDATE) == 0, ("MNT_UPDATE shouldn't be here")); - /* Construct global filesystem path from vp. */ - error = vn_fullpath_global(td, vp, &fspath, &fbuf); - if (error != 0) { - vput(vp); - return (error); - } - if (strlen(fspath) >= MNAMELEN) { - vput(vp); - free(fbuf, M_TEMP); - return (ENAMETOOLONG); - } - /* * If the user is not root, ensure that they own the directory * onto which we are attempting to mount. @@ -793,14 +835,12 @@ vfs_domount_first( } if (error != 0) { vput(vp); - free(fbuf, M_TEMP); return (error); } VOP_UNLOCK(vp, 0); /* Allocate and initialize the filesystem. */ mp = vfs_mount_alloc(vp, vfsp, fspath, td->td_ucred); - free(fbuf, M_TEMP); /* XXXMAC: pass to vfs_mount_alloc? */ mp->mnt_optnew = *optlist; /* Set the mount level flags. */ @@ -1083,15 +1123,15 @@ vfs_domount( mtx_lock(&Giant); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; - if ((fsflags & MNT_UPDATE) == 0) - error = vfs_domount_first(td, vfsp, vp, fsflags, optlist); - else + if ((fsflags & MNT_UPDATE) == 0) { + error = vfs_verify_global_path(td, vp, fspath); + if (error == 0) + error = vfs_domount_first(td, vfsp, fspath, vp, + fsflags, optlist); + } else error = vfs_domount_update(td, vp, fsflags, optlist); mtx_unlock(&Giant); - ASSERT_VI_UNLOCKED(vp, __func__); - ASSERT_VOP_UNLOCKED(vp, __func__); - return (error); } @@ -1118,7 +1158,7 @@ unmount(td, uap) { struct mount *mp; struct nameidata nd; - char *pathbuf, *rpathbuf, *fbuf; + char *pathbuf; int error, id0, id1; AUDIT_ARG_VALUE(uap->flags); @@ -1163,16 +1203,13 @@ unmount(td, uap) FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, UIO_SYSSPACE, pathbuf, td); if (namei(&nd) == 0) { + if (NDHASGIANT(&nd)) + mtx_unlock(&Giant); NDFREE(&nd, NDF_ONLY_PNBUF); - if (vn_fullpath_global(td, nd.ni_vp, &rpathbuf, - &fbuf) == 0) { - if (strlen(rpathbuf) < MNAMELEN) { - strlcpy(pathbuf, rpathbuf, - MNAMELEN); - } - free(fbuf, M_TEMP); - } - vput(nd.ni_vp); + error = vfs_verify_global_path(td, nd.ni_vp, + pathbuf); + if (error == 0) + vput(nd.ni_vp); } } mtx_lock(&mountlist_mtx); From f58d163a2c2c1e35f1b10f0e15f8107509f84280 Mon Sep 17 00:00:00 2001 From: Ollivier Robert Date: Fri, 5 Aug 2011 15:02:17 +0000 Subject: [PATCH 150/452] Add back ftp4, a new machine has taken its place. ftp2 and ftp8 are both IPv6 capable mirrors. cvsup4/ftp4 have already been added to the handbook. Reviewed by: nathanw Approved by: re (kib) --- usr.sbin/bsdinstall/scripts/mirrorselect | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/usr.sbin/bsdinstall/scripts/mirrorselect b/usr.sbin/bsdinstall/scripts/mirrorselect index 79a23bf74fd..9a83b8a8361 100755 --- a/usr.sbin/bsdinstall/scripts/mirrorselect +++ b/usr.sbin/bsdinstall/scripts/mirrorselect @@ -84,11 +84,12 @@ MIRROR=`dialog --backtitle "FreeBSD Installer" \ ftp://ftp.ee.freebsd.org "Estonia"\ ftp://ftp.fi.freebsd.org "Finland"\ ftp://ftp.fr.freebsd.org "France"\ - ftp://ftp2.fr.freebsd.org "France #2"\ + ftp://ftp2.fr.freebsd.org "IPv6 France #2"\ ftp://ftp3.fr.freebsd.org "France #3"\ + ftp://ftp4.fr.freebsd.org "France #4"\ ftp://ftp5.fr.freebsd.org "France #5"\ ftp://ftp6.fr.freebsd.org "France #6"\ - ftp://ftp8.fr.freebsd.org "France #8"\ + ftp://ftp8.fr.freebsd.org "IPv6 France #8"\ ftp://ftp.de.freebsd.org "Germany"\ ftp://ftp2.de.freebsd.org "Germany #2"\ ftp://ftp3.de.freebsd.org "Germany #3"\ From 72baa018d09335a834776a62ad3b040f1395d397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulrich=20Sp=C3=B6rlein?= Date: Fri, 5 Aug 2011 15:07:28 +0000 Subject: [PATCH 151/452] For POLA reasons, disable SGR sequences in catpages. See r222647 for a similar change to bsd.doc.mk after SGR was generally turned on in groff. Suggested by: ru Approved by: re (kib) --- usr.bin/catman/catman.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.bin/catman/catman.c b/usr.bin/catman/catman.c index b79c56217e0..0bb6621aeea 100644 --- a/usr.bin/catman/catman.c +++ b/usr.bin/catman/catman.c @@ -432,7 +432,7 @@ process_page(char *mandir, char *src, char *cat, enum Ziptype zipped) } snprintf(tmp_file, sizeof tmp_file, "%s.tmp", cat); snprintf(cmd, sizeof cmd, - "%scat %s | tbl | nroff -T%s -man | %s > %s.tmp", + "%scat %s | tbl | nroff -c -T%s -man | %s > %s.tmp", zipped == BZIP ? BZ2CAT_CMD : zipped == GZIP ? GZCAT_CMD : "", src, nroff_device, zipped == BZIP ? BZ2_CMD : zipped == GZIP ? GZ_CMD : "cat", From b41afd430db191c1d3f932fe9b8d4d152dc725d8 Mon Sep 17 00:00:00 2001 From: Ed Schouten Date: Fri, 5 Aug 2011 17:33:12 +0000 Subject: [PATCH 152/452] Remove NIS entries from /etc/nsswitch.conf for WITHOUT_NIS. We already modify various configuration files in /etc based on build configuration. This is not done for nsswitch.conf right now when setting WITHOUT_NIS. This breaks various utilities, including crond, that depend on working databases. Approved by: re (kib) MFC after: 1 month --- etc/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/etc/Makefile b/etc/Makefile index e7fa2d55380..bfb5282dcb7 100644 --- a/etc/Makefile +++ b/etc/Makefile @@ -256,6 +256,10 @@ distribution: ${DESTDIR}/boot/device.hints .endif .endif +.if ${MK_NIS} == "no" + sed -i "" -e '/_compat:/d' -e 's/compat/files/' \ + ${DESTDIR}/etc/nsswitch.conf +.endif distrib-dirs: mtree -eU ${MTREE_FOLLOWS_SYMLINKS} -f ${.CURDIR}/mtree/BSD.root.dist -p ${DESTDIR}/ From b7f2d66a795bb738b55e90aa6b242fcab6fcd888 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Fri, 5 Aug 2011 17:43:11 +0000 Subject: [PATCH 153/452] Expect fchflags(2) to fail with EOPNOTSUPP on NFS. Even if we have CAP_FCHFLAGS, fchflags(2) fails on NFS. This is normal and expected, so don't fail the test because of it. Note that, whether or not we are on NFS, fchflags(2) should always fail with ENOTCAPABLE if we are using a capability that does not have the CAP_FCHFLAGS right. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- .../security/cap_test/cap_test_capabilities.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tools/regression/security/cap_test/cap_test_capabilities.c b/tools/regression/security/cap_test/cap_test_capabilities.c index 444bcbd17f4..818698db237 100644 --- a/tools/regression/security/cap_test/cap_test_capabilities.c +++ b/tools/regression/security/cap_test/cap_test_capabilities.c @@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include "cap_test.h" @@ -102,9 +103,13 @@ try_file_ops(int fd, cap_rights_t rights) off_t off; void *p; char ch; - int ret; + int ret, is_nfs; int success = PASSED; + REQUIRE(fstatfs(fd, &sf)); + is_nfs = (strncmp("nfs", sf.f_fstypename, sizeof(sf.f_fstypename)) + == 0); + REQUIRE(fd_cap = cap_new(fd, rights)); REQUIRE(fd_capcap = cap_new(fd_cap, rights)); CHECK(fd_capcap != fd_cap); @@ -126,8 +131,12 @@ try_file_ops(int fd, cap_rights_t rights) off = lseek(fd_cap, 0, SEEK_SET); CHECK_RESULT(lseek, CAP_SEEK, off >= 0); + /* + * Note: this is not expected to work over NFS. + */ ret = fchflags(fd_cap, UF_NODUMP); - CHECK_RESULT(fchflags, CAP_FCHFLAGS, ret == 0); + CHECK_RESULT(fchflags, CAP_FCHFLAGS, + (ret == 0) || (is_nfs && (errno == EOPNOTSUPP))); ret = fstat(fd_cap, &sb); CHECK_RESULT(fstat, CAP_FSTAT, ret == 0); From 841fed3aa3d75026a289ca8d2298c3e60e282ef9 Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Fri, 5 Aug 2011 22:54:42 +0000 Subject: [PATCH 154/452] Make octeon_ap_boot 64 bits to handle MAXCPU up to 64. Better construction of CPU mask in platform_cpu_mask(). Release cores still in reset when platform_start_ap() is called. Reviewed by: imp, marcel Obtained from: Juniper Networks, Inc Author: Andrew Duane Approved by: re (kib) --- sys/mips/cavium/asm_octeon.S | 4 ++-- sys/mips/cavium/octeon_mp.c | 34 ++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/sys/mips/cavium/asm_octeon.S b/sys/mips/cavium/asm_octeon.S index 94ac875a199..1ef50833489 100644 --- a/sys/mips/cavium/asm_octeon.S +++ b/sys/mips/cavium/asm_octeon.S @@ -50,12 +50,12 @@ LEAF(octeon_ap_wait) jal platform_processor_id nop -1: ll t0, octeon_ap_boot +1: lld t0, octeon_ap_boot bne v0, t0, 1b nop move t0, zero - sc t0, octeon_ap_boot + scd t0, octeon_ap_boot beqz t0, 1b nop diff --git a/sys/mips/cavium/octeon_mp.c b/sys/mips/cavium/octeon_mp.c index efddee86ae0..2bc268e9506 100644 --- a/sys/mips/cavium/octeon_mp.c +++ b/sys/mips/cavium/octeon_mp.c @@ -46,7 +46,8 @@ __FBSDID("$FreeBSD$"); /* XXX */ extern cvmx_bootinfo_t *octeon_bootinfo; -unsigned octeon_ap_boot = ~0; +/* NOTE: this 64-bit mask (and many others) limits MAXCPU to 64 */ +uint64_t octeon_ap_boot = ~0ULL; void platform_ipi_send(int cpuid) @@ -105,15 +106,13 @@ platform_init_ap(int cpuid) void platform_cpu_mask(cpuset_t *mask) { + uint64_t core_mask = octeon_bootinfo->core_mask; + uint64_t i, m; CPU_ZERO(mask); - - /* - * XXX: hack in order to simplify CPU set building, assuming that - * core_mask is 32-bits. - */ - memcpy(mask, &octeon_bootinfo->core_mask, - sizeof(octeon_bootinfo->core_mask)); + for (i = 0, m = 1 ; i < MAXCPU; i++, m <<= 1) + if (core_mask & m) + CPU_SET(i, mask); } struct cpu_group * @@ -125,11 +124,26 @@ platform_smp_topo(void) int platform_start_ap(int cpuid) { - if (atomic_cmpset_32(&octeon_ap_boot, ~0, cpuid) == 0) + uint64_t cores_in_reset; + + /* + * Release the core if it is in reset, and let it rev up a bit. + * The real synchronization happens below via octeon_ap_boot. + */ + cores_in_reset = cvmx_read_csr(CVMX_CIU_PP_RST); + if (cores_in_reset & (1ULL << cpuid)) { + if (bootverbose) + printf ("AP #%d still in reset\n", cpuid); + cores_in_reset &= ~(1ULL << cpuid); + cvmx_write_csr(CVMX_CIU_PP_RST, (uint64_t)(cores_in_reset)); + DELAY(2000); /* Give it a moment to start */ + } + + if (atomic_cmpset_64(&octeon_ap_boot, ~0, cpuid) == 0) return (-1); for (;;) { DELAY(1000); - if (atomic_cmpset_32(&octeon_ap_boot, 0, ~0) != 0) + if (atomic_cmpset_64(&octeon_ap_boot, 0, ~0) != 0) return (0); printf("Waiting for cpu%d to start\n", cpuid); } From 444b037cd29a43d0da561c8891acf7d3fabcbfb6 Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Fri, 5 Aug 2011 23:05:46 +0000 Subject: [PATCH 155/452] Remove stray semicolon in pmap_kextract() that turned the conditional "return (0)" into an unconditional one and as such broke PBVM address queries -- such as during kernel core dumps. Approved by: re (blanket) --- sys/ia64/ia64/pmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index 0e34f36ccac..6301b704e09 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -1235,7 +1235,7 @@ pmap_kextract(vm_offset_t va) } /* PBVM page table. */ - if (va >= IA64_PBVM_PGTBL + bootinfo->bi_pbvm_pgtblsz); + if (va >= IA64_PBVM_PGTBL + bootinfo->bi_pbvm_pgtblsz) return (0); if (va >= IA64_PBVM_PGTBL) return (va - IA64_PBVM_PGTBL) + bootinfo->bi_pbvm_pgtbl; From 1af18668502a609a37ce2d4472d6635f5f9b916a Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Fri, 5 Aug 2011 23:10:47 +0000 Subject: [PATCH 156/452] Follow-up commit: refactor pmap_kextract() to make it easier to catch and debug issues like the one fixed in the previous commit: Replace all return statements with goto statements so that we end up at a single place with a value for the physical address. Print a message for all unknown KVA addresses. Approved by: re (blanket) --- sys/ia64/ia64/pmap.c | 55 ++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index 6301b704e09..e10c6cf0bfd 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -1217,43 +1217,54 @@ pmap_kextract(vm_offset_t va) { struct ia64_lpte *pte; uint64_t *pbvm_pgtbl; + vm_paddr_t pa; u_int idx; KASSERT(va >= VM_MAXUSER_ADDRESS, ("Must be kernel VA")); /* Regions 6 and 7 are direct mapped. */ - if (va >= IA64_RR_BASE(6)) - return (IA64_RR_MASK(va)); - - /* Bail out if the virtual address is beyond our limits. */ - if (va >= kernel_vm_end) - return (0); - - if (va >= VM_MIN_KERNEL_ADDRESS) { - pte = pmap_find_kpte(va); - return (pmap_present(pte) ? pmap_ppn(pte)|(va&PAGE_MASK) : 0); + if (va >= IA64_RR_BASE(6)) { + pa = IA64_RR_MASK(va); + goto out; } - /* PBVM page table. */ - if (va >= IA64_PBVM_PGTBL + bootinfo->bi_pbvm_pgtblsz) - return (0); - if (va >= IA64_PBVM_PGTBL) - return (va - IA64_PBVM_PGTBL) + bootinfo->bi_pbvm_pgtbl; + /* Region 5 is our KVA. Bail out if the VA is beyond our limits. */ + if (va >= kernel_vm_end) + goto err_out; + if (va >= VM_MIN_KERNEL_ADDRESS) { + pte = pmap_find_kpte(va); + pa = pmap_present(pte) ? pmap_ppn(pte) | (va & PAGE_MASK) : 0; + goto out; + } - /* PBVM. */ + /* The PBVM page table. */ + if (va >= IA64_PBVM_PGTBL + bootinfo->bi_pbvm_pgtblsz) + goto err_out; + if (va >= IA64_PBVM_PGTBL) { + pa = (va - IA64_PBVM_PGTBL) + bootinfo->bi_pbvm_pgtbl; + goto out; + } + + /* The PBVM itself. */ if (va >= IA64_PBVM_BASE) { pbvm_pgtbl = (void *)IA64_PBVM_PGTBL; idx = (va - IA64_PBVM_BASE) >> IA64_PBVM_PAGE_SHIFT; if (idx >= (bootinfo->bi_pbvm_pgtblsz >> 3)) - return (0); + goto err_out; if ((pbvm_pgtbl[idx] & PTE_PRESENT) == 0) - return (0); - return ((pbvm_pgtbl[idx] & PTE_PPN_MASK) + - (va & IA64_PBVM_PAGE_MASK)); + goto err_out; + pa = (pbvm_pgtbl[idx] & PTE_PPN_MASK) + + (va & IA64_PBVM_PAGE_MASK); + goto out; } - printf("XXX: %s: va=%#lx\n", __func__, va); - return (0); + err_out: + printf("XXX: %s: va=%#lx is invalid\n", __func__, va); + pa = 0; + /* FALLTHROUGH */ + + out: + return (pa); } /* From 3b6ecbbdf111678269d948f18f61c97f271be0bd Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Sat, 6 Aug 2011 03:40:33 +0000 Subject: [PATCH 157/452] Fix kernel core dumps now that the kernel is using PBVM. The basic problem to solve is that we don't have a fixed mapping from kernel text to physical address so that libkvm can bootstrap itself. We solve this by passing the physical address of the bootinfo structure to the consumer as the entry point of the core file. This way, libkvm can extract the PBVM page table information and locate the kernel in the core file. We also need to dump memory chunks of type loader data, because those hold the kernel and the PBVM page table (among other things). Approved by: re (blanket) --- sys/ia64/ia64/dump_machdep.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sys/ia64/ia64/dump_machdep.c b/sys/ia64/ia64/dump_machdep.c index ae82c360c58..734acc76e43 100644 --- a/sys/ia64/ia64/dump_machdep.c +++ b/sys/ia64/ia64/dump_machdep.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #endif #include #include +#include #include #include #include @@ -191,7 +192,8 @@ foreach_chunk(callback_t cb, void *arg) seqnr = 0; mdp = efi_md_first(); while (mdp != NULL) { - if (mdp->md_type == EFI_MD_TYPE_FREE) { + if (mdp->md_type == EFI_MD_TYPE_FREE || + mdp->md_type == EFI_MD_TYPE_DATA) { error = (*cb)(mdp, seqnr++, arg); if (error) return (-error); @@ -225,6 +227,7 @@ dumpsys(struct dumperinfo *di) ehdr.e_ident[EI_OSABI] = ELFOSABI_STANDALONE; /* XXX big picture? */ ehdr.e_type = ET_CORE; ehdr.e_machine = EM_IA_64; + ehdr.e_entry = ia64_tpa((uintptr_t)bootinfo); ehdr.e_phoff = sizeof(ehdr); ehdr.e_flags = EF_IA_64_ABSOLUTE; /* XXX misuse? */ ehdr.e_ehsize = sizeof(ehdr); From 368397e8270292ea452c94570c4dfcfa2022eee6 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Sat, 6 Aug 2011 09:11:30 +0000 Subject: [PATCH 158/452] Fix a silly typo on my part. Approved by: re (hrs) --- usr.sbin/service/service.8 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.sbin/service/service.8 b/usr.sbin/service/service.8 index 577af9f3fba..10f2e8f608b 100644 --- a/usr.sbin/service/service.8 +++ b/usr.sbin/service/service.8 @@ -123,7 +123,7 @@ for the names of the rc.d scripts: .Sh HISTORY The .Nm -manual page service first appeared in +utility first appeared in .Fx 7.3 . .Sh AUTHORS This From 7fab6043a085b9744db932f23a619a0cfc1dbb69 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Sat, 6 Aug 2011 09:13:09 +0000 Subject: [PATCH 159/452] Gavin documented these alternate options in good faith in r222751 based on the patch in the PR, however he was unaware that they were undocumented intentionally. This patch moves the information about these alternates into a comment which also explains why they are undocumented. Approved by: re (hrs) --- sbin/rcorder/rcorder.8 | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/sbin/rcorder/rcorder.8 b/sbin/rcorder/rcorder.8 index a47f01306c3..060f4ecb479 100644 --- a/sbin/rcorder/rcorder.8 +++ b/sbin/rcorder/rcorder.8 @@ -31,7 +31,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 6, 2011 +.Dd August 5, 2011 .Dt RCORDER 8 .Os .Sh NAME @@ -89,12 +89,9 @@ and lines may appear, but all such lines must appear in a sequence without any intervening lines, as once a line that does not follow the format is reached, parsing stops. -Note that for historical reasons, -.Dq Li REQUIRES , -.Dq Li PROVIDES , -and -.Dq Li KEYWORDS -are also accepted in addition to the above. +.\" Note that for historical reasons REQUIRES, PROVIDES, and KEYWORDS +.\" are also accepted in addition to the above, but not documented so +.\" that they can be deprecated at some point in the future. .Pp The options are as follows: .Bl -tag -width indent From c2aedca43bd26109a931f9f920bc2273b9cac7e1 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Sat, 6 Aug 2011 09:16:53 +0000 Subject: [PATCH 160/452] Rather than edit the nsswitch.conf file based on ${MK_NIS} == "no" comment out the NIS _compat options by default, but leave them in the file for the convenience of users who want to enable it. Update the comment in the file accordingly. Reviewed by: ed Approved by: re (hrs) --- etc/Makefile | 4 ---- etc/nsswitch.conf | 22 +++++++++++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/etc/Makefile b/etc/Makefile index bfb5282dcb7..e7fa2d55380 100644 --- a/etc/Makefile +++ b/etc/Makefile @@ -256,10 +256,6 @@ distribution: ${DESTDIR}/boot/device.hints .endif .endif -.if ${MK_NIS} == "no" - sed -i "" -e '/_compat:/d' -e 's/compat/files/' \ - ${DESTDIR}/etc/nsswitch.conf -.endif distrib-dirs: mtree -eU ${MTREE_FOLLOWS_SYMLINKS} -f ${.CURDIR}/mtree/BSD.root.dist -p ${DESTDIR}/ diff --git a/etc/nsswitch.conf b/etc/nsswitch.conf index c95b9a4e01c..ab27fb9fde9 100644 --- a/etc/nsswitch.conf +++ b/etc/nsswitch.conf @@ -1,15 +1,23 @@ # -# nsswitch.conf(5) - name service switch configuration file # $FreeBSD$ # -group: compat -group_compat: nis +# To enable NIS the commented entries should replace their uncommented +# equivalents. See nsswitch.conf(5) for more information. +# +group: files +#group_compat: nis +#group: compat + +passwd: files +#passwd_compat: nis +#passwd: compat + +services: files +#services_compat: nis +#services: compat + hosts: files dns networks: files -passwd: compat -passwd_compat: nis shells: files -services: compat -services_compat: nis protocols: files rpc: files From d69bc9bcbec83cd7d7d7b6d678df5265523791a0 Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Sat, 6 Aug 2011 15:59:54 +0000 Subject: [PATCH 161/452] Add support for PBVM addresses. In a nutshell this means: o get the physical address and size of the PBVM page table. This can be found in the bootinfo structure, of which the physical address is recorded as the ELF entry point. o translate region 4 virtual addresses to physical addresses using the PBVM page table. In _kvm_kvatop() make the distinction between physical address and core file offset a little clearer to avoid confusion. To further enhance readability, always store the translated address into pa so that it's obvious how the translation from va to pa happened. Approved by: re (blanket) --- lib/libkvm/kvm_ia64.c | 88 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 81 insertions(+), 7 deletions(-) diff --git a/lib/libkvm/kvm_ia64.c b/lib/libkvm/kvm_ia64.c index 04b3c215005..74e2b80f547 100644 --- a/lib/libkvm/kvm_ia64.c +++ b/lib/libkvm/kvm_ia64.c @@ -33,6 +33,7 @@ #include #include +#include #include #include @@ -51,11 +52,16 @@ #define KPTE_DIR0_INDEX(va,ps) ((((va)/(ps)) / NKPTEPG(ps)) / NKPTEDIR(ps)) #define KPTE_DIR1_INDEX(va,ps) ((((va)/(ps)) / NKPTEPG(ps)) % NKPTEDIR(ps)) +#define PBVM_BASE 0x9ffc000000000000UL +#define PBVM_PGSZ (64 * 1024) + struct vmstate { void *mmapbase; size_t mmapsize; size_t pagesize; u_long kptdir; + u_long *pbvm_pgtbl; + u_int pbvm_pgtblsz; }; /* @@ -110,11 +116,28 @@ _kvm_pa2off(kvm_t *kd, uint64_t pa, off_t *ofs, size_t pgsz) return (pgsz - ((size_t)pa & (pgsz - 1))); } +static ssize_t +_kvm_read_phys(kvm_t *kd, uint64_t pa, void *buf, size_t bufsz) +{ + off_t ofs; + size_t sz; + + sz = _kvm_pa2off(kd, pa, &ofs, 0); + if (sz < bufsz) + return ((ssize_t)sz); + + if (lseek(kd->pmfd, ofs, 0) == -1) + return (-1); + return (read(kd->pmfd, buf, bufsz)); +} + void _kvm_freevtop(kvm_t *kd) { struct vmstate *vm = kd->vmst; + if (vm->pbvm_pgtbl != NULL) + free(vm->pbvm_pgtbl); if (vm->mmapbase != NULL) munmap(vm->mmapbase, vm->mmapsize); free(vm); @@ -124,10 +147,12 @@ _kvm_freevtop(kvm_t *kd) int _kvm_initvtop(kvm_t *kd) { + struct bootinfo bi; struct nlist nl[2]; uint64_t va; Elf64_Ehdr *ehdr; size_t hdrsz; + ssize_t sz; kd->vmst = (struct vmstate *)_kvm_malloc(kd, sizeof(*kd->vmst)); if (kd->vmst == NULL) { @@ -145,6 +170,42 @@ _kvm_initvtop(kvm_t *kd) if (_kvm_maphdrs(kd, hdrsz) == -1) return (-1); + /* + * Load the PBVM page table. We need this to resolve PBVM addresses. + * The PBVM page table is obtained from the bootinfo structure, of + * which the physical address is given to us in e_entry. If e_entry + * is 0, then this is assumed to be a pre-PBVM kernel. + */ + if (ehdr->e_entry != 0) { + sz = _kvm_read_phys(kd, ehdr->e_entry, &bi, sizeof(bi)); + if (sz != sizeof(bi)) { + _kvm_err(kd, kd->program, + "cannot read bootinfo from PA %#lx", ehdr->e_entry); + return (-1); + } + if (bi.bi_magic != BOOTINFO_MAGIC) { + _kvm_err(kd, kd->program, "invalid bootinfo"); + return (-1); + } + kd->vmst->pbvm_pgtbl = _kvm_malloc(kd, bi.bi_pbvm_pgtblsz); + if (kd->vmst->pbvm_pgtbl == NULL) { + _kvm_err(kd, kd->program, "cannot allocate page table"); + return (-1); + } + kd->vmst->pbvm_pgtblsz = bi.bi_pbvm_pgtblsz; + sz = _kvm_read_phys(kd, bi.bi_pbvm_pgtbl, kd->vmst->pbvm_pgtbl, + bi.bi_pbvm_pgtblsz); + if (sz != bi.bi_pbvm_pgtblsz) { + _kvm_err(kd, kd->program, + "cannot read page table from PA %#lx", + bi.bi_pbvm_pgtbl); + return (-1); + } + } else { + kd->vmst->pbvm_pgtbl = NULL; + kd->vmst->pbvm_pgtblsz = 0; + } + /* * At this point we've got enough information to use kvm_read() for * direct mapped (ie region 6 and region 7) address, such as symbol @@ -174,17 +235,18 @@ _kvm_initvtop(kvm_t *kd) } int -_kvm_kvatop(kvm_t *kd, u_long va, off_t *pa) +_kvm_kvatop(kvm_t *kd, u_long va, off_t *ofs) { struct ia64_lpte pte; - uint64_t pgaddr, pt0addr, pt1addr; + uint64_t pa, pgaddr, pt0addr, pt1addr; size_t pgno, pgsz, pt0no, pt1no; if (va >= REGION_BASE(6)) { /* Regions 6 and 7: direct mapped. */ - return (_kvm_pa2off(kd, REGION_ADDR(va), pa, 0)); + pa = REGION_ADDR(va); + return (_kvm_pa2off(kd, pa, ofs, 0)); } else if (va >= REGION_BASE(5)) { - /* Region 5: virtual. */ + /* Region 5: Kernel Virtual Memory. */ va = REGION_ADDR(va); pgsz = kd->vmst->pagesize; pt0no = KPTE_DIR0_INDEX(va, pgsz); @@ -207,12 +269,24 @@ _kvm_kvatop(kvm_t *kd, u_long va, off_t *pa) goto fail; if (!(pte.pte & PTE_PRESENT)) goto fail; - va = (pte.pte & PTE_PPN_MASK) + (va & (pgsz - 1)); - return (_kvm_pa2off(kd, va, pa, pgsz)); + pa = (pte.pte & PTE_PPN_MASK) + (va & (pgsz - 1)); + return (_kvm_pa2off(kd, pa, ofs, pgsz)); + } else if (va >= PBVM_BASE) { + /* Region 4: Pre-Boot Virtual Memory (PBVM). */ + va -= PBVM_BASE; + pgsz = PBVM_PGSZ; + pt0no = va / pgsz; + if (pt0no >= (kd->vmst->pbvm_pgtblsz >> 3)) + goto fail; + pt0addr = kd->vmst->pbvm_pgtbl[pt0no]; + if (!(pt0addr & PTE_PRESENT)) + goto fail; + pa = (pt0addr & PTE_PPN_MASK) + va % pgsz; + return (_kvm_pa2off(kd, pa, ofs, pgsz)); } fail: _kvm_err(kd, kd->program, "invalid kernel virtual address"); - *pa = ~0UL; + *ofs = ~0UL; return (0); } From d16ea2be4ee04b6b61c5f54b1a24fbf79e59880e Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Sat, 6 Aug 2011 17:45:11 +0000 Subject: [PATCH 162/452] Remove a shortcut which is invalid with MAXCPU > IDR_CHEETAH_MAX_BN_PAIRS. Approved by: re (kib) --- sys/sparc64/sparc64/mp_machdep.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/sys/sparc64/sparc64/mp_machdep.c b/sys/sparc64/sparc64/mp_machdep.c index e5910e06f52..9923fccb018 100644 --- a/sys/sparc64/sparc64/mp_machdep.c +++ b/sys/sparc64/sparc64/mp_machdep.c @@ -702,9 +702,6 @@ cheetah_ipi_selected(cpuset_t cpus, u_long d0, u_long d1, u_long d2) IDR_CHEETAH_ALL_BUSY) != 0) ; intr_restore(s); - if ((ids & - (IDR_CHEETAH_ALL_BUSY | IDR_CHEETAH_ALL_NACK)) == 0) - return; bnp = 0; for (cpu = 0; cpu < mp_ncpus; cpu++) { if (CPU_ISSET(cpu, &cpus)) { @@ -713,11 +710,6 @@ cheetah_ipi_selected(cpuset_t cpus, u_long d0, u_long d1, u_long d2) bnp++; } } - /* - * On at least Fire V880 we may receive IDR_NACKs for - * CPUs we actually haven't tried to send an IPI to, - * but which apparently can be safely ignored. - */ if (CPU_EMPTY(&cpus)) return; /* From 1fc2c552530ec81d8351c1c55cfddf3e52191fd5 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Sat, 6 Aug 2011 17:45:52 +0000 Subject: [PATCH 163/452] - Merge from r147740: When the last, possibly partially filled buffer is flushed, we didn't reset fragsz to 0 and as such would stop reflecting reality. - Use __FBSDID. - Wrap a too long line. Approved by: re (kib) MFC after: 1 week --- sys/sparc64/sparc64/dump_machdep.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sys/sparc64/sparc64/dump_machdep.c b/sys/sparc64/sparc64/dump_machdep.c index b76d14b94c5..d5409ac4f75 100644 --- a/sys/sparc64/sparc64/dump_machdep.c +++ b/sys/sparc64/sparc64/dump_machdep.c @@ -23,10 +23,11 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ +#include +__FBSDID("$FreeBSD$"); + #include #include #include @@ -92,6 +93,7 @@ buf_flush(struct dumperinfo *di) error = dump_write(di, buffer, 0, dumplo, DEV_BSIZE); dumplo += DEV_BSIZE; + fragsz = 0; return (error); } @@ -169,7 +171,8 @@ dumpsys(struct dumperinfo *di) /* Determine dump offset on device. */ dumplo = di->mediaoffset + di->mediasize - totsize; - mkdumpheader(&kdh, KERNELDUMPMAGIC, KERNELDUMP_SPARC64_VERSION, size, di->blocksize); + mkdumpheader(&kdh, KERNELDUMPMAGIC, KERNELDUMP_SPARC64_VERSION, size, + di->blocksize); printf("Dumping %lu MB (%d chunks)\n", (u_long)(size >> 20), nreg); From e31fe879a8116d48f59e51c7be8f4efcc601521d Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Sat, 6 Aug 2011 17:48:30 +0000 Subject: [PATCH 164/452] The tid member of struct pthread actually is long so read it as such. Accessing it as an int causes failure on big-endian LP64, i.e. mips64be, powerpc64 and sparc64. Reviewed by: marcel Approved by: re (kib) MFC after: 1 week --- lib/libthread_db/libthr_db.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/libthread_db/libthr_db.c b/lib/libthread_db/libthr_db.c index 33225f4b019..65248c10630 100644 --- a/lib/libthread_db/libthr_db.c +++ b/lib/libthread_db/libthr_db.c @@ -202,7 +202,7 @@ static td_err_e pt_ta_map_id2thr(const td_thragent_t *ta, thread_t id, td_thrhandle_t *th) { psaddr_t pt; - int32_t lwp; + long lwp; int ret; TDBG_FUNC(); @@ -214,7 +214,7 @@ pt_ta_map_id2thr(const td_thragent_t *ta, thread_t id, td_thrhandle_t *th) return (TD_ERR); /* Iterate through thread list to find pthread */ while (pt != 0) { - ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp); + ret = thr_pread_long(ta, pt + ta->thread_off_tid, &lwp); if (ret != 0) return (TD_ERR); if (lwp == id) @@ -245,7 +245,7 @@ pt_ta_thr_iter(const td_thragent_t *ta, td_thr_iter_f *callback, { td_thrhandle_t th; psaddr_t pt; - int32_t lwp; + long lwp; int ret; TDBG_FUNC(); @@ -254,7 +254,7 @@ pt_ta_thr_iter(const td_thragent_t *ta, td_thr_iter_f *callback, if (ret != 0) return (TD_ERR); while (pt != 0) { - ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp); + ret = thr_pread_long(ta, pt + ta->thread_off_tid, &lwp); if (ret != 0) return (TD_ERR); if (lwp != 0 && lwp != TERMINATED) { @@ -368,7 +368,7 @@ pt_ta_event_getmsg(const td_thragent_t *ta, td_event_msg_t *msg) psaddr_t pt; td_thr_events_e tmp; - int32_t lwp; + long lwp; int ret; TDBG_FUNC(); @@ -395,7 +395,7 @@ pt_ta_event_getmsg(const td_thragent_t *ta, td_event_msg_t *msg) ps_pwrite(ta->ph, pt + ta->thread_off_event_buf, &tmp, sizeof(tmp)); /* Convert event */ pt = msg->th_p; - ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp); + ret = thr_pread_long(ta, pt + ta->thread_off_tid, &lwp); if (ret != 0) return (TD_ERR); handle.th_ta = ta; @@ -672,7 +672,7 @@ pt_thr_event_getmsg(const td_thrhandle_t *th, td_event_msg_t *msg) static td_thrhandle_t handle; const td_thragent_t *ta = th->th_ta; psaddr_t pt, pt_temp; - int32_t lwp; + long lwp; int ret; td_thr_events_e tmp; @@ -699,7 +699,7 @@ pt_thr_event_getmsg(const td_thrhandle_t *th, td_event_msg_t *msg) ps_pwrite(ta->ph, pt + ta->thread_off_event_buf, &tmp, sizeof(tmp)); /* Convert event */ pt = msg->th_p; - ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp); + ret = thr_pread_long(ta, pt + ta->thread_off_tid, &lwp); if (ret != 0) return (TD_ERR); handle.th_ta = ta; From 21a305d4af4491e445fa677f04e602c5d834f079 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Sat, 6 Aug 2011 17:49:21 +0000 Subject: [PATCH 165/452] Use the size of struct fpreg rather than of the pointer to it when copying the FPU state. Reviewed by: marcel Approved by: re (kib) MFC after: 1 week --- lib/libthread_db/arch/amd64/libpthread_md.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/libthread_db/arch/amd64/libpthread_md.c b/lib/libthread_db/arch/amd64/libpthread_md.c index 646d36d564f..624e650cacf 100644 --- a/lib/libthread_db/arch/amd64/libpthread_md.c +++ b/lib/libthread_db/arch/amd64/libpthread_md.c @@ -92,18 +92,21 @@ pt_ucontext_to_reg(const ucontext_t *uc, struct reg *r) void pt_fpreg_to_ucontext(const struct fpreg* r, ucontext_t *uc) { - memcpy(&uc->uc_mcontext.mc_fpstate, r, sizeof(r)); + + memcpy(&uc->uc_mcontext.mc_fpstate, r, sizeof(*r)); } void pt_ucontext_to_fpreg(const ucontext_t *uc, struct fpreg *r) { - memcpy(r, &uc->uc_mcontext.mc_fpstate, sizeof(r)); + + memcpy(r, &uc->uc_mcontext.mc_fpstate, sizeof(*r)); } void pt_md_init(void) { + /* Nothing to do */ } From 70b9a9a9f6db4731b0c0d56713f96fa414957dd7 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Sat, 6 Aug 2011 17:50:37 +0000 Subject: [PATCH 166/452] Implement Reviewed by: marcel Approved by: re (kib) MFC after: 1 week --- lib/libthread_db/arch/sparc64/libpthread_md.c | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/lib/libthread_db/arch/sparc64/libpthread_md.c b/lib/libthread_db/arch/sparc64/libpthread_md.c index f5f12d3ff64..6a84518fa47 100644 --- a/lib/libthread_db/arch/sparc64/libpthread_md.c +++ b/lib/libthread_db/arch/sparc64/libpthread_md.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2004 Marcel Moolenaar + * Copyright (c) 2011 Marius Strobl * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,39 +28,63 @@ #include __FBSDID("$FreeBSD$"); -#include +#include +#include #include #include +#include #include "libpthread_db.h" void -pt_reg_to_ucontext(const struct reg *r __unused, ucontext_t *uc __unused) +pt_reg_to_ucontext(const struct reg *r, ucontext_t *uc) { + + memcpy(&uc->uc_mcontext, r, MIN(sizeof(uc->uc_mcontext), sizeof(*r))); } void -pt_ucontext_to_reg(const ucontext_t *uc __unused, struct reg *r __unused) +pt_ucontext_to_reg(const ucontext_t *uc, struct reg *r) { + + memcpy(r, &uc->uc_mcontext, MIN(sizeof(uc->uc_mcontext), sizeof(*r))); } void -pt_fpreg_to_ucontext(const struct fpreg* r __unused, ucontext_t *uc __unused) +pt_fpreg_to_ucontext(const struct fpreg* r, ucontext_t *uc) { + mcontext_t *mc = &uc->uc_mcontext; + + memcpy(mc->mc_fp, r->fr_regs, MIN(sizeof(mc->mc_fp), + sizeof(r->fr_regs))); + mc->mc_fsr = r->fr_fsr; + mc->mc_gsr = r->fr_gsr; + mc->mc_fprs |= FPRS_FEF; } void -pt_ucontext_to_fpreg(const ucontext_t *uc __unused, struct fpreg *r __unused) +pt_ucontext_to_fpreg(const ucontext_t *uc, struct fpreg *r) { + const mcontext_t *mc = &uc->uc_mcontext; + + if ((mc->mc_fprs & FPRS_FEF) != 0) { + memcpy(r->fr_regs, mc->mc_fp, MIN(sizeof(mc->mc_fp), + sizeof(r->fr_regs))); + r->fr_fsr = mc->mc_fsr; + r->fr_gsr = mc->mc_gsr; + } else + memset(r, 0, sizeof(*r)); } void pt_md_init(void) { + } int pt_reg_sstep(struct reg *reg __unused, int step __unused) { + return (0); } From 6055164bb11cc82816b37de9628d5d387bbc7552 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Sat, 6 Aug 2011 17:52:25 +0000 Subject: [PATCH 167/452] Implement functions necessary for compiling fbsd-threads.c. Reviewed by: marcel Approved by: re (kib) MFC after: 1 week --- contrib/gdb/FREEBSD-diffs | 36 ++++++++++++++++++++++++++++++ contrib/gdb/gdb/sparc64fbsd-tdep.c | 25 +++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/contrib/gdb/FREEBSD-diffs b/contrib/gdb/FREEBSD-diffs index 85eb8d86303..3f84f9dc273 100644 --- a/contrib/gdb/FREEBSD-diffs +++ b/contrib/gdb/FREEBSD-diffs @@ -927,3 +927,39 @@ diff -N gdb/config/ia64/tm-fbsd.h +#include "ia64/tm-ia64.h" + +#endif /* TM_FBSD_H */ +Index: gdb/sparc64fbsd-tdep.c +=================================================================== +--- gdb/sparc64fbsd-tdep.c (revision 223862) ++++ gdb/sparc64fbsd-tdep.c (working copy) +@@ -64,6 +64,31 @@ sparc64fbsd_supply_fpregset (const struct regset * + { + sparc64_supply_fpregset (regcache, regnum, fpregs); + } ++ ++void ++supply_gregset (const void *gregs) ++{ ++ sparc64_supply_gregset (&sparc64fbsd_gregset, current_regcache, -1, gregs); ++} ++ ++void ++supply_fpregset (const void *fpregs) ++{ ++ sparc64_supply_fpregset (current_regcache, -1, fpregs); ++} ++ ++void ++fill_gregset (void *gregs, int regnum) ++{ ++ sparc64_collect_gregset (&sparc64fbsd_gregset, current_regcache, regnum, ++ gregs); ++} ++ ++void ++fill_fpregset (void *fpregs, int regnum) ++{ ++ sparc64_collect_fpregset (current_regcache, regnum, fpregs); ++} + + + /* Signal trampolines. */ diff --git a/contrib/gdb/gdb/sparc64fbsd-tdep.c b/contrib/gdb/gdb/sparc64fbsd-tdep.c index 3c1335df431..60d45b6303b 100644 --- a/contrib/gdb/gdb/sparc64fbsd-tdep.c +++ b/contrib/gdb/gdb/sparc64fbsd-tdep.c @@ -64,6 +64,31 @@ sparc64fbsd_supply_fpregset (const struct regset *regset, { sparc64_supply_fpregset (regcache, regnum, fpregs); } + +void +supply_gregset (const void *gregs) +{ + sparc64_supply_gregset (&sparc64fbsd_gregset, current_regcache, -1, gregs); +} + +void +supply_fpregset (const void *fpregs) +{ + sparc64_supply_fpregset (current_regcache, -1, fpregs); +} + +void +fill_gregset (void *gregs, int regnum) +{ + sparc64_collect_gregset (&sparc64fbsd_gregset, current_regcache, regnum, + gregs); +} + +void +fill_fpregset (void *fpregs, int regnum) +{ + sparc64_collect_fpregset (current_regcache, regnum, fpregs); +} /* Signal trampolines. */ From 39c5320dada94ff3c8b44d9f5e25019d97a57ae8 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Sat, 6 Aug 2011 17:53:45 +0000 Subject: [PATCH 168/452] Compile fbsd-threads.c. Amongst others this is necessary for a working kgdb(1). Reviewed by: marcel Approved by: re (kib) MFC after: 1 week --- gnu/usr.bin/gdb/arch/sparc64/Makefile | 1 + gnu/usr.bin/gdb/arch/sparc64/init.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/gnu/usr.bin/gdb/arch/sparc64/Makefile b/gnu/usr.bin/gdb/arch/sparc64/Makefile index b985711f009..9d771727e90 100644 --- a/gnu/usr.bin/gdb/arch/sparc64/Makefile +++ b/gnu/usr.bin/gdb/arch/sparc64/Makefile @@ -1,6 +1,7 @@ # $FreeBSD$ .if !defined(GDB_CROSS_DEBUGGER) +LIBSRCS+= fbsd-threads.c LIBSRCS+= solib.c solib-legacy.c solib-svr4.c LIBSRCS+= sparc-nat.c sparc64-nat.c sparc64fbsd-nat.c .endif diff --git a/gnu/usr.bin/gdb/arch/sparc64/init.c b/gnu/usr.bin/gdb/arch/sparc64/init.c index 25f46580a1e..d2cf24e9807 100644 --- a/gnu/usr.bin/gdb/arch/sparc64/init.c +++ b/gnu/usr.bin/gdb/arch/sparc64/init.c @@ -11,6 +11,7 @@ extern initialize_file_ftype _initialize_corelow; extern initialize_file_ftype _initialize_ser_hardwire; extern initialize_file_ftype _initialize_ser_pipe; extern initialize_file_ftype _initialize_ser_tcp; +extern initialize_file_ftype _initialize_thread_db; extern initialize_file_ftype _initialize_sparc64fbsd_nat; extern initialize_file_ftype _initialize_sparc64_nat; extern initialize_file_ftype _initialize_sparc_nat; @@ -124,6 +125,7 @@ initialize_all_files (void) _initialize_ser_pipe (); _initialize_ser_tcp (); #ifndef CROSS_DEBUGGER + _initialize_thread_db (); _initialize_sparc64fbsd_nat (); _initialize_sparc64_nat (); _initialize_sparc_nat (); From e397f116c3375b97948f1dca780a2c5f29a9ad26 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sat, 6 Aug 2011 19:20:17 +0000 Subject: [PATCH 169/452] Properly initialise the "len" argument to getsockname(2) in the tcpdrop regression test so that it works (more) consistently. Approved by: re (bz) Sponsored by: Juniper Networks --- tools/regression/netinet/tcpdrop/tcpdrop.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/regression/netinet/tcpdrop/tcpdrop.c b/tools/regression/netinet/tcpdrop/tcpdrop.c index e6b7f436d3a..7cfc65860d7 100644 --- a/tools/regression/netinet/tcpdrop/tcpdrop.c +++ b/tools/regression/netinet/tcpdrop/tcpdrop.c @@ -233,6 +233,7 @@ main(int argc, char *argv[]) bzero(&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_len = sizeof(sin); + len = sizeof(sin); if (getsockname(listen_fd, (struct sockaddr *)&sin, &len) < 0) err(-1, "getsockname"); port = sin.sin_port; From 12f4b65fa6506a0baae1c76ea8db9bdcfe4815f0 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sun, 7 Aug 2011 00:11:39 +0000 Subject: [PATCH 170/452] Fix an error in kmem_alloc_attr(). Unless "tries" is updated, kmem_alloc_attr() could get stuck in a loop. Approved by: re (kib) MFC after: 3 days --- sys/vm/vm_contig.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sys/vm/vm_contig.c b/sys/vm/vm_contig.c index 025312ba7f5..67ebdc3ff53 100644 --- a/sys/vm/vm_contig.c +++ b/sys/vm/vm_contig.c @@ -265,6 +265,7 @@ retry: vm_contig_grow_cache(tries, low, high); vm_map_lock(map); VM_OBJECT_LOCK(object); + tries++; goto retry; } while (i != 0) { From 51db4bad81eae1306e70c7b1103c788b2de0c5ce Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sun, 7 Aug 2011 08:35:15 +0000 Subject: [PATCH 171/452] Fix NetBSD PR bin/44114: makefs with -t cd9660 -o rockridge against directories with deep structure creates a corrupted cd9660 image. http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=44114 Fix NetBSD PR bin/45217: makefs creates ISO9660 images that violate the ECMA-119 (ISO9660) specification. This is caused by erroneously writing 32 bytes with value 0x20 to the volume_set_id field and 128 bytes with value 0x20 to the the following 37-byte fields in the PVD: copyright_file_id, abstract_file_id, bibliographic_file_id This causes, among other unwanted results the reserved4 field to be overwritten with the value 0x20. To comply with the specification, this field muse be zero. As a result, all FreeBSD distribution images created with makefs have not been 100% valid ISO9660 files. http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=45217 Reviewed by: kientzle Approved by: re (kib) Obtained from: NetBSD MFC after: 3 days --- usr.sbin/makefs/cd9660.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/usr.sbin/makefs/cd9660.c b/usr.sbin/makefs/cd9660.c index 59b9ef41b3d..281a2038489 100644 --- a/usr.sbin/makefs/cd9660.c +++ b/usr.sbin/makefs/cd9660.c @@ -223,13 +223,12 @@ cd9660_set_defaults(void) /* Make sure the PVD is clear */ memset(&diskStructure.primaryDescriptor, 0, 2048); - memset(diskStructure.primaryDescriptor.volume_set_id, 0x20,32); memset(diskStructure.primaryDescriptor.publisher_id, 0x20,128); memset(diskStructure.primaryDescriptor.preparer_id, 0x20,128); memset(diskStructure.primaryDescriptor.application_id, 0x20,128); - memset(diskStructure.primaryDescriptor.copyright_file_id, 0x20,128); - memset(diskStructure.primaryDescriptor.abstract_file_id, 0x20,128); - memset(diskStructure.primaryDescriptor.bibliographic_file_id, 0x20,128); + memset(diskStructure.primaryDescriptor.copyright_file_id, 0x20,37); + memset(diskStructure.primaryDescriptor.abstract_file_id, 0x20,37); + memset(diskStructure.primaryDescriptor.bibliographic_file_id, 0x20,37); strcpy(diskStructure.primaryDescriptor.system_id,"NetBSD"); @@ -669,11 +668,11 @@ cd9660_finalize_PVD(void) cd9660_pad_string_spaces(diskStructure.primaryDescriptor.application_id, 128); cd9660_pad_string_spaces( - diskStructure.primaryDescriptor.copyright_file_id, 128); + diskStructure.primaryDescriptor.copyright_file_id, 37); cd9660_pad_string_spaces( - diskStructure.primaryDescriptor.abstract_file_id, 128); + diskStructure.primaryDescriptor.abstract_file_id, 37); cd9660_pad_string_spaces( - diskStructure.primaryDescriptor.bibliographic_file_id, 128); + diskStructure.primaryDescriptor.bibliographic_file_id, 37); /* Setup dates */ time(&tim); @@ -1307,6 +1306,8 @@ cd9660_rrip_move_directory(cd9660node *dir) /* Set the new name */ memset(dir->isoDirRecord->name, 0, ISO_FILENAME_MAXLENGTH_WITH_PADDING); strncpy(dir->isoDirRecord->name, newname, 8); + dir->isoDirRecord->length[0] = 34 + 8; + dir->isoDirRecord->name_len[0] = 8; return dir; } From e967c8b89985a4f407f57da364ae2ebda171963d Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sun, 7 Aug 2011 08:42:36 +0000 Subject: [PATCH 172/452] Add compatibility for ISO images created with unfixed makefs that violated ECMA-119 (ISO9660): allow reserved4 to be 0x20 in PVD. This allows tar to read FreeBSD distribution ISO images created with makefs prior to NetBSD bin/45217 bugfix (up to 9.0-BETA1). In addition, merge following important bugfixes from libarchive's release/2.8 branch: Revision 2812: Merge 2811 from trunk: Don't try to verify that compression-level=0 produces larger results than the default compression, since this isn't true for all versions of liblzma. Revision 2817: Merge 2814 from trunk: Fix Issue 121 (mtree parser error) http://code.google.com/p/libarchive/issues/detail?id=121 Revision 2820: Fix issue 119. Change the file location check that a file location does not exceed volume block. New one is that a file content does not exceed volume block(end of an ISO image). It is better than previous check even if the issue did not happen. While reading an ISO image generated by an older version of mkisofs utility, a file location indicates the end the ISO image if its file size is zero and it is the last file of all files of the ISO image, so it is possible that the location value is the same as the number of the total block of the ISO image. http://code.google.com/p/libarchive/issues/detail?id=119 Revision 2955: Issue 134: Fix libarchive 2.8 crashing in archive_write_finish() when the open has failed and we're trying to write Zip format. http://code.google.com/p/libarchive/issues/detail?id=134 Revision 2958: Followup on Issue 134: 1) Port test_open_failure to libarchive 2.8 branch to test the problem reported in Issue 134. This test also shows that archive_read_open() sometimes fails to report open errors correctly. 2) Fix the bug in archive_read.c 3) Comment out the tests that close functions are invoked promptly when open fails; that's fully fixed in libarchive 3.0, but I don't think it's worth fixing here. Revision 3484: Use uintmax_t with %ju Revision 3487: Fix issue 163. Correctly allocate enough memory for a input buffer saved. http://code.google.com/p/libarchive/issues/detail?id=163 Revision 3542: Merge 2516, 2536 from trunk: Allow path table offset values of 0 and 18, which are used by some ISO writers. Reviewed by: kientzle Approved by: re (kib) MFC after: 3 days --- lib/libarchive/archive_read.c | 18 +- .../archive_read_support_compression_uu.c | 12 +- .../archive_read_support_format_iso9660.c | 49 +++-- .../archive_read_support_format_mtree.c | 11 +- .../archive_write_set_compression_xz.c | 4 +- lib/libarchive/archive_write_set_format_zip.c | 3 + lib/libarchive/test/Makefile | 1 + lib/libarchive/test/test_open_failure.c | 198 ++++++++++++++++++ lib/libarchive/test/test_read_format_mtree.c | 43 ++++ .../test/test_write_compress_lzma.c | 7 +- lib/libarchive/test/test_write_compress_xz.c | 6 +- 11 files changed, 317 insertions(+), 35 deletions(-) create mode 100644 lib/libarchive/test/test_open_failure.c diff --git a/lib/libarchive/archive_read.c b/lib/libarchive/archive_read.c index 027ed608182..7873d45a570 100644 --- a/lib/libarchive/archive_read.c +++ b/lib/libarchive/archive_read.c @@ -377,6 +377,12 @@ build_stream(struct archive_read *a) /* If no bidder, we're done. */ if (best_bidder == NULL) { + /* Verify the final pipelin by asking it for some data. */ + __archive_read_filter_ahead(a->filter, 1, &avail); + if (avail < 0) { + cleanup_filters(a); + return (ARCHIVE_FATAL); + } a->archive.compression_name = a->filter->name; a->archive.compression_code = a->filter->code; return (ARCHIVE_OK); @@ -389,17 +395,11 @@ build_stream(struct archive_read *a) filter->bidder = best_bidder; filter->archive = a; filter->upstream = a->filter; - r = (best_bidder->init)(filter); - if (r != ARCHIVE_OK) { - free(filter); - return (r); - } a->filter = filter; - /* Verify the filter by asking it for some data. */ - __archive_read_filter_ahead(filter, 1, &avail); - if (avail < 0) { + r = (best_bidder->init)(a->filter); + if (r != ARCHIVE_OK) { cleanup_filters(a); - return (ARCHIVE_FATAL); + return (r); } } } diff --git a/lib/libarchive/archive_read_support_compression_uu.c b/lib/libarchive/archive_read_support_compression_uu.c index c3c37d674c2..cb1dae504e0 100644 --- a/lib/libarchive/archive_read_support_compression_uu.c +++ b/lib/libarchive/archive_read_support_compression_uu.c @@ -381,7 +381,17 @@ ensure_in_buff_size(struct archive_read_filter *self, unsigned char *ptr; size_t newsize; - newsize = uudecode->in_allocated << 1; + /* + * Calculate a new buffer size for in_buff. + * Increase its value until it has enough size we need. + */ + newsize = uudecode->in_allocated; + do { + if (newsize < IN_BUFF_SIZE*32) + newsize <<= 1; + else + newsize += IN_BUFF_SIZE; + } while (size > newsize); ptr = malloc(newsize); if (ptr == NULL || newsize < uudecode->in_allocated) { diff --git a/lib/libarchive/archive_read_support_format_iso9660.c b/lib/libarchive/archive_read_support_format_iso9660.c index 1f640037fad..2cca410e717 100644 --- a/lib/libarchive/archive_read_support_format_iso9660.c +++ b/lib/libarchive/archive_read_support_format_iso9660.c @@ -709,16 +709,18 @@ isSVD(struct iso9660 *iso9660, const unsigned char *h) /* Location of Occurrence of Type L Path Table must be * available location, - * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ + * >= SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ location = archive_le32dec(h+SVD_type_L_path_table_offset); - if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block) + if (location < SYSTEM_AREA_BLOCK+2 || location >= volume_block) return (0); - /* Location of Occurrence of Type M Path Table must be - * available location, - * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ + /* The Type M Path Table must be at a valid location (WinISO + * and probably other programs omit this, so we allow zero) + * + * >= SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ location = archive_be32dec(h+SVD_type_M_path_table_offset); - if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block) + if ((location > 0 && location < SYSTEM_AREA_BLOCK+2) + || location >= volume_block) return (0); /* Read Root Directory Record in Volume Descriptor. */ @@ -781,16 +783,17 @@ isEVD(struct iso9660 *iso9660, const unsigned char *h) /* Location of Occurrence of Type L Path Table must be * available location, - * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ + * >= SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ location = archive_le32dec(h+PVD_type_1_path_table_offset); - if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block) + if (location < SYSTEM_AREA_BLOCK+2 || location >= volume_block) return (0); /* Location of Occurrence of Type M Path Table must be * available location, - * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ + * >= SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ location = archive_be32dec(h+PVD_type_m_path_table_offset); - if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block) + if ((location > 0 && location < SYSTEM_AREA_BLOCK+2) + || location >= volume_block) return (0); /* Reserved field must be 0. */ @@ -862,19 +865,24 @@ isPVD(struct iso9660 *iso9660, const unsigned char *h) * available location, * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ location = archive_le32dec(h+PVD_type_1_path_table_offset); - if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block) + if (location < SYSTEM_AREA_BLOCK+2 || location >= volume_block) return (0); - /* Location of Occurrence of Type M Path Table must be - * available location, - * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ + /* The Type M Path Table must also be at a valid location + * (although ECMA 119 requires a Type M Path Table, WinISO and + * probably other programs omit it, so we permit a zero here) + * + * >= SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */ location = archive_be32dec(h+PVD_type_m_path_table_offset); - if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block) + if ((location > 0 && location < SYSTEM_AREA_BLOCK+2) + || location >= volume_block) return (0); /* Reserved field must be 0. */ + /* FreeBSD: makefs erroneously created images with 0x20 */ for (i = 0; i < PVD_reserved4_size; ++i) - if (h[PVD_reserved4_offset + i] != 0) + if (h[PVD_reserved4_offset + i] != 0 && + h[PVD_reserved4_offset + i] != 32) return (0); /* Reserved field must be 0. */ @@ -1677,6 +1685,7 @@ parse_file_info(struct archive_read *a, struct file_info *parent, const unsigned char *rr_start, *rr_end; const unsigned char *p; size_t dr_len; + uint64_t fsize; int32_t location; int flags; @@ -1685,6 +1694,7 @@ parse_file_info(struct archive_read *a, struct file_info *parent, dr_len = (size_t)isodirrec[DR_length_offset]; name_len = (size_t)isodirrec[DR_name_len_offset]; location = archive_le32dec(isodirrec + DR_extent_offset); + fsize = toi(isodirrec + DR_size_offset, DR_size_size); /* Sanity check that dr_len needs at least 34. */ if (dr_len < 34) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, @@ -1703,7 +1713,10 @@ parse_file_info(struct archive_read *a, struct file_info *parent, * link or file size is zero. As far as I know latest mkisofs * do that. */ - if (location >= iso9660->volume_block) { + if (location > 0 && + (location + ((fsize + iso9660->logical_block_size -1) + / iso9660->logical_block_size)) > + (unsigned int)iso9660->volume_block) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Invalid location of extent of file"); return (NULL); @@ -1719,7 +1732,7 @@ parse_file_info(struct archive_read *a, struct file_info *parent, memset(file, 0, sizeof(*file)); file->parent = parent; file->offset = iso9660->logical_block_size * (uint64_t)location; - file->size = toi(isodirrec + DR_size_offset, DR_size_size); + file->size = fsize; file->mtime = isodate7(isodirrec + DR_date_offset); file->ctime = file->atime = file->mtime; diff --git a/lib/libarchive/archive_read_support_format_mtree.c b/lib/libarchive/archive_read_support_format_mtree.c index bb231fae37e..7ae0b02da10 100644 --- a/lib/libarchive/archive_read_support_format_mtree.c +++ b/lib/libarchive/archive_read_support_format_mtree.c @@ -525,6 +525,7 @@ parse_file(struct archive_read *a, struct archive_entry *entry, /* Initialize reasonable defaults. */ mtree->filetype = AE_IFREG; archive_entry_set_size(entry, 0); + archive_string_empty(&mtree->contents_name); /* Parse options from this line. */ parsed_kws = 0; @@ -613,9 +614,8 @@ parse_file(struct archive_read *a, struct archive_entry *entry, } /* - * If there is a contents file on disk, use that size; - * otherwise leave it as-is (it might have been set from - * the mtree size= keyword). + * Check for a mismatch between the type in the specification and + * the type of the contents object on disk. */ if (st != NULL) { mismatched_type = 0; @@ -660,6 +660,11 @@ parse_file(struct archive_read *a, struct archive_entry *entry, } } + /* + * If there is a contents file on disk, pick some of the metadata + * from that file. For most of these, we only set it from the contents + * if it wasn't already parsed from the specification. + */ if (st != NULL) { if ((parsed_kws & MTREE_HAS_DEVICE) == 0 && (archive_entry_filetype(entry) == AE_IFCHR || diff --git a/lib/libarchive/archive_write_set_compression_xz.c b/lib/libarchive/archive_write_set_compression_xz.c index 81733170b6a..d97bca7e512 100644 --- a/lib/libarchive/archive_write_set_compression_xz.c +++ b/lib/libarchive/archive_write_set_compression_xz.c @@ -421,8 +421,8 @@ drive_compressor(struct archive_write *a, struct private_data *state, int finish archive_set_error(&a->archive, ENOMEM, "lzma compression error: " "%ju MiB would have been needed", - (lzma_memusage(&(state->stream)) + 1024 * 1024 -1) - / (1024 * 1024)); + (uintmax_t)((lzma_memusage(&(state->stream)) + 1024 * 1024 -1) + / (1024 * 1024))); return (ARCHIVE_FATAL); default: /* Any other return value indicates an error. */ diff --git a/lib/libarchive/archive_write_set_format_zip.c b/lib/libarchive/archive_write_set_format_zip.c index d4d4f879eda..1bbbb6a12d3 100644 --- a/lib/libarchive/archive_write_set_format_zip.c +++ b/lib/libarchive/archive_write_set_format_zip.c @@ -502,6 +502,9 @@ archive_write_zip_finish(struct archive_write *a) int entries; int ret; + if (a->compressor.write == NULL) + return (ARCHIVE_OK); + zip = a->format_data; l = zip->central_directory; diff --git a/lib/libarchive/test/Makefile b/lib/libarchive/test/Makefile index 3f747b6a51b..ba72db77281 100644 --- a/lib/libarchive/test/Makefile +++ b/lib/libarchive/test/Makefile @@ -25,6 +25,7 @@ TESTS= \ test_fuzz.c \ test_link_resolver.c \ test_open_fd.c \ + test_open_failure.c \ test_open_file.c \ test_open_filename.c \ test_pax_filename_encoding.c \ diff --git a/lib/libarchive/test/test_open_failure.c b/lib/libarchive/test/test_open_failure.c new file mode 100644 index 00000000000..0a7632a8ad6 --- /dev/null +++ b/lib/libarchive/test/test_open_failure.c @@ -0,0 +1,198 @@ +/*- + * Copyright (c) 2003-2010 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" +__FBSDID("$FreeBSD$"); + +#define MAGIC 123456789 +struct my_data { + int magic; + int read_return; + int read_called; + int write_return; + int write_called; + int open_return; + int open_called; + int close_return; + int close_called; +}; + +static ssize_t +my_read(struct archive *a, void *_private, const void **buff) +{ + struct my_data *private = (struct my_data *)_private; + assertEqualInt(MAGIC, private->magic); + ++private->read_called; + return (private->read_return); +} + +static ssize_t +my_write(struct archive *a, void *_private, const void *buff, size_t s) +{ + struct my_data *private = (struct my_data *)_private; + assertEqualInt(MAGIC, private->magic); + ++private->write_called; + return (private->write_return); +} + +static int +my_open(struct archive *a, void *_private) +{ + struct my_data *private = (struct my_data *)_private; + assertEqualInt(MAGIC, private->magic); + ++private->open_called; + return (private->open_return); +} + +static int +my_close(struct archive *a, void *_private) +{ + struct my_data *private = (struct my_data *)_private; + assertEqualInt(MAGIC, private->magic); + ++private->close_called; + return (private->close_return); +} + + +DEFINE_TEST(test_open_failure) +{ + struct archive *a; + struct my_data private; + + memset(&private, 0, sizeof(private)); + private.magic = MAGIC; + private.open_return = ARCHIVE_FATAL; + a = archive_read_new(); + assert(a != NULL); + assertEqualInt(ARCHIVE_FATAL, + archive_read_open(a, &private, my_open, my_read, my_close)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.read_called); + assertEqualInt(1, private.close_called); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.read_called); + assertEqualInt(1, private.close_called); + + memset(&private, 0, sizeof(private)); + private.magic = MAGIC; + private.open_return = ARCHIVE_FAILED; + a = archive_read_new(); + assert(a != NULL); + assertEqualInt(ARCHIVE_FAILED, + archive_read_open(a, &private, my_open, my_read, my_close)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.read_called); + assertEqualInt(1, private.close_called); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.read_called); + assertEqualInt(1, private.close_called); + + memset(&private, 0, sizeof(private)); + private.magic = MAGIC; + private.open_return = ARCHIVE_WARN; + a = archive_read_new(); + assert(a != NULL); + assertEqualInt(ARCHIVE_WARN, + archive_read_open(a, &private, my_open, my_read, my_close)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.read_called); + assertEqualInt(1, private.close_called); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.read_called); + assertEqualInt(1, private.close_called); + + memset(&private, 0, sizeof(private)); + private.magic = MAGIC; + private.open_return = ARCHIVE_OK; + private.read_return = ARCHIVE_FATAL; + a = archive_read_new(); + assert(a != NULL); + assertEqualInt(ARCHIVE_OK, + archive_read_support_compression_compress(a)); + assertEqualInt(ARCHIVE_OK, archive_read_support_format_tar(a)); + assertEqualInt(ARCHIVE_FATAL, + archive_read_open(a, &private, my_open, my_read, my_close)); + assertEqualInt(1, private.open_called); + assertEqualInt(1, private.read_called); + assertEqualInt(1, private.close_called); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + assertEqualInt(1, private.open_called); + assertEqualInt(1, private.read_called); + assertEqualInt(1, private.close_called); + + memset(&private, 0, sizeof(private)); + private.magic = MAGIC; + private.open_return = ARCHIVE_FATAL; + a = archive_write_new(); + assert(a != NULL); + assertEqualInt(ARCHIVE_FATAL, + archive_write_open(a, &private, my_open, my_write, my_close)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.write_called); + // Broken in 2.8, fixed in 3.0 + //assertEqualInt(1, private.close_called); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.write_called); + assertEqualInt(1, private.close_called); + + memset(&private, 0, sizeof(private)); + private.magic = MAGIC; + private.open_return = ARCHIVE_FATAL; + a = archive_write_new(); + assert(a != NULL); + archive_write_set_compression_compress(a); + archive_write_set_format_zip(a); + assertEqualInt(ARCHIVE_FATAL, + archive_write_open(a, &private, my_open, my_write, my_close)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.write_called); + // Broken in 2.8, fixed in 3.0 + //assertEqualInt(1, private.close_called); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.write_called); + assertEqualInt(1, private.close_called); + + memset(&private, 0, sizeof(private)); + private.magic = MAGIC; + private.open_return = ARCHIVE_FATAL; + a = archive_write_new(); + assert(a != NULL); + archive_write_set_compression_gzip(a); + assertEqualInt(ARCHIVE_FATAL, + archive_write_open(a, &private, my_open, my_write, my_close)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.write_called); + // Broken in 2.8, fixed in 3.0 + //assertEqualInt(1, private.close_called); + assertEqualInt(ARCHIVE_OK, archive_write_finish(a)); + assertEqualInt(1, private.open_called); + assertEqualInt(0, private.write_called); + assertEqualInt(1, private.close_called); + +} diff --git a/lib/libarchive/test/test_read_format_mtree.c b/lib/libarchive/test/test_read_format_mtree.c index 5001e4d8a7a..93e658f7ad5 100644 --- a/lib/libarchive/test/test_read_format_mtree.c +++ b/lib/libarchive/test/test_read_format_mtree.c @@ -134,10 +134,53 @@ test_read_format_mtree2(void) assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); } +/* + * Reported to libarchive.googlecode.com as Issue 121. + */ +static void +test_read_format_mtree3(void) +{ + static char archive[] = + "#mtree\n" + "a type=file contents=file\n" + "b type=link link=a\n" + "c type=file contents=file\n"; + struct archive_entry *ae; + struct archive *a; + + assertMakeDir("mtree3", 0777); + assertChdir("mtree3"); + assertMakeFile("file", 0644, "file contents"); + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "a"); + assertEqualInt(archive_entry_filetype(ae), AE_IFREG); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "b"); + assertEqualInt(archive_entry_filetype(ae), AE_IFLNK); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString(archive_entry_pathname(ae), "c"); + assertEqualInt(archive_entry_filetype(ae), AE_IFREG); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); + + assertChdir(".."); +} + DEFINE_TEST(test_read_format_mtree) { test_read_format_mtree1(); test_read_format_mtree2(); + test_read_format_mtree3(); } diff --git a/lib/libarchive/test/test_write_compress_lzma.c b/lib/libarchive/test/test_write_compress_lzma.c index 639e58f6c1d..88b9d630335 100644 --- a/lib/libarchive/test/test_write_compress_lzma.c +++ b/lib/libarchive/test/test_write_compress_lzma.c @@ -185,10 +185,15 @@ DEFINE_TEST(test_write_compress_lzma) archive_write_close(a); assert(0 == archive_write_finish(a)); - /* Level 0 really does result in larger data. */ + /* It would be nice to assert that compression-level=0 produced + * consistently larger/smaller results than the default compression, + * but the results here vary a lot depending on the version of liblzma + * being used. */ + /* failure("Compression-level=0 wrote %d bytes; default wrote %d bytes", (int)used2, (int)used1); assert(used2 > used1); + */ assert((a = archive_read_new()) != NULL); assertA(0 == archive_read_support_format_all(a)); diff --git a/lib/libarchive/test/test_write_compress_xz.c b/lib/libarchive/test/test_write_compress_xz.c index 988fb6e879d..554d163cc7a 100644 --- a/lib/libarchive/test/test_write_compress_xz.c +++ b/lib/libarchive/test/test_write_compress_xz.c @@ -193,10 +193,14 @@ DEFINE_TEST(test_write_compress_xz) archive_write_close(a); assert(0 == archive_write_finish(a)); - /* Level 0 really does result in larger data. */ + /* I would like to assert that compression-level=0 results in + * larger data than the default compression, but that's not true + * for all versions of liblzma. */ + /* failure("Compression-level=0 wrote %d bytes; default wrote %d bytes", (int)used2, (int)used1); assert(used2 > used1); + */ assert((a = archive_read_new()) != NULL); assertA(0 == archive_read_support_format_all(a)); From ef6f47c4ae9421ebfa00dc66a131bbd09b1e25ba Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Sun, 7 Aug 2011 15:52:13 +0000 Subject: [PATCH 173/452] Change lwp to int64_t as thr_pread_long() always uses a 64-bit value in order to account for LP64 targets when cross-debugging on ILP32, allowing r224683 to compile on ILP32. Note that thr_p{read,write}_{long,ptr}() still incorrectly use the size of the respective types on the host rather than that on the target when accessing the target address space which still needs to be fixed. This means that r224683 alone may not be sufficient to solve the problem it's intended to fix when cross-debugging. Approved by: re (hrs) --- lib/libthread_db/libthr_db.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/libthread_db/libthr_db.c b/lib/libthread_db/libthr_db.c index 65248c10630..b24385f9768 100644 --- a/lib/libthread_db/libthr_db.c +++ b/lib/libthread_db/libthr_db.c @@ -202,7 +202,7 @@ static td_err_e pt_ta_map_id2thr(const td_thragent_t *ta, thread_t id, td_thrhandle_t *th) { psaddr_t pt; - long lwp; + int64_t lwp; int ret; TDBG_FUNC(); @@ -245,7 +245,7 @@ pt_ta_thr_iter(const td_thragent_t *ta, td_thr_iter_f *callback, { td_thrhandle_t th; psaddr_t pt; - long lwp; + int64_t lwp; int ret; TDBG_FUNC(); @@ -368,7 +368,7 @@ pt_ta_event_getmsg(const td_thragent_t *ta, td_event_msg_t *msg) psaddr_t pt; td_thr_events_e tmp; - long lwp; + int64_t lwp; int ret; TDBG_FUNC(); @@ -672,7 +672,7 @@ pt_thr_event_getmsg(const td_thrhandle_t *th, td_event_msg_t *msg) static td_thrhandle_t handle; const td_thragent_t *ta = th->th_ta; psaddr_t pt, pt_temp; - long lwp; + int64_t lwp; int ret; td_thr_events_e tmp; From ea056888f5d0cb97b47fa0eb52e06cb389762480 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Sun, 7 Aug 2011 18:37:05 +0000 Subject: [PATCH 174/452] Convert pmcstat about using cpuset_t rather than relying on plain 32 bit ints. That fixes a first bug where pmcstat wasn't using the old cpumask_t interface and now also brings the full support for more than 32 cpus. While here, make the functions pmcstat_clone_event_descriptor() and pmcstat_get_cpumask() private to pmcstat. The problem of assuming cpu dense masks still persists and should be eventually fixed, as reported by avg. Tested by: pluknet Reviewed by: gnn Approved by: re (kib) --- usr.sbin/pmcstat/pmcstat.c | 145 +++++++++++++++++---------------- usr.sbin/pmcstat/pmcstat.h | 7 +- usr.sbin/pmcstat/pmcstat_log.c | 3 +- 3 files changed, 81 insertions(+), 74 deletions(-) diff --git a/usr.sbin/pmcstat/pmcstat.c b/usr.sbin/pmcstat/pmcstat.c index 52e02a8dd78..31ef8777053 100644 --- a/usr.sbin/pmcstat/pmcstat.c +++ b/usr.sbin/pmcstat/pmcstat.c @@ -31,9 +31,9 @@ #include __FBSDID("$FreeBSD$"); -#include -#include #include +#include +#include #include #include #include @@ -114,6 +114,55 @@ kvm_t *pmcstat_kvm; struct kinfo_proc *pmcstat_plist; struct pmcstat_args args; +static void +pmcstat_clone_event_descriptor(struct pmcstat_ev *ev, const cpuset_t *cpumask) +{ + int cpu, mcpu; + struct pmcstat_ev *ev_clone; + + mcpu = sizeof(*cpumask) * NBBY; + for (cpu = 0; cpu < mcpu; cpu++) { + if (!CPU_ISSET(cpu, cpumask)) + continue; + + if ((ev_clone = malloc(sizeof(*ev_clone))) == NULL) + errx(EX_SOFTWARE, "ERROR: Out of memory"); + (void) memset(ev_clone, 0, sizeof(*ev_clone)); + + ev_clone->ev_count = ev->ev_count; + ev_clone->ev_cpu = cpu; + ev_clone->ev_cumulative = ev->ev_cumulative; + ev_clone->ev_flags = ev->ev_flags; + ev_clone->ev_mode = ev->ev_mode; + ev_clone->ev_name = strdup(ev->ev_name); + ev_clone->ev_pmcid = ev->ev_pmcid; + ev_clone->ev_saved = ev->ev_saved; + ev_clone->ev_spec = strdup(ev->ev_spec); + + STAILQ_INSERT_TAIL(&args.pa_events, ev_clone, ev_next); + } +} + +static void +pmcstat_get_cpumask(const char *cpuspec, cpuset_t *cpumask) +{ + int cpu; + const char *s; + char *end; + + CPU_ZERO(cpumask); + s = cpuspec; + + do { + cpu = strtol(s, &end, 0); + if (cpu < 0 || end == s) + errx(EX_USAGE, "ERROR: Illegal CPU specification " + "\"%s\".", cpuspec); + CPU_SET(cpu, cpumask); + s = end + strspn(end, ", \t"); + } while (*s); +} + void pmcstat_attach_pmcs(void) { @@ -172,36 +221,6 @@ pmcstat_cleanup(void) pmcstat_shutdown_logging(); } -void -pmcstat_clone_event_descriptor(struct pmcstat_ev *ev, - uint32_t cpumask) -{ - int cpu; - struct pmcstat_ev *ev_clone; - - while ((cpu = ffs(cpumask)) > 0) { - cpu--; - - if ((ev_clone = malloc(sizeof(*ev_clone))) == NULL) - errx(EX_SOFTWARE, "ERROR: Out of memory"); - (void) memset(ev_clone, 0, sizeof(*ev_clone)); - - ev_clone->ev_count = ev->ev_count; - ev_clone->ev_cpu = cpu; - ev_clone->ev_cumulative = ev->ev_cumulative; - ev_clone->ev_flags = ev->ev_flags; - ev_clone->ev_mode = ev->ev_mode; - ev_clone->ev_name = strdup(ev->ev_name); - ev_clone->ev_pmcid = ev->ev_pmcid; - ev_clone->ev_saved = ev->ev_saved; - ev_clone->ev_spec = strdup(ev->ev_spec); - - STAILQ_INSERT_TAIL(&args.pa_events, ev_clone, ev_next); - - cpumask &= ~(1 << cpu); - } -} - void pmcstat_create_process(void) { @@ -322,29 +341,6 @@ pmcstat_find_targets(const char *spec) /*NOTREACHED*/ } -uint32_t -pmcstat_get_cpumask(const char *cpuspec) -{ - uint32_t cpumask; - int cpu; - const char *s; - char *end; - - s = cpuspec; - cpumask = 0ULL; - - do { - cpu = strtol(s, &end, 0); - if (cpu < 0 || end == s) - errx(EX_USAGE, "ERROR: Illegal CPU specification " - "\"%s\".", cpuspec); - cpumask |= (1 << cpu); - s = end + strspn(end, ", \t"); - } while (*s); - - return (cpumask); -} - void pmcstat_kill_process(void) { @@ -551,8 +547,9 @@ pmcstat_topexit(void) int main(int argc, char **argv) { + cpuset_t cpumask; double interval; - int option, npmc, ncpu; + int hcpu, option, npmc, ncpu; int c, check_driver_stats, current_cpu, current_sampling_count; int do_callchain, do_descendants, do_logproccsw, do_logprocexit; int do_print; @@ -561,7 +558,6 @@ main(int argc, char **argv) int pipefd[2], rfd; int use_cumulative_counts; short cf, cb; - uint32_t cpumask; char *end, *tmp; const char *errmsg, *graphfilename; enum pmcstat_state runstate; @@ -608,6 +604,7 @@ main(int argc, char **argv) bzero(&ds_start, sizeof(ds_start)); bzero(&ds_end, sizeof(ds_end)); ev = NULL; + CPU_ZERO(&cpumask); /* * The initial CPU mask specifies all non-halted CPUS in the @@ -616,7 +613,8 @@ main(int argc, char **argv) dummy = sizeof(int); if (sysctlbyname("hw.ncpu", &ncpu, &dummy, NULL, 0) < 0) err(EX_OSERR, "ERROR: Cannot determine the number of CPUs"); - cpumask = (1 << ncpu) - 1; + for (hcpu = 0; hcpu < ncpu; hcpu++) + CPU_SET(hcpu, &cpumask); while ((option = getopt(argc, argv, "CD:EF:G:M:NO:P:R:S:TWc:df:gk:m:n:o:p:qr:s:t:vw:z:")) != -1) @@ -628,10 +626,11 @@ main(int argc, char **argv) case 'c': /* CPU */ - if (optarg[0] == '*' && optarg[1] == '\0') - cpumask = (1 << ncpu) - 1; - else - cpumask = pmcstat_get_cpumask(optarg); + if (optarg[0] == '*' && optarg[1] == '\0') { + for (hcpu = 0; hcpu < ncpu; hcpu++) + CPU_SET(hcpu, &cpumask); + } else + pmcstat_get_cpumask(optarg, &cpumask); args.pa_flags |= FLAGS_HAS_CPUMASK; args.pa_required |= FLAG_HAS_SYSTEM_PMCS; @@ -745,9 +744,13 @@ main(int argc, char **argv) else ev->ev_count = -1; - if (option == 'S' || option == 's') - ev->ev_cpu = ffs(cpumask) - 1; - else + if (option == 'S' || option == 's') { + hcpu = sizeof(cpumask) * NBBY; + for (hcpu--; hcpu >= 0; hcpu--) + if (CPU_ISSET(hcpu, &cpumask)) + break; + ev->ev_cpu = hcpu; + } else ev->ev_cpu = PMC_CPU_ANY; ev->ev_flags = 0; @@ -773,9 +776,13 @@ main(int argc, char **argv) STAILQ_INSERT_TAIL(&args.pa_events, ev, ev_next); - if (option == 's' || option == 'S') - pmcstat_clone_event_descriptor(ev, - cpumask & ~(1 << ev->ev_cpu)); + if (option == 's' || option == 'S') { + hcpu = CPU_ISSET(ev->ev_cpu, &cpumask); + CPU_CLR(ev->ev_cpu, &cpumask); + pmcstat_clone_event_descriptor(ev, &cpumask); + if (hcpu != 0) + CPU_SET(ev->ev_cpu, &cpumask); + } break; @@ -882,7 +889,7 @@ main(int argc, char **argv) */ if ((args.pa_flags & FLAG_READ_LOGFILE) && (args.pa_flags & FLAGS_HAS_CPUMASK) == 0) - cpumask = 0xffffffff; + CPU_FILL(&cpumask); args.pa_cpumask = cpumask; /* For selecting CPUs using -R. */ diff --git a/usr.sbin/pmcstat/pmcstat.h b/usr.sbin/pmcstat/pmcstat.h index c9c24a916aa..6b64b76074f 100644 --- a/usr.sbin/pmcstat/pmcstat.h +++ b/usr.sbin/pmcstat/pmcstat.h @@ -33,6 +33,8 @@ #ifndef _PMCSTAT_H_ #define _PMCSTAT_H_ +#include + #define FLAG_HAS_TARGET 0x00000001 /* process target */ #define FLAG_HAS_WAIT_INTERVAL 0x00000002 /* -w secs */ #define FLAG_HAS_OUTPUT_LOGFILE 0x00000004 /* -O file or pipe */ @@ -140,7 +142,7 @@ struct pmcstat_args { FILE *pa_graphfile; /* where to send the callgraph */ int pa_graphdepth; /* print depth for callgraphs */ double pa_interval; /* printing interval in seconds */ - uint32_t pa_cpumask; /* filter for CPUs analysed */ + cpuset_t pa_cpumask; /* filter for CPUs analysed */ int pa_ctdumpinstr; /* dump instructions with calltree */ int pa_topmode; /* delta or accumulative */ int pa_toptty; /* output to tty or file */ @@ -159,8 +161,6 @@ extern struct pmcstat_args args; /* command line args */ /* Function prototypes */ void pmcstat_attach_pmcs(void); void pmcstat_cleanup(void); -void pmcstat_clone_event_descriptor( - struct pmcstat_ev *_ev, uint32_t _cpumask); int pmcstat_close_log(void); void pmcstat_create_process(void); void pmcstat_find_targets(const char *_arg); @@ -178,7 +178,6 @@ int pmcstat_process_log(void); int pmcstat_keypress_log(void); void pmcstat_display_log(void); void pmcstat_pluginconfigure_log(char *_opt); -uint32_t pmcstat_get_cpumask(const char *_a); void pmcstat_topexit(void); #endif /* _PMCSTAT_H_ */ diff --git a/usr.sbin/pmcstat/pmcstat_log.c b/usr.sbin/pmcstat/pmcstat_log.c index bebe9452756..b7dc956d807 100644 --- a/usr.sbin/pmcstat/pmcstat_log.c +++ b/usr.sbin/pmcstat/pmcstat_log.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -1435,7 +1436,7 @@ pmcstat_analyze_log(void) cpu = PMC_CALLCHAIN_CPUFLAGS_TO_CPU(cpuflags); /* Filter on the CPU id. */ - if ((args.pa_cpumask & (1 << cpu)) == 0) { + if (!CPU_ISSET(cpu, &(args.pa_cpumask))) { pmcstat_stats.ps_samples_skipped++; break; } From 88c037e26a699625d5425a79856fa45457a82e8e Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Sun, 7 Aug 2011 20:16:46 +0000 Subject: [PATCH 175/452] Change all the sample kernel configurations to use NFSCL, NFSD instead of NFSCLIENT, NFSSERVER since NFSCL and NFSD are now the defaults. The client change is needed for diskless configurations, so that the root mount works for fstype nfs. Reported by seanbru at yahoo-inc.com for i386/XEN. Approved by: re (hrs) --- sys/amd64/conf/GENERIC | 2 +- sys/arm/conf/AVILA | 4 ++-- sys/arm/conf/BWCT | 6 +++--- sys/arm/conf/CAMBRIA | 4 ++-- sys/arm/conf/CNS11XXNAS | 6 +++--- sys/arm/conf/CRB | 6 +++--- sys/arm/conf/DB-78XXX | 4 ++-- sys/arm/conf/DB-88F5XXX | 4 ++-- sys/arm/conf/DB-88F6XXX | 4 ++-- sys/arm/conf/DOCKSTAR | 4 ++-- sys/arm/conf/EP80219 | 6 +++--- sys/arm/conf/GUMSTIX | 6 +++--- sys/arm/conf/HL200 | 6 +++--- sys/arm/conf/HL201 | 6 +++--- sys/arm/conf/IQ31244 | 6 +++--- sys/arm/conf/KB920X | 6 +++--- sys/arm/conf/LN2410SBC | 2 +- sys/arm/conf/NSLU | 6 +++--- sys/arm/conf/QILA9G20 | 6 +++--- sys/arm/conf/SAM9G20EK | 6 +++--- sys/arm/conf/SHEEVAPLUG | 4 ++-- sys/arm/conf/SIMICS | 6 +++--- sys/arm/conf/TS7800 | 4 ++-- sys/i386/conf/GENERIC | 2 +- sys/i386/conf/XBOX | 6 +++--- sys/i386/conf/XEN | 6 +++--- sys/pc98/conf/GENERIC | 2 +- sys/sparc64/conf/GENERIC | 2 +- 28 files changed, 66 insertions(+), 66 deletions(-) diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC index 4bfcfa328ce..4a38ebf2477 100644 --- a/sys/amd64/conf/GENERIC +++ b/sys/amd64/conf/GENERIC @@ -37,7 +37,7 @@ options MD_ROOT # MD is a potential root device options NFSCL # New Network Filesystem Client options NFSD # New Network Filesystem Server options NFSLOCKD # Network Lock Manager -options NFS_ROOT # NFS usable as /, requires NFSCLIENT +options NFS_ROOT # NFS usable as /, requires NFSCL options MSDOSFS # MSDOS Filesystem options CD9660 # ISO 9660 Filesystem options PROCFS # Process filesystem (requires PSEUDOFS) diff --git a/sys/arm/conf/AVILA b/sys/arm/conf/AVILA index 0140eb0f57a..7916b2cc68f 100644 --- a/sys/arm/conf/AVILA +++ b/sys/arm/conf/AVILA @@ -50,8 +50,8 @@ options SCHED_4BSD #4BSD scheduler options INET #InterNETworking options FFS #Berkeley Fast Filesystem options SOFTUPDATES #Enable FFS soft updates support -options NFSCLIENT #Network Filesystem Client -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFSCL #New Network Filesystem Client +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP options BOOTP_NFSROOT options BOOTP_NFSV3 diff --git a/sys/arm/conf/BWCT b/sys/arm/conf/BWCT index 0fb3b872cba..3a28e487d7b 100644 --- a/sys/arm/conf/BWCT +++ b/sys/arm/conf/BWCT @@ -46,10 +46,10 @@ options SOFTUPDATES #Enable FFS soft updates support #options MD_ROOT_SIZE=4096 # 3MB ram disk #options ROOTDEVNAME=\"ufs:md0\" #options ROOTDEVNAME=\"ufs:/dev/mmcsd0s1a\" -options NFSCLIENT #Network Filesystem Client -#options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +#options NFSD #New Network Filesystem Server #options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP_NFSROOT options BOOTP diff --git a/sys/arm/conf/CAMBRIA b/sys/arm/conf/CAMBRIA index befe28af723..19a8daa5572 100644 --- a/sys/arm/conf/CAMBRIA +++ b/sys/arm/conf/CAMBRIA @@ -51,8 +51,8 @@ options SCHED_4BSD #4BSD scheduler options INET #InterNETworking options FFS #Berkeley Fast Filesystem options SOFTUPDATES #Enable FFS soft updates support -options NFSCLIENT #Network Filesystem Client -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFSCL #New Network Filesystem Client +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP options BOOTP_NFSROOT options BOOTP_NFSV3 diff --git a/sys/arm/conf/CNS11XXNAS b/sys/arm/conf/CNS11XXNAS index 76db42b4e36..2832779a5ad 100644 --- a/sys/arm/conf/CNS11XXNAS +++ b/sys/arm/conf/CNS11XXNAS @@ -66,10 +66,10 @@ options FFS #Berkeley Fast Filesystem options SOFTUPDATES #Enable FFS soft updates support options UFS_ACL #Support for access control lists options UFS_DIRHASH #Improve performance on big directories -options NFSCLIENT #Network Filesystem Client -#options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +#options NFSD #New Network Filesystem Server #options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL options MSDOSFS #MSDOS Filesystem #options CD9660 #ISO 9660 Filesystem #options PROCFS #Process filesystem (requires PSEUDOFS) diff --git a/sys/arm/conf/CRB b/sys/arm/conf/CRB index 45f19e03202..bf12e0b819e 100644 --- a/sys/arm/conf/CRB +++ b/sys/arm/conf/CRB @@ -41,10 +41,10 @@ options FFS #Berkeley Fast Filesystem options SOFTUPDATES #Enable FFS soft updates support options UFS_ACL #Support for access control lists options UFS_DIRHASH #Improve performance on big directories -options NFSCLIENT #Network Filesystem Client -options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +options NFSD #New Network Filesystem Server options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL #options MSDOSFS #MSDOS Filesystem options CD9660 #ISO 9660 Filesystem #options PROCFS #Process filesystem (requires PSEUDOFS) diff --git a/sys/arm/conf/DB-78XXX b/sys/arm/conf/DB-78XXX index 7b58adaa937..d38ae55aade 100644 --- a/sys/arm/conf/DB-78XXX +++ b/sys/arm/conf/DB-78XXX @@ -17,9 +17,9 @@ options SCHED_4BSD #4BSD scheduler options INET #InterNETworking options INET6 #IPv6 communications protocols options FFS #Berkeley Fast Filesystem -options NFSCLIENT #Network Filesystem Client +options NFSCL #New Network Filesystem Client options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP options BOOTP_NFSROOT options BOOTP_NFSV3 diff --git a/sys/arm/conf/DB-88F5XXX b/sys/arm/conf/DB-88F5XXX index 655d4a736af..d5df863c015 100644 --- a/sys/arm/conf/DB-88F5XXX +++ b/sys/arm/conf/DB-88F5XXX @@ -17,9 +17,9 @@ options SCHED_4BSD #4BSD scheduler options INET #InterNETworking options INET6 #IPv6 communications protocols options FFS #Berkeley Fast Filesystem -options NFSCLIENT #Network Filesystem Client +options NFSCL #New Network Filesystem Client options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP options BOOTP_NFSROOT options BOOTP_NFSV3 diff --git a/sys/arm/conf/DB-88F6XXX b/sys/arm/conf/DB-88F6XXX index ff9f28940bf..fec1c4e7f20 100644 --- a/sys/arm/conf/DB-88F6XXX +++ b/sys/arm/conf/DB-88F6XXX @@ -17,9 +17,9 @@ options SCHED_4BSD #4BSD scheduler options INET #InterNETworking options INET6 #IPv6 communications protocols options FFS #Berkeley Fast Filesystem -options NFSCLIENT #Network Filesystem Client +options NFSCL #New Network Filesystem Client options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP options BOOTP_NFSROOT options BOOTP_NFSV3 diff --git a/sys/arm/conf/DOCKSTAR b/sys/arm/conf/DOCKSTAR index 780cb78d4d6..4e5b5963942 100644 --- a/sys/arm/conf/DOCKSTAR +++ b/sys/arm/conf/DOCKSTAR @@ -17,9 +17,9 @@ options SCHED_4BSD #4BSD scheduler options INET #InterNETworking options INET6 #IPv6 communications protocols options FFS #Berkeley Fast Filesystem -options NFSCLIENT #Network Filesystem Client +options NFSCL #New Network Filesystem Client options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP options BOOTP_NFSROOT options BOOTP_NFSV3 diff --git a/sys/arm/conf/EP80219 b/sys/arm/conf/EP80219 index 23717dfa963..38b0c2f4488 100644 --- a/sys/arm/conf/EP80219 +++ b/sys/arm/conf/EP80219 @@ -40,10 +40,10 @@ options FFS #Berkeley Fast Filesystem options SOFTUPDATES #Enable FFS soft updates support options UFS_ACL #Support for access control lists options UFS_DIRHASH #Improve performance on big directories -options NFSCLIENT #Network Filesystem Client -options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +options NFSD #New Network Filesystem Server options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL #options MSDOSFS #MSDOS Filesystem options CD9660 #ISO 9660 Filesystem #options PROCFS #Process filesystem (requires PSEUDOFS) diff --git a/sys/arm/conf/GUMSTIX b/sys/arm/conf/GUMSTIX index e7900f5660c..8017a7ae3fd 100644 --- a/sys/arm/conf/GUMSTIX +++ b/sys/arm/conf/GUMSTIX @@ -45,9 +45,9 @@ options FFS #Berkeley Fast Filesystem options SOFTUPDATES #Enable FFS soft updates support options UFS_ACL #Support for access control lists options UFS_DIRHASH #Improve performance on big directories -options NFSCLIENT #Network Filesystem Client -#options NFSSERVER #Network Filesystem Server -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFSCL #New Network Filesystem Client +#options NFSD #New Network Filesystem Server +options NFS_ROOT #NFS usable as /, requires NFSCL #options MSDOSFS #MSDOS Filesystem #options CD9660 #ISO 9660 Filesystem #options PROCFS #Process filesystem (requires PSEUDOFS) diff --git a/sys/arm/conf/HL200 b/sys/arm/conf/HL200 index dd46a61c2fd..e42974d1333 100644 --- a/sys/arm/conf/HL200 +++ b/sys/arm/conf/HL200 @@ -39,10 +39,10 @@ options FFS #Berkeley Fast Filesystem #options MD_ROOT #MD is a potential root device #options MD_ROOT_SIZE=4096 # 3MB ram disk #options ROOTDEVNAME=\"ufs:/dev/mmcsd0s1a\" -options NFSCLIENT #Network Filesystem Client -#options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +#options NFSD #New Network Filesystem Server #options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP_NFSROOT options BOOTP options BOOTP_NFSV3 diff --git a/sys/arm/conf/HL201 b/sys/arm/conf/HL201 index 6524cc648e8..af4266c86c6 100644 --- a/sys/arm/conf/HL201 +++ b/sys/arm/conf/HL201 @@ -39,10 +39,10 @@ options FFS #Berkeley Fast Filesystem #options MD_ROOT #MD is a potential root device #options MD_ROOT_SIZE=4096 # 3MB ram disk #options ROOTDEVNAME=\"ufs:/dev/mmcsd0s1a\" -options NFSCLIENT #Network Filesystem Client -#options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +#options NFSD #New Network Filesystem Server #options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP_NFSROOT options BOOTP options BOOTP_NFSV3 diff --git a/sys/arm/conf/IQ31244 b/sys/arm/conf/IQ31244 index 56798116c43..e35427c679d 100644 --- a/sys/arm/conf/IQ31244 +++ b/sys/arm/conf/IQ31244 @@ -41,10 +41,10 @@ options FFS #Berkeley Fast Filesystem options SOFTUPDATES #Enable FFS soft updates support options UFS_ACL #Support for access control lists options UFS_DIRHASH #Improve performance on big directories -options NFSCLIENT #Network Filesystem Client -options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +options NFSD #New Network Filesystem Server options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL #options MSDOSFS #MSDOS Filesystem options CD9660 #ISO 9660 Filesystem #options PROCFS #Process filesystem (requires PSEUDOFS) diff --git a/sys/arm/conf/KB920X b/sys/arm/conf/KB920X index f47e9acf09b..e9aa36ef75c 100644 --- a/sys/arm/conf/KB920X +++ b/sys/arm/conf/KB920X @@ -40,10 +40,10 @@ options FFS #Berkeley Fast Filesystem #options MD_ROOT #MD is a potential root device #options MD_ROOT_SIZE=4096 # 4MB ram disk options ROOTDEVNAME=\"ufs:/dev/mmcsd0s1a\" -options NFSCLIENT #Network Filesystem Client -#options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +#options NFSD #New Network Filesystem Server #options NFSLOCKD #Network Lock Manager -#options NFS_ROOT #NFS usable as /, requires NFSCLIENT +#options NFS_ROOT #NFS usable as /, requires NFSCL #options BOOTP_NFSROOT #options BOOTP diff --git a/sys/arm/conf/LN2410SBC b/sys/arm/conf/LN2410SBC index e4f3a5445c6..4598aef57ff 100644 --- a/sys/arm/conf/LN2410SBC +++ b/sys/arm/conf/LN2410SBC @@ -45,7 +45,7 @@ options ROOTDEVNAME=\"ufs:da0s1\" #options BOOTP #options BOOTP_NFSROOT # NFS mount root filesystem using BOOTP info -#options NFSCLIENT #Network File System client +#options NFSCL #New Network Filesystem Client #options NFS_ROOT #NFS usable as root device options PSEUDOFS #Pseudo-filesystem framework diff --git a/sys/arm/conf/NSLU b/sys/arm/conf/NSLU index d921e349024..2e4f4b1cc5a 100644 --- a/sys/arm/conf/NSLU +++ b/sys/arm/conf/NSLU @@ -58,10 +58,10 @@ options FFS #Berkeley Fast Filesystem options SOFTUPDATES #Enable FFS soft updates support options UFS_ACL #Support for access control lists options UFS_DIRHASH #Improve performance on big directories -options NFSCLIENT #Network Filesystem Client -options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +options NFSD #New Network Filesystem Server options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL #options MSDOSFS #MSDOS Filesystem options CD9660 #ISO 9660 Filesystem #options PROCFS #Process filesystem (requires PSEUDOFS) diff --git a/sys/arm/conf/QILA9G20 b/sys/arm/conf/QILA9G20 index 55839cee1ad..a99b7f470b9 100644 --- a/sys/arm/conf/QILA9G20 +++ b/sys/arm/conf/QILA9G20 @@ -39,10 +39,10 @@ options FFS #Berkeley Fast Filesystem #options UFS_DIRHASH #Improve performance on big directories #options MD_ROOT #MD is a potential root device #options MD_ROOT_SIZE=4096 # 3MB ram disk -options NFSCLIENT #Network Filesystem Client -#options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +#options NFSD #New Network Filesystem Server #options NFSLOCKD #Network Lock Manager -#options NFS_ROOT #NFS usable as /, requires NFSCLIENT +#options NFS_ROOT #NFS usable as /, requires NFSCL #options BOOTP_NFSROOT #options BOOTP #options BOOTP_NFSV3 diff --git a/sys/arm/conf/SAM9G20EK b/sys/arm/conf/SAM9G20EK index 6c2e94ef1cd..a9d0f967753 100644 --- a/sys/arm/conf/SAM9G20EK +++ b/sys/arm/conf/SAM9G20EK @@ -38,10 +38,10 @@ options FFS #Berkeley Fast Filesystem #options UFS_DIRHASH #Improve performance on big directories #options MD_ROOT #MD is a potential root device #options MD_ROOT_SIZE=4096 # 3MB ram disk -options NFSCLIENT #Network Filesystem Client -#options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +#options NFSD #New Network Filesystem Server #options NFSLOCKD #Network Lock Manager -#options NFS_ROOT #NFS usable as /, requires NFSCLIENT +#options NFS_ROOT #NFS usable as /, requires NFSCL #options BOOTP_NFSROOT #options BOOTP #options BOOTP_NFSV3 diff --git a/sys/arm/conf/SHEEVAPLUG b/sys/arm/conf/SHEEVAPLUG index 75a5474517e..5392c95093e 100644 --- a/sys/arm/conf/SHEEVAPLUG +++ b/sys/arm/conf/SHEEVAPLUG @@ -17,9 +17,9 @@ options SCHED_4BSD #4BSD scheduler options INET #InterNETworking options INET6 #IPv6 communications protocols options FFS #Berkeley Fast Filesystem -options NFSCLIENT #Network Filesystem Client +options NFSCL #New Network Filesystem Client options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP options BOOTP_NFSROOT options BOOTP_NFSV3 diff --git a/sys/arm/conf/SIMICS b/sys/arm/conf/SIMICS index 229c60f9cde..84ff983cde0 100644 --- a/sys/arm/conf/SIMICS +++ b/sys/arm/conf/SIMICS @@ -39,10 +39,10 @@ options UFS_ACL #Support for access control lists options UFS_DIRHASH #Improve performance on big directories options MD_ROOT #MD is a potential root device options ROOTDEVNAME=\"ufs:md0\" -options NFSCLIENT #Network Filesystem Client -options NFSSERVER #Network Filesystem Server +options NFSCL #New Network Filesystem Client +options NFSD #New Network Filesystem Server options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL #options MSDOSFS #MSDOS Filesystem options CD9660 #ISO 9660 Filesystem #options PROCFS #Process filesystem (requires PSEUDOFS) diff --git a/sys/arm/conf/TS7800 b/sys/arm/conf/TS7800 index c72661af001..5300ccab92f 100644 --- a/sys/arm/conf/TS7800 +++ b/sys/arm/conf/TS7800 @@ -18,9 +18,9 @@ options INET #InterNETworking options INET6 #IPv6 communications protocols options FFS #Berkeley Fast Filesystem options SOFTUPDATES # Enable FFS soft updates support -options NFSCLIENT #Network Filesystem Client +options NFSCL #New Network Filesystem Client options NFSLOCKD #Network Lock Manager -options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options NFS_ROOT #NFS usable as /, requires NFSCL options BOOTP options BOOTP_NFSROOT options BOOTP_NFSV3 diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC index c4548c6bce1..87da6e75709 100644 --- a/sys/i386/conf/GENERIC +++ b/sys/i386/conf/GENERIC @@ -39,7 +39,7 @@ options MD_ROOT # MD is a potential root device options NFSCL # New Network Filesystem Client options NFSD # New Network Filesystem Server options NFSLOCKD # Network Lock Manager -options NFS_ROOT # NFS usable as /, requires NFSCLIENT +options NFS_ROOT # NFS usable as /, requires NFSCL options MSDOSFS # MSDOS Filesystem options CD9660 # ISO 9660 Filesystem options PROCFS # Process filesystem (requires PSEUDOFS) diff --git a/sys/i386/conf/XBOX b/sys/i386/conf/XBOX index a3e8a6bbbc2..9ee270b8ae4 100644 --- a/sys/i386/conf/XBOX +++ b/sys/i386/conf/XBOX @@ -27,10 +27,10 @@ options SOFTUPDATES # Enable FFS soft updates support #options UFS_ACL # Support for access control lists #options UFS_DIRHASH # Improve performance on big directories #options MD_ROOT # MD is a potential root device -options NFSCLIENT # Network Filesystem Client -#options NFSSERVER # Network Filesystem Server +options NFSCL # New Network Filesystem Client +#options NFSD # New Network Filesystem Server #options NFSLOCKD # Network Lock Manager -#options NFS_ROOT # NFS usable as /, requires NFSCLIENT +#options NFS_ROOT # NFS usable as /, requires NFSCL #options MSDOSFS # MSDOS Filesystem options CD9660 # ISO 9660 Filesystem #options PROCFS # Process filesystem (requires PSEUDOFS) diff --git a/sys/i386/conf/XEN b/sys/i386/conf/XEN index f1fb99bab82..ad453bf80a1 100644 --- a/sys/i386/conf/XEN +++ b/sys/i386/conf/XEN @@ -21,10 +21,10 @@ options SOFTUPDATES # Enable FFS soft updates support options UFS_ACL # Support for access control lists options UFS_DIRHASH # Improve performance on big directories options UFS_GJOURNAL # Enable gjournal-based UFS journaling -options NFSCLIENT # Network Filesystem Client -options NFSSERVER # Network Filesystem Server +options NFSCL # New Network Filesystem Client +options NFSD # New Network Filesystem Server options NFSLOCKD # Network Lock Manager -options NFS_ROOT # NFS usable as /, requires NFSCLIENT +options NFS_ROOT # NFS usable as /, requires NFSCL options MSDOSFS # MSDOS Filesystem options CD9660 # ISO 9660 Filesystem options PROCFS # Process filesystem (requires PSEUDOFS) diff --git a/sys/pc98/conf/GENERIC b/sys/pc98/conf/GENERIC index e2bed44764b..0995dfc9ff5 100644 --- a/sys/pc98/conf/GENERIC +++ b/sys/pc98/conf/GENERIC @@ -39,7 +39,7 @@ options MD_ROOT # MD is a potential root device options NFSCL # New Network Filesystem Client options NFSD # New Network Filesystem Server options NFSLOCKD # Network Lock Manager -options NFS_ROOT # NFS usable as /, requires NFSCLIENT +options NFS_ROOT # NFS usable as /, requires NFSCL options MSDOSFS # MSDOS Filesystem options CD9660 # ISO 9660 Filesystem options PROCFS # Process filesystem (requires PSEUDOFS) diff --git a/sys/sparc64/conf/GENERIC b/sys/sparc64/conf/GENERIC index 11c5d35f71a..fdafe697cf1 100644 --- a/sys/sparc64/conf/GENERIC +++ b/sys/sparc64/conf/GENERIC @@ -40,7 +40,7 @@ options MD_ROOT # MD is a potential root device options NFSCL # New Network Filesystem Client options NFSD # New Network Filesystem Server options NFSLOCKD # Network Lock Manager -options NFS_ROOT # NFS usable as /, requires NFSCLIENT +options NFS_ROOT # NFS usable as /, requires NFSCL #options MSDOSFS # MSDOS Filesystem options CD9660 # ISO 9660 Filesystem options PROCFS # Process filesystem (requires PSEUDOFS) From b837506cbc429d80095471885e80b6caf34b1270 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sun, 7 Aug 2011 20:24:32 +0000 Subject: [PATCH 176/452] Merge revision 3554 from libarchive's release/2.8 branch: Partial merge of 2431 from trunk: Retry writes on EINTR. This should fix the SIGINT handler in bsdtar. Note: The rest of r2431 can't be merged, since it interacts with a big write-side rearchitecture. PR: bin/149409 Reviewed by: kientzle Approved by: re (kib) MFC after: 3 days --- lib/libarchive/archive_write_open_fd.c | 15 +++++++++------ lib/libarchive/archive_write_open_file.c | 14 +++++++++----- lib/libarchive/archive_write_open_filename.c | 14 +++++++++----- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/lib/libarchive/archive_write_open_fd.c b/lib/libarchive/archive_write_open_fd.c index b0793a26bc8..1d27ce36cf8 100644 --- a/lib/libarchive/archive_write_open_fd.c +++ b/lib/libarchive/archive_write_open_fd.c @@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$"); #include "archive.h" struct write_fd_data { - off_t offset; int fd; }; @@ -122,12 +121,16 @@ file_write(struct archive *a, void *client_data, const void *buff, size_t length ssize_t bytesWritten; mine = (struct write_fd_data *)client_data; - bytesWritten = write(mine->fd, buff, length); - if (bytesWritten <= 0) { - archive_set_error(a, errno, "Write error"); - return (-1); + for (;;) { + bytesWritten = write(mine->fd, buff, length); + if (bytesWritten <= 0) { + if (errno == EINTR) + continue; + archive_set_error(a, errno, "Write error"); + return (-1); + } + return (bytesWritten); } - return (bytesWritten); } static int diff --git a/lib/libarchive/archive_write_open_file.c b/lib/libarchive/archive_write_open_file.c index c99414fd1e5..68bf236f8ec 100644 --- a/lib/libarchive/archive_write_open_file.c +++ b/lib/libarchive/archive_write_open_file.c @@ -86,12 +86,16 @@ file_write(struct archive *a, void *client_data, const void *buff, size_t length size_t bytesWritten; mine = client_data; - bytesWritten = fwrite(buff, 1, length, mine->f); - if (bytesWritten < length) { - archive_set_error(a, errno, "Write error"); - return (-1); + for (;;) { + bytesWritten = fwrite(buff, 1, length, mine->f); + if (bytesWritten <= 0) { + if (errno == EINTR) + continue; + archive_set_error(a, errno, "Write error"); + return (-1); + } + return (bytesWritten); } - return (bytesWritten); } static int diff --git a/lib/libarchive/archive_write_open_filename.c b/lib/libarchive/archive_write_open_filename.c index 1db11f9e52d..0c1e189034c 100644 --- a/lib/libarchive/archive_write_open_filename.c +++ b/lib/libarchive/archive_write_open_filename.c @@ -142,12 +142,16 @@ file_write(struct archive *a, void *client_data, const void *buff, size_t length ssize_t bytesWritten; mine = (struct write_file_data *)client_data; - bytesWritten = write(mine->fd, buff, length); - if (bytesWritten <= 0) { - archive_set_error(a, errno, "Write error"); - return (-1); + for (;;) { + bytesWritten = write(mine->fd, buff, length); + if (bytesWritten <= 0) { + if (errno == EINTR) + continue; + archive_set_error(a, errno, "Write error"); + return (-1); + } + return (bytesWritten); } - return (bytesWritten); } static int From 3462b16f2920071a44f7e0161add348f64e951a9 Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Mon, 8 Aug 2011 03:09:03 +0000 Subject: [PATCH 177/452] Fix a pathname (s,netinet/if_ether.h,net/ethernet.h,). PR: docs/159341 Submitted by: Garrett Cooper Approved by: re (kib) --- lib/libc/net/ethers.3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libc/net/ethers.3 b/lib/libc/net/ethers.3 index c8aa51a1f48..6fe568b8765 100644 --- a/lib/libc/net/ethers.3 +++ b/lib/libc/net/ethers.3 @@ -68,7 +68,7 @@ These functions operate on ethernet addresses using an .Vt ether_addr structure, which is defined in the header file -.In netinet/if_ether.h : +.In net/ethernet.h : .Bd -literal -offset indent /* * The number of bytes in an ethernet (MAC) address. From 8945a9a0038cdace7204fab31e9420f8fdab953c Mon Sep 17 00:00:00 2001 From: Kevin Lo Date: Mon, 8 Aug 2011 05:22:09 +0000 Subject: [PATCH 178/452] catstrg() does not set the resulting string length. PR: bin/152549 Submitted by: Henning Petersen Approved by: re (hrs) --- usr.bin/xlint/lint1/tree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/usr.bin/xlint/lint1/tree.c b/usr.bin/xlint/lint1/tree.c index 2a65d80a797..12417bad3c2 100644 --- a/usr.bin/xlint/lint1/tree.c +++ b/usr.bin/xlint/lint1/tree.c @@ -3786,6 +3786,7 @@ catstrg(strg_t *strg1, strg_t *strg2) (len2 + 1) * sizeof (wchar_t)); free(strg2->st_wcp); } + strg1->st_len = len; free(strg2); return (strg1); From e9ff3d45e455ad240931b9694830550ab3cd1bf9 Mon Sep 17 00:00:00 2001 From: Kevin Lo Date: Mon, 8 Aug 2011 05:25:51 +0000 Subject: [PATCH 179/452] In rtinit1(), before rtrequest1_fib() is called, info.rti_flags is initialized by flags (function argument) or-ed with ifa->ifa_flags. If both NIC has a loopback route to itself, so IFA_RTSELF is set on ifa(s). As IFA_RTSELF is defined by RTF_HOST, rtrequest1_fib() is called with RTF_HOST flag even if netmask is not NULL. Consequently, netmask is set to zero in rtrequest1_fib(), and request to add network route is changed under hands to request to add host route. Tested by: Andrew Boyer Submitted by: Svatopluk Kraus Approved by: re (hrs) --- sys/net/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/net/route.c b/sys/net/route.c index 9c7dfac542f..d42b4c73b40 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -1478,7 +1478,7 @@ rtinit1(struct ifaddr *ifa, int cmd, int flags, int fibnum) */ bzero((caddr_t)&info, sizeof(info)); info.rti_ifa = ifa; - info.rti_flags = flags | ifa->ifa_flags; + info.rti_flags = flags | (ifa->ifa_flags & ~IFA_RTSELF); info.rti_info[RTAX_DST] = dst; /* * doing this for compatibility reasons From 6c8ea37c68bef5ad7b652c7e38e338b95062f0f8 Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Mon, 8 Aug 2011 13:13:22 +0000 Subject: [PATCH 180/452] Change "options NFSCLIENT" to "options NFSCL" in diskless.8, since that is now the default NFS client. This is a content change. Reported by: shuvaev at physik.uni-wuerzburg.de Approved by: re (hrs) --- share/man/man8/diskless.8 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/share/man/man8/diskless.8 b/share/man/man8/diskless.8 index a7282eac5e0..3fcbc25c727 100644 --- a/share/man/man8/diskless.8 +++ b/share/man/man8/diskless.8 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 10, 2005 +.Dd August 7, 2011 .Dt DISKLESS 8 .Os .Sh NAME @@ -417,7 +417,7 @@ or .Tn TFTP , must include support for the NFS client: .Pp -.D1 Cd "options NFSCLIENT" +.D1 Cd "options NFSCL" .D1 Cd "options NFS_ROOT" .Pp If you are using a boot mechanism that does not pass network configuration From 60829c4817ae30b8b75fbef56f959ef665b626b6 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Mon, 8 Aug 2011 13:15:39 +0000 Subject: [PATCH 181/452] Add another HAL method - ah_isFastClockEnabled - which returns AH_TRUE if 5ghz fast clock is enabled in the current operating mode. It's slightly dirty, but it's part of the reference HAL and used by the (currently closed-source) radar event code to map radar pulses back to microsecond durations. Obtained from: Atheros Approved by: re (kib, blanket) --- sys/dev/ath/ath_hal/ah.h | 1 + sys/dev/ath/ath_hal/ar5212/ar5212.h | 1 + sys/dev/ath/ath_hal/ar5212/ar5212_attach.c | 1 + sys/dev/ath/ath_hal/ar5212/ar5212_misc.c | 10 ++++++++++ sys/dev/ath/ath_hal/ar5416/ar5416.h | 1 + sys/dev/ath/ath_hal/ar5416/ar5416_attach.c | 1 + sys/dev/ath/ath_hal/ar5416/ar5416_misc.c | 12 ++++++++++++ sys/dev/ath/if_athvar.h | 2 ++ 8 files changed, 29 insertions(+) diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h index 58d63486677..0dbb986da90 100644 --- a/sys/dev/ath/ath_hal/ah.h +++ b/sys/dev/ath/ath_hal/ah.h @@ -958,6 +958,7 @@ struct ath_hal { HAL_BOOL __ahdecl(*ah_procRadarEvent)(struct ath_hal *ah, struct ath_rx_status *rxs, uint64_t fulltsf, const char *buf, HAL_DFS_EVENT *event); + HAL_BOOL __ahdecl(*ah_isFastClockEnabled)(struct ath_hal *ah); /* Key Cache Functions */ uint32_t __ahdecl(*ah_getKeyCacheSize)(struct ath_hal*); diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212.h b/sys/dev/ath/ath_hal/ar5212/ar5212.h index 8503a629aa3..b93ab11bb91 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212.h +++ b/sys/dev/ath/ath_hal/ar5212/ar5212.h @@ -625,5 +625,6 @@ extern void ar5212GetDfsThresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe); extern HAL_BOOL ar5212ProcessRadarEvent(struct ath_hal *ah, struct ath_rx_status *rxs, uint64_t fulltsf, const char *buf, HAL_DFS_EVENT *event); +extern HAL_BOOL ar5212IsFastClockEnabled(struct ath_hal *ah); #endif /* _ATH_AR5212_H_ */ diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c index 01c0e2c8ad0..fe48b2eb1ad 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c @@ -133,6 +133,7 @@ static const struct ath_hal_private ar5212hal = {{ .ah_enableDfs = ar5212EnableDfs, .ah_getDfsThresh = ar5212GetDfsThresh, .ah_procRadarEvent = ar5212ProcessRadarEvent, + .ah_isFastClockEnabled = ar5212IsFastClockEnabled, /* Key Cache Functions */ .ah_getKeyCacheSize = ar5212GetKeyCacheSize, diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c b/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c index 3a6019d993f..5bcde762a5d 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c @@ -1222,3 +1222,13 @@ ar5212ProcessRadarEvent(struct ath_hal *ah, struct ath_rx_status *rxs, return AH_TRUE; } + +/* + * Return whether 5GHz fast-clock (44MHz) is enabled. + * It's always disabled for AR5212 series NICs. + */ +HAL_BOOL +ar5212IsFastClockEnabled(struct ath_hal *ah) +{ + return AH_FALSE; +} diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416.h b/sys/dev/ath/ath_hal/ar5416/ar5416.h index 5422f700053..522338240fb 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416.h @@ -208,6 +208,7 @@ extern void ar5416GetDfsThresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe); extern HAL_BOOL ar5416ProcessRadarEvent(struct ath_hal *ah, struct ath_rx_status *rxs, uint64_t fulltsf, const char *buf, HAL_DFS_EVENT *event); +extern HAL_BOOL ar5416IsFastClockEnabled(struct ath_hal *ah); extern HAL_BOOL ar5416SetPowerMode(struct ath_hal *ah, HAL_POWER_MODE mode, int setChip); diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c index 0f8744f68bd..647d9d84da9 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c @@ -150,6 +150,7 @@ ar5416InitState(struct ath_hal_5416 *ahp5416, uint16_t devid, HAL_SOFTC sc, ah->ah_enableDfs = ar5416EnableDfs; ah->ah_getDfsThresh = ar5416GetDfsThresh; ah->ah_procRadarEvent = ar5416ProcessRadarEvent; + ah->ah_isFastClockEnabled = ar5416IsFastClockEnabled; /* Power Management Functions */ ah->ah_setPowerMode = ar5416SetPowerMode; diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c index 740d61fd49c..a0952f86696 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c @@ -731,3 +731,15 @@ ar5416ProcessRadarEvent(struct ath_hal *ah, struct ath_rx_status *rxs, */ return AH_FALSE; } + +/* + * Return whether fast-clock is currently enabled for this + * channel. + */ +HAL_BOOL +ar5416IsFastClockEnabled(struct ath_hal *ah) +{ + struct ath_hal_private *ahp = AH_PRIVATE(ah); + + return IS_5GHZ_FAST_CLOCK_EN(ah, ahp->ah_curchan); +} diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index ce370f73d44..893f38a4c3a 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -712,6 +712,8 @@ void ath_intr(void *); ((*(_ah)->ah_getDfsThresh)((_ah), (_param))) #define ath_hal_procradarevent(_ah, _rxs, _fulltsf, _buf, _event) \ ((*(_ah)->ah_procRadarEvent)((_ah), (_rxs), (_fulltsf), (_buf), (_event))) +#define ath_hal_isfastclockenabled(_ah) \ + ((*(_ah)->ah_isFastClockEnabled((_ah)) #define ath_hal_gpioCfgOutput(_ah, _gpio, _type) \ ((*(_ah)->ah_gpioCfgOutput)((_ah), (_gpio), (_type))) From d16eac5c5772aae0483911845d9f7c45577046cf Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Mon, 8 Aug 2011 14:02:08 +0000 Subject: [PATCH 182/452] Revert r224655 and r224614 because vn_fullpath* does not always work on nullfs mounts. Change shall be reconsidered after 9.0 is released. Requested by: re (kib) Approved by: re (kib) --- sys/kern/vfs_mount.c | 86 ++++---------------------------------------- 1 file changed, 7 insertions(+), 79 deletions(-) diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 8f7b18f5ccd..5d6892c5e9b 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -361,60 +361,6 @@ vfs_mergeopts(struct vfsoptlist *toopts, struct vfsoptlist *oldopts) vfs_sanitizeopts(toopts); } -/* - * Verify vnode's global path - */ -static int -vfs_verify_global_path(struct thread *td, struct vnode *vp, char *fspath) -{ - struct nameidata nd; - struct vnode *vp1; - char *rpath, *fbuf; - int error; - - ASSERT_VOP_ELOCKED(vp, __func__); - - /* Construct global filesystem path from vp. */ - VOP_UNLOCK(vp, 0); - error = vn_fullpath_global(td, vp, &rpath, &fbuf); - if (error != 0) { - vrele(vp); - return (error); - } - if (strlen(rpath) >= MNAMELEN) { - vrele(vp); - error = ENAMETOOLONG; - goto out; - } - - /* - * Re-lookup the vnode by path. As a side effect, the vnode is - * relocked. If vnode was renamed, return ENOENT. - */ - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, - UIO_SYSSPACE, fspath, td); - error = namei(&nd); - if (error != 0) { - vrele(vp); - goto out; - } - if (NDHASGIANT(&nd)) - mtx_unlock(&Giant); - NDFREE(&nd, NDF_ONLY_PNBUF); - vp1 = nd.ni_vp; - vrele(vp); - if (vp1 != vp) { - vput(vp1); - error = ENOENT; - goto out; - } - - strlcpy(fspath,rpath,MNAMELEN); -out: - free(fbuf, M_TEMP); - return (error); -} - /* * Mount a filesystem. */ @@ -1124,14 +1070,16 @@ vfs_domount( NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; if ((fsflags & MNT_UPDATE) == 0) { - error = vfs_verify_global_path(td, vp, fspath); - if (error == 0) - error = vfs_domount_first(td, vfsp, fspath, vp, - fsflags, optlist); - } else + error = vfs_domount_first(td, vfsp, fspath, vp, fsflags, + optlist); + } else { error = vfs_domount_update(td, vp, fsflags, optlist); + } mtx_unlock(&Giant); + ASSERT_VI_UNLOCKED(vp, __func__); + ASSERT_VOP_UNLOCKED(vp, __func__); + return (error); } @@ -1157,7 +1105,6 @@ unmount(td, uap) } */ *uap; { struct mount *mp; - struct nameidata nd; char *pathbuf; int error, id0, id1; @@ -1193,25 +1140,6 @@ unmount(td, uap) mtx_unlock(&mountlist_mtx); } else { AUDIT_ARG_UPATH1(td, pathbuf); - /* - * If we are jailed and this is not a root jail try to find - * global path for path argument. - */ - if (jailed(td->td_ucred) && - td->td_ucred->cr_prison->pr_root != rootvnode) { - NDINIT(&nd, LOOKUP, - FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, - UIO_SYSSPACE, pathbuf, td); - if (namei(&nd) == 0) { - if (NDHASGIANT(&nd)) - mtx_unlock(&Giant); - NDFREE(&nd, NDF_ONLY_PNBUF); - error = vfs_verify_global_path(td, nd.ni_vp, - pathbuf); - if (error == 0) - vput(nd.ni_vp); - } - } mtx_lock(&mountlist_mtx); TAILQ_FOREACH_REVERSE(mp, &mountlist, mntlist, mnt_list) { if (strcmp(mp->mnt_stat.f_mntonname, pathbuf) == 0) From aa2c3507bc770df0bdd9256f1448d5c0e4cc32cf Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Mon, 8 Aug 2011 15:41:03 +0000 Subject: [PATCH 183/452] Fix method naming to match the reference HAL definition. Obtained from: Atheros Approved by: re (kib, blanket) --- sys/dev/ath/if_athvar.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index 893f38a4c3a..9657a5e72e0 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -712,7 +712,7 @@ void ath_intr(void *); ((*(_ah)->ah_getDfsThresh)((_ah), (_param))) #define ath_hal_procradarevent(_ah, _rxs, _fulltsf, _buf, _event) \ ((*(_ah)->ah_procRadarEvent)((_ah), (_rxs), (_fulltsf), (_buf), (_event))) -#define ath_hal_isfastclockenabled(_ah) \ +#define ath_hal_is_fast_clock_enabled(_ah) \ ((*(_ah)->ah_isFastClockEnabled((_ah)) #define ath_hal_gpioCfgOutput(_ah, _gpio, _type) \ From 6bd78ef4033efbab2b9123719e020ba57d11eabb Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Mon, 8 Aug 2011 15:42:37 +0000 Subject: [PATCH 184/452] .. and add a missing bracket. Approved by: re (kib, blanket) --- sys/dev/ath/if_athvar.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index 9657a5e72e0..2931f89e625 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -713,7 +713,7 @@ void ath_intr(void *); #define ath_hal_procradarevent(_ah, _rxs, _fulltsf, _buf, _event) \ ((*(_ah)->ah_procRadarEvent)((_ah), (_rxs), (_fulltsf), (_buf), (_event))) #define ath_hal_is_fast_clock_enabled(_ah) \ - ((*(_ah)->ah_isFastClockEnabled((_ah)) + ((*(_ah)->ah_isFastClockEnabled)((_ah)) #define ath_hal_gpioCfgOutput(_ah, _gpio, _type) \ ((*(_ah)->ah_gpioCfgOutput)((_ah), (_gpio), (_type))) From 8db87e40794dfde6de6db1db14820bfe3d7d010c Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Mon, 8 Aug 2011 16:22:42 +0000 Subject: [PATCH 185/452] Introduce some more DFS related hooks, inspired both by local work and the Atheros reference code. The radar detection code needs to know what the current DFS domain is. Since net80211 doesn't currently know this information, it's extracted from the HAL regulatory domain information. The specifics: * add a new ath_dfs API hook, ath_dfs_init_radar_filters(), which updates the radar filters whenever the regulatory domain changes. * add HAL_DFS_DOMAIN which describes the currently configured DFS domain . * add a new HAL internal variable which tracks the currently configured HAL DFS domain. * add a new HAL capability, HAL_CAP_DFS_DMN, which returns the currently configured HAL DFS domain setting. * update the HAL DFS domain setting whenever the channel setting is updated. Since this isn't currently used by any radar code, these should all be no-ops for existing users. Obtained from: Atheros Submitted by: KBC Networks, sibridge Approved by: re (kib, blanket) --- sys/dev/ath/ath_dfs/null/dfs_null.c | 10 ++++++++++ sys/dev/ath/ath_hal/ah.c | 3 +++ sys/dev/ath/ath_hal/ah.h | 9 +++++++++ sys/dev/ath/ath_hal/ah_internal.h | 1 + sys/dev/ath/ath_hal/ah_regdomain.c | 15 ++++++++++++++- sys/dev/ath/if_ath.c | 7 +++++++ sys/dev/ath/if_athdfs.h | 4 +++- 7 files changed, 47 insertions(+), 2 deletions(-) diff --git a/sys/dev/ath/ath_dfs/null/dfs_null.c b/sys/dev/ath/ath_dfs/null/dfs_null.c index a3bae914585..e001a4260d5 100644 --- a/sys/dev/ath/ath_dfs/null/dfs_null.c +++ b/sys/dev/ath/ath_dfs/null/dfs_null.c @@ -226,3 +226,13 @@ ath_dfs_get_thresholds(struct ath_softc *sc, HAL_PHYERR_PARAM *param) ath_hal_getdfsthresh(sc->sc_ah, param); return 1; } + +/* + * Update the current radar patterns based on the + * current operating mode/regulatory domain. + */ +int +ath_dfs_init_radar_filters(struct ath_softc *sc) +{ + return 1; +} diff --git a/sys/dev/ath/ath_hal/ah.c b/sys/dev/ath/ath_hal/ah.c index 647f32205bd..2739f97305a 100644 --- a/sys/dev/ath/ath_hal/ah.c +++ b/sys/dev/ath/ath_hal/ah.c @@ -522,6 +522,9 @@ ath_hal_getcapability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type, case HAL_CAP_REG_DMN: /* regulatory domain */ *result = AH_PRIVATE(ah)->ah_currentRD; return HAL_OK; + case HAL_CAP_DFS_DMN: /* DFS Domain */ + *result = AH_PRIVATE(ah)->ah_dfsDomain; + return HAL_OK; case HAL_CAP_CIPHER: /* cipher handled in hardware */ case HAL_CAP_TKIP_MIC: /* handle TKIP MIC in hardware */ return HAL_ENOTSUPP; diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h index 0dbb986da90..05ac87d9f43 100644 --- a/sys/dev/ath/ath_hal/ah.h +++ b/sys/dev/ath/ath_hal/ah.h @@ -735,6 +735,15 @@ typedef struct { #define HAL_PHYERR_PARAM_NOVAL 65535 #define HAL_PHYERR_PARAM_ENABLE 0x8000 /* Enable/Disable if applicable */ +/* + * DFS operating mode flags. + */ +typedef enum { + HAL_DFS_UNINIT_DOMAIN = 0, /* Uninitialized dfs domain */ + HAL_DFS_FCC_DOMAIN = 1, /* FCC3 dfs domain */ + HAL_DFS_ETSI_DOMAIN = 2, /* ETSI dfs domain */ + HAL_DFS_MKK4_DOMAIN = 3, /* Japan dfs domain */ +} HAL_DFS_DOMAIN; /* * Flag for setting QUIET period diff --git a/sys/dev/ath/ath_hal/ah_internal.h b/sys/dev/ath/ath_hal/ah_internal.h index 120620c8751..28c88413f12 100644 --- a/sys/dev/ath/ath_hal/ah_internal.h +++ b/sys/dev/ath/ath_hal/ah_internal.h @@ -303,6 +303,7 @@ struct ath_hal_private { */ HAL_REG_DOMAIN ah_currentRD; /* EEPROM regulatory domain */ HAL_REG_DOMAIN ah_currentRDext; /* EEPROM extended regdomain flags */ + HAL_DFS_DOMAIN ah_dfsDomain; /* current DFS domain */ HAL_CHANNEL_INTERNAL ah_channels[AH_MAXCHAN]; /* private chan state */ u_int ah_nchan; /* valid items in ah_channels */ const struct regDomain *ah_rd2GHz; /* reg state for 2G band */ diff --git a/sys/dev/ath/ath_hal/ah_regdomain.c b/sys/dev/ath/ath_hal/ah_regdomain.c index 43f2b9ba1bd..21bd2c83e80 100644 --- a/sys/dev/ath/ath_hal/ah_regdomain.c +++ b/sys/dev/ath/ath_hal/ah_regdomain.c @@ -687,8 +687,9 @@ ath_hal_init_channels(struct ath_hal *ah, HAL_BOOL enableExtendedChannels) { COUNTRY_CODE_TO_ENUM_RD *country; - REG_DOMAIN *rd5GHz, *rd2GHz; + REG_DOMAIN *rd5GHz = AH_NULL, *rd2GHz; HAL_STATUS status; + HAL_DFS_DOMAIN dfsDomain = HAL_DFS_UNINIT_DOMAIN; status = getchannels(ah, chans, maxchans, nchans, modeSelect, cc, regDmn, enableExtendedChannels, &country, &rd2GHz, &rd5GHz); @@ -702,6 +703,18 @@ ath_hal_init_channels(struct ath_hal *ah, __func__, ah->ah_countryCode); } else status = HAL_EINVAL; + + /* Update the DFS setting for the current regulatory domain */ + if (status == HAL_OK && rd5GHz != AH_NULL) { + if (rd5GHz->dfsMask & DFS_FCC3) + dfsDomain = HAL_DFS_FCC_DOMAIN; + if (rd5GHz->dfsMask & DFS_ETSI) + dfsDomain = HAL_DFS_ETSI_DOMAIN; + if (rd5GHz->dfsMask & DFS_MKK4) + dfsDomain = HAL_DFS_MKK4_DOMAIN; + } + AH_PRIVATE(ah)->ah_dfsDomain = dfsDomain; + return status; } diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index 782b790a3a0..1208f1d44db 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -5031,6 +5031,13 @@ ath_setregdomain(struct ieee80211com *ic, struct ieee80211_regdomain *reg, __func__, status); return EINVAL; /* XXX */ } + + /* + * Setting country code might change the DFS domain + * so initialize the DFS Radar filters + */ + ath_dfs_init_radar_filters(sc); + return 0; } diff --git a/sys/dev/ath/if_athdfs.h b/sys/dev/ath/if_athdfs.h index 88ee7fc7af8..8cc348db37d 100644 --- a/sys/dev/ath/if_athdfs.h +++ b/sys/dev/ath/if_athdfs.h @@ -42,6 +42,8 @@ extern int ath_dfs_process_radar_event(struct ath_softc *sc, extern int ath_dfs_tasklet_needed(struct ath_softc *sc, struct ieee80211_channel *chan); extern int ath_ioctl_phyerr(struct ath_softc *sc, struct ath_diag *ad); -extern int ath_dfs_get_thresholds(struct ath_softc *sc, HAL_PHYERR_PARAM *param); +extern int ath_dfs_get_thresholds(struct ath_softc *sc, + HAL_PHYERR_PARAM *param); +extern int ath_dfs_init_radar_filters(struct ath_softc *sc); #endif /* __IF_ATHDFS_H__ */ From d4b82f4d639fc572da31fdbdde60712b5642fb1b Mon Sep 17 00:00:00 2001 From: Bernhard Schmidt Date: Mon, 8 Aug 2011 16:29:07 +0000 Subject: [PATCH 186/452] When setting a fixed channel on adapters with 11n support the scan channel list ends up with 2 entries, the HT and the legacy channel. The scan itself is currently always done at legacy rates so we end up receiving scan results for legacy networks on the HT channel and erroneously assigning the BSS to the 11n channel. As the channel's capabilities are used to setup the adapter we might end up with non-working settings and/or firmware crashes. Fix this by ensuring that scan results received on a HT channel are only assigned to that channel if the htcap IE is available, else use the legacy channel equivalent. Tested by: Pawel Worach, Raoul Megelas, Maciej Milewski, Andrei Approved by: re (kib) --- sys/net80211/ieee80211_scan_sta.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sys/net80211/ieee80211_scan_sta.c b/sys/net80211/ieee80211_scan_sta.c index 987a26f19b2..6f5e9d256fc 100644 --- a/sys/net80211/ieee80211_scan_sta.c +++ b/sys/net80211/ieee80211_scan_sta.c @@ -238,6 +238,7 @@ sta_add(struct ieee80211_scan_state *ss, const uint8_t *macaddr = wh->i_addr2; struct ieee80211vap *vap = ss->ss_vap; struct ieee80211com *ic = vap->iv_ic; + struct ieee80211_channel *c; struct sta_entry *se; struct ieee80211_scan_entry *ise; int hash; @@ -300,7 +301,6 @@ found: * association on the wrong channel. */ if (sp->status & IEEE80211_BPARSE_OFFCHAN) { - struct ieee80211_channel *c; /* * Off-channel, locate the home/bss channel for the sta * using the value broadcast in the DSPARMS ie. We know @@ -317,6 +317,14 @@ found: } } else ise->se_chan = ic->ic_curchan; + if (IEEE80211_IS_CHAN_HT(ise->se_chan) && sp->htcap == NULL) { + /* Demote legacy networks to a non-HT channel. */ + c = ieee80211_find_channel(ic, ise->se_chan->ic_freq, + ise->se_chan->ic_flags & ~IEEE80211_CHAN_HT); + KASSERT(c != NULL, + ("no legacy channel %u", ise->se_chan->ic_ieee)); + ise->se_chan = c; + } ise->se_fhdwell = sp->fhdwell; ise->se_fhindex = sp->fhindex; ise->se_erp = sp->erp; From 7dd4de1301ca19b1e92b7cc611017cd67b7ea234 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Mon, 8 Aug 2011 17:33:35 +0000 Subject: [PATCH 187/452] The older HAL code sets up the regulatory domain once; FreeBSD/net80211 allows it to be overridden at runtime. Thus, add a function which updates ah_dfsDomain after a channel set call to ath_hal_set_channels(). Approved by: re (kib, blanket) --- sys/dev/ath/ath_hal/ah_regdomain.c | 55 +++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah_regdomain.c b/sys/dev/ath/ath_hal/ah_regdomain.c index 21bd2c83e80..64e11ca90c0 100644 --- a/sys/dev/ath/ath_hal/ah_regdomain.c +++ b/sys/dev/ath/ath_hal/ah_regdomain.c @@ -125,6 +125,8 @@ static const struct cmode modes[] = { IEEE80211_CHAN_A | IEEE80211_CHAN_HT40D }, }; +static void ath_hal_update_dfsdomain(struct ath_hal *ah); + static OS_INLINE uint16_t getEepromRD(struct ath_hal *ah) { @@ -687,9 +689,8 @@ ath_hal_init_channels(struct ath_hal *ah, HAL_BOOL enableExtendedChannels) { COUNTRY_CODE_TO_ENUM_RD *country; - REG_DOMAIN *rd5GHz = AH_NULL, *rd2GHz; + REG_DOMAIN *rd5GHz, *rd2GHz; HAL_STATUS status; - HAL_DFS_DOMAIN dfsDomain = HAL_DFS_UNINIT_DOMAIN; status = getchannels(ah, chans, maxchans, nchans, modeSelect, cc, regDmn, enableExtendedChannels, &country, &rd2GHz, &rd5GHz); @@ -701,20 +702,12 @@ ath_hal_init_channels(struct ath_hal *ah, ah->ah_countryCode = country->countryCode; HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u\n", __func__, ah->ah_countryCode); + + /* Update current DFS domain */ + ath_hal_update_dfsdomain(ah); } else status = HAL_EINVAL; - /* Update the DFS setting for the current regulatory domain */ - if (status == HAL_OK && rd5GHz != AH_NULL) { - if (rd5GHz->dfsMask & DFS_FCC3) - dfsDomain = HAL_DFS_FCC_DOMAIN; - if (rd5GHz->dfsMask & DFS_ETSI) - dfsDomain = HAL_DFS_ETSI_DOMAIN; - if (rd5GHz->dfsMask & DFS_MKK4) - dfsDomain = HAL_DFS_MKK4_DOMAIN; - } - AH_PRIVATE(ah)->ah_dfsDomain = dfsDomain; - return status; } @@ -759,6 +752,11 @@ ath_hal_set_channels(struct ath_hal *ah, __func__, ah->ah_countryCode); } else status = HAL_EINVAL; + + if (status == HAL_OK) { + /* Update current DFS domain */ + (void) ath_hal_update_dfsdomain(ah); + } return status; } @@ -824,6 +822,37 @@ ath_hal_getctl(struct ath_hal *ah, const struct ieee80211_channel *c) return ctl; } + +/* + * Update the current dfsDomain setting based on the given + * country code. + * + * Since FreeBSD/net80211 allows the channel set to change + * after the card has been setup (via ath_hal_init_channels()) + * this function method is needed to update ah_dfsDomain. + */ +void +ath_hal_update_dfsdomain(struct ath_hal *ah) +{ + const REG_DOMAIN *rd5GHz = AH_PRIVATE(ah)->ah_rd5GHz; + HAL_CTRY_CODE cc = ah->ah_countryCode; + HAL_DFS_DOMAIN dfsDomain = HAL_DFS_UNINIT_DOMAIN; + HAL_REG_DOMAIN regDmn = AH_PRIVATE(ah)->ah_currentRD; + + HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s CC: %d, RegDmn: %d\n",__func__, + cc, regDmn); + if (rd5GHz->dfsMask & DFS_FCC3) + dfsDomain = HAL_DFS_FCC_DOMAIN; + if (rd5GHz->dfsMask & DFS_ETSI) + dfsDomain = HAL_DFS_ETSI_DOMAIN; + if (rd5GHz->dfsMask & DFS_MKK4) + dfsDomain = HAL_DFS_MKK4_DOMAIN; + AH_PRIVATE(ah)->ah_dfsDomain = dfsDomain; + HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s ah_dfsDomain: %d\n", + __func__, AH_PRIVATE(ah)->ah_dfsDomain); +} + + /* * Return the max allowed antenna gain and apply any regulatory * domain specific changes. From ffae5d00d2475a5b862e21c42c206f3907dd2da7 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Mon, 8 Aug 2011 18:05:22 +0000 Subject: [PATCH 188/452] Bitten again by the optional HALDEBUG compilation. Remove this debugging, it's not needed anymore and when not enabled, those variables trigger a compiler warning. Approved by: re (kib, blanket) Pointy-hat-to: adrian, for not testing a non-debug compile of this code enough --- sys/dev/ath/ath_hal/ah_regdomain.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah_regdomain.c b/sys/dev/ath/ath_hal/ah_regdomain.c index 64e11ca90c0..7298c6bee8a 100644 --- a/sys/dev/ath/ath_hal/ah_regdomain.c +++ b/sys/dev/ath/ath_hal/ah_regdomain.c @@ -835,12 +835,8 @@ void ath_hal_update_dfsdomain(struct ath_hal *ah) { const REG_DOMAIN *rd5GHz = AH_PRIVATE(ah)->ah_rd5GHz; - HAL_CTRY_CODE cc = ah->ah_countryCode; HAL_DFS_DOMAIN dfsDomain = HAL_DFS_UNINIT_DOMAIN; - HAL_REG_DOMAIN regDmn = AH_PRIVATE(ah)->ah_currentRD; - HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s CC: %d, RegDmn: %d\n",__func__, - cc, regDmn); if (rd5GHz->dfsMask & DFS_FCC3) dfsDomain = HAL_DFS_FCC_DOMAIN; if (rd5GHz->dfsMask & DFS_ETSI) From ef068c6d9f5bf47589843f678c230c675879a69b Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Mon, 8 Aug 2011 19:03:26 +0000 Subject: [PATCH 189/452] And add another missing brace. Another pointy hat moment. This one however isn't used by any public code yet, so it didn't break the build. Approved by: re (kib, blanket) --- sys/dev/ath/if_athvar.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index 2931f89e625..5baa4ebd940 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -713,7 +713,7 @@ void ath_intr(void *); #define ath_hal_procradarevent(_ah, _rxs, _fulltsf, _buf, _event) \ ((*(_ah)->ah_procRadarEvent)((_ah), (_rxs), (_fulltsf), (_buf), (_event))) #define ath_hal_is_fast_clock_enabled(_ah) \ - ((*(_ah)->ah_isFastClockEnabled)((_ah)) + ((*(_ah)->ah_isFastClockEnabled)((_ah))) #define ath_hal_gpioCfgOutput(_ah, _gpio, _type) \ ((*(_ah)->ah_gpioCfgOutput)((_ah), (_gpio), (_type))) From ef5502c5dd652d35fa3a19961253f9164f7c2092 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Mon, 8 Aug 2011 20:36:52 +0000 Subject: [PATCH 190/452] Create timeval2timespec() and timespec2timeval(). These functions will be used by process descriptors to convert process creation time into process descriptor [acm]time. Approved by: re (kib), mentor (rwatson) Suggested by: jhb Sponsored by: Google Inc --- sys/sys/time.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/sys/sys/time.h b/sys/sys/time.h index 82bbd97f06d..52226e07171 100644 --- a/sys/sys/time.h +++ b/sys/sys/time.h @@ -195,6 +195,24 @@ timeval2bintime(const struct timeval *tv, struct bintime *bt) ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ ((tvp)->tv_sec cmp (uvp)->tv_sec)) +/* Conversion between timespec and timeval. */ + +static __inline void +timeval2timespec(const struct timeval *tv, struct timespec *ts) +{ + + ts->tv_sec = tv->tv_sec; + ts->tv_nsec = 1000 * tv->tv_usec; +} + +static __inline void +timespec2timeval(const struct timespec *ts, struct timeval *tv) +{ + + tv->tv_sec = ts->tv_sec; + tv->tv_usec = ts->tv_nsec / 1000; +} + /* timevaladd and timevalsub are not inlined */ #endif /* _KERNEL */ From f989887b32ae34e93d3e708de7cfc90ce798572e Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Mon, 8 Aug 2011 20:53:04 +0000 Subject: [PATCH 191/452] Fix buffer overflow in sys/boot/common/util.c's printf(), when printing large (>= 10^10) numbers. In theory, 20 characaters should be enough, but bump the buffer to 32 characters, so we have some room for the future. Reviewed by: pjd Approved by: re (kib) --- sys/boot/common/util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/boot/common/util.c b/sys/boot/common/util.c index 012106aef8a..07f69a3b2f9 100644 --- a/sys/boot/common/util.c +++ b/sys/boot/common/util.c @@ -119,7 +119,7 @@ printf(const char *fmt, ...) { va_list ap; const char *hex = "0123456789abcdef"; - char buf[10], *s; + char buf[32], *s; unsigned long long u; int c, l; From f35ec93778bba6bbfd5b903744562f39f142903c Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 9 Aug 2011 04:24:56 +0000 Subject: [PATCH 192/452] Remove this call, now that I've solved the radar module problem without needing this particular modification. It can be called during ath_dfs_radar_enable() and still achieve the same functionality, so I am. Approved by: re (kib, blanket) --- sys/dev/ath/if_ath.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index 1208f1d44db..0fcb815f1fa 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -5032,12 +5032,6 @@ ath_setregdomain(struct ieee80211com *ic, struct ieee80211_regdomain *reg, return EINVAL; /* XXX */ } - /* - * Setting country code might change the DFS domain - * so initialize the DFS Radar filters - */ - ath_dfs_init_radar_filters(sc); - return 0; } From a2ca3bc17139d8831ee8e8745c282b0bcf03dd29 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Tue, 9 Aug 2011 07:42:19 +0000 Subject: [PATCH 193/452] Make clear that the -U option can be dangerous. [1] In -p mode install the group file with the same permissions as normally done in etc/Makefile. Update the copyright. Requested by: peter [1] Approved by: re (kib) --- usr.sbin/mergemaster/mergemaster.8 | 9 ++++++--- usr.sbin/mergemaster/mergemaster.sh | 7 ++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/usr.sbin/mergemaster/mergemaster.8 b/usr.sbin/mergemaster/mergemaster.8 index ab33b31eb97..4dcad39504a 100644 --- a/usr.sbin/mergemaster/mergemaster.8 +++ b/usr.sbin/mergemaster/mergemaster.8 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1998-2010 Douglas Barton +.\" Copyright (c) 1998-2011 Douglas Barton .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 13, 2010 +.Dd August 9, 2011 .Dt MERGEMASTER 8 .Os .Sh NAME @@ -244,6 +244,8 @@ or another directory you specify in your rc file. .It Fl U Attempt to auto upgrade files that have not been user modified. +This option can be dangerous when there are critical changes +in the new versions that affect your running system. .It Fl m Ar /path/to/sources Specify the path to the directory where you want to do the .Xr make 1 . @@ -360,6 +362,7 @@ with all values commented out: #AUTO_INSTALL= # # Automatically upgrade files that have not been user modified (-U) +# ***DANGEROUS*** #AUTO_UPGRADE= # # Compare /etc/rc.conf[.local] to /etc/defaults/rc.conf (-C) @@ -461,7 +464,7 @@ temporary root environment comes from Nik Clayton's make world tutorial which is referenced above. .Sh AUTHORS This manual page and the script itself were written by -.An Douglas Barton Aq DougB@FreeBSD.org . +.An Douglas Barton Aq dougb@FreeBSD.org . .Sh BUGS There are no known bugs. Please report any problems, diff --git a/usr.sbin/mergemaster/mergemaster.sh b/usr.sbin/mergemaster/mergemaster.sh index 4b20464b5f7..78d5c08c49f 100755 --- a/usr.sbin/mergemaster/mergemaster.sh +++ b/usr.sbin/mergemaster/mergemaster.sh @@ -5,8 +5,8 @@ # Compare files created by /usr/src/etc/Makefile (or the directory # the user specifies) with the currently installed copies. -# Copyright 1998-2010 Douglas Barton -# DougB@FreeBSD.org +# Copyright 1998-2011 Douglas Barton +# dougb@FreeBSD.org # $FreeBSD$ @@ -30,6 +30,7 @@ display_usage () { echo ' -C Compare local rc.conf variables to the defaults' echo ' -P Preserve files that are overwritten' echo " -U Attempt to auto upgrade files that have not been user modified" + echo ' ***DANGEROUS***' echo '' echo " -m /path/directory Specify location of source to do the make in" echo " -t /path/directory Specify temp root directory" @@ -635,7 +636,7 @@ case "${RERUN}" in # Only set up files that are crucial to {build|install}world { mkdir -p ${TEMPROOT}/etc && cp -p ${SOURCEDIR}/etc/master.passwd ${TEMPROOT}/etc && - cp -p ${SOURCEDIR}/etc/group ${TEMPROOT}/etc;} || + install -p -o root -g wheel -m 0644 ${SOURCEDIR}/etc/group ${TEMPROOT}/etc;} || { echo ''; echo ' *** FATAL ERROR: Cannot copy files to the temproot environment'; echo ''; From 477a63a86420b6d3f922cf248c0d3fd325c665bf Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Tue, 9 Aug 2011 08:11:26 +0000 Subject: [PATCH 194/452] Do not block zero report ID. It is correct value for devices with single ID. This fixes USB_SET_IMMED call (synchronous operation) of the uhid(4) driver on devices with single report ID. Reviewed by: hselasky Approved by: re (kib) MFC after: 1 week --- sys/dev/usb/usb_request.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/usb/usb_request.c b/sys/dev/usb/usb_request.c index bb5e0daa859..fc47bbfdd3d 100644 --- a/sys/dev/usb/usb_request.c +++ b/sys/dev/usb/usb_request.c @@ -1769,7 +1769,7 @@ usbd_req_get_report(struct usb_device *udev, struct mtx *mtx, void *data, struct usb_interface *iface = usbd_get_iface(udev, iface_index); struct usb_device_request req; - if ((iface == NULL) || (iface->idesc == NULL) || (id == 0)) { + if ((iface == NULL) || (iface->idesc == NULL)) { return (USB_ERR_INVAL); } DPRINTFN(5, "len=%d\n", len); From 9cb3faa6600faf227157090f70a6ec850ac1ef75 Mon Sep 17 00:00:00 2001 From: Ruslan Ermilov Date: Tue, 9 Aug 2011 12:23:27 +0000 Subject: [PATCH 195/452] Vendor import of bwk's 7-Aug-2011 release. --- FIXES | 18 ++++++++++++++++++ awkgram.y | 4 ++-- b.c | 14 +++++++------- lex.c | 2 +- lib.c | 9 ++++++--- main.c | 20 +++++++++++++++----- makefile | 2 +- proto.h | 4 ++-- run.c | 52 +++++++++++++++++++++++++++++++++++++--------------- tran.c | 16 +++++++++------- 10 files changed, 98 insertions(+), 43 deletions(-) diff --git a/FIXES b/FIXES index e6edc5309cc..a802ad41878 100644 --- a/FIXES +++ b/FIXES @@ -25,6 +25,24 @@ THIS SOFTWARE. This file lists all bug fixes, changes, etc., made since the AWK book was sent to the printers in August, 1987. +Aug 7, 2011: + split(s, a, //) now behaves the same as split(s, a, "") + +Jun 12, 2011: + /pat/, \n /pat/ {...} is now legal, though bad style to use. + + added checks to new -v code that permits -vnospace; thanks to + ruslan ermilov for spotting this and providing the patch. + + removed fixed limit on number of open files; thanks to aleksey + cheusov and christos zoulos. + + fixed day 1 bug that resurrected deleted elements of ARGV when + used as filenames (in lib.c). + + minor type fiddles to make gcc -Wall -pedantic happier (but not + totally so); turned on -fno-strict-aliasing in makefile. + May 6, 2011: added #ifdef for isblank. now allows -ffoo as well as -f foo arguments. diff --git a/awkgram.y b/awkgram.y index 91b62571b8a..5b5c461b3ee 100644 --- a/awkgram.y +++ b/awkgram.y @@ -174,8 +174,8 @@ pa_pat: pa_stat: pa_pat { $$ = stat2(PASTAT, $1, stat2(PRINT, rectonode(), NIL)); } | pa_pat lbrace stmtlist '}' { $$ = stat2(PASTAT, $1, $3); } - | pa_pat ',' pa_pat { $$ = pa2stat($1, $3, stat2(PRINT, rectonode(), NIL)); } - | pa_pat ',' pa_pat lbrace stmtlist '}' { $$ = pa2stat($1, $3, $5); } + | pa_pat ',' opt_nl pa_pat { $$ = pa2stat($1, $4, stat2(PRINT, rectonode(), NIL)); } + | pa_pat ',' opt_nl pa_pat lbrace stmtlist '}' { $$ = pa2stat($1, $4, $6); } | lbrace stmtlist '}' { $$ = stat2(PASTAT, NIL, $2); } | XBEGIN lbrace stmtlist '}' { beginloc = linkum(beginloc, $3); $$ = 0; } diff --git a/b.c b/b.c index 97dc32a0573..4f78a609895 100644 --- a/b.c +++ b/b.c @@ -231,7 +231,7 @@ void freetr(Node *p) /* free parse tree */ /* in the parsing of regular expressions, metacharacters like . have */ /* to be seen literally; \056 is not a metacharacter. */ -int hexstr(char **pp) /* find and eval hex string at pp, return new p */ +int hexstr(uschar **pp) /* find and eval hex string at pp, return new p */ { /* only pick up one 8-bit byte (2 chars) */ uschar *p; int n = 0; @@ -245,16 +245,16 @@ int hexstr(char **pp) /* find and eval hex string at pp, return new p */ else if (*p >= 'A' && *p <= 'F') n = 16 * n + *p - 'A' + 10; } - *pp = (char *) p; + *pp = (uschar *) p; return n; } #define isoctdigit(c) ((c) >= '0' && (c) <= '7') /* multiple use of arg */ -int quoted(char **pp) /* pick up next thing after a \\ */ +int quoted(uschar **pp) /* pick up next thing after a \\ */ /* and increment *pp */ { - char *p = *pp; + uschar *p = *pp; int c; if ((c = *p++) == 't') @@ -299,13 +299,13 @@ char *cclenter(const char *argp) /* add a character class */ bp = buf; for (i = 0; (c = *p++) != 0; ) { if (c == '\\') { - c = quoted((char **) &p); + c = quoted(&p); } else if (c == '-' && i > 0 && bp[-1] != 0) { if (*p != 0) { c = bp[-1]; c2 = *p++; if (c2 == '\\') - c2 = quoted((char **) &p); + c2 = quoted(&p); if (c > c2) { /* empty; ignore */ bp--; i--; @@ -789,7 +789,7 @@ int relex(void) /* lexical analyzer for reparse */ case ')': return c; case '\\': - rlxval = quoted((char **) &prestr); + rlxval = quoted(&prestr); return CHAR; default: rlxval = c; diff --git a/lex.c b/lex.c index 49d7c5ca74e..d09f5507e3d 100644 --- a/lex.c +++ b/lex.c @@ -411,7 +411,7 @@ int string(void) } *px = 0; unput(c); - sscanf(xbuf, "%x", &n); + sscanf(xbuf, "%x", (unsigned int *) &n); *bp++ = n; break; } diff --git a/lib.c b/lib.c index d7eee31db43..5da601aa8e7 100644 --- a/lib.c +++ b/lib.c @@ -124,7 +124,7 @@ int getrec(char **pbuf, int *pbufsize, int isrecord) /* get next input record */ dprintf( ("argno=%d, file=|%s|\n", argno, file) ); if (infile == NULL) { /* have to open a new file */ file = getargv(argno); - if (*file == '\0') { /* it's been zapped */ + if (file == NULL || *file == '\0') { /* deleted or zapped */ argno++; continue; } @@ -187,6 +187,7 @@ int readrec(char **pbuf, int *pbufsize, FILE *inf) /* read one record into buf * if (strlen(*FS) >= sizeof(inputFS)) FATAL("field separator %.10s... is too long", *FS); + /*fflush(stdout); avoids some buffering problem but makes it 25% slower*/ strcpy(inputFS, *FS); /* for subsequent field splitting */ if ((sep = **RS) == 0) { sep = '\n'; @@ -227,6 +228,8 @@ char *getargv(int n) /* get ARGV[n] */ extern Array *ARGVtab; sprintf(temp, "%d", n); + if (lookup(temp, ARGVtab) == NULL) + return NULL; x = setsymtab(temp, "", 0.0, STR, ARGVtab); s = getsval(x); dprintf( ("getargv(%d) returns |%s|\n", n, s) ); @@ -477,14 +480,14 @@ void recbld(void) /* create $0 from $1..$NF if necessary */ if (!adjbuf(&record, &recsize, 2+r-record, recsize, &r, "recbld 3")) FATAL("built giant record `%.30s...'", record); *r = '\0'; - dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) ); + dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, (void*)fldtab[0]) ); if (freeable(fldtab[0])) xfree(fldtab[0]->sval); fldtab[0]->tval = REC | STR | DONTFREE; fldtab[0]->sval = record; - dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) ); + dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, (void*)fldtab[0]) ); dprintf( ("recbld = |%s|\n", record) ); donerec = 1; } diff --git a/main.c b/main.c index 9eff3d751c6..bd9eeeeaf90 100644 --- a/main.c +++ b/main.c @@ -22,7 +22,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ -const char *version = "version 20110506"; +const char *version = "version 20110807"; #define DEBUG #include @@ -121,10 +121,20 @@ int main(int argc, char *argv[]) WARNING("field separator FS is empty"); break; case 'v': /* -v a=1 to be done NOW. one -v for each */ - if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1])) - setclvar(argv[1]); - else if (argv[1][2] != '\0') - setclvar(&argv[1][2]); + if (argv[1][2] != 0) { /* arg is -vsomething */ + if (isclvar(&argv[1][2])) + setclvar(&argv[1][2]); + else + FATAL("invalid -v option argument: %s", &argv[1][2]); + } else { /* arg is -v something */ + argc--; argv++; + if (argc <= 1) + FATAL("no variable name"); + if (isclvar(argv[1])) + setclvar(argv[1]); + else + FATAL("invalid -v option argument: %s", argv[1]); + } break; case 'd': dbg = atoi(&argv[1][2]); diff --git a/makefile b/makefile index f93f0a8bdb8..52c7424b34c 100644 --- a/makefile +++ b/makefile @@ -30,7 +30,7 @@ CC = gcc -Wall -g CC = cc CC = gcc -Wall -g -Wwrite-strings CC = gcc -fprofile-arcs -ftest-coverage # then gcov f1.c; cat f1.c.gcov -CC = gcc -O4 +CC = gcc -O4 -Wall -pedantic -fno-strict-aliasing YACC = bison -y YACC = yacc diff --git a/proto.h b/proto.h index 0a68b3a813f..e4de112723f 100644 --- a/proto.h +++ b/proto.h @@ -43,8 +43,8 @@ extern fa *mkdfa(const char *, int); extern int makeinit(fa *, int); extern void penter(Node *); extern void freetr(Node *); -extern int hexstr(char **); -extern int quoted(char **); +extern int hexstr(uschar **); +extern int quoted(uschar **); extern char *cclenter(const char *); extern void overflo(const char *); extern void cfoll(fa *, Node *); diff --git a/run.c b/run.c index e96379bbd26..553081f0fce 100644 --- a/run.c +++ b/run.c @@ -1236,6 +1236,12 @@ Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */ ap->sval = (char *) makesymtab(NSYMTAB); n = 0; + if (arg3type == REGEXPR && strlen((char*)((fa*)a[2])->restr) == 0) { + /* split(s, a, //); have to arrange that it looks like empty sep */ + arg3type = 0; + fs = ""; + sep = 0; + } if (*s != '\0' && (strlen(fs) > 1 || arg3type == REGEXPR)) { /* reg expr */ fa *pfa; if (arg3type == REGEXPR) { /* it's ready already */ @@ -1618,17 +1624,25 @@ struct files { FILE *fp; const char *fname; int mode; /* '|', 'a', 'w' => LE/LT, GT */ -} files[FOPEN_MAX] ={ - { NULL, "/dev/stdin", LT }, /* watch out: don't free this! */ - { NULL, "/dev/stdout", GT }, - { NULL, "/dev/stderr", GT } -}; +} *files; + +int nfiles; void stdinit(void) /* in case stdin, etc., are not constants */ { - files[0].fp = stdin; - files[1].fp = stdout; - files[2].fp = stderr; + nfiles = FOPEN_MAX; + files = calloc(nfiles, sizeof(*files)); + if (files == NULL) + FATAL("can't allocate file memory for %u files", nfiles); + files[0].fp = stdin; + files[0].fname = "/dev/stdin"; + files[0].mode = LT; + files[1].fp = stdout; + files[1].fname = "/dev/stdout"; + files[1].mode = GT; + files[2].fp = stderr; + files[2].fname = "/dev/stderr"; + files[2].mode = GT; } FILE *openfile(int a, const char *us) @@ -1639,7 +1653,7 @@ FILE *openfile(int a, const char *us) if (*s == '\0') FATAL("null file name in print or getline"); - for (i=0; i < FOPEN_MAX; i++) + for (i=0; i < nfiles; i++) if (files[i].fname && strcmp(s, files[i].fname) == 0) { if (a == files[i].mode || (a==APPEND && files[i].mode==GT)) return files[i].fp; @@ -1649,11 +1663,19 @@ FILE *openfile(int a, const char *us) if (a == FFLUSH) /* didn't find it, so don't create it! */ return NULL; - for (i=0; i < FOPEN_MAX; i++) + for (i=0; i < nfiles; i++) if (files[i].fp == 0) break; - if (i >= FOPEN_MAX) - FATAL("%s makes too many open files", s); + if (i >= nfiles) { + struct files *nf; + int nnf = nfiles + FOPEN_MAX; + nf = realloc(files, nnf * sizeof(*nf)); + if (nf == NULL) + FATAL("cannot grow files for %s and %d files", s, nnf); + memset(&nf[nfiles], 0, FOPEN_MAX * sizeof(*nf)); + nfiles = nnf; + files = nf; + } fflush(stdout); /* force a semblance of order */ m = a; if (a == GT) { @@ -1681,7 +1703,7 @@ const char *filename(FILE *fp) { int i; - for (i = 0; i < FOPEN_MAX; i++) + for (i = 0; i < nfiles; i++) if (fp == files[i].fp) return files[i].fname; return "???"; @@ -1696,7 +1718,7 @@ Cell *closefile(Node **a, int n) x = execute(a[0]); getsval(x); stat = -1; - for (i = 0; i < FOPEN_MAX; i++) { + for (i = 0; i < nfiles; i++) { if (files[i].fname && strcmp(x->sval, files[i].fname) == 0) { if (ferror(files[i].fp)) WARNING( "i/o error occurred on %s", files[i].fname ); @@ -1740,7 +1762,7 @@ void flush_all(void) { int i; - for (i = 0; i < FOPEN_MAX; i++) + for (i = 0; i < nfiles; i++) if (files[i].fp) fflush(files[i].fp); } diff --git a/tran.c b/tran.c index c19ce94302a..e9d77506a34 100644 --- a/tran.c +++ b/tran.c @@ -212,7 +212,7 @@ Cell *setsymtab(const char *n, const char *s, Awkfloat f, unsigned t, Array *tp) if (n != NULL && (p = lookup(n, tp)) != NULL) { dprintf( ("setsymtab found %p: n=%s s=\"%s\" f=%g t=%o\n", - p, NN(p->nval), NN(p->sval), p->fval, p->tval) ); + (void*)p, NN(p->nval), NN(p->sval), p->fval, p->tval) ); return(p); } p = (Cell *) malloc(sizeof(Cell)); @@ -231,7 +231,7 @@ Cell *setsymtab(const char *n, const char *s, Awkfloat f, unsigned t, Array *tp) p->cnext = tp->tab[h]; tp->tab[h] = p; dprintf( ("setsymtab set %p: n=%s s=\"%s\" f=%g t=%o\n", - p, p->nval, p->sval, p->fval, p->tval) ); + (void*)p, p->nval, p->sval, p->fval, p->tval) ); return(p); } @@ -298,7 +298,7 @@ Awkfloat setfval(Cell *vp, Awkfloat f) /* set float val of a Cell */ xfree(vp->sval); /* free any previous string */ vp->tval &= ~STR; /* mark string invalid */ vp->tval |= NUM; /* mark number ok */ - dprintf( ("setfval %p: %s = %g, t=%o\n", vp, NN(vp->nval), f, vp->tval) ); + dprintf( ("setfval %p: %s = %g, t=%o\n", (void*)vp, NN(vp->nval), f, vp->tval) ); return vp->fval = f; } @@ -318,7 +318,7 @@ char *setsval(Cell *vp, const char *s) /* set string val of a Cell */ int fldno; dprintf( ("starting setsval %p: %s = \"%s\", t=%o, r,f=%d,%d\n", - vp, NN(vp->nval), s, vp->tval, donerec, donefld) ); + (void*)vp, NN(vp->nval), s, vp->tval, donerec, donefld) ); if ((vp->tval & (NUM | STR)) == 0) funnyvar(vp, "assign to"); if (isfld(vp)) { @@ -338,7 +338,7 @@ char *setsval(Cell *vp, const char *s) /* set string val of a Cell */ vp->tval |= STR; vp->tval &= ~DONTFREE; dprintf( ("setsval %p: %s = \"%s (%p) \", t=%o r,f=%d,%d\n", - vp, NN(vp->nval), t,t, vp->tval, donerec, donefld) ); + (void*)vp, NN(vp->nval), t,t, vp->tval, donerec, donefld) ); return(vp->sval = t); } @@ -355,7 +355,8 @@ Awkfloat getfval(Cell *vp) /* get float val of a Cell */ if (is_number(vp->sval) && !(vp->tval&CON)) vp->tval |= NUM; /* make NUM only sparingly */ } - dprintf( ("getfval %p: %s = %g, t=%o\n", vp, NN(vp->nval), vp->fval, vp->tval) ); + dprintf( ("getfval %p: %s = %g, t=%o\n", + (void*)vp, NN(vp->nval), vp->fval, vp->tval) ); return(vp->fval); } @@ -381,7 +382,8 @@ static char *get_str_val(Cell *vp, char **fmt) /* get string val of a Cel vp->tval &= ~DONTFREE; vp->tval |= STR; } - dprintf( ("getsval %p: %s = \"%s (%p)\", t=%o\n", vp, NN(vp->nval), vp->sval, vp->sval, vp->tval) ); + dprintf( ("getsval %p: %s = \"%s (%p)\", t=%o\n", + (void*)vp, NN(vp->nval), vp->sval, vp->sval, vp->tval) ); return(vp->sval); } From 3797b1fc58740774a55266cba87148720f6e7690 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Tue, 9 Aug 2011 14:06:50 +0000 Subject: [PATCH 196/452] Remove timeval2timespec and its converse, since we already have TIMEVAL_TO_TIMESPEC() in . Spotted by: bde Approved by: re (kib), mentor (rwatson) --- sys/sys/time.h | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/sys/sys/time.h b/sys/sys/time.h index 52226e07171..82bbd97f06d 100644 --- a/sys/sys/time.h +++ b/sys/sys/time.h @@ -195,24 +195,6 @@ timeval2bintime(const struct timeval *tv, struct bintime *bt) ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ ((tvp)->tv_sec cmp (uvp)->tv_sec)) -/* Conversion between timespec and timeval. */ - -static __inline void -timeval2timespec(const struct timeval *tv, struct timespec *ts) -{ - - ts->tv_sec = tv->tv_sec; - ts->tv_nsec = 1000 * tv->tv_usec; -} - -static __inline void -timespec2timeval(const struct timespec *ts, struct timeval *tv) -{ - - tv->tv_sec = ts->tv_sec; - tv->tv_usec = ts->tv_nsec / 1000; -} - /* timevaladd and timevalsub are not inlined */ #endif /* _KERNEL */ From bf2e38e673514abcc5002ebb02de732e3de5b222 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 9 Aug 2011 15:29:58 +0000 Subject: [PATCH 197/452] Merge 220876, 220877, and 221537 from the new NFS client to the old: Allow the NFS client to use a max file size larger than 1TB for v3 mounts. It now allows files up to OFF_MAX subject to whatever limit the server advertises. Reviewed by: rmacklem Approved by: re (kib) MFC after: 1 week --- sys/nfsclient/nfs_bio.c | 8 ++++++-- sys/nfsclient/nfs_vfsops.c | 5 ++--- sys/nfsclient/nfs_vnops.c | 8 ++++++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/sys/nfsclient/nfs_bio.c b/sys/nfsclient/nfs_bio.c index da8a2ece335..305c189d73d 100644 --- a/sys/nfsclient/nfs_bio.c +++ b/sys/nfsclient/nfs_bio.c @@ -445,6 +445,7 @@ nfs_bioread(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred) struct thread *td; struct nfsmount *nmp = VFSTONFS(vp->v_mount); daddr_t lbn, rabn; + off_t end; int bcount; int seqcount; int nra, error = 0, n = 0, on = 0; @@ -464,8 +465,9 @@ nfs_bioread(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred) } else mtx_unlock(&nmp->nm_mtx); + end = uio->uio_offset + uio->uio_resid; if (vp->v_type != VDIR && - (uio->uio_offset + uio->uio_resid) > nmp->nm_maxfilesize) + (end > nmp->nm_maxfilesize || end < uio->uio_offset)) return (EFBIG); if (nfs_directio_enable && (ioflag & IO_DIRECT) && (vp->v_type == VREG)) @@ -865,6 +867,7 @@ nfs_write(struct vop_write_args *ap) struct vattr vattr; struct nfsmount *nmp = VFSTONFS(vp->v_mount); daddr_t lbn; + off_t end; int bcount; int n, on, error = 0; @@ -932,7 +935,8 @@ flush_and_restart: if (uio->uio_offset < 0) return (EINVAL); - if ((uio->uio_offset + uio->uio_resid) > nmp->nm_maxfilesize) + end = uio->uio_offset + uio->uio_resid; + if (end > nmp->nm_maxfilesize || end < uio->uio_offset) return (EFBIG); if (uio->uio_resid == 0) return (0); diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c index 8498ee45526..6bcc9b58cb7 100644 --- a/sys/nfsclient/nfs_vfsops.c +++ b/sys/nfsclient/nfs_vfsops.c @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -1228,13 +1229,11 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam, * * For V3, nfs_fsinfo will adjust this as necessary. Assume maximum * that we can handle until we find out otherwise. - * XXX Our "safe" limit on the client is what we can store in our - * buffer cache using signed(!) block numbers. */ if ((argp->flags & NFSMNT_NFSV3) == 0) nmp->nm_maxfilesize = 0xffffffffLL; else - nmp->nm_maxfilesize = (u_int64_t)0x80000000 * DEV_BSIZE - 1; + nmp->nm_maxfilesize = OFF_MAX; nmp->nm_timeo = NFS_TIMEO; nmp->nm_retry = NFS_RETRANS; diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c index bb81f6b24f3..a9f746df619 100644 --- a/sys/nfsclient/nfs_vnops.c +++ b/sys/nfsclient/nfs_vnops.c @@ -1276,6 +1276,7 @@ nfs_readrpc(struct vnode *vp, struct uio *uiop, struct ucred *cred) caddr_t bpos, dpos; struct mbuf *mreq, *mrep, *md, *mb; struct nfsmount *nmp; + off_t end; int error = 0, len, retlen, tsiz, eof, attrflag; int v3 = NFS_ISV3(vp); int rsize; @@ -1286,7 +1287,8 @@ nfs_readrpc(struct vnode *vp, struct uio *uiop, struct ucred *cred) nmp = VFSTONFS(vp->v_mount); tsiz = uiop->uio_resid; mtx_lock(&nmp->nm_mtx); - if (uiop->uio_offset + tsiz > nmp->nm_maxfilesize) { + end = uiop->uio_offset + tsiz; + if (end > nmp->nm_maxfilesize || end < uiop->uio_offset) { mtx_unlock(&nmp->nm_mtx); return (EFBIG); } @@ -1348,6 +1350,7 @@ nfs_writerpc(struct vnode *vp, struct uio *uiop, struct ucred *cred, caddr_t bpos, dpos; struct mbuf *mreq, *mrep, *md, *mb; struct nfsmount *nmp = VFSTONFS(vp->v_mount); + off_t end; int error = 0, len, tsiz, wccflag = NFSV3_WCCRATTR, rlen, commit; int v3 = NFS_ISV3(vp), committed = NFSV3WRITE_FILESYNC; int wsize; @@ -1356,7 +1359,8 @@ nfs_writerpc(struct vnode *vp, struct uio *uiop, struct ucred *cred, *must_commit = 0; tsiz = uiop->uio_resid; mtx_lock(&nmp->nm_mtx); - if (uiop->uio_offset + tsiz > nmp->nm_maxfilesize) { + end = uiop->uio_offset + tsiz; + if (end > nmp->nm_maxfilesize || end < uiop->uio_offset) { mtx_unlock(&nmp->nm_mtx); return (EFBIG); } From e69c2d83cf9111c800ac78f41a79404f71e399eb Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 9 Aug 2011 15:46:52 +0000 Subject: [PATCH 198/452] Remove the now unneeded references to these DFS methods. Sorry for the noise everyone. Approved by: re (kib, blanket) --- sys/dev/ath/ath_dfs/null/dfs_null.c | 10 ---------- sys/dev/ath/if_athdfs.h | 1 - 2 files changed, 11 deletions(-) diff --git a/sys/dev/ath/ath_dfs/null/dfs_null.c b/sys/dev/ath/ath_dfs/null/dfs_null.c index e001a4260d5..a3bae914585 100644 --- a/sys/dev/ath/ath_dfs/null/dfs_null.c +++ b/sys/dev/ath/ath_dfs/null/dfs_null.c @@ -226,13 +226,3 @@ ath_dfs_get_thresholds(struct ath_softc *sc, HAL_PHYERR_PARAM *param) ath_hal_getdfsthresh(sc->sc_ah, param); return 1; } - -/* - * Update the current radar patterns based on the - * current operating mode/regulatory domain. - */ -int -ath_dfs_init_radar_filters(struct ath_softc *sc) -{ - return 1; -} diff --git a/sys/dev/ath/if_athdfs.h b/sys/dev/ath/if_athdfs.h index 8cc348db37d..a3f27f90e94 100644 --- a/sys/dev/ath/if_athdfs.h +++ b/sys/dev/ath/if_athdfs.h @@ -44,6 +44,5 @@ extern int ath_dfs_tasklet_needed(struct ath_softc *sc, extern int ath_ioctl_phyerr(struct ath_softc *sc, struct ath_diag *ad); extern int ath_dfs_get_thresholds(struct ath_softc *sc, HAL_PHYERR_PARAM *param); -extern int ath_dfs_init_radar_filters(struct ath_softc *sc); #endif /* __IF_ATHDFS_H__ */ From b1f0f5b76e47479f33f0f273f36545aca08012ff Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Tue, 9 Aug 2011 16:42:31 +0000 Subject: [PATCH 199/452] Add the PCI ID for the PCH DH89xxCC on ichsmb as got from Linux counterpart. Sponsored by: Sandvine Incorporated Reviewed by: emaste, rstone Approved by: re (bz) MFC after: 3 days --- sys/dev/ichsmb/ichsmb_pci.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/dev/ichsmb/ichsmb_pci.c b/sys/dev/ichsmb/ichsmb_pci.c index 48d6eb6e177..1fd9ad0ddc8 100644 --- a/sys/dev/ichsmb/ichsmb_pci.c +++ b/sys/dev/ichsmb/ichsmb_pci.c @@ -67,6 +67,7 @@ __FBSDID("$FreeBSD$"); #include /* PCI unique identifiers */ +#define ID_PCH_DH89XXCC 0x23308086 #define ID_82801AA 0x24138086 #define ID_82801AB 0x24238086 #define ID_82801BA 0x24438086 @@ -169,6 +170,7 @@ ichsmb_pci_probe(device_t dev) case ID_82801JI: device_set_desc(dev, "Intel 82801JI (ICH10) SMBus controller"); break; + case ID_PCH_DH89XXCC: case ID_PCH: device_set_desc(dev, "Intel PCH SMBus controller"); break; From e047ade9477f4147d908164726a3a820a3fe4147 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 9 Aug 2011 20:53:33 +0000 Subject: [PATCH 200/452] Do not update mountpoint generation counter to the value which was not yet acted upon by devfs_populate(). Submitted by: Kohji Okuno Approved by: re (bz) MFC after: 1 week --- sys/fs/devfs/devfs_devs.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sys/fs/devfs/devfs_devs.c b/sys/fs/devfs/devfs_devs.c index d72ada03672..a2d3222dda9 100644 --- a/sys/fs/devfs/devfs_devs.c +++ b/sys/fs/devfs/devfs_devs.c @@ -630,13 +630,15 @@ devfs_populate_loop(struct devfs_mount *dm, int cleanup) void devfs_populate(struct devfs_mount *dm) { + unsigned gen; sx_assert(&dm->dm_lock, SX_XLOCKED); - if (dm->dm_generation == devfs_generation) + gen = devfs_generation; + if (dm->dm_generation == gen) return; while (devfs_populate_loop(dm, 0)) continue; - dm->dm_generation = devfs_generation; + dm->dm_generation = gen; } /* From 2d49ef5934a9a55d75e31d27019b7aa334e6f5e7 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Tue, 9 Aug 2011 20:55:54 +0000 Subject: [PATCH 201/452] Revert r224736 as the introduced value was already present. Reported by: tinderbox, pluknet Approved by: re (kib) --- sys/dev/ichsmb/ichsmb_pci.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/sys/dev/ichsmb/ichsmb_pci.c b/sys/dev/ichsmb/ichsmb_pci.c index 1fd9ad0ddc8..48d6eb6e177 100644 --- a/sys/dev/ichsmb/ichsmb_pci.c +++ b/sys/dev/ichsmb/ichsmb_pci.c @@ -67,7 +67,6 @@ __FBSDID("$FreeBSD$"); #include /* PCI unique identifiers */ -#define ID_PCH_DH89XXCC 0x23308086 #define ID_82801AA 0x24138086 #define ID_82801AB 0x24238086 #define ID_82801BA 0x24438086 @@ -170,7 +169,6 @@ ichsmb_pci_probe(device_t dev) case ID_82801JI: device_set_desc(dev, "Intel 82801JI (ICH10) SMBus controller"); break; - case ID_PCH_DH89XXCC: case ID_PCH: device_set_desc(dev, "Intel PCH SMBus controller"); break; From d98d0ce27a3c2f0886b681d1aec0a8e70a17c3af Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 9 Aug 2011 21:01:36 +0000 Subject: [PATCH 202/452] - Move the PG_UNMANAGED flag from m->flags to m->oflags, renaming the flag to VPO_UNMANAGED (and also making the flag protected by the vm object lock, instead of vm page queue lock). - Mark the fake pages with both PG_FICTITIOUS (as it is now) and VPO_UNMANAGED. As a consequence, pmap code now can use use just VPO_UNMANAGED to decide whether the page is unmanaged. Reviewed by: alc Tested by: pho (x86, previous version), marius (sparc64), marcel (arm, ia64, powerpc), ray (mips) Sponsored by: The FreeBSD Foundation Approved by: re (bz) --- sys/amd64/amd64/pmap.c | 36 ++++++++++++------------- sys/arm/arm/pmap.c | 54 ++++++++++++++++++------------------- sys/i386/i386/pmap.c | 36 ++++++++++++------------- sys/i386/xen/pmap.c | 33 +++++++++++------------ sys/ia64/ia64/pmap.c | 27 +++++++++---------- sys/mips/mips/pmap.c | 35 ++++++++++++------------ sys/powerpc/aim/mmu_oea.c | 35 +++++++++++------------- sys/powerpc/aim/mmu_oea64.c | 33 ++++++++++------------- sys/powerpc/booke/pmap.c | 32 +++++++++++----------- sys/powerpc/include/pmap.h | 2 -- sys/sparc64/sparc64/pmap.c | 39 +++++++++++++-------------- sys/sparc64/sparc64/tsb.c | 2 +- sys/vm/vm_kern.c | 4 +-- sys/vm/vm_object.c | 4 ++- sys/vm/vm_page.c | 45 ++++++++++++++++--------------- sys/vm/vm_page.h | 17 ++++++------ 16 files changed, 209 insertions(+), 225 deletions(-) diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index bed795b9747..e6ab1a197ff 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -2320,7 +2320,7 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) va_last = va + NBPDR - PAGE_SIZE; do { m++; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_pv_demote_pde: page %p is not managed", m)); va += PAGE_SIZE; pmap_insert_entry(pmap, va, m); @@ -2847,7 +2847,7 @@ pmap_remove_all(vm_page_t m) vm_offset_t va; vm_page_t free; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_all: page %p is not managed", m)); free = NULL; vm_page_lock_queues(); @@ -3194,8 +3194,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS, ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)", va)); - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || - (m->oflags & VPO_BUSY) != 0, + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || + VM_OBJECT_LOCKED(m->object), ("pmap_enter: page %p is not busy", m)); mpte = NULL; @@ -3276,7 +3276,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, /* * Enter on the PV list if part of our managed memory. */ - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { + if ((m->oflags & VPO_UNMANAGED) == 0) { KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva, ("pmap_enter: managed mapping within the clean submap")); if (pv == NULL) @@ -3389,7 +3389,7 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) } newpde = VM_PAGE_TO_PHYS(m) | pmap_cache_bits(m->md.pat_mode, 1) | PG_PS | PG_V; - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { + if ((m->oflags & VPO_UNMANAGED) == 0) { newpde |= PG_MANAGED; /* @@ -3498,7 +3498,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_paddr_t pa; KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva || - (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0, + (m->oflags & VPO_UNMANAGED) != 0, ("pmap_enter_quick_locked: managed mapping within the clean submap")); mtx_assert(&vm_page_queue_mtx, MA_OWNED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); @@ -3556,7 +3556,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, /* * Enter on the PV list if part of our managed memory. */ - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0 && + if ((m->oflags & VPO_UNMANAGED) == 0 && !pmap_try_insert_pv_entry(pmap, va, m)) { if (mpte != NULL) { free = NULL; @@ -3581,7 +3581,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, /* * Now validate mapping with RO protection */ - if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) + if ((m->oflags & VPO_UNMANAGED) != 0) pte_store(pte, pa | PG_V | PG_U); else pte_store(pte, pa | PG_V | PG_U | PG_MANAGED); @@ -3958,7 +3958,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) int loops = 0; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_page_exists_quick: page %p is not managed", m)); rv = FALSE; vm_page_lock_queues(); @@ -3999,7 +3999,7 @@ pmap_page_wired_mappings(vm_page_t m) int count; count = 0; - if ((m->flags & PG_FICTITIOUS) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (count); vm_page_lock_queues(); count = pmap_pvh_wired_mappings(&m->md, count); @@ -4041,7 +4041,7 @@ pmap_page_is_mapped(vm_page_t m) { boolean_t rv; - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (FALSE); vm_page_lock_queues(); rv = !TAILQ_EMPTY(&m->md.pv_list) || @@ -4199,7 +4199,7 @@ pmap_is_modified(vm_page_t m) { boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_modified: page %p is not managed", m)); /* @@ -4280,7 +4280,7 @@ pmap_is_referenced(vm_page_t m) { boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_referenced: page %p is not managed", m)); vm_page_lock_queues(); rv = pmap_is_referenced_pvh(&m->md) || @@ -4328,7 +4328,7 @@ pmap_remove_write(vm_page_t m) pt_entry_t oldpte, *pte; vm_offset_t va; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_write: page %p is not managed", m)); /* @@ -4397,7 +4397,7 @@ pmap_ts_referenced(vm_page_t m) vm_offset_t va; int rtval = 0; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_ts_referenced: page %p is not managed", m)); pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); vm_page_lock_queues(); @@ -4471,7 +4471,7 @@ pmap_clear_modify(vm_page_t m) pt_entry_t oldpte, *pte; vm_offset_t va; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_modify: page %p is not managed", m)); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); KASSERT((m->oflags & VPO_BUSY) == 0, @@ -4548,7 +4548,7 @@ pmap_clear_reference(vm_page_t m) pt_entry_t *pte; vm_offset_t va; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); vm_page_lock_queues(); pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c index d24a4229611..38733c9613e 100644 --- a/sys/arm/arm/pmap.c +++ b/sys/arm/arm/pmap.c @@ -3120,7 +3120,7 @@ pmap_remove_all(vm_page_t m) pmap_t curpm; int flags = 0; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_all: page %p is not managed", m)); if (TAILQ_EMPTY(&m->md.pv_list)) return; @@ -3242,7 +3242,7 @@ pmap_protect(pmap_t pm, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) PTE_SYNC(ptep); if (pg != NULL) { - if (!(pg->flags & PG_UNMANAGED)) { + if (!(pg->oflags & VPO_UNMANAGED)) { f = pmap_modify_pv(pg, pm, sva, PVF_WRITE, 0); vm_page_dirty(pg); @@ -3327,8 +3327,8 @@ pmap_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, pa = systempage.pv_pa; m = NULL; } else { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || - (m->oflags & VPO_BUSY) != 0 || (flags & M_NOWAIT) != 0, + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || + (flags & M_NOWAIT) != 0, ("pmap_enter_locked: page %p is not busy", m)); pa = VM_PAGE_TO_PHYS(m); } @@ -3417,7 +3417,7 @@ do_l2b_alloc: if (prot & VM_PROT_WRITE) { npte |= L2_S_PROT_W; if (m != NULL && - (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) + (m->oflags & VPO_UNMANAGED) == 0) vm_page_flag_set(m, PG_WRITEABLE); } npte |= pte_l2_s_cache_mode; @@ -3480,36 +3480,36 @@ do_l2b_alloc: * this physical page is not/is already mapped. */ - if (m && ((m->flags & PG_FICTITIOUS) || - ((m->flags & PG_UNMANAGED) && + if (m && (m->oflags & VPO_UNMANAGED) && !m->md.pv_kva && - TAILQ_EMPTY(&m->md.pv_list)))) { + TAILQ_EMPTY(&m->md.pv_list)) { pmap_free_pv_entry(pve); pve = NULL; } - } else if (m && !(m->flags & PG_FICTITIOUS) && - (!(m->flags & PG_UNMANAGED) || m->md.pv_kva || + } else if (m && + (!(m->oflags & VPO_UNMANAGED) || m->md.pv_kva || !TAILQ_EMPTY(&m->md.pv_list))) pve = pmap_get_pv_entry(); - } else if (m && !(m->flags & PG_FICTITIOUS) && - (!(m->flags & PG_UNMANAGED) || m->md.pv_kva || + } else if (m && + (!(m->oflags & VPO_UNMANAGED) || m->md.pv_kva || !TAILQ_EMPTY(&m->md.pv_list))) pve = pmap_get_pv_entry(); - if (m && !(m->flags & PG_FICTITIOUS)) { - KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva, - ("pmap_enter: managed mapping within the clean submap")); - if (m->flags & PG_UNMANAGED) { + if (m) { + if ((m->oflags & VPO_UNMANAGED)) { if (!TAILQ_EMPTY(&m->md.pv_list) || - m->md.pv_kva) { + m->md.pv_kva) { KASSERT(pve != NULL, ("No pv")); nflags |= PVF_UNMAN; pmap_enter_pv(m, pve, pmap, va, nflags); } else m->md.pv_kva = va; } else { - KASSERT(pve != NULL, ("No pv")); - pmap_enter_pv(m, pve, pmap, va, nflags); + KASSERT(va < kmi.clean_sva || + va >= kmi.clean_eva, + ("pmap_enter: managed mapping within the clean submap")); + KASSERT(pve != NULL, ("No pv")); + pmap_enter_pv(m, pve, pmap, va, nflags); } } } @@ -4423,7 +4423,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) int loops = 0; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_page_exists_quick: page %p is not managed", m)); rv = FALSE; vm_page_lock_queues(); @@ -4453,7 +4453,7 @@ pmap_page_wired_mappings(vm_page_t m) int count; count = 0; - if ((m->flags & PG_FICTITIOUS) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (count); vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) @@ -4472,7 +4472,7 @@ int pmap_ts_referenced(vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_ts_referenced: page %p is not managed", m)); return (pmap_clearbit(m, PVF_REF)); } @@ -4482,7 +4482,7 @@ boolean_t pmap_is_modified(vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_modified: page %p is not managed", m)); if (m->md.pvh_attrs & PVF_MOD) return (TRUE); @@ -4498,7 +4498,7 @@ void pmap_clear_modify(vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_modify: page %p is not managed", m)); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); KASSERT((m->oflags & VPO_BUSY) == 0, @@ -4526,7 +4526,7 @@ boolean_t pmap_is_referenced(vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_referenced: page %p is not managed", m)); return ((m->md.pvh_attrs & PVF_REF) != 0); } @@ -4540,7 +4540,7 @@ void pmap_clear_reference(vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); if (m->md.pvh_attrs & PVF_REF) pmap_clearbit(m, PVF_REF); @@ -4554,7 +4554,7 @@ void pmap_remove_write(vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_write: page %p is not managed", m)); /* diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 002e52948eb..e6b86699000 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -2400,7 +2400,7 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) va_last = va + NBPDR - PAGE_SIZE; do { m++; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_pv_demote_pde: page %p is not managed", m)); va += PAGE_SIZE; pmap_insert_entry(pmap, va, m); @@ -2927,7 +2927,7 @@ pmap_remove_all(vm_page_t m) vm_offset_t va; vm_page_t free; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_all: page %p is not managed", m)); free = NULL; vm_page_lock_queues(); @@ -3299,8 +3299,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS, ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%x)", va)); - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || - (m->oflags & VPO_BUSY) != 0, + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || + VM_OBJECT_LOCKED(m->object), ("pmap_enter: page %p is not busy", m)); mpte = NULL; @@ -3388,7 +3388,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, /* * Enter on the PV list if part of our managed memory. */ - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { + if ((m->oflags & VPO_UNMANAGED) == 0) { KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva, ("pmap_enter: managed mapping within the clean submap")); if (pv == NULL) @@ -3498,7 +3498,7 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) } newpde = VM_PAGE_TO_PHYS(m) | pmap_cache_bits(m->md.pat_mode, 1) | PG_PS | PG_V; - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { + if ((m->oflags & VPO_UNMANAGED) == 0) { newpde |= PG_MANAGED; /* @@ -3604,7 +3604,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t free; KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva || - (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0, + (m->oflags & VPO_UNMANAGED) != 0, ("pmap_enter_quick_locked: managed mapping within the clean submap")); mtx_assert(&vm_page_queue_mtx, MA_OWNED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); @@ -3667,7 +3667,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, /* * Enter on the PV list if part of our managed memory. */ - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0 && + if ((m->oflags & VPO_UNMANAGED) == 0 && !pmap_try_insert_pv_entry(pmap, va, m)) { if (mpte != NULL) { free = NULL; @@ -3695,7 +3695,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, /* * Now validate mapping with RO protection */ - if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) + if ((m->oflags & VPO_UNMANAGED) != 0) pte_store(pte, pa | PG_V | PG_U); else pte_store(pte, pa | PG_V | PG_U | PG_MANAGED); @@ -4096,7 +4096,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) int loops = 0; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_page_exists_quick: page %p is not managed", m)); rv = FALSE; vm_page_lock_queues(); @@ -4137,7 +4137,7 @@ pmap_page_wired_mappings(vm_page_t m) int count; count = 0; - if ((m->flags & PG_FICTITIOUS) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (count); vm_page_lock_queues(); count = pmap_pvh_wired_mappings(&m->md, count); @@ -4181,7 +4181,7 @@ pmap_page_is_mapped(vm_page_t m) { boolean_t rv; - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (FALSE); vm_page_lock_queues(); rv = !TAILQ_EMPTY(&m->md.pv_list) || @@ -4341,7 +4341,7 @@ pmap_is_modified(vm_page_t m) { boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_modified: page %p is not managed", m)); /* @@ -4424,7 +4424,7 @@ pmap_is_referenced(vm_page_t m) { boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_referenced: page %p is not managed", m)); vm_page_lock_queues(); rv = pmap_is_referenced_pvh(&m->md) || @@ -4474,7 +4474,7 @@ pmap_remove_write(vm_page_t m) pt_entry_t oldpte, *pte; vm_offset_t va; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_write: page %p is not managed", m)); /* @@ -4550,7 +4550,7 @@ pmap_ts_referenced(vm_page_t m) vm_offset_t va; int rtval = 0; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_ts_referenced: page %p is not managed", m)); pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); vm_page_lock_queues(); @@ -4626,7 +4626,7 @@ pmap_clear_modify(vm_page_t m) pt_entry_t oldpte, *pte; vm_offset_t va; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_modify: page %p is not managed", m)); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); KASSERT((m->oflags & VPO_BUSY) == 0, @@ -4715,7 +4715,7 @@ pmap_clear_reference(vm_page_t m) pt_entry_t *pte; vm_offset_t va; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); vm_page_lock_queues(); sched_pin(); diff --git a/sys/i386/xen/pmap.c b/sys/i386/xen/pmap.c index b5e71da2cd8..ece1b6c8f9d 100644 --- a/sys/i386/xen/pmap.c +++ b/sys/i386/xen/pmap.c @@ -2430,7 +2430,7 @@ pmap_remove_all(vm_page_t m) pt_entry_t *pte, tpte; vm_page_t free; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_all: page %p is not managed", m)); free = NULL; vm_page_lock_queues(); @@ -2616,8 +2616,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS, ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%x)", va)); - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || - (m->oflags & VPO_BUSY) != 0, + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0, ("pmap_enter: page %p is not busy", m)); mpte = NULL; @@ -2715,7 +2714,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, /* * Enter on the PV list if part of our managed memory. */ - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { + if ((m->oflags & VPO_UNMANAGED) == 0) { KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva, ("pmap_enter: managed mapping within the clean submap")); if (pv == NULL) @@ -2915,7 +2914,7 @@ pmap_enter_quick_locked(multicall_entry_t **mclpp, int *count, pmap_t pmap, vm_o multicall_entry_t *mcl = *mclpp; KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva || - (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0, + (m->oflags & VPO_UNMANAGED) != 0, ("pmap_enter_quick_locked: managed mapping within the clean submap")); mtx_assert(&vm_page_queue_mtx, MA_OWNED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); @@ -2979,7 +2978,7 @@ pmap_enter_quick_locked(multicall_entry_t **mclpp, int *count, pmap_t pmap, vm_o /* * Enter on the PV list if part of our managed memory. */ - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0 && + if ((m->oflags & VPO_UNMANAGED) == 0 && !pmap_try_insert_pv_entry(pmap, va, m)) { if (mpte != NULL) { free = NULL; @@ -3008,7 +3007,7 @@ pmap_enter_quick_locked(multicall_entry_t **mclpp, int *count, pmap_t pmap, vm_o /* * Now validate mapping with RO protection */ - if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) + if ((m->oflags & VPO_UNMANAGED) != 0) pte_store(pte, pa | PG_V | PG_U); else pte_store(pte, pa | PG_V | PG_U | PG_MANAGED); @@ -3016,7 +3015,7 @@ pmap_enter_quick_locked(multicall_entry_t **mclpp, int *count, pmap_t pmap, vm_o /* * Now validate mapping with RO protection */ - if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) + if ((m->oflags & VPO_UNMANAGED) != 0) pa = xpmap_ptom(pa | PG_V | PG_U); else pa = xpmap_ptom(pa | PG_V | PG_U | PG_MANAGED); @@ -3403,7 +3402,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) int loops = 0; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_page_exists_quick: page %p is not managed", m)); rv = FALSE; vm_page_lock_queues(); @@ -3435,7 +3434,7 @@ pmap_page_wired_mappings(vm_page_t m) int count; count = 0; - if ((m->flags & PG_FICTITIOUS) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (count); vm_page_lock_queues(); sched_pin(); @@ -3461,7 +3460,7 @@ pmap_page_is_mapped(vm_page_t m) { boolean_t rv; - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (FALSE); vm_page_lock_queues(); rv = !TAILQ_EMPTY(&m->md.pv_list) || @@ -3600,7 +3599,7 @@ pmap_is_modified(vm_page_t m) pmap_t pmap; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_modified: page %p is not managed", m)); rv = FALSE; @@ -3671,7 +3670,7 @@ pmap_is_referenced(vm_page_t m) pmap_t pmap; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_referenced: page %p is not managed", m)); rv = FALSE; vm_page_lock_queues(); @@ -3732,7 +3731,7 @@ pmap_remove_write(vm_page_t m) pmap_t pmap; pt_entry_t oldpte, *pte; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_write: page %p is not managed", m)); /* @@ -3798,7 +3797,7 @@ pmap_ts_referenced(vm_page_t m) pt_entry_t *pte; int rtval = 0; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_ts_referenced: page %p is not managed", m)); vm_page_lock_queues(); sched_pin(); @@ -3840,7 +3839,7 @@ pmap_clear_modify(vm_page_t m) pmap_t pmap; pt_entry_t *pte; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_modify: page %p is not managed", m)); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); KASSERT((m->oflags & VPO_BUSY) == 0, @@ -3886,7 +3885,7 @@ pmap_clear_reference(vm_page_t m) pmap_t pmap; pt_entry_t *pte; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); vm_page_lock_queues(); sched_pin(); diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index e10c6cf0bfd..f9f60607a04 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -1442,7 +1442,7 @@ pmap_remove_all(vm_page_t m) pmap_t oldpmap; pv_entry_t pv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_all: page %p is not managed", m)); vm_page_lock_queues(); while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { @@ -1548,8 +1548,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, va &= ~PAGE_MASK; KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig")); - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || - (m->oflags & VPO_BUSY) != 0, + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0, ("pmap_enter: page %p is not busy", m)); /* @@ -1619,7 +1618,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, /* * Enter on the PV list if part of our managed memory. */ - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { + if ((m->oflags & VPO_UNMANAGED) == 0) { KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva, ("pmap_enter: managed mapping within the clean submap")); pmap_insert_entry(pmap, va, m); @@ -1720,7 +1719,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, boolean_t managed; KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva || - (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0, + (m->oflags & VPO_UNMANAGED) != 0, ("pmap_enter_quick_locked: managed mapping within the clean submap")); mtx_assert(&vm_page_queue_mtx, MA_OWNED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); @@ -1730,7 +1729,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, if (!pmap_present(pte)) { /* Enter on the PV list if the page is managed. */ - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { + if ((m->oflags & VPO_UNMANAGED) == 0) { if (!pmap_try_insert_pv_entry(pmap, va, m)) { pmap_free_pte(pte, va); return; @@ -1900,7 +1899,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) int loops = 0; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_page_exists_quick: page %p is not managed", m)); rv = FALSE; vm_page_lock_queues(); @@ -1932,7 +1931,7 @@ pmap_page_wired_mappings(vm_page_t m) int count; count = 0; - if ((m->flags & PG_FICTITIOUS) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (count); vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { @@ -2010,7 +2009,7 @@ pmap_ts_referenced(vm_page_t m) pv_entry_t pv; int count = 0; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_ts_referenced: page %p is not managed", m)); vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { @@ -2044,7 +2043,7 @@ pmap_is_modified(vm_page_t m) pv_entry_t pv; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_modified: page %p is not managed", m)); rv = FALSE; @@ -2104,7 +2103,7 @@ pmap_is_referenced(vm_page_t m) pv_entry_t pv; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_referenced: page %p is not managed", m)); rv = FALSE; vm_page_lock_queues(); @@ -2133,7 +2132,7 @@ pmap_clear_modify(vm_page_t m) pmap_t oldpmap; pv_entry_t pv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_modify: page %p is not managed", m)); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); KASSERT((m->oflags & VPO_BUSY) == 0, @@ -2174,7 +2173,7 @@ pmap_clear_reference(vm_page_t m) pmap_t oldpmap; pv_entry_t pv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { @@ -2203,7 +2202,7 @@ pmap_remove_write(vm_page_t m) pv_entry_t pv; vm_prot_t prot; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_write: page %p is not managed", m)); /* diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c index 4d460990716..e6dcd770010 100644 --- a/sys/mips/mips/pmap.c +++ b/sys/mips/mips/pmap.c @@ -1708,7 +1708,7 @@ pmap_remove_all(vm_page_t m) pv_entry_t pv; pt_entry_t *pte, tpte; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_all: page %p is not managed", m)); vm_page_lock_queues(); @@ -1863,8 +1863,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, va &= ~PAGE_MASK; KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig")); - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || - (m->oflags & VPO_BUSY) != 0, + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0, ("pmap_enter: page %p is not busy", m)); mpte = NULL; @@ -1952,7 +1951,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, * raise IPL while manipulating pv_table since pmap_enter can be * called at interrupt time. */ - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { + if ((m->oflags & VPO_UNMANAGED) == 0) { KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva, ("pmap_enter: managed mapping within the clean submap")); if (pv == NULL) @@ -2067,7 +2066,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_paddr_t pa; KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva || - (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0, + (m->oflags & VPO_UNMANAGED) != 0, ("pmap_enter_quick_locked: managed mapping within the clean submap")); mtx_assert(&vm_page_queue_mtx, MA_OWNED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); @@ -2129,7 +2128,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, /* * Enter on the PV list if part of our managed memory. */ - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0 && + if ((m->oflags & VPO_UNMANAGED) == 0 && !pmap_try_insert_pv_entry(pmap, mpte, va, m)) { if (mpte != NULL) { pmap_unwire_pte_hold(pmap, va, mpte); @@ -2464,7 +2463,7 @@ pmap_page_exists_quick(pmap_t pmap, vm_page_t m) int loops = 0; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_page_exists_quick: page %p is not managed", m)); rv = FALSE; vm_page_lock_queues(); @@ -2558,7 +2557,7 @@ pmap_testbit(vm_page_t m, int bit) pt_entry_t *pte; boolean_t rv = FALSE; - if (m->flags & PG_FICTITIOUS) + if (m->oflags & VPO_UNMANAGED) return (rv); if (TAILQ_FIRST(&m->md.pv_list) == NULL) @@ -2585,7 +2584,7 @@ pmap_changebit(vm_page_t m, int bit, boolean_t setem) pv_entry_t pv; pt_entry_t *pte; - if (m->flags & PG_FICTITIOUS) + if (m->oflags & VPO_UNMANAGED) return; mtx_assert(&vm_page_queue_mtx, MA_OWNED); @@ -2634,7 +2633,7 @@ pmap_page_wired_mappings(vm_page_t m) int count; count = 0; - if ((m->flags & PG_FICTITIOUS) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (count); vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { @@ -2659,7 +2658,7 @@ pmap_remove_write(vm_page_t m) vm_offset_t va; pt_entry_t *pte; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_write: page %p is not managed", m)); /* @@ -2699,7 +2698,7 @@ int pmap_ts_referenced(vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_ts_referenced: page %p is not managed", m)); if (m->md.pv_flags & PV_TABLE_REF) { vm_page_lock_queues(); @@ -2721,7 +2720,7 @@ pmap_is_modified(vm_page_t m) { boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_modified: page %p is not managed", m)); /* @@ -2775,7 +2774,7 @@ void pmap_clear_modify(vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_modify: page %p is not managed", m)); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); KASSERT((m->oflags & VPO_BUSY) == 0, @@ -2806,7 +2805,7 @@ boolean_t pmap_is_referenced(vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_referenced: page %p is not managed", m)); return ((m->md.pv_flags & PV_TABLE_REF) != 0); } @@ -2820,7 +2819,7 @@ void pmap_clear_reference(vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); vm_page_lock_queues(); if (m->md.pv_flags & PV_TABLE_REF) { @@ -3168,7 +3167,7 @@ page_is_managed(vm_paddr_t pa) m = PHYS_TO_VM_PAGE(pa); if (m == NULL) return (0); - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) + if ((m->oflags & VPO_UNMANAGED) == 0) return (1); } return (0); @@ -3181,7 +3180,7 @@ init_pte_prot(vm_offset_t va, vm_page_t m, vm_prot_t prot) if (!(prot & VM_PROT_WRITE)) rw = PTE_V | PTE_RO | PTE_C_CACHE; - else if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) { + else if ((m->oflags & VPO_UNMANAGED) == 0) { if ((m->md.pv_flags & PV_TABLE_MOD) != 0) rw = PTE_V | PTE_D | PTE_C_CACHE; else diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c index 23354f9fd1b..331dbe94866 100644 --- a/sys/powerpc/aim/mmu_oea.c +++ b/sys/powerpc/aim/mmu_oea.c @@ -1073,12 +1073,12 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, if (pmap_bootstrapped) mtx_assert(&vm_page_queue_mtx, MA_OWNED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || - (m->oflags & VPO_BUSY) != 0 || VM_OBJECT_LOCKED(m->object), + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || + VM_OBJECT_LOCKED(m->object), ("moea_enter_locked: page %p is not busy", m)); /* XXX change the pvo head for fake pages */ - if ((m->flags & PG_FICTITIOUS) == PG_FICTITIOUS) { + if ((m->oflags & VPO_UNMANAGED) != 0) { pvo_flags &= ~PVO_MANAGED; pvo_head = &moea_pvo_kunmanaged; zone = moea_upvo_zone; @@ -1088,7 +1088,7 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, * If this is a managed page, and it's the first reference to the page, * clear the execness of the page. Otherwise fetch the execness. */ - if ((pg != NULL) && ((m->flags & PG_FICTITIOUS) == 0)) { + if ((pg != NULL) && ((m->oflags & VPO_UNMANAGED) == 0)) { if (LIST_EMPTY(pvo_head)) { moea_attr_clear(pg, PTE_EXEC); } else { @@ -1101,7 +1101,7 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, if (prot & VM_PROT_WRITE) { pte_lo |= PTE_BW; if (pmap_bootstrapped && - (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) + (m->oflags & VPO_UNMANAGED) == 0) vm_page_flag_set(m, PG_WRITEABLE); } else pte_lo |= PTE_BR; @@ -1112,9 +1112,6 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, if (wired) pvo_flags |= PVO_WIRED; - if ((m->flags & PG_FICTITIOUS) != 0) - pvo_flags |= PVO_FAKE; - error = moea_pvo_enter(pmap, zone, pvo_head, va, VM_PAGE_TO_PHYS(m), pte_lo, pvo_flags); @@ -1245,7 +1242,7 @@ boolean_t moea_is_referenced(mmu_t mmu, vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_is_referenced: page %p is not managed", m)); return (moea_query_bit(m, PTE_REF)); } @@ -1254,7 +1251,7 @@ boolean_t moea_is_modified(mmu_t mmu, vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_is_modified: page %p is not managed", m)); /* @@ -1286,7 +1283,7 @@ void moea_clear_reference(mmu_t mmu, vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_clear_reference: page %p is not managed", m)); moea_clear_bit(m, PTE_REF); } @@ -1295,7 +1292,7 @@ void moea_clear_modify(mmu_t mmu, vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_clear_modify: page %p is not managed", m)); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); KASSERT((m->oflags & VPO_BUSY) == 0, @@ -1322,7 +1319,7 @@ moea_remove_write(mmu_t mmu, vm_page_t m) pmap_t pmap; u_int lo; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_remove_write: page %p is not managed", m)); /* @@ -1379,7 +1376,7 @@ boolean_t moea_ts_referenced(mmu_t mmu, vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_ts_referenced: page %p is not managed", m)); return (moea_clear_bit(m, PTE_REF)); } @@ -1396,7 +1393,7 @@ moea_page_set_memattr(mmu_t mmu, vm_page_t m, vm_memattr_t ma) pmap_t pmap; u_int lo; - if (m->flags & PG_FICTITIOUS) { + if ((m->oflags & VPO_UNMANAGED) != 0) { m->md.mdpg_cache_attrs = ma; return; } @@ -1537,7 +1534,7 @@ moea_page_exists_quick(mmu_t mmu, pmap_t pmap, vm_page_t m) struct pvo_entry *pvo; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea_page_exists_quick: page %p is not managed", m)); loops = 0; rv = FALSE; @@ -1565,7 +1562,7 @@ moea_page_wired_mappings(mmu_t mmu, vm_page_t m) int count; count = 0; - if ((m->flags & PG_FICTITIOUS) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (count); vm_page_lock_queues(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) @@ -1928,8 +1925,6 @@ moea_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, pvo->pvo_vaddr |= PVO_MANAGED; if (bootstrap) pvo->pvo_vaddr |= PVO_BOOTSTRAP; - if (flags & PVO_FAKE) - pvo->pvo_vaddr |= PVO_FAKE; moea_pte_create(&pvo->pvo_pte.pte, sr, va, pa | pte_lo); @@ -1988,7 +1983,7 @@ moea_pvo_remove(struct pvo_entry *pvo, int pteidx) /* * Save the REF/CHG bits into their cache if the page is managed. */ - if ((pvo->pvo_vaddr & (PVO_MANAGED|PVO_FAKE)) == PVO_MANAGED) { + if ((pvo->pvo_vaddr & PVO_MANAGED) == PVO_MANAGED) { struct vm_page *pg; pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pte.pte_lo & PTE_RPGN); diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c index f051b61943f..0a10ce8c61c 100644 --- a/sys/powerpc/aim/mmu_oea64.c +++ b/sys/powerpc/aim/mmu_oea64.c @@ -1222,12 +1222,12 @@ moea64_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, if (pmap_bootstrapped) mtx_assert(&vm_page_queue_mtx, MA_OWNED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || - (m->oflags & VPO_BUSY) != 0 || VM_OBJECT_LOCKED(m->object), + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || + VM_OBJECT_LOCKED(m->object), ("moea64_enter_locked: page %p is not busy", m)); /* XXX change the pvo head for fake pages */ - if ((m->flags & PG_FICTITIOUS) == PG_FICTITIOUS) { + if ((m->oflags & VPO_UNMANAGED) != 0) { pvo_flags &= ~PVO_MANAGED; pvo_head = &moea64_pvo_kunmanaged; zone = moea64_upvo_zone; @@ -1238,7 +1238,7 @@ moea64_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, if (prot & VM_PROT_WRITE) { pte_lo |= LPTE_BW; if (pmap_bootstrapped && - (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) + (m->oflags & VPO_UNMANAGED) == 0) vm_page_flag_set(m, PG_WRITEABLE); } else pte_lo |= LPTE_BR; @@ -1249,9 +1249,6 @@ moea64_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, if (wired) pvo_flags |= PVO_WIRED; - if ((m->flags & PG_FICTITIOUS) != 0) - pvo_flags |= PVO_FAKE; - error = moea64_pvo_enter(mmu, pmap, zone, pvo_head, va, VM_PAGE_TO_PHYS(m), pte_lo, pvo_flags); @@ -1474,7 +1471,7 @@ boolean_t moea64_is_referenced(mmu_t mmu, vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea64_is_referenced: page %p is not managed", m)); return (moea64_query_bit(mmu, m, PTE_REF)); } @@ -1483,7 +1480,7 @@ boolean_t moea64_is_modified(mmu_t mmu, vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea64_is_modified: page %p is not managed", m)); /* @@ -1515,7 +1512,7 @@ void moea64_clear_reference(mmu_t mmu, vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea64_clear_reference: page %p is not managed", m)); moea64_clear_bit(mmu, m, LPTE_REF); } @@ -1524,7 +1521,7 @@ void moea64_clear_modify(mmu_t mmu, vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea64_clear_modify: page %p is not managed", m)); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); KASSERT((m->oflags & VPO_BUSY) == 0, @@ -1551,7 +1548,7 @@ moea64_remove_write(mmu_t mmu, vm_page_t m) pmap_t pmap; uint64_t lo; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea64_remove_write: page %p is not managed", m)); /* @@ -1611,7 +1608,7 @@ boolean_t moea64_ts_referenced(mmu_t mmu, vm_page_t m) { - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea64_ts_referenced: page %p is not managed", m)); return (moea64_clear_bit(mmu, m, LPTE_REF)); } @@ -1628,7 +1625,7 @@ moea64_page_set_memattr(mmu_t mmu, vm_page_t m, vm_memattr_t ma) pmap_t pmap; uint64_t lo; - if (m->flags & PG_FICTITIOUS) { + if ((m->oflags & VPO_UNMANAGED) != 0) { m->md.mdpg_cache_attrs = ma; return; } @@ -1763,7 +1760,7 @@ moea64_page_exists_quick(mmu_t mmu, pmap_t pmap, vm_page_t m) struct pvo_entry *pvo; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("moea64_page_exists_quick: page %p is not managed", m)); loops = 0; rv = FALSE; @@ -1791,7 +1788,7 @@ moea64_page_wired_mappings(mmu_t mmu, vm_page_t m) int count; count = 0; - if ((m->flags & PG_FICTITIOUS) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (count); vm_page_lock_queues(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) @@ -2227,8 +2224,6 @@ moea64_pvo_enter(mmu_t mmu, pmap_t pm, uma_zone_t zone, pvo->pvo_vaddr |= PVO_MANAGED; if (bootstrap) pvo->pvo_vaddr |= PVO_BOOTSTRAP; - if (flags & PVO_FAKE) - pvo->pvo_vaddr |= PVO_FAKE; if (flags & PVO_LARGE) pvo->pvo_vaddr |= PVO_LARGE; @@ -2305,7 +2300,7 @@ moea64_pvo_remove(mmu_t mmu, struct pvo_entry *pvo) /* * Save the REF/CHG bits into their cache if the page is managed. */ - if ((pvo->pvo_vaddr & (PVO_MANAGED|PVO_FAKE)) == PVO_MANAGED) { + if ((pvo->pvo_vaddr & PVO_MANAGED) == PVO_MANAGED) { struct vm_page *pg; pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN); diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c index 3a7786e5b51..26261a6b6fc 100644 --- a/sys/powerpc/booke/pmap.c +++ b/sys/powerpc/booke/pmap.c @@ -887,13 +887,11 @@ pte_enter(mmu_t mmu, pmap_t pmap, vm_page_t m, vm_offset_t va, uint32_t flags) * Insert pv_entry into pv_list for mapped page if part of managed * memory. */ - if ((m->flags & PG_FICTITIOUS) == 0) { - if ((m->flags & PG_UNMANAGED) == 0) { - flags |= PTE_MANAGED; + if ((m->oflags & VPO_UNMANAGED) == 0) { + flags |= PTE_MANAGED; - /* Create and insert pv entry. */ - pv_insert(pmap, va, m); - } + /* Create and insert pv entry. */ + pv_insert(pmap, va, m); } pmap->pm_stats.resident_count++; @@ -1562,8 +1560,8 @@ mmu_booke_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, KASSERT((va <= VM_MAXUSER_ADDRESS), ("mmu_booke_enter_locked: user pmap, non user va")); } - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || - (m->oflags & VPO_BUSY) != 0 || VM_OBJECT_LOCKED(m->object), + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || + VM_OBJECT_LOCKED(m->object), ("mmu_booke_enter_locked: page %p is not busy", m)); PMAP_LOCK_ASSERT(pmap, MA_OWNED); @@ -1668,7 +1666,7 @@ mmu_booke_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, if (!su) flags |= PTE_UW; - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) + if ((m->oflags & VPO_UNMANAGED) == 0) vm_page_flag_set(m, PG_WRITEABLE); } @@ -1955,7 +1953,7 @@ mmu_booke_remove_write(mmu_t mmu, vm_page_t m) pv_entry_t pv; pte_t *pte; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("mmu_booke_remove_write: page %p is not managed", m)); /* @@ -2169,7 +2167,7 @@ mmu_booke_is_modified(mmu_t mmu, vm_page_t m) pv_entry_t pv; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("mmu_booke_is_modified: page %p is not managed", m)); rv = FALSE; @@ -2220,7 +2218,7 @@ mmu_booke_is_referenced(mmu_t mmu, vm_page_t m) pv_entry_t pv; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("mmu_booke_is_referenced: page %p is not managed", m)); rv = FALSE; vm_page_lock_queues(); @@ -2248,7 +2246,7 @@ mmu_booke_clear_modify(mmu_t mmu, vm_page_t m) pte_t *pte; pv_entry_t pv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("mmu_booke_clear_modify: page %p is not managed", m)); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); KASSERT((m->oflags & VPO_BUSY) == 0, @@ -2300,7 +2298,7 @@ mmu_booke_ts_referenced(mmu_t mmu, vm_page_t m) pv_entry_t pv; int count; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("mmu_booke_ts_referenced: page %p is not managed", m)); count = 0; vm_page_lock_queues(); @@ -2339,7 +2337,7 @@ mmu_booke_clear_reference(mmu_t mmu, vm_page_t m) pte_t *pte; pv_entry_t pv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("mmu_booke_clear_reference: page %p is not managed", m)); vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { @@ -2400,7 +2398,7 @@ mmu_booke_page_exists_quick(mmu_t mmu, pmap_t pmap, vm_page_t m) int loops; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("mmu_booke_page_exists_quick: page %p is not managed", m)); loops = 0; rv = FALSE; @@ -2428,7 +2426,7 @@ mmu_booke_page_wired_mappings(mmu_t mmu, vm_page_t m) pte_t *pte; int count = 0; - if ((m->flags & PG_FICTITIOUS) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (count); vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { diff --git a/sys/powerpc/include/pmap.h b/sys/powerpc/include/pmap.h index 9166d04ba7d..688975d1ce2 100644 --- a/sys/powerpc/include/pmap.h +++ b/sys/powerpc/include/pmap.h @@ -127,10 +127,8 @@ LIST_HEAD(pvo_head, pvo_entry); #define PVO_EXECUTABLE 0x040UL /* PVO entry is executable */ #define PVO_BOOTSTRAP 0x080UL /* PVO entry allocated during bootstrap */ -#define PVO_FAKE 0x100UL /* fictitious phys page */ #define PVO_LARGE 0x200UL /* large page */ #define PVO_VADDR(pvo) ((pvo)->pvo_vaddr & ~ADDR_POFF) -#define PVO_ISFAKE(pvo) ((pvo)->pvo_vaddr & PVO_FAKE) #define PVO_PTEGIDX_GET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_MASK) #define PVO_PTEGIDX_ISSET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_VALID) #define PVO_PTEGIDX_CLR(pvo) \ diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c index 46c5050b2bd..0792c4bcf40 100644 --- a/sys/sparc64/sparc64/pmap.c +++ b/sys/sparc64/sparc64/pmap.c @@ -1390,7 +1390,7 @@ pmap_remove_all(vm_page_t m) struct tte *tp; vm_offset_t va; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_all: page %p is not managed", m)); vm_page_lock_queues(); for (tp = TAILQ_FIRST(&m->md.tte_list); tp != NULL; tp = tpn) { @@ -1498,13 +1498,13 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, { struct tte *tp; vm_paddr_t pa; + vm_page_t real; u_long data; - int i; mtx_assert(&vm_page_queue_mtx, MA_OWNED); PMAP_LOCK_ASSERT(pm, MA_OWNED); - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || - (m->oflags & VPO_BUSY) != 0 || VM_OBJECT_LOCKED(m->object), + KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 || + VM_OBJECT_LOCKED(m->object), ("pmap_enter_locked: page %p is not busy", m)); PMAP_STATS_INC(pmap_nenter); pa = VM_PAGE_TO_PHYS(m); @@ -1514,12 +1514,9 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, * physical memory, convert to the real backing page. */ if ((m->flags & PG_FICTITIOUS) != 0) { - for (i = 0; phys_avail[i + 1] != 0; i += 2) { - if (pa >= phys_avail[i] && pa <= phys_avail[i + 1]) { - m = PHYS_TO_VM_PAGE(pa); - break; - } - } + real = vm_phys_paddr_to_vm_page(pa); + if (real != NULL) + m = real; } CTR6(KTR_PMAP, @@ -1562,7 +1559,7 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, tp->tte_data |= TD_SW; if (wired) tp->tte_data |= TD_W; - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) + if ((m->oflags & VPO_UNMANAGED) == 0) vm_page_flag_set(m, PG_WRITEABLE); } else if ((data & TD_W) != 0) vm_page_dirty(m); @@ -1603,7 +1600,7 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, data |= TD_P; if ((prot & VM_PROT_WRITE) != 0) { data |= TD_SW; - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) + if ((m->oflags & VPO_UNMANAGED) == 0) vm_page_flag_set(m, PG_WRITEABLE); } if (prot & VM_PROT_EXECUTE) { @@ -1945,7 +1942,7 @@ pmap_page_exists_quick(pmap_t pm, vm_page_t m) int loops; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_page_exists_quick: page %p is not managed", m)); loops = 0; rv = FALSE; @@ -1975,7 +1972,7 @@ pmap_page_wired_mappings(vm_page_t m) int count; count = 0; - if ((m->flags & PG_FICTITIOUS) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (count); vm_page_lock_queues(); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) @@ -2006,7 +2003,7 @@ pmap_page_is_mapped(vm_page_t m) boolean_t rv; rv = FALSE; - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0) + if ((m->oflags & VPO_UNMANAGED) != 0) return (rv); vm_page_lock_queues(); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) @@ -2037,7 +2034,7 @@ pmap_ts_referenced(vm_page_t m) u_long data; int count; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_ts_referenced: page %p is not managed", m)); count = 0; vm_page_lock_queues(); @@ -2064,7 +2061,7 @@ pmap_is_modified(vm_page_t m) struct tte *tp; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_modified: page %p is not managed", m)); rv = FALSE; @@ -2117,7 +2114,7 @@ pmap_is_referenced(vm_page_t m) struct tte *tp; boolean_t rv; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_is_referenced: page %p is not managed", m)); rv = FALSE; vm_page_lock_queues(); @@ -2139,7 +2136,7 @@ pmap_clear_modify(vm_page_t m) struct tte *tp; u_long data; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_modify: page %p is not managed", m)); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); KASSERT((m->oflags & VPO_BUSY) == 0, @@ -2169,7 +2166,7 @@ pmap_clear_reference(vm_page_t m) struct tte *tp; u_long data; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_clear_reference: page %p is not managed", m)); vm_page_lock_queues(); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { @@ -2188,7 +2185,7 @@ pmap_remove_write(vm_page_t m) struct tte *tp; u_long data; - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("pmap_remove_write: page %p is not managed", m)); /* diff --git a/sys/sparc64/sparc64/tsb.c b/sys/sparc64/sparc64/tsb.c index 3130791e4d5..0f342596dd0 100644 --- a/sys/sparc64/sparc64/tsb.c +++ b/sys/sparc64/sparc64/tsb.c @@ -173,7 +173,7 @@ tsb_tte_enter(pmap_t pm, vm_page_t m, vm_offset_t va, u_long sz, u_long data) enter: if ((m->flags & PG_FICTITIOUS) == 0) { data |= TD_CP; - if ((m->flags & PG_UNMANAGED) == 0) { + if ((m->oflags & VPO_UNMANAGED) == 0) { pm->pm_stats.resident_count++; data |= TD_PV; } diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c index 23884af0b3a..24c24488a86 100644 --- a/sys/vm/vm_kern.c +++ b/sys/vm/vm_kern.c @@ -210,7 +210,7 @@ kmem_alloc(map, size) mem = vm_page_grab(kernel_object, OFF_TO_IDX(offset + i), VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_RETRY); mem->valid = VM_PAGE_BITS_ALL; - KASSERT((mem->flags & PG_UNMANAGED) != 0, + KASSERT((mem->oflags & VPO_UNMANAGED) != 0, ("kmem_alloc: page %p is managed", mem)); } VM_OBJECT_UNLOCK(kernel_object); @@ -428,7 +428,7 @@ retry: if (flags & M_ZERO && (m->flags & PG_ZERO) == 0) pmap_zero_page(m); m->valid = VM_PAGE_BITS_ALL; - KASSERT((m->flags & PG_UNMANAGED) != 0, + KASSERT((m->oflags & VPO_UNMANAGED) != 0, ("kmem_malloc: page %p is managed", m)); } VM_OBJECT_UNLOCK(kmem_object); diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index b5788f58757..602d99e93ad 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -1087,7 +1087,9 @@ shadowlookup: vm_page_unlock(m); goto unlock_tobject; } - KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + KASSERT((m->flags & PG_FICTITIOUS) == 0, + ("vm_object_madvise: page %p is fictitious", m)); + KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("vm_object_madvise: page %p is not managed", m)); if ((m->oflags & VPO_BUSY) || m->busy) { if (advise == MADV_WILLNEED) { diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 8e0c8bbaac3..6d558925d9a 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -483,8 +483,8 @@ vm_page_flag_set(vm_page_t m, unsigned short bits) * VPO_BUSY. Currently, this flag is only set by pmap_enter(). */ KASSERT((bits & PG_WRITEABLE) == 0 || - ((m->flags & (PG_UNMANAGED | PG_FICTITIOUS)) == 0 && - (m->oflags & VPO_BUSY) != 0), ("PG_WRITEABLE and !VPO_BUSY")); + (m->oflags & (VPO_UNMANAGED | VPO_BUSY)) == VPO_BUSY, + ("PG_WRITEABLE and !VPO_BUSY")); m->flags |= bits; } @@ -636,7 +636,7 @@ vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr) /* Fictitious pages don't use "segind". */ m->flags = PG_FICTITIOUS; /* Fictitious pages don't use "order" or "pool". */ - m->oflags = VPO_BUSY; + m->oflags = VPO_BUSY | VPO_UNMANAGED; m->wire_count = 1; pmap_page_set_memattr(m, memattr); return (m); @@ -896,7 +896,7 @@ vm_page_remove(vm_page_t m) vm_object_t object; vm_page_t root; - if ((m->flags & PG_UNMANAGED) == 0) + if ((m->oflags & VPO_UNMANAGED) == 0) vm_page_lock_assert(m, MA_OWNED); if ((object = m->object) == NULL) return; @@ -1388,14 +1388,14 @@ vm_page_alloc(vm_object_t object, vm_pindex_t pindex, int req) if (req & VM_ALLOC_ZERO) flags = PG_ZERO; } - if (object == NULL || object->type == OBJT_PHYS) - flags |= PG_UNMANAGED; m->flags = flags; mtx_unlock(&vm_page_queue_free_mtx); - if (req & (VM_ALLOC_NOBUSY | VM_ALLOC_NOOBJ)) - m->oflags = 0; + if (object == NULL || object->type == OBJT_PHYS) + m->oflags = VPO_UNMANAGED; else - m->oflags = VPO_BUSY; + m->oflags = 0; + if ((req & (VM_ALLOC_NOBUSY | VM_ALLOC_NOOBJ)) == 0) + m->oflags |= VPO_BUSY; if (req & VM_ALLOC_WIRED) { /* * The page lock is not required for wiring a page until that @@ -1479,8 +1479,8 @@ vm_page_alloc_init(vm_page_t m) if (m->flags & PG_ZERO) vm_page_zero_count--; /* Don't clear the PG_ZERO flag; we'll need it later. */ - m->flags = PG_UNMANAGED | (m->flags & PG_ZERO); - m->oflags = 0; + m->flags &= PG_ZERO; + m->oflags = VPO_UNMANAGED; /* Unmanaged pages don't use "act_count". */ return (drop); } @@ -1670,7 +1670,7 @@ vm_page_activate(vm_page_t m) vm_page_lock_assert(m, MA_OWNED); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((queue = m->queue) != PQ_ACTIVE) { - if (m->wire_count == 0 && (m->flags & PG_UNMANAGED) == 0) { + if (m->wire_count == 0 && (m->oflags & VPO_UNMANAGED) == 0) { if (m->act_count < ACT_INIT) m->act_count = ACT_INIT; vm_page_lock_queues(); @@ -1736,7 +1736,7 @@ void vm_page_free_toq(vm_page_t m) { - if ((m->flags & PG_UNMANAGED) == 0) { + if ((m->oflags & VPO_UNMANAGED) == 0) { vm_page_lock_assert(m, MA_OWNED); KASSERT(!pmap_page_is_mapped(m), ("vm_page_free_toq: freeing mapped page %p", m)); @@ -1754,7 +1754,7 @@ vm_page_free_toq(vm_page_t m) * callback routine until after we've put the page on the * appropriate free queue. */ - if ((m->flags & PG_UNMANAGED) == 0) + if ((m->oflags & VPO_UNMANAGED) == 0) vm_pageq_remove(m); vm_page_remove(m); @@ -1834,7 +1834,7 @@ vm_page_wire(vm_page_t m) return; } if (m->wire_count == 0) { - if ((m->flags & PG_UNMANAGED) == 0) + if ((m->oflags & VPO_UNMANAGED) == 0) vm_pageq_remove(m); atomic_add_int(&cnt.v_wire_count, 1); } @@ -1862,7 +1862,7 @@ void vm_page_unwire(vm_page_t m, int activate) { - if ((m->flags & PG_UNMANAGED) == 0) + if ((m->oflags & VPO_UNMANAGED) == 0) vm_page_lock_assert(m, MA_OWNED); if ((m->flags & PG_FICTITIOUS) != 0) { KASSERT(m->wire_count == 1, @@ -1873,7 +1873,7 @@ vm_page_unwire(vm_page_t m, int activate) m->wire_count--; if (m->wire_count == 0) { atomic_subtract_int(&cnt.v_wire_count, 1); - if ((m->flags & PG_UNMANAGED) != 0 || + if ((m->oflags & VPO_UNMANAGED) != 0 || m->object == NULL) return; vm_page_lock_queues(); @@ -1921,7 +1921,7 @@ _vm_page_deactivate(vm_page_t m, int athead) */ if ((queue = m->queue) == PQ_INACTIVE) return; - if (m->wire_count == 0 && (m->flags & PG_UNMANAGED) == 0) { + if (m->wire_count == 0 && (m->oflags & VPO_UNMANAGED) == 0) { vm_page_lock_queues(); vm_page_flag_clear(m, PG_WINATCFLS); if (queue != PQ_NONE) @@ -1962,7 +1962,7 @@ vm_page_try_to_cache(vm_page_t m) vm_page_lock_assert(m, MA_OWNED); VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if (m->dirty || m->hold_count || m->busy || m->wire_count || - (m->oflags & VPO_BUSY) || (m->flags & PG_UNMANAGED)) + (m->oflags & (VPO_BUSY | VPO_UNMANAGED)) != 0) return (0); pmap_remove_all(m); if (m->dirty) @@ -1985,7 +1985,7 @@ vm_page_try_to_free(vm_page_t m) if (m->object != NULL) VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if (m->dirty || m->hold_count || m->busy || m->wire_count || - (m->oflags & VPO_BUSY) || (m->flags & PG_UNMANAGED)) + (m->oflags & (VPO_BUSY | VPO_UNMANAGED)) != 0) return (0); pmap_remove_all(m); if (m->dirty) @@ -2010,7 +2010,7 @@ vm_page_cache(vm_page_t m) vm_page_lock_assert(m, MA_OWNED); object = m->object; VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); - if ((m->flags & PG_UNMANAGED) || (m->oflags & VPO_BUSY) || m->busy || + if ((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) || m->busy || m->hold_count || m->wire_count) panic("vm_page_cache: attempting to cache busy page"); pmap_remove_all(m); @@ -2657,7 +2657,8 @@ vm_page_cowsetup(vm_page_t m) { vm_page_lock_assert(m, MA_OWNED); - if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0 || + if ((m->flags & PG_FICTITIOUS) != 0 || + (m->oflags & VPO_UNMANAGED) != 0 || m->cow == USHRT_MAX - 1 || !VM_OBJECT_TRYLOCK(m->object)) return (EBUSY); m->cow++; diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h index e852313edc8..1dda1e29e0c 100644 --- a/sys/vm/vm_page.h +++ b/sys/vm/vm_page.h @@ -157,9 +157,18 @@ struct vm_page { * * Access to these page flags is synchronized by the lock on the object * containing the page (O). + * + * Note: VPO_UNMANAGED (used by OBJT_DEVICE, OBJT_PHYS and OBJT_SG) + * indicates that the page is not under PV management but + * otherwise should be treated as a normal page. Pages not + * under PV management cannot be paged out via the + * object/vm_page_t because there is no knowledge of their pte + * mappings, and such pages are also not on any PQ queue. + * */ #define VPO_BUSY 0x0001 /* page is in transit */ #define VPO_WANTED 0x0002 /* someone is waiting for page */ +#define VPO_UNMANAGED 0x0004 /* No PV management for page */ #define VPO_SWAPINPROG 0x0200 /* swap I/O in progress on page */ #define VPO_NOSYNC 0x0400 /* do not collect for syncer */ @@ -216,13 +225,6 @@ extern struct vpglocks pa_lock[]; /* * These are the flags defined for vm_page. * - * Note: PG_UNMANAGED (used by OBJT_PHYS) indicates that the page is - * not under PV management but otherwise should be treated as a - * normal page. Pages not under PV management cannot be paged out - * via the object/vm_page_t because there is no knowledge of their - * pte mappings, nor can they be removed from their objects via - * the object, and such pages are also not on any PQ queue. - * * PG_REFERENCED may be cleared only if the object containing the page is * locked. * @@ -236,7 +238,6 @@ extern struct vpglocks pa_lock[]; #define PG_WRITEABLE 0x0010 /* page is mapped writeable */ #define PG_ZERO 0x0040 /* page is zeroed */ #define PG_REFERENCED 0x0080 /* page has been referenced */ -#define PG_UNMANAGED 0x0800 /* No PV management for page */ #define PG_MARKER 0x1000 /* special queue marker page */ #define PG_SLAB 0x2000 /* object pointer is actually a slab */ From 7236660627b53d0594c26b083484dbbc28b3b5bc Mon Sep 17 00:00:00 2001 From: Kevin Lo Date: Wed, 10 Aug 2011 06:17:06 +0000 Subject: [PATCH 203/452] If RTF_HOST flag is specified, then we are interested in destination address. PR: kern/159600 Submitted by: Svatopluk Kraus Approved by: re (hrs) --- sys/netinet/in.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/netinet/in.c b/sys/netinet/in.c index c0901178d99..e797c40c1af 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -1037,7 +1037,7 @@ in_addprefix(struct in_ifaddr *target, int flags) IN_IFADDR_RLOCK(); TAILQ_FOREACH(ia, &V_in_ifaddrhead, ia_link) { if (rtinitflags(ia)) { - p = ia->ia_addr.sin_addr; + p = ia->ia_dstaddr.sin_addr; if (prefix.s_addr != p.s_addr) continue; From 2bf43f7d0f30b4dee79b630fc5a3d136119ffcbe Mon Sep 17 00:00:00 2001 From: Rong-En Fan Date: Wed, 10 Aug 2011 15:49:24 +0000 Subject: [PATCH 204/452] - Remove myself from ncurses maintainer due to ENOTIME Approved by: re (kib@) --- MAINTAINERS | 1 - 1 file changed, 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index e4d1c56603e..300dbd1b30d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -115,7 +115,6 @@ lib/libsdp emax Pre-commit review preferred. usr.bin/bluetooth emax Pre-commit review preferred. usr.sbin/bluetooth emax Pre-commit review preferred. gnu/usr.bin/send-pr bugmaster Pre-commit review requested. -ncurses rafan Heads-up appreciated, try not to break it. *env(3) secteam Due to the problematic security history of this code, please have patches reviewed by secteam. share/zoneinfo edwin Heads-up appreciated, since our data is coming From 1bf5a6cf3ce807b20dd2e360e2041078d4ace0e5 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Wed, 10 Aug 2011 19:05:22 +0000 Subject: [PATCH 205/452] o Improve 224494: - Ignore some more internal SAS device status change events. - Correct inverted Bus and TargetID arguments in a warning. o Add a warning for MPI_EVENT_SAS_DISCOVERY_ERROR events, which can help identifying broken disks. Submitted by: Andrew Boyer Approved by: re (kib) Committed from: Chaos Communication Camp 2011 --- sys/dev/mpt/mpilib/mpi_ioc.h | 20 +++++++++++++++++++- sys/dev/mpt/mpt_cam.c | 17 +++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/sys/dev/mpt/mpilib/mpi_ioc.h b/sys/dev/mpt/mpilib/mpi_ioc.h index 107c561aeee..c0c73d29f81 100644 --- a/sys/dev/mpt/mpilib/mpi_ioc.h +++ b/sys/dev/mpt/mpilib/mpi_ioc.h @@ -33,7 +33,7 @@ * Title: MPI IOC, Port, Event, FW Download, and FW Upload messages * Creation Date: August 11, 2000 * - * mpi_ioc.h Version: 01.05.14 + * mpi_ioc.h Version: 01.05.16 * * Version History * --------------- @@ -140,6 +140,16 @@ * added _MULTI_PORT_DOMAIN. * 05-24-07 01.05.14 Added Common Boot Block type to FWDownload Request. * Added Common Boot Block type to FWUpload Request. + * 08-07-07 01.05.15 Added MPI_EVENT_SAS_INIT_RC_REMOVED define. + * Added MPI_EVENT_IR2_RC_DUAL_PORT_ADDED and + * MPI_EVENT_IR2_RC_DUAL_PORT_REMOVED for IR2 event data. + * Added SASAddress field to SAS Initiator Device Table + * Overflow event data structure. + * 03-28-08 01.05.16 Added two new ReasonCode values to SAS Device Status + * Change Event data to indicate completion of internally + * generated task management. + * Added MPI_EVENT_DSCVRY_ERR_DS_SATA_INIT_FAILURE define. + * Added MPI_EVENT_SAS_INIT_RC_INACCESSIBLE define. * -------------------------------------------------------------------------- */ @@ -639,6 +649,8 @@ typedef struct _EVENT_DATA_SAS_DEVICE_STATUS_CHANGE #define MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL (0x0B) #define MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL (0x0C) #define MPI_EVENT_SAS_DEV_STAT_RC_ASYNC_NOTIFICATION (0x0D) +#define MPI_EVENT_SAS_DEV_STAT_RC_CMPL_INTERNAL_DEV_RESET (0x0E) +#define MPI_EVENT_SAS_DEV_STAT_RC_CMPL_TASK_ABORT_INTERNAL (0x0F) /* SCSI Event data for Queue Full event */ @@ -735,6 +747,8 @@ typedef struct _MPI_EVENT_DATA_IR2 #define MPI_EVENT_IR2_RC_PD_REMOVED (0x05) #define MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED (0x06) #define MPI_EVENT_IR2_RC_REBUILD_MEDIUM_ERROR (0x07) +#define MPI_EVENT_IR2_RC_DUAL_PORT_ADDED (0x08) +#define MPI_EVENT_IR2_RC_DUAL_PORT_REMOVED (0x09) /* defines for logical disk states */ #define MPI_LD_STATE_OPTIMAL (0x00) @@ -894,6 +908,7 @@ typedef struct _EVENT_DATA_DISCOVERY_ERROR #define MPI_EVENT_DSCVRY_ERR_DS_UNSUPPORTED_DEVICE (0x00000800) #define MPI_EVENT_DSCVRY_ERR_DS_MAX_SATA_TARGETS (0x00001000) #define MPI_EVENT_DSCVRY_ERR_DS_MULTI_PORT_DOMAIN (0x00002000) +#define MPI_EVENT_DSCVRY_ERR_DS_SATA_INIT_FAILURE (0x00004000) /* SAS SMP Error Event data */ @@ -929,6 +944,8 @@ typedef struct _EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE /* defines for the ReasonCode field of the SAS Initiator Device Status Change event */ #define MPI_EVENT_SAS_INIT_RC_ADDED (0x01) +#define MPI_EVENT_SAS_INIT_RC_REMOVED (0x02) +#define MPI_EVENT_SAS_INIT_RC_INACCESSIBLE (0x03) /* SAS Initiator Device Table Overflow Event data */ @@ -937,6 +954,7 @@ typedef struct _EVENT_DATA_SAS_INIT_TABLE_OVERFLOW U8 MaxInit; /* 00h */ U8 CurrentInit; /* 01h */ U16 Reserved1; /* 02h */ + U64 SASAddress; /* 04h */ } EVENT_DATA_SAS_INIT_TABLE_OVERFLOW, MPI_POINTER PTR_EVENT_DATA_SAS_INIT_TABLE_OVERFLOW, MpiEventDataSasInitTableOverflow_t, diff --git a/sys/dev/mpt/mpt_cam.c b/sys/dev/mpt/mpt_cam.c index 10856721ef8..d512458c758 100644 --- a/sys/dev/mpt/mpt_cam.c +++ b/sys/dev/mpt/mpt_cam.c @@ -2620,17 +2620,30 @@ mpt_cam_event(struct mpt_softc *mpt, request_t *req, xpt_free_path(tmppath); CAMLOCK_2_MPTLOCK(mpt); break; + case MPI_EVENT_SAS_DEV_STAT_RC_CMPL_INTERNAL_DEV_RESET: + case MPI_EVENT_SAS_DEV_STAT_RC_CMPL_TASK_ABORT_INTERNAL: case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET: break; default: mpt_lprt(mpt, MPT_PRT_WARN, "SAS device status change: Bus: 0x%02x TargetID: " - "0x%02x ReasonCode: 0x%02x\n", psdsc->TargetID, - psdsc->Bus, psdsc->ReasonCode); + "0x%02x ReasonCode: 0x%02x\n", psdsc->Bus, + psdsc->TargetID, psdsc->ReasonCode); break; } break; } + case MPI_EVENT_SAS_DISCOVERY_ERROR: + { + PTR_EVENT_DATA_DISCOVERY_ERROR pde; + + pde = (PTR_EVENT_DATA_DISCOVERY_ERROR)msg->Data; + pde->DiscoveryStatus = le32toh(pde->DiscoveryStatus); + mpt_lprt(mpt, MPT_PRT_WARN, + "SAS discovery error: Port: 0x%02x Status: 0x%08x\n", + pde->Port, pde->DiscoveryStatus); + break; + } case MPI_EVENT_EVENT_CHANGE: case MPI_EVENT_INTEGRATED_RAID: case MPI_EVENT_IR2: From 852f933d9d31a633ae416f0c1e020c5c01a4e9cd Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Wed, 10 Aug 2011 19:12:21 +0000 Subject: [PATCH 206/452] Sync makefs(8) ISO 9660 support with NetBSD: o cd9960 -> cd9660 o Move inclusion of sys/endian.h from cd9660_eltorito.c to cd9660.h since actual user is not cd9660_eltorito.c but iso.h and cd9660_eltorito.h. Actually, include order/place of sys/endian.h doesn't matter on netbsd since it is always included by sys/types.h but it's not true on other system. This should fix cross build breakage on freebsd introduced by rev. 1.16 of cd9660_eltorito.c. Problem reported and fix suggested on twitter. o Fix fd leaks in error cases. Found by cppcheck. o RRIP RE length should be 4, not 0 o Apply fixes for PR bin/44114 (makefs(8) -t cd9660 -o rockridge creates corrupted cd9660fs), iso9660_rrip.c part: - cd9660_rrip_finalize_node() should check rr_real_parent in node->parent, not in node itself in RRIP_PL case - cd9660_rrip_initialize_node() should update only node passed as arg so handle RRIP_PL in DOTDOT case Fixes malformed dotdot entries in deep (more than 8 level) directories moved into .rr_moved dir. Should be pulled up to netbsd-5. (no official ISO has such deep dirs, but cobalt restorecd is affected) Reviewed by: mm Approved by: re (kib) Obtained from: NetBSD MFC after: 3 days --- usr.sbin/makefs/cd9660.c | 14 ++++++------- usr.sbin/makefs/cd9660.h | 3 ++- usr.sbin/makefs/cd9660/cd9660_conversion.c | 2 -- usr.sbin/makefs/cd9660/cd9660_eltorito.c | 16 +++++++-------- usr.sbin/makefs/cd9660/cd9660_write.c | 4 +++- usr.sbin/makefs/cd9660/iso9660_rrip.c | 24 +++++++++++----------- 6 files changed, 32 insertions(+), 31 deletions(-) diff --git a/usr.sbin/makefs/cd9660.c b/usr.sbin/makefs/cd9660.c index 281a2038489..44af9840bd2 100644 --- a/usr.sbin/makefs/cd9660.c +++ b/usr.sbin/makefs/cd9660.c @@ -1,4 +1,4 @@ -/* $NetBSD: cd9660.c,v 1.27 2010/10/27 18:51:34 christos Exp $ */ +/* $NetBSD: cd9660.c,v 1.31 2011/08/06 23:25:19 christos Exp $ */ /* * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan @@ -127,7 +127,7 @@ static int cd9660_setup_volume_descriptors(void); static int cd9660_fill_extended_attribute_record(cd9660node *); #endif static void cd9660_sort_nodes(cd9660node *); -static int cd9960_translate_node_common(cd9660node *); +static int cd9660_translate_node_common(cd9660node *); static int cd9660_translate_node(fsnode *, cd9660node *); static int cd9660_compare_filename(const char *, const char *); static void cd9660_sorted_child_insert(cd9660node *, cd9660node *); @@ -809,7 +809,7 @@ cd9660_fill_extended_attribute_record(cd9660node *node) #endif static int -cd9960_translate_node_common(cd9660node *newnode) +cd9660_translate_node_common(cd9660node *newnode) { time_t tim; int test; @@ -846,7 +846,7 @@ cd9960_translate_node_common(cd9660node *newnode) } /* - * Translate fsnode to cd9960node + * Translate fsnode to cd9660node * Translate filenames and other metadata, including dates, sizes, * permissions, etc * @param struct fsnode * The node generated by makefs @@ -875,7 +875,7 @@ cd9660_translate_node(fsnode *node, cd9660node *newnode) if (!(S_ISDIR(node->type))) newnode->fileDataLength = node->inode->st.st_size; - if (cd9960_translate_node_common(newnode) == 0) + if (cd9660_translate_node_common(newnode) == 0) return 0; /* Finally, overwrite some of the values that are set by default */ @@ -2042,7 +2042,7 @@ cd9660_create_file(const char * name, cd9660node *parent, cd9660node *me) return NULL; *temp->node->inode = *me->node->inode; - if (cd9960_translate_node_common(temp) == 0) + if (cd9660_translate_node_common(temp) == 0) return NULL; return temp; } @@ -2069,7 +2069,7 @@ cd9660_create_directory(const char *name, cd9660node *parent, cd9660node *me) return NULL; *temp->node->inode = *me->node->inode; - if (cd9960_translate_node_common(temp) == 0) + if (cd9660_translate_node_common(temp) == 0) return NULL; return temp; } diff --git a/usr.sbin/makefs/cd9660.h b/usr.sbin/makefs/cd9660.h index 79f0a9d0c1a..108dd48cca1 100644 --- a/usr.sbin/makefs/cd9660.h +++ b/usr.sbin/makefs/cd9660.h @@ -1,4 +1,4 @@ -/* $NetBSD: cd9660.h,v 1.15 2010/10/27 18:51:34 christos Exp $ */ +/* $NetBSD: cd9660.h,v 1.17 2011/06/23 02:35:56 enami Exp $ */ /* * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan @@ -50,6 +50,7 @@ #include #include #include +#include #include "makefs.h" #include "iso.h" diff --git a/usr.sbin/makefs/cd9660/cd9660_conversion.c b/usr.sbin/makefs/cd9660/cd9660_conversion.c index e815028a1b6..43fc7c5e488 100644 --- a/usr.sbin/makefs/cd9660/cd9660_conversion.c +++ b/usr.sbin/makefs/cd9660/cd9660_conversion.c @@ -36,8 +36,6 @@ #include __FBSDID("$FreeBSD$"); -#include - static char cd9660_compute_gm_offset(time_t); #if 0 diff --git a/usr.sbin/makefs/cd9660/cd9660_eltorito.c b/usr.sbin/makefs/cd9660/cd9660_eltorito.c index 2f45e9d5176..ca3dfd9bd2b 100644 --- a/usr.sbin/makefs/cd9660/cd9660_eltorito.c +++ b/usr.sbin/makefs/cd9660/cd9660_eltorito.c @@ -1,4 +1,4 @@ -/* $NetBSD: cd9660_eltorito.c,v 1.14 2010/10/27 18:51:35 christos Exp $ */ +/* $NetBSD: cd9660_eltorito.c,v 1.17 2011/06/23 02:35:56 enami Exp $ */ /* * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan @@ -32,8 +32,6 @@ * OF SUCH DAMAGE. */ -#include - #include "cd9660.h" #include "cd9660_eltorito.h" @@ -501,13 +499,14 @@ cd9660_setup_boot_volume_descriptor(volume_descriptor *bvd) } static int -cd9660_write_mbr_partition_entry(FILE *fd, int index, off_t sector_start, +cd9660_write_mbr_partition_entry(FILE *fd, int idx, off_t sector_start, off_t nsectors, int type) { uint8_t val; uint32_t lba; - fseeko(fd, (off_t)(index) * 16 + 0x1be, SEEK_SET); + if (fseeko(fd, (off_t)(idx) * 16 + 0x1be, SEEK_SET) == -1) + err(1, "fseeko"); val = 0x80; /* Bootable */ fwrite(&val, sizeof(val), 1, fd); @@ -531,18 +530,19 @@ cd9660_write_mbr_partition_entry(FILE *fd, int index, off_t sector_start, lba = htole32(nsectors); fwrite(&lba, sizeof(lba), 1, fd); - return (0); + return 0; } static int -cd9660_write_apm_partition_entry(FILE *fd, int index, int total_partitions, +cd9660_write_apm_partition_entry(FILE *fd, int idx, int total_partitions, off_t sector_start, off_t nsectors, off_t sector_size, const char *part_name, const char *part_type) { uint32_t apm32; uint16_t apm16; - fseeko(fd, (off_t)(index + 1) * sector_size, SEEK_SET); + if (fseeko(fd, (off_t)(idx + 1) * sector_size, SEEK_SET) == -1) + err(1, "fseeko"); /* Signature */ apm16 = htobe16(0x504d); diff --git a/usr.sbin/makefs/cd9660/cd9660_write.c b/usr.sbin/makefs/cd9660/cd9660_write.c index 46227016f4c..4c2a24a1d1c 100644 --- a/usr.sbin/makefs/cd9660/cd9660_write.c +++ b/usr.sbin/makefs/cd9660/cd9660_write.c @@ -1,4 +1,4 @@ -/* $NetBSD: cd9660_write.c,v 1.13 2010/10/22 00:49:15 christos Exp $ */ +/* $NetBSD: cd9660_write.c,v 1.14 2011/01/04 09:48:21 wiz Exp $ */ /* * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan @@ -460,6 +460,7 @@ cd9660_copy_file(FILE *fd, off_t start_sector, const char *filename) if (ferror(rf)) { warn("%s: fread", __func__); free(buf); + (void)fclose(rf); return 0; } @@ -467,6 +468,7 @@ cd9660_copy_file(FILE *fd, off_t start_sector, const char *filename) if (ferror(fd)) { warn("%s: fwrite", __func__); free(buf); + (void)fclose(rf); return 0; } sector++; diff --git a/usr.sbin/makefs/cd9660/iso9660_rrip.c b/usr.sbin/makefs/cd9660/iso9660_rrip.c index 71f77aa6b6b..68de7ccc0e5 100644 --- a/usr.sbin/makefs/cd9660/iso9660_rrip.c +++ b/usr.sbin/makefs/cd9660/iso9660_rrip.c @@ -1,4 +1,4 @@ -/* $NetBSD: iso9660_rrip.c,v 1.8 2009/01/10 22:06:29 bjh21 Exp $ */ +/* $NetBSD: iso9660_rrip.c,v 1.10 2011/05/29 17:07:58 tsutsui Exp $ */ /* * Copyright (c) 2005 Daniel Watt, Walter Deignan, Ryan Gabrys, Alan @@ -183,10 +183,11 @@ cd9660_rrip_finalize_node(cd9660node *node) break; case SUSP_ENTRY_RRIP_PL: /* Look at rr_real_parent */ - if (node->rr_real_parent == NULL) + if (node->parent == NULL || + node->parent->rr_real_parent == NULL) return -1; cd9660_bothendian_dword( - node->rr_real_parent->fileDataSector, + node->parent->rr_real_parent->fileDataSector, (unsigned char *) t->attr.rr_entry.PL.dir_loc); break; @@ -396,6 +397,13 @@ cd9660_rrip_initialize_node(cd9660node *node, cd9660node *parent, cd9660node_rrip_px(current, grandparent->node); TAILQ_INSERT_TAIL(&node->head, current, rr_ll); } + /* Handle PL */ + if (parent != NULL && parent->rr_real_parent != NULL) { + current = cd9660node_susp_create_node(SUSP_TYPE_RRIP, + SUSP_ENTRY_RRIP_PL, "PL", SUSP_LOC_DOTDOT); + cd9660_rrip_PL(current,node); + TAILQ_INSERT_TAIL(&node->head, current, rr_ll); + } } else { cd9660_rrip_initialize_inode(node); @@ -435,14 +443,6 @@ cd9660_rrip_initialize_node(cd9660node *node, cd9660node *parent, SUSP_ENTRY_RRIP_RE, "RE", SUSP_LOC_ENTRY); cd9660_rrip_RE(current,node); TAILQ_INSERT_TAIL(&node->head, current, rr_ll); - - /* Handle PL */ - current = cd9660node_susp_create_node(SUSP_TYPE_RRIP, - SUSP_ENTRY_RRIP_PL, "PL", SUSP_LOC_DOTDOT); - cd9660_rrip_PL(current,node->dot_dot_record); - TAILQ_INSERT_TAIL(&node->dot_dot_record->head, current, - rr_ll); - TAILQ_INSERT_TAIL(&node->head, current, rr_ll); } } return 1; @@ -496,7 +496,7 @@ cd9660_rrip_CL(struct ISO_SUSP_ATTRIBUTES *p, cd9660node *node __unused) int cd9660_rrip_RE(struct ISO_SUSP_ATTRIBUTES *p, cd9660node *node __unused) { - p->attr.rr_entry.RE.h.length[0] = 0; + p->attr.rr_entry.RE.h.length[0] = 4; p->attr.rr_entry.RE.h.version[0] = 1; return 1; } From 4116c8e7382b3ecd82cf568118fcbc84bb8185e2 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Wed, 10 Aug 2011 20:52:02 +0000 Subject: [PATCH 207/452] Revert r224760, and enhance the sed patterns from r224659 to comment out the _compat entries in the WITHOUT_NIS case rather then delete them. Approved by: re (kib) --- etc/Makefile | 4 ++++ etc/nsswitch.conf | 22 +++++++--------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/etc/Makefile b/etc/Makefile index e7fa2d55380..42d695939d2 100644 --- a/etc/Makefile +++ b/etc/Makefile @@ -256,6 +256,10 @@ distribution: ${DESTDIR}/boot/device.hints .endif .endif +.if ${MK_NIS} == "no" + sed -i "" -e 's/.*_compat:/# &/' -e 's/compat$$/files/' \ + ${DESTDIR}/etc/nsswitch.conf +.endif distrib-dirs: mtree -eU ${MTREE_FOLLOWS_SYMLINKS} -f ${.CURDIR}/mtree/BSD.root.dist -p ${DESTDIR}/ diff --git a/etc/nsswitch.conf b/etc/nsswitch.conf index ab27fb9fde9..c95b9a4e01c 100644 --- a/etc/nsswitch.conf +++ b/etc/nsswitch.conf @@ -1,23 +1,15 @@ # +# nsswitch.conf(5) - name service switch configuration file # $FreeBSD$ # -# To enable NIS the commented entries should replace their uncommented -# equivalents. See nsswitch.conf(5) for more information. -# -group: files -#group_compat: nis -#group: compat - -passwd: files -#passwd_compat: nis -#passwd: compat - -services: files -#services_compat: nis -#services: compat - +group: compat +group_compat: nis hosts: files dns networks: files +passwd: compat +passwd_compat: nis shells: files +services: compat +services_compat: nis protocols: files rpc: files From 223eb00dd0f32465483e33a012797bad963e971b Mon Sep 17 00:00:00 2001 From: Navdeep Parhar Date: Wed, 10 Aug 2011 22:03:34 +0000 Subject: [PATCH 208/452] Move cxgbtool from usr.sbin to tools/tools. Approved by: re (kib) MFC after: 1 month --- tools/tools/README | 1 + {usr.sbin => tools/tools}/cxgbtool/Makefile | 5 ++--- {usr.sbin => tools/tools}/cxgbtool/cxgbtool.c | 0 {usr.sbin => tools/tools}/cxgbtool/reg_defs.c | 0 {usr.sbin => tools/tools}/cxgbtool/reg_defs_t3.c | 0 {usr.sbin => tools/tools}/cxgbtool/reg_defs_t3b.c | 0 {usr.sbin => tools/tools}/cxgbtool/reg_defs_t3c.c | 0 {usr.sbin => tools/tools}/cxgbtool/version.h | 0 8 files changed, 3 insertions(+), 3 deletions(-) rename {usr.sbin => tools/tools}/cxgbtool/Makefile (64%) rename {usr.sbin => tools/tools}/cxgbtool/cxgbtool.c (100%) rename {usr.sbin => tools/tools}/cxgbtool/reg_defs.c (100%) rename {usr.sbin => tools/tools}/cxgbtool/reg_defs_t3.c (100%) rename {usr.sbin => tools/tools}/cxgbtool/reg_defs_t3b.c (100%) rename {usr.sbin => tools/tools}/cxgbtool/reg_defs_t3c.c (100%) rename {usr.sbin => tools/tools}/cxgbtool/version.h (100%) diff --git a/tools/tools/README b/tools/tools/README index 42ea75c4fc3..253b2e08f73 100644 --- a/tools/tools/README +++ b/tools/tools/README @@ -17,6 +17,7 @@ commitsdb A tool for reconstructing commit history using md5 checksums of the commit logs. crypto Test and exercise tools related to the crypto framework cxgbetool A tool for the cxgbe(4) driver. +cxgbtool A tool for the cxgb(4) driver. diffburst OBSOLETE: equivalent functionality is available via split -p. For example: "split -p ^diff < patchfile". See split(1). editing Editor modes and the like to help editing FreeBSD code. diff --git a/usr.sbin/cxgbtool/Makefile b/tools/tools/cxgbtool/Makefile similarity index 64% rename from usr.sbin/cxgbtool/Makefile rename to tools/tools/cxgbtool/Makefile index f8e5175f8c4..507bee085fc 100644 --- a/usr.sbin/cxgbtool/Makefile +++ b/tools/tools/cxgbtool/Makefile @@ -3,9 +3,8 @@ PROG= cxgbtool SRCS= cxgbtool.c NO_MAN= -CFLAGS+= -I${.CURDIR}/../../sys/dev/cxgb -I. +CFLAGS+= -I${.CURDIR}/../../../sys/dev/cxgb -I. CFLAGS+= -DCONFIG_T3_REGS -DCHELSIO_INTERNAL - -install: +BINDIR?= /usr/sbin .include diff --git a/usr.sbin/cxgbtool/cxgbtool.c b/tools/tools/cxgbtool/cxgbtool.c similarity index 100% rename from usr.sbin/cxgbtool/cxgbtool.c rename to tools/tools/cxgbtool/cxgbtool.c diff --git a/usr.sbin/cxgbtool/reg_defs.c b/tools/tools/cxgbtool/reg_defs.c similarity index 100% rename from usr.sbin/cxgbtool/reg_defs.c rename to tools/tools/cxgbtool/reg_defs.c diff --git a/usr.sbin/cxgbtool/reg_defs_t3.c b/tools/tools/cxgbtool/reg_defs_t3.c similarity index 100% rename from usr.sbin/cxgbtool/reg_defs_t3.c rename to tools/tools/cxgbtool/reg_defs_t3.c diff --git a/usr.sbin/cxgbtool/reg_defs_t3b.c b/tools/tools/cxgbtool/reg_defs_t3b.c similarity index 100% rename from usr.sbin/cxgbtool/reg_defs_t3b.c rename to tools/tools/cxgbtool/reg_defs_t3b.c diff --git a/usr.sbin/cxgbtool/reg_defs_t3c.c b/tools/tools/cxgbtool/reg_defs_t3c.c similarity index 100% rename from usr.sbin/cxgbtool/reg_defs_t3c.c rename to tools/tools/cxgbtool/reg_defs_t3c.c diff --git a/usr.sbin/cxgbtool/version.h b/tools/tools/cxgbtool/version.h similarity index 100% rename from usr.sbin/cxgbtool/version.h rename to tools/tools/cxgbtool/version.h From 0abe4b0321121e3abc986beff255c2a4b3addc82 Mon Sep 17 00:00:00 2001 From: Ruslan Ermilov Date: Thu, 11 Aug 2011 04:58:20 +0000 Subject: [PATCH 209/452] Vendor import of bwk's 10-Aug-2011 release. --- FIXES | 4 ++++ lib.c | 9 +++++++-- main.c | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/FIXES b/FIXES index a802ad41878..4b28708f99f 100644 --- a/FIXES +++ b/FIXES @@ -25,6 +25,10 @@ THIS SOFTWARE. This file lists all bug fixes, changes, etc., made since the AWK book was sent to the printers in August, 1987. +Aug 10, 2011: + another fix to avoid core dump with -v; again, many thanks + to ruslan ermilov. + Aug 7, 2011: split(s, a, //) now behaves the same as split(s, a, "") diff --git a/lib.c b/lib.c index 5da601aa8e7..5eeb53d4679 100644 --- a/lib.c +++ b/lib.c @@ -89,8 +89,13 @@ void initgetrec(void) char *p; for (i = 1; i < *ARGC; i++) { - if (!isclvar(p = getargv(i))) { /* find 1st real filename */ - setsval(lookup("FILENAME", symtab), getargv(i)); + p = getargv(i); /* find 1st real filename */ + if (p == NULL || *p == '\0') { /* deleted or zapped */ + argno++; + continue; + } + if (!isclvar(p)) { + setsval(lookup("FILENAME", symtab), p); return; } setclvar(p); /* a commandline assignment before filename */ diff --git a/main.c b/main.c index bd9eeeeaf90..3c4dbf56af3 100644 --- a/main.c +++ b/main.c @@ -22,7 +22,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ -const char *version = "version 20110807"; +const char *version = "version 20110810"; #define DEBUG #include From b0f5e94e3f34717e78a265dc61c6c45406a258d0 Mon Sep 17 00:00:00 2001 From: Ruslan Ermilov Date: Thu, 11 Aug 2011 10:24:09 +0000 Subject: [PATCH 210/452] Corrected description of the bugfix; distfile was updated. --- FIXES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FIXES b/FIXES index 4b28708f99f..a708027461c 100644 --- a/FIXES +++ b/FIXES @@ -26,7 +26,7 @@ This file lists all bug fixes, changes, etc., made since the AWK book was sent to the printers in August, 1987. Aug 10, 2011: - another fix to avoid core dump with -v; again, many thanks + another fix to avoid core dump with delete(ARGV); again, many thanks to ruslan ermilov. Aug 7, 2011: From 2ffd5fdcc433626b1adb061119cd412f9b3020e9 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Thu, 11 Aug 2011 11:30:21 +0000 Subject: [PATCH 211/452] Use synchronous device destruction instead of asynchronous, so that a new device having the same name like a previous one is not created before the old one is gone. This fixes some panics due to asserts in the devfs code which were added recently. Approved by: re (kib) MFC after: 1 week --- sys/dev/usb/usb_dev.c | 35 ++++-------------- sys/dev/usb/usb_device.c | 79 ++++++++++++++++++++++++---------------- sys/dev/usb/usb_device.h | 8 +++- sys/dev/usb/usbdi.h | 3 +- 4 files changed, 63 insertions(+), 62 deletions(-) diff --git a/sys/dev/usb/usb_dev.c b/sys/dev/usb/usb_dev.c index dbba08eba49..7a83ee330b9 100644 --- a/sys/dev/usb/usb_dev.c +++ b/sys/dev/usb/usb_dev.c @@ -1648,7 +1648,6 @@ usb_fifo_attach(struct usb_device *udev, void *priv_sc, struct usb_fifo *f_rx; char devname[32]; uint8_t n; - struct usb_fs_privdata* pd; f_sc->fp[USB_FIFO_TX] = NULL; f_sc->fp[USB_FIFO_RX] = NULL; @@ -1746,22 +1745,10 @@ usb_fifo_attach(struct usb_device *udev, void *priv_sc, usb_alloc_symlink(devname); } - /* - * Initialize device private data - this is used to find the - * actual USB device itself. - */ - pd = malloc(sizeof(struct usb_fs_privdata), M_USBDEV, M_WAITOK | M_ZERO); - pd->bus_index = device_get_unit(udev->bus->bdev); - pd->dev_index = udev->device_index; - pd->ep_addr = -1; /* not an endpoint */ - pd->fifo_index = f_tx->fifo_index & f_rx->fifo_index; - pd->mode = FREAD|FWRITE; - - /* Now, create the device itself */ - f_sc->dev = make_dev(&usb_devsw, 0, uid, gid, mode, - "%s", devname); - /* XXX setting si_drv1 and creating the device is not atomic! */ - f_sc->dev->si_drv1 = pd; + /* Create the device */ + f_sc->dev = usb_make_dev(udev, devname, -1, + f_tx->fifo_index & f_rx->fifo_index, + FREAD|FWRITE, uid, gid, mode); } DPRINTFN(2, "attached %p/%p\n", f_tx, f_rx); @@ -1814,12 +1801,6 @@ usb_fifo_free_buffer(struct usb_fifo *f) bzero(&f->used_q, sizeof(f->used_q)); } -static void -usb_fifo_cleanup(void* ptr) -{ - free(ptr, M_USBDEV); -} - void usb_fifo_detach(struct usb_fifo_sc *f_sc) { @@ -1832,11 +1813,9 @@ usb_fifo_detach(struct usb_fifo_sc *f_sc) f_sc->fp[USB_FIFO_TX] = NULL; f_sc->fp[USB_FIFO_RX] = NULL; - if (f_sc->dev != NULL) { - destroy_dev_sched_cb(f_sc->dev, - usb_fifo_cleanup, f_sc->dev->si_drv1); - f_sc->dev = NULL; - } + usb_destroy_dev(f_sc->dev); + + f_sc->dev = NULL; DPRINTFN(2, "detached %p\n", f_sc); } diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c index 932c0222272..34f62656a04 100644 --- a/sys/dev/usb/usb_device.c +++ b/sys/dev/usb/usb_device.c @@ -102,10 +102,8 @@ static void usb_notify_addq(const char *type, struct usb_device *); #endif #if USB_HAVE_UGEN static void usb_fifo_free_wrap(struct usb_device *, uint8_t, uint8_t); -static struct cdev *usb_make_dev(struct usb_device *, int, int); static void usb_cdev_create(struct usb_device *); static void usb_cdev_free(struct usb_device *); -static void usb_cdev_cleanup(void *); #endif /* This variable is global to allow easy access to it: */ @@ -1626,10 +1624,12 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus, LIST_INIT(&udev->pd_list); /* Create the control endpoint device */ - udev->ctrl_dev = usb_make_dev(udev, 0, FREAD|FWRITE); + udev->ctrl_dev = usb_make_dev(udev, NULL, 0, 0, + FREAD|FWRITE, UID_ROOT, GID_OPERATOR, 0600); /* Create a link from /dev/ugenX.X to the default endpoint */ - make_dev_alias(udev->ctrl_dev, "%s", udev->ugen_name); + if (udev->ctrl_dev != NULL) + make_dev_alias(udev->ctrl_dev->cdev, "%s", udev->ugen_name); #endif /* Initialise device */ if (bus->methods->device_init != NULL) { @@ -1884,11 +1884,12 @@ done: } #if USB_HAVE_UGEN -static struct cdev * -usb_make_dev(struct usb_device *udev, int ep, int mode) +struct usb_fs_privdata * +usb_make_dev(struct usb_device *udev, const char *devname, int ep, + int fi, int rwmode, uid_t uid, gid_t gid, int mode) { struct usb_fs_privdata* pd; - char devname[20]; + char buffer[32]; /* Store information to locate ourselves again later */ pd = malloc(sizeof(struct usb_fs_privdata), M_USBDEV, @@ -1896,16 +1897,39 @@ usb_make_dev(struct usb_device *udev, int ep, int mode) pd->bus_index = device_get_unit(udev->bus->bdev); pd->dev_index = udev->device_index; pd->ep_addr = ep; - pd->mode = mode; + pd->fifo_index = fi; + pd->mode = rwmode; /* Now, create the device itself */ - snprintf(devname, sizeof(devname), "%u.%u.%u", - pd->bus_index, pd->dev_index, pd->ep_addr); - pd->cdev = make_dev(&usb_devsw, 0, UID_ROOT, - GID_OPERATOR, 0600, USB_DEVICE_DIR "/%s", devname); + if (devname == NULL) { + devname = buffer; + snprintf(buffer, sizeof(buffer), USB_DEVICE_DIR "/%u.%u.%u", + pd->bus_index, pd->dev_index, pd->ep_addr); + } + + pd->cdev = make_dev(&usb_devsw, 0, uid, gid, mode, "%s", devname); + + if (pd->cdev == NULL) { + DPRINTFN(0, "Failed to create device %s\n", devname); + free(pd, M_USBDEV); + return (NULL); + } + + /* XXX setting si_drv1 and creating the device is not atomic! */ pd->cdev->si_drv1 = pd; - return (pd->cdev); + return (pd); +} + +void +usb_destroy_dev(struct usb_fs_privdata *pd) +{ + if (pd == NULL) + return; + + destroy_dev(pd->cdev); + + free(pd, M_USBDEV); } static void @@ -1915,7 +1939,6 @@ usb_cdev_create(struct usb_device *udev) struct usb_endpoint_descriptor *ed; struct usb_descriptor *desc; struct usb_fs_privdata* pd; - struct cdev *dev; int inmode, outmode, inmask, outmask, mode; uint8_t ep; @@ -1957,14 +1980,16 @@ usb_cdev_create(struct usb_device *udev) /* Create all available endpoints except EP0 */ for (ep = 1; ep < 16; ep++) { - mode = inmask & (1 << ep) ? inmode : 0; - mode |= outmask & (1 << ep) ? outmode : 0; + mode = (inmask & (1 << ep)) ? inmode : 0; + mode |= (outmask & (1 << ep)) ? outmode : 0; if (mode == 0) continue; /* no IN or OUT endpoint */ - dev = usb_make_dev(udev, ep, mode); - pd = dev->si_drv1; - LIST_INSERT_HEAD(&udev->pd_list, pd, pd_next); + pd = usb_make_dev(udev, NULL, ep, 0, + mode, UID_ROOT, GID_OPERATOR, 0600); + + if (pd != NULL) + LIST_INSERT_HEAD(&udev->pd_list, pd, pd_next); } } @@ -1972,25 +1997,16 @@ static void usb_cdev_free(struct usb_device *udev) { struct usb_fs_privdata* pd; - struct cdev* pcdev; DPRINTFN(2, "Freeing device nodes\n"); while ((pd = LIST_FIRST(&udev->pd_list)) != NULL) { KASSERT(pd->cdev->si_drv1 == pd, ("privdata corrupt")); - pcdev = pd->cdev; - pd->cdev = NULL; LIST_REMOVE(pd, pd_next); - if (pcdev != NULL) - destroy_dev_sched_cb(pcdev, usb_cdev_cleanup, pd); - } -} -static void -usb_cdev_cleanup(void* arg) -{ - free(arg, M_USBDEV); + usb_destroy_dev(pd); + } } #endif @@ -2046,8 +2062,7 @@ usb_free_device(struct usb_device *udev, uint8_t flag) } mtx_unlock(&usb_ref_lock); - destroy_dev_sched_cb(udev->ctrl_dev, usb_cdev_cleanup, - udev->ctrl_dev->si_drv1); + usb_destroy_dev(udev->ctrl_dev); #endif if (udev->flags.usb_mode == USB_MODE_DEVICE) { diff --git a/sys/dev/usb/usb_device.h b/sys/dev/usb/usb_device.h index bf412214dd4..fe8bf8b8342 100644 --- a/sys/dev/usb/usb_device.h +++ b/sys/dev/usb/usb_device.h @@ -29,6 +29,7 @@ struct usb_symlink; /* UGEN */ struct usb_device; /* linux compat */ +struct usb_fs_privdata; #define USB_CTRL_XFER_MAX 2 @@ -135,7 +136,7 @@ struct usb_device { #if USB_HAVE_UGEN struct usb_fifo *fifo[USB_FIFO_MAX]; struct usb_symlink *ugen_symlink; /* our generic symlink */ - struct cdev *ctrl_dev; /* Control Endpoint 0 device node */ + struct usb_fs_privdata *ctrl_dev; /* Control Endpoint 0 device node */ LIST_HEAD(,usb_fs_privdata) pd_list; char ugen_name[20]; /* name of ugenX.X device */ #endif @@ -202,6 +203,11 @@ struct usb_device *usb_alloc_device(device_t parent_dev, struct usb_bus *bus, struct usb_device *parent_hub, uint8_t depth, uint8_t port_index, uint8_t port_no, enum usb_dev_speed speed, enum usb_hc_mode mode); +#if USB_HAVE_UGEN +struct usb_fs_privdata *usb_make_dev(struct usb_device *, const char *, + int, int, int, uid_t, gid_t, int); +void usb_destroy_dev(struct usb_fs_privdata *); +#endif usb_error_t usb_probe_and_attach(struct usb_device *udev, uint8_t iface_index); void usb_detach_device(struct usb_device *, uint8_t, uint8_t); diff --git a/sys/dev/usb/usbdi.h b/sys/dev/usb/usbdi.h index d832c327db1..8cdbc2d0dcf 100644 --- a/sys/dev/usb/usbdi.h +++ b/sys/dev/usb/usbdi.h @@ -37,6 +37,7 @@ struct usb_page_search; struct usb_process; struct usb_proc_msg; struct usb_mbuf; +struct usb_fs_privdata; struct mbuf; typedef enum { /* keep in sync with usb_errstr_table */ @@ -449,7 +450,7 @@ struct usb_fifo_methods { struct usb_fifo_sc { struct usb_fifo *fp[2]; - struct cdev* dev; + struct usb_fs_privdata *dev; }; const char *usbd_errstr(usb_error_t error); From a9d2f8d84f69e98100b5746816b35666bcf992ac Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Thu, 11 Aug 2011 12:30:23 +0000 Subject: [PATCH 212/452] Second-to-last commit implementing Capsicum capabilities in the FreeBSD kernel for FreeBSD 9.0: Add a new capability mask argument to fget(9) and friends, allowing system call code to declare what capabilities are required when an integer file descriptor is converted into an in-kernel struct file *. With options CAPABILITIES compiled into the kernel, this enforces capability protection; without, this change is effectively a no-op. Some cases require special handling, such as mmap(2), which must preserve information about the maximum rights at the time of mapping in the memory map so that they can later be enforced in mprotect(2) -- this is done by narrowing the rights in the existing max_protection field used for similar purposes with file permissions. In namei(9), we assert that the code is not reached from within capability mode, as we're not yet ready to enforce namespace capabilities there. This will follow in a later commit. Update two capability names: CAP_EVENT and CAP_KEVENT become CAP_POST_KEVENT and CAP_POLL_KEVENT to more accurately indicate what they represent. Approved by: re (bz) Submitted by: jonathan Sponsored by: Google Inc --- sys/amd64/linux32/linux32_machdep.c | 3 +- sys/cddl/compat/opensolaris/sys/file.h | 11 +- sys/compat/freebsd32/freebsd32_ioctl.c | 3 +- sys/compat/linux/linux_file.c | 9 +- sys/compat/linux/linux_ioctl.c | 41 +++---- sys/compat/linux/linux_socket.c | 3 +- sys/compat/linux/linux_stats.c | 5 +- sys/compat/svr4/svr4_fcntl.c | 17 ++- sys/compat/svr4/svr4_filio.c | 3 +- sys/compat/svr4/svr4_ioctl.c | 3 +- sys/compat/svr4/svr4_misc.c | 10 +- sys/compat/svr4/svr4_stream.c | 5 +- sys/dev/aac/aac_linux.c | 3 +- sys/dev/amr/amr_linux.c | 3 +- sys/dev/hwpmc/hwpmc_logging.c | 3 +- sys/dev/ipmi/ipmi_linux.c | 3 +- sys/dev/iscsi/initiator/iscsi.c | 5 +- sys/dev/mfi/mfi_linux.c | 3 +- sys/dev/snp/snp.c | 3 + sys/dev/tdfx/tdfx_linux.c | 3 +- sys/fs/coda/coda_psdev.c | 3 +- sys/fs/fdescfs/fdesc_vnops.c | 8 +- sys/fs/nfsclient/nfs_clport.c | 10 +- sys/fs/nfsserver/nfs_nfsdport.c | 10 +- sys/fs/portalfs/portal_vfsops.c | 8 +- sys/fs/portalfs/portal_vnops.c | 14 ++- sys/gnu/fs/xfs/xfs_dfrag.c | 6 +- sys/i386/ibcs2/ibcs2_fcntl.c | 3 +- sys/i386/ibcs2/ibcs2_ioctl.c | 3 +- sys/i386/ibcs2/ibcs2_misc.c | 7 +- sys/i386/linux/linux_machdep.c | 6 +- sys/kern/kern_descrip.c | 105 +++++++++++------ sys/kern/kern_event.c | 7 +- sys/kern/kern_exec.c | 6 +- sys/kern/sys_capability.c | 2 +- sys/kern/sys_generic.c | 57 ++++++++-- sys/kern/tty.c | 12 ++ sys/kern/uipc_mqueue.c | 28 +++-- sys/kern/uipc_sem.c | 20 ++-- sys/kern/uipc_syscalls.c | 96 ++++++++++------ sys/kern/vfs_acl.c | 11 +- sys/kern/vfs_aio.c | 29 +++-- sys/kern/vfs_extattr.c | 10 +- sys/kern/vfs_lookup.c | 9 +- sys/kern/vfs_syscalls.c | 106 ++++++++++++------ sys/netgraph/ng_socket.c | 2 +- sys/nfsserver/nfs_srvkrpc.c | 3 +- sys/security/audit/audit_arg.c | 2 +- sys/security/mac/mac_syscalls.c | 5 +- sys/sys/capability.h | 6 +- sys/sys/file.h | 23 ++-- sys/sys/filedesc.h | 3 +- sys/ufs/ffs/ffs_alloc.c | 8 +- sys/vm/vm_mmap.c | 26 ++++- tools/regression/security/cap_test/cap_test.c | 3 +- .../security/cap_test/cap_test_capabilities.c | 4 +- 56 files changed, 563 insertions(+), 237 deletions(-) diff --git a/sys/amd64/linux32/linux32_machdep.c b/sys/amd64/linux32/linux32_machdep.c index 26041a30993..a8ebe7ef162 100644 --- a/sys/amd64/linux32/linux32_machdep.c +++ b/sys/amd64/linux32/linux32_machdep.c @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -566,7 +567,7 @@ linux_mmap_common(struct thread *td, l_uintptr_t addr, l_size_t len, l_int prot, * protection options specified. */ - if ((error = fget(td, bsd_args.fd, &fp)) != 0) + if ((error = fget(td, bsd_args.fd, CAP_MMAP, &fp)) != 0) return (error); if (fp->f_type != DTYPE_VNODE) { fdrop(fp, td); diff --git a/sys/cddl/compat/opensolaris/sys/file.h b/sys/cddl/compat/opensolaris/sys/file.h index 811b78cf87a..7a3df369603 100644 --- a/sys/cddl/compat/opensolaris/sys/file.h +++ b/sys/cddl/compat/opensolaris/sys/file.h @@ -36,12 +36,18 @@ #ifdef _KERNEL typedef struct file file_t; +#include + static __inline file_t * getf(int fd) { struct file *fp; - if (fget(curthread, fd, &fp) == 0) + /* + * We wouldn't need all of these rights on every invocation + * if we had more information about intent. + */ + if (fget(curthread, fd, CAP_READ | CAP_WRITE | CAP_SEEK, &fp) == 0) return (fp); return (NULL); } @@ -51,7 +57,8 @@ releasef(int fd) { struct file *fp; - if (fget(curthread, fd, &fp) == 0) { + /* No CAP_ rights required, as we're only releasing. */ + if (fget(curthread, fd, 0, &fp) == 0) { fdrop(fp, curthread); fdrop(fp, curthread); } diff --git a/sys/compat/freebsd32/freebsd32_ioctl.c b/sys/compat/freebsd32/freebsd32_ioctl.c index e662a5d25ed..1d773caab3b 100644 --- a/sys/compat/freebsd32/freebsd32_ioctl.c +++ b/sys/compat/freebsd32/freebsd32_ioctl.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" #include +#include #include #include #include @@ -354,7 +355,7 @@ freebsd32_ioctl(struct thread *td, struct freebsd32_ioctl_args *uap) struct file *fp; int error; - if ((error = fget(td, uap->fd, &fp)) != 0) + if ((error = fget(td, uap->fd, CAP_IOCTL, &fp)) != 0) return (error); if ((fp->f_flag & (FREAD | FWRITE)) == 0) { fdrop(fp, td); diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c index 44ad193c8b7..e9230328780 100644 --- a/sys/compat/linux/linux_file.c +++ b/sys/compat/linux/linux_file.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -141,7 +142,7 @@ linux_common_open(struct thread *td, int dirfd, char *path, int l_flags, int mod * having the same filedesc could use that fd without * checking below. */ - error = fget(td, fd, &fp); + error = fget(td, fd, CAP_IOCTL, &fp); if (!error) { sx_slock(&proctree_lock); PROC_LOCK(p); @@ -345,7 +346,7 @@ getdents_common(struct thread *td, struct linux_getdents64_args *args, } else justone = 0; - if ((error = getvnode(td->td_proc->p_fd, args->fd, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, args->fd, CAP_READ, &fp)) != 0) return (error); if ((fp->f_flag & FREAD) == 0) { @@ -1041,7 +1042,7 @@ linux_pread(td, uap) if (error == 0) { /* This seems to violate POSIX but linux does it */ - if ((error = fgetvp(td, uap->fd, &vp)) != 0) + if ((error = fgetvp(td, uap->fd, CAP_READ, &vp)) != 0) return (error); if (vp->v_type == VDIR) { vrele(vp); @@ -1390,7 +1391,7 @@ fcntl_common(struct thread *td, struct linux_fcntl64_args *args) * significant effect for pipes (SIGIO is not delivered for * pipes under Linux-2.2.35 at least). */ - error = fget(td, args->fd, &fp); + error = fget(td, args->fd, CAP_FCNTL, &fp); if (error) return (error); if (fp->f_type == DTYPE_PIPE) { diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c index 5532c931fb3..d021fbada65 100644 --- a/sys/compat/linux/linux_ioctl.c +++ b/sys/compat/linux/linux_ioctl.c @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -193,7 +194,7 @@ linux_ioctl_hdio(struct thread *td, struct linux_ioctl_args *args) u_int sectorsize, fwcylinders, fwheads, fwsectors; off_t mediasize, bytespercyl; - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); switch (args->cmd & 0xffff) { case LINUX_HDIO_GET_GEO: @@ -274,7 +275,7 @@ linux_ioctl_disk(struct thread *td, struct linux_ioctl_args *args) u_int sectorsize; off_t mediasize; - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); switch (args->cmd & 0xffff) { case LINUX_BLKGETSIZE: @@ -700,7 +701,7 @@ linux_ioctl_termio(struct thread *td, struct linux_ioctl_args *args) struct file *fp; int error; - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); switch (args->cmd & 0xffff) { @@ -1440,7 +1441,7 @@ linux_ioctl_cdrom(struct thread *td, struct linux_ioctl_args *args) struct file *fp; int error; - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); switch (args->cmd & 0xffff) { @@ -1965,7 +1966,7 @@ linux_ioctl_console(struct thread *td, struct linux_ioctl_args *args) struct file *fp; int error; - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); switch (args->cmd & 0xffff) { @@ -2356,7 +2357,7 @@ linux_ioctl_socket(struct thread *td, struct linux_ioctl_args *args) ifp = NULL; error = 0; - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); type = fp->f_type; fdrop(fp, td); @@ -2582,7 +2583,7 @@ linux_ioctl_private(struct thread *td, struct linux_ioctl_args *args) struct file *fp; int error, type; - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); type = fp->f_type; fdrop(fp, td); @@ -2608,7 +2609,7 @@ linux_ioctl_sg(struct thread *td, struct linux_ioctl_args *args) u_long cmd; int error; - if ((error = fget(td, args->fd, &fp)) != 0) { + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) { printf("sg_linux_ioctl: fget returned %d\n", error); return (error); } @@ -2843,7 +2844,7 @@ linux_ioctl_v4l(struct thread *td, struct linux_ioctl_args *args) case LINUX_VIDIOCSCHAN: args->cmd = VIDIOCSCHAN; break; case LINUX_VIDIOCGTUNER: - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = copyin((void *) args->arg, &l_vtun, sizeof(l_vtun)); if (error) { @@ -2861,7 +2862,7 @@ linux_ioctl_v4l(struct thread *td, struct linux_ioctl_args *args) return (error); case LINUX_VIDIOCSTUNER: - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = copyin((void *) args->arg, &l_vtun, sizeof(l_vtun)); if (error) { @@ -2878,7 +2879,7 @@ linux_ioctl_v4l(struct thread *td, struct linux_ioctl_args *args) case LINUX_VIDIOCCAPTURE: args->cmd = VIDIOCCAPTURE; break; case LINUX_VIDIOCGWIN: - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = fo_ioctl(fp, VIDIOCGWIN, &vwin, td->td_ucred, td); if (!error) { @@ -2890,7 +2891,7 @@ linux_ioctl_v4l(struct thread *td, struct linux_ioctl_args *args) return (error); case LINUX_VIDIOCSWIN: - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = copyin((void *) args->arg, &l_vwin, sizeof(l_vwin)); if (error) { @@ -2913,7 +2914,7 @@ linux_ioctl_v4l(struct thread *td, struct linux_ioctl_args *args) return (error); case LINUX_VIDIOCGFBUF: - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = fo_ioctl(fp, VIDIOCGFBUF, &vbuf, td->td_ucred, td); if (!error) { @@ -2925,7 +2926,7 @@ linux_ioctl_v4l(struct thread *td, struct linux_ioctl_args *args) return (error); case LINUX_VIDIOCSFBUF: - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = copyin((void *) args->arg, &l_vbuf, sizeof(l_vbuf)); if (error) { @@ -2953,7 +2954,7 @@ linux_ioctl_v4l(struct thread *td, struct linux_ioctl_args *args) case LINUX_VIDIOCGPLAYINFO: args->cmd = VIDIOCGPLAYINFO; break; case LINUX_VIDIOCSMICROCODE: - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = copyin((void *) args->arg, &l_vcode, sizeof(l_vcode)); if (error) { @@ -3197,7 +3198,7 @@ linux_ioctl_v4l2(struct thread *td, struct linux_ioctl_args *args) error = copyin((void *)args->arg, &l_vformat, sizeof(l_vformat)); if (error) return (error); - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); if (linux_to_bsd_v4l2_format(&l_vformat, &vformat) != 0) error = EINVAL; @@ -3220,7 +3221,7 @@ linux_ioctl_v4l2(struct thread *td, struct linux_ioctl_args *args) if (error) return (error); linux_to_bsd_v4l2_standard(&l_vstd, &vstd); - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = fo_ioctl(fp, VIDIOC_ENUMSTD, (caddr_t)&vstd, td->td_ucred, td); @@ -3242,7 +3243,7 @@ linux_ioctl_v4l2(struct thread *td, struct linux_ioctl_args *args) sizeof(struct l_v4l2_input)); if (error != 0) return (error); - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = fo_ioctl(fp, VIDIOC_ENUMINPUT, (caddr_t)&vinp, td->td_ucred, td); @@ -3261,7 +3262,7 @@ linux_ioctl_v4l2(struct thread *td, struct linux_ioctl_args *args) error = copyin((void *)args->arg, &l_vbuf, sizeof(l_vbuf)); if (error) return (error); - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); linux_to_bsd_v4l2_buffer(&l_vbuf, &vbuf); if ((args->cmd & 0xffff) == LINUX_VIDIOC_QUERYBUF) @@ -3431,7 +3432,7 @@ linux_ioctl(struct thread *td, struct linux_ioctl_args *args) (unsigned long)args->cmd); #endif - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); if ((fp->f_flag & (FREAD|FWRITE)) == 0) { fdrop(fp, td); diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index 6940e45be0b..08728a13db1 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -743,7 +744,7 @@ linux_connect(struct thread *td, struct linux_connect_args *args) * socket and use the file descriptor reference instead of * creating a new one. */ - error = fgetsock(td, args->s, &so, &fflag); + error = fgetsock(td, args->s, CAP_CONNECT, &so, &fflag); if (error == 0) { error = EISCONN; if (fflag & FNONBLOCK) { diff --git a/sys/compat/linux/linux_stats.c b/sys/compat/linux/linux_stats.c index 8fa08b690f9..90f860d4477 100644 --- a/sys/compat/linux/linux_stats.c +++ b/sys/compat/linux/linux_stats.c @@ -141,8 +141,11 @@ translate_fd_major_minor(struct thread *td, int fd, struct stat *buf) struct vnode *vp; int major, minor; + /* + * No capability rights required here. + */ if ((!S_ISCHR(buf->st_mode) && !S_ISBLK(buf->st_mode)) || - fget(td, fd, &fp) != 0) + fget(td, fd, 0, &fp) != 0) return; vp = fp->f_vnode; if (vp != NULL && vp->v_rdev != NULL && diff --git a/sys/compat/svr4/svr4_fcntl.c b/sys/compat/svr4/svr4_fcntl.c index 88e4fc2bc12..ce1452a3043 100644 --- a/sys/compat/svr4/svr4_fcntl.c +++ b/sys/compat/svr4/svr4_fcntl.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -261,7 +262,17 @@ fd_revoke(td, fd) int error, *retval; retval = td->td_retval; - if ((error = fgetvp(td, fd, &vp)) != 0) + /* + * If we ever want to support Capsicum on SVR4 processes (unlikely) + * or FreeBSD grows a native frevoke() (more likely), we will need a + * CAP_REVOKE here. + * + * In the meantime, use CAP_MASK_VALID: if a SVR4 process wants to + * do an frevoke(), it needs to do it on either a regular file + * descriptor or a fully-privileged capability (which is effectively + * the same as a non-capability-restricted file descriptor). + */ + if ((error = fgetvp(td, fd, CAP_MASK_VALID, &vp)) != 0) return (error); if (vp->v_type != VCHR && vp->v_type != VBLK) { @@ -313,7 +324,7 @@ fd_truncate(td, fd, flp) /* * We only support truncating the file. */ - if ((error = fget(td, fd, &fp)) != 0) + if ((error = fget(td, fd, CAP_FTRUNCATE, &fp)) != 0) return (error); vp = fp->f_vnode; @@ -392,7 +403,7 @@ svr4_sys_open(td, uap) #if defined(NOTYET) struct file *fp; - error = fget(td, retval, &fp); + error = fget(td, retval, CAP_IOCTL, &fp); PROC_UNLOCK(p); /* * we may have lost a race the above open() and diff --git a/sys/compat/svr4/svr4_filio.c b/sys/compat/svr4/svr4_filio.c index ca85653823a..cb7cadae9c4 100644 --- a/sys/compat/svr4/svr4_filio.c +++ b/sys/compat/svr4/svr4_filio.c @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -113,7 +114,7 @@ svr4_sys_read(td, uap) ra.buf = uap->buf; ra.nbyte = uap->nbyte; - if (fget(td, uap->fd, &fp) != 0) { + if (fget(td, uap->fd, CAP_READ, &fp) != 0) { DPRINTF(("Something fishy with the user-supplied file descriptor...\n")); return EBADF; } diff --git a/sys/compat/svr4/svr4_ioctl.c b/sys/compat/svr4/svr4_ioctl.c index 1cea41af856..36b05803821 100644 --- a/sys/compat/svr4/svr4_ioctl.c +++ b/sys/compat/svr4/svr4_ioctl.c @@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -102,7 +103,7 @@ svr4_sys_ioctl(td, uap) retval = td->td_retval; cmd = uap->com; - if ((error = fget(td, uap->fd, &fp)) != 0) + if ((error = fget(td, uap->fd, CAP_IOCTL, &fp)) != 0) return (error); if ((fp->f_flag & (FREAD | FWRITE)) == 0) { diff --git a/sys/compat/svr4/svr4_misc.c b/sys/compat/svr4/svr4_misc.c index 6f80fe64e66..c0a74780ee4 100644 --- a/sys/compat/svr4/svr4_misc.c +++ b/sys/compat/svr4/svr4_misc.c @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -246,7 +247,8 @@ svr4_sys_getdents64(td, uap) DPRINTF(("svr4_sys_getdents64(%d, *, %d)\n", uap->fd, uap->nbytes)); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) { + if ((error = getvnode(td->td_proc->p_fd, uap->fd, + CAP_READ | CAP_SEEK, &fp)) != 0) { return (error); } @@ -427,7 +429,8 @@ svr4_sys_getdents(td, uap) if (uap->nbytes < 0) return (EINVAL); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, uap->fd, + CAP_READ | CAP_SEEK, &fp)) != 0) return (error); if ((fp->f_flag & FREAD) == 0) { @@ -615,7 +618,8 @@ svr4_sys_fchroot(td, uap) if ((error = priv_check(td, PRIV_VFS_FCHROOT)) != 0) return error; - if ((error = getvnode(fdp, uap->fd, &fp)) != 0) + /* XXX: we have the chroot priv... what cap might we need? all? */ + if ((error = getvnode(fdp, uap->fd, 0, &fp)) != 0) return error; vp = fp->f_vnode; VREF(vp); diff --git a/sys/compat/svr4/svr4_stream.c b/sys/compat/svr4/svr4_stream.c index ec95eece0e5..a1a42c03011 100644 --- a/sys/compat/svr4/svr4_stream.c +++ b/sys/compat/svr4/svr4_stream.c @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -1448,7 +1449,7 @@ svr4_sys_putmsg(td, uap) struct file *fp; int error; - if ((error = fget(td, uap->fd, &fp)) != 0) { + if ((error = fget(td, uap->fd, CAP_WRITE, &fp)) != 0) { #ifdef DEBUG_SVR4 uprintf("putmsg: bad fp\n"); #endif @@ -1620,7 +1621,7 @@ svr4_sys_getmsg(td, uap) struct file *fp; int error; - if ((error = fget(td, uap->fd, &fp)) != 0) { + if ((error = fget(td, uap->fd, CAP_READ, &fp)) != 0) { #ifdef DEBUG_SVR4 uprintf("getmsg: bad fp\n"); #endif diff --git a/sys/dev/aac/aac_linux.c b/sys/dev/aac/aac_linux.c index f8852358ade..049e2be78e5 100644 --- a/sys/dev/aac/aac_linux.c +++ b/sys/dev/aac/aac_linux.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -78,7 +79,7 @@ aac_linux_ioctl(struct thread *td, struct linux_ioctl_args *args) u_long cmd; int error; - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); cmd = args->cmd; diff --git a/sys/dev/amr/amr_linux.c b/sys/dev/amr/amr_linux.c index cb8c4573ef6..44e858ba804 100644 --- a/sys/dev/amr/amr_linux.c +++ b/sys/dev/amr/amr_linux.c @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -74,7 +75,7 @@ amr_linux_ioctl(struct thread *p, struct linux_ioctl_args *args) struct file *fp; int error; - if ((error = fget(p, args->fd, &fp)) != 0) + if ((error = fget(p, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = fo_ioctl(fp, args->cmd, (caddr_t)args->arg, p->td_ucred, p); fdrop(fp, p); diff --git a/sys/dev/hwpmc/hwpmc_logging.c b/sys/dev/hwpmc/hwpmc_logging.c index 633c6f953b6..b85572a3c86 100644 --- a/sys/dev/hwpmc/hwpmc_logging.c +++ b/sys/dev/hwpmc/hwpmc_logging.c @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -589,7 +590,7 @@ pmclog_configure_log(struct pmc_mdep *md, struct pmc_owner *po, int logfd) po->po_file)); /* get a reference to the file state */ - error = fget_write(curthread, logfd, &po->po_file); + error = fget_write(curthread, logfd, CAP_WRITE, &po->po_file); if (error) goto error; diff --git a/sys/dev/ipmi/ipmi_linux.c b/sys/dev/ipmi/ipmi_linux.c index fcf2bd50322..430bd085894 100644 --- a/sys/dev/ipmi/ipmi_linux.c +++ b/sys/dev/ipmi/ipmi_linux.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -92,7 +93,7 @@ ipmi_linux_ioctl(struct thread *td, struct linux_ioctl_args *args) u_long cmd; int error; - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); cmd = args->cmd; diff --git a/sys/dev/iscsi/initiator/iscsi.c b/sys/dev/iscsi/initiator/iscsi.c index d35f6310747..292ce8f21fa 100644 --- a/sys/dev/iscsi/initiator/iscsi.c +++ b/sys/dev/iscsi/initiator/iscsi.c @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); #include "opt_iscsi_initiator.h" #include +#include #include #include #include @@ -387,11 +388,11 @@ i_setsoc(isc_session_t *sp, int fd, struct thread *td) if(sp->soc != NULL) isc_stop_receiver(sp); - error = fget(td, fd, &sp->fp); + error = fget(td, fd, CAP_SOCK_ALL, &sp->fp); if(error) return error; - if((error = fgetsock(td, fd, &sp->soc, 0)) == 0) { + if((error = fgetsock(td, fd, CAP_SOCK_ALL, &sp->soc, 0)) == 0) { sp->td = td; isc_start_receiver(sp); } diff --git a/sys/dev/mfi/mfi_linux.c b/sys/dev/mfi/mfi_linux.c index 44edf49109d..12135ff2470 100644 --- a/sys/dev/mfi/mfi_linux.c +++ b/sys/dev/mfi/mfi_linux.c @@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -95,7 +96,7 @@ mfi_linux_ioctl(struct thread *p, struct linux_ioctl_args *args) break; } - if ((error = fget(p, args->fd, &fp)) != 0) + if ((error = fget(p, args->fd, CAP_IOCTL, &fp)) != 0) return (error); error = fo_ioctl(fp, cmd, (caddr_t)args->arg, p->td_ucred, p); fdrop(fp, p); diff --git a/sys/dev/snp/snp.c b/sys/dev/snp/snp.c index b05ad2a81b9..1c02660bec1 100644 --- a/sys/dev/snp/snp.c +++ b/sys/dev/snp/snp.c @@ -252,6 +252,9 @@ snp_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, SNP_UNLOCK(); return (EBUSY); } + /* + * XXXRW / XXXJA: no capability check here. + */ error = ttyhook_register(&ss->snp_tty, td->td_proc, *(int *)data, &snp_hook, ss); SNP_UNLOCK(); diff --git a/sys/dev/tdfx/tdfx_linux.c b/sys/dev/tdfx/tdfx_linux.c index 2e877f6d017..0b769f01a24 100644 --- a/sys/dev/tdfx/tdfx_linux.c +++ b/sys/dev/tdfx/tdfx_linux.c @@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -53,7 +54,7 @@ linux_ioctl_tdfx(struct thread *td, struct linux_ioctl_args* args) struct file *fp; - if ((error = fget(td, args->fd, &fp)) != 0) + if ((error = fget(td, args->fd, CAP_IOCTL, &fp)) != 0) return (error); /* We simply copy the data and send it right to ioctl */ copyin((caddr_t)args->arg, &d_pio, sizeof(d_pio)); diff --git a/sys/fs/coda/coda_psdev.c b/sys/fs/coda/coda_psdev.c index 494f30bff51..e982a2c467e 100644 --- a/sys/fs/coda/coda_psdev.c +++ b/sys/fs/coda/coda_psdev.c @@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -371,7 +372,7 @@ vc_write(struct cdev *dev, struct uio *uiop, int flag) struct vnode *vp = NULL; if (tmp->oh.result == 0) { - error = getvnode(uiop->uio_td->td_proc->p_fd, + error = getvnode(uiop->uio_td->td_proc->p_fd, CAP_WRITE, tmp->fd, &fp); if (!error) { /* diff --git a/sys/fs/fdescfs/fdesc_vnops.c b/sys/fs/fdescfs/fdesc_vnops.c index e11b59ca671..3c4f44d17c9 100644 --- a/sys/fs/fdescfs/fdesc_vnops.c +++ b/sys/fs/fdescfs/fdesc_vnops.c @@ -40,6 +40,7 @@ #include #include +#include #include #include #include @@ -305,7 +306,10 @@ fdesc_lookup(ap) fd = fd1; } - if ((error = fget(td, fd, &fp)) != 0) + /* + * No rights to check since 'fp' isn't actually used. + */ + if ((error = fget(td, fd, 0, &fp)) != 0) goto bad; /* Check if we're looking up ourselves. */ @@ -455,7 +459,7 @@ fdesc_setattr(ap) /* * Allow setattr where there is an underlying vnode. */ - error = getvnode(td->td_proc->p_fd, fd, &fp); + error = getvnode(td->td_proc->p_fd, fd, CAP_EXTATTR_SET, &fp); if (error) { /* * getvnode() returns EINVAL if the file descriptor is not diff --git a/sys/fs/nfsclient/nfs_clport.c b/sys/fs/nfsclient/nfs_clport.c index 44d3c7421c4..acbfa6ceda8 100644 --- a/sys/fs/nfsclient/nfs_clport.c +++ b/sys/fs/nfsclient/nfs_clport.c @@ -36,6 +36,8 @@ __FBSDID("$FreeBSD$"); #include "opt_kdtrace.h" +#include + /* * generally, I don't like #includes inside .h files, but it seems to * be the easiest way to handle the port. @@ -1231,7 +1233,13 @@ nfssvc_nfscl(struct thread *td, struct nfssvc_args *uap) error = copyin(uap->argp, (caddr_t)&nfscbdarg, sizeof(nfscbdarg)); if (error) return (error); - if ((error = fget(td, nfscbdarg.sock, &fp)) != 0) { + /* + * Since we don't know what rights might be required, + * pretend that we need them all. It is better to be too + * careful than too reckless. + */ + if ((error = fget(td, nfscbdarg.sock, CAP_SOCK_ALL, &fp)) + != 0) { return (error); } if (fp->f_type != DTYPE_SOCKET) { diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index 56c563ae1f3..da32b0e544c 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -34,6 +34,8 @@ #include __FBSDID("$FreeBSD$"); +#include + /* * Functions that perform the vfs operations required by the routines in * nfsd_serv.c. It is hoped that this change will make the server more @@ -3027,8 +3029,14 @@ nfssvc_nfsd(struct thread *td, struct nfssvc_args *uap) error = copyin(uap->argp, (caddr_t)&sockarg, sizeof (sockarg)); if (error) goto out; - if ((error = fget(td, sockarg.sock, &fp)) != 0) + /* + * Since we don't know what rights might be required, + * pretend that we need them all. It is better to be too + * careful than too reckless. + */ + if ((error = fget(td, sockarg.sock, CAP_SOCK_ALL, &fp)) != 0) goto out; + return (error); if (fp->f_type != DTYPE_SOCKET) { fdrop(fp, td); error = EPERM; diff --git a/sys/fs/portalfs/portal_vfsops.c b/sys/fs/portalfs/portal_vfsops.c index a8c16c4b17f..04e7a3d2250 100644 --- a/sys/fs/portalfs/portal_vfsops.c +++ b/sys/fs/portalfs/portal_vfsops.c @@ -40,6 +40,7 @@ #include #include +#include #include #include #include @@ -112,7 +113,12 @@ portal_mount(struct mount *mp) if (error) return (error); - if ((error = fget(td, v, &fp)) != 0) + /* + * Capsicum is not incompatible with portalfs, but we don't really + * know what rights are required. In the spirit of "better safe than + * sorry", pretend that all rights are required for now. + */ + if ((error = fget(td, v, CAP_MASK_VALID, &fp)) != 0) return (error); if (fp->f_type != DTYPE_SOCKET) { fdrop(fp, td); diff --git a/sys/fs/portalfs/portal_vnops.c b/sys/fs/portalfs/portal_vnops.c index 6fcc1ce6421..7cd5267698b 100644 --- a/sys/fs/portalfs/portal_vnops.c +++ b/sys/fs/portalfs/portal_vnops.c @@ -38,7 +38,10 @@ * Portal Filesystem */ +#include "opt_capsicum.h" + #include +#include #include #include #include @@ -232,6 +235,15 @@ portal_open(ap) struct file *fp; struct portal_cred pcred; +#ifdef CAPABILITY_MODE + /* + * This may require access to a global namespace (e.g. an IP address); + * disallow it entirely, as we do open(2). + */ + if (IN_CAPABILITY_MODE(td)) + return (ECAPMODE); +#endif + /* * Nothing to do when opening the root node. */ @@ -414,7 +426,7 @@ portal_open(ap) * Check that the mode the file is being opened for is a subset * of the mode of the existing descriptor. */ - if ((error = fget(td, fd, &fp)) != 0) + if ((error = fget(td, fd, 0, &fp)) != 0) goto bad; if (((ap->a_mode & (FREAD|FWRITE)) | fp->f_flag) != fp->f_flag) { fdrop(fp, td); diff --git a/sys/gnu/fs/xfs/xfs_dfrag.c b/sys/gnu/fs/xfs/xfs_dfrag.c index 77a71dfe143..7b6b04ebcda 100644 --- a/sys/gnu/fs/xfs/xfs_dfrag.c +++ b/sys/gnu/fs/xfs/xfs_dfrag.c @@ -46,6 +46,7 @@ #include "xfs_mac.h" #include "xfs_rw.h" +#include #include /* @@ -79,7 +80,8 @@ xfs_swapext( } /* Pull information for the target fd */ - if (fgetvp(td, (int)sxp->sx_fdtarget, &bvp) != 0) { + if (fgetvp(td, (int)sxp->sx_fdtarget, CAP_READ | CAP_WRITE, &bvp) + != 0) { error = XFS_ERROR(EINVAL); goto error0; } @@ -91,7 +93,7 @@ xfs_swapext( goto error0; } - if (fgetvp(td, (int)sxp->sx_fdtmp, &btvp) != 0) { + if (fgetvp(td, (int)sxp->sx_fdtmp, CAP_READ | CAP_WRITE, &btvp) != 0) { error = XFS_ERROR(EINVAL); goto error0; } diff --git a/sys/i386/ibcs2/ibcs2_fcntl.c b/sys/i386/ibcs2/ibcs2_fcntl.c index 6875aef71fd..fddfcb59321 100644 --- a/sys/i386/ibcs2/ibcs2_fcntl.c +++ b/sys/i386/ibcs2/ibcs2_fcntl.c @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -203,7 +204,7 @@ ibcs2_open(td, uap) struct file *fp; int error; - error = fget(td, td->td_retval[0], &fp); + error = fget(td, td->td_retval[0], CAP_IOCTL, &fp); PROC_UNLOCK(p); if (error) return (EBADF); diff --git a/sys/i386/ibcs2/ibcs2_ioctl.c b/sys/i386/ibcs2/ibcs2_ioctl.c index 90184e3cb62..3a582ce2f33 100644 --- a/sys/i386/ibcs2/ibcs2_ioctl.c +++ b/sys/i386/ibcs2/ibcs2_ioctl.c @@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -333,7 +334,7 @@ ibcs2_ioctl(td, uap) struct file *fp; int error; - if ((error = fget(td, uap->fd, &fp)) != 0) { + if ((error = fget(td, uap->fd, CAP_IOCTL, &fp)) != 0) { DPRINTF(("ibcs2_ioctl(%d): bad fd %d ", p->p_pid, uap->fd)); return EBADF; diff --git a/sys/i386/ibcs2/ibcs2_misc.c b/sys/i386/ibcs2/ibcs2_misc.c index c537100ba17..a08fdf3914d 100644 --- a/sys/i386/ibcs2/ibcs2_misc.c +++ b/sys/i386/ibcs2/ibcs2_misc.c @@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$"); */ #include #include +#include #include #include #include @@ -336,7 +337,8 @@ ibcs2_getdents(td, uap) #define BSD_DIRENT(cp) ((struct dirent *)(cp)) #define IBCS2_RECLEN(reclen) (reclen + sizeof(u_short)) - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, uap->fd, + CAP_READ | CAP_SEEK, &fp)) != 0) return (error); if ((fp->f_flag & FREAD) == 0) { fdrop(fp, td); @@ -492,7 +494,8 @@ ibcs2_read(td, uap) u_long *cookies = NULL, *cookiep; int ncookies; - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) { + if ((error = getvnode(td->td_proc->p_fd, uap->fd, + CAP_READ | CAP_SEEK, &fp)) != 0) { if (error == EINVAL) return read(td, (struct read_args *)uap); else diff --git a/sys/i386/linux/linux_machdep.c b/sys/i386/linux/linux_machdep.c index d1f6ab99780..57756c4d3e8 100644 --- a/sys/i386/linux/linux_machdep.c +++ b/sys/i386/linux/linux_machdep.c @@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -467,9 +468,12 @@ linux_mmap_common(struct thread *td, l_uintptr_t addr, l_size_t len, l_int prot, * The file descriptor fildes is opened with * read permission, regardless of the * protection options specified. + * + * Checking just CAP_MMAP is fine here, since the real work + * is done in the FreeBSD mmap(). */ - if ((error = fget(td, bsd_args.fd, &fp)) != 0) + if ((error = fget(td, bsd_args.fd, CAP_MMAP, &fp)) != 0) return (error); if (fp->f_type != DTYPE_VNODE) { fdrop(fp, td); diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index f3f9cbcaf46..3082aea810d 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -431,6 +431,26 @@ fdtofp(int fd, struct filedesc *fdp) return (fp); } +static inline int +fdunwrap(int fd, cap_rights_t rights, struct filedesc *fdp, struct file **fpp) +{ + + *fpp = fdtofp(fd, fdp); + if (*fpp == NULL) + return (EBADF); + +#ifdef CAPABILITIES + if ((*fpp)->f_type == DTYPE_CAPABILITY) { + int err = cap_funwrap(*fpp, rights, fpp); + if (err != 0) { + *fpp = NULL; + return (err); + } + } +#endif /* CAPABILITIES */ + return (0); +} + int kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) { @@ -489,9 +509,9 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) case F_GETFL: FILEDESC_SLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + error = fdunwrap(fd, CAP_FCNTL, fdp, &fp); + if (error != 0) { FILEDESC_SUNLOCK(fdp); - error = EBADF; break; } td->td_retval[0] = OFLAGS(fp->f_flag); @@ -500,9 +520,9 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) case F_SETFL: FILEDESC_SLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + error = fdunwrap(fd, CAP_FCNTL, fdp, &fp); + if (error != 0) { FILEDESC_SUNLOCK(fdp); - error = EBADF; break; } fhold(fp); @@ -532,9 +552,9 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) case F_GETOWN: FILEDESC_SLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + error = fdunwrap(fd, CAP_FCNTL, fdp, &fp); + if (error != 0) { FILEDESC_SUNLOCK(fdp); - error = EBADF; break; } fhold(fp); @@ -547,9 +567,9 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) case F_SETOWN: FILEDESC_SLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + error = fdunwrap(fd, CAP_FCNTL, fdp, &fp); + if (error != 0) { FILEDESC_SUNLOCK(fdp); - error = EBADF; break; } fhold(fp); @@ -573,9 +593,9 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) case F_SETLK: do_setlk: FILEDESC_SLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + error = fdunwrap(fd, CAP_FLOCK, fdp, &fp); + if (error != 0) { FILEDESC_SUNLOCK(fdp); - error = EBADF; break; } if (fp->f_type != DTYPE_VNODE) { @@ -668,9 +688,9 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) case F_GETLK: FILEDESC_SLOCK(fdp); - if ((fp = fdtofp(fd, fdp)) == NULL) { + error = fdunwrap(fd, CAP_FLOCK, fdp, &fp); + if (error != 0) { FILEDESC_SUNLOCK(fdp); - error = EBADF; break; } if (fp->f_type != DTYPE_VNODE) { @@ -1312,7 +1332,7 @@ kern_fstat(struct thread *td, int fd, struct stat *sbp) AUDIT_ARG_FD(fd); - if ((error = fget(td, fd, &fp)) != 0) + if ((error = fget(td, fd, CAP_FSTAT, &fp)) != 0) return (error); AUDIT_ARG_FILE(td->td_proc, fp); @@ -1368,7 +1388,7 @@ fpathconf(struct thread *td, struct fpathconf_args *uap) struct vnode *vp; int error; - if ((error = fget(td, uap->fd, &fp)) != 0) + if ((error = fget(td, uap->fd, CAP_FPATHCONF, &fp)) != 0) return (error); /* If asynchronous I/O is available, it works for all descriptors. */ @@ -2294,7 +2314,7 @@ fget_unlocked(struct filedesc *fdp, int fd) #define FGET_GETCAP 0x00000001 static __inline int _fget(struct thread *td, int fd, struct file **fpp, int flags, - cap_rights_t needrights, cap_rights_t *haverights, u_char *maxprotp, + cap_rights_t needrights, cap_rights_t *haverightsp, u_char *maxprotp, int fget_flags) { struct filedesc *fdp; @@ -2369,28 +2389,36 @@ _fget(struct thread *td, int fd, struct file **fpp, int flags, } int -fget(struct thread *td, int fd, struct file **fpp) +fget(struct thread *td, int fd, cap_rights_t rights, struct file **fpp) { - return(_fget(td, fd, fpp, 0, 0, NULL, NULL, 0)); + return(_fget(td, fd, fpp, 0, rights, NULL, NULL, 0)); } int -fget_read(struct thread *td, int fd, struct file **fpp) +fget_mmap(struct thread *td, int fd, cap_rights_t rights, u_char *maxprotp, + struct file **fpp) { - return(_fget(td, fd, fpp, FREAD, 0, NULL, NULL, 0)); + return (_fget(td, fd, fpp, 0, rights, NULL, maxprotp, 0)); } int -fget_write(struct thread *td, int fd, struct file **fpp) +fget_read(struct thread *td, int fd, cap_rights_t rights, struct file **fpp) { - return(_fget(td, fd, fpp, FWRITE, 0, NULL, NULL, 0)); + return(_fget(td, fd, fpp, FREAD, rights, NULL, NULL, 0)); +} + +int +fget_write(struct thread *td, int fd, cap_rights_t rights, struct file **fpp) +{ + + return (_fget(td, fd, fpp, FWRITE, rights, NULL, NULL, 0)); } /* - * Unlike the other fget() calls, which will accept and check capability rights + * Unlike the other fget() calls, which accept and check capability rights * but never return capabilities, fgetcap() returns the capability but doesn't * check capability rights. */ @@ -2410,13 +2438,15 @@ fgetcap(struct thread *td, int fd, struct file **fpp) * XXX: what about the unused flags ? */ static __inline int -_fgetvp(struct thread *td, int fd, struct vnode **vpp, int flags) +_fgetvp(struct thread *td, int fd, int flags, cap_rights_t needrights, + cap_rights_t *haverightsp, struct vnode **vpp) { struct file *fp; int error; *vpp = NULL; - if ((error = _fget(td, fd, &fp, flags, 0, NULL, NULL, 0)) != 0) + if ((error = _fget(td, fd, &fp, flags, needrights, haverightsp, + NULL, 0)) != 0) return (error); if (fp->f_vnode == NULL) { error = EINVAL; @@ -2430,25 +2460,33 @@ _fgetvp(struct thread *td, int fd, struct vnode **vpp, int flags) } int -fgetvp(struct thread *td, int fd, struct vnode **vpp) +fgetvp(struct thread *td, int fd, cap_rights_t rights, struct vnode **vpp) { - return (_fgetvp(td, fd, vpp, 0)); + return (_fgetvp(td, fd, 0, rights, NULL, vpp)); } int -fgetvp_read(struct thread *td, int fd, struct vnode **vpp) +fgetvp_rights(struct thread *td, int fd, cap_rights_t need, cap_rights_t *have, + struct vnode **vpp) +{ + return (_fgetvp(td, fd, 0, need, have, vpp)); +} + +int +fgetvp_read(struct thread *td, int fd, cap_rights_t rights, struct vnode **vpp) { - return (_fgetvp(td, fd, vpp, FREAD)); + return (_fgetvp(td, fd, FREAD, rights, NULL, vpp)); } #ifdef notyet int -fgetvp_write(struct thread *td, int fd, struct vnode **vpp) +fgetvp_write(struct thread *td, int fd, cap_rights_t rights, + struct vnode **vpp) { - return (_fgetvp(td, fd, vpp, FWRITE)); + return (_fgetvp(td, fd, FWRITE, rights, NULL, vpp)); } #endif @@ -2464,7 +2502,8 @@ fgetvp_write(struct thread *td, int fd, struct vnode **vpp) * during use. */ int -fgetsock(struct thread *td, int fd, struct socket **spp, u_int *fflagp) +fgetsock(struct thread *td, int fd, cap_rights_t rights, struct socket **spp, + u_int *fflagp) { struct file *fp; int error; @@ -2472,7 +2511,7 @@ fgetsock(struct thread *td, int fd, struct socket **spp, u_int *fflagp) *spp = NULL; if (fflagp != NULL) *fflagp = 0; - if ((error = _fget(td, fd, &fp, 0, 0, NULL, NULL, 0)) != 0) + if ((error = _fget(td, fd, &fp, 0, rights, NULL, NULL, 0)) != 0) return (error); if (fp->f_type != DTYPE_SOCKET) { error = ENOTSOCK; @@ -2557,7 +2596,7 @@ flock(struct thread *td, struct flock_args *uap) int vfslocked; int error; - if ((error = fget(td, uap->fd, &fp)) != 0) + if ((error = fget(td, uap->fd, CAP_FLOCK, &fp)) != 0) return (error); if (fp->f_type != DTYPE_VNODE) { fdrop(fp, td); diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index e14ae0211bc..6ec8503d569 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -816,7 +817,7 @@ kern_kevent(struct thread *td, int fd, int nchanges, int nevents, struct file *fp; int i, n, nerrors, error; - if ((error = fget(td, fd, &fp)) != 0) + if ((error = fget(td, fd, CAP_POST_KEVENT, &fp)) != 0) return (error); if ((error = kqueue_acquire(fp, &kq)) != 0) goto done_norel; @@ -972,7 +973,7 @@ kqueue_register(struct kqueue *kq, struct kevent *kev, struct thread *td, int wa findkn: if (fops->f_isfd) { KASSERT(td != NULL, ("td is NULL")); - error = fget(td, kev->ident, &fp); + error = fget(td, kev->ident, CAP_POLL_KEVENT, &fp); if (error) goto done; @@ -2181,7 +2182,7 @@ kqfd_register(int fd, struct kevent *kev, struct thread *td, int waitok) struct file *fp; int error; - if ((error = fget(td, fd, &fp)) != 0) + if ((error = fget(td, fd, CAP_POST_KEVENT, &fp)) != 0) return (error); if ((error = kqueue_acquire(fp, &kq)) != 0) goto noacquire; diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index f7f80af68c2..1c424204800 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -439,7 +439,11 @@ interpret: imgp->vp = binvp; } else { AUDIT_ARG_FD(args->fd); - error = fgetvp(td, args->fd, &binvp); + /* + * Some might argue that CAP_READ and/or CAP_MMAP should also + * be required here; such arguments will be entertained. + */ + error = fgetvp_read(td, args->fd, CAP_FEXECVE, &binvp); if (error) goto exec_fail; vfslocked = VFS_LOCK_GIANT(binvp->v_mount); diff --git a/sys/kern/sys_capability.c b/sys/kern/sys_capability.c index 6ca960269d6..b20fa62e123 100644 --- a/sys/kern/sys_capability.c +++ b/sys/kern/sys_capability.c @@ -225,7 +225,7 @@ cap_new(struct thread *td, struct cap_new_args *uap) AUDIT_ARG_FD(fd); AUDIT_ARG_RIGHTS(rights); - error = fget(td, fd, &fp); + error = fget(td, fd, rights, &fp); if (error) return (error); AUDIT_ARG_FILE(td->td_proc, fp); diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 1a2685cc1f0..f94be5a6e86 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -37,12 +37,14 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_capsicum.h" #include "opt_compat.h" #include "opt_ktrace.h" #include #include #include +#include #include #include #include @@ -232,7 +234,7 @@ kern_readv(struct thread *td, int fd, struct uio *auio) struct file *fp; int error; - error = fget_read(td, fd, &fp); + error = fget_read(td, fd, CAP_READ | CAP_SEEK, &fp); if (error) return (error); error = dofileread(td, fd, fp, auio, (off_t)-1, 0); @@ -275,7 +277,7 @@ kern_preadv(td, fd, auio, offset) struct file *fp; int error; - error = fget_read(td, fd, &fp); + error = fget_read(td, fd, CAP_READ, &fp); if (error) return (error); if (!(fp->f_ops->fo_flags & DFLAG_SEEKABLE)) @@ -441,7 +443,7 @@ kern_writev(struct thread *td, int fd, struct uio *auio) struct file *fp; int error; - error = fget_write(td, fd, &fp); + error = fget_write(td, fd, CAP_WRITE | CAP_SEEK, &fp); if (error) return (error); error = dofilewrite(td, fd, fp, auio, (off_t)-1, 0); @@ -484,7 +486,7 @@ kern_pwritev(td, fd, auio, offset) struct file *fp; int error; - error = fget_write(td, fd, &fp); + error = fget_write(td, fd, CAP_WRITE, &fp); if (error) return (error); if (!(fp->f_ops->fo_flags & DFLAG_SEEKABLE)) @@ -566,7 +568,7 @@ kern_ftruncate(td, fd, length) AUDIT_ARG_FD(fd); if (length < 0) return (EINVAL); - error = fget(td, fd, &fp); + error = fget(td, fd, CAP_FTRUNCATE, &fp); if (error) return (error); AUDIT_ARG_FILE(td->td_proc, fp); @@ -696,7 +698,7 @@ kern_ioctl(struct thread *td, int fd, u_long com, caddr_t data) AUDIT_ARG_FD(fd); AUDIT_ARG_CMD(com); - if ((error = fget(td, fd, &fp)) != 0) + if ((error = fget(td, fd, CAP_IOCTL, &fp)) != 0) return (error); if ((fp->f_flag & (FREAD | FWRITE)) == 0) { fdrop(fp, td); @@ -1054,6 +1056,37 @@ selsetbits(fd_mask **ibits, fd_mask **obits, int idx, fd_mask bit, int events) return (n); } +static __inline int +getselfd_cap(struct filedesc *fdp, int fd, struct file **fpp) +{ + struct file *fp; +#ifdef CAPABILITIES + struct file *fp_fromcap; + int error; +#endif + + if ((fp = fget_unlocked(fdp, fd)) == NULL) + return (EBADF); +#ifdef CAPABILITIES + /* + * If the file descriptor is for a capability, test rights and use + * the file descriptor references by the capability. + */ + error = cap_funwrap(fp, CAP_POLL_KEVENT, &fp_fromcap); + if (error) { + fdrop(fp, curthread); + return (error); + } + if (fp != fp_fromcap) { + fhold(fp_fromcap); + fdrop(fp, curthread); + fp = fp_fromcap; + } +#endif /* CAPABILITIES */ + *fpp = fp; + return (0); +} + /* * Traverse the list of fds attached to this thread's seltd and check for * completion. @@ -1069,6 +1102,7 @@ selrescan(struct thread *td, fd_mask **ibits, fd_mask **obits) struct file *fp; fd_mask bit; int fd, ev, n, idx; + int error; fdp = td->td_proc->p_fd; stp = td->td_sel; @@ -1080,8 +1114,9 @@ selrescan(struct thread *td, fd_mask **ibits, fd_mask **obits) /* If the selinfo wasn't cleared the event didn't fire. */ if (si != NULL) continue; - if ((fp = fget_unlocked(fdp, fd)) == NULL) - return (EBADF); + error = getselfd_cap(fdp, fd, &fp); + if (error) + return (error); idx = fd / NFDBITS; bit = (fd_mask)1 << (fd % NFDBITS); ev = fo_poll(fp, selflags(ibits, idx, bit), td->td_ucred, td); @@ -1109,6 +1144,7 @@ selscan(td, ibits, obits, nfd) fd_mask bit; int ev, flags, end, fd; int n, idx; + int error; fdp = td->td_proc->p_fd; n = 0; @@ -1119,8 +1155,9 @@ selscan(td, ibits, obits, nfd) flags = selflags(ibits, idx, bit); if (flags == 0) continue; - if ((fp = fget_unlocked(fdp, fd)) == NULL) - return (EBADF); + error = getselfd_cap(fdp, fd, &fp); + if (error) + return (error); selfdalloc(td, (void *)(uintptr_t)fd); ev = fo_poll(fp, flags, td->td_ucred, td); fdrop(fp, td); diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 187e6358f75..77c02dd57dd 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -30,9 +30,11 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_capsicum.h" #include "opt_compat.h" #include +#include #include #include #include @@ -1810,6 +1812,9 @@ ttyhook_register(struct tty **rtp, struct proc *p, int fd, { struct tty *tp; struct file *fp; +#ifdef CAPABILITIES + struct file *fp_cap; +#endif struct cdev *dev; struct cdevsw *cdp; struct filedesc *fdp; @@ -1827,6 +1832,13 @@ ttyhook_register(struct tty **rtp, struct proc *p, int fd, goto done1; } +#ifdef CAPABILITIES + fp_cap = fp; + error = cap_funwrap(fp_cap, CAP_TTYHOOK, &fp); + if (error) + return (error); +#endif + /* * Make sure the vnode is bound to a character device. * Unlocked check for the vnode type is ok there, because we diff --git a/sys/kern/uipc_mqueue.c b/sys/kern/uipc_mqueue.c index 9b334acb3fe..e13912c4aca 100644 --- a/sys/kern/uipc_mqueue.c +++ b/sys/kern/uipc_mqueue.c @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -2087,19 +2088,19 @@ kmq_unlink(struct thread *td, struct kmq_unlink_args *uap) return (error); } -typedef int (*_fgetf)(struct thread *, int, struct file **); +typedef int (*_fgetf)(struct thread *, int, cap_rights_t, struct file **); /* * Get message queue by giving file slot */ static int -_getmq(struct thread *td, int fd, _fgetf func, +_getmq(struct thread *td, int fd, cap_rights_t rights, _fgetf func, struct file **fpp, struct mqfs_node **ppn, struct mqueue **pmq) { struct mqfs_node *pn; int error; - error = func(td, fd, fpp); + error = func(td, fd, rights, fpp); if (error) return (error); if (&mqueueops != (*fpp)->f_ops) { @@ -2118,21 +2119,21 @@ static __inline int getmq(struct thread *td, int fd, struct file **fpp, struct mqfs_node **ppn, struct mqueue **pmq) { - return _getmq(td, fd, fget, fpp, ppn, pmq); + return _getmq(td, fd, CAP_POLL_KEVENT, fget, fpp, ppn, pmq); } static __inline int getmq_read(struct thread *td, int fd, struct file **fpp, struct mqfs_node **ppn, struct mqueue **pmq) { - return _getmq(td, fd, fget_read, fpp, ppn, pmq); + return _getmq(td, fd, CAP_READ, fget_read, fpp, ppn, pmq); } static __inline int getmq_write(struct thread *td, int fd, struct file **fpp, struct mqfs_node **ppn, struct mqueue **pmq) { - return _getmq(td, fd, fget_write, fpp, ppn, pmq); + return _getmq(td, fd, CAP_WRITE, fget_write, fpp, ppn, pmq); } static int @@ -2243,7 +2244,7 @@ kmq_notify(struct thread *td, struct kmq_notify_args *uap) struct filedesc *fdp; struct proc *p; struct mqueue *mq; - struct file *fp; + struct file *fp, *fp2; struct mqueue_notifier *nt, *newnt = NULL; int error; @@ -2267,7 +2268,18 @@ kmq_notify(struct thread *td, struct kmq_notify_args *uap) return (error); again: FILEDESC_SLOCK(fdp); - if (fget_locked(fdp, uap->mqd) != fp) { + fp2 = fget_locked(fdp, uap->mqd); + if (fp2 == NULL) { + FILEDESC_SUNLOCK(fdp); + error = EBADF; + goto out; + } + error = cap_funwrap(fp2, CAP_POLL_KEVENT, &fp2); + if (error) { + FILEDESC_SUNLOCK(fdp); + goto out; + } + if (fp2 != fp) { FILEDESC_SUNLOCK(fdp); error = EBADF; goto out; diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c index 917c343ed3a..82a4622c5dd 100644 --- a/sys/kern/uipc_sem.c +++ b/sys/kern/uipc_sem.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include "opt_posix.h" #include +#include #include #include #include @@ -116,7 +117,8 @@ static int ksem_create(struct thread *td, const char *path, semid_t *semidp, mode_t mode, unsigned int value, int flags, int compat32); static void ksem_drop(struct ksem *ks); -static int ksem_get(struct thread *td, semid_t id, struct file **fpp); +static int ksem_get(struct thread *td, semid_t id, cap_rights_t rights, + struct file **fpp); static struct ksem *ksem_hold(struct ksem *ks); static void ksem_insert(char *path, Fnv32_t fnv, struct ksem *ks); static struct ksem *ksem_lookup(char *path, Fnv32_t fnv); @@ -525,13 +527,13 @@ ksem_create(struct thread *td, const char *name, semid_t *semidp, mode_t mode, } static int -ksem_get(struct thread *td, semid_t id, struct file **fpp) +ksem_get(struct thread *td, semid_t id, cap_rights_t rights, struct file **fpp) { struct ksem *ks; struct file *fp; int error; - error = fget(td, id, &fp); + error = fget(td, id, rights, &fp); if (error) return (EINVAL); if (fp->f_type != DTYPE_SEM) { @@ -623,7 +625,8 @@ ksem_close(struct thread *td, struct ksem_close_args *uap) struct file *fp; int error; - error = ksem_get(td, uap->id, &fp); + /* No capability rights required to close a semaphore. */ + error = ksem_get(td, uap->id, 0, &fp); if (error) return (error); ks = fp->f_data; @@ -648,7 +651,7 @@ ksem_post(struct thread *td, struct ksem_post_args *uap) struct ksem *ks; int error; - error = ksem_get(td, uap->id, &fp); + error = ksem_get(td, uap->id, CAP_SEM_POST, &fp); if (error) return (error); ks = fp->f_data; @@ -738,7 +741,7 @@ kern_sem_wait(struct thread *td, semid_t id, int tryflag, int error; DP((">>> kern_sem_wait entered! pid=%d\n", (int)td->td_proc->p_pid)); - error = ksem_get(td, id, &fp); + error = ksem_get(td, id, CAP_SEM_WAIT, &fp); if (error) return (error); ks = fp->f_data; @@ -804,7 +807,7 @@ ksem_getvalue(struct thread *td, struct ksem_getvalue_args *uap) struct ksem *ks; int error, val; - error = ksem_get(td, uap->id, &fp); + error = ksem_get(td, uap->id, CAP_SEM_GETVALUE, &fp); if (error) return (error); ks = fp->f_data; @@ -838,7 +841,8 @@ ksem_destroy(struct thread *td, struct ksem_destroy_args *uap) struct ksem *ks; int error; - error = ksem_get(td, uap->id, &fp); + /* No capability rights required to close a semaphore. */ + error = ksem_get(td, uap->id, 0, &fp); if (error) return (error); ks = fp->f_data; diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index c434973a1b6..0e5efe6f3a9 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -120,33 +120,47 @@ SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufsused, CTLFLAG_RD, &nsfbufsused, 0, "Number of sendfile(2) sf_bufs in use"); /* - * Convert a user file descriptor to a kernel file entry. A reference on the - * file entry is held upon returning. This is lighter weight than - * fgetsock(), which bumps the socket reference drops the file reference - * count instead, as this approach avoids several additional mutex operations - * associated with the additional reference count. If requested, return the - * open file flags. + * Convert a user file descriptor to a kernel file entry and check that, if + * it is a capability, the right rights are present. A reference on the file + * entry is held upon returning. */ static int -getsock(struct filedesc *fdp, int fd, struct file **fpp, u_int *fflagp) +getsock_cap(struct filedesc *fdp, int fd, cap_rights_t rights, + struct file **fpp, u_int *fflagp) { struct file *fp; +#ifdef CAPABILITIES + struct file *fp_fromcap; int error; +#endif fp = NULL; - if (fdp == NULL || (fp = fget_unlocked(fdp, fd)) == NULL) { - error = EBADF; - } else if (fp->f_type != DTYPE_SOCKET) { + if ((fdp == NULL) || ((fp = fget_unlocked(fdp, fd)) == NULL)) + return (EBADF); +#ifdef CAPABILITIES + /* + * If the file descriptor is for a capability, test rights and use + * the file descriptor referenced by the capability. + */ + error = cap_funwrap(fp, rights, &fp_fromcap); + if (error) { fdrop(fp, curthread); - fp = NULL; - error = ENOTSOCK; - } else { - if (fflagp != NULL) - *fflagp = fp->f_flag; - error = 0; + return (error); } + if (fp != fp_fromcap) { + fhold(fp_fromcap); + fdrop(fp, curthread); + fp = fp_fromcap; + } +#endif /* CAPABILITIES */ + if (fp->f_type != DTYPE_SOCKET) { + fdrop(fp, curthread); + return (ENOTSOCK); + } + if (fflagp != NULL) + *fflagp = fp->f_flag; *fpp = fp; - return (error); + return (0); } /* @@ -226,7 +240,7 @@ kern_bind(td, fd, sa) int error; AUDIT_ARG_FD(fd); - error = getsock(td->td_proc->p_fd, fd, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, fd, CAP_BIND, &fp, NULL); if (error) return (error); so = fp->f_data; @@ -257,7 +271,7 @@ listen(td, uap) int error; AUDIT_ARG_FD(uap->s); - error = getsock(td->td_proc->p_fd, uap->s, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, uap->s, CAP_LISTEN, &fp, NULL); if (error == 0) { so = fp->f_data; #ifdef MAC @@ -347,7 +361,7 @@ kern_accept(struct thread *td, int s, struct sockaddr **name, AUDIT_ARG_FD(s); fdp = td->td_proc->p_fd; - error = getsock(fdp, s, &headfp, &fflag); + error = getsock_cap(fdp, s, CAP_ACCEPT, &headfp, &fflag); if (error) return (error); head = headfp->f_data; @@ -535,7 +549,7 @@ kern_connect(td, fd, sa) int interrupted = 0; AUDIT_ARG_FD(fd); - error = getsock(td->td_proc->p_fd, fd, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, fd, CAP_CONNECT, &fp, NULL); if (error) return (error); so = fp->f_data; @@ -744,12 +758,16 @@ kern_sendit(td, s, mp, flags, control, segflg) struct socket *so; int i; int len, error; + cap_rights_t rights; #ifdef KTRACE struct uio *ktruio = NULL; #endif AUDIT_ARG_FD(s); - error = getsock(td->td_proc->p_fd, s, &fp, NULL); + rights = CAP_WRITE; + if (mp->msg_name != NULL) + rights |= CAP_CONNECT; + error = getsock_cap(td->td_proc->p_fd, s, rights, &fp, NULL); if (error) return (error); so = (struct socket *)fp->f_data; @@ -953,7 +971,7 @@ kern_recvit(td, s, mp, fromseg, controlp) *controlp = NULL; AUDIT_ARG_FD(s); - error = getsock(td->td_proc->p_fd, s, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, s, CAP_READ, &fp, NULL); if (error) return (error); so = fp->f_data; @@ -1267,7 +1285,8 @@ shutdown(td, uap) int error; AUDIT_ARG_FD(uap->s); - error = getsock(td->td_proc->p_fd, uap->s, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, uap->s, CAP_SHUTDOWN, &fp, + NULL); if (error == 0) { so = fp->f_data; error = soshutdown(so, uap->how); @@ -1330,7 +1349,7 @@ kern_setsockopt(td, s, level, name, val, valseg, valsize) } AUDIT_ARG_FD(s); - error = getsock(td->td_proc->p_fd, s, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, s, CAP_SETSOCKOPT, &fp, NULL); if (error == 0) { so = fp->f_data; error = sosetopt(so, &sopt); @@ -1409,7 +1428,7 @@ kern_getsockopt(td, s, level, name, val, valseg, valsize) } AUDIT_ARG_FD(s); - error = getsock(td->td_proc->p_fd, s, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, s, CAP_GETSOCKOPT, &fp, NULL); if (error == 0) { so = fp->f_data; error = sogetopt(so, &sopt); @@ -1471,7 +1490,7 @@ kern_getsockname(struct thread *td, int fd, struct sockaddr **sa, return (EINVAL); AUDIT_ARG_FD(fd); - error = getsock(td->td_proc->p_fd, fd, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, fd, CAP_GETSOCKNAME, &fp, NULL); if (error) return (error); so = fp->f_data; @@ -1571,7 +1590,7 @@ kern_getpeername(struct thread *td, int fd, struct sockaddr **sa, return (EINVAL); AUDIT_ARG_FD(fd); - error = getsock(td->td_proc->p_fd, fd, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, fd, CAP_GETPEERNAME, &fp, NULL); if (error) return (error); so = fp->f_data; @@ -1827,7 +1846,7 @@ kern_sendfile(struct thread *td, struct sendfile_args *uap, * we send only the header/trailer and no payload data. */ AUDIT_ARG_FD(uap->fd); - if ((error = fgetvp_read(td, uap->fd, &vp)) != 0) + if ((error = fgetvp_read(td, uap->fd, CAP_READ, &vp)) != 0) goto out; vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY); @@ -1865,8 +1884,8 @@ kern_sendfile(struct thread *td, struct sendfile_args *uap, * The socket must be a stream socket and connected. * Remember if it a blocking or non-blocking socket. */ - if ((error = getsock(td->td_proc->p_fd, uap->s, &sock_fp, - NULL)) != 0) + if ((error = getsock_cap(td->td_proc->p_fd, uap->s, CAP_WRITE, + &sock_fp, NULL)) != 0) goto out; so = sock_fp->f_data; if (so->so_type != SOCK_STREAM) { @@ -2298,7 +2317,7 @@ sctp_peeloff(td, uap) fdp = td->td_proc->p_fd; AUDIT_ARG_FD(uap->sd); - error = fgetsock(td, uap->sd, &head, &fflag); + error = fgetsock(td, uap->sd, CAP_PEELOFF, &head, &fflag); if (error) goto done2; error = sctp_can_peel_off(head, (sctp_assoc_t)uap->name); @@ -2391,6 +2410,7 @@ sctp_generic_sendmsg (td, uap) #endif struct uio auio; struct iovec iov[1]; + cap_rights_t rights; if (uap->sinfo) { error = copyin(uap->sinfo, &sinfo, sizeof (sinfo)); @@ -2398,16 +2418,19 @@ sctp_generic_sendmsg (td, uap) return (error); u_sinfo = &sinfo; } + + rights = CAP_WRITE; if (uap->tolen) { error = getsockaddr(&to, uap->to, uap->tolen); if (error) { to = NULL; goto sctp_bad2; } + rights |= CAP_CONNECT; } AUDIT_ARG_FD(uap->sd); - error = getsock(td->td_proc->p_fd, uap->sd, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, uap->sd, rights, &fp, NULL); if (error) goto sctp_bad; #ifdef KTRACE @@ -2494,6 +2517,7 @@ sctp_generic_sendmsg_iov(td, uap) #endif struct uio auio; struct iovec *iov, *tiov; + cap_rights_t rights; if (uap->sinfo) { error = copyin(uap->sinfo, &sinfo, sizeof (sinfo)); @@ -2501,16 +2525,18 @@ sctp_generic_sendmsg_iov(td, uap) return (error); u_sinfo = &sinfo; } + rights = CAP_WRITE; if (uap->tolen) { error = getsockaddr(&to, uap->to, uap->tolen); if (error) { to = NULL; goto sctp_bad2; } + rights |= CAP_CONNECT; } AUDIT_ARG_FD(uap->sd); - error = getsock(td->td_proc->p_fd, uap->sd, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, uap->sd, rights, &fp, NULL); if (error) goto sctp_bad1; @@ -2618,7 +2644,7 @@ sctp_generic_recvmsg(td, uap) #endif AUDIT_ARG_FD(uap->sd); - error = getsock(td->td_proc->p_fd, uap->sd, &fp, NULL); + error = getsock_cap(td->td_proc->p_fd, uap->sd, CAP_READ, &fp, NULL); if (error) { return (error); } diff --git a/sys/kern/vfs_acl.c b/sys/kern/vfs_acl.c index b1cda38419e..9010a5068bf 100644 --- a/sys/kern/vfs_acl.c +++ b/sys/kern/vfs_acl.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -408,7 +409,7 @@ __acl_get_fd(struct thread *td, struct __acl_get_fd_args *uap) struct file *fp; int vfslocked, error; - error = getvnode(td->td_proc->p_fd, uap->filedes, &fp); + error = getvnode(td->td_proc->p_fd, uap->filedes, CAP_ACL_GET, &fp); if (error == 0) { vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = vacl_get_acl(td, fp->f_vnode, uap->type, uap->aclp); @@ -427,7 +428,7 @@ __acl_set_fd(struct thread *td, struct __acl_set_fd_args *uap) struct file *fp; int vfslocked, error; - error = getvnode(td->td_proc->p_fd, uap->filedes, &fp); + error = getvnode(td->td_proc->p_fd, uap->filedes, CAP_ACL_SET, &fp); if (error == 0) { vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = vacl_set_acl(td, fp->f_vnode, uap->type, uap->aclp); @@ -486,7 +487,8 @@ __acl_delete_fd(struct thread *td, struct __acl_delete_fd_args *uap) struct file *fp; int vfslocked, error; - error = getvnode(td->td_proc->p_fd, uap->filedes, &fp); + error = getvnode(td->td_proc->p_fd, uap->filedes, CAP_ACL_DELETE, + &fp); if (error == 0) { vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = vacl_delete(td, fp->f_vnode, uap->type); @@ -545,7 +547,8 @@ __acl_aclcheck_fd(struct thread *td, struct __acl_aclcheck_fd_args *uap) struct file *fp; int vfslocked, error; - error = getvnode(td->td_proc->p_fd, uap->filedes, &fp); + error = getvnode(td->td_proc->p_fd, uap->filedes, CAP_ACL_CHECK, + &fp); if (error == 0) { vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); error = vacl_aclcheck(td, fp->f_vnode, uap->type, uap->aclp); diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index 69b4e0a00c7..aedbdd05385 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -1577,17 +1578,30 @@ aio_aqueue(struct thread *td, struct aiocb *job, struct aioliojob *lj, aiocbe->uaiocb.aio_lio_opcode = type; opcode = aiocbe->uaiocb.aio_lio_opcode; - /* Fetch the file object for the specified file descriptor. */ + /* + * Validate the opcode and fetch the file object for the specified + * file descriptor. + * + * XXXRW: Moved the opcode validation up here so that we don't + * retrieve a file descriptor without knowing what the capabiltity + * should be. + */ fd = aiocbe->uaiocb.aio_fildes; switch (opcode) { case LIO_WRITE: - error = fget_write(td, fd, &fp); + error = fget_write(td, fd, CAP_WRITE | CAP_SEEK, &fp); break; case LIO_READ: - error = fget_read(td, fd, &fp); + error = fget_read(td, fd, CAP_READ | CAP_SEEK, &fp); + break; + case LIO_SYNC: + error = fget(td, fd, CAP_FSYNC, &fp); + break; + case LIO_NOP: + error = fget(td, fd, 0, &fp); break; default: - error = fget(td, fd, &fp); + error = EINVAL; } if (error) { uma_zfree(aiocb_zone, aiocbe); @@ -1623,11 +1637,6 @@ aio_aqueue(struct thread *td, struct aiocb *job, struct aioliojob *lj, uma_zfree(aiocb_zone, aiocbe); return (0); } - if ((opcode != LIO_READ) && (opcode != LIO_WRITE) && - (opcode != LIO_SYNC)) { - error = EINVAL; - goto aqueue_fail; - } if (aiocbe->uaiocb.aio_sigevent.sigev_notify != SIGEV_KEVENT) goto no_kqueue; @@ -1971,7 +1980,7 @@ aio_cancel(struct thread *td, struct aio_cancel_args *uap) struct vnode *vp; /* Lookup file object. */ - error = fget(td, uap->fd, &fp); + error = fget(td, uap->fd, 0, &fp); if (error) return (error); diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index e7bf2d19d7d..b8b9cdf058b 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -230,7 +231,7 @@ extattr_set_fd(td, uap) return (error); AUDIT_ARG_TEXT(attrname); - error = getvnode(td->td_proc->p_fd, uap->fd, &fp); + error = getvnode(td->td_proc->p_fd, uap->fd, CAP_EXTATTR_SET, &fp); if (error) return (error); @@ -410,7 +411,7 @@ extattr_get_fd(td, uap) return (error); AUDIT_ARG_TEXT(attrname); - error = getvnode(td->td_proc->p_fd, uap->fd, &fp); + error = getvnode(td->td_proc->p_fd, uap->fd, CAP_EXTATTR_GET, &fp); if (error) return (error); @@ -560,7 +561,8 @@ extattr_delete_fd(td, uap) return (error); AUDIT_ARG_TEXT(attrname); - error = getvnode(td->td_proc->p_fd, uap->fd, &fp); + error = getvnode(td->td_proc->p_fd, uap->fd, CAP_EXTATTR_DELETE, + &fp); if (error) return (error); @@ -719,7 +721,7 @@ extattr_list_fd(td, uap) AUDIT_ARG_FD(uap->fd); AUDIT_ARG_VALUE(uap->attrnamespace); - error = getvnode(td->td_proc->p_fd, uap->fd, &fp); + error = getvnode(td->td_proc->p_fd, uap->fd, CAP_EXTATTR_LIST, &fp); if (error) return (error); diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c index 50a2570254f..ae8982fee0d 100644 --- a/sys/kern/vfs_lookup.c +++ b/sys/kern/vfs_lookup.c @@ -37,12 +37,14 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_capsicum.h" #include "opt_kdtrace.h" #include "opt_ktrace.h" #include #include #include +#include #include #include #include @@ -212,7 +214,12 @@ namei(struct nameidata *ndp) AUDIT_ARG_ATFD1(ndp->ni_dirfd); if (cnp->cn_flags & AUDITVNODE2) AUDIT_ARG_ATFD2(ndp->ni_dirfd); - error = fgetvp(td, ndp->ni_dirfd, &dp); +#ifdef CAPABILITY_MODE + KASSERT(!IN_CAPABILITY_MODE(td), + ("%s: reached %s:%d in capability mode", + __func__, __FILE__, __LINE__)); +#endif + error = fgetvp(td, ndp->ni_dirfd, 0, &dp); } if (error != 0 || dp != NULL) { FILEDESC_SUNLOCK(fdp); diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index b48c6e79695..3a7ca062faa 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -37,6 +37,7 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_capsicum.h" #include "opt_compat.h" #include "opt_kdtrace.h" #include "opt_ktrace.h" @@ -45,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -373,7 +375,7 @@ kern_fstatfs(struct thread *td, int fd, struct statfs *buf) int error; AUDIT_ARG_FD(fd); - error = getvnode(td->td_proc->p_fd, fd, &fp); + error = getvnode(td->td_proc->p_fd, fd, CAP_FSTATFS, &fp); if (error) return (error); vp = fp->f_vnode; @@ -746,7 +748,7 @@ fchdir(td, uap) int error; AUDIT_ARG_FD(uap->fd); - if ((error = getvnode(fdp, uap->fd, &fp)) != 0) + if ((error = getvnode(fdp, uap->fd, CAP_FCHDIR, &fp)) != 0) return (error); vp = fp->f_vnode; VREF(vp); @@ -1049,7 +1051,7 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, struct vnode *vp; int cmode; struct file *nfp; - int type, indx, error; + int type, indx = -1, error; struct flock lf; struct nameidata nd; int vfslocked; @@ -1069,10 +1071,13 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, else flags = FFLAGS(flags); - error = falloc(td, &nfp, &indx, flags); + /* + * allocate the file descriptor, but don't install a descriptor yet + */ + error = falloc_noinstall(td, &nfp); if (error) return (error); - /* An extra reference on `nfp' has been held for us by falloc(). */ + /* An extra reference on `nfp' has been held for us by falloc_noinstall(). */ fp = nfp; /* Set the flags early so the finit in devfs can pick them up. */ fp->f_flag = flags & FMASK; @@ -1099,12 +1104,13 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, * if it succeeds. */ if ((error == ENODEV || error == ENXIO) && - td->td_dupfd >= 0 && /* XXX from fdopen */ - (error = - dupfdopen(td, fdp, indx, td->td_dupfd, flags, error)) == 0) { - td->td_retval[0] = indx; - fdrop(fp, td); - return (0); + (td->td_dupfd >= 0)) { + /* XXX from fdopen */ + if ((error = finstall(td, fp, &indx, flags)) != 0) + goto bad_unlocked; + if ((error = dupfdopen(td, fdp, indx, td->td_dupfd, + flags, error)) == 0) + goto success; } /* * Clean up the descriptor, but only if another thread hadn't @@ -1161,6 +1167,14 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, goto bad; } VFS_UNLOCK_GIANT(vfslocked); +success: + /* + * If we haven't already installed the FD (for dupfdopen), do so now. + */ + if (indx == -1) + if ((error = finstall(td, fp, &indx, flags)) != 0) + goto bad_unlocked; + /* * Release our private reference, leaving the one associated with * the descriptor table intact. @@ -1170,8 +1184,10 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, return (0); bad: VFS_UNLOCK_GIANT(vfslocked); +bad_unlocked: fdclose(fdp, fp, indx, td); fdrop(fp, td); + td->td_retval[0] = -1; return (error); } @@ -1918,7 +1934,7 @@ lseek(td, uap) int vfslocked; AUDIT_ARG_FD(uap->fd); - if ((error = fget(td, uap->fd, &fp)) != 0) + if ((error = fget(td, uap->fd, CAP_SEEK, &fp)) != 0) return (error); if (!(fp->f_ops->fo_flags & DFLAG_SEEKABLE)) { fdrop(fp, td); @@ -2775,7 +2791,8 @@ fchflags(td, uap) AUDIT_ARG_FD(uap->fd); AUDIT_ARG_FFLAGS(uap->flags); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, uap->fd, CAP_FCHFLAGS, + &fp)) != 0) return (error); vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); #ifdef AUDIT @@ -2936,7 +2953,8 @@ fchmod(td, uap) AUDIT_ARG_FD(uap->fd); AUDIT_ARG_MODE(uap->mode); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, uap->fd, CAP_FCHMOD, + &fp)) != 0) return (error); vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); #ifdef AUDIT @@ -3113,7 +3131,8 @@ fchown(td, uap) AUDIT_ARG_FD(uap->fd); AUDIT_ARG_OWNER(uap->uid, uap->gid); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, uap->fd, CAP_FCHOWN, &fp)) + != 0) return (error); vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); #ifdef AUDIT @@ -3348,7 +3367,8 @@ kern_futimes(struct thread *td, int fd, struct timeval *tptr, AUDIT_ARG_FD(fd); if ((error = getutimes(tptr, tptrseg, ts)) != 0) return (error); - if ((error = getvnode(td->td_proc->p_fd, fd, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, fd, CAP_FUTIMES, &fp)) + != 0) return (error); vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); #ifdef AUDIT @@ -3500,7 +3520,8 @@ fsync(td, uap) int error, lock_flags; AUDIT_ARG_FD(uap->fd); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, uap->fd, CAP_FSYNC, + &fp)) != 0) return (error); vp = fp->f_vnode; vfslocked = VFS_LOCK_GIANT(vp->v_mount); @@ -3925,7 +3946,8 @@ kern_ogetdirentries(struct thread *td, struct ogetdirentries_args *uap, /* XXX arbitrary sanity limit on `count'. */ if (uap->count > 64 * 1024) return (EINVAL); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, uap->fd, CAP_READ, + &fp)) != 0) return (error); if ((fp->f_flag & FREAD) == 0) { fdrop(fp, td); @@ -4085,7 +4107,8 @@ kern_getdirentries(struct thread *td, int fd, char *buf, u_int count, AUDIT_ARG_FD(fd); if (count > INT_MAX) return (EINVAL); - if ((error = getvnode(td->td_proc->p_fd, fd, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, fd, CAP_READ | CAP_SEEK, + &fp)) != 0) return (error); if ((fp->f_flag & FREAD) == 0) { fdrop(fp, td); @@ -4248,30 +4271,49 @@ out: } /* - * Convert a user file descriptor to a kernel file entry. - * A reference on the file entry is held upon returning. + * Convert a user file descriptor to a kernel file entry and check that, if it + * is a capability, the correct rights are present. A reference on the file + * entry is held upon returning. */ int -getvnode(fdp, fd, fpp) - struct filedesc *fdp; - int fd; - struct file **fpp; +getvnode(struct filedesc *fdp, int fd, cap_rights_t rights, + struct file **fpp) { - int error; struct file *fp; +#ifdef CAPABILITIES + struct file *fp_fromcap; +#endif + int error; error = 0; fp = NULL; - if (fdp == NULL || (fp = fget_unlocked(fdp, fd)) == NULL) - error = EBADF; - else if (fp->f_vnode == NULL) { - error = EINVAL; + if ((fdp == NULL) || (fp = fget_unlocked(fdp, fd)) == NULL) + return (EBADF); +#ifdef CAPABILITIES + /* + * If the file descriptor is for a capability, test rights and use the + * file descriptor referenced by the capability. + */ + error = cap_funwrap(fp, rights, &fp_fromcap); + if (error) { fdrop(fp, curthread); + return (error); + } + if (fp != fp_fromcap) { + fhold(fp_fromcap); + fdrop(fp, curthread); + fp = fp_fromcap; + } +#endif /* CAPABILITIES */ + if (fp->f_vnode == NULL) { + fdrop(fp, curthread); + return (EINVAL); } *fpp = fp; - return (error); + return (0); } + /* * Get an (NFS) file handle. */ @@ -4683,7 +4725,7 @@ kern_posix_fallocate(struct thread *td, int fd, off_t offset, off_t len) fp = NULL; vfslocked = 0; - error = fget(td, fd, &fp); + error = fget(td, fd, CAP_WRITE, &fp); if (error != 0) goto out; diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c index f72f8226c76..8c819c01429 100644 --- a/sys/netgraph/ng_socket.c +++ b/sys/netgraph/ng_socket.c @@ -694,7 +694,7 @@ ng_internalize(struct mbuf *control, struct thread *td) /* Check that the FD given is legit. and change it to a pointer to a * struct file. */ fd = CMSG_DATA(cm); - if ((error = fget(td, fd, &fp)) != 0) + if ((error = fget(td, fd, 0, &fp)) != 0) return (error); /* Depending on what kind of resource it is, act differently. For diff --git a/sys/nfsserver/nfs_srvkrpc.c b/sys/nfsserver/nfs_srvkrpc.c index 3c60825f208..2581092eafe 100644 --- a/sys/nfsserver/nfs_srvkrpc.c +++ b/sys/nfsserver/nfs_srvkrpc.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include "opt_kgssapi.h" #include +#include #include #include #include @@ -173,7 +174,7 @@ nfssvc_nfsserver(struct thread *td, struct nfssvc_args *uap) sizeof(addsockarg)); if (error) return (error); - if ((error = fget(td, addsockarg.sock, &fp)) != 0) + if ((error = fget(td, addsockarg.sock, CAP_SOCK_ALL, &fp)) != 0) return (error); if (fp->f_type != DTYPE_SOCKET) { fdrop(fp, td); diff --git a/sys/security/audit/audit_arg.c b/sys/security/audit/audit_arg.c index 4e155da619e..e4409f28bf6 100644 --- a/sys/security/audit/audit_arg.c +++ b/sys/security/audit/audit_arg.c @@ -899,7 +899,7 @@ audit_sysclose(struct thread *td, int fd) audit_arg_fd(fd); - if (getvnode(td->td_proc->p_fd, fd, &fp) != 0) + if (getvnode(td->td_proc->p_fd, fd, 0, &fp) != 0) return; vp = fp->f_vnode; diff --git a/sys/security/mac/mac_syscalls.c b/sys/security/mac/mac_syscalls.c index aea088582b3..dc275477be5 100644 --- a/sys/security/mac/mac_syscalls.c +++ b/sys/security/mac/mac_syscalls.c @@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$"); #include "opt_mac.h" #include +#include #include #include #include @@ -247,7 +248,7 @@ __mac_get_fd(struct thread *td, struct __mac_get_fd_args *uap) } buffer = malloc(mac.m_buflen, M_MACTEMP, M_WAITOK | M_ZERO); - error = fget(td, uap->fd, &fp); + error = fget(td, uap->fd, CAP_MAC_GET, &fp); if (error) goto out; @@ -442,7 +443,7 @@ __mac_set_fd(struct thread *td, struct __mac_set_fd_args *uap) return (error); } - error = fget(td, uap->fd, &fp); + error = fget(td, uap->fd, CAP_MAC_SET, &fp); if (error) goto out; diff --git a/sys/sys/capability.h b/sys/sys/capability.h index b6561c7d3d5..bd1d0608757 100644 --- a/sys/sys/capability.h +++ b/sys/sys/capability.h @@ -115,9 +115,9 @@ #define CAP_SEM_POST 0x0000010000000000ULL #define CAP_SEM_WAIT 0x0000020000000000ULL -/* Events - maybe we need a post/get distinction? */ -#define CAP_EVENT 0x0000040000000000ULL -#define CAP_KEVENT 0x0000080000000000ULL +/* kqueue events. */ +#define CAP_POLL_KEVENT 0x0000040000000000ULL +#define CAP_POST_KEVENT 0x0000080000000000ULL /* Strange and powerful rights that should not be given lightly. */ #define CAP_IOCTL 0x0000100000000000ULL diff --git a/sys/sys/file.h b/sys/sys/file.h index eea2c0091f6..2c64bcf644e 100644 --- a/sys/sys/file.h +++ b/sys/sys/file.h @@ -176,9 +176,13 @@ extern int maxfiles; /* kernel limit on number of open files */ extern int maxfilesperproc; /* per process limit on number of open files */ extern volatile int openfiles; /* actual number of open files */ -int fget(struct thread *td, int fd, struct file **fpp); -int fget_read(struct thread *td, int fd, struct file **fpp); -int fget_write(struct thread *td, int fd, struct file **fpp); +int fget(struct thread *td, int fd, cap_rights_t rights, struct file **fpp); +int fget_mmap(struct thread *td, int fd, cap_rights_t rights, + u_char *maxprotp, struct file **fpp); +int fget_read(struct thread *td, int fd, cap_rights_t rights, + struct file **fpp); +int fget_write(struct thread *td, int fd, cap_rights_t rights, + struct file **fpp); int fgetcap(struct thread *td, int fd, struct file **fpp); int _fdrop(struct file *fp, struct thread *td); @@ -197,11 +201,16 @@ fo_stat_t soo_stat; fo_close_t soo_close; void finit(struct file *, u_int, short, void *, struct fileops *); -int fgetvp(struct thread *td, int fd, struct vnode **vpp); -int fgetvp_read(struct thread *td, int fd, struct vnode **vpp); -int fgetvp_write(struct thread *td, int fd, struct vnode **vpp); +int fgetvp(struct thread *td, int fd, cap_rights_t rights, struct vnode **vpp); +int fgetvp_rights(struct thread *td, int fd, cap_rights_t need, + cap_rights_t *have, struct vnode **vpp); +int fgetvp_read(struct thread *td, int fd, cap_rights_t rights, + struct vnode **vpp); +int fgetvp_write(struct thread *td, int fd, cap_rights_t rights, + struct vnode **vpp); -int fgetsock(struct thread *td, int fd, struct socket **spp, u_int *fflagp); +int fgetsock(struct thread *td, int fd, cap_rights_t rights, + struct socket **spp, u_int *fflagp); void fputsock(struct socket *sp); static __inline int diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h index 2dab7416b6e..1b87bab201d 100644 --- a/sys/sys/filedesc.h +++ b/sys/sys/filedesc.h @@ -128,7 +128,8 @@ struct filedesc *fdshare(struct filedesc *fdp); struct filedesc_to_leader * filedesc_to_leader_alloc(struct filedesc_to_leader *old, struct filedesc *fdp, struct proc *leader); -int getvnode(struct filedesc *fdp, int fd, struct file **fpp); +int getvnode(struct filedesc *fdp, int fd, cap_rights_t rights, + struct file **fpp); void mountcheckdirs(struct vnode *olddp, struct vnode *newdp); void setugidsafety(struct thread *td); diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index f6d0366b9ac..1df96a102af 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -62,9 +62,11 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_capsicum.h" #include "opt_quota.h" #include +#include #include #include #include @@ -2477,7 +2479,8 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) return (error); if (cmd.version != FFS_CMD_VERSION) return (ERPCMISMATCH); - if ((error = getvnode(td->td_proc->p_fd, cmd.handle, &fp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, cmd.handle, CAP_FSCK, + &fp)) != 0) return (error); vp = fp->f_data; if (vp->v_type != VREG && vp->v_type != VDIR) { @@ -2798,7 +2801,8 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) (intmax_t)cmd.value); } #endif /* DEBUG */ - if ((error = getvnode(td->td_proc->p_fd, cmd.value, &vfp)) != 0) + if ((error = getvnode(td->td_proc->p_fd, cmd.value, + CAP_FSCK, &vfp)) != 0) break; if (vfp->f_vnode->v_type != VCHR) { fdrop(vfp, td); diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index c78571d3053..a46d6b5ccf6 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -48,6 +48,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include #include #include #include @@ -189,12 +191,13 @@ mmap(td, uap) struct vnode *vp; vm_offset_t addr; vm_size_t size, pageoff; - vm_prot_t prot, maxprot; + vm_prot_t cap_maxprot, prot, maxprot; void *handle; objtype_t handle_type; int flags, error; off_t pos; struct vmspace *vms = td->td_proc->p_vmspace; + cap_rights_t rights; addr = (vm_offset_t) uap->addr; size = uap->len; @@ -274,12 +277,25 @@ mmap(td, uap) handle = NULL; handle_type = OBJT_DEFAULT; maxprot = VM_PROT_ALL; + cap_maxprot = VM_PROT_ALL; } else { /* - * Mapping file, get fp for validation and - * don't let the descriptor disappear on us if we block. + * Mapping file, get fp for validation and don't let the + * descriptor disappear on us if we block. Check capability + * rights, but also return the maximum rights to be combined + * with maxprot later. */ - if ((error = fget(td, uap->fd, &fp)) != 0) + rights = CAP_MMAP; + if (prot & PROT_READ) + rights |= CAP_READ; + if ((flags & MAP_SHARED) != 0) { + if (prot & PROT_WRITE) + rights |= CAP_WRITE; + } + if (prot & PROT_EXEC) + rights |= CAP_MAPEXEC; + if ((error = fget_mmap(td, uap->fd, rights, &cap_maxprot, + &fp)) != 0) goto done; if (fp->f_type == DTYPE_SHM) { handle = fp->f_data; @@ -346,12 +362,14 @@ mmap(td, uap) } } else if (vp->v_type != VCHR || (fp->f_flag & FWRITE) != 0) { maxprot |= VM_PROT_WRITE; + cap_maxprot |= VM_PROT_WRITE; } handle = (void *)vp; handle_type = OBJT_VNODE; } map: td->td_fpop = fp; + maxprot &= cap_maxprot; error = vm_mmap(&vms->vm_map, &addr, size, prot, maxprot, flags, handle_type, handle, pos); td->td_fpop = NULL; diff --git a/tools/regression/security/cap_test/cap_test.c b/tools/regression/security/cap_test/cap_test.c index fb344067233..89ba9b71e77 100644 --- a/tools/regression/security/cap_test/cap_test.c +++ b/tools/regression/security/cap_test/cap_test.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -60,7 +61,7 @@ main(int argc, char *argv[]) * If no tests have been specified at the command line, run them all. */ if (argc == 1) { - printf("1..%ld\n", test_count); + printf("1..%ju\n", (uintmax_t)test_count); for (size_t i = 0; i < test_count; i++) execute(i + 1, all_tests + i); diff --git a/tools/regression/security/cap_test/cap_test_capabilities.c b/tools/regression/security/cap_test/cap_test_capabilities.c index 818698db237..47c0142f4da 100644 --- a/tools/regression/security/cap_test/cap_test_capabilities.c +++ b/tools/regression/security/cap_test/cap_test_capabilities.c @@ -237,8 +237,8 @@ test_capabilities(void) TRY(fd, CAP_MMAP | CAP_MAPEXEC | CAP_WRITE); TRY(fd, CAP_MMAP | CAP_READ | CAP_WRITE | CAP_MAPEXEC); TRY(fd, CAP_FCNTL); - TRY(fd, CAP_EVENT); - TRY(fd, CAP_KEVENT); + TRY(fd, CAP_POST_KEVENT); + TRY(fd, CAP_POLL_KEVENT); TRY(fd, CAP_FSYNC); TRY(fd, CAP_FCHOWN); TRY(fd, CAP_FCHMOD); From 6fdce145de8c92a95d353bbca695015210850e17 Mon Sep 17 00:00:00 2001 From: Yoshihiro Takahashi Date: Thu, 11 Aug 2011 13:13:08 +0000 Subject: [PATCH 213/452] Fix building a release with old release scheme. This catches up with renaming from Makefile to Makefile.sysinstall. Approved by: re (hrs) --- release/Makefile.sysinstall | 38 +++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/release/Makefile.sysinstall b/release/Makefile.sysinstall index c59ea736ecf..0b718f6167d 100644 --- a/release/Makefile.sysinstall +++ b/release/Makefile.sysinstall @@ -363,6 +363,8 @@ WMAKEENV!= cd ${.CURDIR}/..; \ WMAKE= ${WMAKEENV} ${BINMAKE} .endif +SMAKE= ${MAKE} -f ${MAKEFILE} + CVS_SRCARGS= -P .if defined(RELEASETAG) CVS_SRCARGS+= -r ${RELEASETAG} @@ -479,7 +481,7 @@ release rerelease: mkdir -p ${CHROOTDIR}/usr/ports/distfiles; \ fi .if !defined(NO_PREFETCHDISTFILES) - @cd ${.CURDIR} && ${MAKE} fetch-distfiles + @cd ${.CURDIR} && ${SMAKE} fetch-distfiles .endif .endif .endif @@ -719,7 +721,7 @@ release.6: @for i in ${DISTRIBUTIONS} ; \ do \ if [ -d ${RD}/trees/$${i} ] ; then \ - cd ${.CURDIR} && $(MAKE) doTARBALL \ + cd ${.CURDIR} && $(SMAKE) doTARBALL \ SD=${RD}/trees/$${i} \ TN=$$i TD=$$i ARG="." && \ echo "$${i} distribution is finished."; \ @@ -728,7 +730,7 @@ release.6: @for i in ${KERNELS_BASE} ${KERNELS} ; \ do \ if [ -d ${RD}/kernels/$${i} ] ; then \ - cd ${.CURDIR} && $(MAKE) doTARBALL \ + cd ${.CURDIR} && $(SMAKE) doTARBALL \ SD=${RD}/kernels \ TN=$$i TD=kernels ARG="$$i" && \ echo "$${i} distribution is finished."; \ @@ -758,11 +760,11 @@ release.6: # release.7: .if !defined(NOSRC) - @cd ${.CURDIR} && $(MAKE) doTARBALL SD=/usr/src \ + @cd ${.CURDIR} && $(SMAKE) doTARBALL SD=/usr/src \ TD=src TN=sbase ARG="[A-Z]*" @for i in `cd /usr/src && echo [a-z]*` ; do \ if [ -d /usr/src/$$i ] ; then \ - cd ${.CURDIR} && $(MAKE) doTARBALL \ + cd ${.CURDIR} && $(SMAKE) doTARBALL \ TN=`echo s$$i | tr -d '.' | \ sed -e 's/usr/u/' \ -e 's/kerberos5/krb5/'` \ @@ -773,7 +775,7 @@ release.7: @set ${EXTRA_SRC} && \ while [ $$# -ge 2 ] ; do \ if [ -d /usr/src/$$1 ] ; then \ - cd ${.CURDIR} && $(MAKE) doTARBALL \ + cd ${.CURDIR} && $(SMAKE) doTARBALL \ SD=/usr/src TN="s$$2" TD=src ARG="$$1" ; \ fi && shift && shift ; \ done @@ -796,7 +798,7 @@ release.8: cd ${RD}/mfsfd && \ mkdir -p etc/defaults dev mnt stand/etc/defaults stand/help \ var/empty - @cd ${.CURDIR} && $(MAKE) installCRUNCH CRUNCH=boot \ + @cd ${.CURDIR} && $(SMAKE) installCRUNCH CRUNCH=boot \ DIR=${RD}/mfsfd/stand ZIP=false ( cd ${RD}/mfsfd && \ for dir in bin sbin ; do \ @@ -862,39 +864,39 @@ SMALLMFSROOTFLOPPYSET= ${RD}/floppyset/mfsroot-small/mfsroot.gz floppies.1: @${ZIPPER} -c ${RD}/kernels/${KERN_GENERIC}/kernel > ${RD}/kernels/kernel.gz @echo "Making the kernel boot floppies..." - @cd ${.CURDIR} && ${MAKE} makeFloppySet FLOPPYBASE=kern \ + @cd ${.CURDIR} && ${SMAKE} makeFloppySet FLOPPYBASE=kern \ FLOPPYDESC="Kernel" SPLITFILE=${RD}/kernels/kernel.gz .if defined(SMALLFLOPPYSIZE) @echo "Making the small kernel boot floppies..." - @cd ${.CURDIR} && ${MAKE} makeFloppySet FLOPPYBASE=kern-small \ + @cd ${.CURDIR} && ${SMAKE} makeFloppySet FLOPPYBASE=kern-small \ FLOPPYDESC="Kernel" SPLITFILE=${RD}/kernels/kernel.gz \ FDSIZE="SMALL" .endif .if defined(SPLIT_MFSROOT) @echo "Making the mfsroot boot floppies..." - @cd ${.CURDIR} && ${MAKE} makeFloppySet FLOPPYBASE=mfsroot \ + @cd ${.CURDIR} && ${SMAKE} makeFloppySet FLOPPYBASE=mfsroot \ FLOPPYDESC="Memory Filesystem" SPLITFILE=${RD}/mfsroot/mfsroot.gz .if defined(SMALLFLOPPYSIZE) @echo "Making the small mfsroot boot floppies..." - @cd ${.CURDIR} && ${MAKE} makeFloppySet FLOPPYBASE=mfsroot-small \ + @cd ${.CURDIR} && ${SMAKE} makeFloppySet FLOPPYBASE=mfsroot-small \ FLOPPYDESC="Memory Filesystem" SPLITFILE=${RD}/mfsroot/mfsroot.gz \ FDSIZE="SMALL" .endif - @cd ${.CURDIR} && ${MAKE} buildBootFloppy FSIMAGE="boot" \ + @cd ${.CURDIR} && ${SMAKE} buildBootFloppy FSIMAGE="boot" \ KERNFILE="${KERNFLOPPYSET}.split ${KERNFLOPPYSET}.boot" \ MFSROOTFILE="${MFSROOTFLOPPYSET}.split ${MFSROOTFLOPPYSET}.boot" .if defined(SMALLFLOPPYSIZE) - @cd ${.CURDIR} && ${MAKE} buildBootFloppy FSIMAGE="boot-small" \ + @cd ${.CURDIR} && ${SMAKE} buildBootFloppy FSIMAGE="boot-small" \ KERNFILE="${SMALLKERNFLOPPYSET}.split ${SMALLKERNFLOPPYSET}.boot" \ MFSROOTFILE="${SMALLMFSROOTFLOPPYSET}.split ${SMALLMFSROOTFLOPPYSET}.boot" \ FDSIZE="SMALL" .endif .else # !SPLIT_MFSROOT - @cd ${.CURDIR} && ${MAKE} buildBootFloppy FSIMAGE="boot" \ + @cd ${.CURDIR} && ${SMAKE} buildBootFloppy FSIMAGE="boot" \ KERNFILE="${KERNFLOPPYSET}.split ${KERNFLOPPYSET}.boot" \ MFSROOTFILE=${RD}/mfsroot/mfsroot.gz .if defined(SMALLFLOPPYSIZE) - @cd ${.CURDIR} && ${MAKE} buildBootFloppy FSIMAGE="boot-small" \ + @cd ${.CURDIR} && ${SMAKE} buildBootFloppy FSIMAGE="boot-small" \ KERNFILE="${SMALLKERNFLOPPYSET}.split ${SMALLKERNFLOPPYSET}.boot" \ MFSROOTFILE=${RD}/mfsroot/mfsroot.gz \ FDSIZE="SMALL" @@ -921,14 +923,14 @@ floppies.2: @cp ${.CURDIR}/scripts/tar.sh ${RD}/fixitfd/stand/tar @chmod 555 ${RD}/fixitfd/stand/tar .if defined(SMALLFLOPPYSIZE) - @cd ${.CURDIR} && ${MAKE} installCRUNCH CRUNCH=fixit-small \ + @cd ${.CURDIR} && ${SMAKE} installCRUNCH CRUNCH=fixit-small \ DIR=${RD}/fixitfd/stand ZIP=false @sh -e ${DOFS_SH} ${RD}/floppies/fixit-small.flp ${RD} ${MNT} \ ${SMALLFLOPPYSIZE} ${RD}/fixitfd ${FLOPPYINODE} ${SMALLFLOPPYLABEL} @rm -rf ${RD}/fixitfd/stand @mkdir ${RD}/fixitfd/stand .endif - @cd ${.CURDIR} && ${MAKE} installCRUNCH CRUNCH=fixit \ + @cd ${.CURDIR} && ${SMAKE} installCRUNCH CRUNCH=fixit \ DIR=${RD}/fixitfd/stand ZIP=false @sh -e ${DOFS_SH} ${RD}/floppies/fixit.flp ${RD} ${MNT} \ ${FLOPPYSIZE} ${RD}/fixitfd ${FLOPPYINODE} ${FLOPPYLABEL} @@ -1245,7 +1247,7 @@ doRELEASE: release.1 release.2 ${DOCREL} release.3 release.4 \ floppies: @rm -f release.4 release.8 floppies.[123] - @cd ${.CURDIR} && ${MAKE} release.4 release.8 floppies.1 floppies.2 \ + @cd ${.CURDIR} && ${SMAKE} release.4 release.8 floppies.1 floppies.2 \ floppies.3 @cd ${RD} && find floppies -print | cpio -dumpl ${FD} From 09abcc01cf899f4d61881247cb3cf5f6c5fbc7a8 Mon Sep 17 00:00:00 2001 From: Yoshihiro Takahashi Date: Thu, 11 Aug 2011 13:15:11 +0000 Subject: [PATCH 214/452] Allow to build a release for stable/[78] on a current box and vise versa. Approved by: re (hrs) MFC after: 1 week --- release/Makefile.sysinstall | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/release/Makefile.sysinstall b/release/Makefile.sysinstall index 0b718f6167d..740ab42aa4a 100644 --- a/release/Makefile.sysinstall +++ b/release/Makefile.sysinstall @@ -600,7 +600,11 @@ release rerelease: echo "fi" >> ${_MK} echo "cd /usr/src/release" >> ${_MK} echo "make obj" >> ${_MK} - echo "make -f Makefile.sysinstall \$${_RELTARGET}" >> ${_MK} + echo "if [ -f Makefile.sysinstall ]; then" >> ${_MK} + echo " make -f Makefile.sysinstall \$${_RELTARGET}" >> ${_MK} + echo "else" >> ${_MK} + echo " make \$${_RELTARGET}" >> ${_MK} + echo "fi" >> ${_MK} echo "echo \">>> make ${.TARGET} for ${TARGET} finished on \`LC_ALL=C TZ=GMT date\`\"" >> ${_MK} chmod 755 ${_MK} .if defined(NOPORTS) From d6d2cfa24b8e532fbf1eb2e8247655ccb5823ceb Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Thu, 11 Aug 2011 13:29:59 +0000 Subject: [PATCH 215/452] Only call fdclose() on successfully-opened FDs. Since kern_openat() now uses falloc_noinstall() and finstall() separately, there are cases where we could get to cleanup code without ever creating a file descriptor. In those cases, we should not call fdclose() on FD -1. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- sys/kern/vfs_syscalls.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 3a7ca062faa..7f855c0a832 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1116,7 +1116,8 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, * Clean up the descriptor, but only if another thread hadn't * replaced or closed it. */ - fdclose(fdp, fp, indx, td); + if (indx != -1) + fdclose(fdp, fp, indx, td); fdrop(fp, td); if (error == ERESTART) @@ -1185,7 +1186,8 @@ success: bad: VFS_UNLOCK_GIANT(vfslocked); bad_unlocked: - fdclose(fdp, fp, indx, td); + if (indx != -1) + fdclose(fdp, fp, indx, td); fdrop(fp, td); td->td_retval[0] = -1; return (error); From dbb202b398b776890e86d22a4ee04eb46cc6860c Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Thu, 11 Aug 2011 15:52:06 +0000 Subject: [PATCH 216/452] Use the right printf() format string without a cast to maxint_t. As per kib's suggestion, we also change test_count from a size_t to an int; its value at the moment is 4, and we only expect it to go up to 7. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- tools/regression/security/cap_test/cap_test.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/regression/security/cap_test/cap_test.c b/tools/regression/security/cap_test/cap_test.c index 89ba9b71e77..dfda4d60426 100644 --- a/tools/regression/security/cap_test/cap_test.c +++ b/tools/regression/security/cap_test/cap_test.c @@ -51,7 +51,7 @@ struct test all_tests[] = { TEST_INIT(fcntl), TEST_INIT(sysctl), }; -size_t test_count = sizeof(all_tests) / sizeof(struct test); +int test_count = sizeof(all_tests) / sizeof(struct test); int main(int argc, char *argv[]) @@ -61,9 +61,9 @@ main(int argc, char *argv[]) * If no tests have been specified at the command line, run them all. */ if (argc == 1) { - printf("1..%ju\n", (uintmax_t)test_count); + printf("1..%d\n", test_count); - for (size_t i = 0; i < test_count; i++) + for (int i = 0; i < test_count; i++) execute(i + 1, all_tests + i); return (0); } @@ -75,7 +75,7 @@ main(int argc, char *argv[]) for (int i = 1; i < argc; i++) { int found = 0; - for (size_t j = 0; j < test_count; j++) { + for (int j = 0; j < test_count; j++) { if (strncmp(argv[i], all_tests[j].t_name, strlen(argv[i])) == 0) { found = 1; From 7b1085ba55ab12882926f309b6a007413309422f Mon Sep 17 00:00:00 2001 From: Pawel Jakub Dawidek Date: Fri, 12 Aug 2011 07:04:16 +0000 Subject: [PATCH 217/452] Eliminate the zfsdev_state_lock entirely and replace it with the spa_namespace_lock. This fixes LOR between the spa_namespace_lock and spa_config lock. LOR can cause deadlock on vdevs removal/insertion. Reported by: gibbs, delphij Tested by: delphij Approved by: re (kib) MFC after: 1 week --- .../uts/common/fs/zfs/sys/zfs_ioctl.h | 1 - .../opensolaris/uts/common/fs/zfs/vdev_geom.c | 14 +-- .../opensolaris/uts/common/fs/zfs/zfs_ioctl.c | 16 ++-- .../opensolaris/uts/common/fs/zfs/zvol.c | 93 +++++++++---------- 4 files changed, 54 insertions(+), 70 deletions(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h index f7e44aadffe..5692dc6f449 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h @@ -353,7 +353,6 @@ extern void *zfsdev_get_soft_state(minor_t minor, extern minor_t zfsdev_minor_alloc(void); extern void *zfsdev_state; -extern kmutex_t zfsdev_state_lock; #endif /* _KERNEL */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c index 4d4b63cb2a0..47c7b4af009 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c @@ -410,7 +410,7 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) struct g_provider *pp; struct g_consumer *cp; size_t bufsize; - int error, lock; + int error; /* * We must have a pathname, and it must be absolute. @@ -422,12 +422,6 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) vd->vdev_tsd = NULL; - if (mutex_owned(&spa_namespace_lock)) { - mutex_exit(&spa_namespace_lock); - lock = 1; - } else { - lock = 0; - } DROP_GIANT(); g_topology_lock(); error = 0; @@ -459,11 +453,7 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) !ISP2(cp->provider->sectorsize)) { ZFS_LOG(1, "Provider %s has unsupported sectorsize.", vd->vdev_path); - - g_topology_lock(); vdev_geom_detach(cp, 0); - g_topology_unlock(); - error = EINVAL; cp = NULL; } else if (cp->acw == 0 && (spa_mode(vd->vdev_spa) & FWRITE) != 0) { @@ -486,8 +476,6 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) } g_topology_unlock(); PICKUP_GIANT(); - if (lock) - mutex_enter(&spa_namespace_lock); if (cp == NULL) { vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED; return (error); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c index ba13747ddb3..ff5d40e9cb1 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c @@ -4813,7 +4813,7 @@ zfsdev_minor_alloc(void) static minor_t last_minor; minor_t m; - ASSERT(MUTEX_HELD(&zfsdev_state_lock)); + ASSERT(MUTEX_HELD(&spa_namespace_lock)); for (m = last_minor + 1; m != last_minor; m++) { if (m > ZFSDEV_MAX_MINOR) @@ -4833,7 +4833,7 @@ zfs_ctldev_init(struct cdev *devp) minor_t minor; zfs_soft_state_t *zs; - ASSERT(MUTEX_HELD(&zfsdev_state_lock)); + ASSERT(MUTEX_HELD(&spa_namespace_lock)); minor = zfsdev_minor_alloc(); if (minor == 0) @@ -4854,7 +4854,7 @@ zfs_ctldev_init(struct cdev *devp) static void zfs_ctldev_destroy(zfs_onexit_t *zo, minor_t minor) { - ASSERT(MUTEX_HELD(&zfsdev_state_lock)); + ASSERT(MUTEX_HELD(&spa_namespace_lock)); zfs_onexit_destroy(zo); ddi_soft_state_free(zfsdev_state, minor); @@ -4884,9 +4884,9 @@ zfsdev_open(struct cdev *devp, int flag, int mode, struct thread *td) /* This is the control device. Allocate a new minor if requested. */ if (flag & FEXCL) { - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); error = zfs_ctldev_init(devp); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); } return (error); @@ -4901,14 +4901,14 @@ zfsdev_close(void *data) if (minor == 0) return; - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); zo = zfsdev_get_soft_state(minor, ZSST_CTLDEV); if (zo == NULL) { - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return; } zfs_ctldev_destroy(zo, minor); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); } static int diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c index a514247321a..f9789f889ba 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c @@ -94,12 +94,11 @@ static char *zvol_tag = "zvol_tag"; #define ZVOL_DUMPSIZE "dumpsize" /* - * This lock protects the zfsdev_state structure from being modified - * while it's being used, e.g. an open that comes in before a create - * finishes. It also protects temporary opens of the dataset so that, + * The spa_namespace_lock protects the zfsdev_state structure from being + * modified while it's being used, e.g. an open that comes in before a + * create finishes. It also protects temporary opens of the dataset so that, * e.g., an open doesn't get a spurious EBUSY. */ -kmutex_t zfsdev_state_lock; static uint32_t zvol_minors; typedef struct zvol_extent { @@ -246,7 +245,7 @@ zvol_minor_lookup(const char *name) struct g_geom *gp; zvol_state_t *zv = NULL; - ASSERT(MUTEX_HELD(&zfsdev_state_lock)); + ASSERT(MUTEX_HELD(&spa_namespace_lock)); g_topology_lock(); LIST_FOREACH(gp, &zfs_zvol_class.geom, geom) { @@ -462,11 +461,11 @@ zvol_name2minor(const char *name, minor_t *minor) { zvol_state_t *zv; - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); zv = zvol_minor_lookup(name); if (minor && zv) *minor = zv->zv_minor; - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (zv ? 0 : -1); } #endif /* sun */ @@ -485,10 +484,10 @@ zvol_create_minor(const char *name) ZFS_LOG(1, "Creating ZVOL %s...", name); - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); if (zvol_minor_lookup(name) != NULL) { - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (EEXIST); } @@ -496,20 +495,20 @@ zvol_create_minor(const char *name) error = dmu_objset_own(name, DMU_OST_ZVOL, B_TRUE, FTAG, &os); if (error) { - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (error); } #ifdef sun if ((minor = zfsdev_minor_alloc()) == 0) { dmu_objset_disown(os, FTAG); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (ENXIO); } if (ddi_soft_state_zalloc(zfsdev_state, minor) != DDI_SUCCESS) { dmu_objset_disown(os, FTAG); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (EAGAIN); } (void) ddi_prop_update_string(minor, zfs_dip, ZVOL_PROP_NAME, @@ -521,7 +520,7 @@ zvol_create_minor(const char *name) minor, DDI_PSEUDO, 0) == DDI_FAILURE) { ddi_soft_state_free(zfsdev_state, minor); dmu_objset_disown(os, FTAG); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (EAGAIN); } @@ -532,7 +531,7 @@ zvol_create_minor(const char *name) ddi_remove_minor_node(zfs_dip, chrbuf); ddi_soft_state_free(zfsdev_state, minor); dmu_objset_disown(os, FTAG); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (EAGAIN); } @@ -572,7 +571,7 @@ zvol_create_minor(const char *name) zvol_minors++; - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); zvol_geom_run(zv); @@ -594,7 +593,7 @@ zvol_remove_zv(zvol_state_t *zv) minor_t minor = zv->zv_minor; #endif - ASSERT(MUTEX_HELD(&zfsdev_state_lock)); + ASSERT(MUTEX_HELD(&spa_namespace_lock)); if (zv->zv_total_opens != 0) return (EBUSY); @@ -620,15 +619,15 @@ zvol_remove_minor(const char *name) zvol_state_t *zv; int rc; - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); if ((zv = zvol_minor_lookup(name)) == NULL) { - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (ENXIO); } g_topology_lock(); rc = zvol_remove_zv(zv); g_topology_unlock(); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (rc); } @@ -730,7 +729,7 @@ zvol_update_volsize(objset_t *os, uint64_t volsize) dmu_tx_t *tx; int error; - ASSERT(MUTEX_HELD(&zfsdev_state_lock)); + ASSERT(MUTEX_HELD(&spa_namespace_lock)); tx = dmu_tx_create(os); dmu_tx_hold_zap(tx, ZVOL_ZAP_OBJ, TRUE, NULL); @@ -761,7 +760,7 @@ zvol_remove_minors(const char *name) namelen = strlen(name); DROP_GIANT(); - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); g_topology_lock(); LIST_FOREACH_SAFE(gp, &zfs_zvol_class.geom, geom, gptmp) { @@ -779,7 +778,7 @@ zvol_remove_minors(const char *name) } g_topology_unlock(); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); PICKUP_GIANT(); } @@ -793,10 +792,10 @@ zvol_set_volsize(const char *name, major_t maj, uint64_t volsize) uint64_t old_volsize = 0ULL; uint64_t readonly; - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); zv = zvol_minor_lookup(name); if ((error = dmu_objset_hold(name, FTAG, &os)) != 0) { - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (error); } @@ -863,7 +862,7 @@ zvol_set_volsize(const char *name, major_t maj, uint64_t volsize) out: dmu_objset_rele(os, FTAG); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (error); } @@ -875,18 +874,18 @@ zvol_open(struct g_provider *pp, int flag, int count) zvol_state_t *zv; int err = 0; - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); zv = pp->private; if (zv == NULL) { - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (ENXIO); } if (zv->zv_total_opens == 0) err = zvol_first_open(zv); if (err) { - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (err); } if ((flag & FWRITE) && (zv->zv_flags & ZVOL_RDONLY)) { @@ -908,13 +907,13 @@ zvol_open(struct g_provider *pp, int flag, int count) #endif zv->zv_total_opens += count; - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (err); out: if (zv->zv_total_opens == 0) zvol_last_close(zv); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (err); } @@ -925,11 +924,11 @@ zvol_close(struct g_provider *pp, int flag, int count) zvol_state_t *zv; int error = 0; - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); zv = pp->private; if (zv == NULL) { - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (ENXIO); } @@ -952,7 +951,7 @@ zvol_close(struct g_provider *pp, int flag, int count) if (zv->zv_total_opens == 0) zvol_last_close(zv); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (error); } @@ -1571,12 +1570,12 @@ zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp) int error = 0; rl_t *rl; - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); zv = zfsdev_get_soft_state(getminor(dev), ZSST_ZVOL); if (zv == NULL) { - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (ENXIO); } ASSERT(zv->zv_total_opens > 0); @@ -1590,7 +1589,7 @@ zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp) dki.dki_ctype = DKC_UNKNOWN; dki.dki_unit = getminor(dev); dki.dki_maxtransfer = 1 << (SPA_MAXBLOCKSHIFT - zv->zv_min_bs); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); if (ddi_copyout(&dki, (void *)arg, sizeof (dki), flag)) error = EFAULT; return (error); @@ -1600,7 +1599,7 @@ zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp) dkm.dki_lbsize = 1U << zv->zv_min_bs; dkm.dki_capacity = zv->zv_volsize >> zv->zv_min_bs; dkm.dki_media_type = DK_UNKNOWN; - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); if (ddi_copyout(&dkm, (void *)arg, sizeof (dkm), flag)) error = EFAULT; return (error); @@ -1610,14 +1609,14 @@ zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp) uint64_t vs = zv->zv_volsize; uint8_t bs = zv->zv_min_bs; - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); error = zvol_getefi((void *)arg, flag, vs, bs); return (error); } case DKIOCFLUSHWRITECACHE: dkc = (struct dk_callback *)arg; - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); zil_commit(zv->zv_zilog, ZVOL_OBJ); if ((flag & FKIOCTL) && dkc != NULL && dkc->dkc_callback) { (*dkc->dkc_callback)(dkc->dkc_cookie, error); @@ -1643,10 +1642,10 @@ zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp) } if (wce) { zv->zv_flags |= ZVOL_WCE; - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); } else { zv->zv_flags &= ~ZVOL_WCE; - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); zil_commit(zv->zv_zilog, ZVOL_OBJ); } return (0); @@ -1682,7 +1681,7 @@ zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp) break; } - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); return (error); } #endif /* sun */ @@ -1698,14 +1697,12 @@ zvol_init(void) { VERIFY(ddi_soft_state_init(&zfsdev_state, sizeof (zfs_soft_state_t), 1) == 0); - mutex_init(&zfsdev_state_lock, NULL, MUTEX_DEFAULT, NULL); ZFS_LOG(1, "ZVOL Initialized."); } void zvol_fini(void) { - mutex_destroy(&zfsdev_state_lock); ddi_soft_state_fini(&zfsdev_state); ZFS_LOG(1, "ZVOL Deinitialized."); } @@ -1720,7 +1717,7 @@ zvol_dump_init(zvol_state_t *zv, boolean_t resize) nvlist_t *nv = NULL; uint64_t version = spa_version(dmu_objset_spa(zv->zv_objset)); - ASSERT(MUTEX_HELD(&zfsdev_state_lock)); + ASSERT(MUTEX_HELD(&spa_namespace_lock)); error = dmu_free_long_range(zv->zv_objset, ZVOL_OBJ, 0, DMU_OBJECT_END); /* wait for dmu_free_long_range to actually free the blocks */ @@ -2230,7 +2227,7 @@ zvol_rename_minor(struct g_geom *gp, const char *newname) struct g_provider *pp; zvol_state_t *zv; - ASSERT(MUTEX_HELD(&zfsdev_state_lock)); + ASSERT(MUTEX_HELD(&spa_namespace_lock)); g_topology_assert(); pp = LIST_FIRST(&gp->provider); @@ -2264,7 +2261,7 @@ zvol_rename_minors(const char *oldname, const char *newname) newnamelen = strlen(newname); DROP_GIANT(); - mutex_enter(&zfsdev_state_lock); + mutex_enter(&spa_namespace_lock); g_topology_lock(); LIST_FOREACH(gp, &zfs_zvol_class.geom, geom) { @@ -2287,6 +2284,6 @@ zvol_rename_minors(const char *oldname, const char *newname) } g_topology_unlock(); - mutex_exit(&zfsdev_state_lock); + mutex_exit(&spa_namespace_lock); PICKUP_GIANT(); } From a0108be612e95840896942276f0da60e6caf000b Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Fri, 12 Aug 2011 10:52:46 +0000 Subject: [PATCH 218/452] Test *at(2) calls with capability-mode lookup. This commit adds regression testing for openat(), fstatat(), etc. with capability scoping ("strict relative" lookup), which applies: - in capability mode - when performing any *at() lookup relative to a capability These tests will fail until the *at() code is committed; on my local instance, with the *at() changes, they all pass. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- tools/regression/security/cap_test/Makefile | 4 +- tools/regression/security/cap_test/cap_test.c | 1 + tools/regression/security/cap_test/cap_test.h | 4 +- .../security/cap_test/cap_test_relative.c | 151 ++++++++++++++++++ 4 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 tools/regression/security/cap_test/cap_test_relative.c diff --git a/tools/regression/security/cap_test/Makefile b/tools/regression/security/cap_test/Makefile index 49e308e74bd..4bbb5484642 100644 --- a/tools/regression/security/cap_test/Makefile +++ b/tools/regression/security/cap_test/Makefile @@ -5,7 +5,9 @@ SRCS= cap_test.c \ cap_test_capmode.c \ cap_test_capabilities.c \ cap_test_fcntl.c \ - cap_test_sysctl.c + cap_test_relative.c \ + cap_test_sysctl.c \ + WARNS= 3 NO_MAN= diff --git a/tools/regression/security/cap_test/cap_test.c b/tools/regression/security/cap_test/cap_test.c index dfda4d60426..c5834541eb2 100644 --- a/tools/regression/security/cap_test/cap_test.c +++ b/tools/regression/security/cap_test/cap_test.c @@ -49,6 +49,7 @@ struct test all_tests[] = { TEST_INIT(capmode), TEST_INIT(capabilities), TEST_INIT(fcntl), + TEST_INIT(relative), TEST_INIT(sysctl), }; int test_count = sizeof(all_tests) / sizeof(struct test); diff --git a/tools/regression/security/cap_test/cap_test.h b/tools/regression/security/cap_test/cap_test.h index 1839e01c482..23435d6ed28 100644 --- a/tools/regression/security/cap_test/cap_test.h +++ b/tools/regression/security/cap_test/cap_test.h @@ -148,8 +148,8 @@ int execute(int id, struct test*); int test_capmode(void); int test_capabilities(void); -int test_syscalls(void); -int test_sysctl(void); int test_fcntl(void); +int test_relative(void); +int test_sysctl(void); #endif /* CAP_TEST_H */ diff --git a/tools/regression/security/cap_test/cap_test_relative.c b/tools/regression/security/cap_test/cap_test_relative.c new file mode 100644 index 00000000000..1f62e848e07 --- /dev/null +++ b/tools/regression/security/cap_test/cap_test_relative.c @@ -0,0 +1,151 @@ +/*- + * Copyright (c) 2009-2011 Robert N. M. Watson + * Copyright (c) 2011 Jonathan Anderson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "cap_test.h" + +/* + * Test openat(2) in a variety of sitations to ensure that it obeys Capsicum + * "strict relative" rules: + * + * 1. Use strict relative lookups in capability mode or when operating + * relative to a capability. + * 2. When performing strict relative lookups, absolute paths (including + * symlinks to absolute paths) are not allowed, nor are paths containing + * '..' components. + */ +int +test_relative(void) +{ + int success = PASSED; + int fd, etc, etc_cap, etc_cap_ro, etc_cap_base, etc_cap_all; + cap_rights_t baserights = CAP_READ | CAP_WRITE | CAP_SEEK | CAP_LOOKUP; + cap_rights_t rights; + + REQUIRE(etc = open("/etc/", O_RDONLY)); + CHECK_SYSCALL_FAILS(EINVAL, cap_getrights, etc, &rights); + + MAKE_CAPABILITY(etc_cap, etc, CAP_READ); + MAKE_CAPABILITY(etc_cap_ro, etc, CAP_READ | CAP_LOOKUP); + MAKE_CAPABILITY(etc_cap_base, etc, baserights); + MAKE_CAPABILITY(etc_cap_all, etc, CAP_MASK_VALID); + + /* + * openat(2) with regular file descriptors in non-capability mode + * should Just Work (tm). + */ + CHECK_SYSCALL_SUCCEEDS(openat, etc, "/etc/passwd", O_RDONLY); + CHECK_SYSCALL_SUCCEEDS(openat, AT_FDCWD, "/etc/passwd", O_RDONLY); + CHECK_SYSCALL_SUCCEEDS(openat, etc, "passwd", O_RDONLY); + CHECK_SYSCALL_SUCCEEDS(openat, etc, "../etc/passwd", O_RDONLY); + + /* + * Lookups relative to capabilities should be strictly relative. + * + * When not in capability mode, we don't actually require CAP_LOOKUP. + */ + CHECK_SYSCALL_SUCCEEDS(openat, etc_cap_ro, "passwd", O_RDONLY); + CHECK_SYSCALL_SUCCEEDS(openat, etc_cap_base, "passwd", O_RDONLY); + CHECK_SYSCALL_SUCCEEDS(openat, etc_cap_all, "passwd", O_RDONLY); + + CHECK_NOTCAPABLE(openat, etc_cap_ro, "../etc/passwd", O_RDONLY); + CHECK_NOTCAPABLE(openat, etc_cap_base, "../etc/passwd", O_RDONLY); + + /* + * This requires discussion: do we treat a capability with + * CAP_MASK_VALID *exactly* like a non-capability file descriptor + * (currently, the implementation says yes)? + */ + CHECK_SYSCALL_SUCCEEDS(openat, etc_cap_all, "../etc/passwd", O_RDONLY); + + /* + * A file opened relative to a capability should itself be a capability. + */ + CHECK_SYSCALL_SUCCEEDS(cap_getrights, etc_cap_base, &rights); + + REQUIRE(fd = openat(etc_cap_base, "passwd", O_RDONLY)); + CHECK_SYSCALL_SUCCEEDS(cap_getrights, fd, &rights); + CHECK_RIGHTS(rights, baserights); + + /* + * Enter capability mode; now ALL lookups are strictly relative. + */ + REQUIRE(cap_enter()); + + /* + * Relative lookups on regular files or capabilities with CAP_LOOKUP + * ought to succeed. + */ + CHECK_SYSCALL_SUCCEEDS(openat, etc, "passwd", O_RDONLY); + CHECK_SYSCALL_SUCCEEDS(openat, etc_cap_ro, "passwd", O_RDONLY); + CHECK_SYSCALL_SUCCEEDS(openat, etc_cap_base, "passwd", O_RDONLY); + CHECK_SYSCALL_SUCCEEDS(openat, etc_cap_all, "passwd", O_RDONLY); + + /* + * Lookup relative to capabilities without CAP_LOOKUP should fail. + */ + CHECK_NOTCAPABLE(openat, etc_cap, "passwd", O_RDONLY); + + /* + * Absolute lookups should fail. + */ + CHECK_CAPMODE(openat, AT_FDCWD, "/etc/passwd", O_RDONLY); + CHECK_NOTCAPABLE(openat, etc, "/etc/passwd", O_RDONLY); + + /* + * Lookups containing '..' should fail in capability mode. + */ + CHECK_NOTCAPABLE(openat, etc, "../etc/passwd", O_RDONLY); + CHECK_NOTCAPABLE(openat, etc_cap_ro, "../etc/passwd", O_RDONLY); + CHECK_NOTCAPABLE(openat, etc_cap_base, "../etc/passwd", O_RDONLY); + + REQUIRE(fd = openat(etc, "passwd", O_RDONLY)); + CHECK_SYSCALL_SUCCEEDS(cap_getrights, fd, &rights); + + /* + * A file opened relative to a capability should itself be a capability. + */ + REQUIRE(fd = openat(etc_cap_base, "passwd", O_RDONLY)); + CHECK_SYSCALL_SUCCEEDS(cap_getrights, fd, &rights); + CHECK_RIGHTS(rights, baserights); + + return success; +} From 47ce3d9a0b6fdbce59c3bf973eda1759acc3c206 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Fri, 12 Aug 2011 11:43:56 +0000 Subject: [PATCH 219/452] Reorder and renumber capability rights. This patch does three things: - puts capability rights in a more pleasing declaration order - changes mask values to match the new declaration order - declare new rights which will be used soon (e.g. CAP_LOOKUP, CAP_MKDIR) Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- sys/sys/capability.h | 64 +++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/sys/sys/capability.h b/sys/sys/capability.h index bd1d0608757..0f621f4f59f 100644 --- a/sys/sys/capability.h +++ b/sys/sys/capability.h @@ -76,30 +76,38 @@ #define CAP_FSTAT 0x0000000000010000ULL #define CAP_FSTATFS 0x0000000000020000ULL #define CAP_FUTIMES 0x0000000000040000ULL +#define CAP_CREATE 0x0000000000080000ULL +#define CAP_DELETE 0x0000000000100000ULL +#define CAP_MKDIR 0x0000000000200000ULL +#define CAP_RMDIR 0x0000000000400000ULL +#define CAP_MKFIFO 0x0000000000800000ULL + +/* Lookups - used to constrain *at() calls. */ +#define CAP_LOOKUP 0x0000000001000000ULL /* Extended attributes. */ -#define CAP_EXTATTR_DELETE 0x0000000000080000ULL -#define CAP_EXTATTR_GET 0x0000000000100000ULL -#define CAP_EXTATTR_LIST 0x0000000000200000ULL -#define CAP_EXTATTR_SET 0x0000000000400000ULL +#define CAP_EXTATTR_DELETE 0x0000000002000000ULL +#define CAP_EXTATTR_GET 0x0000000004000000ULL +#define CAP_EXTATTR_LIST 0x0000000008000000ULL +#define CAP_EXTATTR_SET 0x0000000010000000ULL /* Access Control Lists. */ -#define CAP_ACL_CHECK 0x0000000000800000ULL -#define CAP_ACL_DELETE 0x0000000001000000ULL -#define CAP_ACL_GET 0x0000000002000000ULL -#define CAP_ACL_SET 0x0000000004000000ULL +#define CAP_ACL_CHECK 0x0000000020000000ULL +#define CAP_ACL_DELETE 0x0000000040000000ULL +#define CAP_ACL_GET 0x0000000080000000ULL +#define CAP_ACL_SET 0x0000000100000000ULL /* Socket operations. */ -#define CAP_ACCEPT 0x0000000008000000ULL -#define CAP_BIND 0x0000000010000000ULL -#define CAP_CONNECT 0x0000000020000000ULL -#define CAP_GETPEERNAME 0x0000000040000000ULL -#define CAP_GETSOCKNAME 0x0000000080000000ULL -#define CAP_GETSOCKOPT 0x0000000100000000ULL -#define CAP_LISTEN 0x0000000200000000ULL -#define CAP_PEELOFF 0x0000000400000000ULL -#define CAP_SETSOCKOPT 0x0000000800000000ULL -#define CAP_SHUTDOWN 0x0000001000000000ULL +#define CAP_ACCEPT 0x0000000200000000ULL +#define CAP_BIND 0x0000000400000000ULL +#define CAP_CONNECT 0x0000000800000000ULL +#define CAP_GETPEERNAME 0x0000001000000000ULL +#define CAP_GETSOCKNAME 0x0000002000000000ULL +#define CAP_GETSOCKOPT 0x0000004000000000ULL +#define CAP_LISTEN 0x0000008000000000ULL +#define CAP_PEELOFF 0x0000010000000000ULL +#define CAP_SETSOCKOPT 0x0000020000000000ULL +#define CAP_SHUTDOWN 0x0000040000000000ULL #define CAP_SOCK_ALL \ (CAP_ACCEPT | CAP_BIND | CAP_CONNECT \ @@ -107,24 +115,24 @@ | CAP_LISTEN | CAP_PEELOFF | CAP_SETSOCKOPT | CAP_SHUTDOWN) /* Mandatory Access Control. */ -#define CAP_MAC_GET 0x0000002000000000ULL -#define CAP_MAC_SET 0x0000004000000000ULL +#define CAP_MAC_GET 0x0000080000000000ULL +#define CAP_MAC_SET 0x0000100000000000ULL /* Methods on semaphores. */ -#define CAP_SEM_GETVALUE 0x0000008000000000ULL -#define CAP_SEM_POST 0x0000010000000000ULL -#define CAP_SEM_WAIT 0x0000020000000000ULL +#define CAP_SEM_GETVALUE 0x0000200000000000ULL +#define CAP_SEM_POST 0x0000400000000000ULL +#define CAP_SEM_WAIT 0x0000800000000000ULL /* kqueue events. */ -#define CAP_POLL_KEVENT 0x0000040000000000ULL -#define CAP_POST_KEVENT 0x0000080000000000ULL +#define CAP_POLL_KEVENT 0x0001000000000000ULL +#define CAP_POST_KEVENT 0x0002000000000000ULL /* Strange and powerful rights that should not be given lightly. */ -#define CAP_IOCTL 0x0000100000000000ULL -#define CAP_TTYHOOK 0x0000200000000000ULL +#define CAP_IOCTL 0x0004000000000000ULL +#define CAP_TTYHOOK 0x0008000000000000ULL /* The mask of all valid method rights. */ -#define CAP_MASK_VALID 0x00003fffffffffffULL +#define CAP_MASK_VALID 0x000fffffffffffffULL #ifdef _KERNEL From d1b6899e83a28eedca46b95bb090e3e476642166 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Fri, 12 Aug 2011 14:26:47 +0000 Subject: [PATCH 220/452] Rename CAP_*_KEVENT to CAP_*_EVENT. Change the names of a couple of capability rights to be less FreeBSD-specific. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- sys/kern/kern_event.c | 6 +++--- sys/kern/sys_generic.c | 2 +- sys/kern/uipc_mqueue.c | 4 ++-- sys/sys/capability.h | 4 ++-- tools/regression/security/cap_test/cap_test_capabilities.c | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 6ec8503d569..e282cd537a8 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -817,7 +817,7 @@ kern_kevent(struct thread *td, int fd, int nchanges, int nevents, struct file *fp; int i, n, nerrors, error; - if ((error = fget(td, fd, CAP_POST_KEVENT, &fp)) != 0) + if ((error = fget(td, fd, CAP_POST_EVENT, &fp)) != 0) return (error); if ((error = kqueue_acquire(fp, &kq)) != 0) goto done_norel; @@ -973,7 +973,7 @@ kqueue_register(struct kqueue *kq, struct kevent *kev, struct thread *td, int wa findkn: if (fops->f_isfd) { KASSERT(td != NULL, ("td is NULL")); - error = fget(td, kev->ident, CAP_POLL_KEVENT, &fp); + error = fget(td, kev->ident, CAP_POLL_EVENT, &fp); if (error) goto done; @@ -2182,7 +2182,7 @@ kqfd_register(int fd, struct kevent *kev, struct thread *td, int waitok) struct file *fp; int error; - if ((error = fget(td, fd, CAP_POST_KEVENT, &fp)) != 0) + if ((error = fget(td, fd, CAP_POST_EVENT, &fp)) != 0) return (error); if ((error = kqueue_acquire(fp, &kq)) != 0) goto noacquire; diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index f94be5a6e86..7dc69a6e1d0 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1072,7 +1072,7 @@ getselfd_cap(struct filedesc *fdp, int fd, struct file **fpp) * If the file descriptor is for a capability, test rights and use * the file descriptor references by the capability. */ - error = cap_funwrap(fp, CAP_POLL_KEVENT, &fp_fromcap); + error = cap_funwrap(fp, CAP_POLL_EVENT, &fp_fromcap); if (error) { fdrop(fp, curthread); return (error); diff --git a/sys/kern/uipc_mqueue.c b/sys/kern/uipc_mqueue.c index e13912c4aca..0ca4161d50c 100644 --- a/sys/kern/uipc_mqueue.c +++ b/sys/kern/uipc_mqueue.c @@ -2119,7 +2119,7 @@ static __inline int getmq(struct thread *td, int fd, struct file **fpp, struct mqfs_node **ppn, struct mqueue **pmq) { - return _getmq(td, fd, CAP_POLL_KEVENT, fget, fpp, ppn, pmq); + return _getmq(td, fd, CAP_POLL_EVENT, fget, fpp, ppn, pmq); } static __inline int @@ -2274,7 +2274,7 @@ again: error = EBADF; goto out; } - error = cap_funwrap(fp2, CAP_POLL_KEVENT, &fp2); + error = cap_funwrap(fp2, CAP_POLL_EVENT, &fp2); if (error) { FILEDESC_SUNLOCK(fdp); goto out; diff --git a/sys/sys/capability.h b/sys/sys/capability.h index 0f621f4f59f..54fcaa06bf6 100644 --- a/sys/sys/capability.h +++ b/sys/sys/capability.h @@ -124,8 +124,8 @@ #define CAP_SEM_WAIT 0x0000800000000000ULL /* kqueue events. */ -#define CAP_POLL_KEVENT 0x0001000000000000ULL -#define CAP_POST_KEVENT 0x0002000000000000ULL +#define CAP_POLL_EVENT 0x0001000000000000ULL +#define CAP_POST_EVENT 0x0002000000000000ULL /* Strange and powerful rights that should not be given lightly. */ #define CAP_IOCTL 0x0004000000000000ULL diff --git a/tools/regression/security/cap_test/cap_test_capabilities.c b/tools/regression/security/cap_test/cap_test_capabilities.c index 47c0142f4da..ab1c58f047c 100644 --- a/tools/regression/security/cap_test/cap_test_capabilities.c +++ b/tools/regression/security/cap_test/cap_test_capabilities.c @@ -237,8 +237,8 @@ test_capabilities(void) TRY(fd, CAP_MMAP | CAP_MAPEXEC | CAP_WRITE); TRY(fd, CAP_MMAP | CAP_READ | CAP_WRITE | CAP_MAPEXEC); TRY(fd, CAP_FCNTL); - TRY(fd, CAP_POST_KEVENT); - TRY(fd, CAP_POLL_KEVENT); + TRY(fd, CAP_POST_EVENT); + TRY(fd, CAP_POLL_EVENT); TRY(fd, CAP_FSYNC); TRY(fd, CAP_FCHOWN); TRY(fd, CAP_FCHMOD); From de46193396f5a04796af77ccb5379678271034c0 Mon Sep 17 00:00:00 2001 From: Matt Jacob Date: Fri, 12 Aug 2011 19:51:28 +0000 Subject: [PATCH 221/452] Fixes zombie device and loop down timers so that they work more than once. Use taskqueues to do the actual work. Fix an offset line. Fix isp_prt so that prints from just one buffer, which makes it appear cleanly cleanly in logs on SMP systems. Approved by: re (kib) MFC after: 1 month --- sys/dev/isp/isp_freebsd.c | 42 +++++++++++++++++++++++++++++++++------ sys/dev/isp/isp_freebsd.h | 3 +++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c index 4a664bfb9a3..120ae11e5bf 100644 --- a/sys/dev/isp/isp_freebsd.c +++ b/sys/dev/isp/isp_freebsd.c @@ -67,7 +67,10 @@ static void isp_intr_enable(void *); static void isp_cam_async(void *, uint32_t, struct cam_path *, void *); static void isp_poll(struct cam_sim *); static timeout_t isp_watchdog; +static timeout_t isp_gdt; +static task_fn_t isp_gdt_task; static timeout_t isp_ldt; +static task_fn_t isp_ldt_task; static void isp_kthread(void *); static void isp_action(struct cam_sim *, union ccb *); #ifdef ISP_INTERNAL_TARGET @@ -141,8 +144,11 @@ isp_attach_chan(ispsoftc_t *isp, struct cam_devq *devq, int chan) fc->path = path; fc->isp = isp; fc->ready = 1; + callout_init_mtx(&fc->ldt, &isp->isp_osinfo.lock, 0); callout_init_mtx(&fc->gdt, &isp->isp_osinfo.lock, 0); + TASK_INIT(&fc->ltask, 1, isp_ldt_task, fc); + TASK_INIT(&fc->gtask, 1, isp_gdt_task, fc); /* * We start by being "loop down" if we have an initiator role @@ -3935,6 +3941,13 @@ isp_make_gone(ispsoftc_t *isp, int chan, int tgt) */ static void isp_gdt(void *arg) +{ + struct isp_fc *fc = arg; + taskqueue_enqueue(taskqueue_thread, &fc->gtask); +} + +static void +isp_gdt_task(void *arg, int pending) { struct isp_fc *fc = arg; ispsoftc_t *isp = fc->isp; @@ -3942,7 +3955,8 @@ isp_gdt(void *arg) fcportdb_t *lp; int dbidx, tgt, more_to_do = 0; - isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Chan %d GDT timer expired @ %lu", chan, (unsigned long) time_uptime); + ISP_LOCK(isp); + isp_prt(isp, ISP_LOGDEBUG0, "Chan %d GDT timer expired", chan); for (dbidx = 0; dbidx < MAX_FC_TARG; dbidx++) { lp = &FCPARAM(isp, chan)->portdb[dbidx]; @@ -3953,6 +3967,7 @@ isp_gdt(void *arg) continue; } if (lp->gone_timer != 0) { + isp_prt(isp, ISP_LOGSANCFG, "%s: Chan %d more to do for target %u (timer=%u)", __func__, chan, lp->dev_map_idx - 1, lp->gone_timer); lp->gone_timer -= 1; more_to_do++; continue; @@ -3968,9 +3983,11 @@ isp_gdt(void *arg) if (more_to_do) { callout_reset(&fc->gdt, hz, isp_gdt, fc); } else { - isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Chan %d Stopping Gone Device Timer", chan); + callout_deactivate(&fc->gdt); + isp_prt(isp, ISP_LOGSANCFG, "Chan %d Stopping Gone Device Timer @ %lu", chan, (unsigned long) time_uptime); } } + ISP_UNLOCK(isp); } /* @@ -3984,6 +4001,13 @@ isp_gdt(void *arg) */ static void isp_ldt(void *arg) +{ + struct isp_fc *fc = arg; + taskqueue_enqueue(taskqueue_thread, &fc->ltask); +} + +static void +isp_ldt_task(void *arg, int pending) { struct isp_fc *fc = arg; ispsoftc_t *isp = fc->isp; @@ -3991,7 +4015,9 @@ isp_ldt(void *arg) fcportdb_t *lp; int dbidx, tgt; + ISP_LOCK(isp); isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Chan %d Loop Down Timer expired @ %lu", chan, (unsigned long) time_uptime); + callout_deactivate(&fc->ldt); /* * Notify to the OS all targets who we now consider have departed. @@ -4631,7 +4657,7 @@ isp_action(struct cam_sim *sim, union ccb *ccb) if (kp->xport_specific.fc.valid & KNOB_VALID_ADDRESS) { fcp->isp_wwnn = ISP_FC_PC(isp, bus)->def_wwnn = kp->xport_specific.fc.wwnn; fcp->isp_wwpn = ISP_FC_PC(isp, bus)->def_wwpn = kp->xport_specific.fc.wwpn; -isp_prt(isp, ISP_LOGALL, "Setting Channel %d wwns to 0x%jx 0x%jx", bus, fcp->isp_wwnn, fcp->isp_wwpn); + isp_prt(isp, ISP_LOGALL, "Setting Channel %d wwns to 0x%jx 0x%jx", bus, fcp->isp_wwnn, fcp->isp_wwpn); } ccb->ccb_h.status = CAM_REQ_CMP; if (kp->xport_specific.fc.valid & KNOB_VALID_ROLE) { @@ -5423,15 +5449,19 @@ isp_default_wwn(ispsoftc_t * isp, int chan, int isactive, int iswwnn) void isp_prt(ispsoftc_t *isp, int level, const char *fmt, ...) { + int loc; + char lbuf[128]; va_list ap; + if (level != ISP_LOGALL && (level & isp->isp_dblev) == 0) { return; } - printf("%s: ", device_get_nameunit(isp->isp_dev)); + sprintf(lbuf, "%s: ", device_get_nameunit(isp->isp_dev)); + loc = strlen(lbuf); va_start(ap, fmt); - vprintf(fmt, ap); + vsnprintf(&lbuf[loc], sizeof (lbuf) - loc - 1, fmt, ap); va_end(ap); - printf("\n"); + printf("%s\n", lbuf); } void diff --git a/sys/dev/isp/isp_freebsd.h b/sys/dev/isp/isp_freebsd.h index 0d67630ec35..cfa2fd541d1 100644 --- a/sys/dev/isp/isp_freebsd.h +++ b/sys/dev/isp/isp_freebsd.h @@ -41,6 +41,7 @@ #include #include +#include #include #include @@ -182,6 +183,8 @@ struct isp_fc { ready : 1; struct callout ldt; /* loop down timer */ struct callout gdt; /* gone device timer */ + struct task ltask; + struct task gtask; #ifdef ISP_TARGET_MODE struct tslist lun_hash[LUN_HASH_SIZE]; #ifdef ISP_INTERNAL_TARGET From 15975b7bc274304696c3eff67aa9ecb32f580174 Mon Sep 17 00:00:00 2001 From: Matt Jacob Date: Fri, 12 Aug 2011 20:09:38 +0000 Subject: [PATCH 222/452] Fixes for sure bus reference miscounting and potential device and target reference miscounts. It also adds a helper function to get the current reference counts for components of cam_path for debug aid. One minor style(9) change. Partially Obtained from: Chuck Tuffli (Emulex) Reviewed by: scsi@ (ken) Approved by: re (kib) MFC after: 1 month --- sys/cam/cam_xpt.c | 71 +++++++++++++++++++++++++++++++++++++---------- sys/cam/cam_xpt.h | 4 ++- 2 files changed, 59 insertions(+), 16 deletions(-) diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index 013c415d7c7..10b89c77b9b 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -3336,8 +3336,10 @@ xpt_create_path_unlocked(struct cam_path **new_path_ptr, } } status = xpt_compile_path(path, periph, path_id, target_id, lun_id); - if (need_unlock) + if (need_unlock) { CAM_SIM_UNLOCK(bus->sim); + xpt_release_bus(bus); + } if (status != CAM_REQ_CMP) { free(path, M_CAMXPT); path = NULL; @@ -3445,6 +3447,38 @@ xpt_free_path(struct cam_path *path) free(path, M_CAMXPT); } +void +xpt_path_counts(struct cam_path *path, uint32_t *bus_ref, + uint32_t *periph_ref, uint32_t *target_ref, uint32_t *device_ref) +{ + + mtx_lock(&xsoftc.xpt_topo_lock); + if (bus_ref) { + if (path->bus) + *bus_ref = path->bus->refcount; + else + *bus_ref = 0; + } + mtx_unlock(&xsoftc.xpt_topo_lock); + if (periph_ref) { + if (path->periph) + *periph_ref = path->periph->refcount; + else + *periph_ref = 0; + } + if (target_ref) { + if (path->target) + *target_ref = path->target->refcount; + else + *target_ref = 0; + } + if (device_ref) { + if (path->device) + *device_ref = path->device->refcount; + else + *device_ref = 0; + } +} /* * Return -1 for failure, 0 for exact match, 1 for match with wildcards @@ -4264,15 +4298,17 @@ static void xpt_release_bus(struct cam_eb *bus) { + mtx_lock(&xsoftc.xpt_topo_lock); + KASSERT(bus->refcount >= 1, ("bus->refcount >= 1")); if ((--bus->refcount == 0) && (TAILQ_FIRST(&bus->et_entries) == NULL)) { - mtx_lock(&xsoftc.xpt_topo_lock); TAILQ_REMOVE(&xsoftc.xpt_busses, bus, links); xsoftc.bus_generation++; mtx_unlock(&xsoftc.xpt_topo_lock); cam_sim_release(bus->sim); free(bus, M_CAMXPT); - } + } else + mtx_unlock(&xsoftc.xpt_topo_lock); } static struct cam_et * @@ -4296,7 +4332,9 @@ xpt_alloc_target(struct cam_eb *bus, target_id_t target_id) * Hold a reference to our parent bus so it * will not go away before we do. */ + mtx_lock(&xsoftc.xpt_topo_lock); bus->refcount++; + mtx_unlock(&xsoftc.xpt_topo_lock); /* Insertion sort into our bus's target list */ cur_target = TAILQ_FIRST(&bus->et_entries); @@ -4317,15 +4355,17 @@ static void xpt_release_target(struct cam_et *target) { - if ((--target->refcount == 0) - && (TAILQ_FIRST(&target->ed_entries) == NULL)) { - TAILQ_REMOVE(&target->bus->et_entries, target, links); - target->bus->generation++; - xpt_release_bus(target->bus); - if (target->luns) - free(target->luns, M_CAMXPT); - free(target, M_CAMXPT); - } + if (target->refcount == 1) { + if (TAILQ_FIRST(&target->ed_entries) == NULL) { + TAILQ_REMOVE(&target->bus->et_entries, target, links); + target->bus->generation++; + xpt_release_bus(target->bus); + if (target->luns) + free(target->luns, M_CAMXPT); + free(target, M_CAMXPT); + } + } else + target->refcount--; } static struct cam_ed * @@ -4422,7 +4462,7 @@ void xpt_release_device(struct cam_ed *device) { - if (--device->refcount == 0) { + if (device->refcount == 1) { struct cam_devq *devq; if (device->alloc_ccb_entry.pinfo.index != CAM_UNQUEUED_INDEX @@ -4430,7 +4470,7 @@ xpt_release_device(struct cam_ed *device) panic("Removing device while still queued for ccbs"); if ((device->flags & CAM_DEV_REL_TIMEOUT_PENDING) != 0) - callout_stop(&device->callout); + callout_stop(&device->callout); TAILQ_REMOVE(&device->target->ed_entries, device,links); device->target->generation++; @@ -4442,7 +4482,8 @@ xpt_release_device(struct cam_ed *device) cam_ccbq_fini(&device->ccbq); xpt_release_target(device->target); free(device, M_CAMXPT); - } + } else + device->refcount--; } u_int32_t diff --git a/sys/cam/cam_xpt.h b/sys/cam/cam_xpt.h index f7d9b428cb7..1d0e7f7d238 100644 --- a/sys/cam/cam_xpt.h +++ b/sys/cam/cam_xpt.h @@ -106,6 +106,9 @@ cam_status xpt_create_path_unlocked(struct cam_path **new_path_ptr, int xpt_getattr(char *buf, size_t len, const char *attr, struct cam_path *path); void xpt_free_path(struct cam_path *path); +void xpt_path_counts(struct cam_path *path, uint32_t *bus_ref, + uint32_t *periph_ref, uint32_t *target_ref, + uint32_t *device_ref); int xpt_path_comp(struct cam_path *path1, struct cam_path *path2); void xpt_print_path(struct cam_path *path); @@ -138,4 +141,3 @@ void xpt_release_path(struct cam_path *path); #endif /* _KERNEL */ #endif /* _CAM_CAM_XPT_H */ - From 69d377fe1bd79cb7e932275504af3120791960bd Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Sat, 13 Aug 2011 09:21:16 +0000 Subject: [PATCH 223/452] Allow Capsicum capabilities to delegate constrained access to file system subtrees to sandboxed processes. - Use of absolute paths and '..' are limited in capability mode. - Use of absolute paths and '..' are limited when looking up relative to a capability. - When a name lookup is performed, identify what operation is to be performed (such as CAP_MKDIR) as well as check for CAP_LOOKUP. With these constraints, openat() and friends are now safe in capability mode, and can then be used by code such as the capability-mode runtime linker. Approved by: re (bz), mentor (rwatson) Sponsored by: Google Inc --- sys/kern/kern_descrip.c | 10 ++++ sys/kern/sys_capability.c | 18 +++--- sys/kern/vfs_lookup.c | 41 +++++++++++-- sys/kern/vfs_syscalls.c | 120 +++++++++++++++++++++++++++----------- sys/sys/capability.h | 2 +- sys/sys/namei.h | 18 +++++- 6 files changed, 157 insertions(+), 52 deletions(-) diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 3082aea810d..cf4ecedb698 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -2335,6 +2335,16 @@ _fget(struct thread *td, int fd, struct file **fpp, int flags, } #ifdef CAPABILITIES + /* + * If this is a capability, what rights does it have? + */ + if (haverightsp != NULL) { + if (fp->f_type == DTYPE_CAPABILITY) + *haverightsp = cap_rights(fp); + else + *haverightsp = CAP_MASK_VALID; + } + /* * If a capability has been requested, return the capability directly. * Otherwise, check capability rights, extract the underlying object, diff --git a/sys/kern/sys_capability.c b/sys/kern/sys_capability.c index b20fa62e123..37b646f8d7c 100644 --- a/sys/kern/sys_capability.c +++ b/sys/kern/sys_capability.c @@ -220,7 +220,7 @@ cap_new(struct thread *td, struct cap_new_args *uap) { int error, capfd; int fd = uap->fd; - struct file *fp, *fcapp; + struct file *fp; cap_rights_t rights = uap->rights; AUDIT_ARG_FD(fd); @@ -229,7 +229,7 @@ cap_new(struct thread *td, struct cap_new_args *uap) if (error) return (error); AUDIT_ARG_FILE(td->td_proc, fp); - error = kern_capwrap(td, fp, rights, &fcapp, &capfd); + error = kern_capwrap(td, fp, rights, &capfd); if (error) return (error); @@ -267,10 +267,10 @@ cap_getrights(struct thread *td, struct cap_getrights_args *uap) */ int kern_capwrap(struct thread *td, struct file *fp, cap_rights_t rights, - struct file **fcappp, int *capfdp) + int *capfdp) { struct capability *cp, *cp_old; - struct file *fp_object; + struct file *fp_object, *fcapp; int error; if ((rights | CAP_MASK_VALID) != CAP_MASK_VALID) @@ -290,7 +290,7 @@ kern_capwrap(struct thread *td, struct file *fp, cap_rights_t rights, /* * Allocate a new file descriptor to hang the capability off of. */ - error = falloc(td, fcappp, capfdp, fp->f_flag); + error = falloc(td, &fcapp, capfdp, fp->f_flag); if (error) return (error); @@ -309,18 +309,18 @@ kern_capwrap(struct thread *td, struct file *fp, cap_rights_t rights, cp = uma_zalloc(capability_zone, M_WAITOK | M_ZERO); cp->cap_rights = rights; cp->cap_object = fp_object; - cp->cap_file = *fcappp; + cp->cap_file = fcapp; if (fp->f_flag & DFLAG_PASSABLE) - finit(*fcappp, fp->f_flag, DTYPE_CAPABILITY, cp, + finit(fcapp, fp->f_flag, DTYPE_CAPABILITY, cp, &capability_ops); else - finit(*fcappp, fp->f_flag, DTYPE_CAPABILITY, cp, + finit(fcapp, fp->f_flag, DTYPE_CAPABILITY, cp, &capability_ops_unpassable); /* * Release our private reference (the proc filedesc still has one). */ - fdrop(*fcappp, td); + fdrop(fcapp, td); return (0); } diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c index ae8982fee0d..a14501704fa 100644 --- a/sys/kern/vfs_lookup.c +++ b/sys/kern/vfs_lookup.c @@ -180,6 +180,18 @@ namei(struct nameidata *ndp) if (!error && *cnp->cn_pnbuf == '\0') error = ENOENT; +#ifdef CAPABILITY_MODE + /* + * In capability mode, lookups must be "strictly relative" (i.e. + * not an absolute path, and not containing '..' components) to + * a real file descriptor, not the pseudo-descriptor AT_FDCWD. + */ + if (IN_CAPABILITY_MODE(td)) { + ndp->ni_strictrelative = 1; + if (ndp->ni_dirfd == AT_FDCWD) + error = ECAPMODE; + } +#endif if (error) { uma_zfree(namei_zone, cnp->cn_pnbuf); #ifdef DIAGNOSTIC @@ -214,12 +226,20 @@ namei(struct nameidata *ndp) AUDIT_ARG_ATFD1(ndp->ni_dirfd); if (cnp->cn_flags & AUDITVNODE2) AUDIT_ARG_ATFD2(ndp->ni_dirfd); -#ifdef CAPABILITY_MODE - KASSERT(!IN_CAPABILITY_MODE(td), - ("%s: reached %s:%d in capability mode", - __func__, __FILE__, __LINE__)); + error = fgetvp_rights(td, ndp->ni_dirfd, + ndp->ni_rightsneeded | CAP_LOOKUP, + &(ndp->ni_baserights), &dp); +#ifdef CAPABILITIES + /* + * Lookups relative to a capability must also be + * strictly relative. + * + * Note that a capability with rights CAP_MASK_VALID + * is treated exactly like a regular file descriptor. + */ + if (ndp->ni_baserights != CAP_MASK_VALID) + ndp->ni_strictrelative = 1; #endif - error = fgetvp(td, ndp->ni_dirfd, 0, &dp); } if (error != 0 || dp != NULL) { FILEDESC_SUNLOCK(fdp); @@ -261,6 +281,8 @@ namei(struct nameidata *ndp) if (*(cnp->cn_nameptr) == '/') { vrele(dp); VFS_UNLOCK_GIANT(vfslocked); + if (ndp->ni_strictrelative != 0) + return (ENOTCAPABLE); while (*(cnp->cn_nameptr) == '/') { cnp->cn_nameptr++; ndp->ni_pathlen--; @@ -604,7 +626,10 @@ dirloop: } /* - * Handle "..": four special cases. + * Handle "..": five special cases. + * 0. If doing a capability lookup, return ENOTCAPABLE (this is a + * fairly conservative design choice, but it's the only one that we + * are satisfied guarantees the property we're looking for). * 1. Return an error if this is the last component of * the name and the operation is DELETE or RENAME. * 2. If at root directory (e.g. after chroot) @@ -618,6 +643,10 @@ dirloop: * the jail or chroot, don't let them out. */ if (cnp->cn_flags & ISDOTDOT) { + if (ndp->ni_strictrelative != 0) { + error = ENOTCAPABLE; + goto bad; + } if ((cnp->cn_flags & ISLASTCN) != 0 && (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) { error = EINVAL; diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 7f855c0a832..3d2e1d49ada 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -993,6 +993,41 @@ change_root(vp, td) return (0); } +static __inline cap_rights_t +flags_to_rights(int flags) +{ + cap_rights_t rights = 0; + + switch ((flags & O_ACCMODE)) { + case O_RDONLY: + rights |= CAP_READ; + break; + + case O_RDWR: + rights |= CAP_READ; + /* fall through */ + + case O_WRONLY: + rights |= CAP_WRITE; + break; + + case O_EXEC: + rights |= CAP_FEXECVE; + break; + } + + if (flags & O_CREAT) + rights |= CAP_CREATE; + + if (flags & O_TRUNC) + rights |= CAP_FTRUNCATE; + + if ((flags & O_EXLOCK) || (flags & O_SHLOCK)) + rights |= CAP_FLOCK; + + return (rights); +} + /* * Check permissions, allocate an open file structure, and call the device * open routine if any. @@ -1055,10 +1090,12 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, struct flock lf; struct nameidata nd; int vfslocked; + cap_rights_t rights_needed = CAP_LOOKUP; AUDIT_ARG_FFLAGS(flags); AUDIT_ARG_MODE(mode); /* XXX: audit dirfd */ + rights_needed |= flags_to_rights(flags); /* * Only one of the O_EXEC, O_RDONLY, O_WRONLY and O_RDWR flags * may be specified. @@ -1082,8 +1119,8 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, /* Set the flags early so the finit in devfs can pick them up. */ fp->f_flag = flags & FMASK; cmode = ((mode &~ fdp->fd_cmask) & ALLPERMS) &~ S_ISTXT; - NDINIT_AT(&nd, LOOKUP, FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, fd, - td); + NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, + path, fd, rights_needed, td); td->td_dupfd = -1; /* XXX check for fdopen */ error = vn_open(&nd, &flags, cmode, fp); if (error) { @@ -1092,18 +1129,20 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, * wonderous happened deep below and we just pass it up * pretending we know what we do. */ - if (error == ENXIO && fp->f_ops != &badfileops) { - fdrop(fp, td); - td->td_retval[0] = indx; - return (0); - } + if (error == ENXIO && fp->f_ops != &badfileops) + goto success; /* * handle special fdopen() case. bleh. dupfdopen() is * responsible for dropping the old contents of ofiles[indx] * if it succeeds. + * + * Don't do this for relative (capability) lookups; we don't + * understand exactly what would happen, and we don't think + * that it ever should. */ - if ((error == ENODEV || error == ENXIO) && + if ((nd.ni_strictrelative == 0) && + (error == ENODEV || error == ENXIO) && (td->td_dupfd >= 0)) { /* XXX from fdopen */ if ((error = finstall(td, fp, &indx, flags)) != 0) @@ -1172,9 +1211,22 @@ success: /* * If we haven't already installed the FD (for dupfdopen), do so now. */ - if (indx == -1) - if ((error = finstall(td, fp, &indx, flags)) != 0) - goto bad_unlocked; + if (indx == -1) { +#ifdef CAPABILITIES + if (nd.ni_strictrelative == 1) { + /* + * We are doing a strict relative lookup; wrap the + * result in a capability. + */ + if ((error = kern_capwrap(td, fp, nd.ni_baserights, + &indx)) != 0) + goto bad_unlocked; + } else +#endif + if ((error = finstall(td, fp, &indx, flags)) != 0) + goto bad_unlocked; + + } /* * Release our private reference, leaving the one associated with @@ -1301,8 +1353,9 @@ kern_mknodat(struct thread *td, int fd, char *path, enum uio_seg pathseg, return (error); restart: bwillwrite(); - NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1, - pathseg, path, fd, td); + NDINIT_ATRIGHTS(&nd, CREATE, + LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1, pathseg, path, fd, + CAP_MKFIFO, td); if ((error = namei(&nd)) != 0) return (error); vfslocked = NDHASGIANT(&nd); @@ -2153,8 +2206,8 @@ kern_accessat(struct thread *td, int fd, char *path, enum uio_seg pathseg, } else cred = tmpcred = td->td_ucred; AUDIT_ARG_VALUE(mode); - NDINIT_AT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | MPSAFE | - AUDITVNODE1, pathseg, path, fd, td); + NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | MPSAFE | + AUDITVNODE1, pathseg, path, fd, CAP_FSTAT, td); if ((error = namei(&nd)) != 0) goto out1; vfslocked = NDHASGIANT(&nd); @@ -2363,9 +2416,9 @@ kern_statat_vnhook(struct thread *td, int flag, int fd, char *path, if (flag & ~AT_SYMLINK_NOFOLLOW) return (EINVAL); - NDINIT_AT(&nd, LOOKUP, ((flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : + NDINIT_ATRIGHTS(&nd, LOOKUP, ((flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : FOLLOW) | LOCKSHARED | LOCKLEAF | AUDITVNODE1 | MPSAFE, pathseg, - path, fd, td); + path, fd, CAP_FSTAT, td); if ((error = namei(&nd)) != 0) return (error); @@ -2920,8 +2973,8 @@ kern_fchmodat(struct thread *td, int fd, char *path, enum uio_seg pathseg, AUDIT_ARG_MODE(mode); follow = (flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : FOLLOW; - NDINIT_AT(&nd, LOOKUP, follow | MPSAFE | AUDITVNODE1, pathseg, path, - fd, td); + NDINIT_ATRIGHTS(&nd, LOOKUP, follow | MPSAFE | AUDITVNODE1, pathseg, + path, fd, CAP_FCHMOD, td); if ((error = namei(&nd)) != 0) return (error); vfslocked = NDHASGIANT(&nd); @@ -3063,8 +3116,8 @@ kern_fchownat(struct thread *td, int fd, char *path, enum uio_seg pathseg, AUDIT_ARG_OWNER(uid, gid); follow = (flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW : FOLLOW; - NDINIT_AT(&nd, LOOKUP, follow | MPSAFE | AUDITVNODE1, pathseg, path, - fd, td); + NDINIT_ATRIGHTS(&nd, LOOKUP, follow | MPSAFE | AUDITVNODE1, pathseg, + path, fd, CAP_FCHOWN, td); if ((error = namei(&nd)) != 0) return (error); @@ -3279,8 +3332,8 @@ kern_utimesat(struct thread *td, int fd, char *path, enum uio_seg pathseg, if ((error = getutimes(tptr, tptrseg, ts)) != 0) return (error); - NDINIT_AT(&nd, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, pathseg, path, - fd, td); + NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | MPSAFE | AUDITVNODE1, pathseg, + path, fd, CAP_FUTIMES, td); if ((error = namei(&nd)) != 0) return (error); @@ -3610,11 +3663,11 @@ kern_renameat(struct thread *td, int oldfd, char *old, int newfd, char *new, bwillwrite(); #ifdef MAC - NDINIT_AT(&fromnd, DELETE, LOCKPARENT | LOCKLEAF | SAVESTART | MPSAFE | - AUDITVNODE1, pathseg, old, oldfd, td); + NDINIT_ATRIGHTS(&fromnd, DELETE, LOCKPARENT | LOCKLEAF | SAVESTART | + MPSAFE | AUDITVNODE1, pathseg, old, oldfd, CAP_DELETE, td); #else - NDINIT_AT(&fromnd, DELETE, WANTPARENT | SAVESTART | MPSAFE | - AUDITVNODE1, pathseg, old, oldfd, td); + NDINIT_ATRIGHTS(&fromnd, DELETE, WANTPARENT | SAVESTART | MPSAFE | + AUDITVNODE1, pathseg, old, oldfd, CAP_DELETE, td); #endif if ((error = namei(&fromnd)) != 0) @@ -3637,8 +3690,9 @@ kern_renameat(struct thread *td, int oldfd, char *old, int newfd, char *new, vrele(fvp); goto out1; } - NDINIT_AT(&tond, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART | - MPSAFE | AUDITVNODE2, pathseg, new, newfd, td); + NDINIT_ATRIGHTS(&tond, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | + SAVESTART | MPSAFE | AUDITVNODE2, pathseg, new, newfd, CAP_CREATE, + td); if (fromnd.ni_vp->v_type == VDIR) tond.ni_cnd.cn_flags |= WILLBEDIR; if ((error = namei(&tond)) != 0) { @@ -3764,8 +3818,8 @@ kern_mkdirat(struct thread *td, int fd, char *path, enum uio_seg segflg, AUDIT_ARG_MODE(mode); restart: bwillwrite(); - NDINIT_AT(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | AUDITVNODE1, - segflg, path, fd, td); + NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | MPSAFE | + AUDITVNODE1, segflg, path, fd, CAP_MKDIR, td); nd.ni_cnd.cn_flags |= WILLBEDIR; if ((error = namei(&nd)) != 0) return (error); @@ -3853,8 +3907,8 @@ kern_rmdirat(struct thread *td, int fd, char *path, enum uio_seg pathseg) restart: bwillwrite(); - NDINIT_AT(&nd, DELETE, LOCKPARENT | LOCKLEAF | MPSAFE | AUDITVNODE1, - pathseg, path, fd, td); + NDINIT_ATRIGHTS(&nd, DELETE, LOCKPARENT | LOCKLEAF | MPSAFE | + AUDITVNODE1, pathseg, path, fd, CAP_RMDIR, td); if ((error = namei(&nd)) != 0) return (error); vfslocked = NDHASGIANT(&nd); diff --git a/sys/sys/capability.h b/sys/sys/capability.h index 54fcaa06bf6..d67dc179b0d 100644 --- a/sys/sys/capability.h +++ b/sys/sys/capability.h @@ -142,7 +142,7 @@ * Create a capability to wrap a file object. */ int kern_capwrap(struct thread *td, struct file *fp, cap_rights_t rights, - struct file **cap, int *capfd); + int *capfd); /* * Unwrap a capability if its rights mask is a superset of 'rights'. diff --git a/sys/sys/namei.h b/sys/sys/namei.h index 716b38d49f6..c68a7f7e0ba 100644 --- a/sys/sys/namei.h +++ b/sys/sys/namei.h @@ -63,6 +63,7 @@ struct nameidata { */ const char *ni_dirp; /* pathname pointer */ enum uio_seg ni_segflg; /* location of pathname */ + cap_rights_t ni_rightsneeded; /* rights required to look up vnode */ /* * Arguments to lookup. */ @@ -70,6 +71,11 @@ struct nameidata { struct vnode *ni_rootdir; /* logical root directory */ struct vnode *ni_topdir; /* logical top directory */ int ni_dirfd; /* starting directory for *at functions */ + int ni_strictrelative; /* relative lookup only; no '..' */ + /* + * Results: returned from namei + */ + cap_rights_t ni_baserights; /* rights the *at base has (or -1) */ /* * Results: returned from/manipulated by lookup */ @@ -151,11 +157,13 @@ struct nameidata { * Initialization of a nameidata structure. */ #define NDINIT(ndp, op, flags, segflg, namep, td) \ - NDINIT_ALL(ndp, op, flags, segflg, namep, AT_FDCWD, NULL, td) + NDINIT_ALL(ndp, op, flags, segflg, namep, AT_FDCWD, NULL, 0, td) #define NDINIT_AT(ndp, op, flags, segflg, namep, dirfd, td) \ - NDINIT_ALL(ndp, op, flags, segflg, namep, dirfd, NULL, td) + NDINIT_ALL(ndp, op, flags, segflg, namep, dirfd, NULL, 0, td) +#define NDINIT_ATRIGHTS(ndp, op, flags, segflg, namep, dirfd, rights, td) \ + NDINIT_ALL(ndp, op, flags, segflg, namep, dirfd, NULL, rights, td) #define NDINIT_ATVP(ndp, op, flags, segflg, namep, vp, td) \ - NDINIT_ALL(ndp, op, flags, segflg, namep, AT_FDCWD, vp, td) + NDINIT_ALL(ndp, op, flags, segflg, namep, AT_FDCWD, vp, 0, td) static __inline void NDINIT_ALL(struct nameidata *ndp, @@ -164,6 +172,7 @@ NDINIT_ALL(struct nameidata *ndp, const char *namep, int dirfd, struct vnode *startdir, + cap_rights_t rights, struct thread *td) { ndp->ni_cnd.cn_nameiop = op; @@ -172,6 +181,9 @@ NDINIT_ALL(struct nameidata *ndp, ndp->ni_dirp = namep; ndp->ni_dirfd = dirfd; ndp->ni_startdir = startdir; + ndp->ni_strictrelative = 0; + ndp->ni_rightsneeded = rights; + ndp->ni_baserights = 0; ndp->ni_cnd.cn_thread = td; } From bc69c0905409a7fbcb00edae759ae76ce58195a3 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Sat, 13 Aug 2011 10:43:21 +0000 Subject: [PATCH 224/452] Allow openat(2), fstatat(2), etc. in capability mode. namei() and lookup() can now perform "strictly relative" lookups. Such lookups, performed when in capability mode or when looking up relative to a directory capability, enforce two policies: - absolute paths are disallowed (including symlinks to absolute paths) - paths containing '..' components are disallowed These constraints make it safe to enable openat() and friends. These system calls are instrumental in supporting Capsicum components such as the capability-mode-aware runtime linker. Finally, adjust comments in capabilities.conf to reflect the actual state of the world (e.g. shm_open(2) already has the appropriate constraints, getdents(2) already requires CAP_SEEK). Approved by: re (bz), mentor (rwatson) Sponsored by: Google Inc. --- sys/kern/capabilities.conf | 44 ++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/sys/kern/capabilities.conf b/sys/kern/capabilities.conf index f9a6b242d99..2b7e559ab2a 100644 --- a/sys/kern/capabilities.conf +++ b/sys/kern/capabilities.conf @@ -239,9 +239,7 @@ getcontext ## Allow directory I/O on a file descriptor, subject to capability rights. ## Originally we had separate capabilities for directory-specific read ## operations, but on BSD we allow reading the raw directory data, so we just -## rely on CAP_READ (etc) now. -## -## XXXRW: Possibly these should also use CAP_SEEK. +## rely on CAP_READ and CAP_SEEK now. ## getdents getdirentries @@ -447,28 +445,26 @@ obreak olio_listio ## -## Once Capsicum is fully merged, some of the *at(2) calls which can be -## semantically constrained will be permitted in capability mode. For now, -## we will simply not allow them to be called. +## Operations relative to directory capabilities. ## -#faccessat -#fstatat -#fchmodat -#futimesat -#mkdirat -#rmdirat -#mkfifoat -#mknodat -#openat -#renameat +faccessat +fstatat +fchmodat +futimesat +mkdirat +rmdirat +mkfifoat +mknodat +openat +renameat ## -## ONCE CAPSICUM IS FULLY MERGED: -## Allow entry into open(2). This system call will fail, since access to the global -## file namespace has been disallowed, but allowing entry into the syscall means -## that an audit trail will be generated (which is also very useful for debugging), +## Allow entry into open(2). This system call will fail, since access to the +## global file namespace has been disallowed, but allowing entry into the +## syscall means that an audit trail will be generated (which is also very +## useful for debugging). ## -#open +open ## ## Allow poll(2), which will be scoped by capability rights. @@ -648,11 +644,9 @@ setsockopt setuid ## -## ONCE CAPSICUM IS FULLY MERGED: -## Allow shm_open(2), which is scoped so as to allow only access to new -## anonymous objects. +## shm_open(2) is scoped so as to allow only access to new anonymous objects. ## -#shm_open +shm_open ## ## Allow I/O-related file descriptors, subject to capability rights. From cc82ff1c96223f9d8d704c1d74933c88c7538c22 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sat, 13 Aug 2011 10:58:53 +0000 Subject: [PATCH 225/452] Fix race between dmu_objset_prefetch() invoked from zfs_ioc_dataset_list_next() and dsl_dir_destroy_check() indirectly invoked from dmu_recv_existing_end() via dsl_dataset_destroy() by not prefetching temporary clones, as these count as always inconsistent. In addition, do not prefetch hidden datasets at all as we are not going to process these later. Filed as Illumos Bug #1346 PR: kern/157728 Tested by: Borja Marcos , mm Reviewed by: pjd Approved by: re (kib) MFC after: 1 week --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c index ff5d40e9cb1..dbaa2777d54 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c @@ -1964,7 +1964,8 @@ top: int len = sizeof (zc->zc_name) - (p - zc->zc_name); while (dmu_dir_list_next(os, len, p, NULL, &cookie) == 0) - (void) dmu_objset_prefetch(zc->zc_name, NULL); + if (dataset_name_hidden(zc->zc_name) == B_FALSE) + (void) dmu_objset_prefetch(zc->zc_name, NULL); } do { From 74536eddbe34b50124382609ff12a2146bbd7d64 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sat, 13 Aug 2011 12:14:40 +0000 Subject: [PATCH 226/452] Regenerate system call files following r224812 changes to capabilities.conf. A no-op for non-Capsicum kernels; for Capsicum kernels, completes the enabling of fooat(2) system calls using capabilities. With this change, and subject to bug fixes, Capsicum capability support is now complete for 9.0. Approved by: re (kib) Submitted by: jonathan Sponsored by: Google Inc --- sys/kern/init_sysent.c | 24 ++++++++++++------------ sys/kern/syscalls.c | 2 +- sys/sys/syscall.h | 2 +- sys/sys/syscall.mk | 2 +- sys/sys/sysproto.h | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index 004516b6e8d..dc57b2f43f0 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD + * created from FreeBSD: head/sys/kern/syscalls.master 224066 2011-07-15 18:26:19Z jonathan */ #include "opt_compat.h" @@ -39,7 +39,7 @@ struct sysent sysent[] = { { 0, (sy_call_t *)fork, AUE_FORK, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 2 = fork */ { AS(read_args), (sy_call_t *)read, AUE_NULL, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 3 = read */ { AS(write_args), (sy_call_t *)write, AUE_NULL, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 4 = write */ - { AS(open_args), (sy_call_t *)open, AUE_OPEN_RWTC, NULL, 0, 0, 0, SY_THR_STATIC }, /* 5 = open */ + { AS(open_args), (sy_call_t *)open, AUE_OPEN_RWTC, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 5 = open */ { AS(close_args), (sy_call_t *)close, AUE_CLOSE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 6 = close */ { AS(wait_args), (sy_call_t *)wait4, AUE_WAIT4, NULL, 0, 0, 0, SY_THR_STATIC }, /* 7 = wait4 */ { compat(AS(ocreat_args),creat), AUE_CREAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 8 = old creat */ @@ -516,26 +516,26 @@ struct sysent sysent[] = { { AS(truncate_args), (sy_call_t *)truncate, AUE_TRUNCATE, NULL, 0, 0, 0, SY_THR_STATIC }, /* 479 = truncate */ { AS(ftruncate_args), (sy_call_t *)ftruncate, AUE_FTRUNCATE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 480 = ftruncate */ { AS(thr_kill2_args), (sy_call_t *)thr_kill2, AUE_KILL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 481 = thr_kill2 */ - { AS(shm_open_args), (sy_call_t *)shm_open, AUE_SHMOPEN, NULL, 0, 0, 0, SY_THR_STATIC }, /* 482 = shm_open */ + { AS(shm_open_args), (sy_call_t *)shm_open, AUE_SHMOPEN, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 482 = shm_open */ { AS(shm_unlink_args), (sy_call_t *)shm_unlink, AUE_SHMUNLINK, NULL, 0, 0, 0, SY_THR_STATIC }, /* 483 = shm_unlink */ { AS(cpuset_args), (sy_call_t *)cpuset, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 484 = cpuset */ { AS(cpuset_setid_args), (sy_call_t *)cpuset_setid, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 485 = cpuset_setid */ { AS(cpuset_getid_args), (sy_call_t *)cpuset_getid, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 486 = cpuset_getid */ { AS(cpuset_getaffinity_args), (sy_call_t *)cpuset_getaffinity, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 487 = cpuset_getaffinity */ { AS(cpuset_setaffinity_args), (sy_call_t *)cpuset_setaffinity, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 488 = cpuset_setaffinity */ - { AS(faccessat_args), (sy_call_t *)faccessat, AUE_FACCESSAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 489 = faccessat */ - { AS(fchmodat_args), (sy_call_t *)fchmodat, AUE_FCHMODAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 490 = fchmodat */ + { AS(faccessat_args), (sy_call_t *)faccessat, AUE_FACCESSAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 489 = faccessat */ + { AS(fchmodat_args), (sy_call_t *)fchmodat, AUE_FCHMODAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 490 = fchmodat */ { AS(fchownat_args), (sy_call_t *)fchownat, AUE_FCHOWNAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 491 = fchownat */ { AS(fexecve_args), (sy_call_t *)fexecve, AUE_FEXECVE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 492 = fexecve */ - { AS(fstatat_args), (sy_call_t *)fstatat, AUE_FSTATAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 493 = fstatat */ - { AS(futimesat_args), (sy_call_t *)futimesat, AUE_FUTIMESAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 494 = futimesat */ + { AS(fstatat_args), (sy_call_t *)fstatat, AUE_FSTATAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 493 = fstatat */ + { AS(futimesat_args), (sy_call_t *)futimesat, AUE_FUTIMESAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 494 = futimesat */ { AS(linkat_args), (sy_call_t *)linkat, AUE_LINKAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 495 = linkat */ - { AS(mkdirat_args), (sy_call_t *)mkdirat, AUE_MKDIRAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 496 = mkdirat */ - { AS(mkfifoat_args), (sy_call_t *)mkfifoat, AUE_MKFIFOAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 497 = mkfifoat */ - { AS(mknodat_args), (sy_call_t *)mknodat, AUE_MKNODAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 498 = mknodat */ - { AS(openat_args), (sy_call_t *)openat, AUE_OPENAT_RWTC, NULL, 0, 0, 0, SY_THR_STATIC }, /* 499 = openat */ + { AS(mkdirat_args), (sy_call_t *)mkdirat, AUE_MKDIRAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 496 = mkdirat */ + { AS(mkfifoat_args), (sy_call_t *)mkfifoat, AUE_MKFIFOAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 497 = mkfifoat */ + { AS(mknodat_args), (sy_call_t *)mknodat, AUE_MKNODAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 498 = mknodat */ + { AS(openat_args), (sy_call_t *)openat, AUE_OPENAT_RWTC, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 499 = openat */ { AS(readlinkat_args), (sy_call_t *)readlinkat, AUE_READLINKAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 500 = readlinkat */ - { AS(renameat_args), (sy_call_t *)renameat, AUE_RENAMEAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 501 = renameat */ + { AS(renameat_args), (sy_call_t *)renameat, AUE_RENAMEAT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 501 = renameat */ { AS(symlinkat_args), (sy_call_t *)symlinkat, AUE_SYMLINKAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 502 = symlinkat */ { AS(unlinkat_args), (sy_call_t *)unlinkat, AUE_UNLINKAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 503 = unlinkat */ { AS(posix_openpt_args), (sy_call_t *)posix_openpt, AUE_POSIX_OPENPT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 504 = posix_openpt */ diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index abd94842c18..06740764db6 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD + * created from FreeBSD: head/sys/kern/syscalls.master 224066 2011-07-15 18:26:19Z jonathan */ const char *syscallnames[] = { diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index fa4f46f3ace..e3a55c19ef0 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD + * created from FreeBSD: head/sys/kern/syscalls.master 224066 2011-07-15 18:26:19Z jonathan */ #define SYS_syscall 0 diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk index 544bbf41e05..726bab09321 100644 --- a/sys/sys/syscall.mk +++ b/sys/sys/syscall.mk @@ -1,7 +1,7 @@ # FreeBSD system call names. # DO NOT EDIT-- this file is automatically generated. # $FreeBSD$ -# created from FreeBSD +# created from FreeBSD: head/sys/kern/syscalls.master 224066 2011-07-15 18:26:19Z jonathan MIASM = \ syscall.o \ exit.o \ diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h index 90e0449965b..7f8d5b39b7f 100644 --- a/sys/sys/sysproto.h +++ b/sys/sys/sysproto.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD + * created from FreeBSD: head/sys/kern/syscalls.master 224066 2011-07-15 18:26:19Z jonathan */ #ifndef _SYS_SYSPROTO_H_ From 3ff02b4a8e1f7ba599abb48e981722a58663d67b Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sat, 13 Aug 2011 13:11:28 +0000 Subject: [PATCH 227/452] Bump __FreeBSD_version to reflect the availability of capabilities, but also capability-related changes to fget(9). This is likely not part of a formal KPI, but the nvidia driver (at least) uses it. Approved by: re (bz, kib) --- sys/sys/param.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/sys/param.h b/sys/sys/param.h index fbb43dfcf76..dfe4d918f70 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -58,7 +58,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 900040 /* Master, propagated to newvers */ +#define __FreeBSD_version 900041 /* Master, propagated to newvers */ #ifdef _KERNEL #define P_OSREL_SIGSEGV 700004 From 73516dbd27351f1cb86e72f5be56d1f7da9222a4 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sat, 13 Aug 2011 13:26:40 +0000 Subject: [PATCH 228/452] Now that capability support has been committed, update and expand the comment at the type of sys_capability.c to describe its new contents. Approved by: re (xxx) --- sys/kern/sys_capability.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/sys/kern/sys_capability.c b/sys/kern/sys_capability.c index 37b646f8d7c..884f2ffb5d7 100644 --- a/sys/kern/sys_capability.c +++ b/sys/kern/sys_capability.c @@ -31,9 +31,24 @@ /* * FreeBSD kernel capability facility. * - * Currently, this file implements only capability mode; capabilities - * (rights-refined file descriptors) will follow. + * Two kernel features are implemented here: capability mode, a sandboxed mode + * of execution for processes, and capabilities, a refinement on file + * descriptors that allows fine-grained control over operations on the file + * descriptor. Collectively, these allow processes to run in the style of a + * historic "capability system" in which they can use only resources + * explicitly delegated to them. This model is enforced by restricting access + * to global namespaces in capability mode. * + * Capabilities wrap other file descriptor types, binding them to a constant + * rights mask set when the capability is created. New capabilities may be + * derived from existing capabilities, but only if they have the same or a + * strict subset of the rights on the original capability. + * + * System calls permitted in capability mode are defined in capabilities.conf; + * calls must be carefully audited for safety to ensure that they don't allow + * escape from a sandbox. Some calls permit only a subset of operations in + * capability mode -- for example, shm_open(2) is limited to creating + * anonymous, rather than named, POSIX shared memory objects. */ #include "opt_capsicum.h" @@ -512,4 +527,3 @@ cap_funwrap_mmap(struct file *fp_cap, cap_rights_t rights, u_char *maxprotp, } #endif /* CAPABILITIES */ - From 854d7b9fc8d18430c343707b243eaed949912121 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sat, 13 Aug 2011 13:34:01 +0000 Subject: [PATCH 229/452] Update use of the FEATURE() macro in sys_capability.c to reflect the move to two different kernel options for capability mode vs. capabilities. Approved by: re (bz) --- sys/kern/sys_capability.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sys/kern/sys_capability.c b/sys/kern/sys_capability.c index 884f2ffb5d7..0eb27f3d920 100644 --- a/sys/kern/sys_capability.c +++ b/sys/kern/sys_capability.c @@ -76,7 +76,7 @@ __FBSDID("$FreeBSD$"); #ifdef CAPABILITY_MODE -FEATURE(security_capabilities, "Capsicum Capability Mode"); +FEATURE(security_capability_mode, "Capsicum Capability Mode"); /* * System call to enter capability mode for the process. @@ -134,6 +134,8 @@ cap_getmode(struct thread *td, struct cap_getmode_args *uap) #ifdef CAPABILITIES +FEATURE(security_capabilities, "Capsicum Capabilities"); + /* * struct capability describes a capability, and is hung off of its struct * file f_data field. cap_file and cap_rightss are static once hooked up, as From 7bf1e98fdec21f551cb374f3d942e72f4677cb17 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 13 Aug 2011 13:49:11 +0000 Subject: [PATCH 230/452] Fix jls backward compat mode broken in r222465, correctly displaying addresses in verbose mode (jls -v) again. Submitted by: jamie MFC after: 3 days Approved by: re (kib) --- usr.sbin/jls/jls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.sbin/jls/jls.c b/usr.sbin/jls/jls.c index 6568a1dd79a..7cbc5742169 100644 --- a/usr.sbin/jls/jls.c +++ b/usr.sbin/jls/jls.c @@ -371,7 +371,7 @@ print_jail(int pflags, int jflags) *(int *)params[5].jp_value); n = 6; #ifdef INET - if (ip4_ok && !strcmp(params[n].jp_name, "ip.addr")) { + if (ip4_ok && !strcmp(params[n].jp_name, "ip4.addr")) { count = params[n].jp_valuelen / sizeof(struct in_addr); for (ai = 0; ai < count; ai++) if (inet_ntop(AF_INET, From fd9a5f73f625845f02f396e38c39f521905d001f Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sat, 13 Aug 2011 16:03:40 +0000 Subject: [PATCH 231/452] When falloc() was broken into separate falloc_noinstall() and finstall(), a bug was introduced in kern_openat() such that the error from the vnode open operation was overwritten before it was passed as an argument to dupfdopen(). This broke operations on /dev/{stdin,stdout,stderr}. Fix by preserving the original error number across finstall() so that it is still available. Approved by: re (kib) Reported by: cognet --- sys/kern/vfs_syscalls.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 3d2e1d49ada..35d1aee9b50 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1086,7 +1086,7 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, struct vnode *vp; int cmode; struct file *nfp; - int type, indx = -1, error; + int type, indx = -1, error, error_open; struct flock lf; struct nameidata nd; int vfslocked; @@ -1145,10 +1145,11 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg, (error == ENODEV || error == ENXIO) && (td->td_dupfd >= 0)) { /* XXX from fdopen */ + error_open = error; if ((error = finstall(td, fp, &indx, flags)) != 0) goto bad_unlocked; if ((error = dupfdopen(td, fdp, indx, td->td_dupfd, - flags, error)) == 0) + flags, error_open)) == 0) goto success; } /* From e9969003828cecddc629aab34445281a021d6360 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Sat, 13 Aug 2011 17:17:04 +0000 Subject: [PATCH 232/452] Fix a typo in cb_dumpdata() about wrongly calling wdog_kern_pat(). Submitted by: Andrew Boyer Approved by: re (kib) --- sys/mips/mips/dump_machdep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/mips/mips/dump_machdep.c b/sys/mips/mips/dump_machdep.c index 1dd69f759c2..bf8c4a3152f 100644 --- a/sys/mips/mips/dump_machdep.c +++ b/sys/mips/mips/dump_machdep.c @@ -188,7 +188,7 @@ cb_dumpdata(struct md_pa *mdp, int seqnr, void *arg) } #ifdef SW_WATCHDOG - wdog_kern_path(WD_LASTVAL); + wdog_kern_pat(WD_LASTVAL); #endif error = dump_write(di, (void *)(intptr_t)(pa),0, dumplo, sz); /* XXX fix PA */ if (error) From 359b396113053ca5b3d937960050912a0bffee59 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sat, 13 Aug 2011 17:22:16 +0000 Subject: [PATCH 233/452] Trim some warnings and notes from capabilities.conf -- these are left over from Capsicum development, and no longer apply. Approved by: re (kib) Sponsored by: Google Inc --- sys/kern/capabilities.conf | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/sys/kern/capabilities.conf b/sys/kern/capabilities.conf index 2b7e559ab2a..004c2ddf207 100644 --- a/sys/kern/capabilities.conf +++ b/sys/kern/capabilities.conf @@ -196,7 +196,7 @@ fpathconf ## ## Allow various file descriptor-based I/O operations, subject to capability -## rights. mmap(2) requires further attention. +## rights. ## freebsd6_ftruncate freebsd6_lseek @@ -334,8 +334,6 @@ issetugid ## Allow kevent(2), as we will authorize based on capability rights on the ## target descriptor. ## -## XXXRW: Do we do this? -## kevent ## @@ -404,9 +402,6 @@ mlockall ## Allow memory mapping a file descriptor, and updating protections, subject ## to capability rights. ## -## XXXRW: We currently don't properly mask VM protections using capability -## rights. -## mmap mprotect From 6e1f1d4690055848447732e90ddb58d4ab856b86 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sat, 13 Aug 2011 21:35:22 +0000 Subject: [PATCH 234/452] zfs_ioctl.c: improve code readability in zfs_ioc_dataset_list_next() zvol.c: fix calling of dmu_objset_prefetch() in zvol_create_minors() by passing full instead of relative dataset name and prefetching all visible datasets to be processed later instead of just the pool name Reviewed by: pjd Approved by: re (kib) MFC after: 1 week > Reviewed by: If someone else reviewed your modification. > Approved by: If you needed approval for this commit. > Obtained from: If the change is from a third party. > MFC after: N [day[s]|week[s]|month[s]]. Request a reminder email. > Security: Vulnerability reference (one per line) or description. > Empty fields above will be automatically removed. M opensolaris/uts/common/fs/zfs/zfs_ioctl.c M opensolaris/uts/common/fs/zfs/zvol.c --- .../contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c | 5 +++-- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c index dbaa2777d54..17174b29ed9 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c @@ -1963,9 +1963,10 @@ top: uint64_t cookie = 0; int len = sizeof (zc->zc_name) - (p - zc->zc_name); - while (dmu_dir_list_next(os, len, p, NULL, &cookie) == 0) - if (dataset_name_hidden(zc->zc_name) == B_FALSE) + while (dmu_dir_list_next(os, len, p, NULL, &cookie) == 0) { + if (!dataset_name_hidden(zc->zc_name)) (void) dmu_objset_prefetch(zc->zc_name, NULL); + } } do { diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c index f9789f889ba..61c96becdea 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c @@ -2197,11 +2197,11 @@ zvol_create_minors(const char *name) p = osname + strlen(osname); len = MAXPATHLEN - (p - osname); - if (strchr(name, '/') == NULL) { - /* Prefetch only for pool name. */ - cookie = 0; - while (dmu_dir_list_next(os, len, p, NULL, &cookie) == 0) - (void) dmu_objset_prefetch(p, NULL); + /* Prefetch the datasets. */ + cookie = 0; + while (dmu_dir_list_next(os, len, p, NULL, &cookie) == 0) { + if (!dataset_name_hidden(osname)) + (void) dmu_objset_prefetch(osname, NULL); } cookie = 0; From e95725cb76c16fd743dbe8dc1c237aa678f9ba96 Mon Sep 17 00:00:00 2001 From: Matt Jacob Date: Sat, 13 Aug 2011 23:34:17 +0000 Subject: [PATCH 235/452] Most of these changes to isp are to allow for isp.ko unloading. We also revive loop down freezes. We also externaliz within isp isp_prt_endcmd so something outside the core module can print something about a command completing. Also some work in progress to assist in handling timed out commands better. Partially Sponsored by: Panasas Approved by: re (kib) MFC after: 1 month --- sys/dev/isp/isp.c | 3 +- sys/dev/isp/isp_freebsd.c | 152 ++++++++++++++++++++++++++++++-------- sys/dev/isp/isp_freebsd.h | 13 +++- sys/dev/isp/isp_pci.c | 80 +++++++++++++------- sys/dev/isp/ispvar.h | 5 ++ 5 files changed, 190 insertions(+), 63 deletions(-) diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c index 95f2add2474..dfba62e6e04 100644 --- a/sys/dev/isp/isp.c +++ b/sys/dev/isp/isp.c @@ -102,7 +102,6 @@ static const uint8_t alpa_map[] = { /* * Local function prototypes. */ -static void isp_prt_endcmd(ispsoftc_t *, XS_T *); static int isp_parse_async(ispsoftc_t *, uint16_t); static int isp_parse_async_fc(ispsoftc_t *, uint16_t); static int isp_handle_other_response(ispsoftc_t *, int, isphdr_t *, uint32_t *); @@ -5391,7 +5390,7 @@ out: * Support routines. */ -static void +void isp_prt_endcmd(ispsoftc_t *isp, XS_T *xs) { char cdbstr[16 * 5 + 1]; diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c index 120ae11e5bf..8d62f5ebdec 100644 --- a/sys/dev/isp/isp_freebsd.c +++ b/sys/dev/isp/isp_freebsd.c @@ -108,15 +108,13 @@ isp_attach_chan(ispsoftc_t *isp, struct cam_devq *devq, int chan) return (EIO); } ISP_UNLOCK(isp); - - if (xpt_create_path(&path, NULL, cam_sim_path(sim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + if (xpt_create_path_unlocked(&path, NULL, cam_sim_path(sim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { ISP_LOCK(isp); xpt_bus_deregister(cam_sim_path(sim)); ISP_UNLOCK(isp); cam_sim_free(sim, FALSE); return (ENXIO); } - xpt_setup_ccb(&csa.ccb_h, path, 5); csa.ccb_h.func_code = XPT_SASYNC_CB; csa.event_enable = AC_LOST_DEVICE; @@ -190,12 +188,16 @@ isp_attach(ispsoftc_t *isp) isp->isp_osinfo.ehook.ich_func = isp_intr_enable; isp->isp_osinfo.ehook.ich_arg = isp; + /* + * Haha. Set this first, because if we're loaded as a module isp_intr_enable + * will be called right awawy, which will clear isp_osinfo.ehook_active, + * which would be unwise to then set again later. + */ + isp->isp_osinfo.ehook_active = 1; if (config_intrhook_establish(&isp->isp_osinfo.ehook) != 0) { isp_prt(isp, ISP_LOGERR, "could not establish interrupt enable hook"); return (-EIO); } - isp->isp_osinfo.ehook_active = 1; - /* * Create the device queue for our SIM(s). @@ -252,20 +254,16 @@ unwind: return (-1); } -void +int isp_detach(ispsoftc_t *isp) { + struct cam_sim *sim; + struct cam_path *path; + struct ccb_setasync csa; int chan; ISP_LOCK(isp); - if (isp->isp_osinfo.timer_active) { - callout_stop(&isp->isp_osinfo.tmo); - isp->isp_osinfo.timer_active = 0; - } - ISP_UNLOCK(isp); for (chan = isp->isp_nchan - 1; chan >= 0; chan -= 1) { - struct cam_sim *sim; - struct cam_path *path; if (IS_FC(isp)) { sim = ISP_FC_PC(isp, chan)->sim; path = ISP_FC_PC(isp, chan)->path; @@ -273,12 +271,34 @@ isp_detach(ispsoftc_t *isp) sim = ISP_SPI_PC(isp, chan)->sim; path = ISP_SPI_PC(isp, chan)->path; } + if (sim->refcount > 2) { + ISP_UNLOCK(isp); + return (EBUSY); + } + } + if (isp->isp_osinfo.timer_active) { + callout_stop(&isp->isp_osinfo.tmo); + isp->isp_osinfo.timer_active = 0; + } + for (chan = isp->isp_nchan - 1; chan >= 0; chan -= 1) { + if (IS_FC(isp)) { + sim = ISP_FC_PC(isp, chan)->sim; + path = ISP_FC_PC(isp, chan)->path; + } else { + sim = ISP_SPI_PC(isp, chan)->sim; + path = ISP_SPI_PC(isp, chan)->path; + } + xpt_setup_ccb(&csa.ccb_h, path, 5); + csa.ccb_h.func_code = XPT_SASYNC_CB; + csa.event_enable = 0; + csa.callback = isp_cam_async; + csa.callback_arg = sim; + xpt_action((union ccb *)&csa); xpt_free_path(path); - ISP_LOCK(isp); xpt_bus_deregister(cam_sim_path(sim)); - ISP_UNLOCK(isp); cam_sim_free(sim, FALSE); } + ISP_UNLOCK(isp); if (isp->isp_osinfo.cdev) { destroy_dev(isp->isp_osinfo.cdev); isp->isp_osinfo.cdev = NULL; @@ -291,6 +311,7 @@ isp_detach(ispsoftc_t *isp) cam_simq_free(isp->isp_osinfo.devq); isp->isp_osinfo.devq = NULL; } + return (0); } static void @@ -309,6 +330,20 @@ isp_freeze_loopdown(ispsoftc_t *isp, int chan, char *msg) } } +static void +isp_unfreeze_loopdown(ispsoftc_t *isp, int chan) +{ + if (IS_FC(isp)) { + struct isp_fc *fc = ISP_FC_PC(isp, chan); + int wasfrozen = fc->simqfrozen & SIMQFRZ_LOOPDOWN; + fc->simqfrozen &= ~SIMQFRZ_LOOPDOWN; + if (wasfrozen && fc->simqfrozen == 0) { + isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "%s: Chan %d releasing simq", __func__, chan); + xpt_release_simq(fc->sim, 1); + } + } +} + static int ispioctl(struct cdev *dev, u_long c, caddr_t addr, int flags, struct thread *td) @@ -702,6 +737,7 @@ isp_intr_enable(void *arg) } } } + isp->isp_osinfo.ehook_active = 0; ISP_UNLOCK(isp); /* Release our hook so that the boot can continue. */ config_intrhook_disestablish(&isp->isp_osinfo.ehook); @@ -1308,7 +1344,7 @@ done: xpt_print(ccb->ccb_h.path, "now disabled for target mode\n"); } if (tptr) { - rls_lun_statep(isp, tptr); + destroy_lun_state(isp, tptr); } isp->isp_osinfo.rptr = NULL; isp->isp_osinfo.tmbusy = 0; @@ -3787,19 +3823,20 @@ static void isp_cam_async(void *cbarg, uint32_t code, struct cam_path *path, void *arg) { struct cam_sim *sim; + int bus, tgt; ispsoftc_t *isp; sim = (struct cam_sim *)cbarg; isp = (ispsoftc_t *) cam_sim_softc(sim); + bus = cam_sim_bus(sim); + tgt = xpt_path_target_id(path); + switch (code) { case AC_LOST_DEVICE: if (IS_SCSI(isp)) { uint16_t oflags, nflags; - int bus = cam_sim_bus(sim); sdparam *sdp = SDPARAM(isp, bus); - int tgt; - tgt = xpt_path_target_id(path); if (tgt >= 0) { nflags = sdp->isp_devparam[tgt].nvrm_flags; #ifndef ISP_TARGET_MODE @@ -3843,11 +3880,32 @@ isp_watchdog(void *arg) { struct ccb_scsiio *xs = arg; ispsoftc_t *isp; - uint32_t handle; + uint32_t ohandle = ISP_HANDLE_FREE, handle; isp = XS_ISP(xs); handle = isp_find_handle(isp, xs); + + if (handle != ISP_HANDLE_FREE && !XS_CMD_WPEND_P(xs)) { + isp_xs_prt(isp, xs, ISP_LOGWARN, "first watchdog (handle 0x%x) timed out- deferring for grace period", handle); + callout_reset(&PISP_PCMD(xs)->wdog, 2 * hz, isp_watchdog, xs); + XS_CMD_S_WPEND(xs); + return; + } + XS_C_TACTIVE(xs); + + /* + * Hand crank the interrupt code just to be sure the command isn't stuck somewhere. + */ + if (handle != ISP_HANDLE_FREE) { + uint32_t isr; + uint16_t sema, mbox; + if (ISP_READ_ISR(isp, &isr, &sema, &mbox) != 0) { + isp_intr(isp, isr, sema, mbox); + } + ohandle = handle; + handle = isp_find_handle(isp, xs); + } if (handle != ISP_HANDLE_FREE) { /* * Try and make sure the command is really dead before @@ -3884,7 +3942,14 @@ isp_watchdog(void *arg) isp_destroy_handle(isp, handle); isp_prt(isp, ISP_LOGERR, "%s: timeout for handle 0x%x", __func__, handle); XS_SETERR(xs, CAM_CMD_TIMEOUT); + isp_prt_endcmd(isp, xs); isp_done(xs); + } else { + if (ohandle != ISP_HANDLE_FREE) { + isp_prt(isp, ISP_LOGWARN, "%s: timeout for handle 0x%x, recovered during interrupt", __func__, ohandle); + } else { + isp_prt(isp, ISP_LOGWARN, "%s: timeout for handle already free", __func__); + } } } @@ -4013,7 +4078,7 @@ isp_ldt_task(void *arg, int pending) ispsoftc_t *isp = fc->isp; int chan = fc - isp->isp_osinfo.pc.fc; fcportdb_t *lp; - int dbidx, tgt; + int dbidx, tgt, i; ISP_LOCK(isp); isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Chan %d Loop Down Timer expired @ %lu", chan, (unsigned long) time_uptime); @@ -4035,6 +4100,23 @@ isp_ldt_task(void *arg, int pending) /* * XXX: CLEAN UP AND COMPLETE ANY PENDING COMMANDS FIRST! */ + + + for (i = 0; i < isp->isp_maxcmds; i++) { + struct ccb_scsiio *xs; + + if (!ISP_VALID_HANDLE(isp, isp->isp_xflist[i].handle)) { + continue; + } + if ((xs = isp->isp_xflist[i].cmd) == NULL) { + continue; + } + if (dbidx != (FCPARAM(isp, chan)->isp_dev_map[XS_TGT(xs)] - 1)) { + continue; + } + isp_prt(isp, ISP_LOGWARN, "command handle 0x%08x for %d.%d.%d orphaned by loop down timeout", + isp->isp_xflist[i].handle, chan, XS_TGT(xs), XS_LUN(xs)); + } /* * Mark that we've announced that this device is gone.... @@ -4056,6 +4138,9 @@ isp_ldt_task(void *arg, int pending) isp_make_gone(isp, chan, tgt); } + if (FCPARAM(isp, chan)->role & ISP_ROLE_INITIATOR) { + isp_unfreeze_loopdown(isp, chan); + } /* * The loop down timer has expired. Wake up the kthread * to notice that fact (or make it false). @@ -4063,6 +4148,7 @@ isp_ldt_task(void *arg, int pending) fc->loop_dead = 1; fc->loop_down_time = fc->loop_down_limit+1; wakeup(fc); + ISP_UNLOCK(isp); } static void @@ -4076,7 +4162,7 @@ isp_kthread(void *arg) mtx_lock(&isp->isp_osinfo.lock); for (;;) { - int wasfrozen, lb, lim; + int lb, lim; isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "%s: Chan %d checking FC state", __func__, chan); lb = isp_fc_runstate(isp, chan, 250000); @@ -4147,12 +4233,7 @@ isp_kthread(void *arg) */ if (FCPARAM(isp, chan)->loop_seen_once || fc->loop_dead) { - wasfrozen = fc->simqfrozen & SIMQFRZ_LOOPDOWN; - fc->simqfrozen &= ~SIMQFRZ_LOOPDOWN; - if (wasfrozen && fc->simqfrozen == 0) { - isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "%s: Chan %d releasing simq", __func__, chan); - xpt_release_simq(fc->sim, 1); - } + isp_unfreeze_loopdown(isp, chan); } isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "%s: Chan %d sleep time %d", __func__, chan, slp); @@ -4251,6 +4332,7 @@ isp_action(struct cam_sim *sim, union ccb *ccb) ts = 60*1000; } ts = isp_mstohz(ts); + XS_S_TACTIVE(ccb); callout_reset(&PISP_PCMD(ccb)->wdog, ts, isp_watchdog, ccb); break; case CMD_RQLATER: @@ -4777,7 +4859,9 @@ isp_action(struct cam_sim *sim, union ccb *ccb) /* * Set base transfer capabilities for Fibre Channel, for this HBA. */ - if (IS_24XX(isp)) { + if (IS_25XX(isp)) { + cpi->base_transfer_speed = 8000000; + } else if (IS_24XX(isp)) { cpi->base_transfer_speed = 4000000; } else if (IS_23XX(isp)) { cpi->base_transfer_speed = 2000000; @@ -4823,6 +4907,7 @@ void isp_done(XS_T *sccb) { ispsoftc_t *isp = XS_ISP(sccb); + uint32_t status; if (XS_NOERR(sccb)) XS_SETERR(sccb, CAM_REQ_CMP); @@ -4837,8 +4922,10 @@ isp_done(XS_T *sccb) } sccb->ccb_h.status &= ~CAM_SIM_QUEUED; - if ((sccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { - isp_prt(isp, ISP_LOGDEBUG0, "target %d lun %d CAM status 0x%x SCSI status 0x%x", XS_TGT(sccb), XS_LUN(sccb), sccb->ccb_h.status, sccb->scsi_status); + status = sccb->ccb_h.status & CAM_STATUS_MASK; + if (status != CAM_REQ_CMP) { + if (status != CAM_SEL_TIMEOUT) + isp_prt(isp, ISP_LOGDEBUG0, "target %d lun %d CAM status 0x%x SCSI status 0x%x", XS_TGT(sccb), XS_LUN(sccb), sccb->ccb_h.status, sccb->scsi_status); if ((sccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { sccb->ccb_h.status |= CAM_DEV_QFRZN; xpt_freeze_devq(sccb->ccb_h.path, 1); @@ -4850,7 +4937,8 @@ isp_done(XS_T *sccb) } XS_CMD_S_DONE(sccb); - callout_stop(&PISP_PCMD(sccb)->wdog); + if (XS_TACTIVE_P(sccb)) + callout_stop(&PISP_PCMD(sccb)->wdog); XS_CMD_S_CLEAR(sccb); isp_free_pcmd(isp, (union ccb *) sccb); xpt_done((union ccb *) sccb); diff --git a/sys/dev/isp/isp_freebsd.h b/sys/dev/isp/isp_freebsd.h index cfa2fd541d1..1fb5fc56a89 100644 --- a/sys/dev/isp/isp_freebsd.h +++ b/sys/dev/isp/isp_freebsd.h @@ -582,7 +582,7 @@ default: \ * prototypes for isp_pci && isp_freebsd to share */ extern int isp_attach(ispsoftc_t *); -extern void isp_detach(ispsoftc_t *); +extern int isp_detach(ispsoftc_t *); extern void isp_uninit(ispsoftc_t *); extern uint64_t isp_default_wwn(ispsoftc_t *, int, int, int); @@ -600,12 +600,23 @@ extern int isp_autoconfig; * Platform private flags */ #define ISP_SPRIV_ERRSET 0x1 +#define ISP_SPRIV_TACTIVE 0x2 #define ISP_SPRIV_DONE 0x8 +#define ISP_SPRIV_WPEND 0x10 + +#define XS_S_TACTIVE(sccb) (sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_TACTIVE +#define XS_C_TACTIVE(sccb) (sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_TACTIVE +#define XS_TACTIVE_P(sccb) ((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_TACTIVE) #define XS_CMD_S_DONE(sccb) (sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_DONE #define XS_CMD_C_DONE(sccb) (sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_DONE #define XS_CMD_DONE_P(sccb) ((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_DONE) +#define XS_CMD_S_WPEND(sccb) (sccb)->ccb_h.spriv_field0 |= ISP_SPRIV_WPEND +#define XS_CMD_C_WPEND(sccb) (sccb)->ccb_h.spriv_field0 &= ~ISP_SPRIV_WPEND +#define XS_CMD_WPEND_P(sccb) ((sccb)->ccb_h.spriv_field0 & ISP_SPRIV_WPEND) + + #define XS_CMD_S_CLEAR(sccb) (sccb)->ccb_h.spriv_field0 = 0 /* diff --git a/sys/dev/isp/isp_pci.c b/sys/dev/isp/isp_pci.c index 5eb073957bc..b6b23fafa59 100644 --- a/sys/dev/isp/isp_pci.c +++ b/sys/dev/isp/isp_pci.c @@ -347,7 +347,11 @@ static int isp_pci_detach (device_t); struct isp_pcisoftc { ispsoftc_t pci_isp; device_t pci_dev; - struct resource * pci_reg; + struct resource * regs; + void * irq; + int iqd; + int rtp; + int rgd; void * ih; int16_t pci_poff[_NREG_BLKS]; bus_dma_tag_t dmat; @@ -645,8 +649,7 @@ isp_get_specific_options(device_t dev, int chan, ispsoftc_t *isp) static int isp_pci_attach(device_t dev) { - struct resource *regs, *irq; - int rtp, rgd, iqd, i, m1, m2, locksetup = 0; + int i, m1, m2, locksetup = 0; int isp_nvports = 0; uint32_t data, cmd, linesz, did; struct isp_pcisoftc *pcs; @@ -687,32 +690,31 @@ isp_pci_attach(device_t dev) isp_get_pci_options(dev, &m1, &m2); linesz = PCI_DFLT_LNSZ; - irq = regs = NULL; - rgd = rtp = iqd = 0; + pcs->irq = pcs->regs = NULL; + pcs->rgd = pcs->rtp = pcs->iqd = 0; cmd = pci_read_config(dev, PCIR_COMMAND, 2); if (cmd & m1) { - rtp = (m1 == PCIM_CMD_MEMEN)? SYS_RES_MEMORY : SYS_RES_IOPORT; - rgd = (m1 == PCIM_CMD_MEMEN)? MEM_MAP_REG : IO_MAP_REG; - regs = bus_alloc_resource_any(dev, rtp, &rgd, RF_ACTIVE); + pcs->rtp = (m1 == PCIM_CMD_MEMEN)? SYS_RES_MEMORY : SYS_RES_IOPORT; + pcs->rgd = (m1 == PCIM_CMD_MEMEN)? MEM_MAP_REG : IO_MAP_REG; + pcs->regs = bus_alloc_resource_any(dev, pcs->rtp, &pcs->rgd, RF_ACTIVE); } - if (regs == NULL && (cmd & m2)) { - rtp = (m2 == PCIM_CMD_MEMEN)? SYS_RES_MEMORY : SYS_RES_IOPORT; - rgd = (m2 == PCIM_CMD_MEMEN)? MEM_MAP_REG : IO_MAP_REG; - regs = bus_alloc_resource_any(dev, rtp, &rgd, RF_ACTIVE); + if (pcs->regs == NULL && (cmd & m2)) { + pcs->rtp = (m2 == PCIM_CMD_MEMEN)? SYS_RES_MEMORY : SYS_RES_IOPORT; + pcs->rgd = (m2 == PCIM_CMD_MEMEN)? MEM_MAP_REG : IO_MAP_REG; + pcs->regs = bus_alloc_resource_any(dev, pcs->rtp, &pcs->rgd, RF_ACTIVE); } - if (regs == NULL) { + if (pcs->regs == NULL) { device_printf(dev, "unable to map any ports\n"); goto bad; } if (bootverbose) { - device_printf(dev, "using %s space register mapping\n", (rgd == IO_MAP_REG)? "I/O" : "Memory"); + device_printf(dev, "using %s space register mapping\n", (pcs->rgd == IO_MAP_REG)? "I/O" : "Memory"); } - isp->isp_bus_tag = rman_get_bustag(regs); - isp->isp_bus_handle = rman_get_bushandle(regs); + isp->isp_bus_tag = rman_get_bustag(pcs->regs); + isp->isp_bus_handle = rman_get_bushandle(pcs->regs); pcs->pci_dev = dev; - pcs->pci_reg = regs; pcs->pci_poff[BIU_BLOCK >> _BLK_REG_SHFT] = BIU_REGS_OFF; pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS_OFF; pcs->pci_poff[SXP_BLOCK >> _BLK_REG_SHFT] = PCI_SXP_REGS_OFF; @@ -931,13 +933,13 @@ isp_pci_attach(device_t dev) pcs->msicount = 1; } if (pci_alloc_msi(dev, &pcs->msicount) == 0) { - iqd = 1; + pcs->iqd = 1; } else { - iqd = 0; + pcs->iqd = 0; } } - irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &iqd, RF_ACTIVE | RF_SHAREABLE); - if (irq == NULL) { + pcs->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &pcs->iqd, RF_ACTIVE | RF_SHAREABLE); + if (pcs->irq == NULL) { device_printf(dev, "could not allocate interrupt\n"); goto bad; } @@ -946,7 +948,7 @@ isp_pci_attach(device_t dev) mtx_init(&isp->isp_osinfo.lock, "isp", NULL, MTX_DEF); locksetup++; - if (isp_setup_intr(dev, irq, ISP_IFLAGS, NULL, isp_platform_intr, isp, &pcs->ih)) { + if (isp_setup_intr(dev, pcs->irq, ISP_IFLAGS, NULL, isp_platform_intr, isp, &pcs->ih)) { device_printf(dev, "could not setup interrupt\n"); goto bad; } @@ -982,19 +984,19 @@ isp_pci_attach(device_t dev) bad: if (pcs->ih) { - (void) bus_teardown_intr(dev, irq, pcs->ih); + (void) bus_teardown_intr(dev, pcs->irq, pcs->ih); } if (locksetup) { mtx_destroy(&isp->isp_osinfo.lock); } - if (irq) { - (void) bus_release_resource(dev, SYS_RES_IRQ, iqd, irq); + if (pcs->irq) { + (void) bus_release_resource(dev, SYS_RES_IRQ, pcs->iqd, pcs->irq); } if (pcs->msicount) { pci_release_msi(dev); } - if (regs) { - (void) bus_release_resource(dev, rtp, rgd, regs); + if (pcs->regs) { + (void) bus_release_resource(dev, pcs->rtp, pcs->rgd, pcs->regs); } if (pcs->pci_isp.isp_param) { free(pcs->pci_isp.isp_param, M_DEVBUF); @@ -1012,14 +1014,36 @@ isp_pci_detach(device_t dev) { struct isp_pcisoftc *pcs; ispsoftc_t *isp; + int status; pcs = device_get_softc(dev); if (pcs == NULL) { return (ENXIO); } isp = (ispsoftc_t *) pcs; - ISP_DISABLE_INTS(isp); + status = isp_detach(isp); + if (status) + return (status); + ISP_LOCK(isp); + isp_uninit(isp); + if (pcs->ih) { + (void) bus_teardown_intr(dev, pcs->irq, pcs->ih); + } + ISP_UNLOCK(isp); mtx_destroy(&isp->isp_osinfo.lock); + (void) bus_release_resource(dev, SYS_RES_IRQ, pcs->iqd, pcs->irq); + if (pcs->msicount) { + pci_release_msi(dev); + } + (void) bus_release_resource(dev, pcs->rtp, pcs->rgd, pcs->regs); + if (pcs->pci_isp.isp_param) { + free(pcs->pci_isp.isp_param, M_DEVBUF); + pcs->pci_isp.isp_param = NULL; + } + if (pcs->pci_isp.isp_osinfo.pc.ptr) { + free(pcs->pci_isp.isp_osinfo.pc.ptr, M_DEVBUF); + pcs->pci_isp.isp_osinfo.pc.ptr = NULL; + } return (0); } diff --git a/sys/dev/isp/ispvar.h b/sys/dev/isp/ispvar.h index d7937949c48..55edc17228c 100644 --- a/sys/dev/isp/ispvar.h +++ b/sys/dev/isp/ispvar.h @@ -952,6 +952,11 @@ void isp_async(ispsoftc_t *, ispasync_t, ...); #define ISPASYNC_CHANGE_SNS 1 #define ISPASYNC_CHANGE_OTHER 2 +/* + * Platform Independent Error Prinout + */ +void isp_prt_endcmd(ispsoftc_t *, XS_T *); + /* * Platform Dependent Error and Debug Printout * From 9f2c359f16905909b1f23e77b9f2be3056baa7fa Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Sun, 14 Aug 2011 00:20:37 +0000 Subject: [PATCH 236/452] Add support for the Blu-Ray drive found in the Sony Playstation 3 and fix some realted minor bugs in PS3 internal storage support. Submitted by: glevand Approved by: re (bz) --- sys/boot/powerpc/ps3/Makefile | 3 +- sys/boot/powerpc/ps3/conf.c | 6 +- sys/boot/powerpc/ps3/devicename.c | 2 + sys/boot/powerpc/ps3/lv1call.S | 10 +- sys/boot/powerpc/ps3/lv1call.h | 10 +- sys/boot/powerpc/ps3/main.c | 12 +- sys/boot/powerpc/ps3/ps3cdrom.c | 154 +++++++ sys/boot/powerpc/ps3/ps3stor.c | 47 +- sys/conf/files.powerpc | 2 +- sys/powerpc/ps3/ps3cdrom.c | 703 ++++++++++++++++++++++++++++++ 10 files changed, 913 insertions(+), 36 deletions(-) create mode 100644 sys/boot/powerpc/ps3/ps3cdrom.c create mode 100644 sys/powerpc/ps3/ps3cdrom.c diff --git a/sys/boot/powerpc/ps3/Makefile b/sys/boot/powerpc/ps3/Makefile index 0f0b7829a70..0dee5f4c7a8 100644 --- a/sys/boot/powerpc/ps3/Makefile +++ b/sys/boot/powerpc/ps3/Makefile @@ -10,7 +10,8 @@ INSTALLFLAGS= -b # Architecture-specific loader code SRCS= start.S conf.c metadata.c vers.c main.c devicename.c ppc64_elf_freebsd.c -SRCS+= lv1call.S ps3cons.c font.h ps3mmu.c ps3net.c ps3repo.c ps3stor.c ps3disk.c +SRCS+= lv1call.S ps3cons.c font.h ps3mmu.c ps3net.c ps3repo.c \ + ps3stor.c ps3disk.c ps3cdrom.c SRCS+= ucmpdi2.c LOADER_DISK_SUPPORT?= yes diff --git a/sys/boot/powerpc/ps3/conf.c b/sys/boot/powerpc/ps3/conf.c index 200fc7f29c6..3a5ae4c41f0 100644 --- a/sys/boot/powerpc/ps3/conf.c +++ b/sys/boot/powerpc/ps3/conf.c @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$"); #endif extern struct devsw ps3disk; +extern struct devsw ps3cdrom; /* * We could use linker sets for some or all of these, but @@ -47,7 +48,10 @@ extern struct devsw ps3disk; /* Exported for libstand */ struct devsw *devsw[] = { -#if defined(LOADER_DISK_SUPPORT) || defined(LOADER_CD9660_SUPPORT) +#if defined(LOADER_CD9660_SUPPORT) + &ps3cdrom, +#endif +#if defined(LOADER_DISK_SUPPORT) &ps3disk, #endif #if defined(LOADER_NET_SUPPORT) diff --git a/sys/boot/powerpc/ps3/devicename.c b/sys/boot/powerpc/ps3/devicename.c index c46bc892804..041f853986d 100644 --- a/sys/boot/powerpc/ps3/devicename.c +++ b/sys/boot/powerpc/ps3/devicename.c @@ -157,6 +157,7 @@ ps3_parsedev(struct ps3_devdesc **dev, const char *devspec, const char **path) break; case DEVT_NET: + case DEVT_CD: /* * PS3 only has one network interface (well, two, but * netbooting over wireless is not something I'm going @@ -213,6 +214,7 @@ ps3_fmtdev(void *vdev) break; case DEVT_NET: + case DEVT_CD: sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit); break; } diff --git a/sys/boot/powerpc/ps3/lv1call.S b/sys/boot/powerpc/ps3/lv1call.S index 1c1e28ee0bd..a399a9c3bbf 100644 --- a/sys/boot/powerpc/ps3/lv1call.S +++ b/sys/boot/powerpc/ps3/lv1call.S @@ -307,14 +307,8 @@ lv1_storage_read: sldi %r6,%r9,32 clrldi %r7,%r10,32 or %r6,%r6,%r7 - lwz %r7,8(%r1) - lwz %r8,12(%r1) - sldi %r7,%r7,32 - or %r7,%r7,%r8 - lwz %r8,16(%r1) - lwz %r9,20(%r1) - sldi %r8,%r8,32 - or %r8,%r8,%r9 + ld %r7,8(%r1) + ld %r8,16(%r1) li %r11,245 hc diff --git a/sys/boot/powerpc/ps3/lv1call.h b/sys/boot/powerpc/ps3/lv1call.h index da47afb4dad..fb8044825bd 100644 --- a/sys/boot/powerpc/ps3/lv1call.h +++ b/sys/boot/powerpc/ps3/lv1call.h @@ -69,12 +69,12 @@ int lv1_net_stop_tx_dma(int bus, int dev, int); int lv1_net_stop_rx_dma(int bus, int dev, int); int lv1_get_repository_node_value(uint64_t lpar_id, uint64_t n1, uint64_t n2, - uint64_t n3, uint64_t n4, uint64_t *v1, uint64_t *v2); + uint64_t n3, uint64_t n4, uint64_t *v1, uint64_t *v2); -int lv1_storage_read(uint64_t dev_id, uint64_t region_id, - uint64_t start_sector, uint64_t sector_count, - uint64_t flags, uint64_t buf, uint64_t *tag); -int lv1_storage_check_async_status(uint64_t dev_id, uint64_t tag, uint64_t *status); +int lv1_storage_read(uint64_t dev_id, uint64_t region_id, uint64_t start_sector, + uint64_t sector_count, uint64_t flags, uint64_t buf, uint64_t *tag); +int lv1_storage_check_async_status(uint64_t dev_id, uint64_t tag, + uint64_t *status); #endif diff --git a/sys/boot/powerpc/ps3/main.c b/sys/boot/powerpc/ps3/main.c index db808adba28..64bd7e9f9a2 100644 --- a/sys/boot/powerpc/ps3/main.c +++ b/sys/boot/powerpc/ps3/main.c @@ -92,11 +92,17 @@ main(void) } } - printf("\nDevice: %s\n", devsw[i]->dv_name); - currdev.d_dev = devsw[i]; currdev.d_type = currdev.d_dev->dv_type; + if (strcmp(devsw[i]->dv_name, "cd") == 0) { + f.f_devdata = &currdev; + currdev.d_unit = 0; + + if (devsw[i]->dv_open(&f, &currdev) == 0) + break; + } + if (strcmp(devsw[i]->dv_name, "disk") == 0) { f.f_devdata = &currdev; currdev.d_unit = 3; @@ -113,6 +119,8 @@ main(void) if (devsw[i] == NULL) panic("No boot device found!"); + else + printf("Boot device: %s\n", devsw[i]->dv_name); /* * Get timebase at boot. diff --git a/sys/boot/powerpc/ps3/ps3cdrom.c b/sys/boot/powerpc/ps3/ps3cdrom.c new file mode 100644 index 00000000000..843ecd56052 --- /dev/null +++ b/sys/boot/powerpc/ps3/ps3cdrom.c @@ -0,0 +1,154 @@ +/*- + * Copyright (C) 2011 glevand + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include + +#include "bootstrap.h" +#include "ps3bus.h" +#include "ps3devdesc.h" +#include "ps3stor.h" + +#define dev_printf(dev, fmt, args...) \ + printf("%s%d: " fmt "\n", dev->d_dev->dv_name, dev->d_unit, ##args) + +#ifdef CD_DEBUG +#define DEBUG(fmt, args...) printf("%s:%d: " fmt "\n", __func__, __LINE__, ##args) +#else +#define DEBUG(fmt, args...) +#endif + +static int ps3cdrom_init(void); +static int ps3cdrom_strategy(void *devdata, int flag, daddr_t dblk, + size_t size, char *buf, size_t *rsize); +static int ps3cdrom_open(struct open_file *f, ...); +static int ps3cdrom_close(struct open_file *f); +static void ps3cdrom_print(int verbose); + +struct devsw ps3cdrom = { + "cd", + DEVT_CD, + ps3cdrom_init, + ps3cdrom_strategy, + ps3cdrom_open, + ps3cdrom_close, + noioctl, + ps3cdrom_print, +}; + +static struct ps3_stordev stor_dev; + +static int ps3cdrom_init(void) +{ + int err; + + err = ps3stor_setup(&stor_dev, PS3_DEV_TYPE_STOR_CDROM); + if (err) + return err; + + return 0; +} + +static int ps3cdrom_strategy(void *devdata, int flag, daddr_t dblk, + size_t size, char *buf, size_t *rsize) +{ + struct ps3_devdesc *dev = (struct ps3_devdesc *) devdata; + int err; + + DEBUG("d_unit=%u dblk=%llu size=%u", dev->d_unit, dblk, size); + + if (flag != F_READ) { + dev_printf(dev, "write operation is not supported!"); + return EROFS; + } + + if (dblk % (stor_dev.sd_blksize / DEV_BSIZE) != 0) + return EINVAL; + + dblk /= (stor_dev.sd_blksize / DEV_BSIZE); + + if (size % stor_dev.sd_blksize) { + dev_printf(dev, + "size=%u is not multiple of device block size=%llu", size, + stor_dev.sd_blksize); + return EINVAL; + } + + if (rsize) + *rsize = 0; + + err = ps3stor_read_sectors(&stor_dev, dev->d_unit, dblk, + size / stor_dev.sd_blksize, 0, buf); + + if (!err && rsize) + *rsize = size; + + if (err) + dev_printf(dev, + "read operation failed dblk=%llu size=%d err=%d", dblk, + size, err); + + return err; +} + +static int ps3cdrom_open(struct open_file *f, ...) +{ + char buf[2048]; + va_list ap; + struct ps3_devdesc *dev; + int err; + + va_start(ap, f); + dev = va_arg(ap, struct ps3_devdesc *); + va_end(ap); + + if (dev->d_unit > 0) { + dev_printf(dev, "attempt to open nonexistent disk"); + return ENXIO; + } + + err = ps3stor_read_sectors(&stor_dev, dev->d_unit, 16, 1, 0, buf); + if (err) + return EIO; + + /* Do not attach if not ISO9660 (workaround for buggy firmware) */ + if (memcmp(buf, "\001CD001", 6) != 0) + return EIO; + + return 0; +} + +static int ps3cdrom_close(struct open_file *f) +{ + return 0; +} + +static void ps3cdrom_print(int verbose) +{ +} diff --git a/sys/boot/powerpc/ps3/ps3stor.c b/sys/boot/powerpc/ps3/ps3stor.c index 667b39ca5e9..bbfc56a7ae2 100644 --- a/sys/boot/powerpc/ps3/ps3stor.c +++ b/sys/boot/powerpc/ps3/ps3stor.c @@ -52,35 +52,39 @@ int ps3stor_setup(struct ps3_stordev *sd, int type) if (err) goto out; - err = ps3repo_read_bus_dev_id(sd->sd_busidx, sd->sd_devidx, &sd->sd_devid); + err = ps3repo_read_bus_dev_id(sd->sd_busidx, sd->sd_devidx, + &sd->sd_devid); if (err) goto out; - err = ps3repo_read_bus_dev_blk_size(sd->sd_busidx, sd->sd_devidx, &sd->sd_blksize); + err = ps3repo_read_bus_dev_blk_size(sd->sd_busidx, sd->sd_devidx, + &sd->sd_blksize); if (err) goto out; - err = ps3repo_read_bus_dev_nblocks(sd->sd_busidx, sd->sd_devidx, &sd->sd_nblocks); + err = ps3repo_read_bus_dev_nblocks(sd->sd_busidx, sd->sd_devidx, + &sd->sd_nblocks); if (err) goto out; - err = ps3repo_read_bus_dev_nregs(sd->sd_busidx, sd->sd_devidx, &sd->sd_nregs); + err = ps3repo_read_bus_dev_nregs(sd->sd_busidx, sd->sd_devidx, + &sd->sd_nregs); if (err) goto out; for (i = 0; i < sd->sd_nregs; i++) { - err = ps3repo_read_bus_dev_reg_id(sd->sd_busidx, sd->sd_devidx, i, - &sd->sd_regs[i].sr_id); + err = ps3repo_read_bus_dev_reg_id(sd->sd_busidx, sd->sd_devidx, + i, &sd->sd_regs[i].sr_id); if (err) goto out; - err = ps3repo_read_bus_dev_reg_start(sd->sd_busidx, sd->sd_devidx, i, - &sd->sd_regs[i].sr_start); + err = ps3repo_read_bus_dev_reg_start(sd->sd_busidx, + sd->sd_devidx, i, &sd->sd_regs[i].sr_start); if (err) goto out; - err = ps3repo_read_bus_dev_reg_size(sd->sd_busidx, sd->sd_devidx, i, - &sd->sd_regs[i].sr_size); + err = ps3repo_read_bus_dev_reg_size(sd->sd_busidx, + sd->sd_devidx, i, &sd->sd_regs[i].sr_size); if (err) goto out; } @@ -109,19 +113,20 @@ out: return err; } +static char dma_buf[2048] __aligned(2048); + int ps3stor_read_sectors(struct ps3_stordev *sd, int regidx, uint64_t start_sector, uint64_t sector_count, uint64_t flags, char *buf) { #define MIN(a, b) ((a) <= (b) ? (a) : (b)) -#define BOUNCE_SECTORS 4 +#define BOUNCE_SECTORS (sizeof(dma_buf) / sd->sd_blksize) #define ASYNC_STATUS_POLL_PERIOD 100 /* microseconds */ struct ps3_storreg *reg = &sd->sd_regs[regidx]; - char dma_buf[sd->sd_blksize * BOUNCE_SECTORS]; uint64_t nleft, nread, nsectors; uint64_t tag, status; unsigned int timeout; - int err; + int err = 0; nleft = sector_count; nread = 0; @@ -129,8 +134,9 @@ int ps3stor_read_sectors(struct ps3_stordev *sd, int regidx, while (nleft) { nsectors = MIN(nleft, BOUNCE_SECTORS); - err = lv1_storage_read(sd->sd_devid, reg->sr_id, start_sector + nread, nsectors, - flags, (uint32_t) dma_buf, &tag); + err = lv1_storage_read(sd->sd_devid, reg->sr_id, + start_sector + nread, nsectors, flags, (uint32_t)dma_buf, + &tag); if (err) return err; @@ -140,7 +146,8 @@ int ps3stor_read_sectors(struct ps3_stordev *sd, int regidx, if (timeout < ASYNC_STATUS_POLL_PERIOD) return ETIMEDOUT; - err = lv1_storage_check_async_status(sd->sd_devid, tag, &status); + err = lv1_storage_check_async_status(sd->sd_devid, tag, + &status); if (!err && !status) break; @@ -148,12 +155,16 @@ int ps3stor_read_sectors(struct ps3_stordev *sd, int regidx, timeout -= ASYNC_STATUS_POLL_PERIOD; } - memcpy(buf + nread * sd->sd_blksize, (u_char *) dma_buf, nsectors * sd->sd_blksize); + if (status != 0) + return EIO; + + memcpy(buf + nread * sd->sd_blksize, (u_char *)dma_buf, + nsectors * sd->sd_blksize); nread += nsectors; nleft -= nsectors; } - return 0; + return err; #undef MIN #undef BOUNCE_SECTORS diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc index 9f5a35701fe..031a1848f80 100644 --- a/sys/conf/files.powerpc +++ b/sys/conf/files.powerpc @@ -207,8 +207,8 @@ powerpc/ps3/ohci_ps3.c optional ps3 ohci powerpc/ps3/if_glc.c optional ps3 glc powerpc/ps3/mmu_ps3.c optional ps3 powerpc/ps3/platform_ps3.c optional ps3 -powerpc/ps3/ps3ata.c optional ps3 ps3ata powerpc/ps3/ps3bus.c optional ps3 +powerpc/ps3/ps3cdrom.c optional ps3 scbus powerpc/ps3/ps3disk.c optional ps3 powerpc/ps3/ps3pic.c optional ps3 powerpc/ps3/ps3_syscons.c optional ps3 sc diff --git a/sys/powerpc/ps3/ps3cdrom.c b/sys/powerpc/ps3/ps3cdrom.c new file mode 100644 index 00000000000..319090cacb5 --- /dev/null +++ b/sys/powerpc/ps3/ps3cdrom.c @@ -0,0 +1,703 @@ +/*- + * Copyright (C) 2010 Nathan Whitehorn + * Copyright (C) 2011 glevand + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification, immediately at the beginning of the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "ps3bus.h" +#include "ps3-hvcall.h" + +#define PS3CDROM_LOCK_INIT(_sc) \ + mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->sc_dev), "ps3cdrom", \ + MTX_DEF) +#define PS3CDROM_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); +#define PS3CDROM_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) +#define PS3CDROM_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) +#define PS3CDROM_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); +#define PS3CDROM_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); + +#define PS3CDROM_MAX_XFERS 3 + +#define LV1_STORAGE_SEND_ATAPI_COMMAND 0x01 + +struct ps3cdrom_softc; + +struct ps3cdrom_xfer { + TAILQ_ENTRY(ps3cdrom_xfer) x_queue; + struct ps3cdrom_softc *x_sc; + union ccb *x_ccb; + bus_dmamap_t x_dmamap; + uint64_t x_tag; +}; + +TAILQ_HEAD(ps3cdrom_xferq, ps3cdrom_xfer); + +struct ps3cdrom_softc { + device_t sc_dev; + + struct mtx sc_mtx; + + uint64_t sc_blksize; + uint64_t sc_nblocks; + + int sc_irqid; + struct resource *sc_irq; + void *sc_irqctx; + + bus_dma_tag_t sc_dmatag; + + struct cam_sim *sc_sim; + struct cam_path *sc_path; + + struct ps3cdrom_xfer sc_xfer[PS3CDROM_MAX_XFERS]; + struct ps3cdrom_xferq sc_active_xferq; + struct ps3cdrom_xferq sc_free_xferq; +}; + +enum lv1_ata_proto { + NON_DATA_PROTO = 0x00, + PIO_DATA_IN_PROTO = 0x01, + PIO_DATA_OUT_PROTO = 0x02, + DMA_PROTO = 0x03 +}; + +enum lv1_ata_in_out { + DIR_WRITE = 0x00, + DIR_READ = 0x01 +}; + +struct lv1_atapi_cmd { + uint8_t pkt[32]; + uint32_t pktlen; + uint32_t nblocks; + uint32_t blksize; + uint32_t proto; /* enum lv1_ata_proto */ + uint32_t in_out; /* enum lv1_ata_in_out */ + uint64_t buf; + uint32_t arglen; +}; + +static void ps3cdrom_action(struct cam_sim *sim, union ccb *ccb); +static void ps3cdrom_poll(struct cam_sim *sim); +static void ps3cdrom_async(void *callback_arg, u_int32_t code, + struct cam_path* path, void *arg); + +static void ps3cdrom_intr(void *arg); + +static void ps3cdrom_transfer(void *arg, bus_dma_segment_t *segs, int nsegs, + int error); + +static int ps3cdrom_decode_lv1_status(uint64_t status, + u_int8_t *sense_key, u_int8_t *asc, u_int8_t *ascq); + +static int +ps3cdrom_probe(device_t dev) +{ + if (ps3bus_get_bustype(dev) != PS3_BUSTYPE_STORAGE || + ps3bus_get_devtype(dev) != PS3_DEVTYPE_CDROM) + return (ENXIO); + + device_set_desc(dev, "Playstation 3 CDROM"); + + return (BUS_PROBE_SPECIFIC); +} + +static int +ps3cdrom_attach(device_t dev) +{ + struct ps3cdrom_softc *sc = device_get_softc(dev); + struct cam_devq *devq; + struct ps3cdrom_xfer *xp; + struct ccb_setasync csa; + int i, err; + + sc->sc_dev = dev; + + PS3CDROM_LOCK_INIT(sc); + + /* Setup interrupt handler */ + + sc->sc_irqid = 0; + sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->sc_irqid, + RF_ACTIVE); + if (!sc->sc_irq) { + device_printf(dev, "Could not allocate IRQ\n"); + err = ENXIO; + goto fail_destroy_lock; + } + + err = bus_setup_intr(dev, sc->sc_irq, + INTR_TYPE_CAM | INTR_MPSAFE | INTR_ENTROPY, + NULL, ps3cdrom_intr, sc, &sc->sc_irqctx); + if (err) { + device_printf(dev, "Could not setup IRQ\n"); + err = ENXIO; + goto fail_release_intr; + } + + /* Setup DMA */ + + err = bus_dma_tag_create(bus_get_dma_tag(dev), 4096, 0, + BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, + BUS_SPACE_UNRESTRICTED, 1, PAGE_SIZE, 0, + busdma_lock_mutex, &sc->sc_mtx, &sc->sc_dmatag); + if (err) { + device_printf(dev, "Could not create DMA tag\n"); + err = ENXIO; + goto fail_teardown_intr; + } + + /* Setup transfer queues */ + + TAILQ_INIT(&sc->sc_active_xferq); + TAILQ_INIT(&sc->sc_free_xferq); + + for (i = 0; i < PS3CDROM_MAX_XFERS; i++) { + xp = &sc->sc_xfer[i]; + xp->x_sc = sc; + + err = bus_dmamap_create(sc->sc_dmatag, BUS_DMA_COHERENT, + &xp->x_dmamap); + if (err) { + device_printf(dev, "Could not create DMA map (%d)\n", + err); + goto fail_destroy_dmamap; + } + + TAILQ_INSERT_TAIL(&sc->sc_free_xferq, xp, x_queue); + } + + /* Setup CAM */ + + devq = cam_simq_alloc(PS3CDROM_MAX_XFERS - 1); + if (!devq) { + device_printf(dev, "Could not allocate SIM queue\n"); + err = ENOMEM; + goto fail_destroy_dmatag; + } + + sc->sc_sim = cam_sim_alloc(ps3cdrom_action, ps3cdrom_poll, "ps3cdrom", + sc, device_get_unit(dev), &sc->sc_mtx, PS3CDROM_MAX_XFERS - 1, 0, + devq); + if (!sc->sc_sim) { + device_printf(dev, "Could not allocate SIM\n"); + cam_simq_free(devq); + err = ENOMEM; + goto fail_destroy_dmatag; + } + + /* Setup XPT */ + + PS3CDROM_LOCK(sc); + + err = xpt_bus_register(sc->sc_sim, dev, 0); + if (err != CAM_SUCCESS) { + device_printf(dev, "Could not register XPT bus\n"); + err = ENXIO; + PS3CDROM_UNLOCK(sc); + goto fail_free_sim; + } + + err = xpt_create_path(&sc->sc_path, NULL, cam_sim_path(sc->sc_sim), + CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD); + if (err != CAM_REQ_CMP) { + device_printf(dev, "Could not create XPT path\n"); + err = ENOMEM; + PS3CDROM_UNLOCK(sc); + goto fail_unregister_xpt_bus; + } + + xpt_setup_ccb(&csa.ccb_h, sc->sc_path, 5); + csa.ccb_h.func_code = XPT_SASYNC_CB; + csa.event_enable = AC_LOST_DEVICE; + csa.callback = ps3cdrom_async; + csa.callback_arg = sc->sc_sim; + xpt_action((union ccb *) &csa); + + CAM_DEBUG(sc->sc_path, CAM_DEBUG_TRACE, + ("registered SIM for ps3cdrom%d\n", device_get_unit(dev))); + + PS3CDROM_UNLOCK(sc); + + return (BUS_PROBE_SPECIFIC); + +fail_unregister_xpt_bus: + + xpt_bus_deregister(cam_sim_path(sc->sc_sim)); + +fail_free_sim: + + cam_sim_free(sc->sc_sim, TRUE); + +fail_destroy_dmamap: + + while ((xp = TAILQ_FIRST(&sc->sc_free_xferq))) { + TAILQ_REMOVE(&sc->sc_free_xferq, xp, x_queue); + bus_dmamap_destroy(sc->sc_dmatag, xp->x_dmamap); + } + +fail_destroy_dmatag: + + bus_dma_tag_destroy(sc->sc_dmatag); + +fail_teardown_intr: + + bus_teardown_intr(dev, sc->sc_irq, sc->sc_irqctx); + +fail_release_intr: + + bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irqid, sc->sc_irq); + +fail_destroy_lock: + + PS3CDROM_LOCK_DESTROY(sc); + + return (err); +} + +static int +ps3cdrom_detach(device_t dev) +{ + struct ps3cdrom_softc *sc = device_get_softc(dev); + int i; + + xpt_async(AC_LOST_DEVICE, sc->sc_path, NULL); + xpt_free_path(sc->sc_path); + xpt_bus_deregister(cam_sim_path(sc->sc_sim)); + cam_sim_free(sc->sc_sim, TRUE); + + for (i = 0; i < PS3CDROM_MAX_XFERS; i++) + bus_dmamap_destroy(sc->sc_dmatag, sc->sc_xfer[i].x_dmamap); + + bus_dma_tag_destroy(sc->sc_dmatag); + + bus_teardown_intr(dev, sc->sc_irq, sc->sc_irqctx); + bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irqid, sc->sc_irq); + + PS3CDROM_LOCK_DESTROY(sc); + + return (0); +} + +static void +ps3cdrom_action(struct cam_sim *sim, union ccb *ccb) +{ + struct ps3cdrom_softc *sc = (struct ps3cdrom_softc *)cam_sim_softc(sim); + device_t dev = sc->sc_dev; + struct ps3cdrom_xfer *xp; + int err; + + PS3CDROM_ASSERT_LOCKED(sc); + + CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, + ("function code 0x%02x\n", ccb->ccb_h.func_code)); + + switch (ccb->ccb_h.func_code) { + case XPT_SCSI_IO: + if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_INPROG) + break; + + if(ccb->ccb_h.target_id > 0) { + ccb->ccb_h.status = CAM_TID_INVALID; + break; + } + + if(ccb->ccb_h.target_lun > 0) { + ccb->ccb_h.status = CAM_LUN_INVALID; + break; + } + + xp = TAILQ_FIRST(&sc->sc_free_xferq); + + KASSERT(xp != NULL, ("no free transfers")); + + xp->x_ccb = ccb; + + TAILQ_REMOVE(&sc->sc_free_xferq, xp, x_queue); + + err = bus_dmamap_load(sc->sc_dmatag, xp->x_dmamap, + ccb->csio.data_ptr, ccb->csio.dxfer_len, ps3cdrom_transfer, + xp, 0); + if (err && err != EINPROGRESS) { + device_printf(dev, "Could not load DMA map (%d)\n", + err); + + xp->x_ccb = NULL; + TAILQ_INSERT_TAIL(&sc->sc_free_xferq, xp, x_queue); + ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR; + break; + } + return; + case XPT_SET_TRAN_SETTINGS: + ccb->ccb_h.status = CAM_FUNC_NOTAVAIL; + break; + case XPT_GET_TRAN_SETTINGS: + { + struct ccb_trans_settings *cts = &ccb->cts; + + cts->protocol = PROTO_SCSI; + cts->protocol_version = SCSI_REV_2; + cts->transport = XPORT_SPI; + cts->transport_version = 2; + cts->proto_specific.valid = 0; + cts->xport_specific.valid = 0; + ccb->ccb_h.status = CAM_REQ_CMP; + break; + } + case XPT_RESET_BUS: + case XPT_RESET_DEV: + ccb->ccb_h.status = CAM_REQ_CMP; + break; + case XPT_CALC_GEOMETRY: + cam_calc_geometry(&ccb->ccg, 1); + break; + case XPT_PATH_INQ: + { + struct ccb_pathinq *cpi = &ccb->cpi; + + cpi->version_num = 1; + cpi->hba_inquiry = 0; + cpi->target_sprt = 0; + cpi->hba_inquiry = PI_SDTR_ABLE; + cpi->hba_misc = PIM_NOBUSRESET | PIM_SEQSCAN | PIM_NO_6_BYTE; + cpi->hba_eng_cnt = 0; + bzero(cpi->vuhba_flags, sizeof(cpi->vuhba_flags)); + cpi->max_target = 0; + cpi->max_lun = 0; + cpi->initiator_id = 7; + cpi->bus_id = cam_sim_bus(sim); + cpi->unit_number = cam_sim_unit(sim); + cpi->base_transfer_speed = 150000; + strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); + strncpy(cpi->hba_vid, "Sony", HBA_IDLEN); + strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); + cpi->transport = XPORT_SPI; + cpi->transport_version = 2; + cpi->protocol = PROTO_SCSI; + cpi->protocol_version = SCSI_REV_2; + cpi->maxio = PAGE_SIZE; + cpi->ccb_h.status = CAM_REQ_CMP; + break; + } + default: + CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, + ("unsupported function code 0x%02x\n", + ccb->ccb_h.func_code)); + ccb->ccb_h.status = CAM_REQ_INVALID; + break; + } + + xpt_done(ccb); +} + +static void +ps3cdrom_poll(struct cam_sim *sim) +{ + ps3cdrom_intr(cam_sim_softc(sim)); +} + +static void +ps3cdrom_async(void *callback_arg, u_int32_t code, + struct cam_path* path, void *arg) +{ + switch (code) { + case AC_LOST_DEVICE: + xpt_print_path(path); + break; + default: + break; + } +} + +static void +ps3cdrom_intr(void *arg) +{ + struct ps3cdrom_softc *sc = (struct ps3cdrom_softc *) arg; + device_t dev = sc->sc_dev; + uint64_t devid = ps3bus_get_device(dev); + struct ps3cdrom_xfer *xp; + union ccb *ccb; + u_int8_t *cdb, sense_key, asc, ascq; + uint64_t tag, status; + + if (lv1_storage_get_async_status(devid, &tag, &status) != 0) + return; + + PS3CDROM_LOCK(sc); + + /* Find transfer with the returned tag */ + + TAILQ_FOREACH(xp, &sc->sc_active_xferq, x_queue) { + if (xp->x_tag == tag) + break; + } + + if (xp) { + ccb = xp->x_ccb; + cdb = (ccb->ccb_h.flags & CAM_CDB_POINTER) ? + ccb->csio.cdb_io.cdb_ptr : + ccb->csio.cdb_io.cdb_bytes; + + CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, + ("ATAPI command 0x%02x tag 0x%016lx completed (0x%016lx)\n", + cdb[0], tag, status)); + + if (!status) { + ccb->csio.scsi_status = SCSI_STATUS_OK; + ccb->csio.resid = 0; + ccb->ccb_h.status = CAM_REQ_CMP; + } else { + ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; + ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR; + + if (!ps3cdrom_decode_lv1_status(status, &sense_key, + &asc, &ascq)) { + struct scsi_sense_data sense_data; + + CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, + ("sense key 0x%02x asc 0x%02x ascq 0x%02x\n", + sense_key, asc, ascq)); + + bzero(&sense_data, sizeof(sense_data)); + sense_data.error_code = SSD_CURRENT_ERROR; + sense_data.flags |= sense_key; + sense_data.extra_len = 0xa; + sense_data.add_sense_code = asc; + sense_data.add_sense_code_qual = ascq; + ccb->csio.sense_len = sizeof(sense_data); + bcopy(&sense_data, &ccb->csio.sense_data, + ccb->csio.sense_len); + ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR | + CAM_AUTOSNS_VALID; + } + + if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) + ccb->csio.resid = ccb->csio.dxfer_len; + } + + if (ccb->ccb_h.flags & CAM_DIR_IN) + bus_dmamap_sync(sc->sc_dmatag, xp->x_dmamap, + BUS_DMASYNC_POSTREAD); + + bus_dmamap_unload(sc->sc_dmatag, xp->x_dmamap); + + xp->x_ccb = NULL; + TAILQ_REMOVE(&sc->sc_active_xferq, xp, x_queue); + TAILQ_INSERT_TAIL(&sc->sc_free_xferq, xp, x_queue); + + xpt_done(ccb); + } else { + device_printf(dev, + "Could not find transfer with tag 0x%016lx\n", tag); + } + + PS3CDROM_UNLOCK(sc); +} + +static void +ps3cdrom_transfer(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ + struct ps3cdrom_xfer *xp = (struct ps3cdrom_xfer *) arg; + struct ps3cdrom_softc *sc = xp->x_sc; + device_t dev = sc->sc_dev; + uint64_t devid = ps3bus_get_device(dev); + union ccb *ccb = xp->x_ccb; + u_int8_t *cdb; + uint64_t start_sector, block_count; + int err; + + KASSERT(nsegs == 1, ("invalid number of DMA segments")); + + PS3CDROM_ASSERT_LOCKED(sc); + + if (error) { + device_printf(dev, "Could not load DMA map (%d)\n", error); + + xp->x_ccb = NULL; + TAILQ_INSERT_TAIL(&sc->sc_free_xferq, xp, x_queue); + ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR; + xpt_done(ccb); + return; + } + + cdb = (ccb->ccb_h.flags & CAM_CDB_POINTER) ? + ccb->csio.cdb_io.cdb_ptr : + ccb->csio.cdb_io.cdb_bytes; + + CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, + ("ATAPI command 0x%02x cdb_len %d dxfer_len %d\n ", cdb[0], + ccb->csio.cdb_len, ccb->csio.dxfer_len)); + + switch (cdb[0]) { + case READ_10: + start_sector = (cdb[2] << 24) | (cdb[3] << 16) | + (cdb[4] << 8) | cdb[5]; + block_count = (cdb[7] << 8) | cdb[8]; + + err = lv1_storage_read(devid, 0 /* region id */, + start_sector, block_count, 0 /* flags */, segs[0].ds_addr, + &xp->x_tag); + bus_dmamap_sync(sc->sc_dmatag, xp->x_dmamap, + BUS_DMASYNC_POSTREAD); + break; + case WRITE_10: + start_sector = (cdb[2] << 24) | (cdb[3] << 16) | + (cdb[4] << 8) | cdb[5]; + block_count = (cdb[7] << 8) | cdb[8]; + + bus_dmamap_sync(sc->sc_dmatag, xp->x_dmamap, + BUS_DMASYNC_PREWRITE); + err = lv1_storage_write(devid, 0 /* region id */, + start_sector, block_count, 0 /* flags */, + segs[0].ds_addr, &xp->x_tag); + break; + default: + { + struct lv1_atapi_cmd atapi_cmd; + + bzero(&atapi_cmd, sizeof(atapi_cmd)); + atapi_cmd.pktlen = 12; + bcopy(cdb, atapi_cmd.pkt, ccb->csio.cdb_len); + + if (ccb->ccb_h.flags & CAM_DIR_IN) { + atapi_cmd.in_out = DIR_READ; + atapi_cmd.proto = (ccb->csio.dxfer_len >= 2048) ? + DMA_PROTO : PIO_DATA_IN_PROTO; + } else if (ccb->ccb_h.flags & CAM_DIR_OUT) { + atapi_cmd.in_out = DIR_WRITE; + atapi_cmd.proto = (ccb->csio.dxfer_len >= 2048) ? + DMA_PROTO : PIO_DATA_OUT_PROTO; + } else { + atapi_cmd.proto = NON_DATA_PROTO; + } + + atapi_cmd.nblocks = atapi_cmd.arglen = segs[0].ds_len; + atapi_cmd.blksize = 1; + atapi_cmd.buf = segs[0].ds_addr; + + if (ccb->ccb_h.flags & CAM_DIR_OUT) + bus_dmamap_sync(sc->sc_dmatag, xp->x_dmamap, + BUS_DMASYNC_PREWRITE); + + err = lv1_storage_send_device_command(devid, + LV1_STORAGE_SEND_ATAPI_COMMAND, vtophys(&atapi_cmd), + sizeof(atapi_cmd), atapi_cmd.buf, atapi_cmd.arglen, + &xp->x_tag); + + break; + } + } + + if (err) { + struct scsi_sense_data sense_data; + + device_printf(dev, "ATAPI command 0x%02x failed (%d)\n", + cdb[0], err); + + bus_dmamap_unload(sc->sc_dmatag, xp->x_dmamap); + + xp->x_ccb = NULL; + TAILQ_INSERT_TAIL(&sc->sc_free_xferq, xp, x_queue); + + bzero(&sense_data, sizeof(sense_data)); + sense_data.error_code = SSD_CURRENT_ERROR; + sense_data.flags |= SSD_KEY_ILLEGAL_REQUEST; + ccb->csio.sense_len = sizeof(sense_data); + bcopy(&sense_data, &ccb->csio.sense_data, ccb->csio.sense_len); + ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; + xpt_done(ccb); + } else { + CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, + ("ATAPI command 0x%02x tag 0x%016lx submitted\n ", cdb[0], + xp->x_tag)); + + TAILQ_INSERT_TAIL(&sc->sc_active_xferq, xp, x_queue); + ccb->ccb_h.status |= CAM_SIM_QUEUED; + } +} + +static int +ps3cdrom_decode_lv1_status(uint64_t status, u_int8_t *sense_key, u_int8_t *asc, + u_int8_t *ascq) +{ + if (((status >> 24) & 0xff) != SCSI_STATUS_CHECK_COND) + return -1; + + *sense_key = (status >> 16) & 0xff; + *asc = (status >> 8) & 0xff; + *ascq = status & 0xff; + + return (0); +} + +static device_method_t ps3cdrom_methods[] = { + DEVMETHOD(device_probe, ps3cdrom_probe), + DEVMETHOD(device_attach, ps3cdrom_attach), + DEVMETHOD(device_detach, ps3cdrom_detach), + {0, 0}, +}; + +static driver_t ps3cdrom_driver = { + "ps3cdrom", + ps3cdrom_methods, + sizeof(struct ps3cdrom_softc), +}; + +static devclass_t ps3cdrom_devclass; + +DRIVER_MODULE(ps3cdrom, ps3bus, ps3cdrom_driver, ps3cdrom_devclass, 0, 0); +MODULE_DEPEND(ps3cdrom, cam, 1, 1, 1); From d57486e21cc23acfc50574623f70d9a68192c4ec Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sun, 14 Aug 2011 00:42:09 +0000 Subject: [PATCH 237/452] Updates to libprocstat(3) and procstat(1) to allow monitoring Capsicum capability mode and capabilities. Right now no attempt is made to unwrap capabilities when operating on a crashdump, so further refinement is required. Approved by: re (bz) Sponsored by: Google Inc --- lib/libprocstat/libprocstat.c | 28 ++-- lib/libprocstat/libprocstat.h | 2 + usr.bin/procstat/procstat.1 | 34 +++- usr.bin/procstat/procstat.c | 16 +- usr.bin/procstat/procstat.h | 2 +- usr.bin/procstat/procstat_cred.c | 8 +- usr.bin/procstat/procstat_files.c | 264 ++++++++++++++++++++++++------ 7 files changed, 281 insertions(+), 73 deletions(-) diff --git a/lib/libprocstat/libprocstat.c b/lib/libprocstat/libprocstat.c index 22ca668e4b3..facce1136f4 100644 --- a/lib/libprocstat/libprocstat.c +++ b/lib/libprocstat/libprocstat.c @@ -282,7 +282,7 @@ procstat_freefiles(struct procstat *procstat, struct filestat_list *head) static struct filestat * filestat_new_entry(void *typedep, int type, int fd, int fflags, int uflags, - int refcount, off_t offset, char *path) + int refcount, off_t offset, char *path, cap_rights_t cap_rights) { struct filestat *entry; @@ -299,6 +299,7 @@ filestat_new_entry(void *typedep, int type, int fd, int fflags, int uflags, entry->fs_ref_count = refcount; entry->fs_offset = offset; entry->fs_path = path; + entry->fs_cap_rights = cap_rights; return (entry); } @@ -381,21 +382,21 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap /* root directory vnode, if one. */ if (filed.fd_rdir) { entry = filestat_new_entry(filed.fd_rdir, PS_FST_TYPE_VNODE, -1, - PS_FST_FFLAG_READ, PS_FST_UFLAG_RDIR, 0, 0, NULL); + PS_FST_FFLAG_READ, PS_FST_UFLAG_RDIR, 0, 0, NULL, 0); if (entry != NULL) STAILQ_INSERT_TAIL(head, entry, next); } /* current working directory vnode. */ if (filed.fd_cdir) { entry = filestat_new_entry(filed.fd_cdir, PS_FST_TYPE_VNODE, -1, - PS_FST_FFLAG_READ, PS_FST_UFLAG_CDIR, 0, 0, NULL); + PS_FST_FFLAG_READ, PS_FST_UFLAG_CDIR, 0, 0, NULL, 0); if (entry != NULL) STAILQ_INSERT_TAIL(head, entry, next); } /* jail root, if any. */ if (filed.fd_jdir) { entry = filestat_new_entry(filed.fd_jdir, PS_FST_TYPE_VNODE, -1, - PS_FST_FFLAG_READ, PS_FST_UFLAG_JAIL, 0, 0, NULL); + PS_FST_FFLAG_READ, PS_FST_UFLAG_JAIL, 0, 0, NULL, 0); if (entry != NULL) STAILQ_INSERT_TAIL(head, entry, next); } @@ -403,14 +404,14 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap if (kp->ki_tracep) { entry = filestat_new_entry(kp->ki_tracep, PS_FST_TYPE_VNODE, -1, PS_FST_FFLAG_READ | PS_FST_FFLAG_WRITE, - PS_FST_UFLAG_TRACE, 0, 0, NULL); + PS_FST_UFLAG_TRACE, 0, 0, NULL, 0); if (entry != NULL) STAILQ_INSERT_TAIL(head, entry, next); } /* text vnode, if one */ if (kp->ki_textvp) { entry = filestat_new_entry(kp->ki_textvp, PS_FST_TYPE_VNODE, -1, - PS_FST_FFLAG_READ, PS_FST_UFLAG_TEXT, 0, 0, NULL); + PS_FST_FFLAG_READ, PS_FST_UFLAG_TEXT, 0, 0, NULL, 0); if (entry != NULL) STAILQ_INSERT_TAIL(head, entry, next); } @@ -418,7 +419,7 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap if ((vp = getctty(kd, kp)) != NULL) { entry = filestat_new_entry(vp, PS_FST_TYPE_VNODE, -1, PS_FST_FFLAG_READ | PS_FST_FFLAG_WRITE, - PS_FST_UFLAG_CTTY, 0, 0, NULL); + PS_FST_UFLAG_CTTY, 0, 0, NULL, 0); if (entry != NULL) STAILQ_INSERT_TAIL(head, entry, next); } @@ -471,8 +472,9 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap default: continue; } + /* XXXRW: No capability rights support for kvm yet. */ entry = filestat_new_entry(data, type, i, - to_filestat_flags(file.f_flag), 0, 0, 0, NULL); + to_filestat_flags(file.f_flag), 0, 0, 0, NULL, 0); if (entry != NULL) STAILQ_INSERT_TAIL(head, entry, next); } @@ -531,7 +533,7 @@ do_mmapped: */ entry = filestat_new_entry(object.handle, PS_FST_TYPE_VNODE, -1, fflags, - PS_FST_UFLAG_MMAP, 0, 0, NULL); + PS_FST_UFLAG_MMAP, 0, 0, NULL, 0); if (entry != NULL) STAILQ_INSERT_TAIL(head, entry, next); } @@ -586,6 +588,7 @@ kinfo_fflags2fst(int kfflags) } kfflags2fst[] = { { KF_FLAG_APPEND, PS_FST_FFLAG_APPEND }, { KF_FLAG_ASYNC, PS_FST_FFLAG_ASYNC }, + { KF_FLAG_CAPABILITY, PS_FST_FFLAG_CAPABILITY }, { KF_FLAG_CREAT, PS_FST_FFLAG_CREAT }, { KF_FLAG_DIRECT, PS_FST_FFLAG_DIRECT }, { KF_FLAG_EXCL, PS_FST_FFLAG_EXCL }, @@ -644,6 +647,7 @@ procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int m int cnt, fd, fflags; int i, type, uflags; int refcount; + cap_rights_t cap_rights; assert(kp); if (kp->ki_fd == NULL) @@ -676,12 +680,13 @@ procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int m path = strdup(kif->kf_path); else path = NULL; + cap_rights = kif->kf_cap_rights; /* * Create filestat entry. */ entry = filestat_new_entry(kif, type, fd, fflags, uflags, - refcount, offset, path); + refcount, offset, path, cap_rights); if (entry != NULL) STAILQ_INSERT_TAIL(head, entry, next); } @@ -707,7 +712,8 @@ procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int m else path = NULL; entry = filestat_new_entry(kve, PS_FST_TYPE_VNODE, -1, - fflags, PS_FST_UFLAG_MMAP, refcount, offset, path); + fflags, PS_FST_UFLAG_MMAP, refcount, offset, path, + 0); if (entry != NULL) STAILQ_INSERT_TAIL(head, entry, next); } diff --git a/lib/libprocstat/libprocstat.h b/lib/libprocstat/libprocstat.h index 62b1bd53bae..f1ca109afcb 100644 --- a/lib/libprocstat/libprocstat.h +++ b/lib/libprocstat/libprocstat.h @@ -88,6 +88,7 @@ #define PS_FST_FFLAG_DIRECT 0x1000 #define PS_FST_FFLAG_EXEC 0x2000 #define PS_FST_FFLAG_HASLOCK 0x4000 +#define PS_FST_FFLAG_CAPABILITY 0x8000 struct procstat; struct filestat { @@ -101,6 +102,7 @@ struct filestat { void *fs_typedep; /* Type dependent data. */ char *fs_path; STAILQ_ENTRY(filestat) next; + cap_rights_t fs_cap_rights; /* Capability rights, if flag set. */ }; struct vnstat { uint64_t vn_fileid; diff --git a/usr.bin/procstat/procstat.1 b/usr.bin/procstat/procstat.1 index 0113e377c3e..35fab1fd390 100644 --- a/usr.bin/procstat/procstat.1 +++ b/usr.bin/procstat/procstat.1 @@ -1,5 +1,5 @@ .\"- -.\" Copyright (c) 2007-2008 Robert N. M. Watson +.\" Copyright (c) 2007-2009 Robert N. M. Watson .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 7, 2010 +.Dd August 14, 2011 .Dt PROCSTAT 1 .Os .Sh NAME @@ -35,6 +35,7 @@ .Nm .Op Fl h .Op Fl n +.Op Fl C .Op Fl w Ar interval .Op Fl b | c | f | i | j | k | s | t | v .Op Fl a | Ar pid ... @@ -88,6 +89,11 @@ If the .Fl w flag is not specified, the output will not repeat. .Pp +The +.Fl C +flag requests the printing of additional capability information in the file +descriptor view. +.Pp Some information, such as VM and file descriptor information, is available only to the owner of a process or the superuser. .Ss Binary Information @@ -116,7 +122,8 @@ command line arguments (if available) Display detailed information about each file descriptor referenced by a process, including the process ID, command, file descriptor number, and per-file descriptor object information, such as object type and file system -path: +path. +By default, the following information will be printed: .Pp .Bl -tag -width indent -compact .It PID @@ -208,7 +215,17 @@ non-blocking direct I/O .It l lock held +.It c +descriptor is a capability .El +.Pp +If the +.Fl C +flag is specified, the vnode type, reference count, and offset fields will be +omitted, and a new capabilities field will be included listing capabilities, +as described in +.Xr cap_new 2 , +present for each capability descriptor. .Ss Signal Disposition Information Display signal pending and disposition for a process: .Pp @@ -306,9 +323,18 @@ effective group ID real group ID .It SVGID saved group ID +.It FLAGS +credential flags .It GROUPS group set .El +.Pp +The following credential flags may be displayed: +.Pp +.Bl -tag -width X -compact +.It C +capability mode +.El .Ss Thread Information Display per-thread information, including process ID, per-thread ID, name, CPU, and execution state: @@ -402,6 +428,8 @@ needs copy .Xr fstat 1 , .Xr ps 1 , .Xr sockstat 1 , +.Xr cap_enter 2 , +.Xr cap_new 2 , .Xr ddb 4 , .Xr stack 9 .Sh AUTHORS diff --git a/usr.bin/procstat/procstat.c b/usr.bin/procstat/procstat.c index 69648fdedac..97ff8792e58 100644 --- a/usr.bin/procstat/procstat.c +++ b/usr.bin/procstat/procstat.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2007 Robert N. M. Watson + * Copyright (c) 2007, 2011 Robert N. M. Watson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -40,13 +40,13 @@ #include "procstat.h" static int aflag, bflag, cflag, fflag, iflag, jflag, kflag, sflag, tflag, vflag; -int hflag, nflag; +int hflag, nflag, Cflag; static void usage(void) { - fprintf(stderr, "usage: procstat [-h] [-M core] [-N system] " + fprintf(stderr, "usage: procstat [-h] [-C] [-M core] [-N system] " "[-w interval] [-b | -c | -f | -i | -j | -k | -s | -t | -v]\n"); fprintf(stderr, " [-a | pid ...]\n"); exit(EX_USAGE); @@ -117,8 +117,12 @@ main(int argc, char *argv[]) interval = 0; memf = nlistf = NULL; - while ((ch = getopt(argc, argv, "N:M:abcfijkhstvw:")) != -1) { + while ((ch = getopt(argc, argv, "CN:M:abcfijkhstvw:")) != -1) { switch (ch) { + case 'C': + Cflag++; + break; + case 'M': memf = optarg; break; @@ -204,6 +208,10 @@ main(int argc, char *argv[]) if (!(aflag == 1 && argc == 0) && !(aflag == 0 && argc > 0)) usage(); + /* Only allow -C with -f. */ + if (Cflag && !fflag) + usage(); + if (memf != NULL) prstat = procstat_open_kvm(nlistf, memf); else diff --git a/usr.bin/procstat/procstat.h b/usr.bin/procstat/procstat.h index ad425f30cdf..71e3ca7e4f7 100644 --- a/usr.bin/procstat/procstat.h +++ b/usr.bin/procstat/procstat.h @@ -29,7 +29,7 @@ #ifndef PROCSTAT_H #define PROCSTAT_H -extern int hflag, nflag; +extern int hflag, nflag, Cflag; struct kinfo_proc; void kinfo_proc_sort(struct kinfo_proc *kipp, int count); diff --git a/usr.bin/procstat/procstat_cred.c b/usr.bin/procstat/procstat_cred.c index ea8fdfd5ef4..12db42948e3 100644 --- a/usr.bin/procstat/procstat_cred.c +++ b/usr.bin/procstat/procstat_cred.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2007 Robert N. M. Watson + * Copyright (c) 2007-2008 Robert N. M. Watson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,9 +48,9 @@ procstat_cred(struct kinfo_proc *kipp) gid_t *groups = NULL; if (!hflag) - printf("%5s %-16s %5s %5s %5s %5s %5s %5s %-20s\n", "PID", + printf("%5s %-16s %5s %5s %5s %5s %5s %5s %5s %-15s\n", "PID", "COMM", "EUID", "RUID", "SVUID", "EGID", "RGID", "SVGID", - "GROUPS"); + "FLAGS", "GROUPS"); printf("%5d ", kipp->ki_pid); printf("%-16s ", kipp->ki_comm); @@ -60,6 +60,8 @@ procstat_cred(struct kinfo_proc *kipp) printf("%5d ", kipp->ki_groups[0]); printf("%5d ", kipp->ki_rgid); printf("%5d ", kipp->ki_svgid); + printf("%s", kipp->ki_cr_flags & CRED_FLAG_CAPMODE ? "C" : "-"); + printf(" "); /* * We may have too many groups to fit in kinfo_proc's statically diff --git a/usr.bin/procstat/procstat_files.c b/usr.bin/procstat/procstat_files.c index f7d91a4384b..84737a1f2f8 100644 --- a/usr.bin/procstat/procstat_files.c +++ b/usr.bin/procstat/procstat_files.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2007 Robert N. M. Watson + * Copyright (c) 2007-2011 Robert N. M. Watson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,6 +27,7 @@ */ #include +#include #include #include #include @@ -131,6 +132,133 @@ print_address(struct sockaddr_storage *ss) printf("%s", addr); } +static struct cap_desc { + cap_rights_t cd_right; + const char *cd_desc; +} cap_desc[] = { + /* General file I/O. */ + { CAP_READ, "rd" }, + { CAP_WRITE, "wr" }, + { CAP_MMAP, "mm" }, + { CAP_MAPEXEC, "me" }, + { CAP_FEXECVE, "fe" }, + { CAP_FSYNC, "fy" }, + { CAP_FTRUNCATE, "ft" }, + { CAP_SEEK, "se" }, + + /* VFS methods. */ + { CAP_FCHFLAGS, "cf" }, + { CAP_FCHDIR, "cd" }, + { CAP_FCHMOD, "cm" }, + { CAP_FCHOWN, "cn" }, + { CAP_FCNTL, "fc" }, + { CAP_FPATHCONF, "fp" }, + { CAP_FLOCK, "fl" }, + { CAP_FSCK, "fk" }, + { CAP_FSTAT, "fs" }, + { CAP_FSTATFS, "sf" }, + { CAP_FUTIMES, "fu" }, + { CAP_CREATE, "cr" }, + { CAP_DELETE, "de" }, + { CAP_MKDIR, "md" }, + { CAP_RMDIR, "rm" }, + { CAP_MKFIFO, "mf" }, + + /* Lookups - used to constraint *at() calls. */ + { CAP_LOOKUP, "lo" }, + + /* Extended attributes. */ + { CAP_EXTATTR_GET, "eg" }, + { CAP_EXTATTR_SET, "es" }, + { CAP_EXTATTR_DELETE, "ed" }, + { CAP_EXTATTR_LIST, "el" }, + + /* Access Control Lists. */ + { CAP_ACL_GET, "ag" }, + { CAP_ACL_SET, "as" }, + { CAP_ACL_DELETE, "ad" }, + { CAP_ACL_CHECK, "ac" }, + + /* Socket operations. */ + { CAP_ACCEPT, "at" }, + { CAP_BIND, "bd" }, + { CAP_CONNECT, "co" }, + { CAP_GETPEERNAME, "pn" }, + { CAP_GETSOCKNAME, "sn" }, + { CAP_GETSOCKOPT, "gs" }, + { CAP_LISTEN, "ln" }, + { CAP_PEELOFF, "pf" }, + { CAP_SETSOCKOPT, "ss" }, + { CAP_SHUTDOWN, "sh" }, + + /* Mandatory Access Control. */ + { CAP_MAC_GET, "mg" }, + { CAP_MAC_SET, "ms" }, + + /* Methods on semaphores. */ + { CAP_SEM_GETVALUE, "sg" }, + { CAP_SEM_POST, "sp" }, + { CAP_SEM_WAIT, "sw" }, + + /* Event monitoring and posting. */ + { CAP_POLL_EVENT, "po" }, + { CAP_POST_EVENT, "ev" }, + + /* Strange and powerful rights that should not be given lightly. */ + { CAP_IOCTL, "io" }, + { CAP_TTYHOOK, "ty" }, + +#ifdef NOTYET + { CAP_PDGETPID, "pg" }, + { CAP_PDWAIT4, "pw" }, + { CAP_PDKILL, "pk" }, +#endif +}; +static const u_int cap_desc_count = sizeof(cap_desc) / + sizeof(cap_desc[0]); + +static u_int +width_capability(cap_rights_t rights) +{ + u_int count, i, width; + + count = 0; + width = 0; + for (i = 0; i < cap_desc_count; i++) { + if (rights & cap_desc[i].cd_right) { + width += strlen(cap_desc[i].cd_desc); + if (count) + width++; + count++; + } + } + return (width); +} + +static void +print_capability(cap_rights_t rights, u_int capwidth) +{ + u_int count, i, width; + + count = 0; + width = 0; + for (i = width_capability(rights); i < capwidth; i++) { + if (rights || i != 0) + printf(" "); + else + printf("-"); + } + for (i = 0; i < cap_desc_count; i++) { + if (rights & cap_desc[i].cd_right) { + printf("%s%s", count ? "," : "", cap_desc[i].cd_desc); + width += strlen(cap_desc[i].cd_desc); + if (count) + width++; + count++; + } + } +} + void procstat_files(struct procstat *procstat, struct kinfo_proc *kipp) { @@ -139,14 +267,39 @@ procstat_files(struct procstat *procstat, struct kinfo_proc *kipp) struct filestat *fst; const char *str; struct vnstat vn; + u_int capwidth, width; int error; - if (!hflag) - printf("%5s %-16s %4s %1s %1s %-8s %3s %7s %-3s %-12s\n", - "PID", "COMM", "FD", "T", "V", "FLAGS", "REF", "OFFSET", - "PRO", "NAME"); - + /* + * To print the header in capability mode, we need to know the width + * of the widest capability string. Even if we get no processes + * back, we will print the header, so we defer aborting due to a lack + * of processes until after the header logic. + */ + capwidth = 0; head = procstat_getfiles(procstat, kipp, 0); + if (head != NULL && Cflag) { + STAILQ_FOREACH(fst, head, next) { + width = width_capability(fst->fs_cap_rights); + if (width > capwidth) + capwidth = width; + } + if (capwidth < strlen("CAPABILITIES")) + capwidth = strlen("CAPABILITIES"); + } + + if (!hflag) { + if (Cflag) + printf("%5s %-16s %4s %1s %-9s %-*s " + "%-3s %-12s\n", "PID", "COMM", "FD", "T", + "FLAGS", capwidth, "CAPABILITIES", "PRO", + "NAME"); + else + printf("%5s %-16s %4s %1s %1s %-9s " + "%3s %7s %-3s %-12s\n", "PID", "COMM", "FD", "T", + "V", "FLAGS", "REF", "OFFSET", "PRO", "NAME"); + } + if (head == NULL) return; STAILQ_FOREACH(fst, head, next) { @@ -215,50 +368,53 @@ procstat_files(struct procstat *procstat, struct kinfo_proc *kipp) break; } printf("%1s ", str); - str = "-"; - if (fst->fs_type == PS_FST_TYPE_VNODE) { - error = procstat_get_vnode_info(procstat, fst, &vn, NULL); - switch (vn.vn_type) { - case PS_FST_VTYPE_VREG: - str = "r"; - break; + if (!Cflag) { + str = "-"; + if (fst->fs_type == PS_FST_TYPE_VNODE) { + error = procstat_get_vnode_info(procstat, fst, + &vn, NULL); + switch (vn.vn_type) { + case PS_FST_VTYPE_VREG: + str = "r"; + break; - case PS_FST_VTYPE_VDIR: - str = "d"; - break; + case PS_FST_VTYPE_VDIR: + str = "d"; + break; - case PS_FST_VTYPE_VBLK: - str = "b"; - break; + case PS_FST_VTYPE_VBLK: + str = "b"; + break; - case PS_FST_VTYPE_VCHR: - str = "c"; - break; + case PS_FST_VTYPE_VCHR: + str = "c"; + break; - case PS_FST_VTYPE_VLNK: - str = "l"; - break; + case PS_FST_VTYPE_VLNK: + str = "l"; + break; - case PS_FST_VTYPE_VSOCK: - str = "s"; - break; + case PS_FST_VTYPE_VSOCK: + str = "s"; + break; - case PS_FST_VTYPE_VFIFO: - str = "f"; - break; + case PS_FST_VTYPE_VFIFO: + str = "f"; + break; - case PS_FST_VTYPE_VBAD: - str = "x"; - break; + case PS_FST_VTYPE_VBAD: + str = "x"; + break; - case PS_FST_VTYPE_VNON: - case PS_FST_VTYPE_UNKNOWN: - default: - str = "?"; - break; + case PS_FST_VTYPE_VNON: + case PS_FST_VTYPE_UNKNOWN: + default: + str = "?"; + break; + } } + printf("%1s ", str); } - printf("%1s ", str); printf("%s", fst->fs_fflags & PS_FST_FFLAG_READ ? "r" : "-"); printf("%s", fst->fs_fflags & PS_FST_FFLAG_WRITE ? "w" : "-"); printf("%s", fst->fs_fflags & PS_FST_FFLAG_APPEND ? "a" : "-"); @@ -266,16 +422,23 @@ procstat_files(struct procstat *procstat, struct kinfo_proc *kipp) printf("%s", fst->fs_fflags & PS_FST_FFLAG_SYNC ? "f" : "-"); printf("%s", fst->fs_fflags & PS_FST_FFLAG_NONBLOCK ? "n" : "-"); printf("%s", fst->fs_fflags & PS_FST_FFLAG_DIRECT ? "d" : "-"); - printf("%s ", fst->fs_fflags & PS_FST_FFLAG_HASLOCK ? "l" : "-"); - if (fst->fs_ref_count > -1) - printf("%3d ", fst->fs_ref_count); - else - printf("%3c ", '-'); - if (fst->fs_offset > -1) - printf("%7jd ", (intmax_t)fst->fs_offset); - else - printf("%7c ", '-'); - + printf("%s", fst->fs_fflags & PS_FST_FFLAG_HASLOCK ? "l" : "-"); + printf("%s ", fst->fs_fflags & PS_FST_FFLAG_CAPABILITY ? + "c" : "-"); + if (!Cflag) { + if (fst->fs_ref_count > -1) + printf("%3d ", fst->fs_ref_count); + else + printf("%3c ", '-'); + if (fst->fs_offset > -1) + printf("%7jd ", (intmax_t)fst->fs_offset); + else + printf("%7c ", '-'); + } + if (Cflag) { + print_capability(fst->fs_cap_rights, capwidth); + printf(" "); + } switch (fst->fs_type) { case PS_FST_TYPE_VNODE: case PS_FST_TYPE_FIFO: @@ -314,7 +477,6 @@ procstat_files(struct procstat *procstat, struct kinfo_proc *kipp) break; default: - printf("%-3s ", "-"); printf("%-18s", "-"); } From a3427d6a49ac4e6f57a50304d5ac651c48f95b21 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sun, 14 Aug 2011 12:41:44 +0000 Subject: [PATCH 238/452] Cross-reference cap_new(2) from dup(2), as they have similar functionality. Approved by: re (kib) --- lib/libc/sys/dup.2 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/libc/sys/dup.2 b/lib/libc/sys/dup.2 index c87b3861248..f6f6f46b2a4 100644 --- a/lib/libc/sys/dup.2 +++ b/lib/libc/sys/dup.2 @@ -28,7 +28,7 @@ .\" @(#)dup.2 8.1 (Berkeley) 6/4/93 .\" $FreeBSD$ .\" -.Dd June 4, 1993 +.Dd August 14, 2011 .Dt DUP 2 .Os .Sh NAME @@ -115,6 +115,11 @@ and is a valid descriptor, then .Fn dup2 is successful, and does nothing. +.Pp +The related +.Xr cap_new 2 +system call allows file descriptors to be duplicated with restrictions on +their use. .Sh RETURN VALUES The value -1 is returned if an error occurs in either call. The external variable @@ -139,6 +144,7 @@ Too many descriptors are active. .El .Sh SEE ALSO .Xr accept 2 , +.Xr cap_new 2 , .Xr close 2 , .Xr fcntl 2 , .Xr getdtablesize 2 , From 54d34ff63deb6b929444de83db4c9fa96e7ba6e5 Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Sun, 14 Aug 2011 13:37:38 +0000 Subject: [PATCH 239/452] tail: Fix crash if -F'ed file's filesystem disappears. If tail notices that a file it is following no longer exists (because stat() fails), it will output any final lines and then close the file. If the read operation also causes an error, such as when the filesystem is forcefully unmounted, it closes the file as well, leading to fclose(NULL) and a segmentation fault. PR: bin/159750 Submitted by: swills Approved by: re (kib) MFC after: 1 week --- usr.bin/tail/forward.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/usr.bin/tail/forward.c b/usr.bin/tail/forward.c index 6ed5691c366..e1e0638d7ad 100644 --- a/usr.bin/tail/forward.c +++ b/usr.bin/tail/forward.c @@ -361,8 +361,10 @@ follow(file_info_t *files, enum STYLE style, off_t off) if (errno != ENOENT) ierr(file->file_name); show(file); - fclose(file->fp); - file->fp = NULL; + if (file->fp != NULL) { + fclose(file->fp); + file->fp = NULL; + } ev_change++; continue; } From 11f6a0164ffb0a5a4f4c723481dd6a9f658976f2 Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Sun, 14 Aug 2011 14:36:32 +0000 Subject: [PATCH 240/452] Provide a kboot.conf to allow powerpc64 install media to be booted on Playstation 3 consoles running kboot or petitboot. Approved by: re (bz) --- release/powerpc/mkisoimages.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/release/powerpc/mkisoimages.sh b/release/powerpc/mkisoimages.sh index 5d5e7500588..9542d2f369a 100644 --- a/release/powerpc/mkisoimages.sh +++ b/release/powerpc/mkisoimages.sh @@ -45,6 +45,9 @@ if [ "x$1" = "x-b" ]; then EOF bootable="$bootable -o chrp-boot" + # Playstation 3 boot code + echo "FreeBSD Install='/boot/loader.ps3'" > $4/etc/kboot.conf + shift else bootable="" From 1f89a4dc85278418e732d96bb303a832fee5581d Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Sun, 14 Aug 2011 16:17:00 +0000 Subject: [PATCH 241/452] Fix integer overflow on 32bit systems when calculating media size, reintroduced by r222475. Approved by: re (kib) --- sys/dev/mmc/mmcsd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/mmc/mmcsd.c b/sys/dev/mmc/mmcsd.c index cbb64e4409d..6dd007c441d 100644 --- a/sys/dev/mmc/mmcsd.c +++ b/sys/dev/mmc/mmcsd.c @@ -137,7 +137,7 @@ mmcsd_attach(device_t dev) d->d_drv1 = sc; d->d_maxsize = 4*1024*1024; /* Maximum defined SD card AU size. */ d->d_sectorsize = mmc_get_sector_size(dev); - d->d_mediasize = mmc_get_media_size(dev) * d->d_sectorsize; + d->d_mediasize = (off_t)mmc_get_media_size(dev) * d->d_sectorsize; d->d_stripeoffset = 0; d->d_stripesize = mmc_get_erase_sector(dev) * d->d_sectorsize; d->d_unit = device_get_unit(dev); From b10f2dc8896a3dce5236060f7459ca63fa9c20cd Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Sun, 14 Aug 2011 20:55:32 +0000 Subject: [PATCH 242/452] Add support for the spp_dscp field in the SCTP_PEER_ADDR_PARAMS socket option. Backwards compatibility is provided by still supporting the spp_ipv4_tos field. Approved by: re@ MFC after: 2 months. --- sys/netinet/sctp_output.c | 4 ++-- sys/netinet/sctp_pcb.c | 11 ++--------- sys/netinet/sctp_structs.h | 5 +++-- sys/netinet/sctp_uio.h | 7 +++++-- sys/netinet/sctp_usrreq.c | 37 ++++++++++++++----------------------- sys/netinet/sctputil.c | 4 ++-- 6 files changed, 28 insertions(+), 40 deletions(-) diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index 803c3094573..81c9e70d62c 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -3967,7 +3967,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, ip->ip_v = IPVERSION; ip->ip_hl = (sizeof(struct ip) >> 2); if (net) { - tos_value = net->tos_flowlabel & 0x000000ff; + tos_value = net->dscp; } else { tos_value = inp->ip_inp.inp.inp_ip_tos; } @@ -4204,7 +4204,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, int len; if (net != NULL) { - flowlabel = net->tos_flowlabel; + flowlabel = net->flowlabel; } else { flowlabel = ((struct in6pcb *)inp)->in6p_flowinfo; } diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c index 728fa7c6974..912e34870a3 100644 --- a/sys/netinet/sctp_pcb.c +++ b/sys/netinet/sctp_pcb.c @@ -4009,20 +4009,13 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, stcb->asoc.numnets++; *(&net->ref_count) = 1; net->cwr_window_tsn = net->last_cwr_tsn = stcb->asoc.sending_seq - 1; - net->tos_flowlabel = 0; if (SCTP_BASE_SYSCTL(sctp_udp_tunneling_for_client_enable)) { net->port = htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)); } else { net->port = 0; } -#ifdef INET - if (newaddr->sa_family == AF_INET) - net->tos_flowlabel = stcb->asoc.default_tos; -#endif -#ifdef INET6 - if (newaddr->sa_family == AF_INET6) - net->tos_flowlabel = stcb->asoc.default_flowlabel; -#endif + net->dscp = stcb->asoc.default_dscp; + net->flowlabel = stcb->asoc.default_flowlabel; if (sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_DONOT_HEARTBEAT)) { net->dest_state |= SCTP_ADDR_NOHB; } else { diff --git a/sys/netinet/sctp_structs.h b/sys/netinet/sctp_structs.h index df3898f064d..362f9cbf991 100644 --- a/sys/netinet/sctp_structs.h +++ b/sys/netinet/sctp_structs.h @@ -321,7 +321,8 @@ struct sctp_nets { uint32_t fast_recovery_tsn; uint32_t heartbeat_random1; uint32_t heartbeat_random2; - uint32_t tos_flowlabel; + uint32_t flowlabel; + uint8_t dscp; struct timeval start_time; /* time when this net was created */ uint32_t marked_retrans;/* number or DATA chunks marked for timer @@ -1137,7 +1138,7 @@ struct sctp_association { uint8_t last_flags_delivered; uint8_t hb_ect_randombit; uint8_t hb_random_idx; - uint8_t default_tos; + uint8_t default_dscp; uint8_t asconf_del_pending; /* asconf delete last addr pending */ /* diff --git a/sys/netinet/sctp_uio.h b/sys/netinet/sctp_uio.h index d4a0df183f9..37e9b798a99 100644 --- a/sys/netinet/sctp_uio.h +++ b/sys/netinet/sctp_uio.h @@ -505,9 +505,11 @@ struct sctp_paddrparams { uint32_t spp_flags; uint32_t spp_ipv6_flowlabel; uint16_t spp_pathmaxrxt; - uint8_t spp_ipv4_tos; + uint8_t spp_dscp; }; +#define spp_ipv4_tos spp_dscp + #define SPP_HB_ENABLE 0x00000001 #define SPP_HB_DISABLE 0x00000002 #define SPP_HB_DEMAND 0x00000004 @@ -515,7 +517,8 @@ struct sctp_paddrparams { #define SPP_PMTUD_DISABLE 0x00000010 #define SPP_HB_TIME_IS_ZERO 0x00000080 #define SPP_IPV6_FLOWLABEL 0x00000100 -#define SPP_IPV4_TOS 0x00000200 +#define SPP_DSCP 0x00000200 +#define SPP_IPV4_TOS SPP_DSCP struct sctp_paddrthlds { sctp_assoc_t spt_assoc_id; diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index 275e9a284f6..b6d7c712988 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -2416,13 +2416,13 @@ flags_out: } #ifdef INET if (net->ro._l_addr.sin.sin_family == AF_INET) { - paddrp->spp_ipv4_tos = net->tos_flowlabel & 0x000000fc; - paddrp->spp_flags |= SPP_IPV4_TOS; + paddrp->spp_dscp = net->dscp; + paddrp->spp_flags |= SPP_DSCP; } #endif #ifdef INET6 if (net->ro._l_addr.sin6.sin6_family == AF_INET6) { - paddrp->spp_ipv6_flowlabel = net->tos_flowlabel; + paddrp->spp_ipv6_flowlabel = net->flowlabel; paddrp->spp_flags |= SPP_IPV6_FLOWLABEL; } #endif @@ -2436,8 +2436,8 @@ flags_out: paddrp->spp_pathmaxrxt = stcb->asoc.def_net_failure; paddrp->spp_pathmtu = sctp_get_frag_point(stcb, &stcb->asoc); #ifdef INET - paddrp->spp_ipv4_tos = stcb->asoc.default_tos & 0x000000fc; - paddrp->spp_flags |= SPP_IPV4_TOS; + paddrp->spp_dscp = stcb->asoc.default_dscp & 0x000000fc; + paddrp->spp_flags |= SPP_DSCP; #endif #ifdef INET6 paddrp->spp_ipv6_flowlabel = stcb->asoc.default_flowlabel; @@ -2470,8 +2470,8 @@ flags_out: paddrp->spp_assoc_id = SCTP_FUTURE_ASSOC; /* get inp's default */ #ifdef INET - paddrp->spp_ipv4_tos = inp->ip_inp.inp.inp_ip_tos; - paddrp->spp_flags |= SPP_IPV4_TOS; + paddrp->spp_dscp = inp->ip_inp.inp.inp_ip_tos; + paddrp->spp_flags |= SPP_DSCP; #endif #ifdef INET6 if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { @@ -4626,16 +4626,16 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, net->failure_threshold = paddrp->spp_pathmaxrxt; } #ifdef INET - if (paddrp->spp_flags & SPP_IPV4_TOS) { + if (paddrp->spp_flags & SPP_DSCP) { if (net->ro._l_addr.sin.sin_family == AF_INET) { - net->tos_flowlabel = paddrp->spp_ipv4_tos & 0x000000fc; + net->dscp = paddrp->spp_dscp & 0xfc; } } #endif #ifdef INET6 if (paddrp->spp_flags & SPP_IPV6_FLOWLABEL) { if (net->ro._l_addr.sin6.sin6_family == AF_INET6) { - net->tos_flowlabel = paddrp->spp_ipv6_flowlabel; + net->flowlabel = paddrp->spp_ipv6_flowlabel & 0x000fffff; } } #endif @@ -4724,27 +4724,18 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } } } -#ifdef INET - if (paddrp->spp_flags & SPP_IPV4_TOS) { + if (paddrp->spp_flags & SPP_DSCP) { TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - if (net->ro._l_addr.sin.sin_family == AF_INET) { - net->tos_flowlabel = paddrp->spp_ipv4_tos & 0x000000fc; - } + net->dscp = paddrp->spp_dscp & 0x000000fc; } - stcb->asoc.default_tos = paddrp->spp_ipv4_tos & 0x000000fc; + stcb->asoc.default_dscp = paddrp->spp_dscp & 0x000000fc; } -#endif -#ifdef INET6 if (paddrp->spp_flags & SPP_IPV6_FLOWLABEL) { TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - if (net->ro._l_addr.sin6.sin6_family == AF_INET6) { - net->tos_flowlabel = paddrp->spp_ipv6_flowlabel; - } + net->flowlabel = paddrp->spp_ipv6_flowlabel; } stcb->asoc.default_flowlabel = paddrp->spp_ipv6_flowlabel; } -#endif - } SCTP_TCB_UNLOCK(stcb); } else { diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index 9beedbb52ef..b7336765b97 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -924,9 +924,9 @@ sctp_init_asoc(struct sctp_inpcb *m, struct sctp_tcb *stcb, asoc->sctp_frag_point = m->sctp_frag_point; asoc->sctp_features = m->sctp_features; #ifdef INET - asoc->default_tos = m->ip_inp.inp.inp_ip_tos; + asoc->default_dscp = m->ip_inp.inp.inp_ip_tos; #else - asoc->default_tos = 0; + asoc->default_dscp = 0; #endif #ifdef INET6 From 74d0c46ddeff2be86d5875fac28e6530447aed33 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Mon, 15 Aug 2011 07:30:48 +0000 Subject: [PATCH 243/452] Bump __FreeBSD_version to reflect the availability of capabilities, but also capability-related changes to fget(9). This is likely not part of a formal KPI, but the nvidia driver (at least) uses it. Mention /dev/{stdin,stdout,stderr} breakage that appears in certain kernel revisions as best avoided! Approved by: re (xxx) --- UPDATING | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/UPDATING b/UPDATING index 7df65a3304a..8488eb5f18f 100644 --- a/UPDATING +++ b/UPDATING @@ -22,6 +22,16 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW: machines to maximize performance. (To disable malloc debugging, run ln -s aj /etc/malloc.conf.) +20110815: + During the merge of Capsicum features, the fget(9) KPI was modified. + This may require the rebuilding of out-of-tree device drivers -- + issues have been reported specifically with the nVidia device driver. + __FreeBSD_version is bumped to 900041. + + Also, there is a period between 20110811 and 20110814 where the + special devices /dev/{stdin,stdout,stderr} did not work correctly. + Building world from a kernel during that window may not work. + 20110628: The packet filter (pf) code has been updated to OpenBSD 4.5. You need to update userland tools to be in sync with kernel. From 4b3a6fb933860b7566839270983c8b7f2992c612 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Mon, 15 Aug 2011 07:32:44 +0000 Subject: [PATCH 244/452] Fix two cases involving opt_capsicum.h and module builds: (1) opt_capsicum.h is no longer required in ffs_alloc.c, so remove the #include. (2) portalfs depends on opt_capsicum.h, so have the Makefile generate one if required. These affect only modules built without a kernel (i.e, not buildkernel, but yes buildworld if the dubious MODULES_WITH_WORLD is used). Approved by: re (bz) Sponsored by: Google Inc --- sys/modules/portalfs/Makefile | 3 ++- sys/ufs/ffs/ffs_alloc.c | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/modules/portalfs/Makefile b/sys/modules/portalfs/Makefile index ef6955b5d14..dcd5966c26a 100644 --- a/sys/modules/portalfs/Makefile +++ b/sys/modules/portalfs/Makefile @@ -4,6 +4,7 @@ KMOD= portalfs SRCS= vnode_if.h \ - portal_vfsops.c portal_vnops.c + portal_vfsops.c portal_vnops.c \ + opt_capsicum.h .include diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index 1df96a102af..5f984b4b6ba 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -62,7 +62,6 @@ #include __FBSDID("$FreeBSD$"); -#include "opt_capsicum.h" #include "opt_quota.h" #include From cc8b2291de34fabdfb623515d7da658a1f11d661 Mon Sep 17 00:00:00 2001 From: Gleb Smirnoff Date: Mon, 15 Aug 2011 12:08:41 +0000 Subject: [PATCH 245/452] Describe how carp(4) status changes can be processed with help of devd(8). Submitted by: "Alexander V. Chernikov" Approved by: re (kib) --- share/man/man4/carp.4 | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/share/man/man4/carp.4 b/share/man/man4/carp.4 index a985fb8a9d8..cbcd8004100 100644 --- a/share/man/man4/carp.4 +++ b/share/man/man4/carp.4 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 5, 2010 +.Dd August 15, 2011 .Dt CARP 4 .Os .Sh NAME @@ -168,6 +168,25 @@ forwarded to its destination, and destination replying faster than the state information is packed and synced with the second router. If the reply would be load balanced to second router, it will be dropped due to no state. +.Sh STATE CHANGE NOTIFICATIONS +Sometimes it is useful to get notified about +.Nm +status change events. +This can be accomplished by using +.Xr devd 8 +hooks. +Master/slave events are signalled as +.Nm +interface +.Dv LINK_UP +or +.Dv LINK_DOWN +event. +Please see +.Xr devd.conf 5 +and +.Sx EXAMPLES +section for more information. .Sh EXAMPLES For firewalls and routers with multiple interfaces, it is desirable to failover all of the @@ -249,6 +268,25 @@ This way, locally connected systems will receive different ARP replies and subsequent IP traffic will be balanced among the hosts. If one of the hosts fails, the other will take over the virtual MAC address, and begin answering ARP requests on its behalf. +.Pp +Processing of +.Nm +status change events can be set up by using the following devd.conf rules: +.Bd -literal -offset indent +notify 0 { + match "system" "IFNET"; + match "type" "LINK_UP"; + match "subsystem" "carp*"; + action "/root/carpcontrol.sh $type $subsystem"; +}; + +notify 0 { + match "system" "IFNET"; + match "type" "LINK_UP"; + match "subsystem" "carp*"; + action "/root/carpcontrol.sh $type $subsystem"; +}; +.Ed .Sh SEE ALSO .Xr inet 4 , .Xr pfsync 4 , From 7d5facea5999aa5b7d58e1dcde28665116d340d6 Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Mon, 15 Aug 2011 13:33:14 +0000 Subject: [PATCH 246/452] Use a maximum of -O on PowerPC kernels instead of -O2 to prevent a rare bug that could cause intermittent memory corruption on PowerPC SMP systems using non-debug kernels. This is a temporary change until the real problem is fixed. Approved by: re (kib) --- sys/conf/kern.pre.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sys/conf/kern.pre.mk b/sys/conf/kern.pre.mk index e9aa6e23d79..2320b89fa8b 100644 --- a/sys/conf/kern.pre.mk +++ b/sys/conf/kern.pre.mk @@ -27,8 +27,12 @@ SIZE?= size _MINUS_O= -O CTFFLAGS+= -g .else +.if ${MACHINE_CPUARCH} == "powerpc" +_MINUS_O= -O # gcc miscompiles some code at -O2 +.else _MINUS_O= -O2 .endif +.endif .if ${MACHINE_CPUARCH} == "amd64" COPTFLAGS?=-O2 -frename-registers -pipe .else From 1eefdc3bc588c6c529a2e2ddd66dd4155f2602a4 Mon Sep 17 00:00:00 2001 From: Gleb Smirnoff Date: Mon, 15 Aug 2011 13:33:28 +0000 Subject: [PATCH 247/452] Fix a couple of issues in last commit. Submitted by: maxim Approved by: re (kib) --- share/man/man4/carp.4 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/man/man4/carp.4 b/share/man/man4/carp.4 index cbcd8004100..4064c6c684e 100644 --- a/share/man/man4/carp.4 +++ b/share/man/man4/carp.4 @@ -282,7 +282,7 @@ notify 0 { notify 0 { match "system" "IFNET"; - match "type" "LINK_UP"; + match "type" "LINK_DOWN"; match "subsystem" "carp*"; action "/root/carpcontrol.sh $type $subsystem"; }; @@ -291,6 +291,7 @@ notify 0 { .Xr inet 4 , .Xr pfsync 4 , .Xr rc.conf 5 , +.Xr devd.conf 5 , .Xr ifconfig 8 , .Xr sysctl 8 .Sh HISTORY From 8efbf2642ba57c2521ac3b64cf9b59ff0ab811a1 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Mon, 15 Aug 2011 19:29:25 +0000 Subject: [PATCH 248/452] Add device id for the Moxa CP-112UL dual-port serial adapters. Submitted by: Jan Mikkelsen janm of transactionware com Approved by: re (kib) MFC after: 1 week --- sys/dev/puc/pucdata.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sys/dev/puc/pucdata.c b/sys/dev/puc/pucdata.c index 2b38d9b171e..f675b69b661 100644 --- a/sys/dev/puc/pucdata.c +++ b/sys/dev/puc/pucdata.c @@ -524,6 +524,12 @@ const struct puc_cfg puc_pci_devices[] = { PUC_PORT_4S, 0x18, 0, 8, }, + { 0x1393, 0x1120, 0xffff, 0, + "Moxa Technologies, CP-112UL", + DEFAULT_RCLK * 8, + PUC_PORT_2S, 0x18, 0, 8, + }, + { 0x1393, 0x1141, 0xffff, 0, "Moxa Technologies, Industio CP-114", DEFAULT_RCLK * 8, From 9a46d4678d98c69773c1badb99b904cd5fddaf03 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Tue, 16 Aug 2011 08:34:16 +0000 Subject: [PATCH 249/452] Add missing function to get device speed to the LibUSB v1.0 API. MFC after: 1 week Approved by: re (kib) --- lib/libusb/libusb.h | 9 +++++++++ lib/libusb/libusb10.c | 21 +++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h index 0c9e50f9398..bbde475842e 100644 --- a/lib/libusb/libusb.h +++ b/lib/libusb/libusb.h @@ -151,6 +151,14 @@ enum libusb_error { LIBUSB_ERROR_OTHER = -99, }; +enum libusb_speed { + LIBUSB_SPEED_UNKNOWN = 0, + LIBUSB_SPEED_LOW = 1, + LIBUSB_SPEED_FULL = 2, + LIBUSB_SPEED_HIGH = 3, + LIBUSB_SPEED_SUPER = 4, +}; + enum libusb_transfer_status { LIBUSB_TRANSFER_COMPLETED, LIBUSB_TRANSFER_ERROR, @@ -304,6 +312,7 @@ ssize_t libusb_get_device_list(libusb_context * ctx, libusb_device *** list); void libusb_free_device_list(libusb_device ** list, int unref_devices); uint8_t libusb_get_bus_number(libusb_device * dev); uint8_t libusb_get_device_address(libusb_device * dev); +enum libusb_speed libusb_get_device_speed(libusb_device * dev); int libusb_clear_halt(libusb_device_handle *devh, uint8_t endpoint); int libusb_get_max_packet_size(libusb_device * dev, uint8_t endpoint); libusb_device *libusb_ref_device(libusb_device * dev); diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c index 3ecba58ebb3..d11f631d238 100644 --- a/lib/libusb/libusb10.c +++ b/lib/libusb/libusb10.c @@ -272,6 +272,27 @@ libusb_get_device_address(libusb_device *dev) return (libusb20_dev_get_address(dev->os_priv)); } +enum libusb_speed +libusb_get_device_speed(libusb_device *dev) +{ + if (dev == NULL) + return (0); /* should not happen */ + + switch (libusb20_dev_get_speed(dev->os_priv)) { + case LIBUSB20_SPEED_LOW: + return (LIBUSB_SPEED_LOW); + case LIBUSB20_SPEED_FULL: + return (LIBUSB_SPEED_FULL); + case LIBUSB20_SPEED_HIGH: + return (LIBUSB_SPEED_HIGH); + case LIBUSB20_SPEED_SUPER: + return (LIBUSB_SPEED_SUPER); + default: + break; + } + return (LIBUSB_SPEED_UNKNOWN); +} + int libusb_get_max_packet_size(libusb_device *dev, uint8_t endpoint) { From 4e32649fbf81fe520ac77ec9acc60fef7dcb124b Mon Sep 17 00:00:00 2001 From: Xin LI Date: Tue, 16 Aug 2011 08:41:37 +0000 Subject: [PATCH 250/452] Update arcmsr(4) to 1.20.00.22 to solve recursive acquisition of buffer mutex, which would lead to a deadlock. Many thanks to Areca for their continued support of FreeBSD. Submitted by: Ching Huang Tested by: Willem Jan Withagen MFC after: 3 days Approved by: re (kib) --- sys/dev/arcmsr/arcmsr.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/sys/dev/arcmsr/arcmsr.c b/sys/dev/arcmsr/arcmsr.c index 962f6b87397..10bb5042891 100644 --- a/sys/dev/arcmsr/arcmsr.c +++ b/sys/dev/arcmsr/arcmsr.c @@ -68,6 +68,7 @@ ** 1.20.00.21 02/08/2011 Ching Huang Implement I/O request timeout ** 02/14/2011 Ching Huang Modified pktRequestCount ** 1.20.00.21 03/03/2011 Ching Huang if a command timeout, then wait its ccb back before free it +** 1.20.00.22 07/04/2011 Ching Huang Fixed multiple MTX panic ****************************************************************************************** * $FreeBSD$ */ @@ -150,7 +151,7 @@ #define arcmsr_callout_init(a) callout_init(a); #endif -#define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.21 2010-03-03" +#define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.22 2011-07-04" #include #define SRB_SIZE ((sizeof(struct CommandControlBlock)+0x1f) & 0xffe0) #define ARCMSR_SRBS_POOL_SIZE (SRB_SIZE * ARCMSR_MAX_FREESRB_NUM) @@ -1293,11 +1294,15 @@ static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb) static void arcmsr_poll(struct cam_sim * psim) { struct AdapterControlBlock *acb; + int mutex; acb = (struct AdapterControlBlock *)cam_sim_softc(psim); - ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); + mutex = mtx_owned(&acb->qbuffer_lock); + if( mutex == 0 ) + ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); arcmsr_interrupt(acb); - ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); + if( mutex == 0 ) + ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); return; } /* @@ -2089,8 +2094,11 @@ struct CommandControlBlock * arcmsr_get_freesrb(struct AdapterControlBlock *acb) { struct CommandControlBlock *srb=NULL; u_int32_t workingsrb_startindex, workingsrb_doneindex; + int mutex; - ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); + mutex = mtx_owned(&acb->qbuffer_lock); + if( mutex == 0 ) + ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); workingsrb_doneindex=acb->workingsrb_doneindex; workingsrb_startindex=acb->workingsrb_startindex; srb=acb->srbworkingQ[workingsrb_startindex]; @@ -2101,7 +2109,8 @@ struct CommandControlBlock * arcmsr_get_freesrb(struct AdapterControlBlock *acb) } else { srb=NULL; } - ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); + if( mutex == 0 ) + ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); return(srb); } /* From 6291312c14fa8414ab5f8bd080880035d192c0ea Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 16 Aug 2011 09:07:59 +0000 Subject: [PATCH 251/452] Fix BAR frame TX completion - successful transmission is indicated by a status of 0. Approved by: re (kib) --- sys/net80211/ieee80211_ht.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c index 61c84e936f3..e6dbbf2724e 100644 --- a/sys/net80211/ieee80211_ht.c +++ b/sys/net80211/ieee80211_ht.c @@ -2207,7 +2207,7 @@ bar_tx_complete(struct ieee80211_node *ni, void *arg, int status) callout_pending(&tap->txa_timer)) { struct ieee80211com *ic = ni->ni_ic; - if (status) /* ACK'd */ + if (status == 0) /* ACK'd */ bar_stop_timer(tap); ic->ic_bar_response(ni, tap, status); /* NB: just let timer expire so we pace requests */ @@ -2219,7 +2219,7 @@ ieee80211_bar_response(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap, int status) { - if (status != 0) { /* got ACK */ + if (status == 0) { /* got ACK */ IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni, "BAR moves BA win <%u:%u> (%u frames) txseq %u tid %u", tap->txa_start, From d6f724898368f8a55757aa5d7d443f90f558c17a Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Tue, 16 Aug 2011 14:14:56 +0000 Subject: [PATCH 252/452] poll(2) implementation for capabilities. When calling poll(2) on a capability, unwrap first and then poll the underlying object. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- sys/kern/sys_generic.c | 11 +++++++++++ .../security/cap_test/cap_test_capabilities.c | 18 ++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 7dc69a6e1d0..6edd4fbdeee 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1279,11 +1279,17 @@ pollrescan(struct thread *td) if (si != NULL) continue; fp = fdp->fd_ofiles[fd->fd]; +#ifdef CAPABILITIES + if ((fp == NULL) + || (cap_funwrap(fp, CAP_POLL_EVENT, &fp) != 0)) { +#else if (fp == NULL) { +#endif fd->revents = POLLNVAL; n++; continue; } + /* * Note: backend also returns POLLHUP and * POLLERR if appropriate. @@ -1344,7 +1350,12 @@ pollscan(td, fds, nfd) fds->revents = 0; } else { fp = fdp->fd_ofiles[fds->fd]; +#ifdef CAPABILITIES + if ((fp == NULL) + || (cap_funwrap(fp, CAP_POLL_EVENT, &fp) != 0)) { +#else if (fp == NULL) { +#endif fds->revents = POLLNVAL; n++; } else { diff --git a/tools/regression/security/cap_test/cap_test_capabilities.c b/tools/regression/security/cap_test/cap_test_capabilities.c index ab1c58f047c..450ad88c510 100644 --- a/tools/regression/security/cap_test/cap_test_capabilities.c +++ b/tools/regression/security/cap_test/cap_test_capabilities.c @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -68,6 +69,7 @@ __FBSDID("$FreeBSD$"); else if (errno != ENOTCAPABLE) \ SYSCALL_FAIL(syscall, "errno != ENOTCAPABLE"); \ } \ + errno = 0; \ } while (0) /* @@ -87,6 +89,7 @@ __FBSDID("$FreeBSD$"); } else if (errno != ENOTCAPABLE) \ SYSCALL_FAIL(syscall, "errno != ENOTCAPABLE"); \ } \ + errno = 0; \ } while (0) /* @@ -104,6 +107,7 @@ try_file_ops(int fd, cap_rights_t rights) void *p; char ch; int ret, is_nfs; + struct pollfd pollfd; int success = PASSED; REQUIRE(fstatfs(fd, &sf)); @@ -114,6 +118,10 @@ try_file_ops(int fd, cap_rights_t rights) REQUIRE(fd_capcap = cap_new(fd_cap, rights)); CHECK(fd_capcap != fd_cap); + pollfd.fd = fd_cap; + pollfd.events = POLLIN | POLLERR | POLLHUP; + pollfd.revents = 0; + ssize = read(fd_cap, &ch, sizeof(ch)); CHECK_RESULT(read, CAP_READ | CAP_SEEK, ssize >= 0); @@ -189,7 +197,13 @@ try_file_ops(int fd, cap_rights_t rights) ret = futimes(fd_cap, NULL); CHECK_RESULT(futimes, CAP_FUTIMES, ret == 0); - /* XXX select / poll / kqueue */ + ret = poll(&pollfd, 1, 0); + if (rights & CAP_POLL_EVENT) + CHECK((pollfd.revents & POLLNVAL) == 0); + else + CHECK((pollfd.revents & POLLNVAL) != 0); + + /* XXX: select, kqueue */ close (fd_cap); return (success); @@ -210,7 +224,7 @@ test_capabilities(void) int fd; int success = PASSED; - fd = open("/tmp/cap_test", O_RDWR | O_CREAT, 0644); + fd = open("/tmp/cap_test_capabilities", O_RDWR | O_CREAT, 0644); if (fd < 0) err(-1, "open"); From 985a88e2a69018c47f812c1ee9ef48519049ff31 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Tue, 16 Aug 2011 14:23:16 +0000 Subject: [PATCH 253/452] Fix a merge conflict. r224086 added "goto out"-style error handling to nfssvc_nfsd(), in order to reliably call NFSEXITCODE() before returning. Our Capsicum changes, based on the old "return (error)" model, did not merge nicely. Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- sys/fs/nfsserver/nfs_nfsdport.c | 1 - 1 file changed, 1 deletion(-) diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index da32b0e544c..82f05d0947c 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -3036,7 +3036,6 @@ nfssvc_nfsd(struct thread *td, struct nfssvc_args *uap) */ if ((error = fget(td, sockarg.sock, CAP_SOCK_ALL, &fp)) != 0) goto out; - return (error); if (fp->f_type != DTYPE_SOCKET) { fdrop(fp, td); error = EPERM; From 9c00bb9190391479885cfb14ed23fb7003d10109 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 16 Aug 2011 20:07:47 +0000 Subject: [PATCH 254/452] Add the fo_chown and fo_chmod methods to struct fileops and use them to implement fchown(2) and fchmod(2) support for several file types that previously lacked it. Add MAC entries for chown/chmod done on posix shared memory and (old) in-kernel posix semaphores. Based on the submission by: glebius Reviewed by: rwatson Approved by: re (bz) --- sys/dev/streams/streams.c | 4 +- sys/fs/devfs/devfs_vnops.c | 2 + sys/fs/fifofs/fifo_vnops.c | 2 + sys/kern/kern_descrip.c | 33 ++++++++++++ sys/kern/kern_event.c | 2 + sys/kern/sys_capability.c | 22 ++++++++ sys/kern/sys_pipe.c | 2 + sys/kern/sys_socket.c | 2 + sys/kern/tty_pts.c | 2 + sys/kern/uipc_mqueue.c | 49 +++++++++++++++++ sys/kern/uipc_sem.c | 64 +++++++++++++++++++++- sys/kern/uipc_shm.c | 77 +++++++++++++++++++++++++-- sys/kern/vfs_syscalls.c | 60 +++++++-------------- sys/kern/vfs_vnops.c | 41 ++++++++++++++ sys/ofed/include/linux/linux_compat.c | 4 +- sys/opencrypto/cryptodev.c | 4 +- sys/security/mac/mac_framework.h | 8 +++ sys/security/mac/mac_policy.h | 16 ++++++ sys/security/mac/mac_posix_sem.c | 32 +++++++++++ sys/security/mac/mac_posix_shm.c | 32 +++++++++++ sys/security/mac_stub/mac_stub.c | 36 +++++++++++++ sys/security/mac_test/mac_test.c | 52 ++++++++++++++++++ sys/sys/file.h | 27 ++++++++++ sys/sys/vnode.h | 10 +++- 24 files changed, 533 insertions(+), 50 deletions(-) diff --git a/sys/dev/streams/streams.c b/sys/dev/streams/streams.c index 00f65a3907c..ad2817f5ca6 100644 --- a/sys/dev/streams/streams.c +++ b/sys/dev/streams/streams.c @@ -95,7 +95,9 @@ static struct fileops svr4_netops = { .fo_poll = soo_poll, .fo_kqfilter = soo_kqfilter, .fo_stat = soo_stat, - .fo_close = svr4_soo_close + .fo_close = svr4_soo_close, + .fo_chmod = invfo_chmod, + .fo_chown = invfo_chown, }; static struct cdevsw streams_cdevsw = { diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index 955bd8b0f22..68ab7ce9d94 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -1665,6 +1665,8 @@ static struct fileops devfs_ops_f = { .fo_kqfilter = devfs_kqfilter_f, .fo_stat = devfs_stat_f, .fo_close = devfs_close_f, + .fo_chmod = vn_chmod, + .fo_chown = vn_chown, .fo_flags = DFLAG_PASSABLE | DFLAG_SEEKABLE }; diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c index e339a8ac853..b8d4a400660 100644 --- a/sys/fs/fifofs/fifo_vnops.c +++ b/sys/fs/fifofs/fifo_vnops.c @@ -72,6 +72,8 @@ struct fileops fifo_ops_f = { .fo_kqfilter = fifo_kqfilter_f, .fo_stat = fifo_stat_f, .fo_close = fifo_close_f, + .fo_chmod = vn_chmod, + .fo_chown = vn_chown, .fo_flags = DFLAG_PASSABLE }; diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index cf4ecedb698..85f866c39c0 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -3774,6 +3774,22 @@ badfo_close(struct file *fp, struct thread *td) return (EBADF); } +static int +badfo_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, + struct thread *td) +{ + + return (EBADF); +} + +static int +badfo_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, + struct thread *td) +{ + + return (EBADF); +} + struct fileops badfileops = { .fo_read = badfo_readwrite, .fo_write = badfo_readwrite, @@ -3783,8 +3799,25 @@ struct fileops badfileops = { .fo_kqfilter = badfo_kqfilter, .fo_stat = badfo_stat, .fo_close = badfo_close, + .fo_chmod = badfo_chmod, + .fo_chown = badfo_chown, }; +int +invfo_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, + struct thread *td) +{ + + return (EINVAL); +} + +int +invfo_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, + struct thread *td) +{ + + return (EINVAL); +} /*-------------------------------------------------------------------*/ diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index e282cd537a8..c512b0ac734 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -123,6 +123,8 @@ static struct fileops kqueueops = { .fo_kqfilter = kqueue_kqfilter, .fo_stat = kqueue_stat, .fo_close = kqueue_close, + .fo_chmod = invfo_chmod, + .fo_chown = invfo_chown, }; static int knote_attach(struct knote *kn, struct kqueue *kq); diff --git a/sys/kern/sys_capability.c b/sys/kern/sys_capability.c index 0eb27f3d920..318ffe4e04d 100644 --- a/sys/kern/sys_capability.c +++ b/sys/kern/sys_capability.c @@ -161,6 +161,8 @@ static fo_poll_t capability_poll; static fo_kqfilter_t capability_kqfilter; static fo_stat_t capability_stat; static fo_close_t capability_close; +static fo_chmod_t capability_chmod; +static fo_chown_t capability_chown; static struct fileops capability_ops = { .fo_read = capability_read, @@ -171,6 +173,8 @@ static struct fileops capability_ops = { .fo_kqfilter = capability_kqfilter, .fo_stat = capability_stat, .fo_close = capability_close, + .fo_chmod = capability_chmod, + .fo_chown = capability_chown, .fo_flags = DFLAG_PASSABLE, }; @@ -183,6 +187,8 @@ static struct fileops capability_ops_unpassable = { .fo_kqfilter = capability_kqfilter, .fo_stat = capability_stat, .fo_close = capability_close, + .fo_chmod = capability_chmod, + .fo_chown = capability_chown, .fo_flags = 0, }; @@ -484,6 +490,22 @@ capability_stat(struct file *fp, struct stat *sb, struct ucred *active_cred, panic("capability_stat"); } +int +capability_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, + struct thread *td) +{ + + panic("capability_chmod"); +} + +int +capability_chown(struct file *fp, uid_t uid, gid_t gid, + struct ucred *active_cred, struct thread *td) +{ + + panic("capability_chown"); +} + #else /* !CAPABILITIES */ /* diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index 50b03897e27..14e12075f1d 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -155,6 +155,8 @@ static struct fileops pipeops = { .fo_kqfilter = pipe_kqfilter, .fo_stat = pipe_stat, .fo_close = pipe_close, + .fo_chmod = invfo_chmod, + .fo_chown = invfo_chown, .fo_flags = DFLAG_PASSABLE }; diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c index c9b053443f4..cd6f655cc65 100644 --- a/sys/kern/sys_socket.c +++ b/sys/kern/sys_socket.c @@ -64,6 +64,8 @@ struct fileops socketops = { .fo_kqfilter = soo_kqfilter, .fo_stat = soo_stat, .fo_close = soo_close, + .fo_chmod = invfo_chmod, + .fo_chown = invfo_chown, .fo_flags = DFLAG_PASSABLE }; diff --git a/sys/kern/tty_pts.c b/sys/kern/tty_pts.c index a3db59bfc5a..cf9f94d375d 100644 --- a/sys/kern/tty_pts.c +++ b/sys/kern/tty_pts.c @@ -597,6 +597,8 @@ static struct fileops ptsdev_ops = { .fo_kqfilter = ptsdev_kqfilter, .fo_stat = ptsdev_stat, .fo_close = ptsdev_close, + .fo_chmod = invfo_chmod, + .fo_chown = invfo_chown, .fo_flags = DFLAG_PASSABLE, }; diff --git a/sys/kern/uipc_mqueue.c b/sys/kern/uipc_mqueue.c index 0ca4161d50c..fbd78c16a28 100644 --- a/sys/kern/uipc_mqueue.c +++ b/sys/kern/uipc_mqueue.c @@ -2469,6 +2469,7 @@ mqf_stat(struct file *fp, struct stat *st, struct ucred *active_cred, struct mqfs_node *pn = fp->f_data; bzero(st, sizeof *st); + sx_xlock(&mqfs_data.mi_lock); st->st_atim = pn->mn_atime; st->st_mtim = pn->mn_mtime; st->st_ctim = pn->mn_ctime; @@ -2476,9 +2477,55 @@ mqf_stat(struct file *fp, struct stat *st, struct ucred *active_cred, st->st_uid = pn->mn_uid; st->st_gid = pn->mn_gid; st->st_mode = S_IFIFO | pn->mn_mode; + sx_xunlock(&mqfs_data.mi_lock); return (0); } +static int +mqf_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, + struct thread *td) +{ + struct mqfs_node *pn; + int error; + + error = 0; + pn = fp->f_data; + sx_xlock(&mqfs_data.mi_lock); + error = vaccess(VREG, pn->mn_mode, pn->mn_uid, pn->mn_gid, VADMIN, + active_cred, NULL); + if (error != 0) + goto out; + pn->mn_mode = mode & ACCESSPERMS; +out: + sx_xunlock(&mqfs_data.mi_lock); + return (error); +} + +static int +mqf_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, + struct thread *td) +{ + struct mqfs_node *pn; + int error; + + error = 0; + pn = fp->f_data; + sx_xlock(&mqfs_data.mi_lock); + if (uid == (uid_t)-1) + uid = pn->mn_uid; + if (gid == (gid_t)-1) + gid = pn->mn_gid; + if (((uid != pn->mn_uid && uid != active_cred->cr_uid) || + (gid != pn->mn_gid && !groupmember(gid, active_cred))) && + (error = priv_check_cred(active_cred, PRIV_VFS_CHOWN, 0))) + goto out; + pn->mn_uid = uid; + pn->mn_gid = gid; +out: + sx_xunlock(&mqfs_data.mi_lock); + return (error); +} + static int mqf_kqfilter(struct file *fp, struct knote *kn) { @@ -2535,6 +2582,8 @@ static struct fileops mqueueops = { .fo_poll = mqf_poll, .fo_kqfilter = mqf_kqfilter, .fo_stat = mqf_stat, + .fo_chmod = mqf_chmod, + .fo_chown = mqf_chown, .fo_close = mqf_close }; diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c index 82a4622c5dd..95c29c0f0f2 100644 --- a/sys/kern/uipc_sem.c +++ b/sys/kern/uipc_sem.c @@ -135,6 +135,8 @@ static fo_poll_t ksem_poll; static fo_kqfilter_t ksem_kqfilter; static fo_stat_t ksem_stat; static fo_close_t ksem_closef; +static fo_chmod_t ksem_chmod; +static fo_chown_t ksem_chown; /* File descriptor operations. */ static struct fileops ksem_ops = { @@ -146,6 +148,8 @@ static struct fileops ksem_ops = { .fo_kqfilter = ksem_kqfilter, .fo_stat = ksem_stat, .fo_close = ksem_closef, + .fo_chmod = ksem_chmod, + .fo_chown = ksem_chown, .fo_flags = DFLAG_PASSABLE }; @@ -220,18 +224,74 @@ ksem_stat(struct file *fp, struct stat *sb, struct ucred *active_cred, * file descriptor. */ bzero(sb, sizeof(*sb)); - sb->st_mode = S_IFREG | ks->ks_mode; /* XXX */ + mtx_lock(&sem_lock); sb->st_atim = ks->ks_atime; sb->st_ctim = ks->ks_ctime; sb->st_mtim = ks->ks_mtime; - sb->st_birthtim = ks->ks_birthtime; + sb->st_birthtim = ks->ks_birthtime; sb->st_uid = ks->ks_uid; sb->st_gid = ks->ks_gid; + sb->st_mode = S_IFREG | ks->ks_mode; /* XXX */ + mtx_unlock(&sem_lock); return (0); } +static int +ksem_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, + struct thread *td) +{ + struct ksem *ks; + int error; + + error = 0; + ks = fp->f_data; + mtx_lock(&sem_lock); +#ifdef MAC + error = mac_posixsem_check_setmode(active_cred, ks, mode); + if (error != 0) + goto out; +#endif + error = vaccess(VREG, ks->ks_mode, ks->ks_uid, ks->ks_gid, VADMIN, + active_cred, NULL); + if (error != 0) + goto out; + ks->ks_mode = mode & ACCESSPERMS; +out: + mtx_unlock(&sem_lock); + return (error); +} + +static int +ksem_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, + struct thread *td) +{ + struct ksem *ks; + int error; + + ks = fp->f_data; + mtx_lock(&sem_lock); +#ifdef MAC + error = mac_posixsem_check_setowner(active_cred, ks, uid, gid); + if (error != 0) + goto out; +#endif + if (uid == (uid_t)-1) + uid = ks->ks_uid; + if (gid == (gid_t)-1) + gid = ks->ks_gid; + if (((uid != ks->ks_uid && uid != active_cred->cr_uid) || + (gid != ks->ks_gid && !groupmember(gid, active_cred))) && + (error = priv_check_cred(active_cred, PRIV_VFS_CHOWN, 0))) + goto out; + ks->ks_uid = uid; + ks->ks_gid = gid; +out: + mtx_unlock(&sem_lock); + return (error); +} + static int ksem_closef(struct file *fp, struct thread *td) { diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c index 0414f1283e7..45989cfeab6 100644 --- a/sys/kern/uipc_shm.c +++ b/sys/kern/uipc_shm.c @@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -123,6 +124,8 @@ static fo_poll_t shm_poll; static fo_kqfilter_t shm_kqfilter; static fo_stat_t shm_stat; static fo_close_t shm_close; +static fo_chmod_t shm_chmod; +static fo_chown_t shm_chown; /* File descriptor operations. */ static struct fileops shm_ops = { @@ -134,6 +137,8 @@ static struct fileops shm_ops = { .fo_kqfilter = shm_kqfilter, .fo_stat = shm_stat, .fo_close = shm_close, + .fo_chmod = shm_chmod, + .fo_chown = shm_chown, .fo_flags = DFLAG_PASSABLE }; @@ -218,16 +223,18 @@ shm_stat(struct file *fp, struct stat *sb, struct ucred *active_cred, * descriptor. */ bzero(sb, sizeof(*sb)); - sb->st_mode = S_IFREG | shmfd->shm_mode; /* XXX */ sb->st_blksize = PAGE_SIZE; sb->st_size = shmfd->shm_size; sb->st_blocks = (sb->st_size + sb->st_blksize - 1) / sb->st_blksize; + mtx_lock(&shm_timestamp_lock); sb->st_atim = shmfd->shm_atime; sb->st_ctim = shmfd->shm_ctime; sb->st_mtim = shmfd->shm_mtime; - sb->st_birthtim = shmfd->shm_birthtime; + sb->st_birthtim = shmfd->shm_birthtime; + sb->st_mode = S_IFREG | shmfd->shm_mode; /* XXX */ sb->st_uid = shmfd->shm_uid; sb->st_gid = shmfd->shm_gid; + mtx_unlock(&shm_timestamp_lock); return (0); } @@ -395,14 +402,18 @@ static int shm_access(struct shmfd *shmfd, struct ucred *ucred, int flags) { accmode_t accmode; + int error; accmode = 0; if (flags & FREAD) accmode |= VREAD; if (flags & FWRITE) accmode |= VWRITE; - return (vaccess(VREG, shmfd->shm_mode, shmfd->shm_uid, shmfd->shm_gid, - accmode, ucred, NULL)); + mtx_lock(&shm_timestamp_lock); + error = vaccess(VREG, shmfd->shm_mode, shmfd->shm_uid, shmfd->shm_gid, + accmode, ucred, NULL); + mtx_unlock(&shm_timestamp_lock); + return (error); } /* @@ -651,3 +662,61 @@ shm_mmap(struct shmfd *shmfd, vm_size_t objsize, vm_ooffset_t foff, *obj = shmfd->shm_object; return (0); } + +static int +shm_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, + struct thread *td) +{ + struct shmfd *shmfd; + int error; + + error = 0; + shmfd = fp->f_data; + mtx_lock(&shm_timestamp_lock); + /* + * SUSv4 says that x bits of permission need not be affected. + * Be consistent with our shm_open there. + */ +#ifdef MAC + error = mac_posixshm_check_setmode(active_cred, shmfd, mode); + if (error != 0) + goto out; +#endif + error = vaccess(VREG, shmfd->shm_mode, shmfd->shm_uid, + shmfd->shm_gid, VADMIN, active_cred, NULL); + if (error != 0) + goto out; + shmfd->shm_mode = mode & ACCESSPERMS; +out: + mtx_unlock(&shm_timestamp_lock); + return (error); +} + +static int +shm_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, + struct thread *td) +{ + struct shmfd *shmfd; + int error; + + shmfd = fp->f_data; + mtx_lock(&shm_timestamp_lock); +#ifdef MAC + error = mac_posixshm_check_setowner(active_cred, shmfd, uid, gid); + if (error != 0) + goto out; +#endif + if (uid == (uid_t)-1) + uid = shmfd->shm_uid; + if (gid == (gid_t)-1) + gid = shmfd->shm_gid; + if (((uid != shmfd->shm_uid && uid != active_cred->cr_uid) || + (gid != shmfd->shm_gid && !groupmember(gid, active_cred))) && + (error = priv_check_cred(active_cred, PRIV_VFS_CHOWN, 0))) + goto out; + shmfd->shm_uid = uid; + shmfd->shm_gid = gid; +out: + mtx_unlock(&shm_timestamp_lock); + return (error); +} diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 35d1aee9b50..c0ae0a74764 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -96,8 +96,6 @@ SDT_PROBE_ARGTYPE(vfs, , stat, reg, 1, "int"); static int chroot_refuse_vdir_fds(struct filedesc *fdp); static int getutimes(const struct timeval *, enum uio_seg, struct timespec *); -static int setfown(struct thread *td, struct vnode *, uid_t, gid_t); -static int setfmode(struct thread *td, struct vnode *, int); static int setfflags(struct thread *td, struct vnode *, int); static int setutimes(struct thread *td, struct vnode *, const struct timespec *, int, int); @@ -2865,9 +2863,10 @@ fchflags(td, uap) /* * Common implementation code for chmod(), lchmod() and fchmod(). */ -static int -setfmode(td, vp, mode) +int +setfmode(td, cred, vp, mode) struct thread *td; + struct ucred *cred; struct vnode *vp; int mode; { @@ -2881,10 +2880,10 @@ setfmode(td, vp, mode) VATTR_NULL(&vattr); vattr.va_mode = mode & ALLPERMS; #ifdef MAC - error = mac_vnode_check_setmode(td->td_ucred, vp, vattr.va_mode); + error = mac_vnode_check_setmode(cred, vp, vattr.va_mode); if (error == 0) #endif - error = VOP_SETATTR(vp, &vattr, td->td_ucred); + error = VOP_SETATTR(vp, &vattr, cred); VOP_UNLOCK(vp, 0); vn_finished_write(mp); return (error); @@ -2980,7 +2979,7 @@ kern_fchmodat(struct thread *td, int fd, char *path, enum uio_seg pathseg, return (error); vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); - error = setfmode(td, nd.ni_vp, mode); + error = setfmode(td, td->td_ucred, nd.ni_vp, mode); vrele(nd.ni_vp); VFS_UNLOCK_GIANT(vfslocked); return (error); @@ -2996,30 +2995,18 @@ struct fchmod_args { }; #endif int -fchmod(td, uap) - struct thread *td; - register struct fchmod_args /* { - int fd; - int mode; - } */ *uap; +fchmod(struct thread *td, struct fchmod_args *uap) { struct file *fp; - int vfslocked; int error; AUDIT_ARG_FD(uap->fd); AUDIT_ARG_MODE(uap->mode); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, CAP_FCHMOD, - &fp)) != 0) + + error = fget(td, uap->fd, CAP_FCHMOD, &fp); + if (error != 0) return (error); - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); -#ifdef AUDIT - vn_lock(fp->f_vnode, LK_SHARED | LK_RETRY); - AUDIT_ARG_VNODE1(fp->f_vnode); - VOP_UNLOCK(fp->f_vnode, 0); -#endif - error = setfmode(td, fp->f_vnode, uap->mode); - VFS_UNLOCK_GIANT(vfslocked); + error = fo_chmod(fp, uap->mode, td->td_ucred, td); fdrop(fp, td); return (error); } @@ -3027,9 +3014,10 @@ fchmod(td, uap) /* * Common implementation for chown(), lchown(), and fchown() */ -static int -setfown(td, vp, uid, gid) +int +setfown(td, cred, vp, uid, gid) struct thread *td; + struct ucred *cred; struct vnode *vp; uid_t uid; gid_t gid; @@ -3045,11 +3033,11 @@ setfown(td, vp, uid, gid) vattr.va_uid = uid; vattr.va_gid = gid; #ifdef MAC - error = mac_vnode_check_setowner(td->td_ucred, vp, vattr.va_uid, + error = mac_vnode_check_setowner(cred, vp, vattr.va_uid, vattr.va_gid); if (error == 0) #endif - error = VOP_SETATTR(vp, &vattr, td->td_ucred); + error = VOP_SETATTR(vp, &vattr, cred); VOP_UNLOCK(vp, 0); vn_finished_write(mp); return (error); @@ -3124,7 +3112,7 @@ kern_fchownat(struct thread *td, int fd, char *path, enum uio_seg pathseg, return (error); vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); - error = setfown(td, nd.ni_vp, uid, gid); + error = setfown(td, td->td_ucred, nd.ni_vp, uid, gid); vrele(nd.ni_vp); VFS_UNLOCK_GIANT(vfslocked); return (error); @@ -3182,22 +3170,14 @@ fchown(td, uap) } */ *uap; { struct file *fp; - int vfslocked; int error; AUDIT_ARG_FD(uap->fd); AUDIT_ARG_OWNER(uap->uid, uap->gid); - if ((error = getvnode(td->td_proc->p_fd, uap->fd, CAP_FCHOWN, &fp)) - != 0) + error = fget(td, uap->fd, CAP_FCHOWN, &fp); + if (error != 0) return (error); - vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount); -#ifdef AUDIT - vn_lock(fp->f_vnode, LK_SHARED | LK_RETRY); - AUDIT_ARG_VNODE1(fp->f_vnode); - VOP_UNLOCK(fp->f_vnode, 0); -#endif - error = setfown(td, fp->f_vnode, uap->uid, uap->gid); - VFS_UNLOCK_GIANT(vfslocked); + error = fo_chown(fp, uap->uid, uap->gid, td->td_ucred, td); fdrop(fp, td); return (error); } diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index e8bcc91cb96..a8f1bf1d184 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include static fo_rdwr_t vn_read; @@ -81,6 +82,8 @@ struct fileops vnops = { .fo_kqfilter = vn_kqfilter, .fo_stat = vn_statfile, .fo_close = vn_closefile, + .fo_chmod = vn_chmod, + .fo_chown = vn_chown, .fo_flags = DFLAG_PASSABLE | DFLAG_SEEKABLE }; @@ -1357,3 +1360,41 @@ vn_rlimit_fsize(const struct vnode *vp, const struct uio *uio, PROC_UNLOCK(td->td_proc); return (0); } + +int +vn_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, + struct thread *td) +{ + struct vnode *vp; + int error, vfslocked; + + vp = fp->f_vnode; + vfslocked = VFS_LOCK_GIANT(vp->v_mount); +#ifdef AUDIT + vn_lock(vp, LK_SHARED | LK_RETRY); + AUDIT_ARG_VNODE1(vp); + VOP_UNLOCK(vp, 0); +#endif + error = setfmode(td, active_cred, vp, mode); + VFS_UNLOCK_GIANT(vfslocked); + return (error); +} + +int +vn_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, + struct thread *td) +{ + struct vnode *vp; + int error, vfslocked; + + vp = fp->f_vnode; + vfslocked = VFS_LOCK_GIANT(vp->v_mount); +#ifdef AUDIT + vn_lock(vp, LK_SHARED | LK_RETRY); + AUDIT_ARG_VNODE1(vp); + VOP_UNLOCK(vp, 0); +#endif + error = setfown(td, active_cred, vp, uid, gid); + VFS_UNLOCK_GIANT(vfslocked); + return (error); +} diff --git a/sys/ofed/include/linux/linux_compat.c b/sys/ofed/include/linux/linux_compat.c index 98ad807d2aa..90737f2eaf1 100644 --- a/sys/ofed/include/linux/linux_compat.c +++ b/sys/ofed/include/linux/linux_compat.c @@ -559,7 +559,9 @@ struct fileops linuxfileops = { .fo_read = linux_file_read, .fo_poll = linux_file_poll, .fo_close = linux_file_close, - .fo_ioctl = linux_file_ioctl + .fo_ioctl = linux_file_ioctl, + .fo_chmod = invfo_chmod, + .fo_chown = invfo_chown, }; /* diff --git a/sys/opencrypto/cryptodev.c b/sys/opencrypto/cryptodev.c index 2c0c503d2bf..2bc0e1f74d9 100644 --- a/sys/opencrypto/cryptodev.c +++ b/sys/opencrypto/cryptodev.c @@ -301,7 +301,9 @@ static struct fileops cryptofops = { .fo_poll = cryptof_poll, .fo_kqfilter = cryptof_kqfilter, .fo_stat = cryptof_stat, - .fo_close = cryptof_close + .fo_close = cryptof_close, + .fo_chmod = invfo_chmod, + .fo_chown = invfo_chown, }; static struct csession *csefind(struct fcrypt *, u_int); diff --git a/sys/security/mac/mac_framework.h b/sys/security/mac/mac_framework.h index f515e98e6a6..011cb864f97 100644 --- a/sys/security/mac/mac_framework.h +++ b/sys/security/mac/mac_framework.h @@ -225,6 +225,10 @@ int mac_posixsem_check_getvalue(struct ucred *active_cred, int mac_posixsem_check_open(struct ucred *cred, struct ksem *ks); int mac_posixsem_check_post(struct ucred *active_cred, struct ucred *file_cred, struct ksem *ks); +int mac_posixsem_check_setmode(struct ucred *cred, struct ksem *ks, + mode_t mode); +int mac_posixsem_check_setowner(struct ucred *cred, struct ksem *ks, + uid_t uid, gid_t gid); int mac_posixsem_check_stat(struct ucred *active_cred, struct ucred *file_cred, struct ksem *ks); int mac_posixsem_check_unlink(struct ucred *cred, struct ksem *ks); @@ -237,6 +241,10 @@ void mac_posixsem_init(struct ksem *); int mac_posixshm_check_mmap(struct ucred *cred, struct shmfd *shmfd, int prot, int flags); int mac_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd); +int mac_posixshm_check_setmode(struct ucred *cred, struct shmfd *shmfd, + mode_t mode); +int mac_posixshm_check_setowner(struct ucred *cred, struct shmfd *shmfd, + uid_t uid, gid_t gid); int mac_posixshm_check_stat(struct ucred *active_cred, struct ucred *file_cred, struct shmfd *shmfd); int mac_posixshm_check_truncate(struct ucred *active_cred, diff --git a/sys/security/mac/mac_policy.h b/sys/security/mac/mac_policy.h index b874c41e74b..b7ef07b8e0f 100644 --- a/sys/security/mac/mac_policy.h +++ b/sys/security/mac/mac_policy.h @@ -336,6 +336,12 @@ typedef int (*mpo_posixsem_check_open_t)(struct ucred *cred, typedef int (*mpo_posixsem_check_post_t)(struct ucred *active_cred, struct ucred *file_cred, struct ksem *ks, struct label *kslabel); +typedef int (*mpo_posixsem_check_setmode_t)(struct ucred *cred, + struct ksem *ks, struct label *shmlabel, + mode_t mode); +typedef int (*mpo_posixsem_check_setowner_t)(struct ucred *cred, + struct ksem *ks, struct label *shmlabel, + uid_t uid, gid_t gid); typedef int (*mpo_posixsem_check_stat_t)(struct ucred *active_cred, struct ucred *file_cred, struct ksem *ks, struct label *kslabel); @@ -354,6 +360,12 @@ typedef int (*mpo_posixshm_check_mmap_t)(struct ucred *cred, int flags); typedef int (*mpo_posixshm_check_open_t)(struct ucred *cred, struct shmfd *shmfd, struct label *shmlabel); +typedef int (*mpo_posixshm_check_setmode_t)(struct ucred *cred, + struct shmfd *shmfd, struct label *shmlabel, + mode_t mode); +typedef int (*mpo_posixshm_check_setowner_t)(struct ucred *cred, + struct shmfd *shmfd, struct label *shmlabel, + uid_t uid, gid_t gid); typedef int (*mpo_posixshm_check_stat_t)(struct ucred *active_cred, struct ucred *file_cred, struct shmfd *shmfd, struct label *shmlabel); @@ -791,6 +803,8 @@ struct mac_policy_ops { mpo_posixsem_check_getvalue_t mpo_posixsem_check_getvalue; mpo_posixsem_check_open_t mpo_posixsem_check_open; mpo_posixsem_check_post_t mpo_posixsem_check_post; + mpo_posixsem_check_setmode_t mpo_posixsem_check_setmode; + mpo_posixsem_check_setowner_t mpo_posixsem_check_setowner; mpo_posixsem_check_stat_t mpo_posixsem_check_stat; mpo_posixsem_check_unlink_t mpo_posixsem_check_unlink; mpo_posixsem_check_wait_t mpo_posixsem_check_wait; @@ -800,6 +814,8 @@ struct mac_policy_ops { mpo_posixshm_check_mmap_t mpo_posixshm_check_mmap; mpo_posixshm_check_open_t mpo_posixshm_check_open; + mpo_posixshm_check_setmode_t mpo_posixshm_check_setmode; + mpo_posixshm_check_setowner_t mpo_posixshm_check_setowner; mpo_posixshm_check_stat_t mpo_posixshm_check_stat; mpo_posixshm_check_truncate_t mpo_posixshm_check_truncate; mpo_posixshm_check_unlink_t mpo_posixshm_check_unlink; diff --git a/sys/security/mac/mac_posix_sem.c b/sys/security/mac/mac_posix_sem.c index 9035d608c08..461e5dbd341 100644 --- a/sys/security/mac/mac_posix_sem.c +++ b/sys/security/mac/mac_posix_sem.c @@ -198,3 +198,35 @@ mac_posixsem_check_wait(struct ucred *active_cred, struct ucred *file_cred, return (error); } + +MAC_CHECK_PROBE_DEFINE3(posixsem_check_setmode, "struct ucred *", + "struct ksem *", "mode_t"); + +int +mac_posixsem_check_setmode(struct ucred *cred, struct ksem *ks, mode_t mode) +{ + int error; + + MAC_POLICY_CHECK_NOSLEEP(posixsem_check_setmode, cred, ks, + ks->ks_label, mode); + MAC_CHECK_PROBE3(posixsem_check_setmode, error, cred, ks, mode); + + return (error); +} + +MAC_CHECK_PROBE_DEFINE4(posixsem_check_setowner, "struct ucred *", + "struct ks *", "uid_t", "gid_t"); + +int +mac_posixsem_check_setowner(struct ucred *cred, struct ksem *ks, uid_t uid, + gid_t gid) +{ + int error; + + MAC_POLICY_CHECK_NOSLEEP(posixsem_check_setowner, cred, ks, + ks->ks_label, uid, gid); + MAC_CHECK_PROBE4(posixsem_check_setowner, error, cred, ks, + uid, gid); + + return (error); +} diff --git a/sys/security/mac/mac_posix_shm.c b/sys/security/mac/mac_posix_shm.c index 4432a983f2d..7e1c3f76465 100644 --- a/sys/security/mac/mac_posix_shm.c +++ b/sys/security/mac/mac_posix_shm.c @@ -181,3 +181,35 @@ mac_posixshm_check_unlink(struct ucred *cred, struct shmfd *shmfd) return (error); } + +MAC_CHECK_PROBE_DEFINE3(posixshm_check_setmode, "struct ucred *", + "struct shmfd *", "mode_t"); + +int +mac_posixshm_check_setmode(struct ucred *cred, struct shmfd *shmfd, mode_t mode) +{ + int error; + + MAC_POLICY_CHECK_NOSLEEP(posixshm_check_setmode, cred, shmfd, + shmfd->shm_label, mode); + MAC_CHECK_PROBE3(posixshm_check_setmode, error, cred, shmfd, mode); + + return (error); +} + +MAC_CHECK_PROBE_DEFINE4(posixshm_check_setowner, "struct ucred *", + "struct shmfd *", "uid_t", "gid_t"); + +int +mac_posixshm_check_setowner(struct ucred *cred, struct shmfd *shmfd, uid_t uid, + gid_t gid) +{ + int error; + + MAC_POLICY_CHECK_NOSLEEP(posixshm_check_setowner, cred, shmfd, + shmfd->shm_label, uid, gid); + MAC_CHECK_PROBE4(posixshm_check_setowner, error, cred, shmfd, + uid, gid); + + return (error); +} diff --git a/sys/security/mac_stub/mac_stub.c b/sys/security/mac_stub/mac_stub.c index 007efb85340..361bb1565ba 100644 --- a/sys/security/mac_stub/mac_stub.c +++ b/sys/security/mac_stub/mac_stub.c @@ -686,6 +686,22 @@ stub_posixsem_check_post(struct ucred *active_cred, struct ucred *file_cred, return (0); } +static int +stub_posixsem_check_setmode(struct ucred *cred, struct ksem *ks, + struct label *kslabel, mode_t mode) +{ + + return (0); +} + +static int +stub_posixsem_check_setowner(struct ucred *cred, struct ksem *ks, + struct label *kslabel, uid_t uid, gid_t gid) +{ + + return (0); +} + static int stub_posixsem_check_stat(struct ucred *active_cred, struct ucred *file_cred, struct ksem *ks, struct label *kslabel) @@ -733,6 +749,22 @@ stub_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd, return (0); } +static int +stub_posixshm_check_setmode(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel, mode_t mode) +{ + + return (0); +} + +static int +stub_posixshm_check_setowner(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel, uid_t uid, gid_t gid) +{ + + return (0); +} + static int stub_posixshm_check_stat(struct ucred *active_cred, struct ucred *file_cred, struct shmfd *shmfd, struct label *shmlabel) @@ -1731,6 +1763,8 @@ static struct mac_policy_ops stub_ops = .mpo_posixsem_check_getvalue = stub_posixsem_check_getvalue, .mpo_posixsem_check_open = stub_posixsem_check_open, .mpo_posixsem_check_post = stub_posixsem_check_post, + .mpo_posixsem_check_setmode = stub_posixsem_check_setmode, + .mpo_posixsem_check_setowner = stub_posixsem_check_setowner, .mpo_posixsem_check_stat = stub_posixsem_check_stat, .mpo_posixsem_check_unlink = stub_posixsem_check_unlink, .mpo_posixsem_check_wait = stub_posixsem_check_wait, @@ -1740,6 +1774,8 @@ static struct mac_policy_ops stub_ops = .mpo_posixshm_check_mmap = stub_posixshm_check_mmap, .mpo_posixshm_check_open = stub_posixshm_check_open, + .mpo_posixshm_check_setmode = stub_posixshm_check_setmode, + .mpo_posixshm_check_setowner = stub_posixshm_check_setowner, .mpo_posixshm_check_stat = stub_posixshm_check_stat, .mpo_posixshm_check_truncate = stub_posixshm_check_truncate, .mpo_posixshm_check_unlink = stub_posixshm_check_unlink, diff --git a/sys/security/mac_test/mac_test.c b/sys/security/mac_test/mac_test.c index bef0cb7d611..2aa2e38a157 100644 --- a/sys/security/mac_test/mac_test.c +++ b/sys/security/mac_test/mac_test.c @@ -1297,6 +1297,30 @@ test_posixsem_check_post(struct ucred *active_cred, struct ucred *file_cred, return (0); } +COUNTER_DECL(posixsem_check_setmode); +static int +test_posixsem_check_setmode(struct ucred *cred, struct ksem *ks, + struct label *kslabel, mode_t mode) +{ + + LABEL_CHECK(cred->cr_label, MAGIC_CRED); + LABEL_CHECK(kslabel, MAGIC_POSIX_SHM); + COUNTER_INC(posixsem_check_setmode); + return (0); +} + +COUNTER_DECL(posixsem_check_setowner); +static int +test_posixsem_check_setowner(struct ucred *cred, struct ksem *ks, + struct label *kslabel, uid_t uid, gid_t gid) +{ + + LABEL_CHECK(cred->cr_label, MAGIC_CRED); + LABEL_CHECK(kslabel, MAGIC_POSIX_SHM); + COUNTER_INC(posixsem_check_setowner); + return (0); +} + COUNTER_DECL(posixsem_check_stat); static int test_posixsem_check_stat(struct ucred *active_cred, @@ -1390,6 +1414,30 @@ test_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd, return (0); } +COUNTER_DECL(posixshm_check_setmode); +static int +test_posixshm_check_setmode(struct ucred *cred, struct shmfd *shmfd, + struct label *shmfdlabel, mode_t mode) +{ + + LABEL_CHECK(cred->cr_label, MAGIC_CRED); + LABEL_CHECK(shmfdlabel, MAGIC_POSIX_SHM); + COUNTER_INC(posixshm_check_setmode); + return (0); +} + +COUNTER_DECL(posixshm_check_setowner); +static int +test_posixshm_check_setowner(struct ucred *cred, struct shmfd *shmfd, + struct label *shmfdlabel, uid_t uid, gid_t gid) +{ + + LABEL_CHECK(cred->cr_label, MAGIC_CRED); + LABEL_CHECK(shmfdlabel, MAGIC_POSIX_SHM); + COUNTER_INC(posixshm_check_setowner); + return (0); +} + COUNTER_DECL(posixshm_check_stat); static int test_posixshm_check_stat(struct ucred *active_cred, @@ -3045,6 +3093,8 @@ static struct mac_policy_ops test_ops = .mpo_posixsem_check_getvalue = test_posixsem_check_getvalue, .mpo_posixsem_check_open = test_posixsem_check_open, .mpo_posixsem_check_post = test_posixsem_check_post, + .mpo_posixsem_check_setmode = test_posixsem_check_setmode, + .mpo_posixsem_check_setowner = test_posixsem_check_setowner, .mpo_posixsem_check_stat = test_posixsem_check_stat, .mpo_posixsem_check_unlink = test_posixsem_check_unlink, .mpo_posixsem_check_wait = test_posixsem_check_wait, @@ -3054,6 +3104,8 @@ static struct mac_policy_ops test_ops = .mpo_posixshm_check_mmap = test_posixshm_check_mmap, .mpo_posixshm_check_open = test_posixshm_check_open, + .mpo_posixshm_check_setmode = test_posixshm_check_setmode, + .mpo_posixshm_check_setowner = test_posixshm_check_setowner, .mpo_posixshm_check_stat = test_posixshm_check_stat, .mpo_posixshm_check_truncate = test_posixshm_check_truncate, .mpo_posixshm_check_unlink = test_posixshm_check_unlink, diff --git a/sys/sys/file.h b/sys/sys/file.h index 2c64bcf644e..5a4af332ebb 100644 --- a/sys/sys/file.h +++ b/sys/sys/file.h @@ -85,6 +85,10 @@ typedef int fo_kqfilter_t(struct file *fp, struct knote *kn); typedef int fo_stat_t(struct file *fp, struct stat *sb, struct ucred *active_cred, struct thread *td); typedef int fo_close_t(struct file *fp, struct thread *td); +typedef int fo_chmod_t(struct file *fp, mode_t mode, + struct ucred *active_cred, struct thread *td); +typedef int fo_chown_t(struct file *fp, uid_t uid, gid_t gid, + struct ucred *active_cred, struct thread *td); typedef int fo_flags_t; struct fileops { @@ -96,6 +100,8 @@ struct fileops { fo_kqfilter_t *fo_kqfilter; fo_stat_t *fo_stat; fo_close_t *fo_close; + fo_chmod_t *fo_chmod; + fo_chown_t *fo_chown; fo_flags_t fo_flags; /* DFLAG_* below */ }; @@ -200,6 +206,9 @@ fo_kqfilter_t soo_kqfilter; fo_stat_t soo_stat; fo_close_t soo_close; +fo_chmod_t invfo_chmod; +fo_chown_t invfo_chown; + void finit(struct file *, u_int, short, void *, struct fileops *); int fgetvp(struct thread *td, int fd, cap_rights_t rights, struct vnode **vpp); int fgetvp_rights(struct thread *td, int fd, cap_rights_t need, @@ -233,6 +242,8 @@ static __inline fo_poll_t fo_poll; static __inline fo_kqfilter_t fo_kqfilter; static __inline fo_stat_t fo_stat; static __inline fo_close_t fo_close; +static __inline fo_chmod_t fo_chmod; +static __inline fo_chown_t fo_chown; static __inline int fo_read(struct file *fp, struct uio *uio, struct ucred *active_cred, @@ -296,6 +307,22 @@ fo_kqfilter(struct file *fp, struct knote *kn) return ((*fp->f_ops->fo_kqfilter)(fp, kn)); } +static __inline int +fo_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, + struct thread *td) +{ + + return ((*fp->f_ops->fo_chmod)(fp, mode, active_cred, td)); +} + +static __inline int +fo_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, + struct thread *td) +{ + + return ((*fp->f_ops->fo_chown)(fp, uid, gid, active_cred, td)); +} + #endif /* _KERNEL */ #endif /* !SYS_FILE_H */ diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 1c4c7b7dab7..81be360dd04 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -778,7 +778,15 @@ void vfs_mark_atime(struct vnode *vp, struct ucred *cred); struct dirent; int vfs_read_dirent(struct vop_readdir_args *ap, struct dirent *dp, off_t off); -int vfs_unixify_accmode(accmode_t *accmode); +int vfs_unixify_accmode(accmode_t *accmode); + +int setfmode(struct thread *td, struct ucred *cred, struct vnode *vp, int mode); +int setfown(struct thread *td, struct ucred *cred, struct vnode *vp, uid_t uid, + gid_t gid); +int vn_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, + struct thread *td); +int vn_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, + struct thread *td); #endif /* _KERNEL */ From 4c023a336562d5567a389373ce382c12900eb000 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 16 Aug 2011 20:13:17 +0000 Subject: [PATCH 255/452] Do not return success and a string "unknown" when vn_fullpath() was unable to resolve the path of the text vnode of the process. The behaviour is very confusing for any consumer of the procfs, in particular, java. Reported and tested by: bf MFC after: 2 weeks Approved by: re (bz) --- sys/fs/procfs/procfs.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/sys/fs/procfs/procfs.c b/sys/fs/procfs/procfs.c index 8b69eb1a0b3..514e279396f 100644 --- a/sys/fs/procfs/procfs.c +++ b/sys/fs/procfs/procfs.c @@ -67,20 +67,23 @@ int procfs_doprocfile(PFS_FILL_ARGS) { - char *fullpath = "unknown"; - char *freepath = NULL; + char *fullpath; + char *freepath; struct vnode *textvp; + int error; + freepath = NULL; PROC_LOCK(p); textvp = p->p_textvp; vhold(textvp); PROC_UNLOCK(p); - vn_fullpath(td, textvp, &fullpath, &freepath); + error = vn_fullpath(td, textvp, &fullpath, &freepath); vdrop(textvp); - sbuf_printf(sb, "%s", fullpath); - if (freepath) + if (error == 0) + sbuf_printf(sb, "%s", fullpath); + if (freepath != NULL) free(freepath, M_TEMP); - return (0); + return (error); } /* From ca96e26a7165b6267b688a4fb8293c1c22c5771e Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Tue, 16 Aug 2011 21:04:04 +0000 Subject: [PATCH 256/452] Update LibUSB v1.0 manual page: - fix some minor spelling - fix some style - add description of new function MFC after: 1 week Approved by: re (kib) --- lib/libusb/Makefile | 1 + lib/libusb/libusb.3 | 55 +++++++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/lib/libusb/Makefile b/lib/libusb/Makefile index f438cff3dec..c4396cca0ae 100644 --- a/lib/libusb/Makefile +++ b/lib/libusb/Makefile @@ -45,6 +45,7 @@ MLINKS += libusb.3 libusb_get_device_list.3 MLINKS += libusb.3 libusb_free_device_list.3 MLINKS += libusb.3 libusb_get_bus_number.3 MLINKS += libusb.3 libusb_get_device_address.3 +MLINKS += libusb.3 libusb_get_device_speed.3 MLINKS += libusb.3 libusb_get_max_packet_size.3 MLINKS += libusb.3 libusb_ref_device.3 MLINKS += libusb.3 libusb_unref_device.3 diff --git a/lib/libusb/libusb.3 b/lib/libusb/libusb.3 index 33d807dbf85..885b066529a 100644 --- a/lib/libusb/libusb.3 +++ b/lib/libusb/libusb.3 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 18, 2010 +.Dd August 16, 2011 .Dt LIBUSB 3 .Os .Sh NAME @@ -116,14 +116,22 @@ Returns the number of the bus contained by the device . .Ft uint8_t .Fn libusb_get_device_address "libusb_device *dev" -Return the device_address contained by the device +Returns the device_address contained by the device .Fa dev. . .Pp . +.Ft enum libusb_speed +.Fn libusb_get_device_speed "libusb_device *dev" +Returns the wire speed at which the device is connected. +See the LIBUSB_SPEED_XXX enums for more information. +LIBUSB_SPEED_UNKNOWN is returned in case of unknown wire speed. +. +.Pp +. .Ft int .Fn libusb_get_max_packet_size "libusb_device *dev" "unsigned char endpoint" -Return the wMaxPacketSize value on success, LIBUSB_ERROR_NOT_FOUND if the +Returns the wMaxPacketSize value on success, LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist and LIBUSB_ERROR_OTHERS on other failure. . .Pp @@ -144,7 +152,7 @@ Decrement the reference counter of the device . .Ft int .Fn libusb_open "libusb_device *dev" "libusb_device_handle **devh" -Open a device and obtain a device_handle. Return 0 on success, +Open a device and obtain a device_handle. Returns 0 on success, LIBUSB_ERROR_NO_MEM on memory allocation problem, LIBUSB_ERROR_ACCESS on permission problem, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on error. @@ -157,7 +165,7 @@ Convenience function to open a device with is .Fa vid and .Fa pid. -Return NULL on error. +Returns NULL on error. . .Pp . @@ -168,14 +176,15 @@ Close a device handle. .Pp . .Ft libusb_device * -.Fn libusb_get_device(libusb_device_handle *devh) -Get the device contained by devh. Return NULL on error. +.Fn libusb_get_device "libusb_device_handle *devh" +Get the device contained by devh. +Returns NULL on error. . .Pp . .Ft int .Fn libusb_get_configuration "libusb_device_handle *devh" "int *config" -Return the bConfiguration value of the current configuration. return 0 +Returns the bConfiguration value of the current configuration. Returns 0 on success, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on error. . @@ -187,7 +196,7 @@ Set the active configuration .Fa config for the device contained by .Fa devh. -This function return 0 on success, LIBUSB_ERROR_NOT_FOUND if the requested +This function returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the requested configuration does not exist, LIBUSB_ERROR_BUSY if the interfaces are currently claimed, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on failure. @@ -198,7 +207,7 @@ LIBUSB_ERROR code on failure. .Fn libusb_claim_interface "libusb_device_handle *devh" "int interface_number" Claim an interface in a given libusb_handle .Fa devh. -This is a non-blocking function. It return 0 success, LIBUSB_ERROR_NOT_FOUND +This is a non-blocking function. It returns 0 success, LIBUSB_ERROR_NOT_FOUND if the requested interface does not exist, LIBUSB_ERROR_BUSY if a program or driver has claimed the interface, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on failure. @@ -251,7 +260,7 @@ code on failure. .Fn libusb_kernel_driver_active "libusb_device_handle *devh" "int interface" Determine if a driver is active on a interface. Returns 0 if no kernel driver is active, returns 1 if a kernel driver is active, returns LIBUSB_ERROR_NO_DEVICE -if the device has been disconnected and return a LIBUSB_ERROR code on failure. +if the device has been disconnected and returns a LIBUSB_ERROR code on failure. . .Pp . @@ -316,7 +325,7 @@ failure. .Fn libsub_get_active_config_descriptor "libusb_device *dev" "struct libusb_config_descriptor **config" Get the USB configuration descriptor for the active configuration. Returns 0 on success, returns LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state -and return another LIBUSB_ERROR code on error. +and returns another LIBUSB_ERROR code on error. . .Pp .Ft int @@ -342,8 +351,8 @@ Free a configuration descriptor. .Pp .Ft int .Fn libusb_get_string_descriptor_ascii "libusb_device_handle *devh" "uint8_t desc_idx" "unsigned char *data" "int length" -Retrieve a string descriptor in C style ascii. Returns a number of byte on success -and a LIBUSB_ERROR code on failure. +Retrieve a string descriptor in C style ascii. +Returns a positive number of bytes in the resulting ASCII string on success and a LIBUSB_ERROR code on failure. . .Pp . @@ -354,7 +363,8 @@ and a LIBUSB_ERROR code on failure. .Fn libusb_alloc_transfer "int iso_packets" Allocate a transfer with .Fa iso_packets -numbers of isochronous packet descriptors. Returns NULL on error. +numbers of isochronous packet descriptors. +Returns NULL on error. . .Pp .Ft void @@ -364,15 +374,15 @@ Free a transfer. .Pp .Ft int .Fn libusb_submit_transfer "struct libusb_transfer *tr" -This function will submit a transfer and returns immediately. Returns 0 on -success, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and +This function will submit a transfer and returns immediately. +Returns 0 on success, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and LIBUSB_ERROR code on other failure. . .Pp .Ft int .Fn libusb_cancel_transfer "struct libusb_transfer *tr" -This function asynchronously cancel a transfer. Returns 0 on success and -LIBUSB_ERROR code on failure. +This function asynchronously cancel a transfer. +Returns 0 on success and LIBUSB_ERROR code on failure. . .Pp .Sh USB SYNCHRONOUS I/O @@ -380,7 +390,8 @@ LIBUSB_ERROR code on failure. .Pp .Ft int .Fn libusb_control_transfer "libusb_device_handle *devh" "uint8_t bmRequestType" "uint8_t bRequest" "uint16_t wValue" "uint16_t wIndex" "unsigned char *data" "uint16_t wLength" "unsigned int timeout" -Perform a USB control transfer. Returns the actual number of bytes +Perform a USB control transfer. +Returns the actual number of bytes transferred on success in the range from and including zero until and including .Fa wLength . @@ -420,8 +431,8 @@ LIBUSB_ERROR code on other failure. .Pp .Ft int .Fn libusb_try_lock_events "libusb_context *ctx" -Try to acquire the event handling lock. Returns 0 if the lock was obtained and 1 -if not. +Try to acquire the event handling lock. +Returns 0 if the lock was obtained and 1 if not. . .Pp .Ft void From 3900c0936fe3142d2664baec52c9b76956f6069c Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Tue, 16 Aug 2011 21:04:18 +0000 Subject: [PATCH 257/452] Fix the handling of [gs]etsockopt() unconnected 1-to-1 style sockets. While there: * Fix a locking issue in setsockopt() of SCTP_CMT_ON_OFF. * Fix a bug in setsockopt() of SCTP_DEFAULT_PRINFO, where the pr_value was ignored. Approved by: re@ MFC after: 2 months. --- sys/netinet/sctp_usrreq.c | 151 ++++++++++++++++++++++++++++---------- 1 file changed, 114 insertions(+), 37 deletions(-) diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index b6d7c712988..0e52909b7b9 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -1767,7 +1767,9 @@ flags_out: av->assoc_value = stcb->asoc.sctp_cmt_on_off; SCTP_TCB_UNLOCK(stcb); } else { - if (av->assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); av->assoc_value = inp->sctp_cmt_on_off; SCTP_INP_RUNLOCK(inp); @@ -1791,7 +1793,9 @@ flags_out: av->assoc_value = stcb->asoc.congestion_control_module; SCTP_TCB_UNLOCK(stcb); } else { - if (av->assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); av->assoc_value = inp->sctp_ep.sctp_default_cc_module; SCTP_INP_RUNLOCK(inp); @@ -1834,7 +1838,9 @@ flags_out: av->assoc_value = stcb->asoc.stream_scheduling_module; SCTP_TCB_UNLOCK(stcb); } else { - if (av->assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); av->assoc_value = inp->sctp_ep.sctp_default_ss_module; SCTP_INP_RUNLOCK(inp); @@ -1949,7 +1955,9 @@ flags_out: av->assoc_value = stcb->asoc.context; SCTP_TCB_UNLOCK(stcb); } else { - if (av->assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); av->assoc_value = inp->sctp_context; SCTP_INP_RUNLOCK(inp); @@ -2022,7 +2030,9 @@ flags_out: sack->sack_freq = stcb->asoc.sack_freq; SCTP_TCB_UNLOCK(stcb); } else { - if (sack->sack_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (sack->sack_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); sack->sack_delay = TICKS_TO_MSEC(inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_RECV]); sack->sack_freq = inp->sctp_ep.sctp_sack_freq; @@ -2067,7 +2077,9 @@ flags_out: av->assoc_value = stcb->asoc.max_burst; SCTP_TCB_UNLOCK(stcb); } else { - if (av->assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); av->assoc_value = inp->sctp_ep.max_burst; SCTP_INP_RUNLOCK(inp); @@ -2093,7 +2105,9 @@ flags_out: av->assoc_value = sctp_get_frag_point(stcb, &stcb->asoc); SCTP_TCB_UNLOCK(stcb); } else { - if (av->assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { ovh = SCTP_MED_OVERHEAD; @@ -2462,7 +2476,9 @@ flags_out: paddrp->spp_assoc_id = sctp_get_associd(stcb); SCTP_TCB_UNLOCK(stcb); } else { - if (paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC)) { /* Use endpoint defaults */ SCTP_INP_RLOCK(inp); paddrp->spp_pathmaxrxt = inp->sctp_ep.def_net_failure; @@ -2637,7 +2653,9 @@ flags_out: srto->srto_min = stcb->asoc.minrto; SCTP_TCB_UNLOCK(stcb); } else { - if (srto->srto_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (srto->srto_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); srto->srto_initial = inp->sctp_ep.initial_rto; srto->srto_max = inp->sctp_ep.sctp_maxrto; @@ -2691,7 +2709,9 @@ flags_out: sasoc->sasoc_local_rwnd = stcb->asoc.my_rwnd; SCTP_TCB_UNLOCK(stcb); } else { - if (sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); sasoc->sasoc_cookie_life = TICKS_TO_MSEC(inp->sctp_ep.def_cookie_life); sasoc->sasoc_asocmaxrxt = inp->sctp_ep.max_send_times; @@ -2720,7 +2740,9 @@ flags_out: memcpy(s_info, &stcb->asoc.def_send, sizeof(stcb->asoc.def_send)); SCTP_TCB_UNLOCK(stcb); } else { - if (s_info->sinfo_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (s_info->sinfo_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); memcpy(s_info, &inp->def_send, sizeof(inp->def_send)); SCTP_INP_RUNLOCK(inp); @@ -2822,7 +2844,9 @@ flags_out: scact->scact_keynumber = stcb->asoc.authinfo.active_keyid; SCTP_TCB_UNLOCK(stcb); } else { - if (scact->scact_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (scact->scact_assoc_id == SCTP_FUTURE_ASSOC)) { /* get the endpoint active key */ SCTP_INP_RLOCK(inp); scact->scact_keynumber = inp->sctp_ep.default_keyid; @@ -2861,7 +2885,9 @@ flags_out: } SCTP_TCB_UNLOCK(stcb); } else { - if (sac->gauth_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (sac->gauth_assoc_id == SCTP_FUTURE_ASSOC)) { /* get off the endpoint */ SCTP_INP_RLOCK(inp); chklist = inp->sctp_ep.local_auth_chunks; @@ -2967,7 +2993,9 @@ flags_out: event->se_on = sctp_stcb_is_feature_on(inp, stcb, event_type); SCTP_TCB_UNLOCK(stcb); } else { - if (event->se_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (event->se_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); event->se_on = sctp_is_feature_on(inp, event_type); SCTP_INP_RUNLOCK(inp); @@ -3035,7 +3063,9 @@ flags_out: info->snd_context = stcb->asoc.def_send.sinfo_context; SCTP_TCB_UNLOCK(stcb); } else { - if (info->snd_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (info->snd_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); info->snd_sid = inp->def_send.sinfo_stream; info->snd_flags = inp->def_send.sinfo_flags; @@ -3065,7 +3095,9 @@ flags_out: info->pr_value = stcb->asoc.def_send.sinfo_timetolive; SCTP_TCB_UNLOCK(stcb); } else { - if (info->pr_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (info->pr_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_RLOCK(inp); info->pr_policy = PR_SCTP_POLICY(inp->def_send.sinfo_flags); info->pr_value = inp->def_send.sinfo_timetolive; @@ -3153,7 +3185,9 @@ flags_out: thlds->spt_assoc_id = sctp_get_associd(stcb); SCTP_TCB_UNLOCK(stcb); } else { - if (thlds->spt_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (thlds->spt_assoc_id == SCTP_FUTURE_ASSOC)) { /* Use endpoint defaults */ SCTP_INP_RLOCK(inp); thlds->spt_pathmaxrxt = inp->sctp_ep.def_net_failure; @@ -3347,7 +3381,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, stcb->asoc.sctp_cmt_on_off = av->assoc_value; SCTP_TCB_UNLOCK(stcb); } else { - if ((av->assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC) || (av->assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); inp->sctp_cmt_on_off = av->assoc_value; @@ -3360,8 +3396,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, SCTP_TCB_LOCK(stcb); stcb->asoc.sctp_cmt_on_off = av->assoc_value; SCTP_TCB_UNLOCK(stcb); - SCTP_INP_RUNLOCK(inp); } + SCTP_INP_RUNLOCK(inp); } } } else { @@ -3394,7 +3430,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } SCTP_TCB_UNLOCK(stcb); } else { - if ((av->assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC) || (av->assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); inp->sctp_ep.sctp_default_cc_module = av->assoc_value; @@ -3474,7 +3512,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc, 1); SCTP_TCB_UNLOCK(stcb); } else { - if ((av->assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC) || (av->assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); inp->sctp_ep.sctp_default_ss_module = av->assoc_value; @@ -3548,7 +3588,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, stcb->asoc.context = av->assoc_value; SCTP_TCB_UNLOCK(stcb); } else { - if ((av->assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC) || (av->assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); inp->sctp_context = av->assoc_value; @@ -3614,7 +3656,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } SCTP_TCB_UNLOCK(stcb); } else { - if ((sack->sack_assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (sack->sack_assoc_id == SCTP_FUTURE_ASSOC) || (sack->sack_assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); if (sack->sack_delay) { @@ -3709,7 +3753,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, error = sctp_insert_sharedkey(shared_keys, shared_key); SCTP_TCB_UNLOCK(stcb); } else { - if ((sca->sca_assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (sca->sca_assoc_id == SCTP_FUTURE_ASSOC) || (sca->sca_assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); shared_keys = &inp->sctp_ep.shared_keys; @@ -3853,7 +3899,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } SCTP_TCB_UNLOCK(stcb); } else { - if ((scact->scact_assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (scact->scact_assoc_id == SCTP_FUTURE_ASSOC) || (scact->scact_assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); if (sctp_auth_setactivekey_ep(inp, scact->scact_keynumber)) { @@ -3890,7 +3938,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } SCTP_TCB_UNLOCK(stcb); } else { - if ((scdel->scact_assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (scdel->scact_assoc_id == SCTP_FUTURE_ASSOC) || (scdel->scact_assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); if (sctp_delete_sharedkey_ep(inp, scdel->scact_keynumber)) { @@ -3927,7 +3977,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } SCTP_TCB_UNLOCK(stcb); } else { - if ((keyid->scact_assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (keyid->scact_assoc_id == SCTP_FUTURE_ASSOC) || (keyid->scact_assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); if (sctp_deact_sharedkey_ep(inp, keyid->scact_keynumber)) { @@ -4193,7 +4245,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, stcb->asoc.max_burst = av->assoc_value; SCTP_TCB_UNLOCK(stcb); } else { - if ((av->assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC) || (av->assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); inp->sctp_ep.max_burst = av->assoc_value; @@ -4233,7 +4287,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } SCTP_TCB_UNLOCK(stcb); } else { - if (av->assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (av->assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_WLOCK(inp); /* * FIXME MT: I think this is not in @@ -4441,7 +4497,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } SCTP_TCB_UNLOCK(stcb); } else { - if ((s_info->sinfo_assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (s_info->sinfo_assoc_id == SCTP_FUTURE_ASSOC) || (s_info->sinfo_assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); memcpy(&inp->def_send, s_info, min(optsize, sizeof(inp->def_send))); @@ -4740,7 +4798,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, SCTP_TCB_UNLOCK(stcb); } else { /************************NO TCB, SET TO default stuff ******************/ - if (paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (paddrp->spp_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_WLOCK(inp); /* * For the TOS/FLOWLABEL stuff you @@ -4806,7 +4866,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } SCTP_TCB_UNLOCK(stcb); } else { - if (srto->srto_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (srto->srto_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_WLOCK(inp); if (srto->srto_initial) new_init = srto->srto_initial; @@ -4858,7 +4920,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } SCTP_TCB_UNLOCK(stcb); } else { - if (sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_WLOCK(inp); if (sasoc->sasoc_asocmaxrxt) inp->sctp_ep.max_send_times = sasoc->sasoc_asocmaxrxt; @@ -5178,13 +5242,17 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, * sender dry events */ if ((event_type == SCTP_PCB_FLAGS_DRYEVNT) && + ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) == 0) && + ((inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) == 0) && ((event->se_assoc_id == SCTP_ALL_ASSOC) || (event->se_assoc_id == SCTP_CURRENT_ASSOC))) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOTSUP); error = ENOTSUP; break; } - if ((event->se_assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (event->se_assoc_id == SCTP_FUTURE_ASSOC) || (event->se_assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); if (event->se_on) { @@ -5262,7 +5330,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } SCTP_TCB_UNLOCK(stcb); } else { - if ((info->snd_assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (info->snd_assoc_id == SCTP_FUTURE_ASSOC) || (info->snd_assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); inp->def_send.sinfo_stream = info->snd_sid; @@ -5308,13 +5378,17 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, if (stcb) { stcb->asoc.def_send.sinfo_flags &= 0xfff0; stcb->asoc.def_send.sinfo_flags |= info->pr_policy; + stcb->asoc.def_send.sinfo_timetolive = info->pr_value; SCTP_TCB_UNLOCK(stcb); } else { - if ((info->pr_assoc_id == SCTP_FUTURE_ASSOC) || + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (info->pr_assoc_id == SCTP_FUTURE_ASSOC) || (info->pr_assoc_id == SCTP_ALL_ASSOC)) { SCTP_INP_WLOCK(inp); inp->def_send.sinfo_flags &= 0xfff0; inp->def_send.sinfo_flags |= info->pr_policy; + inp->def_send.sinfo_timetolive = info->pr_value; SCTP_INP_WUNLOCK(inp); } if ((info->pr_assoc_id == SCTP_CURRENT_ASSOC) || @@ -5324,6 +5398,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, SCTP_TCB_LOCK(stcb); stcb->asoc.def_send.sinfo_flags &= 0xfff0; stcb->asoc.def_send.sinfo_flags |= info->pr_policy; + stcb->asoc.def_send.sinfo_timetolive = info->pr_value; SCTP_TCB_UNLOCK(stcb); } SCTP_INP_RUNLOCK(inp); @@ -5459,7 +5534,9 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, stcb->asoc.def_net_pf_threshold = thlds->spt_pathpfthld; } } else { - if (thlds->spt_assoc_id == SCTP_FUTURE_ASSOC) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || + (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (thlds->spt_assoc_id == SCTP_FUTURE_ASSOC)) { SCTP_INP_WLOCK(inp); inp->sctp_ep.def_net_failure = thlds->spt_pathmaxrxt; inp->sctp_ep.def_net_pf_threshold = thlds->spt_pathpfthld; From 983938761673af5b9052c52f1c1cf24cfd75c0d4 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Tue, 16 Aug 2011 21:51:29 +0000 Subject: [PATCH 258/452] Always check current HPET counter value after comparator programming to avoid lost timer interrupts. Previous optimization attempt doing it only for intervals less then 5000 ticks (~300us) reported to be unreliable by some people. Probably because of some heavy SMI code on their boards. Introduce additional safety interval of 128 counter ticks (~9us) between programmed comparator and counter values to cover different cases of delayed write found on some chipsets. Approved by: re (kib) --- sys/dev/acpica/acpi_hpet.c | 14 ++++++-------- sys/dev/acpica/acpi_hpet.h | 2 ++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sys/dev/acpica/acpi_hpet.c b/sys/dev/acpica/acpi_hpet.c index 40e8676fceb..134a86afe73 100644 --- a/sys/dev/acpica/acpi_hpet.c +++ b/sys/dev/acpica/acpi_hpet.c @@ -190,13 +190,10 @@ restart: bus_write_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num), t->next); } - if (fdiv < 5000) { - bus_read_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num)); - now = bus_read_4(sc->mem_res, HPET_MAIN_COUNTER); - if ((int32_t)(now - t->next) >= 0) { - fdiv *= 2; - goto restart; - } + now = bus_read_4(sc->mem_res, HPET_MAIN_COUNTER); + if ((int32_t)(now - t->next + HPET_MIN_CYCLES) >= 0) { + fdiv *= 2; + goto restart; } return (0); } @@ -679,7 +676,8 @@ hpet_attach(device_t dev) t->et.et_quality -= 10; t->et.et_frequency = sc->freq; t->et.et_min_period.sec = 0; - t->et.et_min_period.frac = 0x00008000LLU << 32; + t->et.et_min_period.frac = + (((uint64_t)(HPET_MIN_CYCLES * 2) << 32) / sc->freq) << 32; t->et.et_max_period.sec = 0xfffffffeLLU / sc->freq; t->et.et_max_period.frac = ((0xfffffffeLLU << 32) / sc->freq) << 32; diff --git a/sys/dev/acpica/acpi_hpet.h b/sys/dev/acpica/acpi_hpet.h index 8ca40cdfb3c..fd495d5267f 100644 --- a/sys/dev/acpica/acpi_hpet.h +++ b/sys/dev/acpica/acpi_hpet.h @@ -62,4 +62,6 @@ #define HPET_TIMER_FSB_VAL(x) ((x) * 0x20 + 0x110) #define HPET_TIMER_FSB_ADDR(x) ((x) * 0x20 + 0x114) +#define HPET_MIN_CYCLES 128 /* Period considered reliable. */ + #endif /* !__ACPI_HPET_H__ */ From 68889ed6994b8e5a470c962d7ebaeb36518d73e9 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Wed, 17 Aug 2011 12:37:14 +0000 Subject: [PATCH 259/452] Fix build breakage. Initialize error variables explicitely for !MAC case. Pointy hat to: kib Approved by: re (bz) --- sys/kern/uipc_sem.c | 1 + sys/kern/uipc_shm.c | 1 + 2 files changed, 2 insertions(+) diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c index 95c29c0f0f2..f77bf3b9d5a 100644 --- a/sys/kern/uipc_sem.c +++ b/sys/kern/uipc_sem.c @@ -270,6 +270,7 @@ ksem_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, struct ksem *ks; int error; + error = 0; ks = fp->f_data; mtx_lock(&sem_lock); #ifdef MAC diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c index 45989cfeab6..57fd5eb413e 100644 --- a/sys/kern/uipc_shm.c +++ b/sys/kern/uipc_shm.c @@ -699,6 +699,7 @@ shm_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, struct shmfd *shmfd; int error; + error = 0; shmfd = fp->f_data; mtx_lock(&shm_timestamp_lock); #ifdef MAC From a6bab2362ea6963901884bf0929c54a001e79d8b Mon Sep 17 00:00:00 2001 From: Sergey Kandaurov Date: Wed, 17 Aug 2011 13:02:50 +0000 Subject: [PATCH 260/452] Fix build failure without BPF. Reported by: deeptech71 at gmail dot com Approved by: re (kib) --- sys/contrib/pf/net/if_pfsync.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/contrib/pf/net/if_pfsync.c b/sys/contrib/pf/net/if_pfsync.c index ba8a348812a..0a093fcf230 100644 --- a/sys/contrib/pf/net/if_pfsync.c +++ b/sys/contrib/pf/net/if_pfsync.c @@ -2126,8 +2126,8 @@ pfsync_sendout(void) #else struct ifnet *ifp = &sc->sc_if; #endif - struct mbuf *m; #endif + struct mbuf *m; struct ip *ip; struct pfsync_header *ph; struct pfsync_subheader *subh; From dab19f3084733e6d685609120d915c7cd9e5cd51 Mon Sep 17 00:00:00 2001 From: Gabor Kovesdan Date: Wed, 17 Aug 2011 13:56:33 +0000 Subject: [PATCH 261/452] - Fix handling of environmental variables when they are set to empty string Submitted by: ttsestt@gmail.com Approved by: re (kib), delphij (mentor) --- usr.bin/grep/grep.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/usr.bin/grep/grep.c b/usr.bin/grep/grep.c index d03c13c7713..73e1d3d3371 100644 --- a/usr.bin/grep/grep.c +++ b/usr.bin/grep/grep.c @@ -304,7 +304,7 @@ init_color(const char *d) char *c; c = getenv("GREP_COLOR"); - return (c != NULL ? c : d); + return (c != NULL && c[0] != '\0' ? c : d); } int @@ -360,7 +360,7 @@ main(int argc, char *argv[]) /* support for extra arguments in GREP_OPTIONS */ eargc = 0; - if (eopts != NULL) { + if (eopts != NULL && eopts[0] != '\0') { char *str; /* make an estimation of how many extra arguments we have */ @@ -373,7 +373,8 @@ main(int argc, char *argv[]) eargc = 0; /* parse extra arguments */ while ((str = strsep(&eopts, " ")) != NULL) - eargv[eargc++] = grep_strdup(str); + if (str[0] != '\0') + eargv[eargc++] = grep_strdup(str); aargv = (char **)grep_calloc(eargc + argc + 1, sizeof(char *)); From ad92276ece80f008a840316e7b6e76fa535fed18 Mon Sep 17 00:00:00 2001 From: Gabor Kovesdan Date: Wed, 17 Aug 2011 13:58:39 +0000 Subject: [PATCH 262/452] - Fix exclusion of directories from a recursive search - Use FTS_SKIP for exclusion instead of custom code Submitted by: ttsestt@gmail.com Approved by: re (kib), delphij (mentor) --- usr.bin/grep/util.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/usr.bin/grep/util.c b/usr.bin/grep/util.c index 683a537dfda..780f0fc57fc 100644 --- a/usr.bin/grep/util.c +++ b/usr.bin/grep/util.c @@ -84,7 +84,7 @@ dir_matching(const char *dname) for (unsigned int i = 0; i < dpatterns; ++i) { if (dname != NULL && - fnmatch(dname, dpattern[i].pat, 0) == 0) { + fnmatch(dpattern[i].pat, dname, 0) == 0) { if (dpattern[i].mode == EXCL_PAT) return (false); else @@ -103,7 +103,6 @@ grep_tree(char **argv) { FTS *fts; FTSENT *p; - char *d, *dir = NULL; int c, fts_flags; bool ok; @@ -135,6 +134,10 @@ grep_tree(char **argv) case FTS_D: /* FALLTHROUGH */ case FTS_DP: + if (dexclude || dinclude) + if (!dir_matching(p->fts_name) || + !dir_matching(p->fts_path)) + fts_set(fts, p, FTS_SKIP); break; case FTS_DC: /* Print a warning for recursive directory loop */ @@ -144,18 +147,6 @@ grep_tree(char **argv) default: /* Check for file exclusion/inclusion */ ok = true; - if (dexclude || dinclude) { - if ((d = strrchr(p->fts_path, '/')) != NULL) { - dir = grep_malloc(sizeof(char) * - (d - p->fts_path + 1)); - memcpy(dir, p->fts_path, - d - p->fts_path); - dir[d - p->fts_path] = '\0'; - } - ok = dir_matching(dir); - free(dir); - dir = NULL; - } if (fexclude || finclude) ok &= file_matching(p->fts_path); From e89359c21e3b223fdba6a75004fbe6d138e2f5c2 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Wed, 17 Aug 2011 14:39:45 +0000 Subject: [PATCH 263/452] Fix a regression where a rule containing a source port option after a destination IP would incorrectly display the source port as a destination port. Reviewed by: luigi Approved by: re (kib) MFC after: 1 week --- sbin/ipfw/ipfw2.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sbin/ipfw/ipfw2.c b/sbin/ipfw/ipfw2.c index e259f5ec809..e389e99f81a 100644 --- a/sbin/ipfw/ipfw2.c +++ b/sbin/ipfw/ipfw2.c @@ -1282,6 +1282,8 @@ show_ipfw(struct ip_fw *rule, int pcwidth, int bcwidth) HAVE_PROTO | HAVE_SRCIP | HAVE_DSTIP | HAVE_IP, 0); case O_IP_SRCPORT: + if (flags & HAVE_DSTIP) + flags |= HAVE_IP; show_prerequisites(&flags, HAVE_PROTO | HAVE_SRCIP, 0); if ((cmd->len & F_OR) && !or_block) From 126123eacc5c47b05b58227c6f472747196759a9 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Wed, 17 Aug 2011 19:43:41 +0000 Subject: [PATCH 264/452] Update ata(4) manual page, reflecting migration to CAM-based ATA stack (`options ATA_CAM` enabled by default). Approved by: re (kib) --- share/man/man4/Makefile | 4 - share/man/man4/ata.4 | 286 ++++++++++++++++++---------------------- 2 files changed, 126 insertions(+), 164 deletions(-) diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index 7ccccfbe9c9..2e328c19a58 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -526,10 +526,6 @@ MLINKS+=agp.4 agpgart.4 MLINKS+=ale.4 if_ale.4 MLINKS+=altq.4 ALTQ.4 MLINKS+=an.4 if_an.4 -MLINKS+=ata.4 acd.4 \ - ata.4 ad.4 \ - ata.4 afd.4 \ - ata.4 ast.4 MLINKS+=aue.4 if_aue.4 MLINKS+=axe.4 if_axe.4 MLINKS+=bce.4 if_bce.4 diff --git a/share/man/man4/ata.4 b/share/man/man4/ata.4 index 05e03d6dd1a..df023693aa8 100644 --- a/share/man/man4/ata.4 +++ b/share/man/man4/ata.4 @@ -1,105 +1,91 @@ -.\" -.\" Copyright (c) 2003 Søren Schmidt +.\" Copyright (c) 2011 Alexander Motin .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer, -.\" without modification, immediately at the beginning of the file. +.\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. The name of the author may not be used to endorse or promote products -.\" derived from this software without specific prior written permission. .\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. .\" .\" $FreeBSD$ .\" -.Dd July 3, 2010 +.Dd August 17, 2011 .Dt ATA 4 .Os .Sh NAME -.Nm ata , -.Nm ar , -.Nm acd , -.Nm ad , -.Nm afd , -.Nm ast -.Nd generic ATA/ATAPI disk controller driver +.Nm ata +.Nd generic ATA/SATA controller driver .Sh SYNOPSIS -For ISA based ATA/ATAPI support: -.Cd device isa -.Cd device ata +To compile this driver into the kernel, place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device scbus" +.Cd "device ata" +.Cd "options ATA_CAM" +.Ed .Pp -In -.Pa /boot/device.hints : -.Cd hint.ata.0.at="isa" -.Cd hint.ata.0.port="0x1f0" -.Cd hint.ata.0.irq="14" -.Cd hint.ata.1.at="isa" -.Cd hint.ata.1.port="0x170" -.Cd hint.ata.1.irq="15" +Alternatively, to load the driver as set of modules at boot time, +place some of the following lines in +.Xr loader.conf 5 : +.Bd -literal -offset indent +ata_load="YES" + +atacard_load="YES" +ataisa_load="YES" +atapci_load="YES" + +ataacard_load="YES" +ataacerlabs_load="YES" +ataadaptec_load="YES" +ataahci_load="YES" +ataamd_load="YES" +ataati_load="YES" +atacenatek_load="YES" +atacypress_load="YES" +atacyrix_load="YES" +atahighpoint_load="YES" +ataintel_load="YES" +ataite_load="YES" +atajmicron_load="YES" +atamarvell_load="YES" +atamicron_load="YES" +atanational_load="YES" +atanetcell_load="YES" +atanvidia_load="YES" +atapromise_load="YES" +ataserverworks_load="YES" +atasiliconimage_load="YES" +atasis_load="YES" +atavia_load="YES" +.Ed .Pp -For PC98 based ATA/ATAPI support: -.Cd device isa -.Cd device ata +First line is common hardware independent code. +Next three lines are generic bus-specific drivers. +ataahci is AHCI driver. +The rest are vendor-specific PCI drivers. +ATA_CAM option should always remain in kernel configuration to make +the driver work as CAM(4) subsystem module. .Pp -In -.Pa /boot/device.hints : -.Cd hint.atacbus.0.at="isa" -.Cd hint.atacbus.0.port="0x640" -.Cd hint.atacbus.0.irq="9" -.Pp -For PCI based ATA/ATAPI support: -.Cd device pci -.Cd device ata -.Pp -To support ATA compliant disk drives: -.Cd device atadisk -.Pp -To support ATA software RAID's: -.Cd device ataraid -.Pp -To support ATAPI CDROM, DVD and CD/DVD burner drives: -.Cd device atapicd -.Pp -To support ATAPI floppy drives: -.Cd device atapifd -.Pp -To support ATAPI tape drives: -.Cd device atapist -.Pp -To turn -.Xr ata 4 -subsystem controller drivers into cam(4) interface modules (disables all native -.Xr ata 4 -APIs and peripheral drivers): -.Cd options ATA_CAM -.Pp -The following tunables are settable from the loader: +The following tunables are settable from the +.Xr loader 8 : .Bl -ohang -.It Va hw.ata.ata_dma -set to 1 for DMA access, 0 for PIO (default is DMA). .It Va hw.ata.ata_dma_check_80pin set to 0 to disable the 80pin cable check (default is 1, check the cable) -.It Va hw.ata.atapi_dma -set to 1 for DMA access, 0 for PIO (default is DMA). -.It Va hw.ata.wc -set to 1 to enable Write Caching, 0 to disable (default is enabled). -.Em WARNING : -can cause data loss on power failures and crashes. .It Va hint.atapci.X.msi set to 1 to allow Message Signalled Interrupts (MSI) to be used by specified PCI ATA controller, if supported. @@ -121,15 +107,55 @@ host initiates PARTIAL PM state transition every time port becomes idle. .It 3 host initiates SLUMBER PM state transition every time port becomes idle. .El -Modes 2 and 3 are implemented only for AHCI driver now. +Modes 2 and 3 are supported only for AHCI. .El .Sh DESCRIPTION The .Nm -driver provides access to ATA (IDE) and SerialATA disk drives, -ATAPI CDROM/DVD drives, ZIP/LS120 ATAPI drives and ATAPI tape drives -connected to controllers according to the ATA/ATAPI standards. +driver provides the CAM(4) subsystem access to ATA (IDE) and SATA ports +of many generic controllers. +Depending on controller, each PATA port or each one or two SATA ports are +represented to CAM as a separate bus with one or two targets. +Most of the bus-management details are handled by the ATA/SATA-specific +transport of CAM. +Connected ATA disks are handled by the ATA protocol disk peripheral driver +.Xr ada 4 . +ATAPI devices are handled by the SCSI protocol peripheral drivers +.Xr cd 4 , +.Xr da 4 , +.Xr sa 4 , +etc. .Pp +Driver supports ATA and for the most of controllers ATAPI devices. +Command queuing and SATA port multipliers are not supported. +Device hot-plug and SATA interface power management supported only on +some controllers. +.Pp +The +.Nm +driver can change the transfer mode when the system is up and running. +See +.Xr camcontrol 8 +negotiate subcommand. +.Pp +The +.Nm +driver sets the maximum transfer mode supported by the hardware as default. +However the +.Nm +driver sometimes warns: +.Dq Sy "DMA limited to UDMA33, non-ATA66 cable or device". +This means that +the +.Nm +driver has detected that the required 80 conductor cable is not present +or could not be detected properly, +or that one of the devices on the channel only accepts up +to UDMA2/ATA33. +The +.Va hw.ata.ata_dma_check_80pin +tunable can be set to 0 to disable this check. +.Sh HARDWARE The currently supported ATA/SATA controller chips are: .Pp .Bl -tag -width "Silicon Image:" -compact @@ -186,72 +212,18 @@ VT82C686A, VT82C686B, VT8231, VT8233, VT8233A, VT8233C, VT8235, VT8237, VT8237A, VT8237S, VT8251, CX700, VX800, VX855, VX900. .El .Pp +Some of above chips are also supported by the more featured +.Xr ahci 4 , +.Xr mvs 4 , +and +.Xr siis 4 +drivers. +If both drivers are loaded at the same time, those will have precedence. +.Pp Unknown ATA chipsets are supported in PIO modes, and if the standard busmaster DMA registers are present and contain valid setup, DMA is also enabled, although the max mode is limited to UDMA33, as it is not known what the chipset can do and how to program it. -.Pp -The -.Nm -driver can change the transfer mode and various other parameters -when the system is up and running. -See -.Xr atacontrol 8 . -.Pp -The -.Nm -driver sets the maximum transfer mode supported by the hardware as default. -However the -.Nm -driver sometimes warns: -.Dq Sy "DMA limited to UDMA33, non-ATA66 cable or device". -This means that -the -.Nm -driver has detected that the required 80 conductor cable is not present -or could not be detected properly, -or that one of the devices on the channel only accepts up -to UDMA2/ATA33. -The -.Va hw.ata.ata_dma_check_80pin -tunable can be set to 0 to disable this check. -.Pp -Unknown ATAPI devices are initialized to DMA mode if the -.Va hw.ata.atapi_dma -tunable is set to 1 and they support at least UDMA33 transfers. -Otherwise they are set to PIO mode because severe DMA problems are -common even if the device capabilities indicate support. -You can always try to set DMA mode on an ATAPI device using -.Xr atacontrol 8 , -but be aware that your hardware might -.Em not -support it and can potentially -.Em hang -the entire system causing data loss. -.Pp -The -.Nm acd -driver implements most of the -.Fn ioctl -requests documented by -.Xr cd 4 . -.Sh FILES -.Bl -tag -width ".Pa /sys/i386/conf/GENERIC" -compact -.It Pa /dev/ad* -ATA disk device nodes -.It Pa /dev/ar* -ATA RAID device nodes -.It Pa /dev/acd* -ATAPI CD-ROM device nodes -.It Pa /dev/afd* -ATAPI floppy drive device nodes -.It Pa /dev/ast* -ATAPI tape drive device nodes -.It Pa /sys/i386/conf/GENERIC -sample generic kernel config file for -.Nm -based systems -.El .Sh NOTES Please remember that in order to use UDMA4/ATA66 and above modes you .Em must @@ -260,31 +232,25 @@ Please assure that ribbon cables are no longer than 45cm. In case of rounded ATA cables, the length depends on the quality of the cables. SATA cables can be up to 1m long according to the specification. -.Pp -Static device numbering -(enabled with the -.Dv ATA_STATIC_ID -kernel option) -reserves a number for each possibly connected disk, -even when not present. -This is useful in hotswap scenarios -where disks should always show up as the same numbered device, -and not depend on attach order. -.Pp -Native Command Queuing (NCQ) on SATA drives is not yet supported. +External SATA cables can be 2m long and more, but not all controllers +work well on long cables, especially at high speeds. .Sh SEE ALSO +.Xr ada 4 , .Xr ahci 4 , .Xr cam 4 , -.Xr ataraid 4 , -.Xr atacontrol 8 , -.Xr burncd 8 , +.Xr camcontrol 8 , .Xr cd 4 , +.Xr mvs 4 , .Xr siis 4 .Sh HISTORY The .Nm driver first appeared in .Fx 4.0 . +Turned into CAM(4) interface module in +.Fx 9.0 . .Sh AUTHORS +.An Alexander Motin +.Aq mav@FreeBSD.org , .An S\(/oren Schmidt .Aq sos@FreeBSD.org . From ad06556a9188f81ef498172223882a998fca8b8b Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Thu, 18 Aug 2011 13:33:34 +0000 Subject: [PATCH 265/452] Fix headphones pin configuration on Lenovo B450 laptop. Submitted by: "Sergey V. Dyatko" Approved by: re (kib) --- sys/dev/sound/pci/hda/hdac.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c index bb0f3851437..66aa162dc39 100644 --- a/sys/dev/sound/pci/hda/hdac.c +++ b/sys/dev/sound/pci/hda/hdac.c @@ -295,6 +295,7 @@ SND_DECLARE_FILE("$FreeBSD$"); #define LENOVO_VENDORID 0x17aa #define LENOVO_3KN100_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x2066) #define LENOVO_3KN200_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x384e) +#define LENOVO_B450_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x3a0d) #define LENOVO_TCA55_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x1015) #define LENOVO_ALL_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0xffff) @@ -2582,6 +2583,13 @@ hdac_widget_pin_getconfig(struct hdac_widget *w) break; } } + } else if (id == HDA_CODEC_CX20561 && + sc->pci_subvendor == LENOVO_B450_SUBVENDOR) { + switch (nid) { + case 22: + patch = "as=1 seq=15"; + break; + } } if (patch != NULL) From 05b56666d37d98e73697caf1cdf929d02b698a2f Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Thu, 18 Aug 2011 16:00:32 +0000 Subject: [PATCH 266/452] Fix a bug that prevented docsinstall from being able to use DNS in most cases and provide a better error handling mechanism during package installation. Approved by: re (kib) --- usr.sbin/bsdinstall/scripts/docsinstall | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/usr.sbin/bsdinstall/scripts/docsinstall b/usr.sbin/bsdinstall/scripts/docsinstall index e037dcc424e..e16116c6262 100644 --- a/usr.sbin/bsdinstall/scripts/docsinstall +++ b/usr.sbin/bsdinstall/scripts/docsinstall @@ -59,11 +59,21 @@ NB: This requires a working, configured network connection." 0 0 0 \ test $? -eq 0 || exit 0 exec 3>&- +# Let pkg_add be able to use name servers +cp ${BSDINSTALL_TMPETC}/resolv.conf ${BSDINSTALL_CHROOT}/etc + +error() { + dialog --backtitle "FreeBSD Installer" --title "Error" --msgbox \ + "Could not install package $1 (`tail -n 1 ${BSDINSTALL_LOG}`)" 0 0 + exit 1 +} + + clear echo "FreeBSD Installer" echo "========================" echo for i in $DOCS; do - pkg_add -C ${BSDINSTALL_CHROOT} -r ${i}-freebsd-doc + pkg_add -C ${BSDINSTALL_CHROOT} -r ${i}-freebsd-doc || error $i-freebsd-doc done From 5f06dfb7923cbded10f8b82207a84b5f24b0a7a6 Mon Sep 17 00:00:00 2001 From: "Kenneth D. Merry" Date: Thu, 18 Aug 2011 16:07:41 +0000 Subject: [PATCH 267/452] Set the max_lun field in the path inquiry CCB for the mps(4) driver to 8. This allows LUNs greater than 0 to be probed. The value can be increased later if need be. Approved by: re (kib) --- sys/dev/mps/mps_sas.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/mps/mps_sas.c b/sys/dev/mps/mps_sas.c index 6fbda923bc4..2aa4773eef9 100644 --- a/sys/dev/mps/mps_sas.c +++ b/sys/dev/mps/mps_sas.c @@ -925,7 +925,7 @@ mpssas_action(struct cam_sim *sim, union ccb *ccb) cpi->hba_misc = PIM_NOBUSRESET; cpi->hba_eng_cnt = 0; cpi->max_target = sassc->sc->facts->MaxTargets - 1; - cpi->max_lun = 0; + cpi->max_lun = 8; cpi->initiator_id = 255; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "LSILogic", HBA_IDLEN); From 672d7ddbcc406da93d22b0e74ee5d70659bd69ef Mon Sep 17 00:00:00 2001 From: Sean Bruno Date: Thu, 18 Aug 2011 16:54:04 +0000 Subject: [PATCH 268/452] Allow release generation from a WORLDDIR that is not /usr/src PR: misc/159666 Submitted by: Test Rat Reviewed by: Nathan Whitehorn Approved by: re (kib) --- release/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/Makefile b/release/Makefile index 0e07ed3a45b..19987cf7640 100644 --- a/release/Makefile +++ b/release/Makefile @@ -66,7 +66,7 @@ base.txz: -mkdir ${DISTDIR} cd ${WORLDDIR} && ${IMAKE} distributeworld DISTDIR=${DISTDIR} # Set up mergemaster root database - sh ${.CURDIR}/scripts/mm-mtree.sh -F \ + sh ${.CURDIR}/scripts/mm-mtree.sh -m ${WORLDDIR} -F \ "TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}" -D "${DISTDIR}/base" # Package all components cd ${WORLDDIR} && ${IMAKE} packageworld DISTDIR=${DISTDIR} From f55d3fbe8438d73a393729763a4abca5b72233a2 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Thu, 18 Aug 2011 22:20:45 +0000 Subject: [PATCH 269/452] One of the general principles of the sysctl(3) API is that a user can query the needed size for a sysctl result by passing in a NULL old pointer and a valid oldsize. The kern.proc.args sysctl handler broke this assumption by not calling SYSCTL_OUT() if the old pointer was NULL. Approved by: re (kib) MFC after: 3 days --- sys/kern/kern_proc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 91b14a93150..c84c5ae776d 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -1391,7 +1391,7 @@ sysctl_kern_proc_args(SYSCTL_HANDLER_ARGS) pa = p->p_args; pargs_hold(pa); PROC_UNLOCK(p); - if (req->oldptr != NULL && pa != NULL) + if (pa != NULL) error = SYSCTL_OUT(req, pa->ar_args, pa->ar_length); pargs_drop(pa); if (error != 0 || req->newptr == NULL) From cfb5f76865887cb85825ed970b8bbc4ab2448b5d Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Thu, 18 Aug 2011 22:51:30 +0000 Subject: [PATCH 270/452] Add experimental support for process descriptors A "process descriptor" file descriptor is used to manage processes without using the PID namespace. This is required for Capsicum's Capability Mode, where the PID namespace is unavailable. New system calls pdfork(2) and pdkill(2) offer the functional equivalents of fork(2) and kill(2). pdgetpid(2) allows querying the PID of the remote process for debugging purposes. The currently-unimplemented pdwait(2) will, in the future, allow querying rusage/exit status. In the interim, poll(2) may be used to check (and wait for) process termination. When a process is referenced by a process descriptor, it does not issue SIGCHLD to the parent, making it suitable for use in libraries---a common scenario when using library compartmentalisation from within large applications (such as web browsers). Some observers may note a similarity to Mach task ports; process descriptors provide a subset of this behaviour, but in a UNIX style. This feature is enabled by "options PROCDESC", but as with several other Capsicum kernel features, is not enabled by default in GENERIC 9.0. Reviewed by: jhb, kib Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- lib/libc/sys/Makefile.inc | 5 +- lib/libc/sys/Symbol.map | 3 + lib/libc/sys/cap_new.2 | 4 +- lib/libc/sys/pdfork.2 | 182 ++++++++++++ sys/compat/linux/linux_fork.c | 8 +- sys/conf/NOTES | 3 + sys/conf/files | 1 + sys/conf/options | 1 + sys/kern/capabilities.conf | 2 +- sys/kern/init_main.c | 3 +- sys/kern/kern_descrip.c | 30 ++ sys/kern/kern_exit.c | 82 ++++-- sys/kern/kern_fork.c | 96 ++++++- sys/kern/kern_kthread.c | 2 +- sys/kern/kern_sig.c | 31 ++ sys/kern/sys_procdesc.c | 524 ++++++++++++++++++++++++++++++++++ sys/kern/syscalls.master | 8 +- sys/sys/capability.h | 7 +- sys/sys/file.h | 1 + sys/sys/proc.h | 6 +- sys/sys/procdesc.h | 119 ++++++++ sys/sys/unistd.h | 5 +- sys/sys/user.h | 4 + 23 files changed, 1074 insertions(+), 53 deletions(-) create mode 100644 lib/libc/sys/pdfork.2 create mode 100644 sys/kern/sys_procdesc.c create mode 100644 sys/sys/procdesc.h diff --git a/lib/libc/sys/Makefile.inc b/lib/libc/sys/Makefile.inc index ddc157ee1b5..fe5061d97f3 100644 --- a/lib/libc/sys/Makefile.inc +++ b/lib/libc/sys/Makefile.inc @@ -96,7 +96,7 @@ MAN+= abort2.2 accept.2 access.2 acct.2 adjtime.2 \ mq_setattr.2 \ msgctl.2 msgget.2 msgrcv.2 msgsnd.2 \ msync.2 munmap.2 nanosleep.2 nfssvc.2 ntp_adjtime.2 open.2 \ - pathconf.2 pipe.2 poll.2 posix_fallocate.2 posix_openpt.2 profil.2 \ + pathconf.2 pdfork.2 pipe.2 poll.2 posix_fallocate.2 posix_openpt.2 profil.2 \ pselect.2 ptrace.2 quotactl.2 \ read.2 readlink.2 reboot.2 recv.2 rename.2 revoke.2 rfork.2 rmdir.2 \ rtprio.2 @@ -178,6 +178,9 @@ MLINKS+=ntp_adjtime.2 ntp_gettime.2 MLINKS+=open.2 openat.2 MLINKS+=pathconf.2 fpathconf.2 MLINKS+=pathconf.2 lpathconf.2 +MLINKS+=pdfork.2 pdgetpid.2\ + pdfork.2 pdkill.2 \ + pdfork.2 pdwait4.2 MLINKS+=read.2 pread.2 read.2 preadv.2 read.2 readv.2 MLINKS+=readlink.2 readlinkat.2 MLINKS+=recv.2 recvfrom.2 recv.2 recvmsg.2 diff --git a/lib/libc/sys/Symbol.map b/lib/libc/sys/Symbol.map index 547a2cff972..095751a441c 100644 --- a/lib/libc/sys/Symbol.map +++ b/lib/libc/sys/Symbol.map @@ -366,6 +366,9 @@ FBSD_1.2 { cap_new; cap_getrights; getloginclass; + pdfork; + pdgetpid; + pdkill; posix_fallocate; rctl_get_racct; rctl_get_rules; diff --git a/lib/libc/sys/cap_new.2 b/lib/libc/sys/cap_new.2 index 7710e12abdf..206715e84b4 100644 --- a/lib/libc/sys/cap_new.2 +++ b/lib/libc/sys/cap_new.2 @@ -260,7 +260,7 @@ Permit .Xr pdkill 2 . .It Dv CAP_PDWAIT Permit -.Xr pdwait 2 . +.Xr pdwait4 2 . .It Dv CAP_PEELOFF Permit .Xr sctp_peeloff 2 . @@ -429,7 +429,7 @@ argument is not a capability. .Xr openat 2 , .Xr pdgetpid 2 , .Xr pdkill 2 , -.Xr pdwait 2 , +.Xr pdwait4 2 , .Xr pipe 2 , .Xr poll 2 , .Xr pread 2 , diff --git a/lib/libc/sys/pdfork.2 b/lib/libc/sys/pdfork.2 new file mode 100644 index 00000000000..3f36e881ec9 --- /dev/null +++ b/lib/libc/sys/pdfork.2 @@ -0,0 +1,182 @@ +.\" +.\" Copyright (c) 2009-2010 Robert N. M. Watson +.\" All rights reserved. +.\" +.\" This software was developed at the University of Cambridge Computer +.\" Laboratory with support from a grant from Google, Inc. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd August 16, 2011 +.Dt PDFORK 2 +.Os +.Sh NAME +.Nm pdfork , +.Nm pdgetpid , +.Nm pdkill , +.Nm pdwait4 +.Nd System calls to manage process descriptors +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In sys/procdesc.h +.Ft int +.Fn pdfork "int *fdp" "int flags" +.Ft int +.Fn pdgetpid "int fd" "pid_t *pidp" +.Ft int +.Fn pdkill "int fd" "int signum" +.Ft int +.Fn pdwait4 "int fd" "int *status" "int options" "struct rusage *rusage" +.Sh DESCRIPTION +Process descriptors are special file descriptors that represent processes, +and are created using +.Fn pdfork , +a variant of +.Xr fork 2 , +which, if successful, returns a process descriptor in the integer pointed to +by +.Fa pidp . +Processes created via +.Fn pdfork +will not cause +.Dv SIGCHLD +on termination. +.Fn pdfork +can accept the flags: +.Bl -tag -width ".Dv PD_DAEMON" +.It Dv PD_DAEMON +Instead of the default terminate-on-close behaviour, allow the process to +live until it is explicitly killed with +.Xr kill 2 . +.Pp +This option is not permitted in Capsicum capability mode (see +.Xr cap_enter 2 ) . +.El +.Pp +.Fn pdgetpid +queries the process ID (PID) if the process descriptor +.Fa fd . +.Pp +.Fn pdkill +is functionally identical to +.Xr kill 2 , +except that it accepts a process descriptor, +.Fa fd , +rather than a PID. +.Pp +.Fn pdwait4 +behaves identially to +.Xr wait4 2 , +but operates with respect to a process descriptor argument rather than a PID. +.Pp +The following system calls also have effects specific to process descriptors: +.Pp +.Xr fstat 2 +queries status of a process descriptor; currently only the +.Fa st_mode , +.Fa st_birthtime , +.Fa st_atime , +.Fa st_ctime +and +.Fa st_mtime +fields are defined. If the owner read, write, and execute bits are set then the +process represented by the process descriptor is still alive. +.Pp +.Xr poll 2 +and +.Xr select 2 +allow waiting for process state transitions; currently only +.Dv POLLHUP +is defined, and will be raised when the process dies. +.Pp +.Xr close 2 +will close the process descriptor unless +.Dv PD_DAEMON +is set; if the process is still alive and this is +the last reference to the process descriptor, the process will be terminated +with the signal +.Dv SIGKILL . +.Sh RETURN VALUES +.Fn pdfork +returns a PID, 0 or -1, as +.Xr fork 2 +does. +.Pp +.Fn pdgetpid +and +.Fn pdkill +return 0 on success and -1 on failure. +.Pp +.Fn pdwait4 +returns a PID on success and -1 on failure. +.Sh ERRORS +These functions may return the same error numbers as their PID-based equivalents +(e.g. +.Fn pdfork +may return the same error numbers as +.Xr fork 2 ) , +with the following additions: +.Bl -tag -width Er +.It Bq Er EINVAL +The signal number given to +.Fn pdkill +is invalid. +.It Bq Er ENOTCAPABLE +The process descriptor being operated on has insufficient rights (e.g. +.Dv CAP_PDKILL +for +.Fn pdkill ) . +.El +.Sh SEE ALSO +.Xr close 2 , +.Xr fork 2 , +.Xr fstat 2 , +.Xr kill 2 , +.Xr poll 2 , +.Xr wait4 2 +.Sh HISTORY +The +.Fn pdfork , +.Fn pdgetpid , +.Fn pdkill +and +.Fn pdwait4 +system calls first appeared in +.Fx 9.0 . +.Pp +Support for process descriptors mode was developed as part of the +.Tn TrustedBSD +Project. +.Sh AUTHORS +.An -nosplit +These functions and the capability facility were created by +.An "Robert N. M. Watson" Aq rwatson@FreeBSD.org +and +.An "Jonathan Anderson" Aq jonathan@FreeBSD.org +at the University of Cambridge Computer Laboratory with support from a grant +from Google, Inc. +.Sh BUGS +.Fn pdwait4 +has not yet been implemented. diff --git a/sys/compat/linux/linux_fork.c b/sys/compat/linux/linux_fork.c index bf1d45c9ea3..5d2ce5bdb0c 100644 --- a/sys/compat/linux/linux_fork.c +++ b/sys/compat/linux/linux_fork.c @@ -64,7 +64,8 @@ linux_fork(struct thread *td, struct linux_fork_args *args) printf(ARGS(fork, "")); #endif - if ((error = fork1(td, RFFDG | RFPROC | RFSTOPPED, 0, &p2)) != 0) + if ((error = fork1(td, RFFDG | RFPROC | RFSTOPPED, 0, &p2, NULL, 0)) + != 0) return (error); td->td_retval[0] = p2->p_pid; @@ -100,7 +101,8 @@ linux_vfork(struct thread *td, struct linux_vfork_args *args) #endif /* Exclude RFPPWAIT */ - if ((error = fork1(td, RFFDG | RFPROC | RFMEM | RFSTOPPED, 0, &p2)) != 0) + if ((error = fork1(td, RFFDG | RFPROC | RFMEM | RFSTOPPED, 0, &p2, + NULL, 0)) != 0) return (error); td->td_retval[0] = p2->p_pid; @@ -190,7 +192,7 @@ linux_clone(struct thread *td, struct linux_clone_args *args) if (args->parent_tidptr == NULL) return (EINVAL); - error = fork1(td, ff, 0, &p2); + error = fork1(td, ff, 0, &p2, NULL, 0); if (error) return (error); diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 4a9ec35d038..59f02c812a1 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -1159,6 +1159,9 @@ options MAC_TEST options CAPABILITIES # fine-grained rights on file descriptors options CAPABILITY_MODE # sandboxes with no global namespace access +# Support for process descriptors +options PROCDESC + ##################################################################### # CLOCK OPTIONS diff --git a/sys/conf/files b/sys/conf/files index 0dc814e0934..5c5d92d6b16 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -2412,6 +2412,7 @@ kern/subr_witness.c optional witness kern/sys_capability.c standard kern/sys_generic.c standard kern/sys_pipe.c standard +kern/sys_procdesc.c standard kern/sys_process.c standard kern/sys_socket.c standard kern/syscalls.c standard diff --git a/sys/conf/options b/sys/conf/options index f7026c13417..27fdbedacb6 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -149,6 +149,7 @@ PPC_DEBUG opt_ppc.h PPC_PROBE_CHIPSET opt_ppc.h PPS_SYNC opt_ntp.h PREEMPTION opt_sched.h +PROCDESC opt_procdesc.h QUOTA SCHED_4BSD opt_sched.h SCHED_STATS opt_sched.h diff --git a/sys/kern/capabilities.conf b/sys/kern/capabilities.conf index 004c2ddf207..4a62643623e 100644 --- a/sys/kern/capabilities.conf +++ b/sys/kern/capabilities.conf @@ -475,7 +475,7 @@ openbsd_poll pdfork pdgetpid pdkill -pdwait4 +#pdwait4 # not yet implemented ## ## Allow pipe(2). diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index be5c26fec02..fc072457c19 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -790,7 +790,8 @@ create_init(const void *udata __unused) struct ucred *newcred, *oldcred; int error; - error = fork1(&thread0, RFFDG | RFPROC | RFSTOPPED, 0, &initproc); + error = fork1(&thread0, RFFDG | RFPROC | RFSTOPPED, 0, &initproc, + NULL, 0); if (error) panic("cannot fork init: %d\n", error); KASSERT(initproc->p_pid == 1, ("create_init: initproc->p_pid != 1")); diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 85f866c39c0..4aaed1f040e 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" #include "opt_ddb.h" #include "opt_ktrace.h" +#include "opt_procdesc.h" #include #include @@ -65,6 +66,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -120,6 +122,8 @@ static int fill_vnode_info(struct vnode *vp, struct kinfo_file *kif); static int fill_socket_info(struct socket *so, struct kinfo_file *kif); static int fill_pts_info(struct tty *tp, struct kinfo_file *kif); static int fill_pipe_info(struct pipe *pi, struct kinfo_file *kif); +static int fill_procdesc_info(struct procdesc *pdp, + struct kinfo_file *kif); /* * A process is initially started out with NDFILE descriptors stored within @@ -3056,6 +3060,12 @@ sysctl_kern_proc_ofiledesc(SYSCTL_HANDLER_ARGS) tp = fp->f_data; break; +#ifdef PROCDESC + case DTYPE_PROCDESC: + kif->kf_type = KF_TYPE_PROCDESC; + break; +#endif + default: kif->kf_type = KF_TYPE_UNKNOWN; break; @@ -3218,6 +3228,9 @@ export_fd_for_sysctl(void *data, int type, int fd, int fflags, int refcnt, case KF_TYPE_PTS: error = fill_pts_info((struct tty *)data, kif); break; + case KF_TYPE_PROCDESC: + error = fill_procdesc_info((struct procdesc *)data, kif); + break; default: error = 0; } @@ -3391,6 +3404,13 @@ sysctl_kern_proc_filedesc(SYSCTL_HANDLER_ARGS) data = fp->f_data; break; +#ifdef PROCDESC + case DTYPE_PROCDESC: + type = KF_TYPE_PROCDESC; + data = fp->f_data; + break; +#endif + default: type = KF_TYPE_UNKNOWN; break; @@ -3586,6 +3606,16 @@ fill_pipe_info(struct pipe *pi, struct kinfo_file *kif) return (0); } +static int +fill_procdesc_info(struct procdesc *pdp, struct kinfo_file *kif) +{ + + if (pdp == NULL) + return (1); + kif->kf_un.kf_proc.kf_pid = pdp->pd_pid; + return (0); +} + static SYSCTL_NODE(_kern_proc, KERN_PROC_FILEDESC, filedesc, CTLFLAG_RD, sysctl_kern_proc_filedesc, "Process filedesc entries"); diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 30b94b6a28a..e5d60942f7c 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -40,16 +40,19 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" #include "opt_kdtrace.h" #include "opt_ktrace.h" +#include "opt_procdesc.h" #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -461,39 +464,54 @@ exit1(struct thread *td, int rv) knlist_clear(&p->p_klist, 1); /* - * Notify parent that we're gone. If parent has the PS_NOCLDWAIT - * flag set, or if the handler is set to SIG_IGN, notify process - * 1 instead (and hope it will handle this situation). + * If this is a process with a descriptor, we may not need to deliver + * a signal to the parent. proctree_lock is held over + * procdesc_exit() to serialize concurrent calls to close() and + * exit(). */ - PROC_LOCK(p->p_pptr); - mtx_lock(&p->p_pptr->p_sigacts->ps_mtx); - if (p->p_pptr->p_sigacts->ps_flag & (PS_NOCLDWAIT | PS_CLDSIGIGN)) { - struct proc *pp; - - mtx_unlock(&p->p_pptr->p_sigacts->ps_mtx); - pp = p->p_pptr; - PROC_UNLOCK(pp); - proc_reparent(p, initproc); - p->p_sigparent = SIGCHLD; - PROC_LOCK(p->p_pptr); - +#ifdef PROCDESC + if (p->p_procdesc == NULL || procdesc_exit(p)) { +#endif /* - * Notify parent, so in case he was wait(2)ing or - * executing waitpid(2) with our pid, he will - * continue. + * Notify parent that we're gone. If parent has the + * PS_NOCLDWAIT flag set, or if the handler is set to SIG_IGN, + * notify process 1 instead (and hope it will handle this + * situation). */ - wakeup(pp); - } else - mtx_unlock(&p->p_pptr->p_sigacts->ps_mtx); + PROC_LOCK(p->p_pptr); + mtx_lock(&p->p_pptr->p_sigacts->ps_mtx); + if (p->p_pptr->p_sigacts->ps_flag & + (PS_NOCLDWAIT | PS_CLDSIGIGN)) { + struct proc *pp; - if (p->p_pptr == initproc) - psignal(p->p_pptr, SIGCHLD); - else if (p->p_sigparent != 0) { - if (p->p_sigparent == SIGCHLD) - childproc_exited(p); - else /* LINUX thread */ - psignal(p->p_pptr, p->p_sigparent); - } + mtx_unlock(&p->p_pptr->p_sigacts->ps_mtx); + pp = p->p_pptr; + PROC_UNLOCK(pp); + proc_reparent(p, initproc); + p->p_sigparent = SIGCHLD; + PROC_LOCK(p->p_pptr); + + /* + * Notify parent, so in case he was wait(2)ing or + * executing waitpid(2) with our pid, he will + * continue. + */ + wakeup(pp); + } else + mtx_unlock(&p->p_pptr->p_sigacts->ps_mtx); + + if (p->p_pptr == initproc) + psignal(p->p_pptr, SIGCHLD); + else if (p->p_sigparent != 0) { + if (p->p_sigparent == SIGCHLD) + childproc_exited(p); + else /* LINUX thread */ + psignal(p->p_pptr, p->p_sigparent); + } +#ifdef PROCDESC + } else + PROC_LOCK(p->p_pptr); +#endif sx_xunlock(&proctree_lock); /* @@ -660,7 +678,7 @@ wait4(struct thread *td, struct wait_args *uap) * rusage. Asserts and will release both the proctree_lock and the process * lock as part of its work. */ -static void +void proc_reap(struct thread *td, struct proc *p, int *status, int options, struct rusage *rusage) { @@ -722,6 +740,10 @@ proc_reap(struct thread *td, struct proc *p, int *status, int options, sx_xunlock(&allproc_lock); LIST_REMOVE(p, p_sibling); leavepgrp(p); +#ifdef PROCDESC + if (p->p_procdesc != NULL) + procdesc_reap(p); +#endif sx_xunlock(&proctree_lock); /* diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 9d3e22d224c..32d00550a81 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -40,11 +40,13 @@ __FBSDID("$FreeBSD$"); #include "opt_kdtrace.h" #include "opt_ktrace.h" #include "opt_kstack_pages.h" +#include "opt_procdesc.h" #include #include #include #include +#include #include #include #include @@ -55,6 +57,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -104,7 +107,7 @@ fork(struct thread *td, struct fork_args *uap) int error; struct proc *p2; - error = fork1(td, RFFDG | RFPROC, 0, &p2); + error = fork1(td, RFFDG | RFPROC, 0, &p2, NULL, 0); if (error == 0) { td->td_retval[0] = p2->p_pid; td->td_retval[1] = 0; @@ -112,6 +115,34 @@ fork(struct thread *td, struct fork_args *uap) return (error); } +/* ARGUSED */ +int +pdfork(td, uap) + struct thread *td; + struct pdfork_args *uap; +{ +#ifdef PROCDESC + int error, fd; + struct proc *p2; + + /* + * It is necessary to return fd by reference because 0 is a valid file + * descriptor number, and the child needs to be able to distinguish + * itself from the parent using the return value. + */ + error = fork1(td, RFFDG | RFPROC | RFPROCDESC, 0, &p2, + &fd, uap->flags); + if (error == 0) { + td->td_retval[0] = p2->p_pid; + td->td_retval[1] = 0; + error = copyout(&fd, uap->fdp, sizeof(fd)); + } + return (error); +#else + return (ENOSYS); +#endif +} + /* ARGSUSED */ int vfork(struct thread *td, struct vfork_args *uap) @@ -124,7 +155,7 @@ vfork(struct thread *td, struct vfork_args *uap) #else flags = RFFDG | RFPROC | RFPPWAIT | RFMEM; #endif - error = fork1(td, flags, 0, &p2); + error = fork1(td, flags, 0, &p2, NULL, 0); if (error == 0) { td->td_retval[0] = p2->p_pid; td->td_retval[1] = 0; @@ -143,7 +174,7 @@ rfork(struct thread *td, struct rfork_args *uap) return (EINVAL); AUDIT_ARG_FFLAGS(uap->flags); - error = fork1(td, uap->flags, 0, &p2); + error = fork1(td, uap->flags, 0, &p2, NULL, 0); if (error == 0) { td->td_retval[0] = p2 ? p2->p_pid : 0; td->td_retval[1] = 0; @@ -337,7 +368,7 @@ fail: static void do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2, - struct vmspace *vm2) + struct vmspace *vm2, int pdflags) { struct proc *p1, *pptr; int p2_held, trypid; @@ -625,6 +656,16 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2, p2->p_vmspace->vm_ssize); } +#ifdef PROCDESC + /* + * Associate the process descriptor with the process before anything + * can happen that might cause that process to need the descriptor. + * However, don't do this until after fork(2) can no longer fail. + */ + if (flags & RFPROCDESC) + procdesc_new(p2, pdflags); +#endif + /* * Both processes are set up, now check if any loadable modules want * to adjust anything. @@ -710,7 +751,8 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2, } int -fork1(struct thread *td, int flags, int pages, struct proc **procp) +fork1(struct thread *td, int flags, int pages, struct proc **procp, + int *procdescp, int pdflags) { struct proc *p1; struct proc *newproc; @@ -721,6 +763,9 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp) int error; static int curfail; static struct timeval lastfail; +#ifdef PROCDESC + struct file *fp_procdesc = NULL; +#endif /* Check for the undefined or unimplemented flags. */ if ((flags & ~(RFFLAGS | RFTSIGFLAGS(RFTSIGMASK))) != 0) @@ -738,6 +783,18 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp) if ((flags & RFTSIGZMB) != 0 && (u_int)RFTSIGNUM(flags) > _SIG_MAXSIG) return (EINVAL); +#ifdef PROCDESC + if ((flags & RFPROCDESC) != 0) { + /* Can't not create a process yet get a process descriptor. */ + if ((flags & RFPROC) == 0) + return (EINVAL); + + /* Must provide a place to put a procdesc if creating one. */ + if (procdescp == NULL) + return (EINVAL); + } +#endif + p1 = td->td_proc; /* @@ -757,6 +814,25 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp) return (EAGAIN); #endif +#ifdef PROCDESC + /* + * If required, create a process descriptor in the parent first; we + * will abandon it if something goes wrong. We don't finit() until + * later. + */ + if (flags & RFPROCDESC) { + error = falloc(td, &fp_procdesc, procdescp, 0); + if (error != 0) { +#ifdef RACCT + PROC_LOCK(p1); + racct_sub(p1, RACCT_NPROC, 1); + PROC_UNLOCK(p1); +#endif + return (error); + } + } +#endif + mem_charged = 0; vm2 = NULL; if (pages == 0) @@ -868,12 +944,16 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp) PROC_UNLOCK(p1); } if (ok) { - do_fork(td, flags, newproc, td2, vm2); + do_fork(td, flags, newproc, td2, vm2, pdflags); /* * Return child proc pointer to parent. */ *procp = newproc; +#ifdef PROCDESC + if (flags & RFPROCDESC) + procdesc_finit(newproc->p_procdesc, fp_procdesc); +#endif return (0); } @@ -892,6 +972,10 @@ fail1: if (vm2 != NULL) vmspace_free(vm2); uma_zfree(proc_zone, newproc); +#ifdef PROCDESC + if (((flags & RFPROCDESC) != 0) && (fp_procdesc != NULL)) + fdrop(fp_procdesc, td); +#endif pause("fork", hz / 2); #ifdef RACCT PROC_LOCK(p1); diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c index 95f896fa5aa..bb1246980d5 100644 --- a/sys/kern/kern_kthread.c +++ b/sys/kern/kern_kthread.c @@ -88,7 +88,7 @@ kproc_create(void (*func)(void *), void *arg, panic("kproc_create called too soon"); error = fork1(&thread0, RFMEM | RFFDG | RFPROC | RFSTOPPED | flags, - pages, &p2); + pages, &p2, NULL, 0); if (error) return error; diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index e1861eb1e81..26ef0d7f31d 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -41,12 +41,14 @@ __FBSDID("$FreeBSD$"); #include "opt_kdtrace.h" #include "opt_ktrace.h" #include "opt_core.h" +#include "opt_procdesc.h" #include #include #include #include #include +#include #include #include #include @@ -59,6 +61,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -1698,6 +1701,34 @@ kill(struct thread *td, struct kill_args *uap) /* NOTREACHED */ } +int +pdkill(td, uap) + struct thread *td; + struct pdkill_args *uap; +{ +#ifdef PROCDESC + struct proc *p; + int error; + + AUDIT_ARG_SIGNUM(uap->signum); + AUDIT_ARG_FD(uap->fd); + if ((u_int)uap->signum > _SIG_MAXSIG) + return (EINVAL); + + error = procdesc_find(td, uap->fd, CAP_PDKILL, &p); + if (error) + return (error); + AUDIT_ARG_PROCESS(p); + error = p_cansignal(td, p, uap->signum); + if (error == 0 && uap->signum) + psignal(p, uap->signum); + PROC_UNLOCK(p); + return (error); +#else + return (ENOSYS); +#endif +} + #if defined(COMPAT_43) #ifndef _SYS_SYSPROTO_H_ struct okillpg_args { diff --git a/sys/kern/sys_procdesc.c b/sys/kern/sys_procdesc.c new file mode 100644 index 00000000000..9993732527c --- /dev/null +++ b/sys/kern/sys_procdesc.c @@ -0,0 +1,524 @@ +/*- + * Copyright (c) 2009 Robert N. M. Watson + * All rights reserved. + * + * This software was developed at the University of Cambridge Computer + * Laboratory with support from a grant from Google, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/*- + * FreeBSD process descriptor facility. + * + * Some processes are represented by a file descriptor, which will be used in + * preference to signaling and pids for the purposes of process management, + * and is, in effect, a form of capability. When a process descriptor is + * used with a process, it ceases to be visible to certain traditional UNIX + * process facilities, such as waitpid(2). + * + * Some semantics: + * + * - At most one process descriptor will exist for any process, although + * references to that descriptor may be held from many processes (or even + * be in flight between processes over a local domain socket). + * - Last close on the process descriptor will terminate the process using + * SIGKILL and reparent it to init so that there's a process to reap it + * when it's done exiting. + * - If the process exits before the descriptor is closed, it will not + * generate SIGCHLD on termination, or be picked up by waitpid(). + * - The pdkill(2) system call may be used to deliver a signal to the process + * using its process descriptor. + * - The pdwait4(2) system call may be used to block (or not) on a process + * descriptor to collect termination information. + * + * Open questions: + * + * - How to handle ptrace(2)? + * - Will we want to add a pidtoprocdesc(2) system call to allow process + * descriptors to be created for processes without pfork(2)? + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_procdesc.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#ifdef PROCDESC + +FEATURE(process_descriptors, "Process Descriptors"); + +static uma_zone_t procdesc_zone; + +static fo_rdwr_t procdesc_read; +static fo_rdwr_t procdesc_write; +static fo_truncate_t procdesc_truncate; +static fo_ioctl_t procdesc_ioctl; +static fo_poll_t procdesc_poll; +static fo_kqfilter_t procdesc_kqfilter; +static fo_stat_t procdesc_stat; +static fo_close_t procdesc_close; +static fo_chmod_t procdesc_chmod; +static fo_chown_t procdesc_chown; + +static struct fileops procdesc_ops = { + .fo_read = procdesc_read, + .fo_write = procdesc_write, + .fo_truncate = procdesc_truncate, + .fo_ioctl = procdesc_ioctl, + .fo_poll = procdesc_poll, + .fo_kqfilter = procdesc_kqfilter, + .fo_stat = procdesc_stat, + .fo_close = procdesc_close, + .fo_chmod = procdesc_chmod, + .fo_chown = procdesc_chown, + .fo_flags = DFLAG_PASSABLE, +}; + +/* + * Initialize with VFS so that process descriptors are available along with + * other file descriptor types. As long as it runs before init(8) starts, + * there shouldn't be a problem. + */ +static void +procdesc_init(void *dummy __unused) +{ + + procdesc_zone = uma_zcreate("procdesc", sizeof(struct procdesc), + NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); + if (procdesc_zone == NULL) + panic("procdesc_init: procdesc_zone not initialized"); +} +SYSINIT(vfs, SI_SUB_VFS, SI_ORDER_ANY, procdesc_init, NULL); + +/* + * Return a locked process given a process descriptor, or ESRCH if it has + * died. + */ +int +procdesc_find(struct thread *td, int fd, cap_rights_t rights, + struct proc **p) +{ + struct procdesc *pd; + struct file *fp; + int error; + + error = fget(td, fd, rights, &fp); + if (error) + return (error); + if (fp->f_type != DTYPE_PROCDESC) { + error = EBADF; + goto out; + } + pd = fp->f_data; + sx_slock(&proctree_lock); + if (pd->pd_proc != NULL) { + *p = pd->pd_proc; + PROC_LOCK(*p); + } else + error = ESRCH; + sx_sunlock(&proctree_lock); +out: + fdrop(fp, td); + return (error); +} + +/* + * Function to be used by procstat(1) sysctls when returning procdesc + * information. + */ +pid_t +procdesc_pid(struct file *fp_procdesc) +{ + struct procdesc *pd; + + KASSERT(fp_procdesc->f_type == DTYPE_PROCDESC, + ("procdesc_pid: !procdesc")); + + pd = fp_procdesc->f_data; + return (pd->pd_pid); +} + +/* + * Retrieve the PID associated with a process descriptor. + */ +int +kern_pdgetpid(struct thread *td, int fd, cap_rights_t rights, pid_t *pidp) +{ + struct file *fp; + int error; + + error = fget(td, fd, rights, &fp); + if (error) + return (error); + if (fp->f_type != DTYPE_PROCDESC) { + error = EBADF; + goto out; + } + *pidp = procdesc_pid(fp); +out: + fdrop(fp, td); + return (error); +} + +/* + * System call to return the pid of a process given its process descriptor. + */ +int +pdgetpid(struct thread *td, struct pdgetpid_args *uap) +{ + pid_t pid; + int error; + + AUDIT_ARG_FD(uap->fd); + error = kern_pdgetpid(td, uap->fd, CAP_PDGETPID, &pid); + if (error == 0) + error = copyout(&pid, uap->pidp, sizeof(pid)); + return (error); +} + +/* + * When a new process is forked by pdfork(), a file descriptor is allocated + * by the fork code first, then the process is forked, and then we get a + * chance to set up the process descriptor. Failure is not permitted at this + * point, so procdesc_new() must succeed. + */ +void +procdesc_new(struct proc *p, int flags) +{ + struct procdesc *pd; + + pd = uma_zalloc(procdesc_zone, M_WAITOK | M_ZERO); + pd->pd_proc = p; + pd->pd_pid = p->p_pid; + p->p_procdesc = pd; + pd->pd_flags = 0; + if (flags & PD_DAEMON) + pd->pd_flags |= PDF_DAEMON; + PROCDESC_LOCK_INIT(pd); + + /* + * Process descriptors start out with two references: one from their + * struct file, and the other from their struct proc. + */ + refcount_init(&pd->pd_refcount, 2); +} + +/* + * Initialize a file with a process descriptor. + */ +void +procdesc_finit(struct procdesc *pdp, struct file *fp) +{ + + finit(fp, FREAD | FWRITE, DTYPE_PROCDESC, pdp, &procdesc_ops); +} + +static void +procdesc_free(struct procdesc *pd) +{ + + /* + * When the last reference is released, we assert that the descriptor + * has been closed, but not that the process has exited, as we will + * detach the descriptor before the process dies if the descript is + * closed, as we can't wait synchronously. + */ + if (refcount_release(&pd->pd_refcount)) { + KASSERT(pd->pd_proc == NULL, + ("procdesc_free: pd_proc != NULL")); + KASSERT((pd->pd_flags & PDF_CLOSED), + ("procdesc_free: !PDF_CLOSED")); + + PROCDESC_LOCK_DESTROY(pd); + uma_zfree(procdesc_zone, pd); + } +} + +/* + * procdesc_exit() - notify a process descriptor that its process is exiting. + * We use the proctree_lock to ensure that process exit either happens + * strictly before or strictly after a concurrent call to procdesc_close(). + */ +int +procdesc_exit(struct proc *p) +{ + struct procdesc *pd; + + sx_assert(&proctree_lock, SA_XLOCKED); + PROC_LOCK_ASSERT(p, MA_OWNED); + KASSERT(p->p_procdesc != NULL, ("procdesc_exit: p_procdesc NULL")); + + pd = p->p_procdesc; + + PROCDESC_LOCK(pd); + KASSERT((pd->pd_flags & PDF_CLOSED) == 0 || p->p_pptr == initproc, + ("procdesc_exit: closed && parent not init")); + + pd->pd_flags |= PDF_EXITED; + + /* + * If the process descriptor has been closed, then we have nothing + * to do; return 1 so that init will get SIGCHLD and do the reaping. + * Clean up the procdesc now rather than letting it happen during + * that reap. + */ + if (pd->pd_flags & PDF_CLOSED) { + PROCDESC_UNLOCK(pd); + pd->pd_proc = NULL; + p->p_procdesc = NULL; + procdesc_free(pd); + return (1); + } + if (pd->pd_flags & PDF_SELECTED) { + pd->pd_flags &= ~PDF_SELECTED; + selwakeup(&pd->pd_selinfo); + } + PROCDESC_UNLOCK(pd); + return (0); +} + +/* + * When a process descriptor is reaped, perhaps as a result of close() or + * pdwait4(), release the process's reference on the process descriptor. + */ +void +procdesc_reap(struct proc *p) +{ + struct procdesc *pd; + + sx_assert(&proctree_lock, SA_XLOCKED); + KASSERT(p->p_procdesc != NULL, ("procdesc_reap: p_procdesc == NULL")); + + pd = p->p_procdesc; + pd->pd_proc = NULL; + procdesc_free(pd); +} + +/* + * procdesc_close() - last close on a process descriptor. If the process is + * still running, terminate with SIGKILL (unless PD_DAEMON is set) and let + * init(8) clean up the mess; if not, we have to clean up the zombie ourselves. + */ +static int +procdesc_close(struct file *fp, struct thread *td) +{ + struct procdesc *pd; + struct proc *p; + + KASSERT(fp->f_type == DTYPE_PROCDESC, ("procdesc_close: !procdesc")); + + pd = fp->f_data; + fp->f_ops = &badfileops; + fp->f_data = NULL; + + sx_xlock(&proctree_lock); + PROCDESC_LOCK(pd); + pd->pd_flags |= PDF_CLOSED; + PROCDESC_UNLOCK(pd); + p = pd->pd_proc; + PROC_LOCK(p); + if (p->p_state == PRS_ZOMBIE) { + /* + * If the process is already dead and just awaiting reaping, + * do that now. This will release the process's reference to + * the process descriptor when it calls back into + * procdesc_reap(). + */ + PROC_SLOCK(p); + proc_reap(curthread, p, NULL, 0, NULL); + } else { + /* + * If the process is not yet dead, we need to kill it, but we + * can't wait around synchronously for it to go away, as that + * path leads to madness (and deadlocks). First, detach the + * process from its descriptor so that its exit status will + * be reported normally. + */ + pd->pd_proc = NULL; + p->p_procdesc = NULL; + procdesc_free(pd); + + /* + * Next, reparent it to init(8) so that there's someone to + * pick up the pieces; finally, terminate with prejudice. + */ + p->p_sigparent = SIGCHLD; + proc_reparent(p, initproc); + if ((pd->pd_flags & PD_DAEMON) == 0) + psignal(p, SIGKILL); + PROC_UNLOCK(p); + sx_xunlock(&proctree_lock); + } + + /* + * Release the file descriptor's reference on the process descriptor. + */ + procdesc_free(pd); + return (0); +} + +static int +procdesc_read(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, struct thread *td) +{ + + return (EOPNOTSUPP); +} + +static int +procdesc_write(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, struct thread *td) +{ + + return (EOPNOTSUPP); +} + +static int +procdesc_truncate(struct file *fp, off_t length, struct ucred *active_cred, + struct thread *td) +{ + + return (EOPNOTSUPP); +} + +static int +procdesc_ioctl(struct file *fp, u_long com, void *data, + struct ucred *active_cred, struct thread *td) +{ + + return (EOPNOTSUPP); +} + +static int +procdesc_poll(struct file *fp, int events, struct ucred *active_cred, + struct thread *td) +{ + struct procdesc *pd; + int revents; + + revents = 0; + pd = fp->f_data; + PROCDESC_LOCK(pd); + if (pd->pd_flags & PDF_EXITED) + revents |= POLLHUP; + if (revents == 0) { + selrecord(td, &pd->pd_selinfo); + pd->pd_flags |= PDF_SELECTED; + } + PROCDESC_UNLOCK(pd); + return (revents); +} + +static int +procdesc_kqfilter(struct file *fp, struct knote *kn) +{ + + return (EOPNOTSUPP); +} + +static int +procdesc_stat(struct file *fp, struct stat *sb, struct ucred *active_cred, + struct thread *td) +{ + struct procdesc *pd; + struct timeval pstart; + + /* + * XXXRW: Perhaps we should cache some more information from the + * process so that we can return it reliably here even after it has + * died. For example, caching its credential data. + */ + bzero(sb, sizeof(*sb)); + pd = fp->f_data; + sx_slock(&proctree_lock); + if (pd->pd_proc != NULL) { + PROC_LOCK(pd->pd_proc); + + /* Set birth and [acm] times to process start time. */ + pstart = pd->pd_proc->p_stats->p_start; + timevaladd(&pstart, &boottime); + TIMEVAL_TO_TIMESPEC(&pstart, &sb->st_birthtim); + sb->st_atim = sb->st_birthtim; + sb->st_ctim = sb->st_birthtim; + sb->st_mtim = sb->st_birthtim; + if (pd->pd_proc->p_state != PRS_ZOMBIE) + sb->st_mode = S_IFREG | S_IRWXU; + else + sb->st_mode = S_IFREG; + sb->st_uid = pd->pd_proc->p_ucred->cr_ruid; + sb->st_gid = pd->pd_proc->p_ucred->cr_rgid; + PROC_UNLOCK(pd->pd_proc); + } else + sb->st_mode = S_IFREG; + sx_sunlock(&proctree_lock); + return (0); +} + +static int +procdesc_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, + struct thread *td) +{ + + return (EOPNOTSUPP); +} + +static int +procdesc_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, + struct thread *td) +{ + + return (EOPNOTSUPP); +} + +#else /* !PROCDESC */ + +int +pdgetpid(struct thread *td, struct pdgetpid_args *uap) +{ + + return (ENOSYS); +} + +#endif /* PROCDESC */ diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index 0b249a5b55a..b79c6c7109c 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -919,10 +919,10 @@ u_int64_t *rightsp); } 516 AUE_CAP_ENTER STD { int cap_enter(void); } 517 AUE_CAP_GETMODE STD { int cap_getmode(u_int *modep); } -518 AUE_PDFORK UNIMPL pdfork -519 AUE_PDKILL UNIMPL pdkill -520 AUE_PDGETPID UNIMPL pdgetpid -521 AUE_PDWAIT UNIMPL pdwait +518 AUE_PDFORK STD { int pdfork(int *fdp, int flags); } +519 AUE_PDKILL STD { int pdkill(int fd, int signum); } +520 AUE_PDGETPID STD { int pdgetpid(int fd, pid_t *pidp); } +521 AUE_PDWAIT UNIMPL pdwait4 522 AUE_SELECT STD { int pselect(int nd, fd_set *in, \ fd_set *ou, fd_set *ex, \ const struct timespec *ts, \ diff --git a/sys/sys/capability.h b/sys/sys/capability.h index d67dc179b0d..81446a28190 100644 --- a/sys/sys/capability.h +++ b/sys/sys/capability.h @@ -131,8 +131,13 @@ #define CAP_IOCTL 0x0004000000000000ULL #define CAP_TTYHOOK 0x0008000000000000ULL +/* Process management via process descriptors. */ +#define CAP_PDGETPID 0x0010000000000000ULL +#define CAP_PDWAIT 0x0020000000000000ULL +#define CAP_PDKILL 0x0040000000000000ULL + /* The mask of all valid method rights. */ -#define CAP_MASK_VALID 0x000fffffffffffffULL +#define CAP_MASK_VALID 0x007fffffffffffffULL #ifdef _KERNEL diff --git a/sys/sys/file.h b/sys/sys/file.h index 5a4af332ebb..57e7047e8b3 100644 --- a/sys/sys/file.h +++ b/sys/sys/file.h @@ -65,6 +65,7 @@ struct socket; #define DTYPE_PTS 10 /* pseudo teletype master device */ #define DTYPE_DEV 11 /* Device specific fd type */ #define DTYPE_CAPABILITY 12 /* capability */ +#define DTYPE_PROCDESC 13 /* process descriptor */ #ifdef _KERNEL diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 233efe98564..67adbe5b589 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -166,6 +166,7 @@ struct mqueue_notifier; struct nlminfo; struct p_sched; struct proc; +struct procdesc; struct racct; struct sleepqueue; struct td_sched; @@ -534,6 +535,7 @@ struct proc { int p_boundary_count;/* (c) Num threads at user boundary */ int p_pendingcnt; /* how many signals are pending */ struct itimers *p_itimers; /* (c) POSIX interval timers. */ + struct procdesc *p_procdesc; /* (e) Process descriptor, if any. */ /* End area that is zeroed on creation. */ #define p_endzero p_magic @@ -822,7 +824,7 @@ int enterpgrp(struct proc *p, pid_t pgid, struct pgrp *pgrp, int enterthispgrp(struct proc *p, struct pgrp *pgrp); void faultin(struct proc *p); void fixjobc(struct proc *p, struct pgrp *pgrp, int entering); -int fork1(struct thread *, int, int, struct proc **); +int fork1(struct thread *, int, int, struct proc **, int *, int); void fork_exit(void (*)(void *, struct trapframe *), void *, struct trapframe *); void fork_return(struct thread *, struct trapframe *); @@ -844,6 +846,8 @@ void pargs_hold(struct pargs *pa); void procinit(void); void proc_linkup0(struct proc *p, struct thread *td); void proc_linkup(struct proc *p, struct thread *td); +void proc_reap(struct thread *td, struct proc *p, int *status, int options, + struct rusage *rusage); void proc_reparent(struct proc *child, struct proc *newparent); struct pstats *pstats_alloc(void); void pstats_fork(struct pstats *src, struct pstats *dst); diff --git a/sys/sys/procdesc.h b/sys/sys/procdesc.h new file mode 100644 index 00000000000..cc8b7166f63 --- /dev/null +++ b/sys/sys/procdesc.h @@ -0,0 +1,119 @@ +/*- + * Copyright (c) 2009 Robert N. M. Watson + * All rights reserved. + * + * This software was developed at the University of Cambridge Computer + * Laboratory with support from a grant from Google, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SYS_PROCDESC_H_ +#define _SYS_PROCDESC_H_ + +#ifdef _KERNEL +#include /* struct selinfo */ +#include +#include + +/*- + * struct procdesc describes a process descriptor, and essentially consists + * of two pointers -- one to the file descriptor, and one to the process. + * When both become NULL, the process descriptor will be freed. An important + * invariant is that there is only ever one process descriptor for a process, + * so a single file pointer will suffice. + * + * Locking key: + * (c) - Constant after initial setup. + * (p) - Protected by the process descriptor mutex. + * (r) - Atomic eference count. + * (s) - Protected by selinfo. + * (t) - Protected by the proctree_lock + */ +struct proc; +struct sigio; +struct procdesc { + /* + * Basic process descriptor state: the process, a cache of its pid to + * satisfy queries after the process exits, and process descriptor + * refcount. + */ + struct proc *pd_proc; /* (t) Process. */ + pid_t pd_pid; /* (c) Cached pid. */ + u_int pd_refcount; /* (r) Reference count. */ + + /* + * In-flight data and notification of events. + */ + int pd_flags; /* (p) PD_ flags. */ + struct selinfo pd_selinfo; /* (p) Event notification. */ + struct mtx pd_lock; /* Protect data + events. */ +}; + +/* + * Locking macros for the procdesc itself. + */ +#define PROCDESC_LOCK_DESTROY(pd) mtx_destroy(&(pd)->pd_lock) +#define PROCDESC_LOCK_INIT(pd) mtx_init(&(pd)->pd_lock, "procdesc", NULL, \ + MTX_DEF) +#define PROCDESC_LOCK(pd) mtx_lock(&(pd)->pd_lock) +#define PROCDESC_UNLOCK(pd) mtx_unlock(&(pd)->pd_lock) + +/* + * Flags for the pd_flags field. + */ +#define PDF_CLOSED 0x00000001 /* Descriptor has closed. */ +#define PDF_SELECTED 0x00000002 /* Issue selwakeup(). */ +#define PDF_EXITED 0x00000004 /* Process exited. */ +#define PDF_DAEMON 0x00000008 /* Don't exit when procdesc closes. */ + +/* + * In-kernel interfaces to process descriptors. + */ +int procdesc_exit(struct proc *); +int procdesc_find(struct thread *, int fd, cap_rights_t, struct proc **); +int kern_pdgetpid(struct thread *, int fd, cap_rights_t, pid_t *pidp); +void procdesc_new(struct proc *, int); +void procdesc_finit(struct procdesc *, struct file *); +pid_t procdesc_pid(struct file *); +void procdesc_reap(struct proc *); + +#else /* !_KERNEL */ + +/* + * Process descriptor system calls. + */ +struct rusage; +int pdfork(int *, int); +int pdkill(int, int); +int pdgetpid(int, pid_t *); + +#endif /* _KERNEL */ + +/* + * Flags which can be passed to pdfork(2). + */ +#define PD_DAEMON 0x00000001 /* Don't exit when procdesc closes. */ + +#endif /* !_SYS_PROCDESC_H_ */ diff --git a/sys/sys/unistd.h b/sys/sys/unistd.h index 9d56a3a4273..9e7f7e6d834 100644 --- a/sys/sys/unistd.h +++ b/sys/sys/unistd.h @@ -185,11 +185,12 @@ #define RFTSIGMASK 0xFF #define RFTSIGNUM(flags) (((flags) >> RFTSIGSHIFT) & RFTSIGMASK) #define RFTSIGFLAGS(signum) ((signum) << RFTSIGSHIFT) +#define RFPROCDESC (1<<28) /* return a process descriptor */ #define RFPPWAIT (1<<31) /* parent sleeps until child exits (vfork) */ -#define RFKERNELONLY (RFSTOPPED | RFHIGHPID | RFPPWAIT) #define RFFLAGS (RFFDG | RFPROC | RFMEM | RFNOWAIT | RFCFDG | \ RFTHREAD | RFSIGSHARE | RFLINUXTHPN | RFSTOPPED | RFHIGHPID | RFTSIGZMB | \ - RFPPWAIT) + RFPROCDESC | RFPPWAIT) +#define RFKERNELONLY (RFSTOPPED | RFHIGHPID | RFPPWAIT | RFPROCDESC) #endif /* __BSD_VISIBLE */ diff --git a/sys/sys/user.h b/sys/sys/user.h index ecf4ea94013..a139d4fdfab 100644 --- a/sys/sys/user.h +++ b/sys/sys/user.h @@ -252,6 +252,7 @@ struct user { #define KF_TYPE_SEM 9 #define KF_TYPE_PTS 10 /* no KF_TYPE_CAPABILITY (11), since capabilities wrap other file objects */ +#define KF_TYPE_PROCDESC 12 #define KF_TYPE_UNKNOWN 255 #define KF_VTYPE_VNON 0 @@ -377,6 +378,9 @@ struct kinfo_file { /* Round to 64 bit alignment. */ uint32_t kf_pts_pad0[7]; } kf_pts; + struct { + pid_t kf_pid; + } kf_proc; } kf_un; uint16_t kf_status; /* Status flags. */ uint16_t kf_pad1; /* Round to 32 bit alignment. */ From f8ca0a757a94cb4b491dbe5f1162dc61e82172b6 Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Thu, 18 Aug 2011 23:08:52 +0000 Subject: [PATCH 271/452] Auto-generated system call code based on r224987. Approved by: re (implicit) --- sys/kern/init_sysent.c | 10 +++---- sys/kern/syscalls.c | 10 +++---- sys/kern/systrace_args.c | 63 ++++++++++++++++++++++++++++++++++++++++ sys/sys/syscall.h | 5 +++- sys/sys/syscall.mk | 5 +++- sys/sys/sysproto.h | 20 ++++++++++++- 6 files changed, 100 insertions(+), 13 deletions(-) diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index dc57b2f43f0..d1063f4e83e 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 224066 2011-07-15 18:26:19Z jonathan + * created from FreeBSD: head/sys/kern/syscalls.master 224987 2011-08-18 22:51:30Z jonathan */ #include "opt_compat.h" @@ -552,10 +552,10 @@ struct sysent sysent[] = { { AS(cap_getrights_args), (sy_call_t *)cap_getrights, AUE_CAP_GETRIGHTS, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 515 = cap_getrights */ { 0, (sy_call_t *)cap_enter, AUE_CAP_ENTER, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 516 = cap_enter */ { AS(cap_getmode_args), (sy_call_t *)cap_getmode, AUE_CAP_GETMODE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 517 = cap_getmode */ - { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 518 = pdfork */ - { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 519 = pdkill */ - { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 520 = pdgetpid */ - { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 521 = pdwait */ + { AS(pdfork_args), (sy_call_t *)pdfork, AUE_PDFORK, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 518 = pdfork */ + { AS(pdkill_args), (sy_call_t *)pdkill, AUE_PDKILL, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 519 = pdkill */ + { AS(pdgetpid_args), (sy_call_t *)pdgetpid, AUE_PDGETPID, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 520 = pdgetpid */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 521 = pdwait4 */ { AS(pselect_args), (sy_call_t *)pselect, AUE_SELECT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 522 = pselect */ { AS(getloginclass_args), (sy_call_t *)getloginclass, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 523 = getloginclass */ { AS(setloginclass_args), (sy_call_t *)setloginclass, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 524 = setloginclass */ diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index 06740764db6..e3531880cba 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 224066 2011-07-15 18:26:19Z jonathan + * created from FreeBSD: head/sys/kern/syscalls.master 224987 2011-08-18 22:51:30Z jonathan */ const char *syscallnames[] = { @@ -525,10 +525,10 @@ const char *syscallnames[] = { "cap_getrights", /* 515 = cap_getrights */ "cap_enter", /* 516 = cap_enter */ "cap_getmode", /* 517 = cap_getmode */ - "#518", /* 518 = pdfork */ - "#519", /* 519 = pdkill */ - "#520", /* 520 = pdgetpid */ - "#521", /* 521 = pdwait */ + "pdfork", /* 518 = pdfork */ + "pdkill", /* 519 = pdkill */ + "pdgetpid", /* 520 = pdgetpid */ + "#521", /* 521 = pdwait4 */ "pselect", /* 522 = pselect */ "getloginclass", /* 523 = getloginclass */ "setloginclass", /* 524 = setloginclass */ diff --git a/sys/kern/systrace_args.c b/sys/kern/systrace_args.c index f57777f8c89..9343613d9be 100644 --- a/sys/kern/systrace_args.c +++ b/sys/kern/systrace_args.c @@ -3124,6 +3124,30 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args) *n_args = 1; break; } + /* pdfork */ + case 518: { + struct pdfork_args *p = params; + uarg[0] = (intptr_t) p->fdp; /* int * */ + iarg[1] = p->flags; /* int */ + *n_args = 2; + break; + } + /* pdkill */ + case 519: { + struct pdkill_args *p = params; + iarg[0] = p->fd; /* int */ + iarg[1] = p->signum; /* int */ + *n_args = 2; + break; + } + /* pdgetpid */ + case 520: { + struct pdgetpid_args *p = params; + iarg[0] = p->fd; /* int */ + uarg[1] = (intptr_t) p->pidp; /* pid_t * */ + *n_args = 2; + break; + } /* pselect */ case 522: { struct pselect_args *p = params; @@ -8381,6 +8405,45 @@ systrace_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) break; }; break; + /* pdfork */ + case 518: + switch(ndx) { + case 0: + p = "int *"; + break; + case 1: + p = "int"; + break; + default: + break; + }; + break; + /* pdkill */ + case 519: + switch(ndx) { + case 0: + p = "int"; + break; + case 1: + p = "int"; + break; + default: + break; + }; + break; + /* pdgetpid */ + case 520: + switch(ndx) { + case 0: + p = "int"; + break; + case 1: + p = "pid_t *"; + break; + default: + break; + }; + break; /* pselect */ case 522: switch(ndx) { diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index e3a55c19ef0..31252c1d121 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 224066 2011-07-15 18:26:19Z jonathan + * created from FreeBSD: head/sys/kern/syscalls.master 224987 2011-08-18 22:51:30Z jonathan */ #define SYS_syscall 0 @@ -434,6 +434,9 @@ #define SYS_cap_getrights 515 #define SYS_cap_enter 516 #define SYS_cap_getmode 517 +#define SYS_pdfork 518 +#define SYS_pdkill 519 +#define SYS_pdgetpid 520 #define SYS_pselect 522 #define SYS_getloginclass 523 #define SYS_setloginclass 524 diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk index 726bab09321..e448707c53f 100644 --- a/sys/sys/syscall.mk +++ b/sys/sys/syscall.mk @@ -1,7 +1,7 @@ # FreeBSD system call names. # DO NOT EDIT-- this file is automatically generated. # $FreeBSD$ -# created from FreeBSD: head/sys/kern/syscalls.master 224066 2011-07-15 18:26:19Z jonathan +# created from FreeBSD: head/sys/kern/syscalls.master 224987 2011-08-18 22:51:30Z jonathan MIASM = \ syscall.o \ exit.o \ @@ -383,6 +383,9 @@ MIASM = \ cap_getrights.o \ cap_enter.o \ cap_getmode.o \ + pdfork.o \ + pdkill.o \ + pdgetpid.o \ pselect.o \ getloginclass.o \ setloginclass.o \ diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h index 7f8d5b39b7f..9bcb79bd0ae 100644 --- a/sys/sys/sysproto.h +++ b/sys/sys/sysproto.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 224066 2011-07-15 18:26:19Z jonathan + * created from FreeBSD: head/sys/kern/syscalls.master 224987 2011-08-18 22:51:30Z jonathan */ #ifndef _SYS_SYSPROTO_H_ @@ -1671,6 +1671,18 @@ struct cap_enter_args { struct cap_getmode_args { char modep_l_[PADL_(u_int *)]; u_int * modep; char modep_r_[PADR_(u_int *)]; }; +struct pdfork_args { + char fdp_l_[PADL_(int *)]; int * fdp; char fdp_r_[PADR_(int *)]; + char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)]; +}; +struct pdkill_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char signum_l_[PADL_(int)]; int signum; char signum_r_[PADR_(int)]; +}; +struct pdgetpid_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char pidp_l_[PADL_(pid_t *)]; pid_t * pidp; char pidp_r_[PADR_(pid_t *)]; +}; struct pselect_args { char nd_l_[PADL_(int)]; int nd; char nd_r_[PADR_(int)]; char in_l_[PADL_(fd_set *)]; fd_set * in; char in_r_[PADR_(fd_set *)]; @@ -2085,6 +2097,9 @@ int cap_new(struct thread *, struct cap_new_args *); int cap_getrights(struct thread *, struct cap_getrights_args *); int cap_enter(struct thread *, struct cap_enter_args *); int cap_getmode(struct thread *, struct cap_getmode_args *); +int pdfork(struct thread *, struct pdfork_args *); +int pdkill(struct thread *, struct pdkill_args *); +int pdgetpid(struct thread *, struct pdgetpid_args *); int pselect(struct thread *, struct pselect_args *); int getloginclass(struct thread *, struct getloginclass_args *); int setloginclass(struct thread *, struct setloginclass_args *); @@ -2772,6 +2787,9 @@ int freebsd7_shmctl(struct thread *, struct freebsd7_shmctl_args *); #define SYS_AUE_cap_getrights AUE_CAP_GETRIGHTS #define SYS_AUE_cap_enter AUE_CAP_ENTER #define SYS_AUE_cap_getmode AUE_CAP_GETMODE +#define SYS_AUE_pdfork AUE_PDFORK +#define SYS_AUE_pdkill AUE_PDKILL +#define SYS_AUE_pdgetpid AUE_PDGETPID #define SYS_AUE_pselect AUE_SELECT #define SYS_AUE_getloginclass AUE_NULL #define SYS_AUE_setloginclass AUE_NULL From b465884f4267f89ed4a02d76472d14b74ca367cc Mon Sep 17 00:00:00 2001 From: Jonathan Anderson Date: Thu, 18 Aug 2011 23:15:04 +0000 Subject: [PATCH 272/452] Test process descriptors. Ensure that process descriptors work as expected. We should be able to: - pdfork(), like regular fork(), but producing a process descriptor - pdgetpid() to convert a PD into a PID - pdkill() to send signals to a process identified by a PD Approved by: re (kib), mentor (rwatson) Sponsored by: Google Inc --- tools/regression/security/cap_test/Makefile | 2 + tools/regression/security/cap_test/cap_test.c | 2 + tools/regression/security/cap_test/cap_test.h | 3 + .../security/cap_test/cap_test_pdfork.c | 113 ++++++++++++++++++ .../security/cap_test/cap_test_pdkill.c | 101 ++++++++++++++++ 5 files changed, 221 insertions(+) create mode 100644 tools/regression/security/cap_test/cap_test_pdfork.c create mode 100644 tools/regression/security/cap_test/cap_test_pdkill.c diff --git a/tools/regression/security/cap_test/Makefile b/tools/regression/security/cap_test/Makefile index 4bbb5484642..b36c4133336 100644 --- a/tools/regression/security/cap_test/Makefile +++ b/tools/regression/security/cap_test/Makefile @@ -5,6 +5,8 @@ SRCS= cap_test.c \ cap_test_capmode.c \ cap_test_capabilities.c \ cap_test_fcntl.c \ + cap_test_pdfork.c \ + cap_test_pdkill.c \ cap_test_relative.c \ cap_test_sysctl.c \ diff --git a/tools/regression/security/cap_test/cap_test.c b/tools/regression/security/cap_test/cap_test.c index c5834541eb2..580ce4e27b3 100644 --- a/tools/regression/security/cap_test/cap_test.c +++ b/tools/regression/security/cap_test/cap_test.c @@ -49,6 +49,8 @@ struct test all_tests[] = { TEST_INIT(capmode), TEST_INIT(capabilities), TEST_INIT(fcntl), + TEST_INIT(pdfork), + TEST_INIT(pdkill), TEST_INIT(relative), TEST_INIT(sysctl), }; diff --git a/tools/regression/security/cap_test/cap_test.h b/tools/regression/security/cap_test/cap_test.h index 23435d6ed28..202b998bd0e 100644 --- a/tools/regression/security/cap_test/cap_test.h +++ b/tools/regression/security/cap_test/cap_test.h @@ -149,6 +149,9 @@ int execute(int id, struct test*); int test_capmode(void); int test_capabilities(void); int test_fcntl(void); +int test_pdfork(void); +int test_pdkill(void); +int test_pdwait(void); int test_relative(void); int test_sysctl(void); diff --git a/tools/regression/security/cap_test/cap_test_pdfork.c b/tools/regression/security/cap_test/cap_test_pdfork.c new file mode 100644 index 00000000000..0979fe73ea9 --- /dev/null +++ b/tools/regression/security/cap_test/cap_test_pdfork.c @@ -0,0 +1,113 @@ +/*- + * Copyright (c) 2009-2011 Robert N. M. Watson + * Copyright (c) 2011 Jonathan Anderson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * Test routines to make sure a variety of system calls are or are not + * available in capability mode. The goal is not to see if they work, just + * whether or not they return the expected ECAPMODE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "cap_test.h" + +int +test_pdfork(void) +{ + struct stat stat; + int success = PASSED; + int pd, error; + pid_t pid; + time_t now; + + //cap_enter(); + + pid = pdfork(&pd, 0); + if (pid < 0) + err(-1, "pdfork"); + + else if (pid == 0) { + /* + * Child process. + * + * pd should not be a valid process descriptor. + */ + error = pdgetpid(pd, &pid); + if (error != -1) + FAILX("pdgetpid succeeded"); + else if (errno != EBADF) + FAIL("pdgetpid failed, but errno != EBADF"); + + exit(success); + } + + /* Parent process. Ensure that [acm]times have been set correctly. */ + REQUIRE(fstat(pd, &stat)); + + now = time(NULL); + CHECK(now != (time_t)-1); + + CHECK(now >= stat.st_birthtime); + CHECK((now - stat.st_birthtime) < 2); + CHECK(stat.st_birthtime == stat.st_atime); + CHECK(stat.st_atime == stat.st_ctime); + CHECK(stat.st_ctime == stat.st_mtime); + + /* Wait for the child to finish. */ + error = pdgetpid(pd, &pid); + CHECK(error == 0); + CHECK(pid > 0); + + int status; + while (waitpid(pid, &status, 0) != pid) {} + if ((success == PASSED) && WIFEXITED(status)) + success = WEXITSTATUS(status); + else + success = FAILED; + + return (success); +} diff --git a/tools/regression/security/cap_test/cap_test_pdkill.c b/tools/regression/security/cap_test/cap_test_pdkill.c new file mode 100644 index 00000000000..305d46a797f --- /dev/null +++ b/tools/regression/security/cap_test/cap_test_pdkill.c @@ -0,0 +1,101 @@ +/*- + * Copyright (c) 2009-2011 Robert N. M. Watson + * Copyright (c) 2011 Jonathan Anderson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * Test routines to make sure a variety of system calls are or are not + * available in capability mode. The goal is not to see if they work, just + * whether or not they return the expected ECAPMODE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include "cap_test.h" + +void handle_signal(int); +void handle_signal(int sig) { + exit(PASSED); +} + +int +test_pdkill(void) +{ + int success = PASSED; + int pd, error; + pid_t pid; + + //cap_enter(); + + error = pdfork(&pd, 0); + if (error < 0) + err(-1, "pdfork"); + + else if (error == 0) { + signal(SIGINT, handle_signal); + sleep(3600); + exit(FAILED); + } + + /* Parent process; find the child's PID (we'll need it later). */ + error = pdgetpid(pd, &pid); + if (error != 0) + FAIL("pdgetpid"); + + /* Kill the child! */ + usleep(100); + error = pdkill(pd, SIGINT); + if (error != 0) + FAIL("pdkill"); + + /* Make sure the child finished properly. */ + int status; + while (waitpid(pid, &status, 0) != pid) {} + if ((success == PASSED) && WIFEXITED(status)) + success = WEXITSTATUS(status); + else + success = FAILED; + + return (success); +} From 311fa10b529a2f1838dad34bccf7b0907df8039c Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Fri, 19 Aug 2011 08:29:10 +0000 Subject: [PATCH 273/452] r222015 introduced a new assertion that the size of a fixed-length sbuf buffer is greater than 1. This triggered panics in at least one spot in the kernel (the MAC Framework) which passes non-negative, rather than >1 buffer sizes based on the size of a user buffer passed into a system call. While 0-size buffers aren't particularly useful, they also aren't strictly incorrect, so loosen the assertion. Discussed with: phk (fears I might be EDOOFUS but willing to go along) Spotted by: pho + stress2 Approved by: re (kib) --- sys/kern/subr_sbuf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/kern/subr_sbuf.c b/sys/kern/subr_sbuf.c index e931e655033..c0d7ea0a1ba 100644 --- a/sys/kern/subr_sbuf.c +++ b/sys/kern/subr_sbuf.c @@ -184,7 +184,7 @@ sbuf_newbuf(struct sbuf *s, char *buf, int length, int flags) s->s_buf = buf; if ((s->s_flags & SBUF_AUTOEXTEND) == 0) { - KASSERT(s->s_size > 1, + KASSERT(s->s_size >= 0, ("attempt to create a too small sbuf")); } From 9465dbeb5c83d1785de927f39db4541fd95dde24 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Fri, 19 Aug 2011 09:01:34 +0000 Subject: [PATCH 274/452] Add sysctl to not reset the device on clear stall failures, to temporarily mitigate problems with VMs. Approved by: re (kib) MFC after: 1 week --- sys/dev/usb/usb_request.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/sys/dev/usb/usb_request.c b/sys/dev/usb/usb_request.c index fc47bbfdd3d..347f9464a6f 100644 --- a/sys/dev/usb/usb_request.c +++ b/sys/dev/usb/usb_request.c @@ -67,6 +67,11 @@ #include #include +static int usb_no_cs_fail; + +SYSCTL_INT(_hw_usb, OID_AUTO, no_cs_fail, CTLFLAG_RW, + &usb_no_cs_fail, 0, "USB clear stall failures are ignored, if set"); + #ifdef USB_DEBUG static int usb_pr_poll_delay = USB_PORT_RESET_DELAY; static int usb_pr_recovery_delay = USB_PORT_RESET_RECOVERY; @@ -238,7 +243,7 @@ usb_do_clear_stall_callback(struct usb_xfer *xfer, usb_error_t error) switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: - +tr_transferred: /* reset error counter */ udev->clear_stall_errors = 0; @@ -297,6 +302,13 @@ tr_setup: break; DPRINTF("Clear stall failed.\n"); + + /* + * Some VMs like VirtualBox always return failure on + * clear-stall which we sometimes should just ignore. + */ + if (usb_no_cs_fail) + goto tr_transferred; if (udev->clear_stall_errors == USB_CS_RESET_LIMIT) goto tr_setup; From 15d837d8a05d2399d63ca2d8ce867d23de46c443 Mon Sep 17 00:00:00 2001 From: "Andrey V. Elsukov" Date: Fri, 19 Aug 2011 10:12:02 +0000 Subject: [PATCH 275/452] Add new section "BOOTSTRAPPING" to the gpart(8), that describes bootstrap code images used to boot from MBR, GPT, BSD and VTOC8 schemes. Reviewed by: marius (previous version) Approved by: re (kib) MFC after: 1 week --- sbin/geom/class/part/gpart.8 | 102 ++++++++++++++++++++++++++++++----- 1 file changed, 90 insertions(+), 12 deletions(-) diff --git a/sbin/geom/class/part/gpart.8 b/sbin/geom/class/part/gpart.8 index 4365d6b8bcf..d75ac9e5959 100644 --- a/sbin/geom/class/part/gpart.8 +++ b/sbin/geom/class/part/gpart.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 6, 2011 +.Dd August 19, 2011 .Dt GPART 8 .Os .Sh NAME @@ -260,29 +260,21 @@ and .Fl i Ar index ) . Not all partitioning schemes have embedded bootstrap code, so the .Fl b Ar bootcode -option is scheme-specific in nature. -For the GPT scheme, embedded bootstrap code is supported. -The bootstrap code is embedded in the protective MBR rather than the GPT. +option is scheme-specific in nature (see the section entitled +.Sx BOOTSTRAPPING +below). The .Fl b Ar bootcode option specifies a file that contains the bootstrap code. The contents and size of the file are determined by the partitioning scheme. -For the MBR scheme, it is a 512 byte file of which the first 446 bytes -are installed as bootstrap code. The .Fl p Ar partcode option specifies a file that contains the bootstrap code intended to be written to a partition. -For the VTOC8 scheme, it is a 8192 byte file of which the last 7680 bytes -are installed as bootstrap code. The partition is specified by the .Fl i Ar index option. -For the VTOC8 scheme, if the -.Fl i Ar index -option is omitted, the bootstrap code is written to all sufficiently large -partitions. The size of the file must be smaller than the size of the partition. .Pp Additional options include: @@ -716,6 +708,91 @@ The scheme-specific attributes for PC98: .It Cm active .It Cm bootable .El +.Sh BOOTSTRAPPING +.Fx supports several partitioning schemes and each scheme uses different +bootstrap code. +The bootstrap code is located in the specific disk area for each partitioning +scheme and also it might have different size. +.Pp +The bootstrap code could be separated into two types. +The first one is embedded in the partitioning scheme's metadata, the second +type is located on the specific partition. +The embedding bootstrap code should be done only with the +.Cm gpart bootcode +command with +.Fl b Ar bootcode +option. +The GEOM PART class has knowlege on how to embed bootstrap code into specific +partitioning scheme metadata without damage. +.Pp +The Master Boot Record (MBR) uses 512-bytes bootstrap code image, embedded into +partition table's metadata area. +There are two variants of this bootstrap code: +.Pa /boot/mbr +and +.Pa /boot/boot0 . +The first one searches partition with +.Cm active +attribute (see the +.Sx ATTRIBUTES +section) in the partition table. +Then it runs next bootstrap stage. +The +.Pa /boot/boot0 +image contains a boot manager with some additional interactive functions. +.Pp +The BSD disklabel is usually created on top of the MBR partition (slice) +with type +.Cm freebsd +(see the +.Sx "PARTITION TYPES" +section). +It uses 8 KB size bootstrap code image +.Pa /boot/boot , +embedded into partition table's metadata area. +.Pp +Both types of bootstrap code are used to boot from the GUID Partition Table. +First of all, a protective MBR is embedded into first disk sector from the +.Pa /boot/pmbr +image. +It searches the +.Cm freebsd-boot +partition (see the +.Sx "PARTITION TYPES" +section) in the GPT and runs next bootstrap stage from it. +The +.Cm freebsd-boot +partition should be smaller than 545 KB. +There are two variants of bootstrap code to write to this partition: +.Pa /boot/gptboot +and +.Pa /boot/gptzfsboot . +The first one is used to boot from UFS. +It searches in the GPT partition with type +.Cm freebsd-ufs , +and it runs the thrid bootstrap stage ( +.Pa /boot/loader ) +if it is found. +The +.Pa /boot/gptzfsboot +is used to boot from ZFS. +It searches partition with type +.Cm freebsd-zfs +and starts +.Pa /boot/zfsloader +from it. +.Pp +The VTOC8 scheme does not support embedding bootstrap code. +Instead, the 8 KBytes bootstrap code image +.Pa /boot/boot1 +could be written with +.Cm gpart bootcode +command with +.Fl p Ar bootcode +option to all sufficiently large VTOC8 partitions. +To do this the +.Fl i Ar index +option could be ommited. .Sh OPERATIONAL FLAGS Actions other than the .Cm commit @@ -949,6 +1026,7 @@ and .Sh SEE ALSO .Xr dd 1 , .Xr geom 4 , +.Xr boot0cfg 8 , .Xr geom 8 .Sh HISTORY The From 6bfcd9c37bc00efb632f648e10bf07bf69c13f2f Mon Sep 17 00:00:00 2001 From: "Andrey V. Elsukov" Date: Fri, 19 Aug 2011 12:48:06 +0000 Subject: [PATCH 276/452] The decimal() function was changed in r217808 to take the maximum value instead of number of bits. But for case when limitation is not needed it erroneously skips conversion to number and always returns zero. So, don't skip conversion for case when limitation is not needed. PR: bin/159765 Approved by: re (kib) --- sbin/fdisk/fdisk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sbin/fdisk/fdisk.c b/sbin/fdisk/fdisk.c index eb81e3b460a..ba1ee002e9e 100644 --- a/sbin/fdisk/fdisk.c +++ b/sbin/fdisk/fdisk.c @@ -940,7 +940,7 @@ decimal(const char *str, int *num, int deflt, uint32_t maxval) return 0; while ((c = *cp++)) { if (c <= '9' && c >= '0') { - if (maxval > 0 && acc <= maxval) + if (acc <= maxval || maxval == 0) acc = acc * 10 + c - '0'; } else break; From 72dc07eb4492c02c326278ae5aa6a3e81dcfe17c Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Fri, 19 Aug 2011 13:31:48 +0000 Subject: [PATCH 277/452] Bump the maximum coretemp limit (for CPU temperature) to 110. Several cores with temp in the range 101-105 have been found in the past. Sponsored by: Sandvine Incorporated Reviewed by: delphij, emaste Approved by: re (kib) MFC after: 3 days --- sys/dev/coretemp/coretemp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/dev/coretemp/coretemp.c b/sys/dev/coretemp/coretemp.c index 411b9eecf16..92109ad1c4b 100644 --- a/sys/dev/coretemp/coretemp.c +++ b/sys/dev/coretemp/coretemp.c @@ -225,12 +225,12 @@ coretemp_attach(device_t dev) * these numbers are, with the publicly available * documents from Intel. * - * For now, we consider [70, 100]C range, as + * For now, we consider [70, 110]C range, as * described in #322683, as "reasonable" and accept * these values whenever the MSR is available for * read, regardless the CPU model. */ - if (tjtarget >= 70 && tjtarget <= 100) + if (tjtarget >= 70 && tjtarget <= 110) sc->sc_tjmax = tjtarget; else device_printf(dev, "Tj(target) value %d " From 198af96ed78433ef0a8221471c76554887837dbc Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Fri, 19 Aug 2011 15:21:13 +0000 Subject: [PATCH 278/452] Correctly handle BAR TX failures. On a TX failure, ic_raw_xmit will still call ieee80211_node_free(). There's no need to call it here. Submitted by: moonlightakkiy@yahoo.ca Approved by: re (kib) --- sys/net80211/ieee80211_ht.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c index e6dbbf2724e..c49a17803bb 100644 --- a/sys/net80211/ieee80211_ht.c +++ b/sys/net80211/ieee80211_ht.c @@ -2309,11 +2309,15 @@ ieee80211_send_bar(struct ieee80211_node *ni, ni, "send BAR: tid %u ctl 0x%x start %u (attempt %d)", tid, barctl, seq, tap->txa_attempts); + /* + * ic_raw_xmit will free the node reference + * regardless of queue/TX success or failure. + */ ret = ic->ic_raw_xmit(ni, m, NULL); if (ret != 0) { /* xmit failed, clear state flag */ tap->txa_flags &= ~IEEE80211_AGGR_BARPEND; - goto bad; + return ret; } /* XXX hack against tx complete happening before timer is started */ if (tap->txa_flags & IEEE80211_AGGR_BARPEND) From 6e3f30748689bbb1a8c506c8e410fad2332916f2 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Fri, 19 Aug 2011 19:12:58 +0000 Subject: [PATCH 279/452] r221812 reveals that at least some Broadcom PHYs default to being not only isolated but also powered down after a reset and while they just work fine [sic] when both is the case they don't if they are only deisolate but still powered down. So in order to put PHYs in an overall normal operation mode for the common case, ensure in mii_phy_reset() that they are not powered down after a reset. Unfortunately, this only helps in case of BCM5421, while BCM5709S apparently only work when they remain isolated and powered down after a reset. So don't call mii_phy_reset() in brgphy_reset() and implement the reset locally leaving the problematic bits alone. Effectively this bypasses r221812 for brgphy(4). Thanks to Justin Hibbits for doing a binary search in order to identify the problematic commit. PR: 157405, 158156 Reviewed by: yongari (mii_phy_reset() part) Approved by: re (kib) MFC after: 3 days --- sys/dev/mii/brgphy.c | 18 +++++++++++++++--- sys/dev/mii/mii_physubr.c | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/sys/dev/mii/brgphy.c b/sys/dev/mii/brgphy.c index 8e3986a80be..88090b7607a 100644 --- a/sys/dev/mii/brgphy.c +++ b/sys/dev/mii/brgphy.c @@ -876,10 +876,22 @@ brgphy_reset(struct mii_softc *sc) struct bge_softc *bge_sc = NULL; struct bce_softc *bce_sc = NULL; struct ifnet *ifp; - int val; + int i, val; - /* Perform a standard PHY reset. */ - mii_phy_reset(sc); + /* + * Perform a reset. Note that at least some Broadcom PHYs default to + * being powered down as well as isolated after a reset but don't work + * if one or both of these bits are cleared. However, they just work + * fine if both bits remain set, so we don't use mii_phy_reset() here. + */ + PHY_WRITE(sc, BRGPHY_MII_BMCR, BRGPHY_BMCR_RESET); + + /* Wait 100ms for it to complete. */ + for (i = 0; i < 100; i++) { + if ((PHY_READ(sc, BRGPHY_MII_BMCR) & BRGPHY_BMCR_RESET) == 0) + break; + DELAY(1000); + } /* Handle any PHY specific procedures following the reset. */ switch (sc->mii_mpd_oui) { diff --git a/sys/dev/mii/mii_physubr.c b/sys/dev/mii/mii_physubr.c index be6650595cf..8e1476a7df4 100644 --- a/sys/dev/mii/mii_physubr.c +++ b/sys/dev/mii/mii_physubr.c @@ -273,8 +273,8 @@ mii_phy_reset(struct mii_softc *sc) DELAY(1000); } - /* NB: a PHY may default to isolation. */ - reg &= ~BMCR_ISO; + /* NB: a PHY may default to being powered down and/or isolated. */ + reg &= ~(BMCR_PDOWN | BMCR_ISO); if ((sc->mii_flags & MIIF_NOISOLATE) == 0 && ((ife == NULL && sc->mii_inst != 0) || (ife != NULL && IFM_INST(ife->ifm_media) != sc->mii_inst))) From 5ca7dfffdf925aec3238b53ca7034f7be4d37388 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Fri, 19 Aug 2011 19:13:31 +0000 Subject: [PATCH 280/452] Revert r224157, re-enabling r222135. The underlying problem keeping the latter from working as expected was fixed in r225014. MFC after: 3 days Approved by: re (kib) --- sys/dev/gem/if_gem.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/sys/dev/gem/if_gem.c b/sys/dev/gem/if_gem.c index 6f53eaea1c8..d75e1ab8dc6 100644 --- a/sys/dev/gem/if_gem.c +++ b/sys/dev/gem/if_gem.c @@ -947,10 +947,8 @@ gem_init_locked(struct gem_softc *sc) GEM_LOCK_ASSERT(sc, MA_OWNED); -#ifdef notyet if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) return; -#endif #ifdef GEM_DEBUG CTR2(KTR_GEM, "%s: %s: calling stop", device_get_name(sc->sc_dev), From 6dfd657c01b49bcc87562c8de45fc4b8adf976d1 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Fri, 19 Aug 2011 21:28:40 +0000 Subject: [PATCH 281/452] Walk the zombproc list as well as the allproc list when enumerating threads and processes in a kernel image. This allows examination of threads that have exited or are in the late stages of exiting. Tested by: avg Approved by: re (kib) MFC after: 1 week --- gnu/usr.bin/gdb/kgdb/kthr.c | 81 ++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/gnu/usr.bin/gdb/kgdb/kthr.c b/gnu/usr.bin/gdb/kgdb/kthr.c index 461f408a73d..b12d07c28e2 100644 --- a/gnu/usr.bin/gdb/kgdb/kthr.c +++ b/gnu/usr.bin/gdb/kgdb/kthr.c @@ -73,11 +73,52 @@ kgdb_thr_first(void) return (first); } -struct kthr * -kgdb_thr_init(void) +static void +kgdb_thr_add_procs(uintptr_t paddr) { struct proc p; struct thread td; + struct kthr *kt; + CORE_ADDR addr; + + while (paddr != 0) { + if (kvm_read(kvm, paddr, &p, sizeof(p)) != sizeof(p)) { + warnx("kvm_read: %s", kvm_geterr(kvm)); + break; + } + addr = (uintptr_t)TAILQ_FIRST(&p.p_threads); + while (addr != 0) { + if (kvm_read(kvm, addr, &td, sizeof(td)) != + sizeof(td)) { + warnx("kvm_read: %s", kvm_geterr(kvm)); + break; + } + kt = malloc(sizeof(*kt)); + kt->next = first; + kt->kaddr = addr; + if (td.td_tid == dumptid) + kt->pcb = dumppcb; + else if (td.td_state == TDS_RUNNING && stoppcbs != 0 && + CPU_ISSET(td.td_oncpu, &stopped_cpus)) + kt->pcb = (uintptr_t)stoppcbs + + sizeof(struct pcb) * td.td_oncpu; + else + kt->pcb = (uintptr_t)td.td_pcb; + kt->kstack = td.td_kstack; + kt->tid = td.td_tid; + kt->pid = p.p_pid; + kt->paddr = paddr; + kt->cpu = td.td_oncpu; + first = kt; + addr = (uintptr_t)TAILQ_NEXT(&td, td_plist); + } + paddr = (uintptr_t)LIST_NEXT(&p, p_list); + } +} + +struct kthr * +kgdb_thr_init(void) +{ long cpusetsize; struct kthr *kt; CORE_ADDR addr; @@ -113,37 +154,11 @@ kgdb_thr_init(void) stoppcbs = kgdb_lookup("stoppcbs"); - while (paddr != 0) { - if (kvm_read(kvm, paddr, &p, sizeof(p)) != sizeof(p)) { - warnx("kvm_read: %s", kvm_geterr(kvm)); - break; - } - addr = (uintptr_t)TAILQ_FIRST(&p.p_threads); - while (addr != 0) { - if (kvm_read(kvm, addr, &td, sizeof(td)) != - sizeof(td)) { - warnx("kvm_read: %s", kvm_geterr(kvm)); - break; - } - kt = malloc(sizeof(*kt)); - kt->next = first; - kt->kaddr = addr; - if (td.td_tid == dumptid) - kt->pcb = dumppcb; - else if (td.td_state == TDS_RUNNING && stoppcbs != 0 && - CPU_ISSET(td.td_oncpu, &stopped_cpus)) - kt->pcb = (uintptr_t) stoppcbs + sizeof(struct pcb) * td.td_oncpu; - else - kt->pcb = (uintptr_t)td.td_pcb; - kt->kstack = td.td_kstack; - kt->tid = td.td_tid; - kt->pid = p.p_pid; - kt->paddr = paddr; - kt->cpu = td.td_oncpu; - first = kt; - addr = (uintptr_t)TAILQ_NEXT(&td, td_plist); - } - paddr = (uintptr_t)LIST_NEXT(&p, p_list); + kgdb_thr_add_procs(paddr); + addr = kgdb_lookup("zombproc"); + if (addr != 0) { + kvm_read(kvm, addr, &paddr, sizeof(paddr)); + kgdb_thr_add_procs(paddr); } curkthr = kgdb_thr_lookup_tid(dumptid); if (curkthr == NULL) From bda13729a4d67f00c0c704582130b36e1b2e0f81 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Fri, 19 Aug 2011 21:33:46 +0000 Subject: [PATCH 282/452] Fix WWN printing in `camcontrol identify` output. Approved by: re (kib) MFC after: 1 week --- sbin/camcontrol/camcontrol.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sbin/camcontrol/camcontrol.c b/sbin/camcontrol/camcontrol.c index 7ad79d5dcb7..c408b811f33 100644 --- a/sbin/camcontrol/camcontrol.c +++ b/sbin/camcontrol/camcontrol.c @@ -1131,7 +1131,7 @@ atacapprint(struct ata_params *parm) printf("firmware revision %.8s\n", parm->revision); printf("serial number %.20s\n", parm->serial); if (parm->enabled.extension & ATA_SUPPORT_64BITWWN) { - printf("WWN %02x%02x%02x%02x\n", + printf("WWN %04x%04x%04x%04x\n", parm->wwn[0], parm->wwn[1], parm->wwn[2], parm->wwn[3]); } if (parm->enabled.extension & ATA_SUPPORT_MEDIASN) { From 25b233372d330869087760f0ddd9f054b39baed2 Mon Sep 17 00:00:00 2001 From: "Andrey V. Elsukov" Date: Sat, 20 Aug 2011 08:20:10 +0000 Subject: [PATCH 283/452] o Fix mdoc formatting for the '.Fx' macro. [1] o Add information about APM scheme and fix typos. [2] Submitted by: gjb [1], nwhitehorn [2] Approved by: re (kib) MFC after: 1 week --- sbin/geom/class/part/gpart.8 | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sbin/geom/class/part/gpart.8 b/sbin/geom/class/part/gpart.8 index d75ac9e5959..046ab26bb44 100644 --- a/sbin/geom/class/part/gpart.8 +++ b/sbin/geom/class/part/gpart.8 @@ -709,7 +709,8 @@ The scheme-specific attributes for PC98: .It Cm bootable .El .Sh BOOTSTRAPPING -.Fx supports several partitioning schemes and each scheme uses different +.Fx +supports several partitioning schemes and each scheme uses different bootstrap code. The bootstrap code is located in the specific disk area for each partitioning scheme and also it might have different size. @@ -770,7 +771,7 @@ and The first one is used to boot from UFS. It searches in the GPT partition with type .Cm freebsd-ufs , -and it runs the thrid bootstrap stage ( +and it runs the third bootstrap stage ( .Pa /boot/loader ) if it is found. The @@ -785,7 +786,7 @@ from it. The VTOC8 scheme does not support embedding bootstrap code. Instead, the 8 KBytes bootstrap code image .Pa /boot/boot1 -could be written with +should be written with .Cm gpart bootcode command with .Fl p Ar bootcode @@ -793,6 +794,15 @@ option to all sufficiently large VTOC8 partitions. To do this the .Fl i Ar index option could be ommited. +.Pp +The APM scheme also does not support embedding bootstrap code. +Instead, the 800 KBytes bootstrap code image +.Pa /boot/boot1.hfs +should be written with +.Cm gpart bootcode +command to a partition of type +.Cm freebsd-boot , +which should also be 800 KB in size. .Sh OPERATIONAL FLAGS Actions other than the .Cm commit From 391255b8a4dffe656d04baf5c45a589fdbac9e77 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 20 Aug 2011 12:40:17 +0000 Subject: [PATCH 284/452] While not explicitly allowed by RFC 2460, in case there is no translation technology involved (and that section is suggested to be removed by Errata 2843), single packet fragments do not harm. There is another errata under discussion to clarify and allow this. Meanwhile add a sysctl to allow disabling this behaviour again. We will treat single packet fragment (a fragment header added when not needed) as if there was no fragment header. PR: kern/145733 Submitted by: Matthew Luckie (mjl luckie.org.nz) (original version) Tested by: Matthew Luckie (mjl luckie.org.nz) MFC after: 2 weeks Approved by: re (kib) --- sys/netinet/ipfw/ip_fw2.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/sys/netinet/ipfw/ip_fw2.c b/sys/netinet/ipfw/ip_fw2.c index 4e25f9a086d..5aabde3c44e 100644 --- a/sys/netinet/ipfw/ip_fw2.c +++ b/sys/netinet/ipfw/ip_fw2.c @@ -107,6 +107,9 @@ static VNET_DEFINE(int, ipfw_vnet_ready) = 0; static VNET_DEFINE(int, fw_deny_unknown_exthdrs); #define V_fw_deny_unknown_exthdrs VNET(fw_deny_unknown_exthdrs) +static VNET_DEFINE(int, fw_permit_single_frag6) = 1; +#define V_fw_permit_single_frag6 VNET(fw_permit_single_frag6) + #ifdef IPFIREWALL_DEFAULT_TO_ACCEPT static int default_to_accept = 1; #else @@ -182,6 +185,9 @@ SYSCTL_NODE(_net_inet6_ip6, OID_AUTO, fw, CTLFLAG_RW, 0, "Firewall"); SYSCTL_VNET_INT(_net_inet6_ip6_fw, OID_AUTO, deny_unknown_exthdrs, CTLFLAG_RW | CTLFLAG_SECURE, &VNET_NAME(fw_deny_unknown_exthdrs), 0, "Deny packets with unknown IPv6 Extension Headers"); +SYSCTL_VNET_INT(_net_inet6_ip6_fw, OID_AUTO, permit_single_frag6, + CTLFLAG_RW | CTLFLAG_SECURE, &VNET_NAME(fw_permit_single_frag6), 0, + "Permit single packet IPv6 fragments"); #endif /* INET6 */ SYSEND @@ -871,10 +877,14 @@ ipfw_chk(struct ip_fw_args *args) * we have a fragment at this offset of an IPv4 packet. * offset == 0 means that (if this is an IPv4 packet) * this is the first or only fragment. - * For IPv6 offset == 0 means there is no Fragment Header. + * For IPv6 offset == 0 means there is no Fragment Header or there + * is a single packet fragement (fragement header added without + * needed). We will treat a single packet fragment as if there + * was no fragment header (or log/block depending on the + * V_fw_permit_single_frag6 sysctl setting). * If offset != 0 for IPv6 always use correct mask to - * get the correct offset because we add IP6F_MORE_FRAG - * to be able to dectect the first fragment which would + * get the correct offset because we add IP6F_MORE_FRAG to be able + * to dectect the first of multiple fragments which would * otherwise have offset = 0. */ u_short offset = 0; @@ -1037,10 +1047,11 @@ do { \ offset = ((struct ip6_frag *)ulp)->ip6f_offlg & IP6F_OFF_MASK; /* Add IP6F_MORE_FRAG for offset of first - * fragment to be != 0. */ + * fragment to be != 0 if there shall be more. */ offset |= ((struct ip6_frag *)ulp)->ip6f_offlg & IP6F_MORE_FRAG; - if (offset == 0) { + if (V_fw_permit_single_frag6 == 0 && + offset == 0) { printf("IPFW2: IPV6 - Invalid Fragment " "Header\n"); if (V_fw_deny_unknown_exthdrs) From 720fee0674fc0bd54a1c5cabfa318ceb344c1bd7 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 20 Aug 2011 13:17:47 +0000 Subject: [PATCH 285/452] ipfw internally checks for offset == 0 to determine whether the packet is a/the first fragment or not. For IPv6 we have added the "more fragments" flag as well to be able to determine on whether there will be more as we do not have the fragment header avaialble for logging, while for IPv4 this information can be derived directly from the IPv4 header. This allowed fragmented packets to bypass normal rules as proper masking was not done when checking offset. Split variables to not need masking for IPv6 to avoid further errors. PR: kern/145733 Submitted by: Matthew Luckie (mjl luckie.org.nz) MFC after: 2 weeks Approved by: re (kib) --- sys/netinet/ipfw/ip_fw2.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/sys/netinet/ipfw/ip_fw2.c b/sys/netinet/ipfw/ip_fw2.c index 5aabde3c44e..56354ad4a0c 100644 --- a/sys/netinet/ipfw/ip_fw2.c +++ b/sys/netinet/ipfw/ip_fw2.c @@ -877,17 +877,14 @@ ipfw_chk(struct ip_fw_args *args) * we have a fragment at this offset of an IPv4 packet. * offset == 0 means that (if this is an IPv4 packet) * this is the first or only fragment. - * For IPv6 offset == 0 means there is no Fragment Header or there - * is a single packet fragement (fragement header added without - * needed). We will treat a single packet fragment as if there - * was no fragment header (or log/block depending on the + * For IPv6 offset|ip6f_mf == 0 means there is no Fragment Header + * or there is a single packet fragement (fragement header added + * without needed). We will treat a single packet fragment as if + * there was no fragment header (or log/block depending on the * V_fw_permit_single_frag6 sysctl setting). - * If offset != 0 for IPv6 always use correct mask to - * get the correct offset because we add IP6F_MORE_FRAG to be able - * to dectect the first of multiple fragments which would - * otherwise have offset = 0. */ u_short offset = 0; + u_short ip6f_mf = 0; /* * Local copies of addresses. They are only valid if we have @@ -1046,12 +1043,10 @@ do { \ proto = ((struct ip6_frag *)ulp)->ip6f_nxt; offset = ((struct ip6_frag *)ulp)->ip6f_offlg & IP6F_OFF_MASK; - /* Add IP6F_MORE_FRAG for offset of first - * fragment to be != 0 if there shall be more. */ - offset |= ((struct ip6_frag *)ulp)->ip6f_offlg & + ip6f_mf = ((struct ip6_frag *)ulp)->ip6f_offlg & IP6F_MORE_FRAG; if (V_fw_permit_single_frag6 == 0 && - offset == 0) { + offset == 0 && ip6f_mf == 0) { printf("IPFW2: IPV6 - Invalid Fragment " "Header\n"); if (V_fw_deny_unknown_exthdrs) @@ -1687,7 +1682,7 @@ do { \ case O_LOG: ipfw_log(f, hlen, args, m, - oif, offset, tablearg, ip); + oif, offset | ip6f_mf, tablearg, ip); match = 1; break; From 49239b28daddb63f17e5ee9060ccd9fd8ffd72bb Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 20 Aug 2011 13:46:19 +0000 Subject: [PATCH 286/452] If we detect an IPv6 fragment header and it is not the first fragment, then terminate the loop as we will not find any further headers and for short fragments this could otherwise lead to a pullup error discarding the fragment. PR: kern/145733 Submitted by: Matthew Luckie (mjl luckie.org.nz) MFC after: 2 weeks Approved by: re (kib) --- sys/netinet/ipfw/ip_fw2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/netinet/ipfw/ip_fw2.c b/sys/netinet/ipfw/ip_fw2.c index 56354ad4a0c..f028fbb5482 100644 --- a/sys/netinet/ipfw/ip_fw2.c +++ b/sys/netinet/ipfw/ip_fw2.c @@ -978,7 +978,7 @@ do { \ proto = ip6->ip6_nxt; /* Search extension headers to find upper layer protocols */ - while (ulp == NULL) { + while (ulp == NULL && offset == 0) { switch (proto) { case IPPROTO_ICMPV6: PULLUP_TO(hlen, ulp, struct icmp6_hdr); From 0c4dbd5af70981fe337cdefc91e454ab91558b94 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 20 Aug 2011 13:47:08 +0000 Subject: [PATCH 287/452] After r225032 fix logging in a similar way masking the the IPv6 more fragments flag off so that offset == 0 checks work properly. PR: kern/145733 Submitted by: Matthew Luckie (mjl luckie.org.nz) MFC after: 2 weeks X-MFC with: r225032 Approved by: re (kib) --- sys/netinet/ipfw/ip_fw_log.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sys/netinet/ipfw/ip_fw_log.c b/sys/netinet/ipfw/ip_fw_log.c index 2b55a382d70..edfa07d183c 100644 --- a/sys/netinet/ipfw/ip_fw_log.c +++ b/sys/netinet/ipfw/ip_fw_log.c @@ -333,10 +333,14 @@ ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, #ifdef INET6 struct ip6_hdr *ip6 = NULL; struct icmp6_hdr *icmp6; + u_short ip6f_mf; #endif src[0] = '\0'; dst[0] = '\0'; #ifdef INET6 + ip6f_mf = offset & IP6F_MORE_FRAG; + offset &= IP6F_OFF_MASK; + if (IS_IP6_FLOW_ID(&(args->f_id))) { char ip6buf[INET6_ADDRSTRLEN]; snprintf(src, sizeof(src), "[%s]", @@ -418,8 +422,7 @@ ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, " (frag %08x:%d@%d%s)", args->f_id.extra, ntohs(ip6->ip6_plen) - hlen, - ntohs(offset & IP6F_OFF_MASK) << 3, - (offset & IP6F_MORE_FRAG) ? "+" : ""); + ntohs(offset) << 3, ip6f_mf ? "+" : ""); } else #endif { From 33ec9f0cb0e2928c586d481a5bba64860b111ce1 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Sat, 20 Aug 2011 14:04:16 +0000 Subject: [PATCH 288/452] Use correct enum instead of constant value. MFC after: 1 week Spotted by: scf @ Approved by: re (kib) --- lib/libusb/libusb10.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c index d11f631d238..b66ccb6eec5 100644 --- a/lib/libusb/libusb10.c +++ b/lib/libusb/libusb10.c @@ -276,7 +276,7 @@ enum libusb_speed libusb_get_device_speed(libusb_device *dev) { if (dev == NULL) - return (0); /* should not happen */ + return (LIBUSB_SPEED_UNKNOWN); /* should not happen */ switch (libusb20_dev_get_speed(dev->os_priv)) { case LIBUSB20_SPEED_LOW: From f76fdd221b2450a9459ee7418ea9fc1cac475f25 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 20 Aug 2011 14:20:36 +0000 Subject: [PATCH 289/452] Hide IPv6 next header parsing warnings under the verbose sysctl so people can possibly disable it when their consoles are flooded, or enabled it for debugging. MFC after: 2 weeks Approved by: re (kib) --- sys/netinet/ipfw/ip_fw2.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/sys/netinet/ipfw/ip_fw2.c b/sys/netinet/ipfw/ip_fw2.c index f028fbb5482..e4e64e44f16 100644 --- a/sys/netinet/ipfw/ip_fw2.c +++ b/sys/netinet/ipfw/ip_fw2.c @@ -1023,9 +1023,11 @@ do { \ ext_hd |= EXT_RTHDR2; break; default: - printf("IPFW2: IPV6 - Unknown Routing " - "Header type(%d)\n", - ((struct ip6_rthdr *)ulp)->ip6r_type); + if (V_fw_verbose) + printf("IPFW2: IPV6 - Unknown " + "Routing Header type(%d)\n", + ((struct ip6_rthdr *) + ulp)->ip6r_type); if (V_fw_deny_unknown_exthdrs) return (IP_FW_DENY); break; @@ -1047,8 +1049,9 @@ do { \ IP6F_MORE_FRAG; if (V_fw_permit_single_frag6 == 0 && offset == 0 && ip6f_mf == 0) { - printf("IPFW2: IPV6 - Invalid Fragment " - "Header\n"); + if (V_fw_verbose) + printf("IPFW2: IPV6 - Invalid " + "Fragment Header\n"); if (V_fw_deny_unknown_exthdrs) return (IP_FW_DENY); break; @@ -1119,8 +1122,10 @@ do { \ break; default: - printf("IPFW2: IPV6 - Unknown Extension " - "Header(%d), ext_hd=%x\n", proto, ext_hd); + if (V_fw_verbose) + printf("IPFW2: IPV6 - Unknown " + "Extension Header(%d), ext_hd=%x\n", + proto, ext_hd); if (V_fw_deny_unknown_exthdrs) return (IP_FW_DENY); PULLUP_TO(hlen, ulp, struct ip6_ext); From 0f92e529e1763e31184939f76a886d5c54c8ba74 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Sat, 20 Aug 2011 14:21:32 +0000 Subject: [PATCH 290/452] Add new USB ID. Approved by: re (kib) MFC after: 1 week PR: usb/159836 --- share/man/man4/uhso.4 | 2 ++ sys/dev/usb/net/uhso.c | 2 ++ sys/dev/usb/usbdevs | 1 + 3 files changed, 5 insertions(+) diff --git a/share/man/man4/uhso.4 b/share/man/man4/uhso.4 index 7f60691495d..26d169badbc 100644 --- a/share/man/man4/uhso.4 +++ b/share/man/man4/uhso.4 @@ -79,6 +79,8 @@ The following devices have been verified to work .It Option GlobeSurfer iCON 7.2 (new firmware) .It +Option GlobeTrotter Max 7.2 (new firmware) +.It Option iCON 225 .It Option iCON 452 diff --git a/sys/dev/usb/net/uhso.c b/sys/dev/usb/net/uhso.c index cbb0b087b14..6b42de80a8d 100644 --- a/sys/dev/usb/net/uhso.c +++ b/sys/dev/usb/net/uhso.c @@ -249,6 +249,8 @@ static struct unrhdr *uhso_ifnet_unit = NULL; static const STRUCT_USB_HOST_ID uhso_devs[] = { #define UHSO_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) } + /* Option GlobeTrotter MAX 7.2 with upgraded firmware */ + UHSO_DEV(OPTION, GTMAX72, UHSO_STATIC_IFACE), /* Option GlobeSurfer iCON 7.2 */ UHSO_DEV(OPTION, GSICON72, UHSO_STATIC_IFACE), /* Option iCON 225 */ diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs index 72922f916ba..e5a545abb8e 100644 --- a/sys/dev/usb/usbdevs +++ b/sys/dev/usb/usbdevs @@ -2448,6 +2448,7 @@ product OPTION GT3GQUAD 0x6300 GlobeTrotter 3G QUAD datacard product OPTION GT3GPLUS 0x6600 GlobeTrotter 3G+ datacard product OPTION GTICON322 0xd033 GlobeTrotter Icon322 storage product OPTION GTMAX36 0x6701 GlobeTrotter Max 3.6 Modem +product OPTION GTMAX72 0x6711 GlobeTrotter Max 7.2 HSDPA product OPTION GTHSDPA 0x6971 GlobeTrotter HSDPA product OPTION GTMAXHSUPA 0x7001 GlobeTrotter HSUPA product OPTION GTMAXHSUPAE 0x6901 GlobeTrotter HSUPA PCIe From fbaee0f1f5a066f2821055ac178cb88304dbb840 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Sat, 20 Aug 2011 15:12:53 +0000 Subject: [PATCH 291/452] Fix for recursive locking in usb_close() after change 224777. Approved by: re (kib) MFC after: 3 days Reported by: kwm @ --- sys/dev/usb/usb_dev.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/sys/dev/usb/usb_dev.c b/sys/dev/usb/usb_dev.c index 7a83ee330b9..990bda22e4c 100644 --- a/sys/dev/usb/usb_dev.c +++ b/sys/dev/usb/usb_dev.c @@ -911,10 +911,23 @@ usb_close(void *arg) DPRINTFN(2, "cpd=%p\n", cpd); - err = usb_ref_device(cpd, &refs, 1); - if (err) { - free(cpd, M_USBDEV); - return; + err = usb_ref_device(cpd, &refs, 0); + if (err) + goto done; + + /* + * If this function is not called directly from the root HUB + * thread, there is usually a need to lock the enumeration + * lock. Check this. + */ + if (!usbd_enum_is_locked(cpd->udev)) { + + DPRINTFN(2, "Locking enumeration\n"); + + /* reference device */ + err = usb_usb_ref_device(cpd, &refs); + if (err) + goto done; } if (cpd->fflags & FREAD) { usb_fifo_close(refs.rxfifo, cpd->fflags); @@ -922,10 +935,9 @@ usb_close(void *arg) if (cpd->fflags & FWRITE) { usb_fifo_close(refs.txfifo, cpd->fflags); } - usb_unref_device(cpd, &refs); +done: free(cpd, M_USBDEV); - return; } static void From aab4f501701a792f3bea5be7b314d222896e1ce4 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sat, 20 Aug 2011 16:12:29 +0000 Subject: [PATCH 292/452] Prevent the hiwatermark for the unix domain socket from becoming effectively negative. Often seen as upstream fastcgi connection timeouts in nginx when using sendfile over unix domain sockets for communication. Sendfile(2) may send more bytes then currently allowed by the hiwatermark of the socket, e.g. because the so_snd sockbuf lock is dropped after sbspace() call in the kern_sendfile() loop. In this case, recalculated hiwatermark will overflow. Since lowatermark is renewed as half of the hiwatermark by sendfile code, and both are unsigned, the send buffer never reaches the free space requested by lowatermark, causing indefinite wait in sendfile. Reviewed by: rwatson Approved by: re (bz) MFC after: 2 weeks --- sys/kern/uipc_usrreq.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 4bad3869fe8..3a34f58605b 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -816,7 +816,7 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, struct unpcb *unp, *unp2; struct socket *so2; u_int mbcnt_delta, sbcc; - u_long newhiwat; + u_int newhiwat; int error = 0; unp = sotounpcb(so); @@ -974,7 +974,10 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, sorwakeup_locked(so2); SOCKBUF_LOCK(&so->so_snd); - newhiwat = so->so_snd.sb_hiwat - (sbcc - unp2->unp_cc); + if ((int)so->so_snd.sb_hiwat >= (int)(sbcc - unp2->unp_cc)) + newhiwat = so->so_snd.sb_hiwat - (sbcc - unp2->unp_cc); + else + newhiwat = 0; (void)chgsbsize(so->so_cred->cr_uidinfo, &so->so_snd.sb_hiwat, newhiwat, RLIM_INFINITY); so->so_snd.sb_mbmax -= mbcnt_delta; From d840e1d24870f2aa5e16f826d03d86027ecd06fb Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Sat, 20 Aug 2011 16:21:40 +0000 Subject: [PATCH 293/452] Add new USB ID to u3g driver. Approved by: re (kib) MFC after: 1 week PR: usb/159919 --- sys/dev/usb/serial/u3g.c | 2 ++ sys/dev/usb/usbdevs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/sys/dev/usb/serial/u3g.c b/sys/dev/usb/serial/u3g.c index f1c1f7d318e..46a153f4cb8 100644 --- a/sys/dev/usb/serial/u3g.c +++ b/sys/dev/usb/serial/u3g.c @@ -280,6 +280,8 @@ static const STRUCT_USB_HOST_ID u3g_devs[] = { U3G_DEV(HUAWEI, E143D, U3GINIT_HUAWEI), U3G_DEV(HUAWEI, E143E, U3GINIT_HUAWEI), U3G_DEV(HUAWEI, E143F, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E173, 0), + U3G_DEV(HUAWEI, E173_INIT, U3GINIT_HUAWEISCSI), U3G_DEV(HUAWEI, E180V, U3GINIT_HUAWEI), U3G_DEV(HUAWEI, E220, U3GINIT_HUAWEI), U3G_DEV(HUAWEI, E220BIS, U3GINIT_HUAWEI), diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs index e5a545abb8e..6a729a2ef61 100644 --- a/sys/dev/usb/usbdevs +++ b/sys/dev/usb/usbdevs @@ -1874,6 +1874,8 @@ product HUAWEI E1752 0x1446 3G modem product HUAWEI K3765 0x1465 3G modem product HUAWEI E1820 0x14ac E1820 HSPA+ USB Slider product HUAWEI K3765_INIT 0x1520 K3765 Initial +product HUAWEI E173 0x1c05 3G modem +product HUAWEI E173_INIT 0x1c0b 3G modem initial /* HUAWEI 3com products */ product HUAWEI3COM WUB320G 0x0009 Aolynk WUB320g From 90bc35de385e85cb48397df487713be27026cddd Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 20 Aug 2011 16:43:47 +0000 Subject: [PATCH 294/452] Add an in6_localip() helper function as in6_localaddr() is not doing what people think: returning true for an address in any connected subnet, not necessarily on the local machine. Sponsored by: Sandvine Incorporated MFC after: 2 weeks Approved by: re (kib) --- sys/netinet6/in6.c | 21 +++++++++++++++++++++ sys/netinet6/in6.h | 1 + 2 files changed, 22 insertions(+) diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 39e77e999b8..9bf7a8f44e5 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -2017,6 +2017,27 @@ in6_localaddr(struct in6_addr *in6) return (0); } +/* + * Return 1 if an internet address is for the local host and configured + * on one of its interfaces. + */ +int +in6_localip(struct in6_addr *in6) +{ + struct in6_ifaddr *ia; + + IN6_IFADDR_RLOCK(); + TAILQ_FOREACH(ia, &V_in6_ifaddrhead, ia_link) { + if (IN6_ARE_ADDR_EQUAL(in6, &ia->ia_addr.sin6_addr)) { + IN6_IFADDR_RUNLOCK(); + return (1); + } + } + IN6_IFADDR_RUNLOCK(); + return (0); +} + + int in6_is_addr_deprecated(struct sockaddr_in6 *sa6) { diff --git a/sys/netinet6/in6.h b/sys/netinet6/in6.h index ae0da6aa0ff..5b552c9158d 100644 --- a/sys/netinet6/in6.h +++ b/sys/netinet6/in6.h @@ -631,6 +631,7 @@ struct cmsghdr; int in6_cksum __P((struct mbuf *, u_int8_t, u_int32_t, u_int32_t)); int in6_localaddr __P((struct in6_addr *)); +int in6_localip(struct in6_addr *); int in6_addrscope __P((struct in6_addr *)); struct in6_ifaddr *in6_ifawithifp __P((struct ifnet *, struct in6_addr *)); extern void in6_if_up __P((struct ifnet *)); From 8a006adb24414b61097ec694cc28fb15de51ac2e Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 20 Aug 2011 17:05:11 +0000 Subject: [PATCH 295/452] Add support for IPv6 to ipfw fwd: Distinguish IPv4 and IPv6 addresses and optional port numbers in user space to set the option for the correct protocol family. Add support in the kernel for carrying the new IPv6 destination address and port. Add support to TCP and UDP for IPv6 and fix UDP IPv4 to not change the address in the IP header. Add support for IPv6 forwarding to a non-local destination. Add a regession test uitilizing VIMAGE to check all 20 possible combinations I could think of. Obtained from: David Dolson at Sandvine Incorporated (original version for ipfw fwd IPv6 support) Sponsored by: Sandvine Incorporated PR: bin/117214 MFC after: 4 weeks Approved by: re (kib) --- sbin/ipfw/ipfw.8 | 4 +- sbin/ipfw/ipfw2.c | 108 +++++-- sys/netinet/ip_fw.h | 10 + sys/netinet/ipfw/ip_fw2.c | 18 ++ sys/netinet/ipfw/ip_fw_log.c | 17 +- sys/netinet/ipfw/ip_fw_pfil.c | 37 ++- sys/netinet/ipfw/ip_fw_private.h | 1 + sys/netinet/ipfw/ip_fw_sockopt.c | 11 + sys/netinet/tcp_input.c | 69 +++-- sys/netinet/udp_usrreq.c | 60 ++-- sys/netinet6/ip6_forward.c | 70 ++++- sys/netinet6/ip6_input.c | 31 ++ sys/netinet6/ip6_output.c | 36 ++- sys/netinet6/udp6_usrreq.c | 44 ++- tools/regression/ipfw/fwd/vimage-fwd.sh | 369 ++++++++++++++++++++++++ 15 files changed, 800 insertions(+), 85 deletions(-) create mode 100755 tools/regression/ipfw/fwd/vimage-fwd.sh diff --git a/sbin/ipfw/ipfw.8 b/sbin/ipfw/ipfw.8 index 6fc12c82c13..9d0028736d0 100644 --- a/sbin/ipfw/ipfw.8 +++ b/sbin/ipfw/ipfw.8 @@ -1,7 +1,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 29, 2011 +.Dd August 20, 2011 .Dt IPFW 8 .Os .Sh NAME @@ -726,7 +726,7 @@ The search terminates. Change the next-hop on matching packets to .Ar ipaddr , which can be an IP address or a host name. -The next hop can also be supplied by the last table +For IPv4, the next hop can also be supplied by the last table looked up for the packet by using the .Cm tablearg keyword instead of an explicit address. diff --git a/sbin/ipfw/ipfw2.c b/sbin/ipfw/ipfw2.c index e389e99f81a..615c4d1292d 100644 --- a/sbin/ipfw/ipfw2.c +++ b/sbin/ipfw/ipfw2.c @@ -1111,6 +1111,18 @@ show_ipfw(struct ip_fw *rule, int pcwidth, int bcwidth) } break; + case O_FORWARD_IP6: + { + char buf[4 + INET6_ADDRSTRLEN + 1]; + ipfw_insn_sa6 *s = (ipfw_insn_sa6 *)cmd; + + printf("fwd %s", inet_ntop(AF_INET6, &s->sa.sin6_addr, + buf, sizeof(buf))); + if (s->sa.sin6_port) + printf(",%d", s->sa.sin6_port); + } + break; + case O_LOG: /* O_LOG is printed last */ logptr = (ipfw_insn_log *)cmd; break; @@ -2809,40 +2821,96 @@ chkarg: break; case TOK_FORWARD: { - ipfw_insn_sa *p = (ipfw_insn_sa *)action; + /* + * Locate the address-port separator (':' or ','). + * Could be one of the following: + * hostname:port + * IPv4 a.b.c.d,port + * IPv4 a.b.c.d:port + * IPv6 w:x:y::z,port + * The ':' can only be used with hostname and IPv4 address. + * XXX-BZ Should we also support [w:x:y::z]:port? + */ + struct sockaddr_storage result; + struct addrinfo *res; char *s, *end; + int family; + u_short port_number; NEED1("missing forward address[:port]"); - action->opcode = O_FORWARD_IP; - action->len = F_INSN_SIZE(ipfw_insn_sa); - - /* - * In the kernel we assume AF_INET and use only - * sin_port and sin_addr. Remember to set sin_len as - * the routing code seems to use it too. - */ - p->sa.sin_family = AF_INET; - p->sa.sin_len = sizeof(struct sockaddr_in); - p->sa.sin_port = 0; /* * locate the address-port separator (':' or ',') */ - s = strchr(*av, ':'); - if (s == NULL) - s = strchr(*av, ','); + s = strchr(*av, ','); + if (s == NULL) { + /* Distinguish between IPv4:port and IPv6 cases. */ + s = strchr(*av, ':'); + if (s && strchr(s+1, ':')) + s = NULL; /* no port */ + } + + port_number = 0; if (s != NULL) { + /* Terminate host portion and set s to start of port. */ *(s++) = '\0'; i = strtoport(s, &end, 0 /* base */, 0 /* proto */); if (s == end) errx(EX_DATAERR, "illegal forwarding port ``%s''", s); - p->sa.sin_port = (u_short)i; + port_number = (u_short)i; + } + + if (_substrcmp(*av, "tablearg") == 0) { + family = PF_INET; + ((struct sockaddr_in*)&result)->sin_addr.s_addr = + INADDR_ANY; + } else { + /* + * Resolve the host name or address to a family and a + * network representation of the addres. + */ + if (getaddrinfo(*av, NULL, NULL, &res)) + errx(EX_DATAERR, NULL); + /* Just use the first host in the answer. */ + family = res->ai_family; + memcpy(&result, res->ai_addr, res->ai_addrlen); + freeaddrinfo(res); + } + + if (family == PF_INET) { + ipfw_insn_sa *p = (ipfw_insn_sa *)action; + + action->opcode = O_FORWARD_IP; + action->len = F_INSN_SIZE(ipfw_insn_sa); + + /* + * In the kernel we assume AF_INET and use only + * sin_port and sin_addr. Remember to set sin_len as + * the routing code seems to use it too. + */ + p->sa.sin_len = sizeof(struct sockaddr_in); + p->sa.sin_family = AF_INET; + p->sa.sin_port = port_number; + p->sa.sin_addr.s_addr = + ((struct sockaddr_in *)&result)->sin_addr.s_addr; + } else if (family == PF_INET6) { + ipfw_insn_sa6 *p = (ipfw_insn_sa6 *)action; + + action->opcode = O_FORWARD_IP6; + action->len = F_INSN_SIZE(ipfw_insn_sa6); + + p->sa.sin6_len = sizeof(struct sockaddr_in6); + p->sa.sin6_family = AF_INET6; + p->sa.sin6_port = port_number; + p->sa.sin6_flowinfo = 0; + p->sa.sin6_scope_id = 0; + /* No table support for v6 yet. */ + bcopy(&((struct sockaddr_in6*)&result)->sin6_addr, + &p->sa.sin6_addr, sizeof(p->sa.sin6_addr)); + } else { + errx(EX_DATAERR, "Invalid address family in forward action"); } - if (_substrcmp(*av, "tablearg") == 0) - p->sa.sin_addr.s_addr = INADDR_ANY; - else - lookup_host(*av, &(p->sa.sin_addr)); av++; break; } diff --git a/sys/netinet/ip_fw.h b/sys/netinet/ip_fw.h index ff3a67fe61c..f6f8fcd876f 100644 --- a/sys/netinet/ip_fw.h +++ b/sys/netinet/ip_fw.h @@ -203,6 +203,8 @@ enum ipfw_opcodes { /* arguments (4 byte each) */ O_CALLRETURN, /* arg1=called rule number */ + O_FORWARD_IP6, /* fwd sockaddr_in6 */ + O_LAST_OPCODE /* not an opcode! */ }; @@ -298,6 +300,14 @@ typedef struct _ipfw_insn_sa { struct sockaddr_in sa; } ipfw_insn_sa; +/* + * This is used to forward to a given address (ipv6). + */ +typedef struct _ipfw_insn_sa6 { + ipfw_insn o; + struct sockaddr_in6 sa; +} ipfw_insn_sa6; + /* * This is used for MAC addr-mask pairs. */ diff --git a/sys/netinet/ipfw/ip_fw2.c b/sys/netinet/ipfw/ip_fw2.c index e4e64e44f16..c3123dfa11b 100644 --- a/sys/netinet/ipfw/ip_fw2.c +++ b/sys/netinet/ipfw/ip_fw2.c @@ -796,6 +796,7 @@ set_match(struct ip_fw_args *args, int slot, * * args->rule Pointer to the last matching rule (in/out) * args->next_hop Socket we are forwarding to (out). + * args->next_hop6 IPv6 next hop we are forwarding to (out). * args->f_id Addresses grabbed from the packet (out) * args->rule.info a cookie depending on rule action * @@ -2281,6 +2282,23 @@ do { \ done = 1; /* exit outer loop */ break; +#ifdef INET6 + case O_FORWARD_IP6: + if (args->eh) /* not valid on layer2 pkts */ + break; + if (q == NULL || q->rule != f || + dyn_dir == MATCH_FORWARD) { + struct sockaddr_in6 *sin6; + + sin6 = &(((ipfw_insn_sa6 *)cmd)->sa); + args->next_hop6 = sin6; + } + retval = IP_FW_PASS; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; +#endif + case O_NETGRAPH: case O_NGTEE: set_match(args, f_pos, chain); diff --git a/sys/netinet/ipfw/ip_fw_log.c b/sys/netinet/ipfw/ip_fw_log.c index edfa07d183c..64548135c28 100644 --- a/sys/netinet/ipfw/ip_fw_log.c +++ b/sys/netinet/ipfw/ip_fw_log.c @@ -167,7 +167,7 @@ ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, { char *action; int limit_reached = 0; - char action2[40], proto[128], fragment[32]; + char action2[92], proto[128], fragment[32]; if (V_fw_verbose == 0) { #ifndef WITHOUT_BPF @@ -290,6 +290,21 @@ ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, sa->sa.sin_port); } break; +#ifdef INET6 + case O_FORWARD_IP6: { + char buf[INET6_ADDRSTRLEN]; + ipfw_insn_sa6 *sa = (ipfw_insn_sa6 *)cmd; + int len; + + len = snprintf(SNPARGS(action2, 0), "Forward to [%s]", + ip6_sprintf(buf, &sa->sa.sin6_addr)); + + if (sa->sa.sin6_port) + snprintf(SNPARGS(action2, len), ":%u", + sa->sa.sin6_port); + } + break; +#endif case O_NETGRAPH: snprintf(SNPARGS(action2, 0), "Netgraph %d", cmd->arg1); diff --git a/sys/netinet/ipfw/ip_fw_pfil.c b/sys/netinet/ipfw/ip_fw_pfil.c index 736615b947a..2aaa8457ea7 100644 --- a/sys/netinet/ipfw/ip_fw_pfil.c +++ b/sys/netinet/ipfw/ip_fw_pfil.c @@ -152,13 +152,26 @@ again: switch (ipfw) { case IP_FW_PASS: /* next_hop may be set by ipfw_chk */ - if (args.next_hop == NULL) + if (args.next_hop == NULL && args.next_hop6 == NULL) break; /* pass */ #ifndef IPFIREWALL_FORWARD ret = EACCES; #else { struct m_tag *fwd_tag; + size_t len; + + KASSERT(args.next_hop == NULL || args.next_hop6 == NULL, + ("%s: both next_hop=%p and next_hop6=%p not NULL", __func__, + args.next_hop, args.next_hop6)); +#ifdef INET6 + if (args.next_hop6 != NULL) + len = sizeof(struct sockaddr_in6); +#endif +#ifdef INET + if (args.next_hop != NULL) + len = sizeof(struct sockaddr_in); +#endif /* Incoming packets should not be tagged so we do not * m_tag_find. Outgoing packets may be tagged, so we @@ -169,18 +182,28 @@ again: if (fwd_tag != NULL) { m_tag_unlink(*m0, fwd_tag); } else { - fwd_tag = m_tag_get(PACKET_TAG_IPFORWARD, - sizeof(struct sockaddr_in), M_NOWAIT); + fwd_tag = m_tag_get(PACKET_TAG_IPFORWARD, len, + M_NOWAIT); if (fwd_tag == NULL) { ret = EACCES; break; /* i.e. drop */ } } - bcopy(args.next_hop, (fwd_tag+1), sizeof(struct sockaddr_in)); +#ifdef INET6 + if (args.next_hop6 != NULL) { + bcopy(args.next_hop6, (fwd_tag+1), len); + if (in6_localip(&args.next_hop6->sin6_addr)) + (*m0)->m_flags |= M_FASTFWD_OURS; + } +#endif +#ifdef INET + if (args.next_hop != NULL) { + bcopy(args.next_hop, (fwd_tag+1), len); + if (in_localip(args.next_hop->sin_addr)) + (*m0)->m_flags |= M_FASTFWD_OURS; + } +#endif m_tag_prepend(*m0, fwd_tag); - - if (in_localip(args.next_hop->sin_addr)) - (*m0)->m_flags |= M_FASTFWD_OURS; } #endif break; diff --git a/sys/netinet/ipfw/ip_fw_private.h b/sys/netinet/ipfw/ip_fw_private.h index 16ef46d574e..fdb2b77f88b 100644 --- a/sys/netinet/ipfw/ip_fw_private.h +++ b/sys/netinet/ipfw/ip_fw_private.h @@ -86,6 +86,7 @@ struct ip_fw_args { struct mbuf *m; /* the mbuf chain */ struct ifnet *oif; /* output interface */ struct sockaddr_in *next_hop; /* forward address */ + struct sockaddr_in6 *next_hop6; /* ipv6 forward address */ /* * On return, it points to the matching rule. diff --git a/sys/netinet/ipfw/ip_fw_sockopt.c b/sys/netinet/ipfw/ip_fw_sockopt.c index 14328585011..375b9c506e4 100644 --- a/sys/netinet/ipfw/ip_fw_sockopt.c +++ b/sys/netinet/ipfw/ip_fw_sockopt.c @@ -723,6 +723,17 @@ check_ipfw_struct(struct ip_fw *rule, int size) return EINVAL; #endif +#ifdef INET6 + case O_FORWARD_IP6: +#ifdef IPFIREWALL_FORWARD + if (cmdlen != F_INSN_SIZE(ipfw_insn_sa6)) + goto bad_size; + goto check_action; +#else + return (EINVAL); +#endif +#endif /* INET6 */ + case O_DIVERT: case O_TEE: if (ip_divert_ptr == NULL) diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index e3e9aa6c745..24680c24fab 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -573,11 +573,9 @@ tcp_input(struct mbuf *m, int off0) uint8_t sig_checked = 0; #endif uint8_t iptos = 0; -#ifdef INET #ifdef IPFIREWALL_FORWARD struct m_tag *fwd_tag; #endif -#endif /* INET */ #ifdef INET6 struct ip6_hdr *ip6 = NULL; int isipv6; @@ -776,14 +774,55 @@ findpcb: } #endif -#ifdef INET #ifdef IPFIREWALL_FORWARD /* * Grab info from PACKET_TAG_IPFORWARD tag prepended to the chain. */ fwd_tag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL); +#endif /* IPFIREWALL_FORWARD */ - if (fwd_tag != NULL && isipv6 == 0) { /* IPv6 support is not yet */ +#ifdef INET6 +#ifdef IPFIREWALL_FORWARD + if (isipv6 && fwd_tag != NULL) { + struct sockaddr_in6 *next_hop6; + + next_hop6 = (struct sockaddr_in6 *)(fwd_tag + 1); + /* + * Transparently forwarded. Pretend to be the destination. + * Already got one like this? + */ + inp = in6_pcblookup_mbuf(&V_tcbinfo, + &ip6->ip6_src, th->th_sport, &ip6->ip6_dst, th->th_dport, + INPLOOKUP_WLOCKPCB, m->m_pkthdr.rcvif, m); + if (!inp) { + /* + * It's new. Try to find the ambushing socket. + * Because we've rewritten the destination address, + * any hardware-generated hash is ignored. + */ + inp = in6_pcblookup(&V_tcbinfo, &ip6->ip6_src, + th->th_sport, &next_hop6->sin6_addr, + next_hop6->sin6_port ? ntohs(next_hop6->sin6_port) : + th->th_dport, INPLOOKUP_WILDCARD | + INPLOOKUP_WLOCKPCB, m->m_pkthdr.rcvif); + } + /* Remove the tag from the packet. We don't need it anymore. */ + m_tag_delete(m, fwd_tag); + } else +#endif /* IPFIREWALL_FORWARD */ + if (isipv6) { + inp = in6_pcblookup_mbuf(&V_tcbinfo, &ip6->ip6_src, + th->th_sport, &ip6->ip6_dst, th->th_dport, + INPLOOKUP_WILDCARD | INPLOOKUP_WLOCKPCB, + m->m_pkthdr.rcvif, m); + } +#endif /* INET6 */ +#if defined(INET6) && defined(INET) + else +#endif +#ifdef INET +#ifdef IPFIREWALL_FORWARD + if (fwd_tag != NULL) { struct sockaddr_in *next_hop; next_hop = (struct sockaddr_in *)(fwd_tag+1); @@ -810,25 +849,11 @@ findpcb: m_tag_delete(m, fwd_tag); } else #endif /* IPFIREWALL_FORWARD */ + inp = in_pcblookup_mbuf(&V_tcbinfo, ip->ip_src, + th->th_sport, ip->ip_dst, th->th_dport, + INPLOOKUP_WILDCARD | INPLOOKUP_WLOCKPCB, + m->m_pkthdr.rcvif, m); #endif /* INET */ - { -#ifdef INET6 - if (isipv6) - inp = in6_pcblookup_mbuf(&V_tcbinfo, &ip6->ip6_src, - th->th_sport, &ip6->ip6_dst, th->th_dport, - INPLOOKUP_WILDCARD | INPLOOKUP_WLOCKPCB, - m->m_pkthdr.rcvif, m); -#endif -#if defined(INET) && defined(INET6) - else -#endif -#ifdef INET - inp = in_pcblookup_mbuf(&V_tcbinfo, ip->ip_src, - th->th_sport, ip->ip_dst, th->th_dport, - INPLOOKUP_WILDCARD | INPLOOKUP_WLOCKPCB, - m->m_pkthdr.rcvif, m); -#endif - } /* * If the INPCB does not exist then all data in the incoming diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 28eb8fd19f8..701bc358ab9 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -441,28 +441,6 @@ udp_input(struct mbuf *m, int off) } else UDPSTAT_INC(udps_nosum); -#ifdef IPFIREWALL_FORWARD - /* - * Grab info from PACKET_TAG_IPFORWARD tag prepended to the chain. - */ - fwd_tag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL); - if (fwd_tag != NULL) { - struct sockaddr_in *next_hop; - - /* - * Do the hack. - */ - next_hop = (struct sockaddr_in *)(fwd_tag + 1); - ip->ip_dst = next_hop->sin_addr; - uh->uh_dport = ntohs(next_hop->sin_port); - - /* - * Remove the tag from the packet. We don't need it anymore. - */ - m_tag_delete(m, fwd_tag); - } -#endif - if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr)) || in_broadcast(ip->ip_dst, ifp)) { struct inpcb *last; @@ -568,9 +546,41 @@ udp_input(struct mbuf *m, int off) /* * Locate pcb for datagram. */ - inp = in_pcblookup_mbuf(&V_udbinfo, ip->ip_src, uh->uh_sport, - ip->ip_dst, uh->uh_dport, INPLOOKUP_WILDCARD | INPLOOKUP_RLOCKPCB, - ifp, m); +#ifdef IPFIREWALL_FORWARD + /* + * Grab info from PACKET_TAG_IPFORWARD tag prepended to the chain. + */ + fwd_tag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL); + if (fwd_tag != NULL) { + struct sockaddr_in *next_hop; + + next_hop = (struct sockaddr_in *)(fwd_tag + 1); + + /* + * Transparently forwarded. Pretend to be the destination. + * Already got one like this? + */ + inp = in_pcblookup_mbuf(&V_udbinfo, ip->ip_src, uh->uh_sport, + ip->ip_dst, uh->uh_dport, INPLOOKUP_RLOCKPCB, ifp, m); + if (!inp) { + /* + * It's new. Try to find the ambushing socket. + * Because we've rewritten the destination address, + * any hardware-generated hash is ignored. + */ + inp = in_pcblookup(&V_udbinfo, ip->ip_src, + uh->uh_sport, next_hop->sin_addr, + next_hop->sin_port ? htons(next_hop->sin_port) : + uh->uh_dport, INPLOOKUP_WILDCARD | + INPLOOKUP_RLOCKPCB, ifp); + } + /* Remove the tag from the packet. We don't need it anymore. */ + m_tag_delete(m, fwd_tag); + } else +#endif /* IPFIREWALL_FORWARD */ + inp = in_pcblookup_mbuf(&V_udbinfo, ip->ip_src, uh->uh_sport, + ip->ip_dst, uh->uh_dport, INPLOOKUP_WILDCARD | + INPLOOKUP_RLOCKPCB, ifp, m); if (inp == NULL) { if (udp_log_in_vain) { char buf[4*sizeof "123"]; diff --git a/sys/netinet6/ip6_forward.c b/sys/netinet6/ip6_forward.c index cff29e19be5..77cb9266307 100644 --- a/sys/netinet6/ip6_forward.c +++ b/sys/netinet6/ip6_forward.c @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" #include "opt_inet6.h" +#include "opt_ipfw.h" #include "opt_ipsec.h" #include "opt_ipstealth.h" @@ -50,6 +51,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -98,10 +100,16 @@ ip6_forward(struct mbuf *m, int srcrt) struct mbuf *mcopy = NULL; struct ifnet *origifp; /* maybe unnecessary */ u_int32_t inzone, outzone; - struct in6_addr src_in6, dst_in6; + struct in6_addr src_in6, dst_in6, odst; #ifdef IPSEC struct secpolicy *sp = NULL; int ipsecrt = 0; +#endif +#ifdef SCTP + int sw_csum; +#endif +#ifdef IPFIREWALL_FORWARD + struct m_tag *fwd_tag; #endif char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN]; @@ -345,13 +353,15 @@ ip6_forward(struct mbuf *m, int srcrt) goto skip_routing; skip_ipsec: #endif - +again: bzero(&rin6, sizeof(struct route_in6)); dst = (struct sockaddr_in6 *)&rin6.ro_dst; dst->sin6_len = sizeof(struct sockaddr_in6); dst->sin6_family = AF_INET6; dst->sin6_addr = ip6->ip6_dst; - +#ifdef IPFIREWALL_FORWARD +again2: +#endif rin6.ro_rt = rtalloc1((struct sockaddr *)dst, 0, 0); if (rin6.ro_rt != NULL) RT_UNLOCK(rin6.ro_rt); @@ -554,6 +564,7 @@ skip_routing: if (!PFIL_HOOKED(&V_inet6_pfil_hook)) goto pass; + odst = ip6->ip6_dst; /* Run through list of hooks for output packets. */ error = pfil_run_hooks(&V_inet6_pfil_hook, &m, rt->rt_ifp, PFIL_OUT, NULL); if (error != 0) @@ -562,6 +573,59 @@ skip_routing: goto freecopy; ip6 = mtod(m, struct ip6_hdr *); + /* See if destination IP address was changed by packet filter. */ + if (!IN6_ARE_ADDR_EQUAL(&odst, &ip6->ip6_dst)) { + m->m_flags |= M_SKIP_FIREWALL; + /* If destination is now ourself drop to ip6_input(). */ + if (in6_localip(&ip6->ip6_dst)) { + m->m_flags |= M_FASTFWD_OURS; + if (m->m_pkthdr.rcvif == NULL) + m->m_pkthdr.rcvif = V_loif; + if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { + m->m_pkthdr.csum_flags |= + CSUM_DATA_VALID | CSUM_PSEUDO_HDR; + m->m_pkthdr.csum_data = 0xffff; + } + m->m_pkthdr.csum_flags |= + CSUM_IP_CHECKED | CSUM_IP_VALID; +#ifdef SCTP + if (m->m_pkthdr.csum_flags & CSUM_SCTP) + m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID; +#endif + error = netisr_queue(NETISR_IPV6, m); + goto out; + } else + goto again; /* Redo the routing table lookup. */ + } + +#ifdef IPFIREWALL_FORWARD + /* See if local, if yes, send it to netisr. */ + if (m->m_flags & M_FASTFWD_OURS) { + if (m->m_pkthdr.rcvif == NULL) + m->m_pkthdr.rcvif = V_loif; + if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { + m->m_pkthdr.csum_flags |= + CSUM_DATA_VALID | CSUM_PSEUDO_HDR; + m->m_pkthdr.csum_data = 0xffff; + } +#ifdef SCTP + if (m->m_pkthdr.csum_flags & CSUM_SCTP) + m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID; +#endif + error = netisr_queue(NETISR_IPV6, m); + goto out; + } + /* Or forward to some other address? */ + fwd_tag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL); + if (fwd_tag) { + dst = (struct sockaddr_in6 *)&rin6.ro_dst; + bcopy((fwd_tag+1), dst, sizeof(struct sockaddr_in6)); + m->m_flags |= M_SKIP_FIREWALL; + m_tag_delete(m, fwd_tag); + goto again2; + } +#endif /* IPFIREWALL_FORWARD */ + pass: error = nd6_output(rt->rt_ifp, origifp, m, dst, rt); if (error) { diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index de3a622706b..1fdde166228 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -65,6 +65,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" #include "opt_inet6.h" +#include "opt_ipfw.h" #include "opt_ipsec.h" #include "opt_route.h" @@ -91,6 +92,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #ifdef INET @@ -357,6 +359,17 @@ ip6_input(struct mbuf *m) */ ip6_delaux(m); + if (m->m_flags & M_FASTFWD_OURS) { + /* + * Firewall changed destination to local. + */ + m->m_flags &= ~M_FASTFWD_OURS; + ours = 1; + deliverifp = m->m_pkthdr.rcvif; + ip6 = mtod(m, struct ip6_hdr *); + goto hbhcheck; + } + /* * mbuf statistics */ @@ -533,6 +546,24 @@ ip6_input(struct mbuf *m) ip6 = mtod(m, struct ip6_hdr *); srcrt = !IN6_ARE_ADDR_EQUAL(&odst, &ip6->ip6_dst); +#ifdef IPFIREWALL_FORWARD + if (m->m_flags & M_FASTFWD_OURS) { + m->m_flags &= ~M_FASTFWD_OURS; + ours = 1; + deliverifp = m->m_pkthdr.rcvif; + goto hbhcheck; + } + if (m_tag_find(m, PACKET_TAG_IPFORWARD, NULL) != NULL) { + /* + * Directly ship the packet on. This allows forwarding + * packets originally destined to us to some other directly + * connected host. + */ + ip6_forward(m, 1); + goto out; + } +#endif /* IPFIREWALL_FORWARD */ + passin: /* * Disambiguate address scope zones (if there is ambiguity). diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c index 973689c7aa9..85161247d7e 100644 --- a/sys/netinet6/ip6_output.c +++ b/sys/netinet6/ip6_output.c @@ -65,6 +65,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" #include "opt_inet6.h" +#include "opt_ipfw.h" #include "opt_ipsec.h" #include "opt_sctp.h" #include "opt_route.h" @@ -90,6 +91,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -229,6 +231,9 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt, int segleft_org = 0; struct secpolicy *sp = NULL; #endif /* IPSEC */ +#ifdef IPFIREWALL_FORWARD + struct m_tag *fwd_tag; +#endif ip6 = mtod(m, struct ip6_hdr *); if (ip6 == NULL) { @@ -850,7 +855,8 @@ again: if (!IN6_ARE_ADDR_EQUAL(&odst, &ip6->ip6_dst)) { m->m_flags |= M_SKIP_FIREWALL; /* If destination is now ourself drop to ip6_input(). */ - if (in6_localaddr(&ip6->ip6_dst)) { + if (in6_localip(&ip6->ip6_dst)) { + m->m_flags |= M_FASTFWD_OURS; if (m->m_pkthdr.rcvif == NULL) m->m_pkthdr.rcvif = V_loif; if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { @@ -870,7 +876,33 @@ again: goto again; /* Redo the routing table lookup. */ } - /* XXX: IPFIREWALL_FORWARD */ +#ifdef IPFIREWALL_FORWARD + /* See if local, if yes, send it to netisr. */ + if (m->m_flags & M_FASTFWD_OURS) { + if (m->m_pkthdr.rcvif == NULL) + m->m_pkthdr.rcvif = V_loif; + if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) { + m->m_pkthdr.csum_flags |= + CSUM_DATA_VALID | CSUM_PSEUDO_HDR; + m->m_pkthdr.csum_data = 0xffff; + } +#ifdef SCTP + if (m->m_pkthdr.csum_flags & CSUM_SCTP) + m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID; +#endif + error = netisr_queue(NETISR_IPV6, m); + goto done; + } + /* Or forward to some other address? */ + fwd_tag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL); + if (fwd_tag) { + dst = (struct sockaddr_in6 *)&ro->ro_dst; + bcopy((fwd_tag+1), dst, sizeof(struct sockaddr_in6)); + m->m_flags |= M_SKIP_FIREWALL; + m_tag_delete(m, fwd_tag); + goto again; + } +#endif /* IPFIREWALL_FORWARD */ passout: /* diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index 67230074818..2a4c0a55a46 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -71,6 +71,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" #include "opt_inet6.h" +#include "opt_ipfw.h" #include "opt_ipsec.h" #include @@ -181,6 +182,9 @@ udp6_input(struct mbuf **mp, int *offp, int proto) int off = *offp; int plen, ulen; struct sockaddr_in6 fromsa; +#ifdef IPFIREWALL_FORWARD + struct m_tag *fwd_tag; +#endif ifp = m->m_pkthdr.rcvif; ip6 = mtod(m, struct ip6_hdr *); @@ -377,9 +381,43 @@ udp6_input(struct mbuf **mp, int *offp, int proto) /* * Locate pcb for datagram. */ - inp = in6_pcblookup_mbuf(&V_udbinfo, &ip6->ip6_src, uh->uh_sport, - &ip6->ip6_dst, uh->uh_dport, INPLOOKUP_WILDCARD | - INPLOOKUP_RLOCKPCB, m->m_pkthdr.rcvif, m); +#ifdef IPFIREWALL_FORWARD + /* + * Grab info from PACKET_TAG_IPFORWARD tag prepended to the chain. + */ + fwd_tag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL); + if (fwd_tag != NULL) { + struct sockaddr_in6 *next_hop6; + + next_hop6 = (struct sockaddr_in6 *)(fwd_tag + 1); + + /* + * Transparently forwarded. Pretend to be the destination. + * Already got one like this? + */ + inp = in6_pcblookup_mbuf(&V_udbinfo, + &ip6->ip6_src, uh->uh_sport, &ip6->ip6_dst, uh->uh_dport, + INPLOOKUP_RLOCKPCB, m->m_pkthdr.rcvif, m); + if (!inp) { + /* + * It's new. Try to find the ambushing socket. + * Because we've rewritten the destination address, + * any hardware-generated hash is ignored. + */ + inp = in6_pcblookup(&V_udbinfo, &ip6->ip6_src, + uh->uh_sport, &next_hop6->sin6_addr, + next_hop6->sin6_port ? htons(next_hop6->sin6_port) : + uh->uh_dport, INPLOOKUP_WILDCARD | + INPLOOKUP_RLOCKPCB, m->m_pkthdr.rcvif); + } + /* Remove the tag from the packet. We don't need it anymore. */ + m_tag_delete(m, fwd_tag); + } else +#endif /* IPFIREWALL_FORWARD */ + inp = in6_pcblookup_mbuf(&V_udbinfo, &ip6->ip6_src, + uh->uh_sport, &ip6->ip6_dst, uh->uh_dport, + INPLOOKUP_WILDCARD | INPLOOKUP_RLOCKPCB, + m->m_pkthdr.rcvif, m); if (inp == NULL) { if (udp_log_in_vain) { char ip6bufs[INET6_ADDRSTRLEN]; diff --git a/tools/regression/ipfw/fwd/vimage-fwd.sh b/tools/regression/ipfw/fwd/vimage-fwd.sh new file mode 100755 index 00000000000..5dbfcd77b45 --- /dev/null +++ b/tools/regression/ipfw/fwd/vimage-fwd.sh @@ -0,0 +1,369 @@ +#!/bin/sh +#- +# Copyright (c) 2010, "Bjoern A. Zeeb" +# Copyright (c) 2011, Sandvine Incorporated ULC. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +# +# Test ipfw fwd for IPv4 and IPv6 using VIMAGE, testing that as well. +# For no test the packet header contents must be changed but always +# keeping the original destination. +# + +case `id -u` in +0) ;; +*) echo "ERROR: Must be run as superuser." >&2 + exit 2 +esac + +epair_base() +{ + local ep + + ep=`ifconfig epair create` + expr ${ep} : '\(.*\).' +} + +debug_err() +{ + local _p + _p="$1" + + case "${DEBUG}" in + "") ;; + *) + echo " ~~ start of debug ~~" + echo " ~~ left:" + jexec ${ljid} /sbin/ipfw show + echo " ~~ middle:" + jexec ${mjid} /sbin/ipfw show + echo " ~~ right:" + jexec ${rjid} /sbin/ipfw show + echo " ~~ result file:" + cat ${_p}.1 + echo " ~~ log file:" + cat ${_p} + echo " ~~ end of debug ~~" + ;; + esac +} + +check_cleanup_result_file() +{ + local _p + _p="$1" + + if test ! -s ${_p}.1; then + echo "FAIL (output file empty)." + debug_err ${_p} + else + read line < ${_p}.1 + # Netcat adds 'X's in udp mode. + l="/${line#*/}" + if test "${l}" = "${_p}"; then + echo "PASS." + else + echo "FAIL (expected: '${_p}' got '${l}')." + debug_err ${_p} + fi + fi + + rm -f ${_p}.1 + rm -f ${_p} +} + +# Transparent proxy scenario (local address). +run_test_tp() +{ + local _descr + local _sip _dip _fip _fport _dport _p + local _nc_af _nc_p + local _lport + descr="$1" + _sip="$2" + _dip="$3" + _fip="$4" + _fport="$5" + _dport="$6" + _p="$7" + _nc_af="$8" + + _lport=${_dport} + case "${_fport}" in + "") _lport="${_dport}" ;; + *) _lport="${_fport#,}" ;; + esac + + case "${_p}" in + udp) _nc_p="-u" ;; + esac + + OUT=`mktemp -t "ipfwfwd$$-XXXXXX"` + echo -n "${descr} (${OUT}).." + ( + jexec ${ljid} /sbin/ipfw -f flush + jexec ${ljid} /sbin/ipfw -f zero + jexec ${mjid} /sbin/ipfw -f flush + jexec ${mjid} /sbin/ipfw -f zero + jexec ${rjid} /sbin/ipfw -f flush + jexec ${rjid} /sbin/ipfw -f zero + jexec ${mjid} /sbin/ipfw add 100 fwd ${_fip}${_fport} ${_p} from ${_sip} to ${_dip} + + jexec ${mjid} /bin/sh -c "nc -w 10 ${_nc_af} -n ${_nc_p} -l ${_fip} ${_lport} > ${OUT}.1 &" + jexec ${rjid} /bin/sh -c "echo '${OUT}' | nc -w 1 -v ${_nc_af} -n ${_nc_p} ${_dip} ${_dport}" + ) > ${OUT} 2>&1 + check_cleanup_result_file "${OUT}" +} + +# Transparent redirect scenario (non-local address). +run_test_nh() +{ + local _descr + local _sip _dip _fip _fport _dport _p + local _nc_af _nc_p + local _lport + descr="$1" + _sip="$2" + _dip="$3" + _fip="$4" + _fport="$5" + _dport="$6" + _p="$7" + _nc_af="$8" + + _lport=${_dport} + case "${_fport}" in + "") _lport="${_dport}" ;; + *) _lport="${_fport#,}" ;; + esac + + case "${_p}" in + udp) _nc_p="-u" ;; + esac + + OUT=`mktemp -t "ipfwfwd$$-XXXXXX"` + echo -n "${descr} (${OUT}).." + ( + jexec ${ljid} /sbin/ipfw -f flush + jexec ${ljid} /sbin/ipfw -f zero + jexec ${mjid} /sbin/ipfw -f flush + jexec ${mjid} /sbin/ipfw -f zero + jexec ${rjid} /sbin/ipfw -f flush + jexec ${rjid} /sbin/ipfw -f zero + jexec ${mjid} /sbin/ipfw add 100 fwd ${_fip} ${_p} from ${_sip} to ${_dip} + + jexec ${ljid} /bin/sh -c "nc -w 10 ${_nc_af} -n ${_nc_p} -l ${_dip} ${_lport} > ${OUT}.1 &" + jexec ${rjid} /bin/sh -c "echo '${OUT}' | nc -w 1 -v ${_nc_af} -n ${_nc_p} ${_dip} ${_dport}" + ) > ${OUT} 2>&1 + check_cleanup_result_file "${OUT}" +} + +echo "==> Setting up test network" +kldload -q ipfw > /dev/null 2>&1 + +# Start left (sender) jail. +ljid=`jail -i -c -n lef$$ host.hostname=left.example.net vnet persist` + +# Start middle (ipfw) jail. +mjid=`jail -i -c -n mid$$ host.hostname=center.example.net vnet persist` + +# Start right (non-local ip redirects go to here) jail. +rjid=`jail -i -c -n right$$ host.hostname=right.example.net vnet persist` + +echo "left ${ljid} middle ${mjid} right ${rjid}" + +# Create networking. +# +# jail: left middle right +# ifaces: lmep:a ---- lmep:b mrep:a ---- mrep:b +# + +jexec ${mjid} sysctl net.inet.ip.forwarding=1 +jexec ${mjid} sysctl net.inet6.ip6.forwarding=1 +jexec ${mjid} sysctl net.inet6.ip6.accept_rtadv=0 + +lmep=$(epair_base) +ifconfig ${lmep}a vnet ${ljid} +ifconfig ${lmep}b vnet ${mjid} + +jexec ${ljid} ifconfig lo0 inet 127.0.0.1/8 +jexec ${ljid} ifconfig lo0 inet 192.0.2.5/32 alias # Test 9-10 +jexec ${ljid} ifconfig lo0 inet6 2001:db8:1::1/128 alias # Test 11-12 +jexec ${ljid} ifconfig ${lmep}a inet 192.0.2.1/30 up +jexec ${ljid} ifconfig ${lmep}a inet6 2001:db8::1/64 alias + +jexec ${ljid} route add default 192.0.2.2 +jexec ${ljid} route add -inet6 default 2001:db8::2 + +jexec ${mjid} ifconfig lo0 inet 127.0.0.1/8 +jexec ${mjid} ifconfig lo0 inet 192.0.2.255/32 alias # Test 1-4 +jexec ${mjid} ifconfig lo0 inet6 2001:db8:ffff::1/128 alias # Test 5-8 +jexec ${mjid} ifconfig ${lmep}b inet 192.0.2.2/30 up +jexec ${mjid} ifconfig ${lmep}b inet6 2001:db8::2/64 alias +jexec ${mjid} route add default 192.0.2.1 + +mrep=$(epair_base) +ifconfig ${mrep}a vnet ${mjid} +ifconfig ${mrep}b vnet ${rjid} + +jexec ${mjid} ifconfig ${mrep}a inet 192.0.2.5/30 up +jexec ${mjid} ifconfig ${mrep}a inet6 2001:db8:1::1/64 alias + +jexec ${rjid} ifconfig lo0 inet 127.0.0.1/8 +jexec ${rjid} ifconfig ${mrep}b inet 192.0.2.6/30 up +jexec ${rjid} ifconfig ${mrep}b inet6 2001:db8:1::2/64 alias + +jexec ${rjid} route add default 192.0.2.5 +jexec ${rjid} route add -inet6 default 2001:db8:1::1 + +# ------------------------------------------------------------------------------ +# Tests +# +# The jails are not chrooted to they all share the same base filesystem. +# This means we can put results into /tmp and just collect them from here. +# +echo "==> Running tests" + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +i=1 +run_test_tp "TEST ${i} IPv4 UDP redirect local to other local address, same port" \ + 192.0.2.6 192.0.2.5 192.0.2.255 "" 12345 udp "-4" + +i=$((i + 1)) +run_test_tp "TEST ${i} IPv4 UDP redirect local to other local address, different port" \ + 192.0.2.6 192.0.2.5 192.0.2.255 ",65534" 12345 udp "-4" + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +i=$((i + 1)) +run_test_tp "TEST ${i} IPv4 TCP redirect local to other local address, same port" \ + 192.0.2.6 192.0.2.5 192.0.2.255 "" 12345 tcp "-4" + +i=$((i + 1)) +run_test_tp "TEST ${i} IPv4 TCP redirect local to other local address, different port" \ + 192.0.2.6 192.0.2.5 192.0.2.255 ",65534" 12345 tcp "-4" + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +i=$((i + 1)) +run_test_tp "TEST ${i} IPv4 UDP redirect foreign to local address, same port" \ + 192.0.2.6 192.0.2.1 192.0.2.255 "" 12345 udp "-4" + +i=$((i + 1)) +run_test_tp "TEST ${i} IPv4 UDP redirect foreign to local address, different port" \ + 192.0.2.6 192.0.2.1 192.0.2.255 ",65534" 12345 udp "-4" + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +i=$((i + 1)) +run_test_tp "TEST ${i} IPv4 TCP redirect foreign to local address, same port" \ + 192.0.2.6 192.0.2.1 192.0.2.255 "" 12345 tcp "-4" + +i=$((i + 1)) +run_test_tp "TEST ${i} IPv4 TCP redirect foreign to local address, different port" \ + 192.0.2.6 192.0.2.1 192.0.2.255 ",65534" 12345 tcp "-4" + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +i=$((i + 1)) +run_test_tp "TEST ${i} IPv6 UDP redirect local to other local address, same port" \ + 2001:db8:1::2 2001:db8::1 2001:db8:ffff::1 "" 12345 udp "-6" + +i=$((i + 1)) +run_test_tp "TEST ${i} IPv6 UDP redirect local to other local address, different port" \ + 2001:db8:1::2 2001:db8::1 2001:db8:ffff::1 ",65534" 12345 udp "-6" + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +i=$((i + 1)) +run_test_tp "TEST ${i} IPv6 TCP redirect local to other local address, same port" \ + 2001:db8:1::2 2001:db8::1 2001:db8:ffff::1 "" 12345 tcp "-6" + +i=$((i + 1)) +run_test_tp "TEST ${i} IPv6 TCP redirect local to other local address, different port" \ + 2001:db8:1::2 2001:db8::1 2001:db8:ffff::1 ",65534" 12345 tcp "-6" + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +i=$((i + 1)) +run_test_tp "TEST ${i} IPv6 UDP redirect foreign to local address, same port" \ + 2001:db8:1::2 2001:db8::1 2001:db8:ffff::1 "" 12345 udp "-6" + +i=$((i + 1)) +run_test_tp "TEST ${i} IPv6 UDP redirect foreign to local address, different port" \ + 2001:db8:1::2 2001:db8::1 2001:db8:ffff::1 ",65534" 12345 udp "-6" + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +i=$((i + 1)) +run_test_tp "TEST ${i} IPv6 TCP redirect foreign to local address, same port" \ + 2001:db8:1::2 2001:db8::1 2001:db8:ffff::1 "" 12345 tcp "-6" + +i=$((i + 1)) +run_test_tp "TEST ${i} IPv6 TCP redirect foreign to local address, different port" \ + 2001:db8:1::2 2001:db8::1 2001:db8:ffff::1 ",65534" 12345 tcp "-6" + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +i=$((i + 1)) +run_test_nh "TEST ${i} IPv4 UDP redirect to foreign address" \ + 192.0.2.6 192.0.2.5 192.0.2.1 "" 12345 udp "-4" + +i=$((i + 1)) +run_test_nh "TEST ${i} IPv4 TCP redirect to foreign address" \ + 192.0.2.6 192.0.2.5 192.0.2.1 "" 12345 tcp "-4" + +#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +i=$((i + 1)) +run_test_nh "TEST ${i} IPv6 UDP redirect to foreign address" \ + 2001:db8:1::2 2001:db8:1::1 2001:db8::1 "" 12345 udp "-6" + +i=$((i + 1)) +run_test_nh "TEST ${i} IPv6 TCP redirect to foreign address" \ + 2001:db8:1::2 2001:db8:1::1 2001:db8::1 "" 12345 tcp "-6" + +################################################################################ +# +# Cleanup +# +echo "==> Cleaning up in 3 seconds" +# Let VIMAGE network stacks settle to avoid panics while still "experimental". +sleep 3 + +jail -r ${rjid} +jail -r ${mjid} +jail -r ${ljid} + +for jid in ${rjid} ${mjid} ${ljid}; do + while : ; do + x=`jls -as -j ${jid} jid 2>/dev/null` + case "${x}" in + jid=*) echo "Waiting for jail ${jid} to stop." >&2 + sleep 1 + continue + ;; + esac + break + done +done + +ifconfig ${lmep}a destroy +ifconfig ${mrep}a destroy + +# end From 6f69742441c3fa4ff18f0cfcbb9f5dc4c966e8b1 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 20 Aug 2011 18:45:38 +0000 Subject: [PATCH 296/452] Fix compilation in case of defined(INET) && defined(IPFIREWALL_FORWARD) but no INET6. Reported by: avg Tested by: avg MFC after: 4 weeks X-MFC with: r225044 Approved by: re (kib) --- sys/netinet/tcp_input.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 24680c24fab..7f06bd48bab 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -581,9 +581,6 @@ tcp_input(struct mbuf *m, int off0) int isipv6; #else const void *ip6 = NULL; -#if (defined(INET) && defined(IPFIREWALL_FORWARD)) || defined(TCPDEBUG) - const int isipv6 = 0; -#endif #endif /* INET6 */ struct tcpopt to; /* options in this segment */ char *s = NULL; /* address and port logging */ @@ -1028,11 +1025,11 @@ relocked: #ifdef TCPDEBUG if (so->so_options & SO_DEBUG) { ostate = tp->t_state; - if (isipv6) { #ifdef INET6 + if (isipv6) { bcopy((char *)ip6, (char *)tcp_saveipgen, sizeof(*ip6)); -#endif } else +#endif bcopy((char *)ip, (char *)tcp_saveipgen, sizeof(*ip)); tcp_savetcp = *th; } From 61bc18a3276d40a71039a2790ac33b9c320e8234 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 20 Aug 2011 19:21:46 +0000 Subject: [PATCH 297/452] In HEAD when doing no further checkes there is no reason use the temporary variable and check with if as TUNABLE_*_FETCH do not alter values unless successfully found the tunable. Reported by: jhb, bde MFC after: 3 days X-MFC with: r224516 Approved by: re (kib) --- sys/amd64/amd64/machdep.c | 5 ++--- sys/i386/i386/machdep.c | 5 ++--- sys/pc98/pc98/machdep.c | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index 00aa47247b0..1e7b26c081f 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -1309,7 +1309,7 @@ getmemsize(caddr_t kmdp, u_int64_t first) { int i, physmap_idx, pa_indx, da_indx; vm_paddr_t pa, physmap[PHYSMAP_SIZE]; - u_long physmem_tunable, memtest, tmpul; + u_long physmem_tunable, memtest; pt_entry_t *pte; struct bios_smap *smapbase, *smap, *smapend; u_int32_t smapsize; @@ -1376,8 +1376,7 @@ getmemsize(caddr_t kmdp, u_int64_t first) * one could eventually do more with the code than just disable it. */ memtest = 1; - if (TUNABLE_ULONG_FETCH("hw.memtest.tests", &tmpul)) - memtest = tmpul; + TUNABLE_ULONG_FETCH("hw.memtest.tests", &memtest); /* * Don't allow MAXMEM or hw.physmem to extend the amount of memory diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index 73e75513768..e596b964d99 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -2132,7 +2132,7 @@ static void getmemsize(int first) { int has_smap, off, physmap_idx, pa_indx, da_indx; - u_long physmem_tunable, memtest, tmpul; + u_long physmem_tunable, memtest; vm_paddr_t physmap[PHYSMAP_SIZE]; pt_entry_t *pte; quad_t dcons_addr, dcons_size; @@ -2344,8 +2344,7 @@ physmap_done: * one could eventually do more with the code than just disable it. */ memtest = 1; - if (TUNABLE_ULONG_FETCH("hw.memtest.tests", &tmpul)) - memtest = tmpul; + TUNABLE_ULONG_FETCH("hw.memtest.tests", &memtest); if (atop(physmap[physmap_idx + 1]) != Maxmem && (boothowto & RB_VERBOSE)) diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c index 22131a625b8..b42249caea9 100644 --- a/sys/pc98/pc98/machdep.c +++ b/sys/pc98/pc98/machdep.c @@ -1855,7 +1855,7 @@ static void getmemsize(int first) { int off, physmap_idx, pa_indx, da_indx; - u_long physmem_tunable, memtest, tmpul; + u_long physmem_tunable, memtest; vm_paddr_t physmap[PHYSMAP_SIZE]; pt_entry_t *pte; quad_t dcons_addr, dcons_size; @@ -1920,8 +1920,7 @@ getmemsize(int first) * one could eventually do more with the code than just disable it. */ memtest = 1; - if (TUNABLE_ULONG_FETCH("hw.memtest.tests", &tmpul)) - memtest = tmpul; + TUNABLE_ULONG_FETCH("hw.memtest.tests", &memtest); if (atop(physmap[physmap_idx + 1]) != Maxmem && (boothowto & RB_VERBOSE)) From de67b4966ce83be22c61fd726b8c01768064d6b3 Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Sat, 20 Aug 2011 21:26:35 +0000 Subject: [PATCH 298/452] Fix the NFSv4 server so that it returns NFSERR_SYMLINK when an attempt to do an Open operation on any type of file other than VREG is done. A recent discussion on the IETF working group's mailing list (nfsv4@ietf.org) decided that NFSERR_SYMLINK should be returned for all non-regular files and not just symlinks, so that the Linux client would work correctly. This change does not affect the FreeBSD NFSv4 client and is not believed to have a negative effect on other NFSv4 clients. Reviewed by: zkirsch Approved by: re (kib) MFC after: 2 weeks --- sys/fs/nfsserver/nfs_nfsdserv.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index d234e91816f..85fbbd24dcd 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -2741,12 +2741,11 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, * Do basic access checking. */ if (!nd->nd_repstat && vnode_vtype(vp) != VREG) { - if (vnode_vtype(vp) == VDIR) - nd->nd_repstat = NFSERR_ISDIR; - else if (vnode_vtype(vp) == VLNK) + /* + * The IETF working group decided that this is the correct + * error return for all non-regular files. + */ nd->nd_repstat = NFSERR_SYMLINK; - else - nd->nd_repstat = NFSERR_INVAL; } if (!nd->nd_repstat && (stp->ls_flags & NFSLCK_WRITEACCESS)) nd->nd_repstat = nfsvno_accchk(vp, VWRITE, nd->nd_cred, From e75baa2802f7994e8437f112c766d118c5ff2053 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Sun, 21 Aug 2011 10:52:50 +0000 Subject: [PATCH 299/452] callout_cpu_switch() allows preemption when dropping the outcoming callout cpu lock (and after having dropped it). If the newly scheduled thread wants to acquire the old queue it will just spin forever. Fix this by disabling preemption and interrupts entirely (because fast interrupt handlers may incur in the same problem too) while switching locks. Reported by: hrs, Mike Tancsa , Chip Camden Tested by: hrs, Mike Tancsa , Chip Camden , Nicholas Esborn Approved by: re (kib) MFC after: 10 days --- sys/kern/kern_timeout.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c index 6a6f46b2c72..b820bd913ea 100644 --- a/sys/kern/kern_timeout.c +++ b/sys/kern/kern_timeout.c @@ -269,10 +269,17 @@ callout_cpu_switch(struct callout *c, struct callout_cpu *cc, int new_cpu) MPASS(c != NULL && cc != NULL); CC_LOCK_ASSERT(cc); + /* + * Avoid interrupts and preemption firing after the callout cpu + * is blocked in order to avoid deadlocks as the new thread + * may be willing to acquire the callout cpu lock. + */ c->c_cpu = CPUBLOCK; + spinlock_enter(); CC_UNLOCK(cc); new_cc = CC_CPU(new_cpu); CC_LOCK(new_cc); + spinlock_exit(); c->c_cpu = new_cpu; return (new_cc); } From af6004651e824999c91b6130305fe196a17d3d08 Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Sun, 21 Aug 2011 18:49:28 +0000 Subject: [PATCH 300/452] Make messages about typos appear on the screen instead of in the log file. Reported by: lev Approved by: re (kib) --- usr.sbin/bsdinstall/scripts/adduser | 2 +- usr.sbin/bsdinstall/scripts/rootpass | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/usr.sbin/bsdinstall/scripts/adduser b/usr.sbin/bsdinstall/scripts/adduser index 35c50ed9c52..456f76b0431 100755 --- a/usr.sbin/bsdinstall/scripts/adduser +++ b/usr.sbin/bsdinstall/scripts/adduser @@ -31,4 +31,4 @@ echo "FreeBSD Installer" echo "========================" echo "Add Users" echo -chroot $BSDINSTALL_CHROOT adduser +chroot $BSDINSTALL_CHROOT adduser 2>&1 diff --git a/usr.sbin/bsdinstall/scripts/rootpass b/usr.sbin/bsdinstall/scripts/rootpass index b7177fc0802..b3dde228792 100755 --- a/usr.sbin/bsdinstall/scripts/rootpass +++ b/usr.sbin/bsdinstall/scripts/rootpass @@ -33,5 +33,5 @@ echo echo "Please select a password for the system management account (root):" -chroot $BSDINSTALL_CHROOT passwd root +chroot $BSDINSTALL_CHROOT passwd root 2>&1 From bcc25b7ea2746931cf63418dc4fdeb151b44c8b1 Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Sun, 21 Aug 2011 18:50:30 +0000 Subject: [PATCH 301/452] Implement support for GRAID volumes in the installer partition editor, rename a few options, clarify some help text, and add help text for the buttons on the main partition editor screen. Approved by: re (kib) --- usr.sbin/bsdinstall/partedit/diskeditor.c | 16 ++++++- usr.sbin/bsdinstall/partedit/gpart_ops.c | 8 ++-- usr.sbin/bsdinstall/partedit/part_wizard.c | 2 + usr.sbin/bsdinstall/partedit/partedit.c | 51 ++++++++++++++++------ 4 files changed, 60 insertions(+), 17 deletions(-) diff --git a/usr.sbin/bsdinstall/partedit/diskeditor.c b/usr.sbin/bsdinstall/partedit/diskeditor.c index c97b00355df..35b2b3f1fb3 100644 --- a/usr.sbin/bsdinstall/partedit/diskeditor.c +++ b/usr.sbin/bsdinstall/partedit/diskeditor.c @@ -65,7 +65,12 @@ diskeditor_show(const char *title, const char *cprompt, WINDOW *dialog, *partitions; char *prompt; const char *buttons[] = - { "Create", "Delete", "Modify", "Revert", "Auto", "Exit", NULL }; + { "Create", "Delete", "Modify", "Revert", "Auto", "Finish", NULL }; + const char *help_text[] = { + "Add a new partition", "Delete selected partition or partitions", + "Change partition type or mountpoint", + "Revert changes to disk setup", "Use guided partitioning tool", + "Exit partitioner (will ask whether to save changes)", NULL }; int x, y; int i; int height, width, min_width; @@ -125,6 +130,7 @@ diskeditor_show(const char *title, const char *cprompt, dlg_register_buttons(partitions, "partlist", buttons); wattrset(partitions, menubox_attr); + dlg_item_help(help_text[cur_button]); dlg_draw_buttons(dialog, height - 2*MARGIN, 0, buttons, cur_button, FALSE, width); dlg_print_autowrap(dialog, prompt, height, width); @@ -154,6 +160,7 @@ repaint: key = dlg_mouse_wgetch(dialog, &fkey); if ((i = dlg_char_to_button(key, buttons)) >= 0) { cur_button = i; + dlg_item_help(help_text[cur_button]); dlg_draw_buttons(dialog, height - 2*MARGIN, 0, buttons, cur_button, FALSE, width); break; @@ -167,6 +174,7 @@ repaint: cur_button = dlg_next_button(buttons, cur_button); if (cur_button < 0) cur_button = 0; + dlg_item_help(help_text[cur_button]); dlg_draw_buttons(dialog, height - 2*MARGIN, 0, buttons, cur_button, FALSE, width); break; @@ -174,6 +182,7 @@ repaint: cur_button = dlg_prev_button(buttons, cur_button); if (cur_button < 0) cur_button = 0; + dlg_item_help(help_text[cur_button]); dlg_draw_buttons(dialog, height - 2*MARGIN, 0, buttons, cur_button, FALSE, width); break; @@ -215,6 +224,8 @@ repaint: cur_scroll += (partlist_height - 2); if (cur_scroll + partlist_height - 2 >= nitems) cur_scroll = nitems - (partlist_height - 2); + if (cur_scroll < 0) + cur_scroll = 0; if (cur_part < cur_scroll) cur_part = cur_scroll; goto repaint; @@ -231,6 +242,8 @@ repaint: goto repaint; case DLGK_PAGE_LAST: cur_scroll = nitems - (partlist_height - 2); + if (cur_scroll < 0) + cur_scroll = 0; cur_part = cur_scroll; goto repaint; case DLGK_ENTER: @@ -238,6 +251,7 @@ repaint: default: if (is_DLGK_MOUSE(key)) { cur_button = key - M_EVENT; + dlg_item_help(help_text[cur_button]); dlg_draw_buttons(dialog, height - 2*MARGIN, 0, buttons, cur_button, FALSE, width); goto done; diff --git a/usr.sbin/bsdinstall/partedit/gpart_ops.c b/usr.sbin/bsdinstall/partedit/gpart_ops.c index 698a1fcdbd6..b55caf4136e 100644 --- a/usr.sbin/bsdinstall/partedit/gpart_ops.c +++ b/usr.sbin/bsdinstall/partedit/gpart_ops.c @@ -472,7 +472,7 @@ gpart_edit(struct gprovider *pp) if (geom == NULL) { /* Disk not partitioned, so partition it */ - gpart_partition(pp->lg_geom->lg_name, NULL); + gpart_partition(pp->lg_name, NULL); return; } @@ -791,7 +791,7 @@ gpart_create(struct gprovider *pp, char *default_type, char *default_size, } if (geom == NULL || scheme == NULL || strcmp(scheme, "(none)") == 0) { - if (gpart_partition(pp->lg_geom->lg_name, NULL) == 0) + if (gpart_partition(pp->lg_name, NULL) == 0) dialog_msgbox("", "The partition table has been successfully created." " Please press Create again to create partitions.", @@ -820,8 +820,10 @@ gpart_create(struct gprovider *pp, char *default_type, char *default_size, items[1].text = sizestr; /* Special-case the MBR default type for nested partitions */ - if (strcmp(scheme, "MBR") == 0 || strcmp(scheme, "PC98") == 0) + if (strcmp(scheme, "MBR") == 0 || strcmp(scheme, "PC98") == 0) { items[0].text = "freebsd"; + items[0].help = "Filesystem type (e.g. freebsd, fat32)"; + } nitems = scheme_supports_labels(scheme) ? 4 : 3; diff --git a/usr.sbin/bsdinstall/partedit/part_wizard.c b/usr.sbin/bsdinstall/partedit/part_wizard.c index 6e255a452c0..91dde0a1431 100644 --- a/usr.sbin/bsdinstall/partedit/part_wizard.c +++ b/usr.sbin/bsdinstall/partedit/part_wizard.c @@ -96,6 +96,7 @@ boot_disk(struct gmesh *mesh) LIST_FOREACH(classp, &mesh->lg_class, lg_class) { if (strcmp(classp->lg_name, "DISK") != 0 && + strcmp(classp->lg_name, "RAID") != 0 && strcmp(classp->lg_name, "MD") != 0) continue; @@ -169,6 +170,7 @@ provider_for_name(struct gmesh *mesh, const char *name) LIST_FOREACH(classp, &mesh->lg_class, lg_class) { if (strcmp(classp->lg_name, "DISK") != 0 && strcmp(classp->lg_name, "PART") != 0 && + strcmp(classp->lg_name, "RAID") != 0 && strcmp(classp->lg_name, "MD") != 0) continue; diff --git a/usr.sbin/bsdinstall/partedit/partedit.c b/usr.sbin/bsdinstall/partedit/partedit.c index 303f6953dd1..8a89f5208e3 100644 --- a/usr.sbin/bsdinstall/partedit/partedit.c +++ b/usr.sbin/bsdinstall/partedit/partedit.c @@ -50,8 +50,24 @@ static void init_fstab_metadata(void); static void get_mount_points(struct partedit_item *items, int nitems); static int validate_setup(void); +static void +sigint_handler(int sig) +{ + struct gmesh mesh; + + /* Revert all changes and exit dialog-mode cleanly on SIGINT */ + geom_gettree(&mesh); + gpart_revert_all(&mesh); + geom_deletetree(&mesh); + + end_dialog(); + + exit(1); +} + int -main(int argc, const char **argv) { +main(int argc, const char **argv) +{ struct partition_metadata *md; const char *prompt; struct partedit_item *items; @@ -69,13 +85,16 @@ main(int argc, const char **argv) { dialog_vars.item_help = TRUE; nscroll = i = 0; + /* Revert changes on SIGINT */ + signal(SIGINT, sigint_handler); + if (strcmp(basename(argv[0]), "autopart") == 0) { /* Guided */ prompt = "Please review the disk setup. When complete, press " - "the Exit button."; + "the Finish button."; part_wizard(); } else { prompt = "Create partitions for FreeBSD. No changes will be " - "made until you select Exit."; + "made until you select Finish."; } /* Show the part editor either immediately, or to confirm wizard */ @@ -129,21 +148,24 @@ main(int argc, const char **argv) { error = 0; if (op == 5) { /* Finished */ - dialog_vars.extra_button = TRUE; + dialog_vars.ok_label = __DECONST(char *, "Commit"); dialog_vars.extra_label = - __DECONST(char *, "Abort"); - dialog_vars.ok_label = __DECONST(char *, "Save"); + __DECONST(char *, "Revert & Exit"); + dialog_vars.extra_button = TRUE; + dialog_vars.cancel_label = __DECONST(char *, "Back"); op = dialog_yesno("Confirmation", "Your changes will " "now be written to disk. If you have chosen to " "overwrite existing data, it will be PERMANENTLY " - "ERASED. Are you sure you want to proceed?", 0, 0); - dialog_vars.extra_button = FALSE; + "ERASED. Are you sure you want to commit your " + "changes?", 0, 0); dialog_vars.ok_label = NULL; + dialog_vars.extra_button = FALSE; + dialog_vars.cancel_label = NULL; if (op == 0 && validate_setup()) { /* Save */ error = apply_changes(&mesh); break; - } else if (op == 3) { /* Don't save => Quit */ + } else if (op == 3) { /* Quit */ gpart_revert_all(&mesh); error = -1; break; @@ -181,7 +203,8 @@ get_part_metadata(const char *name, int create) } void -delete_part_metadata(const char *name) { +delete_part_metadata(const char *name) +{ struct partition_metadata *md; TAILQ_FOREACH(md, &part_metadata, metadata) { @@ -316,7 +339,8 @@ apply_changes(struct gmesh *mesh) } static struct partedit_item * -read_geom_mesh(struct gmesh *mesh, int *nitems) { +read_geom_mesh(struct gmesh *mesh, int *nitems) +{ struct gclass *classp; struct ggeom *gp; struct partedit_item *items; @@ -330,7 +354,7 @@ read_geom_mesh(struct gmesh *mesh, int *nitems) { LIST_FOREACH(classp, &mesh->lg_class, lg_class) { if (strcmp(classp->lg_name, "DISK") != 0 && - strcmp(classp->lg_name, "MD") != 0) + strcmp(classp->lg_name, "MD") != 0) continue; /* Now recurse into all children */ @@ -343,7 +367,8 @@ read_geom_mesh(struct gmesh *mesh, int *nitems) { static void add_geom_children(struct ggeom *gp, int recurse, struct partedit_item **items, - int *nitems) { + int *nitems) +{ struct gconsumer *cp; struct gprovider *pp; struct gconfig *gc; From 5cf8ac1bc2881c6724897cf2cd32273e7580dd10 Mon Sep 17 00:00:00 2001 From: Mike Silbersack Date: Mon, 22 Aug 2011 03:10:29 +0000 Subject: [PATCH 302/452] Disable TSC usage inside SMP VM environments. On my VMware ESXi 4.1 environment with a core i5-2500K, operation in this mode causes timeouts from the mpt driver. Switching to the ACPI-fast timer resolves this issue. Switching the VM back to single CPU mode also works, which is why I have not disabled the TSC in that mode. I did not test with KVM or other VM environments, but I am being cautious and assuming that the TSC is not reliable in SMP mode there as well. Reviewed by: kib Approved by: re (kib) MFC after: Not applicable, the timecounter code is new for 9.x --- sys/x86/x86/tsc.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c index 0b383bf7ef2..4d1618f14b7 100644 --- a/sys/x86/x86/tsc.c +++ b/sys/x86/x86/tsc.c @@ -464,11 +464,16 @@ init_TSC_tc(void) * synchronized. If the user is sure that the system has synchronized * TSCs, set kern.timecounter.smp_tsc tunable to a non-zero value. * We also limit the frequency even lower to avoid "temporal anomalies" - * as much as possible. + * as much as possible. The TSC seems unreliable in virtualized SMP + * environments, so it is set to a negative quality in those cases. */ if (smp_cpus > 1) { - tsc_timecounter.tc_quality = test_smp_tsc(); - max_freq >>= 8; + if (vm_guest != 0) { + tsc_timecounter.tc_quality = -100; + } else { + tsc_timecounter.tc_quality = test_smp_tsc(); + max_freq >>= 8; + } } else #endif if (tsc_is_invariant) From 6e903bd0d679ba41bb2778fbcd50f1ab34929786 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Mon, 22 Aug 2011 11:18:47 +0000 Subject: [PATCH 303/452] Apply the limit to avoid the overflows in the radix tree subr_blist.c after the conversion of the swap device size to the page size units, not before. That lifts the limit on the usable swap partition size from 32GB to 256GB, that is less depressing for the modern systems. Submitted by: Alexander V. Chernikov Reviewed by: alc Approved by: re (bz) MFC after: 2 weeks --- sys/vm/swap_pager.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 9a818e7b645..2dd678b6f09 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -2132,16 +2132,6 @@ swaponsomething(struct vnode *vp, void *id, u_long nblks, sw_strategy_t *strateg swblk_t dvbase; u_long mblocks; - /* - * If we go beyond this, we get overflows in the radix - * tree bitmap code. - */ - mblocks = 0x40000000 / BLIST_META_RADIX; - if (nblks > mblocks) { - printf("WARNING: reducing size to maximum of %lu blocks per swap unit\n", - mblocks); - nblks = mblocks; - } /* * nblks is in DEV_BSIZE'd chunks, convert to PAGE_SIZE'd chunks. * First chop nblks off to page-align it, then convert. @@ -2151,6 +2141,18 @@ swaponsomething(struct vnode *vp, void *id, u_long nblks, sw_strategy_t *strateg nblks &= ~(ctodb(1) - 1); nblks = dbtoc(nblks); + /* + * If we go beyond this, we get overflows in the radix + * tree bitmap code. + */ + mblocks = 0x40000000 / BLIST_META_RADIX; + if (nblks > mblocks) { + printf( + "WARNING: reducing swap size to maximum of %luMB per unit\n", + mblocks / 1024 / 1024 * PAGE_SIZE); + nblks = mblocks; + } + sp = malloc(sizeof *sp, M_VMPGDATA, M_WAITOK | M_ZERO); sp->sw_vp = vp; sp->sw_id = id; From 5a7ca5ee05f0fc75894131ca9b78d00f0d7de77d Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Mon, 22 Aug 2011 18:36:58 +0000 Subject: [PATCH 304/452] Add two new macros DRIVER_MODULE_ORDERED() and EARLY_DRIVER_MODULE_ORDERED() that allow a module to use an order other than the default of SI_ORDER_MIDDLE when registering a driver. This can be useful for drivers in a kld that contain multiple new-bus drivers as part of one logical device driver. A typical case would be to use SI_ORDER_LAST for the "main" driver to ensure that any other "helper" drivers are registered and available before the "main" driver attempts to attach. Tested by: kib, Jason Harmening jason harmening / gmail Approved by: re (kib) MFC after: 1 week --- sys/sys/bus.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/sys/sys/bus.h b/sys/sys/bus.h index 09b8911eabe..5dc92dfe07c 100644 --- a/sys/sys/bus.h +++ b/sys/sys/bus.h @@ -596,7 +596,8 @@ struct driver_module_data { int dmd_pass; }; -#define EARLY_DRIVER_MODULE(name, busname, driver, devclass, evh, arg, pass) \ +#define EARLY_DRIVER_MODULE_ORDERED(name, busname, driver, devclass, \ + evh, arg, order, pass) \ \ static struct driver_module_data name##_##busname##_driver_mod = { \ evh, arg, \ @@ -612,7 +613,16 @@ static moduledata_t name##_##busname##_mod = { \ &name##_##busname##_driver_mod \ }; \ DECLARE_MODULE(name##_##busname, name##_##busname##_mod, \ - SI_SUB_DRIVERS, SI_ORDER_MIDDLE) + SI_SUB_DRIVERS, order) + +#define EARLY_DRIVER_MODULE(name, busname, driver, devclass, evh, arg, pass) \ + EARLY_DRIVER_MODULE_ORDERED(name, busname, driver, devclass, \ + evh, arg, SI_ORDER_MIDDLE, pass) + +#define DRIVER_MODULE_ORDERED(name, busname, driver, devclass, evh, arg,\ + order) \ + EARLY_DRIVER_MODULE_ORDERED(name, busname, driver, devclass, \ + evh, arg, order, BUS_PASS_DEFAULT) #define DRIVER_MODULE(name, busname, driver, devclass, evh, arg) \ EARLY_DRIVER_MODULE(name, busname, driver, devclass, evh, arg, \ From 462d5251d71770e43cf723971f40d8ccf4300be0 Mon Sep 17 00:00:00 2001 From: Pyun YongHyeon Date: Mon, 22 Aug 2011 20:33:05 +0000 Subject: [PATCH 305/452] Disable PHY hibernation until I get more detailed hibernation programming secret. The PHY would go into sleep state when it detects no established link and it will re-establish link when the cable is plugged in. Previously it failed to re-establish link when the cable is plugged in such that it required to manually down and up the interface again to make it work. This came from incorrectly programmed hibernation parameters. According to Atheros, each PHY chip requires different configuration for hibernation and different vendor has different settings for the same chip. Disabling hibernation may consume more power but establishing link looks more important than saving power. Special thanks to Atheros for giving me instructions that disable hibernation. MFC after: 1 week Approved by: re (kib) --- sys/dev/alc/if_alc.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/sys/dev/alc/if_alc.c b/sys/dev/alc/if_alc.c index ff0424ecf8d..c13cb188dc1 100644 --- a/sys/dev/alc/if_alc.c +++ b/sys/dev/alc/if_alc.c @@ -532,13 +532,11 @@ alc_phy_reset(struct alc_softc *sc) uint16_t data; /* Reset magic from Linux. */ - CSR_WRITE_2(sc, ALC_GPHY_CFG, - GPHY_CFG_HIB_EN | GPHY_CFG_HIB_PULSE | GPHY_CFG_SEL_ANA_RESET); + CSR_WRITE_2(sc, ALC_GPHY_CFG, GPHY_CFG_SEL_ANA_RESET); CSR_READ_2(sc, ALC_GPHY_CFG); DELAY(10 * 1000); - CSR_WRITE_2(sc, ALC_GPHY_CFG, - GPHY_CFG_EXT_RESET | GPHY_CFG_HIB_EN | GPHY_CFG_HIB_PULSE | + CSR_WRITE_2(sc, ALC_GPHY_CFG, GPHY_CFG_EXT_RESET | GPHY_CFG_SEL_ANA_RESET); CSR_READ_2(sc, ALC_GPHY_CFG); DELAY(10 * 1000); @@ -623,6 +621,23 @@ alc_phy_reset(struct alc_softc *sc) alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_DATA, data); DELAY(1000); + + /* Disable hibernation. */ + alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_ADDR, + 0x0029); + data = alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, + ALC_MII_DBG_DATA); + data &= ~0x8000; + alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_DATA, + data); + + alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_ADDR, + 0x000B); + data = alc_miibus_readreg(sc->alc_dev, sc->alc_phyaddr, + ALC_MII_DBG_DATA); + data &= ~0x8000; + alc_miibus_writereg(sc->alc_dev, sc->alc_phyaddr, ALC_MII_DBG_DATA, + data); } static void @@ -648,8 +663,7 @@ alc_phy_down(struct alc_softc *sc) break; default: /* Force PHY down. */ - CSR_WRITE_2(sc, ALC_GPHY_CFG, - GPHY_CFG_EXT_RESET | GPHY_CFG_HIB_EN | GPHY_CFG_HIB_PULSE | + CSR_WRITE_2(sc, ALC_GPHY_CFG, GPHY_CFG_EXT_RESET | GPHY_CFG_SEL_ANA_RESET | GPHY_CFG_PHY_IDDQ | GPHY_CFG_PWDOWN_HW); DELAY(1000); From 15523cf7991b6e211c92fbcf0cf8ae71b3abe128 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Mon, 22 Aug 2011 20:44:18 +0000 Subject: [PATCH 306/452] Update some comments in swap_pager.c. Reviewed and most wording by: alc MFC after: 1 week Approved by: re (bz) --- sys/vm/swap_pager.c | 47 ++++++++++++++++----------------------------- 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 2dd678b6f09..f491adca7a8 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -114,9 +114,9 @@ __FBSDID("$FreeBSD$"); #include /* - * SWB_NPAGES must be a power of 2. It may be set to 1, 2, 4, 8, or 16 - * pages per allocation. We recommend you stick with the default of 8. - * The 16-page limit is due to the radix code (kern/subr_blist.c). + * SWB_NPAGES must be a power of 2. It may be set to 1, 2, 4, 8, 16 + * or 32 pages per allocation. + * The 32-page limit is due to the radix code (kern/subr_blist.c). */ #ifndef MAX_PAGEOUT_CLUSTER #define MAX_PAGEOUT_CLUSTER 16 @@ -127,14 +127,11 @@ __FBSDID("$FreeBSD$"); #endif /* - * Piecemeal swap metadata structure. Swap is stored in a radix tree. - * - * If SWB_NPAGES is 8 and sizeof(char *) == sizeof(daddr_t), our radix - * is basically 8. Assuming PAGE_SIZE == 4096, one tree level represents - * 32K worth of data, two levels represent 256K, three levels represent - * 2 MBytes. This is acceptable. - * - * Overall memory utilization is about the same as the old swap structure. + * The swblock structure maps an object and a small, fixed-size range + * of page indices to disk addresses within a swap area. + * The collection of these mappings is implemented as a hash table. + * Unused disk addresses within a swap area are allocated and managed + * using a blist. */ #define SWCORRECT(n) (sizeof(void *) * (n) / sizeof(daddr_t)) #define SWAP_META_PAGES (SWB_NPAGES * 2) @@ -662,9 +659,7 @@ swap_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, * routine is typically called only when the entire object is * about to be destroyed. * - * This routine may block, but no longer does. - * - * The object must be locked or unreferenceable. + * The object must be locked. */ static void swap_pager_dealloc(vm_object_t object) @@ -706,7 +701,7 @@ swap_pager_dealloc(vm_object_t object) * Also has the side effect of advising that somebody made a mistake * when they configured swap and didn't configure enough. * - * This routine may not block + * This routine may not sleep. * * We allocate in round-robin fashion from the configured devices. */ @@ -776,10 +771,7 @@ swp_pager_strategy(struct buf *bp) * * This routine returns the specified swap blocks back to the bitmap. * - * Note: This routine may not block (it could in the old swap code), - * and through the use of the new blist routines it does not block. - * - * This routine may not block + * This routine may not sleep. */ static void swp_pager_freeswapspace(daddr_t blk, int npages) @@ -875,21 +867,16 @@ swap_pager_reserve(vm_object_t object, vm_pindex_t start, vm_size_t size) * cases where both the source and destination have a valid swapblk, * we keep the destination's. * - * This routine is allowed to block. It may block allocating metadata + * This routine is allowed to sleep. It may sleep allocating metadata * indirectly through swp_pager_meta_build() or if paging is still in * progress on the source. * - * XXX vm_page_collapse() kinda expects us not to block because we - * supposedly do not need to allocate memory, but for the moment we - * *may* have to get a little memory from the zone allocator, but - * it is taken from the interrupt memory. We should be ok. - * * The source object contains no vm_page_t's (which is just as well) * * The source object is of type OBJT_SWAP. * - * The source and destination objects must be locked or - * inaccessible (XXX are they ?) + * The source and destination objects must be locked. + * Both object locks may temporarily be released. */ void swap_pager_copy(vm_object_t srcobject, vm_object_t dstobject, @@ -1066,7 +1053,7 @@ swap_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before, int *aft * does NOT change the m->dirty status of the page. Also: MADV_FREE * depends on it. * - * This routine may not block + * This routine may not sleep. */ static void swap_pager_unswapped(vm_page_t m) @@ -1472,7 +1459,7 @@ swap_pager_putpages(vm_object_t object, vm_page_t *m, int count, * operations, we vm_page_t->busy'd unbusy all pages ( we can do this * because we marked them all VM_PAGER_PEND on return from putpages ). * - * This routine may not block. + * This routine may not sleep. */ static void swp_pager_async_iodone(struct buf *bp) @@ -1657,7 +1644,7 @@ swp_pager_async_iodone(struct buf *bp) * Return 1 if at least one page in the given object is paged * out to the given swap device. * - * This routine may not block. + * This routine may not sleep. */ int swap_pager_isswapped(vm_object_t object, struct swdevt *sp) From c8c1f2ec4d81af30c5d45a2eecfb430f44608fca Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Mon, 22 Aug 2011 21:05:39 +0000 Subject: [PATCH 307/452] Whitespace corrections for LibUSB manual page (1/2). MFC after: 1 week Approved by: re (kib) PR: docs/159898 --- lib/libusb/libusb.3 | 301 +++++++++++++++++--------------------------- 1 file changed, 118 insertions(+), 183 deletions(-) diff --git a/lib/libusb/libusb.3 b/lib/libusb/libusb.3 index 885b066529a..780c1f6e1f4 100644 --- a/lib/libusb/libusb.3 +++ b/lib/libusb/libusb.3 @@ -31,165 +31,123 @@ .Os .Sh NAME .Nm libusb -. .Nd "USB access library" -. -. .Sh LIBRARY -. -. USB access library (libusb -lusb) -. -. .Sh SYNOPSIS -. -. .In libusb.h -. -. .Sh DESCRIPTION The .Nm library contains interfaces for directly managing a usb device. The current implementation supports v1.0 of the libusb API. -. -. .Sh LIBRARY INITIALISATION / DEINITIALISATION -. .Pp -. .Ft int .Fn libusb_init libusb_context **ctx -This function initialises libusb. Must be called at the beginning -of the program. This function returns 0 on success or LIBUSB_ERROR on +This function initialises libusb. +Must be called at the beginning +of the program. +This function returns 0 on success or LIBUSB_ERROR on failure. -. .Pp -. .Ft void .Fn libusb_exit "libusb_context *ctx" -Deinitialise libusb. Must be called at the end of the application. -. +Deinitialise libusb. +Must be called at the end of the application. .Pp -. .Ft const char * .Fn libusb_strerror "int code" Get ASCII representation of the error given by the .Fa code argument. -. -. .Pp -. .Ft void .Fn libusb_set_debug "libusb_context *ctx" "int level" Set debug to the .Fa level level. -. .Pp -. .Ft ssize_t .Fn libusb_get_device_list "libusb_context *ctx" "libusb_device ***list" Fill into -.Fa list -the list of usb device available. All the device created by this -function must be unref and free when you are done with them. This +.Fa list +the list of usb device available. +All the device created by this +function must be unref and free when you are done with them. +This function returns the number of devices in list or a LIBUSB_ERROR code. -. .Pp -. .Ft void .Fn libusb_free_device_list "libusb_device **list" "int unref_devices" -Free the list of devices discovered by libusb_get_device_list. If +Free the list of devices discovered by libusb_get_device_list. +If .Fa unref_device is set to 1 all devices are unref one time. -. .Pp -. .Ft uint8_t .Fn libusb_get_bus_number "libusb_device *dev" Returns the number of the bus contained by the device .Fa dev. -. .Pp -. .Ft uint8_t .Fn libusb_get_device_address "libusb_device *dev" Returns the device_address contained by the device .Fa dev. -. .Pp -. .Ft enum libusb_speed .Fn libusb_get_device_speed "libusb_device *dev" Returns the wire speed at which the device is connected. See the LIBUSB_SPEED_XXX enums for more information. LIBUSB_SPEED_UNKNOWN is returned in case of unknown wire speed. -. .Pp -. .Ft int .Fn libusb_get_max_packet_size "libusb_device *dev" "unsigned char endpoint" -Returns the wMaxPacketSize value on success, LIBUSB_ERROR_NOT_FOUND if the +Returns the wMaxPacketSize value on success, LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist and LIBUSB_ERROR_OTHERS on other failure. -. .Pp -. .Ft libusb_device * .Fn libusb_ref_device "libusb_device *dev" Increment the reference counter of the device .Fa dev. -. .Pp -. .Ft void .Fn libusb_unref_device "libusb_device *dev" Decrement the reference counter of the device .Fa dev. -. .Pp -. .Ft int .Fn libusb_open "libusb_device *dev" "libusb_device_handle **devh" -Open a device and obtain a device_handle. Returns 0 on success, -LIBUSB_ERROR_NO_MEM on memory allocation problem, LIBUSB_ERROR_ACCESS -on permission problem, LIBUSB_ERROR_NO_DEVICE if the device has been +Open a device and obtain a device_handle. +Returns 0 on success, +LIBUSB_ERROR_NO_MEM on memory allocation problem, LIBUSB_ERROR_ACCESS +on permission problem, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on error. -. .Pp -. .Ft libusb_device_handle * .Fn libusb_open_device_with_vid_pid "libusb_context *ctx" "uint16_t vid" "uint16_t pid" -Convenience function to open a device with is -.Fa vid -and +Convenience function to open a device with is +.Fa vid +and .Fa pid. Returns NULL on error. -. .Pp -. .Ft void .Fn libusb_close "libusb_device_handle *devh" Close a device handle. -. .Pp -. .Ft libusb_device * .Fn libusb_get_device "libusb_device_handle *devh" Get the device contained by devh. Returns NULL on error. -. .Pp -. .Ft int .Fn libusb_get_configuration "libusb_device_handle *devh" "int *config" -Returns the bConfiguration value of the current configuration. Returns 0 -on success, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected +Returns the bConfiguration value of the current configuration. +Returns 0 +on success, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on error. -. .Pp -. .Ft int .Fn libusb_set_configuration "libusb_device_handle *devh" "int config" Set the active configuration @@ -197,73 +155,66 @@ Set the active configuration for the device contained by .Fa devh. This function returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the requested -configuration does not exist, LIBUSB_ERROR_BUSY if the interfaces are currently -claimed, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a +configuration does not exist, LIBUSB_ERROR_BUSY if the interfaces are currently +claimed, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on failure. -. .Pp -. .Ft int .Fn libusb_claim_interface "libusb_device_handle *devh" "int interface_number" Claim an interface in a given libusb_handle .Fa devh. -This is a non-blocking function. It returns 0 success, LIBUSB_ERROR_NOT_FOUND -if the requested interface does not exist, LIBUSB_ERROR_BUSY if a program or -driver has claimed the interface, LIBUSB_ERROR_NO_DEVICE if the device has +This is a non-blocking function. +It returns 0 success, LIBUSB_ERROR_NOT_FOUND +if the requested interface does not exist, LIBUSB_ERROR_BUSY if a program or +driver has claimed the interface, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on failure. -. .Pp -. .Ft int .Fn libusb_release_interface "libusb_device_handle *devh" "int interface_number" -This function release an interface. All the claimed interface must be released -before closing a device. Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the -interface was not claimed, LIBUSB_ERROR_NO_DEVICE if the device has been +This function release an interface. +All the claimed interface must be released +before closing a device. +Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the +interface was not claimed, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and LIBUSB_ERROR on failure. -. .Pp -. .Ft int .Fn libusb_set_interface_alt_setting "libusb_device_handle *dev" "int interface_number" "int alternate_setting" -Activate an alternate setting for an interface. Returns 0 on success, -LIBUSB_ERROR_NOT_FOUND if the interface was not claimed or the requested -setting does not exist, LIBUSB_ERROR_NO_DEVICE if the device has been +Activate an alternate setting for an interface. +Returns 0 on success, +LIBUSB_ERROR_NOT_FOUND if the interface was not claimed or the requested +setting does not exist, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and LIBUSB_ERROR code on failure. -. .Pp -. .Ft int .Fn libusb_clear_halt "libusb_device_handle *devh" "unsigned char endpoint" -Clear an halt/stall for a endpoint. Returns 0 on success, LIBUSB_ERROR_NOT_FOUND -if the endpoint does not exist, LIBUSB_ERROR_NO_DEVICE if the device has been +Clear an halt/stall for a endpoint. +Returns 0 on success, LIBUSB_ERROR_NOT_FOUND +if the endpoint does not exist, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on failure. -. .Pp -. .Ft int .Fn libusb_reset_device "libusb_device_handle *devh" -Perform an USB port reset for an usb device. Returns 0 on success, +Perform an USB port reset for an usb device. +Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if re-enumeration is required or if the device has been disconnected and a LIBUSB_ERROR code on failure. -. .Pp -. .Ft int .Fn libusb_check_connected "libusb_device_handle *devh" -Test if USB device is still connected. Returns 0 on success, +Test if USB device is still connected. +Returns 0 on success, LIBUSB_ERROR_NO_DEVICE if has been disconnected and a LIBUSB_ERROR code on failure. -. .Pp -. .Ft int .Fn libusb_kernel_driver_active "libusb_device_handle *devh" "int interface" -Determine if a driver is active on a interface. Returns 0 if no kernel driver -is active, returns 1 if a kernel driver is active, returns LIBUSB_ERROR_NO_DEVICE +Determine if a driver is active on a interface. +Returns 0 if no kernel driver +is active, returns 1 if a kernel driver is active, +returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and returns a LIBUSB_ERROR code on failure. -. .Pp -. .Ft int .Fn libusb_get_driver "libusb_device_handle *devh" "int interface" "char *name" "int namelen" or @@ -284,9 +235,7 @@ This function is non-portable. The buffer pointed to by .Fa name is only zero terminated on success. -. .Pp -. .Ft int .Fn libusb_detach_kernel_driver "libusb_device_handle *devh" "int interface" or @@ -295,69 +244,66 @@ or Detach a kernel driver from an interface. This is needed to claim an interface required by a kernel driver. Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if no kernel driver was active, -LIBUSB_ERROR_INVALID_PARAM if the interface does not exist, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on failure. This function is non-portable. -. +LIBUSB_ERROR_INVALID_PARAM if the interface does not exist, +LIBUSB_ERROR_NO_DEVICE if the device has been disconnected +and a LIBUSB_ERROR code on failure. +This function is non-portable. .Pp -. .Ft int .Fn libusb_attach_kernel_driver "libusb_device_handle *devh" "int interface" -Re-attach an interface kernel driver previously detached. Returns 0 on success, -LIBUSB_ERROR_INVALID_PARAM if the interface does not exist, LIBUSB_ERROR_NO_DEVICE -if the device has been disconnect, LIBUSB_ERROR_BUSY if the driver cannot be -attached because the interface is claimed by a program or driver and a +Re-attach an interface kernel driver previously detached. +Returns 0 on success, +LIBUSB_ERROR_INVALID_PARAM if the interface does not exist, +LIBUSB_ERROR_NO_DEVICE +if the device has been disconnect, LIBUSB_ERROR_BUSY if the driver cannot be +attached because the interface is claimed by a program or driver and a LIBUSB_ERROR code on failure. -. .Pp -. .Sh USB DESCRIPTORS -. .Pp -. .Ft int .Fn libusb_get_device_descriptor "libusb_device *dev" "libusb_device_descriptor *desc" Get the USB device descriptor for the device .Fa dev. -This is a non-blocking function. Returns 0 on success and a LIBUSB_ERROR code on +This is a non-blocking function. +Returns 0 on success and a LIBUSB_ERROR code on failure. -. .Pp -.Ft int +.Ft int .Fn libsub_get_active_config_descriptor "libusb_device *dev" "struct libusb_config_descriptor **config" -Get the USB configuration descriptor for the active configuration. Returns 0 on -success, returns LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state +Get the USB configuration descriptor for the active configuration. +Returns 0 on +success, returns LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state and returns another LIBUSB_ERROR code on error. -. .Pp -.Ft int +.Ft int .Fn libusb_get_config_descriptor "libusb_device *dev" "uint8_t config_index" "libusb_config_descriptor **config" -Get USB configuration descriptor based on its index +Get USB configuration descriptor based on its index .Fa idx. -Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the configuration does not exist +Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the configuration does not exist and returns another LIBUSB_ERROR code on error. -. .Pp .Ft int .Fn libusb_get_config_descriptor_by_value "libusb_device *dev" "uint8 bConfigurationValue" "libusb_config_descriptor **config" -Get a USB configuration descriptor with a specific bConfigurationValue. This is -a non-blocking function which does not send request through the device. Returns 0 -on success, LIBUSB_ERROR_NOT_FOUND if the configuration does not exist and another +Get a USB configuration descriptor with a specific bConfigurationValue. +This is +a non-blocking function which does not send request through the device. +Returns 0 +on success, LIBUSB_ERROR_NOT_FOUND if the configuration +does not exist and another LIBUSB_ERROR code on failure. -. .Pp .Ft void .Fn libusb_free_config_descriptor "libusb_config_descriptor *config" Free a configuration descriptor. -. .Pp .Ft int .Fn libusb_get_string_descriptor_ascii "libusb_device_handle *devh" "uint8_t desc_idx" "unsigned char *data" "int length" Retrieve a string descriptor in C style ascii. -Returns a positive number of bytes in the resulting ASCII string on success and a LIBUSB_ERROR code on failure. -. +Returns a positive number of bytes in the resulting ASCII string +on success and a LIBUSB_ERROR code on failure. .Pp -. .Sh USB ASYNCHRONOUS I/O -. .Pp .Ft struct libusb_transfer * .Fn libusb_alloc_transfer "int iso_packets" @@ -365,28 +311,24 @@ Allocate a transfer with .Fa iso_packets numbers of isochronous packet descriptors. Returns NULL on error. -. .Pp .Ft void .Fn libusb_free_transfer "struct libusb_transfer *tr" Free a transfer. -. .Pp .Ft int .Fn libusb_submit_transfer "struct libusb_transfer *tr" This function will submit a transfer and returns immediately. -Returns 0 on success, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and +Returns 0 on success, LIBUSB_ERROR_NO_DEVICE if +the device has been disconnected and LIBUSB_ERROR code on other failure. -. .Pp .Ft int .Fn libusb_cancel_transfer "struct libusb_transfer *tr" This function asynchronously cancel a transfer. Returns 0 on success and LIBUSB_ERROR code on failure. -. .Pp .Sh USB SYNCHRONOUS I/O -. .Pp .Ft int .Fn libusb_control_transfer "libusb_device_handle *devh" "uint8_t bmRequestType" "uint8_t bRequest" "uint16_t wValue" "uint16_t wIndex" "unsigned char *data" "uint16_t wLength" "unsigned int timeout" @@ -400,125 +342,121 @@ LIBUSB_ERROR_TIMEOUT if the transfer timeout, LIBUSB_ERROR_PIPE if the control request was not supported, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected or another LIBUSB_ERROR code on other failures. The libusb error codes are always negative. -. .Pp .Ft int .Fn libusb_bulk_transfer "struct libusb_device_handle *devh" "unsigned char endpoint" "unsigned char *data" "int length" "int *transferred" "unsigned int timeout" Perform an USB bulk transfer. A timeout value of zero means no timeout. The timeout value is given in milliseconds. -Returns 0 on success, LIBUSB_ERROR_TIMEOUT -if the transfer timeout, LIBUSB_ERROR_PIPE if the control request was not -supported, LIBUSB_ERROR_OVERFLOW if the device offered more data, -LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and +Returns 0 on success, LIBUSB_ERROR_TIMEOUT +if the transfer timeout, LIBUSB_ERROR_PIPE if the control request was not +supported, LIBUSB_ERROR_OVERFLOW if the device offered more data, +LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and LIBUSB_ERROR code on other failure. -. .Pp .Ft int .Fn libusb_interrupt_transfer "struct libusb_device_handle *devh" "unsigned char endpoint" "unsigned char *data" "int length" "int *transferred" "unsigned int timeout" Perform an USB Interrupt transfer. A timeout value of zero means no timeout. The timeout value is given in milliseconds. -Returns 0 on success, LIBUSB_ERROR_TIMEOUT -if the transfer timeout, LIBUSB_ERROR_PIPE if the control request was not -supported, LIBUSB_ERROR_OVERFLOW if the device offered more data, -LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and +Returns 0 on success, LIBUSB_ERROR_TIMEOUT +if the transfer timeout, LIBUSB_ERROR_PIPE if the control request was not +supported, LIBUSB_ERROR_OVERFLOW if the device offered more data, +LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and LIBUSB_ERROR code on other failure. -. .Pp .Sh USB EVENTS -. .Pp .Ft int .Fn libusb_try_lock_events "libusb_context *ctx" Try to acquire the event handling lock. Returns 0 if the lock was obtained and 1 if not. -. .Pp .Ft void .Fn libusb_lock_events "libusb_context *ctx" -Acquire the event handling lock. This function is blocking. -. +Acquire the event handling lock. +This function is blocking. .Pp .Ft void .Fn libusb_unlock_events "libusb_context *ctx" -Release the event handling lock. This will wake up any thread blocked +Release the event handling lock. +This will wake up any thread blocked on libusb_wait_for_event(). -. .Pp .Ft int .Fn libusb_event_handling_ok "libusb_context *ctx" -Determine if it still OK for this thread to be doing event handling. Returns 1 -if event handling can start or continue. Returns 0 if this thread must give up +Determine if it still OK for this thread to be doing event handling. +Returns 1 +if event handling can start or continue. +Returns 0 if this thread must give up the events lock. -. .Pp .Ft int .Fn libusb_event_handler_active "libusb_context *ctx" -Determine if an active thread is handling events. Returns 1 if yes and 0 if there +Determine if an active thread is handling events. +Returns 1 if yes and 0 if there are no threads currently handling events. -. .Pp .Ft void .Fn libusb_lock_event_waiters "libusb_context *ctx" -Acquire the event_waiters lock. This lock is designed to be obtained under the +Acquire the event_waiters lock. +This lock is designed to be obtained under the situation where you want to be aware when events are completed, but some other thread is event handling so calling libusb_handle_events() is not allowed. -. .Pp .Ft void .Fn libusb_unlock_event_waiters "libusb_context *ctx" Release the event_waiters lock. -. .Pp -.Ft int +.Ft int .Fn libusb_wait_for_event "libusb_context *ctx" "struct timeval *tv" -Wait for another thread to signal completion of an event. Must be called -with the event waiters lock held, see libusb_lock_event_waiters(). This will +Wait for another thread to signal completion of an event. +Must be called +with the event waiters lock held, see libusb_lock_event_waiters(). +This will block until the timeout expires or a transfer completes or a thread releases -the event handling lock through libusb_unlock_events(). Returns 0 after a +the event handling lock through libusb_unlock_events(). +Returns 0 after a transfer completes or another thread stops event handling, returns 1 if the timeout expired. -. .Pp .Ft int .Fn libusb_handle_events_timeout "libusb_context *ctx" "struct timeval *tv" -Handle any pending events by checking if timeouts have expired and by -checking the set of file descriptors for activity. Returns 0 on success, or a +Handle any pending events by checking if timeouts have expired and by +checking the set of file descriptors for activity. +Returns 0 on success, or a LIBUSB_ERROR code on failure. -. .Pp .Ft int .Fn libusb_handle_events "libusb_context *ctx" -Handle any pending events in blocking mode with a sensible timeout. Returns 0 +Handle any pending events in blocking mode with a sensible timeout. +Returns 0 on success, returns a LIBUSB_ERROR code on failure. -. .Pp .Ft int .Fn libusb_handle_events_locked "libusb_context *ctx" "struct timeval *tv" Handle any pending events by polling file desciptors, without checking if -another threads are already doing so. Must be called with the event lock held. -. +another threads are already doing so. +Must be called with the event lock held. .Pp .Ft int .Fn libusb_get_next_timeout "libusb_context *ctx" "struct timeval *tv" -Determine the next internal timeout that libusb needs to handle. Returns 0 +Determine the next internal timeout that libusb needs to handle. +Returns 0 if there are no pending timeouts, 1 if a timeout was returned, or LIBUSB_ERROR code on failure. -. .Pp .Ft void .Fn libusb_set_pollfd_notifiers "libusb_context *ctx" "libusb_pollfd_added_cb added_cb" "libusb_pollfd_removed_cb remove_cb" "void *user_data" Register notification functions for file descriptor additions/removals. These functions will be invoked for every new or removed file descriptor that libusb uses as an event source. -. .Pp .Ft const struct libusb_pollfd ** .Fn libusb_get_pollfds "libusb_context *ctx" -Retrive a list of file descriptors that should be polled by your main loop as -libusb event sources. Returns a NULL-terminated list on success or NULL on failure. -. +Retrive a list of file descriptors that should be polled by your main loop as +libusb event sources. +Returns a NULL-terminated list on success or NULL on failure. .Sh LIBUSB VERSION 0.1 COMPATIBILITY .Pp The library is also compliant with LibUSB version 0.1.12. @@ -555,16 +493,13 @@ The library is also compliant with LibUSB version 0.1.12. .Fn usb_check_connected .Fn usb_get_driver_np .Fn usb_detach_kernel_driver_np -. .Sh SEE ALSO .Xr libusb20 3 , .Xr usb 4 , .Xr usbconfig 8 .Pp .Pa http://libusb.sourceforge.net/ -. .Sh HISTORY -. .Nm support first appeared in .Fx 8.0 . From 11867070c69287052f3f64604f7d49e0a3511074 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Mon, 22 Aug 2011 21:10:50 +0000 Subject: [PATCH 308/452] Spelling corrections for LibUSB manual page (2/2). MFC after: 1 week Approved by: re (kib) PR: docs/159898 --- lib/libusb/libusb.3 | 134 +++++++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 64 deletions(-) diff --git a/lib/libusb/libusb.3 b/lib/libusb/libusb.3 index 780c1f6e1f4..1f52b9ec17e 100644 --- a/lib/libusb/libusb.3 +++ b/lib/libusb/libusb.3 @@ -33,7 +33,8 @@ .Nm libusb .Nd "USB access library" .Sh LIBRARY -USB access library (libusb -lusb) +USB access library +.Pq libusb, -lusb .Sh SYNOPSIS .In libusb.h .Sh DESCRIPTION @@ -46,8 +47,8 @@ The current implementation supports v1.0 of the libusb API. .Ft int .Fn libusb_init libusb_context **ctx This function initialises libusb. -Must be called at the beginning -of the program. +It must be called at the beginning +of the program, before other libusb routines are used. This function returns 0 on success or LIBUSB_ERROR on failure. .Pp @@ -55,35 +56,39 @@ failure. .Fn libusb_exit "libusb_context *ctx" Deinitialise libusb. Must be called at the end of the application. +Other libusb routines may not be called after this function. .Pp .Ft const char * .Fn libusb_strerror "int code" -Get ASCII representation of the error given by the +Get the ASCII representation of the error given by the .Fa code argument. .Pp .Ft void .Fn libusb_set_debug "libusb_context *ctx" "int level" -Set debug to the -.Fa level -level. +Set the debug level to +.Fa level . .Pp .Ft ssize_t .Fn libusb_get_device_list "libusb_context *ctx" "libusb_device ***list" -Fill into +Populate .Fa list -the list of usb device available. -All the device created by this -function must be unref and free when you are done with them. +with the list of usb devices available, adding a reference to each +device in the list. +All the list entries created by this +function must have their reference counter +decremented when you are done with them, +and the list itself must be freed. This -function returns the number of devices in list or a LIBUSB_ERROR code. +function returns the number of devices in the list or a LIBUSB_ERROR code. .Pp .Ft void .Fn libusb_free_device_list "libusb_device **list" "int unref_devices" Free the list of devices discovered by libusb_get_device_list. If .Fa unref_device -is set to 1 all devices are unref one time. +is set to 1 all devices in the list have their reference +counter decremented once. .Pp .Ft uint8_t .Fn libusb_get_bus_number "libusb_device *dev" @@ -120,13 +125,13 @@ Decrement the reference counter of the device .Fn libusb_open "libusb_device *dev" "libusb_device_handle **devh" Open a device and obtain a device_handle. Returns 0 on success, -LIBUSB_ERROR_NO_MEM on memory allocation problem, LIBUSB_ERROR_ACCESS -on permission problem, LIBUSB_ERROR_NO_DEVICE if the device has been -disconnected and a LIBUSB_ERROR code on error. +LIBUSB_ERROR_NO_MEM on memory allocation problems, LIBUSB_ERROR_ACCESS +on permissions problems, LIBUSB_ERROR_NO_DEVICE if the device has been +disconnected and a LIBUSB_ERROR code on other errors. .Pp .Ft libusb_device_handle * .Fn libusb_open_device_with_vid_pid "libusb_context *ctx" "uint16_t vid" "uint16_t pid" -Convenience function to open a device with is +A convenience function to open a device by vendor and product IDs .Fa vid and .Fa pid. @@ -150,7 +155,7 @@ and a LIBUSB_ERROR code on error. .Pp .Ft int .Fn libusb_set_configuration "libusb_device_handle *devh" "int config" -Set the active configuration +Set the active configuration to .Fa config for the device contained by .Fa devh. @@ -164,16 +169,16 @@ LIBUSB_ERROR code on failure. Claim an interface in a given libusb_handle .Fa devh. This is a non-blocking function. -It returns 0 success, LIBUSB_ERROR_NOT_FOUND +It returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the requested interface does not exist, LIBUSB_ERROR_BUSY if a program or driver has claimed the interface, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and a LIBUSB_ERROR code on failure. .Pp .Ft int .Fn libusb_release_interface "libusb_device_handle *devh" "int interface_number" -This function release an interface. -All the claimed interface must be released -before closing a device. +This function releases an interface. +All the claimed interfaces on a device must be released +before closing the device. Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the interface was not claimed, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and LIBUSB_ERROR on failure. @@ -184,7 +189,7 @@ Activate an alternate setting for an interface. Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the interface was not claimed or the requested setting does not exist, LIBUSB_ERROR_NO_DEVICE if the device has been -disconnected and LIBUSB_ERROR code on failure. +disconnected and a LIBUSB_ERROR code on failure. .Pp .Ft int .Fn libusb_clear_halt "libusb_device_handle *devh" "unsigned char endpoint" @@ -202,31 +207,30 @@ been disconnected and a LIBUSB_ERROR code on failure. .Pp .Ft int .Fn libusb_check_connected "libusb_device_handle *devh" -Test if USB device is still connected. +Test if the USB device is still connected. Returns 0 on success, -LIBUSB_ERROR_NO_DEVICE if has been disconnected and a LIBUSB_ERROR +LIBUSB_ERROR_NO_DEVICE if it has been disconnected and a LIBUSB_ERROR code on failure. .Pp .Ft int .Fn libusb_kernel_driver_active "libusb_device_handle *devh" "int interface" Determine if a driver is active on a interface. Returns 0 if no kernel driver -is active, returns 1 if a kernel driver is active, -returns LIBUSB_ERROR_NO_DEVICE -if the device has been disconnected and returns a LIBUSB_ERROR code on failure. +is active, 1 if a kernel driver is active, LIBUSB_ERROR_NO_DEVICE +if the device has been disconnected and a LIBUSB_ERROR code on failure. .Pp .Ft int .Fn libusb_get_driver "libusb_device_handle *devh" "int interface" "char *name" "int namelen" or .Ft int .Fn libusb_get_driver_np "libusb_device_handle *devh" "int interface" "char *name" "int namelen" -Gets the name of the driver attached to the given +Copy the name of the driver attached to the given .Fa device and .Fa interface -into the buffer given by +into the buffer .Fa name -and +of length .Fa namelen . Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if no kernel driver is attached to the given interface and LIBUSB_ERROR_INVALID_PARAM if the interface does @@ -242,7 +246,7 @@ or .Ft int .Fn libusb_detach_kernel_driver_np "libusb_device_handle *devh" "int interface" Detach a kernel driver from an interface. -This is needed to claim an interface required by a kernel driver. +This is needed to claim an interface already claimed by a kernel driver. Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if no kernel driver was active, LIBUSB_ERROR_INVALID_PARAM if the interface does not exist, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected @@ -251,11 +255,11 @@ This function is non-portable. .Pp .Ft int .Fn libusb_attach_kernel_driver "libusb_device_handle *devh" "int interface" -Re-attach an interface kernel driver previously detached. +Re-attach an interface kernel driver that was previously detached. Returns 0 on success, LIBUSB_ERROR_INVALID_PARAM if the interface does not exist, LIBUSB_ERROR_NO_DEVICE -if the device has been disconnect, LIBUSB_ERROR_BUSY if the driver cannot be +if the device has been disconnected, LIBUSB_ERROR_BUSY if the driver cannot be attached because the interface is claimed by a program or driver and a LIBUSB_ERROR code on failure. .Pp @@ -273,24 +277,25 @@ failure. .Fn libsub_get_active_config_descriptor "libusb_device *dev" "struct libusb_config_descriptor **config" Get the USB configuration descriptor for the active configuration. Returns 0 on -success, returns LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state -and returns another LIBUSB_ERROR code on error. +success, LIBUSB_ERROR_NOT_FOUND if the device is in +an unconfigured state +and a LIBUSB_ERROR code on error. .Pp .Ft int .Fn libusb_get_config_descriptor "libusb_device *dev" "uint8_t config_index" "libusb_config_descriptor **config" -Get USB configuration descriptor based on its index +Get a USB configuration descriptor based on its index .Fa idx. Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the configuration does not exist -and returns another LIBUSB_ERROR code on error. +and a LIBUSB_ERROR code on error. .Pp .Ft int .Fn libusb_get_config_descriptor_by_value "libusb_device *dev" "uint8 bConfigurationValue" "libusb_config_descriptor **config" Get a USB configuration descriptor with a specific bConfigurationValue. This is -a non-blocking function which does not send request through the device. +a non-blocking function which does not send a request through the device. Returns 0 on success, LIBUSB_ERROR_NOT_FOUND if the configuration -does not exist and another +does not exist and a LIBUSB_ERROR code on failure. .Pp .Ft void @@ -299,17 +304,17 @@ Free a configuration descriptor. .Pp .Ft int .Fn libusb_get_string_descriptor_ascii "libusb_device_handle *devh" "uint8_t desc_idx" "unsigned char *data" "int length" -Retrieve a string descriptor in C style ascii. -Returns a positive number of bytes in the resulting ASCII string +Retrieve a string descriptor in C style ASCII. +Returns the positive number of bytes in the resulting ASCII string on success and a LIBUSB_ERROR code on failure. .Pp .Sh USB ASYNCHRONOUS I/O .Pp .Ft struct libusb_transfer * .Fn libusb_alloc_transfer "int iso_packets" -Allocate a transfer with -.Fa iso_packets -numbers of isochronous packet descriptors. +Allocate a transfer with the number of isochronous packet descriptors +specified by +.Fa iso_packets . Returns NULL on error. .Pp .Ft void @@ -320,13 +325,13 @@ Free a transfer. .Fn libusb_submit_transfer "struct libusb_transfer *tr" This function will submit a transfer and returns immediately. Returns 0 on success, LIBUSB_ERROR_NO_DEVICE if -the device has been disconnected and +the device has been disconnected and a LIBUSB_ERROR code on other failure. .Pp .Ft int .Fn libusb_cancel_transfer "struct libusb_transfer *tr" -This function asynchronously cancel a transfer. -Returns 0 on success and LIBUSB_ERROR code on failure. +This function asynchronously cancels a transfer. +Returns 0 on success and a LIBUSB_ERROR code on failure. .Pp .Sh USB SYNCHRONOUS I/O .Pp @@ -334,14 +339,14 @@ Returns 0 on success and LIBUSB_ERROR code on failure. .Fn libusb_control_transfer "libusb_device_handle *devh" "uint8_t bmRequestType" "uint8_t bRequest" "uint16_t wValue" "uint16_t wIndex" "unsigned char *data" "uint16_t wLength" "unsigned int timeout" Perform a USB control transfer. Returns the actual number of bytes -transferred on success in the range from and including zero until and +transferred on success, in the range from and including zero up to and including .Fa wLength . -On error a libusb error code is returned, for example -LIBUSB_ERROR_TIMEOUT if the transfer timeout, LIBUSB_ERROR_PIPE if the +On error a LIBUSB_ERROR code is returned, for example +LIBUSB_ERROR_TIMEOUT if the transfer timed out, LIBUSB_ERROR_PIPE if the control request was not supported, LIBUSB_ERROR_NO_DEVICE if the -device has been disconnected or another LIBUSB_ERROR code on other failures. -The libusb error codes are always negative. +device has been disconnected and another LIBUSB_ERROR code on other failures. +The LIBUSB_ERROR codes are all negative. .Pp .Ft int .Fn libusb_bulk_transfer "struct libusb_device_handle *devh" "unsigned char endpoint" "unsigned char *data" "int length" "int *transferred" "unsigned int timeout" @@ -349,10 +354,10 @@ Perform an USB bulk transfer. A timeout value of zero means no timeout. The timeout value is given in milliseconds. Returns 0 on success, LIBUSB_ERROR_TIMEOUT -if the transfer timeout, LIBUSB_ERROR_PIPE if the control request was not +if the transfer timed out, LIBUSB_ERROR_PIPE if the control request was not supported, LIBUSB_ERROR_OVERFLOW if the device offered more data, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and -LIBUSB_ERROR code on other failure. +a LIBUSB_ERROR code on other failure. .Pp .Ft int .Fn libusb_interrupt_transfer "struct libusb_device_handle *devh" "unsigned char endpoint" "unsigned char *data" "int length" "int *transferred" "unsigned int timeout" @@ -360,10 +365,10 @@ Perform an USB Interrupt transfer. A timeout value of zero means no timeout. The timeout value is given in milliseconds. Returns 0 on success, LIBUSB_ERROR_TIMEOUT -if the transfer timeout, LIBUSB_ERROR_PIPE if the control request was not +if the transfer timed out, LIBUSB_ERROR_PIPE if the control request was not supported, LIBUSB_ERROR_OVERFLOW if the device offered more data, LIBUSB_ERROR_NO_DEVICE if the device has been disconnected and -LIBUSB_ERROR code on other failure. +a LIBUSB_ERROR code on other failure. .Pp .Sh USB EVENTS .Pp @@ -381,7 +386,8 @@ This function is blocking. .Fn libusb_unlock_events "libusb_context *ctx" Release the event handling lock. This will wake up any thread blocked -on libusb_wait_for_event(). +on +.B libusb_wait_for_event() . .Pp .Ft int .Fn libusb_event_handling_ok "libusb_context *ctx" @@ -394,13 +400,13 @@ the events lock. .Ft int .Fn libusb_event_handler_active "libusb_context *ctx" Determine if an active thread is handling events. -Returns 1 if yes and 0 if there +Returns 1 if there is a thread handling events and 0 if there are no threads currently handling events. .Pp .Ft void .Fn libusb_lock_event_waiters "libusb_context *ctx" Acquire the event_waiters lock. -This lock is designed to be obtained under the +This lock is designed to be obtained in the situation where you want to be aware when events are completed, but some other thread is event handling so calling libusb_handle_events() is not allowed. .Pp @@ -417,7 +423,7 @@ This will block until the timeout expires or a transfer completes or a thread releases the event handling lock through libusb_unlock_events(). Returns 0 after a -transfer completes or another thread stops event handling, returns 1 if the +transfer completes or another thread stops event handling, and 1 if the timeout expired. .Pp .Ft int @@ -431,19 +437,19 @@ LIBUSB_ERROR code on failure. .Fn libusb_handle_events "libusb_context *ctx" Handle any pending events in blocking mode with a sensible timeout. Returns 0 -on success, returns a LIBUSB_ERROR code on failure. +on success and a LIBUSB_ERROR code on failure. .Pp .Ft int .Fn libusb_handle_events_locked "libusb_context *ctx" "struct timeval *tv" Handle any pending events by polling file desciptors, without checking if -another threads are already doing so. +another thread is already doing so. Must be called with the event lock held. .Pp .Ft int .Fn libusb_get_next_timeout "libusb_context *ctx" "struct timeval *tv" Determine the next internal timeout that libusb needs to handle. Returns 0 -if there are no pending timeouts, 1 if a timeout was returned, or LIBUSB_ERROR +if there are no pending timeouts, 1 if a timeout was returned, or a LIBUSB_ERROR code on failure. .Pp .Ft void From 0ad2addc9d8b5b2459379d9c545419de6c97ff49 Mon Sep 17 00:00:00 2001 From: Sergey Kandaurov Date: Mon, 22 Aug 2011 23:39:40 +0000 Subject: [PATCH 309/452] Fix if_addr_mtx recursion in mld6. mld_set_version() is called only from mld_v1_input_query() and mld_v2_input_query() both holding the if_addr_mtx lock, and then calling into mld_v2_cancel_link_timers() acquires it the second time, which results in mtx recursion. To avoid that, delay if_addr_mtx acquisition until after mld_set_version() is called; while here, further reduce locking scope to protect only the needed pieces: if_multiaddrs, in6m_lookup_locked(). PR: kern/158426 Reported by: Thomas , Tom Vijlbrief Tested by: Tom Vijlbrief Reviewed by: bz Approved by: re (kib) --- sys/netinet6/mld6.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/sys/netinet6/mld6.c b/sys/netinet6/mld6.c index 21d9eabe363..a56f83d2f74 100644 --- a/sys/netinet6/mld6.c +++ b/sys/netinet6/mld6.c @@ -680,7 +680,6 @@ mld_v1_input_query(struct ifnet *ifp, const struct ip6_hdr *ip6, IN6_MULTI_LOCK(); MLD_LOCK(); - IF_ADDR_LOCK(ifp); /* * Switch to MLDv1 host compatibility mode. @@ -693,6 +692,7 @@ mld_v1_input_query(struct ifnet *ifp, const struct ip6_hdr *ip6, if (timer == 0) timer = 1; + IF_ADDR_LOCK(ifp); if (is_general_query) { /* * For each reporting group joined on this @@ -888,7 +888,6 @@ mld_v2_input_query(struct ifnet *ifp, const struct ip6_hdr *ip6, IN6_MULTI_LOCK(); MLD_LOCK(); - IF_ADDR_LOCK(ifp); mli = MLD_IFINFO(ifp); KASSERT(mli != NULL, ("%s: no mld_ifinfo for ifp %p", __func__, ifp)); @@ -936,14 +935,18 @@ mld_v2_input_query(struct ifnet *ifp, const struct ip6_hdr *ip6, * Queries for groups we are not a member of on this * link are simply ignored. */ + IF_ADDR_LOCK(ifp); inm = in6m_lookup_locked(ifp, &mld->mld_addr); - if (inm == NULL) + if (inm == NULL) { + IF_ADDR_UNLOCK(ifp); goto out_locked; + } if (nsrc > 0) { if (!ratecheck(&inm->in6m_lastgsrtv, &V_mld_gsrdelay)) { CTR1(KTR_MLD, "%s: GS query throttled.", __func__); + IF_ADDR_UNLOCK(ifp); goto out_locked; } } @@ -961,10 +964,10 @@ mld_v2_input_query(struct ifnet *ifp, const struct ip6_hdr *ip6, /* XXX Clear embedded scope ID as userland won't expect it. */ in6_clearscope(&mld->mld_addr); + IF_ADDR_UNLOCK(ifp); } out_locked: - IF_ADDR_UNLOCK(ifp); MLD_UNLOCK(); IN6_MULTI_UNLOCK(); From 5373cf4e34c821c8890b6af5d04f0790c8d195e4 Mon Sep 17 00:00:00 2001 From: "Andrey V. Elsukov" Date: Tue, 23 Aug 2011 08:47:27 +0000 Subject: [PATCH 310/452] Fix lock leak. Reported by: Alex Lyashkov Approved by: re (kib) MFC after: 1 week --- sys/ufs/ufs/ufs_extattr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/ufs/ufs/ufs_extattr.c b/sys/ufs/ufs/ufs_extattr.c index 032d9cc3421..777f3851604 100644 --- a/sys/ufs/ufs/ufs_extattr.c +++ b/sys/ufs/ufs/ufs_extattr.c @@ -1031,14 +1031,14 @@ vop_setextattr { struct ufsmount *ump = VFSTOUFS(mp); int error; - ufs_extattr_uepm_lock(ump, ap->a_td); - /* * XXX: No longer a supported way to delete extended attributes. */ if (ap->a_uio == NULL) return (EINVAL); + ufs_extattr_uepm_lock(ump, ap->a_td); + error = ufs_extattr_set(ap->a_vp, ap->a_attrnamespace, ap->a_name, ap->a_uio, ap->a_cred, ap->a_td); From 806f9b4262abe1ee7652e0b9853fd38ccb8b5cd2 Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Tue, 23 Aug 2011 13:17:09 +0000 Subject: [PATCH 311/452] Fix nfsstat(1) so that it prints out correct stats for the new NFS server when the "-w" option is used. The problem was spotted by hrs@ during testing where srvrpcnt[] must be indexed by NFSV4OP_XXX and not NFSPROC_XXX. Submitted by: hrs Approved by: re (bz) MFC after: 2 weeks --- usr.bin/nfsstat/nfsstat.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/usr.bin/nfsstat/nfsstat.c b/usr.bin/nfsstat/nfsstat.c index b8f29e66bf6..8ebc8f9b1c8 100644 --- a/usr.bin/nfsstat/nfsstat.c +++ b/usr.bin/nfsstat/nfsstat.c @@ -1000,24 +1000,24 @@ exp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly) if (serverOnly) { printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", ((clientOnly && serverOnly) ? "Server:" : ""), - nfsstats.srvrpccnt[NFSPROC_GETATTR] - - lastst.srvrpccnt[NFSPROC_GETATTR], - nfsstats.srvrpccnt[NFSPROC_LOOKUP] - - lastst.srvrpccnt[NFSPROC_LOOKUP], - nfsstats.srvrpccnt[NFSPROC_READLINK] - - lastst.srvrpccnt[NFSPROC_READLINK], - nfsstats.srvrpccnt[NFSPROC_READ] - - lastst.srvrpccnt[NFSPROC_READ], - nfsstats.srvrpccnt[NFSPROC_WRITE] - - lastst.srvrpccnt[NFSPROC_WRITE], - nfsstats.srvrpccnt[NFSPROC_RENAME] - - lastst.srvrpccnt[NFSPROC_RENAME], - nfsstats.srvrpccnt[NFSPROC_ACCESS] - - lastst.srvrpccnt[NFSPROC_ACCESS], - (nfsstats.srvrpccnt[NFSPROC_READDIR] - - lastst.srvrpccnt[NFSPROC_READDIR]) + - (nfsstats.srvrpccnt[NFSPROC_READDIRPLUS] - - lastst.srvrpccnt[NFSPROC_READDIRPLUS])); + nfsstats.srvrpccnt[NFSV4OP_GETATTR] - + lastst.srvrpccnt[NFSV4OP_GETATTR], + nfsstats.srvrpccnt[NFSV4OP_LOOKUP] - + lastst.srvrpccnt[NFSV4OP_LOOKUP], + nfsstats.srvrpccnt[NFSV4OP_READLINK] - + lastst.srvrpccnt[NFSV4OP_READLINK], + nfsstats.srvrpccnt[NFSV4OP_READ] - + lastst.srvrpccnt[NFSV4OP_READ], + nfsstats.srvrpccnt[NFSV4OP_WRITE] - + lastst.srvrpccnt[NFSV4OP_WRITE], + nfsstats.srvrpccnt[NFSV4OP_RENAME] - + lastst.srvrpccnt[NFSV4OP_RENAME], + nfsstats.srvrpccnt[NFSV4OP_ACCESS] - + lastst.srvrpccnt[NFSV4OP_ACCESS], + (nfsstats.srvrpccnt[NFSV4OP_READDIR] - + lastst.srvrpccnt[NFSV4OP_READDIR]) + + (nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS] - + lastst.srvrpccnt[NFSV4OP_READDIRPLUS])); printf("\n"); lastst = nfsstats; } From 34ff1d08f6360a3bac09cc2b5553578422340710 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 23 Aug 2011 13:36:09 +0000 Subject: [PATCH 312/452] These timer registers are all 1uS in resolution in AR5416 or later. Previous hardware had some as TU, some as 1/8th TU. * Modify AR_NEXT_DBA and AR_NEXT_SWBA to use a new macro, ONE_EIGHTH_TU_TO_USEC(), which converts the 1/8th TU fields to USEC. This is just cosmetic and matches the Atheros reference driver. * Fix AR_NEXT_TBTT, which is USEC, not TU. Submitted by: paradyse@gmail.com Approved by: re (kib, blanket) --- sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c b/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c index 66b50537de9..e4aeb8d16c6 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c @@ -26,6 +26,7 @@ #include "ar5416/ar5416phy.h" #define TU_TO_USEC(_tu) ((_tu) << 10) +#define ONE_EIGHTH_TU_TO_USEC(_tu8) ((_tu8) << 7) /* * Initialize all of the hardware registers used to @@ -38,8 +39,8 @@ ar5416SetBeaconTimers(struct ath_hal *ah, const HAL_BEACON_TIMERS *bt) uint32_t bperiod; OS_REG_WRITE(ah, AR_NEXT_TBTT, TU_TO_USEC(bt->bt_nexttbtt)); - OS_REG_WRITE(ah, AR_NEXT_DBA, TU_TO_USEC(bt->bt_nextdba) >> 3); - OS_REG_WRITE(ah, AR_NEXT_SWBA, TU_TO_USEC(bt->bt_nextswba) >> 3); + OS_REG_WRITE(ah, AR_NEXT_DBA, ONE_EIGHTH_TU_TO_USEC(bt->bt_nextdba)); + OS_REG_WRITE(ah, AR_NEXT_SWBA, ONE_EIGHTH_TU_TO_USEC(bt->bt_nextswba)); OS_REG_WRITE(ah, AR_NEXT_NDP, TU_TO_USEC(bt->bt_nextatim)); bperiod = TU_TO_USEC(bt->bt_intval & HAL_BEACON_PERIOD); @@ -144,7 +145,7 @@ ar5416SetStaBeaconTimers(struct ath_hal *ah, const HAL_BEACON_STATE *bs) /* NB: no cfp setting since h/w automatically takes care */ - OS_REG_WRITE(ah, AR_NEXT_TBTT, bs->bs_nexttbtt); + OS_REG_WRITE(ah, AR_NEXT_TBTT, TU_TO_USEC(bs->bs_nexttbtt)); /* * Start the beacon timers by setting the BEACON register From 002c2778b12e2ac6ea22b939966925549db9e967 Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Tue, 23 Aug 2011 13:44:56 +0000 Subject: [PATCH 313/452] Fix nfsstat(1) so that it prints out correct stats for the new NFS server when the "-e" option is not used. The bug was that srvrpccnt[] was being indexed by NFSPROC_XXX when it needs to be indexed by NFSV4OP_XXX. Tested by: hrs Approved by: re (bz) --- usr.bin/nfsstat/nfsstat.c | 46 +++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/usr.bin/nfsstat/nfsstat.c b/usr.bin/nfsstat/nfsstat.c index 8ebc8f9b1c8..dc73a695888 100644 --- a/usr.bin/nfsstat/nfsstat.c +++ b/usr.bin/nfsstat/nfsstat.c @@ -444,14 +444,14 @@ intpr(int clientOnly, int serverOnly) nfsrvstats.srvrpccnt[NFSPROC_REMOVE]); else printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", - ext_nfsstats.srvrpccnt[NFSPROC_GETATTR], - ext_nfsstats.srvrpccnt[NFSPROC_SETATTR], - ext_nfsstats.srvrpccnt[NFSPROC_LOOKUP], - ext_nfsstats.srvrpccnt[NFSPROC_READLINK], - ext_nfsstats.srvrpccnt[NFSPROC_READ], - ext_nfsstats.srvrpccnt[NFSPROC_WRITE], - ext_nfsstats.srvrpccnt[NFSPROC_CREATE], - ext_nfsstats.srvrpccnt[NFSPROC_REMOVE]); + ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], + ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], + ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], + ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], + ext_nfsstats.srvrpccnt[NFSV4OP_READ], + ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], + ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], + ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", "Rename", "Link", "Symlink", "Mkdir", "Rmdir", "Readdir", "RdirPlus", "Access"); @@ -467,14 +467,14 @@ intpr(int clientOnly, int serverOnly) nfsrvstats.srvrpccnt[NFSPROC_ACCESS]); else printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", - ext_nfsstats.srvrpccnt[NFSPROC_RENAME], - ext_nfsstats.srvrpccnt[NFSPROC_LINK], - ext_nfsstats.srvrpccnt[NFSPROC_SYMLINK], - ext_nfsstats.srvrpccnt[NFSPROC_MKDIR], - ext_nfsstats.srvrpccnt[NFSPROC_RMDIR], - ext_nfsstats.srvrpccnt[NFSPROC_READDIR], - ext_nfsstats.srvrpccnt[NFSPROC_READDIRPLUS], - ext_nfsstats.srvrpccnt[NFSPROC_ACCESS]); + ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], + ext_nfsstats.srvrpccnt[NFSV4OP_LINK], + ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], + ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], + ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], + ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], + ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], + ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); if (run_v4 == 0) @@ -486,11 +486,11 @@ intpr(int clientOnly, int serverOnly) nfsrvstats.srvrpccnt[NFSPROC_COMMIT]); else printf("%9d %9d %9d %9d %9d\n", - ext_nfsstats.srvrpccnt[NFSPROC_MKNOD], - ext_nfsstats.srvrpccnt[NFSPROC_FSSTAT], - ext_nfsstats.srvrpccnt[NFSPROC_FSINFO], - ext_nfsstats.srvrpccnt[NFSPROC_PATHCONF], - ext_nfsstats.srvrpccnt[NFSPROC_COMMIT]); + ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], + ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], + ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], + ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], + ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]); printf("Server Ret-Failed\n"); if (run_v4 == 0) printf("%17d\n", nfsrvstats.srvrpc_errs); @@ -531,8 +531,8 @@ intpr(int clientOnly, int serverOnly) * only useful for NFSv2. */ printf("%9d %9d %9d\n", - ext_nfsstats.srvrpccnt[NFSPROC_WRITE], - ext_nfsstats.srvrpccnt[NFSPROC_WRITE], 0); + ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], + ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0); } } From aefb9fe04fa154de40cc1b9a72cc5d77228358f2 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Tue, 23 Aug 2011 19:29:11 +0000 Subject: [PATCH 314/452] Honor WITHOUT_IPX when installing etc/rc.d/ipxrouted. MFC after: 1 week Approved by: re (kib) --- etc/rc.d/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/etc/rc.d/Makefile b/etc/rc.d/Makefile index c250e6656e8..fc09cafc4bb 100644 --- a/etc/rc.d/Makefile +++ b/etc/rc.d/Makefile @@ -16,7 +16,7 @@ FILES= DAEMON FILESYSTEMS LOGIN NETWORKING SERVERS \ hostapd hostid hostid_save hostname \ inetd initrandom \ ip6addrctl ipfilter ipfs ipfw ipmon \ - ipnat ipsec ipxrouted \ + ipnat ipsec \ jail \ kadmind kerberos keyserv kld kldxref kpasswdd \ ldconfig local localpkg lockd lpd \ @@ -42,6 +42,10 @@ FILES= DAEMON FILESYSTEMS LOGIN NETWORKING SERVERS \ ypset ypupdated ypxfrd \ zfs zvol +.if ${MK_IPX} != "no" +FILES+= ipxrouted +.endif + .if ${MK_OFED} != "no" FILES+= opensm .endif From b958f4853c61ef56cf0ef144df6ced35ff137a8f Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Tue, 23 Aug 2011 19:49:06 +0000 Subject: [PATCH 315/452] Fix buffer overflow and possible ISO image corruption in wrong handling of "." character case in makefs ISO level 1 and 2 filename conversion. Filed as NetBSD PR #45285 http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=45285 Reviewed by: Christos Zoulas Approved by: re (kib) MFC after: 3 days --- usr.sbin/makefs/cd9660.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/usr.sbin/makefs/cd9660.c b/usr.sbin/makefs/cd9660.c index 44af9840bd2..b9e800d5ff0 100644 --- a/usr.sbin/makefs/cd9660.c +++ b/usr.sbin/makefs/cd9660.c @@ -1627,7 +1627,7 @@ cd9660_level1_convert_filename(const char *oldname, char *newname, int is_file) int extlen = 0; int found_ext = 0; - while (*oldname != '\0') { + while (*oldname != '\0' && extlen < 3) { /* Handle period first, as it is special */ if (*oldname == '.') { if (found_ext) { @@ -1644,10 +1644,8 @@ cd9660_level1_convert_filename(const char *oldname, char *newname, int is_file) *oldname == ',' && strlen(oldname) == 4) break; /* Enforce 12.3 / 8 */ - if (((namelen == 8) && !found_ext) || - (found_ext && extlen == 3)) { + if (namelen == 8 && !found_ext) break; - } if (islower((unsigned char)*oldname)) *newname++ = toupper((unsigned char)*oldname); @@ -1690,7 +1688,7 @@ cd9660_level2_convert_filename(const char *oldname, char *newname, int is_file) int extlen = 0; int found_ext = 0; - while (*oldname != '\0') { + while (*oldname != '\0' && namelen + extlen < 30) { /* Handle period first, as it is special */ if (*oldname == '.') { if (found_ext) { @@ -1710,8 +1708,6 @@ cd9660_level2_convert_filename(const char *oldname, char *newname, int is_file) if (diskStructure.archimedes_enabled && *oldname == ',' && strlen(oldname) == 4) break; - if ((namelen + extlen) == 30) - break; if (islower((unsigned char)*oldname)) *newname++ = toupper((unsigned char)*oldname); From 796fc1b22f91f76e02642168ca9a042c937df5dd Mon Sep 17 00:00:00 2001 From: Dmitry Morozovsky Date: Tue, 23 Aug 2011 20:25:11 +0000 Subject: [PATCH 316/452] Add kern.cam.boot_delay description (with reasonable default) to default/loader.conf This should help people installing ${OS} to USB devices, where there are frequently cases where kernel tries to mount root before actual umass sensing is finished. Reviewed by: mav Approved by: re (kib) MFC after: 1 week --- sys/boot/forth/loader.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/boot/forth/loader.conf b/sys/boot/forth/loader.conf index 46a1bbefbe8..c8abe58018e 100644 --- a/sys/boot/forth/loader.conf +++ b/sys/boot/forth/loader.conf @@ -109,6 +109,8 @@ module_path="/boot/modules" # Set the module search path #kern.ncallout="" # Set the maximum # of timer events #kern.ngroups="1023" # Set the maximum # of supplemental groups #kern.sgrowsiz="" # Set the amount to grow stack +#kern.cam.boot_delay="10000" # Delay (in ms) of root mount for CAM bus + # registration, useful for USB sticks as root #kern.cam.scsi_delay="2000" # Delay (in ms) before probing SCSI #kern.ipc.maxsockets="" # Set the maximum number of sockets avaliable #kern.ipc.nmbclusters="" # Set the number of mbuf clusters From 607756e9de40e82f6cc9c48beecb4af6fce2f7dc Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 24 Aug 2011 00:45:53 +0000 Subject: [PATCH 317/452] TIM/Timer fixes for AR5416 and later: * Fix SLEEP1/SLEEP2 register definitions; the CAB/Beacon timeout fields have changed in AR5416 and later * The TIM_PERIOD and DTIM_PERIOD registers are now microsecond fields, not TU. Obtained from: Linux ath9k, Atheros reference Approved by: re (kib, blanket) --- sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c | 14 +++++++++----- sys/dev/ath/ath_hal/ar5416/ar5416reg.h | 8 ++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c b/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c index e4aeb8d16c6..8a36cf557df 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c @@ -222,15 +222,19 @@ ar5416SetStaBeaconTimers(struct ath_hal *ah, const HAL_BEACON_STATE *bs) OS_REG_WRITE(ah, AR_NEXT_TIM, TU_TO_USEC(nextTbtt - SLEEP_SLOP)); /* cab timeout is now in 1/8 TU */ - OS_REG_WRITE(ah, AR_SLEEP1, + OS_REG_WRITE(ah, AR5416_SLEEP1, SM((CAB_TIMEOUT_VAL << 3), AR5416_SLEEP1_CAB_TIMEOUT) - | AR_SLEEP1_ASSUME_DTIM); + | AR5416_SLEEP1_ASSUME_DTIM); + + /* XXX autosleep? Use min beacon timeout; check ath9k -adrian */ /* beacon timeout is now in 1/8 TU */ - OS_REG_WRITE(ah, AR_SLEEP2, + OS_REG_WRITE(ah, AR5416_SLEEP2, SM((BEACON_TIMEOUT_VAL << 3), AR5416_SLEEP2_BEACON_TIMEOUT)); - OS_REG_WRITE(ah, AR_TIM_PERIOD, beaconintval); - OS_REG_WRITE(ah, AR_DTIM_PERIOD, dtimperiod); + /* TIM_PERIOD and DTIM_PERIOD are now in uS. */ + OS_REG_WRITE(ah, AR_TIM_PERIOD, TU_TO_USEC(beaconintval)); + OS_REG_WRITE(ah, AR_DTIM_PERIOD, TU_TO_USEC(dtimperiod)); + OS_REG_SET_BIT(ah, AR_TIMER_MODE, AR_TIMER_MODE_TBTT | AR_TIMER_MODE_TIM | AR_TIMER_MODE_DTIM); HALDEBUG(ah, HAL_DEBUG_BEACON, "%s: next DTIM %d\n", diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416reg.h b/sys/dev/ath/ath_hal/ar5416/ar5416reg.h index 561c5b41b38..6d1c272eb71 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416reg.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416reg.h @@ -79,6 +79,13 @@ #endif /* AH_SUPPORT_AR9130 */ #define AR_RESET_TSF 0x8020 + +/* + * AR_SLEEP1 / AR_SLEEP2 are in the same place as in + * AR5212, however the fields have changed. + */ +#define AR5416_SLEEP1 0x80d4 +#define AR5416_SLEEP2 0x80d8 #define AR_RXFIFO_CFG 0x8114 #define AR_PHY_ERR_1 0x812c #define AR_PHY_ERR_MASK_1 0x8130 /* mask for AR_PHY_ERR_1 */ @@ -402,6 +409,7 @@ #define AR9271_AN_RF2G6_OFFS_S 20 /* Sleep control */ +#define AR5416_SLEEP1_ASSUME_DTIM 0x00080000 #define AR5416_SLEEP1_CAB_TIMEOUT 0xFFE00000 /* Cab timeout (TU) */ #define AR5416_SLEEP1_CAB_TIMEOUT_S 22 From fa3324c985708cfe0407fd5aee2955e2f5b88426 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 24 Aug 2011 08:53:33 +0000 Subject: [PATCH 318/452] This patch fixes beacon frame sequence number generation. The code didn't set a sequence number; it didn't show up earlier because the hardware most people use for hostap (ie, AR5212 series stuff) sets the sequence numbers up in hardware. Later hardware (AR5416, etc) which can do 11n and aggregation require sequence numbers to be generated in software. Submitted by: paradyse@gmail.com Approved by: re (kib) --- sys/net80211/ieee80211_output.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c index 6020144ef7c..bcd3c2bdac5 100644 --- a/sys/net80211/ieee80211_output.c +++ b/sys/net80211/ieee80211_output.c @@ -2792,6 +2792,8 @@ ieee80211_beacon_update(struct ieee80211_node *ni, struct ieee80211com *ic = ni->ni_ic; int len_changed = 0; uint16_t capinfo; + struct ieee80211_frame *wh; + ieee80211_seq seqno; IEEE80211_LOCK(ic); /* @@ -2823,6 +2825,12 @@ ieee80211_beacon_update(struct ieee80211_node *ni, return 1; /* just assume length changed */ } + wh = mtod(m, struct ieee80211_frame *); + seqno = ni->ni_txseqs[IEEE80211_NONQOS_TID]++; + *(uint16_t *)&wh->i_seq[0] = + htole16(seqno << IEEE80211_SEQ_SEQ_SHIFT); + M_SEQNO_SET(m, seqno); + /* XXX faster to recalculate entirely or just changes? */ capinfo = ieee80211_getcapinfo(vap, ni->ni_chan); *bo->bo_caps = htole16(capinfo); From 376271fb4c5bf5de40f81bfbfbee5c71501f0fb4 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Wed, 24 Aug 2011 09:08:07 +0000 Subject: [PATCH 319/452] Add ID for ASMedia ASM1061 2-port PCIe 2.0 x1 6Gb/s SATA controller. Approved by: re (blackend) MFC after: 1 week --- sys/dev/ahci/ahci.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c index ccb4bc0835a..7be4cdb1f28 100644 --- a/sys/dev/ahci/ahci.c +++ b/sys/dev/ahci/ahci.c @@ -128,6 +128,7 @@ static struct { {0x43931002, 0x00, "ATI IXP700", 0}, {0x43941002, 0x00, "ATI IXP800", 0}, {0x43951002, 0x00, "ATI IXP800", 0}, + {0x06121b21, 0x00, "ASMedia ASM1061", 0}, {0x26528086, 0x00, "Intel ICH6", AHCI_Q_NOFORCE}, {0x26538086, 0x00, "Intel ICH6M", AHCI_Q_NOFORCE}, {0x26818086, 0x00, "Intel ESB2", 0}, From 630f2154f2b9bde6c2e9e7763da8cf5705e93567 Mon Sep 17 00:00:00 2001 From: Glen Barber Date: Wed, 24 Aug 2011 12:18:29 +0000 Subject: [PATCH 320/452] Reword sentence noting UPDATING entries prior to October 2007 are only available in older FreeBSD releases. PR: 159220 Submitted by: arundel Patch by: Benjamin Kaduk (kaduk % mit ! edu) OK'd by: imp (via -doc@) MFC after: 1 week Approved by: re (kib) --- UPDATING | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/UPDATING b/UPDATING index 8488eb5f18f..1df41b8c3b1 100644 --- a/UPDATING +++ b/UPDATING @@ -1456,9 +1456,10 @@ COMMON ITEMS: FORMAT: This file contains a list, in reverse chronological order, of major -breakages in tracking -current. Not all things will be listed here, -and it only starts on October 16, 2004. Updating files can found in -previous releases if your system is older than this. +breakages in tracking -current. It is not guaranteed to be a complete +list of such breakages, and only contains entries since October 10, 2007. +If you need to see UPDATING entries from before that date, you will need +to fetch an UPDATING file from an older FreeBSD release. Copyright information: From f3fb16875ce6de5f348adb955caac61755e49879 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 24 Aug 2011 14:11:00 +0000 Subject: [PATCH 321/452] Fix a missing initialisation of bt_flags when setting up the TDMA beacon. The AR5212 HAL didn't check this field; timers are enabled a different way. The AR5416 HAL however did, and since this field was uninitialised, it had whatever was on the stack at the time. This lead to "unpredictable" behaviour. This allows TDMA to work on the AR5416 and later chipsets. Thanks to: paradyse@gmail.com Approved by: re (kib, blanket) --- sys/dev/ath/if_ath.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index 0fcb815f1fa..a717323ca2d 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -5485,6 +5485,8 @@ ath_tdma_settimers(struct ath_softc *sc, u_int32_t nexttbtt, u_int32_t bintval) bt.bt_nextdba = (nexttbtt<<3) - sc->sc_tdmadbaprep; bt.bt_nextswba = (nexttbtt<<3) - sc->sc_tdmaswbaprep; bt.bt_nextatim = nexttbtt+1; + /* Enables TBTT, DBA, SWBA timers by default */ + bt.bt_flags = 0; ath_hal_beaconsettimers(ah, &bt); } From 0e9a2605200b721fdfcf32d2c95f79a81fc84352 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Wed, 24 Aug 2011 20:05:13 +0000 Subject: [PATCH 322/452] Rtld links with the specially built pic static libc library to get some C runtime services, like printf(). Unfortunately, the multithread-safeness measures in the libc do not work in rtld environment. Rip the kernel printf() implementation and use it in the rtld instead of libc version. This printf does not require any shared global data and thus is mt-safe. Systematically use rtld_printf() and related functions, remove the calls to err(3). Note that stdio is still pulled from libc due to libmap implementaion using fopen(). This is safe but unoptimal, and can be changed later. Reported and tested by: pgj Diagnosed and reviewed by: kan (previous version) Approved by: re (bz) --- libexec/rtld-elf/Makefile | 2 +- libexec/rtld-elf/debug.c | 24 +- libexec/rtld-elf/malloc.c | 25 +- libexec/rtld-elf/rtld.c | 31 ++- libexec/rtld-elf/rtld.h | 1 + libexec/rtld-elf/rtld_lock.c | 2 - libexec/rtld-elf/rtld_printf.c | 482 +++++++++++++++++++++++++++++++++ libexec/rtld-elf/rtld_printf.h | 44 +++ libexec/rtld-elf/xmalloc.c | 16 +- 9 files changed, 573 insertions(+), 54 deletions(-) create mode 100644 libexec/rtld-elf/rtld_printf.c create mode 100644 libexec/rtld-elf/rtld_printf.h diff --git a/libexec/rtld-elf/Makefile b/libexec/rtld-elf/Makefile index 95bec19eed1..2e7925e1c69 100644 --- a/libexec/rtld-elf/Makefile +++ b/libexec/rtld-elf/Makefile @@ -5,7 +5,7 @@ MK_SSP= no PROG?= ld-elf.so.1 SRCS= rtld_start.S \ - reloc.c rtld.c rtld_lock.c map_object.c \ + reloc.c rtld.c rtld_lock.c rtld_printf.c map_object.c \ malloc.c xmalloc.c debug.c libmap.c MAN= rtld.1 CSTD?= gnu99 diff --git a/libexec/rtld-elf/debug.c b/libexec/rtld-elf/debug.c index 3b7611c6e63..8f8311c7793 100644 --- a/libexec/rtld-elf/debug.c +++ b/libexec/rtld-elf/debug.c @@ -34,6 +34,7 @@ #include "debug.h" #include "rtld.h" +#include "rtld_printf.h" static const char rel_header[] = " symbol name r_info r_offset st_value st_size address value\n" @@ -49,9 +50,8 @@ debug_printf(const char *format, ...) va_list ap; va_start(ap, format); - fflush(stdout); - vfprintf(stderr, format, ap); - putc('\n', stderr); + rtld_vfdprintf(STDERR_FILENO, format, ap); + rtld_fdputchar(STDERR_FILENO, '\n'); va_end(ap); } @@ -71,28 +71,28 @@ void dump_obj_relocations (Obj_Entry *obj) { - printf("Object \"%s\", relocbase %p\n", obj->path, obj->relocbase); + rtld_printf("Object \"%s\", relocbase %p\n", obj->path, obj->relocbase); if (obj->relsize) { - printf("Non-PLT Relocations: %ld\n", + rtld_printf("Non-PLT Relocations: %ld\n", (obj->relsize / sizeof(Elf_Rel))); dump_Elf_Rel(obj, obj->rel, obj->relsize); } if (obj->relasize) { - printf("Non-PLT Relocations with Addend: %ld\n", + rtld_printf("Non-PLT Relocations with Addend: %ld\n", (obj->relasize / sizeof(Elf_Rela))); dump_Elf_Rela(obj, obj->rela, obj->relasize); } if (obj->pltrelsize) { - printf("PLT Relocations: %ld\n", + rtld_printf("PLT Relocations: %ld\n", (obj->pltrelsize / sizeof(Elf_Rel))); dump_Elf_Rel(obj, obj->pltrel, obj->pltrelsize); } if (obj->pltrelasize) { - printf("PLT Relocations with Addend: %ld\n", + rtld_printf("PLT Relocations with Addend: %ld\n", (obj->pltrelasize / sizeof(Elf_Rela))); dump_Elf_Rela(obj, obj->pltrela, obj->pltrelasize); } @@ -106,12 +106,12 @@ dump_Elf_Rel (Obj_Entry *obj, const Elf_Rel *rel0, u_long relsize) const Elf_Sym *sym; Elf_Addr *dstaddr; - printf("%s", rel_header); + rtld_putstr(rel_header); rellim = (const Elf_Rel *)((const char *)rel0 + relsize); for (rel = rel0; rel < rellim; rel++) { dstaddr = (Elf_Addr *)(obj->relocbase + rel->r_offset); sym = obj->symtab + ELF_R_SYM(rel->r_info); - printf(rel_format, + rtld_printf(rel_format, obj->strtab + sym->st_name, (u_long)rel->r_info, (u_long)rel->r_offset, (u_long)sym->st_value, (int)sym->st_size, @@ -128,12 +128,12 @@ dump_Elf_Rela (Obj_Entry *obj, const Elf_Rela *rela0, u_long relasize) const Elf_Sym *sym; Elf_Addr *dstaddr; - printf("%s", rel_header); + rtld_putstr(rel_header); relalim = (const Elf_Rela *)((const char *)rela0 + relasize); for (rela = rela0; rela < relalim; rela++) { dstaddr = (Elf_Addr *)(obj->relocbase + rela->r_offset); sym = obj->symtab + ELF_R_SYM(rela->r_info); - printf(rel_format, + rtld_printf(rel_format, obj->strtab + sym->st_name, (u_long)rela->r_info, (u_long)rela->r_offset, (u_long)sym->st_value, (int)sym->st_size, diff --git a/libexec/rtld-elf/malloc.c b/libexec/rtld-elf/malloc.c index 38ae89af726..95916598b53 100644 --- a/libexec/rtld-elf/malloc.c +++ b/libexec/rtld-elf/malloc.c @@ -49,7 +49,6 @@ static char *rcsid = "$FreeBSD$"; #include #include -#include #include #include #include @@ -59,6 +58,7 @@ static char *rcsid = "$FreeBSD$"; #include #include #include +#include "rtld_printf.h" #ifndef BSD #define MAP_COPY MAP_PRIVATE #define MAP_FILE 0 @@ -150,8 +150,7 @@ botch(s) #endif /* Debugging stuff */ -static void xprintf(const char *, ...); -#define TRACE() xprintf("TRACE %s:%d\n", __FILE__, __LINE__) +#define TRACE() rtld_printf("TRACE %s:%d\n", __FILE__, __LINE__) extern int pagesize; @@ -503,7 +502,8 @@ int n; caddr_t addr = (caddr_t) (((long)pagepool_start + pagesz - 1) & ~(pagesz - 1)); if (munmap(addr, pagepool_end - addr) != 0) - warn("morepages: munmap %p", addr); + rtld_fdprintf(STDERR_FILENO, "morepages: munmap %p", + addr); } offset = (long)pagepool_start - ((long)pagepool_start & ~(pagesz - 1)); @@ -511,7 +511,7 @@ int n; if ((pagepool_start = mmap(0, n * pagesz, PROT_READ|PROT_WRITE, MAP_ANON|MAP_COPY, fd, 0)) == (caddr_t)-1) { - xprintf("Cannot map anonymous memory"); + rtld_printf("Cannot map anonymous memory\n"); return 0; } pagepool_end = pagepool_start + n * pagesz; @@ -522,18 +522,3 @@ int n; #endif return n; } - -/* - * Non-mallocing printf, for use by malloc itself. - */ -static void -xprintf(const char *fmt, ...) -{ - char buf[256]; - va_list ap; - - va_start(ap, fmt); - vsprintf(buf, fmt, ap); - (void)write(STDOUT_FILENO, buf, strlen(buf)); - va_end(ap); -} diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 722b274e6ca..0f5aabae734 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -60,6 +60,7 @@ #include "rtld.h" #include "libmap.h" #include "rtld_tls.h" +#include "rtld_printf.h" #ifndef COMPAT_32BIT #define PATH_RTLD "/libexec/ld-elf.so.1" @@ -603,7 +604,7 @@ _rtld_error(const char *fmt, ...) va_list ap; va_start(ap, fmt); - vsnprintf(buf, sizeof buf, fmt, ap); + rtld_vsnprintf(buf, sizeof buf, fmt, ap); error_message = buf; va_end(ap); } @@ -723,7 +724,8 @@ die(void) if (msg == NULL) msg = "Fatal error"; - errx(1, "%s", msg); + rtld_fdputstr(STDERR_FILENO, msg); + _exit(1); } /* @@ -3187,7 +3189,7 @@ trace_loaded_objects(Obj_Entry *obj) bool is_lib; if (list_containers && obj->needed != NULL) - printf("%s:\n", obj->path); + rtld_printf("%s:\n", obj->path); for (needed = obj->needed; needed; needed = needed->next) { if (needed->obj != NULL) { if (needed->obj->traced && !list_containers) @@ -3204,17 +3206,17 @@ trace_loaded_objects(Obj_Entry *obj) while ((c = *fmt++) != '\0') { switch (c) { default: - putchar(c); + rtld_putchar(c); continue; case '\\': switch (c = *fmt) { case '\0': continue; case 'n': - putchar('\n'); + rtld_putchar('\n'); break; case 't': - putchar('\t'); + rtld_putchar('\t'); break; } break; @@ -3224,30 +3226,31 @@ trace_loaded_objects(Obj_Entry *obj) continue; case '%': default: - putchar(c); + rtld_putchar(c); break; case 'A': - printf("%s", main_local); + rtld_putstr(main_local); break; case 'a': - printf("%s", obj_main->path); + rtld_putstr(obj_main->path); break; case 'o': - printf("%s", name); + rtld_putstr(name); break; #if 0 case 'm': - printf("%d", sodp->sod_major); + rtld_printf("%d", sodp->sod_major); break; case 'n': - printf("%d", sodp->sod_minor); + rtld_printf("%d", sodp->sod_minor); break; #endif case 'p': - printf("%s", path); + rtld_putstr(path); break; case 'x': - printf("%p", needed->obj ? needed->obj->mapbase : 0); + rtld_printf("%p", needed->obj ? needed->obj->mapbase : + 0); break; } break; diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h index bb365a7ce7e..011dcc36b09 100644 --- a/libexec/rtld-elf/rtld.h +++ b/libexec/rtld-elf/rtld.h @@ -34,6 +34,7 @@ #include #include +#include #include #include diff --git a/libexec/rtld-elf/rtld_lock.c b/libexec/rtld-elf/rtld_lock.c index 024e1e2028d..d1563e54a84 100644 --- a/libexec/rtld-elf/rtld_lock.c +++ b/libexec/rtld-elf/rtld_lock.c @@ -182,8 +182,6 @@ rtld_lock_t rtld_bind_lock = &rtld_locks[0]; rtld_lock_t rtld_libc_lock = &rtld_locks[1]; rtld_lock_t rtld_phdr_lock = &rtld_locks[2]; -#define print_ebp(str) do {register long ebp asm("ebp"); printf("%s 0x%0lx\n", str, ebp);} while (0) - void rlock_acquire(rtld_lock_t lock, RtldLockState *lockstate) { diff --git a/libexec/rtld-elf/rtld_printf.c b/libexec/rtld-elf/rtld_printf.c new file mode 100644 index 00000000000..a5ab130cb98 --- /dev/null +++ b/libexec/rtld-elf/rtld_printf.c @@ -0,0 +1,482 @@ +/*- + * Copyright (c) 1986, 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * Copyright (c) 2011 Konstantin Belousov + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include "rtld_printf.h" + +#define MAXNBUF (sizeof(intmax_t) * NBBY + 1) + +struct snprintf_arg { + char *str; + char *buf; + size_t remain; + size_t buf_total; + int fd; +}; + +static void +snprintf_func(int ch, struct snprintf_arg *const info) +{ + + if (info->remain >= 2) { + *info->str++ = ch; + info->remain--; + } +} + +static void +printf_out(struct snprintf_arg *info) +{ + + if (info->remain == info->buf_total) + return; + write(info->fd, info->buf, info->buf_total - info->remain); + info->str = info->buf; + info->remain = info->buf_total; +} + +static void +printf_func(int ch, struct snprintf_arg *const info) +{ + + if (info->remain > 0) { + *info->str++ = ch; + info->remain--; + } else + printf_out(info); +} + +static char const hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz"; +#define hex2ascii(hex) (hex2ascii_data[hex]) + +static __inline int +imax(int a, int b) +{ + + return (a > b ? a : b); +} + +static char * +ksprintn(char *nbuf, uintmax_t num, int base, int *lenp, int upper) +{ + char *p, c; + + p = nbuf; + *p = '\0'; + do { + c = hex2ascii(num % base); + *++p = upper ? toupper(c) : c; + } while (num /= base); + if (lenp) + *lenp = p - nbuf; + return (p); +} + +static int +kvprintf(char const *fmt, void (*func)(int c, struct snprintf_arg *const arg), + struct snprintf_arg *arg, int radix, va_list ap) +{ +#define PCHAR(c) func((c), arg) + char nbuf[MAXNBUF]; + const char *p, *percent, *q; + u_char *up; + int ch, n; + uintmax_t num; + int base, lflag, qflag, tmp, width, ladjust, sharpflag, neg, sign, dot; + int cflag, hflag, jflag, tflag, zflag; + int dwidth, upper; + char padc; + int stop = 0, retval = 0; + + num = 0; + + if (fmt == NULL) + fmt = "(fmt null)\n"; + + if (radix < 2 || radix > 36) + radix = 10; + + for (;;) { + padc = ' '; + width = 0; + while ((ch = (u_char)*fmt++) != '%' || stop) { + if (ch == '\0') + return (retval); + PCHAR(ch); + } + percent = fmt - 1; + qflag = 0; lflag = 0; ladjust = 0; sharpflag = 0; neg = 0; + sign = 0; dot = 0; dwidth = 0; upper = 0; + cflag = 0; hflag = 0; jflag = 0; tflag = 0; zflag = 0; +reswitch: switch (ch = (u_char)*fmt++) { + case '.': + dot = 1; + goto reswitch; + case '#': + sharpflag = 1; + goto reswitch; + case '+': + sign = 1; + goto reswitch; + case '-': + ladjust = 1; + goto reswitch; + case '%': + PCHAR(ch); + break; + case '*': + if (!dot) { + width = va_arg(ap, int); + if (width < 0) { + ladjust = !ladjust; + width = -width; + } + } else { + dwidth = va_arg(ap, int); + } + goto reswitch; + case '0': + if (!dot) { + padc = '0'; + goto reswitch; + } + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + for (n = 0;; ++fmt) { + n = n * 10 + ch - '0'; + ch = *fmt; + if (ch < '0' || ch > '9') + break; + } + if (dot) + dwidth = n; + else + width = n; + goto reswitch; + case 'b': + num = (u_int)va_arg(ap, int); + p = va_arg(ap, char *); + for (q = ksprintn(nbuf, num, *p++, NULL, 0); *q;) + PCHAR(*q--); + + if (num == 0) + break; + + for (tmp = 0; *p;) { + n = *p++; + if (num & (1 << (n - 1))) { + PCHAR(tmp ? ',' : '<'); + for (; (n = *p) > ' '; ++p) + PCHAR(n); + tmp = 1; + } else + for (; *p > ' '; ++p) + continue; + } + if (tmp) + PCHAR('>'); + break; + case 'c': + PCHAR(va_arg(ap, int)); + break; + case 'D': + up = va_arg(ap, u_char *); + p = va_arg(ap, char *); + if (!width) + width = 16; + while(width--) { + PCHAR(hex2ascii(*up >> 4)); + PCHAR(hex2ascii(*up & 0x0f)); + up++; + if (width) + for (q=p;*q;q++) + PCHAR(*q); + } + break; + case 'd': + case 'i': + base = 10; + sign = 1; + goto handle_sign; + case 'h': + if (hflag) { + hflag = 0; + cflag = 1; + } else + hflag = 1; + goto reswitch; + case 'j': + jflag = 1; + goto reswitch; + case 'l': + if (lflag) { + lflag = 0; + qflag = 1; + } else + lflag = 1; + goto reswitch; + case 'n': + if (jflag) + *(va_arg(ap, intmax_t *)) = retval; + else if (qflag) + *(va_arg(ap, quad_t *)) = retval; + else if (lflag) + *(va_arg(ap, long *)) = retval; + else if (zflag) + *(va_arg(ap, size_t *)) = retval; + else if (hflag) + *(va_arg(ap, short *)) = retval; + else if (cflag) + *(va_arg(ap, char *)) = retval; + else + *(va_arg(ap, int *)) = retval; + break; + case 'o': + base = 8; + goto handle_nosign; + case 'p': + base = 16; + sharpflag = (width == 0); + sign = 0; + num = (uintptr_t)va_arg(ap, void *); + goto number; + case 'q': + qflag = 1; + goto reswitch; + case 'r': + base = radix; + if (sign) + goto handle_sign; + goto handle_nosign; + case 's': + p = va_arg(ap, char *); + if (p == NULL) + p = "(null)"; + if (!dot) + n = strlen (p); + else + for (n = 0; n < dwidth && p[n]; n++) + continue; + + width -= n; + + if (!ladjust && width > 0) + while (width--) + PCHAR(padc); + while (n--) + PCHAR(*p++); + if (ladjust && width > 0) + while (width--) + PCHAR(padc); + break; + case 't': + tflag = 1; + goto reswitch; + case 'u': + base = 10; + goto handle_nosign; + case 'X': + upper = 1; + case 'x': + base = 16; + goto handle_nosign; + case 'y': + base = 16; + sign = 1; + goto handle_sign; + case 'z': + zflag = 1; + goto reswitch; +handle_nosign: + sign = 0; + if (jflag) + num = va_arg(ap, uintmax_t); + else if (qflag) + num = va_arg(ap, u_quad_t); + else if (tflag) + num = va_arg(ap, ptrdiff_t); + else if (lflag) + num = va_arg(ap, u_long); + else if (zflag) + num = va_arg(ap, size_t); + else if (hflag) + num = (u_short)va_arg(ap, int); + else if (cflag) + num = (u_char)va_arg(ap, int); + else + num = va_arg(ap, u_int); + goto number; +handle_sign: + if (jflag) + num = va_arg(ap, intmax_t); + else if (qflag) + num = va_arg(ap, quad_t); + else if (tflag) + num = va_arg(ap, ptrdiff_t); + else if (lflag) + num = va_arg(ap, long); + else if (zflag) + num = va_arg(ap, ssize_t); + else if (hflag) + num = (short)va_arg(ap, int); + else if (cflag) + num = (char)va_arg(ap, int); + else + num = va_arg(ap, int); +number: + if (sign && (intmax_t)num < 0) { + neg = 1; + num = -(intmax_t)num; + } + p = ksprintn(nbuf, num, base, &n, upper); + tmp = 0; + if (sharpflag && num != 0) { + if (base == 8) + tmp++; + else if (base == 16) + tmp += 2; + } + if (neg) + tmp++; + + if (!ladjust && padc == '0') + dwidth = width - tmp; + width -= tmp + imax(dwidth, n); + dwidth -= n; + if (!ladjust) + while (width-- > 0) + PCHAR(' '); + if (neg) + PCHAR('-'); + if (sharpflag && num != 0) { + if (base == 8) { + PCHAR('0'); + } else if (base == 16) { + PCHAR('0'); + PCHAR('x'); + } + } + while (dwidth-- > 0) + PCHAR('0'); + + while (*p) + PCHAR(*p--); + + if (ladjust) + while (width-- > 0) + PCHAR(' '); + + break; + default: + while (percent < fmt) + PCHAR(*percent++); + /* + * Since we ignore an formatting argument it is no + * longer safe to obey the remaining formatting + * arguments as the arguments will no longer match + * the format specs. + */ + stop = 1; + break; + } + } +#undef PCHAR +} + +int +rtld_vsnprintf(char *buf, size_t bufsize, const char *fmt, va_list ap) +{ + struct snprintf_arg info; + int retval; + + info.buf = info.str = buf; + info.buf_total = info.remain = bufsize; + info.fd = -1; + retval = kvprintf(fmt, snprintf_func, &info, 10, ap); + if (info.remain >= 1) + *info.str++ = '\0'; + return (retval); +} + +int +rtld_vfdprintf(int fd, const char *fmt, va_list ap) +{ + char buf[512]; + struct snprintf_arg info; + int retval; + + info.buf = info.str = buf; + info.buf_total = info.remain = sizeof(buf); + info.fd = fd; + retval = kvprintf(fmt, printf_func, &info, 10, ap); + printf_out(&info); + return (retval); +} + +int +rtld_fdprintf(int fd, const char *fmt, ...) +{ + va_list ap; + int retval; + + va_start(ap, fmt); + retval = rtld_vfdprintf(fd, fmt, ap); + va_end(ap); + return (retval); +} + +void +rtld_fdputstr(int fd, const char *str) +{ + + write(fd, str, strlen(str)); +} + +void +rtld_fdputchar(int fd, int c) +{ + char c1; + + c1 = c; + write(fd, &c1, 1); +} diff --git a/libexec/rtld-elf/rtld_printf.h b/libexec/rtld-elf/rtld_printf.h new file mode 100644 index 00000000000..6125732cb6a --- /dev/null +++ b/libexec/rtld-elf/rtld_printf.h @@ -0,0 +1,44 @@ +/*- + * Copyright 2011 Konstantin Belousov . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef RTLD_PRINTF_H +#define RTLD_PRINTF_H 1 + +#include +#include + +int rtld_vsnprintf(char *buf, size_t bufsize, const char *fmt, va_list ap); +int rtld_vfdprintf(int fd, const char *fmt, va_list ap); +int rtld_fdprintf(int fd, const char *fmt, ...) __printflike(2, 3); +void rtld_fdputstr(int fd, const char *str); +void rtld_fdputchar(int fd, int c); + +#define rtld_printf(...) rtld_fdprintf(STDOUT_FILENO, __VA_ARGS__) +#define rtld_putstr(str) rtld_fdputstr(STDOUT_FILENO, (str)) +#define rtld_putchar(c) rtld_fdputchar(STDOUT_FILENO, (c)) + +#endif diff --git a/libexec/rtld-elf/xmalloc.c b/libexec/rtld-elf/xmalloc.c index 7ee4c570c6b..0d992257b98 100644 --- a/libexec/rtld-elf/xmalloc.c +++ b/libexec/rtld-elf/xmalloc.c @@ -25,10 +25,12 @@ * $FreeBSD$ */ -#include #include #include #include +#include +#include "rtld.h" +#include "rtld_printf.h" void *xcalloc(size_t); void *xmalloc(size_t); @@ -44,8 +46,10 @@ void * xmalloc(size_t size) { void *p = malloc(size); - if (p == NULL) - err(1, "Out of memory"); + if (p == NULL) { + rtld_fdputstr(STDERR_FILENO, "Out of memory\n"); + _exit(1); + } return p; } @@ -53,7 +57,9 @@ char * xstrdup(const char *s) { char *p = strdup(s); - if (p == NULL) - err(1, "Out of memory"); + if (p == NULL) { + rtld_fdputstr(STDERR_FILENO, "Out of memory\n"); + _exit(1); + } return p; } From 4969b96e574818cfda2d2335c927e16449b069d1 Mon Sep 17 00:00:00 2001 From: Pawel Jakub Dawidek Date: Wed, 24 Aug 2011 22:07:38 +0000 Subject: [PATCH 323/452] We need to unlock and destroy vnode attached to znode which we are freeing. Reviewed by: kib Approved by: re (bz) MFC after: 1 week --- .../opensolaris/uts/common/fs/zfs/zfs_znode.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c index 29ca446d946..0fcc850d1f3 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c @@ -627,6 +627,18 @@ zfs_znode_dmu_fini(znode_t *zp) zp->z_sa_hdl = NULL; } +static void +zfs_vnode_forget(vnode_t *vp) +{ + + VOP_UNLOCK(vp, 0); + VI_LOCK(vp); + vp->v_usecount--; + vp->v_iflag |= VI_DOOMED; + vp->v_data = NULL; + vdropl(vp); +} + /* * Construct a new znode/vnode and intialize. * @@ -688,6 +700,8 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz, if (sa_bulk_lookup(zp->z_sa_hdl, bulk, count) != 0 || zp->z_gen == 0) { if (hdl == NULL) sa_handle_destroy(zp->z_sa_hdl); + zfs_vnode_forget(vp); + zp->z_vnode = NULL; kmem_cache_free(znode_cache, zp); return (NULL); } From fc96aabef121a95421141b9fbf285d39393efe29 Mon Sep 17 00:00:00 2001 From: Qing Li Date: Thu, 25 Aug 2011 04:31:20 +0000 Subject: [PATCH 324/452] When the RADIX_MPATH kernel option is enabled, the RADIX_MPATH code tries to find the first route node of an ECMP chain before executing the route command. If the system has a default route, and the specific route argument to the command does not exist in the routing table, then the default route would be reached. The current code does not verify the reached node matches the given route argument, therefore erroneous removed the entry. This patch fixes that bug. Approved by: re MFC after: 3 days --- sys/net/radix_mpath.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sys/net/radix_mpath.c b/sys/net/radix_mpath.c index ea84e5ce228..ee7826f6e3e 100644 --- a/sys/net/radix_mpath.c +++ b/sys/net/radix_mpath.c @@ -96,10 +96,7 @@ rt_mpath_matchgate(struct rtentry *rt, struct sockaddr *gate) { struct radix_node *rn; - if (!rn_mpath_next((struct radix_node *)rt)) - return rt; - - if (!gate) + if (!gate || !rt->rt_gateway) return NULL; /* beyond here, we use rn as the master copy */ From 82378711f92f0da82fd49d47f79e83a8e3dea770 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Thu, 25 Aug 2011 08:17:39 +0000 Subject: [PATCH 325/452] Generalize ffs_pages_remove() into vn_pages_remove(). Remove mapped pages for all dataset vnodes in zfs_rezget() using new vn_pages_remove() to fix mmapped files changed by zfs rollback or zfs receive -F. PR: kern/160035, kern/156933 Reviewed by: kib, pjd Approved by: re (kib) MFC after: 1 week --- .../opensolaris/uts/common/fs/zfs/zfs_znode.c | 13 +++++++++---- sys/kern/vfs_vnops.c | 15 +++++++++++++++ sys/sys/vnode.h | 1 + sys/ufs/ffs/ffs_extern.h | 1 - sys/ufs/ffs/ffs_inode.c | 14 +------------- sys/ufs/ffs/ffs_softdep.c | 4 ++-- 6 files changed, 28 insertions(+), 20 deletions(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c index 0fcc850d1f3..285881297f6 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c @@ -1273,6 +1273,7 @@ zfs_rezget(znode_t *zp) zfsvfs_t *zfsvfs = zp->z_zfsvfs; dmu_object_info_t doi; dmu_buf_t *db; + vnode_t *vp; uint64_t obj_num = zp->z_id; uint64_t mode, size; sa_bulk_attr_t bulk[8]; @@ -1348,8 +1349,9 @@ zfs_rezget(znode_t *zp) * that for example regular file was replaced with directory * which has the same object number. */ - if (ZTOV(zp) != NULL && - ZTOV(zp)->v_type != IFTOVT((mode_t)zp->z_mode)) { + vp = ZTOV(zp); + if (vp != NULL && + vp->v_type != IFTOVT((mode_t)zp->z_mode)) { zfs_znode_dmu_fini(zp); ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num); return (EIO); @@ -1357,8 +1359,11 @@ zfs_rezget(znode_t *zp) zp->z_unlinked = (zp->z_links == 0); zp->z_blksz = doi.doi_data_block_size; - if (zp->z_size != size && ZTOV(zp) != NULL) - vnode_pager_setsize(ZTOV(zp), zp->z_size); + if (vp != NULL) { + vn_pages_remove(vp, 0, 0); + if (zp->z_size != size) + vnode_pager_setsize(vp, zp->z_size); + } ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num); diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index a8f1bf1d184..92fb0d9335f 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -64,6 +64,9 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include + static fo_rdwr_t vn_read; static fo_rdwr_t vn_write; static fo_truncate_t vn_truncate; @@ -1398,3 +1401,15 @@ vn_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred, VFS_UNLOCK_GIANT(vfslocked); return (error); } + +void +vn_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end) +{ + vm_object_t object; + + if ((object = vp->v_object) == NULL) + return; + VM_OBJECT_LOCK(object); + vm_object_page_remove(object, start, end, 0); + VM_OBJECT_UNLOCK(object); +} diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 81be360dd04..4cb6633d4cc 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -640,6 +640,7 @@ int _vn_lock(struct vnode *vp, int flags, char *file, int line); int vn_open(struct nameidata *ndp, int *flagp, int cmode, struct file *fp); int vn_open_cred(struct nameidata *ndp, int *flagp, int cmode, u_int vn_open_flags, struct ucred *cred, struct file *fp); +void vn_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end); int vn_pollrecord(struct vnode *vp, struct thread *p, int events); int vn_rdwr(enum uio_rw rw, struct vnode *vp, void *base, int len, off_t offset, enum uio_seg segflg, int ioflg, diff --git a/sys/ufs/ffs/ffs_extern.h b/sys/ufs/ffs/ffs_extern.h index 70bcf1df4f7..bfc02564824 100644 --- a/sys/ufs/ffs/ffs_extern.h +++ b/sys/ufs/ffs/ffs_extern.h @@ -79,7 +79,6 @@ int ffs_isfreeblock(struct fs *, u_char *, ufs1_daddr_t); void ffs_load_inode(struct buf *, struct inode *, struct fs *, ino_t); int ffs_mountroot(void); void ffs_oldfscompat_write(struct fs *, struct ufsmount *); -void ffs_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end); int ffs_reallocblks(struct vop_reallocblks_args *); int ffs_realloccg(struct inode *, ufs2_daddr_t, ufs2_daddr_t, ufs2_daddr_t, int, int, int, struct ucred *, struct buf **); diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c index 0034029df91..101bdb43aa9 100644 --- a/sys/ufs/ffs/ffs_inode.c +++ b/sys/ufs/ffs/ffs_inode.c @@ -120,18 +120,6 @@ ffs_update(vp, waitfor) } } -void -ffs_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end) -{ - vm_object_t object; - - if ((object = vp->v_object) == NULL) - return; - VM_OBJECT_LOCK(object); - vm_object_page_remove(object, start, end, 0); - VM_OBJECT_UNLOCK(object); -} - #define SINGLE 0 /* index of single indirect block */ #define DOUBLE 1 /* index of double indirect block */ #define TRIPLE 2 /* index of triple indirect block */ @@ -219,7 +207,7 @@ ffs_truncate(vp, length, flags, cred, td) (void) chkdq(ip, -extblocks, NOCRED, 0); #endif vinvalbuf(vp, V_ALT, 0, 0); - ffs_pages_remove(vp, + vn_pages_remove(vp, OFF_TO_IDX(lblktosize(fs, -extblocks)), 0); osize = ip->i_din2->di_extsize; ip->i_din2->di_blocks -= extblocks; diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index 58d8ba9fc94..6cf033a4329 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -6541,7 +6541,7 @@ trunc_pages(ip, length, extblocks, flags) fs = ip->i_fs; extend = OFF_TO_IDX(lblktosize(fs, -extblocks)); if ((flags & IO_EXT) != 0) - ffs_pages_remove(vp, extend, 0); + vn_pages_remove(vp, extend, 0); if ((flags & IO_NORMAL) == 0) return; BO_LOCK(&vp->v_bufobj); @@ -6567,7 +6567,7 @@ trunc_pages(ip, length, extblocks, flags) end = OFF_TO_IDX(lblktosize(fs, lbn)); } else end = extend; - ffs_pages_remove(vp, OFF_TO_IDX(OFF_MAX), end); + vn_pages_remove(vp, OFF_TO_IDX(OFF_MAX), end); } /* From ee3cdf6b2e580561ee34ede535a28df176314149 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Thu, 25 Aug 2011 08:35:09 +0000 Subject: [PATCH 326/452] Import bugfix for reading and extracting of FreeBSD ISO images with tar. Upstream revision 3645 (merge of 3642): Change the mechanism handling a rr_moved directory, which is Rockridge extension that can exceed the limitation of a maximum directory depth of ISO 9660. - Stop reading all entries at a time. - Connect "CL" entry to "RE" entry dynamically, which "CL" and "RE" have information to rebuild a full directory tree. - Tweak some related tests since we use Headsort for re-ordering entries and it cannot make a steady order when the keies of the entries are the same. http://code.google.com/p/libarchive/issues/detail?id=168 Reviewed by: kientzle Approved by: re (kib) Obtained from: libarchive (release/2.8, svn rev 3645) MFC after: 3 days --- .../archive_read_support_format_iso9660.c | 449 +++++++++++------- .../test/test_read_format_iso_2.iso.Z.uu | 37 ++ lib/libarchive/test/test_read_format_iso_gz.c | 49 +- .../test/test_read_format_isojoliet_bz2.c | 7 +- .../test/test_read_format_isojoliet_long.c | 6 +- .../test/test_read_format_isojoliet_rr.c | 7 +- .../test/test_read_format_isorr_bz2.c | 10 +- .../test/test_read_format_isorr_new_bz2.c | 10 +- .../test/test_read_format_isozisofs_bz2.c | 12 +- 9 files changed, 390 insertions(+), 197 deletions(-) create mode 100644 lib/libarchive/test/test_read_format_iso_2.iso.Z.uu diff --git a/lib/libarchive/archive_read_support_format_iso9660.c b/lib/libarchive/archive_read_support_format_iso9660.c index 2cca410e717..3882f85181c 100644 --- a/lib/libarchive/archive_read_support_format_iso9660.c +++ b/lib/libarchive/archive_read_support_format_iso9660.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 2003-2007 Tim Kientzle * Copyright (c) 2009 Andreas Henriksson - * Copyright (c) 2009 Michihiro NAKAJIMA + * Copyright (c) 2009-2011 Michihiro NAKAJIMA * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -261,13 +261,17 @@ struct file_info { struct file_info *use_next; struct file_info *parent; struct file_info *next; + struct file_info *re_next; int subdirs; uint64_t key; /* Heap Key. */ uint64_t offset; /* Offset on disk. */ uint64_t size; /* File size in bytes. */ uint32_t ce_offset; /* Offset of CE. */ uint32_t ce_size; /* Size of CE. */ + char rr_moved; /* Flag to rr_moved. */ + char rr_moved_has_re_only; char re; /* Having RRIP "RE" extension. */ + char re_descendant; uint64_t cl_offset; /* Having RRIP "CL" extension. */ int birthtime_is_set; time_t birthtime; /* File created time. */ @@ -294,7 +298,10 @@ struct file_info { struct content *first; struct content **last; } contents; - char exposed; + struct { + struct file_info *first; + struct file_info **last; + } rede_files; }; struct heap_queue { @@ -317,8 +324,6 @@ struct iso9660 { unsigned char suspOffset; struct file_info *rr_moved; - struct heap_queue re_dirs; - struct heap_queue cl_files; struct read_ce_queue { struct read_ce_req { uint64_t offset;/* Offset of CE on disk. */ @@ -337,6 +342,10 @@ struct iso9660 { struct file_info *first; struct file_info **last; } cache_files; + struct { + struct file_info *first; + struct file_info **last; + } re_files; uint64_t current_position; ssize_t logical_block_size; @@ -377,7 +386,8 @@ static int isJolietSVD(struct iso9660 *, const unsigned char *); static int isSVD(struct iso9660 *, const unsigned char *); static int isEVD(struct iso9660 *, const unsigned char *); static int isPVD(struct iso9660 *, const unsigned char *); -static struct file_info *next_cache_entry(struct iso9660 *iso9660); +static int next_cache_entry(struct archive_read *, struct iso9660 *, + struct file_info **); static int next_entry_seek(struct archive_read *a, struct iso9660 *iso9660, struct file_info **pfile); static struct file_info * @@ -400,10 +410,12 @@ static void parse_rockridge_ZF1(struct file_info *, static void register_file(struct iso9660 *, struct file_info *); static void release_files(struct iso9660 *); static unsigned toi(const void *p, int n); +static inline void re_add_entry(struct iso9660 *, struct file_info *); +static inline struct file_info * re_get_entry(struct iso9660 *); +static inline int rede_add_entry(struct file_info *); +static inline struct file_info * rede_get_entry(struct file_info *); static inline void cache_add_entry(struct iso9660 *iso9660, struct file_info *file); -static inline void cache_add_to_next_of_parent(struct iso9660 *iso9660, - struct file_info *file); static inline struct file_info *cache_get_entry(struct iso9660 *iso9660); static void heap_add_entry(struct heap_queue *heap, struct file_info *file, uint64_t key); @@ -430,6 +442,8 @@ archive_read_support_format_iso9660(struct archive *_a) iso9660->magic = ISO9660_MAGIC; iso9660->cache_files.first = NULL; iso9660->cache_files.last = &(iso9660->cache_files.first); + iso9660->re_files.first = NULL; + iso9660->re_files.last = &(iso9660->re_files.first); /* Enable to support Joliet extensions by default. */ iso9660->opt_support_joliet = 1; /* Enable to support Rock Ridge extensions by default. */ @@ -975,42 +989,38 @@ read_children(struct archive_read *a, struct file_info *parent) child = parse_file_info(a, parent, p); if (child == NULL) return (ARCHIVE_FATAL); - if (child->cl_offset) - heap_add_entry(&(iso9660->cl_files), - child, child->cl_offset); - else { - if (child->multi_extent || multi != NULL) { - struct content *con; + if (child->cl_offset == 0 && + (child->multi_extent || multi != NULL)) { + struct content *con; - if (multi == NULL) { - multi = child; - multi->contents.first = NULL; - multi->contents.last = - &(multi->contents.first); - } - con = malloc(sizeof(struct content)); - if (con == NULL) { - archive_set_error( - &a->archive, ENOMEM, - "No memory for " - "multi extent"); - return (ARCHIVE_FATAL); - } - con->offset = child->offset; - con->size = child->size; - con->next = NULL; - *multi->contents.last = con; - multi->contents.last = &(con->next); - if (multi == child) - add_entry(iso9660, child); - else { - multi->size += child->size; - if (!child->multi_extent) - multi = NULL; - } - } else + if (multi == NULL) { + multi = child; + multi->contents.first = NULL; + multi->contents.last = + &(multi->contents.first); + } + con = malloc(sizeof(struct content)); + if (con == NULL) { + archive_set_error( + &a->archive, ENOMEM, + "No memory for " + "multi extent"); + return (ARCHIVE_FATAL); + } + con->offset = child->offset; + con->size = child->size; + con->next = NULL; + *multi->contents.last = con; + multi->contents.last = &(con->next); + if (multi == child) add_entry(iso9660, child); - } + else { + multi->size += child->size; + if (!child->multi_extent) + multi = NULL; + } + } else + add_entry(iso9660, child); } } @@ -1021,103 +1031,13 @@ read_children(struct archive_read *a, struct file_info *parent) return (ARCHIVE_OK); } -static int -relocate_dir(struct iso9660 *iso9660, struct file_info *file) -{ - struct file_info *re; - - re = heap_get_entry(&(iso9660->re_dirs)); - while (re != NULL && re->offset < file->cl_offset) { - /* This case is wrong pattern. - * But dont't reject this directory entry to be robust. */ - cache_add_entry(iso9660, re); - re = heap_get_entry(&(iso9660->re_dirs)); - } - if (re == NULL) - /* This case is wrong pattern. */ - return (0); - if (re->offset == file->cl_offset) { - re->parent->subdirs--; - re->parent = file->parent; - re->parent->subdirs++; - cache_add_to_next_of_parent(iso9660, re); - return (1); - } else - /* This case is wrong pattern. */ - heap_add_entry(&(iso9660->re_dirs), re, re->offset); - return (0); -} - -static int -read_entries(struct archive_read *a) -{ - struct iso9660 *iso9660; - struct file_info *file; - int r; - - iso9660 = (struct iso9660 *)(a->format->data); - - while ((file = next_entry(iso9660)) != NULL && - (file->mode & AE_IFMT) == AE_IFDIR) { - r = read_children(a, file); - if (r != ARCHIVE_OK) - return (r); - - if (iso9660->seenRockridge && - file->parent != NULL && - file->parent->parent == NULL && - iso9660->rr_moved == NULL && - (strcmp(file->name.s, "rr_moved") == 0 || - strcmp(file->name.s, ".rr_moved") == 0)) { - iso9660->rr_moved = file; - } else if (file->re) - heap_add_entry(&(iso9660->re_dirs), file, - file->offset); - else - cache_add_entry(iso9660, file); - } - if (file != NULL) - add_entry(iso9660, file); - - if (iso9660->rr_moved != NULL) { - /* - * Relocate directory which rr_moved has. - */ - while ((file = heap_get_entry(&(iso9660->cl_files))) != NULL) - relocate_dir(iso9660, file); - - /* If rr_moved directory still has children, - * Add rr_moved into pending_files to show - */ - if (iso9660->rr_moved->subdirs) { - cache_add_entry(iso9660, iso9660->rr_moved); - /* If entries which have "RE" extension are still - * remaining(this case is unlikely except ISO image - * is broken), the entries won't be exposed. */ - while ((file = heap_get_entry(&(iso9660->re_dirs))) != NULL) - cache_add_entry(iso9660, file); - } else - iso9660->rr_moved->parent->subdirs--; - } else { - /* - * In case ISO image is broken. If the name of rr_moved - * directory has been changed by damage, subdirectories - * of rr_moved entry won't be exposed. - */ - while ((file = heap_get_entry(&(iso9660->re_dirs))) != NULL) - cache_add_entry(iso9660, file); - } - - return (ARCHIVE_OK); -} - static int archive_read_format_iso9660_read_header(struct archive_read *a, struct archive_entry *entry) { struct iso9660 *iso9660; struct file_info *file; - int r, rd_r; + int r, rd_r = ARCHIVE_OK; iso9660 = (struct iso9660 *)(a->format->data); @@ -1207,11 +1127,7 @@ archive_read_format_iso9660_read_header(struct archive_read *a, a->archive.archive_format_name = "ISO9660 with Rockridge extensions"; } - rd_r = read_entries(a); - if (rd_r == ARCHIVE_FATAL) - return (ARCHIVE_FATAL); - } else - rd_r = ARCHIVE_OK; + } /* Get the next entry that appears after the current offset. */ r = next_entry_seek(a, iso9660, &file); @@ -1324,7 +1240,6 @@ archive_read_format_iso9660_read_header(struct archive_read *a, /* Directory data has been read completely. */ iso9660->entry_bytes_remaining = 0; iso9660->entry_sparse_offset = 0; - file->exposed = 1; } if (rd_r != ARCHIVE_OK) @@ -1651,10 +1566,6 @@ archive_read_format_iso9660_cleanup(struct archive_read *a) archive_string_free(&iso9660->previous_pathname); if (iso9660->pending_files.files) free(iso9660->pending_files.files); - if (iso9660->re_dirs.files) - free(iso9660->re_dirs.files); - if (iso9660->cl_files.files) - free(iso9660->cl_files.files); #ifdef HAVE_ZLIB_H free(iso9660->entry_zisofs.uncompressed_buffer); free(iso9660->entry_zisofs.block_pointers); @@ -1735,6 +1646,8 @@ parse_file_info(struct archive_read *a, struct file_info *parent, file->size = fsize; file->mtime = isodate7(isodirrec + DR_date_offset); file->ctime = file->atime = file->mtime; + file->rede_files.first = NULL; + file->rede_files.last = &(file->rede_files.first); p = isodirrec + DR_name_offset; /* Rockridge extensions (if any) follow name. Compute this @@ -1873,9 +1786,40 @@ parse_file_info(struct archive_read *a, struct file_info *parent, file->nlinks = 1;/* Reset nlink. we'll calculate it later. */ /* Tell file's parent how many children that parent has. */ - if (parent != NULL && (flags & 0x02) && file->cl_offset == 0) + if (parent != NULL && (flags & 0x02)) parent->subdirs++; + if (iso9660->seenRockridge) { + if (parent != NULL && parent->parent == NULL && + (flags & 0x02) && iso9660->rr_moved == NULL && + (strcmp(file->name.s, "rr_moved") == 0 || + strcmp(file->name.s, ".rr_moved") == 0)) { + iso9660->rr_moved = file; + file->rr_moved = 1; + file->rr_moved_has_re_only = 1; + file->re = 0; + parent->subdirs--; + } else if (file->re) { + /* This file's parent is not rr_moved, clear invalid + * "RE" mark. */ + if (parent == NULL || parent->rr_moved == 0) + file->re = 0; + else if ((flags & 0x02) == 0) { + file->rr_moved_has_re_only = 0; + file->re = 0; + } + } else if (parent != NULL && parent->rr_moved) + file->rr_moved_has_re_only = 0; + else if (parent != NULL && (flags & 0x02) && + (parent->re || parent->re_descendant)) + file->re_descendant = 1; + if (file->cl_offset != 0) { + parent->subdirs++; + /* To be appeared before other dirs. */ + file->offset = file->number = file->cl_offset; + } + } + #if DEBUG /* DEBUGGING: Warn about attributes I don't yet fully support. */ if ((flags & ~0x02) != 0) { @@ -2489,10 +2433,12 @@ next_entry_seek(struct archive_read *a, struct iso9660 *iso9660, struct file_info **pfile) { struct file_info *file; + int r; - *pfile = file = next_cache_entry(iso9660); - if (file == NULL) - return (ARCHIVE_EOF); + r = next_cache_entry(a, iso9660, pfile); + if (r != ARCHIVE_OK) + return (r); + file = *pfile; /* Don't waste time seeking for zero-length bodies. */ if (file->size == 0) @@ -2513,8 +2459,9 @@ next_entry_seek(struct archive_read *a, struct iso9660 *iso9660, return (ARCHIVE_OK); } -static struct file_info * -next_cache_entry(struct iso9660 *iso9660) +static int +next_cache_entry(struct archive_read *a, struct iso9660 *iso9660, + struct file_info **pfile) { struct file_info *file; struct { @@ -2526,21 +2473,128 @@ next_cache_entry(struct iso9660 *iso9660) file = cache_get_entry(iso9660); if (file != NULL) { - while (file->parent != NULL && !file->parent->exposed) { - /* If file's parent is not exposed, it's moved - * to next entry of its parent. */ - cache_add_to_next_of_parent(iso9660, file); - file = cache_get_entry(iso9660); - } - return (file); + *pfile = file; + return (ARCHIVE_OK); } - file = next_entry(iso9660); - if (file == NULL) - return (NULL); + for (;;) { + struct file_info *re, *d; + + *pfile = file = next_entry(iso9660); + if (file == NULL) { + /* + * If directory entries all which are descendant of + * rr_moved are stil remaning, expose their. + */ + if (iso9660->re_files.first != NULL && + iso9660->rr_moved != NULL && + iso9660->rr_moved->rr_moved_has_re_only) + /* Expose "rr_moved" entry. */ + cache_add_entry(iso9660, iso9660->rr_moved); + while ((re = re_get_entry(iso9660)) != NULL) { + /* Expose its descendant dirs. */ + while ((d = rede_get_entry(re)) != NULL) + cache_add_entry(iso9660, d); + } + if (iso9660->cache_files.first != NULL) + return (next_cache_entry(a, iso9660, pfile)); + return (ARCHIVE_EOF); + } + + if (file->cl_offset) { + struct file_info *first_re = NULL; + int nexted_re = 0; + + /* + * Find "RE" dir for the current file, which + * has "CL" flag. + */ + while ((re = re_get_entry(iso9660)) + != first_re) { + if (first_re == NULL) + first_re = re; + if (re->offset == file->cl_offset) { + re->parent->subdirs--; + re->parent = file->parent; + re->re = 0; + if (re->parent->re_descendant) { + nexted_re = 1; + re->re_descendant = 1; + if (rede_add_entry(re) < 0) + goto fatal_rr; + /* Move a list of descendants + * to a new ancestor. */ + while ((d = rede_get_entry( + re)) != NULL) + if (rede_add_entry(d) + < 0) + goto fatal_rr; + break; + } + /* Replace the current file + * with "RE" dir */ + *pfile = file = re; + /* Expose its descendant */ + while ((d = rede_get_entry( + file)) != NULL) + cache_add_entry( + iso9660, d); + break; + } else + re_add_entry(iso9660, re); + } + if (nexted_re) { + /* + * Do not expose this at this time + * because we have not gotten its full-path + * name yet. + */ + continue; + } + } else if ((file->mode & AE_IFMT) == AE_IFDIR) { + int r; + + /* Read file entries in this dir. */ + r = read_children(a, file); + if (r != ARCHIVE_OK) + return (r); + + /* + * Handle a special dir of Rockridge extensions, + * "rr_moved". + */ + if (file->rr_moved) { + /* + * If this has only the subdirectories which + * have "RE" flags, do not expose at this time. + */ + if (file->rr_moved_has_re_only) + continue; + /* Otherwise expose "rr_moved" entry. */ + } else if (file->re) { + /* + * Do not expose this at this time + * because we have not gotten its full-path + * name yet. + */ + re_add_entry(iso9660, file); + continue; + } else if (file->re_descendant) { + /* + * Do not expose this at this time + * because we have not gotten its full-path + * name yet. + */ + if (rede_add_entry(file) < 0) + goto fatal_rr; + continue; + } + } + break; + } if ((file->mode & AE_IFMT) != AE_IFREG || file->number == -1) - return (file); + return (ARCHIVE_OK); count = 0; number = file->number; @@ -2573,8 +2627,10 @@ next_cache_entry(struct iso9660 *iso9660) file = next_entry(iso9660); } - if (count == 0) - return (file); + if (count == 0) { + *pfile = file; + return ((file == NULL)?ARCHIVE_EOF:ARCHIVE_OK); + } if (file->number == -1) { file->next = NULL; *empty_files.last = file; @@ -2599,7 +2655,67 @@ next_cache_entry(struct iso9660 *iso9660) *iso9660->cache_files.last = empty_files.first; iso9660->cache_files.last = empty_files.last; } - return (cache_get_entry(iso9660)); + *pfile = cache_get_entry(iso9660); + return ((*pfile == NULL)?ARCHIVE_EOF:ARCHIVE_OK); + +fatal_rr: + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Failed to connect 'CL' pointer to 'RE' rr_moved pointer of" + "Rockridge extensions"); + return (ARCHIVE_FATAL); +} + +static inline void +re_add_entry(struct iso9660 *iso9660, struct file_info *file) +{ + file->re_next = NULL; + *iso9660->re_files.last = file; + iso9660->re_files.last = &(file->re_next); +} + +static inline struct file_info * +re_get_entry(struct iso9660 *iso9660) +{ + struct file_info *file; + + if ((file = iso9660->re_files.first) != NULL) { + iso9660->re_files.first = file->re_next; + if (iso9660->re_files.first == NULL) + iso9660->re_files.last = + &(iso9660->re_files.first); + } + return (file); +} + +static inline int +rede_add_entry(struct file_info *file) +{ + struct file_info *re; + + re = file->parent; + while (re != NULL && !re->re) + re = re->parent; + if (re == NULL) + return (-1); + + file->re_next = NULL; + *re->rede_files.last = file; + re->rede_files.last = &(file->re_next); + return (0); +} + +static inline struct file_info * +rede_get_entry(struct file_info *re) +{ + struct file_info *file; + + if ((file = re->rede_files.first) != NULL) { + re->rede_files.first = file->re_next; + if (re->rede_files.first == NULL) + re->rede_files.last = + &(re->rede_files.first); + } + return (file); } static inline void @@ -2610,15 +2726,6 @@ cache_add_entry(struct iso9660 *iso9660, struct file_info *file) iso9660->cache_files.last = &(file->next); } -static inline void -cache_add_to_next_of_parent(struct iso9660 *iso9660, struct file_info *file) -{ - file->next = file->parent->next; - file->parent->next = file; - if (iso9660->cache_files.last == &(file->parent->next)) - iso9660->cache_files.last = &(file->next); -} - static inline struct file_info * cache_get_entry(struct iso9660 *iso9660) { diff --git a/lib/libarchive/test/test_read_format_iso_2.iso.Z.uu b/lib/libarchive/test/test_read_format_iso_2.iso.Z.uu new file mode 100644 index 00000000000..6851f316b38 --- /dev/null +++ b/lib/libarchive/test/test_read_format_iso_2.iso.Z.uu @@ -0,0 +1,37 @@ +$FreeBSD$ + +begin 644 test_read_format_iso_2.iso.Z +M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\ +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^ +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$Z408<04Q`!PH,01BCA +MA!16:.&%$!Z404$;>G0@``%\>"`""`#@04$>2)#0!`.)```%!<%8HD`EEF+C +MC:4($)"(!V+HXX]`!BGDD$06:>212":IY)),-NGDDU!&*>645%9II8\R%!@# +M##C$0(,,,6Q)PPP$DI-EF%QZ"::89,)`#H%PQBDGG&=NV>67:(Y9YH?_]>GG +MGX7](R"!!@)JZ*&()JKHHL<="...`AU80:0`!`$B`!=0.@2CG';JZ:>@A@H8 +MGR]>:FI`DP9@*:F9!BCJJ[#&*NNLM#[EXJ,#R3A0C3C:J*.I(0)P:XP`S!@0 +MK[W^RF,`+DY*T*3&%@O`&P@X4($"!I"C[(ZJNI@I09E&6R*UUBJP@+:0@NAJ +MK>RVZ^Z[\$;7;$'0[CIMM==FNZVZPI9*D*XT`M"KK^F&&(`)`%A0D`4&%&0` +MN?F20RF(!`CAP@XQQ*OQQAQW['%S:)3!!AMO*/#QR2BGK/+*G7I;4+CV0FPN +MNL`>..R_T@8\<(X%AX@P!@5AT#!!#^,[\\0!$$#$Q1FS[/334$M]MILM^WVVW#'+??<=-=M]]UXYZWW +MWGSW[???@`N^>:<=^[Y +MYZ"'+OKHI)=N^NFHIZ[ZZJRW[OKKL,O_/+,-^_\\]!'+_WTU%=O_?789Z_]]MQW[_WWX(BGK_[Z[+?O_OOPQR___/37;__]^.>O__[\]^___P`,H``'2,`"&O"`"$R@ +M`A?(P`8Z\($0C*`$)TC!"EKP@AC,H`8WR,$.>O"#(`RA"$=(PA*:\(0H3*$* +M5\C"%KKPA3",H0QG2,,:VO"&.,RA#G?(PQ[Z\(=`#*(0ATC$(AKQB$A,HA*7 +MR,0F.O&)4(RB%*=(Q2I:\8I8S*(6M\C%+GKQBV`,HQC'2,8RFO&,:$RC&M?( +MQC:Z\8UPC*,O.;X`RG.,=)SG*:\YSH3*^,RG/O?)SW[Z\Y\`#:A`!TK0@AKTH`A-J$(7RM"&.O2A +M$(VH1"=*T8I:]*(8S:A&-\K1CGKTHR`-J4A'2M*2FO2D*$VI2E?*TI:Z]*4P +MC:E,9TK3FMKTICC-J4YWRM.>^O2G0`VJ4(=*U*(:]:A(3:I2E\K4ICKUJ5"- +MJE2G2M6J6O6J6,VJ5K?*U:YZ]:M@#:M8QTK6LIKUK&A-JUK7RM:VNO6M<`TG +` +end diff --git a/lib/libarchive/test/test_read_format_iso_gz.c b/lib/libarchive/test/test_read_format_iso_gz.c index 22893790c30..d0d6b3c1a1f 100644 --- a/lib/libarchive/test/test_read_format_iso_gz.c +++ b/lib/libarchive/test/test_read_format_iso_gz.c @@ -25,7 +25,8 @@ #include "test.h" __FBSDID("$FreeBSD$"); -DEFINE_TEST(test_read_format_iso_gz) +static void +test1(void) { struct archive_entry *ae; struct archive *a; @@ -49,4 +50,50 @@ DEFINE_TEST(test_read_format_iso_gz) assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); } +static +void test2(void) +{ + struct archive_entry *ae; + struct archive *a; + const char *name = "test_read_format_iso_2.iso.Z"; + + extract_reference_file(name); + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_compression_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, name, 512)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae)); + assertEqualString(".", archive_entry_pathname(ae)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae)); + assertEqualString("A", archive_entry_pathname(ae)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae)); + assertEqualString("A/B", archive_entry_pathname(ae)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae)); + assertEqualString("C", archive_entry_pathname(ae)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_next_header(a, &ae)); + assertEqualString("C/D", archive_entry_pathname(ae)); + assertEqualIntA(a, ARCHIVE_EOF, + archive_read_next_header(a, &ae)); + assertEqualInt(archive_compression(a), + ARCHIVE_COMPRESSION_COMPRESS); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); +} + +DEFINE_TEST(test_read_format_iso_gz) +{ + test1(); + test2(); +} + diff --git a/lib/libarchive/test/test_read_format_isojoliet_bz2.c b/lib/libarchive/test/test_read_format_isojoliet_bz2.c index b2f22a7a597..ca2da83dc42 100644 --- a/lib/libarchive/test/test_read_format_isojoliet_bz2.c +++ b/lib/libarchive/test/test_read_format_isojoliet_bz2.c @@ -95,7 +95,7 @@ DEFINE_TEST(test_read_format_isojoliet_bz2) /* A regular file with two names ("hardlink" gets returned * first, so it's not marked as a hardlink). */ assertEqualInt(0, archive_read_next_header(a, &ae)); - assertEqualString("long-joliet-file-name.textfile", + assertEqualString("hardlink", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); assert(archive_entry_hardlink(ae) == NULL); @@ -108,9 +108,10 @@ DEFINE_TEST(test_read_format_isojoliet_bz2) /* Second name for the same regular file (this happens to be * returned second, so does get marked as a hardlink). */ assertEqualInt(0, archive_read_next_header(a, &ae)); - assertEqualString("hardlink", archive_entry_pathname(ae)); - assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); assertEqualString("long-joliet-file-name.textfile", + archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("hardlink", archive_entry_hardlink(ae)); assert(!archive_entry_size_is_set(ae)); diff --git a/lib/libarchive/test/test_read_format_isojoliet_long.c b/lib/libarchive/test/test_read_format_isojoliet_long.c index acd220f4b6e..d1d38d7a235 100644 --- a/lib/libarchive/test/test_read_format_isojoliet_long.c +++ b/lib/libarchive/test/test_read_format_isojoliet_long.c @@ -111,7 +111,7 @@ DEFINE_TEST(test_read_format_isojoliet_long) pathname[102] = '3'; pathname[103] = '\0'; assertEqualInt(0, archive_read_next_header(a, &ae)); - assertEqualString(pathname, archive_entry_pathname(ae)); + assertEqualString("hardlink", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); assert(archive_entry_hardlink(ae) == NULL); assertEqualInt(6, archive_entry_size(ae)); @@ -123,9 +123,9 @@ DEFINE_TEST(test_read_format_isojoliet_long) /* Second name for the same regular file (this happens to be * returned second, so does get marked as a hardlink). */ assertEqualInt(0, archive_read_next_header(a, &ae)); - assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualString(pathname, archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); - assertEqualString(pathname, archive_entry_hardlink(ae)); + assertEqualString("hardlink", archive_entry_hardlink(ae)); assert(!archive_entry_size_is_set(ae)); /* End of archive. */ diff --git a/lib/libarchive/test/test_read_format_isojoliet_rr.c b/lib/libarchive/test/test_read_format_isojoliet_rr.c index 394df144f3c..b971272bc8f 100644 --- a/lib/libarchive/test/test_read_format_isojoliet_rr.c +++ b/lib/libarchive/test/test_read_format_isojoliet_rr.c @@ -98,7 +98,7 @@ DEFINE_TEST(test_read_format_isojoliet_rr) /* A regular file with two names ("hardlink" gets returned * first, so it's not marked as a hardlink). */ assertEqualInt(0, archive_read_next_header(a, &ae)); - assertEqualString("long-joliet-file-name.textfile", + assertEqualString("hardlink", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); assert(archive_entry_hardlink(ae) == NULL); @@ -120,9 +120,10 @@ DEFINE_TEST(test_read_format_isojoliet_rr) /* Second name for the same regular file (this happens to be * returned second, so does get marked as a hardlink). */ assertEqualInt(0, archive_read_next_header(a, &ae)); - assertEqualString("hardlink", archive_entry_pathname(ae)); - assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); assertEqualString("long-joliet-file-name.textfile", + archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("hardlink", archive_entry_hardlink(ae)); assert(!archive_entry_size_is_set(ae)); assertEqualInt(86401, archive_entry_mtime(ae)); diff --git a/lib/libarchive/test/test_read_format_isorr_bz2.c b/lib/libarchive/test/test_read_format_isorr_bz2.c index 730c1122810..b7cd7042f3c 100644 --- a/lib/libarchive/test/test_read_format_isorr_bz2.c +++ b/lib/libarchive/test/test_read_format_isorr_bz2.c @@ -97,9 +97,9 @@ DEFINE_TEST(test_read_format_isorr_bz2) assertEqualInt(2, archive_entry_stat(ae)->st_nlink); assertEqualInt(1, archive_entry_uid(ae)); assertEqualInt(2, archive_entry_gid(ae)); - } else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) { + } else if (strcmp("file", archive_entry_pathname(ae)) == 0) { /* A regular file. */ - assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualString("file", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); assertEqualInt(12345684, archive_entry_size(ae)); assertEqualInt(0, @@ -111,16 +111,16 @@ DEFINE_TEST(test_read_format_isorr_bz2) assertEqualInt(2, archive_entry_stat(ae)->st_nlink); assertEqualInt(1, archive_entry_uid(ae)); assertEqualInt(2, archive_entry_gid(ae)); - } else if (strcmp("file", archive_entry_pathname(ae)) == 0) { + } else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) { /* A hardlink to the regular file. */ /* Note: If "hardlink" gets returned before "file", * then "hardlink" will get returned as a regular file * and "file" will get returned as the hardlink. * This test should tolerate that, since it's a * perfectly permissible thing for libarchive to do. */ - assertEqualString("file", archive_entry_pathname(ae)); + assertEqualString("hardlink", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); - assertEqualString("hardlink", archive_entry_hardlink(ae)); + assertEqualString("file", archive_entry_hardlink(ae)); assertEqualInt(0, archive_entry_size_is_set(ae)); assertEqualInt(0, archive_entry_size(ae)); assertEqualInt(86401, archive_entry_mtime(ae)); diff --git a/lib/libarchive/test/test_read_format_isorr_new_bz2.c b/lib/libarchive/test/test_read_format_isorr_new_bz2.c index 5fa2492ec26..c8554a0658a 100644 --- a/lib/libarchive/test/test_read_format_isorr_new_bz2.c +++ b/lib/libarchive/test/test_read_format_isorr_new_bz2.c @@ -98,9 +98,9 @@ DEFINE_TEST(test_read_format_isorr_new_bz2) assertEqualInt(2, archive_entry_stat(ae)->st_nlink); assertEqualInt(1, archive_entry_uid(ae)); assertEqualInt(2, archive_entry_gid(ae)); - } else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) { + } else if (strcmp("file", archive_entry_pathname(ae)) == 0) { /* A regular file. */ - assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualString("file", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); assertEqualInt(12345684, archive_entry_size(ae)); assertEqualInt(0, @@ -112,16 +112,16 @@ DEFINE_TEST(test_read_format_isorr_new_bz2) assertEqualInt(2, archive_entry_stat(ae)->st_nlink); assertEqualInt(1, archive_entry_uid(ae)); assertEqualInt(2, archive_entry_gid(ae)); - } else if (strcmp("file", archive_entry_pathname(ae)) == 0) { + } else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) { /* A hardlink to the regular file. */ /* Note: If "hardlink" gets returned before "file", * then "hardlink" will get returned as a regular file * and "file" will get returned as the hardlink. * This test should tolerate that, since it's a * perfectly permissible thing for libarchive to do. */ - assertEqualString("file", archive_entry_pathname(ae)); + assertEqualString("hardlink", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); - assertEqualString("hardlink", archive_entry_hardlink(ae)); + assertEqualString("file", archive_entry_hardlink(ae)); assertEqualInt(0, archive_entry_size_is_set(ae)); assertEqualInt(0, archive_entry_size(ae)); assertEqualInt(86401, archive_entry_mtime(ae)); diff --git a/lib/libarchive/test/test_read_format_isozisofs_bz2.c b/lib/libarchive/test/test_read_format_isozisofs_bz2.c index 56c39c0be22..a4f392edab3 100644 --- a/lib/libarchive/test/test_read_format_isozisofs_bz2.c +++ b/lib/libarchive/test/test_read_format_isozisofs_bz2.c @@ -96,10 +96,10 @@ DEFINE_TEST(test_read_format_isozisofs_bz2) assertEqualInt(2, archive_entry_stat(ae)->st_nlink); assertEqualInt(1, archive_entry_uid(ae)); assertEqualInt(2, archive_entry_gid(ae)); - } else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) { + } else if (strcmp("file", archive_entry_pathname(ae)) == 0) { int r; /* A regular file. */ - assertEqualString("hardlink", archive_entry_pathname(ae)); + assertEqualString("file", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); assertEqualInt(12345684, archive_entry_size(ae)); r = archive_read_data_block(a, &p, &size, &offset); @@ -111,23 +111,23 @@ DEFINE_TEST(test_read_format_isozisofs_bz2) assertEqualMem(p, "hello\n", 6); } assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); assertEqualInt(2, archive_entry_stat(ae)->st_nlink); assertEqualInt(1, archive_entry_uid(ae)); assertEqualInt(2, archive_entry_gid(ae)); - } else if (strcmp("file", archive_entry_pathname(ae)) == 0) { + } else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) { /* A hardlink to the regular file. */ /* Note: If "hardlink" gets returned before "file", * then "hardlink" will get returned as a regular file * and "file" will get returned as the hardlink. * This test should tolerate that, since it's a * perfectly permissible thing for libarchive to do. */ - assertEqualString("file", archive_entry_pathname(ae)); + assertEqualString("hardlink", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); - assertEqualString("hardlink", archive_entry_hardlink(ae)); + assertEqualString("file", archive_entry_hardlink(ae)); assertEqualInt(0, archive_entry_size_is_set(ae)); assertEqualInt(0, archive_entry_size(ae)); assertEqualInt(86401, archive_entry_mtime(ae)); - assertEqualInt(86401, archive_entry_atime(ae)); assertEqualInt(2, archive_entry_stat(ae)->st_nlink); assertEqualInt(1, archive_entry_uid(ae)); assertEqualInt(2, archive_entry_gid(ae)); From 64371599f08505c9fbc2a93d2f93d6542a6b8c38 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Thu, 25 Aug 2011 08:47:38 +0000 Subject: [PATCH 327/452] If a drive is not part of the array (i.e. missing) we need to print the new line after the pd state information as well, so move it to the outside of the block. Submitted by: Mark Johnston at Sandvine Inc MFC atfer: 3 days Approved by: re (kib) --- usr.sbin/mfiutil/mfi_show.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.sbin/mfiutil/mfi_show.c b/usr.sbin/mfiutil/mfi_show.c index ee19e8635ba..9d9f7a11c57 100644 --- a/usr.sbin/mfiutil/mfi_show.c +++ b/usr.sbin/mfiutil/mfi_show.c @@ -330,8 +330,8 @@ show_config(int ac, char **av) mfi_pdstate(ar->pd[j].fw_state)); else print_pd(&pinfo, -1); - printf("\n"); } + printf("\n"); } p += config->array_size; } From b233773bb9f2d7b382c829856684f216b2d3fb2a Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Thu, 25 Aug 2011 09:20:13 +0000 Subject: [PATCH 328/452] Increase the defaults for the maximum socket buffer limit, and the maximum TCP send and receive buffer limits from 256kB to 2MB. For sb_max_adj we need to add the cast as already used in the sysctl handler to not overflow the type doing the maths. Note that this is just the defaults. They will allow more memory to be consumed per socket/connection if needed but not change the default "idle" memory consumption. All values are still tunable by sysctls. Suggested by: gnn Discussed on: arch (Mar and Aug 2011) MFC after: 3 weeks Approved by: re (kib) --- sys/kern/uipc_sockbuf.c | 2 +- sys/netinet/tcp_input.c | 2 +- sys/netinet/tcp_output.c | 2 +- sys/sys/sockbuf.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c index 2d86d740996..551afac0013 100644 --- a/sys/kern/uipc_sockbuf.c +++ b/sys/kern/uipc_sockbuf.c @@ -61,7 +61,7 @@ void (*aio_swake)(struct socket *, struct sockbuf *); u_long sb_max = SB_MAX; u_long sb_max_adj = - SB_MAX * MCLBYTES / (MSIZE + MCLBYTES); /* adjusted sb_max */ + (quad_t)SB_MAX * MCLBYTES / (MSIZE + MCLBYTES); /* adjusted sb_max */ static u_long sb_efficiency = 8; /* parameter for sbreserve() */ diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 7f06bd48bab..b1a8b335cab 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -195,7 +195,7 @@ SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, recvbuf_inc, CTLFLAG_RW, &VNET_NAME(tcp_autorcvbuf_inc), 0, "Incrementor step size of automatic receive buffer"); -VNET_DEFINE(int, tcp_autorcvbuf_max) = 256*1024; +VNET_DEFINE(int, tcp_autorcvbuf_max) = 2*1024*1024; #define V_tcp_autorcvbuf_max VNET(tcp_autorcvbuf_max) SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, recvbuf_max, CTLFLAG_RW, &VNET_NAME(tcp_autorcvbuf_max), 0, diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c index 572a491be0d..702eed330f1 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -117,7 +117,7 @@ SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, sendbuf_inc, CTLFLAG_RW, &VNET_NAME(tcp_autosndbuf_inc), 0, "Incrementor step size of automatic send buffer"); -VNET_DEFINE(int, tcp_autosndbuf_max) = 256*1024; +VNET_DEFINE(int, tcp_autosndbuf_max) = 2*1024*1024; #define V_tcp_autosndbuf_max VNET(tcp_autosndbuf_max) SYSCTL_VNET_INT(_net_inet_tcp, OID_AUTO, sendbuf_max, CTLFLAG_RW, &VNET_NAME(tcp_autosndbuf_max), 0, diff --git a/sys/sys/sockbuf.h b/sys/sys/sockbuf.h index b8e66999028..bfccd74f6f7 100644 --- a/sys/sys/sockbuf.h +++ b/sys/sys/sockbuf.h @@ -37,7 +37,7 @@ #include #include -#define SB_MAX (256*1024) /* default for max chars in sockbuf */ +#define SB_MAX (2*1024*1024) /* default for max chars in sockbuf */ /* * Constants for sb_flags field of struct sockbuf. From c5378361a316ce0e3054c3a7d0c39cb0556e7767 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Thu, 25 Aug 2011 09:38:33 +0000 Subject: [PATCH 329/452] Use the correct byte order for the ip_divert(4) mbuf tag port meta information in pf(4). Submitted by: Yaocl (chunlinyao gmail.com), forum post 145106 Approved by: re (kib) --- sys/contrib/pf/net/pf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/contrib/pf/net/pf.c b/sys/contrib/pf/net/pf.c index 5efd651f4db..9d403714766 100644 --- a/sys/contrib/pf/net/pf.c +++ b/sys/contrib/pf/net/pf.c @@ -6967,7 +6967,8 @@ done: ipfwtag = m_tag_alloc(MTAG_IPFW_RULE, 0, sizeof(struct ipfw_rule_ref), M_NOWAIT | M_ZERO); if (ipfwtag != NULL) { - ((struct ipfw_rule_ref *)(ipfwtag+1))->info = r->divert.port; + ((struct ipfw_rule_ref *)(ipfwtag+1))->info = + ntohs(r->divert.port); ((struct ipfw_rule_ref *)(ipfwtag+1))->rulenum = dir; m_tag_prepend(m, ipfwtag); From 745e9ba27db9bbf6b4c449507740bc9acc4dabee Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Thu, 25 Aug 2011 10:00:38 +0000 Subject: [PATCH 330/452] Clarify the behaviour of sigwait() on signal interruption, and note the difference between sigwait() and sigtimedwait()/sigwaitinfo(). Approved by: re (bz) --- lib/libc/sys/sigwait.2 | 10 +++++++++- lib/libc/sys/sigwaitinfo.2 | 12 +++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/libc/sys/sigwait.2 b/lib/libc/sys/sigwait.2 index 8c00cf4277c..a9e605c2d54 100644 --- a/lib/libc/sys/sigwait.2 +++ b/lib/libc/sys/sigwait.2 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 11, 2005 +.Dd August 24, 2011 .Dt SIGWAIT 2 .Os .Sh NAME @@ -82,6 +82,14 @@ selected, it will be the lowest numbered one. The selection order between realtime and non-realtime signals, or between multiple pending non-realtime signals, is unspecified. +.Sh IMPLEMENTATION NOTES +The +.Fn sigwait +function is implemented as a wrapper around the +.Fn __sys_sigwait +system call, which retries the call on +.Er EINTR +error. .Sh RETURN VALUES If successful, .Fn sigwait diff --git a/lib/libc/sys/sigwaitinfo.2 b/lib/libc/sys/sigwaitinfo.2 index 41be9e2bd56..a83de06fc82 100644 --- a/lib/libc/sys/sigwaitinfo.2 +++ b/lib/libc/sys/sigwaitinfo.2 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 11, 2005 +.Dd August 24, 2011 .Dt SIGTIMEDWAIT 2 .Os .Sh NAME @@ -116,6 +116,16 @@ except that the selected signal number shall be stored in the member, and the cause of the signal shall be stored in the .Va si_code member. +Besides this, the +.Fn sigwaitinfo +and +.Fn sigtimedwait +system calls may return +.Er EINTR +if interrupted by signal, which is not allowed for the +.Fn sigwait +function. +.Pp If any value is queued to the selected signal, the first such queued value is dequeued and, if the info argument is .Pf non- Dv NULL , From 6aba400a7055ed2427c6aa297774fb91f5d8db79 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Thu, 25 Aug 2011 15:51:54 +0000 Subject: [PATCH 331/452] Fix a deficiency in the selinfo interface: If a selinfo object is recorded (via selrecord()) and then it is quickly destroyed, with the waiters missing the opportunity to awake, at the next iteration they will find the selinfo object destroyed, causing a PF#. That happens because the selinfo interface has no way to drain the waiters before to destroy the registered selinfo object. Also this race is quite rare to get in practice, because it would require a selrecord(), a poll request by another thread and a quick destruction of the selrecord()'ed selinfo object. Fix this by adding the seldrain() routine which should be called before to destroy the selinfo objects (in order to avoid such case), and fix the present cases where it might have already been called. Sometimes, the context is safe enough to prevent this type of race, like it happens in device drivers which installs selinfo objects on poll callbacks. There, the destruction of the selinfo object happens at driver detach time, when all the filedescriptors should be already closed, thus there cannot be a race. For this case, mfi(4) device driver can be set as an example, as it implements a full correct logic for preventing this from happening. Sponsored by: Sandvine Incorporated Reported by: rstone Tested by: pluknet Reviewed by: jhb, kib Approved by: re (bz) MFC after: 3 weeks --- share/man/man9/Makefile | 2 +- share/man/man9/selrecord.9 | 21 +++++++++++++++++++-- sys/kern/kern_event.c | 1 + sys/kern/sys_generic.c | 17 +++++++++++++++++ sys/kern/sys_pipe.c | 1 + sys/kern/tty.c | 2 ++ sys/kern/tty_pts.c | 2 ++ sys/kern/uipc_mqueue.c | 2 ++ sys/kern/uipc_socket.c | 2 ++ sys/kern/vfs_subr.c | 1 + sys/net/bpf.c | 2 +- sys/net/if_tap.c | 1 + sys/net/if_tun.c | 1 + sys/security/audit/audit_pipe.c | 1 + sys/sys/selinfo.h | 1 + sys/x86/acpica/acpi_apm.c | 1 + 16 files changed, 54 insertions(+), 4 deletions(-) diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index a04cb684a67..05bab57581c 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -1075,7 +1075,7 @@ MLINKS+=scheduler.9 curpriority_cmp.9 \ scheduler.9 setrunnable.9 \ scheduler.9 updatepri.9 MLINKS+=securelevel_gt.9 securelevel_ge.9 -MLINKS+=selrecord.9 selwakeup.9 +MLINKS+=seldrain.9 selrecord.9 selwakeup.9 MLINKS+=sema.9 sema_destroy.9 \ sema.9 sema_init.9 \ sema.9 sema_post.9 \ diff --git a/share/man/man9/selrecord.9 b/share/man/man9/selrecord.9 index 15c5a18cf44..f7a0113fc41 100644 --- a/share/man/man9/selrecord.9 +++ b/share/man/man9/selrecord.9 @@ -26,10 +26,11 @@ .\" .\" $FreeBSD$ .\" -.Dd June 13, 2007 +.Dd August 25, 2011 .Dt SELRECORD 9 .Os .Sh NAME +.Nm seldrain , .Nm selrecord , .Nm selwakeup .Nd "record and wakeup select requests" @@ -37,14 +38,17 @@ .In sys/param.h .In sys/selinfo.h .Ft void +.Fn seldrain "struct selinfo *sip" +.Ft void .Fn selrecord "struct thread *td" "struct selinfo *sip" .Ft void .Fn selwakeup "struct selinfo *sip" .Sh DESCRIPTION +.Fn seldrain , .Fn selrecord and .Fn selwakeup -are the two central functions used by +are the three central functions used by .Xr select 2 , .Xr poll 2 and the objects that are being selected on. @@ -86,6 +90,15 @@ and .Xr poll 2 when they wake up. .Pp +.Fn seldrain +will flush the waiters queue on a specified object before its +destruction. +The object handling code must ensure that +.Fa *sip +cannot be used once +.Fn seldrain +has been called. +.Pp The contents of .Fa *sip must be zeroed, such as by softc initialization, before any call to @@ -98,6 +111,10 @@ acquires and releases .Va sellock and may acquire and release .Va sched_lock . +.Fn seldrain +could usually be just a wrapper for +.Fn selwakeup , +but consumers should not generally rely on this feature. .Sh SEE ALSO .Xr poll 2 , .Xr select 2 diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index c512b0ac734..dc11411fd5d 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -1704,6 +1704,7 @@ kqueue_close(struct file *fp, struct thread *td) SLIST_REMOVE(&fdp->fd_kqlist, kq, kqueue, kq_list); FILEDESC_XUNLOCK(fdp); + seldrain(&kq->kq_sel); knlist_destroy(&kq->kq_sel.si_note); mtx_destroy(&kq->kq_lock); kq->kq_fdp = NULL; diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 6edd4fbdeee..7b45efa2ff5 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1490,6 +1490,23 @@ selfdfree(struct seltd *stp, struct selfd *sfp) uma_zfree(selfd_zone, sfp); } +/* Drain the waiters tied to all the selfd belonging the specified selinfo. */ +void +seldrain(sip) + struct selinfo *sip; +{ + + /* + * This feature is already provided by doselwakeup(), thus it is + * enough to go for it. + * Eventually, the context, should take care to avoid races + * between thread calling select()/poll() and file descriptor + * detaching, but, again, the races are just the same as + * selwakeup(). + */ + doselwakeup(sip, -1); +} + /* * Record a select request. */ diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index 14e12075f1d..c44a2c964e4 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -1517,6 +1517,7 @@ pipeclose(cpipe) */ knlist_clear(&cpipe->pipe_sel.si_note, 1); cpipe->pipe_present = PIPE_FINALIZED; + seldrain(&cpipe->pipe_sel); knlist_destroy(&cpipe->pipe_sel.si_note); /* diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 77c02dd57dd..ce49f972b2f 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -1022,6 +1022,8 @@ tty_dealloc(void *arg) MPASS(ttyinq_getsize(&tp->t_inq) == 0); MPASS(ttyoutq_getsize(&tp->t_outq) == 0); + seldrain(&tp->t_inpoll); + seldrain(&tp->t_outpoll); knlist_destroy(&tp->t_inpoll.si_note); knlist_destroy(&tp->t_outpoll.si_note); diff --git a/sys/kern/tty_pts.c b/sys/kern/tty_pts.c index cf9f94d375d..f2f5c4e71bd 100644 --- a/sys/kern/tty_pts.c +++ b/sys/kern/tty_pts.c @@ -688,6 +688,8 @@ ptsdrv_free(void *softc) racct_sub_cred(psc->pts_cred, RACCT_NPTS, 1); crfree(psc->pts_cred); + seldrain(&psc->pts_inpoll); + seldrain(&psc->pts_outpoll); knlist_destroy(&psc->pts_inpoll.si_note); knlist_destroy(&psc->pts_outpoll.si_note); diff --git a/sys/kern/uipc_mqueue.c b/sys/kern/uipc_mqueue.c index fbd78c16a28..b91b890e8a2 100644 --- a/sys/kern/uipc_mqueue.c +++ b/sys/kern/uipc_mqueue.c @@ -1562,6 +1562,8 @@ mqueue_free(struct mqueue *mq) } mtx_destroy(&mq->mq_mutex); + seldrain(&mq->mq_rsel); + seldrain(&mq->mq_wsel); knlist_destroy(&mq->mq_rsel.si_note); knlist_destroy(&mq->mq_wsel.si_note); uma_zfree(mqueue_zone, mq); diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 990c6bad11f..bbd4fad3874 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -661,6 +661,8 @@ sofree(struct socket *so) */ sbdestroy(&so->so_snd, so); sbdestroy(&so->so_rcv, so); + seldrain(&so->so_snd.sb_sel); + seldrain(&so->so_rcv.sb_sel); knlist_destroy(&so->so_rcv.sb_sel.si_note); knlist_destroy(&so->so_snd.sb_sel.si_note); sodealloc(so); diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index a9fe8d10773..325ca99deb3 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -3312,6 +3312,7 @@ vbusy(struct vnode *vp) static void destroy_vpollinfo(struct vpollinfo *vi) { + seldrain(&vi->vpi_selinfo); knlist_destroy(&vi->vpi_selinfo.si_note); mtx_destroy(&vi->vpi_lock); uma_zfree(vnodepoll_zone, vi); diff --git a/sys/net/bpf.c b/sys/net/bpf.c index e5165731dae..79c77a93278 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -652,10 +652,10 @@ bpf_dtor(void *data) if (d->bd_bif) bpf_detachd(d); mtx_unlock(&bpf_mtx); - selwakeuppri(&d->bd_sel, PRINET); #ifdef MAC mac_bpfdesc_destroy(d); #endif /* MAC */ + seldrain(&d->bd_sel); knlist_destroy(&d->bd_sel.si_note); callout_drain(&d->bd_callout); bpf_freed(d); diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c index ad29da04499..08c669ab3b8 100644 --- a/sys/net/if_tap.c +++ b/sys/net/if_tap.c @@ -214,6 +214,7 @@ tap_destroy(struct tap_softc *tp) KASSERT(!(tp->tap_flags & TAP_OPEN), ("%s flags is out of sync", ifp->if_xname)); + seldrain(&tp->tap_rsel); knlist_destroy(&tp->tap_rsel.si_note); destroy_dev(tp->tap_dev); ether_ifdetach(ifp); diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c index d74c9fec285..c5328848c7b 100644 --- a/sys/net/if_tun.c +++ b/sys/net/if_tun.c @@ -259,6 +259,7 @@ tun_destroy(struct tun_softc *tp) if_detach(TUN2IFP(tp)); if_free(TUN2IFP(tp)); destroy_dev(dev); + seldrain(&tp->tun_rsel); knlist_destroy(&tp->tun_rsel.si_note); mtx_destroy(&tp->tun_mtx); cv_destroy(&tp->tun_cv); diff --git a/sys/security/audit/audit_pipe.c b/sys/security/audit/audit_pipe.c index a8db1135db7..a953eb0200d 100644 --- a/sys/security/audit/audit_pipe.c +++ b/sys/security/audit/audit_pipe.c @@ -646,6 +646,7 @@ audit_pipe_free(struct audit_pipe *ap) cv_destroy(&ap->ap_cv); AUDIT_PIPE_SX_LOCK_DESTROY(ap); AUDIT_PIPE_LOCK_DESTROY(ap); + seldrain(&ap->ap_selinfo); knlist_destroy(&ap->ap_selinfo.si_note); TAILQ_REMOVE(&audit_pipe_list, ap, ap_list); free(ap, M_AUDIT_PIPE); diff --git a/sys/sys/selinfo.h b/sys/sys/selinfo.h index 2d2f8485e77..590d184ad17 100644 --- a/sys/sys/selinfo.h +++ b/sys/sys/selinfo.h @@ -51,6 +51,7 @@ struct selinfo { #define SEL_WAITING(si) (!TAILQ_EMPTY(&(si)->si_tdlist)) #ifdef _KERNEL +void seldrain(struct selinfo *sip); void selrecord(struct thread *selector, struct selinfo *sip); void selwakeup(struct selinfo *sip); void selwakeuppri(struct selinfo *sip, int pri); diff --git a/sys/x86/acpica/acpi_apm.c b/sys/x86/acpica/acpi_apm.c index 02be6e01fe5..776b1be602a 100644 --- a/sys/x86/acpica/acpi_apm.c +++ b/sys/x86/acpica/acpi_apm.c @@ -297,6 +297,7 @@ apmclose(struct cdev *dev, int flag, int fmt, struct thread *td) /* Remove this clone's data from the list and free it. */ ACPI_LOCK(acpi); STAILQ_REMOVE(&acpi_sc->apm_cdevs, clone, apm_clone_data, entries); + seldrain(&clone->sel_read); knlist_destroy(&clone->sel_read.si_note); ACPI_UNLOCK(acpi); free(clone, M_APMDEV); From 1c93fd20a07c7962ed69eb08a9df3c6bf94a9574 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Thu, 25 Aug 2011 17:42:27 +0000 Subject: [PATCH 332/452] Fix an error in the generation of the manpage after r225177. Sponsored by: Sandvine Incorporated Submitted by: jkim Approved by: re (bz) MFC after: 3 weeks X-MFC: r225177 --- share/man/man9/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index 05bab57581c..5f143c3c5b8 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -1075,7 +1075,8 @@ MLINKS+=scheduler.9 curpriority_cmp.9 \ scheduler.9 setrunnable.9 \ scheduler.9 updatepri.9 MLINKS+=securelevel_gt.9 securelevel_ge.9 -MLINKS+=seldrain.9 selrecord.9 selwakeup.9 +MLINKS+=selrecord.9 seldrain.9 \ + selrecord.9 selwakeup.9 MLINKS+=sema.9 sema_destroy.9 \ sema.9 sema_init.9 \ sema.9 sema_post.9 \ From 5ee47a86cba9609e739b952836d04f1bcedfe1c8 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Thu, 25 Aug 2011 21:20:11 +0000 Subject: [PATCH 333/452] Auto-generate hardware notes for vxge(4). Approved by: re (kib) --- release/doc/en_US.ISO8859-1/hardware/article.sgml | 2 ++ release/doc/share/misc/dev.archlist.txt | 1 + 2 files changed, 3 insertions(+) diff --git a/release/doc/en_US.ISO8859-1/hardware/article.sgml b/release/doc/en_US.ISO8859-1/hardware/article.sgml index cff4007629b..65e17ed9767 100644 --- a/release/doc/en_US.ISO8859-1/hardware/article.sgml +++ b/release/doc/en_US.ISO8859-1/hardware/article.sgml @@ -987,6 +987,8 @@ &hwlist.vx; + &hwlist.vxge; + &hwlist.wb; &hwlist.xe; diff --git a/release/doc/share/misc/dev.archlist.txt b/release/doc/share/misc/dev.archlist.txt index 90f529fa7c5..5ca6feb7b90 100644 --- a/release/doc/share/misc/dev.archlist.txt +++ b/release/doc/share/misc/dev.archlist.txt @@ -161,6 +161,7 @@ uvisor i386,pc98,amd64 uvscom i386,pc98,amd64 vpo i386 vx i386,pc98,ia64,amd64 +vxge i386,amd64 wb i386,pc98,amd64 xe i386,amd64 zyd i386,amd64 From 4cefd5cf3e77423d94301e7868e0da1cf59666d1 Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Fri, 26 Aug 2011 14:05:48 +0000 Subject: [PATCH 334/452] Fix path to the handbook and provide a hint about how to install it if it was not added at installation time. Approved by: re (blackend) --- etc/motd | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/etc/motd b/etc/motd index ff786fc9b3a..cbe55b8918c 100644 --- a/etc/motd +++ b/etc/motd @@ -10,8 +10,10 @@ o Security advisories and updated errata information for all releases are o The Handbook and FAQ documents are at http://www.FreeBSD.org/ and, along with the mailing lists, can be searched by going to - http://www.FreeBSD.org/search/. If the doc distribution has - been installed, they're also available formatted in /usr/share/doc. + http://www.FreeBSD.org/search/. If the doc package has been installed + (or fetched via pkg_add -r lang-freebsd-doc, where lang is the + 2-letter language code, e.g. en), they are also available formatted + in /usr/local/share/doc/freebsd. If you still have a question or problem, please take the output of `uname -a', along with any relevant error messages, and email it From 84f3091bc2cf860872a31811c8b70c74902199eb Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Fri, 26 Aug 2011 15:24:54 +0000 Subject: [PATCH 335/452] Do not include if we're building a cross-debugger, ptrace isn't used anyway, and it breaks the build, since sys/ptrace.h now includes Approved by: re --- gnu/usr.bin/gdb/arch/arm/armfbsd-nat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gnu/usr.bin/gdb/arch/arm/armfbsd-nat.c b/gnu/usr.bin/gdb/arch/arm/armfbsd-nat.c index 84599d9fc8c..674deffaa3f 100644 --- a/gnu/usr.bin/gdb/arch/arm/armfbsd-nat.c +++ b/gnu/usr.bin/gdb/arch/arm/armfbsd-nat.c @@ -32,8 +32,8 @@ #include "arm-tdep.h" #include -#include #ifndef CROSS_DEBUGGER +#include #include #include #endif From e6d5cb63fac3776e5f75893d35a04d06a26c097c Mon Sep 17 00:00:00 2001 From: Jamie Gritton Date: Fri, 26 Aug 2011 16:03:34 +0000 Subject: [PATCH 336/452] Delay the recursive decrement of pr_uref when jails are made invisible but not removed; decrement it instead when the child jail actually goes away. This avoids letting the counter go below zero in the case where dying (pr_uref==0) jails are "resurrected", and an associated KASSERT panic. Submitted by: Steven Hartland Approved by: re (bz) MFC after: 1 week --- sys/kern/kern_jail.c | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c index 050563be9a9..8ce8327bde1 100644 --- a/sys/kern/kern_jail.c +++ b/sys/kern/kern_jail.c @@ -2470,32 +2470,11 @@ prison_deref(struct prison *pr, int flags) if (!(flags & PD_LOCKED)) mtx_lock(&pr->pr_mtx); - /* Decrement the user references in a separate loop. */ - if (flags & PD_DEUREF) { - for (tpr = pr;; tpr = tpr->pr_parent) { - if (tpr != pr) - mtx_lock(&tpr->pr_mtx); - if (--tpr->pr_uref > 0) - break; - KASSERT(tpr != &prison0, ("prison0 pr_uref=0")); - mtx_unlock(&tpr->pr_mtx); - } - /* Done if there were only user references to remove. */ - if (!(flags & PD_DEREF)) { - mtx_unlock(&tpr->pr_mtx); - if (flags & PD_LIST_SLOCKED) - sx_sunlock(&allprison_lock); - else if (flags & PD_LIST_XLOCKED) - sx_xunlock(&allprison_lock); - return; - } - if (tpr != pr) { - mtx_unlock(&tpr->pr_mtx); - mtx_lock(&pr->pr_mtx); - } - } - for (;;) { + if (flags & PD_DEUREF) { + pr->pr_uref--; + KASSERT(prison0.pr_uref != 0, ("prison0 pr_uref=0")); + } if (flags & PD_DEREF) pr->pr_ref--; /* If the prison still has references, nothing else to do. */ @@ -2551,7 +2530,7 @@ prison_deref(struct prison *pr, int flags) /* Removing a prison frees a reference on its parent. */ pr = ppr; mtx_lock(&pr->pr_mtx); - flags = PD_DEREF; + flags = PD_DEREF | PD_DEUREF; } } From cee0b197de7a0674a26ece254b7f0c18e83538dc Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Fri, 26 Aug 2011 17:08:22 +0000 Subject: [PATCH 337/452] Make NKPT a kernel option on amd64 so that it can be set to a non-default value from kernel config files. Reviewed by: alc Approved by: re (kib) MFC after: 1 week --- sys/amd64/amd64/minidump_machdep.c | 1 + sys/amd64/conf/NOTES | 8 ++++++++ sys/conf/options.amd64 | 1 + 3 files changed, 10 insertions(+) diff --git a/sys/amd64/amd64/minidump_machdep.c b/sys/amd64/amd64/minidump_machdep.c index 6b417f9a976..577de0775a6 100644 --- a/sys/amd64/amd64/minidump_machdep.c +++ b/sys/amd64/amd64/minidump_machdep.c @@ -27,6 +27,7 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_pmap.h" #include "opt_watchdog.h" #include diff --git a/sys/amd64/conf/NOTES b/sys/amd64/conf/NOTES index 4a47aceda0b..07ea7b31358 100644 --- a/sys/amd64/conf/NOTES +++ b/sys/amd64/conf/NOTES @@ -490,6 +490,14 @@ options ENABLE_ALART # Control alarm on Intel intpm driver # options PMAP_SHPGPERPROC=201 +# +# Number of initial kernel page table pages used for early bootstrap. +# This number should include enough pages to map the kernel and any +# modules or other data loaded with the kernel by the loader. Each +# page table page maps 2MB. +# +options NKPT=31 + ##################################################################### # ABI Emulation diff --git a/sys/conf/options.amd64 b/sys/conf/options.amd64 index 1bb60fed79a..87960d0588e 100644 --- a/sys/conf/options.amd64 +++ b/sys/conf/options.amd64 @@ -10,6 +10,7 @@ PERFMON PMAP_SHPGPERPROC opt_pmap.h MPTABLE_FORCE_HTT MP_WATCHDOG +NKPT opt_pmap.h # Options for emulators. These should only be used at config time, so # they are handled like options for static filesystems From 90c061254577258e420b77e201f64d1ab05a3320 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Fri, 26 Aug 2011 17:35:22 +0000 Subject: [PATCH 338/452] Fix the manpage section number, thus unbreaking the hardware notes build. (1) Also hook up vxge(4) to the build. Submitted by: simon (1) Approved by: re (blackend) --- share/man/man4/Makefile | 4 ++++ share/man/man4/vxge.4 | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index 2e328c19a58..2548b1ae497 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -500,6 +500,7 @@ MAN= aac.4 \ vpo.4 \ vr.4 \ vte.4 \ + ${_vxge.4} \ watchdog.4 \ wb.4 \ wi.4 \ @@ -645,6 +646,7 @@ MLINKS+=vge.4 if_vge.4 MLINKS+=vlan.4 if_vlan.4 MLINKS+=vpo.4 imm.4 MLINKS+=vr.4 if_vr.4 +MLINKS+=${_vxge.4} ${_if_vxge.4} MLINKS+=watchdog.4 SW_WATCHDOG.4 MLINKS+=wb.4 if_wb.4 MLINKS+=wi.4 if_wi.4 @@ -685,6 +687,7 @@ _if_nfe.4= if_nfe.4 _if_nve.4= if_nve.4 _if_nxge.4= if_nxge.4 _if_urtw.4= if_urtw.4 +_if_vxge.4= if_vxge.4 _if_wpi.4= if_wpi.4 _ipmi.4= ipmi.4 _io.4= io.4 @@ -696,6 +699,7 @@ _nfsmb.4= nfsmb.4 _nve.4= nve.4 _nvram.4= nvram.4 _nxge.4= nxge.4 +_vxge.4= vxge.4 _padlock.4= padlock.4 _rr232x.4= rr232x.4 _speaker.4= speaker.4 diff --git a/share/man/man4/vxge.4 b/share/man/man4/vxge.4 index 72a644d26e2..888413ef736 100644 --- a/share/man/man4/vxge.4 +++ b/share/man/man4/vxge.4 @@ -25,7 +25,7 @@ .\" $FreeBSD$ .\" .Dd March 16, 2011 -.Dt VXGE 1 +.Dt VXGE 4 .Os .Sh NAME .Nm vxge From cd39bb098ee4a4f20d40bd8b517047c749799a9a Mon Sep 17 00:00:00 2001 From: Xin LI Date: Fri, 26 Aug 2011 18:00:07 +0000 Subject: [PATCH 339/452] Fix format strings for KTR_STATE in 4BSD ad ULE schedulers. Submitted by: Ivan Klymenko PR: kern/159904, kern/159905 MFC after: 2 weeks Approved by: re (kib) --- sys/kern/sched_4bsd.c | 4 ++-- sys/kern/sched_ule.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c index 574755f02ee..136080caf55 100644 --- a/sys/kern/sched_4bsd.c +++ b/sys/kern/sched_4bsd.c @@ -720,7 +720,7 @@ sched_exit(struct proc *p, struct thread *td) { KTR_STATE1(KTR_SCHED, "thread", sched_tdname(td), "proc exit", - "prio:td", td->td_priority); + "prio:%d", td->td_priority); PROC_LOCK_ASSERT(p, MA_OWNED); sched_exit_thread(FIRST_THREAD_IN_PROC(p), td); @@ -731,7 +731,7 @@ sched_exit_thread(struct thread *td, struct thread *child) { KTR_STATE1(KTR_SCHED, "thread", sched_tdname(child), "exit", - "prio:td", child->td_priority); + "prio:%d", child->td_priority); thread_lock(td); td->td_estcpu = ESTCPULIM(td->td_estcpu + child->td_estcpu); thread_unlock(td); diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c index 9bfb9e76224..f505676933a 100644 --- a/sys/kern/sched_ule.c +++ b/sys/kern/sched_ule.c @@ -2022,7 +2022,7 @@ sched_exit(struct proc *p, struct thread *child) struct thread *td; KTR_STATE1(KTR_SCHED, "thread", sched_tdname(child), "proc exit", - "prio:td", child->td_priority); + "prio:%d", child->td_priority); PROC_LOCK_ASSERT(p, MA_OWNED); td = FIRST_THREAD_IN_PROC(p); sched_exit_thread(td, child); @@ -2039,7 +2039,7 @@ sched_exit_thread(struct thread *td, struct thread *child) { KTR_STATE1(KTR_SCHED, "thread", sched_tdname(child), "thread exit", - "prio:td", child->td_priority); + "prio:%d", child->td_priority); /* * Give the child's runtime to the parent without returning the * sleep time as a penalty to the parent. This causes shells that From 85b422c17da135972aa83452de61a60379bdb5c8 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Fri, 26 Aug 2011 19:44:39 +0000 Subject: [PATCH 340/452] - Replace references to sio(4) with uart(4) instead. - We no longer use the same data structure in as NetBSD in pucdata.c. - ppc(4) has had a puc(4) attachment for a while now. Approved by: re (blackend) MFC after: 3 days --- share/man/man4/puc.4 | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/share/man/man4/puc.4 b/share/man/man4/puc.4 index 36e8bb4540d..34880cd9d30 100644 --- a/share/man/man4/puc.4 +++ b/share/man/man4/puc.4 @@ -35,11 +35,11 @@ Communications driver .Sh SYNOPSIS .Cd "device pci" .Cd "device puc" -.Cd "device sio" +.Cd "device uart" .Cd "device ppc" .Sh DESCRIPTION This driver acts as a shim to connect PCI serial and parallel ports to the -.Xr sio 4 +.Xr uart 4 and .Xr ppc 4 driver. @@ -49,14 +49,9 @@ The list of supported devices is in Support for new cards should be added there. .Sh SEE ALSO .Xr ppc 4 , -.Xr sio 4 +.Xr uart 4 .Sh HISTORY This driver took the idea from the .Nx .Xr puc 4 -driver and still uses the same structure to describe cards, to ease exchanging -card info. -.Sh BUGS -Only serial ports are supported through the -.Xr sio 4 -driver at the moment. +driver. From 3a3ba1b069d1b0f987e739845abbc100d548139e Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Fri, 26 Aug 2011 21:22:34 +0000 Subject: [PATCH 341/452] Enable the puc(4) driver on amd64 and i386 in GENERIC. This allows devices supported by puc(4) to work "out of the box" since puc.ko does not work "out of the box". Reviewed by: marcel Approved by: re (kib) MFC after: 1 week --- sys/amd64/conf/GENERIC | 5 +---- sys/i386/conf/GENERIC | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC index 4a38ebf2477..2d7b60502c1 100644 --- a/sys/amd64/conf/GENERIC +++ b/sys/amd64/conf/GENERIC @@ -186,10 +186,7 @@ device plip # TCP/IP over parallel device ppi # Parallel port interface device #device vpo # Requires scbus and da -# If you've got a "dumb" serial or parallel PCI card that is -# supported by the puc(4) glue driver, uncomment the following -# line to enable it (connects to sio, uart and/or ppc drivers): -#device puc +device puc # Multi I/O cards and multi-channel UARTs # PCI Ethernet NICs. device bxe # Broadcom BCM57710/BCM57711/BCM57711E 10Gb Ethernet diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC index 87da6e75709..131982b389e 100644 --- a/sys/i386/conf/GENERIC +++ b/sys/i386/conf/GENERIC @@ -196,10 +196,7 @@ device plip # TCP/IP over parallel device ppi # Parallel port interface device #device vpo # Requires scbus and da -# If you've got a "dumb" serial or parallel PCI card that is -# supported by the puc(4) glue driver, uncomment the following -# line to enable it (connects to sio, uart and/or ppc drivers): -#device puc +device puc # Multi I/O cards and multi-channel UARTs # PCI Ethernet NICs. device bxe # Broadcom BCM57710/BCM57711/BCM57711E 10Gb Ethernet From 4cf75455890c103c9a66cb791e88998aafd4f8ce Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Fri, 26 Aug 2011 21:46:36 +0000 Subject: [PATCH 342/452] Attempt to make break-to-debugger and alternative break-to-debugger more accessible: (1) Always compile in support for breaking into the debugger if options KDB is present in the kernel. (2) Disable both by default, but allow them to be enabled via tunables and sysctls debug.kdb.break_to_debugger and debug.kdb.alt_break_to_debugger. (3) options BREAK_TO_DEBUGGER and options ALT_BREAK_TO_DEBUGGER continue to behave as before -- only now instead of compiling in break-to-debugger support, they change the default values of the above sysctls to enable those features by default. Current kernel configurations should, therefore, continue to behave as expected. (4) Migrate alternative break-to-debugger state machine logic out of individual device drivers into centralised KDB code. This has a number of upsides, but also one downside: it's now tricky to release sio spin locks when entering the debugger, so we don't. However, similar logic does not exist in other device drivers, including uart. (5) dcons requires some special handling; unlike other console types, it allows overriding KDB's own debugger selection, so we need a new interface to KDB to allow that to work. GENERIC kernels in -CURRENT will now support break-to-debugger as long as appropriate boot/run-time options are set, which should improve the debuggability of BETA kernels significantly. MFC after: 3 weeks Reviewed by: kib, nwhitehorn Approved by: re (bz) --- sys/dev/cfe/cfe_console.c | 22 ++------ sys/dev/dcons/dcons_os.c | 29 +++-------- sys/dev/ofw/ofw_console.c | 22 ++------ sys/dev/sio/sio.c | 36 +++----------- sys/dev/syscons/syscons.c | 2 +- sys/dev/uart/uart_core.c | 26 ++-------- sys/kern/subr_kdb.c | 83 ++++++++++++++++++++++++++++++- sys/pc98/cbus/sio.c | 28 ++--------- sys/powerpc/mambo/mambo_console.c | 22 ++------ sys/sys/kdb.h | 2 + 10 files changed, 117 insertions(+), 155 deletions(-) diff --git a/sys/dev/cfe/cfe_console.c b/sys/dev/cfe/cfe_console.c index 1461ef21119..f3946c571ec 100644 --- a/sys/dev/cfe/cfe_console.c +++ b/sys/dev/cfe/cfe_console.c @@ -67,7 +67,7 @@ static int polltime; static struct callout_handle cfe_timeouthandle = CALLOUT_HANDLE_INITIALIZER(&cfe_timeouthandle); -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) +#if defined(KDB) static int alt_break_state; #endif @@ -191,24 +191,8 @@ cfe_cngetc(struct consdev *cp) unsigned char ch; if (cfe_read(conhandle, &ch, 1) == 1) { -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) - int kdb_brk; - - if ((kdb_brk = kdb_alt_break(ch, &alt_break_state)) != 0) { - switch (kdb_brk) { - case KDB_REQ_DEBUGGER: - kdb_enter(KDB_WHY_BREAK, - "Break sequence on console"); - break; - case KDB_REQ_PANIC: - kdb_panic("Panic sequence on console"); - break; - case KDB_REQ_REBOOT: - kdb_reboot(); - break; - - } - } +#if defined(KDB) + kdb_alt_break(ch, &alt_break_state); #endif return (ch); } diff --git a/sys/dev/dcons/dcons_os.c b/sys/dev/dcons/dcons_os.c index 3b98cdd255f..53ac612f6ba 100644 --- a/sys/dev/dcons/dcons_os.c +++ b/sys/dev/dcons/dcons_os.c @@ -133,38 +133,21 @@ static struct ttydevsw dcons_ttydevsw = { .tsw_outwakeup = dcons_outwakeup, }; -#if (defined(GDB) || defined(DDB)) && defined(ALT_BREAK_TO_DEBUGGER) +#if (defined(GDB) || defined(DDB)) static int dcons_check_break(struct dcons_softc *dc, int c) { - int kdb_brk; if (c < 0) return (c); - if ((kdb_brk = kdb_alt_break(c, &dc->brk_state)) != 0) { - switch (kdb_brk) { - case KDB_REQ_DEBUGGER: - if ((dc->flags & DC_GDB) != 0) { #ifdef GDB - if (gdb_cur == &dcons_gdb_dbgport) { - kdb_dbbe_select("gdb"); - kdb_enter(KDB_WHY_BREAK, - "Break sequence on dcons gdb port"); - } + if ((dc->flags & DC_GDB) != 0 && gdb_cur == &dcons_gdb_dbgport) + kdb_alt_break_gdb(c, &dc->brk_state); + else #endif - } else - kdb_enter(KDB_WHY_BREAK, - "Break sequence on dcons console port"); - break; - case KDB_REQ_PANIC: - kdb_panic("Panic sequence on dcons console port"); - break; - case KDB_REQ_REBOOT: - kdb_reboot(); - break; - } - } + kdb_alt_break(c, &dc->brk_state); + return (c); } #else diff --git a/sys/dev/ofw/ofw_console.c b/sys/dev/ofw/ofw_console.c index fd280c97fc8..b4a949c1f19 100644 --- a/sys/dev/ofw/ofw_console.c +++ b/sys/dev/ofw/ofw_console.c @@ -64,7 +64,7 @@ static int polltime; static struct callout_handle ofw_timeouthandle = CALLOUT_HANDLE_INITIALIZER(&ofw_timeouthandle); -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) +#if defined(KDB) static int alt_break_state; #endif @@ -199,24 +199,8 @@ ofw_cngetc(struct consdev *cp) unsigned char ch; if (OF_read(stdin, &ch, 1) > 0) { -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) - int kdb_brk; - - if ((kdb_brk = kdb_alt_break(ch, &alt_break_state)) != 0) { - switch (kdb_brk) { - case KDB_REQ_DEBUGGER: - kdb_enter(KDB_WHY_BREAK, - "Break sequence on console"); - break; - case KDB_REQ_PANIC: - kdb_panic("Panic sequence on console"); - break; - case KDB_REQ_REBOOT: - kdb_reboot(); - break; - - } - } +#if defined(KDB) + kdb_alt_break(ch, &alt_break_state); #endif return (ch); } diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c index f1348c4c357..1f2590f8918 100644 --- a/sys/dev/sio/sio.c +++ b/sys/dev/sio/sio.c @@ -228,7 +228,7 @@ struct com_s { struct pps_state pps; int pps_bit; -#ifdef ALT_BREAK_TO_DEBUGGER +#ifdef KDB int alt_brk_state; #endif @@ -1102,8 +1102,7 @@ determined_type: ; } if (ret) device_printf(dev, "could not activate interrupt\n"); -#if defined(KDB) && (defined(BREAK_TO_DEBUGGER) || \ - defined(ALT_BREAK_TO_DEBUGGER)) +#if defined(KDB) /* * Enable interrupts for early break-to-debugger support * on the console. @@ -1196,8 +1195,7 @@ comclose(tp) com->poll_output = FALSE; sio_setreg(com, com_cfcr, com->cfcr_image &= ~CFCR_SBREAK); -#if defined(KDB) && (defined(BREAK_TO_DEBUGGER) || \ - defined(ALT_BREAK_TO_DEBUGGER)) +#if defined(KDB) /* * Leave interrupts enabled and don't clear DTR if this is the * console. This allows us to detect break-to-debugger events @@ -1483,9 +1481,8 @@ siointr1(com) u_char modem_status; u_char *ioptr; u_char recv_data; -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) - int kdb_brk; +#ifdef KDB again: #endif @@ -1518,27 +1515,9 @@ again: else recv_data = inb(com->data_port); #ifdef KDB -#ifdef ALT_BREAK_TO_DEBUGGER if (com->unit == comconsole && - (kdb_brk = kdb_alt_break(recv_data, - &com->alt_brk_state)) != 0) { - mtx_unlock_spin(&sio_lock); - switch (kdb_brk) { - case KDB_REQ_DEBUGGER: - kdb_enter(KDB_WHY_BREAK, - "Break sequence on console"); - break; - case KDB_REQ_PANIC: - kdb_panic("panic on console"); - break; - case KDB_REQ_REBOOT: - kdb_reboot(); - break; - } - mtx_lock_spin(&sio_lock); + kdb_alt_break(recv_data, &com->alt_brk_state) != 0) goto again; - } -#endif /* ALT_BREAK_TO_DEBUGGER */ #endif /* KDB */ if (line_status & (LSR_BI | LSR_FE | LSR_PE)) { /* @@ -1554,10 +1533,9 @@ again: * Note: BI together with FE/PE means just BI. */ if (line_status & LSR_BI) { -#if defined(KDB) && defined(BREAK_TO_DEBUGGER) +#if defined(KDB) if (com->unit == comconsole) { - kdb_enter(KDB_WHY_BREAK, - "Line break on console"); + kdb_break(); goto cont; } #endif diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index 69d628e8774..ebaa945759d 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -3514,7 +3514,7 @@ next_code: case DBG: #ifndef SC_DISABLE_KDBKEY if (enable_kdbkey) - kdb_enter(KDB_WHY_BREAK, "manual escape to debugger"); + kdb_break(); #endif break; diff --git a/sys/dev/uart/uart_core.c b/sys/dev/uart/uart_core.c index 38d2a8f7377..5bd582b1a04 100644 --- a/sys/dev/uart/uart_core.c +++ b/sys/dev/uart/uart_core.c @@ -118,10 +118,10 @@ uart_intr_break(void *arg) { struct uart_softc *sc = arg; -#if defined(KDB) && defined(BREAK_TO_DEBUGGER) +#if defined(KDB) if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) { - kdb_enter(KDB_WHY_BREAK, "Line break on console"); - return (0); + if (kdb_break()) + return (0); } #endif if (sc->sc_opened) @@ -170,26 +170,10 @@ uart_intr_rxready(void *arg) rxp = sc->sc_rxput; UART_RECEIVE(sc); -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) +#if defined(KDB) if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) { while (rxp != sc->sc_rxput) { - int kdb_brk; - - if ((kdb_brk = kdb_alt_break(sc->sc_rxbuf[rxp++], - &sc->sc_altbrk)) != 0) { - switch (kdb_brk) { - case KDB_REQ_DEBUGGER: - kdb_enter(KDB_WHY_BREAK, - "Break sequence on console"); - break; - case KDB_REQ_PANIC: - kdb_panic("Panic sequence on console"); - break; - case KDB_REQ_REBOOT: - kdb_reboot(); - break; - } - } + kdb_alt_break(sc->sc_rxbuf[rxp++], &sc->sc_altbrk); if (rxp == sc->sc_rxbufsz) rxp = 0; } diff --git a/sys/kern/subr_kdb.c b/sys/kern/subr_kdb.c index f5cb31e71dd..76b37a9ce7c 100644 --- a/sys/kern/subr_kdb.c +++ b/sys/kern/subr_kdb.c @@ -57,6 +57,21 @@ struct pcb *kdb_thrctx = NULL; struct thread *kdb_thread = NULL; struct trapframe *kdb_frame = NULL; +#ifdef BREAK_TO_DEBUGGER +#define KDB_BREAK_TO_DEBUGGER 1 +#else +#define KDB_BREAK_TO_DEBUGGER 0 +#endif + +#ifdef ALT_BREAK_TO_DEBUGGER +#define KDB_ALT_BREAK_TO_DEBUGGER 1 +#else +#define KDB_ALT_BREAK_TO_DEBUGGER 0 +#endif + +static int kdb_break_to_debugger = KDB_BREAK_TO_DEBUGGER; +static int kdb_alt_break_to_debugger = KDB_ALT_BREAK_TO_DEBUGGER; + KDB_BACKEND(null, NULL, NULL, NULL); SET_DECLARE(kdb_dbbe_set, struct kdb_dbbe); @@ -87,6 +102,15 @@ SYSCTL_PROC(_debug_kdb, OID_AUTO, trap, CTLTYPE_INT | CTLFLAG_RW, NULL, 0, SYSCTL_PROC(_debug_kdb, OID_AUTO, trap_code, CTLTYPE_INT | CTLFLAG_RW, NULL, 0, kdb_sysctl_trap_code, "I", "set to cause a page fault via code access"); +SYSCTL_INT(_debug_kdb, OID_AUTO, break_to_debugger, CTLTYPE_INT | CTLFLAG_RW | + CTLFLAG_TUN, &kdb_break_to_debugger, 0, "Enable break to debugger"); +TUNABLE_INT("debug.kdb.break_to_debugger", &kdb_break_to_debugger); + +SYSCTL_INT(_debug_kdb, OID_AUTO, alt_break_to_debugger, CTLTYPE_INT | + CTLFLAG_RW | CTLFLAG_TUN, &kdb_alt_break_to_debugger, 0, + "Enable alternative break to debugger"); +TUNABLE_INT("debug.kdb.alt_break_to_debugger", &kdb_alt_break_to_debugger); + /* * Flag to indicate to debuggers why the debugger was entered. */ @@ -241,7 +265,17 @@ enum { }; int -kdb_alt_break(int key, int *state) +kdb_break(void) +{ + + if (!kdb_break_to_debugger) + return (0); + kdb_enter(KDB_WHY_BREAK, "Break to debugger"); + return (KDB_REQ_DEBUGGER); +} + +static int +kdb_alt_break_state(int key, int *state) { int brk; @@ -275,6 +309,53 @@ kdb_alt_break(int key, int *state) return (brk); } +static int +kdb_alt_break_internal(int key, int *state, int force_gdb) +{ + int brk; + + if (!kdb_alt_break_to_debugger) + return (0); + brk = kdb_alt_break_state(key, state); + switch (brk) { + case KDB_REQ_DEBUGGER: + if (force_gdb) + kdb_dbbe_select("gdb"); + kdb_enter(KDB_WHY_BREAK, "Break to debugger"); + break; + + case KDB_REQ_PANIC: + if (force_gdb) + kdb_dbbe_select("gdb"); + kdb_panic("Panic sequence on console"); + break; + + case KDB_REQ_REBOOT: + kdb_reboot(); + break; + } + return (0); +} + +int +kdb_alt_break(int key, int *state) +{ + + return (kdb_alt_break_internal(key, state, 0)); +} + +/* + * This variation on kdb_alt_break() is used only by dcons, which has its own + * configuration flag to force GDB use regardless of the global KDB + * configuration. + */ +int +kdb_alt_break_gdb(int key, int *state) +{ + + return (kdb_alt_break_internal(key, state, 1)); +} + /* * Print a backtrace of the calling thread. The backtrace is generated by * the selected debugger, provided it supports backtraces. If no debugger diff --git a/sys/pc98/cbus/sio.c b/sys/pc98/cbus/sio.c index 01747d7d98a..bbac9d3aee1 100644 --- a/sys/pc98/cbus/sio.c +++ b/sys/pc98/cbus/sio.c @@ -310,7 +310,7 @@ struct com_s { struct pps_state pps; int pps_bit; -#ifdef ALT_BREAK_TO_DEBUGGER +#ifdef KDB int alt_brk_state; #endif @@ -1752,8 +1752,7 @@ determined_type: ; } if (ret) device_printf(dev, "could not activate interrupt\n"); -#if defined(KDB) && (defined(BREAK_TO_DEBUGGER) || \ - defined(ALT_BREAK_TO_DEBUGGER)) +#if defined(KDB) /* * Enable interrupts for early break-to-debugger support * on the console. @@ -1896,8 +1895,7 @@ comclose(tp) sio_setreg(com, com_cfcr, com->cfcr_image &= ~CFCR_SBREAK); #endif -#if defined(KDB) && (defined(BREAK_TO_DEBUGGER) || \ - defined(ALT_BREAK_TO_DEBUGGER)) +#if defined(KDB) /* * Leave interrupts enabled and don't clear DTR if this is the * console. This allows us to detect break-to-debugger events @@ -2272,7 +2270,7 @@ siointr1(com) u_char rsa_buf_status = 0; int rsa_tx_fifo_size = 0; #endif /* PC98 */ -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) +#if defined(KDB) int kdb_brk; again: @@ -2369,27 +2367,11 @@ more_intr: else recv_data = inb(com->data_port); #ifdef KDB -#ifdef ALT_BREAK_TO_DEBUGGER if (com->unit == comconsole && (kdb_brk = kdb_alt_break(recv_data, &com->alt_brk_state)) != 0) { - mtx_unlock_spin(&sio_lock); - switch (kdb_brk) { - case KDB_REQ_DEBUGGER: - kdb_enter(KDB_WHY_BREAK, - "Break sequence on console"); - break; - case KDB_REQ_PANIC: - kdb_panic("panic on console"); - break; - case KDB_REQ_REBOOT: - kdb_reboot(); - break; - } - mtx_lock_spin(&sio_lock); goto again; } -#endif /* ALT_BREAK_TO_DEBUGGER */ #endif /* KDB */ if (line_status & (LSR_BI | LSR_FE | LSR_PE)) { /* @@ -2405,7 +2387,7 @@ more_intr: * Note: BI together with FE/PE means just BI. */ if (line_status & LSR_BI) { -#if defined(KDB) && defined(BREAK_TO_DEBUGGER) +#if defined(KDB) if (com->unit == comconsole) { kdb_enter(KDB_WHY_BREAK, "Line break on console"); diff --git a/sys/powerpc/mambo/mambo_console.c b/sys/powerpc/mambo/mambo_console.c index a5ef2f9de35..553071c63f3 100644 --- a/sys/powerpc/mambo/mambo_console.c +++ b/sys/powerpc/mambo/mambo_console.c @@ -60,7 +60,7 @@ static int polltime; static struct callout mambo_callout; static struct tty *tp = NULL; -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) +#if defined(KDB) static int alt_break_state; #endif @@ -156,24 +156,8 @@ mambo_cngetc(struct consdev *cp) ch = mambocall(MAMBO_CONSOLE_READ); if (ch > 0 && ch < 0xff) { -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) - int kdb_brk; - - if ((kdb_brk = kdb_alt_break(ch, &alt_break_state)) != 0) { - switch (kdb_brk) { - case KDB_REQ_DEBUGGER: - kdb_enter(KDB_WHY_BREAK, - "Break sequence on console"); - break; - case KDB_REQ_PANIC: - kdb_panic("Panic sequence on console"); - break; - case KDB_REQ_REBOOT: - kdb_reboot(); - break; - - } - } +#if defined(KDB) + kdb_alt_break(ch, &alt_break_state); #endif return (ch); } diff --git a/sys/sys/kdb.h b/sys/sys/kdb.h index 2982e03c75f..61ee0973eb1 100644 --- a/sys/sys/kdb.h +++ b/sys/sys/kdb.h @@ -64,6 +64,8 @@ extern struct pcb *kdb_thrctx; /* Current context. */ extern struct thread *kdb_thread; /* Current thread. */ int kdb_alt_break(int, int *); +int kdb_alt_break_gdb(int, int *); +int kdb_break(void); void kdb_backtrace(void); int kdb_dbbe_select(const char *); void kdb_enter(const char *, const char *); From 3d07127c64ec8e1a558cc3f8c78d6379463bcee1 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Sat, 27 Aug 2011 08:49:55 +0000 Subject: [PATCH 343/452] When adding IPv6 fwd support to ipfw in r225044 these two files were not committed. Initialize next_hop6 to align with the IPv4 code. PR: bin/117214 MFC after: 3 weeks X-MFC with: r225044 Approved by: re (kib) --- sys/net/if_bridge.c | 1 + sys/net/if_ethersubr.c | 1 + 2 files changed, 2 insertions(+) diff --git a/sys/net/if_bridge.c b/sys/net/if_bridge.c index 5ac4ef002dc..a4bf2b2a13b 100644 --- a/sys/net/if_bridge.c +++ b/sys/net/if_bridge.c @@ -3083,6 +3083,7 @@ bridge_pfil(struct mbuf **mp, struct ifnet *bifp, struct ifnet *ifp, int dir) args.m = *mp; args.oif = ifp; args.next_hop = NULL; + args.next_hop6 = NULL; args.eh = &eh2; args.inp = NULL; /* used by ipfw uid/gid/jail rules */ i = V_ip_fw_chk_ptr(&args); diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index aa8113bf550..1d16ae6c660 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -499,6 +499,7 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst, int shared) args.m = m; /* the packet we are looking at */ args.oif = dst; /* destination, if any */ args.next_hop = NULL; /* we do not support forward yet */ + args.next_hop6 = NULL; /* we do not support forward yet */ args.eh = &save_eh; /* MAC header for bridged/MAC packets */ args.inp = NULL; /* used by ipfw uid/gid/jail rules */ i = V_ip_fw_chk_ptr(&args); From e5a0927394502ac7d7d0383c523490eb35f773dc Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sat, 27 Aug 2011 14:24:27 +0000 Subject: [PATCH 344/452] Follow up to r225203 refining break-to-debugger run-time configuration improvements: (1) Implement new model in previously missed at91 UART driver (2) Move BREAK_TO_DEBUGGER and ALT_BREAK_TO_DEBUGGER from opt_comconsole.h to opt_kdb.h (spotted by np) (3) Garbage collect now-unused opt_comconsole.h MFC after: 3 weeks Approved by: re (bz) --- sys/arm/at91/uart_dev_at91usart.c | 23 +++-------------------- sys/conf/options | 5 ++--- sys/ddb/db_break.c | 2 -- sys/dev/cfe/cfe_console.c | 2 -- sys/dev/dcons/dcons_os.c | 1 - sys/dev/ofw/ofw_console.c | 1 - sys/dev/sio/sio.c | 1 - sys/dev/uart/uart_core.c | 4 ---- sys/modules/dcons/Makefile | 5 +---- sys/modules/sio/Makefile | 2 +- sys/pc98/cbus/sio.c | 1 - sys/powerpc/mambo/mambo_console.c | 2 -- 12 files changed, 7 insertions(+), 42 deletions(-) diff --git a/sys/arm/at91/uart_dev_at91usart.c b/sys/arm/at91/uart_dev_at91usart.c index 94ea9de1d27..f3d21aae5a0 100644 --- a/sys/arm/at91/uart_dev_at91usart.c +++ b/sys/arm/at91/uart_dev_at91usart.c @@ -29,8 +29,6 @@ #include __FBSDID("$FreeBSD$"); -#include "opt_comconsole.h" - #include #include #include @@ -485,25 +483,10 @@ at91_usart_bus_param(struct uart_softc *sc, int baudrate, int databits, static __inline void at91_rx_put(struct uart_softc *sc, int key) { -#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) - int kdb_brk; - if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) { - if ((kdb_brk = kdb_alt_break(key, &sc->sc_altbrk)) != 0) { - switch (kdb_brk) { - case KDB_REQ_DEBUGGER: - kdb_enter(KDB_WHY_BREAK, - "Break sequence on console"); - break; - case KDB_REQ_PANIC: - kdb_panic("Panic sequence on console"); - break; - case KDB_REQ_REBOOT: - kdb_reboot(); - break; - } - } - } +#if defined(KDB) + if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) + kdb_alt_break(key, &sc->sc_altbrk); #endif uart_rx_put(sc, key); } diff --git a/sys/conf/options b/sys/conf/options index 27fdbedacb6..b36a644b9e5 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -47,6 +47,8 @@ TWA_DEBUG opt_twa.h TWA_FLASH_FIRMWARE opt_twa.h # Debugging options. +ALT_BREAK_TO_DEBUGGER opt_kdb.h +BREAK_TO_DEBUGGER opt_kdb.h DDB DDB_BUFR_SIZE opt_ddb.h DDB_CAPTURE_DEFAULTBUFSIZE opt_ddb.h @@ -637,9 +639,6 @@ BKTR_SIS_VIA_MODE opt_bktr.h BKTR_USE_FREEBSD_SMBUS opt_bktr.h BKTR_NEW_MSP34XX_DRIVER opt_bktr.h -BREAK_TO_DEBUGGER opt_comconsole.h -ALT_BREAK_TO_DEBUGGER opt_comconsole.h - # Options to support PPS UART_PPS_ON_CTS opt_uart.h diff --git a/sys/ddb/db_break.c b/sys/ddb/db_break.c index ac0c8741848..02833ec0a82 100644 --- a/sys/ddb/db_break.c +++ b/sys/ddb/db_break.c @@ -35,8 +35,6 @@ #include __FBSDID("$FreeBSD$"); -#include "opt_comconsole.h" - #include #include diff --git a/sys/dev/cfe/cfe_console.c b/sys/dev/cfe/cfe_console.c index f3946c571ec..5a6b0a2bf9b 100644 --- a/sys/dev/cfe/cfe_console.c +++ b/sys/dev/cfe/cfe_console.c @@ -27,8 +27,6 @@ #include __FBSDID("$FreeBSD$"); -#include "opt_comconsole.h" - #include #include #include diff --git a/sys/dev/dcons/dcons_os.c b/sys/dev/dcons/dcons_os.c index 53ac612f6ba..b7de4148ef7 100644 --- a/sys/dev/dcons/dcons_os.c +++ b/sys/dev/dcons/dcons_os.c @@ -64,7 +64,6 @@ #include #include -#include "opt_comconsole.h" #include "opt_dcons.h" #include "opt_kdb.h" #include "opt_gdb.h" diff --git a/sys/dev/ofw/ofw_console.c b/sys/dev/ofw/ofw_console.c index b4a949c1f19..62dbe51e87e 100644 --- a/sys/dev/ofw/ofw_console.c +++ b/sys/dev/ofw/ofw_console.c @@ -26,7 +26,6 @@ #include __FBSDID("$FreeBSD$"); -#include "opt_comconsole.h" #include "opt_ofw.h" #include diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c index 1f2590f8918..7e2054e2070 100644 --- a/sys/dev/sio/sio.c +++ b/sys/dev/sio/sio.c @@ -33,7 +33,6 @@ #include __FBSDID("$FreeBSD$"); -#include "opt_comconsole.h" #include "opt_compat.h" #include "opt_gdb.h" #include "opt_kdb.h" diff --git a/sys/dev/uart/uart_core.c b/sys/dev/uart/uart_core.c index 5bd582b1a04..9260d063b99 100644 --- a/sys/dev/uart/uart_core.c +++ b/sys/dev/uart/uart_core.c @@ -27,10 +27,6 @@ #include __FBSDID("$FreeBSD$"); -#ifndef KLD_MODULE -#include "opt_comconsole.h" -#endif - #include #include #include diff --git a/sys/modules/dcons/Makefile b/sys/modules/dcons/Makefile index 60424250397..4a08b659238 100644 --- a/sys/modules/dcons/Makefile +++ b/sys/modules/dcons/Makefile @@ -5,7 +5,7 @@ KMOD = dcons SRCS = dcons.c dcons.h dcons_os.c dcons_os.h \ - opt_dcons.h opt_kdb.h opt_ddb.h opt_gdb.h opt_comconsole.h + opt_dcons.h opt_kdb.h opt_ddb.h opt_gdb.h .if !defined(KERNBUILDDIR) opt_kdb.h: @@ -13,9 +13,6 @@ opt_kdb.h: opt_ddb.h: echo "#define DDB 1" > $@ - -opt_comconsole.h: - echo "#define ALT_BREAK_TO_DEBUGGER 1" > $@ .endif CFLAGS+= -I${.CURDIR}/../.. diff --git a/sys/modules/sio/Makefile b/sys/modules/sio/Makefile index dc683ba31f3..057e9c614d4 100644 --- a/sys/modules/sio/Makefile +++ b/sys/modules/sio/Makefile @@ -7,7 +7,7 @@ KMOD= sio SRCS= bus_if.h card_if.h device_if.h isa_if.h pci_if.h serdev_if.h \ - opt_comconsole.h opt_compat.h opt_gdb.h opt_kdb.h opt_sio.h \ + opt_compat.h opt_gdb.h opt_kdb.h opt_sio.h \ sio.c sio_pccard.c sio_pci.c sio_puc.c pccarddevs.h .if ${MACHINE} == "pc98" SRCS+= sio_cbus.c diff --git a/sys/pc98/cbus/sio.c b/sys/pc98/cbus/sio.c index bbac9d3aee1..959726f2f01 100644 --- a/sys/pc98/cbus/sio.c +++ b/sys/pc98/cbus/sio.c @@ -31,7 +31,6 @@ * from: i386/isa sio.c,v 1.234 */ -#include "opt_comconsole.h" #include "opt_compat.h" #include "opt_gdb.h" #include "opt_kdb.h" diff --git a/sys/powerpc/mambo/mambo_console.c b/sys/powerpc/mambo/mambo_console.c index 553071c63f3..880ef57b147 100644 --- a/sys/powerpc/mambo/mambo_console.c +++ b/sys/powerpc/mambo/mambo_console.c @@ -25,8 +25,6 @@ #include __FBSDID("$FreeBSD$"); -#include "opt_comconsole.h" - #include #include #include From ae568477e7ceec9658e1ec561b0e885a0dd5f287 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Sat, 27 Aug 2011 15:28:57 +0000 Subject: [PATCH 345/452] Fix memory leaks in error cases. PR: 159011 Submitted by: Henning Petersen Approved by: re (kib) MFC after: 1 week --- bin/ed/buf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/ed/buf.c b/bin/ed/buf.c index db1f0e981bf..b4b78a5565b 100644 --- a/bin/ed/buf.c +++ b/bin/ed/buf.c @@ -94,6 +94,7 @@ put_sbuf_line(const char *cs) ; if (s - cs >= LINECHARS) { errmsg = "line too long"; + free(lp); return NULL; } len = s - cs; @@ -102,6 +103,7 @@ put_sbuf_line(const char *cs) if (fseeko(sfp, (off_t)0, SEEK_END) < 0) { fprintf(stderr, "%s\n", strerror(errno)); errmsg = "cannot seek temp file"; + free(lp); return NULL; } sfseek = ftello(sfp); @@ -112,6 +114,7 @@ put_sbuf_line(const char *cs) sfseek = -1; fprintf(stderr, "%s\n", strerror(errno)); errmsg = "cannot write temp file"; + free(lp); return NULL; } lp->len = len; From 04114c5ee3c11ded72b6092ea14f332897262d2a Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Sat, 27 Aug 2011 22:08:01 +0000 Subject: [PATCH 346/452] Remove information and MLINK for MULTI_DRIVER_MODULE(). The macro was removed in r121129 almost 8 years ago. PR: 150244 Submitted by: Gireesh Nagabhushana Approved by: re (kib) --- ObsoleteFiles.inc | 2 ++ share/man/man9/DRIVER_MODULE.9 | 8 +------- share/man/man9/Makefile | 1 - 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 8ab7ddbb81e..c40e7f50774 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -2293,6 +2293,8 @@ OLD_FILES+=lib/libz.so OLD_FILES+=bin/cxconfig OLD_FILES+=sbin/cxconfig OLD_FILES+=usr/share/man/man8/cxconfig.8.gz +# 20031016: MULTI_DRIVER_MODULE macro removed +OLD_FILES+=usr/share/man/man9/MULTI_DRIVER_MODULE.9.gz # 200309XX OLD_FILES+=usr/bin/symorder OLD_FILES+=usr/share/man/man1/symorder.1.gz diff --git a/share/man/man9/DRIVER_MODULE.9 b/share/man/man9/DRIVER_MODULE.9 index 346177a6aab..ca739452b36 100644 --- a/share/man/man9/DRIVER_MODULE.9 +++ b/share/man/man9/DRIVER_MODULE.9 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 16, 2000 +.Dd August 27, 2011 .Dt DRIVER_MODULE 9 .Os .Sh NAME @@ -40,7 +40,6 @@ .In sys/bus.h .In sys/module.h .Fn DRIVER_MODULE name busname "driver_t driver" "devclass_t devclass" "modeventhand_t evh" "void *arg" -.Fn MULTI_DRIVER_MODULE name busname "driver_t drivers[]" "devclass_t devclass" "modeventhand_t evh" "void *arg" .Sh DESCRIPTION The .Fn DRIVER_MODULE @@ -96,11 +95,6 @@ The is unused at this time and should be a .Dv NULL pointer. -.Pp -.Fn MULTI_DRIVER_MODULE -is a special version of -.Fn DRIVER_MODULE , -which takes a list of drivers instead of a single driver instance. .Sh SEE ALSO .Xr device 9 , .Xr driver 9 , diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index 5f143c3c5b8..8fb3305a8ab 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -605,7 +605,6 @@ MLINKS+=domain.9 DOMAIN_SET.9 \ domain.9 pfctlinput2.9 \ domain.9 pffindproto.9 \ domain.9 pffindtype.9 -MLINKS+=DRIVER_MODULE.9 MULTI_DRIVER_MODULE.9 MLINKS+=EVENTHANDLER.9 EVENTHANDLER_DECLARE.9 \ EVENTHANDLER.9 EVENTHANDLER_DEREGISTER.9 \ EVENTHANDLER.9 eventhandler_deregister.9 \ From a608af78171a4dc3530d2f50d98ca11420e5a587 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Sat, 27 Aug 2011 22:10:45 +0000 Subject: [PATCH 347/452] Add support for alternative break-to-debugger to syscons(4). While most keyboards allow console break sequences (such as ctrl-alt-esc) to be entered, alternative break can prove useful under virtualisation and remote console systems where entering control sequences can be difficult or unreliable. MFC after: 3 weeks Approved by: re (bz) --- sys/dev/syscons/syscons.c | 4 ++++ sys/dev/syscons/syscons.h | 3 +++ 2 files changed, 7 insertions(+) diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index ebaa945759d..b8f328ee34c 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -3562,6 +3562,10 @@ next_code: /* goto next_code */ } else { /* regular keys (maybe MKEY is set) */ +#if !defined(SC_DISABLE_KDBKEY) && defined(KDB) + if (enable_kdbkey) + kdb_alt_break(c, &sc->sc_altbrk); +#endif if (!(sc->flags & SC_SCRN_BLANKED)) return c; } diff --git a/sys/dev/syscons/syscons.h b/sys/dev/syscons/syscons.h index a23f88474a3..79f531bd47a 100644 --- a/sys/dev/syscons/syscons.h +++ b/sys/dev/syscons/syscons.h @@ -266,6 +266,9 @@ typedef struct sc_softc { u_char cursor_char; u_char mouse_char; +#ifdef KDB + int sc_altbrk; +#endif } sc_softc_t; /* virtual screen */ From 3e8e3c17cf370205afcce818203871b5aa74f001 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Sat, 27 Aug 2011 22:10:53 +0000 Subject: [PATCH 348/452] Correct some old manpage removal entries. Approved by: re (kib) --- ObsoleteFiles.inc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index c40e7f50774..7c742a41112 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -2043,9 +2043,9 @@ OLD_FILES+=usr/share/man/man5/ipsend.5.gz OLD_FILES+=usr/bin/gtar OLD_FILES+=usr/share/man/man1/gtar.1.gz # 200503XX -OLD_FILES+=share/man/man3/exp10.3.gz -OLD_FILES+=share/man/man3/exp10f.3.gz -OLD_FILES+=share/man/man3/fpsetsticky.3.gz +OLD_FILES+=usr/share/man/man3/exp10.3.gz +OLD_FILES+=usr/share/man/man3/exp10f.3.gz +OLD_FILES+=usr/share/man/man3/fpsetsticky.3.gz # 20050324: updated release infrastructure OLD_FILES+=usr/share/man/man5/drivers.conf.5.gz # 20050317: removed from BIND 9 distribution From 118450985806e4a26fe5ade1652ab3b29673fb3c Mon Sep 17 00:00:00 2001 From: Qing Li Date: Sun, 28 Aug 2011 00:14:40 +0000 Subject: [PATCH 349/452] When an interface address route is removed from the system, another route with the same prefix is searched for as a replacement. The current code did not bypass routes that have non-operational interfaces. This patch fixes that bug and will find a replacement route with an active interface. PR: kern/159603 Submitted by: pluknet, ambrisko at ambrisko dot com Reviewed by: discussed on net@ Approved by: re (bz) MFC after: 3 days --- sys/netinet/in.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/netinet/in.c b/sys/netinet/in.c index e797c40c1af..4547e395eba 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -1163,7 +1163,8 @@ in_scrubprefix(struct in_ifaddr *target, u_int flags) p.s_addr &= ia->ia_sockmask.sin_addr.s_addr; } - if (prefix.s_addr != p.s_addr) + if ((prefix.s_addr != p.s_addr) || + !(ia->ia_ifp->if_flags & IFF_UP)) continue; /* From 7596eb487200a0954c34060ce81369fe1fb4ad72 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sun, 28 Aug 2011 09:26:48 +0000 Subject: [PATCH 350/452] Bump shared libraries version numbers in preparation for 9.0. This time, only libraries which ABI has been changed compared to stable/8, are bumped. ABI analysis done by: Gleb Kurtsou Approved by: re (kensmith) --- ObsoleteFiles.inc | 17 +++++++++++++++++ UPDATING | 6 ++++++ lib/libbsnmp/libbsnmp/Makefile | 2 +- lib/libcam/Makefile | 2 ++ lib/libdwarf/Makefile | 2 +- lib/libopie/Makefile | 2 +- lib/libpcap/Makefile | 2 +- lib/librtld_db/Makefile | 2 +- lib/libtacplus/Makefile | 2 +- lib/libufs/Makefile | 1 + sys/sys/param.h | 2 +- 11 files changed, 33 insertions(+), 7 deletions(-) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 7c742a41112..1b3af12cfa3 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -38,6 +38,23 @@ # xargs -n1 | sort | uniq -d; # done +# 20110828: library version bump for 9.0 +OLD_LIBS+=lib/libufs.so.5 +OLD_LIBS+=usr/lib/libbsnmp.so.5 +OLD_LIBS+=usr/lib/libdwarf.so.2 +OLD_LIBS+=usr/lib/libopie.so.6 +OLD_LIBS+=usr/lib/libpcap.so.7 +OLD_LIBS+=usr/lib/librtld_db.so.1 +OLD_LIBS+=usr/lib/libtacplus.so.4 +.if ${TARGET_ARCH} == "amd64" +OLD_LIBS+=usr/lib32/libufs.so.5 +OLD_LIBS+=usr/lib32/libbsnmp.so.5 +OLD_LIBS+=usr/lib32/libdwarf.so.2 +OLD_LIBS+=usr/lib32/libopie.so.6 +OLD_LIBS+=usr/lib32/libpcap.so.7 +OLD_LIBS+=usr/lib32/librtld_db.so.1 +OLD_LIBS+=usr/lib32/libtacplus.so.4 +.endif # 20110709: vm_map_clean.9 -> vm_map_sync.9 OLD_FILES+=usr/share/man/man9/vm_map_clean.9.gz # 20110709: Catch up with removal of these functions. diff --git a/UPDATING b/UPDATING index 1df41b8c3b1..f5c6f4de7ad 100644 --- a/UPDATING +++ b/UPDATING @@ -22,6 +22,12 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW: machines to maximize performance. (To disable malloc debugging, run ln -s aj /etc/malloc.conf.) +20110828: + Bump the shared library version numbers for libraries that + do not use symbol versioning, have changed the ABI compared + to stable/8 and which shared library version was not bumped. + Done as part of 9.0-RELEASE cycle. + 20110815: During the merge of Capsicum features, the fget(9) KPI was modified. This may require the rebuilding of out-of-tree device drivers -- diff --git a/lib/libbsnmp/libbsnmp/Makefile b/lib/libbsnmp/libbsnmp/Makefile index d33808da692..f21f1d3fc2e 100644 --- a/lib/libbsnmp/libbsnmp/Makefile +++ b/lib/libbsnmp/libbsnmp/Makefile @@ -8,7 +8,7 @@ CONTRIB= ${.CURDIR}/../../../contrib/bsnmp/lib .PATH: ${CONTRIB} LIB= bsnmp -SHLIBDIR?= /lib +SHLIB_MAJOR= 6 CFLAGS+= -I${CONTRIB} -DHAVE_ERR_H -DHAVE_GETADDRINFO -DHAVE_STRLCPY CFLAGS+= -DHAVE_STDINT_H -DHAVE_INTTYPES_H -DQUADFMT='"llu"' -DQUADXFMT='"llx"' diff --git a/lib/libcam/Makefile b/lib/libcam/Makefile index c5773eac2f8..9a21dde65b3 100644 --- a/lib/libcam/Makefile +++ b/lib/libcam/Makefile @@ -42,4 +42,6 @@ MLINKS+= cam.3 cam_open_device.3 \ SDIR= ${.CURDIR}/../../sys CFLAGS+= -I${.CURDIR} -I${SDIR} +SHLIB_MAJOR= 6 + .include diff --git a/lib/libdwarf/Makefile b/lib/libdwarf/Makefile index aa182e7d9b7..dbd7895cd06 100644 --- a/lib/libdwarf/Makefile +++ b/lib/libdwarf/Makefile @@ -22,7 +22,7 @@ INCS= dwarf.h libdwarf.h CFLAGS+= -I${.CURDIR} -SHLIB_MAJOR= 2 +SHLIB_MAJOR= 3 WITHOUT_MAN= diff --git a/lib/libopie/Makefile b/lib/libopie/Makefile index 360dddc474e..647bfee1b2f 100644 --- a/lib/libopie/Makefile +++ b/lib/libopie/Makefile @@ -4,7 +4,7 @@ # OPIE_DIST?= ${.CURDIR}/../../contrib/opie DIST_DIR= ${OPIE_DIST}/${.CURDIR:T} -SHLIB_MAJOR= 6 +SHLIB_MAJOR= 7 KEYFILE?= \"/etc/opiekeys\" diff --git a/lib/libpcap/Makefile b/lib/libpcap/Makefile index 80c61d80f20..5b613e7f08a 100644 --- a/lib/libpcap/Makefile +++ b/lib/libpcap/Makefile @@ -99,7 +99,7 @@ CFLAGS+=-DHAVE_NET_PFVAR_H WARNS?= 0 -SHLIB_MAJOR=7 +SHLIB_MAJOR= 8 # # Magic to grab sources out of src/contrib diff --git a/lib/librtld_db/Makefile b/lib/librtld_db/Makefile index efaed628379..2815a073fd2 100644 --- a/lib/librtld_db/Makefile +++ b/lib/librtld_db/Makefile @@ -3,7 +3,7 @@ .include LIB= rtld_db -SHLIB_MAJOR= 1 +SHLIB_MAJOR= 2 MAN= librtld_db.3 SRCS= rtld_db.c diff --git a/lib/libtacplus/Makefile b/lib/libtacplus/Makefile index 617f8773708..798c94978a7 100644 --- a/lib/libtacplus/Makefile +++ b/lib/libtacplus/Makefile @@ -30,7 +30,7 @@ INCS= taclib.h CFLAGS+= -Wall DPADD= ${LIBMD} LDADD= -lmd -SHLIB_MAJOR= 4 +SHLIB_MAJOR= 5 MAN= libtacplus.3 tacplus.conf.5 WARNS?= 2 diff --git a/lib/libufs/Makefile b/lib/libufs/Makefile index 1dfc2429a1f..78832d88deb 100644 --- a/lib/libufs/Makefile +++ b/lib/libufs/Makefile @@ -2,6 +2,7 @@ LIB= ufs SHLIBDIR?= /lib +SHLIB_MAJOR= 6 SRCS= block.c cgroup.c inode.c sblock.c type.c ffs_subr.c ffs_tables.c INCS= libufs.h diff --git a/sys/sys/param.h b/sys/sys/param.h index dfe4d918f70..44005ae6c0c 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -58,7 +58,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 900041 /* Master, propagated to newvers */ +#define __FreeBSD_version 900042 /* Master, propagated to newvers */ #ifdef _KERNEL #define P_OSREL_SIGSEGV 700004 From 8348113cef72ba7f9e18ca2db72886126f0aeac4 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Sun, 28 Aug 2011 10:10:31 +0000 Subject: [PATCH 351/452] Remove broken link to supported wifi cards. There doesn't appear to be an equivalent list anywhere else. PR: 157778 Submitted by: Ted Mittelstaedt Approved by: re (blackend) MFC after: 1 week --- share/man/man4/ath.4 | 5 +---- share/man/man4/ath_hal.4 | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/share/man/man4/ath.4 b/share/man/man4/ath.4 index fadf19221c0..b36bc905195 100644 --- a/share/man/man4/ath.4 +++ b/share/man/man4/ath.4 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\"/ -.Dd March 21, 2010 +.Dd August 28, 2011 .Dt ATH 4 .Os .Sh NAME @@ -156,9 +156,6 @@ The .Nm driver supports all Atheros Cardbus and PCI cards, except those that are based on the AR5005VL chipset. -.Pp -A list of cards that are supported can be found at -.Pa http://customerproducts.atheros.com/customerproducts/default.asp . .Sh EXAMPLES Join a specific BSS network with WEP encryption: .Bd -literal -offset indent diff --git a/share/man/man4/ath_hal.4 b/share/man/man4/ath_hal.4 index c1ad7799c11..a17393fc405 100644 --- a/share/man/man4/ath_hal.4 +++ b/share/man/man4/ath_hal.4 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\"/ -.Dd March 25, 2009 +.Dd August 28, 2011 .Dt ATH_HAL 4 .Os .Sh NAME @@ -129,9 +129,6 @@ module: .It "Sony PCWA-C500 AR5210 Cardbus a" .It "3Com 3CRPAG175 AR5212 CardBus a/b/g" .El -.Pp -An up to date list can be found at -.Pa http://customerproducts.atheros.com/customerproducts . .Sh SEE ALSO .Xr ath 4 .Sh HISTORY From c4a2a390049bd7f1695ff2aeab0d2b4e981c0be4 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Sun, 28 Aug 2011 11:49:53 +0000 Subject: [PATCH 352/452] Since r221218 rman_manage_region(9) actually honors rm_start and rm_end which may cause problems when these contain garbage so zero the range descriptors embedding the rmans when allocating them. Approved by: re (kib) MFC after: 3 days --- sys/sparc64/sbus/sbus.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/sparc64/sbus/sbus.c b/sys/sparc64/sbus/sbus.c index 5cf7ad2ad39..dbe38598265 100644 --- a/sys/sparc64/sbus/sbus.c +++ b/sys/sparc64/sbus/sbus.c @@ -303,8 +303,8 @@ sbus_attach(device_t dev) sizeof(*range), (void **)&range)) == -1) { panic("%s: error getting ranges property", __func__); } - sc->sc_rd = (struct sbus_rd *)malloc(sizeof(*sc->sc_rd) * sc->sc_nrange, - M_DEVBUF, M_NOWAIT); + sc->sc_rd = malloc(sizeof(*sc->sc_rd) * sc->sc_nrange, M_DEVBUF, + M_NOWAIT | M_ZERO); if (sc->sc_rd == NULL) panic("%s: cannot allocate rmans", __func__); /* From fa3db771d2715fb61e3b9d40b770060fc8940f26 Mon Sep 17 00:00:00 2001 From: Artem Belevich Date: Sun, 28 Aug 2011 18:09:17 +0000 Subject: [PATCH 353/452] Make sure RPC calls over UDP return RPC_INTR status is the process has been interrupted in a restartable syscall. Otherwise we could end up in an (almost) endless loop in clnt_reconnect_call(). PR: kern/160198 Reviewed by: rmacklem Approved by: re (kib), avg (mentor) MFC after: 1 week --- sys/rpc/clnt_dg.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sys/rpc/clnt_dg.c b/sys/rpc/clnt_dg.c index a412c084fb9..8a69bf4e5b1 100644 --- a/sys/rpc/clnt_dg.c +++ b/sys/rpc/clnt_dg.c @@ -467,7 +467,10 @@ send_again: cu->cu_waitflag, "rpccwnd", 0); if (error) { errp->re_errno = error; - errp->re_status = stat = RPC_CANTSEND; + if (error == EINTR || error == ERESTART) + errp->re_status = stat = RPC_INTR; + else + errp->re_status = stat = RPC_CANTSEND; goto out; } } @@ -636,7 +639,7 @@ get_reply: */ if (error != EWOULDBLOCK) { errp->re_errno = error; - if (error == EINTR) + if (error == EINTR || error == ERESTART) errp->re_status = stat = RPC_INTR; else errp->re_status = stat = RPC_CANTRECV; From b18bbed465af7217213d42d39f21b200d70d273f Mon Sep 17 00:00:00 2001 From: Ken Smith Date: Sun, 28 Aug 2011 19:38:04 +0000 Subject: [PATCH 354/452] Ready for 9.0-BETA2. Approved by: re (implicit) --- sys/conf/newvers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/conf/newvers.sh b/sys/conf/newvers.sh index 6c08cd66589..b7d02e7a780 100644 --- a/sys/conf/newvers.sh +++ b/sys/conf/newvers.sh @@ -32,7 +32,7 @@ TYPE="FreeBSD" REVISION="9.0" -BRANCH="BETA1" +BRANCH="BETA2" if [ "X${BRANCH_OVERRIDE}" != "X" ]; then BRANCH=${BRANCH_OVERRIDE} fi From f68ebb0eec2e5aa3f12dcf442a1276391681eef6 Mon Sep 17 00:00:00 2001 From: Nathan Whitehorn Date: Tue, 30 Aug 2011 18:23:36 +0000 Subject: [PATCH 355/452] Swap FTP paths to be MACHINE/MACHINE_ARCH instead of MACHINE_ARCH/MACHINE. This follows what the output of make targets looks like, and reduces the number of directories needed on the FTP server, since we now have only one architecture with multiple machine types (i386, which has i386 and pc98), but 3 machines with 9 architectures between them (powerpc, mips, and arm). Requested by: kensmith, bz Approved by: re(kensmith) --- usr.sbin/bsdinstall/scripts/mirrorselect | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.sbin/bsdinstall/scripts/mirrorselect b/usr.sbin/bsdinstall/scripts/mirrorselect index 9a83b8a8361..51c5a4bf5aa 100755 --- a/usr.sbin/bsdinstall/scripts/mirrorselect +++ b/usr.sbin/bsdinstall/scripts/mirrorselect @@ -191,7 +191,7 @@ MIRROR=`dialog --backtitle "FreeBSD Installer" \ MIRROR_BUTTON=$? exec 3>&- -BSDINSTALL_DISTSITE="$MIRROR/pub/FreeBSD/releases/`uname -p`/`uname -m`/`uname -r`" +BSDINSTALL_DISTSITE="$MIRROR/pub/FreeBSD/releases/`uname -m`/`uname -p`/`uname -r`" case $MIRROR_BUTTON in $DIALOG_CANCEL) From 91c9e506e5675dfd27b76407ff9a999733b62de4 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Thu, 1 Sep 2011 05:20:47 +0000 Subject: [PATCH 356/452] Update for 9.8.1 --- FREEBSD-Xlist | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/FREEBSD-Xlist b/FREEBSD-Xlist index 48dd3fec2e4..4d4acf09b04 100644 --- a/FREEBSD-Xlist +++ b/FREEBSD-Xlist @@ -14,8 +14,15 @@ isc-config.sh.html util # Tests +Atffile +unit bin/tests +lib/Atffile lib/tests +lib/dns/Atffile +lib/dns/tests +lib/isc/Atffile +lib/isc/tests # Doc stuff doc/arm/latex-fixup.pl From ec84331f94b7065559939a5aff7347596bedbccd Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Thu, 1 Sep 2011 05:24:42 +0000 Subject: [PATCH 357/452] Vendor import of BIND 9.8.1 --- CHANGES | 354 +- COPYRIGHT | 492 +- Makefile.in | 7 +- README | 11 + RELEASE-NOTES-BIND-9.8.1.html | 368 + RELEASE-NOTES-BIND-9.8.1.pdf | Bin 0 -> 62760 bytes RELEASE-NOTES-BIND-9.8.1.txt | 268 + bin/check/named-checkconf.c | 6 +- bin/confgen/ddns-confgen.c | 5 +- bin/confgen/rndc-confgen.c | 5 +- bin/dig/dig.c | 35 +- bin/dig/dighost.c | 59 +- bin/dig/host.c | 9 +- bin/dig/include/dig/dig.h | 7 +- bin/dig/nslookup.c | 34 +- bin/dnssec/dnssec-keyfromlabel.8 | 2 +- bin/dnssec/dnssec-keyfromlabel.c | 10 +- bin/dnssec/dnssec-keyfromlabel.docbook | 2 +- bin/dnssec/dnssec-keyfromlabel.html | 2 +- bin/dnssec/dnssec-keygen.c | 22 +- bin/dnssec/dnssec-settime.8 | 8 +- bin/dnssec/dnssec-settime.c | 17 +- bin/dnssec/dnssec-settime.docbook | 9 +- bin/dnssec/dnssec-settime.html | 20 +- bin/dnssec/dnssec-signzone.c | 149 +- bin/named/Makefile.in | 8 +- bin/named/client.c | 10 +- bin/named/config.c | 2 +- bin/named/controlconf.c | 6 +- bin/named/include/dlz/dlz_dlopen_driver.h | 27 + bin/named/include/named/globals.h | 6 +- bin/named/interfacemgr.c | 7 +- bin/named/logconf.c | 57 +- bin/named/main.c | 35 +- bin/named/query.c | 67 +- bin/named/server.c | 486 +- bin/named/statschannel.c | 6 +- bin/named/unix/Makefile.in | 9 +- bin/named/unix/dlz_dlopen_driver.c | 616 + bin/named/unix/os.c | 11 +- bin/named/update.c | 9 +- bin/named/xfrout.c | 52 +- bin/named/zoneconf.c | 104 +- bin/nsupdate/nsupdate.c | 12 +- bin/rndc/rndc.c | 2 +- bin/tools/genrandom.8 | 8 +- bin/tools/genrandom.docbook | 7 +- bin/tools/genrandom.html | 14 +- config.h.in | 31 +- configure.in | 244 +- doc/arm/Bv9ARM-book.xml | 181 +- doc/arm/Bv9ARM.ch01.html | 4 +- doc/arm/Bv9ARM.ch03.html | 24 +- doc/arm/Bv9ARM.ch04.html | 162 +- doc/arm/Bv9ARM.ch05.html | 6 +- doc/arm/Bv9ARM.ch06.html | 334 +- doc/arm/Bv9ARM.ch07.html | 14 +- doc/arm/Bv9ARM.ch08.html | 18 +- doc/arm/Bv9ARM.ch09.html | 220 +- doc/arm/Bv9ARM.html | 162 +- doc/arm/Bv9ARM.pdf | 12918 ++++++++++---------- doc/arm/man.arpaname.html | 8 +- doc/arm/man.ddns-confgen.html | 10 +- doc/arm/man.dig.html | 20 +- doc/arm/man.dnssec-dsfromkey.html | 16 +- doc/arm/man.dnssec-keyfromlabel.html | 14 +- doc/arm/man.dnssec-keygen.html | 16 +- doc/arm/man.dnssec-revoke.html | 10 +- doc/arm/man.dnssec-settime.html | 18 +- doc/arm/man.dnssec-signzone.html | 12 +- doc/arm/man.genrandom.html | 12 +- doc/arm/man.host.html | 10 +- doc/arm/man.isc-hmac-fixup.html | 10 +- doc/arm/man.named-checkconf.html | 12 +- doc/arm/man.named-checkzone.html | 12 +- doc/arm/man.named-journalprint.html | 8 +- doc/arm/man.named.html | 16 +- doc/arm/man.nsec3hash.html | 10 +- doc/arm/man.nsupdate.html | 14 +- doc/arm/man.rndc-confgen.html | 12 +- doc/arm/man.rndc.conf.html | 12 +- doc/arm/man.rndc.html | 12 +- doc/misc/options | 8 +- lib/bind9/api | 2 +- lib/bind9/check.c | 79 +- lib/dns/Makefile.in | 6 +- lib/dns/acl.c | 13 +- lib/dns/adb.c | 13 +- lib/dns/api | 6 +- lib/dns/cache.c | 101 +- lib/dns/client.c | 12 +- lib/dns/diff.c | 18 +- lib/dns/dispatch.c | 14 +- lib/dns/dlz.c | 9 +- lib/dns/dns64.c | 6 +- lib/dns/dnssec.c | 48 +- lib/dns/dst_api.c | 3 +- lib/dns/dst_openssl.h | 19 +- lib/dns/gssapi_link.c | 8 +- lib/dns/gssapictx.c | 20 +- lib/dns/include/dns/Makefile.in | 6 +- lib/dns/include/dns/acl.h | 21 +- lib/dns/include/dns/cache.h | 29 +- lib/dns/include/dns/db.h | 10 +- lib/dns/include/dns/dlz.h | 10 +- lib/dns/include/dns/dlz_dlopen.h | 160 + lib/dns/include/dns/dnssec.h | 17 +- lib/dns/include/dns/masterdump.h | 2 +- lib/dns/include/dns/rdataset.h | 4 +- lib/dns/include/dns/resolver.h | 2 +- lib/dns/include/dns/sdlz.h | 36 +- lib/dns/include/dns/zone.h | 19 +- lib/dns/include/dst/dst.h | 5 +- lib/dns/journal.c | 7 +- lib/dns/master.c | 14 +- lib/dns/masterdump.c | 50 +- lib/dns/message.c | 4 +- lib/dns/name.c | 21 +- lib/dns/ncache.c | 2 +- lib/dns/nsec.c | 6 +- lib/dns/nsec3.c | 6 +- lib/dns/openssl_link.c | 18 +- lib/dns/openssldsa_link.c | 3 +- lib/dns/opensslrsa_link.c | 20 +- lib/dns/rbt.c | 9 +- lib/dns/rbtdb.c | 52 +- lib/dns/rbtdb.h | 17 +- lib/dns/rcode.c | 13 +- lib/dns/rdata.c | 12 +- lib/dns/rdatalist.c | 24 +- lib/dns/rdataset.c | 5 +- lib/dns/rdataslab.c | 2 +- lib/dns/request.c | 6 +- lib/dns/resolver.c | 21 +- lib/dns/sdb.c | 4 +- lib/dns/sdlz.c | 21 +- lib/dns/spnego.c | 68 +- lib/dns/ssu_external.c | 29 +- lib/dns/time.c | 46 +- lib/dns/tkey.c | 12 +- lib/dns/tsig.c | 4 +- lib/dns/ttl.c | 5 +- lib/dns/validator.c | 112 +- lib/dns/view.c | 11 +- lib/dns/xfrin.c | 6 +- lib/dns/zone.c | 704 +- lib/dns/zt.c | 4 +- lib/export/dns/Makefile.in | 6 +- lib/export/irs/Makefile.in | 6 +- lib/export/isccfg/Makefile.in | 6 +- lib/export/samples/nsprobe.c | 10 +- lib/irs/api | 2 +- lib/irs/getnameinfo.c | 10 +- lib/irs/resconf.c | 5 +- lib/isc/Makefile.in | 5 +- lib/isc/api | 4 +- lib/isc/heap.c | 9 +- lib/isc/httpd.c | 50 +- lib/isc/include/isc/file.h | 23 +- lib/isc/include/isc/task.h | 2 +- lib/isc/include/isc/taskpool.h | 51 +- lib/isc/include/isc/util.h | 9 +- lib/isc/log.c | 9 +- lib/isc/netaddr.c | 24 +- lib/isc/powerpc/include/isc/atomic.h | 22 +- lib/isc/radix.c | 6 +- lib/isc/rwlock.c | 5 +- lib/isc/sha1.c | 6 +- lib/isc/sha2.c | 25 +- lib/isc/sockaddr.c | 7 +- lib/isc/string.c | 11 +- lib/isc/task.c | 2 +- lib/isc/taskpool.c | 104 +- lib/isc/timer.c | 9 +- lib/isc/unix/dir.c | 6 +- lib/isc/unix/file.c | 19 +- lib/isc/unix/include/isc/stdtime.h | 8 +- lib/isc/unix/socket.c | 74 +- lib/isc/unix/stdio.c | 5 +- lib/isc/unix/time.c | 6 +- lib/isccc/Makefile.in | 2 +- lib/isccfg/Makefile.in | 4 +- lib/isccfg/aclconf.c | 81 +- lib/isccfg/api | 6 +- lib/isccfg/include/isccfg/aclconf.h | 22 +- lib/isccfg/namedconf.c | 30 +- lib/isccfg/parser.c | 13 +- lib/lwres/api | 2 +- lib/lwres/assert_p.h | 5 +- lib/lwres/herror.c | 6 +- lib/lwres/lwconfig.c | 5 +- lib/lwres/man/lwres.html | 14 +- lib/lwres/man/lwres_buffer.html | 6 +- lib/lwres/man/lwres_config.html | 12 +- lib/lwres/man/lwres_context.html | 10 +- lib/lwres/man/lwres_gabn.html | 10 +- lib/lwres/man/lwres_gai_strerror.html | 8 +- lib/lwres/man/lwres_getaddrinfo.html | 10 +- lib/lwres/man/lwres_gethostent.html | 12 +- lib/lwres/man/lwres_getipnode.html | 10 +- lib/lwres/man/lwres_getnameinfo.html | 12 +- lib/lwres/man/lwres_getrrsetbyname.html | 10 +- lib/lwres/man/lwres_gnba.html | 10 +- lib/lwres/man/lwres_hstrerror.html | 10 +- lib/lwres/man/lwres_inetntop.html | 10 +- lib/lwres/man/lwres_noop.html | 10 +- lib/lwres/man/lwres_packet.html | 8 +- lib/lwres/man/lwres_resutil.html | 10 +- lib/lwres/print.c | 5 +- make/rules.in | 20 +- release-notes.css | 60 + version | 8 +- 212 files changed, 12372 insertions(+), 8703 deletions(-) create mode 100644 RELEASE-NOTES-BIND-9.8.1.html create mode 100644 RELEASE-NOTES-BIND-9.8.1.pdf create mode 100644 RELEASE-NOTES-BIND-9.8.1.txt create mode 100644 bin/named/include/dlz/dlz_dlopen_driver.h create mode 100644 bin/named/unix/dlz_dlopen_driver.c create mode 100644 lib/dns/include/dns/dlz_dlopen.h create mode 100644 release-notes.css diff --git a/CHANGES b/CHANGES index 80ac38a8b27..3e48dd63943 100644 --- a/CHANGES +++ b/CHANGES @@ -1,28 +1,60 @@ - --- 9.8.0-P4 released --- + --- 9.8.1 released --- -3124. [bug] Use an rdataset attribute flag to indicate - negative-cache records rather than using rrtype 0; - this will prevent problems when that rrtype is - used in actual DNS packets. [RT #24777] + --- 9.8.1rc1 released --- - --- 9.8.0-P3 released (withdrawn) --- +3141. [bug] Silence spurious "zone serial (0) unchanged" messages + associated with empty zones. [RT #25079] + +3138. [bug] Address memory leaks and out-of-order operations when + shutting named down. [RT #25210] + +3136. [func] Add RFC 1918 reverse zones to the list of built-in + empty zones switched on by the 'empty-zones-enable' + option. [RT #24990] + + Note: empty-zones-enable must be "yes;" or a empty + zone needs to be disabled in named.conf for RFC 1918 + zones to be activated. This requirement may be + removed in future releases. + +3135. [port] FreeBSD: workaround broken IPV6_USE_MIN_MTU processing. + See http://www.freebsd.org/cgi/query-pr.cgi?pr=158307 + [RT #24950] + +3134. [bug] Improve the accuracy of dnssec-signzone's signing + statistics. [RT #16030] + + --- 9.8.1b3 released --- + +3133. [bug] Change #3114 was incomplete. [RT #24577] + +3131. [tuning] Improve scalability by allocating one zone task + per 100 zones at startup time, rather than using a + fixed-size task table. [RT #24406] + +3129. [bug] Named could crash on 'rndc reconfig' when + allow-new-zones was set to yes and named ACLs + were used. [RT #22739] + + --- 9.8.1b2 released --- 3126. [security] Using DNAME record to generate replacements caused - RPZ to exit with a assertion failure. [RT #23766] + RPZ to exit with a assertion failure. [RT #24766] 3125. [security] Using wildcard CNAME records as a replacement with RPZ caused named to exit with a assertion failure. [RT #24715] +3124. [bug] Use an rdataset attribute flag to indicate + negative-cache records rather than using rrtype 0; + this will prevent problems when that rrtype is + used in actual DNS packets. [RT #24777] + 3123. [security] Change #2912 exposed a latent flaw in dns_rdataset_totext() that could cause named to crash with an assertion failure. [RT #24777] -3115. [bug] Named could fail to return requested data when - following a CNAME that points into the same zone. - [RT #2445] - - --- 9.8.0-P2 released --- +3122. [cleanup] dnssec-settime: corrected usage message. [RT #24664] 3121. [security] An authoritative name server sending a negative response containing a very large RRset could @@ -33,12 +65,256 @@ that validated insecure without using DLV and had DS records in the parent zone. [RT #24631] - --- 9.8.0-P1 released --- +3119. [bug] When rolling to a new DNSSEC key, a private-type + record could be created and never marked complete. + [RT #23253] + +3118. [bug] nsupdate could dump core on shutdown when using + SIG(0) keys. [RT #24604] + +3117. [cleanup] Remove doc and parser references to the + never-implemented 'auto-dnssec create' option. + [RT #24533] + +3115. [bug] Named could fail to return requested data when + following a CNAME that points into the same zone. + [RT #24455] + +3114. [bug] Retain expired RRSIGs in dynamic zones if key is + inactive and there is no replacement key. [RT #23136] + +3113. [doc] Document the relationship between serial-query-rate + and NOTIFY messages. + + --- 9.8.1b1 released --- + +3112. [doc] Add missing descriptions of the update policy name + types "ms-self", "ms-subdomain", "krb5-self" and + "krb5-subdomain", which allow machines to update + their own records, to the BIND 9 ARM. + +3111. [bug] Improved consistency checks for dnssec-enable and + dnssec-validation, added test cases to the + checkconf system test. [RT #24398] + +3110. [bug] dnssec-signzone: Wrong error message could appear + when attempting to sign with no KSK. [RT #24369] + +3107. [bug] dnssec-signzone: Report the correct number of ZSKs + when using -x. [RT #20852] + +3105. [bug] GOST support can be suppressed by "configure + --without-gost" [RT #24367] + +3104. [bug] Better support for cross-compiling. [RT #24367] + +3103. [bug] Configuring 'dnssec-validation auto' in a view + instead of in the options statement could trigger + an assertion failure in named-checkconf. [RT #24382] + +3101. [bug] Zones using automatic key maintenance could fail + to check the key repository for updates. [RT #23744] 3100. [security] Certain response policy zone configurations could trigger an INSIST when receiving a query of type RRSIG. [RT #24280] +3099. [test] "dlz" system test now runs but gives R:SKIPPED if + not compiled with --with-dlz-filesystem. [RT #24146] + +3098. [bug] DLZ zones were answering without setting the AA bit. + [RT #24146] + +3097. [test] Add a tool to test handling of malformed packets. + [RT #24096] + +3096. [bug] Set KRB5_KTNAME before calling log_cred() in + dst_gssapi_acceptctx(). [RT #24004] + +3095. [bug] Handle isolated reserved ports in the port range. + [RT #23957] + +3094. [doc] Expand dns64 documentation. + +3093. [bug] Fix gssapi/kerberos dependencies [RT #23836] + +3092. [bug] Signatures for records at the zone apex could go + stale due to an incorrect timer setting. [RT #23769] + +3091. [bug] Fixed a bug in which zone keys that were published + and then subsequently activated could fail to trigger + automatic signing. [RT #22911] + +3090. [func] Make --with-gssapi default [RT #23738] + +3088. [bug] Remove bin/tests/system/logfileconfig/ns1/named.conf + and add setup.sh in order to resolve changing + named.conf issue. [RT #23687] + +3087. [bug] DDNS updates using SIG(0) with update-policy match + type "external" could cause a crash. [RT #23735] + +3086. [bug] Running dnssec-settime -f on an old-style key will + now force an update to the new key format even if no + other change has been specified, using "-P now -A now" + as default values. [RT #22474] + +3083. [bug] NOTIFY messages were not being sent when generating + a NSEC3 chain incrementally. [RT #23702] + +3082. [port] strtok_r is threads only. [RT #23747] + +3081. [bug] Failure of DNAME substitution did not return + YXDOMAIN. [RT #23591] + +3080. [cleanup] Replaced compile time constant by STDTIME_ON_32BITS. + [RT #23587] + +3079. [bug] Handle isc_event_allocate failures in t_tasks. + [RT #23572] + +3078. [func] Added a new include file with function typedefs + for the DLZ "dlopen" driver. [RT #23629] + +3077. [bug] zone.c:zone_refreshkeys() incorrectly called + dns_zone_attach(), use zone->irefs instead. [RT #23303] + +3075. [bug] dns_dnssec_findzonekeys{2} used a inconsistant + timestamp when determining which keys are active. + [RT #23642] + +3074. [bug] Make the adb cache read through for zone data and + glue learn for zone named is authoritative for. + [RT #22842] + +3073. [bug] managed-keys changes were not properly being recorded. + [RT #20256] + +3072. [bug] dns_dns64_aaaaok() potential NULL pointer dereference. + [RT #20256] + +3071. [bug] has_nsec could be used unintialised in + update.c:next_active. [RT #20256] + +3070. [bug] dnssec-signzone potential NULL pointer dereference. + [RT #20256] + +3069. [cleanup] Silence warnings messages from clang static analysis. + [RT #20256] + +3068. [bug] Named failed to build with a OpenSSL without engine + support. [RT #23473] + +3067. [bug] ixfr-from-differences {master|slave}; failed to + select the master/slave zones. [RT #23580] + +3066. [func] The DLZ "dlopen" driver is now built by default, + no longer requiring a configure option. To + disable it, use "configure --without-dlopen". + (Note: driver not supported on win32.) [RT #23467] + +3065. [bug] RRSIG could have time stamps too far in the future. + [RT #23356] + +3064. [bug] powerpc: add sync instructions to the end of atomic + operations. [RT #23469] + +3063. [contrib] More verbose error reporting from DLZ LDAP. [RT #23402] + +3059. [test] Added a regression test for change #3023. + +3058. [bug] Cause named to terminate at startup or rndc reconfig/ + reload to fail, if a log file specified in the conf + file isn't a plain file. [RT #22771] + +3057. [bug] "rndc secroots" would abort after the first error + and so could miss some views. [RT #23488] + +3054. [bug] Added elliptic curve support check in + GOST OpenSSL engine detection. [RT #23485] + +3053. [bug] Under a sustained high query load with a finite + max-cache-size, it was possible for cache memory + to be exhausted and not recovered. [RT #23371] + +3052. [test] Fixed last autosign test report. [RT #23256] + +3051. [bug] NS records obsure DNAME records at the bottom of the + zone if both are present. [RT #23035] + +3050. [bug] The autosign system test was timing dependent. + Wait for the initial autosigning to complete + before running the rest of the test. [RT #23035] + +3049. [bug] Save and restore the gid when creating creating + named.pid at startup. [RT #23290] + +3048. [bug] Fully separate view key mangement. [RT #23419] + +3047. [bug] DNSKEY NODATA responses not cached fixed in + validator.c. Tests added to dnssec system test. + [RT #22908] + +3046. [bug] Use RRSIG original TTL to compute validated RRset + and RRSIG TTL. [RT #23332] + +3044. [bug] Hold the socket manager lock while freeing the socket. + [RT #23333] + +3043. [test] Merged in the NetBSD ATF test framework (currently + version 0.12) for development of future unit tests. + Use configure --with-atf to build ATF internally + or configure --with-atf=prefix to use an external + copy. [RT #23209] + +3042. [bug] dig +trace could fail attempting to use IPv6 + addresses on systems with only IPv4 connectivity. + [RT #23297] + +3041. [bug] dnssec-signzone failed to generate new signatures on + ttl changes. [RT #23330] + +3040. [bug] Named failed to validate insecure zones where a node + with a CNAME existed between the trust anchor and the + top of the zone. [RT #23338] + +3038. [bug] Install . [RT #23342] + +3037. [doc] Update COPYRIGHT to contain all the individual + copyright notices that cover various parts. + +3036. [bug] Check built-in zone arguments to see if the zone + is re-usable or not. [RT #21914] + +3035. [cleanup] Simplify by using strlcpy. [RT #22521] + +3034. [cleanup] nslookup: use strlcpy instead of safecopy. [RT #22521] + +3033. [cleanup] Add two INSIST(bucket != DNS_ADB_INVALIDBUCKET). + [RT #22521] + +3032. [bug] rdatalist.c: add missing REQUIREs. [RT #22521] + +3031. [bug] dns_rdataclass_format() handle a zero sized buffer. + [RT #22521] + +3030. [bug] dns_rdatatype_format() handle a zero sized buffer. + [RT #22521] + +3029. [bug] isc_netaddr_format() handle a zero sized buffer. + [RT #22521] + +3028. [bug] isc_sockaddr_format() handle a zero sized buffer. + [RT #22521] + +3027. [bug] Add documented REQUIREs to cfg_obj_asnetprefix() to + catch NULL pointer dereferences before they happen. + [RT #22521] + +3026. [bug] lib/isc/httpd.c: check that we have enough space + after calling grow_headerspace() and if not + re-call grow_headerspace() until we do. [RT #22521] + --- 9.8.0 released --- 3025. [bug] Fixed a possible deadlock due to zone resigning. @@ -51,8 +327,8 @@ receiving multiple AXFR response messages that were not all TSIG-signed. [RT #23254] -3022. [bug] Fixed rpz SERVFAILs after failed zone transfers - [RT #23246] +3022. [bug] Fixed rpz SERVFAILs after failed zone transfers + [RT #23246] 3021. [bug] Change #3010 was incomplete. [RT #22296] @@ -86,7 +362,7 @@ 'resolver-query-timeout' option, which specifies a max time in seconds. 0 means 'default' and anything longer than 30 will be silently set to 30. [RT #22852] - + 3010. [bug] Fixed a bug where "rndc reconfig" stopped the timer for refreshing managed-keys. [RT #22296] @@ -436,7 +712,7 @@ 2927. [placeholder] 2926. [placeholder] -h + 2925. [bug] Named failed to accept uncachable negative responses from insecure zones. [RT# 21555] @@ -495,7 +771,7 @@ h 2905. [port] aix: set use_atomic=yes with native compiler. [RT #21402] -2904. [bug] When using DLV, sub-zones of the zones in the DLV, +2904. [bug] When using DLV, sub-zones of the zones in the DLV, could be incorrectly marked as insecure instead of secure leading to negative proofs failing. This was a unintended outcome from change 2890. [RT# 21392] @@ -783,7 +1059,7 @@ h [RT #20710] 2812. [bug] Make sure updates can't result in a zone with - NSEC-only keys and NSEC3 records. [RT 20748] + NSEC-only keys and NSEC3 records. [RT #20748] 2811. [cleanup] Add "rndc sign" to list of commands in rndc usage output. [RT #20733] @@ -864,7 +1140,7 @@ h 2790. [bug] Handle DS queries to stub zones. [RT #20440] -2789. [bug] Fixed an INSIST in dispatch.c [RT #20576] +2789. [bug] Fixed an INSIST in dispatch.c [RT #20576] 2788. [bug] dnssec-signzone could sign with keys that were not requested [RT #20625] @@ -1760,7 +2036,7 @@ h 2529. [cleanup] Upgrade libtool to silence complaints from recent version of autoconf. [RT #18657] -2528. [cleanup] Silence spurious configure warning about +2528. [cleanup] Silence spurious configure warning about --datarootdir [RT #19096] 2527. [placeholder] @@ -2045,13 +2321,13 @@ h 2441. [bug] isc_radix_insert() could copy radix tree nodes incompletely. [RT #18573] -2440. [bug] named-checkconf used an incorrect test to determine +2440. [bug] named-checkconf used an incorrect test to determine if an ACL was set to none. -2439. [bug] Potential NULL dereference in dns_acl_isanyornone(). +2439. [bug] Potential NULL dereference in dns_acl_isanyornone(). [RT #18559] -2438. [bug] Timeouts could be logged incorrectly under win32. +2438. [bug] Timeouts could be logged incorrectly under win32. 2437. [bug] Sockets could be closed too early, leading to inconsistent states in the socket module. [RT #18298] @@ -2065,7 +2341,7 @@ h 2433. [tuning] Set initial timeout to 800ms. -2432. [bug] More Windows socket handling improvements. Stop +2432. [bug] More Windows socket handling improvements. Stop using I/O events and use IO Completion Ports throughout. Rewrite the receive path logic to make it easier to support multiple simultaneous @@ -2100,7 +2376,7 @@ h epoll and /dev/poll to be selected at compile time. [RT #18277] -2423. [security] Randomize server selection on queries, so as to +2423. [security] Randomize server selection on queries, so as to make forgery a little more difficult. Instead of always preferring the server with the lowest RTT, pick a server with RTT within the same 128 @@ -2114,7 +2390,7 @@ h Use caution: this option may not work for some operating systems without rebuilding named. -2420. [bug] Windows socket handling cleanup. Let the io +2420. [bug] Windows socket handling cleanup. Let the io completion event send out canceled read/write done events, which keeps us from writing to memory we no longer have ownership of. Add debugging @@ -2436,8 +2712,8 @@ h 2316. [port] Missing #include in lib/dns/gssapictx.c. [RT #17513] -2315. [bug] Used incorrect address family for mapped IPv4 - addresses in acl.c. [RT #17519] +2315. [bug] Used incorrect address family for mapped IPv4 + addresses in acl.c. [RT #17519] 2314. [bug] Uninitialized memory use on error path in bin/named/lwdnoop.c. [RT #17476] @@ -2448,14 +2724,14 @@ h 2312. [cleanup] Silence Coverity warning in lib/isc/unix/socket.c. [RT #17458] -2311. [bug] IPv6 addresses could match IPv4 ACL entries and - vice versa. [RT #17462] +2311. [bug] IPv6 addresses could match IPv4 ACL entries and + vice versa. [RT #17462] 2310. [bug] dig, host, nslookup: flush stdout before emitting debug/fatal messages. [RT #17501] -2309. [cleanup] Fix Coverity warnings in lib/dns/acl.c and iptable.c. - [RT #17455] +2309. [cleanup] Fix Coverity warnings in lib/dns/acl.c and iptable.c. + [RT #17455] 2308. [cleanup] Silence Coverity warning in bin/named/controlconf.c. [RT #17495] @@ -2507,7 +2783,7 @@ h 2292. [bug] Log if the working directory is not writable. [RT #17312] -2291. [bug] PR_SET_DUMPABLE may be set too late. Also report +2291. [bug] PR_SET_DUMPABLE may be set too late. Also report failure to set PR_SET_DUMPABLE. [RT #17312] 2290. [bug] Let AD in the query signal that the client wants AD @@ -2545,7 +2821,7 @@ h 2280. [func] Allow the experimental http server to be reached over IPv6 as well as IPv4. [RT #17332] -2279. [bug] Use setsockopt(SO_NOSIGPIPE), when available, +2279. [bug] Use setsockopt(SO_NOSIGPIPE), when available, to protect applications from receiving spurious SIGPIPE signals when using the resolver. @@ -2580,9 +2856,9 @@ h --- 9.5.0b1 released --- -2267. [bug] Radix tree node_num value could be set incorrectly, - causing positive ACL matches to look like negative - ones. [RT #17311] +2267. [bug] Radix tree node_num value could be set incorrectly, + causing positive ACL matches to look like negative + ones. [RT #17311] 2266. [bug] client.c:get_clientmctx() returned the same mctx once the pool of mctx's was filled. [RT #17218] @@ -2598,7 +2874,7 @@ h 2262. [bug] Error status from all but the last view could be lost. [RT #17292] -2261. [bug] Fix memory leak with "any" and "none" ACLs [RT #17272] +2261. [bug] Fix memory leak with "any" and "none" ACLs [RT #17272] 2260. [bug] Reported wrong clients-per-query when increasing the value. [RT #17236] diff --git a/COPYRIGHT b/COPYRIGHT index 8721ceca846..6f94496d4ba 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -13,9 +13,15 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -$Id: COPYRIGHT,v 1.17 2011-01-04 23:47:13 tbox Exp $ +$Id: COPYRIGHT,v 1.17.14.1 2011-02-22 06:34:47 marka Exp $ -Portions Copyright (C) 1996-2001 Nominum, Inc. + Portions of this code release fall under one or more of the + following Copyright notices. Please see individual source + files for details. + + For binary releases also see: OpenSSL-LICENSE. + +Copyright (C) 1996-2001 Nominum, Inc. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -28,3 +34,485 @@ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ----------------------------------------------------------------------------- + +Copyright (C) 1995-2000 by Network Associates, Inc. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ISC AND NETWORK ASSOCIATES DISCLAIMS +ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE +FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ----------------------------------------------------------------------------- + +Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the +above copyright notice and this permission notice appear in all +copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND STICHTING NLNET +DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL +STICHTING NLNET BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE +USE OR PERFORMANCE OF THIS SOFTWARE. + +The development of Dynamically Loadable Zones (DLZ) for Bind 9 was +conceived and contributed by Rob Butler. + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the +above copyright notice and this permission notice appear in all +copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ROB BUTLER +DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL +ROB BUTLER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE +USE OR PERFORMANCE OF THIS SOFTWARE. + + ----------------------------------------------------------------------------- + +Copyright (c) 1987, 1990, 1993, 1994 + The Regents of the University of California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the University of + California, Berkeley and its contributors. +4. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + ----------------------------------------------------------------------------- + +Copyright (C) The Internet Society 2005. This version of +this module is part of RFC 4178; see the RFC itself for +full legal notices. + +(The above copyright notice is per RFC 3978 5.6 (a), q.v.) + + ----------------------------------------------------------------------------- + +Copyright (c) 2004 Masarykova universita +(Masaryk University, Brno, Czech Republic) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the University nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + ----------------------------------------------------------------------------- + +Copyright (c) 1997 - 2003 Kungliga Tekniska Högskolan +(Royal Institute of Technology, Stockholm, Sweden). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the Institute nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + ----------------------------------------------------------------------------- + +Copyright (c) 1998 Doug Rabson +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + ----------------------------------------------------------------------------- + +Copyright ((c)) 2002, Rice University +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Rice University (RICE) nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + +This software is provided by RICE and the contributors on an "as is" +basis, without any representations or warranties of any kind, express +or implied including, but not limited to, representations or +warranties of non-infringement, merchantability or fitness for a +particular purpose. In no event shall RICE or contributors be liable +for any direct, indirect, incidental, special, exemplary, or +consequential damages (including, but not limited to, procurement of +substitute goods or services; loss of use, data, or profits; or +business interruption) however caused and on any theory of liability, +whether in contract, strict liability, or tort (including negligence +or otherwise) arising in any way out of the use of this software, even +if advised of the possibility of such damage. + + ----------------------------------------------------------------------------- + +Copyright (c) 1993 by Digital Equipment Corporation. + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies, and that +the name of Digital Equipment Corporation not be used in advertising or +publicity pertaining to distribution of the document or software without +specific, written prior permission. + +THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT +CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS +ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + + ----------------------------------------------------------------------------- + +Copyright 2000 Aaron D. Gifford. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holder nor the names of contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + ----------------------------------------------------------------------------- + +Copyright (c) 1998 Doug Rabson. +Copyright (c) 2001 Jake Burkholder. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + ----------------------------------------------------------------------------- + +Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + ----------------------------------------------------------------------------- + +Copyright (c) 1999-2000 by Nortel Networks Corporation + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND NORTEL NETWORKS DISCLAIMS +ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NORTEL NETWORKS +BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + + ----------------------------------------------------------------------------- + +Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved. + +By using this file, you agree to the terms and conditions set forth bellow. + + LICENSE TERMS AND CONDITIONS + +The following License Terms and Conditions apply, unless a different +license is obtained from Japan Network Information Center ("JPNIC"), +a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, +Chiyoda-ku, Tokyo 101-0047, Japan. + +1. Use, Modification and Redistribution (including distribution of any + modified or derived work) in source and/or binary forms is permitted + under this License Terms and Conditions. + +2. Redistribution of source code must retain the copyright notices as they + appear in each source code file, this License Terms and Conditions. + +3. Redistribution in binary form must reproduce the Copyright Notice, + this License Terms and Conditions, in the documentation and/or other + materials provided with the distribution. For the purposes of binary + distribution the "Copyright Notice" refers to the following language: + "Copyright (c) 2000-2002 Japan Network Information Center. All rights + reserved." + +4. The name of JPNIC may not be used to endorse or promote products + derived from this Software without specific prior written approval of + JPNIC. + +5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + ----------------------------------------------------------------------------- + +Copyright (C) 2004 Nominet, Ltd. + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND NOMINET DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + + ----------------------------------------------------------------------------- + +Portions Copyright RSA Security Inc. + +License to copy and use this software is granted provided that it is +identified as "RSA Security Inc. PKCS #11 Cryptographic Token Interface +(Cryptoki)" in all material mentioning or referencing this software. + +License is also granted to make and use derivative works provided that +such works are identified as "derived from the RSA Security Inc. PKCS #11 +Cryptographic Token Interface (Cryptoki)" in all material mentioning or +referencing the derived work. + +RSA Security Inc. makes no representations concerning either the +merchantability of this software or the suitability of this software for +any particular purpose. It is provided "as is" without express or implied +warranty of any kind. + + ----------------------------------------------------------------------------- + +Copyright (c) 1996, David Mazieres +Copyright (c) 2008, Damien Miller + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----------------------------------------------------------------------------- + +Copyright (c) 2000-2001 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/Makefile.in b/Makefile.in index 95944d9fa4f..f0edc926ba7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1998-2002 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.58 2009-11-26 20:52:44 marka Exp $ +# $Id: Makefile.in,v 1.58.250.2 2011-02-28 01:19:57 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -21,7 +21,7 @@ top_srcdir = @top_srcdir@ @BIND9_VERSION@ -SUBDIRS = make lib bin doc @LIBEXPORT@ +SUBDIRS = make unit lib bin doc @LIBEXPORT@ TARGETS = MANPAGES = isc-config.sh.1 @@ -65,6 +65,7 @@ check: test test: (cd bin/tests && ${MAKE} ${MAKEDEFS} test) + (test -f unit/unittest.sh && $(SHELL) unit/unittest.sh) FAQ: FAQ.xml ${XSLTPROC} doc/xsl/isc-docbook-text.xsl FAQ.xml | \ diff --git a/README b/README index 00010c3983f..708def9dd3e 100644 --- a/README +++ b/README @@ -48,6 +48,17 @@ BIND 9 For a detailed list of user-visible changes from previous releases, see the CHANGES file. +BIND 9.8.1 + + BIND 9.8.1 includes a number of bug fixes and enhancements from + BIND 9.8 and earlier releases. New features include: + + - The DLZ "dlopen" driver is now built by default. + - Added a new include file with function typedefs + for the DLZ "dlopen" driver. + - Made "--with-gssapi" default. + - More verbose error reporting from DLZ LDAP. + BIND 9.8.0 BIND 9.8.0 includes a number of changes from BIND 9.7 and earlier diff --git a/RELEASE-NOTES-BIND-9.8.1.html b/RELEASE-NOTES-BIND-9.8.1.html new file mode 100644 index 00000000000..c4deae43a9c --- /dev/null +++ b/RELEASE-NOTES-BIND-9.8.1.html @@ -0,0 +1,368 @@ +

+ +

Introduction

+ +

+ BIND 9.8.1 is the current production release of BIND 9.8. +

+

+ This document summarizes changes from BIND 9.8.0 to BIND 9.8.1. + Please see the CHANGES file in the source code release for a + complete list of all changes. +

+
+ +

Download

+ +

+ The latest versions of BIND 9 software can always be found + on our web site at + http://www.isc.org/downloads/all. + There you will find additional information about each + release, source code, and some pre-compiled versions for certain operating systems. +

+
+ +

Support

+ +

Product support information is available on + http://www.isc.org/services/support + for paid support options. Free support is provided by our user + community via a mailing list. Information on all public email + lists is available at + https://lists.isc.org/mailman/listinfo. +

+
+ +

New Features

+ +

9.8.1

+ +
  • +Added a new include file with function typedefs +for the DLZ "dlopen" driver. [RT #23629] +
  • +Added a tool able to generate malformed packets to allow testing +of how named handles them. +[RT #24096] +
  • +The root key is now provided in the file bind.keys allowing DNSSEC validation to be switched on at start up by adding "dnssec-validation auto;" to named.conf. If the root key provided has expired, named will log the expiration and validation will not work. More information and the most current copy of bind.keys can be found at http://www.isc.org/bind-keys. *Please note this feature was actually added in 9.8.0 but was not included in the 9.8.0 release notes. [RT #21727] +
+
+
+ +

Security Fixes

+ +

9.8.1

+ +
  • +If named is configured with a response policy zone (RPZ) and a query +of type RRSIG is received for a name configured for RRset replacement +in that RPZ, it will trigger an INSIST and crash the server. +RRSIG. [RT #24280] +
  • +named, set up to be a caching resolver, is vulnerable to a +user querying a domain with very large resource record sets (RRSets) +when trying to negatively cache the response. Due to an off-by-one +error, caching the response could cause named to crash. [RT #24650] +[CVE-2011-1910] +
  • +Using Response Policy Zone (RPZ) to query a wildcard CNAME label with +QUERY type SIG/RRSIG, it can cause named to crash. Fix is query type +independant. +[RT #24715] +
  • +Using Response Policy Zone (RPZ) with DNAME records and querying the +subdomain of that label can cause named to crash. Now logs that DNAME +is not supported. +[RT #24766] +
  • +Change #2912 populated the message section in replies to UPDATE requests, +which some Windows clients wanted. This exposed a latent bug that allowed +the response message to crash named. With this fix, change 2912 has been +reduced to copy only the zone section to the reply. A more complete fix +for the latent bug will be released later. +[RT #24777] +
+
+
+ + +

Feature Changes

+ +

9.8.1

+ +
  • +Merged in the NetBSD ATF test framework (currently +version 0.12) for development of future unit tests. +Use configure --with-atf to build ATF internally +or configure --with-atf=prefix to use an external +copy. [RT #23209] +
  • +Added more verbose error reporting from DLZ LDAP. [RT #23402] +
  • +The DLZ "dlopen" driver is now built by default, +no longer requiring a configure option. To +disable it, use "configure --without-dlopen". +(Note: driver not supported on win32.) [RT #23467] +
  • +Replaced compile time constant with STDTIME_ON_32BITS. +[RT #23587] +
  • +Make --with-gssapi default for ./configure. [RT #23738] +
  • +Improved the startup time for an authoritative server with a large +number of zones by making the zone task table of variable size +rather than fixed size. This means that authoritative servers with +lots of zones will be serving that zone data much sooner. [RT #24406] +
  • +Per RFC 6303, RFC 1918 reverse zones are now part of the built-in list of empty zones. [RT #24990] +
+
+
+

Bug Fixes

+ +

9.8.1

+ +
  • +During RFC5011 processing some journal write errors were not detected. +This could lead to managed-keys changes being committed but not +recorded in the journal files, causing potential inconsistencies +during later processing. [RT #20256] +
  • +A potential NULL pointer deference in the DNS64 code could cause +named to terminate unexpectedly. [RT #20256] +
  • +A state variable relating to DNSSEC could fail to be set during +some infrequently-executed code paths, allowing it to be used whilst +in an unitialized state during cache updates, with unpredictable results. +[RT #20256] +
  • +A potential NULL pointer deference in DNSSEC signing code could +cause named to terminate unexpectedly [RT #20256] +
  • +Several cosmetic code changes were made to silence warnings +generated by a static code analysis tool. [RT #20256] +
  • +When using the -x (sign with only KSK) option on dnssec-signzone, +it could incorrectly count the number of ZSKs in the zone. (And in 9.9.0, +some code cleanup and improved warning messages). [RT #20852] +
  • +When using _builtin in named.conf, named.conf changes were not found +when reloading the config file. Now checks _builtin zone arguments +to see if the zone is re-usable or not. [RT #21914] +
  • +Running dnssec-settime -f on an old-style key will +now force the key to be rewritten to the new key format even if no +other change has been specified, using "-P now -A now" +as default values. [RT #22474] +
  • +After an external code review, a code cleanup was done. [RT #22521] +
  • +Cause named to terminate at startup or rndc reconfig +reload to fail, if a log file specified in the +conf file isn't a plain file. (RT #22771] +
  • +named now forces the ADB cache time for glue related data to zero +instead of relying on TTL. This corrects problematic behavior in cases +where a server was authoritative for the A record of a nameserver for a +delegated zone and was queried to recursively resolve records within +that zone. [RT #22842] +
  • +When a validating resolver got a NODATA response for DNSKEY, it was +not caching the NODATA. Fixed and test added. [RT #22908] +
  • +Fixed a bug in which zone keys that were published +and but not immediately activated, automatic signing could fail to trigger. +[RT #22911] +
  • +Fixed precedence order bug with NS and DNAME records if both are present. +(Also fixed timing of autosign test in 9.7+) [RT #23035] +
  • +When a DNSSEC signed dynamic zone's signatures need to be refreshed, +named would first delete the old signatures in the zone. If a private +key of the same algorithm isn't available to named, the signing would +fail but the old signatures would already be deleted. named now checks +if it can access the private key before deleting the old signatures and +leaves the old signature if no private key is found. [RT #23136] +
  • +When using "auto-dnssec maintain" and rolling to a new key, a +private-type record (only used internally by named) could be created +and not marked as complete. [RT #23253] +
  • +Fixed last autosign test report. [RT #23256] +
  • +named didn't save gid at startup and later assumed gid 0. +named now saves/restores the gid when creating creating +named.pid at startup. [RT #23290] +
  • +If the server has an IPv6 address but does not have IPv6 connectivity +to the internet, dig +trace could fail attempting to use IPv6 +addresses. [RT #23297] +
  • +If named is configured with managed zones, the managed key maint timer +can exercise a race condition that can crash the server. +[RT #23303] +
  • +Changing TTL did not cause dnssec-signzone to generate new signatures. +[RT #23330] +
  • +Have the validating resolver use RRSIG original TTL to compute +validated RRset and RRSIG TTL. [RT #23332] +
  • +In "make test" bin/tests/resolver, hold the socket manager lock +while freeing the socket. +[RT #23333] +
  • +If named encountered a CNAME instead of a DS record when walking +the chain of trust down from the trust anchor, it incorrectly stopped +validating. [RT #23338] +
  • +dns/view.h needed dns/rpz.h but it wasn't in the Makfile.in +HEADERS variable. [RT #23342] +
  • +RRSIG records could have time stamps too far in the future. +[RT #23356] +
  • +named stores cached data in an in-memory database and keeps track of +how recently the data is used with a heap. The heap is stored within the +cache's memory space. Under a sustained high query load and with a small +cache size, this could lead to the heap exhausting the cache space. This +would result in cache misses and SERVFAILs, with named never releasing +the cache memory the heap used up and never recovering. + +This fix removes the heap into its own memory space, preventing the heap +from exhausting the cache space and allowing named to recover gracefully +when the high query load abates. [RT #23371] +
  • +Fully separated key management on a per view basis. [RT #23419] +
  • +If running on a powerpc CPU and with atomic operations enabled, +named could lock up. Added sync instructions to the end of atomic +operations. [RT #23469] +
  • +If OpenSSL was built without engine support, named would have +compile errors and fail to build. +[RT #23473] +
  • +If ./configure finds GOST but not elliptic curve, named fails to +build. Added elliptic curve support check in GOST OpenSSL engine +detection. [RT #23485] +
  • +"rndc secroots" would abort on the first error +and so could miss remaining views. [RT #23488] +
  • +Handle isc_event_allocate failures in t_tasks test. +[RT #23572] +
  • +ixfr-from-differences {master|slave}; +failed to select the master/slave zones, resulting in on diff/journal +file being created. +[RT #23580] +
  • +If a DNAME substitution failed, named returned NOERROR. The correct +response should be YXDOMAIN. +[RT #23591] +
  • +dns_dnssec_findzonekeys{2} used a inconsistant +timestamp when determining which keys are active. This could result in +some RRsets not being signed/re-signed. +[RT #23642] +
  • +Remove bin/tests/system/logfileconfig/ns1/named.conf and +add setup.sh in order to resolve changing named.conf issue. [RT #23687] +
  • +NOTIFY messages were not being sent when generating +a NSEC3 chain incrementally. [RT #23702] +
  • +DDNS updates using SIG(0) with update-policy match +type "external" could cause a crash. Also fixed nsupdate core +dump on shutdown when using a SIG(0) key, due to the key +not being freed. [RT #23735] +
  • +Zones using automatic key maintenance could fail to check the key +repository for updates. named now checks once per hour and the +automatic check bug has been fixed. [RT #23744] +
  • +named now uses the correct strtok/strtok_r/strtok_s based on OS. +[RT #23747] +
  • +Signatures for records at the zone apex could go +stale due to an incorrect timer setting. [RT #23769] +
  • +The autosign tests attempted to open ports within reserved ranges. Test +now avoids those ports. +[RT #23957] +
  • +GSS TGIS test was failing, since log_cred() caused KRB5_KTNAME to +be cached. Now sets KRB5_KTNAME before calling log_cred() in +dst_gssapi_acceptctx(). [RT #24004] +
  • +named, acting as authoritative server for DLZ zones, was not correctly +setting the authoritative (AA) bit. +[RT #24146] +
  • +Clean up some cross-compiling issues and added two undocumented +configure options, --with-gost and --with-rlimtype, to allow over-riding +default settings (gost=no and rlimtype="long int") when cross-compiling. +[RT #24367] +
  • +When trying sign with NSEC3, if dnssec-signzone couldn't find the +KSK, it would give an incorrect error "NSEC3 iterations too big for +weakest DNSKEY strength" rather than the correct "failed to find +keys at the zone apex: not found" [RT #24369] +
  • +Configuring 'dnssec-validation auto' in a view instead of in the +options statement could trigger an assertion failure in named-checkconf. +[RT #24382] +
  • +Improved consistency checks for dnssec-enable and +dnssec-validation, added test cases to the +checkconf system test. [RT #24398] +
  • +If named is configured to be both authoritative and recursive and receives +a recursive query for a CNAME in a zone that it is authoritative for, if that +CNAME also points to a zone the server is authoritative for, the recursive part of name will not follow the CNAME change and the response will not be a +complete CNAME chain. [RT #24455] +
  • +nsupdate could dump core on shutdown when using SIG(0) keys. [RT #24604] +
  • +Named could fail to validate zones list in a DLV that validated insecure +without using DLV and had DS records in the parent zone. [RT #24631] +
  • +dnssec-signzone now records timestamps just before and just after signing, improving the accuracy of signing statistics. [RT #16030] +
  • +If allow-new-zones was set to yes and name-based ACLs were used, named could crash when "rndc reconfig" was issued. [RT #22739] +
  • +RT #23136 fixed a problem where named would delete old signatures even +when the private key wasn't available to re-sign the zone, resulting in +a zone with missing signatures. This fix (CHANGES 3114) did not +completely fix all issues. [RT #24577] +
  • +A bug in FreeBSD kernels causes IPv6 UDP responses greater than +1280 bytes to not fragment as they should. Until there is a kernel +fix, named will work around this by setting IPV6_USE_MIN_MTU on a +per packet basis. [RT #24950] +
+
+
+ +

Known issues in this release

+ +
  • +

    + None. +

    +
+
+ +

Thank You

+ +

+ Thank you to everyone who assisted us in making this release possible. + If you would like to contribute to ISC to assist us in continuing to make + quality open source software, please visit our donations page at + http://www.isc.org/supportisc. +

+
+
diff --git a/RELEASE-NOTES-BIND-9.8.1.pdf b/RELEASE-NOTES-BIND-9.8.1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b2b5de5df5bd3d4b98c81abd4c07ebf44f4f0dd2 GIT binary patch literal 62760 zcmb?@1zc52_cllh64D}Z2mw(z95@_6x?7NLsY7=+f}}`Ehe~&+bW4|j2uOEIi&Eb< z?!DalzxTfH=MUMNz4xqnX3gwb&swu*-H{g&V}dY4G1x&YAZvXy3?3d3SP=vkw^p(S zfki+J_HY9SQ)??`$XyU09|qjY@Y_S2KObh0v~sYsHgx>{$lYJ=a{UKUtXD-rSbvcv zV(n~YVXbHQs~ia1e-Om>J3+8t1SvY&*jU>+{3eIvKgfYzmBY&Ni=2mWXOI|N&%x0S zZvU$=R> z_P2Wf4H^6Ik+J=%{NE#E`%jvOT}8(BtLA@d3nXl!XJvc^8r$FYz;DoCzlR3>wHtm9 z4f?nG|2a@Ou0n(Us(K+u<3H#N`nT%;4HU;8K>gYWe*pEjs{aX!^C~FzU$ri61&n!+ zslB};+#Y0V1#&PkwFlY3E#P|g@Lz`s`+w>TuHOm&wKJ4}PA~_lTRZ+H>2JD0ll@z} z6hI)bn5lyVNc+m04*S^+ARZnJungSF*uew@VPj(Ka06>Y zI0i6J*gM$4^(--5Cb!k3truaqjjO6_3`q9^z>oB;leW^QP<+!irAw!t>W_q#R2i;4 z;y6Dde-Xb-)M*gxyY9v)GF=PB%hq$$Sm@%@j+Bb4Qhm!L&4L?+@4Vh~kQlPwEEf6IBM03Gwq(5tahmDM4d++SI=izk$0 zSYW*)D08&+0$Yqt%@T>`Z2k$$ns|{9VvDTt*0>=%#%s{4u9N#`=wAdk{ZoYH1Pr6) z6PyHd{TGC5K%6{8b*!3$tt@Ifm`}~;eCF?`yOL;GQ;?hq%CW3n&{c$V-^ZApY)dUj zbVVrWA3NY*Kh64ND70$qy}z7P4_+|cfr#fW(a}~%dCQBp)yZL!1~QsYhLPpH3QTvl zXQv4B!NKL=#i0)4prlPt2@bg)Xhju`lB}o}pW%b-D2=R3^(YUHO|2nPqI2$jVU%y> zLz;S_uqWrV$ojm#N&c%Xb|dzi=RC3)Qn*>MfwoQ5Im(*L{pE16i|}ylhNt=Kb0jBg zb95^$?RzUo1_Ta?*lN`Gks&7ado68&6uGMSt&l@VYoTBE8NTVsq%MKS3xfNyxQED_ zzL?U_La|)T#!;PAu z(~CVm)D~7Q<_Q*? zO)7Aqg)7ur_EOZq#)gTs$OkR7ynSWZronY69%DmmJ$VlIM&>no@XUzT;bjNb;B;Id z4k~{ga>Br7T|b5ToXO+dRvm8gyq1P_ktzRa;Tp*0s+S{$8_|olPEn|qo!}XKeCWoc zmv+&lC$R|s*tXYeu)p z<4b<8toDY_!+o(=><{H+?N64Ek6n0}Maa_XbyCaHr;lN*+wCQd zWwHwgUK(*lk3;JqVrL&s2J~6g?zclfS28B;5Bpt*o5|1WZT1=>%NaYgt49vYO3gPDU3AVj_SmiJN z!4-Tzx#<6fkCla)1#l{U(;VFGLF0fjvv2`(@vptg z#>ol{L$-gbx?lXOEBJnTE&m%nc2;HxJJ*#_#|DEiL)h3k|IthFJE!e8Xx~lA|7si9 zpe)R+tkA2fgK{ymaQrjV@Z0P9ixYSS-v1B#zy<*<7Rwd$z{bkK%nD=uSBm@LSYAQ) z|HC}6a>1CPoPYuUZOpN-GqXYem38>xm0m&iudD+L2m<=nPe08)8y7Px2Nw(k*eqrk zl;w)K2j&oFb|@73+h_xSv-V&?9v<*F)&v&(9-IOzf|V5{zx`)0ad5DC00uidJ2RWw z8!%hj8G{XfhMw%fdKMOU0sr+1?0;oBeh(XPl$kj=fQS(U3Ipr};K)O`SeT)ZZzt>= z%uTOc6Ai} zZD|HKOpHKe1K_%_ALJJ}=LEria9&`LfaUG14HV%39R;Ylh!_a0 z1b1-&UDYG!RSWPldcw*I2>gf9lTh_(`zcOr?@y2C*BiRHD_e0qclaEW9I~CO6SNj) z`W>gx)b%Z7;obS+88uB82-nKsnx#%>0=@`{FHR7V;avE;QEa)Dw^1WGF!h(E=26NW zPR07(H=k{X8d7chL_|x3*%0fH)asC&mUqZ^7x!|gQns1U@v6G}Br;K=y*(RJo*XZS z9|xwdV&3($p{SiM%A5L9y*#U@&lxh!DUUdSU+%9^gmG=~;hX&Y0_mwQts|u)y9NHM z*XhBO`EE%SuF7~E);Y2(Qk-)3%iNMWwE3+OJV8E{92~uEDls;qB)RG-yd{(!6$bj= zua6qM$()*Amy$e8oyOs?ExPr&%yepcP*rtsaPXkn`D4B0bl$7pF7?OkSzbMgBUQRb?NHJ^jIl=$ya!d?h?*7rD8Gz+*f72ypeR=2m{rrMf;3lV&gV~dQHMsC9lTO9C2upRECclk(X z%3Vh_LgsMvFsop`riY%^y~yxR>21MF!_L#uC8V>458-0Y^>G?EItHBYd(Jc76hX6m z<5w*8#n{R7gHb`-^}2@9jOi{cq00|jr+s2Xw6-_!Eu@}yewGo@$r6pbMcs&zim}7L zx*gyauAQKe0~%}Gk};yVoe|xS3$34b9ltyidReXhXj|q>Y)-+z@CH6Aw_o`u?)1nn zo##Bb11~}n3)LW!4Mdlt>c=IIg~)PmrcFOBr`swk4=|cg@2MVW%__|E zMPsP`05KcSf;zt2UxVFc$v--9mi+3;Oyxe|x14`|zsr^oshN>29{Ih9QuwG<03O^| zN<6tzvZsIriwhH>#6P;YWhoe+_a<5~_b{gaZ8PvIn+5qTU;NMdQ4i}aoIkbSty^lR zDenzElGqwmMyY=3TMm)~9X}3&TjS_P2R;px+YvHcy<5gtIw(><(^#pJ?4P#k#DAP4TlU;% zS&)?>>1{>`{y|2bdH&;>7h2XI^#^40_ifLvi6={i52C;Z#j%7t#j*OkbA7w$Omhr6 zyteiy4L|Kpsyuh>^%%${*?pO&L78w{W~&;J78wZwCNHh%H6Ek-I!jH9ir!q7|CKuc zH=;?kk}5bojR>vl;n34-VpYl`3gGRH$>;*sLZ_TVe>GS|o9$?dP3uO>HVxW^nxlz| z_&Ya>Da^`ylWI3Cn~Q|zx%j6E=}d3*2Nq6I7-nGwAcgTxO20(eilpt6d{>2J*z}x< zdA;0-lEtAHbEBw4U{izo_(5b!TXp%?9hbDHPj@8LEnU!fW}%B*asiBIFpUL)M|dG1 z&LW$$i<^ecPpcX$;SVnsi$`G>j|(iJ(I^kFvx<6CKlsbk5hwLk#BJ}eZAWYOREQfv zuuKq0#F?C!UZnVs`qbEAndoB^LrHQ+N3$kcxI1tw^GoKkD|`+w^ImX0_6P5LY80Sx z^-3VW`?Z{neK5~ORP9cv;L*j!{D?J)Nri%ic~qjHr61@9FJnQ(OZlgo88dqWVTPYR z-5xpCa29=$$OK1%swzxbS!@KDmSj8knRmYLQOBT39T+$F@S}>faq+12JUJ}c>g05K z_rMfJKmQawp*LZ?*g@eZeJ%UQ_gVWU@XLP_jXGXnPk!s#GhnDOG+H=^FWjy3Tc9Z? zYFN9Dg=4zOU%1XXrnPC>7|I^wKa?R^o7zi=j$o&JD86+)&{6#f;%V-^l7|`lj}FM) z$ZGzUhQD71Bf zX!4Ae%zY;Qg_~s)W6LU{o0NNb!746j8{~$egY*h#N}Mb#r7qm7IfYniwYJT~7>RU; z(U0pL?r_SvZK<2Oycoi(+|4|GQ>M1392IMig+T0G;5TV`_gM8aB*()WH8d5e+7XYW zw8>9!=?MfWFFcWwV(h34T<^Mo+yex8lr3;Nm{H`wFmfK^Z3;bY`(CU zr){oCjvRffwo4vVpE~v=`2rC)?Qqu*T*#*Su(2|lf$(p!gy)-==CiJsr&z(n-8}>i zWPYtd#FzfdZ&#Dt3nDHsi=M5WKj&Q*xK>|gx=U`mAFILGVbQsO3_q=fE}#oA)3o8= zRKX}nPmQhiRdj!P@_w*S-y&gGX7ELsCyG((;bZY=KN%u(Ia!bygA?K-_fkm_?W#KQ z(P(X<(MWYMf@m8g5h`{Of_HulTjW$2Xq@aqpT0i1MSJ(0U1T?eii}PtE*^qof2TwEenh=uG3EiHJyYOARgv9p#EwY0By5C8cJnCF96W8K@{^>Zz$ z_50Rtk^<@@uuo#r4YIGObz911;h3^(=f+l-irwfpv9Pjqi!2gS#+ABv2ph{kF7+)C z+l_sw$jlA%Cq=3@l~y20iF5c^E59ubI_=0ENJq=}Rp ziE}1Y2g>_gYje7BR?d5QlS6;+GN_@4;ZJc-&ObZ!e~5d2XH~z8dvbn{O8)z}C)baN zCD%8ytnfSL_WjN;T<}Nq_5X+f{+{-;0WnD+0LcY{u|a-@*?65z=>DC<^1U(tE%I-yoE`8TU@RQWTrBM0{4926E>3pf3gE4B zvT*%NKg%9)v@A^R9qfN~wJh~aEiCn{zF#%9GP3@IxAh0#;rn1v0R2O^1qcKGj{g63 z>A!JXAXm9M;CcLIVRkMyW>yH`wExj}VEu!~^w*_fFlH`x;IoE5mA)Ee`@6c?fVyF@ zKf5h#e{g#KvT8OM5Ojn<{tW#4tMkinx#INv>gZf`fc}xw!*#V6esOwOfO`I+)AJH= zdOpIiy$2tcMm3rk*XHF|PxtY1+ImDKwT}l^gU1aYXa(zRriJrLV#HcO~OV!i)0rkbmDfnVo35rz;h-nDGZ{5lrN zk1XA3{Z@_LN$2^mtzH;L)u?ZECY_&)iR9j za89h0?NGW*2|7u)jNee2iL-3m+{WiBe7I{##Y-7HmdZRaqM8LeD%w0 zP`&k0R0HEgeir@Lk|SPYPOGM^%j^8^^nOXAkt|K~r3H+*&v;f-Oh)q*$`n!hZEiP& zu1W0Dc%N5<@*2y9@So^5En)6p9!qghJ3M7M9@gdNcVGjDad7V{L>Q$G6InaA9`LLh zZHkAzI8Ujjc2wJ&LYp8{cAn`c8`)Y(I6q@Z*Vbw|HMGKjdhBjYd)aOHg)ltSLyKf~ z^LjDa-x166siu)Qdv$sj{k12*TNVe#M@~$G(%$`hv?D~z&jJWVWxg;DGR@`TNRgP5RZ##GPZqIH8 zhJL(A+cd=+t9drfJ#pYfBFl;Qp*JsOy$^$e^v2xBuAVa?o{&bKLhFa_so1H(8xrHQ zavGtwXqa?;E$@}x& z22HBg;LyP_9m0-yBhC)Qj(F~hbkUgibTtX14rY#zVd9B1n^klhU)!33Piz{ncvm-! z7aihUFsk0qn<C zD!U~Vx4Je)Mn@hhEA86q0YfE1+wc+2k^dZI&ZTr7j=qV|#ClH|^GmYx=th%pZs?{B z*!9+UT_!_@E{?DSg^RH-M|vL`e^x|=Nh$-kYmQnTbYsy^|0Y*4cm&mkA#5sjw)DD- zVxMQVW$^{7E4}pVBxF9zNw4*YX&WJ#FitD3Gs<4N-D!w2vo6a+owp#ZR4Y0K&5Xeg z6&B85b;z3{=hhTiu->lFHa&xdAs^}W{P?nk-JM>I(5YKyJJGNljWA0VCqTnfqqT}?lXSU9+!sK-i zUrFirUyC|eju)SPZ4|lJsvV8I{)|196kmsEs(=g7;0mC@6+naRfCdxoD?e>USwUv* zt|8`L+xN}Q7a`&#C%Uchxh;6bPlEs=CVI`hUt+8!iZCPRu#wfvPJ1H7Yw#1^aD_E324^x4 z-qZeqrl`?s<@PadgRF%YJ;~y%SpY-f2x*39MMer15*QGQn=JYD#e~heMO7F{^6e*i zldoJ?=$j>u5m|4$-`1rt;*PY{wR_+H9x*SXfi{m~KQL3O%3RQ;kOrgSWV!izN}}A; zzV|QsI#jM1 z$Sb-P6A6=;>RJ-G41c&3;zvxAmtKusJW;Oq#`H2=8>4!CZUjhY6U}<{JSwv&sqjsa zm(^Jij8rcbpmM*zc4Zj3YD- zStVA@igO+%s6!FVXD{~W+urEDA_&4FBz{udJ$CXzz{2e%;=Dt$wvOS?icLe4;X@*tIHV3u_2?C^ z$#5@4a()B#nvnVMJ!)`1*^&tg6^lPo08iLlQJu4Ouo0L_QrS^m8-vm%|KZUf(sNdl zjs@PT)|E)h(#<;@iJK70oZ>!@089mXhBlV9Jx?_iLhTpHjGozBrqE9cEEFgCJ`@hA zSsoq?`C*xT{@t1Rk!DiuoJuwYv7rI9m&utGcMk$@`qML{FwkpP*a+Ld%VRjmT@s0M z9*TGHMoGV>(aZ2q2vclT{~pQ9_5u>^ac;fQtT-08)MGP+UkAbAh)ph zMLaP46LfAlfxcW+Nhx;BFmg%`%Uq+}+tn^CxVj#iggj9i2b9ti)74prTMdqxTlEP8 zb*_Tu%s~j3k4DDw!1l?R24&(GO81)m7zs1XB(G^%A!OgX*C-)BWJnguyet=vk%%i< ziQ)mDS$M)k{5q#3yQh;QR^KfrcI$((*F^JZCT97mb(h`7g_N&VcGUK z#(rg%eDSC{WzRdYxw_|1UIW*kR~P=^HGHQfzw;WnzHv6-%0K&B;?!R- z&s%SAwt9JZ9JLLay2YKkQb*Nww!I8OdWtPU}3WuN~-pwp_mEkEXeT z_NEzn?BJ}TVw)MOq6W(|DUO@gxt7yhQ=;%1>{*Rp`uX~$;{Ee_q?e+zi7&-k)J?U? zV%|19z2iT0erjDuyGxOK31;om|I*3PP9n)9#NT(|5E6lH5gI{MCEKOkfKSD7$V#PM zDI$@u8XLhnSbxd4Z8)dBX_QkF)zfDlQl58KW{%^cE5v#2T5NWjKNj7g@z_1Q>S=)( zq}|*F9VK3FJ-yh`{H%M7eC5ww{0QauA?UOrrIVoIR+fD}2ku*Kw)i_4J^burk3A%l zNnr|)hd+s|kQW<|Vc(#9z*wm-%vfI3izIY1sTWbyJ!`f567}J_UEI+zo{H3pYG@x8ereSm>gz zr%Asp!bT}9<3V1R!8&f$80Zjqi7GMhjGj%Yjmza7w$Zkvh?wYtVyfgxhKb?adI+O= z1)6e$V7FoK&=iCQ60!L7c*s}=#R_o;Zmv_x@T*Zwx3TZz(ZxhtzB_6#6>BBF(Cgm*n;) zJ86!|0}83}(HF$F1+fMsE7-H_63F)XZ+%|+>(-uQgNyXU5~USC?2Yty-5kgC%~;0} zOoJZU-z~@TeN#f{`@BTfw_ua}dRb;1I;*0&I@QwBVTqmsSN_min zM{l0i1v>Fm4=4Ln@_b$>TYq;tt9(?+&hhMMh&*mwhkMpXj&fs2+kihbau;RGXHOZX zZqf4o?tVH7TUSbRrkTHdyg6BmUY4jiYdzq&;qh z6e4u{7nbPxS-#WL{?rx7)F2X+pkZ9z$_Ygydz!>5S5DK-aO;UxF0&l1{uF8|zNGmE zO$Zy(^V`A`%U?%Fze3GYd7h53MU3)@JkoeQuaVOd^`r*;=2==rk?f16Qplv^T0y=) z-HNK%q`XRplBENSGrRC(%JAmToX1u-g$q9R>ydrYW31A7%4`uz0?aqhf%ygkJ7k4u zRWd_FusISKl`|(59^I}l+{2cC*>w$TAV_e#4JpRq!?lKH=I0Hk-u3A#Yh|T+`q1S3 z^0pA2(8Nl!`OwBWQki#o!_x%X{W6rTPa_eh_4Kdb*YHs#&@BE`wxg0asgKpfi6Yy7TZBbTr=>o#6Sh zWUXnFu=G19x=)AAwyX!zd0|=G^CQ9FVs}$cTZGYI84Wrz5c3Iwy>*0apvQj0iXlS) z&5H8PW!T6q-7sIq9epCZG=t;_s(-6^At_1l^ zuHTqV6f5r(#=ww?H&GhHGA=}bJKd=5AE>vrCyP%b*QNlyWNOV?JVxMppu?6;KC50* zE{Tcx+R_Vkc3Ak(;>EjME=huSRC9Nd{N_p4kaRH)UwVMvZ@%2c)*^pXXJRVa?FmG|qm#JNMWo~_o$(iDuo4qaraU>cD&c>A2H=VMfA zg**Yh-`UFj&us^yOik45FYgGO7BPPvM%Pre)S`~ZNEDQwxVv$qfgbhNy@k5F(FQX3 zQv0tNu1S*-UoLK^Q_wc|I`I-J|sAE-Q6%BZ32vbgu$M$bISSZ^w+I?s8s z9;>0=wMfJ15?9DwSzC6TtfF#JO46?2mWEnTKRT&iZ$tdlx_Z`83?cH!F2XTi;tmCY zY{C(7;t@`R#u=|54*3`F&+C$mEW-lxHygo2yIJFJ3q+gRw6{P>;d6tv9T7ZgdJ@rJ zse7vI@PJo?im0kT0(doqfmcIVtCH?rk7X73wQ+rkrI%*Qv+LJW&X&jJu1n|TWv_v7 zUJ~CqRC>Aa=&%ZU@WvxaPRYqKe`~Rf;+3o9bVWtS>*Znfd>_hG<^Jr8^C9BQNf%F| zwv>UmV8&y1v;7sd)DGK$Yfby_akvHI4`F&`A912gddazSti!Qh@$m_?*)pGb60{?LZ;X8Hwy)W>uRuHcE0)GftbN%=*`X2_YfiIeVqp(+k zufLMwe-vp%X?#9v+0`eW@)ufbxLcY*0BWo07M!}J`sc*K%gAKaf2 zt&$;^#cnDW#wb1NDctt{bR#hO%^vf0q?!4?2%3J5r9Sz2Q3UUKQ4&$F*p)p|4Ho_z z3x{bB>d~1g1W$HEbE4BoqFZqT=`%LfZ$!Ut6QZv)lHP=Ndl21$(HZ`jRg}Q_n9SaThDxYekY$F=Iv?QkPvqxs!J|}p^k;v!%EehYkS2j@lL0a zwNt($!CM_oij&wbjXCQjW$jaU+>%byp%=wRZ|FDVtCrJ^F4r`ebrAb8tUn&$lgj0@ z?4B^n)PK^@sHRD{wTVO-q#46hi=bmp9^e&8E5nzbe1dhkmzsw{qANKUbI2AQqu+dB zwOP8OK^k^yr{t?pnwLu8&ZJz9OxZZ}E}wSK!y}^kblWNhbtV9M(VoT-bm4+JK&Ezo zujQrxJ%$_Xn(`*>&hl#8%!2bJ`M#~tQ@6)e;f|*g10O8-KsVi{+@zDMZU-yIM9sBN zRSE5yF>Q1bE&41Oh_{N*?5C2&FiNN|c-|pQmJh=o z{fA@{@n%G{M(p%>PIYW}%yoY4krSVnpP^8oteKG$G1^3)_&&U!$yMBtWAusD#E?YmJ=LAH>J993C||X2Qi2Me2M>zegq3M0gQi652H&H> zW2N@{5?QIQ2}&`$M0*3$-`Ta9u+^rRaO4RBIb*((*~|X8RAyYY9dW;kS>{*l1tW7uM#Ie@VG@=e+)+ z!uL{@ve;CuT7M~1VcjXfY^$Lrd%ii}N}loY=Xzy=Yw|ETynBYpEqRl|6ezl^bmN_~ zw(-bsg^66J9=u-3y2=arraT3^`#24WtWM-Nxr3(!p4Oh{e*Gw`_BEN?Bx-cQ(?rzwd5y+R z#r_q~!jRwh)ksbORA zR!FMp2IhV?uZs~CdeuXLkr{ysitJiM4>&c=@ z@PKs`dhe=c*IzI8tGg4liiK)O!$zl|7T)u?Mm~apm@4E!E3X5k(kZFgo&~AI`DB4a z^T=c(j}&nTu8|@e9uvn}{o7z;zR{tTxd$>G1bCmvo%4BiFD{&7I%dZD(JTUP^;SL= z5bl5(L~eMkP?KjO1y&Os(#fnEgAS9L3vS6MGLzd~b0u`!ja8IuBDff`IyWSTyNu4O zLGFed(4$g3Eg^#5Jm}%zo!6DYZC48QPC>erB@j~lwaHCM!(P-E>F8m$nS49eOY|cN zevbSu2k>1(bV(W5qoanx&*#nSt>WytE~{#x<(M3l}fMto)u*-7qk=Wr{@wG zAMV0knnbG3-4YL!ypaOCE$>#2mi}QK7}+7Or}3?B za^An+h>gS_jHi0nFmJ-6aO`7a)ugt^c1ga6WnxDWn)F*eGtDswT~7$a6|(0xN#n70 zPrv?Rs#qi^3Bl8VLEXSPCq`#{(Ncc8(zn7TgmC>hChz%}`t@hg#1FR~OiwRd&qk=5 zv~uJO`ed1j$&4ubkbMec<@|xQK#?_*A(}sgmETmCXT7FGf=Lh2Gy3&|^wyy=WdHYe zZ~eyB$ndb!32tV|-om|kVC6nDGwa z_A+gvtmy|QQ_ ziu}F$@oWO7YYY5wrFg#e28UDIbY(7#ptjihOl}M(+OJ&9`1U?WyEo*y1H z@f&a?4q|7&N_r&a`xvoMmz|Nqai}ldpE;a}I{4zSXQ}h`QMV38qNZ{SQ_hB)8vn_1 zQ>|&lYrhC-=O9M$eOEhnoBK6`C<0brSc%1`bXPY-Z!q0Hlj;p^>|eXqIGxivQ*w92 zuxAO5eO9l|d~VB-g|^1k8O$d_W9*}0)T}@7|q66sPME9Ots6~c1$yY0W+_4kAA{f@jsSiXP9^6w+r5SFW9 zb08S~qyB#!%l=XE{}t8!hXnR25B`O~vI3u<{PR$*^%N)G#mr;9B|aroGttpH><>88 zRhox(aVU65fz#X65qI7aF@^+4(DySPH_ZYRc3F(5^n)3cZDAzlNKZNE-JKs;EQsrLbScu=#H2pAcSpLO_>1bvXFEdCVCU$1F~%b)eW>=G2NM#? zPR}^=ChT3NDJ4F+c5>s5YVCQ=I>=Uc%%Y#_Kvsw)@it_6J|&u=B}%S^%Hn5lapCpd zyEk^ft=(Pd?&rAt=*$_nagqipvZ+LLJ6K~+WfJ9pK>b<@2+GL1BAf>rhKTrSbmq1cxm%k79y?(e6kb!pAr%I){*%&Tc( zGyjZC5vYyys&s<8k$COKK6>)C-Uitb?Rx?~^|4@uy>rKVRY3)@NE#6zbevykJ1mz4Y9`QW3<>pVP=;$j{AGoiw+#Jh;m- zKZQn%dvzzdI!z==4xITBMz$pxRNk`2HhXA2FhyR!UM4-m!{&av$r|wbayf2x4tc-t zsaouEthAf^3Q3^Edc0t3`;8YboD&n0Qp9Iso$JA4DT?nFk1s|7gCuNZ4Wg+Mw9w!1 z-q)_$?q!v&#|-Q7O(>CGXq8Lnapp41fUPp*uQ-hsOh=`YIfbUbHRAWGZ+Kj^@Wi!K zSex-so(wr6<>(R3D@ z^6LU0BoOvXSBZOtiSDp*V&U=QP^(%)RFc|qmF*WD-tSz`#;!xnHYjfrzUSizyI)`* zaX(xN;RAxl5b2ps4#TYQL;3o9b7h6wm2j|_@8 zPH;=XdU1VS%wrjrm7ZI^3E*xvB@m4pBI=AACdw``OU%Ts2puyTg5_`x!>pYJl6sj_ zxBCi?V#1_1^N~l=nDrI~0tiM9dfJPW8t`U|*7t@qTRqC}W@;s7H9u*`t)o4nzIOSWLOCsn;{lqCZtv!i ze28znyN9Es6J*^=)?Elfc_Ur1a<8Z7O;}_MdBY-8yBmIo4az$GsZ&u2VGY4OQ^?{2 zqLce@|6WI$O0IEr_UcWe?N?f>CFWWju)6oAti6t~*4tPO>y6Xs1cy6lnZ+IqHxCKW ztQ>IC=%Yok9ChaTZJ2_>Sx ze-Az>lQ3$? zeW;&L?}vE!!1kJ@dwK}57t(kInn{cKR=ms<`s=kjXdl8-fx_H^W9SP z^}Eft+>z(^HQ?y({cE4z8^KY*4k+RqV`W_*cg3esskH?^7uTVAxHiZxQGeZ4mp&@- z*X&JoWypUf#Ccnyayy5kZF+8GTVwyP737w@QELOZ7VXEzT{{t>^t4 ziC=c0I>Wpg1ZM3bH`@+N@IBLe_LlrbgyTOS7M1hkQC^;N-;7^d=1$DL!6|}>rA=+L zX>+O{H+t6%Lqd4Hv4mzL=*8T*`!#>&>CnUhTu8{sEihW@>x^JF;pd|(^%i3vbzW7v z@0Ya|?d^Zq3XC7*y4D5gS{I;e=Z4{NyDmn@O;BP~w44k0 zZkVa?6X|k{rFHel7Rdt%g+!HN`Ij1!N~8S-pPjl>l&RPgjc&7Xr#snuAB3reCNiQS zn~wwr%pCJ{-q1F7nQ;t2sCtz++f`R~z%;7hhJdP;?R-b(pw_fXQN78ud_tZU3QykaHAy5eKk zYc{uQ7xj;xo<{cL2&-i1J&JI%j^nhU7T~9P-&2*#t}p*;{rHS2cSF!rpq$BthyCM> zEmHC;sgB-6kpQ-+IF_)t(S1 zI99p}BM-~kzQ?=R9C?~~7&rLbTK(-As2d**`K=in3CU}aK+k`xaQ5~WP#D6&cB+f z?JpkM@21^KT5H-NAy?aZVI6W-W_{2a{_X?eG)>_+JsC^8b1Bb34iW>`)7Lxe^mUx zbHd;4<@?DAA)G)ug@4EiLrKi7r(nD8-u}a$@i#^pDe>-XYtHsgqIN70kxZt^-=BD| zFI^q_NQ+L(VvvpULm7xzRvOIg4Ax;I1@(t{L;tZzAh$ zDamB8N@+nGhh+>(pZf}|Xi)TJG|orbY15LTxsTjRqNehNv|(rqeo0U5Ljh@ znVLm@ocv}n(*9bm^FxZ)v{)yd6!e8yf@6tFx&^o^YFkd9!EM{{9*k;qrOGK~hP@#3 z`RL%&uqVrANwG=EE*1iyGJ_&}&m5`kHI>{BXS1TI!iO4_{9ASh0%P(BmLqA0RBz{W z9$zNkTVWbj?>iMm79{cVj(B1DBG7gL%@$84+Lv!i;_li9I_Z`-Gerb4>zN8Ra+bMC z!m%3p{_*Gi%rq?K$ALuZ+;+*Bb#a~t#4Q}1LJ4*L?9 zFk7c=%F-tNmY{Rxg+RtR#p6$QC znBtbgBG|I9USxA|?M5uB>|D`Mzz0iDBpIpKUD|+TsE!YCcTXW4C2)zRg^K2J$6R3W z+*)ZUig+)KoGjf9lH@DA&3*zs6 zdK-W&Uv$8J2cp|8`oyC9iN@_INrd3q=IX%`L}7s~wA;I>MJ$2Vb)dDg_#%+kyO@3( zRkrs@GLWc@jf0tw?HU2<)YC%TyfwX8?9=&n6npcAv8dQ0uvRD&O9 z@9|}mjQ*j%)T(cdX9u(YCT_l`VKXtE7Z1gr(+10RkPy<%d8H3q&zWeu6r$TBUy%eq z={H})a7Pzl6jnI8?}OMaWL;Ak1&!!JLlC1FU@7+Uw*9ixPdH4w>XT%u8$);t5gLDO z=wVu29h*7^elkK5T8fiy7@xJ99zm!fO1LMVI)=NJ0oVMSEJb~p^}950V`}}@);)Yg z(Gv*+B+65t8PcN&G!`D5EsvQCDP)Yn8%IR6Gv(W%H^F?z9b=to5HE4Zu zzatyG(Ycz>!Oy3ob#e0M%)@&_ZaT+^$=JAxkbJb?a>(piXVzER3@_|QxPvZpy#m*7 zJoQIE^SjHgDNw*jh40=+qJjG~b)UEI0jR*!P<|j;E@C^>tbkSiQ_4JVB9p?~Mn56$ zNM_HfNRRaobofSE)^QL;x4ZD2+=hy_{mYX3mC5buPS+oK3p<^f59}q(a#DGQ;_?ce z2;~l0S#fmq)FF9ceyG0g;Vzren66G((pgB8E$_(Qz@|Hv(z_6pjK1mVCJYI>)}4wl zHjv4F-L z;e76yxU^{Ui2_QuNamU?mWd&rTT=AP`=cZ;&2OZ2;iS=$y*r_N^~tsGFBr$wRn5O< z9N*3JAEHp-KFIsej05sLuP5-__YGCw(oaEv1XX|Bfc4|rFErv`?!aON_V{qJ0AD+@ zvIBW5IDn*8Y@8fG;)QQlfIT=s{(vi~EdHAvSU)yi0qG-tzkLbVVRL0c_d9p`rpbRC zPhL`ArxE ztZxT*f`cthtsL!v>=(b?fr2#*^z5vyz-~VdKYjysTfpt@O}~Noc47uLG6H@88~_ji zA>7tc&jJi=UNf}DrB!8SkA z<$`TY!Nzua04Q5WK%hMU*#Zu>x6w0zgW)a)7J8OHZW!tVH9A`A!|m)%jjaGc78ZJT zU>i7)?F~?ko+WT*uV-cW<6%2fV-p83P%qrd0&ev4?8iktdjOZIy*b#%!qFaVU=6?l zo4DGTzyU?X1Co7QqhA)?fz{J2)I{1mu`1B-u8?Is152FrkD z!4JW5V0rK(umX^(MG347RspMm)xhdt4WRe*49wv`R{(9&2Tp%L{dx75_8FL(8kpJ{ zI9h@ot$^fl_6F8=Kb8BvoE}&oYydU{1MLADgH6DuU^B2e*aB<`wgOv&ZNRo*JFq?2 z0qh8N0y~3Uz^-7o@AU$?Sije5_v5cCwK6DucJ)DcjiDUhHK=v|8| zovROIbOpw-H841T?b+|w;1(99Huk3WU_(7)W4PVV!?%9_(HtWSxXZUbaxk%W{NB}y zKL)9>qp8LBVe=i}|D)_JfZJM@c2Tn(GsTW$W@ct)j+vR6nIUGz*fBFRGcz+YGgIuR zB>S9yzx(Rdy;mxg*35Lz^vrb6Qc3#0mKCOzwK6i%qqWyFG&2B?}%=7_7Fh-8FfIGtPxH7W(^Y&+^w2pwTjjZ(SEodG77YqKX z+8EIa8Cg2&(OTNL19)PMXw?kO0I>j=8Xi5%zoLD${_7+LEB{QVzZW!nFA2yi-Ew|_>pH#7$L-XB-|y(E@KR=C7bbBKc02CEqlOe5@p26?1Hw0`Gz{P(D#h=6Bx7!0iwZ9|6{;&K0x1?v_ z`2X$?|9@A9|Mv+<%P&kT_#cym z|0)arRTlo2vhaVk#Q(~O|CJH{myGy-WrQ6~X=VNnC;L}i_OH0?zruDwru+#)v;WE% z0hYn~?{GGM#clqI+x)9bn|}oUt7T~BYz8pU=IJpsQ)I*g5HJ0w064su0Jr?#kN*QA zXGbHspX*5^7l>>7TNi)_JbPF7_V25&YwOfaoM0e4n`e73=tt?OQ`7k6)|7di?K zB{K7^$y}#ur)nMw@ug-A;Tpcz-_C| zu|>tiT6}!0m{qx`Q*cB;Q{ZYqd3*;z@bEyKyu7@~%zVgad*}KFM&}S&vkO!CCWeMD zh5MC=zNwF$9vh5WR%KYgOqaMgcpg>pphMH=*gGE_@+e>+O=)wDFCk>>2?-I(py%Wu@yHm|ojh-=PJ$be6o@ z3{2PTx~NuDt}0C{Z4Qr&$J}Z!`H?Wj>)N6Qy8d2rZhm_K;Y+9Xi!OLzAGx~9>PU;ogx((K|vdv#<0DfGTl zE7qkB40LJvU9ZvB<;5iva%le&c=}g8i-*VOtln3Ux7|qKHeLok(XLlcP&tsd z`>7_*Hyd(3NKB8*4~3adkyHQoZeC`OBsF zon*44ptK;5dh$t!tHKAeq@C6;Eva#qv(d*w7{l@!_j{)<5mA>mkdCo44i69`Df;W{ zx(8|BWbeU;PQn{z$gfNjqpY;>Nc66&b{m$5&eo5{4_?`U4-mq0Q}~7_3oE8|-zc=p zvKN;6qR1j8fwwny?B2EoPxDtcLe3o-d{04( zg8&TOq@_&Xv9L{0mn9WDcdj`1yMrhv13M4PiVqy;Q$R>H9#X9O6evU@3CmEkuh<-4 z>i{b-ZCoxq+~{09$RShK?wp_}2Bdi-DX8n5>zTF>2&iA;&{P&85Atn7^=4kWY$<}gT~!6a|H{QpKXlv@zoX5 zh?o?|f;Dd}q`9?1Dh0A3dIR5z7s&cR{k?p$P(=;m`*C=&S~Q8_(qo13fh;>f|^^bEXlo{7cnIImxl zuCn=z-ayLUm#NM}lLS}nc{Gg!da9Q&-XkAiSjPvpkx1AJpd;Y9X6P&H+j&u}*JgM> zc`6e(nlGe(|2)prKs)usiv5P^82Br~183kHYw%vRGkbTwpiZB(|ih;5F>QF@K==;K|*)HP)z)7NPQ32MfeYx}}sKLY;Hy z4=&GYsjuXq$^z7ng|JBc!>aLmO)MaoM9sb(3eDGnGAH~huy=vooMAk*Mi*s+kc*K= z2`=byEra{)bD51P!n+bJ>g;;;P1qQA{i?a{PL@yq2%*~3A*nL_V2eMDq9C0kCZ`_Xgym3eeyS0m+J5bMEw|RDg zY@jyd0n#ZUwUWT$MFg_-Pj=8Ua1d*+eBM_Zj=agCe=DWNVaC2aypa>rLtS< ziWrNVz*bvcXZI8othnd!?WGG@d_#J!*(aym7uDL_fj$b_k(%(WR8rP%W$iurQ!yKR%pGC z3ER`*hc9xqZ^F;IAzhU{r&c{z9@y~pZmXkL*k0*W>wC&1SEVN1{rd4=;dWW>uCOWe zO?*@57XxtHszyiAsNZdQA(%aQi3S8}Q)Z~Fp2xHD!QRwn-|TxZ@n7@~wq)a)g`c(q`!SzIIgLK0D6fq0h}(%!QO43N0cG%o;sln@1{8L_t(c zh|deh7opse?R3o#4h>sX5>&G=XWQZGy^R$v&rYn85HrS@qGz9Wt2d(w9u1p5zYvxt zLS&rT>ZHksJF6m=~1Pbz4h2}v-(@%!mbu?Uf+t)BArv96-tngw#3bHf3$6N+T zg<}F};=(o_@}UUmux&d$uG+Q{t`if}QhP6b)J^66Si310b@1Un5*zu|m_jlZ5fJis z|3Qj*+|4B5J-bLMvGkR6&JJvX0WLWjSzDv@0X^EC{c#%0V@qe2=ZO z%M$t2Jxn$DBZDkvwvs)au$)xoa%iMk91^>#dXugEoUGKg_d>c4@={4_H= z2X%BgT)k5ANAf>e77V|?>3!Y5OFL#nLaH7ugmCGMubvz{x*a576on7(8Y~DF_&IH z*bQ9YWDs}->o+*OD0LI^d=!g6398tNOrV9vwwKaf+@+gFnH7=MFS8Yv&U>*e;UN6y}Z$C@m_V9JmN=}H+i6?ft8AQCdO6hJoLMh7n28fK9ydU3>PZrBgp)q-0*qmUT#2Pg4_eZBaR2wQfuWRwpxue9p=5dE&dXY|IT$ zVm^`ea|6TLrT^IKWtdr29-2c_2~HnI?0)G(z1LHpYXC0>@<&j&32w0F)ihkErgO4) zQbUi={%SpkCq7n`aCnukU`ivQOW}6Apec|BXKD4UD6(dvi*U@R?^vfCnJ*#9-$|Ux_gP)YTinxw zDj%~ekXXNjCl)gQBpkdNK+e&pRe~dsO*0Sk$q=QKb_HtEv&GREcByOQRwsmuM4}=q z$B$`II`wzPi}*T!`t73B^=PI&!n4&O!;r#o6Xm8wCTbXkcv?|? zPRgsA`WMyGO4#r=&*BPi-)?rQ*P_;hm|^EsVvIhS{+v8U@c|r;L~)_&nYD07df?iK zvnOQu0x9=R;{ifU8u&KnG3&#d{~aMEIYwW#CjVJas0Pz&ter|!hadbyIRYxJ98tH6 z)2}eq^yohQfj7RNp8bTwneEa>^?R}xeuw8tE{j1I!qnPSPKYF~eCKBN8~h&u-yMxR zuAO}5{Oy3Vcq7|IDJLb-)h&Y~bM%9}Ugs-5{m@-b zQ0uudzXuY>laj+ul&&fuO|+MRigCGDk8ri!h|S1@CyBjUNbIIl*W?;W zcTdeQ?Qk#pzQ?t9+7J(JDOeD(-L63)oUx`A&Y+1xV~2afuO}?&q8GaanTG7j;w|79 zO5b5i{%&@DJitABbbY7D)#;Tz03&E)JfFUt026S<*$^~r$+?hepaXn_dIiXh6DxnG)w&P_BvLO9hsFYLJ~kjHsk-^z?AjB(Pr;Az`LR;KVm> z=#x1m+f-L&2hk#(H&FPQ*6eI{u~=N#kqLciTDkpnnmm!BIcKN`hLogKtI2YdY}5FD zAJzT@c{diT%ysaP(Zb7UCy1LQS4Pn!KGnj=m_%k>qyu;3??zrJsU(*)<^8ljD@C?k zf`&pPk5n<|8TB_2k0w)shV!5{;A;~^rrD86nrV8SkO&XSM#oje!)?B3*ij;lao$aD zZ>kUr<enB)9D{ zCX^aIK_HTDSu<=37>um!yGf`dPD!y;dF;aoS~oB#J}GJw9ul*YUl?%32nQ5AscfSS zqRDa4SI(UcE2r+=2`c)6F~3C>S)H{xKR&-kwkR2B;^u%3;IO*oep68-_tZk0{yP`e zxTdKb6EWm(tokh>(VR83M{{{B>jlU?)5}8l5BHyx*w6D`WL9J17iXzy%9=xTAUQ0D zdbZ8*J>qR2$0rW?P8BT)I*22PbKU8ec3_#pWXrEBr?Z80rX)hPf!othJmosezbh7V zhBnxfeaE8aD*9wio1a=|gzCs{EpJ23U69KR36z=XC$IDg{}yEBb5;0Biy~{Lz7<4B zM9Qge^G_)RVYkCojLq-KJoX}J{Ka3k5GoA$m^<+2x8Lr5DlTxbF@BRWbGz4t??fiV z$fEHmdgZ_B=Sto^nob=>JqX)E2P)9XLi*%J$FU3szzlr>r6esuW=9x*u;9hK2K{WG zzWfk35k=;H=o|oww3_GXw;tz2w*IXdYh?Jucxr-ecN9w)QW(OLK{Ed`mjRU)B?ldu z+VM7;eg|<2W*lex;vaBAd~%Pa zU;43=ln(MEduv81=;RM;uaTd}qwF*T&EIdtw||Ms0Fw@gwB<%Sv48g3Q?uaTK3T#+ zDj)K0iAc=+<;Rul?D+gCDc`Bc+FhEHyMkn$!mX;b^XXuRBpa=e7un`O0o)T~&wegv z3ydeu(PO_kmgg2>x!EghRXQ6I72?!&#GIZc_|<=&$NH1669m@;@x_SR2fI=28RRC4Y*b7J(r}h7D<&P=1tJEX-|;EcsMqkG zvX9=);zsZsIQnOO)j=_S1#pBVBAzp>oQXsZ^(=LNFFo1C1{PE@Xe?D8t|DoHlv6_w zo|o6^lw-_|9>@@E^nyHbfjZY5;rw0WuF9wOcKQ&1&^TuZ$rLOWG@#xppXtuEN}L-WIN=Mmp0~&-8ZTrIEd%a z(^xcCZ`^z}Ld(P2k@)y{XHQluPPTsgz1W`&LMXyFBH&Cz8riYDS2clFSg79Ca)2iR z8_aEKacnha%ZBS&w2A5hXd}S^R5J<%_1pr++KI$HB#bZJ>996h_Y>c!LcsHKr29eu ztSQO(y1UhGD58EKrRV76_t;S~V@!ek~0v)b75 zsXzl?>^8K$@nfWK5gWos12FD1^sJb*NyovmiDPR8ZZco3L7bfu-(i@4xEDAWlfdapxL6^wfC2OtiG5 z%eKEIK*x06211UjNs3D6RSioiK6+24FhI9%+CxB~u}iH#jzP)Lk_A&cF= zN-4q#GCEC8gw**?g3)VcQ+B`4Y9gHI)}9xf+a2TK)c_3MiYY;M(F)~G?1E@; zh}T5J?$C47Ap5T%xTE-#8!0{ku>O4q6c0B;&Gnb%Ku`_c1Il0dAgNZNYyC9LUFWw= zq|f+j=3jS-KOYA3Su&Q(fQwo!ES*X1LQXqLl-fm{v#SYzOaF{~X5Vy=S28k}we*(X z)FNplO5kk{DK)XGKYl0^)Q!ArdMpUPOQ6_A-`cP-p^dN{VCj;yGd?mqvw`H(rSyK` z20nrC>8=KWXvv5)oo7iuVP;MU`Y?3KuSK37)4{rC>3)tNP~$lL8DUPB-6Ks~7+Wf8 z(}{$$m`;uRf@+N>YO$R;ft`!FLOYk)7;_vYj_cV)8K|-9jwt#Ep?-hHOeK4uKKFJ3 zA6e1Sjmb+G+VxSu^pEFT;m>uhwK#iU^S4VKZBsASX(IyoJfpB^OOUPVV7(@6k3K0n z48_K_GQ&j@D47;2&#zMET5nO9f22)SeWmwNa*-$lWnXsUB?7}T?jQ92spbOL!&Zdg zmR&s|$g7!N7V#<^f5AJESoK(DZXYZnKF98I(k$pU z+S>Egqsp%LUZIcFhSJN4QX0c{wM_ME4L9~VWi3b9w6}V2Du-UvJEIQ0I?0PcctqI@ z$H#DwCmWk4jkDZnG6xRz515`_kMK)}&r8>?O|K*TrlaOjqJ9g}>`45XI-eRftzgU% z^_HmWRl3?Q@`sxG(Q4^)uS+mPd1Mgx7y6fx5tK;<__=b6Y=ID<9H2H~l5H-;qlEE8LdQ*BpFNGT`O<6pUAGi-hL^ql zeVO@uWq|_%J~NN&f?Yi(4I%59t`(#RodD_vE?CMf2=!}q0$ZIgqP>RFuKv#qPnK&8 z`D9s|QT6<1s(lk{nenbjQicy@6<1ZT>2~?ENeEll8n;r#snS!QzV8SP8^*lEgRso( zJSo?A*xZ1e1z%Lu87%SaFk@9XWeiEE=1#EjkIgqV(BRCR`i%yz^1QeoX|4LHUInrp zVi@v~y_?pqX0==8`f{`u!RQpztmC&vCwEYPSaiFhz~mIof08)+%>N~sr?A;_fmk}T zfhcU`r)J%G;)XarRrSSNq@j@EFSRF3rE@~XNFJuc%#03@sh6rl!0$Q&pFb@it~ZZh zVS_bZlmJ;%`qnv1zFN#QauyJ5H1Fi&t|bq7cPLxz&L`eC^4~?ZW+?fInA?!c@=E{@ zVpVd2<2Hp4P1{NdOs2gm>B-2U3S3Ngo)K`TNSiFspCo-rfci=jt96l1GGY}`?Mo{K z%O#U(36}QqgTN)xh=GD#FRJaqP@SX5JE^7f-e)h>;Hz->JJ(Hvhxc`lKhdD#6uc6S!6qVN=A=rev$B%Cx7z#FeQ7;aU@O}lxV1QM_#QE+rYluQLWb{` zugrbmWtCLbjvu}USBSCdMf7SjmNSuOa=?A>vAW8;Q>>iSmipnFQAlZy`B)%bI$SHb z#X)ufyRZ^ryTxGnHiR#$L_dzFqdqiq9KOLRn?qCAMGB_)XW7NFZZ522j&(W=-=WV} z&&}WL*=DLQbQwb&D1ob0H2tEv4VsR;-7J%d;=*FyoHUN5#JzOLxISt2kuc$PMpk)0 zKPyAG{IKl2g>HP!8V~65QUtfauxvoxoNzYFmmkxvM||*WX-=?aCn{o*ItpmmE_4oN zp2a0D^FwU5FeT%KzZt#&n@X3x9~Z=Loeqg9C1Q=KG4h)2@%^D46fvW^KQc;ik|F*W z0OA&hbA?4jAaPXXb~KFdKb4ln`E{2}B-%urDi7}p6g+X&lQxVL`S$`NLuVw$nbjX8;xPAo zLP_*+_aq_DAQC;QzKDc&s@4Zy2GX*a5A}JThT? z#*A2i8SP&`ZI$Q$N+6vtT{%f3&alQIo*cm7I2GM4+gYSwaB(4?9$SS5jo1LTuN z0E|Q9VvmJ#*jz)pi52NN&U2gUXTq20^9wDPOhr1Y;`g8xzTU7UxG7q|l zO`yzYwZ7q7(H!7pB(-f$@d8w#{TT4(vt;MUk<&2l^zgcliVd72&0nBd#ptDhAvPW^X!gSv?Pc-cXuoZ)eB7-7T- z*xNJOE(E8d+F!z+;!Js@C3RR7CIcEXE1JYW16&f42`BCBuz*gTQ7?$R{9E&AEfT&D z#qGo;)ty2@HyMI}Z%98zFJF95wXtWSYvefe@uq*h-@LnA_1Bc~qN04-#5*7FeWVAfKt$3LifKY_B%Xe7-5N7ai& zY(SH;F58*lELt?;Yx19KE4~cK`{nZfl&6YnXJVIR>H@>zh0iSuf-NT$y(V;GV}zB| zJQ50R)Py1@DkPRU4}t#R8QYr4uqkj!1vkDYoH4UftSd&_GEm_6f!A4UrM>IJ%QHX} zy}`tzH4`QN^qpLGogs@*lqNsOzVx%TcR~hAx-mHi+}dURT^k9-{AsQbF?$4s>@_xm z)V-R_3mMvgB@aPitZ+0N?l4C&VOj<4mj3Rh9_@)=tBCo}q6o*dY1XB*z7(&?3PiiW z8fAuRAMoUJH>`86tvkg@AuT@|Y_EQFV25x-qvCLw^Ioshg#bBm!uQoR9z&D1umA|^ zpIK8;z7x)}HnqMW*6YJU!d1+<-nb55m5IxuCH0r>A#QFT6%AKxil>nX8!g7m<=tj; zkKI$a3P22S&9u%x0poa@t4wOXsGAI~@@iivF-)-9zV8u0>&V=gtL{3VW$8bnI7s$J zS|a9fI&s-vgInW^-pm;z7(86aywdlSV(C+(eNjxToItmQFEW?)&Y@IV1%S)p@2@$4 zN8J#AEQ-YZc#3YSd@;6MA03?7I^Ji?7T*71snSvXBEWMpPJt9Yrro%BhUj@DuEMV~ zf^>0%ry;ZB-d7EOH)B+i`rObr@^lYLZA71PrLaBmD2#i%)$r7iVjG3qjwKOyFy&FO zh}w3u_pDU|Cv~v<#9JiJjZ1(Fs_Jv%uyX8Ne zh(Lx|KiMN|R=kENdeNz^>}p$2DKtd@J7tZe3AM{9+@cCDg>4GbtyHl|n)+w*2~v5V zXRX!D3Y&zBHEz9H=l5W4EUd2p3?mr(&qx+b)i1;$wt5Z{hECv~ag%es+_d`*Ke7xW zUj&;dA}to02K6()gJB+h=HbN>Y)^7eW<}kO%4G?dpLyq|2T%ex5M(|*uRhE}7Ejva z7X6wF74B&e=du$JAb!gpLI)A^`WCkoGCA5muZ~d%XJFAkxr2{*-ulSuXuWzk^b+xf zh}k}8AFnd7O38tGdV?s@n3d7ENY*-$1qNz?Kf+8Nj=N#(XmkymMN{Fh;iq=6Y(qD9 zxk*K6LvSf4~TqWvHpr>AjKcd9rx*3OEJ%PJuf=jMXX zU#&C`FBd{5x%e`F3@`U(GNcr*IGL_~$Hw?BOZMq z%K|?Nyw%$$p1S6X9vP=^{1l06fNK-c9^4J1PdK^Cs8=#jOHXkGyizT^R)E99=ZA#EA+LC zg1JwB+GX8+NevWp8FlQNjNKkp$?Vy@<289gp8s4zO3x{Z{rZx?B=H$Xf2+ZTEI8PE zh1D33!(Xi-W`%s-rZ&MxUaBYn@tdhR3u_q+@U_^oMDZ`)c#k>XhjTcV3^VW_#S>UR z7<-OkNlP;Qtwm3$yIa!_hzv91e*_JmDFvA8V-{-~cqyPqi4bOJQR)E0YgA$b;tYzb)*-aQsEiOI4N>94lJ ztslh|7QLdgPg*07)vA&F@x1t)m-cNVEzG$;OW!YJ@yoL9zOS0y1fxB?8Fh#f&urBT z)=LOnsNdTSXc*zK&5{F$)<`HO$#M(3{#0+QZ6FM-FE)A3+7BA&z@**9&lp-?E1^ce z5)*#w)=~=;`K~0?uhWj9SOMY|RSrok63QRjh+A*w=|0FhMKxf`8!&0GpIN!hh$ZU) zZX&sx-BQf5`gvKzoy3~3qg<`wM4$o7R(4FGgCX zp#kC=CC{9EDIKHN;*IRU=uX4jicc-@a$S#iKf+elInp?%Jf1a2rv-IAIg3S!2#zj7#6C!y7v^G`PAC#a6#a}Qpi z#rR`@N_P)MlT#}7V_{sJvVTNL+98~_)+wgHUJgvD+J={kBw6!tE;N>`y6cCo8o$qf z((W)Hy!o;@_;Zex?PPJWHSQ${mitn-CFV!v;X4%iK2#M3k;7f#WtQT>Kzg_Qr4qYh z3x2zE?*?bai5of4XkTi@k^CpyW5p8Di00$~d~_ zu76$SxZ7GiNZT(dENa+bW{#pY$jY5svrAPFr*2HH^we6~=W(~EETxA*wensZ)B6}^-Ulx!wL@NXeR_07!_+H%4&a06UcU7bV`%w@QMpmRRZrd2o6V6 z22#jN7YWOZU`bVJ;tH!ID||te7otsG3^_B^F}8NXy^O-Wo-gQ}vBd6vnBY&-BuTGF z8F$l8GX9BuGs%#BTM-wB#YJC48t^SgTVhllPC*0Lg4bOVp&QRruZ$hG&%J{3bEnRR z+`G>1Q!u(>z6*nd)-^b)&w-ErHiY@)SNw>S7az4INa+ME$bhaIvT3nA*(*Ubd&%j8 z3eW~jA4i$I_>GHdE6DExU}WQDYSfn=D`H}_{zGiI-nHpbEi>Q($a=B3lNut9Lh*9T zAeY{gEP5n#d5~rsXzjL!>)PYh?nsirar$)4oy7P zUnSBGjXYuqRpbfZo~5sLr-R*h0clrO=?%-}rfbs?&{AzuIA}Yw=jPW8lC9{F`uF_F zwRy8yktI6>)xWl=?$P*DzU?HZ2^7h96dn~X@qAybV9nH_5Eg1RMa!qY5}#Q1qx5VO zL3&d(cTd-r<;g zSSc;8!p5d=C9fw0pqHptCe|yJxS~|zZS-^PyHJqRWLC+#7rz2?2+Tb-USKlxKHW$V zWnBn(jLaUf*c-h0F+utz@wWX;k==TwpC8kXz@|MQRFJvY@i*0t5)cgw-Iy=;@4$6%=x7r znN*mL2htttRBmE?(5{1a8cE^H>Z`H!0DCECax&qfv@{yl>kXDe^iToiDBf-_}z=|`y@$~nO=j^q=Qq2$T5Y(q~% zqBWe^58OOsvl-_!ciXYv0$&b(!o8FkJ5sz;5WULnBJQP>OtgV?&LJ*bf`ozu( z1VO*}xhmNsEpvbn)#5hTpO#rCB!;Bwd@jH(TK;~?5gzd9QbhEQ1)=A)DgJecb+uwbMnkZ6zR{Kv{+ZE;K4PetD8&~WCw-n)M*{(RqlQ%# z`Qt__ZafRzO{ED?0TYOm%hx3LrKmUoPgZ;*TiROe*;$dFnaGVZo{4aClT;UzY2WZ{ z@=}8>+Vemo`Fj2JkrpM~8`u}`n#U%DD_dOCJQTJ!lN=jVZIAUJK*AHO>z|7TS?xs+ zIU2>C8lG?C<;-oByLl}ALi?TQ^**`uwoa)ATWYWGKe5D99U|hE0CR4dU8Tt)aj{+( zl{Uz=LT^Qs*(Q2_MW%9%{x3$JbP7Exv4?#X>2`#M^lbL-5hCwqs1rto0ZaV$?aK_;y<+A%`A{d$*1h7cxW7uwZs7Fn z;b@YiF~PU;SZEY-%2WvX0S&epXZx}zcY(=ScsDVSV(?;c;{&O4t4Up|07WPwsv z1AJ+$bs@9Dv1dL&XfaoL|3A>wKiQZ6->A^vKt*WUf3j!;k}w03e$zwK{s(0Uz(4#$ zgdt*P@8BqCs%MYK^cx-lfW-YN&@%v}Rm=<>O#wh9`ae_`(6j;oxYi#4B(0o^oRpF{ zrHq-CzLUc@8!H(bb}8!L8AAY&3BbTYMh*t{X10zt_INCRIXM1@8~9Jfe{AJ<_ze^S zq}-;1rWMq)75f9B`&<0o$L}_3208#x<9DwzdR9h&oYMdQLyJ4=S(+K}|3(es0XkH0 zG_q0#;Jg5rs{i!N!~&Ss@4f^CY+Ug)sObSKN6p9tK!?x)*y7k(=l}`RMJ)A99PpR` z1_4&(cOq-D|DXZ?uONVb5q%=G;s7L{%pdfg8m-_=Ah3!(#?m{=a+uM$rEI3CM$j#|p^K_xnW$$YS^# zpi2jU1OEorvI5e1|1SM)`>Vyw%mUcS->{m$&wsc5Bk_lA50G*m@3-vl_kXMclo z_`CjpuKrjIsG<8K`+HkXn?o>o-fP4VZ8qX>R|-z?%xss)WgO= z2iV`g#s3A=!~Pq``+o-NDQh+WcupfpdY=C3QngmK)#^ahd7eIJG0|t`u`sLE1}jV* z?#tCe+2~uRk7FL*hcBlYO(Yd=lhq4LdwpRPcLD_u1I9ZK&NO#puu^M4Zdv8krL{Hf z2OKuntj7#L*S-1q~?4218`GxjNlOp2by>1yB8(ivI7$4rC?|iJt_m9DD z>6<~&L9V0#3!$Rc=j{;#DI(vP1ASuTWF#fT^vx-)hMNMzgJGhtbzsSbNLl3swtV*j zN?BS>1^FN!Pu-?Xiec=6+B(xU26;O*KG4%YxQY&g-_kuWgmH9!e}x6&0HsQgIMaN8 z=<3G-s$;CSWBx_z*JO;J@W%#k!^H6y~o08LB8(tfVGSv-!#afb6^wfFlSj}Yr zOxnPBRryud=6!KyZlmu$GwwbA73NmuR3EI)0ir3zt?3PAbO}}$+R?d+{^kwyl{O^+ zK%|N&o@3bC^o)0GPU+rC#7@g!|{;!6zq+59+RDI$@P77^<78#gAs64 z)}}_XgHkb$Zl;jX_!wvao$F$Jq<$vnbnpOTobB8%sDS^-c3^aPQ3)t|PsKRt6#tUC zvbyXFA~imyhp~UI^$uVR`L$U+cC{&b;{)3NK@IlNIQ9A=a^bUo{#jy*G{0wXDA*3V@f>yLS5AZ|vK zS)b`*br9*Y^LKo|^Gymy&e;$3Zk?9*MBd!Gx|W(Srt=Tu?)Oo->r1?*B6p6r@pB(V zLKB-8UWAV>D410bptj@GWp>~@s`N3R%gxQeCe@DDcN>9sn2=}QNqZ3*89oHxiOrVO zln2S3w#RCeW2gv)0#Nge-S_Hz--yff7rb*uBD~A zrKEOMP_3k0fobF$z1bHJj9_4)&mW%~zq5SVk<%Cmt#2>G$&Ks+zLyC)1Dj3-0A%oLwM$TmeA;9 zXljdZ5l(252gk}83zj_^lMO^Tq0@jR!?!`b*@X%sa*MxBE@$rCJ2Q6S)-M7&bsuMn zidS(Bw6W!w{zLT`)U6KBtMrgB-R@yc%x)cCG*$c>iCe5@>PQwAl=ynyA-nfWDO*{% zOpdfGva3sp#N{{5`=d#x)qn$F29*{(L4i)JLuv=HWQ%hnYpKKsmxtA#L5w34-`@5Nv%N`cuahPN31l9T zZIkcAeW+N$bUBL)%&l^R z8QbUuS?9d9$eNXg_g3li9`2{bAG$+N7#*CalT~S;cKswOUnz>6R6XQ$dMwD3Hi&Fw z-+PE-7^v=vdZ-=DN0{Fx@%e`MA>MK-s#-crL}q87Jv1U{V86wzx@^Rgcy?r4qK)np|&eCqibXpa70j)x-l>cHqSGHiP(PNzzr z*KzD6(;U4}pECu8dXL>nL6Ni|KX1J&$fj&2jvEW#sUUc55c4~=7_<|i2T&{^H^B8V zZWG!jHQi^~4_c%@BCb>E4eEA5>psgPN6c{evbs5Mmx+b(xr0%c#aq%&aY*2M*VM!> z`EPlR&-F^M>zeP{trB`O?0q@_p)-tdX1QvoU z=}8T&gytN!2Nv;ouHJyF7yXQ`*LF%J-Ak-*JK%!Y-|Jn*KfBXq#$3!C3|W|#_X9`W zu3>{i8XfXlTKZRBXt-<7F2pU0?&DqaM}z`{=KC`x&v>1@X`70`I$}pJ?x)u;oUPp$ zpVDT^##xT$&~$cq6G1-x;F~F660L*zUAagrYnU!1VS^ZZy~tfDG$0^J}IJ zwtQzBQUje2Dw=Jfm4rdlf2$0*hZT;Z+59!`k`7r=n(yTk&aWtYFElL}ciVoLR=&P_kty-4y zeCxdX6RNp0%}_b}wW)X11fAQXil~i_`|sy&-%5cdbJM_N3r-0GxFJvRG7j%C&H4Qx zqPh0Z6Xh1yW)kGk1XG4se1)utgYkFb3X8G4HY{P~yHivhad#D+IB)O?OxzF@-2`93 zeNoxh-bRS~irq9DPy-9u>AS7pf8?B~X*`wvD*0hIjJRLN9wU4{OSzcN4QBYmnd+u3 z;YnOvP2({O9e6mc~ zjGS-%=`K8kU$PZYhubExtK<3CzB}Nu8k*a^Ge(mr0@tE~P{MiC9_VsA1-}FEh5WZUrZO98efTDsV-(oNKLbVd_HWhnk^APQ^$x#b?$(c21 z=g=!fuMK-aIND8l@oG;~u1Nh7$AV>Y{&5^QSXuKUCX%$=3A#jVgmb0A-Bf2~F9im3 zx~r+8qE6ROcnw;9U$RFh)$6*6SKU%`od7!Ckw$WRFlLOv+uw*^G{1Y-%e_tN)zy2E z8g!$Qe)L{j8Emu`gy!6Uunrr?*=?FfJM3p3TvW)BR~a&1;Uh+sa1|gK0QAGbt%pO+ zs83+@(x4>fy_lm&i!7Y|1(**d$1`*-o>7kkA1lh1D60cb0Eav^@J8LT4w=N)>oudK z2;!{rHd)y#nlm6{@3YCG>XdSfIu{R=i5srH@)!juK4{u@smGQCI2y71ZCdn$PhHr$ zwnQRBjCW(P>QBVV86QvT?1zchxQAUy?!K~3y|^;sYA?ha+)tm3rT||y+thI62!xP(jW8!;I1%;HOqN{= zla+Fu5v%jqYuuThvb3{OgbTNaydJn|89fMfC$}A7ZrXZ5R38No-pmo zHYg^T-2cW7c>Hw=o@@1|5vn?*x%+gb*>qRDNYj(49Jv{12fTt+V*>4Jq^C3HJP^fyEF)1JV~q0(O; zn$hVFs-nx5%o?erk+aMMQ2v!TZOSSG1pb#vJq+jHd7UEZgh`pj7xpQ=4|Q;OS!0yJ z`U=-pjVB^hIW%%^E%q$V)BU&qP6bo_T&|G?o=68Lis8)D!xH+$kHj~ z-VjDQ`;NZ^2qWZtZIEKxcF}unrO1o8wj_*naL{UY!X>(7^E#7_Lllqw7U3rMG2=yK zd1Fa<$!E*33|Yqf?al`GeXDl)WkB{h@8ES<8Nz|-P3Mzv))ZZ-UufgfQDKLUpja?Q z`gi4d_-QOS;QxoScYv<5>-xRh*lOG)jn&v{Y}>YNHg?0twr$(C?WD2Qlcep9=Y8Ju zjq{C+^t#r()|%_T=3Llm_WosU+8xWnI#R6@Ik2Nfzl6?rmt*_DGupCYO@@6cSvdPj z5EyuyraH>4P!CxutJ@%x@;N_Uu}`E3T3GVTAWtJzDMvTwX6Qr30x)6mx2QgvfdmRl z8|a|G^<9&LqMEdXjVv$*%nv{<1Q@`lt&j*ZfS)j@OQBP^*^$DMx4u`B)^~Z_Y?pYK z1GwufoCwB0$cL4jRqq|c^i#LD=l~5aV7<#e218uVHK?~Cb7xVYH6@Lj=^kSlyqlbf zuiuAn3+LMQ#UUSy7*?HdiyuphD#-U(nr8{NPPy5j`uXzv-!(vI&)Jz}Indh@WzbbV zgLuA>)GLpTi8j7)c78)6%Ld;T;jxZjgYK;Bp3L2<5yVK5WBvZ+t*W9JM!1md|aT?3G{_+OE3moq;6b1V0tq_I`V4jx_xCMPJ^3#oE z)~=uQ9^uW?yjMXY7E~6O2pF;UC6{+%N3Lx%u-U6+KLTHqEw#Kd8SSpm0OBW<|splVi!qN}%gV)U%dqRVNI@2q{ zRFQN7`z9V$snQBj5-W!5V@~vPh{UO%YzA(BeBVM1##Jqa8ery8I4((jMq3$<<37(ekr)J6XI&BUHo3KH-emy$)W#W;<`t{o{OIKULH9o}$SC6qwD| zbcW|Mz>pk@qrG!an*$LUBHISBnQgC%0)r)m+2gW-*mU-b#k|0kDhK89@TYmXya|31 z@pm=%dE~|e#3eW79qKA7kd^M^(uNR+okB9WHgcW`>VQp!dH@l2cgyYzPn0IO=tl%m zayr+c1lE@8oL^E);AD#r403@fX#7=k+wb%0ti~ZlcSpC;C%=qrq)fMr_ENj?U}1#E z)=KsYh68YlUuiK!85^+U`txI)E#Opa(r?CY6@Y4e+Si3~l%kOap*%2`AzuV=h8|tU zvhXxkWWcXzDW#k_XOY~7+&CaT%IZFqVDA9#oWk1hrX7&g}vjP|-f zKs(euK8+oJ)gGl=>hKZy;4V1`hA4Ct(*pe-CVB9eDVPhCM0B?rg{mKlr^s%C9tKDfx_rP9BHn(a!9Y&OMAc| zL7DZ_SU|05fIzrG9ON}~1x(mZa>p!kW*|KYV7A+{7}h{!5+cF!47@3aPy2hY*|mGJ zXFL4TGzgVC;j$*Z;3eR+#LLx)^@Yj8jX)Qu=s+@Xm3kH zJ}?%>tN8@7e5l}TNL=51R<50E(loa|#A_bU>iXWx101*>kWPUyZj0z45d~A$?mbp& z8ymbuc3mfxXoS7x*xq5V2J^F2!Yq#lZvercQaP(6WzpF{y!(-_>b*Ul${H--*TLvvYu$h?TH`E^x`yig*-kW`LcqIItMFo| z0*>@3NhO^|c#`xA*GOpSTZurOOOpDU$QO@Eg$-=kTbM#?%%781++3iMm>HQPdsI`| zIb&H?PRwPjI41W~R2tPO6dlvP@Jk_@?B6QofrYtNOtoPTFYc9|XZgM7$Wm{MFa-(N zhNN?AiXH`)+M?J25P?4Va3EA%_DHPAltRNbW>|kCUYD0?MylC9^cR8Yx;c-JnV2vB zoOHSnjh+D%E zlyi)w4=I7;lL5P{A-`#wB?uWXA0FiTL`Y!Y0t53yi^^fbf?meAD@&ua38kT3TgAiK zHL#ltgXE!}$#<^BmcAE?i7b8jR@cY;-DoKGTu4PL3|#}KL+KOJZ59N9F-cc77o7Z< zFg|dfA&BGC+^!b}H$GdIDzpj=uCJCSu$0Kf{g}8Cz;b6Hy|He#Xks93%PtI-j*heF zY*kMq4p9CEsgDt6t8``$gd%uCog-wmi{N%=VV{%d7c9O)z)`5o@C1&ZRfp``Hh z^n|W2J_F@?>iu$>Q}qhkeJ3c)rAF6&sQFY}*xa$K`(wjGWRdvyQ#Y)m!lERZI zCo7krR;R*vL{nNUaQgavGP_%kqlYX0q24enINqayn7OYZXSCj~ zY%Oza>mny+k54ZjGuqH;A4jlIHg0M&g*Q_M9zaQNGit+;Qm@w&_wEcj@|y-ynSNyO zHf?ShnIm;KU2E$OLwb)dVx#WCZlh~fZz5)$0uZ=C0Hm29W!TpVKkARPBq7M|ajVn9 zuJUUepAfrce(Z;{>5(LO#`yfmE1Sr&)g-8)a$fE;NOlRUtBa=aU(XS#tqFv-T_+~( z#iuS(AP0bRS8jWj#P!KEWr#5VaM-`obJ31`zfe+ApLfg6cY{NSACRcbwF?Qx|IO8O z=VFb%I*tmn)Amm1v+NY|f+NF~r!#Q@R)Hmdlp^B0cM)-RDX=OXlEb6ZVps#mG+zhO zLLG2z&AujmO_7N_krxvlXYV{tQQNb>$__=z{jfHoPS;gu9vQNA71x*-R&mC$g1Xv7 z1KTC%Mw7LNMZIqR?&!vO}tA4UX2?RF}^v4~6P#*KLmc2&;+&ybVUm&U* zPQ}r)H2X1ud_L9+BA7tN+`7{E>40P-l~Jr*%|cpao?s$k(Gr*Dmpy`0OVx01f`c+E zTE*Zj_6#h_0MCM?^~5c`hcE!7W=0B`S<6iyY$k>{((v1-Zw-{#GTi>;nWJinVPAnd zDq9V5P8Ccy+c9h65efo|Je+KGkbH1FD7n`T9mcO-AX!Lw1D%@M|Mh{Y7!Tr_0>w_N zaNsBDlc4a*VeTku9}{6NV%~d{%n#P5ClD}%O19qa>_`(W%MWHxmgG>Aq_b!5zU;Qz zpLN=qX>`hWU^DHQS`&Gih2m!6j8+$OhSJ=<>vxiWFU}Hfhn-RoOyN_v#A2@4I7!p_ ziK6d_g~*!E-(7^i(J9wCIo_~eAs)3HIp_xJoa(@3Xi2DETgs9t^ZJmlPdzLn@y=IW zZy--ZZ+cR95RNQE`)R0!dDl2wDiH&m@>w&`2`TAad55knwOhqJD6v}bd?wBmr^QAp zLJd@x&q7cD%f&**^E4Uaj8c}>Y2!F?WR^K&Jx21lkr)71ghYHnGx`mcMzmUQ<5vyA zRH6{x_-#_QcmM;#$VEByfvUMlHtO0104@IY2*ae4^dnsjE*o5Fz=i@O>XYesw2;&7 zJ&AiunIRV)B3b;cnZjORKpp6ZB{;x#aIA0Zy4&U4>}FxOY~;0SqSn02EDNz;kjyC# zDIM12s@G@_E9qu3?rfFi`)mdMvM*>xLosM^KEWC7eaXt~L4fRtV6{Bx81djB3JbGq zxSGCAvBp?(@mOuo2cIjRq@s$r#sUyUyXf)tvLwYPm3XtI|AX$C{r4Ec+1S)agdaKU;nclS)02NDST>+JtTc`45Cvn z(xNvePW-;<*w8w3>^q!7W<>&xJ7$N7^XDBYY}M?getBC-qwfL^YQo5?Gia8QE(bes z;xH`toF3OnhEYHH=Affg2oGTyq#(Lsw6(EW^0hx!FKAqg+S!tRHPZ`P4Z%Wtcb9XW zf1cgiJYR%oPyfEa?74))#*=MgMX^7{ZVkC;FtsB?XEsPzE#LK?pOxm!#noURM)AW_MzvEF zSi=}48D4)@-nW?O(v7!*Td@vYj=_mk*?boq*@_ovrOQwToo&aEJ->7_~OVCm%(Q;mf1~^ZwsM)@} ztIQ9z3Pp4gZdUZ*g;=8C^QJN4@|}1+Z?< zJI#c+)VIo{5!Xqb)bv)y!G^fpUvW1$=QJ+?UByEh{XP30)wS>Jjkp$t5nBzG+KLy% z>YjiCjl4|Q*bFV0jjF^PSwJN%BGQi>>&wD#J$4%$>UAG5Jq7GZo~M|BbD{Q6QndJb zPd5pkXFFo;VZ1_~;DpYV`h&lo7^4?Q>rmL#NG}%z!+?#0Q&|YfFk>uW9}q$nTzer4 zlxoE)Zmc68&3XrN=Ld5?sh6d1*CMn!S)Q$r(wFJ=54n;hGuZQSeo8;zyH>?%~JjV}L_^&Q#XIp{_4(Tq>VhHR9ml zxkL@w#mf{gAeLx(YC5d9eJ!)-JPW2*OTT+{MAULg6@K#@ZWHj`nL@+kbqyi{B==iy z2GJ>@qy7*c$~G=p$x~QU4_w2u34bGen2(Ks?#Oy;7^Ta3+LblABylYTPPPg%@4UlW zvTss!h|Ng9 z0@Yd`JZ~AlV~Jv7Pg+_VvF=q{F`rx9jTxS>&P_9t3-W<_>V;& z&9#Fja~~G*gIccmyMD4(KF9eTIQ1<+Zpn~_^2wEUkF4Y52~!FXKjrLs5=MP@^WzC` z<9;79BhZ?nj*8pev6M-up5#s|g&GM%=WVS()f9D!VaX1NUYhrVQGiEIy3us|Hx@)g zArfWnnbc5AX~Mm<=7QS+;wt7(gN=u(T2jHu8kC_`9p$=``;(mN1IJvI%PSWM(JQ2d zaBzluvKj8cS&1van!Z~noo1raJC7%nu7Czm`Z_8;7BK3~Anfx`3ckcj$p#;jrzrB$ z9PALE;H-3$K3D96@kxEWFIN4QxyLx$3v7Jc(Zebg6e|&OxrbEePhVFpLQe(m6~%=~ zmiOhL)#cWiSSr?XN4t9uirHV2c`t|#1*Mq+cacLJ0#GysrP$|6%ysw6x<4d0;aapB z(72VX7=?OjjVJ?aBb1Y);A>u_)p&(?b6VCC$~OD-h&NM ze6nN}iuS-fs~zAZoB?H^M)3s_r>=*|EM)j1m5n1lo%GlMYR_jqpqUe^CBy4-wU>3# zrtrjcDXN^kBFhz01$D@&p{OV&O(6##iL~yMgu}J3%NAL3VX1gFd1R&~b4&2kUyB}w z9&VupTARCRe|Qom6jjgL?fNbWSd`UI2F-I6Sa#;)S#;Kd+~KC>5vn@v&DFe|+}2mB zQ4;7qu*tTw=IMmN4PZb&PT-Wu;>C=sMdnj8j~~NK-Of3ne{#U09)}D*aD&hxy`geRsH+4D&z0byRkE72-)0n zYR(!t5mQcb7}i#yH_i7x zE8ej8%7h+XfNdF90Z%;jVX()$py|Ow3dJ6(67HC(C*oy+()kvCnm#dGdM?n-@F-0m z$!But7`Q)az=_Kh3*OeZlXx@dmads}stU;K?6RBNb$HWz5*gC=Zj!N@lqGAeot>ZG z->3v&{$Sa-JcgM=g5ijQS~G((EaU3g0Z&(&-4intD6fZ#)ahUM8LqH|4c_r|SgY?{ zn~uG;x_Au4!OHagPQfOqfSe_DNPXW?m(78Jv-#PJ$Z2`dk*l~C#oVDw{JZg9#T@xa zCDX*N!+{N!iZtlQ^>{DjD%Q$54+)X&*wK8Y(zVWuNl|D&W8~?fWaNqfHkQe3A$hiv zv5@PNPfQb?Mx}Z^pLqwi7?*PI zlp4tf_%I@rsPh;Fde-oi74zLm{o^wD>O3dST8a=riS-A<$6GkBrV*2?EgQ)Xqk^GE z<%~tPFsUPL?3kp$tCOrePlhvRT*>KU4axloaUUFcafIbmq2Ed&^I?t}DXT z&Cb+JJzNh(H&6^Q-#%+4jV_BwXJs9wR(I!x#dx$IH%f5{DnTsn1cjl^AVUXyQ}y)U z8^Kc#un{)c{PK4*@L0X<0Us~j4I&!EhXlCh7`+P*c zVkPZydW>H({G=EmKBf=q(VEoG`GF-Ib0j>lv{r9?SgNmVFZy+mWVR3q&#>0^v5~~H z%n5NGw@`3L0^k#ROu2IXmDSG>_2rx`>r_>YlQ{Mj2@AkdukoJIk4LeAe0=zm9q17C z`ngq?7|n#<%vNJ$3uCk!4h!x6;rts8B?5C^8Y6dOCqwlh?aUnwXDTZOy0Rxb(G^^5 zPM36Nd9p211W!7+lJ#>Dn`7qz*b;ap8t*+x{i$!l;9x&Lf67JoYu9Y^j^NYf2RPP| zP4fywDdSy80?xl=5R9WXf{sPS3YgXhc26S7*=wFO>^0lXi}mgw_unl@mEas#n)ks+ zesBIB9app!V*$BX`s3&N!Sj8QV(~%1!8;wT9O-h-W7t@mHKhc6MTH&(a41EMtuBzw zAhVh@?At>jH8DDb?G2X}!_7bba0`s+QitJ_Ui|_0wP9Y3>GIrGRr@RxZMeUvv1DVz%jQ}T)Zl*Gf<*Tb@ zlhF0dxG8k9j%C2YmzqBT6Gi-3DT?*Q?t@Yt$Qy{Iw?CVY3+}Iu-Ct4|;uU`R1e>JX zNMWKrnye7?{QDy`Gf1}bMvKIK>+J;V8!6)OyYa>+0XP3938_t2e!$B`uw20JYXf-f zuC^VhJk7z_Dm#^0c7sIf1rvMniNH>(S`oK!HP3eZVah{ND|Idqzo4HzR5r);$r<=i81yucTJ6_`FgIaCe>jdQ}3!rnk`Sz#8tn1 ziR-VRv$I*{gOpoY&i%;H8IjWL0|W!cX!75%Zyt$5WpOBDa0^;Z5>^?p2fUI zlO5Xki7blV(1TXtqJ}iF?!mIyfVrTj2RM<%)IrK+qtrnzFR=nzU6fW>{US*yKp)JW zFj4Yr>r@nF4)$BpDl zn=7{*-W{CTWB8ZGkS86c2(+3waam&VLGS_@M%1iJ7h_HG_KbQS3UE0$^tEG}?D!^G zzUM~taU4vVl#|+$o6T9$a79`h%wBFS*zR@CjWFL-#O1L%*U52j9ZHGSNFs~}j4HYC zgy+* zQ!qNXrZ!g-uO$AReWwwu2zV$q{4bx&cOMM=K>A0s!%$R{s(=l;`-kJGIKjDtCx!+N zPl10vxtihPM4w`RqKCz$(Ms8VXx!yK!~sduQuhKax;?1(D0?s3r#NYFM=< znnS8GU<{>bj(`Jh#%r7oz&02f9eE|s@P&sBie?L{7Gsce+RCVnufA0)MmaEAT*_ec zC%&0sKK$Wc^tHT|m_mLg8B}2E`FM5H}?ApLr>j>UB&w| zJKPxqcK%ptxJIPmo<0iT3;l$H@skCTp6;+p76XmbP!!$l%C3j(n6}Xt3FzsCs zU9j6X$qx-^ba^DvcNk7_oCWMK?`X3@D%9aVgEKS<=v52CN>#VCwDv}S<)`GTQ|~w0 zqc&JV)7qkywpi`n+q%>84K|q%^Pc64-b^eO&50PvQuj)XF%GdvDe&VH*8q%fZzR7&Dj1% z&0qvP{Xk$cN@ar_IEG;tu?)UipKt7*HS}XE>--l%gp-#~0iMtVQ9)*KR>AglbNgZV zKf=EcgVU?^9lIj$Gp6rqRGWhFyKU0Fiv8+M)&^Cj1?GgTlh>MDjy8)D*v=HGwp2qS z)PTT2T9>`A5JeX~Lz)~d&uc;`|7C zOzWKp#KY$Qpf!d-CsTFVyszFsa}x1+E}^(+G>9hu5=0O=nW#nwU4H3t?B+pZ%#%^t zm`-QM&Y|1^vS(-%G@A4Vd~&YF*U4uE;|AT=AgG%Wnh+gm)yJ^by<-Q#sHi*XtBDjH zW}yazH%oZx$j#Jd)B1>^vr#`qi{w`X{pT)0Rok3*{@{N3!_Bb{Rk`o_E+`DBa72sk z$|=K^$a~Ujg;LV1PAo2mXW8yY?Cd@LV*v#>dIx8Yh4f{zFeX|U3=_W!ak!^z*q3bd z1;8-g+(%-KPSVs)?!5dQ!%ge}rjh={;v#e0Vs_O0vH52X_t8cxh+XGWcx2?18swzI z)Ad-|y->$aVg`pDo zf&ZNI1ClR26Gu}JrgvW0{luX(rM!JT0&VX+)zcGBr~y|yUo4?8FhS1_RHgb74Cfnz zNo+w;F+szOB~}-%;Z?U{v^gdX#yz|4*keRcL2)hbEi>QX2O2fMtXe}xG&Z8e8*dZe z>nKBE7_L&5)dh@==f_5q!po@I2lL=jg=71si7QG%$Bj9c~d1)b3ES>vkZMllfP>8`%a*j#>#V z-fP*SIrFvoWQHEQcVzeD40aGky%mle}(FvlH=ow^6L3n9?h#pMmaelTtfC%CZ+{_ZCTetvPb+>jy+ZkZQVv z!7I@Swj?=S%29D;Ii9kbG4xe1E=C%}Q2gEYC^)4ECVQ z6e<5DJ^@T&t)}_?EhMQ}m7VX!##+Kg^^zCrZj^}U89oRsq(gTW%lQM?N`-IxsD<0) z5Q-~0S29N_zapV43+I9%I6x*5e{?nM_ib9_`h{?pV}qKqWyTVsWjwc#JfRLOD=(vnw0i_2eey6ng#&srn&aWB5p4BC$v7I5 zuIhTkz%ZA>J7a95y9fz9o=oW~(H$mbjcl+QNiQX;Wopj@X zEORNDL!%u0F*RAInfAkP9-7S@$LK)GKd*3LE^W_(^LXGSAnU{$KR57oG6*GB{&$Fd=Wj(WN={s2;%|8c@a-lxTh>FlF@z@R6| z0gHlzOW*SIjU5oXRBbWn=iBxQ5Y@%Ft3dFUT(`!fe)JSxaMMh3#B?zF3!vb2f}@mK z?6CT#Dxdkfe(W7uZNa(wslMsQvufx zxgE#DX>Kpbc=ItQqHc|ZR;COoQfJXf%<0Z;D$ zVyNDQ4Hl^oNwczVuxx3ob>@5S3NkJqL@&EMB94_qnr+Ng>kT;ft{F0hCq(=t&Tr9S z;-BsK8jU(?6(pUFpVnOjvdb5z(c;fbj0Q1eOXg9RYS1A~VNBWMGLVoIV(Y(uMUt1H z66fs#YB%xAIT6wG-l!n9>&9Y7LDYwcWCzk>4~31!f$P)wss{up|#-K2$%HZz1RonF=r zWG;{;RqCwzh6C{B*V`4%edu8Js*ICgl#kSFpkkF6n{Y|F3qN3G5p*fLlZU}vc}3(Y zOuMi*gE&3U0msK7kSUPj?UHWYF|#I@P+C=*uLp{XQ(-F8s03;7B~sVUX~a?pF2)^{ z-m6#<_cG;8Ar1%} zmZ<=|NLg8P;fE8h?K7;$oa_QZ$3xsmSSb>e9ZpD7jP7qFRRGzwTO2&WxJB1ga8~DQOnXLN-nsI9di}s*F=@)zeRLdPoM(ma!D6u%L$|B!lr^zc zbXNqN*5K2KujKis+etmVFFzKDTnx*I-JSA^3y!`!lN$zW%22ke`*1X7qrV5%Zo~2Vg z(RnFQPdj*E`$-b9!4Wy-Jy!o=n~nS;LvZ;VX}gw=;15aQIVdJOvjd!$R>2QlJMx=J zm6Yfu1bz{j(Kla`JrOVZcVh^VO0>Bg!z$Mas!$6oKP7G*#1;;HDki5E(+X~|6}uVB zq(?MXU4j;WPUHI}~AdyFINtzqb zw{3|7LCM5sQ?=bjBsd5xmm9ya6}t7{*I1Os+=MYd=QpE5_gNvQ8_k@j3E#~h9a`LvI%D(41lq z)imnw97xD__uYBNb4+L!@ZA@gk|)v($+IbhKe%?KK@`BRUJ~}T7IX0{mCk(mUg>&8 z&$RGp!^Du5icLaB*)GL+|FJ*h<Y>v?W6xvaw9l{aMZ(#IxnIqtC zC2}%uFGqA5P`7st$Y;!tF0<5gsi*Va2WTUS7xpW{cHXg`d?LdqwRQtx1=@(XN>OSZcgjiOJ2Ow))hvQ>^DtLs4)7;>g1g5Psfv@UPN zXqKAtve?Xg@I*`yQH7hAP}_a8n4KQR%%&zM!Zq zP_e~yRlODf0!SYQwoCG zB)r11v8r;AR`6%OAOKy(SQCi0hANe|v%7L+kd6M4)9VA-7=Imd@{QIi9G0;IJ6YO0 zxoP2Ch2xkf(+J(hET8%T6?0qdabb`Atb54BJjfGsHz!pm+xZgJr~^{P`97Nh%+jg+ zc+>9$RSWS)ITju@oBCLO*HK?1OXx0iiYGSM(B~-V!msA=c@fW)y5Gw$l~P7E=FbLs zSmnVs^130!&cx~tX+0}#rasoZQ;d5DPS}du&HZp7^!Am z0qYpI1p~;Anl#uAL)v2BP!k_mKaW$uc*LPcN=#dz~H>YZ6Jng5gK#m zx|^|*JLj6JI@ZA=B1GIb-=_6XO98zlcfp*js9bnlh+$ouD>Vy`V~ROf$ueeJ-sLNs zVp{XoD4;dp8G36rhTUd4;SiDfnMbZ2wfVZ~k~~Plewscq^Y+Gl(z)sKL78W-G{#j`^NHW&p1?1hU` zunu>+Pk%dNg8xlW>2m=wH?}o@cvm0#3DP6&xzs0HSzU9Q&OG!WBx;Bpm33hU=^wFy ztQCYC1#%<}>jQL0_XM!wwL#4vqmD7!jYG2_{e$#`w3}cCuf%(} ziwoQSyA{xA#&fL<&=9&T7|Qicy$d{wA!d~%R46x6xf|49fjWis~Z zq^^0w;l$a9E7n=vfC7P>(x;qwe%KrBkoSXBm$$)6ceS_oND4)xEF`-GuV^!DM04&i z*VZK;wP-`}tvdWMjmH$AEfGqgR&x!ye^IhGc7EV8hZuvfRWF6ZX)cfw zkyQ;$rUMg9i+VYi(~-_j)J&00=b+sI6ll{r~E_VBtL{S95ngdr0p=@50teGu98sbq2}s z4nVz(1&B5=*c|+UWr?!-ZINjIyrC)(q`I@|@#6YJSUr-t9VKA8_77QkJ~a|B%+XW| zgML1yX;ZOi+0&rC7DR#8VzT80<*CyrKYY-&eL6!>HD}BLrT325j%wCe@N5KwxY(jp zEVmuaL7JcC*?wGQ#ZkmY$$^i9Px@OU1;QCHn#XzVpc?!0FpRF8fhuP&I2#atpZ*qn zl+svlw?n49qq4fJn?){VGWkibe+x(RHV&UOa2T*EIJv=R#iop+%ZD)*G@Y{DnvF3>3c4a(=>@%Fb z^0K}A+7INkA|dxZUz+?UZ>>$l#C-I}TwS1s$-JQSzPe2EopOefKtBW?TK#Oy#H)8l z6}A@n%5kabDA27hfE*Y3z56VUDFnH52@wT`U%|l8oPg_jNW3H*G{ZsXtKHG5F%XEh z=eGzV!sdLj^u8XX9IB80sv1qGs2*ZM#{OS`A$!5i*TD#Fkp@jfI?IUN}cXrkq6IwHQd8CFZYwvI4zS?D&CXcIE9en-rehk$8ro}L0@(Mm{|1{YP6q{@uO=ZePQg95T)Q}$r%>-iY zIczwKMk9a&*mQ)dmcVA>5$<;7c;I%Rj52{_3u1XN-0@zlULlnq+?^Rv9%{Kq{fDe{ zp$`TIXg`yzF!9b!o8E!w${qCGuI=T526X_pf9C^pLzqnguDB{Dxq2U@E36n1L)JB% z-C%B=QE@;v!Qecq3SM%e#|1NOa{~Z|tM6_i1VTtu?9hD`la$&RyCdOHaeZ$6Zp!+U zd>hOdewj7!C@e6o%bGr)nw(JwETi6mh?d~Gep4|{bNzCaP@HdXlT@_~=CK#wd=Tkd zhtp(REgha4u;&q_gK?_LX9%tJHK*;3CjYQD7HTFpdzjl_%`IqF6g4N1- zgdMdQJ-mB-f1<%rie-UcIJ1Kv=aMWyYeqc$p5fC4;(lmKe((o0*>$aJTmF(x*u{M(BZ31};;3 ze}E%pzPzd!VVrn8(`W&)L32r_5rUlPUQXtcSh(FdFA5XCtUa0y;d0OC#>{CbHJf5k zQDPaL+nSyCutLG&)0fxqj$8lnu4bYAq=kG2JDe{zlKlk>)4+;HXs>Vo)E1#OZQRFy zYJxNmiF?FCJQO&Us0VLvR97D&OTIAJ?$lIVsO(OlzVRUg%cTrRzrWz_LEIFECb1{| z$4|$&*&9KM{O*SLocmf%>#^yJF6Esb{zf+@sZABGHWNKS=V^2G#(a3oXSpS*!N;Ij zyyNOAcr!|0@t5P3lq+Sh+k0yKW?G66x+#rgpn8f#>A!dswmC1K(=DM5+`{Rew;fEw z2_Q~ERE*o=KFA!$jjgM>;_b$%>1rY2#n1Opu|Y2m$*Q*GYGETLbHxkLU;>q8k<}HH zbetHXN#s{^)8N|?*|lVOlL6YZERH~ zQXyv4aWK~>vk;nw_y!V&HtfYm#xo=hMgf2o_umH;aWv zrGf3#cQnX^HgLG7iqR7Kh4k@9bl#Ba_52K#DEK_YUE+~b3ZzE**=ptUbO!VUl+pmH zctu$%0Ek}|EbC-~KvRR0&BsR)e_T=0^M+|Ctebl0Qk%<8O{#0vp@R{GFn`5`cfbmI zw)NqB?-JdZtay8mlbn9?^d>Bbl`i+uV6O3i+QN4yF+F~-OvWtkQL2MIUz_`Bw01b@ zB)|4Vy_2HX@2xVuXFSz=-=ZVNde?mIw(#icp2X8EW%Y;~h~5H!?llNIZA=y- zwUS&O40tjJ{uAe0E&yFVUS|;7aLTl2Mr%r|jyT8c5VAIqJT2jXU3D)Ni_-qJ_o|36 zZCUQdzCFr~$6U`Ym>a+F0I&-h?3AxdNT;>sF}HGmazT|CFES%Ss9Kgk|0*m{DV;%} z^E=txi=FcWRv13K&%-K*A@xsz)g;0i^|PyjhF+oJkOV+q`0s^Fgjp^_xBP=mO~mK% zuPJQPC$Lx0!kPM;miGo2rI529ss`|U3>_^7EwgFL)A+N-YX%vV=yeZtm-VwdtJvkY za_vfQ8DQ0$JIoJr&uT?uo8Em>lqDyM7=pXAU3&7&PmrH~&J2pa-pVO3abV6aM_P&l zj80z77m4{A{KPmfQ_f`N@ifFIHhz9vS-l8oF1;+0)zM38_O&%N>8yjsnjnuq$le(d zI$kM|Nhx{F7$e4(Dese6_}*@g%Dc7CYzd!DxkChP)s%!w3q}dx>P*XR`XRtBe8{; zL4uhes$GVT`7Q!O*ggcvPfE{?ON-F!ut#(UX+iR(4vF;KSZD;IvySqk8^-jcT5@Te z>}{%le$JZvaDW@_0hHCZsD-tRzE27Bj*6-GlN7>yw6bH>M=;K#=4OV}JCYXB=vZIr zh)ln!U9cAy@-(m9&pU;rO+d;8Ss!^Trztwa(P%vO4Z4oo@?JkH+e@BtQu<%`EG>@n zm(Bqn|xMGRmKN?VbDU4rl;M!N}hQrBMR?b)A?y&faU%Xcmcq(l$eit|rgwLlni z+pKOvxwjgH)40K(T4Z6&km%&O3%72$73!I8lDXT51{1}G0x7GbmTG08D}LY~qm1u4 zbmN9zZ140rc=ye!2vRV-(&d1n-%aeMCj&4k*q6_!Dth>5sv%eC4g1bPN*NYgjlMZzaWn#44>Z4XS!rLG>-6tGHrfm zj4li+t^j2rOWok6xJ{4&r43*CK2|12l-!_oMzaowF1bp099SnsLBnjzr?^xlvKBHB z$E!{(fqV)+Mi-+y(6eHV8~%6KaW)y;6=yhLctHCd1^^e5|TKIDS@RE#y zRdnvebSFbD5+nF*Zn9M zAQfo9hr)I`9NmZ#*p)Px_u#0QLUsil5rggKWMBiQU5nk8k}WM4E*7AAgiQ4&eRYuW zhnIuel)OJGV?}JNOed0>8Ff}k(&qx)0N+l_l*)Z1hxvycY3Z+;92i+8l{c{<%C zl|K)fy{k2l9aE1?1HTGpSB@}`cWyFr)SyZ04gFBNHUT#&xhoM?2I8DeE95~}Q?YmJ z?KjR|*`cKcVS{#QfXZZ~q{Lp4e~b}w=O|@zxOvt9vpj>*Hnig3Ap#NMA)~#cn#Y1y zdSD{g)gm<6JKt1SJE3DA#LjKhj(D1(b4>%zBYW=}c8mR?nA&skP>E8nY&0M5DbP)I zQb8=wx?9Ag0-Qf1cdNP$%)}(w=J=f4TEMSp$Xy+39YcG(09AFL)sT1DkIfuN1c*}a zrxATlK$)bXPU4x)xn64uLTJ-cA9v+AZS5uyO{uHMXaT>$v6K<$6h_W4Oy$Yy4-=_k zwLF=R%YGMfi)n~XtD>Z|M2B>R@w100JtvR4yQReL5to|>K~%00=JVkJ*7QlyYxADZ zvG0GvK1#g%c06*;?w&$<-^FDyMhYa<&IN=s8a8%iAuGczqp zLnli^J@Y?6IU7?g8$(KGJ!=cf|0lMbj)kd(Ii-!BnbEI1Ju5pcQ%Ww%U(7i^N`6WK zO2IesoG7K(3w=(4Qj$`NQu>WTCr2qysX(bnsYIzvsco&LW1?sKCj9sPFX?vXx-Wy& zv9Q*AVb*E?rq=0G{^HgdQ@)bx%zm@$tSJA`>+C7t_;r-dZ+`WDdDXK1Rr=*u+s@Qf z&-P!0yI&l_zxjaF)UUJcmH4Leiw5_HIrsnPO7{YNdnL*J`g$eI{rP_5%e^q=UMYI7 zw%6+`o$e2J?*HrhTK6~2?u|_M+QTci?v;}FhpzX^)q5SotNr!+wV&U$UY;<$Fz^06 z`BUq)=k@jZpE3N=`dWUye8_xk*g?X}lG_piR`m|ohy_VaT6fBT|+iSAz{Kc@e=SxIUc=-Iq%0TyLAo+F+~Dzk&&+v6~7guz@`w`c3{7dWK>zVFf@p_X;_ge@THr?-$ z{SN!AM~5xUoD{}vJ2-wFEN`S0%jR{m!AcVpV$$0*m!68^s^r}^#qP5GbL{!;#? z=#TP0h5x4ff98_*uUyjnJD0z^`&;>&;or(>{z@3lzY|7H{m+(!x0CE`w*1-y{+IRhvZudIs<*KHj^RHB_4@Qb{Qi~8f2Z=_+4$!) z`c3ft+w1>alz*l8f64GKb-$$k?T7kbF@GiWzU{@1BR^V-v&nfU8O{+0fJACPaW z^iQ>ySMe`>P`@?(=T8CDZ^QXh>(?>LqxHgXwlH{IB`>cA{yzNw9E~rQ-;?y$JbPhO zzlP*jeK8B&mmhlmPhr>A+EfsP-}5WZi;#jn+1u({3{4m7lnh9|@ondbE2{$?|bk0wj5 zG5C#(v%i2ocsCvT4i{OEXJ@awWq)~WTGv{4getnZe)!xEn0VA@OE8zib!iim$r$x*wYH^5%Bi;OCFl z=goWGZEV(!Z*8zt+}_TyYh5$`&|kS}lUi!Q%ddAGZtL#5=G)^4#-9|lA49(y8LUPa z;kxVn%Qle+xq8+7!@x9t2@FxEFfdhN;E2Kydpm6X*9N(WFc%o%f@UyNVEDk%P-9tP z)pEGJ4I)a;+8Lg<|BVBnZqWr!a~^#lDY8`O5jit%=kZ zNyk1ywO(HXvl`RuW?bP-uCQUezLi9%8w&tAu1!jm8Bc_6fEt|2aCz2-O~Amx{w z_>4mM1%+SP085px@VE-zCstzvZ`UOjEI(sGVzHc( zCNNdW1(i=7%4Mz3SyFie>4gto#N3?K@!@RbzD~$d%F3tC?e+vh&L_j&q`)XSTdyVb zDgRL_YCX`u;N+~*SEAwzm4q|NT29w)DmgvLllMc1=Yb5PlM|fj-~Q@%P2A+|W`jer z{mx)CIbW|f_=JqXP4W4x`E+9AbnfHybTK!x?8+i9vO9Bg=S}p 0) usage(1); diff --git a/bin/dig/dig.c b/bin/dig/dig.c index a3143c93d27..72883872127 100644 --- a/bin/dig/dig.c +++ b/bin/dig/dig.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dig.c,v 1.237 2010-05-13 00:40:46 marka Exp $ */ +/* $Id: dig.c,v 1.237.124.3 2011-03-11 06:46:58 marka Exp $ */ /*! \file */ @@ -44,8 +44,6 @@ #include #include -#include - #include #define ADD_STRING(b, s) { \ @@ -479,8 +477,6 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) { if (!query->lookup->comments) flags |= DNS_MESSAGETEXTFLAG_NOCOMMENTS; - result = ISC_R_SUCCESS; - result = isc_buffer_allocate(mctx, &buf, len); check_result(result, "isc_buffer_allocate"); @@ -1437,30 +1433,6 @@ preparse_args(int argc, char **argv) { } } -static void -getaddresses(dig_lookup_t *lookup, const char *host) { - isc_result_t result; - isc_sockaddr_t sockaddrs[DIG_MAX_ADDRESSES]; - isc_netaddr_t netaddr; - int count, i; - dig_server_t *srv; - char tmp[ISC_NETADDR_FORMATSIZE]; - - result = bind9_getaddresses(host, 0, sockaddrs, - DIG_MAX_ADDRESSES, &count); - if (result != ISC_R_SUCCESS) - fatal("couldn't get address for '%s': %s", - host, isc_result_totext(result)); - - for (i = 0; i < count; i++) { - isc_netaddr_fromsockaddr(&netaddr, &sockaddrs[i]); - isc_netaddr_format(&netaddr, tmp, sizeof(tmp)); - srv = make_server(tmp, host); - ISC_LIST_APPEND(lookup->my_server_list, srv, link); - } - addresscount = count; -} - static void parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only, int argc, char **argv) { @@ -1555,7 +1527,7 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only, if (strncmp(rv[0], "%", 1) == 0) break; if (strncmp(rv[0], "@", 1) == 0) { - getaddresses(lookup, &rv[0][1]); + addresscount = getaddresses(lookup, &rv[0][1]); } else if (rv[0][0] == '+') { plus_option(&rv[0][1], is_batchfile, lookup); @@ -1592,7 +1564,6 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only, (isc_textregion_t *)&tr); if (result == ISC_R_SUCCESS && rdtype == dns_rdatatype_ixfr) { - result = DNS_R_UNKNOWN; fprintf(stderr, ";; Warning, " "ixfr requires a " "serial number\n"); diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index e92bc6edcee..319ba3e7472 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dighost.c,v 1.336 2010-12-09 00:54:33 marka Exp $ */ +/* $Id: dighost.c,v 1.336.22.4 2011-03-11 06:46:58 marka Exp $ */ /*! \file * \note @@ -566,10 +566,8 @@ make_server(const char *servname, const char *userarg) { if (srv == NULL) fatal("memory allocation failure in %s:%d", __FILE__, __LINE__); - strncpy(srv->servername, servname, MXNAME); - strncpy(srv->userarg, userarg, MXNAME); - srv->servername[MXNAME-1] = 0; - srv->userarg[MXNAME-1] = 0; + strlcpy(srv->servername, servname, MXNAME); + strlcpy(srv->userarg, userarg, MXNAME); ISC_LINK_INIT(srv, link); return (srv); } @@ -1767,8 +1765,7 @@ followup_lookup(dns_message_t *msg, dig_query_t *query, dns_section_t section) dns_rdata_freestruct(&ns); /* Initialize lookup if we've not yet */ - debug("found NS %d %s", numLookups, namestr); - numLookups++; + debug("found NS %s", namestr); if (!success) { success = ISC_TRUE; lookup_counter++; @@ -1790,9 +1787,8 @@ followup_lookup(dns_message_t *msg, dig_query_t *query, dns_section_t section) domain = dns_fixedname_name(&lookup->fdomain); dns_name_copy(name, domain, NULL); } - srv = make_server(namestr, namestr); - debug("adding server %s", srv->servername); - ISC_LIST_APPEND(lookup->my_server_list, srv, link); + debug("adding server %s", namestr); + numLookups += getaddresses(lookup, namestr); dns_rdata_reset(&rdata); } } @@ -1808,17 +1804,25 @@ followup_lookup(dns_message_t *msg, dig_query_t *query, dns_section_t section) if (numLookups > 1) { isc_uint32_t i, j; dig_serverlist_t my_server_list; + dig_server_t *next; ISC_LIST_INIT(my_server_list); - for (i = numLookups; i > 0; i--) { + i = numLookups; + for (srv = ISC_LIST_HEAD(lookup->my_server_list); + srv != NULL; + srv = ISC_LIST_HEAD(lookup->my_server_list)) { + INSIST(i > 0); isc_random_get(&j); j %= i; - srv = ISC_LIST_HEAD(lookup->my_server_list); - while (j-- > 0) - srv = ISC_LIST_NEXT(srv, link); + next = ISC_LIST_NEXT(srv, link); + while (j-- > 0 && next != NULL) { + srv = next; + next = ISC_LIST_NEXT(srv, link); + } ISC_LIST_DEQUEUE(lookup->my_server_list, srv, link); ISC_LIST_APPEND(my_server_list, srv, link); + i--; } ISC_LIST_APPENDLIST(lookup->my_server_list, my_server_list, link); @@ -3541,6 +3545,31 @@ get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) { return (ISC_R_SUCCESS); } +int +getaddresses(dig_lookup_t *lookup, const char *host) { + isc_result_t result; + isc_sockaddr_t sockaddrs[DIG_MAX_ADDRESSES]; + isc_netaddr_t netaddr; + int count, i; + dig_server_t *srv; + char tmp[ISC_NETADDR_FORMATSIZE]; + + result = bind9_getaddresses(host, 0, sockaddrs, + DIG_MAX_ADDRESSES, &count); + if (result != ISC_R_SUCCESS) + fatal("couldn't get address for '%s': %s", + host, isc_result_totext(result)); + + for (i = 0; i < count; i++) { + isc_netaddr_fromsockaddr(&netaddr, &sockaddrs[i]); + isc_netaddr_format(&netaddr, tmp, sizeof(tmp)); + srv = make_server(tmp, host); + ISC_LIST_APPEND(lookup->my_server_list, srv, link); + } + + return count; +} + /*% * Initiate either a TCP or UDP lookup */ diff --git a/bin/dig/host.c b/bin/dig/host.c index 13569f63ac9..c7a8e0eb575 100644 --- a/bin/dig/host.c +++ b/bin/dig/host.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: host.c,v 1.124 2010-11-16 05:38:30 marka Exp $ */ +/* $Id: host.c,v 1.124.40.3 2011-03-11 06:46:59 marka Exp $ */ /*! \file */ @@ -521,6 +521,7 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) { if ((msg->flags & DNS_MESSAGEFLAG_CD) != 0) { printf("%scd", did_flag ? " " : ""); did_flag = ISC_TRUE; + POST(did_flag); } printf("; QUERY: %u, ANSWER: %u, " "AUTHORITY: %u, ADDITIONAL: %u\n", @@ -824,8 +825,8 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) { if (isc_commandline_index >= argc) show_usage(); - strncpy(hostname, argv[isc_commandline_index], sizeof(hostname)); - hostname[sizeof(hostname)-1]=0; + strlcpy(hostname, argv[isc_commandline_index], sizeof(hostname)); + if (argc > isc_commandline_index + 1) { set_nameserver(argv[isc_commandline_index+1]); debug("server is %s", argv[isc_commandline_index+1]); diff --git a/bin/dig/include/dig/dig.h b/bin/dig/include/dig/dig.h index c0f778b5f14..2db5de552fc 100644 --- a/bin/dig/include/dig/dig.h +++ b/bin/dig/include/dig/dig.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dig.h,v 1.111 2009-09-29 15:06:06 fdupont Exp $ */ +/* $Id: dig.h,v 1.111.306.2 2011-02-28 01:19:58 tbox Exp $ */ #ifndef DIG_H #define DIG_H @@ -288,6 +288,9 @@ extern int idnoptions; isc_result_t get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr); +int +getaddresses(dig_lookup_t *lookup, const char *host); + isc_result_t get_reverse(char *reverse, size_t len, char *value, isc_boolean_t ip6_int, isc_boolean_t strict); diff --git a/bin/dig/nslookup.c b/bin/dig/nslookup.c index 0d368b15c80..e327c0f7fce 100644 --- a/bin/dig/nslookup.c +++ b/bin/dig/nslookup.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: nslookup.c,v 1.127 2010-11-17 23:47:08 tbox Exp $ */ +/* $Id: nslookup.c,v 1.127.38.2 2011-02-28 01:19:58 tbox Exp $ */ #include @@ -535,12 +535,6 @@ testclass(char *typetext) { } } -static void -safecpy(char *dest, char *src, int size) { - strncpy(dest, src, size); - dest[size-1] = 0; -} - static void set_port(const char *value) { isc_uint32_t n; @@ -571,34 +565,34 @@ setoption(char *opt) { show_settings(ISC_TRUE, ISC_FALSE); } else if (strncasecmp(opt, "class=", 6) == 0) { if (testclass(&opt[6])) - safecpy(defclass, &opt[6], sizeof(defclass)); + strlcpy(defclass, &opt[6], sizeof(defclass)); } else if (strncasecmp(opt, "cl=", 3) == 0) { if (testclass(&opt[3])) - safecpy(defclass, &opt[3], sizeof(defclass)); + strlcpy(defclass, &opt[3], sizeof(defclass)); } else if (strncasecmp(opt, "type=", 5) == 0) { if (testtype(&opt[5])) - safecpy(deftype, &opt[5], sizeof(deftype)); + strlcpy(deftype, &opt[5], sizeof(deftype)); } else if (strncasecmp(opt, "ty=", 3) == 0) { if (testtype(&opt[3])) - safecpy(deftype, &opt[3], sizeof(deftype)); + strlcpy(deftype, &opt[3], sizeof(deftype)); } else if (strncasecmp(opt, "querytype=", 10) == 0) { if (testtype(&opt[10])) - safecpy(deftype, &opt[10], sizeof(deftype)); + strlcpy(deftype, &opt[10], sizeof(deftype)); } else if (strncasecmp(opt, "query=", 6) == 0) { if (testtype(&opt[6])) - safecpy(deftype, &opt[6], sizeof(deftype)); + strlcpy(deftype, &opt[6], sizeof(deftype)); } else if (strncasecmp(opt, "qu=", 3) == 0) { if (testtype(&opt[3])) - safecpy(deftype, &opt[3], sizeof(deftype)); + strlcpy(deftype, &opt[3], sizeof(deftype)); } else if (strncasecmp(opt, "q=", 2) == 0) { if (testtype(&opt[2])) - safecpy(deftype, &opt[2], sizeof(deftype)); + strlcpy(deftype, &opt[2], sizeof(deftype)); } else if (strncasecmp(opt, "domain=", 7) == 0) { - safecpy(domainopt, &opt[7], sizeof(domainopt)); + strlcpy(domainopt, &opt[7], sizeof(domainopt)); set_search_domain(domainopt); usesearch = ISC_TRUE; } else if (strncasecmp(opt, "do=", 3) == 0) { - safecpy(domainopt, &opt[3], sizeof(domainopt)); + strlcpy(domainopt, &opt[3], sizeof(domainopt)); set_search_domain(domainopt); usesearch = ISC_TRUE; } else if (strncasecmp(opt, "port=", 5) == 0) { @@ -677,11 +671,11 @@ addlookup(char *opt) { lookup = make_empty_lookup(); if (get_reverse(store, sizeof(store), opt, lookup->ip6_int, ISC_TRUE) == ISC_R_SUCCESS) { - safecpy(lookup->textname, store, sizeof(lookup->textname)); + strlcpy(lookup->textname, store, sizeof(lookup->textname)); lookup->rdtype = dns_rdatatype_ptr; lookup->rdtypeset = ISC_TRUE; } else { - safecpy(lookup->textname, opt, sizeof(lookup->textname)); + strlcpy(lookup->textname, opt, sizeof(lookup->textname)); lookup->rdtype = rdtype; lookup->rdtypeset = ISC_TRUE; } diff --git a/bin/dnssec/dnssec-keyfromlabel.8 b/bin/dnssec/dnssec-keyfromlabel.8 index d8c19f2e527..a0fd69351bd 100644 --- a/bin/dnssec/dnssec-keyfromlabel.8 +++ b/bin/dnssec/dnssec-keyfromlabel.8 @@ -12,7 +12,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: dnssec-keyfromlabel.8,v 1.18.14.1.2.1 2011-06-09 03:41:05 tbox Exp $ +.\" $Id: dnssec-keyfromlabel.8,v 1.18.14.2 2011-02-28 02:37:42 tbox Exp $ .\" .hy 0 .ad l diff --git a/bin/dnssec/dnssec-keyfromlabel.c b/bin/dnssec/dnssec-keyfromlabel.c index 323f9187c64..1323ed71869 100644 --- a/bin/dnssec/dnssec-keyfromlabel.c +++ b/bin/dnssec/dnssec-keyfromlabel.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2007-2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssec-keyfromlabel.c,v 1.32 2010-12-23 04:07:59 marka Exp $ */ +/* $Id: dnssec-keyfromlabel.c,v 1.32.14.2 2011-03-12 04:59:14 tbox Exp $ */ /*! \file */ @@ -518,6 +518,9 @@ main(int argc, char **argv) { { isc_buffer_clear(&buf); ret = dst_key_buildfilename(key, 0, directory, &buf); + if (ret != ISC_R_SUCCESS) + fatal("dst_key_buildfilename returned: %s\n", + isc_result_totext(ret)); if (exact) fatal("%s: %s already exists\n", program, filename); @@ -542,6 +545,9 @@ main(int argc, char **argv) { isc_buffer_clear(&buf); ret = dst_key_buildfilename(key, 0, NULL, &buf); + if (ret != ISC_R_SUCCESS) + fatal("dst_key_buildfilename returned: %s\n", + isc_result_totext(ret)); printf("%s\n", filename); dst_key_free(&key); diff --git a/bin/dnssec/dnssec-keyfromlabel.docbook b/bin/dnssec/dnssec-keyfromlabel.docbook index be38a246578..c731e6eab60 100644 --- a/bin/dnssec/dnssec-keyfromlabel.docbook +++ b/bin/dnssec/dnssec-keyfromlabel.docbook @@ -17,7 +17,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + February 8, 2008 diff --git a/bin/dnssec/dnssec-keyfromlabel.html b/bin/dnssec/dnssec-keyfromlabel.html index 2b1b23690bb..c939ed68d75 100644 --- a/bin/dnssec/dnssec-keyfromlabel.html +++ b/bin/dnssec/dnssec-keyfromlabel.html @@ -13,7 +13,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + diff --git a/bin/dnssec/dnssec-keygen.c b/bin/dnssec/dnssec-keygen.c index f369326aaf8..9a93ee3c941 100644 --- a/bin/dnssec/dnssec-keygen.c +++ b/bin/dnssec/dnssec-keygen.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -29,7 +29,7 @@ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssec-keygen.c,v 1.115 2010-12-23 04:07:59 marka Exp $ */ +/* $Id: dnssec-keygen.c,v 1.115.14.2 2011-03-12 04:59:14 tbox Exp $ */ /*! \file */ @@ -975,12 +975,15 @@ main(int argc, char **argv) { if (verbose > 0) { isc_buffer_clear(&buf); - dst_key_buildfilename(key, 0, directory, &buf); - fprintf(stderr, - "%s: %s already exists, or might " - "collide with another key upon " - "revokation. Generating a new key\n", - program, filename); + ret = dst_key_buildfilename(key, 0, + directory, &buf); + if (ret == ISC_R_SUCCESS) + fprintf(stderr, + "%s: %s already exists, or " + "might collide with another " + "key upon revokation. " + "Generating a new key\n", + program, filename); } dst_key_free(&key); @@ -1001,6 +1004,9 @@ main(int argc, char **argv) { isc_buffer_clear(&buf); ret = dst_key_buildfilename(key, 0, NULL, &buf); + if (ret != ISC_R_SUCCESS) + fatal("dst_key_buildfilename returned: %s\n", + isc_result_totext(ret)); printf("%s\n", filename); dst_key_free(&key); if (prevkey != NULL) diff --git a/bin/dnssec/dnssec-settime.8 b/bin/dnssec/dnssec-settime.8 index 4390494474c..cbe4092e52a 100644 --- a/bin/dnssec/dnssec-settime.8 +++ b/bin/dnssec/dnssec-settime.8 @@ -1,4 +1,4 @@ -.\" Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") +.\" Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC") .\" .\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -12,7 +12,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: dnssec-settime.8,v 1.14 2010-08-17 01:15:26 tbox Exp $ +.\" $Id: dnssec-settime.8,v 1.14.70.1 2011-03-22 02:37:44 tbox Exp $ .\" .hy 0 .ad l @@ -59,7 +59,7 @@ and .RS 4 Force an update of an old\-format key with no metadata fields. Without this option, \fBdnssec\-settime\fR -will fail when attempting to update a legacy key. With this option, the key will be recreated in the new format, but with the original key data retained. The key's creation date will be set to the present time. +will fail when attempting to update a legacy key. With this option, the key will be recreated in the new format, but with the original key data retained. The key's creation date will be set to the present time. If no other values are specified, then the key's publication and activation dates will also be set to the present time. .RE .PP \-K \fIdirectory\fR @@ -162,5 +162,5 @@ RFC 5011. .PP Internet Systems Consortium .SH "COPYRIGHT" -Copyright \(co 2009, 2010 Internet Systems Consortium, Inc. ("ISC") +Copyright \(co 2009\-2011 Internet Systems Consortium, Inc. ("ISC") .br diff --git a/bin/dnssec/dnssec-settime.c b/bin/dnssec/dnssec-settime.c index 364e2ab5926..a1258ef30cd 100644 --- a/bin/dnssec/dnssec-settime.c +++ b/bin/dnssec/dnssec-settime.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssec-settime.c,v 1.28 2010-12-19 07:29:36 each Exp $ */ +/* $Id: dnssec-settime.c,v 1.28.16.3 2011-06-02 20:24:11 each Exp $ */ /*! \file */ @@ -81,8 +81,7 @@ usage(void) { "deletion date\n"); fprintf(stderr, "Printing options:\n"); fprintf(stderr, " -p C/P/A/R/I/D/all: print a particular time " - "value or values " - "[default: all]\n"); + "value or values\n"); fprintf(stderr, " -u: print times in unix epoch " "format\n"); fprintf(stderr, "Output:\n"); @@ -513,6 +512,16 @@ main(int argc, char **argv) { else if (unsetdel) dst_key_unsettime(key, DST_TIME_DELETE); + /* + * No metadata changes were made but we're forcing an upgrade + * to the new format anyway: use "-P now -A now" as the default + */ + if (force && !changed) { + dst_key_settime(key, DST_TIME_PUBLISH, now); + dst_key_settime(key, DST_TIME_ACTIVATE, now); + changed = ISC_TRUE; + } + /* * Print out time values, if -p was used. */ diff --git a/bin/dnssec/dnssec-settime.docbook b/bin/dnssec/dnssec-settime.docbook index 1096cb7ec5a..daf720ba936 100644 --- a/bin/dnssec/dnssec-settime.docbook +++ b/bin/dnssec/dnssec-settime.docbook @@ -2,7 +2,7 @@ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" []> - + July 15, 2009 @@ -38,6 +38,7 @@ 2009 2010 + 2011 Internet Systems Consortium, Inc. ("ISC") @@ -98,7 +99,9 @@ fail when attempting to update a legacy key. With this option, the key will be recreated in the new format, but with the original key data retained. The key's creation date will be - set to the present time. + set to the present time. If no other values are specified, + then the key's publication and activation dates will also + be set to the present time. diff --git a/bin/dnssec/dnssec-settime.html b/bin/dnssec/dnssec-settime.html index 84c8dde49a1..baca8f56ece 100644 --- a/bin/dnssec/dnssec-settime.html +++ b/bin/dnssec/dnssec-settime.html @@ -1,5 +1,5 @@ - + @@ -31,7 +31,7 @@

dnssec-settime [-f] [-K directory] [-P date/offset] [-A date/offset] [-R date/offset] [-I date/offset] [-D date/offset] [-h] [-v level] [-E engine] {keyfile}

-

DESCRIPTION

+

DESCRIPTION

dnssec-settime reads a DNSSEC private key file and sets the key timing metadata as specified by the -P, -A, @@ -56,7 +56,7 @@

-

OPTIONS

+

OPTIONS

-f

@@ -65,7 +65,9 @@ fail when attempting to update a legacy key. With this option, the key will be recreated in the new format, but with the original key data retained. The key's creation date will be - set to the present time. + set to the present time. If no other values are specified, + then the key's publication and activation dates will also + be set to the present time.

-K directory

@@ -87,7 +89,7 @@

-

TIMING OPTIONS

+

TIMING OPTIONS

Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '-', it is interpreted as @@ -166,7 +168,7 @@

-

PRINTING OPTIONS

+

PRINTING OPTIONS

dnssec-settime can also be used to print the timing metadata associated with a key. @@ -192,7 +194,7 @@

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, @@ -200,7 +202,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/bin/dnssec/dnssec-signzone.c b/bin/dnssec/dnssec-signzone.c index 3997a135b46..fe02d2e6bce 100644 --- a/bin/dnssec/dnssec-signzone.c +++ b/bin/dnssec/dnssec-signzone.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -29,7 +29,7 @@ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssec-signzone.c,v 1.262 2010-06-03 23:51:04 tbox Exp $ */ +/* $Id: dnssec-signzone.c,v 1.262.110.9 2011-07-19 23:47:12 tbox Exp $ */ /*! \file */ @@ -338,7 +338,7 @@ keythatsigned(dns_rdata_rrsig_t *rrsig) { } else { dns_dnsseckey_create(mctx, &pubkey, &key); } - key->force_publish = ISC_TRUE; + key->force_publish = ISC_FALSE; key->force_sign = ISC_FALSE; ISC_LIST_APPEND(keylist, key, link); @@ -486,32 +486,32 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name, if (!expired) keep = ISC_TRUE; } else if (issigningkey(key)) { - if (!expired && setverifies(name, set, key->key, - &sigrdata)) { + if (!expired && rrsig.originalttl == set->ttl && + setverifies(name, set, key->key, &sigrdata)) { vbprintf(2, "\trrsig by %s retained\n", sigstr); keep = ISC_TRUE; wassignedby[key->index] = ISC_TRUE; nowsignedby[key->index] = ISC_TRUE; } else { vbprintf(2, "\trrsig by %s dropped - %s\n", - sigstr, - expired ? "expired" : - "failed to verify"); + sigstr, expired ? "expired" : + rrsig.originalttl != set->ttl ? + "ttl change" : "failed to verify"); wassignedby[key->index] = ISC_TRUE; resign = ISC_TRUE; } } else if (iszonekey(key)) { - if (!expired && setverifies(name, set, key->key, - &sigrdata)) { + if (!expired && rrsig.originalttl == set->ttl && + setverifies(name, set, key->key, &sigrdata)) { vbprintf(2, "\trrsig by %s retained\n", sigstr); keep = ISC_TRUE; wassignedby[key->index] = ISC_TRUE; nowsignedby[key->index] = ISC_TRUE; } else { vbprintf(2, "\trrsig by %s dropped - %s\n", - sigstr, - expired ? "expired" : - "failed to verify"); + sigstr, expired ? "expired" : + rrsig.originalttl != set->ttl ? + "ttl change" : "failed to verify"); wassignedby[key->index] = ISC_TRUE; } } else if (!expired) { @@ -522,7 +522,8 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name, } if (keep) { - nowsignedby[key->index] = ISC_TRUE; + if (key != NULL) + nowsignedby[key->index] = ISC_TRUE; INCSTAT(nretained); if (sigset.ttl != ttl) { vbprintf(2, "\tfixing ttl %s\n", sigstr); @@ -1387,6 +1388,13 @@ verifyset(dns_rdataset_t *rdataset, dns_name_t *name, dns_dbnode_t *node, dns_rdataset_current(&sigrdataset, &rdata); dns_rdata_tostruct(&rdata, &sig, NULL); + if (rdataset->ttl != sig.originalttl) { + dns_name_format(name, namebuf, sizeof(namebuf)); + type_format(rdataset->type, typebuf, sizeof(typebuf)); + fprintf(stderr, "TTL mismatch for %s %s keytag %u\n", + namebuf, typebuf, sig.keyid); + continue; + } if ((set_algorithms[sig.algorithm] != 0) || (ksk_algorithms[sig.algorithm] == 0)) continue; @@ -1443,14 +1451,14 @@ verifynode(dns_name_t *name, dns_dbnode_t *node, isc_boolean_t delegation, /*% * Verify that certain things are sane: * - * The apex has a DNSKEY record with at least one KSK, and at least + * The apex has a DNSKEY RRset with at least one KSK, and at least * one ZSK if the -x flag was not used. * - * The DNSKEY record was signed with at least one of the KSKs in this - * set. + * The DNSKEY record was signed with at least one of the KSKs in + * the DNSKEY RRset. * * The rest of the zone was signed with at least one of the ZSKs - * present in the DNSKEY RRSET. + * present in the DNSKEY RRset. */ static void verifyzone(void) { @@ -1461,13 +1469,12 @@ verifyzone(void) { dns_name_t *name, *nextname, *zonecut; dns_rdata_dnskey_t dnskey; dns_rdata_t rdata = DNS_RDATA_INIT; - dns_rdataset_t rdataset; - dns_rdataset_t sigrdataset; + dns_rdataset_t keyset, soaset; + dns_rdataset_t keysigs, soasigs; int i; isc_boolean_t done = ISC_FALSE; isc_boolean_t first = ISC_TRUE; isc_boolean_t goodksk = ISC_FALSE; - isc_boolean_t goodzsk = ISC_FALSE; isc_result_t result; unsigned char revoked_ksk[256]; unsigned char revoked_zsk[256]; @@ -1489,18 +1496,30 @@ verifyzone(void) { fatal("failed to find the zone's origin: %s", isc_result_totext(result)); - dns_rdataset_init(&rdataset); - dns_rdataset_init(&sigrdataset); + dns_rdataset_init(&keyset); + dns_rdataset_init(&keysigs); + dns_rdataset_init(&soaset); + dns_rdataset_init(&soasigs); + result = dns_db_findrdataset(gdb, node, gversion, dns_rdatatype_dnskey, - 0, 0, &rdataset, &sigrdataset); - dns_db_detachnode(gdb, &node); + 0, 0, &keyset, &keysigs); if (result != ISC_R_SUCCESS) fatal("cannot find DNSKEY rrset\n"); - if (!dns_rdataset_isassociated(&sigrdataset)) + result = dns_db_findrdataset(gdb, node, gversion, + dns_rdatatype_soa, + 0, 0, &soaset, &soasigs); + dns_db_detachnode(gdb, &node); + if (result != ISC_R_SUCCESS) + fatal("cannot find SOA rrset\n"); + + if (!dns_rdataset_isassociated(&keysigs)) fatal("cannot find DNSKEY RRSIGs\n"); + if (!dns_rdataset_isassociated(&soasigs)) + fatal("cannot find SOA RRSIGs\n"); + memset(revoked_ksk, 0, sizeof(revoked_ksk)); memset(revoked_zsk, 0, sizeof(revoked_zsk)); memset(standby_ksk, 0, sizeof(standby_ksk)); @@ -1517,10 +1536,10 @@ verifyzone(void) { * and one ZSK per algorithm in it (or, if -x was used, one * self-signing KSK). */ - for (result = dns_rdataset_first(&rdataset); + for (result = dns_rdataset_first(&keyset); result == ISC_R_SUCCESS; - result = dns_rdataset_next(&rdataset)) { - dns_rdataset_current(&rdataset, &rdata); + result = dns_rdataset_next(&keyset)) { + dns_rdataset_current(&keyset, &rdata); result = dns_rdata_tostruct(&rdata, &dnskey, NULL); check_result(result, "dns_rdata_tostruct"); @@ -1528,8 +1547,8 @@ verifyzone(void) { ; else if ((dnskey.flags & DNS_KEYFLAG_REVOKE) != 0) { if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0 && - !dns_dnssec_selfsigns(&rdata, gorigin, &rdataset, - &sigrdataset, ISC_FALSE, + !dns_dnssec_selfsigns(&rdata, gorigin, &keyset, + &keysigs, ISC_FALSE, mctx)) { char namebuf[DNS_NAME_FORMATSIZE]; char buffer[1024]; @@ -1551,8 +1570,8 @@ verifyzone(void) { revoked_zsk[dnskey.algorithm] != 255) revoked_zsk[dnskey.algorithm]++; } else if ((dnskey.flags & DNS_KEYFLAG_KSK) != 0) { - if (dns_dnssec_selfsigns(&rdata, gorigin, &rdataset, - &sigrdataset, ISC_FALSE, mctx)) { + if (dns_dnssec_selfsigns(&rdata, gorigin, &keyset, + &keysigs, ISC_FALSE, mctx)) { if (ksk_algorithms[dnskey.algorithm] != 255) ksk_algorithms[dnskey.algorithm]++; goodksk = ISC_TRUE; @@ -1560,8 +1579,8 @@ verifyzone(void) { if (standby_ksk[dnskey.algorithm] != 255) standby_ksk[dnskey.algorithm]++; } - } else if (dns_dnssec_selfsigns(&rdata, gorigin, &rdataset, - &sigrdataset, ISC_FALSE, + } else if (dns_dnssec_selfsigns(&rdata, gorigin, &keyset, + &keysigs, ISC_FALSE, mctx)) { #ifdef ALLOW_KSKLESS_ZONES if (self_algorithms[dnskey.algorithm] != 255) @@ -1569,7 +1588,10 @@ verifyzone(void) { #endif if (zsk_algorithms[dnskey.algorithm] != 255) zsk_algorithms[dnskey.algorithm]++; - goodzsk = ISC_TRUE; + } else if (dns_dnssec_signs(&rdata, gorigin, &soaset, + &soasigs, ISC_FALSE, mctx)) { + if (zsk_algorithms[dnskey.algorithm] != 255) + zsk_algorithms[dnskey.algorithm]++; } else { if (standby_zsk[dnskey.algorithm] != 255) standby_zsk[dnskey.algorithm]++; @@ -1580,7 +1602,9 @@ verifyzone(void) { dns_rdata_freestruct(&dnskey); dns_rdata_reset(&rdata); } - dns_rdataset_disassociate(&sigrdataset); + dns_rdataset_disassociate(&keysigs); + dns_rdataset_disassociate(&soaset); + dns_rdataset_disassociate(&soasigs); #ifdef ALLOW_KSKLESS_ZONES if (!goodksk) { @@ -1595,7 +1619,7 @@ verifyzone(void) { } #else if (!goodksk) { - fatal("no self signed KSK's found"); + fatal("No self signed KSK's found"); } #endif @@ -1669,7 +1693,7 @@ verifyzone(void) { dns_name_copy(name, zonecut, NULL); isdelegation = ISC_TRUE; } - verifynode(name, node, isdelegation, &rdataset, + verifynode(name, node, isdelegation, &keyset, ksk_algorithms, bad_algorithms); result = dns_dbiterator_next(dbiter); nextnode = NULL; @@ -1706,13 +1730,13 @@ verifyzone(void) { result = dns_dbiterator_next(dbiter) ) { result = dns_dbiterator_current(dbiter, &node, name); check_dns_dbiterator_current(result); - verifynode(name, node, ISC_FALSE, &rdataset, + verifynode(name, node, ISC_FALSE, &keyset, ksk_algorithms, bad_algorithms); dns_db_detachnode(gdb, &node); } dns_dbiterator_destroy(&dbiter); - dns_rdataset_disassociate(&rdataset); + dns_rdataset_disassociate(&keyset); /* * If we made it this far, we have what we consider a properly signed @@ -2192,6 +2216,7 @@ addnsec3param(const unsigned char *salt, size_t salt_length, result = dns_rdata_fromstruct(&rdata, gclass, dns_rdatatype_nsec3param, &nsec3param, &b); + check_result(result, "dns_rdata_fromstruct()"); rdatalist.rdclass = rdata.rdclass; rdatalist.type = rdata.type; rdatalist.covers = 0; @@ -2801,7 +2826,7 @@ loadzonekeys(isc_boolean_t preserve_keys, isc_boolean_t load_public) { } keyttl = rdataset.ttl; - /* Load keys corresponding to the existing DNSKEY RRset */ + /* Load keys corresponding to the existing DNSKEY RRset. */ result = dns_dnssec_keylistfromrdataset(gorigin, directory, mctx, &rdataset, &keysigs, &soasigs, preserve_keys, load_public, @@ -3320,28 +3345,36 @@ removetempfile(void) { } static void -print_stats(isc_time_t *timer_start, isc_time_t *timer_finish) { - isc_uint64_t runtime_us; /* Runtime in microseconds */ - isc_uint64_t runtime_ms; /* Runtime in milliseconds */ +print_stats(isc_time_t *timer_start, isc_time_t *timer_finish, + isc_time_t *sign_start, isc_time_t *sign_finish) +{ + isc_uint64_t time_us; /* Time in microseconds */ + isc_uint64_t time_ms; /* Time in milliseconds */ isc_uint64_t sig_ms; /* Signatures per millisecond */ - runtime_us = isc_time_microdiff(timer_finish, timer_start); - printf("Signatures generated: %10d\n", nsigned); printf("Signatures retained: %10d\n", nretained); printf("Signatures dropped: %10d\n", ndropped); printf("Signatures successfully verified: %10d\n", nverified); printf("Signatures unsuccessfully verified: %10d\n", nverifyfailed); - runtime_ms = runtime_us / 1000; - printf("Runtime in seconds: %7u.%03u\n", - (unsigned int) (runtime_ms / 1000), - (unsigned int) (runtime_ms % 1000)); - if (runtime_us > 0) { - sig_ms = ((isc_uint64_t)nsigned * 1000000000) / runtime_us; + + time_us = isc_time_microdiff(sign_finish, sign_start); + time_ms = time_us / 1000; + printf("Signing time in seconds: %7u.%03u\n", + (unsigned int) (time_ms / 1000), + (unsigned int) (time_ms % 1000)); + if (time_us > 0) { + sig_ms = ((isc_uint64_t)nsigned * 1000000000) / time_us; printf("Signatures per second: %7u.%03u\n", (unsigned int) sig_ms / 1000, (unsigned int) sig_ms % 1000); } + + time_us = isc_time_microdiff(timer_finish, timer_start); + time_ms = time_us / 1000; + printf("Runtime in seconds: %7u.%03u\n", + (unsigned int) (time_ms / 1000), + (unsigned int) (time_ms % 1000)); } int @@ -3355,6 +3388,7 @@ main(int argc, char *argv[]) { int ndskeys = 0; char *endp; isc_time_t timer_start, timer_finish; + isc_time_t sign_start, sign_finish; dns_dnsseckey_t *key; isc_result_t result; isc_log_t *log = NULL; @@ -3805,6 +3839,8 @@ main(int argc, char *argv[]) { nokeys = ISC_TRUE; } + warnifallksk(gdb); + if (IS_NSEC3) { unsigned int max; result = dns_nsec3_maxiterations(gdb, NULL, mctx, &max); @@ -3814,8 +3850,6 @@ main(int argc, char *argv[]) { "strength. Maximum iterations allowed %u.", max); } - warnifallksk(gdb); - gversion = NULL; result = dns_db_newversion(gdb, &gversion); check_result(result, "dns_db_newversion()"); @@ -3895,6 +3929,7 @@ main(int argc, char *argv[]) { RUNTIME_CHECK(isc_mutex_init(&statslock) == ISC_R_SUCCESS); presign(); + TIME_NOW(&sign_start); signapex(); if (!finished) { /* @@ -3919,6 +3954,7 @@ main(int argc, char *argv[]) { isc_taskmgr_destroy(&taskmgr); isc_mem_put(mctx, tasks, ntasks * sizeof(isc_task_t *)); postsign(); + TIME_NOW(&sign_finish); verifyzone(); if (outputformat != dns_masterformat_text) { @@ -3972,7 +4008,8 @@ main(int argc, char *argv[]) { if (printstats) { TIME_NOW(&timer_finish); - print_stats(&timer_start, &timer_finish); + print_stats(&timer_start, &timer_finish, + &sign_start, &sign_finish); } return (0); diff --git a/bin/named/Makefile.in b/bin/named/Makefile.in index a3dbb3802dc..86400c47f02 100644 --- a/bin/named/Makefile.in +++ b/bin/named/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1998-2002 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.114 2010-12-22 09:00:40 marka Exp $ +# $Id: Makefile.in,v 1.114.14.2 2011-03-10 23:47:25 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -45,7 +45,7 @@ CINCLUDES = -I${srcdir}/include -I${srcdir}/unix/include -I. \ ${ISCCFG_INCLUDES} ${ISCCC_INCLUDES} ${ISC_INCLUDES} \ ${DLZDRIVER_INCLUDES} ${DBDRIVER_INCLUDES} @DST_OPENSSL_INC@ -CDEFINES = @USE_DLZ@ @USE_PKCS11@ @USE_OPENSSL@ +CDEFINES = @CONTRIB_DLZ@ @USE_PKCS11@ @USE_OPENSSL@ CWARNINGS = @@ -89,7 +89,7 @@ OBJS = builtin.@O@ client.@O@ config.@O@ control.@O@ \ lwdgnba.@O@ lwdgrbn.@O@ lwdnoop.@O@ lwsearch.@O@ \ ${DLZDRIVER_OBJS} ${DBDRIVER_OBJS} -UOBJS = unix/os.@O@ +UOBJS = unix/os.@O@ unix/dlz_dlopen_driver.@O@ SYMOBJS = symtbl.@O@ diff --git a/bin/named/client.c b/bin/named/client.c index bc9cc878adb..2115ac101bc 100644 --- a/bin/named/client.c +++ b/bin/named/client.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: client.c,v 1.271 2011-01-11 23:47:12 tbox Exp $ */ +/* $Id: client.c,v 1.271.10.2 2011-07-28 04:30:54 marka Exp $ */ #include @@ -633,6 +633,7 @@ ns_client_endrequest(ns_client_t *client) { dns_message_puttemprdataset(client->message, &client->opt); } + client->signer = NULL; client->udpsize = 512; client->extflags = 0; client->ednsversion = -1; @@ -1312,6 +1313,12 @@ ns_client_isself(dns_view_t *myview, dns_tsigkey_t *mykey, UNUSED(arg); + /* + * ns_g_server->interfacemgr is task exclusive locked. + */ + if (ns_g_server->interfacemgr == NULL) + return (ISC_TRUE); + if (!ns_interfacemgr_listeningon(ns_g_server->interfacemgr, dstaddr)) return (ISC_FALSE); @@ -2095,6 +2102,7 @@ client_create(ns_clientmgr_t *manager, ns_client_t **clientp) { client->next = NULL; client->shutdown = NULL; client->shutdown_arg = NULL; + client->signer = NULL; dns_name_init(&client->signername, NULL); client->mortal = ISC_FALSE; client->tcpquota = NULL; diff --git a/bin/named/config.c b/bin/named/config.c index 704d7ecc55e..e34e5c4e63b 100644 --- a/bin/named/config.c +++ b/bin/named/config.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: config.c,v 1.113.16.1.2.1 2011-06-02 23:47:28 tbox Exp $ */ +/* $Id: config.c,v 1.113.16.2 2011-02-28 01:19:58 tbox Exp $ */ /*! \file */ diff --git a/bin/named/controlconf.c b/bin/named/controlconf.c index 16d375b0083..bd269e519b3 100644 --- a/bin/named/controlconf.c +++ b/bin/named/controlconf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2001-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: controlconf.c,v 1.60 2008-07-23 23:27:54 marka Exp $ */ +/* $Id: controlconf.c,v 1.60.544.2 2011-03-12 04:59:14 tbox Exp $ */ /*! \file */ @@ -859,7 +859,7 @@ get_rndckey(isc_mem_t *mctx, controlkeylist_t *keyids) { cfg_obj_log(key, ns_g_lctx, ISC_LOG_WARNING, "secret for key '%s' on command channel: %s", keyid->keyname, isc_result_totext(result)); - CHECK(result); + goto cleanup; } keyid->secret.length = isc_buffer_usedlength(&b); diff --git a/bin/named/include/dlz/dlz_dlopen_driver.h b/bin/named/include/dlz/dlz_dlopen_driver.h new file mode 100644 index 00000000000..fc51c49da76 --- /dev/null +++ b/bin/named/include/dlz/dlz_dlopen_driver.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id: dlz_dlopen_driver.h,v 1.1.4.4 2011-03-17 09:41:06 fdupont Exp $ */ + +#ifndef DLZ_DLOPEN_DRIVER_H +#define DLZ_DLOPEN_DRIVER_H + +isc_result_t +dlz_dlopen_init(isc_mem_t *mctx); + +void +dlz_dlopen_clear(void); +#endif diff --git a/bin/named/include/named/globals.h b/bin/named/include/named/globals.h index f155c7f05ed..7bea32d52b5 100644 --- a/bin/named/include/named/globals.h +++ b/bin/named/include/named/globals.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: globals.h,v 1.89 2010-09-15 12:07:55 marka Exp $ */ +/* $Id: globals.h,v 1.89.54.2 2011-06-17 23:47:10 tbox Exp $ */ #ifndef NAMED_GLOBALS_H #define NAMED_GLOBALS_H 1 @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -102,6 +103,7 @@ EXTERN const char * lwresd_g_resolvconffile INIT("/etc" EXTERN isc_boolean_t ns_g_conffileset INIT(ISC_FALSE); EXTERN isc_boolean_t lwresd_g_useresolvconf INIT(ISC_FALSE); EXTERN isc_uint16_t ns_g_udpsize INIT(4096); +EXTERN cfg_aclconfctx_t * ns_g_aclconfctx INIT(NULL); /* * Initial resource limits. diff --git a/bin/named/interfacemgr.c b/bin/named/interfacemgr.c index e99d3b9cfe3..513fb249109 100644 --- a/bin/named/interfacemgr.c +++ b/bin/named/interfacemgr.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: interfacemgr.c,v 1.95 2009-01-17 23:47:42 tbox Exp $ */ +/* $Id: interfacemgr.c,v 1.95.426.2 2011-03-12 04:59:14 tbox Exp $ */ /*! \file */ @@ -379,7 +379,7 @@ ns_interface_setup(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr, } } *ifpret = ifp; - return (ISC_R_SUCCESS); + return (result); cleanup_interface: ISC_LIST_UNLINK(ifp->mgr->interfaces, ifp, link); @@ -964,7 +964,6 @@ isc_boolean_t ns_interfacemgr_listeningon(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr) { isc_sockaddr_t *old; - old = ISC_LIST_HEAD(mgr->listenon); for (old = ISC_LIST_HEAD(mgr->listenon); old != NULL; old = ISC_LIST_NEXT(old, link)) diff --git a/bin/named/logconf.c b/bin/named/logconf.c index 8ae55ff7c54..4fcb4e8dcae 100644 --- a/bin/named/logconf.c +++ b/bin/named/logconf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,12 +15,13 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: logconf.c,v 1.42 2007-06-19 23:46:59 tbox Exp $ */ +/* $Id: logconf.c,v 1.42.816.3 2011-03-05 23:52:06 tbox Exp $ */ /*! \file */ #include +#include #include #include #include @@ -130,7 +131,7 @@ channel_fromconf(const cfg_obj_t *channel, isc_logconfig_t *lctx) { } type = ISC_LOG_TONULL; - + if (fileobj != NULL) { const cfg_obj_t *pathobj = cfg_tuple_get(fileobj, "file"); const cfg_obj_t *sizeobj = cfg_tuple_get(fileobj, "size"); @@ -140,7 +141,7 @@ channel_fromconf(const cfg_obj_t *channel, isc_logconfig_t *lctx) { isc_offset_t size = 0; type = ISC_LOG_TOFILE; - + if (versionsobj != NULL && cfg_obj_isuint32(versionsobj)) versions = cfg_obj_asuint32(versionsobj); if (versionsobj != NULL && cfg_obj_isstring(versionsobj) && @@ -219,26 +220,38 @@ channel_fromconf(const cfg_obj_t *channel, isc_logconfig_t *lctx) { if (result == ISC_R_SUCCESS && type == ISC_LOG_TOFILE) { FILE *fp; - - /* - * Test that the file can be opened, since isc_log_open() - * can't effectively report failures when called in - * isc_log_doit(). - */ - result = isc_stdio_open(dest.file.name, "a", &fp); - if (result != ISC_R_SUCCESS) - isc_log_write(ns_g_lctx, CFG_LOGCATEGORY_CONFIG, - NS_LOGMODULE_SERVER, ISC_LOG_ERROR, - "logging channel '%s' file '%s': %s", - channelname, dest.file.name, - isc_result_totext(result)); - else - (void)isc_stdio_close(fp); /* - * Allow named to continue by returning success. - */ - result = ISC_R_SUCCESS; + * Test to make sure that file is a plain file. + * Fix defect #22771 + */ + result = isc_file_isplainfile(dest.file.name); + if (result == ISC_R_SUCCESS || + result == ISC_R_FILENOTFOUND) { + /* + * Test that the file can be opened, since + * isc_log_open() can't effectively report + * failures when called in + * isc_log_doit(). + */ + result = isc_stdio_open(dest.file.name, "a", &fp); + if (result != ISC_R_SUCCESS) { + syslog(LOG_ERR, + "isc_stdio_open '%s' failed: %s", + dest.file.name, + isc_result_totext(result)); + fprintf(stderr, + "isc_stdio_open '%s' failed: %s", + dest.file.name, + isc_result_totext(result)); + } else + (void)isc_stdio_close(fp); + } else { + syslog(LOG_ERR, "isc_file_isplainfile '%s' failed: %s", + dest.file.name, isc_result_totext(result)); + fprintf(stderr, "isc_file_isplainfile '%s' failed: %s", + dest.file.name, isc_result_totext(result)); + } } return (result); diff --git a/bin/named/main.c b/bin/named/main.c index 84d86b146f4..d2261136012 100644 --- a/bin/named/main.c +++ b/bin/named/main.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: main.c,v 1.180 2010-12-22 03:59:02 marka Exp $ */ +/* $Id: main.c,v 1.180.14.3 2011-03-11 06:47:00 marka Exp $ */ /*! \file */ @@ -51,6 +51,8 @@ #include +#include + /* * Defining NS_MAIN provides storage declarations (rather than extern) * for variables in named/globals.h. @@ -81,10 +83,10 @@ */ /* #include "xxdb.h" */ +#ifdef CONTRIB_DLZ /* - * Include DLZ drivers if appropriate. + * Include contributed DLZ drivers if appropriate. */ -#ifdef DLZ #include #endif @@ -560,6 +562,7 @@ parse_command_line(int argc, char *argv[]) { argc -= isc_commandline_index; argv += isc_commandline_index; + POST(argv); if (argc > 0) { usage(); @@ -856,9 +859,19 @@ setup(void) { */ /* xxdb_init(); */ -#ifdef DLZ +#ifdef ISC_DLZ_DLOPEN /* - * Register any DLZ drivers. + * Register the DLZ "dlopen" driver. + */ + result = dlz_dlopen_init(ns_g_mctx); + if (result != ISC_R_SUCCESS) + ns_main_earlyfatal("dlz_dlopen_init() failed: %s", + isc_result_totext(result)); +#endif + +#if CONTRIB_DLZ + /* + * Register any other contributed DLZ drivers. */ result = dlz_drivers_init(); if (result != ISC_R_SUCCESS) @@ -882,12 +895,18 @@ cleanup(void) { */ /* xxdb_clear(); */ -#ifdef DLZ +#ifdef CONTRIB_DLZ /* - * Unregister any DLZ drivers. + * Unregister contributed DLZ drivers. */ dlz_drivers_clear(); #endif +#ifdef ISC_DLZ_DLOPEN + /* + * Unregister "dlopen" DLZ driver. + */ + dlz_dlopen_clear(); +#endif dns_name_destroy(); diff --git a/bin/named/query.c b/bin/named/query.c index 1950257dca2..9be178beddb 100644 --- a/bin/named/query.c +++ b/bin/named/query.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: query.c,v 1.353.8.2.2.5 2011-06-09 03:17:10 marka Exp $ */ +/* $Id: query.c,v 1.353.8.11 2011-06-09 03:14:03 marka Exp $ */ /*! \file */ @@ -31,9 +31,7 @@ #include #include #include -#ifdef DLZ #include -#endif #include #include #include @@ -1027,7 +1025,6 @@ query_getdb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype, { isc_result_t result; -#ifdef DLZ isc_result_t tresult; unsigned int namelabels; unsigned int zonelabels; @@ -1093,16 +1090,10 @@ query_getdb(ns_client_t *client, dns_name_t *name, dns_rdatatype_t qtype, result = tresult; } } -#else - result = query_getzonedb(client, name, qtype, options, - zonep, dbp, versionp); -#endif /* If successful, Transfer ownership of zone. */ if (result == ISC_R_SUCCESS) { -#ifdef DLZ *zonep = zone; -#endif /* * If neither attempt above succeeded, return the cache instead */ @@ -1633,6 +1624,7 @@ query_addadditional2(void *arg, dns_name_t *name, dns_rdatatype_t qtype) { need_addname = ISC_FALSE; zone = NULL; needadditionalcache = ISC_FALSE; + POST(needadditionalcache); additionaltype = dns_rdatasetadditional_fromauth; dns_name_init(&cfname, NULL); @@ -4305,11 +4297,12 @@ rpz_rewrite(ns_client_t *client, dns_rdatatype_t qtype, * Check rules for the name if this it the first time, * i.e. we've not been recursing. */ - result = DNS_R_SERVFAIL; st->state &= ~(DNS_RPZ_HAVE_IP | DNS_RPZ_HAVE_NSIPv4 | DNS_RPZ_HAVE_NSIPv6 | DNS_RPZ_HAD_NSDNAME); result = rpz_rewrite_name(client, qtype, client->query.qname, DNS_RPZ_TYPE_QNAME, &rdataset); + if (result != ISC_R_SUCCESS) + goto cleanup; if (st->m.policy != DNS_RPZ_POLICY_MISS) goto cleanup; if ((st->state & (DNS_RPZ_HAVE_NSIPv4 | DNS_RPZ_HAVE_NSIPv6 | @@ -4415,9 +4408,10 @@ rpz_rewrite(ns_client_t *client, dns_rdatatype_t qtype, (st->state & DNS_RPZ_HAVE_NSIPv6) != 0 && st->m.type != DNS_RPZ_TYPE_NSDNAME) { result = rpz_rewrite_nsip(client, - dns_rdatatype_aaaa, - &ns.name, &ipdb, version, - &rdataset, resuming); + dns_rdatatype_aaaa, + &ns.name, &ipdb, + version, &rdataset, + resuming); } dns_rdata_freestruct(&ns); if (ipdb != NULL) @@ -4932,12 +4926,14 @@ dns64_aaaaok(ns_client_t *client, dns_rdataset_t *rdataset, break; } } - if (i == count) + if (i == count && aaaaok != NULL) isc_mem_put(client->mctx, aaaaok, sizeof(isc_boolean_t) * count); return (ISC_TRUE); } - isc_mem_put(client->mctx, aaaaok, sizeof(isc_boolean_t) * count); + if (aaaaok != NULL) + isc_mem_put(client->mctx, aaaaok, + sizeof(isc_boolean_t) * count); return (ISC_FALSE); } @@ -5198,25 +5194,22 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) } is_staticstub_zone = ISC_FALSE; - if (is_zone && zone != NULL) { + if (is_zone) { authoritative = ISC_TRUE; - if (dns_zone_gettype(zone) == dns_zone_staticstub) + if (zone != NULL && + dns_zone_gettype(zone) == dns_zone_staticstub) is_staticstub_zone = ISC_TRUE; } if (event == NULL && client->query.restarts == 0) { if (is_zone) { -#ifdef DLZ if (zone != NULL) { /* * if is_zone = true, zone = NULL then this is * a DLZ zone. Don't attempt to attach zone. */ -#endif dns_zone_attach(zone, &client->query.authzone); -#ifdef DLZ } -#endif dns_db_attach(db, &client->query.authdb); } client->query.authdbset = ISC_TRUE; @@ -5290,7 +5283,6 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) dns_name_copy(fname, rpz_st->fname, NULL); rpz_st->q.result = result; client->query.attributes |= NS_QUERYATTR_RECURSING; - result = ISC_R_SUCCESS; goto cleanup; default: RECURSE_ERROR(rresult); @@ -5743,8 +5735,6 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) goto db_find; } - result = DNS_R_NXRRSET; - /* * Look for a NSEC3 record if we don't have a NSEC record. */ @@ -5880,9 +5870,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) * resolver and not have it cached. */ if (qtype == dns_rdatatype_soa && -#ifdef DLZ zone != NULL && -#endif dns_zone_getzeronosoattl(zone)) result = query_addsoa(client, db, version, 0, dns_rdataset_isassociated(rdataset)); @@ -6161,17 +6149,17 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) } result = dns_name_concatenate(prefix, tname, fname, NULL); dns_message_puttempname(client->message, &tname); - if (result != ISC_R_SUCCESS) { - if (result == ISC_R_NOSPACE) { - /* - * RFC2672, section 4.1, subsection 3c says - * we should return YXDOMAIN if the constructed - * name would be too long. - */ - client->message->rcode = dns_rcode_yxdomain; - } + + /* + * RFC2672, section 4.1, subsection 3c says + * we should return YXDOMAIN if the constructed + * name would be too long. + */ + if (result == DNS_R_NAMETOOLONG) + client->message->rcode = dns_rcode_yxdomain; + if (result != ISC_R_SUCCESS) goto cleanup; - } + query_keepname(client, fname, dbuf); /* * Synthesize a CNAME consisting of @@ -6642,9 +6630,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) /* * Add a fake SOA record. */ - result = query_addsoa(client, db, - version, 600, - ISC_FALSE); + (void)query_addsoa(client, db, version, + 600, ISC_FALSE); goto cleanup; } #endif diff --git a/bin/named/server.c b/bin/named/server.c index 5bbf94b9b60..f19a0bbb937 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.599.8.4 2011-02-16 19:46:12 each Exp $ */ +/* $Id: server.c,v 1.599.8.12 2011-08-02 04:58:45 each Exp $ */ /*! \file */ @@ -60,9 +60,7 @@ #include #include #include -#ifdef DLZ #include -#endif #include #include #include @@ -206,13 +204,15 @@ struct zonelistentry { /*% * Configuration context to retain for each view that allows - * new zones to be added at runtime + * new zones to be added at runtime. */ struct cfg_context { isc_mem_t * mctx; - cfg_obj_t * config; cfg_parser_t * parser; - cfg_aclconfctx_t actx; + cfg_obj_t * config; + cfg_parser_t * nzparser; + cfg_obj_t * nzconfig; + cfg_aclconfctx_t * actx; }; /* @@ -222,7 +222,6 @@ static const struct { const char *zone; isc_boolean_t rfc1918; } empty_zones[] = { -#ifdef notyet /* RFC 1918 */ { "10.IN-ADDR.ARPA", ISC_TRUE }, { "16.172.IN-ADDR.ARPA", ISC_TRUE }, @@ -242,7 +241,6 @@ static const struct { { "30.172.IN-ADDR.ARPA", ISC_TRUE }, { "31.172.IN-ADDR.ARPA", ISC_TRUE }, { "168.192.IN-ADDR.ARPA", ISC_TRUE }, -#endif /* RFC 5735 and RFC 5737 */ { "0.IN-ADDR.ARPA", ISC_FALSE }, /* THIS NETWORK */ @@ -304,7 +302,7 @@ static void end_reserved_dispatches(ns_server_t *server, isc_boolean_t all); static void -cfgctx_destroy(void **cfgp); +newzone_cfgctx_destroy(void **cfgp); /*% * Configure a single view ACL at '*aclp'. Get its configuration from @@ -847,18 +845,13 @@ get_view_querysource_dispatch(const cfg_obj_t **maps, int af, dns_dispatch_t **dispatchp, isc_boolean_t is_firstview) { - isc_result_t result; + isc_result_t result = ISC_R_FAILURE; dns_dispatch_t *disp; isc_sockaddr_t sa; unsigned int attrs, attrmask; const cfg_obj_t *obj = NULL; unsigned int maxdispatchbuffers; - /* - * Make compiler happy. - */ - result = ISC_R_FAILURE; - switch (af) { case AF_INET: result = ns_config_get(maps, "query-source", &obj); @@ -1340,7 +1333,6 @@ cache_sharable(dns_view_t *originview, dns_view_t *view, return (ISC_TRUE); } -#ifdef DLZ /* * Callback from DLZ configure when the driver sets up a writeable zone */ @@ -1358,7 +1350,6 @@ dlzconfigure_callback(dns_view_t *view, dns_zone_t *zone) { return ns_zone_configure_writeable_dlz(view->dlzdatabase, zone, zclass, origin); } -#endif static isc_result_t dns64_reverse(dns_view_t *view, isc_mem_t *mctx, isc_netaddr_t *na, @@ -1554,8 +1545,7 @@ configure_rpz(dns_view_t *view, const cfg_listelt_t *element) { * global defaults in 'config' used exclusively. */ static isc_result_t -configure_view(dns_view_t *view, cfg_parser_t* parser, - cfg_obj_t *config, cfg_obj_t *vconfig, +configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig, ns_cachelist_t *cachelist, const cfg_obj_t *bindkeys, isc_mem_t *mctx, cfg_aclconfctx_t *actx, isc_boolean_t need_hints) @@ -1569,11 +1559,9 @@ configure_view(dns_view_t *view, cfg_parser_t* parser, const cfg_obj_t *forwarders; const cfg_obj_t *alternates; const cfg_obj_t *zonelist; -#ifdef DLZ const cfg_obj_t *dlz; unsigned int dlzargc; char **dlzargv; -#endif const cfg_obj_t *disabled; const cfg_obj_t *obj; const cfg_listelt_t *element; @@ -1587,7 +1575,7 @@ configure_view(dns_view_t *view, cfg_parser_t* parser, isc_uint32_t lame_ttl; dns_tsig_keyring_t *ring = NULL; dns_view_t *pview = NULL; /* Production view */ - isc_mem_t *cmctx; + isc_mem_t *cmctx = NULL, *hmctx = NULL; dns_dispatch_t *dispatch4 = NULL; dns_dispatch_t *dispatch6 = NULL; isc_boolean_t reused_cache = ISC_FALSE; @@ -1612,15 +1600,12 @@ configure_view(dns_view_t *view, cfg_parser_t* parser, isc_boolean_t auto_root = ISC_FALSE; ns_cache_t *nsc; isc_boolean_t zero_no_soattl; - cfg_parser_t *newzones_parser = NULL; - cfg_obj_t *nzfconf = NULL; dns_acl_t *clients = NULL, *mapped = NULL, *excluded = NULL; unsigned int query_timeout; + struct cfg_context *nzctx; REQUIRE(DNS_VIEW_VALID(view)); - cmctx = NULL; - if (config != NULL) (void)cfg_map_get(config, "options", &options); @@ -1651,6 +1636,7 @@ configure_view(dns_view_t *view, cfg_parser_t* parser, sep = ""; viewname = ""; forview = ""; + POST(forview); } /* @@ -1722,6 +1708,10 @@ configure_view(dns_view_t *view, cfg_parser_t* parser, (void)cfg_map_get(voptions, "zone", &zonelist); else (void)cfg_map_get(config, "zone", &zonelist); + + /* + * Load zone configuration + */ for (element = cfg_list_first(zonelist); element != NULL; element = cfg_list_next(element)) @@ -1731,62 +1721,32 @@ configure_view(dns_view_t *view, cfg_parser_t* parser, actx, ISC_FALSE)); } - /* - * Are we allowing zones to be added and deleted dynamically? - */ - obj = NULL; - result = ns_config_get(maps, "allow-new-zones", &obj); - if (result == ISC_R_SUCCESS) { - isc_boolean_t allow = cfg_obj_asboolean(obj); - struct cfg_context *cfg = NULL; - if (allow) { - cfg = isc_mem_get(view->mctx, sizeof(*cfg)); - if (cfg == NULL) { - result = ISC_R_NOMEMORY; - goto cleanup; - } - memset(cfg, 0, sizeof(*cfg)); - isc_mem_attach(view->mctx, &cfg->mctx); - if (config != NULL) - cfg_obj_attach(config, &cfg->config); - cfg_parser_attach(parser, &cfg->parser); - cfg_aclconfctx_clone(actx, &cfg->actx); - } - dns_view_setnewzones(view, allow, cfg, cfgctx_destroy); - } - /* * If we're allowing added zones, then load zone configuration * from the newzone file for zones that were added during previous * runs. */ - if (view->new_zone_file != NULL) { + nzctx = view->new_zone_config; + if (nzctx != NULL && nzctx->nzconfig != NULL) { isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, ISC_LOG_INFO, "loading additional zones for view '%s'", view->name); - CHECK(cfg_parser_create(view->mctx, ns_g_lctx, - &newzones_parser)); - result = cfg_parse_file(newzones_parser, view->new_zone_file, - &cfg_type_newzones, &nzfconf); - if (result == ISC_R_SUCCESS) { - zonelist = NULL; - cfg_map_get(nzfconf, "zone", &zonelist); - for (element = cfg_list_first(zonelist); - element != NULL; - element = cfg_list_next(element)) - { - const cfg_obj_t *zconfig = - cfg_listelt_value(element); - CHECK(configure_zone(config, zconfig, vconfig, - mctx, view, actx, - ISC_TRUE)); - } + zonelist = NULL; + cfg_map_get(nzctx->nzconfig, "zone", &zonelist); + + for (element = cfg_list_first(zonelist); + element != NULL; + element = cfg_list_next(element)) + { + const cfg_obj_t *zconfig = cfg_listelt_value(element); + CHECK(configure_zone(config, zconfig, vconfig, + mctx, view, actx, + ISC_TRUE)); } } -#ifdef DLZ /* * Create Dynamically Loadable Zone driver. */ @@ -1831,7 +1791,6 @@ configure_view(dns_view_t *view, cfg_parser_t* parser, goto cleanup; } } -#endif /* * Obtain configuration parameters that affect the decision of whether @@ -2103,13 +2062,21 @@ configure_view(dns_view_t *view, cfg_parser_t* parser, * view but is not yet configured. If it is not the * view name but not a forward reference either, then it * is simply a named cache that is not shared. + * + * We use two separate memory contexts for the + * cache, for the main cache memory and the heap + * memory. */ CHECK(isc_mem_create(0, 0, &cmctx)); isc_mem_setname(cmctx, "cache", NULL); - CHECK(dns_cache_create2(cmctx, ns_g_taskmgr, + CHECK(isc_mem_create(0, 0, &hmctx)); + isc_mem_setname(hmctx, "cache_heap", NULL); + CHECK(dns_cache_create3(cmctx, hmctx, ns_g_taskmgr, ns_g_timermgr, view->rdclass, cachename, "rbt", 0, NULL, &cache)); + isc_mem_detach(&cmctx); + isc_mem_detach(&hmctx); } nsc = isc_mem_get(mctx, sizeof(*nsc)); if (nsc == NULL) { @@ -2910,8 +2877,8 @@ configure_view(dns_view_t *view, cfg_parser_t* parser, if (result == ISC_R_SUCCESS) cfg_map_get(obj, "zone", &zonelist); } - if (zonelist != NULL) { + if (zonelist != NULL) { for (element = cfg_list_first(zonelist); element != NULL; element = cfg_list_next(element)) { @@ -2947,16 +2914,12 @@ configure_view(dns_view_t *view, cfg_parser_t* parser, dns_order_detach(&order); if (cmctx != NULL) isc_mem_detach(&cmctx); + if (hmctx != NULL) + isc_mem_detach(&hmctx); if (cache != NULL) dns_cache_detach(&cache); - if (newzones_parser != NULL) { - if (nzfconf != NULL) - cfg_obj_destroy(newzones_parser, &nzfconf); - cfg_parser_destroy(&newzones_parser); - } - return (result); } @@ -3161,21 +3124,16 @@ configure_forward(const cfg_obj_t *config, dns_view_t *view, dns_name_t *origin, return (result); } -/* - * Create a new view and add it to the list. - * - * If 'vconfig' is NULL, create the default view. - * - * The view created is attached to '*viewp'. - */ static isc_result_t -create_view(const cfg_obj_t *vconfig, dns_viewlist_t *viewlist, - dns_view_t **viewp) +get_viewinfo(const cfg_obj_t *vconfig, const char **namep, + dns_rdataclass_t *classp) { - isc_result_t result; + isc_result_t result = ISC_R_SUCCESS; const char *viewname; dns_rdataclass_t viewclass; - dns_view_t *view = NULL; + + REQUIRE(namep != NULL && *namep == NULL); + REQUIRE(classp != NULL); if (vconfig != NULL) { const cfg_obj_t *classobj = NULL; @@ -3188,6 +3146,59 @@ create_view(const cfg_obj_t *vconfig, dns_viewlist_t *viewlist, viewname = "_default"; viewclass = dns_rdataclass_in; } + + *namep = viewname; + *classp = viewclass; + + return (result); +} + +/* + * Find a view based on its configuration info and attach to it. + * + * If 'vconfig' is NULL, attach to the default view. + */ +static isc_result_t +find_view(const cfg_obj_t *vconfig, dns_viewlist_t *viewlist, + dns_view_t **viewp) +{ + isc_result_t result; + const char *viewname = NULL; + dns_rdataclass_t viewclass; + dns_view_t *view = NULL; + + result = get_viewinfo(vconfig, &viewname, &viewclass); + if (result != ISC_R_SUCCESS) + return (result); + + result = dns_viewlist_find(viewlist, viewname, viewclass, &view); + if (result != ISC_R_SUCCESS) + return (result); + + *viewp = view; + return (ISC_R_SUCCESS); +} + +/* + * Create a new view and add it to the list. + * + * If 'vconfig' is NULL, create the default view. + * + * The view created is attached to '*viewp'. + */ +static isc_result_t +create_view(const cfg_obj_t *vconfig, dns_viewlist_t *viewlist, + dns_view_t **viewp) +{ + isc_result_t result; + const char *viewname = NULL; + dns_rdataclass_t viewclass; + dns_view_t *view = NULL; + + result = get_viewinfo(vconfig, &viewname, &viewclass); + if (result != ISC_R_SUCCESS) + return (result); + result = dns_viewlist_find(viewlist, viewname, viewclass, &view); if (result == ISC_R_SUCCESS) return (ISC_R_EXISTS); @@ -4145,11 +4156,99 @@ configure_session_key(const cfg_obj_t **maps, ns_server_t *server, return (result); } +static isc_result_t +setup_newzones(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig, + cfg_parser_t *parser, cfg_aclconfctx_t *actx) +{ + isc_result_t result = ISC_R_SUCCESS; + isc_boolean_t allow = ISC_FALSE; + struct cfg_context *nzcfg = NULL; + cfg_parser_t *nzparser = NULL; + cfg_obj_t *nzconfig = NULL; + const cfg_obj_t *maps[4]; + const cfg_obj_t *options = NULL, *voptions = NULL; + const cfg_obj_t *nz = NULL; + int i = 0; + + REQUIRE (config != NULL); + + if (vconfig != NULL) + voptions = cfg_tuple_get(vconfig, "options"); + if (voptions != NULL) + maps[i++] = voptions; + result = cfg_map_get(config, "options", &options); + if (result == ISC_R_SUCCESS) + maps[i++] = options; + maps[i++] = ns_g_defaults; + maps[i] = NULL; + + result = ns_config_get(maps, "allow-new-zones", &nz); + if (result == ISC_R_SUCCESS) + allow = cfg_obj_asboolean(nz); + + if (!allow) { + dns_view_setnewzones(view, ISC_FALSE, NULL, NULL); + return (ISC_R_SUCCESS); + } + + nzcfg = isc_mem_get(view->mctx, sizeof(*nzcfg)); + if (nzcfg == NULL) { + dns_view_setnewzones(view, ISC_FALSE, NULL, NULL); + return (ISC_R_NOMEMORY); + } + + dns_view_setnewzones(view, allow, nzcfg, newzone_cfgctx_destroy); + + memset(nzcfg, 0, sizeof(*nzcfg)); + isc_mem_attach(view->mctx, &nzcfg->mctx); + cfg_obj_attach(config, &nzcfg->config); + cfg_parser_attach(parser, &nzcfg->parser); + cfg_aclconfctx_attach(actx, &nzcfg->actx); + + /* + * Attempt to create a parser and parse the newzones + * file. If successful, preserve both; otherwise leave + * them NULL. + */ + result = cfg_parser_create(view->mctx, ns_g_lctx, &nzparser); + if (result == ISC_R_SUCCESS) + result = cfg_parse_file(nzparser, view->new_zone_file, + &cfg_type_newzones, &nzconfig); + if (result == ISC_R_SUCCESS) { + cfg_parser_attach(nzparser, &nzcfg->nzparser); + cfg_obj_attach(nzconfig, &nzcfg->nzconfig); + } + + if (nzparser != NULL) { + if (nzconfig != NULL) + cfg_obj_destroy(nzparser, &nzconfig); + cfg_parser_destroy(&nzparser); + } + + return (ISC_R_SUCCESS); +} + +static int +count_zones(const cfg_obj_t *conf) { + const cfg_obj_t *zonelist = NULL; + const cfg_listelt_t *element; + int n = 0; + + REQUIRE(conf != NULL); + + cfg_map_get(conf, "zone", &zonelist); + for (element = cfg_list_first(zonelist); + element != NULL; + element = cfg_list_next(element)) + n++; + + return (n); +} + static isc_result_t load_configuration(const char *filename, ns_server_t *server, isc_boolean_t first_time) { - cfg_aclconfctx_t aclconfctx; cfg_obj_t *config = NULL, *bindkeys = NULL; cfg_parser_t *conf_parser = NULL, *bindkeys_parser = NULL; const cfg_listelt_t *element; @@ -4177,8 +4276,9 @@ load_configuration(const char *filename, ns_server_t *server, ns_cachelist_t cachelist, tmpcachelist; unsigned int maxsocks; ns_cache_t *nsc; + struct cfg_context *nzctx; + int num_zones = 0; - cfg_aclconfctx_init(&aclconfctx); ISC_LIST_INIT(viewlist); ISC_LIST_INIT(builtin_viewlist); ISC_LIST_INIT(cachelist); @@ -4187,6 +4287,11 @@ load_configuration(const char *filename, ns_server_t *server, result = isc_task_beginexclusive(server->task); RUNTIME_CHECK(result == ISC_R_SUCCESS); + /* Create the ACL configuration context */ + if (ns_g_aclconfctx != NULL) + cfg_aclconfctx_detach(&ns_g_aclconfctx); + CHECK(cfg_aclconfctx_create(ns_g_mctx, &ns_g_aclconfctx)); + /* * Parse the global default pseudo-config file. */ @@ -4250,7 +4355,7 @@ load_configuration(const char *filename, ns_server_t *server, if (result == ISC_R_SUCCESS) maps[i++] = options; maps[i++] = ns_g_defaults; - maps[i++] = NULL; + maps[i] = NULL; /* * If bind.keys exists, load it. If "dnssec-lookaside auto" @@ -4337,8 +4442,9 @@ load_configuration(const char *filename, ns_server_t *server, else isc_quota_soft(&server->recursionquota, 0); - CHECK(configure_view_acl(NULL, config, "blackhole", NULL, &aclconfctx, - ns_g_mctx, &server->blackholeacl)); + CHECK(configure_view_acl(NULL, config, "blackhole", NULL, + ns_g_aclconfctx, ns_g_mctx, + &server->blackholeacl)); if (server->blackholeacl != NULL) dns_dispatchmgr_setblackhole(ns_g_dispatchmgr, server->blackholeacl); @@ -4348,7 +4454,7 @@ load_configuration(const char *filename, ns_server_t *server, INSIST(result == ISC_R_SUCCESS); server->aclenv.match_mapped = cfg_obj_asboolean(obj); - CHECKM(ns_statschannels_configure(ns_g_server, config, &aclconfctx), + CHECKM(ns_statschannels_configure(ns_g_server, config, ns_g_aclconfctx), "configuring statistics server(s)"); /* @@ -4476,11 +4582,10 @@ load_configuration(const char *filename, ns_server_t *server, if (options != NULL) (void)cfg_map_get(options, "listen-on", &clistenon); if (clistenon != NULL) { - result = ns_listenlist_fromconfig(clistenon, - config, - &aclconfctx, - ns_g_mctx, - &listenon); + /* check return code? */ + (void)ns_listenlist_fromconfig(clistenon, config, + ns_g_aclconfctx, + ns_g_mctx, &listenon); } else if (!ns_g_lwresdonly) { /* * Not specified, use default. @@ -4504,11 +4609,10 @@ load_configuration(const char *filename, ns_server_t *server, if (options != NULL) (void)cfg_map_get(options, "listen-on-v6", &clistenon); if (clistenon != NULL) { - result = ns_listenlist_fromconfig(clistenon, - config, - &aclconfctx, - ns_g_mctx, - &listenon); + /* check return code? */ + (void)ns_listenlist_fromconfig(clistenon, config, + ns_g_aclconfctx, + ns_g_mctx, &listenon); } else if (!ns_g_lwresdonly) { isc_boolean_t enable; /* @@ -4601,25 +4705,87 @@ load_configuration(const char *filename, ns_server_t *server, */ (void)configure_session_key(maps, server, ns_g_mctx); - /* - * Configure and freeze all explicit views. Explicit - * views that have zones were already created at parsing - * time, but views with no zones must be created here. - */ views = NULL; (void)cfg_map_get(config, "view", &views); + + /* + * Create the views and count all the configured zones in + * order to correctly size the zone manager's task table. + * (We only count zones for configured views; the built-in + * "bind" view can be ignored as it only adds a negligible + * number of zones.) + * + * If we're allowing new zones, we need to be able to find the + * new zone file and count those as well. So we setup the new + * zone configuration context, but otherwise view configuration + * waits until after the zone manager's task list has been sized. + */ for (element = cfg_list_first(views); element != NULL; element = cfg_list_next(element)) { cfg_obj_t *vconfig = cfg_listelt_value(element); + const cfg_obj_t *voptions = cfg_tuple_get(vconfig, "options"); view = NULL; CHECK(create_view(vconfig, &viewlist, &view)); INSIST(view != NULL); - CHECK(configure_view(view, conf_parser, config, vconfig, - &cachelist, bindkeys, - ns_g_mctx, &aclconfctx, ISC_TRUE)); + + num_zones += count_zones(voptions); + CHECK(setup_newzones(view, config, vconfig, conf_parser, + ns_g_aclconfctx)); + + nzctx = view->new_zone_config; + if (nzctx != NULL && nzctx->nzconfig != NULL) + num_zones += count_zones(nzctx->nzconfig); + + dns_view_detach(&view); + } + + /* + * If there were no explicit views then we do the default + * view here. + */ + if (views == NULL) { + CHECK(create_view(NULL, &viewlist, &view)); + INSIST(view != NULL); + + num_zones = count_zones(config); + + CHECK(setup_newzones(view, config, NULL, conf_parser, + ns_g_aclconfctx)); + + nzctx = view->new_zone_config; + if (nzctx != NULL && nzctx->nzconfig != NULL) + num_zones += count_zones(nzctx->nzconfig); + + dns_view_detach(&view); + } + + /* + * Zones have been counted; set the zone manager task pool size. + */ + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_SERVER, ISC_LOG_INFO, + "sizing zone task pool based on %d zones", num_zones); + CHECK(dns_zonemgr_setsize(ns_g_server->zonemgr, num_zones)); + + /* + * Configure and freeze all explicit views. Explicit + * views that have zones were already created at parsing + * time, but views with no zones must be created here. + */ + for (element = cfg_list_first(views); + element != NULL; + element = cfg_list_next(element)) + { + cfg_obj_t *vconfig = cfg_listelt_value(element); + + view = NULL; + CHECK(find_view(vconfig, &viewlist, &view)); + CHECK(configure_view(view, config, vconfig, + &cachelist, bindkeys, ns_g_mctx, + ns_g_aclconfctx, ISC_TRUE)); dns_view_freeze(view); dns_view_detach(&view); } @@ -4629,16 +4795,11 @@ load_configuration(const char *filename, ns_server_t *server, * were no explicit views. */ if (views == NULL) { - /* - * No explicit views; there ought to be a default view. - * There may already be one created as a side effect - * of zone statements, or we may have to create one. - * In either case, we need to configure and freeze it. - */ - CHECK(create_view(NULL, &viewlist, &view)); - CHECK(configure_view(view, conf_parser, config, NULL, + view = NULL; + CHECK(find_view(NULL, &viewlist, &view)); + CHECK(configure_view(view, config, NULL, &cachelist, bindkeys, - ns_g_mctx, &aclconfctx, ISC_TRUE)); + ns_g_mctx, ns_g_aclconfctx, ISC_TRUE)); dns_view_freeze(view); dns_view_detach(&view); } @@ -4656,9 +4817,9 @@ load_configuration(const char *filename, ns_server_t *server, cfg_obj_t *vconfig = cfg_listelt_value(element); CHECK(create_view(vconfig, &builtin_viewlist, &view)); - CHECK(configure_view(view, conf_parser, config, vconfig, + CHECK(configure_view(view, config, vconfig, &cachelist, bindkeys, - ns_g_mctx, &aclconfctx, ISC_FALSE)); + ns_g_mctx, ns_g_aclconfctx, ISC_FALSE)); dns_view_freeze(view); dns_view_detach(&view); view = NULL; @@ -4699,7 +4860,7 @@ load_configuration(const char *filename, ns_server_t *server, * Bind the control port(s). */ CHECKM(ns_controls_configure(ns_g_server->controls, config, - &aclconfctx), + ns_g_aclconfctx), "binding control channel(s)"); /* @@ -4941,8 +5102,6 @@ load_configuration(const char *filename, ns_server_t *server, if (v6portset != NULL) isc_portset_destroy(ns_g_mctx, &v6portset); - cfg_aclconfctx_clear(&aclconfctx); - if (conf_parser != NULL) { if (config != NULL) cfg_obj_destroy(conf_parser, &config); @@ -5149,6 +5308,9 @@ shutdown_server(isc_task_t *task, isc_event_t *event) { end_reserved_dispatches(server, ISC_TRUE); cleanup_session_key(server, server->mctx); + if (ns_g_aclconfctx != NULL) + cfg_aclconfctx_detach(&ns_g_aclconfctx); + cfg_obj_destroy(ns_g_parser, &ns_g_config); cfg_parser_destroy(&ns_g_parser); @@ -5200,8 +5362,8 @@ shutdown_server(isc_task_t *task, isc_event_t *event) { void ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) { isc_result_t result; - ns_server_t *server = isc_mem_get(mctx, sizeof(*server)); + if (server == NULL) fatal("allocating server object", ISC_R_NOMEMORY); @@ -5274,6 +5436,8 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) { CHECKFATAL(dns_zonemgr_create(ns_g_mctx, ns_g_taskmgr, ns_g_timermgr, ns_g_socketmgr, &server->zonemgr), "dns_zonemgr_create"); + CHECKFATAL(dns_zonemgr_setsize(server->zonemgr, 1000), + "dns_zonemgr_setsize"); server->statsfile = isc_mem_strdup(server->mctx, "named.stats"); CHECKFATAL(server->statsfile == NULL ? ISC_R_NOMEMORY : ISC_R_SUCCESS, @@ -5383,7 +5547,8 @@ ns_server_destroy(ns_server_t **serverp) { if (server->server_id != NULL) isc_mem_free(server->mctx, server->server_id); - dns_zonemgr_detach(&server->zonemgr); + if (server->zonemgr != NULL) + dns_zonemgr_detach(&server->zonemgr); if (server->tkeyctx != NULL) dns_tkeyctx_destroy(&server->tkeyctx); @@ -5947,7 +6112,6 @@ ns_server_dumpstats(ns_server_t *server) { "could not open statistics dump file", server->statsfile); result = ns_stats_dump(server, fp); - CHECK(result); cleanup: if (fp != NULL) @@ -6135,6 +6299,7 @@ dumpdone(void *arg, isc_result_t result) { fprintf(dctx->fp, "; %s\n", dns_result_totext(result)); result = ISC_R_SUCCESS; + POST(result); goto nextzone; } if (result != ISC_R_SUCCESS) @@ -6260,28 +6425,29 @@ ns_server_dumpsecroots(ns_server_t *server, char *args) { isc_time_formattimestamp(&now, tbuf, sizeof(tbuf)); fprintf(fp, "%s\n", tbuf); - nextview: - for (view = ISC_LIST_HEAD(server->viewlist); - view != NULL; - view = ISC_LIST_NEXT(view, link)) - { - if (ptr != NULL && strcmp(view->name, ptr) != 0) - continue; - if (secroots != NULL) - dns_keytable_detach(&secroots); - result = dns_view_getsecroots(view, &secroots); - if (result == ISC_R_NOTFOUND) { - result = ISC_R_SUCCESS; - continue; + do { + for (view = ISC_LIST_HEAD(server->viewlist); + view != NULL; + view = ISC_LIST_NEXT(view, link)) + { + if (ptr != NULL && strcmp(view->name, ptr) != 0) + continue; + if (secroots != NULL) + dns_keytable_detach(&secroots); + result = dns_view_getsecroots(view, &secroots); + if (result == ISC_R_NOTFOUND) { + result = ISC_R_SUCCESS; + continue; + } + fprintf(fp, "\n Start view %s\n\n", view->name); + result = dns_keytable_dump(secroots, fp); + if (result != ISC_R_SUCCESS) + fprintf(fp, " dumpsecroots failed: %s\n", + isc_result_totext(result)); } - fprintf(fp, "\n Start view %s\n\n", view->name); - CHECK(dns_keytable_dump(secroots, fp)); - } - if (ptr != NULL) { - ptr = next_token(&args, " \t"); if (ptr != NULL) - goto nextview; - } + ptr = next_token(&args, " \t"); + } while (ptr != NULL); cleanup: if (secroots != NULL) @@ -7188,7 +7354,7 @@ ns_server_add_zone(ns_server_t *server, char *args) { /* Mark view unfrozen so that zone can be added */ dns_view_thaw(view); result = configure_zone(cfg->config, parms, vconfig, - server->mctx, view, &cfg->actx, ISC_FALSE); + server->mctx, view, cfg->actx, ISC_FALSE); dns_view_freeze(view); if (result != ISC_R_SUCCESS) { goto cleanup; @@ -7437,23 +7603,27 @@ ns_server_del_zone(ns_server_t *server, char *args) { } static void -cfgctx_destroy(void **cfgp) { +newzone_cfgctx_destroy(void **cfgp) { struct cfg_context *cfg; - isc_mem_t *mctx; REQUIRE(cfgp != NULL && *cfgp != NULL); + cfg = *cfgp; - mctx = cfg->mctx; - cfg->mctx = NULL; + + if (cfg->actx != NULL) + cfg_aclconfctx_detach(&cfg->actx); if (cfg->parser != NULL) { if (cfg->config != NULL) cfg_obj_destroy(cfg->parser, &cfg->config); cfg_parser_destroy(&cfg->parser); } - cfg_aclconfctx_clear(&cfg->actx); + if (cfg->nzparser != NULL) { + if (cfg->nzconfig != NULL) + cfg_obj_destroy(cfg->nzparser, &cfg->nzconfig); + cfg_parser_destroy(&cfg->nzparser); + } - isc_mem_put(mctx, cfg, sizeof(*cfg)); - isc_mem_detach(&mctx); + isc_mem_putanddetach(&cfg->mctx, cfg, sizeof(*cfg)); *cfgp = NULL; } diff --git a/bin/named/statschannel.c b/bin/named/statschannel.c index 6dce8e0a77c..1f726941a00 100644 --- a/bin/named/statschannel.c +++ b/bin/named/statschannel.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2008-2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: statschannel.c,v 1.26 2010-02-04 23:49:13 tbox Exp $ */ +/* $Id: statschannel.c,v 1.26.150.2 2011-03-12 04:59:14 tbox Exp $ */ /*! \file */ @@ -638,7 +638,7 @@ rdatasetstats_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) { static void opcodestat_dump(dns_opcode_t code, isc_uint64_t val, void *arg) { - FILE *fp = arg; + FILE *fp; isc_buffer_t b; char codebuf[64]; stats_dumparg_t *dumparg = arg; diff --git a/bin/named/unix/Makefile.in b/bin/named/unix/Makefile.in index ca92c49b5c7..a7155a0e358 100644 --- a/bin/named/unix/Makefile.in +++ b/bin/named/unix/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1999-2001 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.13 2009-12-05 23:31:40 each Exp $ +# $Id: Makefile.in,v 1.13.244.2 2011-03-10 23:47:26 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -22,14 +22,15 @@ top_srcdir = @top_srcdir@ @BIND9_MAKE_INCLUDES@ CINCLUDES = -I${srcdir}/include -I${srcdir}/../include \ + ${ISCCFG_INCLUDES} ${ISCCC_INCLUDES} \ ${DNS_INCLUDES} ${ISC_INCLUDES} CDEFINES = CWARNINGS = -OBJS = os.@O@ +OBJS = os.@O@ dlz_dlopen_driver.@O@ -SRCS = os.c +SRCS = os.c dlz_dlopen_driver.c TARGETS = ${OBJS} diff --git a/bin/named/unix/dlz_dlopen_driver.c b/bin/named/unix/dlz_dlopen_driver.c new file mode 100644 index 00000000000..35dbcab65c0 --- /dev/null +++ b/bin/named/unix/dlz_dlopen_driver.c @@ -0,0 +1,616 @@ +/* + * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id: dlz_dlopen_driver.c,v 1.1.4.4 2011-03-17 09:41:06 fdupont Exp $ */ + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include + +#ifdef ISC_DLZ_DLOPEN +static dns_sdlzimplementation_t *dlz_dlopen = NULL; + + +typedef struct dlopen_data { + isc_mem_t *mctx; + char *dl_path; + char *dlzname; + void *dl_handle; + void *dbdata; + unsigned int flags; + isc_mutex_t lock; + int version; + isc_boolean_t in_configure; + + dlz_dlopen_version_t *dlz_version; + dlz_dlopen_create_t *dlz_create; + dlz_dlopen_findzonedb_t *dlz_findzonedb; + dlz_dlopen_lookup_t *dlz_lookup; + dlz_dlopen_authority_t *dlz_authority; + dlz_dlopen_allnodes_t *dlz_allnodes; + dlz_dlopen_allowzonexfr_t *dlz_allowzonexfr; + dlz_dlopen_newversion_t *dlz_newversion; + dlz_dlopen_closeversion_t *dlz_closeversion; + dlz_dlopen_configure_t *dlz_configure; + dlz_dlopen_ssumatch_t *dlz_ssumatch; + dlz_dlopen_addrdataset_t *dlz_addrdataset; + dlz_dlopen_subrdataset_t *dlz_subrdataset; + dlz_dlopen_delrdataset_t *dlz_delrdataset; + dlz_dlopen_destroy_t *dlz_destroy; +} dlopen_data_t; + +/* Modules can choose whether they are lock-safe or not. */ +#define MAYBE_LOCK(cd) \ + do { \ + if ((cd->flags & DNS_SDLZFLAG_THREADSAFE) == 0 && \ + cd->in_configure == ISC_FALSE) \ + LOCK(&cd->lock); \ + } while (0) + +#define MAYBE_UNLOCK(cd) \ + do { \ + if ((cd->flags & DNS_SDLZFLAG_THREADSAFE) == 0 && \ + cd->in_configure == ISC_FALSE) \ + UNLOCK(&cd->lock); \ + } while (0) + +/* + * Log a message at the given level. + */ +static void dlopen_log(int level, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + isc_log_vwrite(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(level), + fmt, ap); + va_end(ap); +} + +/* + * SDLZ methods + */ + +static isc_result_t +dlopen_dlz_allnodes(const char *zone, void *driverarg, void *dbdata, + dns_sdlzallnodes_t *allnodes) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_result_t result; + + + UNUSED(driverarg); + + if (cd->dlz_allnodes == NULL) { + return (ISC_R_NOPERM); + } + + MAYBE_LOCK(cd); + result = cd->dlz_allnodes(zone, cd->dbdata, allnodes); + MAYBE_UNLOCK(cd); + return (result); +} + + +static isc_result_t +dlopen_dlz_allowzonexfr(void *driverarg, void *dbdata, const char *name, + const char *client) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_result_t result; + + UNUSED(driverarg); + + + if (cd->dlz_allowzonexfr == NULL) { + return (ISC_R_NOPERM); + } + + MAYBE_LOCK(cd); + result = cd->dlz_allowzonexfr(cd->dbdata, name, client); + MAYBE_UNLOCK(cd); + return (result); +} + +static isc_result_t +dlopen_dlz_authority(const char *zone, void *driverarg, void *dbdata, + dns_sdlzlookup_t *lookup) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_result_t result; + + UNUSED(driverarg); + + if (cd->dlz_authority == NULL) { + return (ISC_R_NOTIMPLEMENTED); + } + + MAYBE_LOCK(cd); + result = cd->dlz_authority(zone, cd->dbdata, lookup); + MAYBE_UNLOCK(cd); + return (result); +} + +static isc_result_t +dlopen_dlz_findzonedb(void *driverarg, void *dbdata, const char *name) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_result_t result; + + UNUSED(driverarg); + + MAYBE_LOCK(cd); + result = cd->dlz_findzonedb(cd->dbdata, name); + MAYBE_UNLOCK(cd); + return (result); +} + + +static isc_result_t +dlopen_dlz_lookup(const char *zone, const char *name, void *driverarg, + void *dbdata, dns_sdlzlookup_t *lookup) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_result_t result; + + UNUSED(driverarg); + + MAYBE_LOCK(cd); + result = cd->dlz_lookup(zone, name, cd->dbdata, lookup); + MAYBE_UNLOCK(cd); + return (result); +} + +/* + * Load a symbol from the library + */ +static void * +dl_load_symbol(dlopen_data_t *cd, const char *symbol, isc_boolean_t mandatory) { + void *ptr = dlsym(cd->dl_handle, symbol); + if (ptr == NULL && mandatory) { + dlopen_log(ISC_LOG_ERROR, + "dlz_dlopen: library '%s' is missing " + "required symbol '%s'", cd->dl_path, symbol); + } + return (ptr); +} + +/* + * Called at startup for each dlopen zone in named.conf + */ +static isc_result_t +dlopen_dlz_create(const char *dlzname, unsigned int argc, char *argv[], + void *driverarg, void **dbdata) +{ + dlopen_data_t *cd; + isc_mem_t *mctx = NULL; + isc_result_t result = ISC_R_FAILURE; + int dlopen_flags = 0; + + UNUSED(driverarg); + + if (argc < 2) { + dlopen_log(ISC_LOG_ERROR, + "dlz_dlopen driver for '%s' needs a path to " + "the shared library", dlzname); + return (ISC_R_FAILURE); + } + + isc_mem_create(0, 0, &mctx); + + cd = isc_mem_get(mctx, sizeof(*cd)); + if (cd == NULL) { + isc_mem_destroy(&mctx); + return (ISC_R_NOMEMORY); + } + memset(cd, 0, sizeof(*cd)); + + cd->mctx = mctx; + + cd->dl_path = isc_mem_strdup(cd->mctx, argv[1]); + if (cd->dl_path == NULL) { + goto failed; + } + + cd->dlzname = isc_mem_strdup(cd->mctx, dlzname); + if (cd->dlzname == NULL) { + goto failed; + } + + /* Initialize the lock */ + isc_mutex_init(&cd->lock); + + /* Open the library */ + dlopen_flags = RTLD_NOW; + +#ifdef RTLD_DEEPBIND + /* + * If RTLD_DEEPBIND is available then use it. This can avoid + * issues with a module using a different version of a system + * library than one that bind9 uses. For example, bind9 may link + * to MIT kerberos, but the module may use Heimdal. If we don't + * use RTLD_DEEPBIND then we could end up with Heimdal functions + * calling MIT functions, which leads to bizarre results (usually + * a segfault). + */ + dlopen_flags |= RTLD_DEEPBIND; +#endif + + cd->dl_handle = dlopen(cd->dl_path, dlopen_flags); + if (cd->dl_handle == NULL) { + dlopen_log(ISC_LOG_ERROR, + "dlz_dlopen failed to open library '%s' - %s", + cd->dl_path, dlerror()); + goto failed; + } + + /* Find the symbols */ + cd->dlz_version = (dlz_dlopen_version_t *) + dl_load_symbol(cd, "dlz_version", ISC_TRUE); + cd->dlz_create = (dlz_dlopen_create_t *) + dl_load_symbol(cd, "dlz_create", ISC_TRUE); + cd->dlz_lookup = (dlz_dlopen_lookup_t *) + dl_load_symbol(cd, "dlz_lookup", ISC_TRUE); + cd->dlz_findzonedb = (dlz_dlopen_findzonedb_t *) + dl_load_symbol(cd, "dlz_findzonedb", ISC_TRUE); + + if (cd->dlz_create == NULL || + cd->dlz_lookup == NULL || + cd->dlz_findzonedb == NULL) + { + /* We're missing a required symbol */ + goto failed; + } + + cd->dlz_allowzonexfr = (dlz_dlopen_allowzonexfr_t *) + dl_load_symbol(cd, "dlz_allowzonexfr", ISC_FALSE); + cd->dlz_allnodes = (dlz_dlopen_allnodes_t *) + dl_load_symbol(cd, "dlz_allnodes", + ISC_TF(cd->dlz_allowzonexfr != NULL)); + cd->dlz_authority = (dlz_dlopen_authority_t *) + dl_load_symbol(cd, "dlz_authority", ISC_FALSE); + cd->dlz_newversion = (dlz_dlopen_newversion_t *) + dl_load_symbol(cd, "dlz_newversion", ISC_FALSE); + cd->dlz_closeversion = (dlz_dlopen_closeversion_t *) + dl_load_symbol(cd, "dlz_closeversion", + ISC_TF(cd->dlz_newversion != NULL)); + cd->dlz_configure = (dlz_dlopen_configure_t *) + dl_load_symbol(cd, "dlz_configure", ISC_FALSE); + cd->dlz_ssumatch = (dlz_dlopen_ssumatch_t *) + dl_load_symbol(cd, "dlz_ssumatch", ISC_FALSE); + cd->dlz_addrdataset = (dlz_dlopen_addrdataset_t *) + dl_load_symbol(cd, "dlz_addrdataset", ISC_FALSE); + cd->dlz_subrdataset = (dlz_dlopen_subrdataset_t *) + dl_load_symbol(cd, "dlz_subrdataset", ISC_FALSE); + cd->dlz_delrdataset = (dlz_dlopen_delrdataset_t *) + dl_load_symbol(cd, "dlz_delrdataset", ISC_FALSE); + + /* Check the version of the API is the same */ + cd->version = cd->dlz_version(&cd->flags); + if (cd->version != DLZ_DLOPEN_VERSION) { + dlopen_log(ISC_LOG_ERROR, + "dlz_dlopen: incorrect version %d " + "should be %d in '%s'", + cd->version, DLZ_DLOPEN_VERSION, cd->dl_path); + goto failed; + } + + /* + * Call the library's create function. Note that this is an + * extended version of dlz create, with the addition of + * named function pointers for helper functions that the + * driver will need. This avoids the need for the backend to + * link the BIND9 libraries + */ + MAYBE_LOCK(cd); + result = cd->dlz_create(dlzname, argc-1, argv+1, + &cd->dbdata, + "log", dlopen_log, + "putrr", dns_sdlz_putrr, + "putnamedrr", dns_sdlz_putnamedrr, + "writeable_zone", dns_dlz_writeablezone, + NULL); + MAYBE_UNLOCK(cd); + if (result != ISC_R_SUCCESS) + goto failed; + + *dbdata = cd; + + return (ISC_R_SUCCESS); + +failed: + dlopen_log(ISC_LOG_ERROR, "dlz_dlopen of '%s' failed", dlzname); + if (cd->dl_path) + isc_mem_free(mctx, cd->dl_path); + if (cd->dlzname) + isc_mem_free(mctx, cd->dlzname); + if (dlopen_flags) + (void) isc_mutex_destroy(&cd->lock); +#ifdef HAVE_DLCLOSE + if (cd->dl_handle) + dlclose(cd->dl_handle); +#endif + isc_mem_put(mctx, cd, sizeof(*cd)); + isc_mem_destroy(&mctx); + return (result); +} + + +/* + * Called when bind is shutting down + */ +static void +dlopen_dlz_destroy(void *driverarg, void *dbdata) { + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_mem_t *mctx; + + UNUSED(driverarg); + + if (cd->dlz_destroy) { + MAYBE_LOCK(cd); + cd->dlz_destroy(cd->dbdata); + MAYBE_UNLOCK(cd); + } + + if (cd->dl_path) + isc_mem_free(cd->mctx, cd->dl_path); + if (cd->dlzname) + isc_mem_free(cd->mctx, cd->dlzname); + +#ifdef HAVE_DLCLOSE + if (cd->dl_handle) + dlclose(cd->dl_handle); +#endif + + (void) isc_mutex_destroy(&cd->lock); + + mctx = cd->mctx; + isc_mem_put(mctx, cd, sizeof(*cd)); + isc_mem_destroy(&mctx); +} + +/* + * Called to start a transaction + */ +static isc_result_t +dlopen_dlz_newversion(const char *zone, void *driverarg, void *dbdata, + void **versionp) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_result_t result; + + UNUSED(driverarg); + + if (cd->dlz_newversion == NULL) + return (ISC_R_NOTIMPLEMENTED); + + MAYBE_LOCK(cd); + result = cd->dlz_newversion(zone, cd->dbdata, versionp); + MAYBE_UNLOCK(cd); + return (result); +} + +/* + * Called to end a transaction + */ +static void +dlopen_dlz_closeversion(const char *zone, isc_boolean_t commit, + void *driverarg, void *dbdata, void **versionp) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + + UNUSED(driverarg); + + if (cd->dlz_newversion == NULL) { + *versionp = NULL; + return; + } + + MAYBE_LOCK(cd); + cd->dlz_closeversion(zone, commit, cd->dbdata, versionp); + MAYBE_UNLOCK(cd); +} + +/* + * Called on startup to configure any writeable zones + */ +static isc_result_t +dlopen_dlz_configure(dns_view_t *view, void *driverarg, void *dbdata) { + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_result_t result; + + UNUSED(driverarg); + + if (cd->dlz_configure == NULL) + return (ISC_R_SUCCESS); + + MAYBE_LOCK(cd); + cd->in_configure = ISC_TRUE; + result = cd->dlz_configure(view, cd->dbdata); + cd->in_configure = ISC_FALSE; + MAYBE_UNLOCK(cd); + + return (result); +} + + +/* + * Check for authority to change a name + */ +static isc_boolean_t +dlopen_dlz_ssumatch(const char *signer, const char *name, const char *tcpaddr, + const char *type, const char *key, isc_uint32_t keydatalen, + unsigned char *keydata, void *driverarg, void *dbdata) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_boolean_t ret; + + UNUSED(driverarg); + + if (cd->dlz_ssumatch == NULL) + return (ISC_FALSE); + + MAYBE_LOCK(cd); + ret = cd->dlz_ssumatch(signer, name, tcpaddr, type, key, keydatalen, + keydata, cd->dbdata); + MAYBE_UNLOCK(cd); + + return (ret); +} + + +/* + * Add an rdataset + */ +static isc_result_t +dlopen_dlz_addrdataset(const char *name, const char *rdatastr, + void *driverarg, void *dbdata, void *version) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_result_t result; + + UNUSED(driverarg); + + if (cd->dlz_addrdataset == NULL) + return (ISC_R_NOTIMPLEMENTED); + + MAYBE_LOCK(cd); + result = cd->dlz_addrdataset(name, rdatastr, cd->dbdata, version); + MAYBE_UNLOCK(cd); + + return (result); +} + +/* + * Subtract an rdataset + */ +static isc_result_t +dlopen_dlz_subrdataset(const char *name, const char *rdatastr, + void *driverarg, void *dbdata, void *version) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_result_t result; + + UNUSED(driverarg); + + if (cd->dlz_subrdataset == NULL) + return (ISC_R_NOTIMPLEMENTED); + + MAYBE_LOCK(cd); + result = cd->dlz_subrdataset(name, rdatastr, cd->dbdata, version); + MAYBE_UNLOCK(cd); + + return (result); +} + +/* + delete a rdataset + */ +static isc_result_t +dlopen_dlz_delrdataset(const char *name, const char *type, + void *driverarg, void *dbdata, void *version) +{ + dlopen_data_t *cd = (dlopen_data_t *) dbdata; + isc_result_t result; + + UNUSED(driverarg); + + if (cd->dlz_delrdataset == NULL) + return (ISC_R_NOTIMPLEMENTED); + + MAYBE_LOCK(cd); + result = cd->dlz_delrdataset(name, type, cd->dbdata, version); + MAYBE_UNLOCK(cd); + + return (result); +} + + +static dns_sdlzmethods_t dlz_dlopen_methods = { + dlopen_dlz_create, + dlopen_dlz_destroy, + dlopen_dlz_findzonedb, + dlopen_dlz_lookup, + dlopen_dlz_authority, + dlopen_dlz_allnodes, + dlopen_dlz_allowzonexfr, + dlopen_dlz_newversion, + dlopen_dlz_closeversion, + dlopen_dlz_configure, + dlopen_dlz_ssumatch, + dlopen_dlz_addrdataset, + dlopen_dlz_subrdataset, + dlopen_dlz_delrdataset +}; +#endif + +/* + * Register driver with BIND + */ +isc_result_t +dlz_dlopen_init(isc_mem_t *mctx) { +#ifndef ISC_DLZ_DLOPEN + UNUSED(mctx); + return (ISC_R_NOTIMPLEMENTED); +#else + isc_result_t result; + + dlopen_log(2, "Registering DLZ_dlopen driver"); + + result = dns_sdlzregister("dlopen", &dlz_dlopen_methods, NULL, + DNS_SDLZFLAG_RELATIVEOWNER | + DNS_SDLZFLAG_THREADSAFE, + mctx, &dlz_dlopen); + + if (result != ISC_R_SUCCESS) { + UNEXPECTED_ERROR(__FILE__, __LINE__, + "dns_sdlzregister() failed: %s", + isc_result_totext(result)); + result = ISC_R_UNEXPECTED; + } + + return (result); +#endif +} + + +/* + * Unregister the driver + */ +void +dlz_dlopen_clear(void) { +#ifdef ISC_DLZ_DLOPEN + dlopen_log(2, "Unregistering DLZ_dlopen driver"); + if (dlz_dlopen != NULL) + dns_sdlzunregister(&dlz_dlopen); +#endif +} diff --git a/bin/named/unix/os.c b/bin/named/unix/os.c index 53e9e450124..5fd65473860 100644 --- a/bin/named/unix/os.c +++ b/bin/named/unix/os.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: os.c,v 1.104 2010-11-17 23:47:08 tbox Exp $ */ +/* $Id: os.c,v 1.104.38.3 2011-03-02 00:04:01 marka Exp $ */ /*! \file */ @@ -790,6 +790,9 @@ ns_os_openfile(const char *filename, mode_t mode, isc_boolean_t switch_user) { free(f); if (switch_user && runas_pw != NULL) { +#ifndef HAVE_LINUXTHREADS + gid_t oldgid = getgid(); +#endif /* Set UID/GID to the one we'll be running with eventually */ setperms(runas_pw->pw_uid, runas_pw->pw_gid); @@ -797,7 +800,7 @@ ns_os_openfile(const char *filename, mode_t mode, isc_boolean_t switch_user) { #ifndef HAVE_LINUXTHREADS /* Restore UID/GID to root */ - setperms(0, 0); + setperms(0, oldgid); #endif /* HAVE_LINUXTHREADS */ if (fd == -1) { @@ -950,7 +953,7 @@ ns_os_shutdownmsg(char *command, isc_buffer_t *text) { isc_buffer_availablelength(text), "pid: %ld", (long)pid); /* Only send a message if it is complete. */ - if (n < isc_buffer_availablelength(text)) + if (n > 0 && n < isc_buffer_availablelength(text)) isc_buffer_add(text, n); } diff --git a/bin/named/update.c b/bin/named/update.c index eb1ed1d64ef..c99db5f8c46 100644 --- a/bin/named/update.c +++ b/bin/named/update.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: update.c,v 1.186.16.1.2.1 2011-06-02 23:47:28 tbox Exp $ */ +/* $Id: update.c,v 1.186.16.5 2011-03-25 23:53:52 each Exp $ */ #include @@ -1692,7 +1692,7 @@ next_active(ns_client_t *client, dns_zone_t *zone, dns_db_t *db, { isc_result_t result; dns_dbiterator_t *dbit = NULL; - isc_boolean_t has_nsec; + isc_boolean_t has_nsec = ISC_FALSE; unsigned int wraps = 0; isc_boolean_t secure = dns_db_issecure(db); @@ -2395,7 +2395,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db, name, diff)); } CHECK(add_exposed_sigs(client, zone, db, newver, name, - cut, diff, zone_keys, nkeys, + cut, &sig_diff, zone_keys, nkeys, inception, expire, check_ksk, keyset_kskonly)); } @@ -2554,7 +2554,7 @@ update_signatures(ns_client_t *client, dns_zone_t *zone, dns_db_t *db, privatetype, &nsec_diff)); } else { CHECK(add_exposed_sigs(client, zone, db, newver, name, - cut, diff, zone_keys, nkeys, + cut, &sig_diff, zone_keys, nkeys, inception, expire, check_ksk, keyset_kskonly)); CHECK(dns_nsec3_addnsec3sx(db, newver, name, nsecttl, @@ -3734,7 +3734,6 @@ update_action(isc_task_t *task, isc_event_t *event) { * Check Requestor's Permissions. It seems a bit silly to do this * only after prerequisite testing, but that is what RFC2136 says. */ - result = ISC_R_SUCCESS; if (ssutable == NULL) CHECK(checkupdateacl(client, dns_zone_getupdateacl(zone), "update", zonename, ISC_FALSE, ISC_FALSE)); diff --git a/bin/named/xfrout.c b/bin/named/xfrout.c index b036ed14d57..83c64f27954 100644 --- a/bin/named/xfrout.c +++ b/bin/named/xfrout.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: xfrout.c,v 1.139 2010-12-18 01:56:19 each Exp $ */ +/* $Id: xfrout.c,v 1.139.16.3 2011-07-28 04:30:54 marka Exp $ */ #include @@ -28,9 +28,7 @@ #include #include -#ifdef DLZ #include -#endif #include #include #include @@ -752,9 +750,7 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { char msg[NS_CLIENT_ACLMSGSIZE("zone transfer")]; char keyname[DNS_NAME_FORMATSIZE]; isc_boolean_t is_poll = ISC_FALSE; -#ifdef DLZ isc_boolean_t is_dlz = ISC_FALSE; -#endif switch (reqtype) { case dns_rdatatype_axfr: @@ -806,9 +802,7 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { result = dns_zt_find(client->view->zonetable, question_name, 0, NULL, &zone); - if (result != ISC_R_SUCCESS) -#ifdef DLZ - { + if (result != ISC_R_SUCCESS) { /* * Normal zone table does not have a match. * Try the DLZ database @@ -836,10 +830,8 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { goto failure; } if (result != ISC_R_SUCCESS) -#endif - FAILQ(DNS_R_NOTAUTH, "non-authoritative zone", - question_name, question_class); -#ifdef DLZ + FAILQ(DNS_R_NOTAUTH, "non-authoritative zone", + question_name, question_class); is_dlz = ISC_TRUE; /* * DLZ only support full zone transfer, not incremental @@ -859,7 +851,6 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { } } else { /* zone table has a match */ -#endif switch(dns_zone_gettype(zone)) { case dns_zone_master: case dns_zone_slave: @@ -870,9 +861,7 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { } CHECK(dns_zone_getdb(zone, &db)); dns_db_currentversion(db, &ver); -#ifdef DLZ } -#endif xfrout_log1(client, question_name, question_class, ISC_LOG_DEBUG(6), "%s question section OK", mnemonic); @@ -926,22 +915,15 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { "%s authority section OK", mnemonic); /* - * Decide whether to allow this transfer. - */ -#ifdef DLZ - /* - * if not a DLZ zone decide whether to allow this transfer. + * If not a DLZ zone, decide whether to allow this transfer. */ if (!is_dlz) { -#endif ns_client_aclmsg("zone transfer", question_name, reqtype, client->view->rdclass, msg, sizeof(msg)); CHECK(ns_client_checkacl(client, NULL, msg, dns_zone_getxfracl(zone), ISC_TRUE, ISC_LOG_ERROR)); -#ifdef DLZ } -#endif /* * AXFR over UDP is not possible. @@ -965,10 +947,9 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { /* * Get a dynamically allocated copy of the current SOA. */ -#ifdef DLZ if (is_dlz) dns_db_currentversion(db, &ver); -#endif + CHECK(dns_db_createsoatuple(db, ver, mctx, DNS_DIFFOP_EXISTS, ¤t_soa_tuple)); @@ -1054,7 +1035,6 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { -#ifdef DLZ if (is_dlz) CHECK(xfrout_ctx_create(mctx, client, request->id, question_name, reqtype, question_class, @@ -1067,7 +1047,6 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { ISC_TRUE : ISC_FALSE, &xfr)); else -#endif CHECK(xfrout_ctx_create(mctx, client, request->id, question_name, reqtype, question_class, zone, db, ver, quota, stream, @@ -1085,9 +1064,9 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype) { CHECK(xfr->stream->methods->first(xfr->stream)); - if (xfr->tsigkey != NULL) { + if (xfr->tsigkey != NULL) dns_name_format(&xfr->tsigkey->name, keyname, sizeof(keyname)); - } else + else keyname[0] = '\0'; if (is_poll) xfrout_log1(client, question_name, question_class, @@ -1157,7 +1136,8 @@ xfrout_ctx_create(isc_mem_t *mctx, ns_client_t *client, unsigned int id, xfr = isc_mem_get(mctx, sizeof(*xfr)); if (xfr == NULL) return (ISC_R_NOMEMORY); - xfr->mctx = mctx; + xfr->mctx = NULL; + isc_mem_attach(mctx, &xfr->mctx); xfr->client = NULL; ns_client_attach(client, &xfr->client); xfr->id = id; @@ -1531,6 +1511,7 @@ sendstream(xfrout_ctx_t *xfr) { static void xfrout_ctx_destroy(xfrout_ctx_t **xfrp) { xfrout_ctx_t *xfr = *xfrp; + ns_client_t *client = NULL; INSIST(xfr->sends == 0); @@ -1554,9 +1535,14 @@ xfrout_ctx_destroy(xfrout_ctx_t **xfrp) { if (xfr->db != NULL) dns_db_detach(&xfr->db); + /* + * We want to detch the client after we have released the memory + * context as ns_client_detach checks the memory reference count. + */ + ns_client_attach(xfr->client, &client); ns_client_detach(&xfr->client); - - isc_mem_put(xfr->mctx, xfr, sizeof(*xfr)); + isc_mem_putanddetach(&xfr->mctx, xfr, sizeof(*xfr)); + ns_client_detach(&client); *xfrp = NULL; } diff --git a/bin/named/zoneconf.c b/bin/named/zoneconf.c index eb93f1bbe45..a3e713b4e94 100644 --- a/bin/named/zoneconf.c +++ b/bin/named/zoneconf.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zoneconf.c,v 1.170 2011-01-06 23:47:00 tbox Exp $ */ +/* $Id: zoneconf.c,v 1.170.14.4 2011-05-23 20:56:10 each Exp $ */ /*% */ @@ -127,7 +127,7 @@ configure_zone_acl(const cfg_obj_t *zconfig, const cfg_obj_t *vconfig, /* First check to see if ACL is defined within the zone */ if (zconfig != NULL) { maps[0] = cfg_tuple_get(zconfig, "options"); - ns_config_get(maps, aclname, &aclobj); + (void)ns_config_get(maps, aclname, &aclobj); if (aclobj != NULL) { aclp = NULL; goto parse_acl; @@ -155,7 +155,7 @@ configure_zone_acl(const cfg_obj_t *zconfig, const cfg_obj_t *vconfig, maps[i++] = ns_g_defaults; maps[i] = NULL; - result = ns_config_get(maps, aclname, &aclobj); + (void)ns_config_get(maps, aclname, &aclobj); if (aclobj == NULL) { (*clearzacl)(zone); return (ISC_R_SUCCESS); @@ -605,7 +605,8 @@ configure_staticstub(const cfg_obj_t *zconfig, dns_zone_t *zone, /* Prepare zone RRs from the configuration */ obj = NULL; result = cfg_map_get(zconfig, "server-addresses", &obj); - if (obj != NULL) { + if (result == ISC_R_SUCCESS) { + INSIST(obj != NULL); result = configure_staticstub_serveraddrs(obj, zone, &rdatalist_ns, &rdatalist_a, @@ -616,7 +617,8 @@ configure_staticstub(const cfg_obj_t *zconfig, dns_zone_t *zone, obj = NULL; result = cfg_map_get(zconfig, "server-names", &obj); - if (obj != NULL) { + if (result == ISC_R_SUCCESS) { + INSIST(obj != NULL); result = configure_staticstub_servernames(obj, zone, &rdatalist_ns, zname); @@ -714,7 +716,7 @@ zonetype_fromconfig(const cfg_obj_t *map) { isc_result_t result; result = cfg_map_get(map, "type", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); return (ns_config_getzonetype(obj)); } @@ -778,7 +780,7 @@ checknames(dns_zonetype_t ztype, const cfg_obj_t **maps, INSIST(0); } result = ns_checknames_get(maps, zone, objp); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && objp != NULL && *objp != NULL); } isc_result_t @@ -832,7 +834,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, maps[i++] = options; } maps[i++] = ns_g_defaults; - maps[i++] = NULL; + maps[i] = NULL; if (vconfig != NULL) RETERR(ns_config_getclass(cfg_tuple_get(vconfig, "class"), @@ -934,7 +936,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "dialup", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); if (cfg_obj_isboolean(obj)) { if (cfg_obj_asboolean(obj)) dialup = dns_dialuptype_yes; @@ -957,7 +959,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "zone-statistics", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); zonestats_on = cfg_obj_asboolean(obj); zoneqrystats = NULL; if (zonestats_on) { @@ -976,7 +978,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, if (ztype != dns_zone_stub && ztype != dns_zone_staticstub) { obj = NULL; result = ns_config_get(maps, "notify", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); if (cfg_obj_isboolean(obj)) { if (cfg_obj_asboolean(obj)) notifytype = dns_notifytype_yes; @@ -1012,19 +1014,19 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "notify-source", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); RETERR(dns_zone_setnotifysrc4(zone, cfg_obj_assockaddr(obj))); ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj)); obj = NULL; result = ns_config_get(maps, "notify-source-v6", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); RETERR(dns_zone_setnotifysrc6(zone, cfg_obj_assockaddr(obj))); ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj)); obj = NULL; result = ns_config_get(maps, "notify-to-soa", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setoption(zone, DNS_ZONEOPT_NOTIFYTOSOA, cfg_obj_asboolean(obj)); @@ -1037,17 +1039,17 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "max-transfer-time-out", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setmaxxfrout(zone, cfg_obj_asuint32(obj) * 60); obj = NULL; result = ns_config_get(maps, "max-transfer-idle-out", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setidleout(zone, cfg_obj_asuint32(obj) * 60); obj = NULL; result = ns_config_get(maps, "max-journal-size", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setjournalsize(zone, -1); if (cfg_obj_isstring(obj)) { const char *str = cfg_obj_asstring(obj); @@ -1071,13 +1073,13 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "ixfr-from-differences", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); if (cfg_obj_isboolean(obj)) ixfrdiff = cfg_obj_asboolean(obj); - else if (strcasecmp(cfg_obj_asstring(obj), "master") && + else if (!strcasecmp(cfg_obj_asstring(obj), "master") && ztype == dns_zone_master) ixfrdiff = ISC_TRUE; - else if (strcasecmp(cfg_obj_asstring(obj), "slave") && + else if (!strcasecmp(cfg_obj_asstring(obj), "slave") && ztype == dns_zone_slave) ixfrdiff = ISC_TRUE; else @@ -1100,23 +1102,23 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "notify-delay", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setnotifydelay(zone, cfg_obj_asuint32(obj)); obj = NULL; result = ns_config_get(maps, "check-sibling", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setoption(zone, DNS_ZONEOPT_CHECKSIBLING, cfg_obj_asboolean(obj)); obj = NULL; result = ns_config_get(maps, "zero-no-soa-ttl", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setzeronosoattl(zone, cfg_obj_asboolean(obj)); obj = NULL; result = ns_config_get(maps, "nsec3-test-zone", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setoption(zone, DNS_ZONEOPT_NSEC3TESTZONE, cfg_obj_asboolean(obj)); } @@ -1145,7 +1147,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "sig-validity-interval", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); { const cfg_obj_t *validity, *resign; @@ -1176,28 +1178,28 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "sig-signing-signatures", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setsignatures(zone, cfg_obj_asuint32(obj)); obj = NULL; result = ns_config_get(maps, "sig-signing-nodes", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setnodes(zone, cfg_obj_asuint32(obj)); obj = NULL; result = ns_config_get(maps, "sig-signing-type", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setprivatetype(zone, cfg_obj_asuint32(obj)); obj = NULL; result = ns_config_get(maps, "update-check-ksk", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setoption(zone, DNS_ZONEOPT_UPDATECHECKKSK, cfg_obj_asboolean(obj)); obj = NULL; result = ns_config_get(maps, "dnssec-dnskey-kskonly", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setoption(zone, DNS_ZONEOPT_DNSKEYKSKONLY, cfg_obj_asboolean(obj)); } else if (ztype == dns_zone_slave) { @@ -1212,7 +1214,6 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, */ if (ztype == dns_zone_master) { isc_boolean_t allow = ISC_FALSE, maint = ISC_FALSE; - isc_boolean_t create = ISC_FALSE; obj = NULL; result = ns_config_get(maps, "check-wildcard", &obj); @@ -1224,7 +1225,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "check-dup-records", &obj); - INSIST(obj != NULL); + INSIST(result == ISC_R_SUCCESS && obj != NULL); if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) { fail = ISC_FALSE; check = ISC_TRUE; @@ -1239,7 +1240,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "check-mx", &obj); - INSIST(obj != NULL); + INSIST(result == ISC_R_SUCCESS && obj != NULL); if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) { fail = ISC_FALSE; check = ISC_TRUE; @@ -1254,13 +1255,13 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "check-integrity", &obj); - INSIST(obj != NULL); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setoption(zone, DNS_ZONEOPT_CHECKINTEGRITY, cfg_obj_asboolean(obj)); obj = NULL; result = ns_config_get(maps, "check-mx-cname", &obj); - INSIST(obj != NULL); + INSIST(result == ISC_R_SUCCESS && obj != NULL); if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) { warn = ISC_TRUE; ignore = ISC_FALSE; @@ -1275,7 +1276,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "check-srv-cname", &obj); - INSIST(obj != NULL); + INSIST(result == ISC_R_SUCCESS && obj != NULL); if (strcasecmp(cfg_obj_asstring(obj), "warn") == 0) { warn = ISC_TRUE; ignore = ISC_FALSE; @@ -1290,7 +1291,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, obj = NULL; result = ns_config_get(maps, "dnssec-secure-to-insecure", &obj); - INSIST(obj != NULL); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setoption(zone, DNS_ZONEOPT_SECURETOINSECURE, cfg_obj_asboolean(obj)); @@ -1302,15 +1303,12 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, allow = ISC_TRUE; else if (strcasecmp(arg, "maintain") == 0) allow = maint = ISC_TRUE; - else if (strcasecmp(arg, "create") == 0) - allow = maint = create = ISC_TRUE; else if (strcasecmp(arg, "off") == 0) ; else INSIST(0); dns_zone_setkeyopt(zone, DNS_ZONEKEY_ALLOW, allow); dns_zone_setkeyopt(zone, DNS_ZONEKEY_MAINTAIN, maint); - dns_zone_setkeyopt(zone, DNS_ZONEKEY_CREATE, create); } } @@ -1322,7 +1320,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, case dns_zone_stub: count = 0; obj = NULL; - result = cfg_map_get(zoptions, "masters", &obj); + (void)cfg_map_get(zoptions, "masters", &obj); if (obj != NULL) { addrs = NULL; keynames = NULL; @@ -1341,61 +1339,61 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, if (count > 1) { obj = NULL; result = ns_config_get(maps, "multi-master", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); multi = cfg_obj_asboolean(obj); } dns_zone_setoption(zone, DNS_ZONEOPT_MULTIMASTER, multi); obj = NULL; result = ns_config_get(maps, "max-transfer-time-in", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setmaxxfrin(zone, cfg_obj_asuint32(obj) * 60); obj = NULL; result = ns_config_get(maps, "max-transfer-idle-in", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setidlein(zone, cfg_obj_asuint32(obj) * 60); obj = NULL; result = ns_config_get(maps, "max-refresh-time", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setmaxrefreshtime(zone, cfg_obj_asuint32(obj)); obj = NULL; result = ns_config_get(maps, "min-refresh-time", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setminrefreshtime(zone, cfg_obj_asuint32(obj)); obj = NULL; result = ns_config_get(maps, "max-retry-time", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setmaxretrytime(zone, cfg_obj_asuint32(obj)); obj = NULL; result = ns_config_get(maps, "min-retry-time", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); dns_zone_setminretrytime(zone, cfg_obj_asuint32(obj)); obj = NULL; result = ns_config_get(maps, "transfer-source", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); RETERR(dns_zone_setxfrsource4(zone, cfg_obj_assockaddr(obj))); ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj)); obj = NULL; result = ns_config_get(maps, "transfer-source-v6", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); RETERR(dns_zone_setxfrsource6(zone, cfg_obj_assockaddr(obj))); ns_add_reserved_dispatch(ns_g_server, cfg_obj_assockaddr(obj)); obj = NULL; result = ns_config_get(maps, "alt-transfer-source", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); RETERR(dns_zone_setaltxfrsource4(zone, cfg_obj_assockaddr(obj))); obj = NULL; result = ns_config_get(maps, "alt-transfer-source-v6", &obj); - INSIST(result == ISC_R_SUCCESS); + INSIST(result == ISC_R_SUCCESS && obj != NULL); RETERR(dns_zone_setaltxfrsource6(zone, cfg_obj_assockaddr(obj))); obj = NULL; @@ -1433,7 +1431,6 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig, } -#ifdef DLZ /* * Set up a DLZ zone as writeable */ @@ -1455,7 +1452,6 @@ ns_zone_configure_writeable_dlz(dns_dlzdb_t *dlzdatabase, dns_zone_t *zone, dns_db_detach(&db); return result; } -#endif isc_boolean_t ns_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig) { diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c index 9bbea4bc937..058088c8996 100644 --- a/bin/nsupdate/nsupdate.c +++ b/bin/nsupdate/nsupdate.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: nsupdate.c,v 1.193 2011-01-10 05:32:03 marka Exp $ */ +/* $Id: nsupdate.c,v 1.193.12.3 2011-05-23 22:12:14 each Exp $ */ /*! \file */ @@ -145,7 +145,7 @@ static dns_name_t tmpzonename; static dns_name_t restart_master; static dns_tsig_keyring_t *gssring = NULL; static dns_tsigkey_t *tsigkey = NULL; -static dst_key_t *sig0key; +static dst_key_t *sig0key = NULL; static lwres_context_t *lwctx = NULL; static lwres_conf_t *lwconf; static isc_sockaddr_t *servers; @@ -695,8 +695,10 @@ setup_keyfile(isc_mem_t *mctx, isc_log_t *lctx) { keyfile, isc_result_totext(result)); return; } - } else + } else { dst_key_attach(dstkey, &sig0key); + dst_key_free(&dstkey); + } } static void @@ -2260,6 +2262,7 @@ recvsoa(isc_task_t *task, isc_event_t *event) { } check_result(result, "dns_request_getresponse"); section = DNS_SECTION_ANSWER; + POST(section); if (debugging) show_message(stderr, rcvmsg, "Reply from SOA query:"); @@ -2879,6 +2882,9 @@ cleanup(void) { } #endif + if (sig0key != NULL) + dst_key_free(&sig0key); + ddebug("Shutting down task manager"); isc_taskmgr_destroy(&taskmgr); diff --git a/bin/rndc/rndc.c b/bin/rndc/rndc.c index 1976d9ce332..1e9c3b064a8 100644 --- a/bin/rndc/rndc.c +++ b/bin/rndc/rndc.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rndc.c,v 1.131.20.1.2.1 2011-06-02 23:47:28 tbox Exp $ */ +/* $Id: rndc.c,v 1.131.20.2 2011-02-28 01:19:59 tbox Exp $ */ /*! \file */ diff --git a/bin/tools/genrandom.8 b/bin/tools/genrandom.8 index 32a4ff02efb..5005658c9a1 100644 --- a/bin/tools/genrandom.8 +++ b/bin/tools/genrandom.8 @@ -1,4 +1,4 @@ -.\" Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") +.\" Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC") .\" .\" Permission to use, copy, modify, and/or distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -12,7 +12,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: genrandom.8,v 1.8 2010-05-19 01:14:14 tbox Exp $ +.\" $Id: genrandom.8,v 1.8.124.1 2011-08-09 01:52:58 tbox Exp $ .\" .hy 0 .ad l @@ -53,7 +53,7 @@ size The size of the file, in kilobytes, to generate. .RE .PP -domain +filename .RS 4 The file name into which random data should be written. .RE @@ -65,5 +65,5 @@ The file name into which random data should be written. .PP Internet Systems Consortium .SH "COPYRIGHT" -Copyright \(co 2009, 2010 Internet Systems Consortium, Inc. ("ISC") +Copyright \(co 2009\-2011 Internet Systems Consortium, Inc. ("ISC") .br diff --git a/bin/tools/genrandom.docbook b/bin/tools/genrandom.docbook index 84e45534a82..b52ab4932a1 100644 --- a/bin/tools/genrandom.docbook +++ b/bin/tools/genrandom.docbook @@ -2,7 +2,7 @@ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" []> - + Feb 19, 2009 @@ -38,6 +38,7 @@ 2009 2010 + 2011 Internet Systems Consortium, Inc. ("ISC") @@ -84,7 +85,7 @@ - domain + filename The file name into which random data should be written. diff --git a/bin/tools/genrandom.html b/bin/tools/genrandom.html index c14af9bbd0e..c3b2993a05c 100644 --- a/bin/tools/genrandom.html +++ b/bin/tools/genrandom.html @@ -1,5 +1,5 @@ - + @@ -31,7 +31,7 @@

genrandom [-n number] {size} {filename}

-

DESCRIPTION

+

DESCRIPTION

genrandom generates a file or a set of files containing a specified quantity @@ -40,7 +40,7 @@

-

ARGUMENTS

+

ARGUMENTS

-n number

@@ -51,21 +51,21 @@

The size of the file, in kilobytes, to generate.

-
domain
+
filename

The file name into which random data should be written.

-

SEE ALSO

+

SEE ALSO

rand(3), arc4random(3)

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/config.h.in b/config.h.in index 01f8b166acb..477291da29f 100644 --- a/config.h.in +++ b/config.h.in @@ -16,7 +16,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: config.h.in,v 1.143.8.1 2011-02-03 05:52:35 marka Exp $ */ +/* $Id: config.h.in,v 1.143.8.4 2011-03-10 04:29:14 each Exp $ */ /*! \file */ @@ -144,12 +144,12 @@ int sigwait(const unsigned int *set, int *sig); /* Define if threads need PTHREAD_SCOPE_SYSTEM */ #undef NEED_PTHREAD_SCOPE_SYSTEM -/* Define if building universal (internal helper macro) */ -#undef AC_APPLE_UNIVERSAL_BUILD - /* Define to enable the "filter-aaaa-on-v4" option. */ #undef ALLOW_FILTER_AAAA_ON_V4 +/* define if ATF unit tests are to be built. */ +#undef ATF_TEST + /* Define if recvmsg() does not meet all of the BSD socket API specifications. */ #undef BROKEN_RECVMSG @@ -241,9 +241,6 @@ int sigwait(const unsigned int *set, int *sig); /* Define to 1 if you have the `c_r' library (-lc_r). */ #undef HAVE_LIBC_R -/* Define to 1 if you have the `dl' library (-ldl). */ -#undef HAVE_LIBDL - /* Define to 1 if you have the `nsl' library (-lnsl). */ #undef HAVE_LIBNSL @@ -361,6 +358,9 @@ int sigwait(const unsigned int *set, int *sig); /* Define to the flags type used by getnameinfo(3). */ #undef IRS_GETNAMEINFO_FLAGS_T +/* Define to allow building of objects for dlopen(). */ +#undef ISC_DLZ_DLOPEN + /* Defined if extern char *optarg is not declared. */ #undef NEED_OPTARG @@ -380,9 +380,6 @@ int sigwait(const unsigned int *set, int *sig); /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME -/* Define to the home page for this package. */ -#undef PACKAGE_URL - /* Define to the version of this package. */ #undef PACKAGE_VERSION @@ -403,17 +400,9 @@ int sigwait(const unsigned int *set, int *sig); /* define if idnkit support is to be included. */ #undef WITH_IDN -/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most - significant byte first (like Motorola and SPARC, unlike Intel). */ -#if defined AC_APPLE_UNIVERSAL_BUILD -# if defined __BIG_ENDIAN__ -# define WORDS_BIGENDIAN 1 -# endif -#else -# ifndef WORDS_BIGENDIAN -# undef WORDS_BIGENDIAN -# endif -#endif +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN /* Define to empty if `const' does not conform to ANSI C. */ #undef const diff --git a/configure.in b/configure.in index d5fb15cfb90..ff41067bdae 100644 --- a/configure.in +++ b/configure.in @@ -18,7 +18,7 @@ AC_DIVERT_PUSH(1)dnl esyscmd([sed "s/^/# /" COPYRIGHT])dnl AC_DIVERT_POP()dnl -AC_REVISION($Revision: 1.512.8.1 $) +AC_REVISION($Revision: 1.512.8.12 $) AC_INIT(lib/dns/name.c) AC_PREREQ(2.59) @@ -267,6 +267,14 @@ case "$host" in STD_CDEFINES="$STD_CDEFINES -D_GNU_SOURCE" CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" ;; + # + # Starting with OSX 10.7 (Lion) we must choose which IPv6 API to use. + # Setting this is sufficient to select the correct behavior for BIND 9. + # + *-darwin*) + STD_CDEFINES="$STD_CDEFINES -D__APPLE_USE_RFC_3542" + CPPFLAGS="$CPPFLAGS -D__APPLE_USE_RFC_3542" + ;; esac AC_HEADER_STDC @@ -682,7 +690,9 @@ esac int main() { #if (OPENSSL_VERSION_NUMBER >= 0x10000000L) ENGINE *e; + EC_KEY *ek; + ek = NULL; OPENSSL_config(NULL); e = ENGINE_by_id("gost"); @@ -699,7 +709,25 @@ int main() { [AC_MSG_RESULT(yes) have_gost="yes"], [AC_MSG_RESULT(no) - have_gost="no"]) + have_gost="no"], + [AC_MSG_RESULT(using --with-gost)]) + AC_ARG_WITH(gost, , with_gost="$withval", with_gost="auto") + case "$with_gost" in + yes) + case "$have_gost" in + no) AC_MSG_ERROR([gost not supported]) ;; + *) have_gost=yes ;; + esac + ;; + no) + have_gost=no ;; + *) + case "$have_gost" in + yes|no) ;; + *) AC_MSG_ERROR([need --with-gost=[[yes or no]]]) ;; + esac + ;; + esac case $have_gost in yes) OPENSSL_GOST="yes" @@ -795,20 +823,42 @@ AC_SUBST(PKCS11_PROVIDER) AC_MSG_CHECKING(for GSSAPI library) AC_ARG_WITH(gssapi, -[ --with-gssapi=PATH Specify path for system-supplied GSSAPI], - use_gssapi="$withval", use_gssapi="no") +[ --with-gssapi=PATH Specify path for system-supplied GSSAPI [[default=yes]]], + use_gssapi="$withval", use_gssapi="yes") -gssapidirs="/usr/local /usr/pkg /usr/kerberos /usr" +# gssapi is just the framework, we really require kerberos v5, so +# look for those headers (the gssapi headers must be there, too) +# The problem with this implementation is that it doesn't allow +# for the specification of gssapi and krb5 headers in different locations, +# which probably ought to be fixed although fixing might raise the issue of +# trying to build with incompatible versions of gssapi and krb5. if test "$use_gssapi" = "yes" then - for d in $gssapidirs - do - if test -f $d/include/gssapi/gssapi.h -o -f $d/include/gssapi.h + # first, deal with the obvious + if test \( -f /usr/include/kerberosv5/krb5.h -o \ + -f /usr/include/krb5/krb5.h -o \ + -f /usr/include/krb5.h \) -a \ + \( -f /usr/include/gssapi.h -o \ + -f /usr/include/gssapi/gssapi.h \) + then + use_gssapi=/usr + else + krb5dirs="/usr/local /usr/local/krb5 /usr/local/kerberosv5 /usr/local/kerberos /usr/pkg /usr/krb5 /usr/kerberosv5 /usr/kerberos /usr" + for d in $krb5dirs + do + if test -f $d/include/gssapi/gssapi_krb5.h -o \ + -f $d/include/krb5.h then - use_gssapi=$d - break + if test -f $d/include/gssapi/gssapi.h -o \ + -f $d/include/gssapi.h + then + use_gssapi=$d + break + fi fi - done + use_gssapi="no" + done + fi fi case "$use_gssapi" in @@ -1821,10 +1871,8 @@ char a[16],b[64]; return(inet_ntop(AF_INET6, a, b, sizeof(b)) == (char*)0);}], ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_ntop.$O" ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_ntop.c" ISC_PLATFORM_NEEDNTOP="#define ISC_PLATFORM_NEEDNTOP 1"], - [AC_MSG_RESULT(assuming inet_ntop needed) - ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_ntop.$O" - ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_ntop.c" - ISC_PLATFORM_NEEDNTOP="#define ISC_PLATFORM_NEEDNTOP 1"]) + [AC_MSG_RESULT(assuming inet_ntop not needed) + ISC_PLATFORM_NEEDNTOP="#undef ISC_PLATFORM_NEEDNTOP"]) # On NetBSD 1.4.2 and maybe others, inet_pton() incorrectly accepts @@ -1846,14 +1894,10 @@ main() { char a[16]; return (inet_pton(AF_INET, "1.2.3", a) == 1 ? 1 : ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_pton.$O" ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_pton.c" ISC_PLATFORM_NEEDPTON="#define ISC_PLATFORM_NEEDPTON 1"], - [AC_MSG_RESULT(assuming target platform has working inet_pton) - ISC_PLATFORM_NEEDPTON="#undef ISC_PLATFORM_NEEDPTON"], [AC_MSG_RESULT(assuming inet_pton needed) ISC_EXTRA_OBJS="$ISC_EXTRA_OBJS inet_pton.$O" ISC_EXTRA_SRCS="$ISC_EXTRA_SRCS inet_pton.c" - ISC_PLATFORM_NEEDPTON="#define ISC_PLATFORM_NEEDPTON 1"], - [AC_MSG_RESULT(assuming target platform has working inet_pton) - ISC_PLATFORM_NEEDPTON="#undef ISC_PLATFORM_NEEDPTON"]) + ISC_PLATFORM_NEEDPTON="#define ISC_PLATFORM_NEEDPTON 1"]) AC_SUBST(ISC_PLATFORM_NEEDNTOP) AC_SUBST(ISC_PLATFORM_NEEDPTON) @@ -2357,8 +2401,9 @@ ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE long long int"], ],[AC_MSG_ERROR(this cannot happen)]) ],[AC_MSG_ERROR(this cannot happen)]) ],[ -ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE long long int" -AC_MSG_RESULT(cannot determine type of rlim_cur when cross compiling - assuming long long int)]) +AC_ARG_WITH(rlimtype, , rlimtype="$withval", rlimtype="long long int") +ISC_PLATFORM_RLIMITTYPE="#define ISC_PLATFORM_RLIMITTYPE $rlimtype" +AC_MSG_RESULT(cannot determine type of rlim_cur when cross compiling - assuming $rlimtype)]) ]) AC_SUBST(ISC_PLATFORM_RLIMITTYPE) @@ -2567,27 +2612,22 @@ if test "$use_atomic" = "yes"; then [i[3456]86-*]) # XXX: some old x86 architectures actually do not support # (some of) these operations. Do we need stricter checks? -AC_TRY_RUN([ -main() { - exit((sizeof(void *) == 8) ? 0 : 1); -} -], - [arch=x86_64 - have_xaddq=yes], - [arch=x86_32], - [arch=x86_32]) + AC_CHECK_SIZEOF([void *]) + if test $ac_cv_sizeof_void_p = 8; then + arch=x86_64 + have_xaddq=yes + else + arch=x86_32 + fi ;; x86_64-*|amd64-*) -AC_TRY_RUN([ -main() { - exit((sizeof(void *) == 8) ? 0 : 1); -} -], - [arch=x86_64 - have_xaddq=yes], - [arch=x86_32], - [arch=x86_64 - have_xaddq=yes]) + AC_CHECK_SIZEOF([void *]) + if test $ac_cv_sizeof_void_p = 8; then + arch=x86_64 + have_xaddq=yes + else + arch=x86_32 + fi ;; alpha*-*) arch=alpha @@ -3033,6 +3073,34 @@ if test "$use_idn" != no; then fi AC_SUBST(IDNLIBS) +# +# Check whether to build Automated Test Framework unit tests +# +AC_ARG_WITH(atf, + [ --with-atf=ARG Automated Test Framework support], + atf="$withval", atf="no") +if test "$atf" = yes; then + atf=`pwd`/unit/atf + ATFBUILD=atf-src + AC_SUBST(ATFBUILD) + AC_CONFIG_COMMANDS([atf-config], + [cd unit/atf-src; ${SHELL} ./configure MISSING=: --prefix $atfdir; cd ../..], + [atfdir=`pwd`/unit/atf]) + AC_MSG_RESULT(building ATF from bind9/unit/atf-src) +fi + +ATFLIBS= +if test "$atf" != no; then + AC_DEFINE(ATF_TEST, 1, [define if ATF unit tests are to be built.]) + STD_CINCLUDES="$STD_CINCLUDES -I$atf/include" + ATFBIN="$atf/bin" + ATFLIBS="-L$atf/lib -latf-c" + UNITTESTS=tests +fi +AC_SUBST(ATFBIN) +AC_SUBST(ATFLIBS) +AC_SUBST(UNITTESTS) + AC_CHECK_HEADERS(locale.h) AC_CHECK_FUNCS(setlocale) @@ -3111,28 +3179,98 @@ LIBIRS_API=$srcdir/lib/irs/api # Configure any DLZ drivers. # # If config.dlz.in selects one or more DLZ drivers, it will set -# USE_DLZ to a non-empty value, which will be our clue to -# enable the DLZ core functions. +# CONTRIB_DLZ to a non-empty value, which will be our clue to +# build DLZ drivers in contrib. # # This section has to come after the libtool stuff because it needs to # know how to name the driver object files. # -USE_DLZ="" +CONTRIB_DLZ="" DLZ_DRIVER_INCLUDES="" DLZ_DRIVER_LIBS="" DLZ_DRIVER_SRCS="" DLZ_DRIVER_OBJS="" DLZ_SYSTEM_TEST="" +# +# Configure support for building a shared library object +# +# Even when libtool is available it can't always be relied upon +# to build an object that can be dlopen()'ed, but this is necessary +# for building the dlzexternal system test, so we'll try it the +# old-fashioned way. +# +SO="so" +SO_CFLAGS="" +SO_LD="" +SO_TARGETS="" + +AC_ARG_WITH(dlopen, + [ --with-dlopen=ARG Support dynamically loadable DLZ drivers], + dlopen="$withval", dlopen="yes") + +if test "$dlopen" = "yes"; then + AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no) + if test "$have_dl" = "yes"; then + LIBS="-ldl $LIBS" + fi + AC_CHECK_FUNCS(dlopen dlclose dlsym,,dlopen=no) +fi + +if test "$dlopen" = "yes"; then + case $host in + *-linux*) + SO_CFLAGS="-fPIC" + if test "$have_dl" = "yes" + then + SO_LD="${CC} -shared" + else + SO_LD="ld -shared" + fi + ;; + *-freebsd*|*-openbsd*|*-netbsd*) + SO_CFLAGS="-fpic" + SO_LD="ld -Bshareable -x" + ;; + *-solaris*) + SO_CFLAGS="-KPIC" + SO_LD="ld -G -z text" + ;; + *-hp-hpux*) + SO=sl + SO_CFLAGS="+z" + SO_LD="ld -b" + ;; + *) + SO_CFLAGS="-fPIC" + ;; + esac + + if test "X$GCC" = "Xyes"; then + SO_CFLAGS="-fPIC" + test -n "$SO_LD" || SO_LD="${CC} -shared" + fi + + # If we still don't know how to make shared objects, don't make any. + if test -n "$SO_LD"; then + SO_TARGETS="\${SO_TARGETS}" + AC_DEFINE(ISC_DLZ_DLOPEN, 1, + [Define to allow building of objects for dlopen().]) + fi +fi + +AC_SUBST(SO) +AC_SUBST(SO_CFLAGS) +AC_SUBST(SO_LD) +AC_SUBST(SO_TARGETS) + sinclude(contrib/dlz/config.dlz.in) +AC_MSG_CHECKING(contributed DLZ drivers) -AC_MSG_CHECKING(for DLZ) - -if test -n "$USE_DLZ" +if test -n "$CONTRIB_DLZ" then AC_MSG_RESULT(yes) - USE_DLZ="-DDLZ $USE_DLZ" DLZ_DRIVER_RULES=contrib/dlz/drivers/rules AC_CONFIG_FILES([$DLZ_DRIVER_RULES]) else @@ -3140,7 +3278,7 @@ else DLZ_DRIVER_RULES=/dev/null fi -AC_SUBST(USE_DLZ) +AC_SUBST(CONTRIB_DLZ) AC_SUBST(DLZ_DRIVER_INCLUDES) AC_SUBST(DLZ_DRIVER_LIBS) AC_SUBST(DLZ_DRIVER_SRCS) @@ -3303,11 +3441,15 @@ AC_CONFIG_FILES([ bin/tests/sockaddr/Makefile bin/tests/system/Makefile bin/tests/system/conf.sh + bin/tests/system/dlz/prereq.sh + bin/tests/system/dlzexternal/Makefile + bin/tests/system/dlzexternal/ns1/named.conf bin/tests/system/filter-aaaa/Makefile bin/tests/system/gost/prereq.sh bin/tests/system/lwresd/Makefile bin/tests/system/rpz/Makefile bin/tests/system/tkey/Makefile + bin/tests/system/tsiggss/Makefile bin/tests/tasks/Makefile bin/tests/timers/Makefile bin/tests/virtual-time/Makefile @@ -3335,6 +3477,7 @@ AC_CONFIG_FILES([ lib/dns/include/Makefile lib/dns/include/dns/Makefile lib/dns/include/dst/Makefile + lib/dns/tests/Makefile lib/export/Makefile lib/export/dns/Makefile lib/export/dns/include/Makefile @@ -3373,6 +3516,7 @@ AC_CONFIG_FILES([ lib/isc/include/Makefile lib/isc/include/isc/Makefile lib/isc/include/isc/platform.h + lib/isc/tests/Makefile lib/isc/nls/Makefile lib/isc/unix/Makefile lib/isc/unix/include/Makefile @@ -3395,6 +3539,8 @@ AC_CONFIG_FILES([ lib/tests/Makefile lib/tests/include/Makefile lib/tests/include/tests/Makefile + unit/Makefile + unit/unittest.sh ]) # diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index c3517843175..b899c8b4059 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -18,7 +18,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + BIND 9 Administrator Reference Manual @@ -70,7 +70,7 @@
- This version of the manual corresponds to BIND version 9.7. + This version of the manual corresponds to BIND version 9.8. @@ -1188,11 +1188,11 @@ zone "eng.example.com" { This command requires that the - auto-dnssec zone option to be set - to allow, - maintain, or - create, and also requires - the zone to be configured to allow dynamic DNS. + auto-dnssec zone option be set + to allow or + maintain, + and also requires the zone to be configured to + allow dynamic DNS. See for more details. @@ -1217,10 +1217,10 @@ zone "eng.example.com" { This command requires that the - auto-dnssec zone option to - be set to maintain or - create, and also requires - the zone to be configured to allow dynamic DNS. + auto-dnssec zone option + be set to maintain, + and also requires the zone to be configured to + allow dynamic DNS. See for more details. @@ -5791,12 +5791,15 @@ options { any;. - Each dns64 supports an optional - exclude ACL that selects which - IPv6 addresses will be ignored for the purposes - of determining whether dns64 is to be applied. - Any non-matching address will prevent further - DNS64 processing from occurring for this client. + Normally, DNS64 won't apply to a domain name that + owns one or more AAAA records; these records will + simply be returned. The optional + exclude ACL allows specification + of a list of IPv6 addresses that will be ignored + if they appear in a domain name's AAAA records, and + DNS64 will be applied to any A records the domain + name owns. If not defined, exclude + defaults to none. A optional suffix can also @@ -5806,6 +5809,21 @@ options { matching the prefix and mapped IPv4 address must be zero. + + If recursive-only is set to + yes the DNS64 synthesis will + only happen for recursive queries. The default + is no. + + + If break-dnssec is set to + yes the DNS64 synthesis will + happen even if the result, if validated, would + cause a DNSSEC validation failure. If this option + is set to no (the default), the DO + is set on the incoming query, and there are RRSIGs on + the applicable records, then synthesis will not happen. + acl rfc1918 { 10/8; 192.168/16; 172.16/12; }; @@ -7570,22 +7588,27 @@ avoid-v6-udp-ports {}; serial-query-rate - - - Slave servers will periodically query master servers - to find out if zone serial numbers have changed. Each such - query uses - a minute amount of the slave server's network bandwidth. To - limit the - amount of bandwidth used, BIND 9 limits the rate at which - queries are - sent. The value of the serial-query-rate option, - an integer, is the maximum number of queries sent per - second. - The default is 20. - - - + + + Slave servers will periodically query master + servers to find out if zone serial numbers have + changed. Each such query uses a minute amount of + the slave server's network bandwidth. To limit + the amount of bandwidth used, BIND 9 limits the + rate at which queries are sent. The value of the + serial-query-rate option, an + integer, is the maximum number of queries sent + per second. The default is 20. + + + In addition to controlling the rate SOA refresh + queries are issued at + serial-query-rate also controls + the rate at which NOTIFY messages are sent from + both master and slave zones. + + +
serial-queries @@ -8618,7 +8641,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; Sets the advertised EDNS UDP buffer size in bytes to control the size of packets received. - Valid values are 1024 to 4096 (values outside this range + Valid values are 512 to 4096 (values outside this range will be silently adjusted). The default value is 4096. The usual reason for setting edns-udp-size to a non-default @@ -8731,6 +8754,10 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; The delay, in seconds, between sending sets of notify messages for a zone. The default is five (5) seconds. + + The overall rate that NOTIFY messages are sent for all + zones is controlled by serial-query-rate. + @@ -8839,7 +8866,6 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; The current list of empty zones is: - 0.IN-ADDR.ARPA 127.IN-ADDR.ARPA 254.169.IN-ADDR.ARPA @@ -9986,7 +10011,7 @@ view "external" { min-retry-time number ; max-retry-time number ; key-directory path_name; - auto-dnssec allow|maintain|create|off; + auto-dnssec allow|maintain|off; zero-no-soa-ttl yes_or_no ; }; @@ -9998,6 +10023,7 @@ zone zone_name class allow-transfer { address_match_list }; allow-update-forwarding { address_match_list }; update-check-ksk yes_or_no; + dnssec-update-mode ( maintain | no-resign ); dnssec-dnskey-kskonly yes_or_no; dnssec-secure-to-insecure yes_or_no ; try-tcp-refresh yes_or_no; @@ -11043,7 +11069,7 @@ example.com. NS ns2.example.net. Zones configured for dynamic DNS may also use this option to allow varying levels of automatic DNSSEC key - management. There are four possible settings: + management. There are three possible settings: auto-dnssec allow; permits @@ -11067,7 +11093,12 @@ example.com. NS ns2.example.net. named to load keys from the key repository and schedule key maintenance events to occur in the future, but it does not sign the full zone - immediately. + immediately. Note: once keys have been loaded for a + zone the first time, the repository will be searched + for changes periodically, regardless of whether + rndc loadkeys is used. The recheck + interval is hard-coded to + one hour. auto-dnssec create; includes the @@ -11220,7 +11251,13 @@ example.com. NS ns2.example.net. The identity field must contain a fully-qualified domain name. - + + For nametypes krb5-self, + ms-self, krb5-subdomain, + and ms-subdomain the + identity field specifies + the Windows or Kerberos realm of the machine belongs to. + The nametype field has 13 values: @@ -11352,6 +11389,70 @@ example.com. NS ns2.example.net. + + + + ms-self + + + + This rule takes a Windows machine principal + (machine$@REALM) for machine in REALM and + and converts it machine.realm allowing the machine + to update machine.realm. The REALM to be matched + is specified in the identity + field. + + + + + + + ms-subdomain + + + + This rule takes a Windows machine principal + (machine$@REALM) for machine in REALM and + converts it to machine.realm allowing the machine + to update subdomains of machine.realm. The REALM + to be matched is specified in the + identity field. + + + + + + + krb5-self + + + + This rule takes a Kerberos machine principal + (host/machine@REALM) for machine in REALM and + and converts it machine.realm allowing the machine + to update machine.realm. The REALM to be matched + is specified in the identity + field. + + + + + + + krb5-subdomain + + + + This rule takes a Kerberos machine principal + (host/machine@REALM) for machine in REALM and + converts it to machine.realm allowing the machine + to update subdomains of machine.realm. The REALM + to be matched is specified in the + identity field. + + + diff --git a/doc/arm/Bv9ARM.ch01.html b/doc/arm/Bv9ARM.ch01.html index ff2c5ceec6e..f0ec1299e5a 100644 --- a/doc/arm/Bv9ARM.ch01.html +++ b/doc/arm/Bv9ARM.ch01.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -82,7 +82,7 @@ system administrators.

- This version of the manual corresponds to BIND version 9.7. + This version of the manual corresponds to BIND version 9.8.

diff --git a/doc/arm/Bv9ARM.ch03.html b/doc/arm/Bv9ARM.ch03.html index e01d69ec299..aaaa96a52b7 100644 --- a/doc/arm/Bv9ARM.ch03.html +++ b/doc/arm/Bv9ARM.ch03.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -54,7 +54,7 @@
Name Server Operations
Tools for Use With the Name Server Daemon
-
Signals
+
Signals
@@ -490,11 +490,11 @@ zone "eng.example.com" {

This command requires that the - auto-dnssec zone option to be set - to allow, - maintain, or - create, and also requires - the zone to be configured to allow dynamic DNS. + auto-dnssec zone option be set + to allow or + maintain, + and also requires the zone to be configured to + allow dynamic DNS. See the section called “Dynamic Update Policies” for more details.

@@ -518,10 +518,10 @@ zone "eng.example.com" {

This command requires that the - auto-dnssec zone option to - be set to maintain or - create, and also requires - the zone to be configured to allow dynamic DNS. + auto-dnssec zone option + be set to maintain, + and also requires the zone to be configured to + allow dynamic DNS. See the section called “Dynamic Update Policies” for more details.

@@ -873,7 +873,7 @@ controls {

-Signals

+Signals

Certain UNIX signals cause the name server to take specific actions, as described in the following table. These signals can diff --git a/doc/arm/Bv9ARM.ch04.html b/doc/arm/Bv9ARM.ch04.html index 77b74cb43ad..f1d0a6ccf13 100644 --- a/doc/arm/Bv9ARM.ch04.html +++ b/doc/arm/Bv9ARM.ch04.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -49,59 +49,59 @@

Dynamic Update
The journal file
Incremental Zone Transfers (IXFR)
-
Split DNS
-
Example split DNS setup
+
Split DNS
+
Example split DNS setup
TSIG
-
Generate Shared Keys for Each Pair of Hosts
-
Copying the Shared Secret to Both Machines
-
Informing the Servers of the Key's Existence
-
Instructing the Server to Use the Key
-
TSIG Key Based Access Control
-
Errors
+
Generate Shared Keys for Each Pair of Hosts
+
Copying the Shared Secret to Both Machines
+
Informing the Servers of the Key's Existence
+
Instructing the Server to Use the Key
+
TSIG Key Based Access Control
+
Errors
-
TKEY
-
SIG(0)
+
TKEY
+
SIG(0)
DNSSEC
-
Generating Keys
-
Signing the Zone
-
Configuring Servers
+
Generating Keys
+
Signing the Zone
+
Configuring Servers
DNSSEC, Dynamic Zones, and Automatic Signing
-
Converting from insecure to secure
-
Dynamic DNS update method
-
Fully automatic zone signing
-
Private-type records
-
DNSKEY rollovers
-
Dynamic DNS update method
-
Automatic key rollovers
-
NSEC3PARAM rollovers via UPDATE
-
Converting from NSEC to NSEC3
-
Converting from NSEC3 to NSEC
-
Converting from secure to insecure
-
Periodic re-signing
-
NSEC3 and OPTOUT
+
Converting from insecure to secure
+
Dynamic DNS update method
+
Fully automatic zone signing
+
Private-type records
+
DNSKEY rollovers
+
Dynamic DNS update method
+
Automatic key rollovers
+
NSEC3PARAM rollovers via UPDATE
+
Converting from NSEC to NSEC3
+
Converting from NSEC3 to NSEC
+
Converting from secure to insecure
+
Periodic re-signing
+
NSEC3 and OPTOUT
Dynamic Trust Anchor Management
-
Validating Resolver
-
Authoritative Server
+
Validating Resolver
+
Authoritative Server
PKCS #11 (Cryptoki) support
-
Prerequisites
-
Building BIND 9 with PKCS#11
-
PKCS #11 Tools
-
Using the HSM
-
Specifying the engine on the command line
-
Running named with automatic zone re-signing
+
Prerequisites
+
Building BIND 9 with PKCS#11
+
PKCS #11 Tools
+
Using the HSM
+
Specifying the engine on the command line
+
Running named with automatic zone re-signing
-
IPv6 Support in BIND 9
+
IPv6 Support in BIND 9
-
Address Lookups Using AAAA Records
-
Address to Name Lookups Using Nibble Format
+
Address Lookups Using AAAA Records
+
Address to Name Lookups Using Nibble Format
@@ -256,7 +256,7 @@

-Split DNS

+Split DNS

Setting up different views, or visibility, of the DNS space to internal and external resolvers is usually referred to as a @@ -286,7 +286,7 @@

-Example split DNS setup

+Example split DNS setup

Let's say a company named Example, Inc. (example.com) @@ -543,7 +543,7 @@ nameserver 172.16.72.4

-Generate Shared Keys for Each Pair of Hosts

+Generate Shared Keys for Each Pair of Hosts

A shared secret is generated to be shared between host1 and host2. An arbitrary key name is chosen: "host1-host2.". The key name must @@ -551,7 +551,7 @@ nameserver 172.16.72.4

-Automatic Generation

+Automatic Generation

The following command will generate a 128-bit (16 byte) HMAC-SHA256 key as described above. Longer keys are better, but shorter keys @@ -575,7 +575,7 @@ nameserver 172.16.72.4

-Manual Generation

+Manual Generation

The shared secret is simply a random sequence of bits, encoded in base-64. Most ASCII strings are valid base-64 strings (assuming @@ -590,7 +590,7 @@ nameserver 172.16.72.4

-Copying the Shared Secret to Both Machines

+Copying the Shared Secret to Both Machines

This is beyond the scope of DNS. A secure transport mechanism should be used. This could be secure FTP, ssh, telephone, etc. @@ -598,7 +598,7 @@ nameserver 172.16.72.4

-Informing the Servers of the Key's Existence

+Informing the Servers of the Key's Existence

Imagine host1 and host 2 are @@ -625,7 +625,7 @@ key host1-host2. {

-Instructing the Server to Use the Key

+Instructing the Server to Use the Key

Since keys are shared between two hosts only, the server must be told when keys are to be used. The following is added to the named.conf file @@ -657,7 +657,7 @@ server 10.1.2.3 {

-TSIG Key Based Access Control

+TSIG Key Based Access Control

BIND allows IP addresses and ranges to be specified in ACL @@ -684,7 +684,7 @@ allow-update { key host1-host2. ;};

-Errors

+Errors

The processing of TSIG signed messages can result in several errors. If a signed message is sent to a non-TSIG aware @@ -710,7 +710,7 @@ allow-update { key host1-host2. ;};

-TKEY

+TKEY

TKEY is a mechanism for automatically generating a shared secret between two hosts. There are several "modes" of @@ -746,7 +746,7 @@ allow-update { key host1-host2. ;};

-SIG(0)

+SIG(0)

BIND 9 partially supports DNSSEC SIG(0) transaction signatures as specified in RFC 2535 and RFC 2931. @@ -807,7 +807,7 @@ allow-update { key host1-host2. ;};

-Generating Keys

+Generating Keys

The dnssec-keygen program is used to generate keys. @@ -863,7 +863,7 @@ allow-update { key host1-host2. ;};

-Signing the Zone

+Signing the Zone

The dnssec-signzone program is used to sign a zone. @@ -905,7 +905,7 @@ allow-update { key host1-host2. ;};

-Configuring Servers

+Configuring Servers

To enable named to respond appropriately to DNS requests from DNSSEC aware clients, @@ -1065,7 +1065,7 @@ options { from insecure to signed and back again. A secure zone can use either NSEC or NSEC3 chains.

-Converting from insecure to secure

+Converting from insecure to secure

Changing a zone from insecure to secure can be done in two ways: using a dynamic DNS update, or the auto-dnssec zone option.

@@ -1091,7 +1091,7 @@ options { well. An NSEC chain will be generated as part of the initial signing process.

-Dynamic DNS update method

+Dynamic DNS update method

To insert the keys via dynamic update:

         % nsupdate
@@ -1127,7 +1127,7 @@ options {
 

While the initial signing and NSEC/NSEC3 chain generation is happening, other updates are possible as well.

-Fully automatic zone signing

+Fully automatic zone signing

To enable automatic signing, add the auto-dnssec option to the zone statement in named.conf. @@ -1162,7 +1162,7 @@ options { configuration. If this has not been done, the configuration will fail.

-Private-type records

+Private-type records

The state of the signing process is signaled by private-type records (with a default type value of 65534). When signing is complete, these records will have a nonzero value for @@ -1203,12 +1203,12 @@ options {

-DNSKEY rollovers

+DNSKEY rollovers

As with insecure-to-secure conversions, rolling DNSSEC keys can be done in two ways: using a dynamic DNS update, or the auto-dnssec zone option.

-Dynamic DNS update method

+Dynamic DNS update method

To perform key rollovers via dynamic update, you need to add the K* files for the new keys so that named can find them. You can then add the new @@ -1230,7 +1230,7 @@ options { named will clean out any signatures generated by the old key after the update completes.

-Automatic key rollovers

+Automatic key rollovers

When a new key reaches its activation date (as set by dnssec-keygen or dnssec-settime), if the auto-dnssec zone option is set to @@ -1245,27 +1245,27 @@ options { completes in 30 days, after which it will be safe to remove the old key from the DNSKEY RRset.

-NSEC3PARAM rollovers via UPDATE

+NSEC3PARAM rollovers via UPDATE

Add the new NSEC3PARAM record via dynamic update. When the new NSEC3 chain has been generated, the NSEC3PARAM flag field will be zero. At this point you can remove the old NSEC3PARAM record. The old chain will be removed after the update request completes.

-Converting from NSEC to NSEC3

+Converting from NSEC to NSEC3

To do this, you just need to add an NSEC3PARAM record. When the conversion is complete, the NSEC chain will have been removed and the NSEC3PARAM record will have a zero flag field. The NSEC3 chain will be generated before the NSEC chain is destroyed.

-Converting from NSEC3 to NSEC

+Converting from NSEC3 to NSEC

To do this, use nsupdate to remove all NSEC3PARAM records with a zero flag field. The NSEC chain will be generated before the NSEC3 chain is removed.

-Converting from secure to insecure

+Converting from secure to insecure

To convert a signed zone to unsigned using dynamic DNS, delete all the DNSKEY records from the zone apex using nsupdate. All signatures, NSEC or NSEC3 chains, @@ -1280,14 +1280,14 @@ options { allow instead (or it will re-sign).

-Periodic re-signing

+Periodic re-signing

In any secure zone which supports dynamic updates, named will periodically re-sign RRsets which have not been re-signed as a result of some update action. The signature lifetimes will be adjusted so as to spread the re-sign load over time rather than all at once.

-NSEC3 and OPTOUT

+NSEC3 and OPTOUT

named only supports creating new NSEC3 chains where all the NSEC3 records in the zone have the same OPTOUT @@ -1309,7 +1309,7 @@ options { configuration files.

-Validating Resolver

+Validating Resolver

To configure a validating resolver to use RFC 5011 to maintain a trust anchor, configure the trust anchor using a managed-keys statement. Information about @@ -1320,7 +1320,7 @@ options {

-Authoritative Server

+Authoritative Server

To set up an authoritative zone for RFC 5011 trust anchor maintenance, generate two (or more) key signing keys (KSKs) for the zone. Sign the zone with one of them; this is the "active" @@ -1394,7 +1394,7 @@ $ dnssec-signzone -S -K keys example.net< Debian Linux, Solaris x86 and Windows Server 2003.

-Prerequisites

+Prerequisites

See the HSM vendor documentation for information about installing, initializing, testing and troubleshooting the HSM.

@@ -1468,7 +1468,7 @@ $ patch -p1 -d openssl-0.9.8l \ when we configure BIND 9.

-Building OpenSSL for the AEP Keyper on Linux

+Building OpenSSL for the AEP Keyper on Linux

The AEP Keyper is a highly secure key storage device, but does not provide hardware cryptographic acceleration. It can carry out cryptographic operations, but it is probably @@ -1500,7 +1500,7 @@ $ ./Configure linux-generic32 -m32 -pthread \

-Building OpenSSL for the SCA 6000 on Solaris

+Building OpenSSL for the SCA 6000 on Solaris

The SCA-6000 PKCS #11 provider is installed as a system library, libpkcs11. It is a true crypto accelerator, up to 4 times faster than any CPU, so the flavor shall be @@ -1544,12 +1544,12 @@ $ ./Configure solaris64-x86_64-cc \

-Building BIND 9 with PKCS#11

+Building BIND 9 with PKCS#11

When building BIND 9, the location of the custom-built OpenSSL library must be specified via configure.

-Configuring BIND 9 for Linux

+Configuring BIND 9 for Linux

To link with the PKCS #11 provider, threads must be enabled in the BIND 9 build.

The PKCS #11 library for the AEP Keyper is currently @@ -1565,7 +1565,7 @@ $ ./configure CC="gcc -m32" --enable-threads \

-Configuring BIND 9 for Solaris

+Configuring BIND 9 for Solaris

To link with the PKCS #11 provider, threads must be enabled in the BIND 9 build.

@@ -1588,7 +1588,7 @@ $ ./configure CC="cc -xarch=amd64" --enable-thre
 
 

-PKCS #11 Tools

+PKCS #11 Tools

BIND 9 includes a minimal set of tools to operate the HSM, including pkcs11-keygen to generate a new key pair @@ -1606,7 +1606,7 @@ $ ./configure CC="cc -xarch=amd64" --enable-thre

-Using the HSM

+Using the HSM

First, we must set up the runtime environment so the OpenSSL and PKCS #11 libraries can be loaded:

@@ -1694,7 +1694,7 @@ example.net.signed
 
 

-Specifying the engine on the command line

+Specifying the engine on the command line

The OpenSSL engine can be specified in named and all of the BIND dnssec-* tools by using the "-E @@ -1715,7 +1715,7 @@ $ dnssec-signzone -E '' -S example.net

-Running named with automatic zone re-signing

+Running named with automatic zone re-signing

If you want named to dynamically re-sign zones using HSM keys, and/or to to sign new records inserted via nsupdate, then @@ -1751,7 +1751,7 @@ $ dnssec-signzone -E '' -S example.net

-IPv6 Support in BIND 9

+IPv6 Support in BIND 9

BIND 9 fully supports all currently defined forms of IPv6 name to address and address to name @@ -1789,7 +1789,7 @@ $ dnssec-signzone -E '' -S example.net

-Address Lookups Using AAAA Records

+Address Lookups Using AAAA Records

The IPv6 AAAA record is a parallel to the IPv4 A record, and, unlike the deprecated A6 record, specifies the entire @@ -1808,7 +1808,7 @@ host 3600 IN AAAA 2001:db8::1

-Address to Name Lookups Using Nibble Format

+Address to Name Lookups Using Nibble Format

When looking up an address in nibble format, the address components are simply reversed, just as in IPv4, and diff --git a/doc/arm/Bv9ARM.ch05.html b/doc/arm/Bv9ARM.ch05.html index 3b60755fe0f..99e2a9db661 100644 --- a/doc/arm/Bv9ARM.ch05.html +++ b/doc/arm/Bv9ARM.ch05.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -45,13 +45,13 @@

-The Lightweight Resolver Library

+The Lightweight Resolver Library

Traditionally applications have been linked with a stub resolver library that sends recursive DNS queries to a local caching name diff --git a/doc/arm/Bv9ARM.ch06.html b/doc/arm/Bv9ARM.ch06.html index 35243484d12..24338616ed0 100644 --- a/doc/arm/Bv9ARM.ch06.html +++ b/doc/arm/Bv9ARM.ch06.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -48,58 +48,58 @@

Configuration File Elements
Address Match Lists
-
Comment Syntax
+
Comment Syntax
Configuration File Grammar
-
acl Statement Grammar
+
acl Statement Grammar
acl Statement Definition and Usage
-
controls Statement Grammar
+
controls Statement Grammar
controls Statement Definition and Usage
-
include Statement Grammar
-
include Statement Definition and +
include Statement Grammar
+
include Statement Definition and Usage
-
key Statement Grammar
-
key Statement Definition and Usage
-
logging Statement Grammar
-
logging Statement Definition and +
key Statement Grammar
+
key Statement Definition and Usage
+
logging Statement Grammar
+
logging Statement Definition and Usage
-
lwres Statement Grammar
-
lwres Statement Definition and Usage
-
masters Statement Grammar
-
masters Statement Definition and +
lwres Statement Grammar
+
lwres Statement Definition and Usage
+
masters Statement Grammar
+
masters Statement Definition and Usage
-
options Statement Grammar
+
options Statement Grammar
options Statement Definition and Usage
server Statement Grammar
server Statement Definition and Usage
statistics-channels Statement Grammar
-
statistics-channels Statement Definition and +
statistics-channels Statement Definition and Usage
trusted-keys Statement Grammar
-
trusted-keys Statement Definition +
trusted-keys Statement Definition and Usage
-
managed-keys Statement Grammar
+
managed-keys Statement Grammar
managed-keys Statement Definition and Usage
view Statement Grammar
-
view Statement Definition and Usage
+
view Statement Definition and Usage
zone Statement Grammar
-
zone Statement Definition and Usage
+
zone Statement Definition and Usage
-
Zone File
+
Zone File
Types of Resource Records and When to Use Them
-
Discussion of MX Records
+
Discussion of MX Records
Setting TTLs
-
Inverse Mapping in IPv4
-
Other Zone File Directives
-
BIND Master File Extension: the $GENERATE Directive
+
Inverse Mapping in IPv4
+
Other Zone File Directives
+
BIND Master File Extension: the $GENERATE Directive
Additional File Formats
BIND9 Statistics
@@ -477,7 +477,7 @@ Address Match Lists

-Syntax

+Syntax
address_match_list = address_match_list_element ;
   [ address_match_list_element; ... ]
 address_match_list_element = [ ! ] (ip_address [/length] |
@@ -486,7 +486,7 @@
 
 

-Definition and Usage

+Definition and Usage

Address match lists are primarily used to determine access control for various server operations. They are also used in @@ -570,7 +570,7 @@

-Comment Syntax

+Comment Syntax

The BIND 9 comment syntax allows for comments to appear @@ -580,7 +580,7 @@

-Syntax

+Syntax

/* This is a BIND comment as in C */
@@ -596,7 +596,7 @@

-Definition and Usage

+Definition and Usage

Comments may appear anywhere that whitespace may appear in a BIND configuration file. @@ -848,7 +848,7 @@

-acl Statement Grammar

+acl Statement Grammar
acl acl-name {
     address_match_list
 };
@@ -930,7 +930,7 @@
 
 

-controls Statement Grammar

+controls Statement Grammar
controls {
    [ inet ( ip_addr | * ) [ port ip_port ]
                 allow {  address_match_list  }
@@ -1054,12 +1054,12 @@
 
 

-include Statement Grammar

+include Statement Grammar
include filename;

-include Statement Definition and +include Statement Definition and Usage

The include statement inserts the @@ -1074,7 +1074,7 @@

-key Statement Grammar

+key Statement Grammar
key key_id {
     algorithm string;
     secret string;
@@ -1083,7 +1083,7 @@
 
 

-key Statement Definition and Usage

+key Statement Definition and Usage

The key statement defines a shared secret key for use with TSIG (see the section called “TSIG”) @@ -1130,7 +1130,7 @@

-logging Statement Grammar

+logging Statement Grammar
logging {
    [ channel channel_name {
      ( file path_name
@@ -1154,7 +1154,7 @@
 
 

-logging Statement Definition and +logging Statement Definition and Usage

The logging statement configures a @@ -1188,7 +1188,7 @@

-The channel Phrase

+The channel Phrase

All log output goes to one or more channels; you can make as many of them as you want. @@ -1753,7 +1753,7 @@ category notify { null; };

-The query-errors Category

+The query-errors Category

The query-errors category is specifically intended for debugging purposes: To identify @@ -1981,7 +1981,7 @@ badresp:1,adberr:0,findfail:0,valfail:0]

-lwres Statement Grammar

+lwres Statement Grammar

This is the grammar of the lwres statement in the named.conf file: @@ -1997,7 +1997,7 @@ badresp:1,adberr:0,findfail:0,valfail:0]

-lwres Statement Definition and Usage

+lwres Statement Definition and Usage

The lwres statement configures the name @@ -2048,7 +2048,7 @@ badresp:1,adberr:0,findfail:0,valfail:0]

-masters Statement Grammar

+masters Statement Grammar
 masters name [port ip_port] { ( masters_list | 
       ip_addr [port ip_port] [key key] ) ; [...] };
@@ -2056,7 +2056,7 @@ badresp:1,adberr:0,findfail:0,valfail:0]
 
 

-masters Statement Definition and +masters Statement Definition and Usage

masters lists allow for a common set of masters to be easily used by @@ -2065,7 +2065,7 @@ badresp:1,adberr:0,findfail:0,valfail:0]

-options Statement Grammar

+options Statement Grammar

This is the grammar of the options statement in the named.conf file: @@ -2737,12 +2737,15 @@ options { any;.

- Each dns64 supports an optional - exclude ACL that selects which - IPv6 addresses will be ignored for the purposes - of determining whether dns64 is to be applied. - Any non-matching address will prevent further - DNS64 processing from occurring for this client. + Normally, DNS64 won't apply to a domain name that + owns one or more AAAA records; these records will + simply be returned. The optional + exclude ACL allows specification + of a list of IPv6 addresses that will be ignored + if they appear in a domain name's AAAA records, and + DNS64 will be applied to any A records the domain + name owns. If not defined, exclude + defaults to none.

A optional suffix can also @@ -2752,6 +2755,21 @@ options { matching the prefix and mapped IPv4 address must be zero.

+

+ If recursive-only is set to + yes the DNS64 synthesis will + only happen for recursive queries. The default + is no. +

+

+ If break-dnssec is set to + yes the DNS64 synthesis will + happen even if the result, if validated, would + cause a DNSSEC validation failure. If this option + is set to no (the default), the DO + is set on the incoming query, and there are RRSIGs on + the applicable records, then synthesis will not happen. +

         acl rfc1918 { 10/8; 192.168/16; 172.16/12; };
 
@@ -3631,7 +3649,7 @@ options {
 
 

-Forwarding

+Forwarding

The forwarding facility can be used to create a large site-wide cache on a few servers, reducing traffic over links to external @@ -3675,7 +3693,7 @@ options {

-Dual-stack Servers

+Dual-stack Servers

Dual-stack servers are used as servers of last resort to work around @@ -3886,7 +3904,7 @@ options {

-Interfaces

+Interfaces

The interfaces and ports that the server will answer queries from may be specified using the listen-on option. listen-on takes @@ -4160,19 +4178,26 @@ avoid-v6-udp-ports {}; hour). The maximum value is 28 days (40320 minutes).

serial-query-rate
-

- Slave servers will periodically query master servers - to find out if zone serial numbers have changed. Each such - query uses - a minute amount of the slave server's network bandwidth. To - limit the - amount of bandwidth used, BIND 9 limits the rate at which - queries are - sent. The value of the serial-query-rate option, - an integer, is the maximum number of queries sent per - second. - The default is 20. -

+
+

+ Slave servers will periodically query master + servers to find out if zone serial numbers have + changed. Each such query uses a minute amount of + the slave server's network bandwidth. To limit + the amount of bandwidth used, BIND 9 limits the + rate at which queries are sent. The value of the + serial-query-rate option, an + integer, is the maximum number of queries sent + per second. The default is 20. +

+

+ In addition to controlling the rate SOA refresh + queries are issued at + serial-query-rate also controls + the rate at which NOTIFY messages are sent from + both master and slave zones. +

+
serial-queries

In BIND 8, the serial-queries @@ -4338,7 +4363,7 @@ avoid-v6-udp-ports {};

-UDP Port Lists

+UDP Port Lists

use-v4-udp-ports, avoid-v4-udp-ports, @@ -4380,7 +4405,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-Operating System Resource Limits

+Operating System Resource Limits

The server's usage of many system resources can be limited. Scaled values are allowed when specifying resource limits. For @@ -4542,7 +4567,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-Periodic Task Intervals

+Periodic Task Intervals
cleaning-interval

@@ -5007,7 +5032,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

Sets the advertised EDNS UDP buffer size in bytes to control the size of packets received. - Valid values are 1024 to 4096 (values outside this range + Valid values are 512 to 4096 (values outside this range will be silently adjusted). The default value is 4096. The usual reason for setting edns-udp-size to a non-default @@ -5102,10 +5127,16 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

notify-delay
-

+

+

The delay, in seconds, between sending sets of notify messages for a zone. The default is five (5) seconds. -

+

+

+ The overall rate that NOTIFY messages are sent for all + zones is controlled by serial-query-rate. +

+
@@ -5193,6 +5224,24 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; The current list of empty zones is:

    +
  • 10.IN-ADDR.ARPA
  • +
  • 16.172.IN-ADDR.ARPA
  • +
  • 17.172.IN-ADDR.ARPA
  • +
  • 18.172.IN-ADDR.ARPA
  • +
  • 19.172.IN-ADDR.ARPA
  • +
  • 20.172.IN-ADDR.ARPA
  • +
  • 21.172.IN-ADDR.ARPA
  • +
  • 22.172.IN-ADDR.ARPA
  • +
  • 23.172.IN-ADDR.ARPA
  • +
  • 24.172.IN-ADDR.ARPA
  • +
  • 25.172.IN-ADDR.ARPA
  • +
  • 26.172.IN-ADDR.ARPA
  • +
  • 27.172.IN-ADDR.ARPA
  • +
  • 28.172.IN-ADDR.ARPA
  • +
  • 29.172.IN-ADDR.ARPA
  • +
  • 30.172.IN-ADDR.ARPA
  • +
  • 31.172.IN-ADDR.ARPA
  • +
  • 168.192.IN-ADDR.ARPA
  • 0.IN-ADDR.ARPA
  • 127.IN-ADDR.ARPA
  • 254.169.IN-ADDR.ARPA
  • @@ -5357,7 +5406,7 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };

-Content Filtering

+Content Filtering

BIND 9 provides the ability to filter out DNS responses from external DNS servers containing @@ -5480,7 +5529,7 @@ deny-answer-aliases { "example.net"; };

-Response Policy Zone (RPZ) Rewriting

+Response Policy Zone (RPZ) Rewriting

BIND 9 includes an intentionally limited mechanism to modify DNS responses for recursive requests @@ -5818,7 +5867,7 @@ ns.domain.com.rpz-nsdname CNAME .

-statistics-channels Statement Definition and +statistics-channels Statement Definition and Usage

The statistics-channels statement @@ -5878,7 +5927,7 @@ ns.domain.com.rpz-nsdname CNAME .

-trusted-keys Statement Definition +trusted-keys Statement Definition and Usage

The trusted-keys statement defines @@ -5918,7 +5967,7 @@ ns.domain.com.rpz-nsdname CNAME .

-managed-keys Statement Grammar

+managed-keys Statement Grammar
managed-keys {
     string initial-key number number number string ;
     [ string initial-key number number number string ; [...]]
@@ -6053,7 +6102,7 @@ ns.domain.com.rpz-nsdname   CNAME   .
 
 

-view Statement Definition and Usage

+view Statement Definition and Usage

The view statement is a powerful feature @@ -6219,7 +6268,7 @@ view "external" { [ min-retry-time number ; ] [ max-retry-time number ; ] [ key-directory path_name; ] - [ auto-dnssec allow|maintain|create|off; ] + [ auto-dnssec allow|maintain|off; ] [ zero-no-soa-ttl yes_or_no ; ] }; @@ -6231,6 +6280,7 @@ zone zone_name [ allow-transfer { address_match_list }; ] [ allow-update-forwarding { address_match_list }; ] [ update-check-ksk yes_or_no; ] + [ dnssec-update-mode ( maintain | no-resign ); ] [ dnssec-dnskey-kskonly yes_or_no; ] [ dnssec-secure-to-insecure yes_or_no ; ] [ try-tcp-refresh yes_or_no; ] @@ -6341,10 +6391,10 @@ zone zone_name [

-zone Statement Definition and Usage

+zone Statement Definition and Usage

-Zone Types

+Zone Types
@@ -6604,7 +6654,7 @@ zone zone_name [

-Class

+Class

The zone's name may optionally be followed by a class. If a class is not specified, class IN (for Internet), @@ -6626,7 +6676,7 @@ zone zone_name [

-Zone Options

+Zone Options
allow-notify

@@ -7025,7 +7075,7 @@ example.com. NS ns2.example.net.

Zones configured for dynamic DNS may also use this option to allow varying levels of automatic DNSSEC key - management. There are four possible settings: + management. There are three possible settings:

auto-dnssec allow; permits @@ -7049,7 +7099,12 @@ example.com. NS ns2.example.net. named to load keys from the key repository and schedule key maintenance events to occur in the future, but it does not sign the full zone - immediately. + immediately. Note: once keys have been loaded for a + zone the first time, the repository will be searched + for changes periodically, regardless of whether + rndc loadkeys is used. The recheck + interval is hard-coded to + one hour.

auto-dnssec create; includes the @@ -7180,6 +7235,13 @@ example.com. NS ns2.example.net. The identity field must contain a fully-qualified domain name.

+

+ For nametypes krb5-self, + ms-self, krb5-subdomain, + and ms-subdomain the + identity field specifies + the Windows or Kerberos realm of the machine belongs to. +

The nametype field has 13 values: @@ -7319,6 +7381,74 @@ example.com. NS ns2.example.net.

+ + + + + + + + + + + + + + + +
+

+ ms-self +

+
+

+ This rule takes a Windows machine principal + (machine$@REALM) for machine in REALM and + and converts it machine.realm allowing the machine + to update machine.realm. The REALM to be matched + is specified in the <replacable>identity</replacable> + field. +

+
+

+ ms-subdomain +

+
+

+ This rule takes a Windows machine principal + (machine$@REALM) for machine in REALM and + converts it to machine.realm allowing the machine + to update subdomains of machine.realm. The REALM + to be matched is specified in the + <replacable>identity</replacable> field. +

+
+

+ krb5-self +

+
+

+ This rule takes a Kerberos machine principal + (host/machine@REALM) for machine in REALM and + and converts it machine.realm allowing the machine + to update machine.realm. The REALM to be matched + is specified in the <replacable>identity</replacable> + field. +

+
+

+ krb5-subdomain +

+
+

+ This rule takes a Kerberos machine principal + (host/machine@REALM) for machine in REALM and + converts it to machine.realm allowing the machine + to update subdomains of machine.realm. The REALM + to be matched is specified in the + <replacable>identity</replacable> field. +

+

tcp-self @@ -7423,7 +7553,7 @@ example.com. NS ns2.example.net.

-Zone File

+Zone File

Types of Resource Records and When to Use Them

@@ -7436,7 +7566,7 @@ example.com. NS ns2.example.net.

-Resource Records

+Resource Records

A domain name identifies a node. Each node has a set of resource information, which may be empty. The set of resource @@ -8173,7 +8303,7 @@ example.com. NS ns2.example.net.

-Textual expression of RRs

+Textual expression of RRs

RRs are represented in binary form in the packets of the DNS protocol, and are usually represented in highly encoded form @@ -8376,7 +8506,7 @@ example.com. NS ns2.example.net.

-Discussion of MX Records

+Discussion of MX Records

As described above, domain servers store information as a series of resource records, each of which contains a particular @@ -8632,7 +8762,7 @@ example.com. NS ns2.example.net.

-Inverse Mapping in IPv4

+Inverse Mapping in IPv4

Reverse name resolution (that is, translation from IP address to name) is achieved by means of the in-addr.arpa domain @@ -8693,7 +8823,7 @@ example.com. NS ns2.example.net.

-Other Zone File Directives

+Other Zone File Directives

The Master File Format was initially defined in RFC 1035 and has subsequently been extended. While the Master File Format @@ -8708,7 +8838,7 @@ example.com. NS ns2.example.net.

-The @ (at-sign)

+The @ (at-sign)

When used in the label (or name) field, the asperand or at-sign (@) symbol represents the current origin. @@ -8719,7 +8849,7 @@ example.com. NS ns2.example.net.

-The $ORIGIN Directive

+The $ORIGIN Directive

Syntax: $ORIGIN domain-name @@ -8748,7 +8878,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.

-The $INCLUDE Directive

+The $INCLUDE Directive

Syntax: $INCLUDE filename @@ -8784,7 +8914,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.

-The $TTL Directive

+The $TTL Directive

Syntax: $TTL default-ttl @@ -8803,7 +8933,7 @@ WWW.EXAMPLE.COM. CNAME MAIN-SERVER.EXAMPLE.COM.

-BIND Master File Extension: the $GENERATE Directive

+BIND Master File Extension: the $GENERATE Directive

Syntax: $GENERATE range @@ -9227,7 +9357,7 @@ HOST-127.EXAMPLE. MX 0 .

-Name Server Statistics Counters

+Name Server Statistics Counters
@@ -9784,7 +9914,7 @@ HOST-127.EXAMPLE. MX 0 .

-Zone Maintenance Statistics Counters

+Zone Maintenance Statistics Counters
@@ -9938,7 +10068,7 @@ HOST-127.EXAMPLE. MX 0 .

-Resolver Statistics Counters

+Resolver Statistics Counters
@@ -10321,7 +10451,7 @@ HOST-127.EXAMPLE. MX 0 .

-Socket I/O Statistics Counters

+Socket I/O Statistics Counters

Socket I/O statistics counters are defined per socket types, which are @@ -10476,7 +10606,7 @@ HOST-127.EXAMPLE. MX 0 .

-Compatibility with BIND 8 Counters

+Compatibility with BIND 8 Counters

Most statistics counters that were available in BIND 8 are also supported in diff --git a/doc/arm/Bv9ARM.ch07.html b/doc/arm/Bv9ARM.ch07.html index 371f4a94eca..f2c50e28656 100644 --- a/doc/arm/Bv9ARM.ch07.html +++ b/doc/arm/Bv9ARM.ch07.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -46,10 +46,10 @@

Table of Contents

Access Control Lists
-
Chroot and Setuid
+
Chroot and Setuid
-
The chroot Environment
-
Using the setuid Function
+
The chroot Environment
+
Using the setuid Function
Dynamic Update Security
@@ -122,7 +122,7 @@ zone "example.com" {

-Chroot and Setuid +Chroot and Setuid

On UNIX servers, it is possible to run BIND @@ -148,7 +148,7 @@ zone "example.com" {

-The chroot Environment

+The chroot Environment

In order for a chroot environment to @@ -176,7 +176,7 @@ zone "example.com" {

-Using the setuid Function

+Using the setuid Function

Prior to running the named daemon, use diff --git a/doc/arm/Bv9ARM.ch08.html b/doc/arm/Bv9ARM.ch08.html index 0681e47ce1e..faa3a0434c0 100644 --- a/doc/arm/Bv9ARM.ch08.html +++ b/doc/arm/Bv9ARM.ch08.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -45,18 +45,18 @@

-Common Problems

+Common Problems

-It's not working; how can I figure out what's wrong?

+It's not working; how can I figure out what's wrong?

The best solution to solving installation and configuration issues is to take preventative measures by setting @@ -68,7 +68,7 @@

-Incrementing and Changing the Serial Number

+Incrementing and Changing the Serial Number

Zone serial numbers are just numbers — they aren't date related. A lot of people set them to a number that @@ -95,7 +95,7 @@

-Where Can I Get Help?

+Where Can I Get Help?

The Internet Systems Consortium (ISC) offers a wide range diff --git a/doc/arm/Bv9ARM.ch09.html b/doc/arm/Bv9ARM.ch09.html index fd532377bad..cda5f6c30d3 100644 --- a/doc/arm/Bv9ARM.ch09.html +++ b/doc/arm/Bv9ARM.ch09.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -45,31 +45,31 @@

-Acknowledgments

+Acknowledgments

A Brief History of the DNS and BIND @@ -172,7 +172,7 @@

-General DNS Reference Information

+General DNS Reference Information

IPv6 addresses (AAAA)

@@ -260,17 +260,17 @@

-Bibliography

+Bibliography

Standards

-

[RFC974] C. Partridge. Mail Routing and the Domain System. January 1986.

+

[RFC974] C. Partridge. Mail Routing and the Domain System. January 1986.

-

[RFC1034] P.V. Mockapetris. Domain Names — Concepts and Facilities. November 1987.

+

[RFC1034] P.V. Mockapetris. Domain Names — Concepts and Facilities. November 1987.

-

[RFC1035] P. V. Mockapetris. Domain Names — Implementation and +

[RFC1035] P. V. Mockapetris. Domain Names — Implementation and Specification. November 1987.

@@ -278,42 +278,42 @@

Proposed Standards

-

[RFC2181] R., R. Bush Elz. Clarifications to the DNS +

[RFC2181] R., R. Bush Elz. Clarifications to the DNS Specification. July 1997.

-

[RFC2308] M. Andrews. Negative Caching of DNS +

[RFC2308] M. Andrews. Negative Caching of DNS Queries. March 1998.

-

[RFC1995] M. Ohta. Incremental Zone Transfer in DNS. August 1996.

+

[RFC1995] M. Ohta. Incremental Zone Transfer in DNS. August 1996.

-

[RFC1996] P. Vixie. A Mechanism for Prompt Notification of Zone Changes. August 1996.

+

[RFC1996] P. Vixie. A Mechanism for Prompt Notification of Zone Changes. August 1996.

-

[RFC2136] P. Vixie, S. Thomson, Y. Rekhter, and J. Bound. Dynamic Updates in the Domain Name System. April 1997.

+

[RFC2136] P. Vixie, S. Thomson, Y. Rekhter, and J. Bound. Dynamic Updates in the Domain Name System. April 1997.

-

[RFC2671] P. Vixie. Extension Mechanisms for DNS (EDNS0). August 1997.

+

[RFC2671] P. Vixie. Extension Mechanisms for DNS (EDNS0). August 1997.

-

[RFC2672] M. Crawford. Non-Terminal DNS Name Redirection. August 1999.

+

[RFC2672] M. Crawford. Non-Terminal DNS Name Redirection. August 1999.

-

[RFC2845] P. Vixie, O. Gudmundsson, D. Eastlake, 3rd, and B. Wellington. Secret Key Transaction Authentication for DNS (TSIG). May 2000.

+

[RFC2845] P. Vixie, O. Gudmundsson, D. Eastlake, 3rd, and B. Wellington. Secret Key Transaction Authentication for DNS (TSIG). May 2000.

-

[RFC2930] D. Eastlake, 3rd. Secret Key Establishment for DNS (TKEY RR). September 2000.

+

[RFC2930] D. Eastlake, 3rd. Secret Key Establishment for DNS (TKEY RR). September 2000.

-

[RFC2931] D. Eastlake, 3rd. DNS Request and Transaction Signatures (SIG(0)s). September 2000.

+

[RFC2931] D. Eastlake, 3rd. DNS Request and Transaction Signatures (SIG(0)s). September 2000.

-

[RFC3007] B. Wellington. Secure Domain Name System (DNS) Dynamic Update. November 2000.

+

[RFC3007] B. Wellington. Secure Domain Name System (DNS) Dynamic Update. November 2000.

-

[RFC3645] S. Kwan, P. Garg, J. Gilroy, L. Esibov, J. Westhead, and R. Hall. Generic Security Service Algorithm for Secret +

[RFC3645] S. Kwan, P. Garg, J. Gilroy, L. Esibov, J. Westhead, and R. Hall. Generic Security Service Algorithm for Secret Key Transaction Authentication for DNS (GSS-TSIG). October 2003.

@@ -322,19 +322,19 @@

DNS Security Proposed Standards

-

[RFC3225] D. Conrad. Indicating Resolver Support of DNSSEC. December 2001.

+

[RFC3225] D. Conrad. Indicating Resolver Support of DNSSEC. December 2001.

-

[RFC3833] D. Atkins and R. Austein. Threat Analysis of the Domain Name System (DNS). August 2004.

+

[RFC3833] D. Atkins and R. Austein. Threat Analysis of the Domain Name System (DNS). August 2004.

-

[RFC4033] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. DNS Security Introduction and Requirements. March 2005.

+

[RFC4033] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. DNS Security Introduction and Requirements. March 2005.

-

[RFC4034] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Resource Records for the DNS Security Extensions. March 2005.

+

[RFC4034] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Resource Records for the DNS Security Extensions. March 2005.

-

[RFC4035] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Protocol Modifications for the DNS +

[RFC4035] R. Arends, R. Austein, M. Larson, D. Massey, and S. Rose. Protocol Modifications for the DNS Security Extensions. March 2005.

@@ -342,146 +342,146 @@

Other Important RFCs About DNS Implementation

-

[RFC1535] E. Gavron. A Security Problem and Proposed Correction With Widely +

[RFC1535] E. Gavron. A Security Problem and Proposed Correction With Widely Deployed DNS Software.. October 1993.

-

[RFC1536] A. Kumar, J. Postel, C. Neuman, P. Danzig, and S. Miller. Common DNS Implementation +

[RFC1536] A. Kumar, J. Postel, C. Neuman, P. Danzig, and S. Miller. Common DNS Implementation Errors and Suggested Fixes. October 1993.

-

[RFC1982] R. Elz and R. Bush. Serial Number Arithmetic. August 1996.

+

[RFC1982] R. Elz and R. Bush. Serial Number Arithmetic. August 1996.

-

[RFC4074] Y. Morishita and T. Jinmei. Common Misbehaviour Against DNS +

[RFC4074] Y. Morishita and T. Jinmei. Common Misbehaviour Against DNS Queries for IPv6 Addresses. May 2005.

Resource Record Types

-

[RFC1183] C.F. Everhart, L. A. Mamakos, R. Ullmann, and P. Mockapetris. New DNS RR Definitions. October 1990.

+

[RFC1183] C.F. Everhart, L. A. Mamakos, R. Ullmann, and P. Mockapetris. New DNS RR Definitions. October 1990.

-

[RFC1706] B. Manning and R. Colella. DNS NSAP Resource Records. October 1994.

+

[RFC1706] B. Manning and R. Colella. DNS NSAP Resource Records. October 1994.

-

[RFC2168] R. Daniel and M. Mealling. Resolution of Uniform Resource Identifiers using +

[RFC2168] R. Daniel and M. Mealling. Resolution of Uniform Resource Identifiers using the Domain Name System. June 1997.

-

[RFC1876] C. Davis, P. Vixie, T., and I. Dickinson. A Means for Expressing Location Information in the +

[RFC1876] C. Davis, P. Vixie, T., and I. Dickinson. A Means for Expressing Location Information in the Domain Name System. January 1996.

-

[RFC2052] A. Gulbrandsen and P. Vixie. A DNS RR for Specifying the +

[RFC2052] A. Gulbrandsen and P. Vixie. A DNS RR for Specifying the Location of Services.. October 1996.

-

[RFC2163] A. Allocchio. Using the Internet DNS to +

[RFC2163] A. Allocchio. Using the Internet DNS to Distribute MIXER Conformant Global Address Mapping. January 1998.

-

[RFC2230] R. Atkinson. Key Exchange Delegation Record for the DNS. October 1997.

+

[RFC2230] R. Atkinson. Key Exchange Delegation Record for the DNS. October 1997.

-

[RFC2536] D. Eastlake, 3rd. DSA KEYs and SIGs in the Domain Name System (DNS). March 1999.

+

[RFC2536] D. Eastlake, 3rd. DSA KEYs and SIGs in the Domain Name System (DNS). March 1999.

-

[RFC2537] D. Eastlake, 3rd. RSA/MD5 KEYs and SIGs in the Domain Name System (DNS). March 1999.

+

[RFC2537] D. Eastlake, 3rd. RSA/MD5 KEYs and SIGs in the Domain Name System (DNS). March 1999.

-

[RFC2538] D. Eastlake, 3rd and O. Gudmundsson. Storing Certificates in the Domain Name System (DNS). March 1999.

+

[RFC2538] D. Eastlake, 3rd and O. Gudmundsson. Storing Certificates in the Domain Name System (DNS). March 1999.

-

[RFC2539] D. Eastlake, 3rd. Storage of Diffie-Hellman Keys in the Domain Name System (DNS). March 1999.

+

[RFC2539] D. Eastlake, 3rd. Storage of Diffie-Hellman Keys in the Domain Name System (DNS). March 1999.

-

[RFC2540] D. Eastlake, 3rd. Detached Domain Name System (DNS) Information. March 1999.

+

[RFC2540] D. Eastlake, 3rd. Detached Domain Name System (DNS) Information. March 1999.

-

[RFC2782] A. Gulbrandsen. P. Vixie. L. Esibov. A DNS RR for specifying the location of services (DNS SRV). February 2000.

+

[RFC2782] A. Gulbrandsen. P. Vixie. L. Esibov. A DNS RR for specifying the location of services (DNS SRV). February 2000.

-

[RFC2915] M. Mealling. R. Daniel. The Naming Authority Pointer (NAPTR) DNS Resource Record. September 2000.

+

[RFC2915] M. Mealling. R. Daniel. The Naming Authority Pointer (NAPTR) DNS Resource Record. September 2000.

-

[RFC3110] D. Eastlake, 3rd. RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS). May 2001.

+

[RFC3110] D. Eastlake, 3rd. RSA/SHA-1 SIGs and RSA KEYs in the Domain Name System (DNS). May 2001.

-

[RFC3123] P. Koch. A DNS RR Type for Lists of Address Prefixes (APL RR). June 2001.

+

[RFC3123] P. Koch. A DNS RR Type for Lists of Address Prefixes (APL RR). June 2001.

-

[RFC3596] S. Thomson, C. Huitema, V. Ksinant, and M. Souissi. DNS Extensions to support IP +

[RFC3596] S. Thomson, C. Huitema, V. Ksinant, and M. Souissi. DNS Extensions to support IP version 6. October 2003.

-

[RFC3597] A. Gustafsson. Handling of Unknown DNS Resource Record (RR) Types. September 2003.

+

[RFC3597] A. Gustafsson. Handling of Unknown DNS Resource Record (RR) Types. September 2003.

DNS and the Internet

-

[RFC1101] P. V. Mockapetris. DNS Encoding of Network Names +

[RFC1101] P. V. Mockapetris. DNS Encoding of Network Names and Other Types. April 1989.

-

[RFC1123] Braden. Requirements for Internet Hosts - Application and +

[RFC1123] Braden. Requirements for Internet Hosts - Application and Support. October 1989.

-

[RFC1591] J. Postel. Domain Name System Structure and Delegation. March 1994.

+

[RFC1591] J. Postel. Domain Name System Structure and Delegation. March 1994.

-

[RFC2317] H. Eidnes, G. de Groot, and P. Vixie. Classless IN-ADDR.ARPA Delegation. March 1998.

+

[RFC2317] H. Eidnes, G. de Groot, and P. Vixie. Classless IN-ADDR.ARPA Delegation. March 1998.

-

[RFC2826] Internet Architecture Board. IAB Technical Comment on the Unique DNS Root. May 2000.

+

[RFC2826] Internet Architecture Board. IAB Technical Comment on the Unique DNS Root. May 2000.

-

[RFC2929] D. Eastlake, 3rd, E. Brunner-Williams, and B. Manning. Domain Name System (DNS) IANA Considerations. September 2000.

+

[RFC2929] D. Eastlake, 3rd, E. Brunner-Williams, and B. Manning. Domain Name System (DNS) IANA Considerations. September 2000.

DNS Operations

-

[RFC1033] M. Lottor. Domain administrators operations guide.. November 1987.

+

[RFC1033] M. Lottor. Domain administrators operations guide.. November 1987.

-

[RFC1537] P. Beertema. Common DNS Data File +

[RFC1537] P. Beertema. Common DNS Data File Configuration Errors. October 1993.

-

[RFC1912] D. Barr. Common DNS Operational and +

[RFC1912] D. Barr. Common DNS Operational and Configuration Errors. February 1996.

-

[RFC2010] B. Manning and P. Vixie. Operational Criteria for Root Name Servers.. October 1996.

+

[RFC2010] B. Manning and P. Vixie. Operational Criteria for Root Name Servers.. October 1996.

-

[RFC2219] M. Hamilton and R. Wright. Use of DNS Aliases for +

[RFC2219] M. Hamilton and R. Wright. Use of DNS Aliases for Network Services.. October 1997.

Internationalized Domain Names

-

[RFC2825] IAB and R. Daigle. A Tangled Web: Issues of I18N, Domain Names, +

[RFC2825] IAB and R. Daigle. A Tangled Web: Issues of I18N, Domain Names, and the Other Internet protocols. May 2000.

-

[RFC3490] P. Faltstrom, P. Hoffman, and A. Costello. Internationalizing Domain Names in Applications (IDNA). March 2003.

+

[RFC3490] P. Faltstrom, P. Hoffman, and A. Costello. Internationalizing Domain Names in Applications (IDNA). March 2003.

-

[RFC3491] P. Hoffman and M. Blanchet. Nameprep: A Stringprep Profile for Internationalized Domain Names. March 2003.

+

[RFC3491] P. Hoffman and M. Blanchet. Nameprep: A Stringprep Profile for Internationalized Domain Names. March 2003.

-

[RFC3492] A. Costello. Punycode: A Bootstring encoding of Unicode +

[RFC3492] A. Costello. Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA). March 2003.

@@ -497,47 +497,47 @@

-

[RFC1464] R. Rosenbaum. Using the Domain Name System To Store Arbitrary String +

[RFC1464] R. Rosenbaum. Using the Domain Name System To Store Arbitrary String Attributes. May 1993.

-

[RFC1713] A. Romao. Tools for DNS Debugging. November 1994.

+

[RFC1713] A. Romao. Tools for DNS Debugging. November 1994.

-

[RFC1794] T. Brisco. DNS Support for Load +

[RFC1794] T. Brisco. DNS Support for Load Balancing. April 1995.

-

[RFC2240] O. Vaughan. A Legal Basis for Domain Name Allocation. November 1997.

+

[RFC2240] O. Vaughan. A Legal Basis for Domain Name Allocation. November 1997.

-

[RFC2345] J. Klensin, T. Wolf, and G. Oglesby. Domain Names and Company Name Retrieval. May 1998.

+

[RFC2345] J. Klensin, T. Wolf, and G. Oglesby. Domain Names and Company Name Retrieval. May 1998.

-

[RFC2352] O. Vaughan. A Convention For Using Legal Names as Domain Names. May 1998.

+

[RFC2352] O. Vaughan. A Convention For Using Legal Names as Domain Names. May 1998.

-

[RFC3071] J. Klensin. Reflections on the DNS, RFC 1591, and Categories of Domains. February 2001.

+

[RFC3071] J. Klensin. Reflections on the DNS, RFC 1591, and Categories of Domains. February 2001.

-

[RFC3258] T. Hardie. Distributing Authoritative Name Servers via +

[RFC3258] T. Hardie. Distributing Authoritative Name Servers via Shared Unicast Addresses. April 2002.

-

[RFC3901] A. Durand and J. Ihren. DNS IPv6 Transport Operational Guidelines. September 2004.

+

[RFC3901] A. Durand and J. Ihren. DNS IPv6 Transport Operational Guidelines. September 2004.

Obsolete and Unimplemented Experimental RFC

-

[RFC1712] C. Farrell, M. Schulze, S. Pleitner, and D. Baldoni. DNS Encoding of Geographical +

[RFC1712] C. Farrell, M. Schulze, S. Pleitner, and D. Baldoni. DNS Encoding of Geographical Location. November 1994.

-

[RFC2673] M. Crawford. Binary Labels in the Domain Name System. August 1999.

+

[RFC2673] M. Crawford. Binary Labels in the Domain Name System. August 1999.

-

[RFC2874] M. Crawford and C. Huitema. DNS Extensions to Support IPv6 Address Aggregation +

[RFC2874] M. Crawford and C. Huitema. DNS Extensions to Support IPv6 Address Aggregation and Renumbering. July 2000.

@@ -551,39 +551,39 @@

-

[RFC2065] D. Eastlake, 3rd and C. Kaufman. Domain Name System Security Extensions. January 1997.

+

[RFC2065] D. Eastlake, 3rd and C. Kaufman. Domain Name System Security Extensions. January 1997.

-

[RFC2137] D. Eastlake, 3rd. Secure Domain Name System Dynamic Update. April 1997.

+

[RFC2137] D. Eastlake, 3rd. Secure Domain Name System Dynamic Update. April 1997.

-

[RFC2535] D. Eastlake, 3rd. Domain Name System Security Extensions. March 1999.

+

[RFC2535] D. Eastlake, 3rd. Domain Name System Security Extensions. March 1999.

-

[RFC3008] B. Wellington. Domain Name System Security (DNSSEC) +

[RFC3008] B. Wellington. Domain Name System Security (DNSSEC) Signing Authority. November 2000.

-

[RFC3090] E. Lewis. DNS Security Extension Clarification on Zone Status. March 2001.

+

[RFC3090] E. Lewis. DNS Security Extension Clarification on Zone Status. March 2001.

-

[RFC3445] D. Massey and S. Rose. Limiting the Scope of the KEY Resource Record (RR). December 2002.

+

[RFC3445] D. Massey and S. Rose. Limiting the Scope of the KEY Resource Record (RR). December 2002.

-

[RFC3655] B. Wellington and O. Gudmundsson. Redefinition of DNS Authenticated Data (AD) bit. November 2003.

+

[RFC3655] B. Wellington and O. Gudmundsson. Redefinition of DNS Authenticated Data (AD) bit. November 2003.

-

[RFC3658] O. Gudmundsson. Delegation Signer (DS) Resource Record (RR). December 2003.

+

[RFC3658] O. Gudmundsson. Delegation Signer (DS) Resource Record (RR). December 2003.

-

[RFC3755] S. Weiler. Legacy Resolver Compatibility for Delegation Signer (DS). May 2004.

+

[RFC3755] S. Weiler. Legacy Resolver Compatibility for Delegation Signer (DS). May 2004.

-

[RFC3757] O. Kolkman, J. Schlyter, and E. Lewis. Domain Name System KEY (DNSKEY) Resource Record +

[RFC3757] O. Kolkman, J. Schlyter, and E. Lewis. Domain Name System KEY (DNSKEY) Resource Record (RR) Secure Entry Point (SEP) Flag. April 2004.

-

[RFC3845] J. Schlyter. DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format. August 2004.

+

[RFC3845] J. Schlyter. DNS Security (DNSSEC) NextSECure (NSEC) RDATA Format. August 2004.

@@ -604,14 +604,14 @@

-Other Documents About BIND +Other Documents About BIND

-Bibliography

+Bibliography
-

Paul Albitz and Cricket Liu. DNS and BIND. Copyright © 1998 Sebastopol, CA: O'Reilly and Associates.

+

Paul Albitz and Cricket Liu. DNS and BIND. Copyright © 1998 Sebastopol, CA: O'Reilly and Associates.

@@ -648,7 +648,7 @@

-Prerequisite

+Prerequisite

GNU make is required to build the export libraries (other part of BIND 9 can still be built with other types of make). In the reminder of this document, "make" means GNU make. Note that @@ -657,7 +657,7 @@

-Compilation

+Compilation
 $ ./configure --enable-exportlib [other flags]
 $ make
@@ -672,7 +672,7 @@ $ make
 
 

-Installation

+Installation
 $ cd lib/export
 $ make install
@@ -694,7 +694,7 @@ $ make install
 
 

-Known Defects/Restrictions

+Known Defects/Restrictions
  • Currently, win32 is not supported for the export library. (Normal BIND 9 application can be built as @@ -734,7 +734,7 @@ $ make

-The dns.conf File

+The dns.conf File

The IRS library supports an "advanced" configuration file related to the DNS library for configuration parameters that would be beyond the capability of the @@ -752,14 +752,14 @@ $ make

-Sample Applications

+Sample Applications

Some sample application programs using this API are provided for reference. The following is a brief description of these applications.

-sample: a simple stub resolver utility

+sample: a simple stub resolver utility

It sends a query of a given name (of a given optional RR type) to a specified recursive server, and prints the result as a list of @@ -823,7 +823,7 @@ $ make

-sample-async: a simple stub resolver, working asynchronously

+sample-async: a simple stub resolver, working asynchronously

Similar to "sample", but accepts a list of (query) domain names as a separate file and resolves the names @@ -864,7 +864,7 @@ $ make

-sample-request: a simple DNS transaction client

+sample-request: a simple DNS transaction client

It sends a query to a specified server, and prints the response with minimal processing. It doesn't act as a @@ -905,7 +905,7 @@ $ make

-sample-gai: getaddrinfo() and getnameinfo() test code

+sample-gai: getaddrinfo() and getnameinfo() test code

This is a test program to check getaddrinfo() and getnameinfo() behavior. It takes a @@ -922,7 +922,7 @@ $ make

-sample-update: a simple dynamic update client program

+sample-update: a simple dynamic update client program

It accepts a single update command as a command-line argument, sends an update request message to the @@ -1017,7 +1017,7 @@ $ sample-update -a sample-update -k Kxxx.+nnn+mm

-nsprobe: domain/name server checker in terms of RFC 4074

+nsprobe: domain/name server checker in terms of RFC 4074

It checks a set of domains to see the name servers of the domains behave @@ -1074,7 +1074,7 @@ $ sample-update -a sample-update -k Kxxx.+nnn+mm

-Library References

+Library References

As of this writing, there is no formal "manual" of the libraries, except this document, header files (some of them provide pretty detailed explanations), and sample application diff --git a/doc/arm/Bv9ARM.html b/doc/arm/Bv9ARM.html index 7341705aaad..7751cfaf4f8 100644 --- a/doc/arm/Bv9ARM.html +++ b/doc/arm/Bv9ARM.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -83,7 +83,7 @@

Name Server Operations
Tools for Use With the Name Server Daemon
-
Signals
+
Signals
4. Advanced DNS Features
@@ -92,64 +92,64 @@
Dynamic Update
The journal file
Incremental Zone Transfers (IXFR)
-
Split DNS
-
Example split DNS setup
+
Split DNS
+
Example split DNS setup
TSIG
-
Generate Shared Keys for Each Pair of Hosts
-
Copying the Shared Secret to Both Machines
-
Informing the Servers of the Key's Existence
-
Instructing the Server to Use the Key
-
TSIG Key Based Access Control
-
Errors
+
Generate Shared Keys for Each Pair of Hosts
+
Copying the Shared Secret to Both Machines
+
Informing the Servers of the Key's Existence
+
Instructing the Server to Use the Key
+
TSIG Key Based Access Control
+
Errors
-
TKEY
-
SIG(0)
+
TKEY
+
SIG(0)
DNSSEC
-
Generating Keys
-
Signing the Zone
-
Configuring Servers
+
Generating Keys
+
Signing the Zone
+
Configuring Servers
DNSSEC, Dynamic Zones, and Automatic Signing
-
Converting from insecure to secure
-
Dynamic DNS update method
-
Fully automatic zone signing
-
Private-type records
-
DNSKEY rollovers
-
Dynamic DNS update method
-
Automatic key rollovers
-
NSEC3PARAM rollovers via UPDATE
-
Converting from NSEC to NSEC3
-
Converting from NSEC3 to NSEC
-
Converting from secure to insecure
-
Periodic re-signing
-
NSEC3 and OPTOUT
+
Converting from insecure to secure
+
Dynamic DNS update method
+
Fully automatic zone signing
+
Private-type records
+
DNSKEY rollovers
+
Dynamic DNS update method
+
Automatic key rollovers
+
NSEC3PARAM rollovers via UPDATE
+
Converting from NSEC to NSEC3
+
Converting from NSEC3 to NSEC
+
Converting from secure to insecure
+
Periodic re-signing
+
NSEC3 and OPTOUT
Dynamic Trust Anchor Management
-
Validating Resolver
-
Authoritative Server
+
Validating Resolver
+
Authoritative Server
PKCS #11 (Cryptoki) support
-
Prerequisites
-
Building BIND 9 with PKCS#11
-
PKCS #11 Tools
-
Using the HSM
-
Specifying the engine on the command line
-
Running named with automatic zone re-signing
+
Prerequisites
+
Building BIND 9 with PKCS#11
+
PKCS #11 Tools
+
Using the HSM
+
Specifying the engine on the command line
+
Running named with automatic zone re-signing
-
IPv6 Support in BIND 9
+
IPv6 Support in BIND 9
-
Address Lookups Using AAAA Records
-
Address to Name Lookups Using Nibble Format
+
Address Lookups Using AAAA Records
+
Address to Name Lookups Using Nibble Format
5. The BIND 9 Lightweight Resolver
-
The Lightweight Resolver Library
+
The Lightweight Resolver Library
Running a Resolver Daemon
6. BIND 9 Configuration Reference
@@ -157,58 +157,58 @@
Configuration File Elements
Address Match Lists
-
Comment Syntax
+
Comment Syntax
Configuration File Grammar
-
acl Statement Grammar
+
acl Statement Grammar
acl Statement Definition and Usage
-
controls Statement Grammar
+
controls Statement Grammar
controls Statement Definition and Usage
-
include Statement Grammar
-
include Statement Definition and +
include Statement Grammar
+
include Statement Definition and Usage
-
key Statement Grammar
-
key Statement Definition and Usage
-
logging Statement Grammar
-
logging Statement Definition and +
key Statement Grammar
+
key Statement Definition and Usage
+
logging Statement Grammar
+
logging Statement Definition and Usage
-
lwres Statement Grammar
-
lwres Statement Definition and Usage
-
masters Statement Grammar
-
masters Statement Definition and +
lwres Statement Grammar
+
lwres Statement Definition and Usage
+
masters Statement Grammar
+
masters Statement Definition and Usage
-
options Statement Grammar
+
options Statement Grammar
options Statement Definition and Usage
server Statement Grammar
server Statement Definition and Usage
statistics-channels Statement Grammar
-
statistics-channels Statement Definition and +
statistics-channels Statement Definition and Usage
trusted-keys Statement Grammar
-
trusted-keys Statement Definition +
trusted-keys Statement Definition and Usage
-
managed-keys Statement Grammar
+
managed-keys Statement Grammar
managed-keys Statement Definition and Usage
view Statement Grammar
-
view Statement Definition and Usage
+
view Statement Definition and Usage
zone Statement Grammar
-
zone Statement Definition and Usage
+
zone Statement Definition and Usage
-
Zone File
+
Zone File
Types of Resource Records and When to Use Them
-
Discussion of MX Records
+
Discussion of MX Records
Setting TTLs
-
Inverse Mapping in IPv4
-
Other Zone File Directives
-
BIND Master File Extension: the $GENERATE Directive
+
Inverse Mapping in IPv4
+
Other Zone File Directives
+
BIND Master File Extension: the $GENERATE Directive
Additional File Formats
BIND9 Statistics
@@ -217,41 +217,41 @@
7. BIND 9 Security Considerations
Access Control Lists
-
Chroot and Setuid
+
Chroot and Setuid
-
The chroot Environment
-
Using the setuid Function
+
The chroot Environment
+
Using the setuid Function
Dynamic Update Security
8. Troubleshooting
-
Common Problems
-
It's not working; how can I figure out what's wrong?
-
Incrementing and Changing the Serial Number
-
Where Can I Get Help?
+
Common Problems
+
It's not working; how can I figure out what's wrong?
+
Incrementing and Changing the Serial Number
+
Where Can I Get Help?
A. Appendices
-
Acknowledgments
+
Acknowledgments
A Brief History of the DNS and BIND
-
General DNS Reference Information
+
General DNS Reference Information
IPv6 addresses (AAAA)
Bibliography (and Suggested Reading)
Request for Comments (RFCs)
Internet Drafts
-
Other Documents About BIND
+
Other Documents About BIND
BIND 9 DNS Library Support
-
Prerequisite
-
Compilation
-
Installation
-
Known Defects/Restrictions
-
The dns.conf File
-
Sample Applications
-
Library References
+
Prerequisite
+
Compilation
+
Installation
+
Known Defects/Restrictions
+
The dns.conf File
+
Sample Applications
+
Library References
I. Manual pages
diff --git a/doc/arm/Bv9ARM.pdf b/doc/arm/Bv9ARM.pdf index a8a88dc38c7..6a1cb97f0a2 100644 --- a/doc/arm/Bv9ARM.pdf +++ b/doc/arm/Bv9ARM.pdf @@ -3307,22 +3307,21 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1078 0 obj << -/Length 3422 +/Length 3423 /Filter /FlateDecode >> stream -xÚíYSIÇßùz˜xPmÝÇ>­m°ƒ íÁ8vcŽ…hƒb„ÄHÂÇ~ú­VwUeCuŠÚlˆ‰ËX©LåÿGYG³õÿ±U„ -'ÆI¢(Sƒñåœû{µÇÚ÷ Û†ð]ÏO÷þñR˜#Ns=8ý>Ëj-œžýºÿâí›Ó£7§ï~?ýqïè4~(t̨¨?ñϽ_§ƒ3ïÿÇ=J„³jðÙÿ…æ\îI%ˆ’B„ŸL÷Þïý?üëÚ4÷E”°DYn2ß„sðM˜’ÄãF9¢믢 ÷¡~àB÷O/ªú;yK,5%”IãÝÕãѪ:Ÿ/¾¶o„.$%Ú†÷½»XŒ–ÕÁPR»O†ŠÒú‡tîÿ±»¡½â–hNYJï-±çƒæÅ ”/Ø ¡ámùn~dioÅpÈÅÁƒzOðHC´fÂ#îÏŸ×Õâë°Z,æ‹e e‰“V´o~HóñGKM/'!“ÅœCŒ¨”¢ýœdâÀ8A½3ΉuÆ7Bí¨Jœ° ‚k©lõž~^T9*¸!ÂÖ¾ëýÊcqYÍVCî©{µ]^Žõ_ôÃngþZs³‰¦ïbš€!FÔS±~š2q`4¡ÞM\ÜN4ñû¡é°úR>›¬&óYó“Ñì¬yña9:¯»3涨¯ -y-¦bÔ@Ýï§&F ê=QÃ1ÒH"5b#5—£åªÊöMÂs#½O¼2½ú» -9.&bA 1‚2q`¡Þ#AÚ¹fØ ’÷EÐæ–Ç}Ÿ–§˜>Rb.KI†)­Rrq ¤àÞ)ÖKAS£6‚2¿ªµÎ‚¢ýg1³¡©±ŒíTSR\ÌO²Ãðbô܃sØ1ŠX¡Y‚Gßû.‚Ùý³Éì¼®Áñ˜—±²WÌ0ÄØè¨ƒ4™806Pï‰ áÈ…„l´eºÃëÑt¸\Æ4mÅûjñ©¯ý¬x'‰ªb€!BG -ÝB& Ô{â×Ù€ðl<®–Ë‚óÙjÝ^̧u§±CÍD/!qÅXC ‹Ž0™80,Pï ¦ˆ³Ì@,TƒÅñÌO_?Ž<CMÙ£è7¾C÷XŒ0ÄðèdúñÈÄázOxPI(£â¡<~®WpšFãÙÙÙºÍX·"˜§F#æ­˜ -`ˆQÑÑ¥í/Fê=R¡¯×·¤Â4Tü2ŸU §Žî/F³åÇõ Bö„EL\)ÐÁ¢#ŒéŸ‡äâ@°À½',,%Tw¨° ß5P¼›/ÚÄëÉrUc!ŸZ‹˜¸b*’Åô´2A`H`®Úê,,h× ñöªZŒVëIézòñu¹ª.›×'Õr~½îPÆU€årRÓb¥z\«±1ÅÒCL[˜`LÜL˜º¨÷$¯Ò„qÓ­BQ?ˆ³ÉM‚¦·äW¼—€£b€!FÔÀˆ~2q` ÞR¦t§ôÄXCÀ»j1™ŸMÆq8À÷G˶ְž[|Mëßiá¶½yI*Fb@02q` Þ«n•ê À֢ϯæÓù¹Ÿ*až&‘yBB‹ †!P##û ÉÄ‚zO„pJ8“Ò-!wØ+¸ôƒÆ©.æÖ¸ü|ÅÿàÖ—°j»àê%'䶘`ˆ‘µ3ýÕë\9¨÷Dµ„KÑ©N1Ùsr²¬Ú¹ÄÛf…Ã÷7ÍpÒ>M)b抹†PÓ_µÌÅqz\Hça0¼S–b*ö9tÿzÖ  Åcêq¾[ÿóYJ 4Dhéè…Ð’‹¡÷žh±’Ê:… ¦Zž_O¦«á¤]._‚IËdöq¾¸¥ ÿÏêR¸ÿÄG¹18f¡Xc`ˆi ³lúK’¹80QïIcÉB39‰.¯VmÙú—FPýJPߢO9* ÙaúŒë—ÿv˜ú˜ë$¾/ -M»uÛ¨ÿììl½Éi4 «Üãô+ýb4¾XwNëí)9Ät 1¥aºm•9¦5ê=‰--ÖuK®»^½Ž[Ü^ú_ûvH(„Øá±`ÌX1Àã*bû„äâÀx@½'„&’ÙÎÞ!OªåÕ|¶¬ÂâÃt2móê7ªèÉ»_ü,T+?/&MeZ2ùà»õðõ‹Å†˜¸0½¶¿Âœ‹õwÄJ.‰”—ÌÆ±í .S, ž ½ñà7Û<=èå(dº˜#`ˆq•´ýEÊ\G¨÷ÄãD JPöž8Ú¼±Úºm(<ÅŒó 1^ b¶¿d™‹ãõžx¡”(ª@áÉmæÅƒ0Y®&ãåp|1šÍªinW¾UD*ë64B’›-8Ù³XÌ0Ä*Ùþâd.ŒÔ{dDXo d*Bqú-ÙÜÀ(÷‘èc!f«”hˆ°ÐQa!Âî=±`4Q:AùæCî«ÅõrU ÿ¨¾öÝ€Àí¦ÁŠ•[; )-æ%Ùa¸Á0ZnÁ‚¹N¬hI”µ*Îï–Í Wâq >b -‹á†P"Û_¯ÎÅñzO€(îÃੜÅïr\}æ¥ìDû©´bCk¢¥Ü¾f$$³`ˆ¡ÅÂPÉÄ¡‚zO¨Ô7-)–Ša\Þ+*w˜ÝPóà[´b$€!†C"†ê=!Q‡Q«‘Ø|ýÓ¤úœ»!Eú/äçÖx«¡„Ø…Ô^˜Bº‹a†LPNÛþ#ê=ÁTïì§.Õ߸¾˜6·+Úéí¹¤)¦µ`ˆAeàÉÄAƒzOÐPIŒ×íðÍEÛzq= 5nÓÊÚ^Þ‰é.† b0A9mÿÂ~. &Ô{„‰;NŒ6 Êbï¦Í-Ql{º­˜ÖRh !MG6׿&˜‹÷×¹¥Ä8pɇŲÔ¾^UëSHbWw†õRX 0Äa€dâÀA½'@ü,Ç‚Ãð>ªöÆŒÓÑúë#¹(ãl ù,†%Ùa¬µ\ÿÒa&ŒÌuEib•bq³%‰·ìþÔ€DÑB抙†PŒŠL¨÷Ä…”~Ä!9䢽NãðëltŽ=}¸:óà °ÿdR÷7R©­•=$¦Xv`ˆÉïú§6¹80ÙQïο´B ¸àÄ1Êm¾!`´Ó¼œLë8å}çñ ¯A†bÆ€!Æ”ÙõïeÍÅ1†zO3N‰“<Ô\D=reœv¬5kó}§kOªñ¼9³¼1•ù÷EÕÎnVó0¹ Ãá‹úüµ1âálcFŠõ†˜Þ0ã˜Þ™80½Qï©+¡–8ÃtÒ{­¸Ø,­l'G!aÅ8C (†C& Ô{Ä9C(7ÈÖ8ð‡õqÚêËê:lf¯¾\…‹wbÙ"6 'ëiŒÞºN@]—bžîJAk7„†9 -n~~­£ý;_s àîc/ÀêgÈpg#¼í'ËñuFïŸþ“i!$ÝÉg! C‹†"P#‘L "¨û„ˆ„ÖûÄ"¢Eä}µJ7«œž¾^ƒ ŸF˜å…  1€ ‚ŒöObs`¡î@šÕϲŠüÈ–ŸãY}h;âøitua -§èŽß}òoæVìðd$hØ&±‘d‡$B¹Ææ;á!a,^ï#ê‹!×|¼]]„S²7§¾ë¥”I3(¯&ŸêÉŠl—;¡Åb@€!FT‰Ñþò¹@0FP÷i¸* a2Þä!‰³—»Üíñ¯Ì:%xxC}ú²ªfuÙæŸ~DÌèþ*‹3ÚƒªÂ6É^½9:yV×ýNsÍ“öó<*d<ýŠ?} „L•rì  ™(Pß邆pÇRáÅ´ ܼl$©ÿr}—P}ÛŒÑOsæ¿R2€BT‡Ñþý÷™(°'b¾Ã±ö6‹Èvy¸n\{ûL<ÿyPß÷´üAjó]ÊQ2C0Z2ŠèV&䲘`ˆaµRªŸ“L(¨÷8ûÖZ«¤Ö̾ŸÏçÓjÔŠú¦¥Ã{p[9 º% !]Å0C †ŽýSì\ ¨÷ƒò-‚“ÂÐÖñ^Ο}ÁìîédvV×àø#˜—±²WÌ0ÄØè¨ƒ4™806Pï‰ áÈ…„l´eºý«Ñt¸\Æ6mÅ»jñ©¯ý¬øQ6!UÅ C „Žº„L¨÷7Ä)®!²áÙx\-— /æ³Õº½˜OëNã5½X„Äc 1,: XdâÀ°@½',˜"Î2±P ‡3?}ý8òlì 5e¢ßøÝGH`1Àã#Pÿ*O. Ô{ƒJBµÝàñk½‚Ó4ÏNO×mƺÆ<51oÅTCŒŠŽ.™80*Pï‘ +åx½¾í ¦¡âÃ|V5Pœì9º»Í–׃ +eØ1q¥X@C‹Ž0¦’‹Á÷ž°°”PÝ¡Â6T¼ßÛ@ñv¾h ¯'ËU…|j-b⊩Hv@Ó_ÐÊ!¹NDhK¨³° E\ƒÄ›Ëj1Z­'¥ëÉÇ×媺h^WËùÕºCW–‹IM‹•êa­ÆÆK 1ma‚1q3q`ê¢Þ“¼JÆM· +Eý Î&7 j˜Þ’_ñ^BŽŠ †P#ú ÈÄ€zOHI˜ÒÒc o«Åd~:Çáß-ÛZÃznñi4­§…Ûöæ=$©`ˆ!EÀÈÄ!€zO¯ºUªƒoX‹>¿œOçg~ª`„yšDæ 9,&b„@Œì'$Fê=Â)áLvJOL´„Üb¯àÒ§~¸˜[ãòóÿƒK\ª킫—œÛbr€!FÔÎôW¯sq`ä Þ9Ô.E§:ÅdCÎññ²jçošßß4ÃIû4¥ˆ™+æb\@eLÕ2Æê=r!‡ÁðNYŠ©ØçÐÝ«Yƒ‚©ÇùaýOÌg)-С¥£—1½´äâ@hÁ½'Z¬$‚²Na‚醖çW“éj8i—Ë—`Ò2™}œ/.FiƒÄ糺î?ñAn ŽY(ÖbÃ,ׯq&LcÔ{ÒØp"D§ÐÀLN⃋ËU[¶þЪïC ê{ô !GÅ$;L &ÿÍ 0õ1×I|?^švë¶QÿÙééz“ÓhV¹ÇéWúÅh|¾î(œÖÛSrˆé(bJÃtÛþ#¹80­QïIli‰°®[rpØõêuÜâöÒÿÚ·CB!Ä# ÆŒó 1 "™80P‰d¶³Ã…·EÈãjy9Ÿ-«°ø0ŒAÛß¼ú*züöƒÿƒ…jå獩LK&ï}·¾~±¸À¦×ö—rq`â¢ÞãŽXÉ%‘Ò€â’Ù¸#¶ÄeŠÔ³¡7Üàf›§½…Ls 1Ž ’¶¿•‹ãõž8bœH£A ÊÞG›7V[· …§˜Ñb^€!Æ T ã%Æ ê=ñB)QT“ÛÌ‹a²\MÆËáø|4›UÓÜ®|«ˆTÖmh„$7[p²9f±˜`ˆ1U²ýÅÉ\#¨÷Ȉ°Þ@ÈT„âô{0²¹Qî"ÑÇBÌV) Ða¡£†í/Hæâ@XÀ½'Œ&J§1(ß|È}µ¸Z®ªÓáŸÕ×¾¸Ý4X±rk$!¥Å¼$;  FËÍ 0X0׉-‰r VÅù²¹ÁàJ<¬ÁGLa1À£J„ᑉãõžQ܇ÁS9‹ßæ¸úÌKÙ ˆöSi%ĆÖDK¹}ÍHHf1*ÀCŠ…¡’‰CõžP©oZR,ø¼STn1»¡æÞ·!iÅHC (Ší_íÊÅ!zOHÔaÔjG$6Ÿ@ÿ4©>çnH‘þ ù¹5Þj(!ÁBj/L!ÝÅ0C &(§íß韋ƒ õž`ªwöS—êo\ß L›Ûíôö\ÒÓZ 0Ä ²aÐdâÀ A½'h¨$F€ëvøæ¢m½¸ž‡†·é eí#^Þ‰é.† b0A9mÿÊn. &Ô{„‰;NŒ6 Êbï¦Í-Ql{º­˜ÖRh !MG6×0! î=® rK‰qà(’‹e¨}½¬Ö§ÄcÝÖ HHa1 ÀJ„’‰õžñ³ Ãû¨Ú3^LGëS¬䢌{²0ä³–d‡±ÔrýKЙ 0R0× ¥‰UŠARÄõ–$Þ²#øSE ™+fbP@e\ÿa. Ô{âBJ?ârÑ^§±ÿu6ºÇžÞ_žúaØ2©û©ÔÖÊS,;0Äd‡‰wýÅ•\˜ì¨wç_Z!\pâ˜å6ß0Úi ^N¦õœr¾ó¸—ƒWAt=cˆ2Ü–±Ön sŒ]ÿüZfFûÏÑçÁ Cݧ)§ÄIŠ.¢º2N;#Ö¶ùǾãµÇÕxÞœ‰Y^›Ëüû¼j§7«y˜Ý„ñðy}Ûq*¶A‘bÁ!&8Ì8*x&LpÔ}êL¨%Î0_K.6kk{Tc‹ WHX1Àã +‚ò ãuy`ÎJã%²5¼åa}¢¶ú²º +ûÙ«/—áîX¹ˆ Ãñz&£·µˆy*Å"tt`´æ‘ ÁwûV?F†;1àm?°?Yޝ2zÿòŸL!é£|B0ä°`ˆ!5BÉ‚!‚ºOˆAh½U, "ZDÞU«t¹ÊÉÉë5òiYPÈp1@À*Èhÿ<6ê>¤Yý8«Èlù9œÕw¶CŽ_F——¦pîðí'ÿfnÅÓ|$$±‘d‡$B¹Ææ;á!a,Þð#ê»!×|¼Y‡ƒ²×g¿ëÕ”I3(¯&ŸêéŠì1wB!‹Å€CŒ¨£ý¡s`Œ îÓpUÂd¼ÈC§/·¹Þã_™¥:ÿJðð†ú„Öh5\NÎfÍ)-¥ØSdz^ 0Ä ‚ª¢PeÁ BÝ'¨¸§È(  âPýôæøðÕáQîÙ„†ïŒé4T{CwÈú»6B=CB‹y†/P0”—L /¨ûÄ óó#*àE”ðrxôâõûýƒÜæj?×¢.¶¯» +©,&b¤@©PR2`¤ î)”.„¤ÈRül*·¹D+]%F©Ç5 ).&bA íßu #uGÅÖ®y*ÏévPüüðh?̘êg]|YU³ºlóO?"ftw•ÅíAUa§äO¯ŽŽŸÕu¿“\ó¤ý< +™O§âO!S¥;¨FA& +Ôwz¦ !ܱTx1-×ïIê¿\_'T_8côÓœ9䯔 `‡Õa´•8ö°@ÌwX#Ö~àÁÃ~Ù®×-ƒk/ ‰G@÷êk𞃿¤6ߥ%3# %£È-û7B¸Q|€û;bsµ¢úÿŒ§šç=}ÛóâÓSíë鎵=SxA ‘š«ðc v½{2™ ‡˜Öo±ÿËÌ”fendstream endobj 1077 0 obj << /Type /Page @@ -3489,7 +3488,7 @@ endobj 1102 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 495.1172 539.579 504.0735] +/Rect [527.6238 495.2168 539.579 504.0735] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.15) >> >> endobj @@ -3510,7 +3509,7 @@ endobj 1105 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 459.2045 539.579 468.1608] +/Rect [527.6238 459.2045 539.579 468.3103] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.16.18) >> >> endobj @@ -3531,7 +3530,7 @@ endobj 1108 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 423.2919 539.579 432.2481] +/Rect [527.6238 423.2919 539.579 432.3976] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.17) >> >> endobj @@ -3608,14 +3607,14 @@ endobj 1119 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 291.6121 539.579 300.7179] +/Rect [527.6238 291.6121 539.579 300.5684] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.28) >> >> endobj 1120 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 279.6413 539.579 288.747] +/Rect [527.6238 279.6413 539.579 288.5975] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.28.1) >> >> endobj @@ -3629,7 +3628,7 @@ endobj 1122 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 255.6995 539.579 264.6558] +/Rect [527.6238 255.6995 539.579 264.8052] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.28.3) >> >> endobj @@ -3643,21 +3642,21 @@ endobj 1124 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 231.7577 539.579 240.714] +/Rect [522.6425 231.7577 539.579 240.8635] /Subtype /Link /A << /S /GoTo /D (section.6.3) >> >> endobj 1125 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 219.7868 539.579 228.7431] +/Rect [522.6425 219.7868 539.579 228.8926] /Subtype /Link /A << /S /GoTo /D (subsection.6.3.1) >> >> endobj 1126 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 207.8159 539.579 216.7722] +/Rect [522.6425 207.8159 539.579 216.9217] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.3.1.1) >> >> endobj @@ -3753,24 +3752,32 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1141 0 obj << -/Length 3413 +/Length 3414 /Filter /FlateDecode >> stream xÚímsÛÆÇßëSð]¥™êŒ{Ƶ/:–§J'•”éLÓ¼€HˆBM4AZã~úˆ»ãR -eŠNÅHKCg|óQìïˆu}rJ¹ÌޝïÊ“Sfß\­ŠUÕ®ªqÛÿü²šÙ¿˜œ““S™eŸÛ‹0æýÏò@Ma¬öÆæ)$l/ýËé¨s  v§Ðp_ýów‚ÐLïa厂ñ€ºï`‘t¤…¶¯ 4t,°lóf]¯Ê¥ý)ÏÌgŠÁ''Å'3™`ˆ‘Å¢Y>LJ$ŒÔý¶rpI„Ê+¡r¼*æ¾t”Ë·å2^F¶ –?½…ö™HbBÃL£BGÁ„FÝo…fœð\Q 4sBÿ»©Ð?•³.êqù[j->aõ9YQ`ˆ) -SJ33¬h$LQÔýVQJ ÏT”;E/˶™=¢ÉæŠ=½‚=(·ÏG²ÜÀ“æ•;&7ê>È­Œ!ŒÁB-œÚWÍøu¹êµ½xöão‰®2ñ¨íÓ‘*6°C´†É¦4”:¢4ê{+t®‰}Ùê,ÎçÍ|aE½©fÕê]¯ê}µºë‚³c³s.M„É”  ;ÍÙÅ«ýQ;íAÜhwL¾‡ ÿܺ„ƒ(ô K&!˜a lÅ ”s°†ÁÇ8öãM¥l_>×ùƳ¶d672ß1¯—†ó¦n«I¹´ŒØwÃéò§¶<.QÀ`?âýóöÉâÃÉçÃÒ´ç*¤©)›(ÉìYê>Q›Îkfsñ|<.ÛPúêÕò„æÇͬÿÅ÷¶0nþ&žî çÓ^Ÿðäö ±E1Š‚ᄺ8‰ŒÆ=NÌ•M\[3;šÑZ:¦¸ëª½xWójÜ3õóbR¬Ê‡½[-Õ¡7'Æç4™`ˆ5C‰‰‚³ç>6 -’¹E‡IîG¨›QÐõ‰‰/›õͬlïìõ«+HCù gxì` ƒÈ(^àçCò±ï6Ö‚¤2Ýâa?/‘‡ÁÎy3Ÿwųk4?õj››y7ˆâ0¶InT!Í© -"jGFžH D¨{we—R¡h`(t/Vræºq³‰÷Íòµm]íºkîû7ãÂÁvÑ¿ü'ËØt½Ï•îfíÏpW„ÓÞ»>äôo¶¢ÓüP0(¸ÏI²àÀæ<&8ê>T ! ׯ+Î\Õ¸¨Ç½d]Ÿ>t꺑j?krWÔÓ¾ž_ ¬ -7òj=¿é¬“'T -!ðiJ†b@P"` îœÛ04uøÎ׿îJØnÏ´ìoýºÂßËÙÂ6[!’G±ä³Ì0ÄX‚j¢,EÁXÚsí–Ùãµfãý¹-æŒ?_,ÊzRËá‰ç`öè¾0Àúb0J‡æàù°$ì¹5(ar¢ìXºOBwÕÚ¦aüºnîgådÚUÕn‰•™C,¹ý„䦶hˆ´Ÿñ0db èàî]LäŠÈ< ät옮 õ¥ölY•·®êVíªYºåæöÁ¥øÅ««×ì~HeôË©¤!YÉ$CŒ(JB$ŒÔ}("ZËŒv(°¾ˆ|[ÖåÒw²‚Ê—å­»V‡í9õm³œýÔ™2_fÅ$Ãç.™ `ˆ‘µ±#¤a2"`d î}PŒª¾F\üôV¹F?™ô4´mÙúq˜ÌžÛÿì+íðõáBò˜ 0Ä :¡DÁ A݇ò!3¹PŽÞ—³êfV5Óe±¸{·#\$®ÖÓiٮʉ/+ÅÄózf8c_G=d.™ `ˆq•A¹ˆ‚qº÷Åc³b̾x\–oÖVù^w{åðÛ#殯êQ¹|yÞö<äükáÁ§,™`ˆñ%Ayˆ‚ñ€º÷<0E¨Î¶<0w1é¶zÕ~ˆÿbYÜvÃ“Ç ã³šŒ 0ĪQ6¼ô Cuï‘¡¢»9JdxÌ«;¿­øE3^ƒÂñü&LúöÃIÙWÒÇð¹Jb @-P"`  îC#c$Ë”'A¸>ÆÃ­ˆa˜ò}u³,ü˜õj½X4K‹…¢æ0¹áõôMæb¼@ÅP^"`¼ î]áà¹ýÂãâûýº¤À¾YWmÕ-ókz˜K(ä8 hˆ´£!er X @¸{Ö$l ë¬t»ß«™›ë\¸IçÆ§6™`ˆq¥C¹‰‚qƒº÷Ü(I´Êxà†ûNn»*fœ/vÏ÷ÂOq2?ÀãJˆò ãuïù‘œ(où=?ÿ¨›{·(ú¢¼-Ç«öÙ¥D/«q›Å©ùl»6g¨•L0Ä(€B DÁ(@Ý{ -%Òþ.P { -Âc&uKÆM} ¢ r}((2>«ÉÈC ¨ej™H 2¨{ 3DR±EFõÈ\óÅÌQó|±˜UcwcÖ©ê°àû€ŸÄdB€!F %$Fê>ÜÓÉ©¶oÝ2ÒoÞ´#évƒÉ_NN¹ =.mµE§]­oúwn¹ÜÙ½^¹{A¥ÐOdÕ.d"Yh`ˆ 3 - u¿:“„Ë -Ív„>-Úwõ8Yn-Žÿ¼³'Ó-v'»sû*›u;{×íÑbï)‘ÿ ÉCL"˜#ʆ7/ÅÁ$B݉˜á„©(Äwòs¶—7¬S˜ïZ-‹º-Æ~x‘gÕæ&)“ñOÓÄüL•Ø!êÁôaâE¢@´C}o¥Ë)¡¹Ò‰]é¦Eå$›–«n…¼ªo›nI«_ÎÚÙ,c¨‹y¹Ä*¬‘›‰•[rùñ5sŸ,Y³­¦ÈªÙ~˜f˜ï­fÊtON3@4¹+ÚzsÏÏpS›À„Öà!ßÒº÷‹¾N—ÅüäTï,[~¨ Âá“$‹ 1•`¦(~BP,L'ÔýV(©IÆ(J9¡êÖ¥÷ÆË4iæEU?«Ã3¢ZðŒ¨ñ]9~í¨jߪ–óvw'ÛåËóþÈ´H¿ËkP'ÿA’u†˜N0Q” o‹‚鄺w£ &1Ül/_ºmì,»ìl³I×™°£(1ZsÇŽ|Èδìömy¸®} š|¾“i†MPO*Ø0M‘@0šP÷&aHn¤§IíÐÔmß6¯»µWID} ¢|Γ‰†QPS*.R$Œ(Ô} Šk’Sî‰Ò;DµåjUuSY‡õápò OÆ b8AA©žÕŽ‚ᄺ81I4wô8#ù.NÕ´þßæ©êBðHï ’Ou2HÀ Ji‹É0H‘@0P÷$ʉƃdzº‰õÉéf"½ßm¤$;ô» ò9N&bA ©~fm,Œ Ô} (£D*÷03B³nôB®ÉCúýù$'# 1„ ˆTß´ CuïÊ ¹ Q@æy˜¡üø3”^ƒTÀ€ÂT˜ÊáÎR$ -„.Ô·‡Kk"2ßï¦ V§ÿ6ëe]Ì˪[ÇJðIÿÞ“>½Éßz̰ï<ÙJGÕð„Ò~Ø÷ Ž·Oõ'~ŸE†;dZ¿ùCjq(Eó‰é}úÓŸðO~{ƒ&Cj?„=¤ÂW)ž2Cò<ú}öJŒ”ìý¿¹qû“Bž}ãÓ†°,Ó£î{¹Üè´z‹Üİ9 -„þ¿í†endstream +eŠNÅHKCg|óQìïˆu}rJ¹ÌޝïÊ“Sfß\­ŠUÕ®ªqÛÿü²šÙ¿˜œ““S™eŸÛ‹0æýÏò@Ma¬öÆæ)$l/ýËé¨s  v§Ðp_ýów‚Ð,ßÃÊ+ ãußÁ"éH m_3hèX`Ù>çͺ^•KûSž™ÏƒONŠOf2)À#ŠE33LJ$ŒÔý¶rpI„Ê+¡r¼*æ¾t”Ë·å2^F¶ –?½…ö™HbBÃL£BGÁ„FÝo…fœð\Q 4sBÿ»©Ð?•³.êqù[j->aõ9YQ`ˆ) +SJi6¬h$LQÔýVQJ ÏT”;E/˶™=¢ÉæŠ=½‚=(·ÏG²ÜÀ“æ•;&7ê>È­Œ!ŒÁB-œÚWÍøu¹êµ½xöão‰®2ñ¨íÓ‘*6°C´†É¦”J‰Qõ½:׾lu–Nçóf¾°¢ÞT³jõ®Wõ¾ZÝuÁÙ1ŽÙ9—&ÂdÊÐæìâÕ‹þ¨ö n´;&ßÄn]ÂAú„%“Ì0¶bPʆ9Ø Ãàc +ûñ¦R¶/Ÿë|ãY[2›‚Ž™Œï˜×ËÃyS·Õ¤\ZFì»átùSÛ—(`°ñþyûdñádóaiÚs ÒÔ„”M”dv„,uŸ¨Mç5³¹x>—m(}õjyBóãfÖÿâ{[7OwÐóé +¯Oxr{†X‹ƒ‚¢EÁpBÝœDFã'æÊ&ž1b¨ ®nžß-›f©®\L0wTQO"g¢†p©…;æª\­«IìL9±¨úBý%û‘®^Ódb!F,d†R1Ll$ŒXÔ½›ìQ,'\På “=ÝÄß>r’Z*sîXÂkG‡vâû¦~[õ´ž—µíirÅ¿žê8ˆ•Ï|2VÀà +*‹b à +uﱢʳŊ9¬~n«zÚ_FWQ´"¹ñÕ±¬iÑY¨i/×õ¸ë´XUôW”Ïz2RÀC +ªŠ" C +u®­™Íh-SÜuÕ^¼«‹y5î™úy1)VåÃÞ­–êЋãsšL 0Ĉš¡ÄDÁˆÙsÉÜ¢Ã$÷#ÔÍ(èúÄŽÈ—ÍúfV¶wöúÕ¤¡ü„3-ˆeF;X_D¾-ëré;YAåËòÖ]«Ãöœ‹ú¶Y΋~êL™/³b ’ás—L0ÄÈ€ÚØÒ0‘@02P÷¾F(FU _#.~z«\£ŸLzÚ¶lý8LfÏíö•v øúp! yL†b@PH"` îCùá\(G ïËÇYu3«šé²Xܽۂ.Wëé´lWåÄ—•bb‡y=3œ±¯£ƒ2—Ì0ĸ€Ê \DÁ¸@Ýûâ±Y1f _<.Ë7k«|¯»½røís×Wõ¨\¾ŸÕdd€!† T25ŒL$ Ô½G†"©Ø"£zd®Šùbæ¨y¾X̪±»1ëT +uXð}@ˆOb2!À#Š„ #uîéäTÛ7Œné7oÚ‘t»Áä/'§ÜŽ…Š—¶Ú¢Ó®Ö7ý;·Üîì^¯Ü½ Rè'²j2‘,40Ä„†™F…Ž‚ ºß +IÂe…f;BŸí»zœ,·ÇÞٓ黓ݹ}•ͺ½ëöh±÷”Ȇd‰€!&ÌeÛ—b`¡îƒDÌpÂTâ» +ù9 +ÛËÖ)Ìw­–EÝc?¼ÈŽÇ³js“”Éø§ibþ¦Êìõ`ú0ñ"Q Ú¡¾·Òå”Ð\éÄ®tÓ¢r’MËU·B^Õ·M·¤Õ/gíl–±GÔżÜ?bÖÈÆÍÄÊ-¹üøš¹O–¬ÙÖÓ ä Õl? +L3Ì÷V3eº'§ šÜm½¹çg¸©Mà BkpƒoiÝûE_§Ëb~rªw–-?ÔáðI’E†˜J0S” ?4,¦ê~+”Ô$c +¥œPuëÒ{ãeš4󢪟ÕáQ-xFÔø®¿ö?TµoUËy»»“íòåyÿFdZ¤ßå5¨“ÿ É:CL'˜(ʆ·ŒÅÁtBݻтn¶—/Ý6v–]v¶ŠÙ¤ëL6šÆYñéLfb¬@¹PV"`¬ì¹mÔfŒžë¾ðŸuÛ9øñE½ö{ ÅÙ¯¬»_ ûµw¢¢|øé:ð|X.öÜÆÖ1™=ÞöûU±³Í²7Ç“júeìxxrsBAä– ±–õF)‹‚цº÷´Q“Ƹ§õ´Ý5]ÏRên8nATÜ !‚ÛŽà”Ï;ÄApÃÝÜrE¨pª:Û,}uÅ­nÛr|:ioûÞÛüui;<Ï4ýnŒ|¢“1†FPHʇDZ@0ŒP÷#-H&ÇHì`dáñÍŠ›röÄŸü ØñÙMfbì@õ¨Þc cuØQ”­¹cG>dgZvû6„<\×>M>ßÉ4CŒ&¨'ÃÏ>Œ‚Ñ„º4 Cr#=Mj‡¦~hû¶yÝ­½Jz êåsžL0Ĉ‚šRt‘"`D¡îQ\“œrO”Þ!ª-W«ª›Ê:¨‡“Ox2NÀà +JÅð¬v, 'Ô}À‰I¢¹{¤ÇÉwqª¦õÿ6OU‚@z_|ª“A†HPJ[L†AŠ‚„º QN”0$ÓƒÔM¬ON7éýn#%Ù ßMÏq2AÀ#jHåð3kc`¡îA%R¹‡œšuû£wrµHŠÐïGÈ'9!`ˆ!E¤rø¦X B¨{PnˆÈe ˆ‚ì0ßÈà åÇŸ¡ô¤ì¾ ÂTw–"Q t¡¾=\Z‘ù~7e°:ý·Y/ëb¶XVÝ:¾Pê€Oú÷žôéMþÖ“`†}çÉV:ªo<Ù û¾Äñö©þÄïá³Èp‡Lë7H-¥èc>1½OúþÉooÐÒbH퇰‡Tø*ÅSfHžG¿OÂþO‰‘’½ÿ77n¿`RhÂó¡oÜbÚ–ezÔ}/—Vo‘›6GÐÿ>ùí{endstream endobj 1140 0 obj << /Type /Page @@ -3818,7 +3825,7 @@ endobj 1148 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 698.0664 511.2325 707.1721] +/Rect [494.296 698.1661 511.2325 707.1721] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.4.1.4) >> >> endobj @@ -4264,12 +4271,13 @@ x ìn+×í 7Éz[­‹Žî‹º3k•¼iPÿ¦½1ɰó›ûE†Î•8þдØ(ÝÎmоª7´ÏÐo›¶êAÍ#Ž4ŽdÃáh‡¢¦•h+F žœˆ‡UûÃÎíÁEðëJ€¢ý¶ðîÒYR¬û¡ØíŽ8¾/¶¢)A$؆F~öË2XÂuëRPÂÈ¼Š¢eÑ(Vuqå 4¨joßñË`wÖj†Ž‚÷f|SHÚê~èÃ"Ùœ?ü¨ßü¾ZEÌs•J• B±b©È%bž§BÎKn×ÍÁá -<ð|߬o¹ù`&͵KÞºö85ØÓNBƒÅp€ñs°o?||OñoOëP¢ÀG'HM‘Œε"~4à*ÎðRÃþÞÑ<.Xl5ga‚¢È$*x–[8_p$Œ—Ñ&¡w@¿=V¥£÷`ùjͪ…öv0PÜ7MĘ B]KÕ%6ÖèÛ ¨È)£™'ãÎù¦C7¾~iÚ¾öØ÷ÿpûŽ ÞüØSv¤K,>ºæ¡©Â’C±þTl¨ƒF÷r‘ã ]”ûªöp-ú¦E 5Ð3ð9B¦êf6Ø£cz"´×MKAwhê’¦‡øüÌ)Rýe (þÙnŠºúã䑳Ng•¿<2>œ(§">‰zƒ“¥M6Ó2žÃ"Ó  𙽔€ôi‰à !‡¹.nëp׈K#šÊi0B¦ƒ!ÈEkwè#wL”L§,jN;ñ¢v!k`¯¨ù±¿0­¤©á°ÅÍ(ûÛPa#Rƒ–>h„TS×¾Ð'Ä´2y,Úªhž«q±¦«ù0|5ŽXœ|i %Dž+}i™È+và:Š .—´©QŒ°ù #A`O °“ìªÍ¶rþ?ÑËSÆõ,MtÍîËQÔRSm’Ùà¢èaõÜóÜ_*˜¸8LÈç$ã$>J’ö"’`¨ ­ƒe}8ëëÀásâ³”ã ÅÚh‰>®©7 /«M·"˜d"µŒÉi¸Ôn¤,F¥²ç”; º¶²©üÒH°†ž7S¹FÎ8 ât€ªÿˆ½p*¡² °{CE]ιKó4—9ŸÓļ¨É(,ýé©¿‡ ˶iz²ž„"Ï8ŸB‚Jp·;^bç8Ö¶<¹oÊã´üì£Ð¨Ž4DN†ÉÉr¢ P˜ @cRàâH=Åáàê²òÙæðyÊ•ŽÙ;Ò“9Ñvà–ö0ì°=f´‡T©’æ™=µ"½Þu(kÁ»€¡÷3®„ë¼Î£v÷Õý®j6mqØç2 TäLb°>”XÀy¡Ì™j‚Ûâq Ôv$¢ -žD8^øú &®*‚îóSˆÏš|SXuYµ)©Ú„âüѳoSSiùS¯wUý•eg(£ãÜsÙºOëàïg7b¸„%Wð¡Ðñ€^Á;NÀNTÿ¯ÕâÛ»Ó÷›CHᙺQ -ÿñæ·Å/¿²e¹`Ë,•ÖdË'è0°&TŠû…’Ðd™‰#»Åíâ_ÿ㬨ǨP¸ªÎc°5#º§K­â™V܇3üôEjŠfø -–Q£­¢+O(Ÿèº³ß…Ù¤ÆáÜ,Ç[|Ö§%_P[B騠ò™ªýó`ÉU¸týqwyˆLä©Ê³ì¡”YÌ'}šûÿƒ“©ÿ‰3ÅWá$ h·Vž?pŠY8I ”‚lSø´£à2Þoýçˆk¥$\î™Ø¹Ó€H~ú÷oPrÛtýHx-Tà3Ÿv@¤è]’·`ºç×î‰ àÚýô•¯×=:å×n„èç–óÌ!zd¹ïªß=Çæ@¿OUÙo¯ƒ÷Õôý 7:ú¹AA¨²ü%ðr™2)"ÄúsZVicÎ; ŸÁÏh£WcÄçÊ+3‹Ÿ±ò#ýšo›]yJ¯¦úßJV§Ìrû’\Ó4lqþ²áË’ÈFCÿ9¶x- =×ú -µ¾€Ð5༚ºÜ¸c3Í¡vÃH-Ôø·¿‹ßE `{õ1³?Æßÿà¶–úŸgÑ#!¥`jIB¡¿0{üÉñ¼RÜí¿ð\endstream +<ð|߬o¹ù`&͵KÞºö85ØÓNBƒÅp€ñs°o?||OñoOëP¢ÀG'HM‘Œε"~4à*ÎðRÃþÞÑ<.Xl5ga‚¢È$*x–[8_p$Œ—Ñ&¡w@¿=V¥£÷`ùjͪ…öv0PÜ7MĘ B]KÕ%6ÖèÛ ¨È)£™'ãÎù¦C7¾~iÚ¾öØ÷ÿpûŽ ÞüØSv¤K,>ºæ¡©Â’C±þTl¨ƒF÷r‘ã ]”ûªöp-ú¦E 5Ð3ð9B¦êf6Ø£cz"´×MKAwhê’¦‡øüÌ)Róe (þÙnŠºúã䑳Ng•¿<2>œ(§">‰zƒ“¥M6Ó2žÃ"Ó  𙽔€ôi‰à !‡¹.nëp׈K#šÊi0B¦ƒ!ÈEkwè#wL”L§,jN;ñ¢v!k`¯¨ù±¿0­¤©á°ÅÍ(ûÛPa#Rƒ–>h„TS×¾Ð'Ä´2y,Úªhž«q±¦«ù0|5ŽXœ|i %Dž+}i™È+và:Š .—*%ú¢û´‚4ŠÓ_®—A#E~ò:î\õÚPIžê,×SÈà£Dh!RW' 4A,€£WCJ¢&9ç>Í KqĹÈè‘¡`€ØÀØá$aI½5žAnƒ!‹cò')fB®™ÉóS«I (pëèJF™˜dv»æ EXrœñÏÀÚÎ8˜'jÆ!Ò¦ZçQÜ›Gçɤä-nAås?)°oN\ +½¢|, äÊ“d?|˔ȆzR笸µÀù³`™P¯7¢ + •"$D‡N=¥JsN¶ä ±ú%=%h Óqžr™r£Í…¡`Z6 FØ|†Œ‰ °'XIvÕfÛ?9ÿŸh‚å)ãz–&ºf÷ˆå¨j©©6ÉlpQô°Æzîyî/L\&äóŠq%I{I0TÐÖÁ²¾œõ€u‰àð9ñYÊq†bm´D×Ô›†Š‹Õ¦[L2‘ZÆä4\ê7R£RÙsÊÝ [ÙT ~i$XCω©ÜF# gœq:@ÕÄ^¸•PÙؽ¡‚¢.çÜ¥yšËœÏib^Ôd–þôT‚ßÃ…eÛ4=YO ‘gœO¡FÁ%¸Û/±s k[žÜ7åqZ~öQhTG"'ÃÆäd9Q ˆ(Ì 1)pq¤žâppuYùì?sø<åJÇìéÉœè ;pK{vØž3ÚCªTIóÌ„Z‘‹^ï: ”5„à]À¿Ð€ûWÂu^çQ»ûê~W5›¶8lsP€*ò&1XJ,à¼PæL5Ámñ8Pj;’QO"¯a\ +ý“NWA÷yŒ) ÄgM>)¬º¿¬Ú”TmBqþèÙ·©©´ü©‹×»ªþʲ3”Ñqî¹ì Ý'Šuð÷³‚1H\Â’«øPèx@¯à'`'ªÿ×jñíÝéûÍ¡¤ðÌ@Ý(…ÿxóÛâ—_Ù²\°å –Jk²åtX*ÅýBIh²ÌÄ‘Ýâvñ¯ÿqVÔcT(\Õç1X‹šÝÓ¥VñL+îÉ~ú"5E3|HË(ÈÑVÑ•'”Ot]‰ÙïÂlRãpn–ã-¾NëÓ’/¨-¡tTPùLÕþùF°ä*\ºþ¸»ÍýÿÁIÈÔ‚‹ÿę⌫pP´[+Ï8Å,œ¤JA¶)|ÚQpï·þsĵR.÷LìÜi@$?ýûÇ7(¹mº~$ ¼*ð™Ï; Rô.ɇ[0Ýók÷Dpí~úŠÊ×ëˆòë 7BôsËyæ=²ÜwÕïžcs ß§ªì·×Áûjúþ…ÀýŠ\È  TYþx¹L™bý9­«´1ç†Ïàg´Ñ«1âså•™ÅÏXù€~ +Í·Í®¼¥WSýo %«Sf¹} I ®i¶8ÙðeId£¡ÿˆF[¼†žk}…‚ÆZ_@èp^MÝ¿ +nܱ™æP;ƒa¤jüÛßÅo€"P°¿½‚úƘÙ +ãïp[Kýω³è‘R0µ$¡P‡_˜=þäx^)îö_ó]endstream endobj 1218 0 obj << /Type /Page @@ -4772,29 +4780,19 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1307 0 obj << -/Length 3388 +/Length 3508 /Filter /FlateDecode >> stream -xÚÝ[ÝsÛ¸÷_¡·Ê3Ÿ$зÜ]rM;Í]m_;\h‰²™H¤N¤ìsþú.>Eˆ å4ÓéLÆÁåb¹Øß.h2ÃðGf"C™¢j–+Ž&b¶Ü^àÙ=Üûé‚8š…'Zô©¾¿½øî Ëg -©Œf³Ûu—DXJ2»]½Ÿ3ÄÐ%pÀów¯þþúrAžß¼¾¾bþOø1×?ÿòúúÕeÎç·o~ws¹È±âóþòê—[OqžÇ?¿{óö§_|.?Üþõâõmx‹þ›Ìô+ü~ñþž­à…ÿzSRÌžà#¢m/¸`HpÆüÌæâæâaï®y4¥9.0‚‹Ù‚q$aýÉb™€qŠErIa ÊeAù”ô”/ J‰Y ÒÊÿµ-îË"€@’|–óeyN¾F¤ #OŠä©´Hu±-W‹åC¹ü´lêõå"Ãxþ~ñññó?î´Äß½¬Ç‹d´Ì% ¹¬ª}¹ìšý³%–eTG鹦xæð’Ô³\W›R —àòKгÀñT¡å„d³´&˜X҇ѢO5ÜÆ`¥žêDgŸ›z°¡„IP´àÓª„´¯fgy,ÂíƒSL$-Qˆd¹rŠIˆyÂ[rØDæ·f·¿$rÞÜï‹­õaóhkÇ…ýÙmWîíø7Œé¦´ãuã&Ûçº+þpÏÔ+Ǩ©Û -¬—Ï—„9óLåˆq¦¾Âú,ÆÝ2PuËL -Ĥ̿F¤‹q· T©½s®¸úøûãÁ1—I'‚/ÜŽ.7EÛ&ˆ* ©—\4 ~L@œžasèv‡.Á1&› 1é—GŽÅS‚)Äsýa¿„ %ýo¹:+òoXàê¾nöÎ¥ïÇ&‚$.õ1ÁŒ"ðf}àBR:)¾Ëº¨6 Ûjyú’õ7ø’C{þWÒP¨D9–Ü -ùŸ¼î Mø¯³^KqŒÛlR¹T •çÙKSi~.•f @ãt:•ö©ÆSi êŹf»“É”CN#"Ÿ!P%dˆ’)8=V}"!nªmµ)tcbÞ5‰ÄʘŒ$Ö«TfÍÀ"‚^ï fæ•ùåóbóT<·vnuØîZ;Ý=”vÎÆ|=©òfd³ÛËvW.+…Ë•a¶ ˜#šaÁ~žÖvÞ=ïªe±Ù<Û©ªŽ2üªZk°. °KÛ¿-:mÖhÌH„ÌH'§¤O5n$J¿À¾^-OÍs€:BM/ꉋF›Eá9‹½5{!éÜêaÛtîÚxŒÈ|UÀtmgõ>Yü´±ZÓ)ˆoˆyppÿj'QŒ´@!Ë3Fh0»Ø<µVšÎ Ü>Ôò«mUôÚAh0eŒ(%qg1%è ½õٕͨÀ¥Ò/Ì0Ÿ7kû[Ø«†Ù¼-÷`ô¢Ë hkÅór‡ÛG™dJ ©Ç™¥iyœP„Ù‰Â]µ©:íe ‹òe¹ë dP‘2¦zü }Ûû.±ä"•qŸ¥5ÂN–BÑì”å¾e*!* -¯Ï+mxþôP]¨ìÃO.Ø«bÓj+ÊÙ¼n:'°Ý…reç«zÄø¥ÕSÊÔeŽ -¹ëO­e¿|(êºÜXæÛfU‚q1°ú·kk³ÿe™Èâ´þÜløÚ_Êù!%ƒZ˜JqÆÞ( ™û©êšCçkF›ö W-UîîS¥­Ñ†Õv·)ž£P{0u‡­«ÊöxQ´>æ÷þóXiÕ "M£Ïb¼Z -Tg«%‘‹jTý"õXŒWK*lÛDQ$Ê•ôö­ûÕ}ªˆÉgŒÂÈö,Xv!/É‘RNO9îÎrÔ®”~düžÏòûT¦J PX¨ìÅpÔEÒŽ”ˆE^ŠH'¬íÈBRá–Ih"×8Ò…TäÅ=‘há8æˆQêß´r.hq˜¬í¯Í²Á9«ú~àžÞ’y0]9mî}*kî2aîʘ{¹iŠÕ)“ñ G Hu¡1úM˜TŠBœTh j46PÒm±H¥×G•Nn¶³ [NnOhÝ™)Çl‚ ÄFN;&q$š°Gd`Yu_'”Eöo¨€zd“j D=ž”ÖaNU¤È7e§ë@¨±\y ƒßÝܼþÁŽ]¶vd‚ØòÎRôÐZŠ! –Ñj”j«ÊV›Ë…ëHP( -)(.*°Mc*wÛliËüƒ\Fu+#ÀàÅÉ™@ôö¬ƒ}#×Ö°±¦1bƒÏ1}Ì¢ x²7÷÷3;¸Ž”îèýZð5Áätý:‡J€ì@ ‰Á‹î½§:'Æ€›ï?éVN–éjÛ;æ4_ø¶€¾Ð•qU’jo‡»ÃݦZÇwÙ•ûªY]ÁPú÷¡ù[-åI/¸icÉ%lŠn`±ºßp_j91±¬N,ê$2žšŽZÅ¡k¶ðνN«UÕB‡¥råÝÃI¸¬!˜ñs¦ªßÂ/&˜§™9‚ÇâP'¸Š”ŠÏär[T[ +Omµ<]dý.rlÏÿL +‘Hd’yCÁÿ•å>SÐÄùuÖk)z¿=Ã&K9RBäÏ ¥â\(Í)Õ±χÒ!Õt( T?×ìö c2˜2ˆi˜‹yUB†(˜Â¡Ï@ŸHˆ«jWm À(_vM"°2޲ OÖ©ÈšƒE½Þ€Ï4Ì+óË–Åö±xjíØæ¸Û·v¸»/í˜õùzB'ÄÍ.Èf_·Ýv_®+…Ëa±"C$Ïpì‡qZÛy÷´¯ÖÅvûd‡ª:Šð›êVÀÛÒ ;µ ð»¢Óf¦Œ„+‚2zn ˆ¦MÄiéõf}:£€s¸šÑÓŒgŒö‰ Ì æg¼6» ÉÒj`×t®oδðrSÀpmGõYä´µZÇ)p«ËX8Ú~]'‘ iy‚Æ–gŒÍ`ö¯yl­4¸}å 6»ªÐu(:ƒÍ`ȘOJâ΢I0ÐZf´6tŽÍ¾.•^0ÍØ²¹µ¿…ý±Z¡]¶åáÌ>H™ p°êui©¾}óö{ÛRˆ¼HbW8ÂúDΫ¢|bF{Üï›C×:y¶[Û0úÐ ð+;¡­ÏË÷2É”@R!–åÞ‰¦åY1¬ GÅ'îØUÛªÓç tQþ¾.÷]b‚rQJÕ€¿¡o»âÐ%¦‚(¤ræã³ÆÖÉ,9?ey('™Jð‡Üëó…6‡lùx_]b@ÿöåGç l¯Ø¶ÚŠ]ÖMç¶»PnìxUO¿ÔpzN™§¹ +QëO­e¿¾/êºÜZæ»fS‚qQ°ú7·Öf5òËsžÇ[ðÔ­ã:\Êå1%…,˜H~ÆÞ4©û±êî›cç³ç@›½>.OªÜÓÇJ[£u¨í~[™Ã ò*9•,¿Op1¦œª®ÈÉó7ÉÆŸˆ‡ª|LÉøQjF ~e`ßóº TceÆqN£ %q¬ÍáÖó¿«ʺßäé=C• göx@5³ÇžÊîñ-šûÔ&GÙìÜ&’çÉíùï2¢À-Îj3PÕy²Ëà4@¥HŸWÉnŽþŽoWT:÷, †Š¼Ø¨”R:o Cªi[TÖ Á©Û[ƒ£ È9¹P ý*ÌrE üÍ*4P5›(HéRX¤Òw½Jg7ÛÙ„M$w'´îžÀ¤‚S6Á%är‚±‰ÕŒMx*ƒÉª»:¡ÿȹÆ@8$ë„g5¨Æª<ɬ3”1¢b]¾.;BŽåÒkh|ÿöêêÕw¶ è²µ-ãtæ×Ðpö¢›Ö^ Y°—ˆV£TÓØT6Û\¯\EÐ>' »¨"aJú¹ÛbK[¦àD4¢K¯Nn¢åçI•ù®ÍacegˆÊ NÜ‘²w Ûx©Ýѯ†/$Ô>âk\2Èéê-d ™Ù‘@2C8Ëi$Ðx÷=Õ91FÜ|ýI—rò\gÛFØ1§ù—tGgÆUHªƒmî7Ûj]ôkÙ—‡ªÙ¼€æúw¡øSKyRKnÚX„„MÑ,*„3Òv¥ëº fù×Wÿ²ïÞµe’çŠZÉá¹{I ¥%´Ã•ã£ë w¥–‘aãÑêĤN"søAÓ‘Äűkv°æAÕªj¥=S¹ñ‚îþÄiÖàLÜs›ªWᧈ›¦„—îP7ÍoGw†Iw_töy—Γ=HR/-þjS·m™*ˆðaßO˜IlÄNsãÆŒjͼM"ßSå,$ަž™˜BF‚ÃwM*ÕÖºŒëH j)BŠL~7 ‹]œûBšM-%á'7ˆ®Þ%³”rûÚk‰zȽpãú}Òd^ÜØ§žÊ.ÜV•ŸêbW­í8X)²ÃWå¨èÂ2‚H&sXåJœqF|5 ;×Èi¡´+"€Fòäk+̆òŒ?¾ñDg¤ ~ (……ž Á®qnÇîYÂäÇÑaS‚l§³O8YH¨3éù€hwx"=«N•L8LDû¨ +õuä%¸`5«Ë@4Rf{@=ŠSiÓ…ð€F*óÀF-ðPî(êgxÀ˜óÕš¬=-öå10 ˜œQ®FX8âGÎgGÎt‘åÙˆƒ° n+8ø#´„Jh`yqxúÕð…TxÊ7F°Ä4â G$’f´ã–äŒ'|@#çhàp@¤étа$hÀp 4à™î^£\’×Þðî†bhØ1;€ üãhÆ–¿ÔÛêSÊ.£âatóg8õ™JìÁ]<ˆSŒâå}óXºÛ53’yáx0rn1 ˆ¥ïfìÊ¥@á2vÕnWnª¢+gðÉÍÓ :i_8"⫦&šy&ę浻J-!4§@‘«´>„œ³Ú•3À‡ÚÝÇf=j%løäˆfR<øœ¤f{tûÆYH©§Mâ0¦ì¹pEôf@^º%û‹¸~ñ+&†EŦ¡Ÿw#ð¨…Q»Y0rãú Ô˜£¢µÀÐæé/=p¾.@”.0ÑQÚR2ÏÏ8µ@¿¾ð)#¾1vi&± ÕUà6œa ^<ÕA¸5J ¼F‚XøÂh_¬êÎÌ!w×µÍ"•!Õ4T TFžCY~.ãOq¿®Bê4b™UjYFZMc–H­WÇv_šJÙò¸ß€‡mmÇûåŽþ H_wlåtÅsbƒÕþ»d[•cd¾ùYÍAûAvЊºô•HnQ‘–gëÆ‚1B§µÂ—ñcæsLÉßš@Î^ÔÇÂq‚Ò¹a›Íp—ó0 Û”Ã'ö›%¾l‚V­¿(ÒÁ J¡m€²ºÓŠÌl$¢™IÀÓ8½Aß™ú^¾é,±s‹ÐZÇÖ¨_·MNßÚ÷lÂÇOh|lއºØÚŽ¿ÍÒ”cuãÛ§zí¥r !Ãá뙓2@øTšøk1âÓE2˜Sw qA(o\ß„ô`6FÏürë^ëóEèXmØw‹®+w{³7$|Š@²ž· 'Öã}µM."Dÿ¾âëC½ÔŸËzÒ Àž¹åM{/Ode*§]WìN¾è¢ïÿÅsù;¼9uö}§úLßó úª.nŒùå²÷Z$WÖa°°Ý~ÇípoðÐy1êj…úyÝôìHåk/æL&3q‚P^L/&¼±,Ð^M ½šþ€Q¯Íø4°sïÓdðúWÃþk;ØXBËÌ݃‰½'Ã;xaSµŸ^Lý·˜Œþ¥Äfá‹‹/þO¨þÄô§ RNÝ +­y`â„ÒzÇÙøëÎ š“„èÿ|Ùòendstream endobj 1306 0 obj << /Type /Page @@ -4802,40 +4800,33 @@ endobj /Resources 1305 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1277 0 R -/Annots [ 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R ] +/Annots [ 1312 0 R 1313 0 R 1314 0 R 1315 0 R ] >> endobj 1312 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.3839 329.5541 281.1025 341.6138] +/Rect [219.3839 342.7466 281.1025 354.8062] /Subtype /Link /A << /S /GoTo /D (options) >> >> endobj 1313 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [491.4967 274.4996 511.2325 286.5592] +/Rect [401.2123 288.8914 470.1877 300.951] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj 1314 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [102.5211 265.1945 156.7673 274.6041] +/Rect [243.8464 235.0361 306.1963 247.0958] /Subtype /Link -/A << /S /GoTo /D (dynamic_update_policies) >> +/A << /S /GoTo /D (options) >> >> endobj 1315 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [243.8464 219.4451 306.1963 231.5047] -/Subtype /Link -/A << /S /GoTo /D (options) >> ->> endobj -1316 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [425.9845 164.3905 495.353 176.4501] +/Rect [368.2917 181.1809 436.8984 193.2405] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj @@ -4846,152 +4837,152 @@ endobj /Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R /F14 956 0 R /F48 1228 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1321 0 obj << -/Length 3086 +1320 0 obj << +/Length 2924 /Filter /FlateDecode >> stream -xÚÕZKsÜF¾ëWÌ-£ª ÝO’]{òú‘(U+'–öU‰Ô Gâ†C*CŽd¥òã4ºùÒ[ÞË–Ë¥&6Ðhàk=|Åà_Å:`Ò¨UdT ׫íá‚­îáÝwÜñl<Ó¦Ëõ×Û‹Wïe´2 E¸ºÝwæŠÇ|u»ûyýæû×?Þ¾ûx¹š­ep¹Ñ![_¿þÛ;¢ÜÀ+­×ÿðo>\¿¿úîï__Fj}{õáúr1£àËåo?üø®ýîæòÓíïn›UtWÊ™Ä%üvñó'¶ÚÁ‚¸`4±^=à ¸1bu¸PZZIé)ùÅÍÅOÍ„·öÓ)ËÁë äñj#U‡0Åg -l¨"°¯6A(…lì«âŽ}9ƒ± -W Ú·~Hž/7!cëŸqůÞkÝùDj fy/‹”˜zó -ÄqdÓÔ4:0Q:†mžTÕÄ4}Y‹ÓŠP–¿êkdÓ†klS!ºâ"Ø=¥tߨïŠä.OÁ«Âx}zÜ%uZáƒY×%zÜ/y¼.O "ï^Šämé%Z|V†áújO}E”ÌM\=¦Û .ÜAÆŠ¸çÑZX•²_éî[`7ìºGë$ÏiÐÓžQFåxì+”û¶h¦_ß>X €¾MN•ÿ¦§A•ŸÒ£#–ÄH“åe²0»Uµºèƒ]Výú­]ë¯))` -)„›rCªUHã­-‘¡Ù|Hö5ê„LV6ÒH=$n‚myxÌÓÚ.U ½~í?¸}ø‡FÞÌMÑd, 6}­ Ñüâ´¾Ï™Ý -Ùm†¿yYÜ[ëÁø.¥¿´Ô=Øô¸v¡‘‹`0]¶ópÑpYåË:Û¿LĦâA¬$ÿ?Fг@1kÍ(FÖœŠž9?¦UŠNŒ;{ýáöêý¿i|H«*¹÷ž±/P¨À€°áìö‡"1È]ØþÛÌö{.Ô÷˜nËbŸÝDë(ˆÂpI´ç‹îÙŠÃÛ”é‰þè!C†Î0m×îOǤÎÊ‚ˆHɃ…´à v`QšõÝ©&â®t\¥#ôà -žÓÏYUgÅ};GWjE,8º}¸JŸ,¶³ÎÏMŒëx!ÊCò”mû@Ô[|Õ¡ÇWü¦¢÷û¤²8„4€›‚¨ ö'Àëê‚÷\] -ÇÌí¢]ñu /yéг=?x}AÏæ0îÐrB9÷)Q‹ÓáŽß“=D¨ÁÍÀ þˆ±ðfÏzÈjú›<•Ù®¸~‘¦.`j“ég@Ô"ðÊ=ó¶Þ3ðevðËýDH¹wn+gŒ#Çl)ë²Í˜çB“TuRW#¹pSJ³ ×såö£KA.Éa z‚ÿ‰‰ï1«5šƒÇ úü¶êÛ½1ÝìwÞ|:Š(ÁŸ7_—í¼ù.\Åo§ôø’—çñi^tƒO#Ñ“øÔ}{iĺ¼¿Gä‘<"Upd@ Ì#¸Xÿ4zAl1–‘šäUI¤»”(.çrD÷qúù1϶Y¿}—QŒnk7¥Å— 4˜F'Ô7³ èR§÷åñe#¢0EslZ_€’ 9<À='âZ‘æS¨|¬™1+hÆiÝEðXû ÂÛobÎð–H|¥t&7uç…˜`1Ç) 0uSÃæsÎýÔöh†YqW„Ô6‡ ©Õª+%A,bÿ©õ—´K0k,ù`OГmD½¤Õ_¦V qu-çârÒrÊ„>i*Ñ Õ™9G–#Ìœ´œVB}‰å DŠ"í<ƒŽ«X/å/]¶|ð\(sw:<îî\½»ÚçÍ6Ù>¤lþ?/„y2j–iSJËÁDn©"Øhæ8J-%´œ‡áüJ®ñJû;[Æ ¤Õ½¥¾…¥^n¸q8ê€ôßTD²«wã_˜f»tŸœò†œˆ@½BÇ1‘t 3 Åû¥ÍèdØY%Ú3á\>k£†*T" +¬~9£ê·S‘ñm¢P>ÿÖ¥¾–²9Z“Ã8ÍæJ(ái«ì²÷Á†Ë…Ô±,á”?ëlý8ù2_‹Îùš€:G ÆçWÔpWÔ/cDŒ<Õ_ùšT±+¨•ú¾ƒ…Ÿ Ãx¡'*ñ­]§3å°x·օú;.d]ÔÀA°ÚGÔ¯õ«v M1N -öüúë½Î/nøR†Ôe›ñ>ÏE fùèñïqä,<”Ù(¹ €ç+0È“â z ÁÕ@2¿w,öξ‚­!ׇä×ì’¯mÃ`oOÞxÈ/4pùNZÔôL¥SE‡d—z1´O§û"´­!æûs4†ý£ÓÎ@ÛvíºÎÕ¿ÞDìôÃðÝãXÕø®+(ãvDG‡æ&òèBT¸ùrÂÝÈ–"øqÃI*¹y,èXN ôØñ,B€‹ØxØbpÏã - X…ó®tØfpÅsÙœÿ˜lÓ³«y¹MÇj$wºcÕ|UP‚˜zõ„õñÊoÇÝÉõYì­Jú”ºôìÎåq³ÝtÉ@Bª»`º.ÛyÓ5\=ÓÍÞº’¾Cí"„ƨí<×X»¾c€é˜Å}õnÒºš´k“ÕÏ[ׇCRø>-5¬\jœä§9«+ªóE«wØf¬î¹ÜÖ¤ËAÅ${®±ä¾Eu5S}Ñÿ+‹²»!B³tõ×e›±›çBå÷ù©z8èór›@Éôžà÷(8ýÃÙfÆyÓð˜’EKm¥.ÛyÓ4\iÁ§Šù0qÜM£G -p¥å‚‚žk¬`߆²X4œ¶á}FWRX£bTŶ—ï_io¨ B®—rÙ.ÛŒ½=—¿%9¯I”Æv¨^ì¹Æ‚Ì q_òÛ¬zÌ<6˜ðjر½Ob>µe¢SÓÚâM­¯ËÚ½ª’Ú©¹4ƒ)h*ÑÜHÁ0+¶ùi矚¯²¢ÍR†ÅŒŠ€|¯ù.+v¯Þ|?‘`àL𘸛óð½võ¨I8!ò$£™?¹‚WW×82S>ñyÈüéÝŠÌÚ˹n×Ä·eènöìÉâ»2ÃYÛËb;çLû…³ñÒý^—mÆs=—»@?+w;0Y€ÍËn -°‘ìé¬'ümÓm¶2Ϫº!êï&V&6ñ•±ú=ƒe“Ù {aÕþ”ÅÛÃ%bç7%Š…K-±×Ì/à“í&y¶swĶ:.‹?Êý~î.@è@‹æbë+ïDl@(‘çÖ×0Ö×,(Ï„V¦·@ÿc4ìàûNþ.«ZâÛë››wohÜZâ#Ôšðñýëµ+ª*ݺß_MbŒÅ„\ÐE§¿ÔQw͹S7/ÆÆÅŸŠªæ2î%­¦ñFµ…Öpþtn¸Ç{®§Ôw†ëÐ 4k~w梾ãÏ:'öþ;ˆýê_¶?ªÿ’ñ9 ,ïƒDÊ)…à|¨¹–q cM¨þ'[–Cendstream +xÚ­ZÛrÛ8}÷Wèm誃+/µOÙÄžñT­3{o•É-Qw)Ò#Rv¼•ßn4ñ&*[ÙJ¥ ‚‡èF£û Ñ_0øÇ‰™LÕ"NU¨׋Õî‚-áÝOÜb–´ì¢þ|ñæZÆ‹4L#-î7±’% _ܯ?ï~~ûëýÕÇË¥Ð,áåRG,¸}û—+깃WZsˆwn¯o~úëÇ·—± +îo>Ü^.c–*øòü·~½:~wwùùþ—‹«{?‹îL9“8…?.>}f‹5Lø— Ê4Ñ‹x`!OS±Ø](-C­¤t=åÅÝÅo~ÀÎ[óé”å´LBˆxÂtBtLÇ%“H&‹X§a$…4¶ËªõåR +ì/yä˼ÊʼÁ>¬_«lW¬pxZg-½A¶ió=ÚmN}eÙ±¶™`UïžÊ¼Í×hX¡ƒ·î3þü§®rÂvèv›½äëáA1Ð`‰F†™.9S­…ÑÚª…+âÕ‡—¢,©UÕô·¬«G‰í‡œþÒT7‡õ,!g +,¦âEÌ£PÈ8™´¹G-»0cs•tmΠ­¢ã`Fùº-6¯(øÍµÖ´‚R… ÌXÆ€zCŠ4L’8µ OÃè0ãÈVeÖ4ÃH Ο}ã0ÏEþ2¥Œ Stt}þ<´¦ˆt(Á׿­éQckö"óH“*Ø„n` Ì#¸~½ VËØ›•MM]9õPb³¶öãüËSY¬Š¶|¥þuA1ºjí†_&Ø`šPßÂD€T K›?Öû× Žˆ£0~Û4¾drx‚;:$òZ•—S¬8æG,*qZw‡<Ñ.ƒpö›3¾)®A£Ôv`â$ð¦î¸,fñ¢ãV714,>çÜ m¶fWEH4Où +2¤£V])±‘¸O‡,í†fM$$z²‰¨×¼ùÓÔ,á#Îã®ål\NZN¥‘Kšê'4HsbLÆ£‘åˆ3'-§•Pßb9ÈÝãX;#Ïðƒat–0é1ôå_À¤UVRoWªé0¤°u0:b·9ÌŽ',™yÌÕ¹+Hz•ÛÕ·™ƒ/Ú Ã ,N£~‡Á÷d²ÿS/à×(’g¿ ;øEŠ–í7þ¼>ðG +L~O +|Øiì¾/Äñh Åì]€ãÃ!’êYšñ࣠p„P€14ôL1N#vb;|Œ _ò¥µgÂùt´û—\S6¾±i|‹+KbÐáâÛ6¾‘Í$§‚vSY[ö#Òº,ݨ°…¼è5 ¿!ÄÎ +uÂþU¬ß¥Y¦RãÀ5goóØ’bǤpvßS[M’MªÂD³y®Qaì‹¿$ =G5XÑå7QMÔ¡¹ô8$•ñÜ<©àÔl% @ŽT˜wµ=±á©•ƒhîKîC:tcŠùÓtÃÇúܤe¨%»lƒcÙÆ[å'«Tór}•j$wºJÕ|SQ‚˜ïˆzç ãã[އƒ­­˜›”ü9·éÙƒÍãf+è"-EΘ® ;m:ê™nÿ÷ï4Hß¡v±£4Ug´s¨±v}',Œ–ôÕ»ËÛfÒ®>«Ÿ·® ‡¬rµY*RÙÔ8+sV×I(q®¬Ú…ÍXÝ¡ìµÕ¤Ë AÅÏHv¨±ä¾Eug8¦ú¢ÿ_e3vLYž«˜ta3vs(T~SšíÉ@Ÿ—ë}$w:Ð{‚¯Qpþ †3ŌӦᩆ³«:—[ua§MãQÞ4ÈàS‡ù(IÒM£G +¦,äJË3 +:ÔXÁ¾ á-Ñ@Ãi>t …‡`TŒN±>ãø^{CÎÏ¢s[N5cm r×"‡ñ½ˆÒXÿÔóRh$u¼ rw‘ôľ/š§2à ƒ §ƒi›Û#æ’Z&:§YslSÁmÝÚWí6k]Ëvù+2‚†þþ šEµ*k÷ä¿*ªc~2<ƨ©ÇU–ŠjýæÝÏ©$¾n7qޏ×Ãz•'¤B†”jæö¬ðÍÍí„D.Ì”Ky¶…Û·"‹ãU\·^â +2t{rOqõ˜á¨Ç«a3æLá…ƒŠQÌÎÑg6ãµe¯ËûÆÞL½æeû£×HöôÑ«'ü½¯Ãú¥,‹¦í_º[Ÿ‰T•%aš¤Éÿ”«º5ƒi“Ù+s=uüኳ‡MÁN/ +$%Bòs¼ÝA^2µÀ¬,ÖöFØœ‹ëêk½ÙÌÕÿPªð×XßYÿÇdKÄRÏÎσFóëGÌ„Vio‚Wæªj÷®†¿.šcçûÛ»»«wÔ>Zð#Öšð…kҹºjš|em5É1éࢀ®5ÝþàøôàwœÖ¿ï[•¿z{Í›i¾QÇ#Öpü|ƒn¸Á[­çÜÕ„ÛÑ 4³w¯á©ßËAâŽ?r›XGøo§ÿÝ¿¥;þÄüK&ɉœ^²¼/Rh·šûÝUÿ/Ý—endstream endobj -1320 0 obj << +1319 0 obj << /Type /Page -/Contents 1321 0 R -/Resources 1319 0 R +/Contents 1320 0 R +/Resources 1318 0 R /MediaBox [0 0 595.2756 841.8898] /Parent 1277 0 R >> endobj -1322 0 obj << -/D [1320 0 R /XYZ 85.0394 794.5015 null] +1321 0 obj << +/D [1319 0 R /XYZ 85.0394 794.5015 null] >> endobj -1319 0 obj << -/Font << /F37 1018 0 R /F48 1228 0 R /F55 1311 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >> +1318 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F48 1228 0 R /F55 1311 0 R /F21 930 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1325 0 obj << -/Length 3852 +1324 0 obj << +/Length 3901 /Filter /FlateDecode >> stream -xÚÝZÝÛ6ß¿Â(¨ˆU~Jdó”öÒÜöpI/Ù¶èZ[k ±¥­%g»-ú¿ß ‡¤$›Þ,zo?˜"G$çƒ3¿ŠÏüøLçYn…Vešq=[î.Øl c¯.¸§Y¢Å˜ê‹ë‹Ï¾’ÅÌf6ùìúv4—ɘ1|v½úi.3™] lþúÅ¿^^.„fów/ß^j=ÿþÜó›o^¾}qY¨ùõÕ›×ï.³jþå?^|s(>>Ç—o^uõêÛažË_®¿¾xy¹sÊ™D~½øé6[Ã__°LZ£g÷ðÀ2n­˜í.”–™VR†žíÅ»‹Ç G£îÕ”ä`8˹‚$·I¢"G Å3žÛ<ŠW™‘x Ï´µz©P¼åjõ{ÛTÈìg_i="WEf+` ¤ˆ&s -›SXOôSbÙ¢È=Ár[v]b©3“ÃkOœæC]ݧ6#3‹š!¢_~ILËÌJaÂvÚæ¶^öe_·Í±¾¥±6’WJö‘êTøBŒ9”<ËQ“é¿X­.’³yINÊ Éìü~So+êì7¾ÑUûÕžÚuGÿûK3?4M}ÉçÍ:Cf !LÆ•R³ç™ÕZ¸µ®7øŽÈ `{·+›>ä07óê×CM O‚k:é >–HXë"è©ÜnÛûESÝ/pß^¯® ¾PAmí“3-ÐÒò7=wUO0pªY0]kL0³‡äZ¤Ú`¯pÞ%œ÷ëÀ‡–cCÑ™by~Î -Ž&ÛŒ¡ayy’cêú}ݬaÓhæ®ZÖ?3&*”jÁçŽÍÂë;™Cï¶n|·SɘŽ,»`[8cܘî«ßúðFÙSß}{Øú‰[§ÄUÝ”ûzû@Ã7NÀëÄî¶åÒm\_í¹Vc]+Ç?м)wÕ*CI%¤mVÚDÉ;#äLd9S´L¦rP !Ú²ŠÜÙ b¿³køïÊ ®|¯Åc"íß܆‰À -‘S%sc3-lp›²Û$ØœúŒ¬ù=Å )Oô MKÀ ­èÈ$Ö–9¸Å(‘aéé¬E&0 Q`ܳ¸Ü?Üõíz_Þmê%„iÀ ¸raŠ©J×US(V­™ßºÝµ;z"ƒj’ZííÑs«VàÙØ4ÿ~S5 ' ˊܘ±e$¸ƒÀes>æ—ðN¦/÷°Ïg#ÿ†ƒA­Ø¾¯·[j9a‹ù¶-W·º!7¾Nª¬¬˜žMšLÛ±äZGÇéõv-ýûÓ¤ÉwÇ÷AÕî bf8:˲¡Æ]µïêΓ—·=úiפ¿ßY<Ž“sQûE»rw·M9_­³¼`ÁiMâöDð_„“Î-ødÃ{ -â!0Y Œ'—E¦Œ Æ_ýæö®`—X;7™PŠ{Ú¾=ZbUÝ–‡m?¨æóÄ‚`Ýà9¤”S ý-& `߬à äŒEÙ¸‡ñ†]ǧÐÿpçIveúzN·.îbë“Ñ«ÙêæOðçóOSAÂïe²çŸ™f¯Û¾:Ã;\¾¯z¯ð¨®ÚÕ‹e»m½I•t€MRS)£öt#2Xš#š€uQ@X†£ò(˜S“‘ -ù]UÛÿk09¦€i­’K3RŠs @@¶ÐùTž¯¶Uï¡qqpa@ˆ&"Dèì!Rn|;‚D q1úHD„¸PFÏß4ˆÄ»;7 º;ŠÝJeJ›#À3u‚í¾^ÎØ:˜1uŠê29ˆ]Dç@ÇÕ¿yÆ•åiÙˆA¢¯½‰îÅ3€J‚'Ý•=ºaHç.ÇÂ3ÓCú¸7‰£$ Ÿ{ˆâäl­!ífÆ@¦¸œwu³¬ˆ¢Äè…¯ ÿ=4õ2N -^¸î7Ô"dTQi†ÅEÊ 7=¾Š<"™{3æV Š¾Äx)ìbÝ”ýa€óR†H£Ôí”ýÎe@oIݦôù©ª%=÷.eî}•›p0 t"‡ÿ¦¥áûò:zßqG¾ìC½òo„ÉÑ"4Òº¹Ã¶›)¿Þ!ôÓÆõ|y‰ûÈB?! -̘"쉽C‚¶í2¾ æ·ížéö˜mjà `Йå£$óxcj€:Ю»D4E&u°üϪ~ù.v Ih."@uæ® 5å*ŸšÊÍùVvS¹…CSQ÷HÞ@w8rÓD¼*”$6ÅׂeJDزHÉ‹ƒ·QÑÕR–˜6¼º&?ñÔ`;œþ¦õŒÞb}–P¦ÃŽ&gv*¡sJ•™*DØ$ÁSÀá ?ÄØÚ¶í{j%ªBe:çúD¥ï«‡tæ\° H´{šüNN…Þât‰Òm©ÂKÝC‡æ²ª÷)×*0g †|_v4ùªBY6Îḵª†Z䪠ñÅÕë¿YH®ùô¾9Ôc¢»ÂYÅÄ·’wAp‚‘ˆ‰!AWÇ…†\)9:ggä¤À•¼ˆrò†à5.>N‹ ûæþ‡˜˜,th€¯àú ”åÅo/ÊÄ^@«p -‰yi·Ü×7”$Ô -B]}R~²  S(@N -Aîê4¶_Ϩñv4ùbLŠ3NfÅÅßUËáÈç™ÈÔñf8ÀÆe>ÙÍ Ø‰TÙÄél£ºA’犧ʹóÏ; 2—.ž> ž†p Šµ‚\Qh…ÿ®ÞÕÛrï_o‰"ö´·)G¦áü*Ο^±£zdÕÎóâô[XB:®Ž‘Ë/K ÌqyØ{kß(ùQ¢id_ítÏ«ÖA2fŸxÕTÝLâ -|:ŽOˆ"±æ—>…’VOÄÃÄ^„Wë‹Í*u6m¦lŒ¹¶‡U -<ÊáfˆÂƒÌ0²hWì\íQŽÆðYùÄËÞPdí²ÆHIh˜6X_JTL>…5¦@Áu4â0þiáÅáG}@ÅÖ¦^nˆH¨sØ<쪲ñÓ‡IoÂòÊ¡£åÖ£ ô5B‡±€ÐUð…±€ŒPÉ1Ò¤¨Š@P¦Ε4ª´ö´ÍõÇ­²È„ŒZŽ›ÃòÄJ5ú 1YÑ#d„‡®ê>OztÈ«òXù÷pqÖs @ìq‹†ØÇæ;¤D¦ ¡GþàhÚº!ð l‡YïÚ}ŸšV3`4K¹À7„Ù¼gPxµ4q-çä¹yacɼ/߻Ԓž’þ6­+~A˹˜;,$«•ÏFÂ;îq}ðÅ—X@ƒï<½7G.ýaÁ$˧J¸€O" ×— ¡uãéÀ5÷å’Â><Ö·~wmªä¸›åEw«ZfŽo4´òÀSS… V‹rÚ]¤tÇÔƒsO³0ð¯Ìˆ#õhÖÔA-Ðr'^SîïkÁgÏ@ÝûwÇjò9…S69d«qozŒñÑA-øOUr¸ŒãLT±™TʼnH KAPàÒ<ñÜ™2¬=¤4ž šÄש«¥rÉ©Úlµˆ7çS°Ú¸î&ÜÛh4Ö@=8S…ÿÆ—¸¥4]õQ"ç7§YÌxÖõ‡Êƒ¸X -Ò¦QØ_?¹"δx’¬Û•±¡\öXìæyôìSma´TT~ZŒP6ÿ˜i@z«áÁÈh†=–ôGv -•ÞSÀ?„ —4ØÄnÀT…6OЭåÁ)or‹Uº-42–qNŒ`±ˆgâìÅ -ˬ•£{NÅìüª÷Ìvàö~ © -RM½Z¸8÷ä¶…i,ç„‚ýeÌéÖ e,çSIÁXB%nµTF¬±æÉô_¹b\(Ë}V›‡ Ý{X“¨ä‚þrcw5‚ƒècÍ8Èè¶ÅnÕ9eŽñ®ž“=á3nüYH‰ ‚£˜pœ0óÝÁEIá *•uñïC¹­WÔ\µ»ÒG ¢©}Á¬=¬7Ô]÷DÚT•‰pηì¾(;ZeSC -ì´Ü ÎŸS!¬ß\ -!eØG¼Ô†—·õûäÕñÏB¨„˜!•3\’I “0¼Å— ÌIæú)ŸÐ¼ø7éhqÆÅxÊÓË -Î 3Ãʘñä3Ç뤮TÒcP˜"%ùrUÚŸYôßõgÌ -žðg°Á]tç÷-õ<taª\E(Pn×íüMê¶ÒpÉã¡:›mIÓCLjªTH98!F_€4¾§ŠQqp†•mòܧ”¨êåó»rß9¤§ò€ï U.—Õ]ïÛÍ5¢Ù*M`D…ôJåÇhSù G‚pð¨b¾<ì x6ýÖÏLIùd>¿Ø_<›]¹\ìV:­Ñ%™7=Íý¿xµ‰Ýæ«ó7ˆ£œs„ ü%ôMÙU‹ÜOZ5Ë6ÞØDù!q—*õŽ@ÂÛ¯¾ôÕie|xGXÈÄ“‚»æ–?’oØ\êÄlÈÄ;òT%uS„‡ç1…þCGÌÉsá[€ÏEüTäÌ5™±Z¦wä³öa/ž1wùÞI†Ûö‘`…•ó”ôiJWëŸ^8>ô!^7õÎ]àžû¨#ÞlŒÝºÿ§ÓÞ¥>¦a 5.l4K÷ Jà?ñé·ÝðùÅä` ø¾‰ áë“ç©8àƒY螌²”on„n®^}w¸‘ß5å—_ìnäÕú‡w_ô?|¯Ö?4ß±«W|óã«o×?îìÃÕ«—ë•°8öO¿$œßÌ(ɧûü3¹ŸP_<Ï¥H•9V -füyê -z\ŽT0©ßerÚeê«r©3ü»¾øäKYÌlfs‘Ï®oGs™ŒÃg׫Ÿæ2“Ù%ÌÀæ¯_üóååBh6ûòÍ¥ÖóïàÇ=ýÍË7/. 5¿¾úúõÛËEÁ¬šþ÷ß\ŠÏñùׯ¿¼zõí0Ïå/×_]¼¼Ž\Œ9åL" ¿^üô ›­€á¯.X&­Ñ³{x`·VÌvJËL+)CÏöâíſ℣Q÷jJr0œåÜÌRe–O9Òhh›åRÈ(^eFâ5<ÓÖêY¤Bñ–«ÕïmS!³Ÿ|©õˆ\™¬€%n šÌ)lfLa=ÑO‰itf‹"÷ËmÙu‰i¤îàµ'Nó¾®îS›‘™EÍÑ/¿$¦áEf¥0a;ms[¯û²¯ÛæXßR€X É+%ûHu*|!ÆJžå¨É‰ô_¬V— ÉÙ¼¤'å…dv~¿©·uößèªýûjOíº£ßý¥™š¦¾äóf!³…&ãJ©Ù‚óÌj-ÜZ×|Gä°½Û•Í +r˜€›yõ롦†'Á5ôK$¬uôTn·íý¢©î¸o¯× × _¨ ¶öÎÉ™hiù›Šž»ª§8Õ,˜®5&˜ÙCr-Rm°W8ïÎûuàC˱¡èL±#k~O1HDÊ=CÓpB+:2‰µen1JdXz:k‘ (D÷,.÷w}»Þ—w›zI#a0H®\˜bj목@”N«ÖÌoÝîÚ=‘A5I­ööhȹU+ðì@lš¿©š„ŒeEnÌØ2ÜAà²9s‡Kx'Ó—{Øç³‘ÃÁ Vlß×Û-µœ‡°Å|Û–«À[Ý›_±¬˜Z7M ¦íXr­£ãôŒz»–~ýiÒä‚»ãÎû j÷13eÙPã®ÚwuçÉËÛý´kÒψï,Çɹ¨ý¢]¹»Û¦œ¯ÖY^°à´&q{"xÅ3!Á$‚s ~Ùðž‚xLVã‰Âe‘)#ƒñW¿¹ý+Ø%ÖÎM&”âž¶o–XU·åaÛªù4± X7x)åTBK„… (Ø7+8(9cQ6îa¼a×ññôÛ?Üy’]Ù¾žÓí‹»Øúhôj¶ºùÈüùüãTð{™ìùg¦Ù붯ŽÄp³/—ïªÞ+÷ÅÉÙZCÚ#ÌŒLq9ïêfYE‰Ñ _Aÿ{hêeœ¼pÝo¨EȨ¢Ò ‹‹”nz|yD2÷æÌQä_*ú㥰‹uSö‡ÎK"ŒR·Sô;—½%=v›Òs䧪–ôÜc¸”¹÷UnÂÁ€Ð‰~›–†ïËêè}Çù²÷õÊ¿v$G‹ÐHëæÛnRü’!ôÓÆõ|y‰ûÈB?! +̘"쉽C‚¶í2¾ æ·ížéö˜mjà `Йå£$óxcj€:Ю»D4E&u°üOª~ù .v Ih."@uæ® 5å*Ÿâ›ò­ì<¦r ‡ ¦¢î‘8"¼îp䦉 xU(;HlНË”ˆ°e‘’o£¢«¥,1#lxu;L~&â©!Àv8ýMë½Åú,¡L‡MÎìÔ¸Î)Ufªa“O‡ƒüCbk۶凞L¨ +•éœë•¾«Ò™sÁb,D Ñîiò{89z‹Ó%rH·¥ +/ušËªÞ§\«Àœ-ò}ÙÑä« +eÙ8‡ãÖªj‘«‚ÆgW¯¿²\ó£,äæP;Œ‰î +gßJÞÁ F"&†]r¥ä蜑“fWò"ÊÉ‚wÖ¸ø8-‚î›úbb²Ð¡!F¼‚ë/P–k¾½({ ®Â)$æQ¤Ýr_ßP’R+Xm§Ç²>)?YP)ÔLY0Lz– ],·÷¥¯:t„®þƒ/Œ…d„GŽ1ÅS„€/pp®˜Q¥µ§m®?l•E&dÔrÜ~$ÖÀ¨ÑoˆÉŠ! ï¸ÇõÁk{\J "¼óôÞ¹ô‡Ó+Ÿ$á>}€^_(„Ö§×Ü—K +øðXßúݵ©bSànr”Ý”j™9¾ËÐÊCN=NrV4B:ÀW5.Çiw Ò8Î]<ÍÂÀ¿2#ŽÔ£UXSµ@ËxMY<¾s®Ÿ=uïß«ÉgLÙäcL¬Æ½Yè1nÄG²à7UÈAâ2FŒ3QÅfR'> %,AKóÄsSdZȰöÌx.ü- h_§®–~É%§ª°Õ"Þ œOÀj㺛pc£ÑX@`ôàL~_Ü–Ò@tÕùTæ~sšÅ\g]¿¯<‚‹EÀ!a€ýÅ“+ßLË&ÉŠQ +eÅnžGÏ>ÕFKEEá§Åeó™$¶*ŒŒfØÑcI?dçРPé=üBÈpY@ƒMìLUhóÝZ 2&·øP¿¡{B#cçĈ‹x&Î^©°ÌZ9ºáTÌίzÏl÷nï·d  ÕQŽá¯ŒÁ=¹maË9¡` sº5ÈCËù‡TR0–P‰[-• k¬v2ýW.!¿à>+€ÍÆî=¬IÔpA¹±»ÁAô±ZdtÛâݶƒêœrÆxKÏÉžð7þ,$ÃÁQL 8N˜ùîࢤð¥á +ºøó¾ÜÖ+j®Ú]éÎ#PÑÔ¾TÖÖê®{"mªÊ¿D¸ ç[ö_Ž­²©!ùuZnPçÏ©Öo.…2ì#^gÃËÛú]•€? ¡bV™5\’I “0¼¿—è,}Æò¡g^ù›ô§3‹8ãb<åé5çÎ…™aåGÌxòãuRQ*é1(L‘’|¡*íÏ,úïú3fOø3X€à.ºóû–zº0U®"(·ëvþ&uOY¸äñPͶ¤Žé!&5U*¤Š„£Ï.@ßÓÝĨ,8Ú6yî‰SJÔóòù]¹ïÒSyÀwÐ*—Ëê®÷íæÑl•&0¢Bz¥òc´©|†#A8xT1_ö<›~ëg¦¤|2Ÿ_ì/žŒÍ®\.v+ÖÇèzÌ›žfƒþ‰_¼Ô€Äîq‚Õù»ÃQÎ9Bþúù¦ìªEî'­šeïj¢ü¸KyG áÍ—ŸûÏé´2>¼#,dâIÁÝ@sHËÉ7l.uâ@H6dâyª’º)ÂÃó‡Bÿ¡#æä¹ðÆ-Àç"~$r戚ÌX-Ó;òYû°Ϙ»v‚° ýû@°ÂJ%ûļL‚ãÈcAÚ.ÁÇKøÀ¿¸ó©vPN€-WVF’!UÃo%…< Ñ ?Š'€BS w +`1gרp~ &ð€°X̼κQÃÔãõ£…ÁGŸŠœÉPçÜŽÜZnø‰€ÁæCpe@„q:b#q‡í’®ÝMlêšÐðj*|Ésò Öõ´Ôqãß!P‹=¾z_¨ñ-$ž7H·nJ_ñi“. ᳣Π8Q1w;#^@]’Y{$É5áÊɃt\¯ù§Û‡£Dg´ÒÄC€2úƒ7vàsNò3ºoòùÙh'IÖøÌSÒS@¦)]•zÕ<úćüyÝÔ;wu{îsŽx§1vëþ—N{—úŒ†!&…Ô¸°Ñ,Ýç+(ǧ?ÜvÇ“ƒ1àú&„¯ž§à€f¡{2þÑR¾y¸º¹zõÝáF~×”Ÿ¶»‘WëÞ~Öÿð½ZÿÐ|Ç®^ñͯ¾]ÿ¸³W¯^®WÂâØ?ü’p~3£$ŸîóÏä~B}ñ<—"UtäX1„´'ãÏS_NŽË1€ +F"õ»L®C»<2»# ‘ÎýysU…Á‹ºƒ $.Îäˆ,–ÿë‹ã“ÏÄоÒ…OÏ} /u†_µ'n‰X´ÿùãùá +Ë#Î|WSüzM†M!—\œìœ³LHÃéÖÿêmTendstream endobj -1324 0 obj << +1323 0 obj << /Type /Page -/Contents 1325 0 R -/Resources 1323 0 R +/Contents 1324 0 R +/Resources 1322 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1328 0 R -/Annots [ 1327 0 R ] +/Parent 1327 0 R +/Annots [ 1326 0 R ] >> endobj -1327 0 obj << +1326 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [91.7912 473.8206 148.0099 483.036] +/Rect [91.7912 492.2833 148.0099 501.4987] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1326 0 obj << -/D [1324 0 R /XYZ 56.6929 794.5015 null] +1325 0 obj << +/D [1323 0 R /XYZ 56.6929 794.5015 null] >> endobj -1323 0 obj << +1322 0 obj << /Font << /F37 1018 0 R /F48 1228 0 R /F55 1311 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1332 0 obj << -/Length 1516 +1331 0 obj << +/Length 1440 /Filter /FlateDecode >> stream -xÚÝX[oÔF~ß_á‡>ìJx2÷KyJQ€ (YªJUÆv²^;];„¨ê½¶×¢ªBû°ž™3gÎùæ;›D~$Òafx¤ G¥ÛŽ.aíÙ‚™¸ЇR¿¬GO™Š 2’Êh}1Ð¥ÖšDëìÝòÉóã×ë“7«˜ -¼dh ‰—gÇ/OüÌ9, ±ü­“xòêìéé³·oŽWŠ/×§¯ÎV±Â†Ãίï}õúd¿ï|õ~ýbq²î½zJ0³.üµx÷G8üb3ZD70ÀˆC£í‚ †g¬›)ç‹_{…ƒU·u9Á4šªè(@G0¤Ä5!lÊ&—yB -ªêpà¶ÎŠ‹Û™Ó4dZCÅ}`—Qí^4iûÒŽzÐz„¡ÐrLS !f‚¥Ûf2ºŠ¡Á€F¬¸¬’Y²ÙË¡³!Ü7ƒù®M -‡7Y¾=;ýÝ?5a? h_{a>´¤«žV´«žv¹ö;Úäc·z•§…0õã$m‹ºjy¹¤ñ³YÞ¤»âƒoœ RW“ÓFeÓªÿPæh®(¯7ynjà€ŠºÕ¾8\7}9žÏˆXÊû8þhsÚL†®’aÞ»kÀдžÈþJ@ÎDHsŸzÂ\{,&åÛvu† `»Ó¿ƒ®ðØí˜”´Þ©˜+(† ÚwÔ#)A„q -a¨‘ÒÚ·Ôç§Ïž¿}=ŠbHYÊ×På÷™Ù«œ1sx“Üá¶™ùÄÆ@3é³÷ÔÇ}" -e-›ËÄAFàê2B—uöMíÄ”, Hšü€rÜæRðD’†VÐ6îß³~ ô^„¾Âa Íã²ã0¼P¿¼›Ä^%yPt~‰ÄC;ïMâ´Ì»„Ù×ÓŽ‚ùç¢ýËÌÕœeÐbpÃù×h&8Âá» °ìôl}7ÉŒdVΓl`åÁ±óôÿÂ1b(ŠHÀšF5þtuð ÞY‘2öµA!4gs_ºpÔ½o÷wµýçFè ™Ötž à ¼0DЕ‚.ÏÂî±û׉ ŒÿAáôendstream +xÚÝXßoÛ6~÷_¡‡=È@Åñø›ëSV¤m +,íwЃj)‰PYÊ$¥Y0ìßQ¤dÙVš  ¶aðƒEòîx÷ñ»;JQüAd$¡ÜŠH[A$­7 ]àÚ‹™dJ¦R߯ß>ç:²Ä*¦¢ÕùÄ–!ÔˆVÙûøÙË£7«ã·Ë„Is²L¤¢ñéÑÇ~æ —¤Œ$ž½>}~òâÝÛ£¥ñêäõé2ÑÔ +Ô¼_÷õ›ã­ÞÙòÃêÕâx5F1(w!ü¶xÿFüjA ·FF78 ¬eÑf!$'Rp>Ì”‹³Å£ÁÉj¯:‡œä†HÃô t&ÐÅg¡"--Qœñºo\(h&‚’X­wM•­—‰¢4nò²N3/ÏØD> + hb93½^W#`ZÆëºªòuçÃ$0M(þÀ¯ê&XÉýCZeA?½nó }ªtžÚ¼ùœ7»Æ›%˜¸÷õ Nˆ‹ó`óKÚuµ·IY¯ÓÒE‹@$ÄJÉúÈ6éú²¨rχ›ÜoçGÍÒÄ×UUTaµè.ýÓy]–õ͸€¨t½b]¶~¦íÒ.ßäU×~Ždzvè³Äm{zõ^Õ̽—BèÞõýì¼Ðr'Ì8±Ž AاQê\Lö=—uÛ=õã?ýß§ü¶Ý‘s$ùg±§ý&‰¢9ìzä×ö´ž?|¥èüÿe&Ò*,dˆTá¨âÖ{(¨73`‚¡„1S†ï%2A”V,RüÁ™Ìˆ5ÆÌçq2L&s”c +)%Çm.¸CȆ\ó18c’( f7ߎ”´ºç··6ÝWD„Ë " rìü"¯f¶Vœ0mD¾ò<¾hÒßá¦(ݱXåhú9¯ +<ŽòÖ¯­}¶à!y‰tîxÐPJLœ!ΙO¤"ZòAòJY™ûÜÉ÷;ÜÖ×X8µŽ;g~9-ÛÚCƹ"‚ÞM…¬h¯ÊÔ9 ,”àOãýo¯ê*s"  È’c¢úŽU[q;N‰Ûo™v~OôßOUyžù©¾ÐáLšm'f`#voß½ìN-ÑØF.õ•]ÞTiW|Îñô ~ÃóL‹Ý¼ö~ºÒ6ä¨/†sd“„ãþ3\ëõ’tÆE͉¢ãI÷¸tÏC¢__…ú0„+ŒÊÚ)æSJbVð}6õe'ÔŸªnê¬8¿ÙÍ`™µL>vÅsÉîEÓ`«0AÆ.+(®ÑBÂ% ªWs—¶L€bÝ=+.ªt–l®À +ìþ ü…)oº´èñ†øÝéÉÏþ© ú8`cãÅyŸøZ§Z§[®½F—~V¯òuá\ûqºîŠºjŸx¹´õ³YÞ®›âcOkþŒ»íôLgþc™“¹Ž¼ºÌÛpR“&Tü8¬Žáº{ñ|Ed©óø“«i3Eo^œŠ1Ù7d +Ùo&€µ_K¼«JŠ÷CcÕCº ï¯r¯Ÿ|Öàݹ;=ðzm…Ç轆6•Ë p±½uîâÈÀ­²HX,Ö |}=;yñòÝ›} Å’ؾ¦&ÿž›£É7§'É0áî;n>s9ÐniH4PŸŽ…(´µl®ÇŠ ôWT„¡êlo´{®d)&EÚæ”“¶PR<"’-iªñθ}ùWIÌ•Äx'Ô†šûHláJ‹ÄøÖùÃÝ,žØ|4ø9Ï⩟fñºÌ‡Š96ÔƒùïE÷š=Z¨ÿsš)ãîNpÍ4#¸hvrºº›e“Ʋ7çY6uóŸ`Ù£…ú_aXDPƒBðñÞ¨w¿ð|éÁwV¢­{mx“à‘Ø£Ñ½Ä}èç§íW9¼DscØ> endobj -1333 0 obj << -/D [1331 0 R /XYZ 85.0394 794.5015 null] +1332 0 obj << +/D [1330 0 R /XYZ 85.0394 794.5015 null] >> endobj 126 0 obj << -/D [1331 0 R /XYZ 85.0394 556.3324 null] +/D [1330 0 R /XYZ 85.0394 574.2651 null] +>> endobj +1333 0 obj << +/D [1330 0 R /XYZ 85.0394 546.9607 null] >> endobj 1334 0 obj << -/D [1331 0 R /XYZ 85.0394 529.0279 null] +/D [1330 0 R /XYZ 85.0394 517.4433 null] >> endobj 1335 0 obj << -/D [1331 0 R /XYZ 85.0394 499.5106 null] +/D [1330 0 R /XYZ 85.0394 505.4881 null] >> endobj -1336 0 obj << -/D [1331 0 R /XYZ 85.0394 487.5554 null] ->> endobj -1330 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F21 930 0 R >> +1329 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F48 1228 0 R /F22 953 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1339 0 obj << +1338 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1338 0 obj << -/Type /Page -/Contents 1339 0 R -/Resources 1337 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1328 0 R ->> endobj -1340 0 obj << -/D [1338 0 R /XYZ 56.6929 794.5015 null] ->> endobj 1337 0 obj << +/Type /Page +/Contents 1338 0 R +/Resources 1336 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1327 0 R +>> endobj +1339 0 obj << +/D [1337 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1336 0 obj << /ProcSet [ /PDF ] >> endobj -1344 0 obj << +1343 0 obj << /Length 2407 /Filter /FlateDecode >> @@ -5010,29 +5001,29 @@ SD ΄£Màõ¿|ŒÜHÖôA-08×I@t98ÔÌÁˆÏùMã혽B†·Ã³å `æp„²Þ"°q—o—^ÇãsÇM´^„ |UÀ1øXžÆÛŒØ<âr“ü–«üû¦GŒ—¼{÷Ö-m»ðhŽ|€Jä¹ùç_4’ÏŸï>~xEë·°•z…)AÃK,¹pÝ×¶½ÿ¬&TdÍ9³à¤Õ‚w:|d…êäÛ£dZK&œÈªVŸ±*Œ£_KSÐ=5m8#<ÌÁ,–JÍ#D±”îI—€-`ñcóÝÓ|Ä—×Ç:—üK³›”Œ üs ý1àÖº@TÿyÀp.ª…aGØ…~æII¨L>óznvFš¥Â¦ˆBE D¨3SÏ>º^÷µµ^endstream endobj -1343 0 obj << +1342 0 obj << /Type /Page -/Contents 1344 0 R -/Resources 1342 0 R +/Contents 1343 0 R +/Resources 1341 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1328 0 R -/Annots [ 1348 0 R 1349 0 R 1357 0 R ] +/Parent 1327 0 R +/Annots [ 1347 0 R 1348 0 R 1356 0 R ] >> endobj -1341 0 obj << +1340 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/local/share/db2latex/xsl/figures/note.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 1358 0 R +/PTEX.InfoDict 1357 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 27.00000000 27.00000000] /Resources << /ProcSet [ /PDF ] /ExtGState << -/R4 1359 0 R +/R4 1358 0 R >>>> -/Length 1360 0 R +/Length 1359 0 R /Filter /FlateDecode >> stream @@ -5045,12 +5036,12 @@ q n*Œ1½÷¨¾x¥Æˆpîâ‹&Xîܧ³±è\íD¤ßä0}#XŒûž˜‹¸À>#^V°¡|2Îi‰9ÊÎr)`˜¢Xh¡Ò& „hb—H°Œe"Ãêʱ„£~Ï“a³tŒºìZDß!#Z¶ÚÂk! e'jÝ=§ _tsÙ¬ûÍ&­Nå@‚i¬ˆ3t%kÐE„\H–YZxÿ/U¥Ç™åë—Φ@±¯iW H þrÓGçX5¾ûû8‡´ÕªOª«t–Ô³$Ây°‰—BÒ›ÀÄ5©/¨vp÷o`kA“ôr ±ñœÓ4N.4Žæ&F°ÑTÆG%V½ Î'ÌØR5¬BÔ‹`qUžv-UÍ=ëÆåQv2ë_ ”¿­qq‚~èr¯Ú5ÌJ¼ð˜°h»P¡õ‹kÜàéÚýªå>Ò¸D °o»Îi¸CrT]¿MJ¥ ÆÖ¹’°;¿ö‹ûóZ¼¬ å[Ç-œÁ¤ŸBx¿ýpü|üÈÂendstream endobj -1358 0 obj +1357 0 obj << /Producer (AFPL Ghostscript 6.50) >> endobj -1359 0 obj +1358 0 obj << /Type /ExtGState /Name /R4 @@ -5060,57 +5051,57 @@ endobj /SA true >> endobj -1360 0 obj +1359 0 obj 1049 endobj -1348 0 obj << +1347 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [470.3398 467.2776 539.579 479.3373] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1349 0 obj << +1348 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [316.7164 455.3224 385.3363 467.3821] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1357 0 obj << +1356 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [304.6433 163.6578 373.3153 175.7175] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj -1345 0 obj << -/D [1343 0 R /XYZ 85.0394 794.5015 null] +1344 0 obj << +/D [1342 0 R /XYZ 85.0394 794.5015 null] >> endobj 130 0 obj << -/D [1343 0 R /XYZ 85.0394 769.5949 null] +/D [1342 0 R /XYZ 85.0394 769.5949 null] >> endobj -1346 0 obj << -/D [1343 0 R /XYZ 85.0394 576.3463 null] +1345 0 obj << +/D [1342 0 R /XYZ 85.0394 576.3463 null] >> endobj 134 0 obj << -/D [1343 0 R /XYZ 85.0394 576.3463 null] +/D [1342 0 R /XYZ 85.0394 576.3463 null] >> endobj -1347 0 obj << -/D [1343 0 R /XYZ 85.0394 533.5444 null] +1346 0 obj << +/D [1342 0 R /XYZ 85.0394 533.5444 null] >> endobj 138 0 obj << -/D [1343 0 R /XYZ 85.0394 299.6823 null] +/D [1342 0 R /XYZ 85.0394 299.6823 null] >> endobj -1356 0 obj << -/D [1343 0 R /XYZ 85.0394 263.0631 null] +1355 0 obj << +/D [1342 0 R /XYZ 85.0394 263.0631 null] >> endobj -1342 0 obj << -/Font << /F21 930 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F48 1228 0 R /F41 1208 0 R >> -/XObject << /Im2 1341 0 R >> +1341 0 obj << +/Font << /F21 930 0 R /F22 953 0 R /F62 1351 0 R /F63 1354 0 R /F48 1228 0 R /F41 1208 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1365 0 obj << +1364 0 obj << /Length 3579 /Filter /FlateDecode >> @@ -5128,54 +5119,54 @@ j= ´Úl8 <ëfXžŒ (Ñq–zxûȦÐOžüö^þ‡9žï Ä'“’G³¡ÄÝ?õ‘³ŽÞj¶š %&êÀ*½ñâ Wð]Gjä]$’cä„D"é€ FoŸH¬a™ú™®¼Àè™2i+ê‚ó1/=Ó’ Ü|ꊞW°Òâ“I¿| À)%í6N”+qì­xfß¹¥(wF$Œà ÃpbrÁÃÁÄ'¸M¾ Gg\ªà 8"À`xbílgC‹›d¬.â)h¨Ký©§¢cDߣɑb ÃЯ¿Tš*%„$¼Âî`ªˆ ™qÄgylþ;4É#q“OÃR¯_^^WŸ¢@&à¼tþ (³€TfRà0‘U†œ²)(,OH=¯4¾1‰?lãq,¶Ìè?–Á Teâ}מÑZm€œ&LÉyV"³tQ0Zõ—Ñ ¿nš¼“t°kΕ/²ù8h¶úHµIMŦJaÜO‹éF(­-š§6è¶sZ9èê…ÚÂq6¨›G+^…¢GLŒY9nãÕ>ˆ$&äJÂ5äJ0L}¥B~h),NøŽ ßÑ6húXä…"Ûô<öÄǡīƒO%MÁÇêÆ{ñžöôD,ëý’à›7R;°ƒžð±íêb5•Ó°ê` :!£Œ—È}„Œ2vQ*BFQÇÓÁ%« ‰nñHU5›íCݼR“£ZPlÂôaOÃX·p©ÉAó®i1ý¢ÍGŒìØÕuìÿ‰fät"j ŒÃ ;€ýEd4ð)Å‹ Šþõ ›Ëû²6ööÉĦ²­Ìªzíg¡Q;À³å£‹¥4åâqâßHœþ—þ %•`ZI1ÓŸ“þïÿIÍÿ&‹_¦é’"Iý("¼)dx¿Ù¹ýCÕÛ­ÿÓ°H2endstream endobj -1364 0 obj << +1363 0 obj << /Type /Page -/Contents 1365 0 R -/Resources 1363 0 R +/Contents 1364 0 R +/Resources 1362 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1328 0 R -/Annots [ 1369 0 R 1370 0 R ] +/Parent 1327 0 R +/Annots [ 1368 0 R 1369 0 R ] >> endobj -1369 0 obj << +1368 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [464.1993 393.2115 511.2325 405.2711] /Subtype /Link /A << /S /GoTo /D (proposed_standards) >> >> endobj -1370 0 obj << +1369 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 382.2725 105.4 393.3159] /Subtype /Link /A << /S /GoTo /D (proposed_standards) >> >> endobj -1366 0 obj << -/D [1364 0 R /XYZ 56.6929 794.5015 null] +1365 0 obj << +/D [1363 0 R /XYZ 56.6929 794.5015 null] >> endobj 142 0 obj << -/D [1364 0 R /XYZ 56.6929 769.5949 null] +/D [1363 0 R /XYZ 56.6929 769.5949 null] >> endobj -1367 0 obj << -/D [1364 0 R /XYZ 56.6929 749.4437 null] +1366 0 obj << +/D [1363 0 R /XYZ 56.6929 749.4437 null] >> endobj 146 0 obj << -/D [1364 0 R /XYZ 56.6929 458.7525 null] +/D [1363 0 R /XYZ 56.6929 458.7525 null] >> endobj -1368 0 obj << -/D [1364 0 R /XYZ 56.6929 425.4132 null] +1367 0 obj << +/D [1363 0 R /XYZ 56.6929 425.4132 null] >> endobj 150 0 obj << -/D [1364 0 R /XYZ 56.6929 270.5184 null] +/D [1363 0 R /XYZ 56.6929 270.5184 null] >> endobj -1371 0 obj << -/D [1364 0 R /XYZ 56.6929 234.9696 null] +1370 0 obj << +/D [1363 0 R /XYZ 56.6929 234.9696 null] >> endobj -1363 0 obj << +1362 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F55 1311 0 R /F48 1228 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1375 0 obj << +1374 0 obj << /Length 3172 /Filter /FlateDecode >> @@ -5192,35 +5183,35 @@ x CEÕ0´2ÂE¥ϦD1ÑÎÊNSí¡ÉNÒv+3&û-¤thÊYÈ6ÙÈ[NÚã3õˆÔ©6Lž¯ñefõj.õÌ‚NgÆ5þ1 J“f"³g4AÐ`€:¯ÁST# NÉÎk0&û¿Ôà™~ ÏŒ}Fùü”# ÌÇ-ÆãЧQ÷œ"#¨Š PçyŠj¤È)ÙyEÆdŸ®Èw>B8*+µ<øIYÅPÇeÕC•ÕIªƒ¬ÈÎÊjDöjè)MjÇðÞox8Ž”£igc¡ÜKùдΘ1ãóë!G>*ÿcYÛ“B 7?¿1gtAÐQ€:¯£ST#MÉÎë(&ûÿZ¸Â¯¡Ä™êb¨ Pç5xŠj¤Á)Ùy ÆdÏß2Ð(}’t^‹Z¤áeOÒ¢yvTù/µ¸XJ ˜³<Ÿ\ö²ÿD!SÔïË”ÿNKEݘôµ4þ+®SVŸ…Îb¦ü—|n¸÷Kÿv¯Âp´.ÛÕ®º¡¯3€ÔMó€_A=’¼iº2 *º0 L…ÿ1NÌÑlyÙó¨G¯‰ÿ<©EFoc§wòæPdNŠ-Z|lîwçAQÙQ†Î_[–S“V «¤]púÒô1'mî>,hðcdÜ=ü2~àиñ¢ ÞÅ_ÁÉ”pã>3sp¿Ð9¦¸¢WÄÒ²Tkk¦oâð4©ßÇ‚?QÀqâw¬3|³þÕ?ü¹ìàØÔoÖŠy HfR+ò,0…g> endobj -1378 0 obj << +1377 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [417.8476 110.3446 466.5943 122.4042] /Subtype /Link /A << /S /GoTo /D (sample_configuration) >> >> endobj -1376 0 obj << -/D [1374 0 R /XYZ 85.0394 794.5015 null] +1375 0 obj << +/D [1373 0 R /XYZ 85.0394 794.5015 null] >> endobj 154 0 obj << -/D [1374 0 R /XYZ 85.0394 769.5949 null] +/D [1373 0 R /XYZ 85.0394 769.5949 null] >> endobj -1377 0 obj << -/D [1374 0 R /XYZ 85.0394 749.3028 null] +1376 0 obj << +/D [1373 0 R /XYZ 85.0394 749.3028 null] >> endobj -1373 0 obj << +1372 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F14 956 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1381 0 obj << +1380 0 obj << /Length 735 /Filter /FlateDecode >> @@ -5230,21 +5221,21 @@ x Ư/t-lvWo{‡ Ý‚Zr*4ÐÂ'ºzªë"ÊÖ)“ÏQšæ7 äѪX2.c?‹V¹¢€‰%Ö‘ ÛºÑr%¶õÄÓÈYQò$.åêòŠñ»M_qÌ -k²l úðÌ´“g.û‹F8‹¯x!>÷d[z!¼§Â@ëcýè4Í„Y” ÷B ]­:^#öФd²Û:Œól¯mGµ©s€ònÝ©¥¥v™¨†ö²Q¿ÈV9¹2ÏÔ$‰ <*“kÖ(–§We£@åÚ§meg@ûšÀ-Vy[ãm™ž­úÏZ-Š4RÜõ]u® /uy抺ԟLQŒú5´ã"=6ôeD·Òü_Æo¤ð¶Áï °Êù^7½M…É»ÍÒî³óêÑéÍÀKˆÅ» À¯d÷ÿ MÞMÝ5šº°ºûj.½¨cç+öÓÎRß'Íí™Ö홌}èø"ɦ©ªsì÷:Wwñ~ë¿ÈUendstream endobj -1380 0 obj << -/Type /Page -/Contents 1381 0 R -/Resources 1379 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1383 0 R ->> endobj -1382 0 obj << -/D [1380 0 R /XYZ 56.6929 794.5015 null] ->> endobj 1379 0 obj << +/Type /Page +/Contents 1380 0 R +/Resources 1378 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1382 0 R +>> endobj +1381 0 obj << +/D [1379 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1378 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1386 0 obj << +1385 0 obj << /Length 1364 /Filter /FlateDecode >> @@ -5256,27 +5247,27 @@ R/J ÑKL æ—Ä£´ïéãÓ© ñ¦lÌ.Ù´C]çÚ¦§‚7nœ¿\ê}Ÿ¤fß'Ùƒzä’£4>U¹„J9$iè‰}óÆ5 ÃÆž9ò'+eÆF z{ãq’W°»Š8ƒê&' €n¿ëÛu'vre‚íÙD¾-Dv¸ºüò“ôá &^¦¾ýµ°ØKý,B˜yvêùáíú­ëÿ¨6Eendstream endobj -1385 0 obj << +1384 0 obj << /Type /Page -/Contents 1386 0 R -/Resources 1384 0 R +/Contents 1385 0 R +/Resources 1383 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1383 0 R +/Parent 1382 0 R >> endobj -1387 0 obj << -/D [1385 0 R /XYZ 85.0394 794.5015 null] +1386 0 obj << +/D [1384 0 R /XYZ 85.0394 794.5015 null] >> endobj 158 0 obj << -/D [1385 0 R /XYZ 85.0394 223.4026 null] +/D [1384 0 R /XYZ 85.0394 223.4026 null] >> endobj -1388 0 obj << -/D [1385 0 R /XYZ 85.0394 185.2496 null] +1387 0 obj << +/D [1384 0 R /XYZ 85.0394 185.2496 null] >> endobj -1384 0 obj << +1383 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1391 0 obj << +1390 0 obj << /Length 2265 /Filter /FlateDecode >> @@ -5288,51 +5279,51 @@ Nƽ €u¾}¤1¡È@w6#aþ‚âçfû¥M´d ‰¯ë5¼=˜˱AãgDdè<¤Õª=¥b¯‰ãÕ™ˆøIitAÞ5¼={êc¼T ¿ O|:ú€÷¨?þ2ÆL&‰˜þÍrˆ=— / ‚3ÉÝýsÑÿdiÙendstream endobj -1390 0 obj << +1389 0 obj << /Type /Page -/Contents 1391 0 R -/Resources 1389 0 R +/Contents 1390 0 R +/Resources 1388 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1383 0 R +/Parent 1382 0 R >> endobj -1392 0 obj << -/D [1390 0 R /XYZ 56.6929 794.5015 null] +1391 0 obj << +/D [1389 0 R /XYZ 56.6929 794.5015 null] >> endobj 162 0 obj << -/D [1390 0 R /XYZ 56.6929 726.8027 null] +/D [1389 0 R /XYZ 56.6929 726.8027 null] >> endobj -1393 0 obj << -/D [1390 0 R /XYZ 56.6929 697.6944 null] +1392 0 obj << +/D [1389 0 R /XYZ 56.6929 697.6944 null] >> endobj 166 0 obj << -/D [1390 0 R /XYZ 56.6929 648.8841 null] +/D [1389 0 R /XYZ 56.6929 648.8841 null] >> endobj -1394 0 obj << -/D [1390 0 R /XYZ 56.6929 624.769 null] +1393 0 obj << +/D [1389 0 R /XYZ 56.6929 624.769 null] >> endobj 170 0 obj << -/D [1390 0 R /XYZ 56.6929 472.4047 null] +/D [1389 0 R /XYZ 56.6929 472.4047 null] >> endobj -1395 0 obj << -/D [1390 0 R /XYZ 56.6929 448.2896 null] +1394 0 obj << +/D [1389 0 R /XYZ 56.6929 448.2896 null] >> endobj 174 0 obj << -/D [1390 0 R /XYZ 56.6929 356.0575 null] +/D [1389 0 R /XYZ 56.6929 356.0575 null] >> endobj -1396 0 obj << -/D [1390 0 R /XYZ 56.6929 324.2991 null] +1395 0 obj << +/D [1389 0 R /XYZ 56.6929 324.2991 null] >> endobj 178 0 obj << -/D [1390 0 R /XYZ 56.6929 275.4888 null] +/D [1389 0 R /XYZ 56.6929 275.4888 null] >> endobj -1397 0 obj << -/D [1390 0 R /XYZ 56.6929 246.3805 null] +1396 0 obj << +/D [1389 0 R /XYZ 56.6929 246.3805 null] >> endobj -1389 0 obj << +1388 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F39 1151 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1400 0 obj << +1399 0 obj << /Length 2935 /Filter /FlateDecode >> @@ -5353,53 +5344,53 @@ u? ò-?ÎCño _iòvËõT‚du¹|Hyž¿ª1¾ð¤ Ká$î´ô‘…»‚H½R”hcð|æB±­=„” Wào8¦Í9}‚Aìie:l5œÑJ"eò£Ðú™›g 1O•Ñ/žÝ©tôÎç'ù‘‘ÉŽŒLîo*ÔØ»ù¤eø{”Ljeñðflðe]åÉø Ÿˆ_–œœž/Ëâ÷âñÌCysI/6ÝÑW‰}wüɶ¬6Uï?J„@>Žù콟㿇­ ™+Šü¥n÷ì UôÜ¿ ,$ÐÖN½G¨!Mÿ¿ÿypø«…K#›eÏ> endobj -1404 0 obj << +1403 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [101.3082 379.428 169.9802 391.3282] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj -1401 0 obj << -/D [1399 0 R /XYZ 85.0394 794.5015 null] +1400 0 obj << +/D [1398 0 R /XYZ 85.0394 794.5015 null] >> endobj 182 0 obj << -/D [1399 0 R /XYZ 85.0394 769.5949 null] +/D [1398 0 R /XYZ 85.0394 769.5949 null] >> endobj -1402 0 obj << -/D [1399 0 R /XYZ 85.0394 749.2913 null] +1401 0 obj << +/D [1398 0 R /XYZ 85.0394 749.2913 null] >> endobj 186 0 obj << -/D [1399 0 R /XYZ 85.0394 546.785 null] +/D [1398 0 R /XYZ 85.0394 546.785 null] >> endobj -1403 0 obj << -/D [1399 0 R /XYZ 85.0394 519.0032 null] +1402 0 obj << +/D [1398 0 R /XYZ 85.0394 519.0032 null] >> endobj 190 0 obj << -/D [1399 0 R /XYZ 85.0394 364.477 null] +/D [1398 0 R /XYZ 85.0394 364.477 null] >> endobj -1405 0 obj << -/D [1399 0 R /XYZ 85.0394 339.5007 null] +1404 0 obj << +/D [1398 0 R /XYZ 85.0394 339.5007 null] >> endobj 194 0 obj << -/D [1399 0 R /XYZ 85.0394 175.6792 null] +/D [1398 0 R /XYZ 85.0394 175.6792 null] >> endobj -1406 0 obj << -/D [1399 0 R /XYZ 85.0394 143.0963 null] +1405 0 obj << +/D [1398 0 R /XYZ 85.0394 143.0963 null] >> endobj -1398 0 obj << +1397 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R /F14 956 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1409 0 obj << +1408 0 obj << /Length 3227 /Filter /FlateDecode >> @@ -5418,39 +5409,39 @@ vDw /\øŽó8«úÁjÜ(,ÿñÃ=½•8 «þXÒЙv¦òsð \}6 óiÁ@È»Ÿ¾û¥ü%Èã;VÅ —A.T¥föµ4ó$N井¯™QqfÂWCdµ|ሰrÃÓLYVêõ ‚$  ƒ6þ·×š÷ÑÏæÐþyÒNUe~æfC‚™Šd¹Õt0øè?ü¶ÏŸ,|(þ̯;”Žñ'+¿Å!}þ¿ùqúÉKšÇʹþ£™›85° å>µÉg”ûŸˆ<'ý¿w€=endstream endobj -1408 0 obj << +1407 0 obj << /Type /Page -/Contents 1409 0 R -/Resources 1407 0 R +/Contents 1408 0 R +/Resources 1406 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1383 0 R +/Parent 1382 0 R >> endobj -1410 0 obj << -/D [1408 0 R /XYZ 56.6929 794.5015 null] +1409 0 obj << +/D [1407 0 R /XYZ 56.6929 794.5015 null] >> endobj 198 0 obj << -/D [1408 0 R /XYZ 56.6929 678.9507 null] +/D [1407 0 R /XYZ 56.6929 678.9507 null] >> endobj -1411 0 obj << -/D [1408 0 R /XYZ 56.6929 644.5195 null] +1410 0 obj << +/D [1407 0 R /XYZ 56.6929 644.5195 null] >> endobj 202 0 obj << -/D [1408 0 R /XYZ 56.6929 514.5361 null] +/D [1407 0 R /XYZ 56.6929 514.5361 null] >> endobj -1412 0 obj << -/D [1408 0 R /XYZ 56.6929 481.3387 null] +1411 0 obj << +/D [1407 0 R /XYZ 56.6929 481.3387 null] >> endobj 206 0 obj << -/D [1408 0 R /XYZ 56.6929 279.5586 null] +/D [1407 0 R /XYZ 56.6929 279.5586 null] >> endobj -1413 0 obj << -/D [1408 0 R /XYZ 56.6929 251.1623 null] +1412 0 obj << +/D [1407 0 R /XYZ 56.6929 251.1623 null] >> endobj -1407 0 obj << +1406 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F41 1208 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1416 0 obj << +1415 0 obj << /Length 3255 /Filter /FlateDecode >> @@ -5467,33 +5458,33 @@ dlV ¢èêuÏ$º¾Zrôô“‹‘ÛÚ–GÁbB„½žþ0séÄaeø¨(üTŽ=þ(W>€²Úí”hKæ½ý·VvU_º… /Ú21NÅÝP¶fèi²‘æÅ¶‹U O~šœXŠ0;탆þ[Œ˜É±•%…ŠŽÁ8zjÛtÿ¯=&JEÊ“¨ò…ÂFXŠiºH#M¬?Ú '›ÑÄ­-ºí7üdžض³ôÌvÆ;‚á{¨©<- >Ÿ⪩†*¯öÂ8¥ž<>{÷ñ‡è±û×ßTs½þúO×ß²ûîû§vírHû››õ7zUß.¿Êïïžû‘Žþ÷gæO?Ò· ÿï¿ÿUBÐYÎÿ{Hc54©# ™êSÊý‘ÎIÿݳÊZendstream endobj -1415 0 obj << +1414 0 obj << /Type /Page -/Contents 1416 0 R -/Resources 1414 0 R +/Contents 1415 0 R +/Resources 1413 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1383 0 R +/Parent 1382 0 R >> endobj -1417 0 obj << -/D [1415 0 R /XYZ 85.0394 794.5015 null] +1416 0 obj << +/D [1414 0 R /XYZ 85.0394 794.5015 null] >> endobj 210 0 obj << -/D [1415 0 R /XYZ 85.0394 671.4386 null] +/D [1414 0 R /XYZ 85.0394 671.4386 null] >> endobj -1418 0 obj << -/D [1415 0 R /XYZ 85.0394 641.1061 null] +1417 0 obj << +/D [1414 0 R /XYZ 85.0394 641.1061 null] >> endobj 214 0 obj << -/D [1415 0 R /XYZ 85.0394 444.8166 null] +/D [1414 0 R /XYZ 85.0394 444.8166 null] >> endobj -1419 0 obj << -/D [1415 0 R /XYZ 85.0394 417.1342 null] +1418 0 obj << +/D [1414 0 R /XYZ 85.0394 417.1342 null] >> endobj -1414 0 obj << +1413 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1422 0 obj << +1421 0 obj << /Length 1913 /Filter /FlateDecode >> @@ -5505,22 +5496,22 @@ xÚ­W[ 8îcbE裋ё•G” iÇ!€D.÷upsõÎ)1„§#.e¤#0l)ð;ÇÆ –uú•›_Cu T„b ¹3¥mj€“$œ3½¬ï®~Á}ƒmïPI‰¨C¥ŸžŠk¯šïNñèe §ÊEíC‘†FÌG§Ám>©!A*GëÛ¯X>ym²sûw›ªn¤À¿Y9ÕŸìþ1ßq*”óÙ$'YñCSRA¤|Ë+Úƒ1GÊí0ßß[ôFà@ùä¯Î]ÓGί_@ÄQtÊ·^à<NTà=àts…ÿ¹ç;ѱog…Ñ㬨t¾}Œz½ç;?^iguzZJŸ‹ã…N¹…unv÷W=Ó ã¢Ç(ø¨ÞŸ~ú~=íxXQqèiê1œH•<@ÝîäÏ7òÐÿ¤—/dendstream endobj -1421 0 obj << -/Type /Page -/Contents 1422 0 R -/Resources 1420 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1424 0 R ->> endobj -1423 0 obj << -/D [1421 0 R /XYZ 56.6929 794.5015 null] ->> endobj 1420 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F62 1352 0 R >> -/XObject << /Im2 1341 0 R >> +/Type /Page +/Contents 1421 0 R +/Resources 1419 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1423 0 R +>> endobj +1422 0 obj << +/D [1420 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1419 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F62 1351 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1427 0 obj << +1426 0 obj << /Length 2465 /Filter /FlateDecode >> @@ -5538,40 +5529,40 @@ BB'T cT‘öí/.v“;8¢[#‰'¤Ñum:ùÄ_4SÞ5ö¦É¸|~ààu“®˜;¹Þ­/½jª¾*˜Mǽ!-¢¡ÔÝ_¶4éÐÐD¶?u[Òág &‚©~þïfirÜØ Y-ÜdÅ*òkHè´æSÙd2(þFq×t,ì„›ýƒHú¾&@¿O=€‚yð×…‰ŸÂÁŸý#Æx«•d–EÓ¿OÈ0…á´X(Ô%R—’¿v|,úŸ=º«endstream endobj -1426 0 obj << +1425 0 obj << /Type /Page -/Contents 1427 0 R -/Resources 1425 0 R +/Contents 1426 0 R +/Resources 1424 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1424 0 R +/Parent 1423 0 R >> endobj -1428 0 obj << -/D [1426 0 R /XYZ 85.0394 794.5015 null] +1427 0 obj << +/D [1425 0 R /XYZ 85.0394 794.5015 null] >> endobj 218 0 obj << -/D [1426 0 R /XYZ 85.0394 486.5796 null] +/D [1425 0 R /XYZ 85.0394 486.5796 null] >> endobj -1432 0 obj << -/D [1426 0 R /XYZ 85.0394 454.3582 null] +1431 0 obj << +/D [1425 0 R /XYZ 85.0394 454.3582 null] >> endobj 222 0 obj << -/D [1426 0 R /XYZ 85.0394 412.0822 null] +/D [1425 0 R /XYZ 85.0394 412.0822 null] >> endobj -1433 0 obj << -/D [1426 0 R /XYZ 85.0394 381.7503 null] +1432 0 obj << +/D [1425 0 R /XYZ 85.0394 381.7503 null] >> endobj 226 0 obj << -/D [1426 0 R /XYZ 85.0394 150.1125 null] +/D [1425 0 R /XYZ 85.0394 150.1125 null] >> endobj -1434 0 obj << -/D [1426 0 R /XYZ 85.0394 122.4306 null] +1433 0 obj << +/D [1425 0 R /XYZ 85.0394 122.4306 null] >> endobj -1425 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F65 1431 0 R /F21 930 0 R /F41 1208 0 R >> -/XObject << /Im2 1341 0 R >> +1424 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F62 1351 0 R /F65 1430 0 R /F21 930 0 R /F41 1208 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1437 0 obj << +1436 0 obj << /Length 3008 /Filter /FlateDecode >> @@ -5594,48 +5585,48 @@ cι ›>RÛØ-N ƒÆAzKè‘ê«d״̆wI¾¶CÇj†"@ßõúz/(\Ä!ðþâ„w æáp`Û 1ž`>)˜“» ÇAéæñOl (‹GŠJ%ÁÃ0g#ºS.@ÐèÛ@Ëym>x跰˧¸é‘÷~‘Í6¶s›¯B]æÂv› ^Ìþ]=𠨲mzƒœ‡î\¼Ó$¥ù_°Ùb?²p{ĵ›T P'; ͱÀ˜·¸ÅÝè(7Dú·ÍŠJjjf™UI½µÊ†RÜDë~5šÁõ¹lR9ÂÈVJ…+{µHëÒÌ]Àár‹O š+·¡‚"~b. v»¤^7™€ˆšÝ¤³ƒ+ûÁ”[½T®6ŸÚH–ž^«»éõwTŒR 8‡Êâ1E÷ëò´°¤–>š«=Aó ¯àtÅ*Ä1ü)DOµé7{ýð/.6t{BJÞ_¶Bô D,S(v8w?ÍØeý¿GËendstream endobj -1436 0 obj << +1435 0 obj << /Type /Page -/Contents 1437 0 R -/Resources 1435 0 R +/Contents 1436 0 R +/Resources 1434 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1424 0 R -/Annots [ 1443 0 R 1444 0 R ] +/Parent 1423 0 R +/Annots [ 1442 0 R 1443 0 R ] >> endobj -1443 0 obj << +1442 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [411.5778 307.0154 489.9929 319.075] /Subtype /Link /A << /S /GoTo /D (man.dnssec-keygen) >> >> endobj -1444 0 obj << +1443 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 295.0602 134.1116 307.1199] /Subtype /Link /A << /S /GoTo /D (man.dnssec-settime) >> >> endobj -1438 0 obj << -/D [1436 0 R /XYZ 56.6929 794.5015 null] +1437 0 obj << +/D [1435 0 R /XYZ 56.6929 794.5015 null] >> endobj 230 0 obj << -/D [1436 0 R /XYZ 56.6929 439.2963 null] +/D [1435 0 R /XYZ 56.6929 439.2963 null] >> endobj -1439 0 obj << -/D [1436 0 R /XYZ 56.6929 409.315 null] +1438 0 obj << +/D [1435 0 R /XYZ 56.6929 409.315 null] >> endobj 234 0 obj << -/D [1436 0 R /XYZ 56.6929 215.0565 null] +/D [1435 0 R /XYZ 56.6929 215.0565 null] >> endobj -1445 0 obj << -/D [1436 0 R /XYZ 56.6929 187.7252 null] +1444 0 obj << +/D [1435 0 R /XYZ 56.6929 187.7252 null] >> endobj -1435 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F11 1442 0 R >> +1434 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F11 1441 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1450 0 obj << +1449 0 obj << /Length 2621 /Filter /FlateDecode >> @@ -5652,45 +5643,45 @@ $ ƒ*k+\~:("õ©¤žž›8½lu…›ÜîžÙ¦¶·ƒsŒ¸M«®sDekF3 ÚÄs°–0X›>ÜÃd5Xð`nªkJEæ¾ áèLS6 òÕ΀ ˜Ã§€†U‹eÍ܉p€¶„=¼;çÌnÎ>vÀTÏ]*’ÊÌB»3X|K ~"€;²®­#é'Aö‚m±×#c)•Zv¼F#ÐŒà>»!µÇ‘:øDÄá9PçÀÂ!’~h}Ä+PVþì¡x™1Ч¾ÉXÐR•6× Ðmšù2Ž%KÚÃ/É#K† D¾°ëÅÈÞBa¡úö!“ DQïr¹ JÈ¢OD‚|pä.1is™Ì8jeÖ»`r1[Q™LøA%¸ñÁ^RPµgì³—©¤·ËêTuKz¡Ð÷E}jŒŽJAÒ£ô+j˜³ =ÊêÒ¤¦P]–ÆSX&Uì@Â`”ÄÚ¢!¹hHos"»°\»–Uòó©X}²Jå£OS@éá÷ŒŸëÍ&ã‘{Vˆ³‘±Ã̆Pe¾b¹ýX4­£º™õPx‰Îþ…c©ÌÝ=ÕXf¤ˆ™÷IiAÑÌÚHáA¨V\“ *›ðÂBñ‚ÊÈãÌaÖFÚ†¢kO‚ø±)¥dÊvÒ¡¡N´UàŸ®1²=¾\ð5 žñ|j®ŽÅ±» œÃ Ýçe±.Zžê¢^óÄÈ ¥ð~z¢µÞä§²Eod±ñiÿâÍÛ– ¾ÍTÔ*Á‚ò§†¥P1»¨ìŠÕŽ~ûÅÜ|£û—‚ÆùzíìÛc<m2Hóëe4re4å2Ê/‡p~Î^»w ü$äƒ|ëÐÛ7Þ³Ì:YÕ˜‹+Rž=VmøH‹4Zfv×츻fC™r7Ón{u‡Yül‹4ólK]JˆÐᜌÔຳ±˜å;RŸœ z¶¤Ù'NîÓƒ*~P `w×ÎY$"oÞ™ßÛ¡w¨‹Š‰ôâÄüFõÿn¢N«Ú®8Po$^¿þ6ì¢ÏÚm4œûù; Mø|Òö:ÛÇ~cÿÕ©ÈÇ?ØFþY.¾ÿïÿñºÿ?¨4•î/º~Í1`‡,±J¡e2ÔÜýá÷\õÿ+¡äendstream endobj -1449 0 obj << +1448 0 obj << /Type /Page -/Contents 1450 0 R -/Resources 1448 0 R +/Contents 1449 0 R +/Resources 1447 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1424 0 R +/Parent 1423 0 R >> endobj -1451 0 obj << -/D [1449 0 R /XYZ 85.0394 794.5015 null] +1450 0 obj << +/D [1448 0 R /XYZ 85.0394 794.5015 null] >> endobj 238 0 obj << -/D [1449 0 R /XYZ 85.0394 544.6974 null] +/D [1448 0 R /XYZ 85.0394 544.6974 null] >> endobj -1452 0 obj << -/D [1449 0 R /XYZ 85.0394 516.8643 null] +1451 0 obj << +/D [1448 0 R /XYZ 85.0394 516.8643 null] >> endobj 242 0 obj << -/D [1449 0 R /XYZ 85.0394 467.6389 null] +/D [1448 0 R /XYZ 85.0394 467.6389 null] >> endobj -1453 0 obj << -/D [1449 0 R /XYZ 85.0394 439.6503 null] +1452 0 obj << +/D [1448 0 R /XYZ 85.0394 439.6503 null] >> endobj 246 0 obj << -/D [1449 0 R /XYZ 85.0394 266.4633 null] +/D [1448 0 R /XYZ 85.0394 266.4633 null] >> endobj -1454 0 obj << -/D [1449 0 R /XYZ 85.0394 238.4748 null] +1453 0 obj << +/D [1448 0 R /XYZ 85.0394 238.4748 null] >> endobj 250 0 obj << -/D [1449 0 R /XYZ 85.0394 132.4384 null] +/D [1448 0 R /XYZ 85.0394 132.4384 null] >> endobj -1455 0 obj << -/D [1449 0 R /XYZ 85.0394 107.4147 null] +1454 0 obj << +/D [1448 0 R /XYZ 85.0394 107.4147 null] >> endobj -1448 0 obj << +1447 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1458 0 obj << +1457 0 obj << /Length 2222 /Filter /FlateDecode >> @@ -5704,71 +5695,71 @@ xÚ¥YKs h!jˆQÈØpCkÙÙ®§ Eô·6Õ5öX ŒÁÒ¡â®äùÌ€çÒ aÌ ÌwQ¾ílÓù±$í{ïœ>ØQãÃÌU:®3[W'W¢P?ÒÿP­bHQ‘/'aÀ „'øÅ˜ÖŽ› –½OÌ-û¬ÇO_˜Þw.¯ó ³NõIh‚εñȈ¡5êI¿øÌÝ2}]‡ Ym8ö¡^ ¿®œÇ[ïù×ñ»ÿoøÐ‡Æ±×\F1ócb•BÅe|¡¹ûÚ©úßúQyrendstream endobj -1457 0 obj << +1456 0 obj << /Type /Page -/Contents 1458 0 R -/Resources 1456 0 R +/Contents 1457 0 R +/Resources 1455 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1424 0 R -/Annots [ 1467 0 R ] +/Parent 1423 0 R +/Annots [ 1466 0 R ] >> endobj -1467 0 obj << +1466 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [379.778 61.5153 440.978 73.5749] /Subtype /Link /A << /S /GoTo /D (managed-keys) >> >> endobj -1459 0 obj << -/D [1457 0 R /XYZ 56.6929 794.5015 null] +1458 0 obj << +/D [1456 0 R /XYZ 56.6929 794.5015 null] >> endobj 254 0 obj << -/D [1457 0 R /XYZ 56.6929 769.5949 null] +/D [1456 0 R /XYZ 56.6929 769.5949 null] >> endobj -1460 0 obj << -/D [1457 0 R /XYZ 56.6929 748.2119 null] +1459 0 obj << +/D [1456 0 R /XYZ 56.6929 748.2119 null] >> endobj 258 0 obj << -/D [1457 0 R /XYZ 56.6929 682.7685 null] +/D [1456 0 R /XYZ 56.6929 682.7685 null] >> endobj -1461 0 obj << -/D [1457 0 R /XYZ 56.6929 651.6058 null] +1460 0 obj << +/D [1456 0 R /XYZ 56.6929 651.6058 null] >> endobj 262 0 obj << -/D [1457 0 R /XYZ 56.6929 598.1176 null] +/D [1456 0 R /XYZ 56.6929 598.1176 null] >> endobj -1462 0 obj << -/D [1457 0 R /XYZ 56.6929 566.9549 null] +1461 0 obj << +/D [1456 0 R /XYZ 56.6929 566.9549 null] >> endobj 266 0 obj << -/D [1457 0 R /XYZ 56.6929 448.4378 null] +/D [1456 0 R /XYZ 56.6929 448.4378 null] >> endobj -1463 0 obj << -/D [1457 0 R /XYZ 56.6929 417.2751 null] +1462 0 obj << +/D [1456 0 R /XYZ 56.6929 417.2751 null] >> endobj 270 0 obj << -/D [1457 0 R /XYZ 56.6929 351.8318 null] +/D [1456 0 R /XYZ 56.6929 351.8318 null] >> endobj -1464 0 obj << -/D [1457 0 R /XYZ 56.6929 323.6339 null] +1463 0 obj << +/D [1456 0 R /XYZ 56.6929 323.6339 null] >> endobj 274 0 obj << -/D [1457 0 R /XYZ 56.6929 230.1472 null] +/D [1456 0 R /XYZ 56.6929 230.1472 null] >> endobj -1465 0 obj << -/D [1457 0 R /XYZ 56.6929 190.6255 null] +1464 0 obj << +/D [1456 0 R /XYZ 56.6929 190.6255 null] >> endobj 278 0 obj << -/D [1457 0 R /XYZ 56.6929 125.8181 null] +/D [1456 0 R /XYZ 56.6929 125.8181 null] >> endobj -1466 0 obj << -/D [1457 0 R /XYZ 56.6929 94.6554 null] +1465 0 obj << +/D [1456 0 R /XYZ 56.6929 94.6554 null] >> endobj -1456 0 obj << +1455 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1471 0 obj << +1470 0 obj << /Length 3064 /Filter /FlateDecode >> @@ -5785,33 +5776,33 @@ AÕ‘/=4TE ¹¹»²½ÎFX:N:!ÈG«'[;懪¯7@ä÷ë´ƒûv|!³A~ÒÍHÏR€~-³b¾œ”¨¹(áeSÓ—º9Öòô!9÷Øì¿0ƾÊ}ˆB6¿ÃWÅPr·>Ô¼jýö’1V_„:g“)ö,i3ÀÑ¥2MÑ¢gÏ$¨5Iʲ‚ò™ÊÜÄùf"ÜJׇó|k0w¹TÎõ-Ã`L;K .:u•vòXÁþð/=é“Ð`ÝÒže&DE°þªx(©]ìßËúðm¶ð¸†®Ï®û—¥ÆX’7Çvò 1Á¾çîK¿ŠCÅ?eÏü†íõ?Sÿß¿˜ÿµ ŒÝÀø1|ìä¹êË î'çœ÷?­?gý?û”ƒendstream endobj -1470 0 obj << +1469 0 obj << /Type /Page -/Contents 1471 0 R -/Resources 1469 0 R +/Contents 1470 0 R +/Resources 1468 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1424 0 R +/Parent 1423 0 R >> endobj -1472 0 obj << -/D [1470 0 R /XYZ 85.0394 794.5015 null] +1471 0 obj << +/D [1469 0 R /XYZ 85.0394 794.5015 null] >> endobj 282 0 obj << -/D [1470 0 R /XYZ 85.0394 769.5949 null] +/D [1469 0 R /XYZ 85.0394 769.5949 null] >> endobj -1473 0 obj << -/D [1470 0 R /XYZ 85.0394 750.8067 null] +1472 0 obj << +/D [1469 0 R /XYZ 85.0394 750.8067 null] >> endobj 286 0 obj << -/D [1470 0 R /XYZ 85.0394 180.7476 null] +/D [1469 0 R /XYZ 85.0394 180.7476 null] >> endobj -1474 0 obj << -/D [1470 0 R /XYZ 85.0394 140.0669 null] +1473 0 obj << +/D [1469 0 R /XYZ 85.0394 140.0669 null] >> endobj -1469 0 obj << +1468 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1477 0 obj << +1476 0 obj << /Length 2492 /Filter /FlateDecode >> @@ -5825,28 +5816,28 @@ FYK ö@fdžàõô1C¾Ex¸Áàq7jÕ´úÈC„dªÎ,ÅV™ ·“)¾›ÔpÔê¾¥Á×±;.ôcÇ×~Àr¨ qX7Õ\ßâ=ÊdüîëLê6ÉsùöÌó-}¡€¹ÐPÒ`¤Ok©ÝÑU[¯mx›:ð l೘’´åþ ¶Ê9\ ö»•.B0ÎO9aú¡E¡U;Ð5:Â2h*P-¯lÇ3p¤ÆyUôMá…Öø<ÉJ?Ll¸ÀdzqÜÿ\*aÒ ô[‹áMóç}œ>ÔWßŸîø ™çø6&©~Úã \x÷ya%L">!wIO_U“¾ï¾ä—‰Ž°:*5áŠ÷0]Б†Ú 8[j8Nöìèb8 Ö‰Êùª i.˜Ã3@Éáîôüêk5pÞ>ÿ:°8Bø¡× ó„ÝÃäÛÁ‡U'äƒî0 DM*çÉS´çØQì‘ÿµÓcoðµ¡m×Õ¯¯®‡ƒ §Ù¶…]5›«¶Ú7©ºbÔ‚ I'{ó}úÁ›v¡ªwû­k¤¹Ä÷vÕ+è:^”2K øþmMÀÿ)Ïu]S'}ê@ÓŠ<ótÄQPTθ;øqSó>.jÁ@6¥á> Ï×¾‡Û^ä‰Ófñ¯D³ÊËl¡Û–+¯ê/i+Ä™³}ìOµ^`ãß%÷B§?§ú_™¡àø‘íű;]o ¶Ú~ LX(TÔsžHnþ¾y*úªÃãÝendstream endobj -1476 0 obj << +1475 0 obj << /Type /Page -/Contents 1477 0 R -/Resources 1475 0 R +/Contents 1476 0 R +/Resources 1474 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1480 0 R +/Parent 1479 0 R >> endobj -1478 0 obj << -/D [1476 0 R /XYZ 56.6929 794.5015 null] +1477 0 obj << +/D [1475 0 R /XYZ 56.6929 794.5015 null] >> endobj 290 0 obj << -/D [1476 0 R /XYZ 56.6929 769.5949 null] +/D [1475 0 R /XYZ 56.6929 769.5949 null] >> endobj -1479 0 obj << -/D [1476 0 R /XYZ 56.6929 749.1192 null] +1478 0 obj << +/D [1475 0 R /XYZ 56.6929 749.1192 null] >> endobj -1475 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F62 1352 0 R /F41 1208 0 R >> -/XObject << /Im2 1341 0 R >> +1474 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F62 1351 0 R /F41 1208 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1483 0 obj << +1482 0 obj << /Length 2317 /Filter /FlateDecode >> @@ -5861,34 +5852,34 @@ d ¸¿×úJ«ÚMµ+V„_f„«JK¸&DgW^  ¬~~R¾·QPܪŸªŒ4f©È®W–b5í²Õ/ýÌ€}RS? ðþeý»‚8> endobj -1484 0 obj << -/D [1482 0 R /XYZ 85.0394 794.5015 null] +1483 0 obj << +/D [1481 0 R /XYZ 85.0394 794.5015 null] >> endobj 294 0 obj << -/D [1482 0 R /XYZ 85.0394 629.0401 null] +/D [1481 0 R /XYZ 85.0394 629.0401 null] >> endobj -1485 0 obj << -/D [1482 0 R /XYZ 85.0394 603.8306 null] +1484 0 obj << +/D [1481 0 R /XYZ 85.0394 603.8306 null] >> endobj 298 0 obj << -/D [1482 0 R /XYZ 85.0394 304.8197 null] +/D [1481 0 R /XYZ 85.0394 304.8197 null] >> endobj -1486 0 obj << -/D [1482 0 R /XYZ 85.0394 279.6102 null] +1485 0 obj << +/D [1481 0 R /XYZ 85.0394 279.6102 null] >> endobj -1481 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F21 930 0 R /F41 1208 0 R >> -/XObject << /Im2 1341 0 R >> +1480 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F62 1351 0 R /F21 930 0 R /F41 1208 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1489 0 obj << +1488 0 obj << /Length 1904 /Filter /FlateDecode >> @@ -5905,45 +5896,45 @@ vɣќ :Ö¬z9zŠy*ˆŽž º„ìá÷‚%X$xpfæWÞ#~,NŸRgyÀ"¼¬ÄÔM^™3c‚´×úšS×Åo8 «X±ŠÞE¿ÍZ&$,áE\&ÉÚ¬#)ÞØQÐiS¦i†öø£Af„Z ýæöû ‘sÁ:M'ÇìØ]#ös²Ã=<0Îã bÅÊÎ&û±s"Š"vªì‰ž] ÒʽðäÙ&sàÐKrsëCÏ.”R ÔQL`Mø, ý.òI¨AP#¯Ñ„ž¬mÔ›»´$>½Ãøð\GšRCtÂ%HޱÿfêÁ‹?Šäð+ß1„@](1N¡ÿJžyn3> endobj -1490 0 obj << -/D [1488 0 R /XYZ 56.6929 794.5015 null] +1489 0 obj << +/D [1487 0 R /XYZ 56.6929 794.5015 null] >> endobj 302 0 obj << -/D [1488 0 R /XYZ 56.6929 596.0056 null] +/D [1487 0 R /XYZ 56.6929 596.0056 null] >> endobj -1491 0 obj << -/D [1488 0 R /XYZ 56.6929 566.6651 null] +1490 0 obj << +/D [1487 0 R /XYZ 56.6929 566.6651 null] >> endobj 306 0 obj << -/D [1488 0 R /XYZ 56.6929 532.1171 null] +/D [1487 0 R /XYZ 56.6929 532.1171 null] >> endobj -1492 0 obj << -/D [1488 0 R /XYZ 56.6929 506.5445 null] +1491 0 obj << +/D [1487 0 R /XYZ 56.6929 506.5445 null] >> endobj 310 0 obj << -/D [1488 0 R /XYZ 56.6929 353.6477 null] +/D [1487 0 R /XYZ 56.6929 353.6477 null] >> endobj -1493 0 obj << -/D [1488 0 R /XYZ 56.6929 325.2657 null] +1492 0 obj << +/D [1487 0 R /XYZ 56.6929 325.2657 null] >> endobj 314 0 obj << -/D [1488 0 R /XYZ 56.6929 132.6175 null] +/D [1487 0 R /XYZ 56.6929 132.6175 null] >> endobj -1494 0 obj << -/D [1488 0 R /XYZ 56.6929 107.4872 null] +1493 0 obj << +/D [1487 0 R /XYZ 56.6929 107.4872 null] >> endobj -1487 0 obj << +1486 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1497 0 obj << +1496 0 obj << /Length 2294 /Filter /FlateDecode >> @@ -5956,27 +5947,27 @@ I }s´B[x`}w¥¾hÑN©š—@ßý÷­Ä'þœ+¨ÛKSVµ[?«N[ÂÐârx]Po]þÍ!SaXƒ"À\®òGT˜Äñ@ƒõ‘ Ô‡á)‹g¹8B‘«9FŒ]8zÈ5ë}Yä¼E‰¥ya¶§–·=îýš ¯Z[ý¦IõmiÕ0{¹žùŒh‚{d³°C D–6)æ“í—$à¶Vc‡o›ýíøS’0_‚D´³ïáÒZëÚhÕgÔ¾ðFÅÍ龦 ¾EÇ è0–‹Ö'Ç'½=kkCÏÍ!áÊ=±t#5é°ˆ ¼4ÒLªQ[A=ˆßÑ–@†^Df&Vdº~c6Õšˆ§¼¾G*¡ˆ×>Šz)5L•Ž]ãr\‘—Äà <Äü®‚ª˜KxÐÊÃíÂAÜj­q %…Žþ®|HZÇoA»ïxg*[›+@bÝ6­5ÜEA jÕ0ÐdùçÎ-Ñ/r¢F ½.4“kÈ B?bÌ ¯¹ùW#ŸxÕ"ošv//D¤a&±eˆÇ¼É‡ž¥mš¬ï´÷¯.O5ën¯³ï—â™å’碚=¨ù•Ê¥}½^ˆ½_ ö>jIí³êŸjóGU´ƒöëÖªÒM÷šš›ªÞ|dÛF¸ 8àŠîa¡*SvhUÚYŽ:v“ª}©·_Öv1§ßú;@~Ãïùxï¶_óþï¿ ¶ÿ©ø‘#ãXôñ”nèÄ"‰ŒRèV)÷5oÿS8Tý/Þn­™endstream endobj -1496 0 obj << +1495 0 obj << /Type /Page -/Contents 1497 0 R -/Resources 1495 0 R +/Contents 1496 0 R +/Resources 1494 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1480 0 R +/Parent 1479 0 R >> endobj -1498 0 obj << -/D [1496 0 R /XYZ 85.0394 794.5015 null] +1497 0 obj << +/D [1495 0 R /XYZ 85.0394 794.5015 null] >> endobj 318 0 obj << -/D [1496 0 R /XYZ 85.0394 704.2027 null] +/D [1495 0 R /XYZ 85.0394 704.2027 null] >> endobj -1499 0 obj << -/D [1496 0 R /XYZ 85.0394 675.9152 null] +1498 0 obj << +/D [1495 0 R /XYZ 85.0394 675.9152 null] >> endobj -1495 0 obj << +1494 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1503 0 obj << +1502 0 obj << /Length 2284 /Filter /FlateDecode >> @@ -5992,33 +5983,33 @@ xÚ¥ko ¦ã(N˼ôC"‚Ü9‡Ý(£º,š7(ˆ O§¬e³™4"’E=y5iŽ놕+Hÿù­ÿE…¢ëay½Ì}o›„»7£²ºx>jûXæfØÓµ½4h¹oŸNÆ^ÒOàó÷È»·Õö ÿ÷+{÷ï¸"NÚãY.ܘ°RèfǽмyŽ¿Tý?,{Cendstream endobj -1502 0 obj << +1501 0 obj << /Type /Page -/Contents 1503 0 R -/Resources 1501 0 R +/Contents 1502 0 R +/Resources 1500 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1480 0 R +/Parent 1479 0 R >> endobj -1504 0 obj << -/D [1502 0 R /XYZ 56.6929 794.5015 null] +1503 0 obj << +/D [1501 0 R /XYZ 56.6929 794.5015 null] >> endobj 322 0 obj << -/D [1502 0 R /XYZ 56.6929 519.9229 null] +/D [1501 0 R /XYZ 56.6929 519.9229 null] >> endobj -1505 0 obj << -/D [1502 0 R /XYZ 56.6929 488.8874 null] +1504 0 obj << +/D [1501 0 R /XYZ 56.6929 488.8874 null] >> endobj 326 0 obj << -/D [1502 0 R /XYZ 56.6929 326.6298 null] +/D [1501 0 R /XYZ 56.6929 326.6298 null] >> endobj -1506 0 obj << -/D [1502 0 R /XYZ 56.6929 298.4037 null] +1505 0 obj << +/D [1501 0 R /XYZ 56.6929 298.4037 null] >> endobj -1501 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F11 1442 0 R >> +1500 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F11 1441 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1509 0 obj << +1508 0 obj << /Length 2429 /Filter /FlateDecode >> @@ -6034,15 +6025,15 @@ A øÌI5Á_­ +®á½"c}ˆ1¯Þyç¾×PR‹DÔÞlÄ`!„B,:ÆNgH ~Ò]„£ý™ýÛ¢ñÕ®–€TÑ‘‡dë¡äØb«ª(ª}ï‹}Õ~#‚Íê _ÆTèrÍ bÔqeqüòÁÜèc‡Þ@ã/1ÊÙ>aÎps$ƒüÚ­#oבɄ, U÷Üa#âð]°öË8ÊÙñoÌX­p=ÉŽ\y‚ñ×~!ý…ÖÀ"öìP÷vqç)|F8áðbCg8ÎŽÀÞ©í^/ü§pÿu0R¢ð9¾û¿‡Ž:b*Žå 7,–IÔ)å^á©æ¡ŠYËhDõÿî" endstream endobj -1508 0 obj << +1507 0 obj << /Type /Page -/Contents 1509 0 R -/Resources 1507 0 R +/Contents 1508 0 R +/Resources 1506 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1480 0 R -/Annots [ 1512 0 R ] +/Parent 1479 0 R +/Annots [ 1511 0 R ] >> endobj -1500 0 obj << +1499 0 obj << /Type /XObject /Subtype /Form /FormType 1 @@ -6062,60 +6053,60 @@ x 6\>RgÈbÏWÖ¹j[†› WŒÏ¢®{6;»²þFÃÇñ÷ø]š¨)Õ/Ô¬Mu;pk;Ì©Ëdh<åE–ñ¬AÏw³ð¬±±Nê¦ó¡Ä½t•‹ùD„™Â²]°Ä(‡;„ ·åްЭr²ÂÙÄLûˆ T¥Í¡èª‹ŠŽt’¹w_ =Î]ˆ‹=¦uSä÷—ä"ï±yl±‡µÃ-ËkHsŠöreOÚ³êvg›<7ºt,‡Ýe—;ãÒèЭ/I…B÷&ê(ýê³ö󻉨YÙ¹Ç,çkRÔšÚ'^ m" ^˜h±ÎW9AVªy­Â©/fýÆ"•œãûFy-Sng \Çdª¼˜©Æ¥†Í}B©•µŒÎ$âw1.¶&Øíþ²C¶O–ÃVç X×9g¹E{îÇ< •ãóP)!ÍZÜÅŸLÞª~ÑÔ'¯UâXLµüc“ÅXsЖõÚ¯½˜Ó’~òBL–§èªÆ¹O¦ºNZ_[Èü.øšŠû*]3QôçÇñ!Ö-žendstream endobj -1512 0 obj << +1511 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [377.8384 431.1147 436.8266 441.8991] /Subtype /Link /A << /S /GoTo /D (ipv6addresses) >> >> endobj -1510 0 obj << -/D [1508 0 R /XYZ 85.0394 794.5015 null] +1509 0 obj << +/D [1507 0 R /XYZ 85.0394 794.5015 null] >> endobj 330 0 obj << -/D [1508 0 R /XYZ 85.0394 640.7425 null] +/D [1507 0 R /XYZ 85.0394 640.7425 null] >> endobj -1511 0 obj << -/D [1508 0 R /XYZ 85.0394 609.2714 null] +1510 0 obj << +/D [1507 0 R /XYZ 85.0394 609.2714 null] >> endobj 334 0 obj << -/D [1508 0 R /XYZ 85.0394 416.9256 null] +/D [1507 0 R /XYZ 85.0394 416.9256 null] >> endobj -1513 0 obj << -/D [1508 0 R /XYZ 85.0394 388.3459 null] +1512 0 obj << +/D [1507 0 R /XYZ 85.0394 388.3459 null] >> endobj 338 0 obj << -/D [1508 0 R /XYZ 85.0394 261.2322 null] +/D [1507 0 R /XYZ 85.0394 261.2322 null] >> endobj -1514 0 obj << -/D [1508 0 R /XYZ 85.0394 232.6525 null] +1513 0 obj << +/D [1507 0 R /XYZ 85.0394 232.6525 null] >> endobj -1507 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F21 930 0 R /F39 1151 0 R /F41 1208 0 R >> -/XObject << /Im3 1500 0 R >> +1506 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F62 1351 0 R /F21 930 0 R /F39 1151 0 R /F41 1208 0 R >> +/XObject << /Im3 1499 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1518 0 obj << +1517 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1517 0 obj << -/Type /Page -/Contents 1518 0 R -/Resources 1516 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1520 0 R ->> endobj -1519 0 obj << -/D [1517 0 R /XYZ 56.6929 794.5015 null] ->> endobj 1516 0 obj << +/Type /Page +/Contents 1517 0 R +/Resources 1515 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1519 0 R +>> endobj +1518 0 obj << +/D [1516 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1515 0 obj << /ProcSet [ /PDF ] >> endobj -1523 0 obj << +1522 0 obj << /Length 1913 /Filter /FlateDecode >> @@ -6127,59 +6118,59 @@ xÚXQ ¯“Ä `ÄЖœè• Hg‘…žEÎJŸ°ÕËûk޽.{²úöúâ-Tšz§mØÀ"'©3V‡+úJZ•ø?Õ“²Û¦t¾¦¿  ,çóýÃì(êTÊ¢ºîUÞýò4KŒ_E‘â÷Ƶ¯Qd{‘¡O‹“‘änGE¸˜·«Í.ß.÷`®lendstream endobj -1522 0 obj << +1521 0 obj << /Type /Page -/Contents 1523 0 R -/Resources 1521 0 R +/Contents 1522 0 R +/Resources 1520 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1520 0 R +/Parent 1519 0 R >> endobj -1524 0 obj << -/D [1522 0 R /XYZ 85.0394 794.5015 null] +1523 0 obj << +/D [1521 0 R /XYZ 85.0394 794.5015 null] >> endobj 342 0 obj << -/D [1522 0 R /XYZ 85.0394 769.5949 null] +/D [1521 0 R /XYZ 85.0394 769.5949 null] >> endobj -1525 0 obj << -/D [1522 0 R /XYZ 85.0394 576.7004 null] +1524 0 obj << +/D [1521 0 R /XYZ 85.0394 576.7004 null] >> endobj 346 0 obj << -/D [1522 0 R /XYZ 85.0394 576.7004 null] +/D [1521 0 R /XYZ 85.0394 576.7004 null] >> endobj -1526 0 obj << -/D [1522 0 R /XYZ 85.0394 544.8207 null] +1525 0 obj << +/D [1521 0 R /XYZ 85.0394 544.8207 null] >> endobj 350 0 obj << -/D [1522 0 R /XYZ 85.0394 403.9445 null] +/D [1521 0 R /XYZ 85.0394 403.9445 null] >> endobj -1527 0 obj << -/D [1522 0 R /XYZ 85.0394 368.2811 null] +1526 0 obj << +/D [1521 0 R /XYZ 85.0394 368.2811 null] >> endobj -1521 0 obj << +1520 0 obj << /Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1530 0 obj << +1529 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1529 0 obj << -/Type /Page -/Contents 1530 0 R -/Resources 1528 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1520 0 R ->> endobj -1531 0 obj << -/D [1529 0 R /XYZ 56.6929 794.5015 null] ->> endobj 1528 0 obj << +/Type /Page +/Contents 1529 0 R +/Resources 1527 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1519 0 R +>> endobj +1530 0 obj << +/D [1528 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1527 0 obj << /ProcSet [ /PDF ] >> endobj -1534 0 obj << +1533 0 obj << /Length 3198 /Filter /FlateDecode >> @@ -6192,47 +6183,47 @@ q@ ÖgM± q^Pב"Ü*ïJ¬}9ÊôÅ9u•½Ma®¨«„¬ÖbP„sÉ dKFè±2dw£CF:ñPïBFã!¤C‘Ÿ·(9˜p@Ê@èë‹òˆq6F™‰xT¨âTD_ZÈœW¡¸8öõëýGzË®E¸­çâM7hC-ñõ–ŸË'Hçé”í¥ë«õñ½²tãȧŠî¢¹éßÚçlÕ7º@§P˜5^ñƒÊœïÒácÝQÛ´Ôv}Ù,èêÜ‚FÖ 1$CÎ©Þ pÁ×Q˜¯;,rÄŒH€! ²r:ßm‰¢xÌ{Xuìú Ü>–‰úñdÁ®êæS„…y²K1¬^¼/7ÜBó šÝ7çªRÃÑ£t»5Uê *3ëÛk=_>TýsU5Y–ÙaJ’Lè µañ@yÞ‡Òχ˜Ž—ÞÞDÆö³U;/WÅ(+8õy2xk\òy•ãàï²;­ ò€`T/U2uUØ$V*û¾œ/CŽíà~…2žØZfŒJ[}MÅsÀÓéL¼ºVFJ"þnñ?¬_¤ ëóÉ!ƒI®|”ßò3ÜÌpfïø ø¸Ú>•3Áy«à…hd݆ƒ ¬N‚vô0^*|-UEÅÊ,Mu¸½½z._â}4ŠwÏöB]±ª)ÓuƦ.°µÔ>¤‹hã(p>e¯L\þÈ홢€ B_ÛqŠ%!Μah˜À^%„³Æ yÒX<Ÿ“w6 ‚~1œú¼Ë¥ïÂâÍðb8õЧ©»Âss3F„—…ÀÄ4^9üFv€²‡;‡µp&³UZ1ɵ¼›ÂËl*máó/ã2Ö ×Jô‘z¿rK &¥uhL«ü_fé¿x~UÈŸòsÈÚ%èYB”?a!ýŸa*M÷QO¢endstream endobj -1533 0 obj << +1532 0 obj << /Type /Page -/Contents 1534 0 R -/Resources 1532 0 R +/Contents 1533 0 R +/Resources 1531 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1520 0 R -/Annots [ 1540 0 R ] +/Parent 1519 0 R +/Annots [ 1539 0 R ] >> endobj -1540 0 obj << +1539 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [356.2946 363.7923 412.5133 376.6291] /Subtype /Link /A << /S /GoTo /D (address_match_lists) >> >> endobj -1535 0 obj << -/D [1533 0 R /XYZ 85.0394 794.5015 null] +1534 0 obj << +/D [1532 0 R /XYZ 85.0394 794.5015 null] >> endobj 354 0 obj << -/D [1533 0 R /XYZ 85.0394 769.5949 null] +/D [1532 0 R /XYZ 85.0394 769.5949 null] >> endobj -1536 0 obj << -/D [1533 0 R /XYZ 85.0394 576.7004 null] +1535 0 obj << +/D [1532 0 R /XYZ 85.0394 576.7004 null] >> endobj 358 0 obj << -/D [1533 0 R /XYZ 85.0394 479.565 null] +/D [1532 0 R /XYZ 85.0394 479.565 null] +>> endobj +1536 0 obj << +/D [1532 0 R /XYZ 85.0394 441.8891 null] >> endobj 1537 0 obj << -/D [1533 0 R /XYZ 85.0394 441.8891 null] +/D [1532 0 R /XYZ 85.0394 424.9629 null] >> endobj 1538 0 obj << -/D [1533 0 R /XYZ 85.0394 424.9629 null] +/D [1532 0 R /XYZ 85.0394 413.0077 null] >> endobj -1539 0 obj << -/D [1533 0 R /XYZ 85.0394 413.0077 null] ->> endobj -1532 0 obj << +1531 0 obj << /Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1544 0 obj << +1543 0 obj << /Length 4062 /Filter /FlateDecode >> @@ -6266,33 +6257,33 @@ s ÓæÉQά8¼¦®oãy!!˜Ljváн+ô>9Å—æ ›¬sì§¼h "”IŒ)%F*7îؚ͜¦þoIDgûendstream endobj -1543 0 obj << +1542 0 obj << /Type /Page -/Contents 1544 0 R -/Resources 1542 0 R +/Contents 1543 0 R +/Resources 1541 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1520 0 R +/Parent 1519 0 R >> endobj -1545 0 obj << -/D [1543 0 R /XYZ 56.6929 794.5015 null] +1544 0 obj << +/D [1542 0 R /XYZ 56.6929 794.5015 null] >> endobj 362 0 obj << -/D [1543 0 R /XYZ 56.6929 165.9801 null] +/D [1542 0 R /XYZ 56.6929 165.9801 null] >> endobj -1541 0 obj << -/D [1543 0 R /XYZ 56.6929 136.242 null] +1540 0 obj << +/D [1542 0 R /XYZ 56.6929 136.242 null] >> endobj 366 0 obj << -/D [1543 0 R /XYZ 56.6929 136.242 null] +/D [1542 0 R /XYZ 56.6929 136.242 null] >> endobj -1546 0 obj << -/D [1543 0 R /XYZ 56.6929 106.2766 null] +1545 0 obj << +/D [1542 0 R /XYZ 56.6929 106.2766 null] >> endobj -1542 0 obj << +1541 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1549 0 obj << +1548 0 obj << /Length 3065 /Filter /FlateDecode >> @@ -6308,39 +6299,39 @@ xÚ¥Z ¬_²Õº°n–Ô§X;‘LjÉRÓaXΓçB}ƒY™š~E•qùÍX|ë$Œ¤Ï\tc©ÕƒZN‰11+,¥wØÿñ6à˜%„ Èy/5+îª ±¢¦ \tÁ y\üƒQEUÝoÖD¤€{z¹ÀÊÅ¡ `dêB ÃD7þÒŒg!=¾¨Ë=ÔC‰§Ç¥—P.ÕÀUZÍï °{Ãjò$8Îgá³bÆètÇÏÓE^6ª>¡Ù¾¦¾Ì„œ¶c<~°Îp¹]þ†_ÎU*ºÐáôEµê“¢øÂõåØWçxðêÄÿLê_©:qÐhH=,…œèÝ7cÏÝ ß ¾QØÌs€Ë=òâÖàJmm³¦÷éûiW€:ô ‰êCmŽ_«"q·©ÃÓobœ‹ø">½>Mñúqn‚‚F:­¡ôŽsWg°¦º!¢‹78 ðÜ÷9d÷gôÕ·]ºW 覷=èv/P>ÂQl­'æ^r) \œùòåË3ŠKU=ú”¸´Eq¾¶u÷”ú„ËÍïe‚€=éýƒqï!C§Pü°Sœ;bH›4†.¦•¤ÿ(|í:‚bƒŽkw_á(B™QAû‚µÎŸ\oà.©¼ ÁÒ¡ÈÁÁÝ9½2ú¹ÿˆ¥L†ÜSçç$÷ëõòå¡=2fø—‘.Qg¡üWšþ‹ yiÌO¾â©©J¡ ÔÞÛî?7ûªÿoã\)endstream endobj -1548 0 obj << +1547 0 obj << /Type /Page -/Contents 1549 0 R -/Resources 1547 0 R +/Contents 1548 0 R +/Resources 1546 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1520 0 R +/Parent 1519 0 R >> endobj -1550 0 obj << -/D [1548 0 R /XYZ 85.0394 794.5015 null] +1549 0 obj << +/D [1547 0 R /XYZ 85.0394 794.5015 null] >> endobj 370 0 obj << -/D [1548 0 R /XYZ 85.0394 730.0812 null] +/D [1547 0 R /XYZ 85.0394 730.0812 null] >> endobj -1551 0 obj << -/D [1548 0 R /XYZ 85.0394 700.9798 null] +1550 0 obj << +/D [1547 0 R /XYZ 85.0394 700.9798 null] >> endobj 374 0 obj << -/D [1548 0 R /XYZ 85.0394 216.5924 null] +/D [1547 0 R /XYZ 85.0394 216.5924 null] >> endobj -1552 0 obj << -/D [1548 0 R /XYZ 85.0394 187.7778 null] +1551 0 obj << +/D [1547 0 R /XYZ 85.0394 187.7778 null] >> endobj 378 0 obj << -/D [1548 0 R /XYZ 85.0394 127.6814 null] +/D [1547 0 R /XYZ 85.0394 127.6814 null] >> endobj -1553 0 obj << -/D [1548 0 R /XYZ 85.0394 101.3894 null] +1552 0 obj << +/D [1547 0 R /XYZ 85.0394 101.3894 null] >> endobj -1547 0 obj << +1546 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1556 0 obj << +1555 0 obj << /Length 2310 /Filter /FlateDecode >> @@ -6352,40 +6343,40 @@ LHE( Œ[†,Šñ6ËËãgÛ¸¸¤þ¥q¤QjÜ%ć*[›š V®~ ¥l¹$4tµùÊÈ ·K°Yìv¥)Hrk‘å9AÇ¦ÑØRñVŽéh×4­Û•ÞvSsè€ãsqÏŽ×ñ%Š(î z9Jwâ‘AQ”<#2òqh›†M5µ«Ÿ‘[^Z›hºVnÇaZXAŽ ËfØù»Õw-ËoúLþ°û-RŽÅ‡Ë£¶Õ2!*”ÕŽ€vmQíÃL1}\‚w^Çî¿P‚ DC!¢§%˜@ôLÛ䇽[êgågáš«ôï£ó¨ùRûân ós.ÔÓ‹c–Šš¿è‡g¹Õlt^ w Ã"nË ¯Àݬ»ü“÷Áê·D¶î„o¶ ‡’7ï²×î²›õhøß¿{éÏ®éBÔâÃÕåã²òøð:Æ`[‰â È*bI”¨±ßßøäYÕé¯}}öÄ ­Dú…˜gñq‚¨!.dU JN÷³ …òHÿ’ Q>endstream endobj -1555 0 obj << +1554 0 obj << /Type /Page -/Contents 1556 0 R -/Resources 1554 0 R +/Contents 1555 0 R +/Resources 1553 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1562 0 R +/Parent 1561 0 R >> endobj -1557 0 obj << -/D [1555 0 R /XYZ 56.6929 794.5015 null] +1556 0 obj << +/D [1554 0 R /XYZ 56.6929 794.5015 null] >> endobj 382 0 obj << -/D [1555 0 R /XYZ 56.6929 730.9277 null] +/D [1554 0 R /XYZ 56.6929 730.9277 null] >> endobj -1558 0 obj << -/D [1555 0 R /XYZ 56.6929 704.9004 null] +1557 0 obj << +/D [1554 0 R /XYZ 56.6929 704.9004 null] >> endobj 386 0 obj << -/D [1555 0 R /XYZ 56.6929 236.9993 null] +/D [1554 0 R /XYZ 56.6929 236.9993 null] +>> endobj +1558 0 obj << +/D [1554 0 R /XYZ 56.6929 205.1553 null] >> endobj 1559 0 obj << -/D [1555 0 R /XYZ 56.6929 205.1553 null] +/D [1554 0 R /XYZ 56.6929 146.386 null] >> endobj 1560 0 obj << -/D [1555 0 R /XYZ 56.6929 146.386 null] +/D [1554 0 R /XYZ 56.6929 134.4308 null] >> endobj -1561 0 obj << -/D [1555 0 R /XYZ 56.6929 134.4308 null] ->> endobj -1554 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F62 1352 0 R >> -/XObject << /Im3 1500 0 R >> +1553 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F62 1351 0 R >> +/XObject << /Im3 1499 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1565 0 obj << +1564 0 obj << /Length 2383 /Filter /FlateDecode >> @@ -6400,45 +6391,45 @@ w αú.ˆß»V øæµJ—Ë4ÂNÝ?/GLÁ¼¤àÀ !ND!ÔûO´mÔÛ·³ÚõÇeÚLCùJøG“©„ÿ㇡ƒ <'‰( $è%ݼ|‚©4Ưø`4`±G'ÝíJµ®„»P~¢ücÓãëÔ²uÏסVÆOý°¼©Š|J=Ò*¶BÖÃieü‚* g†õÉ8è”ÆP± ªdîÆq«9•ÐÊÛÆ†÷-•|Ë-AîV9xÁu r&K)ͤ“nÛ¬ÕmTë–LÁµI&Ã)ñB >>‹7¼Ùn*N"¼‰!¾Ýœ½xSwï.!}C]«¤ _V”õ„'E¥’  ¤l ƒQCaþɤ¤.×uäq)mÌžù>oCxÜ:(µ»@¿ÃpZÝÆ€› Ë]zÏÄò¸ñ´•ž$HPñ3¢@Áu¯ ?àˆ—U¼?œÅõ=#ÑÛiímä¥ÍEÝÓ*vŠ¢ºÏfƒú¾^ÄI·Î"Ô]4Ò«›u^4“¼üþq‚B3k­)Ž)ȓґZûÜt4´ª„DÄCM$`­õžÂD@BÒc¹ŸhÒòaÀk¼bJ˜6 ½EîŒVÄ ³¨êÁ÷”â_˜¯ÅŠ% Œ±v:¨£Oé €· 9x9 ¼ö(­¬ž¦³ž0ÇÒÙ˵Ng@õêÎ,€E<Ó´ÀÓ?CoVÅß[¬_üòY‰r(‘’HÚ„ÜvaH 0‰¼eÖÜW«OÔÁ‚ku›NÃo7qA9T§5mà© ü^î±\O%_[Ÿµ–¼á$·Ï`Ù®Øm9-ãz»†t+¸Ý˜®Ìšúé¦^‡À |žHƒhˆFȨadE_²)ŽuöBòm;~¿È1—â„`¤‘i†¬·Àßw¤P^„ÜØÑ ñ»*@˜ALjš6«ˆXV 5î)|wÉgqEJŸû€¢¡ÑÀ`\7Ë`›e^>ú™@ô\JêÈ4dú߉Rd%0™7‹šúÁ‰‘Ž ftzhm9}@]b|QÒX½ðG’”@˜¦uöÝà“že €É®,ÙmêI7wƒuÅòðº‹ÓÊÍ(û6`ËÂO®@ûg@AÙ> Á^‰Õ©tª/뎈¢9`è¤F{nmï:|ÝÛÜÚçÔ¹Çs»‘ÁK(û>¡ÌÖ@Á/E?.ôŠŸöÿ„rÌaºHÅ(ü~C¿Ý<·°ƒy| ÚpÙÔs- Ürº÷4nXC­ðk+Ñî>ï ÿ ¡ 6k „ÌjE¥Õ_ã1í è§Õq—»jÕt¼7[غã˶§˜ÉùP J E.z—Œëñ„¸{P¢öe°t^¼_GŒ±þ²¡ÿ+’]ÓSÙc_ᣃØë©ÿs²ù‡ÐrnÇÛJçœQ(<“V_\eðHã¤ý|[moendstream endobj -1564 0 obj << +1563 0 obj << /Type /Page -/Contents 1565 0 R -/Resources 1563 0 R +/Contents 1564 0 R +/Resources 1562 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1562 0 R +/Parent 1561 0 R >> endobj -1566 0 obj << -/D [1564 0 R /XYZ 85.0394 794.5015 null] +1565 0 obj << +/D [1563 0 R /XYZ 85.0394 794.5015 null] >> endobj 390 0 obj << -/D [1564 0 R /XYZ 85.0394 513.3136 null] +/D [1563 0 R /XYZ 85.0394 513.3136 null] >> endobj -1567 0 obj << -/D [1564 0 R /XYZ 85.0394 488.974 null] +1566 0 obj << +/D [1563 0 R /XYZ 85.0394 488.974 null] >> endobj 394 0 obj << -/D [1564 0 R /XYZ 85.0394 420.2055 null] +/D [1563 0 R /XYZ 85.0394 420.2055 null] +>> endobj +1567 0 obj << +/D [1563 0 R /XYZ 85.0394 390.0916 null] >> endobj 1568 0 obj << -/D [1564 0 R /XYZ 85.0394 390.0916 null] +/D [1563 0 R /XYZ 85.0394 312.7536 null] >> endobj 1569 0 obj << -/D [1564 0 R /XYZ 85.0394 312.7536 null] ->> endobj -1570 0 obj << -/D [1564 0 R /XYZ 85.0394 300.7984 null] +/D [1563 0 R /XYZ 85.0394 300.7984 null] >> endobj 398 0 obj << -/D [1564 0 R /XYZ 85.0394 159.3 null] +/D [1563 0 R /XYZ 85.0394 159.3 null] >> endobj -1571 0 obj << -/D [1564 0 R /XYZ 85.0394 131.3824 null] +1570 0 obj << +/D [1563 0 R /XYZ 85.0394 131.3824 null] >> endobj -1563 0 obj << +1562 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1574 0 obj << +1573 0 obj << /Length 4330 /Filter /FlateDecode >> @@ -6462,48 +6453,48 @@ epc .ѯs 9ѽ1W·.ýU¥Q^^‡«ltsiçÛ×þzÖ`šX°ÏxÀíQºº¢¶ª;Ïòxš!ºÄ¢W‘ƒpÇ€~1\Má™$¿ »à…Kq˜x•Ò/Lå6I“«“4ý­€ûdè»"ÃÞ¿N©+Žåã8èð?aR‹ÌXéÊ™T~oñ?b´ÿ@"›ýªJþCÌw»¤ kþï%A\uWo*´>¯O¦—u†ÿ•HL²Èüÿ£Õ†xB…8‘i5EAƒ Láj”:â<üGÖ1ëÿnI”endstream endobj -1573 0 obj << +1572 0 obj << /Type /Page -/Contents 1574 0 R -/Resources 1572 0 R +/Contents 1573 0 R +/Resources 1571 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1562 0 R -/Annots [ 1576 0 R 1577 0 R ] +/Parent 1561 0 R +/Annots [ 1575 0 R 1576 0 R ] >> endobj -1576 0 obj << +1575 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 387.5149 256.3816 399.5745] /Subtype /Link /A << /S /GoTo /D (rndc) >> >> endobj -1577 0 obj << +1576 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [268.5158 387.5149 332.4306 399.5745] /Subtype /Link /A << /S /GoTo /D (admin_tools) >> >> endobj -1575 0 obj << -/D [1573 0 R /XYZ 56.6929 794.5015 null] +1574 0 obj << +/D [1572 0 R /XYZ 56.6929 794.5015 null] >> endobj 402 0 obj << -/D [1573 0 R /XYZ 56.6929 692.9565 null] +/D [1572 0 R /XYZ 56.6929 692.9565 null] >> endobj -1329 0 obj << -/D [1573 0 R /XYZ 56.6929 660.5438 null] +1328 0 obj << +/D [1572 0 R /XYZ 56.6929 660.5438 null] >> endobj 406 0 obj << -/D [1573 0 R /XYZ 56.6929 112.3379 null] +/D [1572 0 R /XYZ 56.6929 112.3379 null] >> endobj -1578 0 obj << -/D [1573 0 R /XYZ 56.6929 85.6994 null] +1577 0 obj << +/D [1572 0 R /XYZ 56.6929 85.6994 null] >> endobj -1572 0 obj << +1571 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F14 956 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1582 0 obj << +1581 0 obj << /Length 2372 /Filter /FlateDecode >> @@ -6518,67 +6509,67 @@ gRL q„Ìc–!l4+׬‘¢oT¸oFˆ'|7búz EF ˜öÉ],m“¨Ü–ˆTmË`aÁUÔr¢óþùêÈæ.~Áúçƒq\Á ™, c߉WÙaìÛÖ Ø½!OdFÙ1ÔÇLðC 4ѶbD‰®6´"ÈÍG¢Vy,ê3ö.B–`‰ `ΠryoÈêCŠÓ%lK0fz0fQ€f+b%µ„-«Y¼Ù˜: n¡ö7á×}?¸¿•Óvr Ú.æmµï·¸£m¡èÛbm_Jú…ÄœIc‚(Äm f"ÊøÖ¦Xì[CEýôä-úiŒaïhìûaLA½jÛóCa?#Fß0 ¾bÁ6 à÷<í$E¤Ç¼ðèë¤]áî£}8.Ô „„G{ZÇZøül«"/sw—!ôe.õ{úMþo3 Ç w³rùS›]ªÂ_}oz7º]mf6›9¾þèä+нC>ؼ Æ–aín¯¨ÔöžÓ¤) N­Çj{I6UoÝé5ì4Ý”=Ûš‘,yõX¶eæaë y®|§u9BÝÁõçéPÄ¡ÆÇÇ]ƒÇ´Íà«^ÜñÒÉVÕ§ï)÷fJlJ©Í;w8EeÞ¢þ|Ïc¹»Ñ)OdæßùbtYG× !ïäÞRÀ­ãýñ¹ÿ' ­ù|ƒAЊËXuLYÎÃIï·ÿ“sÊú_—0‰Äendstream endobj -1581 0 obj << +1580 0 obj << /Type /Page -/Contents 1582 0 R -/Resources 1580 0 R +/Contents 1581 0 R +/Resources 1579 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1562 0 R -/Annots [ 1587 0 R 1588 0 R 1589 0 R ] +/Parent 1561 0 R +/Annots [ 1586 0 R 1587 0 R 1588 0 R ] >> endobj -1587 0 obj << +1586 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [406.6264 524.1437 456.8481 536.2033] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj -1588 0 obj << +1587 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.5805 512.856 196.7992 524.2481] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1589 0 obj << +1588 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.6195 470.0794 159.8382 482.1391] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1583 0 obj << -/D [1581 0 R /XYZ 85.0394 794.5015 null] +1582 0 obj << +/D [1580 0 R /XYZ 85.0394 794.5015 null] >> endobj 410 0 obj << -/D [1581 0 R /XYZ 85.0394 769.5949 null] +/D [1580 0 R /XYZ 85.0394 769.5949 null] >> endobj -1584 0 obj << -/D [1581 0 R /XYZ 85.0394 749.3189 null] +1583 0 obj << +/D [1580 0 R /XYZ 85.0394 749.3189 null] >> endobj 414 0 obj << -/D [1581 0 R /XYZ 85.0394 679.8163 null] +/D [1580 0 R /XYZ 85.0394 679.8163 null] >> endobj -1585 0 obj << -/D [1581 0 R /XYZ 85.0394 652.1211 null] +1584 0 obj << +/D [1580 0 R /XYZ 85.0394 652.1211 null] >> endobj 418 0 obj << -/D [1581 0 R /XYZ 85.0394 573.4726 null] +/D [1580 0 R /XYZ 85.0394 573.4726 null] >> endobj -1586 0 obj << -/D [1581 0 R /XYZ 85.0394 542.9681 null] +1585 0 obj << +/D [1580 0 R /XYZ 85.0394 542.9681 null] >> endobj 422 0 obj << -/D [1581 0 R /XYZ 85.0394 335.1831 null] +/D [1580 0 R /XYZ 85.0394 335.1831 null] >> endobj -1590 0 obj << -/D [1581 0 R /XYZ 85.0394 307.4879 null] +1589 0 obj << +/D [1580 0 R /XYZ 85.0394 307.4879 null] >> endobj -1580 0 obj << +1579 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1593 0 obj << +1592 0 obj << /Length 3489 /Filter /FlateDecode >> @@ -6603,33 +6594,33 @@ vk^) ü“Ål7·5Ú'}Á¯"´ú‚HcÀÀž¢í¶dÚ¼Œ~?Ú×í°¤jç=U}ô#Í›ª s—QqÏùw2Eš<\{ðõl$a@Z)ĉ+&9¹b’ók$0L’Óë#Ép2 kî²Úc¯0¹¿C8_Pø;v! ¹(Éï3S|µŒ@x"BÉ_– IJ,Ç÷xc$†âÖ•Æ'Ëý н.ô' &O¾ÐjJæù‹ÛÔ.þÔvLå›p÷ûåôÈ|»4N* wվߦÇÕ×üÎ"‘"ü™vn»é‚£j3y.—¦¬wñ  ƒ¸'™xÿÛ”¨c9\"ós…)ùO s¶J'7Wæ 8Qv.ŸÝCÔ¾*ù¨BK%@¤3‹bñÂBV¤É$Bhï·‡Ãú!ÆE&6×ù§¸xаÞG7 <§æ\Qp¯ ä½ízÈCŸËi;<œ²s*Îe²ëÖå.VBKpA›ÊÿŠøßù˜)ù™äQŸ‰þLz™Ï$ñÁo²á¾ê$Ñ6ÜÝ:VÙ"-¥Ux·]ñ¿$bÿÝT&Á?\Fþi™†¯úÿ÷ÿ:Ç?½ê,Qy.Ç¿lÎäÏòDçÀ„…B-´}&¹ÿèsÑÿ’Ý@ endstream endobj -1592 0 obj << +1591 0 obj << /Type /Page -/Contents 1593 0 R -/Resources 1591 0 R +/Contents 1592 0 R +/Resources 1590 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1562 0 R +/Parent 1561 0 R >> endobj -1594 0 obj << -/D [1592 0 R /XYZ 56.6929 794.5015 null] +1593 0 obj << +/D [1591 0 R /XYZ 56.6929 794.5015 null] >> endobj 426 0 obj << -/D [1592 0 R /XYZ 56.6929 769.5949 null] +/D [1591 0 R /XYZ 56.6929 769.5949 null] >> endobj -1595 0 obj << -/D [1592 0 R /XYZ 56.6929 749.2381 null] +1594 0 obj << +/D [1591 0 R /XYZ 56.6929 749.2381 null] >> endobj 430 0 obj << -/D [1592 0 R /XYZ 56.6929 540.3599 null] +/D [1591 0 R /XYZ 56.6929 540.3599 null] >> endobj -1596 0 obj << -/D [1592 0 R /XYZ 56.6929 517.4049 null] +1595 0 obj << +/D [1591 0 R /XYZ 56.6929 517.4049 null] >> endobj -1591 0 obj << +1590 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1599 0 obj << +1598 0 obj << /Length 3318 /Filter /FlateDecode >> @@ -6644,29 +6635,29 @@ S ˆü"Ф{'BEc„LåEiÇ3¢å Y=ˆ&Òñü¹D6u;iÖXûÖŽp5ów/ÖÂÙÁg¸:sNjYR0ß×Iµ|à†ÀË¢9¡\ˆy˜° õB^î|­ÝáØ¡æ•œ¤àå/Pú«—öP,Ë5Wgùh ¡yIýÞ@FÕœRjþö¢Fdôp¸ ïCi"= åò7wÎolƒ8óÇ«6‡]jw]b˜ÁE_­ëú«÷¡2Ô#¸Ž¹À¦yïïd;ÿ÷}Àd`gÈ!²4Sã|;F×î¨12Ó Ÿ¦\æOæ ›†gZ½#£‘¼:S£+÷·¶Üèޝp òÉñÊ9ÂMê3Þ ç!ÃIt¡÷$èºÃ¬éÂØh²9L9>À®R°Á®pæ™TZK)¤L=­Îèå2ZF(e.ï½ÜÖTÖØh ð"ã¹hãõÃ^ð0ÚÕ¬z³ÆŒ†„‘Âp¤ŒA*NÃf¥L"Rc§ªYÂ>›º ]'©P©õaÔñˆ¢DDZ^D?ŽP1¹zóz63€¢:Åk]>ÍõÜ5`Óì=ô[]Ê7¿ð$«£¶3õ«öBŒtój5ÔŒ9XÁ„ä`"-¬êïH/\žƒ±¥j,"¾zÛ—N‹F¦"ÆÄR*=Æ)èy¬¦Ã}¥†•½°Ã1Z<â½oeÉ3õ.à‹0º¿#Ÿ)xeŸýÕ¬qZ&"?O¥‹wl¹`¢|RX¢í¸R~˸™@fÜgŒ±‹:[…Ü–• ©f¾;åç–F¢aÌ‘[ðR—Jo%0Ky5%^”&»+ÐæÝ ¡ j LîÍÍ›„±ÓÌDÐeÏwÅp·“†áé[8o(V‘ðíhmân4… ߢAÕv™$~U3 ¿Lg—š¾tþ›X(ZÄ/³£i´Ñvq[<, ÌJJpTüNÆï r°‰¡‘MQM¾YBÔ“|'ç{Í$çÖÏçm÷#)%fDp‚×dž†üå‹n’¾at9d ‰öètã?A‹ƒÂû‡Â0“Ùk…¡YÖ—tƒÁ:?î:"l ihý¡h‚øAJ.÷AÚ ó÷+x+çà0%´½¼i÷ß±†Oƒ“Äî.áâw*ÅbMG3í©ûBO“ÍfF»Ñ'ý~ýbüÂÓOúO÷E*–þêKº5()ô%I—…‘ÊNHzòÛ‚~Õ+„<Ý*¯€«HJtôBÁÀzüãík¥Â×_sQ Ja ó77â6@ópÛÒÇ×î¿p„ʊѱôÎûVøcéKÔþøÃãî¢Ýµr¿€+ÃàÝʸ¨ÁW/‹ßxVn£Jè ĆWÚÅTnÎí †'‚§·¼¿>;ßr§– §"—²ô‡|®;D#'%ºÄ¥Y5äStd"9w0Àº°'è+^µ~I#=¾‚å®§üit4yçÍbý†O?Lo(ÃÕé@Úû—Ð[Âb€Ho¤ËcӸ߭\”´”v¼j/\z½^ÿºŠ÷5C«êK-©½pÁþÊ>ôC) üuSzàŸOø¿D5üÂ,J…±V‡1  au–z¢³(½¤¼ÿµÕSÒÿ:[)Žendstream endobj -1598 0 obj << +1597 0 obj << /Type /Page -/Contents 1599 0 R -/Resources 1597 0 R +/Contents 1598 0 R +/Resources 1596 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1562 0 R -/Annots [ 1601 0 R ] +/Parent 1561 0 R +/Annots [ 1600 0 R ] >> endobj -1601 0 obj << +1600 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [173.6261 273.4719 242.2981 282.8815] /Subtype /Link /A << /S /GoTo /D (the_category_phrase) >> >> endobj -1600 0 obj << -/D [1598 0 R /XYZ 85.0394 794.5015 null] +1599 0 obj << +/D [1597 0 R /XYZ 85.0394 794.5015 null] >> endobj -1597 0 obj << +1596 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1605 0 obj << +1604 0 obj << /Length 2400 /Filter /FlateDecode >> @@ -6682,33 +6673,33 @@ k ª÷ .k}ü “sgó'í—<œ_÷§^G4ΞÅÄñÛ+‡ôÍð8‚¿yõ5§î!±×õæû ¯ò½šª†ç.;ÁÁ™O ðôÜ=4­³ªŸzºfKeÁ“Þ bœ–£æ<5LzÇD/µHÂ~šÃŒ‡ìB׎çæ)Ïù ±'2ÄŸ[/±< S½] ’À¹AÆ4 rb=Eáé4r5ÈŠAÔ×vü 0Bè§,/²».†ŒºÄpm(,î¶¡åÚ6«:w½*cU›aèÃO{¶Ge0®s«K§N|{U¶Y^Š)w|Wu"Lt[ûìä3 ;Ízm×c?Ú¾@´€Ú6âÁÃOB¤3Ç"ÔÐÚ?ãéê–H‚äì¥ñÿ;åÁ^ju¬õãйhñÒŸ8}òB-eˆ(¢ÇÞŸp†L`>Oeø™!D¢#k®=¤/šQ8è†x‹ºß†>[:÷e¡•w6üÀîj²3ª<Ë‘sà÷}ßçF1]òÀÛW|¬*ñk{¬Ù9ˆãüÔ4am9Õ¾'Eæï¡Š¿Ìlè Ð=š>?Ÿ$Ÿð„ Ú|ÎL JS⣇ˆâyŽ S—^V»%ä{M®œ¿sS†tU`í†ÖüŒ€KÎ[®tЬiœÑ0º3XÕ_NyF?½ŒkN;ÃúcýÞñÀS;ζí•öev87mø5Mk”ˆ“0yÚ´©P,5…xÖfwÓCäØ´ïº’jí)Ä”Œ^ºSûîPGq>„}8m€-m]ÒK.îܦ#8¾hZ‡/M;ªU¥=ó€U¶ê¦}`éq#Ô÷µŒìz>IâQ#'H¤ÑO9‰€Nb]Wù9#¿>ð“ÿ§¬8ÓáÚ–¹ºRß•Ó?޶i›Ç•:`÷Ë4@IÅÆ•Geôäî‚Ùg5þÜÿöÿD£zZÊÄ€Æp…´P‘‘yð_LÿEưþ_x‘‹;endstream endobj -1604 0 obj << +1603 0 obj << /Type /Page -/Contents 1605 0 R -/Resources 1603 0 R +/Contents 1604 0 R +/Resources 1602 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1609 0 R +/Parent 1608 0 R >> endobj -1606 0 obj << -/D [1604 0 R /XYZ 56.6929 794.5015 null] +1605 0 obj << +/D [1603 0 R /XYZ 56.6929 794.5015 null] >> endobj 434 0 obj << -/D [1604 0 R /XYZ 56.6929 520.4669 null] +/D [1603 0 R /XYZ 56.6929 520.4669 null] >> endobj -1602 0 obj << -/D [1604 0 R /XYZ 56.6929 495.6849 null] +1601 0 obj << +/D [1603 0 R /XYZ 56.6929 495.6849 null] +>> endobj +1606 0 obj << +/D [1603 0 R /XYZ 56.6929 178.7136 null] >> endobj 1607 0 obj << -/D [1604 0 R /XYZ 56.6929 178.7136 null] +/D [1603 0 R /XYZ 56.6929 166.7584 null] >> endobj -1608 0 obj << -/D [1604 0 R /XYZ 56.6929 166.7584 null] ->> endobj -1603 0 obj << +1602 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1612 0 obj << +1611 0 obj << /Length 2418 /Filter /FlateDecode >> @@ -6724,21 +6715,21 @@ P>9 "Òû|'¤ L*¼OrXøôï¼,a¸j4&wW_^Ö¾îÙ®™ñ±lDH¢Õ«Ì®–Ø+JJƒ^?€¥ ï¾3àj#ܺý~ê“{ò2ò›½´h"´Dµôqs i9Ý~Nµ‘\Qç«ll¼(ð¾k*~{ÜàÊZó´x4 ±‹˜»y²)¾®Û\„ XYŽ9`ÉÈ-l¾À{GP«æE¹õFâ£y§ÝúÖzûÑòÀ–iiãm~×MÃÁcjõí*á°%½_5™™9uŽŠ<뿸ش·Ç 1tBx{9pùTÌJ¬i‚](ê`¹yüh0çŽT.g¯AS¼i{èØõ/n>Ÿ]¹ßJ„îA™KU?„…­(Šßxâ{¯z±PW÷§^ -©íØCqÇ©Àë³l?za@‚€Ögä4ßzƒ† åoN ÿ‚WVë{Ìý¹yùK œ¼ÐäöïЖêß¶›JIÈ•ü'ÅW”Ý…ÐAo(ù»?Ai~Ÿ…Ôºõ^½u‰@Ñ< í¼{lñ ¢]@¤ÐDZRY7kMþ/ÌŠpendstream endobj -1611 0 obj << -/Type /Page -/Contents 1612 0 R -/Resources 1610 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1609 0 R ->> endobj -1613 0 obj << -/D [1611 0 R /XYZ 85.0394 794.5015 null] ->> endobj 1610 0 obj << +/Type /Page +/Contents 1611 0 R +/Resources 1609 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1608 0 R +>> endobj +1612 0 obj << +/D [1610 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1609 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1616 0 obj << +1615 0 obj << /Length 2956 /Filter /FlateDecode >> @@ -6756,33 +6747,33 @@ J †ãõ*¨^úëev «Ô¸6 á :)rP3uV1wŒr°“ŒTeìÄÆv‰€çN…Ã(Àcw_ÏËü^ …x¤ÈœgLÊ»qÀÇ6ü¹h&n¤6Ø3Pã8LúxÏõ­‚£Ó<ˆëj-ÞÌ埬A‡µmã¦Fy Ù½’±1’Ú>Ñ “!Òfø>Á½ÓÑšµü¾ÞPõ” ìž”ÔÍ?¶Qr‡Â×¾Jj­œÞó±C^û4•©Ô=..i*ÈÞî:nXyÛ¬Àç°Q~ðÓJR"vŠACrÐ}ªÄpÈ4–“dc íl¶6A /”—œf•­¨¾ÎÊH*ÅF†u…o&Ìꟿ¨¿Ø„FÑk¦ñàãu-ïù_ÎñDЬLV0‚!ôŠ’¤É!¥ˆÓž]šœÔ}á)²/¼'õ=æ!›j¦§åÇÛrM¦˜Íøl* ™PbÙIà˜:¯ Ö*˜O5|Û¯‡¡ú€öjO/!­ôŠ7Àô‘G x§µÆ)?A@PUÖMûä˜h ¢d/Œ—X¤ ¯³ÐÇÜ ¶§&‡H†¢v0’رà–"‡2Ý\•ƒaÁ·õ,ú²¡çBXÅ6°¹#@Ìcvì¾Àý­©…-Ƀ(3))LqWoT¦ørG‹ ®G“ÉG[ýÙgºÈõB­Ÿ=ÈJÍ4@÷‰IŒ²æcØ)Âb@^NÇ ×Tù•AäžÚ)ÈjÛm¶/³UYŸHGYä£w={=êñR^è^ü¿ÞzÀuè&Qþ…÷+;ãÅŸñ¢™ŸöAÁܯx)“°Ä}ýáïw|&ûwêX€wlKj¹«³ãOLµçäOa³e7³îIÑžD7òÈù ,á³* ÁD$¶w[ŸLËVÍ7!%£Øå`n3‘Ô—gûBƒÁ±dhÛMÛ XÞz¢/)«ÄhG¸ìå‡ÍÑ%þ˜]žçÆ~”à § ö‘Îý° ÿDÓ?ü3öð»PûÃƒäØ°äáRã¶Q*8ôžýÈ®<×בoG¶þ;H'lendstream endobj -1615 0 obj << +1614 0 obj << /Type /Page -/Contents 1616 0 R -/Resources 1614 0 R +/Contents 1615 0 R +/Resources 1613 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1609 0 R +/Parent 1608 0 R >> endobj -1617 0 obj << -/D [1615 0 R /XYZ 56.6929 794.5015 null] +1616 0 obj << +/D [1614 0 R /XYZ 56.6929 794.5015 null] >> endobj 438 0 obj << -/D [1615 0 R /XYZ 56.6929 510.1455 null] +/D [1614 0 R /XYZ 56.6929 510.1455 null] +>> endobj +1617 0 obj << +/D [1614 0 R /XYZ 56.6929 482.5541 null] >> endobj 1618 0 obj << -/D [1615 0 R /XYZ 56.6929 482.5541 null] +/D [1614 0 R /XYZ 56.6929 117.762 null] >> endobj 1619 0 obj << -/D [1615 0 R /XYZ 56.6929 117.762 null] +/D [1614 0 R /XYZ 56.6929 105.8069 null] >> endobj -1620 0 obj << -/D [1615 0 R /XYZ 56.6929 105.8069 null] ->> endobj -1614 0 obj << +1613 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1623 0 obj << +1622 0 obj << /Length 2444 /Filter /FlateDecode >> @@ -6801,27 +6792,27 @@ gve Sm8ÒÂo[Wøä‰½›lµ**ê—cÙÈ4I>™?.>x¥$Nö«{_‘žË#nþú’€kbï|Iø¾UaS¦b ¥,KâD÷¿@Üù¡8 É4ž`>Î$Wº3©Á}†Ï$J@‡“A¹wÄà‰¬‰òâj3'Ø¢¸- ÉÁÚHQS¯ |SÎ1íćí˜oé4þåÙX 44Ê<Áö¦n<½eš°Ööy4åXñØ]­Žðz>wU L\SÀœKŠG¬³«\|ÁãRf×ûp|~:ûû åèôFµÍå„ÚR¯*æàn=|'/GP³Á‡xWP5žÌ?Þ¼wtzæ¡Ûç ㇎М&sgÑ= =ÎG<@xñ`aü?hÕ÷IXÿ%,˜„u'a=.aÿV-ÊÏE@ö쪾õÝP«ÿ¾Ñ1Š]õ‚2¼íùÝêN¾zË>¾È9öØS!½£BlL¾>%,1´WÅ,Û4þÁÊešØé½'bzw¡§­*¬§6/¯«™{©C û¢„“^H¸¯_ç–.]ݬŸ¯pwUÌ»qpaA*®Ð\OlÜið{¯ø©Žóhñe]xæ>´Y[,é ~ë]gËe6Vã ‚§,Ö{î¦ãqî)¸%f½o^rmˆ²b q5R&ÇL%!Çh†üö¯ènàƒÅã@+ˆœÍêêzd+™Äô>”â\.Š¿Ž…R µ³HÔÐÚý}â‹ñœ*…Ê~`&—„±(›¶¨¦(@ZàšrõÉåÅnp¹ª×mÇÁG½tÔcÁb%†Úzùmd\Øæöà?_†¡«Þ†Û Îp[_¶½Oxµƒµ|tUSdkôÒ½cSò‰ª»k—÷OßÏ9½š*¯[/$ª†§ÙŸ/÷ýêÒ$ü©ÂÈoxg…OþEÄöç"m ‘ã)F—Šx¦s#v97P›DÆ#¬ÿP4rËendstream endobj -1622 0 obj << +1621 0 obj << /Type /Page -/Contents 1623 0 R -/Resources 1621 0 R +/Contents 1622 0 R +/Resources 1620 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1609 0 R +/Parent 1608 0 R >> endobj -1624 0 obj << -/D [1622 0 R /XYZ 85.0394 794.5015 null] +1623 0 obj << +/D [1621 0 R /XYZ 85.0394 794.5015 null] >> endobj 442 0 obj << -/D [1622 0 R /XYZ 85.0394 220.329 null] +/D [1621 0 R /XYZ 85.0394 220.329 null] >> endobj -1625 0 obj << -/D [1622 0 R /XYZ 85.0394 191.1908 null] +1624 0 obj << +/D [1621 0 R /XYZ 85.0394 191.1908 null] >> endobj -1621 0 obj << +1620 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1628 0 obj << +1627 0 obj << /Length 2008 /Filter /FlateDecode >> @@ -6839,60 +6830,60 @@ n T` à<›)ŒK.æN´£me°1é³Ègo,v‚Cgå/ÍØP2†Î„]©ÿ:£îÉœ Üì'§•!±ÔŸØ|Ò‡"pzî¹#‰´ïÓl³ÌàmvCÞ£‹¶·¾Í 7û9^wMKŒ^îáP g;Þ4]¿Ÿ2îíÕï'ÎÓ}{Yäã×û"?݃¼huÖ7­08¢O ¦ÑòmŸO|‡Ó<Ì| jºåw¸a°´ü\xó·=ưîºt[ }úðö8Æ:²VçÐ^EŒ¨BVlÓòT_ÜömJcè·D’oÆ[ÅýYøÖ§§ Ê€¹*Jýölæ»jûÎOñ:l€pòçS,é §ìEf;ÿYw÷M{_7'XŸ|þζEþNçù;˜õú–Ow}î7yØ ð‡ô™Ÿ2ù°£}÷ïõûÿ̀ÇÇrþGQÁFƒëý ;ü°ìúÿÉ›Ñendstream endobj -1627 0 obj << +1626 0 obj << /Type /Page -/Contents 1628 0 R -/Resources 1626 0 R +/Contents 1627 0 R +/Resources 1625 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1609 0 R -/Annots [ 1631 0 R 1632 0 R ] +/Parent 1608 0 R +/Annots [ 1630 0 R 1631 0 R ] >> endobj -1631 0 obj << +1630 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [491.4967 730.5319 511.2325 742.5915] /Subtype /Link /A << /S /GoTo /D (lwresd) >> >> endobj -1632 0 obj << +1631 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 718.5767 89.457 730.6364] /Subtype /Link /A << /S /GoTo /D (lwresd) >> >> endobj -1629 0 obj << -/D [1627 0 R /XYZ 56.6929 794.5015 null] +1628 0 obj << +/D [1626 0 R /XYZ 56.6929 794.5015 null] >> endobj 446 0 obj << -/D [1627 0 R /XYZ 56.6929 769.5949 null] +/D [1626 0 R /XYZ 56.6929 769.5949 null] >> endobj -1630 0 obj << -/D [1627 0 R /XYZ 56.6929 749.3309 null] +1629 0 obj << +/D [1626 0 R /XYZ 56.6929 749.3309 null] >> endobj 450 0 obj << -/D [1627 0 R /XYZ 56.6929 523.534 null] +/D [1626 0 R /XYZ 56.6929 523.534 null] >> endobj -1633 0 obj << -/D [1627 0 R /XYZ 56.6929 498.8411 null] +1632 0 obj << +/D [1626 0 R /XYZ 56.6929 498.8411 null] >> endobj 454 0 obj << -/D [1627 0 R /XYZ 56.6929 429.268 null] +/D [1626 0 R /XYZ 56.6929 429.268 null] >> endobj -1634 0 obj << -/D [1627 0 R /XYZ 56.6929 398.8008 null] +1633 0 obj << +/D [1626 0 R /XYZ 56.6929 398.8008 null] >> endobj 458 0 obj << -/D [1627 0 R /XYZ 56.6929 365.2487 null] +/D [1626 0 R /XYZ 56.6929 365.2487 null] >> endobj -1635 0 obj << -/D [1627 0 R /XYZ 56.6929 337.6865 null] +1634 0 obj << +/D [1626 0 R /XYZ 56.6929 337.6865 null] >> endobj -1626 0 obj << +1625 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1638 0 obj << +1637 0 obj << /Length 1135 /Filter /FlateDecode >> @@ -6906,21 +6897,21 @@ eS ¸Z1U`å‚„X$PÍ ‚Ks>´V¥÷ôO`‚rg¿l¨ „jn¾ò;ÃnQCrHE\ÚéÅb>ªz/{y%²TU|—ž; Š:£Z­À/µ¬ÅºÇG´®ÎÔeö9Ä¡ êQäézH¦ü»^;ʇ· ¤Êsæd¬tYõu¶Íˆ=•+$°¸˜ÞK¢Ê´#—Ëüûl3Y”‚¼¤j†š·tMã SŸ{ïD|á¸^ÛI™ë™ùñV˹–U• ï>E;1Ž&¦ëûNu@æ8µ2×›¾LÊ rΞ{yuÜö:ôÿëíšœendstream endobj -1637 0 obj << -/Type /Page -/Contents 1638 0 R -/Resources 1636 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1609 0 R ->> endobj -1639 0 obj << -/D [1637 0 R /XYZ 85.0394 794.5015 null] ->> endobj 1636 0 obj << +/Type /Page +/Contents 1637 0 R +/Resources 1635 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1608 0 R +>> endobj +1638 0 obj << +/D [1636 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1635 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1642 0 obj << +1641 0 obj << /Length 1187 /Filter /FlateDecode >> @@ -6929,21 +6920,21 @@ x – ‘mccêφ$p¤ÐðæýÃíýÝï“ë7‡Óû÷#@ÞÞÿ2ÎÿÝM®ß½»žŒ¶Þü|ýët<É—¬ãÍýÃOùŒ“?^ŒoÇ“ñÃÍx4Ÿ¾Œ§{[ªöbDSC>fsdøÚì·©c3ã‹ ˆ‡«É(d&¥»™`ðÛà𲚉6ú#H¨EhâŠm-¤¡8s E Í8 ¡¡ûI<[`ã¯Á:ŠU’ÏËéÌ"‰Ê‡_åÏyj¿&0†c¤Š˜¾-B…ùpVåÿäzQæ5m®ïÇ"I+WyOçªÕƼºf\Õüy#â-H¢Mì‰|æÄÐá?¹6©–|ô=ÃÃÜ”p¦a!7)ËPÈ— +  gk[RNÌFG”&V•W,/tc`\çIwÝU¿}/˜qh#“©‡A‡s«yoœµnóÆ=²í<;àY;d[UÚp°U©šçQ%ˆêŽ;Í^ @/·VÐ^Á­9`Æš[»c®']K†˜#«;ÝŒç#ûðì˜m}az|¾èóghÍa¤är |¸ÛÝþåE¡Ÿ4PjEèTKeïߘ ì¢ÅœBj:Í Zcyº’ʲ|¢w0$6ámîT‘æêijsLÜ ‰@ŽTûTÔ¬JS[ئÈ6…–~ 7x³+Nö€ÖúÅúw)8ÐsԈȯËÑ#Hä_âŒFæOòPÈ¥xúo‘¬…×á¨ñ"ÝŽKvŽ„î'ÝKä—2Ø5„ë­Œr½O—h÷á†2|g¶ÄOÂÕGáªõDKÅ–®'Îe ] t?%½ä\­#~Ûnw.ó«¶xèÚ(ßí UïrãD(Åþ®—+в™ã ÏZW+´,Ô–;+W(œñ…z®÷ÔQø¨œÏ•Mä#ÐÁ—¾TÛÆT(•æÝkL¦;ÓcV%aä×;þÎ…VEIŸ®Úħ šîp)ƒéÅkÃ+ÚË_|¿[^~›ú<·m²¿º%¤ruK¸ M[ƒ¤Rs™yÄ|w|Lý¯aGendstream endobj -1641 0 obj << -/Type /Page -/Contents 1642 0 R -/Resources 1640 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1644 0 R ->> endobj -1643 0 obj << -/D [1641 0 R /XYZ 56.6929 794.5015 null] ->> endobj 1640 0 obj << +/Type /Page +/Contents 1641 0 R +/Resources 1639 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1643 0 R +>> endobj +1642 0 obj << +/D [1640 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1639 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1647 0 obj << +1646 0 obj << /Length 1337 /Filter /FlateDecode >> @@ -6954,27 +6945,27 @@ i “˜¥U³;M›ƒøª˜¼šqì>L6{5õÄfQ;§ðVɬW‹ 7¹ˆ· 2%Ùõʵ–)“¦›u†«6îí3*©€Ë·UÚ׿‹)„BžJÊÛý rå9á2Ù°Ãâ9kÍüZ€«ë«ÉQÕÃ@O´‰²Fëxn{~ÔÌû“¶Ót½„-©ê¥ð?“¤ÊÔ¬¤ôm“°›ç»„/OmüQ,èìŒ,“ÅìÙ£;¾}6vM•’˜*ÔÉòõÕ£3žÂY/ãIîZìÒ¨>ì—0>¤­M‚ϳ6ä¾Ù¤k´ˆJÚ…{IM‚öó»#䇮 øøæÂÆFmöB9aìÁyÜÓmu»€ÝÂpã™Ú…¾Lø"©dkh^úõ=ûnYvZ>4zñUÐ%+eÙ£=ˆ²‰‰¢EMW¬V¨qþ‡ã¸€¬p* 3s\ÓuR≆rŽ3L ¼jµÉôs™ð¹Ú=Ôzo¼H®žã᜕B ·j5ß駺¨1õrºŠK²kZ"«á˜æ¥œbŒÐ«éÈ¢ÔÆíÌS‘u\wHÕÃB#U¾]nrª½«¾)HÂ@—ÃË…Ê”<ö‡L*åZJ‡c]ßôƒ¿ìY––wèÙ¿€w@ ÊZVíD%pžðð‡^ÞÅê0«0´: Ó¸z ¡ÑŸ•ã –â© *‡˜êV©ã:ɪSø/¯ö7{PŽïÛõ½TÛ+–kúvàUJ)ßr¨y}ËõXõÿÿ±[Lendstream endobj -1646 0 obj << +1645 0 obj << /Type /Page -/Contents 1647 0 R -/Resources 1645 0 R +/Contents 1646 0 R +/Resources 1644 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1644 0 R +/Parent 1643 0 R >> endobj -1648 0 obj << -/D [1646 0 R /XYZ 85.0394 794.5015 null] +1647 0 obj << +/D [1645 0 R /XYZ 85.0394 794.5015 null] >> endobj 462 0 obj << -/D [1646 0 R /XYZ 85.0394 122.4687 null] +/D [1645 0 R /XYZ 85.0394 122.4687 null] >> endobj -1317 0 obj << -/D [1646 0 R /XYZ 85.0394 92.1609 null] +1316 0 obj << +/D [1645 0 R /XYZ 85.0394 92.1609 null] >> endobj -1645 0 obj << +1644 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1651 0 obj << +1650 0 obj << /Length 3032 /Filter /FlateDecode >> @@ -6994,21 +6985,21 @@ _ K/(1ºäÒ[»+Îü(&Ò É⑞ŸÿófÆ_©„Ei*ýš”IÊT D,S¨IŸŽýeÍ)ëÿ)”o#endstream endobj -1650 0 obj << -/Type /Page -/Contents 1651 0 R -/Resources 1649 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1644 0 R ->> endobj -1652 0 obj << -/D [1650 0 R /XYZ 56.6929 794.5015 null] ->> endobj 1649 0 obj << +/Type /Page +/Contents 1650 0 R +/Resources 1648 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1643 0 R +>> endobj +1651 0 obj << +/D [1649 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1648 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1655 0 obj << +1654 0 obj << /Length 3894 /Filter /FlateDecode >> @@ -7033,29 +7024,29 @@ Yg fbÞèòpe–Çï¬Ç2ƒ‡ˆŽøI¿çûª omffÅŠ ™’/= 8¾]^í[}µ¾"D_y}CºÑW,ø<´m/—n–¾Ù‡ ÚÏØ'üõ¾éOÏßÿgüâ6ËnMOX&m„BÁM:•<~ø.úÿ—[> endobj -1657 0 obj << +1656 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [250.9056 106.0844 314.5963 115.494] /Subtype /Link /A << /S /GoTo /D (statsfile) >> >> endobj -1656 0 obj << -/D [1654 0 R /XYZ 85.0394 794.5015 null] +1655 0 obj << +/D [1653 0 R /XYZ 85.0394 794.5015 null] >> endobj -1653 0 obj << +1652 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F39 1151 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1661 0 obj << +1660 0 obj << /Length 3489 /Filter /FlateDecode >> @@ -7076,2780 +7067,2769 @@ m Ù‹‡Ëòý~Ô÷Ò¼üßóÒ\ÝA?··>‰É?©$i˜–nuú{ӑߙܴÝ]ûxrtyÊÛ×a>¹­s9V¿ôÜå XÌMà-±'a«±^»BÖšMŽ]v6ó]^$µqþ¾o‚M81¸p1§Ó %Eo‹¤Î-WOiÐÓ»½·_ù2;³ª²¢ö‰›õZzÈ|úúÈÉór0<ÈA&TÌ.s ®ŠÏÍcŽ}oïáûŽ áÝW'>8jÇ-J&=¿ïÑL Bc{ Ï§õéÓ‚vž†ø ónù•>Ž™ahþˆ_á~!~yÄÿyOªð‰ûÓ—Çå—OØ¢’ |ihòKjYJÉyìH |W@pÎýØO*¡7‘îÃ?^êÿþ!àñW’~èÈ(ò¦ëH?‚EøPø *:-˜øƒ§Gÿ—âƒhendstream endobj -1660 0 obj << +1659 0 obj << /Type /Page -/Contents 1661 0 R -/Resources 1659 0 R +/Contents 1660 0 R +/Resources 1658 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1644 0 R -/Annots [ 1663 0 R ] +/Parent 1643 0 R +/Annots [ 1662 0 R ] >> endobj -1663 0 obj << +1662 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.6033 659.1254 149.9876 671.185] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj -1662 0 obj << -/D [1660 0 R /XYZ 56.6929 794.5015 null] +1661 0 obj << +/D [1659 0 R /XYZ 56.6929 794.5015 null] >> endobj -1659 0 obj << +1658 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1666 0 obj << -/Length 3661 +1665 0 obj << +/Length 3757 /Filter /FlateDecode >> stream -xÚ¥]sܶñ]¿â&O§™ ‚ÄíNgYN•IJ+«ít’_]¯¤K¯”ËoÎ/ÞÓHB?§Ÿ.>œû·Ë“c/¯Î?]ÐðåÙ‡³Ë³‹Ó³ãUhUë%S8°àÃùg}{yòñãÉåñÏWß]ugž7ä×£‹ ŽýÝ‘¢ÄªÅ|ˆ L¹ØÅ* -TE~¤<úrô׎à`Ö-“ŸŠl ¬43ŒÃCp¬&66†XoÛ¢®šã•bùo<Ϧ­@. ƒD)éðvuÝ®²¼ÌoS\°ª«ò‘å¿­Ë}–{ -îç«,ÿêƒå}î›Üì›|¿ñŸÿyçv^M¶&ir$f àϪ#­†XN*2œQ« ·ÌŠ&½.óUZÞÖ»¢½Û4SB# ØÏ²à‘fXË1*0ÖFcÞ o:^¶wˆ–Í6_? !óŒfÞ_|ùrvJ“vÝ\Úòo•Âu^Ö/Q¬ÒMvE|Ü—m±¢»Ñ*°±ŒÆj±av"ÓPaœ  s"k©@´¤iÓ6ßäUÛ¹¥»ãÐ.sþ(áy†,†bùÉ)"ŽÓ‰ØÔMKPw¶5}?eIе'¶Ý–;¤b‘TVó¼Š °žQ1å¤R5M¾^•uýKÚYþDÁtÄuô<Ö #Óà4#£Ç<üã.¯@ ±\6yûõÌEÆ*HYž^£biü‚­»¶úpÚ‡î€û´,²´­wôùzAPÊ¥e›ï*Pü —›¼½«3&R÷4X9CÃÆáX93Z­"4’ïÏþI0©Òºv¿™S0¶˜d ÞPßÐoJ?¿×•3)¼ôú¹á.Å„°;¨ê-°_•Õ›´`Bc[„å×î|bìÙv“e–çÛ”ýéÍAÜqgO¯¸9 -ê„| ôwFô;Võn“–w®ø>!4ÐÜ]ÚÐD™ß´4ÔÑø%¤¹}ÕîŽírß´yÆ;"ÝhBÃMŽ®Ôã¯Òj}G2•UK¶ê­:¯2"ë‹òÊ1xèêhˆNŠý¼ÿá8‘˿ϩÌü¦r‰Òõ[î·^è»É©¸á_Ö‹5èûè†éœ,NX CŒGB;ÆÃ0\‚Æ6\žßÐ0Ï›žkü˜r˜žnC()/cÅEø'¡DSlŠ2Ý¡cuäëfùòŒ_ÿåÐŽÔ;o€fxXÁ ÷–YÙ%8# vÿ æ’¬`‰ö¼×  Û" øe·ˆh&>‰@‡Ñ0ËWC ­(QKÇg”8¹5±¬‰’ÀêÄo’î=Òˆ°Œ‚ÅÎêâÈéiE;\]ü•å7)dú€›Ü»k„ýoÐpn€^p{DuzîPYnlmJQl'´7²¹Ð œ³Z’ëêÖã9OŽƒŒÞ¿ØôñŒ@ï9&HiЕÓT$z Š×›'ÌMœ¾ÀoÓ’ -:l·¹W`é”\HŸ¹Œsdä.|!×E•@~.c ¥ˆ¿ºwsÑ3Ðõi=M6C%Âøy,2pXÖ)3ßÞ¹2<§€4i×:Wƒ‡œÕôR”H&cU§;‡”$°I¤Æwþœ@z®bÍ@&lÒöf0ä ‚”ÞØ?dX„ÅzyBä×õö‘èc(ÆÒrøݤ禨@*e‰WŸ¬™ˆAš‰ƒT "”€ƒÞ³Yàò†×û©PÕ2!¦_ß°Å@5EfÆ¡Eâhm™§  Ó…simÉkûxˆ@o¬>8"ÿ¶-ˆLƒL&‰ó¶‚óX2Ú35‘¼T&ˆáz_¡Ê€h”fL IŽêµç½~¨PLáû†Òº «Qãåé±ݵí¶yûæÍÃÃ.(šu@Fyû¦©Ë½«:ßdå=±ŽË‡ì?´ÌÏŸ¦©±4 úD«El“@IÍ©1Mÿ²ðÐ÷OÓånåj¸Ô¥Ë#žî€Œüy.m -LlM§¸¤ÆP-?ŠDX¯PMÈ“ãüž4,Œ}¶ ¥ÖoˆRÌ]k( S¯»W$2TC{ªUÍÞÔû -=xoS08V|@'…„¿>-›šqëͶ SCn+í,|$QpD¼—Ü¡’$ÒcyÆëI=6µË¼|,\Ð1zé²Nƒ¾Ò…£(Àˆ;,>7Ùl\fˆËÊåT’÷ùÛ<<’òÂb´î×½·Å¹³Aq5Š|ÙÕ›8ôpy ÐwÑtÈKÁ±Ô¸DËLŸŒN€(¬œ]\¸4Ń„v…N&eiƒ|ñéêìí̱á°ü#ˆK#ZáîDB>wR° R\è5§¸¾ž g:0æÃÂàŒ+;L¼ÆÉp—ðt×ÛL²¬Ùõ[6‘•²ö…žÚëpãÃä¬Þ®óÀûÝÓ®‡5AKó<Ö £®G"ÁNøø‚vƒj(Íò®ÈwÔ\ZØÐàÃ]±¾#¹%È ~@q&et= w2ÒWT·•»4ø&ÍÀcZû:à41v¬C¾†•Ikéõø1ŸÓõ¤¹Ì ¤·†Š‹L)û -k¶á8YµÂ›5@ézoç„t¥jò]C®îµÎyÔNF&È K[!æÏ,EŽVzª¹TÒLj§‡v»vý +úþ…¥*ä8\úÔX8‡ŽCN×߀ä”ú†®«¥¨#IÁ(æj HE‡ª€ˆHbÍm,ŽHÒÉŽ›Â²;€ñqS(îë9œd˜žïæz -é̵câçãV»seôêç´`KÖû{rzÓj#„’Wyg¿I«ôö0=š‘Šžt|¹¢œ¥¯Œbõ‡Ú‘J¿€e5ìþ®Ûâ>?ì CpdheÏûÂÖ3¾Ðc1ë:~âû@|*IÌóÛvX3ûŽí@£3P1MIè‡ýu Z2 Q,ž\_`Ý6³}¨ã0zÉK ñ˜hè mÚ¯E{XV4´Á>]Fðùçû˜òÇ4Ë8%iræ¶å„óþÑȯû|WÐtÌéŽCÄ(çì2ñXZD“4©÷<:D'¿‚IãȤAŒæËåyK³.±ü¢j}‹F[¦rÍT9D#~E3ëºú×¾Zûiè“;€R¸ ×FÈehdz¢ÐLÚ¥ ¦0¦·R¥iI¡2ÝLޤ¢0¥¿FqLâ å6”«Mr•‚«ã<Å= -mËçqó¦Ë_Æ&ç9Éf»=§ÿ‚—½öÔA+ôaâwé=ã•yuÛÞñ0µìÅ2’ìLbáË€Ò xÞ¹ÿ+– ï—2±­O›.?œò¡äl¯ñ$Ë -¼_Ü4 f‚¯ôv 7.Î?ëàäò3fä'„B‰%ÎQXEèš[kZ™MP¿¯ï„Ø‘txª¦ßÁ ¡¦4޶WPkdRÑÏ5i! N™ôRØH=bÕcƒý°oë*£ÈÅêäýûËÄöM‡ÛüauJAÕaíÿ ®/k]]ö*“—¢3³gL>6bFþ[ìØ>£ØóQ^çüßBÍè$m:Ñ#}H¤×‡Dô>¼>ÈP=ч¤{„Nø~‹Ûª{ûbMÐl<Ñ -–ŸŽ±DÞîwÛšð‹?ÖtžˆT& ÕæNÎ:™ºq—c¥]Ó÷5“íþ¾f‡Éò¤z¤áª®V›´]ßu„§#w¶™2vÔ7w=®ý®on=IGë5Pì4»Kt(ܬ±ÛÝOúf·‘•w·³æ„z‡Ïè† -KÕ©–sÐÄfÝR"§o0Ú7Ûµá×=4<v‰ Ó+œö € -'ph—%¥UÚ?ãÃpW~Ìå—6ã‹À)¤ƒOW*Y~óÈ]*h=}-C—„¸d@æCR&†Ãä@ÌûWóùFíÛƒ­9x5 ¹m2Ø6ÄT×+sFÜLræ+Zá ÓÄKÙIÑ\CÁmÖýÕ -ø6«&Ï‚¿SS‡þ^WE³õ¾èNùÿ-iÿ‡¶±/jå|ã :°ÛÄ@%Sλ?:}Êú} ûendstream +xÚ¥ZÝsã¶÷_¡ÉK䙈Þu:ãÜùR'9ßÕç¶ÓIò@K´Í†"‘²âtú¿w»à—(Û×ÚZ `ìÇo—”3ÿrfu TÍâ$ +´z¶\ŸˆÙô}w"™gá™}®o¯O^½Wñ, šÙõmo.kåìzõÓüí_Î>]Ÿ_.B-æ&8]h#æß^\¾£–„~Þ~¼|ñÝß®ÎNãh~}ññ’š¯Îߟ__¾=?]H«%Œy†#Þ_üxNÔwWg>œ]þrýýÉùu»—þ~¥P¸‘ßN~úEÌV°íïOD «g{xL’p¶>‰´ +t¤”o)N>Ÿüµ°×ë†NŸV6Ð6Œ'0’½”èÈÌâ(LÓV›&¯Êúta„˜ÿ÷3ƒn +˜NÊ Ñ:t|Ûªj«¬ÈîR°¨Êâ‘e¿/‹Ý*ó3¸Ÿ¯VÙWo˜,ZrW·äzWg»µüÏ·òb´4‰HƒcРÆÊ@ØÒ¤Z1Ó¢ÏåN%”jÕrá’«¼NoŠl‘wÕ6oî×õX‹À‚¤OŠà™&Dûë ¶V exG2€¾™hÞÜ;BÍëM¶Ì"ÌVÔóîòóçó·ÔÙ×õ¥ ÿ–+b¸ÉŠjÿÜŒeºÎÀXć]Ñä º£…j¨zGg*M £áøaŽÎÀÚ Ôp4¤nÒ&[geS“¹¥ÛSiç?°‰l…"J1ÿèÛiG@¬«º!ªÝÛ’ž÷yQuã'ÛlŠ';¦b`\aêgT¬Çõ„Šy.w*e]gËEQU¿¦u¾ÊÌ(˜Ü¨§%h¹&D¨˜§©b3”á÷Y Ç…ó:k¾™¸ÈH‰€‰ÄQ‘Ç×(‚(Œý€»¶êxkZ‡îˆ‡´ÈWiSméqzATÊ¥E“mKP|”óuÖÜW+ž¤êæ`å”6‚…åP9W4Z+4’ÎÿI4©Ò²r¿+§`l)ÐÉ:Dµ!¢º¥ß”~þ¨Jg¡ð§×õõWÉG»êλQ«jæ<ÑÐaøÍ£ÛŸzD¶Ýd¾Ê²MÊ~xs7DÔÚÓ n.‘&áßÀü±w±èV,«í:-ˆn]0ð}Bh ¾û´¦Ž"»m¨©ã×ì‘úve³=µó]Ýd+^™èFøB79¸RÏ¿HËå=iØZuÈV­Ðª³rE‡Èú¢½òAº:j¢"A?ï~ù8a1 ®„q‚K)ç ‘•ó‹[jæþ¸“ÆR#§Ÿ·&–”‡±â"ý³Ð¢Î×y‘nѱºé«ñ|ŸrÿùØŠ1¨wVÜò¸ƒî,PÙ8#"svÿ æk:YÁ'Ú9ðNƒ‚v œ³n 8¢‰ø$#Շ嫡(–JôÜÉ©w@nLd{cTX“øEÒgLª A ØZ]¤œž–´ÂÍ./šEÎO«ì6…€Lp“;w°þ-Z6Ò Ñ)Žcƒ¬NÏ+Ÿ[›6ŠìÈvF6:Á9«u!¹*ï<ŸóäØÈìíð‰MOÌHtžcò¯Ž "ù݇ xyBÍ „Óø­RA§3Àí÷ +:%¡G.CŒ«@vá ¹ÉËUÓO!ð°Šø«{3=QŸúÑÓ¬&fQ¿•çâC ‹*eá›{Cúûô “¶s5¸ÉIMWQT˜ Uî I`¥‡wþ”<בúf&l¡íÌ /HÛ/2LÂ"3?£é—Õæ‘æÇPŒ-¤å@ð5ºN/M^©^=>²f"i&6R‚ˆT + zÏfÃkb^BeÃñüÕ-[ dSJÅMAˆ£±E–ÖÜ€NöeŒ%¯íã!±úàˆDöû&§ij2Iœ·Åœí‰à“1^¨Ñɇ:"¸Þ¨20ÆÚ0'†$7ë—½Ú—¨îLáù–`ÝšÕHFxyf¨F÷M³©_¿zµßïqsA^/2Ê»WuUì\ÖùjU<8r˜>È `ÿ$ÏŸÆÐ8Œáè£gQBFF©û×™§~8„ËíÈE¨ƒË W@Aþ<›‚8²q«¸¤qL¹üÀ‘a`½Æ³Àh*ƒãì4LF-Cª„ù²äS×* 5ñ²{5AJÝ·W˜µ¬xÁÛjW¢ïl +‡Šì¤ÐãǧE]1oµÞädj(mI­­…NQï9w(‚$QfxžQˆùäHÁ®²â1wA'6s‡:cô•.ÄšB´¸Í"á±Ézí!.Îï!“|ȶXæá–”æƒq¿í¼-NíÍ`N%Ãç]}IÇÀü.šöåãÅMp,Ðr»Ó'£p6I\÷œšô’â íEáž“ (­§¸—¯Ï_Olö£~Á¦Mä7MU£0¶.¾ÕD.³mC< 2vxvší¨¾×›„‰¶XëåQû5:4T›ªÎxK€ ƒNºƒƒLÿˆâÔˆF¸; !ÏŸ{âAÛ¨âú|R +F:ÐæÃÒàŒKÏÛ^C0Üžözëʪ@m·d}´à¡¬…k5êé‚GŸëxÁ£åêa5fo7ÙèÝö°êacô·ñÓb´\r ªè½Ã‘ŸQÃnQ Ãx~Ÿg[*.-¬©qŸ/ï‰Di‰r‡¿î@±'å)èzzngþ6BŸQÝ•îÒà™4ŸŒ­ÐòØ×Y8¶C³ö9Ì ½H‚È„^³)]—pJ€ez)½)¹˜ðaÈ´¶/°f+‡`Õ +oÖ@¥Ëe¶qžàJYï³mM.ïµÎyÖöŒâ¤wf˜Ú +1½çP(,^yÊ)(éïpÓnÕ¶~aEW¿°”…œÊ¹‡ÆÂ9”ÃzÕ7œRÝÐUµ4U$)Eœ!P´¯ +ÈØId¸ŒÅ§tgG…MaÙ@û°(uùv²‚ö¦˜žm§²ítâÚøù¸Õl]½8æ9-Ø’õþžœÞ8Ûòjïì×i™ÞŸ‚¦Òê âËåäüHé/*Gjû|Výêï²É²ã¾0”˜!Ùg|aë _è¹Xtø>8>$ñÓ˶\ëíÀƒ=P2M tˆÃþ²­‡3 VLž\]`ÙÔ“uÈ#©žóh<±êœ›ÖkÐæ%5­±N·"úâÓCDø1]­’ÔKÛ0à<ƒ?jùm—msêŽî8FŒrÎÞ‰G:0B`RçyŒD'¿‚§Æ–QÍ1 +ç õ:` üyÙø#´6<Ë ÏÊ!ùKêYVå¿våÒWH¥w@¥ÄqIoËЊç)D¡ Øeb„0qg¤Jã”: ¤ŽÛw0:’¦þÃaÂ*0§#9KÁÑ¿3Nq/…6ÅÓ¼YÝâ—¡ÉyI¦Ëuoÿ‚—½ñ³ƒV˜ã“ß§ÌWdå]sÏÍT²s²3‰„',Ú0áeçú¯˜'¼^Ê“mdÅ3 ´9Íp¥ª”Ž7äÌCívÞ"~=i„G¼f:_à4mÔB’ÝfSm®û¹¢˜ò[y¸8U·oK—€˦žFÑR “ÎÞþè×XeM¶]çeÆksB‚]~V’É)ö¤·øp Ý»‰›GêqU~MªAÙÑKü 80ä.îâvtQ­ßfÇ™·í®,_· é!l— H¬ÂÖÞß¼ L'"ˆ¬«Q¿àŽ ÊX?wÇ60·\²+¬»öÉKƒ84q‹q‚™¸c¿ÝûWwÇô‚j÷¿È–~]ŸqB;á 'ÌaggCÂ’/œwÂs' ]´ä3¼è|\špÒØ|Ö{÷¬>|±:„ZCÖaíÿ ®.k]^Ö/P¹œ® W£ßpM`‰‚„h_•_7DbÖ†F1¤Œèf/§Â&rÃH±IBµG÷†m¨±iK ë¶ö‚O Q#=Æ‘o°ˆï^p×ÙTœ=ø.ñ,ƒÀ¸u¾&Ù¡õ&Aj§àS(kľ'T”%Fû³õpM(q$‰ø)ÉÙ.#ï®\ǹ±[ú–é§Èk.8û‡êèB#¢tzÊ™êHó݇…¢öE¤bHÍó»²÷¾O+~ÉNÈù#‰Ö‘òWdÑá'E¾æE9'8ühÄù@íA£ê@0‹7q½£ކõ;°åM|£Ò³ÚN\Ñ~Á œ†¾ÀyO¨C …ñKÔAE‰mSŠ‘¥ó’eÆÆª¤¾–G ™J®O¨§–AŒ_(yíâÅþIož„ãWWÆ¿£01¿Ä2}…ÍÎü¡™^^ÿ È]xŦmš„FÿúšÛ¬hÎZÍÀ[S΃oüt2ÿö‘‹{"0fü’½{«/öŽd9ÂrÂfX&GB-¸M PÙ×·_­…½—­Òz¿Ñ.+1Ch–÷´}Ù¦bœjHÆ£4Âçó‰?p2ȶ«y7íÇ>ì¸vþÁ¿*8ö™-ŽR“%bÑîòÿþ·û>9ý·6œ®·(abõ†„ èd,yû­î¡èÿ·»häendstream endobj -1665 0 obj << +1664 0 obj << /Type /Page -/Contents 1666 0 R -/Resources 1664 0 R +/Contents 1665 0 R +/Resources 1663 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1644 0 R -/Annots [ 1668 0 R ] ->> endobj -1668 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [278.4002 485.7209 280.3928 497.7806] -/Subtype/Link/A<> +/Parent 1643 0 R +/Annots [ 1667 0 R ] >> endobj 1667 0 obj << -/D [1665 0 R /XYZ 85.0394 794.5015 null] +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [278.4002 489.1367 280.3928 501.1963] +/Subtype/Link/A<> >> endobj -1664 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F11 1442 0 R >> +1666 0 obj << +/D [1664 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1663 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F11 1441 0 R >> /ProcSet [ /PDF /Text ] >> endobj +1670 0 obj << +/Length 3189 +/Filter /FlateDecode +>> +stream +xÚ¥ZÝsÛ¸÷_¡><!ÄA0yʇúæÎiwÚÎÝ=Ðe±¡H(ÙQ;ýß»‹]P¤DÉ—inæ‚‹Ýöë·å(‚ÿä(¶Â¦*%©q$ãÑtyáÛ§ É4“@4éR½¿¿x}­“Q*R«ìè~ÞáåDäœÝÏ~[¡Ä%pˆÆ>ß^ß|úÛÝ»ËÄŒïo>ß^NT¯o~º¢Ñ§»w?ÿüîîr"],Çþüî/÷WwôÉ2÷7·i&¥Ç ¦wW×WwW·®.»ÿñâê¾ÝKw¿2Ò¸‘ß/~ù-Í`Û?^DB§.=ÃK$dšªÑòÂÄZÄFë0S^|¹øk˰óÕ/3ïß·ùºÈôïA$¨5šHÃùÑM¤i+¯Ñ,ŸgÛrC>Q4»4Zi-ï ª‡6)ŒÂ&É‹c ™ˆT+wÚTpôÖK=¬óìëdV5M>²“Î$3)‘™p0l&#@¼;o¦DD:î™ ù±™¼Œ½™ð•Ì„#oœŠÆù“E鸘³FÙª³~…®¥xÊÊb–mòÏ?×ÛrÆ&S`©$‰ƒÉ(_L³mƒ¦VÉ8ÇC5¿\} )fWԽϳ¢Ü’pôð°ÿ²YxŸƒõõjOOs »>|¬ÿ=[X/.~¡þ{E:õÈ °2P¼Ïzq‡è´"ïÃÛÍbR}›Õˬ¨Ž—$Èû”„³Rõ]НŠÇªæ°>€µÝý´ 9$ ¯ò5¨µ<\çoNúƒ$䢸èRö‡–ÊCÇ|Ùl M4›bz [ Z“¦çÅ·Tò{®ðØj8ÑžÇÛÈVxiŒú e½±àµ£›fÇá‚—üEÊÛ?5ãf•O œðvCMT~—¶rï &Ìî8t!)Æ© ¡‹xø’Œ1œdÓ¸“dA«Á$;ÑZ‹X)w˜Ô‡;@câ z[•yÃôÃd9Ô?ýÐâJ`½cjÇ Û[¶þZUÞ¿çE1]0eÖäýl8¸=(BC•ÿèyÚûuDKÎ{‡êŒ÷*Ÿ ‹¬Ü®Å:+┳bÑ€ØîS)À²²/vë@áè»:_Œ€‘dš²1£¨…~’#Ö¿eØ7ãÆõ~®¡)“y–;šÙ—^˜žÕ>³†ÅL»Îªfž¯™E6¥êÞÖ4g–{/ó Và B 9€ßdçÁ ¿úvDÿhBìø$nÜ‚„õ;z‚Šs$Á˜ÒÀGE1Bš=(ñ+èFF|”£ ÂÁ \ºðÓ"kˆÙ¬ðìç|Rm†Záœi¦h- œTVR¦oà“N×ÏìV<òÁ©%ì¿®¦ c %œ9tì­C¿Â¤4ÑÔÖ7j0*øétÂ<1ðQZ6t[оô±¯Æ(fý”•¯èµöq”tvØùa.S­/òl½y÷œNC™W ›œ¦ÔxQ¯òù–p/¼Î¶k®ü*ä5TˆSا¯ñ0Y÷¬lB4ÛÕŠëy“Ì:ÀÜÉÁ5oS/C¥Ÿ¤P€ËŒ/¥8><¬ìXÂÓw½ñû»HeµH÷]$^òÅÐLiÕ¿F¾ldŠP-ô]û$yØC7ihh[ä“:ÆÒ˜èˆaê!§çA…vTb8{ ¨C‹¸ïšŸŠüy@ ¹¸ã ƒ›rºEç'z|ÞFÁ9äK¼Ž{Ev +º†rês9ÄlèY?Q"˜ðÁ»v€H¹Bëbv„Ëú¡õÿ®ê pHÚËúsöÐÖõíÁÖ—ÚêÐúþÛ1”Â'ù$çb1eÖl|SÊDpF¦¡Ïî²hÛWóO0~Ö§/ÕÛMóíçû›ëÒ˜Bð÷mÞ0OˆHøìÅ”ÙGêArÂûñε8¦mµi;Åä…¿ @ùÁX,½¶–í€>ë i!ãj»|¤­;Ÿ(»«½f4DU(¯ÔO§yK¸ÉSBÖDÚ • :Ü@h!Êú¹mlZ—aaÝfN¿˜cø™tO·ÏGມYꀿª‚ÂÔ6.6fS¾?è娶LÞt[ãÃítðc0xŸbÑdtÉ:<ìu#S—e@¯ƒ ^ÔÒI 8«zƒÇ0%‘Ö¾˜+tÜþæ‰Ilr’ŸI…ŠMrmSbœ ñÖÞqM” Õ lù“€'Þ—XÙÚf| Ïf³}دÂzkãðûH—g@ó¯$¶_áÐôã¶ÌxÕ¯J™½fˆ¦<}MOü‰ )˜\œL†ì>g™ öd›„_Ué…j¹Mø7ZqƒL/ $žy§É‰B¡¤^¾ WEÁòo«bßÓƒœ‚åe³YÁ±ÒkzbFÃxds[ü­] Åp·=ó©º|R߸†ž ³‹J».ÏòÂÀC^¹(`ÍxvGOº¸˜J¡¬y92ðg…¶Á óè0Â]74l7Œ—àUÙ#ÞnI„vÆö¤smÔÐE%éáü*kð/ †b-JÇò@Cµz¹×ËD­^ô… ´‰áýaýEÁÆá$µNLìÀC{…5Ðîµ%x KqÙñFŽv.»;’鱎8TÃñ‘j8ÉÅf +k¸Uã[(Ï‘Îèäâ60ñå™»ÊèD¸iãDìZð÷‡ÂmÒ.êwFûÀëüº||¸q,œK*=ã$Fh­“¾“ Ûm®2³¢Á;Ãæ¸Œ¿³ëëÑ5EªÁèÖŽ´ð±üCè£@£2N‡ÿÐ[cga “X %ºˆFÁsþï?,ÚÿÕ•I VIÞñ]†J‹;`¢ca±Ññ¥ ÿSuTÿê*‹©endstream +endobj +1669 0 obj << +/Type /Page +/Contents 1670 0 R +/Resources 1668 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1674 0 R +>> endobj 1671 0 obj << -/Length 3076 -/Filter /FlateDecode ->> -stream -xÚÍZÝsÛ¸÷_¡><"ø"&OÎ}ÍMã´9wÚÎÝ=Ðe±'‘>Q²ãvú¿w ðC¢ä䚙ƙ —àb±Xüö‹”˜pø'&©a&“ÙÄfš¥\¤“ÙúŒOîàÙ÷g"ð$‘)és½¹9{y¥ì$c™‘fr³èÉrŒ;'&7󟦆IvøôÛ÷×Wo¿ÿ뇋s«§7oß_Ÿ'2åÓ«·º$êûïÞ]|8O„KÅôÛ?^üùæò=2AÆ›·×ßÑHF—#B?\^]~¸¼þöòü—›Î.oÚ½ô÷+¸ÂüvöÓ/|2‡mÿpÆ™Ê\:y„ÎD–ÉÉúL§Š¥Z©8²:ûñì/­ÀÞS?uÔ~‚3©Œ1 = -™1-¹œXm™±–,˜ÏVç‰á|ºYÌD&Ýü›.‚¿t¯™I&Œ{)L°8ðRÈpÿŸ×h P)‘Še¸{?¯£‰ÁèWWWÙ›W¯^f&®‚3@'¹$B°,M¥Ÿ7[•EµmÚäÕÓÁZý9ëüþ¾˜¦ü!ìêõsÈÅÇÙj7/"új‡É¯^-àï‡?ÿ_÷d\±f·X”ã\bIF·Mó_^ÉþÁ%`i+­‚9)ãV©úÂ0€¦oêzUäôýý¶¬«æž‚Y!Ì$u’q)Ä8SÒçòh(¡Þry0­VõcRÉ¿êª8X_(p #²Ó -´\#È>žUÆúÆ@…· ² v}Vð^äYžH³}q–eJÚÀóâGÜyrK×͹›îªm¹.húC™œ¬È8ãZé°è¦šÏZ‰¸àˆšÎ=ÓqF½!þy±*¶Q‡ñµ`¢PFô—"ræVfDxD•²Ìê,ÈÈ©ŸÞ, BÞ¼Xä»Õ–nÊfä,Œ_. ó«zì(‚"q‰c0Ö3­{ÅÓ &áÝv™Tçõ:/«K1 vjí–épñ!~Ó\êÁê£ð͘U­ÅO¡×õÐ+[ôr‡Ô$ œHm#$..Æä:–YnK„7·x²þš¯ó§@7Å–«+¸þûwïß]¼½¦»Í¹pÓ¢¹‡¸T4AÁ⡼傮¨¨Ò›‡bÓ®æ¡*´`Òº½˜YÕ7—A*Ûî =…;8Çz - pÊò¡¤jiRáy‡TçÆ‘* ®X—šO‡êëhm´.¯9]f˼º+hÉ…7H½¦'¡ôÊyE "Áß?Õ» ƒ,H7»¦¬îH˜é)Øò¿&µz5'wüîúG"šz±} â^ЭÄ:"¢*Š0o[‡iEôëmû`ÄjX„8§>®G=\;Ã|§]¼ÏuÜÇ[. -o˜ªfù¶Hê*)>ÂŽr•e -ªÓ:´\#J ö«%ÓNf Å á,Yû„Môcîœq<2<ê -TG,ˆîšÈ¢ÊoW! -Ï–ÅìWÜ-0Kø³-Öõæ‰Ø¡Xø5.¤£|<´Ç”áÌ!‡.Êãò®ªƒ[@Ä4ÐßO^…]Ä`ô}±µÖûó¼âÍqƒðOB]ïÇÂZïAÐt©†çµ¬qràÝäU³(6AD>£ìÞDÑ4Œ†Æ„3/<Ê|€U`AH!{å7ˆ/熿úvDFü4!fzK+îî–¡‰óÁ÷ýT\ :ÀŒæ@}tWVàó¸!äéŠ?Ãç'¤‚)!F‡Ã1„Ô…–yCÂæ¥FðÆª¶c­pxfxJh°TtVR†°ÞÀ+Y×<ÝÊ;§°ÿºšÁHáA•ŽƒyXÂo!1+ 4uäõPe¸z@ ±Ä·U‰Ž«åco ¨/½ïË).³yÈW/è¶ö "UÄêl¿óÃX&[/‹|³½x&QÒXäUÌ¥:úFSrº¬ï‹ÅŽê^¸ï6!óË×P¡@Ì`Ÿ>ÇCtÏWM(!šÝý}ÈçMkîÌAÍ/o4êuÌô‹½ -%ÁÔ÷tð_VöNÂó÷Ñøù]¤4ŠYë>³‹œ$Ò¦ÐL)¬gB¡B¬íÎ!¡»ØwuAr¿!–Ìé,6´m哹PKc8 ÃÐmA×½ í(Å„è5¢Jê ~l»æ‡²xÑD¦Lp—ö2º)§ÚêüH/¡21<‚«‚b¯ã^Ð9E]c:õC:ÄléZ?P H‚á‡`¥ÜÇѦœÔŽw«ú¶Å_u ¬¶Ÿpʸáy„ÓϪ;ý¶ç†èJ)$BÊ9‡þï/ë¼Ùú¦40=´ÈbŸÝѶ¯@?–>¶øQ¾€ªwÛäë÷7o¯þA4¹ào»¢ <> "o”Ó-³Ê‚§î§Ÿyʃ)0lkÞ†í ƒ×CeÐË»;¯­ ç€D°‚ñ‰´D—FºÚ­o#«¯ÖIœ”ýÙ^3"QŠ+õC¼¡ºÉsBÔ@ÚŒ¥ 2 n ¶«ú±mlZÈ„ÅúÍ*X¿\ ûé¬ãëâ@76K½â¯ª 1µK,óYx0ˆQm7# yÓo÷·Ó«ãêSLš¡º :ÜvºQ S¯V±z-ê”ZʶgUoÑ #^™0æÙX¡Rû bÉQy:c2Õv/Úf°Švnmý› ³áX€ò–€+¾/1¢=Wñ=,\›íî¶›…ùÖ¤Á2£"Mèö2ÜÞ¾Û­ò0ëg)u§VSž¿¦ëb"r^€8 HÆÎ}Ö\$;÷Þ”>öÁ år êʧq BƒL7 d ÃNí‘D!…dn>«®ÐŒóˆ„âã}Ùõô°NÖËçó2ø®^Ó#úc8nƒßŸä0õ‘Þ mÔå{Kõbñô\]dÖ‡|ð%/¾äUè˜Ë -¬y}¢+½y1e-“F?ïøY¡mpcÉ ‚épÂ]7D¶è5 *¿Ã·›c«s¦œ6ƒÕCnTÐEÙlÿü}Þ4wÆ|-eR¥bOCÍ[½´èôÒ¼Õ‹žP ­ù~¹çRüÖ]‡ƒÄÔ‚˜€Çö -s ÝkSð¦â´Ãì\ôw$²Cq,ª†ôj8’Í æ„V-¼…òÉFG'·Ž‰7¡«äGÜMiÇRןänI;iØuŽ÷¢{qvhÜ4eÎe±*=Í”RvûÏ]²Ì¼lðasX¸XÆ¿³˜õà5E¦àЙƒH—Ÿôõ[Y(GEš ¿~ÿ¾YQ^ì=ªÍã +qÆPT÷”@ƒ~Íù™e”ÝD*ÊzxßþÔs_±éô´™Ì&%£#\Â*{ÀÕųþ¡h+ñsݤ¯ÿÿf4¾Vw.û­¬ ”ørüÕUkdÍO9ùžPˆˆü½B?®@áŒo–Ç¡ý vDAÔ¨ñ:µ¾¬í¾(B±iÆ=c<éð—)úÄë5üˆÔUr­y:‹=~Ùo-ÕSâ+6I©æSá¯+´“§«…¡µF`uÊZ==¾bkqÎ 7úkqpºL=“ðŸÅÖ '$5Ò¯ÛXÎ1“ -uÚV™„úÍfÏ$ð#¶ú„xÕSâëµ”Å/Fœ¶”ãLºÐ6†’ù÷ì„'ö”ùRë~±÷ÿ(‚ð³‚3ʘB~½á“gõS¨ØýŠS[¨þœ/”¤…2Ä)‰¿"Òñ‡lüðƒWøEcàê©þ_ì¶Aendstream -endobj -1670 0 obj << -/Type /Page -/Contents 1671 0 R -/Resources 1669 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1675 0 R ->> endobj -1672 0 obj << -/D [1670 0 R /XYZ 56.6929 794.5015 null] +/D [1669 0 R /XYZ 56.6929 794.5015 null] >> endobj 466 0 obj << -/D [1670 0 R /XYZ 56.6929 636.8504 null] +/D [1669 0 R /XYZ 56.6929 565.1194 null] >> endobj -1361 0 obj << -/D [1670 0 R /XYZ 56.6929 609.3387 null] +1360 0 obj << +/D [1669 0 R /XYZ 56.6929 537.6077 null] +>> endobj +1672 0 obj << +/D [1669 0 R /XYZ 56.6929 101.005 null] >> endobj 1673 0 obj << -/D [1670 0 R /XYZ 56.6929 172.736 null] +/D [1669 0 R /XYZ 56.6929 89.0498 null] >> endobj -1674 0 obj << -/D [1670 0 R /XYZ 56.6929 160.7808 null] ->> endobj -1669 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R >> +1668 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1678 0 obj << -/Length 3726 +1677 0 obj << +/Length 3321 /Filter /FlateDecode >> stream -xÚ­ZÝsã¶÷_á·È3' LŸ.ßÕž¯ñ9ÓI“<ÐeqŽ"‘:û×w @¤DÉÉ´ãñÀûõÛ%Å5‡?qm4ãÊ&×™M˜æB_ë+~ý c®„§™¢ùêûÇ«¿¼WÙµe6•éõãr°–aÜqý¸øeöîooÿùxûp3—šÏRv3×)Ÿ}wÿõXúy÷éþý݇ŸÞÞdÉìñîÓ=u?ܾ¿}¸½w{3F ˜/ý -g&¼¿ûÇ-µ><¼ýøñíÃÍo¿º}ŒgžWp…ùýê—ßøõŽý÷+Δ5úzœ kåõú*ÑŠéD©ÐS_}¾ú1.8uS§îO -ˤµÙõ\%̤°Æ€ê„Z!µQpÛÚ²TIo[ÊÁm í$½ÎTIânû¾íK:¿Ê{j5ív×Ô¾ÿôx÷þgjo¶7ÂÌڢ캪y¦¾ª süä|‰D˲èËõ<½à3bÀŒL4KlšÁ E•×»§2--3Yf<;‘g\ƒâdÎdD2­žh>¤¢ûSÚ¨pÇeþ¥œW¿ïÊíËñÞB&RÒÅÍ#ÕÄî#é$Š -Æ»ß5p…Fõ7É̼_›€´ÜÍÃX»é«¶¡Ñ²ÉŸjwï0ÐUë]÷$*xîW%QµO][—NîÐýÃýgjÐ!Eÿ²ñ£w?þ¶¨²ÙÏ7BÀˆ æ·*¨˜äN+˜ÕZ:æ›òk¹%X´¥×“Ázî90Ù6ge›¦–e™’—e;¤:/ÛHåd[öÅjþ\ïÊSÑr˜ššË{Gª‰ÍG¢U oxÜý‘$˜šƒÓlû¼ŒàÂUªH Û_<´@œµ$f¸“«2*õæ28à<å|öR851“2¥Ñ¹9E¾ëœÁ¤1ÀUWnI–ØÙÒoÞ÷åzÓAèt;’J@73ÊŽu‚x‘ÖÌœ/)»vçŨ·hÝΪ§ßEµh¾óíUþÕOٯʆZEÛtýöÆÌv…×zÎ|±¨ðžgÃÕò>§VΊíí,±¹¥K§¡pMþDb(Æ‘+ÜSù©%-áaî}bîŸaÜwåï:‰u“†Tõç F€¾qk^1˜Õƒ TxÖ_9W»n5ÿO۔ݼmæÝj×/Ú}s̉ä‚ÉDÚˬDª ^F1€CÂ13ÿrrWJ‘ˆ•’³&_—AUq üVõ -v%õy +«¯NEpìóÝß?$ µ~¥EëwÀ07¤rªn¿ÌȱªçÍ‹›e³ˆñ¯ŽZûmÕ—Ú·à E¾wQ.ó]ÝG:œ"˘*ñözQ&ÇîA–ÚDø©M;á Â^ ¸:Kç"½¬cCªó:©pÇU§¨ó¢®Ê¦ïN<³þ\d RMp0:¬Ná´VŒY “VY=3¶÷¹ï¬nĬå5©¯_|ÿzS—k`mÝuø™dÐØÂèðŒlÝ‘„5Ÿ›6ú ìx‚M^ާ[ЖԘÙãÕ$ÝK2Æ…GºW¬ª¤°œÌ°Ö,p|*#P£gp|Ê& K’Ó&„s¤b©§/‚rN‘1«dX —³nSÕòåˆå~ßR£+7ù6ï}7ÉeÒ:WB&ô7ßõ«yómÑ®ójÊ" ¸ -Æ­ûôi¶%g‰Œv‡"œØÞB,ÍB,Ý. ©¸™#œS—%™‰w5m \¿¶ž¤‚øVæ‹óF ,Þ|) ©.e rro»~Þõ€Óº¾*N232ir™H5ÁÁØ(Ai–Yp2ºCttPz<†Á_ ¿”寻]AQ~gpDËvë§~%ð M<ì8%E`,†ã— -˜ÚhYÛ¼ ‹›”ŒK‘•j_õ+ïíïC²4r®£9Ág¥d†Q®w^Öšó’ö4È#ZIÿóêÛÒ¹£ùSÞ¢c0r›&—$Ç ú¸X8p*9 bhSŸ:d.(Ö0qãÖ\I1»ëi¾óÝØðØ—ôK‡›†ÔŠöpP°Ïv]Q¸Nf‚lé!§Ÿ~›7ˆ|udµnŸI „–È‘:ÒÇI"@=v†é 4îš‚bj„ƒ©Ðùo G¯Ïg¸ãØÈwFˆ%þ@jé'Ño”ÓOà•…dÔ5@{„ O›²{°"¿úÝr zÉ_Ú]€¦AséÚÀT!=´»þ¹=Ô -NÎ7D½?[÷†žw]9U8€ -œH¨l¶íWÀФ°§VV2Iú:௞D&L¥ /ÛÛ€ê‚Å*gsUS­óz¾õYÆ©wÍ€CÄ—YˆT<ŒƒoÊ bÀwˉ˳€3MúB¹„r¡³tÆ Cn­gбm(Fèt”WuDâ}¬xVX¡ªkšÑ6õ õA&GÓlèHË廹‡é€ñ¬=ªRô«€8® ðžr0%ÆÉ"¦”,*’ÅŽúý•‹ab‹º©ýû®:d@ò+×¼dÏÎÆÐÓÔ峫8ÕWÌ -Ÿ]† Ô£»‚©‚MÙä!]ç/1¼PÉîk¬ñ•!'Ù.±Ê×ÁR—G^Þϼš¢ŒG‚=(®“ÿCž¡2Î4W¯„¹!Õy³‹TÎìàDßyá²ÆÓ'˜²R_f RMp0:lš2•)3fÁKÌjxЦaÓ« «òCÞÕCˉÓuxÌëÚ°I?ñ:*Y 7Їꉎ×@”ïîß~¼%cÌ(‘˜A uìÔà¤"}­ZªäQ·Ó(è&‚*4B€°f‘û5œ DX£àuüÍ>m”×ûü¥ kl+J½p¤l–­¯#uG»ŽtT¸q…¢ˆŸÚ~5†`ëÀ¶/»@’-#i,Ô,^àf«ÂG« øÌçÏ)²HYª¬}E‘T9P‘uõ˜7ë¯,Z]Þ7RMl<6ÖŒ¥6MÇ;O ÁÄ{1jHÁ´Ð&V04§N z9¬Ç˜ŒÔFi_E Xl—?£Dp$z\ê\P‹œ³# ÂØ¢ý`$–‹R*à9êrÁTß¶LËäË9সš«¼faáë1ÅRèÜ=KMâ -]4¸}¾¦ÆÃP.~>œ0!—“u‘¯Ï¡ž‰¼%LœTç‡Ùš7§Õ¹@õ -§«yž¤†‚²1„Hòã½q¸_Å!”NG5$n®<•?]¤DÑ~çWw -ÃÕ‰·"XI¥MÔ‘csù[á0¹RI()&Ñ `ûPZL°nÛôúÇ’¢„b4õó§·Ôøè\kº õ"¨7¢“ÆÏw‡‡_W7âHx€%²$j -CÌ?4GŒg3s 'š, 8‘.lîÐÚé~©f™Ž5WqµÎƒ¹‹Á³Ê¡v@ -G°»½žHŸ1aW”tº(¾ì•ÉÏ„op ›—ß6uUTý—IÆŒäÙŸà2ð&#¿J¾'tŒå¥‹Á#ðR{à¤Mi‚æ‰RØ]¦3êQåœ@TÕI6ÈŽÑMßRb” czÞzÄÁñš\´ŒhX“oöê…EýLÈ ^Ö#¢É”³TêdgΨq1Òe8(Àˆ±—D­§’~]Ù1š±ÇZ80m\XBÄô›¸€2ß4ÓJN°æäR^,þ*wدªbEÍ«,®…ïºð ûv N¦»Ä $ìŠñ$㸪£siìùëJ3ô1‹è¶eJu˜¼owõ‚š>ý2Æ][¹Ä/rzgl [Âp¿Û6~ -U˜ý°am/¬Í¬ò£•ß0¾}„±®”ÚÅÅÖÓ#C*¶y·: »D†…(þJItHuvEªƒÎûvÞµùiA_æssyûH5±ÿ¸l˜@2b`Òz \—Á:ú6|¯%¹ñŸo@£X•ÅlZ¡q0¾Vë¨ÃAdnÙÃïÃCWö4;ÆTDèb"6\Ld~¶ûÞ„â¾K‡ø,_¦ª_£ ï'DA•‡ýtŽ,0pzyȤç>.cãìÿôp÷áîc4=ç~ñªoÖí6›–Ô×oi¿¢m° HÙ—TÁtã²OÊTJ‰’J=ƒ*›aJ¶vï:°ÛǸPðÓ³Ïíº‚’Šv¶j÷¥OÕ}ON3QÓ± K×øòÊÇxt';lú»F¸E¯±xU-ôL¥R1UÊÜKxt§Ï»m¼Pæ_xá°[,3¡´Cäû°ªŠÐÜôís'Ç,èP6ºèîíD]OU£ ß퇽îLˆâ€M‡…̼®J"c;8 -Ó!mŒÔÎ&ð“4´‰óþ‰ %©~Å? ¨.ø§@åÒÛ²Øm;t´Ç¾IA'qqëH5±÷øÛ à†m~&jÃÿd9Ñ% N‚VRiCø:<‡–¬Œe¶²ë;¢òàŸîàMÌ+¢÷_…ÈC­¦øZ#î¿m±ÂM$ùJ$*qXdßn¿xÐŒŸüMWMF5@Nx_B–’7ÝÞqÀ“à'´ðÅ•uˆÖ ŒŽE 8Û†¡C¸å‰¿´!aO<)Vé3öŽ&Ô´t¾x¡‘/ôË+Ϫw4BÍ=Û“¿G¾žñˆžóa÷N>" ŸÙ8aQ½ÆõFx˜¬7•ãk×?¡ZŒ2Dÿõ£ŒþHâ·N}?¸@sŒ/wRf)kˆÇY&b°¥êT·Ð ú,¸ï¦÷É‚ÖLH}ôB:¼oG¦gôf®]ÓÓ³gÒP¦>!ò¾óPZ~×Ñœ"‡˜ÿWÇz"ó`ZýöM¹¿¼ÙSéùÑ´ö‚ÈóîܧµJ³dºÀÊc™øþìöðM2dwÊœ{ù¬ -1Òf)¼ýô¤‚¢•g&³ Öÿ r8-endstream +xÚÍZÝsÛÆ×_Á·R3Æ÷}÷è8²«L-7²24ÍL‚"&  dõ¯ïîítwÆ£ÑàpXÜííçoä³þøÌi–J¯fÖ+¦S®g‹‡‹tvÏÞ]ðH“´DIŸê»»‹¿¾•væ™7ÂÌîV½µKã³»å/ó7{ý»«ÛËDètnØe¢M:ÿîúæ{šñtyóáæíõ»Ÿn__Z5¿»þpCÓ·Wo¯n¯nÞ\]&Üi‘Þ^ÿýŠFïn_¿ÿúöò×».®îº³ôÏËS‰ùýâ—_ÓÙŽýÃEʤwzö 7)ãÞ‹ÙÃ…Ò’i%e;³¹øxñc·`ïixuJ~Šf¬7³D*æ ¬ñÛJë™ãÚOo›ÎΙ×úÄZô^ +kÅaûÆp©„ ˜O%Œ¬²À¨å~…èé— Ç„…u¬æLÐ=*xYd›Ý# ý¡Zæ—‰tJÏËjûmhz{ÉÝ<_Ñ¥^EÊå|gÛ&ù”gÍ*n¥Q•US¬^Õ +FɤHõ¬‚?'”¿âVý-5³‚û½ ù¤ ¥g2…MPÐe…§>Ô ˜1·°Ü]¿ý™ÆÝT‹tXÞÓ\QwȆÙ +‰Vù¢É—4ó©Ã}+J3åM«ïˆÃÆf!@JÖºHÆFˆ8e©°®=Y#åt‰’>ÕØp[tÝQᎫì·<)~ßåÛlãÒ1n¼=½yG5±û IÆ5î~]‚Ύ¹{W¯@[Aòð¬zlŠª¤§y™}ڹúxØm²†T÷Í:'ªêS]mò w˜þþæ# è¢yyŒO¯ü ꀲ?_rÎA~4”@ °@Éлè|8Ê·dË*vÒ[/Ü·LVåqÝjðŸTŠ3ºíQÐmKt›7‹ur¿ÙåcÕ¦ð* £“{wT›T+1<õO‚»ß‘ÛkÐØy7u—F’!Àt<ŒÀ‚·(×ßIƒW9i¢»ô˜˜4=‚!A”)ã;‹lW ‚=Èb€«:ß’.q²¢kÖ4ùÃcCídØ‘L¦™“~hÄ‹ð.Luµ ƒÅ`vQ…벦ɢ¡ë²X–‰ãuö_y^ç%UY7ÛK7ß-¢Õûö 0È–Ëå"®–5jV¤¸©VxõólÀæ#, í¯=5Bá3 Ÿb™Ó1f1&fñžÇ©¬ŒS£þ¤#ÍQ‡Q^c ã´¿ôˆŽ»KKDõY*wõ:ùOUæuR•I½Þ5Ëê¹%÷ÀA¬•KÜïò¢Ñ=„¼ c¯TÐ&”s`bÆA¸çªWYO˜Ô7X B™TÌëÇ|Åúåæ¹¢A?fÛ¬‰Ó¤—IïDéoí7Û5ë¤ü¼¬²bÊ# ­r–ú×f[¤L‰ÎïP…Û{È¢¶Í¢ÛÕBÈÔ%¤ø”°€uÒˆ˃@R@f˳åQ§”ˆ æ´Sö©Ž;eGô^ÕMR7€Ðê¦XŒR9£N3ÐQMp0tJP…±vÈBÀ>š÷òbÁ0A0ŒøÆÔø[ž?ưË)ŸÃµw†@´ª¶ñÕ'‚½0ÄË!ñfaH1q© Á=k›-È#À'K·C£z.šuŒö7m™4a¢eÿãÚÖŒMè3ÚîQÐvK…œ¢¯4🟩•|Êê1:W÷Ff£%³˜°$`c}ÀG ªÔØæä¾~™À²Ži›ú.‡%RðùuCï‡8Žƒˆpqɸt+u(°hháv ûl +JÝ +Á&Ä–n2º4Û¬¬Á nw¬nª{2®r$,"p¢8˜j@Ð0"{„Áu¹ |€ÖÀ*Lþ‹ÀƒJ1¤sÜqlXÎy%H=]ZUÆ2º´¼£0Œ†Âèˆ3á<*®~½B_ó/Õ®¨­“ØÌ5:$ÝT»æ¾Úw F瀣&ž­~E÷»:ŸjÏ  ´}ÇmõHšÌvm5à&§ÌyðÃÏ( —öL-Ú§:îyUð¼¢,²M²µÆ8ÒZà’òi:ª †‰Ø0‡xpÀÄõjBx;Jæ Òºë¥um1pgÐm…£{°±mÛ’ÐfP]ÕDã­îEYX¡ØlèªÜ¼ÐÔs4׌@G†Ø[.Û%²+Hû^²YWÊqe€úT‰I>,±” ’Qò¶d¬i>P†lÑ.BlÑ4ßûZHð‹WÎîƒa¤Ùä÷¡L_jp+¼u.Pd…_ÈØ”OîËчì¥K5Ô¸{ê:}y[ŸlWØë+­§®(¢bœ9[® G8ìvhõj¨™ßõN¸]ê„ÛµTÁíàdâd*Èq¦ãLzHJ'è¨&8Ö&­tC¢Æ|¯“cÊÞ´¹ +¦Šø(†z9" ¶·ÙfZ8¤KD¿*â˜méÛŠîÄ@”on^¿¿"g*I ¬¦ú66v8!‰;!æOEEý<šÓdQ0AíF˜@V.³¸FðâÁSˆ:qò9l”mž³—º]c[P†OòrUÅnR}°ëþHí›Ð.ê㧪YáØCÀ;6_ ài×®Y¾€d‹EÌV#°¶?bÈÜYfS¨ªNrŸê¸!wTÞûå‚Y®åé};ª‰‡Îj™ñÆ wžL€Ù¦®’£?Š,aU—¨) ±˜â£ûÊ»S8ÑYÛâDXÐÚx?ƒ&ÒõSB÷Õ‡ƒg}뀎`NG;±b©N;0š¡ø3;¡ŽD&üíœKÛÍóÏ›bQ4\*ËœHíÿÀeË›èøå¨PŠö?tkŲe‡†5Åæh^Øß·\´æe#"š,ùRfD¯gv䌒Yʶ|‰}'Ä8@!ÑèSN×ЂìÜ8b-|0í\ X@ÆŒ›„„2‘ß4ÓR¶œ`ÿ)”¼Ø–¢Ûáy],Ö4\`¯%Œð‹^²o·dêSÜê”,ÅŸ? L«í”&Âùãâ2ÉÕ!‹¶…¡¾ ¼ü\í6KÆò˹ º°rŽ¿Èè˱'l ›Ý¶Œ¯P·9>ŽŸ­}ï³µ›ñi7ì¾A³z(µîVCLN»ØfõšûÁ¬ÔLMŸOgg ó¥?¦ÝÿÒ"‡tîHé-ÁäSL!÷f”µtL;a'Xÿ/L÷Ékendstream endobj -1677 0 obj << +1676 0 obj << /Type /Page -/Contents 1678 0 R -/Resources 1676 0 R +/Contents 1677 0 R +/Resources 1675 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1675 0 R -/Annots [ 1680 0 R ] +/Parent 1674 0 R +/Annots [ 1679 0 R ] >> endobj -1680 0 obj << +1679 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [182.6146 300.8791 231.8861 312.9387] +/Rect [182.6146 171.9458 231.8861 184.0055] /Subtype /Link /A << /S /GoTo /D (notify) >> >> endobj -1679 0 obj << -/D [1677 0 R /XYZ 85.0394 794.5015 null] +1678 0 obj << +/D [1676 0 R /XYZ 85.0394 794.5015 null] >> endobj -1676 0 obj << +1675 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1683 0 obj << -/Length 3742 +1682 0 obj << +/Length 3852 /Filter /FlateDecode >> stream -xÚ­]sã¶ñÝ¿Bo¥gŽñA|tîìÔž¯µi:Ihв9G‘ŠHYq}w±EŠ”|™Äš1¾–ØÅb¿°_Dðã‹X3Št‘¤ŠÅùú"Z<ÃØÜÁ„(B}ÿxñÝL)KµÐ‹ÇÕ`.Ã"cøâqùs ™`—0C|ürwsûÃ÷W—‰ -o¿Ü]†"Ž‚›Û^Sí‡û«ÏŸ¯î/Cnb|üûÕ¿¯ïiH»9¾¿½ûD=)'&½¿¾¹¾¿¾ûx}ùëã?.®ûµ ×Ë#‰ ùíâç_£Å–ý‹ˆÉÔÄ‹=4"ÆÓT,Ö*–,VRúžêâáâßý„ƒQûé,ÿxÄ„Ôb†B h8‹Ó4^$qÊ´Ò20«aI2ŠÕ%7ÁªÈ;lë YQ^•Eíú~Û—<Ø–E ü’‘>fùKY?ä:{£JÛ•UåfÉóÝ–z³Ö•5 ÆA÷RÐ@[l_ ø8þ7÷MYwŶÎ*j5›b›ueSÀv´»ü7¸rÎÒ8´´–vëîËãíÍ©ž-—[Ä[´n°jš¯»]‚‡¢ppUÛàœÀB>`!ך¥F(@…VE—¿„Ïð…`‡ìV†)n¸Ížš×‚Mä…³„s½H8Ì+sb (BÑöò9ýðPˆv»Ê…ŒLؽm -~Œó„E\Ëóè{¨üÃõr¼O=&à¡è:+"2J`ËÖÕw•Ì Kt;޽í WEú Ø[Ià ól×KAâé%É!´e[ÔKªÝ=PIò7¶\¶ôiV5žè}Ù½Œ&N‚‡/W6þÖ -aÈ…f\%éXWÍ–$«.žAx_½œÕí¾Øzñ{|qÝËb•íªŽe;Ã+JœðÔ‹WÝÌðÊã'‰ðy{ ÁŒ0ú[¬•4Öøšyk¡Œ0éøô\ô]s¹ªÿbFLÎV&iïl±Þ÷v¶©`’­NôñDÁ[³£ ê -5Ô¬ôC¹,ÛìÉJ=4nº¹gTl²-ˆò®Ê¶4akØtl&žŒ‹½‡šA?öð NŸ#ü½t‡ƒ}›o˺4«EL õ‡TQ£cõÎ0-ôœþyøw–<÷[5PqÆ“á^Íj ‡z‡Œélçe-Ñ”êQ;‘4dƒªNTm7/hàp —â,êhŠ{,fp¶Š5@þ×HÙñŽ¥ ìyZÊÐ×bºs@ÿ9!óàç×;™õ[EL&̈øüv÷@çi˜ÌuV¾$DÛʨwrC¨ÓÖC!Æn[d]˜Ó),kÃv“åÅôdœBè“òódôP3tŒ¤M*‹(ⲊÜ>Ô÷™ëÜÙ‰P%¢ Ç%& f¨ÀËuöµp=VrUt8!c'eW³Žšy¶Ý–Ù³û‚ÆðHKm<ÿ"„"Ñ…ÓâÐGƒÃ‹"€¬gTN¦ }^fÄ_2“Ä~ă‡EG×K¶Íòâ0i4‹ â…aDn˜‰ó™€$ Úl]P×Þ^›@Å2†2jÒþÚªMÃH—=Q¡„iñZ -oAŒ$¦ÂØ*Ë˪Ä3-µ«&[Ò Ì`ou “NñX£#”Cm7I¡âǻ۟¹oph[/YèѽÐþÀB(CPP빨ñ–†dÁå. ;såÝ#•viP~úò@•µ½R*ì“ n¸!¤¨|j0+5G%ÔNí?O(Ùùû_Ïì?ìªéS[ÎÒ¯ç;·„øIÌàØ•þA)¯d(…Ñ:\.B2påGLJºØWeís†Y¿½Ç¹ÅÝ /< „RóæHUìhŸj7ξAßð{ã“üi`-ø/Çä¿ ¯mÖn´-»]æÄ>³1M]vùøî†`¾Üb&ÉÞ&Hzî_ŠÀa]ƒ³Ò0@S ܾ¼Ø:˜Æ]AHO2ŽoÝMvW»+I;As:(\˜#¢qS”nR—ŸêéqTÌ,¨­¬‰úÀTmÜãè{rc .vµg8ô­›¥½Ó(\ûévhq“;?\uWòÀ&ÙèÕŠÖÁUÕ6(;e¯Mé¢#í·P£D’°Œ†6^ÞÏÆ>–ÁFŒ…Ûp/d0âäúÚMbçnCeí~xÕâ§ì¨$¢`Ó´miŠØ]ü¾)êÖ Ù­š!z+=³ ^sÝk˜¦ò/öÐa­ÙUΕ[娗mѫݒ`vbÙgÿƾÿXí²™kâç JU(~ÏðV7)ÅXa¯A³ˆƒÎ,b5k¿¶T[ѧƺ;ìøü•G/4,ÌÊãyiÚÎÙõÑ%’”,1©¿ÒY5 s±¼YÏÝP¥Lk9¸õC²­Ø"Ë Ä;¥ ßy8gB Á˜ŠåQ0vˆ*ÕɈ­£(à•묬zÒ뢛»š’œÅQŸÞF,–~¼‹Û®éò§‘_ÄÑ *옼ŸÁNô"WîZ_\Áy;l9:f½— -q#g´Çˆè’8Ç¡j7ÿX(:ì‹SEw†å‘üB5©xÇUTò"?ìúZ7ûÚõ¯ÖâÚ;®f÷Œf‚[{úæ¦é­04jûnÃ]w /†•¡TÙ´ˆŒƒ8eírd~l#´8D0Kö±Ê(N“¦Væo)ƒó¬Ïé»ë‹–8S‡w½}”‰ýÎ6K{–ïa êëÍRX[n{‡ÆU¸—Q0020àŒ¨–.ÝdŸÏh!O×ÞÔ•²½®¿o˜5=>Ú–r Bã JiŸ!ÖVT°eéÆÊ®íDZ‡Ú— ,!-‡÷82&/нô¡ýW2x-‹ý Â,þªƒsù¦Ã%Š˜ŒºÐ¶Ú{'ë†f®†#Å)ÏK:ùáÁ -¼›Ý^k³ÿ€ªIŸhÌwÛ–>˜d)œœØø±â°{å‡(iÛÅàQÅ€‡ÓeϧH˜´Ž“£pø >ÃókÕ<ÞÂì³mM±4Ö`ÿ²çbV˜ÎqCf¸ö'‚ùã&DºâÔK‚„qÝÛÇ,‡h’xÀ•U^ ¡B,SÂÅÖƒ‘¶ÎÕ~:RLå™tóÄ“g3…—®3'á¨ñ§ßC‹« š‘§óÆ -ï½<ºÙ¬²ªzFng‹$N˰>Â{>3€ŒãùõçÛ«ÿ¥:ðÔf}”-•4¨´EíkjÞ5ÔB<@…x€Šçª¿F&êÛ?ß\}¼º†&Iß#/»1±v»^7m±dü ÑË ,ç™_$¤tqbÑxF¸¨ ’ysO%1¨Òù¶êÊUÖq÷*k»bƒÚË¥"3ÿÒ¬ +(ÚWàæÍ®x"nÉhd[eOŒÄ³ ¨«X|Kúô3Û“Nxm ÖÇÖüX.—E=ž ™fq§§ÿkÅÛMÖ•MR T/©Û#KQ"²Žºò¬-¨í¹ÙRe×—ÛŠ‡ì2¿•i£t´BÐ<$ïw Ú®¬*jQ`L,>»ÁÂÔ’1óH Ì< +lð„¡2Vh¨J^M¨û¹ ¡½Z qDµG–‘ÍOb#á"Ðï³6juÚFõP8©M‘o7-lÂ!e焊âô<å4Ayd"-b«Ç”'“ÆFæ¬q’©p*¶ ó +å=fÙq±k'çïü²Â÷ïÛbóLÕÍ¥´óÚ®%(já`L°15ÁÓ9´¸™4dG"ƒ”º®X­;jöÒK.I*°# Ù5›¯d¼ º¬ÔŽ…+0WRgiB)˜^»ó`ÙIÍS“R¢ÒÇNãŠúŽÑ´×mè;} G‹©=Ê~¦P_6^Ô¡› ? ¨u¶|¦ž¯u³;àŠYeC#ZÄ eâuŒ-sÛm75}gÃæûb³ÉF€í F!h³nÉ^Ûù²¸Ï@áé£l'$ –\(“Êo­”a<®§c*lb0Eוõ£j™•"2 ëÑzyu3Aâ4íãeƒ¿…Êšfþ„îÊK2FÈØ¨±…Í« ¼15ó{?¦YÑ׳ É|™uÙ[NÓKìáßZ“gàôÿukÉÅXSWÏT0ÈäëbwžØ]Áü½$ð¬–Ì{âॷȻ¡W4ðp‰ ¯¬ÁÁÔ^Xá«YäÜØÝ¶Ûüqrjì#ú¨]ÊrɲHÓ|Ý®ý„d4ÿRÁõ´Í„JŒŽlDð¾èòÇÅCµ-&dO[¡e°¥Ù]óTœtAÆEbwÞ ¡N» ÊëÈ}«È.ºçu!ÃäTD2QçÉ÷PôGúÃÒ»43ð%h‡ŠRØb´•¾ÖL˜‘D‹4yÁCAøì¬ ëO–æÙâRtAb‚¾¤`kèŰd‹ÞørÙÒЬjÓ»²{!N)JC°ñX2 2N„Ô©ûfÃLñ²ûÄÌ[ô }·!pÙ›\ k&M.œERÙŸ5&_Ð…`q¶¬©qÎÌŒ60N¯ßp4TÖŸtíôÑô/•"‰s‹WÈ1ªEàn¡S-Tò?º^ËÁ'¤BËxfT,R•Rüs=X “hI’˜ 9Ÿ/‰œßÂÀ&2=Ï@5ÁÁX׌°¨jCNœŸPÌï=?…ý3ƒ³ŽéÏ:ìUEA‚„YûX8ÆsRÉÇã—©%˜>ÙÖ5ˆf]ä%¦rŸ×ñmx +ðFqñQÅ;,ÐèÔÚd;!5•ø3qáˆÒ¤–»¬õÎÔ’|lÅ + +bÅõ¯ÁºßK:Á8pA#½  +æ~YŒwâÔn61nl Bû‘MpCkÏ”Eœ(ïl¨sóÀ^ýfh]üb8`ºᥠ8ßüDÀ‚‹£à<Ö +äìÍÀ‘•ë¡^àãÛdH¬¶‚ +èõyÓ>„:mÚ{¨Þåþ¾æ0#ÑžÃÒYÂè˜ðÈÛº=%Ç„ÉÙªÔõÎë}Ûigëb¡äÐÙ&.õÙ e#ʘ"‚ºðB 5/ýP.Ë6»óRW?¸wgT¬³ ˆò¶Ê6„”_ÎùÔŸxh@0Ny‚2j)á‹Ñ†Ô6"›HU¥¬ï1³¿µf È®ˆÆxžëMóT.÷{u¨`)æƒM…/GÉÎŽÌÚè™RNè(Ž_Ь¾ÂOô!Ö ½Š…´‡Ü(°þ`Ý̈#Ië¡^àâÛ·•XatôÍËÒÿÄÑÞ£…ÿè@ €8â…Ué¡^àáÛycQ´vÉ ñýꌱ PSB<Î}€a¶ ×g©÷PäǤ1Sèˆ~/Ýþ\ßæ›r .Íý„"ºTD±þ.ULöáÑ¡úghF=§þ…)ãýV ÔRÈt¸W“ ^`ãÛYY‹ÓT½à؆P§e­‡¢d´¿ü˜–µN²RÅç©÷PäDz¦EŠÚ5¢ÿ×ÈÚá,e ¬°yZÖR VŽ&zNÖü S>Æû­²¦Racó¾÷P/°qŒí¼¬iô’çemuFÖRì6EÖ-r:‘eí¢]gyq|Jv9yžj‚‘Ð)-L™1#œÁÐr@}—qã–îæ5ßÌB ') f©ð—pP®²¯·xùÕÑþ´Œ|7ÖÑgžm6%½=Ðr|Éßxþ5Ž5 0œ‡þœ_…Ãd=¡pJ- ú0¡JØÔ H‡* _Ù&Ë|‘d^Evtq&û»ô–"@ÓÎ_ ÐM ÝÚÓ'í¯¯ú,2ôtÙ_y’ÝþVÐò‹ è»Ïò²*;¾§OæU“-ùf(¥ûh¤=Öè8Ťýf"+Tüt}õ3³û ¸ÕÔu ßàÁùyGÙ‚‚¾ŠïkH8Í—×·Tú©Aùîóª¬üå]GÚùƒJæî•w &è±Æ\BíÔþË”Ÿß¸ÿõÄþîÚ>áéðt–a>¯y +æ©*•î;¥p<“¡þEó༄àÖõ8/Q»ª¬Cþ0ë·÷0ϘçÅvúU¸ÝX8¥©LgùP7|3Ò–Ê—Jž·¥C¨Ó¶´‡ò÷rËe‰,eÕâ~Ó¬Ù¶{|Õ_Žºü]ê‘Ë3àšReÏsØCM°8>ÕøÅ—cCRÈi^¿–>ð¥em1!ãø­öÜÙSéOÎ?Lð%jœ/aŽÍ ÞCÑÒÆ"2õr-l‚uŒ |»¡cÉwVÞ`&“K” ‚òy"¬>úÇO~@¿Ôƒ9M<Ê&Ê+ý{4¿oªªÙõØßÒ;(¢»œ2;ïø¥ìònEe*¢¡ÿxJÆl.°æ×Eú\"%Ýä`}¡½süðë<ôÔÕ¥L#ñBn8–"R.(=:)NÅ!ÍHŽÄSö—”’Ò¯À'ì±¥dæø’Ÿ Û`qyØ>™ïû·ì’¤Ãdå¡ÕÞ‹Ø,2ΰœÈcFì%pû÷eýcè/ëðf‹ýwÈYàœ^ô åÁGªDÑÉGñªoìQ\û„6´s +:î&_øyVQÊÛQâ,çI}SÈ­Ûáå´ƒ€PšÞ¨ŠïíÓî6¼Œr£ñá™4{‹þKCþ ÚÚfŽmÙmû7z~˜·ˆÎq¦ùð•ß¶†¾Ü`V齞ñèM”©Xø…Uo¥?R‚fؾ¼Ø0LÃ×jÿ”*o6|©ÝÕ| h'†¯¶üʉ†Q”õðEמæbbƒÂûÈd¿¨‰åg$ÐvÇ} .~“°àжj–þ~£àï»gØ¢EÄMîB¬*ßÎ{Ÿp£÷+I2Sµ J'ÄNÙSSrt”„-LP"É +ø…†o¼ÇŸŒ}üÛx,ÜV!ƒ–Whk×>]ˆÛ5•}´kåþ}K@ÙQILÀºiÛÒ'±¹øc]Ô-wù­:b#î­ô„\Íåw1M'ì( ÃZC¯AQ+Q°ve[ôªG7…¤˜©8õóPíYÙÅ©ëÊ=öŽú+•?ýš}ÿÔ_§BYŸ>j H˜)ÿÐ?>ŽVÐ $ñëÿû·ËÖendstream endobj -1682 0 obj << +1681 0 obj << /Type /Page -/Contents 1683 0 R -/Resources 1681 0 R +/Contents 1682 0 R +/Resources 1680 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1675 0 R -/Annots [ 1685 0 R 1686 0 R 1687 0 R 1688 0 R 1689 0 R ] +/Parent 1674 0 R +/Annots [ 1684 0 R 1685 0 R 1686 0 R 1687 0 R 1688 0 R ] +>> endobj +1684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.4479 381.0878 244.1386 390.5173] +/Subtype /Link +/A << /S /GoTo /D (statsfile) >> >> endobj 1685 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [180.4479 508.2615 244.1386 517.691] +/Rect [265.4578 335.5966 326.6578 347.6562] /Subtype /Link -/A << /S /GoTo /D (statsfile) >> +/A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj 1686 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [265.4578 462.9269 326.6578 474.9865] +/Rect [367.5441 335.5966 416.2908 347.6562] /Subtype /Link -/A << /S /GoTo /D (server_statement_definition_and_usage) >> +/A << /S /GoTo /D (incremental_zone_transfers) >> >> endobj 1687 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [367.5441 462.9269 416.2908 474.9865] +/Rect [280.9692 304.6906 342.1692 316.7503] /Subtype /Link -/A << /S /GoTo /D (incremental_zone_transfers) >> +/A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj 1688 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [280.9692 432.1776 342.1692 444.2372] +/Rect [277.6219 273.7847 338.8219 285.8444] /Subtype /Link /A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1689 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [277.6219 401.4283 338.8219 413.4879] -/Subtype /Link -/A << /S /GoTo /D (server_statement_definition_and_usage) >> +1683 0 obj << +/D [1681 0 R /XYZ 56.6929 794.5015 null] >> endobj -1684 0 obj << -/D [1682 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1681 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F62 1352 0 R /F39 1151 0 R /F14 956 0 R /F41 1208 0 R >> -/XObject << /Im2 1341 0 R >> +1680 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F62 1351 0 R /F39 1151 0 R /F14 956 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1693 0 obj << -/Length 3806 +1692 0 obj << +/Length 3822 /Filter /FlateDecode >> stream -xÚ¥Ërã6òî¯ðm媈K|'OâÔîdvÆ©’h²¸¦HE$­8_¿ý_¢šZû@ Ñ~CêÚ‡u„žoÒà:N/ôUx®üëGûþJ ÎÖ!m§XßÞ_ý󃉯S/tt}¿›¬•x~’¨ëûâ×ÍûÞ}º¿ý|³Õ¡¿‰¼›mù›oï>~Ç”?ïúøáîûŸ?¿»‰ƒÍýÝOüùöÃíçÛïoo¶* ÌײÂ+>Üýë–[ß~÷ï¿û|óûýW·÷ÃY¦çU¾ÁƒüqõëïþuÇþñÊ÷Lš„×gèøžJS}}¸ -Bã…1R]}¹úϰàd”¦®ñ/4‰&:^a Ö*ÚAt‡©mˆEÖe7[g®šæ©?¶Ð ÓÍCß14«Ú†[ç½­y1Ëú‘Áý‘ÝÞÊŒº=Û2˜™ts¿/[*eõ¾í³ªzaà0±°myºQÉÆB„ÝgÏes’ɵ[¹Gß*å¥a¨éYßí›SÙe]ùl·M«ãEµöô ÔPNÀës—6ÆFÞœžwµm[6»%V–ï‘2l3×°U -:P%ý¶·Þ@aâÜ Rø ñO«`ƒS•ÙÔÙÁ2`  ´ Àê¦Þ -Uý©…CщáÞžJ"°vLËd–¬i€î¬c¯û5x°UsvXBBv´r‹Ž+Ö/êŠ5¦ÿÕÔö¸“lJ”íÃ&§ƒÜ­v²Ðrç\v{æïoZýñœÑ9 AãCïìé”Uˆ€PµéeiqhM#Û2e’˜)î|tÇ+¶ °jv(6)M‡b¢¦7Ous®¹yd"mÝqŸV¯H¯¦kyá&^Ê~o¾”un˜Nå´ˆ´f~ÀwÎ LyÁ¨–Á³à€=¾É•+"©Å;ŠB¡ Ѓ¼aû\V·H>L @>=TÒ"îÃ÷È[>—… Ì)æ ˆ æHMÌ‘QÚKRhû¬ÀEQveSgÕvwj["Ü&Ó§Öl;ÌŸwŸ‘B&pR70#íÑæåo¾¯má¡°†›»ºílV[t¤Htqsgð!ÚcS<„ç§¥ú|ÏÖÂÖÍìöŒ.åç/·ßy gËG÷M_Éb¬‡Ì³¾]AV=°&Âo¸‡ƒØ™– -›3Þ#`Á{2KSƒ';Ä?úÑÜ"”mÉÔä šªÇ›™‘”ƒ¡ô.ÜŸïù!xf°úž¯ýxÝÝ ÒvŠÅÞJ­¸û sȺ|¿=dÇ£-¶ 1' .aA†ö}/J‚ôm:¬B¦‚¦ýЋ¢ÈÌ)¹Û±LÉ”f/ ý@ú… [:áØKN%P“b’kHØÀ÷îÓs çD@Š€HPàØ|/-Dn‰ØãzaØú©*ÛŽäo«´†ÈÁ„sekç„ÜwZn…UJZCÑ‚ñ"‰#«îqÔ•æè¤ Ζ °RHðŠ>gM­<7§'FgqoúZ02þ<ÙSm+§¸%c§d~I9rš´µ½Q›|{Sq" DuÛ5Ýå£E¾ÿÉÙ캆ØÕ¢%N•Ø2ý-#£+?q¯ JìpÉöƃŒgynÅHmf.Ĉœ`«mò'8Œí¸Û·²™ÈÕZ5^’…kÚIèÂ7?áCÜž‰•ñÙÃ1+™‚1ÝcÍ“ÒÍè!çì§ŽO>Wüî²²â1¡5…Œš³}æ¸ò›5o’Æ^%Š….¸Xõovîšâ!4¯Mõ< -¼ î&fX¢¼º‘¢8G)…®Q>pÊYæÖ.ƒH·Ô(ÜcìX”mÞô§ìÔ+&5 ´gT¾mR§X¯›Ô ŽŽ±ê80ÞfðÁó®fA‡ -QWMô6!Ö -%3+/ÀöÎH`ôÈ%h3 ‡cz€dÏ )œ`—lIâ­”ç¸õ j:–Ù œÀîÚh4-̸ŽS/H#gÈ·[[ãnÛ]‰ŒÚ²Å4F{iš…ÁߊØéÈK “‡Ó¥ÁÆ}ÙBC^0x-=«GÁ8ç8ddÜ S•5†™DHwƒè¼øù¬ +ˆd'á»·Õq±›r$gŒ)±'Ö; q :µ;ÈÒä¡oò£ÍÞK¤€Çò™M)´Z<73á[ªÊ…ìo8V€Þ媃 é‰ µÒmøû Ã\gÆ)®dŒmàâ¢ò2g4\r;”+)†“â!h†pf?€4m×.õ\ô0íN–}ydžýóh9+õùeÃÙ2)‡›ÍûO?Ë -µ@öÐЃ0´!Œlûƒµ²Oà ÿh"ˆÀà &hZW¢ì: >¬Ü½ªxšªNgn Ї®Ek~Ñà K5ä")&\ìǫ́*7dÅJã:œ¤¿®¹2Ó¶ôéíH’YWJD £³"»î½f7{çiË¿,¿ò°’ñä©HhHᡬÝK’›8®(ˆpÄʽ%¹G%ao:°p°pò <`»¿BIWÎ$›]k=›Sv*‡(T,'+ÈyKØtÊ^Èæî^ÝcÃ’×î‡2\] eÿÛ˜aá›ÓÄ3c%HŠƒi,Xíʆa©yèJž¢— ã™4Š&N¥rÁƒJŠì$WkóÚ7‹ãWÐU"¡%ÞAl`ZîTOUÒ>ïK²îi¤wø -!D!á‘YR>ü<÷’ôÿÚßÌtendstream +xÚ¥Ërä¶ñ®¯Ð-T•‡&>òZk˯7+¹œ*Û‰Ñ0âc<äŒVùút£àc(UR‘  Ñè7F\ð/®ÓÈT^'YèGˆ®‹æ*¸~‚±®ãl,ÒfŠõÝãÕ·UrùY,ãëÇÝd­ÔÒT\?–¿{~¼ýüx÷åf#£À‹ý›MÞw÷Ÿ¾'HFŸ¿|úxÿï_no’Ð{¼ÿå¿Ü}¼ûr÷éÃÝÍF¤‘€ù’WxcÂÇû¿ßQë‡/·?ÿ|ûåæÏÇŸ®îÝY¦çƒüuõûŸÁu Çþé*ðU–F×/Ð |‘eòº¹ +#åG¡RR_=\ýÃ-85S×ø©ÔR™¬0PÊ Eí0¾N¢Ì•T†»#œ>Ë<ý5oµþÎd^µChêå4ø×I_©™÷Ï=µvÝðxvÞÒ÷çÒ÷x#ROù–´ÖÎnµïú9÷íÇPLè“JùIš%p*¤l×u>å]CfJá±²øLyÞ–´Ë°×´ï%-HûÉâU=.}½ŽøÀnC!ü,ФYõ)ÃZC?K…âñÐqx" o“Wµ#½Õà +éB ¸©8ãpC¿ôÚîØäum¸ØC^^–t޾'ÀüT ü#ˆ‚[ž@ç ¼[ø¸ ^ +ëeàËD053ú™9QìƒÜÈ9sÖÏk±Jy±—ª®ád"ô¶š¾Crw®J]$ïéû¢ëÙ …@=·ÝKË0}Ö-A‡}wzÚc[!‹^yâ uÚn FåæðÈT¨ àß] çÜH•= UûD‡¶á3“Åez\(–^wª®EÚc £cVLùšH_¥ÒÊIÛ­IBèËT–PʪϷµîiƒa_ñê[½ÏÏ*ÂÍÝ"¸ÉŸG\M°^Ïš»‰ ÄbO#;ZK¡`UxŒ¼¦2rÆ6¤±Ë‘ Ò²,!2ZÕ@ß¼í_ô±§ÎŽ.»!9 +`‘Ôc0V¸È#ñR)5ò;î"±Sµƒn¨`ÏÐSïÆñ ·©8VC>Tg0LzC‡Ç!bIb¤"ØêHPš¨fÇYÊ;Wú¥éžþvtsðˆ2›‡o » ØëÆ ] +…B?Qê}©P~šˆÐé +<¯ž×½Ýð ‹j÷Êòº² 4­u<êâtìÅ´Èê¦Qê'pñsÅä"7ÌÆ-éÚæ¤l€ê©íœ +X‘Rd^’Ì5iTŸˆÍ6êî‰!ôyÉ-žÐt0ù“^¦‡÷¸¦~*œ¹e~³;vÍ¦È s®P¾q"ñE,¬}Ì‹áD&gLT6´j b4ºÝbd¶ÛÀH­]Ž3dÅA&Ý4|qägÉBIaUŒ¬ëžOÔ¡(ó¶(/%yÁÖËí'"¦a*‚OÍ £Àú€UŒUzŠv‡*^ýÔ3è&–º¯HJ&™-3¹µë¯)Õšâ;I‹Ì œ€EÁh„À ²?Zã!h?ÃBƳ˜±™‹èH$¶ßŸ– +Û[ÿ““ëió†}Š# Uo=P»aªPõÎÚœ0šª¬ï£ûhγxMtl¹ua=ïg}ÚV×Ý‹sLÓA¥–98®Ø¾N¨+טŽÖÍ¢JùV2˜ ØsÆ;h‡,˜¾¸œ/¹‹BH‡Þéã1¯MüPa¬Ž’´X´®ãmÙFSÇHÌw>º£û®Ñk‡ê5Iá5ìUÚúfë8±ÁA.6ñPöÃÄ{¨ÚB/0­ÊIiIü€ïœ˜ò‚ vh´Î{Ê™Ë`n&ÔâÅSVÂʶÉP+kNT(L¨…4LÔ2܇ï$ø"ÀœâpN1ƒŒá¸4ªJH?Í ý®UUoYÕ›?»½½‰£aÔ ÌˆqtÔ¥Ây÷m?è¼ÄÀ0y¤ÖeE6ÿ蹕”|.u2@H {;sØ$…¿>Ü}ïœ,Ÿ™¸æÅHHžq͘µl½˜ßp Û™ž +›3Þ#`Á{c–¦7¶ˆFsk‚­î¸0ẏ®> äûG’ +0”þE !o¹u„v/€x5ag¤Í‹òM±’°;,Ê-†b¿iòÃA—Lj€ +Ý/ÉAàÇi˜½O‡ÃZ!džD(B`3£ä~ljP:¥ÙO£À†]¯DØ2HüLÉt’uR¨c\CJn¾÷ŸÏ!ŸbF™ær°9RFì± ½ì}‚TW”JƒôI ¥ŠærÖÎ +y` +ÆQ¼Âª5ZãB.<KâHÇѼÕŠìX³rBO‚Wž +ØÌiåKw|&twÊÎq$§Ï³>¶º¶Š[vF¹*ggœ¦ÙZcU"ø0ö +¦¢a", Xuû5Ý¥£E~üðÙÚì¶…ØÃU´Ä™`;bLOÈ”?q¯¹ã„#cÏg’8žQú0˜  ÝÌ…(–lõ]ñŒ™Ì@ÝSÏ!æ}F®V¼Åä’4\Ó&L#¾)º¤öL¬TàdÇP¬x +ÆtO-MʼÐcœsY>d\ñ»Ë«šÆ,ĬÉdüؽè3ŕ߬y“,ñãPÙ ]p¹ê5,Þ¼aâ!4¯]}Þw3ÌQd•ÇÖÄ9B t•0!eËÜëei—…{Œ!(ºÓR“òM“Já'Aú¾E ½mP-’©W¬ŠŠ79üAä¼9‡K"D„Šªâw©pH—dÌ `¬ü0³;¥ƒ•_É‘?Ð&˜°é @ò3È…%Ø¥”[\´…VFsìz/ªÚX œ@ŽZI.- ¸L2?ÌbkÂ7Ýân›]…\Úp5KI?Ë"µðÙð·VΊýTeÖÞ»Óe¡g¿dB¡Á.˜ +¼“§)Å¿8çh(Ë…N]™’S±Ñý@ s^üºz‡Y»£ï^ׇÅnÆÌT#9c4‰=¶Û™-B€»äƒ,z¥ ö¶xCAÂ1žª3Qh[´dn`hÐÐßï?=NQWàxxôÔÖä¹`óY*×ARCM(óÊx¼"u¶ÿ½Q\=økÖ-]$=û¥8’®^Ú4¶š@K¶ó­ “L–ffjŒò£3±ˆÉ@àh©wù©Üf—’¨Dj¿[åá‹ ”É—ÖQbCXÔw´þÂ\F‘/…\”µ§F¬É9VåÊ´¶lý&·5›k¥&•úIšXÁºÙša=*±…Îò|ݰ” }å;ðG“œÌ‚“§ºÛRd¹w˜øAàÊ\ÿ=c’ÈÏD˜ÍÔÚ»ÓØW*ÎæáÍj¼˜á;€øßâE”JäÀŠÁé µð¢±4}A¡ôÙãâȨ…¼âúÍÀIÂD…oqg…Ü®)”áœ\c· e;ú:úDZgHÙi&ŸtMy[Ô§Ò£Ìd–Ìøðp÷.;M< 8ò (žOf±°a87Á24ðeƒZ!ÏeNÐ)u­MÈ…‰¥„ ™[…΂ÆYJëÖ`ÐòŽL".8ÔÕ2‚ä7‚Î*T=KÃÌÊË‚§Ë鯒׬¶²Âjøý†|&™{§Úuþ¼)[°ÜÅšF€7wá^¼¤š ðPü„b~cë‚ß«öÐqü†$ŸnÌ%HD 2L»âÈWcŽf©wËÐþôô¤ûãÝM*üHÊ…ï6Î+ö„*8¦:ºW1>—8D±`3Õ\ )ªvdþy©­¶µðé^NvÈæÐ]ÍÅ Þq ¤Í3 p§ÖÒÃ9t…«5H›dÅ^£‹}ÞV½ h±Hß\SÙHwêI¢bWÂD®Ž!ÔUÕ°CBYy4þ_S‹ /ÍÍ4*ZñÊlÍ OÂÈZÂe®uR5Z%'…Ths¬­mg[à;ˆQ é"hAXÀ™¤ A… mî­±ôœŸD¬ÒÑVïÆwŽâ9›'³K ÀæË,ÚÖ¨F'[ê¶²þÕr:Xãt`_@Ñïì£Yÿ1MK&$"ßÞÉÚ±H7¡kˆLv®œ–ÅÒB<[,„<]xõˆµð‹9byHüõ$Š·4ÇyDóšb_e¦væÒõB‹"i+É ƒ†Ü³$èDè(r¶ºKÝ ¹'ø¢>p¨Í×”­)„™aõ-‹l¼>y2#WDʹ‚‘àIhTìuñ¼(ô­ ËúûÕH„ó›"]¡^Lý&|ì¡å\Ù"Èç¸b´§ú¤WW7OìÙ[ÓíkÇbÿÑDá[\¸ ½dàŠísÏY³º©î­ÞŒ¬|_õ¨«³½—™r¿™ö‹PùQ”EïçýS¬·‡…g­¾RCÅö tvú¨Ûâ² *`§Ò§÷ÉqX+ôÌBZ ( 䜞ßÜ#Á +ŠÑi„šç©ÉûÁ.Á•:œ<ÀÜØR®ªBÒ àâGA jz‰ _ÄSùèi$§"ú#y5äY$° µI†qdºøö•`Œ…VbiÚ +“'ó¦ã|"@±µGª²ñ±hˆß‰TlJ*VËÖÂW +îSKz6%«}*Ñ(æÑç +”ކ˜œÔ&Xn­‹S 9à j~2}bGæbLou…)bFIÄ™÷: +¯9þj${ÓBÔ“¨À!ÿ2(´•02lü[OÀu§#ý(:öN°Í/H¡ó8ã +t€}Ò¼™«ùòå4Õ0X +ŒI…oÙ½´=•ÇuÞð>(=MÌûõG&›”/Dbþ»œ©H¬z†ïLm."¯Cô.Wu‚&'‚Ös·£ï–‡©ÎŒSlÉÛ(Àå+ÄæUAh¸žÉðP®¸„MJˆ Ì˜½iÚ¬ ìKUš‡é@QÊð³86ô׃¦Ü4 —qº³å\WއϿò +-CÝtæAÚLö§†ÉZÙ'´†~4Æàç4m¨PöN‚'«voýtTiUjÍ<®^ôÿ¬tüÍm˜ø*Mßx8SX?LÕ™(äu¬–”»ßŸ^’þSµ’endstream endobj -1692 0 obj << +1691 0 obj << /Type /Page -/Contents 1693 0 R -/Resources 1691 0 R +/Contents 1692 0 R +/Resources 1690 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1675 0 R +/Parent 1674 0 R +>> endobj +1693 0 obj << +/D [1691 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1690 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F48 1228 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1696 0 obj << +/Length 3843 +/Filter /FlateDecode +>> +stream +xÚ­]sÛ6òÝ¿ÂòL„⃠‰G7qzî\œãÞt¦í-Q'©Š”÷×ß.vÁ‰’’æš™\,±‹Å~CV—þ©K‹Øiw™¸HX©ìål}!/Ÿ`î§ Å8Ó€4ícýøpñÃ{“\:áb_>,zk¥B¦©º|˜ÿ>‰…W°‚œ¼ýp÷þö§_ﯯ’hòpûáîjª­œ¼¿ý÷ ~º¿þå—ëû«©J­š¼ý×õLJ›{šŠyoïÞÄÑãÈ¢÷7ïoîoîÞÞ\ýùðóÅÍC»—þ~•4¸‘¿.~ÿS^ÎaÛ?_Ha\j/_àE +圾\_DÖ «‹OÿiìÍúOG姤Ð&Ö#Ôº'ÀT 뜽L¬±ÑÆ °Yæ¸'=)ó<çÛº¨Jz©ôÌèñwU2zQÓsV­7«¼ÉW¯øn&óbq¥ÒÉ"ßâ#/¯Ô¤¡™…‡Tkú®¥»!Äç¢Úñ’@ãÍR7}~ÉÌrþø¥X­ðT@4S¥„³Vû}>ú•/àhCnRû‰Ôo$Ûf+Fl*~.E™Ï‡v+2"lqÅ8YÉ–­kåç‚”q£±ê0[ju¾ÛS™7’™…g¾ÞTÛl[ÐqÈI¶ZU³¬Éém¯«íëð“%³ %ªl•ÞeMp8lš©žš!“©ˆbx&‹/tðÓŶZO»µèÌèó¾–‚u›H[X¿ÎV5òé’I6›å›¦!h­°Ú†/ÖYݧ‡ &'aaøáRʉT')ãÔ«ì9YIƒ×‘&`e 1HGƒç·KùXTm8ìš^Vùs¾âñ˲˜-i8Ëvu>¶¿©ÖµC§ÓWÿL°‰HÍL‡Óä³ÌKÔ|V„Eµmµg„ŸÔ‰Dé謼µp:«í˜¸•Hc·‰Aè±Ð„XMIëM>kŠgô@J© ¸r£ää¶!œ Ò‰‡wÍ60ÏÙnEZ4c+Rkô€úMÉéJª'ïî>}ºyKãz·, ¡—¢s¼pª‘túÜ©JáœIZÙN#O~-Y§Ò—¥ÁF÷Ž/†Àlù~KÜyõKe’sôRÌbÆÏbÁOæx^ 4Br0Z ˆ3ÿÒÉ””„,èå[ô8q§qü’HÏ)2Ø­PG+VäÒqEH=E~ÎVÅ<Ã\å@™M áJ‹Sô[¤C;@À¶Úç (³1I«Ì8î±äßÇõÇ_¡&ûúl5¹«š|dI̹’$¨Ô¡ï­'¶ SÒŠÌb†^Ó°aÐ#ïÑ›Oj è"D»Èé¡6Žk¸-ã~f§S +æã(ÅGŸ#¡ –áŸ#ó…Á(JJ©T÷¾º5_ÌU;_+÷ß}\‚缨}Æùm¥RÄ2 +e»fŒ'm„Ãâûkx"»7‰¨ÃüιÃ:‘‰)1˜ÛÓlküøÒl¯ÒÉ®n¦Y9[b„ˆ pm‡à…¦¨"®økÊ’pD¤q)/ Ä&^@"µqn\@&Ž„Ž¿Ñåú}±|8ÑÒ P{ª7°Ã8"áÙ‰Ç83yÜ5Îè$ÂÀ ¯[¨·„då*ŽWz›UåRê§es‚îê¢| +FŒÖ:¡º"¯Ù‘|>ýœ¿Ž "–BÆöd…2 $„œÔ …¬fO'†Ö¶KÝ@¾†\è$@@T[õ-çy4pD>‰â3‘£u…Ê:=ÍF‹5ÂÇ`Ë1È%–jÈȵ罪šx6ZÍ1rROeÖ°6Õ„DÉ6Î>C޽x%Ý‚‰.©½1hXEgˆ³ýÃËèN'âüó°wsÞ›²º|Ê›Æ36ìÑPK¡í匔7(™6&‘6!È­rŸ6ÔPñÇé7•Ï»U™·í´®ÝDbܬ²Ð jšlö¹>®µ"kbÎimë„Ö,dð¯]¾}Ųk°KDlSwšp@!<8O©E'Pþ´Ég l°ÿH¢ +B\À¢Í8â‰àÀÙ:ÀÛ"=⎠šlÛäóv•r´vÃÆ‘TçOΤ2êÜÕ¶ñÅ$û¡pzYlïµ¾ ÷òƶ)­×\`–Š^ÜbÊ!ŒÄšý˜S`ð±…t?/Û ‚Àl_`½®Ï<‡‚xº¶]ã§]€»Ïu×Õ¬{(ƒ…±—ú„=Ô©@¹“šÖ˜µbÔè|3Àè³þZYˆÂp,§5¿‡uBó–¯Î—ùìó•¡>Ò{:C¼Å¡>Ò{Ú#O½'¹Ö…>1„aÊCŸ0„O¨Ù³†g¼ó…©Ù2Ûf3ßó0Ô&8%i0¨_Ë&ûB³x°þ£|Ûd“WkÃI„¸)û-§h˜†6‹´ tEáÄç†?T´].V"WÀK°Uð xr’6ö¶;iÞýû·†sâ/C‡›§Ì$ÕŠ‰òâëj^L‡f©X¬î†¡Š–R ;çïÛö¼û~e¢…Án#Л͊œG‘¿M {T/¥ws ®¡ z^¿¡©kø äuôËo`Ue—„)Eœ*3ƒXÜ%Á;6 ³y6üÑ–‡möÛ:±9[­Ü¿£«{üß5|€‡çݧ74øôášG¿üÆ:Dœ»¿²vò_z9ÜI-Ý4á7tU™Ä¸Ÿ+5¡-á»Ï}Ïs5â§?>à/¢Ò|Yæ­šFayðÁáeC£¢œ˜½Ì²¿·Ä‰ðäU³>E¼¦æVUõy·a +‹n0.zC_³Çˈ®3¾¿{œsºVp~w{7½~÷î^\ß¼rÚ«šŒ÷AᦧnïÐ/M¨t •¨ÓùTéx::{›ï6Ó-žÏü0§×™8ˆ-§è·H‡ ;§V$ ¸á>o‘4š´KM`ÌA ‡Ô‚JÜ¡á,©ŽZ¯çÁœx•ñ³Œ?rå†`tXølkg ÷và;B0‹“Q#ûiÓÏ W¨f\7¡®»žûjÝj¤›”?ºêú®z¡ÒÓXð›­ÆZyBcSH·£4:«° FçÖØVó¿WaUâþTè¤ÂöŽ+l@êö¥XÍgÙö°©cIu’vÀ9¤=—Qp<Ú ˆó3LÔõ÷ õÚñIÅ1^gxíȌՆ”õ ¬Ê)µ=¼ïo¦K[dÄjI‹2ÅÅ©ï¹Q9ñ'êT»6º>ÖmÞºª½/†oõ’½B4¨ù5 ÐƒM†=·!VÂtä5nצ:š·Ï] ¹yÝPº¦ƒuà¿c‚¬³òX{ª¶E³\LY0ÑÉS”4¥ÓȦ¡{!±‹¿m¤¼fí=›ÿi—ëb1LúXÜ®BçàåH¦MQJŸîÿGØèuÃÒ,Ü"In½:×ê + )!rÿ¬êJ(¾´ˆ•ÝKÁù7‹XìÕ;v'=Ða¨®2BE08m¹=¬¦°:Û-Ê&‚Ó}=4^+Œ´§é¤úCó•B§±2ð1ß‚l½VItµ^Ÿ¡¨²9Áø§P“ÝÀ¥Gñ¬×4E—¥²ûAV­ +ᩱ—Œî+Rz€úØO¶ Õ–1dÂø¤ñÞ¯3C3ø!–1š¯°?Ù"*ï5 ©ÿ¥|YHªˆ_Ž®Nõ¢ ŒãèiµËé‹£Kä_Šš?%•6X­cÙßP§{¿ j ¤C]—4&q¥ ‹ ]ÕÐÃÒ 0ªÒ§¨)þaÊg +à~—l}Ìù£òþfPb‹@¿Ú5ÓjÑ.“ô–íÝ&•‰J ~‡6õýª‡N#õ?Á°=§©´‹X*RM°©åÈÙá$ï¦Ãvø˜¯ª‚6Õ†àÍÁ¨ŠT=¡ÀL'ü°'¯¶.NwXE†ô%ø#R"úsYƒ‚ä匛)­¹Àø˜#º©ù.Až¿æ¶W•ˆÚßYœròÇÄÞÐ@¦f̘_“ííâwÿQB÷f˜é‘Ÿžê$…mÁ"Ì”ÿ{è0&ð_/²þ?‡Jendstream +endobj +1695 0 obj << +/Type /Page +/Contents 1696 0 R +/Resources 1694 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1674 0 R +>> endobj +1697 0 obj << +/D [1695 0 R /XYZ 56.6929 794.5015 null] >> endobj 1694 0 obj << -/D [1692 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1691 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1697 0 obj << -/Length 3567 +1700 0 obj << +/Length 3293 /Filter /FlateDecode >> stream -xÚÅZÝsÛ6÷_áGy&BñMðÑMœž;'g»wiûÀH”­‰Dº"Çýëo ðC‚¤xz3Ï„àb],~ûˆâœÃŸ87–Ù\æçY®™áœÏÖgüüú~:g™¦C®ïÏ~x¯²óœåVÚóûÅ`.Ǹsâü~þÛÄ2É.`>yûñæýõO¿Ü^^dzrýñæb* Ÿ¼¿þçµ~º½üðáòöb*œ“·ÿ¸ütuK]6ÌñãõÍ;¢äô80éíÕû«Û«›·WÜÿ|vuß­e¸^Á.äϳßþàçsXöÏgœ©Ü™ógxáLä¹<_Ÿi£˜ÑJEÊêìîì_Ý„ƒ^?4e?m3R[°¤b™i# – <™æ,s¼72 H9r¡‘çUÓ”³iYŸWåî’…äÌeb0$%¾ãJÈ—ùB挒c®HòT:9ywswwõ–ÚÍöé©Þ´ô²¬Pµõ©™æ`Vî'ªŠu9lC±Š³<´ As;ù¥Z•M$•AJ[ÓpííaÆä* )›„‘±\É(âMBWÃT–ŸRT1Ç¥\ŸËÇâkT,Âs¹Ï ñ¼ŽUÝâ”çS%%LM…`¹1ÒÏÕÛNFfôrÿXRc^.Ší*°,›„!„s;k¿Ã®3ö®¤ZôsáÔq8¹ùãÀùk±Z΋vYW{V–åâÐQ:®„£åj°2‡õŽ”ˆV*ë íVþ=jm¿,»¨6™˜ÜÔm™˜€%³,kÏãwf¶3ÝÄŪ©IÙª,ç 5Û@úÖè(tìãéX¦ÁOG˜LãB‰äb(GJçåà³\\7Y”³vùµ„%+®&× ê#'†FRÁ9Ó‰hÔ:Ý \tâ©TªH0ópûð}ÙÐs¾lДó×iä8³\GŠm›ÒI*–c®ùÈûUÆ8â"Øš2)jªò|B{>‡y´²“¢š#ÙM -êíB¾´› 7Ù6í´¨fõ†Ô€^ Ø]¨kƒ[S×aô_uH4Nå ”™ÌIœ-e e5“ö•ׯ+؇ìá$jz#?´št„go•«ÉçmKä‚Ñ"ÍíuGõ”¢Ú«Õ ½ÍêêwÎåÃÖ©œuÛ,«‡(!á´&‡¢ÁƵµRΧ_Ê—”!,gÜvàÅö'œj‘ƒE1OªG&vLw¡i‹¶\—U‹X¯K Tñšý<œ>`%*çÙ‰ô1à:’>"× 6³YùÔNËoOË EßQ -¡2sî¸WBÑ’-ØÅr1VäÒk€QUL¼rŸ4ˇªhšbz~,+êýZn–‹Âtô Hì ĤÕ²ßCìíý^’{U<³âóAßM\îʶõŠ!JÚG@¡U?… ŠÔT,È¡©»œt0sh©b’[•¾xÚ÷™³ÌºÓ•˜v:BõëvU•›P¥’ŠþIf|Z/ô^´m1ûÒD­ÉrÒÙã¨rFmÇ… -þ¹-7/«úaWpž1k\~\pdJí'—Ìjˆ¤#ÉwOå Àë×!yaƒI*'ˆš=Ю½y¬·«9uø¼Ž´¶Ø´å¼›%UI ELÎÅéSŽë>\mÚÆçe‹i'eÓÖF˜ ¹31ˆW¦+l=rAY¬ºi `ˆiH9à$Fíæœ%fŸ[ûeÕµ¨ f†£`"l[nÖËÊÛ Þ?¿ìLðܺ¬fR/vXFÏ ”?Ô 3a8ô8Õ9ª¶L:˜;Ã݉xmðhc­>ü×äG.”8{,g_¦†f/J 8siyBxÇ•>>»Â!6z,þÞ‡0¥ó.„©°cHÃ’‡(¾`JØ¡v³œµ¡Ç_èš=›bÖ¢û j# S‘æ¥j‹oÔ‹ë•›¶X±ózMmè ‹6±2„"\j½›ü etEéÄ׆?Ô¡ƒjhTeû\o¾øËsŽæ u™‡)0›Õ~¦yÈd6¤Ø·Qm»m |Dg€I›>““÷É2(ãÌ@©  D¶yL9XÏ6$„œ)¤K¤.S¹Æ9&µ‰!kQ,W©Di˜ÎÅà §`î´êpÈò,²6+Hq©Dh †êRÜÿBóçbS¥'RË„æ^HQ5Ïå¦ àƒ2Òäf'&ŽÁƒ1©Ï(nðÐËïÜðämd©³ 8M…r߃L'vÄ%‹Ù‘0¼êã#TUõ&¹PÑ©|TΞäWŽW4Ž9#\%(Üʉ?ex?”Vщ É«ò¡Xí±nÚààØã#Ò×0O¢P¦^z ’“µáe`mà»}ÿ–ȰOadC—š8)‚Ð0ùºž/§c·”Á¬˜îÆ©Š¦†€„YùØ&;Ñ}÷d"™Â[Çp€~zZQðÈ4ÅÛL…è„ú¹òah14"uAÏË7Ôu ÿˆBQH~%B€jIXRX'&×-q…[Ø«¡‚Ú«á·>ª<²TŒÛ23Q9lFRðZ3¹}G7Õøß%‘|‚‡çÍÝjÜ}¼ ­¿†m"öÝ^3ù7½ì¯G9ã×ãÇøõÈÌâz.Ä„–„ï¾ö=­U"NºÇ y½'šˆÏX8˜ê8=4ÂÆamC­e5_bõ2ÌE:â3ÌZ %¹¨ ¬êúËö)HXŒx£sÑÆš]Xü첚‡rmê»ë›éå»w·ìòöÓE.=Ô<ù“Ý%yO]×7÷—TÊ 8ˆå'ŽC®ÃUÇÕ»Ü|û4ÝàÍ÷Ë*¼»Ï!½U¡ãJè0¾?5,Ë ”x‹J ë¸¾@vHeؤ‹¨,ßö °ÕÅ>OåŽï üóe¸X$†* ư…Ïî ò>ƒ7ø{!hÇÉɵ5™³cÌ7庨ZÀª¿ -’ÒLÊ?·>ŒKK c$1ê¤t¤>É€ki»Cò¸:€Ði³îâø»“6—“á܆ÚÔM³¤£.¼}-VÛ2,w7õ‚dïD¡“±Lu÷Y–3åLˆ®zM^Mz Ô¼9ÏÌ /pñ’ÈÕ{ÉúÛÞ;‡äÅÝqÁ‘)!x|àÖP&€.#ÉÁ5¤Qƒã¶Q±v¡„…ϱc ‚yYlš0¢2.º‰¹ Çõ§ð:Ÿ‡êßç -‘Ç«?5¬–T8­ª4Bá8+é~°ûn„‚4B(Õ’ygüݓ̷C;Ü~·JoíôIØB±¨OÁV™ÿ¶2· ã‰Óòë0l;®¶ÏËÕ|Vlö¯5¥eš‹ãâ#SBüÈhJÀI5–OÇe©tã§èöŸt\Æ8<2 `‡&ÕÁШêjJ!>Ž%¬§/d¸à¤IƒÄűñáêFç ’‘#«›Ã`@¸Äšo]7>.CÕ·z.^ 34á5²Ð#8NˆâŠT‰ÝÚãnÛ?2,žÛ -ªõ¦¥NF‡ÆpÅDYíì‘nv¼jõfÙ>®I1Xz'*Á•¦B¿4ˆ÷¯da9áJ^‹î—7\Zž÷y:}^îf(‰¡ -ðràÈ&UKÿE@ãÕo>>¬Åß•x¸ŒÍó+Фâ€óݽ†®VâqL2+L>ÎÜdtük¶!¨ôÀ°¦>ì¾àæ:ß;î¾®#î¹z÷]Vmù»û²ï¿†)nŽËL ùcÿåL:«Æ -|*7`[*Ž×ãNu1'ý쇭^KÏâUo¨‹~>å„°?Bw-D àèG‰XäÕg8x¿ÝÁ†\Š g]ò¢aP%*1L|JÉð£¶f:" x/©I7b Š829; UT[«mI#öd$§(¿-›0” ­ðüŽ-Ý}ï±:GëÐ=Œ³d.—s¡?uÿ0uåËU‡_(LÞyxï€v1 úüVùø =h±E”_oÛi½è¦ÉÓ$Ò¶I˜ãBèáÝÿÔKô³î ç¿Ê0ƒ eu®ƒU¸˜à•¦ä‰½Ãΰ~èŽËâçrU?µ­Ÿã‚aqÐêÂÅÀ(ÐÓŒâa›C'T¾®ŒELŒG"_W ¤¬fáz¥sh²£fP§˜¿gÈÓ?üŽ/\ÓÝ—Ç‚üɯ†ÔNƒqŽFÖ!×áÈÚq ëùéÌå÷>’LçN—ßq%‡Ö "j®Ç$œÊ™‘<–‹‰è¿33Úd£Ÿ¨ÀÿÂ×m&þæ$¬8ÞCøœü4ø«¯^;Ï6!~Øt¤QÙ™Ñ1Â…{" ¿½¹üpun>ñÓ&gœG­ƒPý<†”b™•êuçˆC âøÉ©:ñeåë¨"W¿aÍæëQT—™ò˜Rc`Ji÷HÁ.Š!¤lü²ÉæR@ŠÊT„éîÚ!Ãú d]W6ÞàôÝ„+›®€¼‡+#vëöÿ3®,Z§¾×íyŽ|ŸB<DÁ1Ký½ß;4="¸ãÙ“<þ­S!ˆÌPôh§µT@ +3±Ôíý¿‰O¼9µ-xðvUðèÔ¼´ôªô´AjDƒ¯2}Žx•Jtþ%^†]¯Ê {U–{¯–÷*­¼WÓy<{^Ýîn/ÒtòOj/¶±¡H¢„7ß­y¬«Æ6Är§ï>\ãÓÎnKj9l ØŠœÍ~$N½$·7‚;ÛI +yR ´ õcèý*,sÊŠº~I/ôÚØy[ÖUˆî –Ájt<ÔðX9t<©“H¢CüŽ—%q¦O;^Wê¸ã©ǛΠ8“î§sxONª¤Fôè-Ù$iµè+Bî'…  +îü‹\M +âí= ߺžFbh-laqçoÈG{!žó6$œù±Ñy›ãpe.ÈÖÈ÷¶vV‰8à¨äQ&‚i«zÌú"J½j}!ÌÄ{ëw¤NXßKጻÇEÑÚ)%‘ÍÇCX‘Bd¯h¤FTè­VÇ‘Îõ@2¼Rl!¥Rgd8K!¶>.' ¿fH“ˆÞ‘2‘N³WÎŽr’6$&„Ó‘SÁOýÃÝDÜ—<ÉêZðS¢>Ú—¾â ÛZL†–\FJ uM,û>³ªŸñÈã"Ѫޭ9jÝsã®ñqì™"5P¶²[8.Fcw{wýŽÍÒ¡-Œr!ºíèÂÀVW–ðR zÁ–ÅšÁŠ¢eUlËõË…€è‹û£s×°ÆCå&T©B¢~‹Ó˜r8¾•ëb:Ï%Û·ÓöAÛ m/à0– —ÂkŒ/´®{Ͳ Ë`@[µ%wòkë`@\C!9ìb¹¶D‚’ûe1£! +—µÃ5E6Â- ·$Âð%,_êjýB3ÉCžù1Ùv=Z¿½¹ûáê?DßÞâé-Љ€Sè%Ü*‰U<ÚÏ2éÉwõ³}‚5¾Û0ÒÒ÷s ¨ú‘ ây”¥rï°I‘FižˆW¢œÓ5œ5€Ë¾TH|ö‡™x+…ßJç¨K(_“î Ëm†¥Ð µE÷èå²ïöUšv@!øt'8Ï6 ü_hàÕ‚Xûé€ËfÊ™šÉ#gŃt<Ò5ÐÁ›¤aJ¯IãûoÊu±íÚRJÛ +ˆ»¼¯‹ª#îü˜í#Lÿ±Ç4ôìmʼÞlh™àë²â8A>1ˆ]ø‘“\H¥Ip!ä/åÀž&ã.$d¥PUü‰xm:ñÚ8ÏÙLJd²Ù5-MxoéYð¼k[ø¦ö¹æ¶9 +l÷Q*¥¨‰ž•j-ÖˆWj¡)§¾Ö4Q’¯1¡€é]È2 e ãsþh#íŽöß/¦)DL§³Ùë ¤3'-pvê5ýâ›±4v2^mp6-$Öÿ^ƒ°k¨Xã‡|‹˜Å÷² +„OL­|Mã~Ú±¿o`ýý*»ª™±±íWÃÞ!úàðåzÝÏ0P…KGLuû%RÊ(yTvJu¥ŽC© Õ9~ðÀlXÊû!žÊe¤LöŠAjDÞ™Èu¤2=P„ë86(ª¤ûÅV-ư*„I-ùxÁÂÁÜFEB†˜^tƒæ}í’¤âsï4;÷™ŠŒ4æË`šT!ÂÝÄíN£JòÈ î}8}ë´ƒQ 6#Œa°#Àù]3þC‚’’fü‡œ}~w=œŸb;wàœ  º”t²5äu )¯»ö¢ÌΑ(Êä#ô—(“¹eHuÐKÞA`øBSäŒÀ æFܱ;ð¹êrhÝQ9eµpWuÀr5}W†ÀØ ¹ßµƒp rØ8‡vAÓP—û(âŸûLÚ©æÇ3©7‹s%ŽfRè9ýVÜH•‘¯ +”+%¹€“Ù›Ÿˆ@(Œm?ËŒpU‡/xŽ”ŒxKIð‡GìcˆþÿÅè}¹Æ+µP7üê.ïT–÷ã×ë.h5YöWÜ£É,ŽDf^¹ÀíJ÷ˆ ÕXdÛi[OËŠè¡&2‘„ªä´*AjD—Þ·‡8‹d<Ðår½Æ«%r¬ý•„°òR›rN<öAµ'6·Û¢jJÆíÀ'ª7ÔÚ½8½àÉ+ô- ‰é¦Œl„fçZÈÁ_é#Ãù4ÏðN´îwIrÙoôäÛðµ¥Û 䘉¨—ÔÌXZw°´~?Bð+%EXÝ Jí–ÞÇ¿Àö¼ ú’(‹ÓÆÖ\ñ ŠcŸ•™, ­?ãа£ ϰŸ +W|†“¥4`ÁÎÎÒÙ +ÙRª3€t0CJΪRy˜M3ˆržÎvAY² wwýŽû¸œÄÍÝÕùð#ž PB2”%ÔO–GØ{¾ùÕ\â0Þçdðl×ëÑ +õzé¿.Y"üÕˆÃi ñPmÅߦÚðE«ÜTròþ«U6©ìÜ6M±åo[-³i£zó¥4öO¹œ\Þ^¾§Fo ;ë=Ðr¬ë|®à³£Êü¶"5/vx!Ž$¬³Å ¹ÃÏ"ôª·û õ¶ŒŒ©ºctTÆWc×-I.ÉÄ~~„£eçTöf ×f¤µášŽÖŒ‡% ]¦«ÜåNïƒßp.wmh¬£mäbˈƒÜÔh2¼‹aMãŒp +zåx Œú²î­»øÖ¼®~‹cù° ¥)¶»:bgBO“ÜÇŒby‚ †p¹…¿±pÇ tìã‚ØßSÔÛò©ðkáûŒ8ëàp?Á¥±øÕ=º¼Ç Q(¡è²ÂÃnE¢DðåG é¢Þv’|Â'§×‹wÎ]œ:oc["¿´0?ä±C¾@“>N ÕŠDe?·Jšì ·Ó§zEúž -wÜ=­ŠÎ.@äËO‹Oí§‚OÁSˆô Õ ƒÓš82¹ñ@‚WŠ%¤”vò@„“ÁØpô¹¨vŒ7á.5“Ê"£Ó7ìÎD¹’†i¾‚å´ž»{`üÖßß~OÀ}Éû—Ì®=%è“= _ÙÎn7emIe¤4cb9tZÍ~äÜ:Î=6»Š½Ö=îZïÇöä©z°µÝ‚a8ñöæöêCKð¼!y¹àÝvd8ìØšÚ:ƒ;-´¤ËÉ‹–u±-«Ã9 Ýý˜ÜMY´åCí6TZ!Ç-A¿Å:ÞÊÖMÉzûœíŽÇéz ë€®ÐXKÐKá9ƺ7½aZàe´ ­»’'ù³õìOœÉ$‡[,+K 0y<#Z‚ðXÇ7<A$3Üp@ _Â𥩫A,L\ˆã ìÁ¶¯0úíõí÷—ÿ!øæ dp(R¤Âmf wJBOö3F®ØÌ¿kööä[î@Hk?¯l jž8Â"GQ:qÁü¥±I¡#'â /çlM&™å˜íØ_¥ðW3ÀËCM±Ý®¾&Þ–Çz7 G¡pj«¾éå#Ó+p®2t*E„ÙÛ°à¡]_Ô+B·,‹ 'F&t˜G^¤§‘n€ d¢!”ž“ÖÏß”U±.ÚQHyt•€¿Ë÷ºª[0q§Ç,Xañç„<aæÀ6–ÍfCÇ ¬ÊšýéĤ§`×­5«ÒIP!ÄN³c×É´ - G:Õú/øë¬ç¯3§9GÿÌ7»¶£ ï-= Þ·²…êö -)¡Àqï¥4yMÐV4ZT˜%>nh„¶|Z‚A„’bÙDBÚ‚èËÊŠ™ixÓFØ™ö? 2éxÎŽ<èĉyKœœC¿ø¡'»eÏ6(›r~µ„[CÆZ¿äaÒ¹?ˆ*à>1ü‘·*Û~ÎýÇŽõ}ç ²{Ö #6¶ûj<;x\¾¬ªaüëù€+v\¨;ùD*•䘤ª7é>ÕéT*PõÌM —rÎ~œOåêÇô 6Õ›ÈM¤R3b„ë8ç6È«èãÍ¢«WS¹*¸I#Ù¼¦ÒÂÑÞ™‚Ê1øô¢ï4ï$Û½ãdÊîSe2˾,M“*„QØ ¸5ª$`Ésø6º—£@mF9 -¸ÁÇwÃù” çˆ9Æw7Ãé)ŽóŽ †²A7b‚IŽ«†¸0Åu7^t£ÝÙ“D‘|Â@$e2÷IB½ì%ïe`øB[äœ!@Ì{MrÄqžÀäªËM öWeP”õ -ý¢\Mß§¡dl"K»ßu#wRäpq.ÛNC]#i¯šŸŽ¤Ô,Ε8Iaæâó”€zšÜG®¿@1êG±‘é0~AW!•‘Îý%U¥» «õÄb"‰L’¤_dö=Nì«^.-ºpÍ/í\A†(Sùv†({f~201ÃÁig/$°go8ûÕ+ÎÞS!‡Ýö°è–O‹­]omû8Õ®S -üñ« ª Æí:%ôƒ»ó­KP—C>ü®9ùxäAªŒ|U \)Éœ˜ß½û‰L…qìçoZuø².Ê -)…4â=eH‚›À8'#èÿ£÷e…-µP7†üÕ5ïTšý×Û*Ùj"ÒôÿÑGSie(ÎW5¢OuZ#Ußg`‘m]³(k‚ÇœÈXDª’×Y T¼ô-ã4’ñˆ—‹ªÂÖ‚9ÖþJ‚[9ÔŦ\Žõ@Pí‰Ãݶ¨Û’óvÀ“5í7Â,xò ýPb¸)#¡Ø¹ré¯ôža¶ÈSì‰5`W%—ý™™ß£bgèFe©»Ø#Íš†9—6½\ÚŒzÁ-&¿R’‡¥%QÝ Ôîè}Rã\–e_æeqʱ W<Èb3¥Ð ¬4d[E¡áFXžÓ~*\ñ,KÈ_Ülˆ–R…4@—fHÉQU*Ÿfà¤9G O'»B§,3’-w{õ縘Àõíå;Zy$æTBr*!C–Ð<[^á¨yøæO7ÑÄá|ŸƒÁÞVÕd…zåZ©ï1¤¡5âò´–pȶrm Úéœz)÷ «Ú†0µ]Ú¶-¶^›ÑtQƒý4­ýÓy.ç7?Ò —€½ó¾àrªé|ªà££Jýµ"´,vØGL#í]qÁDÎxàY„YÍöØP_‘µ¥$LÕ_£oR)·Æ®:¢ ^’¹ýü¦e—Tö¦ ×fÄ™ÚøL'kÆ—% ­ §«]sgðA‡;œë]7èpŒu´œo(ˆÛüºA‰a+†S²-ÀôÊî¨nˆº·®ï¨eSÿÇòa*SweÄDšKìEy—Qì LPÜ Å0[îàoÊÄqdâØ»ò±oSÖOÛò¹ðgáv i¸O?!ÓñèóY±D….ï± -õ*|Ö­¨J÷>ˆͶã6œÁ,¾9×7uÊÆ¢D ~ÉÂÔ×á%úP8&|§Ú~îx‡r3•Æ Bž]MÜ¥‚t"KÔ8‡íŠmǹähÝ…Î"•Ç·(Lê&â·lÿ/@81¦Eûb»âJt´%p&M$Óc²ÂY»)Ül Ñ­‹%¥OŽbY°žÝónÇü©IBÇ“Þ ®háÆ‚¼ìb_®XAè+Ÿi궯ížgØí³Ýº6¾ðr_í–ÌhŠ9ѨþË)/Ý<»FTâJ¡O-ô$?ÑÙmí\`QRñ®ø#“Ïw,]¶³Fèž' ÃøÉ7¬îÈ(ð˜Åâ¤íλð$2|€V<ÝU<Ï“nxžj‰tÒ°ýL9•ÏMqUãQ]»Kkwµ-ìK—¡‡)f^5Í'‚vOD㮩t 7`ñšx—¢>ì ²?¼«D²þõ” ¨š%äg<ƒš&¸hSO©{lZö›Çô'~Ö~['åÉßøˆòÕñª±crwÙ£ïóu»Ëûú¯ã‰N‡O&úB(üL›¾žè÷©N'ú -võ¢ä“"ÒFä¯o¨&v¸{™FZ+5Üšz -r‰ÐdÏé;Ñ€³±6ƒÖ»ŠF\@Ë}%ˆžã!3\UºnsoA2@ØÍStÍ(=¿ ¼ÿ‹›O}ˆU)ž6gG».·m7á%vì•Kt{ymgQl9ô-\3bΖ&”ö V¤þcA5SþJ*ü¯tã»@ú4d–^  #ˆ´7¥Z™)˜õ¹þ[çéXmûûÀÞ- -í«iãCªL¹ÎŸÿdÚ'¥‘‹ÀQ²ËLç†m±©ßµ¶Zƒ¸‘„ÖÏ‹wF†{÷Ýê±pÒÈ$é ßƒ\>Ùe‰—DeAèé<wl‚k½=y§Ït‰Œ“Œ¾¢ eú-˜Òþ€kÂàâÐYúŸ'vü]•V–øm„Æ(“¹ñL¹LA9×HèLš Öÿ ?íWendstream -endobj -1700 0 obj << -/Type /Page -/Contents 1701 0 R -/Resources 1699 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1675 0 R ->> endobj -1702 0 obj << -/D [1700 0 R /XYZ 85.0394 794.5015 null] +/D [1699 0 R /XYZ 85.0394 794.5015 null] >> endobj 470 0 obj << -/D [1700 0 R /XYZ 85.0394 227.0652 null] +/D [1699 0 R /XYZ 85.0394 121.8848 null] >> endobj -1703 0 obj << -/D [1700 0 R /XYZ 85.0394 197.3345 null] +1702 0 obj << +/D [1699 0 R /XYZ 85.0394 93.334 null] >> endobj -1699 0 obj << +1698 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1706 0 obj << -/Length 2753 +1705 0 obj << +/Length 3128 /Filter /FlateDecode >> stream -xÚÍZKsã6¾ûWè¶rÕC<’ÇÉŒ'ëÔffÖã=l%9Ðm³†"Q²×ûë÷k4@ñ%;µIªR®2ÁF£Ñht÷×%þä"¶Âf*[$™q$ãÅz{-îÐ÷ý™ô<«À´ês}w}öö£N™È¬²‹ëÛž¬TDi*×›Ÿ–V(q ÑòýçO/¿ÿ×Õ»óÄ,¯/?:_©8Z~¼üÇ·¾¿z÷ãï®ÎW2åòýßß}¹¾¸â.ëe|wùéS2~œzuññâêâÓû‹ó_®8»¸îÖÒ_¯Œ4-ä׳Ÿ~‰,û‡³Hè,Ox‰„Ì2µØž™X‹Øh(ÕÙ׳v{½nèœýLœŠX»Xi#RÌ?oe))Á”Ä™°ZéÎÊJÎY9p‘•o›ÝS¾Û»v¼`YlY/úR'sw\3“«ÞäRJaR›gÿúP¬ËŸ£H-ÌŸÉåþ¾ †Z^~aB¾ÙìÎeº,Ú¶ãi˜å¦à÷C[l¸…Åt ¬ŠÆmÊú.`469ÈÞ·ù¡Ú3k9ž¹Ø>쟙V•­çú9Š£ÚÏK³@òŠ ¶E¤i¢a )²8Vn]½É1R -ÏjDYì“L…ŽmæX?TÅ *^®óšyÕ6Ür‹¥®¦&{ÝØ*¦6Ÿk¸i¶yé»nò¶lß ­#ˆ­š§n6¶l4îªæ&¯ºÞ‰~ÍþlêÖjÜꢡœ¾V/›Çb·+7›‚Ô°féÔ=çÇc¾+ gnô5·L|ÊŸ[ì™F8þûoLg³€±-öLyÈwûr}¨ò¿ó‚[ær~"üÃ÷–·´Ž[¶NQ·B„™ÈÚ¥³ :ïóÇb¸>ÎN9§‹©HðŽâÎ$"Aˆ@B/àxxSWÏoi?wmÙšT k2éGÞP¦„bHXoüø?ëfÏÞZ˜ûl¹ÓÅ8Ôµ¡ EÁÅÂDYF1Ì»»7®zAßñ¯ú¦A?•낾X“û„ü¬„J& -eø(4É=×kjL¤‘bf«°2E¹T»„k£¤¤´B`¢(Z~8äÕªÝçëo¼†¯ÅîÑ'ÐÑÌp‹Øãäôjm±x.—ëÞyç -~á´¦5¢ºí±3oì‚…ˆUN9Š(>O6»=÷ÿý©Ù}ëËoõ†ßhnGº©Š­Ÿ…"”ž,._ßç7eURŒ’°ÍÁ«GÉb&î«Î*.šÉßN'ïŸÜ(JðíË/fèÏ Ø!üäÜ„Æ}ÓzY[èVÖ…˜ µ‡Cii^ÆÌ>×iÌì¸h›nWíqëØ©3!í/ª˜fT §AÁCÈ©Mìí¢]Öù6Éžô¡(q9ÿA—·¢ð„máþ|½7S'vÓpoì·Ì‰v΄N·g笱4éÐ1ö»¼nÉ(µÛ ü¤@’R&ÕIæô'Í™H¨LT -ä-#=@SÛœû··jPo -¦äpe¦8­A qQ=†Ž{Ïæ£yJÄá½QZæÖ /ïOLÕ²ôÏûœg¢Ä-Ž(ì¶hx3{þ–ŸäHÔÒKçMn©*sÎ^ÇOÓ¼_d:UæýqŒ%±P± C¬¹\Uƒgálí×r¨+Ú·¡ˆw!ÓÌŒ Ð{ˆ ÏÆÃŒíÙ‡b6÷l7EQàli§6'¢|Ýl·Î³è¥báEeX!îæR·JQW&‘õ ¤­õÃWfÆñŸê`Ž®H›à€¶ï9<0Þõ ñ¾©÷»¦z ºAF±õL¨AA.Nm®zÐ{ã;½?ïwåzïÖª;nJ¶¥QGa®”6ƒRš;\†>rz,(~=@8×z¤Ês»/¶TŽÁ­¿Nk E”"ã(Q‚³Ê˵Cǿ꘦½©ÜaíÕà”BN³$”¶j ÏLú÷\¯hò¿Éb$áÌ„Î;q±Ï˪úð}ó4Œ‰–Rõís@6(ƒÍpNÞRj×i,ë¸\ÓQ`…ú‘4£˜ÔB"›½<{Ç53ýð˜ - Ê`úáPÉåÓ}¹¾§¦rˆà©]aDt§2Ÿ|üaO¿ǰ¿/ý8G¾`V àÔòŸ'¹(ï›ÚO€’§¾ -ñùIц•Îõ8#âÔ«”¡Nð I­-ª4ä幓¥"K2ŸˆÆÛ1²¡„–:%¶ù3Kçc"µnü|mg× \Uçu›ê µBia‚`§÷tv¤/›Ä3ppä!|†Â ~©¹FVòöBºL2™ V:ìVá芼îųj&(Îm´ìN¡4æÃÁÈÒÚ‰êTŠ$¨f¼¥ð°]ä5Ráí¡¢wÃàæã‡s$n’Ñ‚¼[&ѱÌ-_&Ø”núÚÛ¤7#ü;^Qà¥ì×ìGÐ霟ªbPsö^Àô•7Úpštþ[ÊirQŠ•“YHÃŒVeéËY¨Ïu: u\G·ðìf’\S›ìåÉ;®™Ù‡IÙ^Z=œ~˜…Ž>Œš¢ËBf]ý˜…R.5±ýÆ„&ܘä»gîúðé+w1¼Âqg«àŒ²]e7²ËœR¡¤•ýl B6à¨K‘[")g®f°ÍƒA—êðœÏ©‚,“½’" T:“!TuòƒuÑt‚''gOt?œÖE¦‘H”ÑãL@#^¶™Ãq)§‰À G¬8ÕÃ8½¼ݲü¿ëTã&éW†(ÅfUºÓ’ •"ε®RÙßrMŽ¥i:Ê4‘˜OËâqdùf1µ -Úa+$*g«úqØy!¼)*Ÿk•¡÷×ÁŸz†BYº­ŽPwiyÃ>#ÁÊå5þ«åäŠ>µ„¤Gº¥î&zñëBÚ²L3S¯íÖz´#¼½ÜªÅ‡+Zôå¯ú’Ý¢Iz^©´°ØD±6VIÃçGkç“tdX>¯ÖùúàÜvpRËè»@H·ph­Y¿ø+oÈ¥ç±È¤#u8[ôØCå5š5ñ,c3T•.ú{÷ûÜAcŸm! Ž_9~Ÿ³ú ÷Ì]§km^)‰•ÞhýÊ'‘Žk”tW\ï ðH‘3@»¾ä)®x¤6’C †x¤x„fլݥN&ßFtꋚ]àaÏíÂ`=0ÂÏ.¯¹tÖT±~ BK/ç¡iýG8¢S±âJ[â@ÿ†*ãë$Cu'rl½t¾IÊB&¤f— é…Qô,k*‹]W«Û|íN£ž^ì@ü7‡=7è>á(ξ -,þ³gis×9a®˜ŠÖ'uº k>—×ÅT¾+CAõ­ßPúùß)XçU´§Û×Pb 6lþ£á·¡©'ŽÜ±‘É &|5BËA½C½ôP/õ)xUˆf”»¯`½GrìùIÁ^v`/=ØãÙ{yì¶b9.û°3$'£›©ß`·$±öDz{ñ§áþ ƒÿ©·Ì•Ò(¡M¢þ¢e>I¥¯TIé:ý#«€Ôˆ,Ué_ô¿PdXeš¨?²ø“Q¿·U=ПÎ_øD´9àwÿ6ãøÃ“¨¦æÑ††n‘u, ËÿnÅž¼’ l=åÿ±H¨Oendstream +xÚ½]sÛ¸ñÝ¿BoGÍDñA€|ô%vꛞ“:îCçîh‰²9¦HHÙu}w±DR”|ÓÌ4™1ÁÅb±ØïÅg1üç³D3‰lf2Å’˜'³åæ"ž=ÂÜ— îpiÑÇúùþâãµ4³ŒeZèÙýºG+eqšòÙýê·H3Áæ@!Ž>}½½¾ùòϻ˹QÑýÍ×ÛùB$qt}ó÷+}¹»üõ×Ë»ù‚§ >ýíòÛýÕMiGãç›ÛÏÉèq‚èÝÕõÕÝÕí§«ù÷¿\\݇³ôÏËc‰ùóâ·?âÙ +ŽýËEÌd–&³Wx‰Ï21Û\¨D²DIé!ÕÅ÷‹‚½Y»tR~À«ÒÑþ#„ײ}ê/1QÕ4Ï4Úo §ø7¬-›Aë|S¸]òúí5›sÎ#TƒÑu³{Í-[«²~$¬f¹ÜïÜŠ¦®ÞˆhS£@ ÎY–$ž©{jÚ‚4õç6Åðe»ãàõ©\>ÑО m±{)Ü|éÔMGƒ|4we—wå‹ÃÏë VM1FÊ=V Ÿ×ík _»gç.óåSÁŽŒ‰3ùžn˜LÈš&”OH‹>éžOéÞc¡œÖVΫñ¾™dB$Éù}=Òľ}›_±N‡ûÞ?¡€e&¢fÛ• Có(ÀH»Ùy °ÞW4S® Nö€õÁPŠ[^•m7$hÕ‚€b³í‚¡™D—É«½£Ø¬Q¯U_xRs–˜ n¥Vî`‹58ªÈXš,p…þ¬¢….T QËYg©¾VÅ:ßWèOB+0ƒ}kmI»3â Ø%z¢U¿ðƲ@Øïq,YzÂЈL(P"’;$4æú§Îã9›íï{·¨´Óž‡Xirà:UªŠ 0]ÓˆâÎ’SÒ$ ì¶s98xIQ­AcŠ«èfJ?‚'̈ zk@úÑÌ(-’uqdt[,K”S±B-dò½3yâµl¾Ø·šJ0e”Jf¨ž“¾®aÀHng}½uÚ×VÏ×Ñ4F[óXCÒW>»wÀšØ¼/eð.¦RðøÁî߃”QìÞ…8ÜÍ7ä«%¢¶ 8 ¡<ôα¢ÙL60zh#ò´§í¼‹PËñÎ ,ŒbŽ~“¸vûâ.@yáÔjÝ[µÚÛVræ-€e±=ñ”I +CÔqRƒè _Ó ¯Ú†Fö°8ÕÔ(¯Ç=IeEÐÆãÓc[‡«f“—nê!oËMYBÒ©ªæ5ìFRÞÓ`ðX5yfø£ðܺUÍÐãI³–_-£\eW®VÖÁ!–YvžÓã%‡4lÅ sÍš€öÁ¢Í1øî NbĶè²Íw]¹ÜWùŽÞéÀ-aQT”hnâœcMÒ)êŽð†.hc®Ž¬L`Ҧ쉈–»$D’Lßï”a\ħ —\ír }4>M©`ZeÜ­|(€¬” æüàÖïFFï,®¾ð•JU}ðM1vu©°ÈçL2Í2a]˜æv3Üõ|> /zøÇ.DÕz¯m—/Ÿ‰ÿï6´škI Ó_'¥¦ ‚™¬¥wÒXA/Î$”!yÛC'ÜÄ: «ÜÖ3qñ±Ùu4ckm€¿6»ç>ýf_¯è}k³(‚ªbãvAÏÄ'‘ƒÊ3(«}‰­öŽ=ŸÏFþ^¡X/F;Ûo·–§A‰]”@Ào¾½¨¡D{ÏÊP»;Zà­¬O×Å +º¥Í;¹²u:W,[•5.Úƒæ9SfŒCWv–4Á c*èáχAÆ”*qrÁ¶Ë÷N´í%ø‚m&á͵0:aåá0XÛAãážO9NÅÆ!®X^Ì¿¥'Ždd­É•˜q¨ƒ…ßd•`ý,“©p aÚÇ9$a"á~‰ë@Sì~èY¸¶tgÙ×êß*üñ4S£Ôç,ĺgãÒ‹{íÉÇö»í¡(jŸ0[ÔÔê„—/›Í&tÐ FX~ìq*p‹4cÚÄÚUë–/Ô„8ø*½8Bqv” H I{"(— .{røÔÔÝ®©ÞÍa$;å+O„ÆÆTëÀ샛tÖÜíÊegO0¨éhÈI’JˆÙZ +hš°ñù€é2AAý›­ð•·¶+6X„Q?®È'Æ)¡“W"3ï” Ñ_pôŽé‹` L’ñãØïîºúäÏ܈çÂG™jlÙ_¸9.º¼¬Ú¡?5¯C° äúÍç5ç&eXo»Ó]Z!W&=ŸÉúX§3YÀ².Œ ÀªFäpœÃ¸ÄØœß=`Ml?ìûRÆ2Ø~Øö .Þ„°ùÀACY„pË2õ;®„§;EèìíB¹2¯ £­ ú9õÀýOS»  à©=CÔ5 TXiMâ!ôºBŒÂ¡M7©Ï.0 ’8Ú@æ»ú‘ZÀþ²p31VÇH†:f’Kß@lò7¢NÍ!ŽÜ~½K ØšÎñvÌ—‚ÅJy–ï‰û‘„©D‡é4:ö"K„œq¸„¨ääÑÒdÜ VÚÌ-|khKxí O²i 0×™ç2ôž¸æÁ¹ÖG¬c!b –q|”Ž˜ÏþbxÁhܽ‚ÝÖhˆBóôÖÂfÌŸL×Z kˆÑÍR?û.&z—Í> l©b?äœ`üX4,ÚC[éênZ´diäù§ÖÓh¢è+'£fXà>9…úX§£PÀ:˜=]Z!0M©²ó›¬‰Ý‡AȰ˜k9Ü~…6 H! +¡›…(ðCJ©Ð´Àö™¿'Éí5,L}¾ýNSþzt2ˆ Š4꺑\ÆÉ)e‚kÞÂGòºbKÌùÐëljÄØPÏé‘ + ¥²wB„‚•ND‘ƾ—®Q!hs4v#û±à4/<™JŽ#®8/3/‡ÇÀ L²8IåÐOoÖ£»•ÿÕq-kSŸ†¾i/’]£{\¤œ%Aõ¨Òü•Oˆhqš¦ÓŸcüFôÒê4-Z-7ô+†¤ž»‡P3øê¬¬É0aÀÎ!ÅB™'é³ÏmOa‰Vܪ:f‰„LK +û +–G÷ðWDGßV¡FƒLªfÜÀ ÉìÖ³?g°Ê2IH½±=ëAðñf#fŸ8Ѭ(Gxѧl‘¤g•B2-Á*9˜Q¦¥ ><çÐX[›ÄŽ!z[,óåÞ¸õ OËðƒ®è†€–µ&"ôâ.º]‹‹ÏC‘‰ µï-zd¡&¥O‰HëȲ”΄ªtÖ×Ý™ƒ=ë,‡:|žþ1c]ø¯hx‰_œOF\éFŸOFktTï ò‘@cîú”ó‘Çš``$¸„Žùƒa>’‡|êYÚ+i޾ˆÈÔ5‹’L`ÛÑx”ŒBÉHô’4xÚ}xE”Mþ쉖ŽÎ¶iݧŽ$ÆžXóJ[B;þûf'Öc륇Ó=Ræ#!C$Äû©žeE`±«ój±Î—ô‘ŸàÅŸ~`¼M8Ðcß Ú µ©Ë¿ULEë‚:^…5{Ëë}*ß•¾ z®ý—“~ü· Öyåux÷êK¬Â¦Ò<ü"tl‰#ó‚Xq3(¸òߊ`dS=§zîR=—§Ò+e_ü\/!Ç|*Ùû¾‰’=Éž»dÏ~²ç'“=]ÐԸ진aLF}Å_‘›1ZŸ¨ü¬ÓEòÿ)üýAHÿÇÖ2õC" M™œüFòíÿÈèð ,eÄg1Í ½0•Ç”½*Ó§ohŽXÿ/ÊK„Kendstream endobj -1705 0 obj << +1704 0 obj << /Type /Page -/Contents 1706 0 R -/Resources 1704 0 R +/Contents 1705 0 R +/Resources 1703 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1712 0 R -/Annots [ 1708 0 R 1711 0 R ] +/Parent 1711 0 R +/Annots [ 1707 0 R 1710 0 R ] >> endobj -1708 0 obj << +1707 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [339.2005 701.7636 400.4005 713.6638] +/Rect [339.2005 593.2748 400.4005 605.175] /Subtype /Link /A << /S /GoTo /D (zone_statement_grammar) >> >> endobj -1711 0 obj << +1710 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [455.0966 503.2689 511.2325 515.3285] +/Rect [455.0966 394.624 511.2325 406.6836] /Subtype /Link /A << /S /GoTo /D (address_match_lists) >> >> endobj -1707 0 obj << -/D [1705 0 R /XYZ 56.6929 794.5015 null] +1706 0 obj << +/D [1704 0 R /XYZ 56.6929 794.5015 null] >> endobj 474 0 obj << -/D [1705 0 R /XYZ 56.6929 686.5799 null] +/D [1704 0 R /XYZ 56.6929 578.0567 null] >> endobj -1709 0 obj << -/D [1705 0 R /XYZ 56.6929 663.4862 null] +1708 0 obj << +/D [1704 0 R /XYZ 56.6929 554.9414 null] >> endobj 478 0 obj << -/D [1705 0 R /XYZ 56.6929 548.1865 null] +/D [1704 0 R /XYZ 56.6929 439.5778 null] >> endobj -1710 0 obj << -/D [1705 0 R /XYZ 56.6929 525.2522 null] +1709 0 obj << +/D [1704 0 R /XYZ 56.6929 416.622 null] >> endobj -1704 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F63 1355 0 R /F62 1352 0 R >> -/XObject << /Im2 1341 0 R >> +1703 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F63 1354 0 R /F62 1351 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1716 0 obj << -/Length 3489 +1715 0 obj << +/Length 3408 /Filter /FlateDecode >> stream -xÚ­ZMsã6½ûWè¶rUÄà‹Q9M’™d¶6“dÆ{Jr %ÚbE‘²ãÝÚÿ¾Ýh)HšÔ®}6Fóu÷Cƒ|ÆàŸÏª²`Òª™±ª(/gËí ›=½ïn¸—Y¡E*õõÝ͗酪ÙÂj¡gwÉXUÁªŠÏîV¿Ì¿ùþÍOwo?Þ.DÉæº¸]”šÍ¿~ÿá[ê±ôóÍÞ½ÿîŸßÜ5¿{ÿãêþøöÝÛo?|óövÁ«’ÃóÂpæwïÿñ–Zß}|óÃo>Þþv÷÷›·wq-éz9“¸?n~ùÍV°ì¿ß°BÚªœ½À+¸µb¶½Q¥,J%eèÙÜ|ºù9˜Üuæì§Êª(…Ò³kmeÞʬ`%Xma+*)D´²à9+)´r½Ùt/‹?Íþu±¬—ëfºn®A[&åTˆRD¢7°h£ÍX‰OOͲý•1Ñô· )ùüeÝ.×Ô\wýà{ëý-¯æ¿@Å›^°ùÐQçc3ø»»þ¥ÙûçÜsÝ–®†µÁ-QQÊùû\÷Ä`’éB*]§¦BéÙBj6FÀúyaË’VÍ8Y»¨ -ÅTåGkQ¹RÌwÝ@¾ñ Pp—ÑFô ;Rfß,û¾ív™éŒ*ªÊÚÉt‡ÞÙ ZíCœ÷ h°̼iû&3;çÓÒ¨S[d¦ÔV%SŸ356äü°Û4}Ÿ™v!'Œ)LL±á¸n(Á†_e´Ð -‚ ã© KsB£uëˆ5èZÖÙµ[€j°ã®Û5¹É„-˜ÿO†KFãj›×Ý!Âô«æ¡>l¼N¿²’åŒ/¡]É0ú¦[Ö›]3ô_ÁSVÒ5úIN1P^0 pz¨í Ê«BTb‚aT¼8 >Îh€–àçB~F©Ôù`¥²ÁhAÈÅ£ -",à²Q*£Æ(U`™ë1ŠG‚™€$cSo½ZQDê{Ô€ Ý{lŸꊡ»¡o9`wEÂj Eî¦ x³Ú–Ü;3 ´Á¬¾2 XD^ ñ#$þ:S“â”k¢ÉÛÆ‹¢W9ÑÝ«o×ùEBò‚+VMÑ™£Ee¢/Õ»UìÍëˆíÜh¬°J?WÐ"'¿×Dê\ƒÔ™™rNˆ9 {(} -c.§O \2ñ¹é“©òâÔD? xUŒñ±)½BèÈÇ”ãB@6@œK9\;å*“rð©‹)Ç©¥Å(失èbrvݼ’\R©óÞ¥2Ë¥à ©¡]Ô!Je”S]ÇùX‹±ËŠ˜Z¤ˆ©{'©ïºÔâî-—ÍÓ@Sw…ÛÞ]‘Ø*æ² -Í“lâÈ@ø‡¡èNŸ›M&šœÏ*›ÍIVAmÏÁAÂvK”W‚w*uAê‡ÃÓªN÷<ª„$ìåÙ£TfúJ ÎR‰ñüŽQ9† ±{cìv!v£{ÐÙî·í@ío_wõ¶]’À·>Q/-20nO½Ûºßþ°ÚÞó»H¯aÄ98§¥Ðäá׫ÆQè9N Ý é1ÐíVY;þÐ õëzˆ‚ÝK»{¤þãˆp뾦`ˆ¼zçuXûÈ`€½~À¥B:ú›êýOnal’zŽ8ƒ¼Ýõˆgwχ½¾9ÁŠþÌŒ*g%ìà èæþqF j¢ü"}à5§ã:Ô4Ë¡ ®d -y¢†½Š¨ÌH›äF©k:hYHŽž“ê@ryd¨ÛÍyßUÆBª·WBy*uÞw£ÔÔw ÎK½_!P¦Æ` ˆ©®.+¥2šŒŒÁJðÞtY§n¬etch7†æÑñ"º1\ïÈ£CûèÆxá܉O%mêgï¯ô«Ä$|;ÏÆ×å]÷}C×d8Ôkå”ÁÒCçE×^Æ ât’Ü$/„Íä—ï +&º`\&ÿo …Œù ´kþ'Ç}dal¸Ã4|°)*ÔÀ~Ê+K‘:w^mÍÝ]D),ÍWj¼³ -b︌–OAFA2n]pR zžš=Œ´E²ÌÎïn­˜w$Óìêû—‹S+“Fþ‚„]Þ}xÍÙÉÂþ©rÄ ³à†uÙÑKö¦… [°ìWgM+ãvif ü>¼: `%í¹Þ¨ -çù£/°­ë]Fu,L0#Ì_{Å‹¼AxM™qE¡µš ›,/7*XvZ€‘H5`ÏWºXv‡ ù‰ÒÑê° e<–‘'ûià1È8Y»[⻵Á3>g\c4è¶M˜e¿‹Qi Q¥~¼°á… ^”Ìè+žH]ð„ uôœ‡fºåµ…ÕåéƒPfúñ†W‚Y9žÄ”•(«Ã¦gÊJè#SÆþÈ”ññ†¿þý4®Î€Èq½ˆ_ëèîæÚK¥…ÊÌ©_YªS:扄ÝÊ•~FØJL:Ó)W¨w»ô&¤ pƒ–£™ð›Te¨O§ðwXgˉBžEšì 9“’…5<Ôû½mv®:¨xœ!khºó/¸ À¨§CíÛ•ÛBœ×ÆT…Àläó°>,51l'¹áfÌH.›Ï²xæ¼ò!x£wÏqië|ÉóB+ÐD‚¾fqÆw畺’Ä¡óž„pÝ÷ ënsZ¦ÇËÓ™ÓiG+ÞÏ;)U -GÞàgÓöµºcZ­ ›3j5ÔˆLO¿Ñ–/LФ¬)’#¸HŽïqN?ÂÁñCAÛZìðt›ç&¨K[&XšÕjì³TzçœÏ=˜~Nk•I6%…úôÄÏEü€ˆÃû&-‰âaòÃÐùùîÎ!ót3$Á ”a&9>ãìø]Ê•Ã0á"ø•ô’J]i¢2?›2ô¢†¿ZuÅ«Ë*D©ŒSÄj-ùX‰q5_˜?®puéÿáì› ÎN1æ4/*DN¼èv‹g•;ºBB­Ò/1œOOªÓÿE`1—ª‘¨ºÑHHíܶŸïèeŽC -¦Ã†3ÐxåôÌ…¢ 4¹yˆ)¼~€ṁÕ¬F­}÷ñ+nލ£—Á–Ñr–MYK(ŽŽãØC˜d[ÿÙnÛ “زˆ…™Á¯òXƒ‚U|joC˜¤ü¬]f|- -XB@~n‹5Ú ‚i<œ“õÞDš>þáæxö%³šÒˆ ‡_÷Mdññsz¸ ÉÆ2­‘ë\-‚âqêí‚3¼‹Põ²É}!Á°:_î ),Xdkñ!W¢ÍÜxêö®Èly(ˆZjE<æ\lûLåÆOR¨÷xHgÓ/å¨ÐôJÝ÷¾ò4f©ϤÉ$–Ÿ¡†Šå+ãY6Æá&½NV¾ˆ²£W@l2KÔ °NU~ÆÐJ,eêßµP¸å¤_šÄ¾ªÒ™4Ü_EÁŒK\Ëè0RüWl£* #!£Ð×hþ9_ŽŠÂVU•ÿnt\$#ºH8ÒN•3hC¢-È@¹m¤¡mÓòÿ§aðІø……žjèRõ9z£’Àaýa¾žcQ§‡A¿aÿ© 2yrxÁ ðT>ÞŒŒÜ,l y»ì*N -ˆdÞH9&OF^ãzÂÙÌQ¸”SÂxfþ{ŠX +ð#ãLNe1ÿÏß2?ôV†óeKàj•°&(å‚£™j^ʪ(+a2ªÿ‡endstream +xÚ¥ZÝsÛ6÷_¡·“g"ß$¦Oiã´¹¹¦mâ{jû@K´Å©Dº"e×wsÿûíb¤(9:3.° à·Ÿ _0øÇ…Θ´j‘[•iÆõb½¿b‹x÷Ý÷4«@´J©¾¹½úê½Ì6³F˜Åí}2W‘±¢à‹ÛÍ/Ëo¿ûÓíͧë•Ðli²ë•6lù͇ï¨ÇÒÏ·?~|ÿá»z{«åí‡?R÷§›÷7Ÿn>~{s½â…æ0^øÎ xÿá_7ÔúîÓÛ~xûéú·Û^ÝÜÆµ¤ëåLâBþ¸úå7¶ØÀ²ÿyÅ2i ½x†–qkÅb¥´Ì´’2ôì®>_ý'LÞº¡sû§D‘irh™à0ǰ•…ÛÅbž-ƒÃà™QFŸ‹Æ1˜Ë7ÈñT+Îà •Y¬L®@Nmãñ +±à<³Z <_Îuf„ʹ”Ã>8߸ÎÒfÚ(îY¦¥P0;Rüx½2|y ÿ‹åÍôoëõ–šÛ¶ë}oy¸æÅ²ò(8ÂBJæN;ªÞ¿mºçêàÇÝ»qížž2°á–‹fPËå‡{¯~é†If2©ŒöhL· +©á¸ ç¹@-ñÚ tq'k㥘*lK-–MÛS£«|lf¤19º ;æP­‡®n›vꢰvÂŽT [õ}äûZ *-p><×]5Ã-’:W§{1ÃZY¡™úÖØËc³C >e»’ +°Í” +[LÎpX7hØÃ¯g¤0 +ôŠñT + %žÐ¨Ý`±]ërví–eEØÇ¦mª9f ¦ŒŒkÊ —Œ›kl²¹î ¡Øoªûò¸ó2ýÊ4›Û| íB†ÙwíºÜ5Uß} £¬¤gÔ“9Á@xzFC§AuGV\e¢ £à'“Ì ‡ã[”ŸñÑh•R7F‘jÖ­Ù#{T€\–"R͈1²G`|µ`f,ÇÈ –Œ!m6õ–› Y¤®#BjèÝCýTQW4EØ=˜"|EN +ºƒ)Ö )r/aÀ—]”°äÎ,¡s 4Ò#£É b‹ˆÂçB5YHüu[LM²S®‰[^WžµÊ‘6/¾1¬óÍ :…äW¬˜¢sŒJdEu©l6s`·hhFXGlÏÍÆ0Ü + +~®À•ƒ}{® Õ¸ª36x„Tm2%^áˆføpj88!ÇŒý¦)¢-ƒfð›Ðü&>D¿i(ZÂß}ù»M¤nEO¾+‚ÃØ‚ÛÐQûW]ux‚ ò@²1zÞ©® PT¢®x¿È±bæ42ä^IrïJ°çœ÷D+Çg<ù9o]@ޤ-Ÿð ‘(ù0ì!÷)òü²û„P‚K&¾Ô}2¥/²¦ðŒWÁûF/*òàrœ ˜5ç\7‰s5ãrpÔE—ãÄ2bärR[tѹ(Í•¸¬¬ Ñy] D3øšó+ÒKáÙ%"Ñ©ã(׎|$ÂXYEt*RD§‚½§‚oSqï Ñyì©sª¨ðÚ+*†´Š9?‚„`Љq±GOȇ ŒP$øKýÈD’óþd·;ñ'(í9 (PÆå+HH¨.@!P X8>nÊþ4ÛQíja/sT3ìG8€$GJ8ÿÿItQ ÑE¬6öF«í‚ÕF"wÐÙïöuOíw/M¹¯×Dðîãgê¥E†Ø£=Pï¾ìúÊ·ÿñlç#Ûp¬`[Ä98@4KFÉÞ7•  g` ÝI¸“@·[eFqñǶ¯¨·ß–}$lŸëæú‡áÕ]If#êÆË°õІöº— +Žè~Ô‡ŸÜÂØØR&8ƒ¼n:ij{ç ^W`E@äÌr¥!ªŸ ®0@ᆰò)M$_%ô§˜9™ÕA¦Z÷uУ<“'¢HQD‘§¢œ 6½"€‘™ä¨4‰„ç;ú²Þ×ZiaÓ¯ä)Õy­TS­]8Ïåaƒ™îc`qMqYH5#Éh/˜Î¸H—uªÀFF†fP`h +ŒQá´F + íAñÁ)04mJ†íÊ'¯©ä+ÄÄp;ÆãòC Ó¾«è™6åÚ8a°ÜÐzÒ­§ñæâ8ÉsgÜ›Ä#„ò«÷à “ &c\…èý¿2æ“f×üß\¼#³Ü!^xCÓ‡=E*È¡¼°d# ³ñb{;îÞ"Jai¾:#r›\èñæ„å“yQà†kg–TA›=ÕfÚc²’Ì.o¯­X¶DS5åÝÎÓEÖ*O7f~CÄ¡J9³Or&-ä(œ7V=íÈxù­…$-ìì×g·VÆià ¿÷/n°zöTîŽTyó1£/ªmËfFt,F°\äíˆs¬q9à˜fæ™1j2m²¼¹Yac ²N‹.ÃË#ìç =¬Ûch~$G´9®CéŽÃÎÈ“"Œ(YݬñlmÐ À€÷mÓÕwõ®î_ˆ€¬#DD@g¬JC{ ¶RbG}ݶ=î6Ôö÷4ËsÝo'œ£ËÆ1Ïò¢RäÉG~ŽVåì™l÷ªÀT„bò¾R^³d€8€í UE\¶Çh÷}UÙc¦ TƒØ…&"«åzü +\{_¾x¶>¶]:i¹q7·0â¶#$§¡fêÀ©"€iìI! Àwáİ8Ò6Éq¥oß—ëß»óa´ԵРH÷2¡ÔkqA¤_¥N}Ñé¼_(U-mM'?½X T¯È Ö°¥Ëƒƒ}›nùk¡¤²¸ s9TH©Î‡ +‘j°¦OfÕ½4ߎ<Õ8Ùc ¾}E†H5#Ä8ÝÓ™L¥¸ÝR¬—í£?"h?—®ÓDûh“(±×~#sn¯ô²Û·­3Øy7X‡©Ì(¸ÖË·ðçéZßcèËlã”óÐ…šxÇ_…PM}G.†ìÊ»j×a/=ÓÜùò®nÊÃKJƒ¾²°Ëï!ʬ“(C +”w~-ÆËf‚lsRû¹ŠÊ wý¦zôy'%_„÷T™rfáqÐ:—Žvmj:— zÀ`Lß&¤»õCãaî͆7×h Ú}¸šh•ö`Uʇ ©®@“lÄ+Ê”ê‚&ªApî«Ãi²k3”Ù¢öãTWe‚Y9æ?Š”•Ð!ªÃ¦”•0C¤Œý1RÆÄþúó©\…;0Æõ$~u~®A+ÜË­§J‹“37}Zg¿ÇHÃ1(€Ù-\Ég($[:µÓ9†\¡ÆíÜ›6À Z.̄ߤCx#…¿ýv¶„($ä,ñnÜmÀÌ=”ÌlÎCí°ëÑûªqAÅ#‡\CÓÝyÁKvO=-lÔ¡Þ¸â¼4y‘ ôF>¢sÖ…¥&ÛÙ$ÏyþW¶Ï²xÏ´ò>h£WÏqQë|™óBý*Є‚¾ZqFw¹Q€wc/ënJu^w#.ýnqƶÝÖ¨ð“ó +ç@4Ãy¤¶Re…Ö“R¥p!üìê®§V{ï_L«•!E£VEï áÓ-lù¤HÊš"¹l€‡äâyúŽ.J”Üb‡— Ý=UA\Jœ`mÖ¨1ô¨èÎ9_zHýœÖ*ŸJP +Åóé]Ÿ³û!wUZÅDa¼Dßz~·çðyšIP•³<¹{>£òø Ö+×`Ë9¼RYO©.5PQŸ‰]O~zUÂß`MÁ‹Ë"Dª¦5Fò±ãš ˜¿¨puAÀýÙ“ *OfqÆØž"^†œ,xÕ6«'5wi…aµJ¿Áp<>î¨Nÿñ€˜i‘ñþtîöˆƒ•1=? +2¦ZÑC ¢3œÒÖÐ[_ï«öØŸ€Â2¬å‰D§’Œ–lUf­á#Qܾbù¦Üc €ÚÎnÁ/ +å[,±"êñ¦Š9Wª›­‡ÞÎ¥½8¾¥c!$L§ ·#Î.áÆéém Ù%˜ +Âäê>&Rø|iðÃê V£¶¾{ør„ç^ƸeäœÍÁEgC Å…ã8w˜ìË?ëýq‰ÕY,ìÈY~•C +Vñ¹êý“º÷\Û™ùÈ` ós ,ÖhƒþÐx¸!ëüúà‡çí—„˜5×Ãç[üôÚ뮊Qüü­e(Uë ¿]Á0‹ëÿÛŸÈß«œ.hæ Ì€µ²y +eò©äZ™.D>#úÿ]\Dendstream endobj -1715 0 obj << +1714 0 obj << /Type /Page -/Contents 1716 0 R -/Resources 1714 0 R +/Contents 1715 0 R +/Resources 1713 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1712 0 R -/Annots [ 1718 0 R 1719 0 R ] +/Parent 1711 0 R +/Annots [ 1717 0 R 1718 0 R ] +>> endobj +1717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.0783 419.6605 261.825 430.4449] +/Subtype /Link +/A << /S /GoTo /D (dynamic_update_security) >> >> endobj 1718 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [213.0783 507.6843 261.825 518.4687] +/Rect [398.1622 298.4384 446.9089 310.4981] /Subtype /Link /A << /S /GoTo /D (dynamic_update_security) >> >> endobj -1719 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.1622 385.1227 446.9089 397.1824] -/Subtype /Link -/A << /S /GoTo /D (dynamic_update_security) >> +1716 0 obj << +/D [1714 0 R /XYZ 85.0394 794.5015 null] >> endobj -1717 0 obj << -/D [1715 0 R /XYZ 85.0394 794.5015 null] ->> endobj -482 0 obj << -/D [1715 0 R /XYZ 85.0394 131.4374 null] ->> endobj -1720 0 obj << -/D [1715 0 R /XYZ 85.0394 107.8521 null] ->> endobj -1714 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R >> +1713 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F63 1354 0 R /F62 1351 0 R /F21 930 0 R /F48 1228 0 R /F41 1208 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1724 0 obj << -/Length 2819 -/Filter /FlateDecode ->> -stream -xÚµ]sÛ¸ñÝ¿B}:¹!ø$€äÉ—8©o_Îu§Ó¹»Z¢-Ž%R'Jöe:ýïÝÅIÑŽÓkG‹Åb±ß¢˜pø‰‰ÉX楟X¯™áÂLæë>¹ƒ¹'"âÌÒ¬‹õýõÉëÊN<ó™Ì&×·ZŽqçÄäzñó4c’>}÷ã凋¿:;µzz}ñãåéL>ýpñ×s}¼:ûôéìêt&œÓw9û|}~ESY¤ñýÅå{‚xzÑF1£•JÕÉßN~j vfÃÒQù ΤÊ䈥 ñ,SR~Ú¯våfUàI_tð5g0ò° "®ÊfWT³ºŠ˜]ÊZ2g]Âlvù®XÕ®!iåÛSá¦E|Y­êÇbWn§Þ¸ø=_¯ˆ¸î²1s nÜ.Ž+ÜÌ2Χÿ¢‡a³Ì½¥·¿EjÀÔLæ]¹©·; ©tÚŸ(—b:’ƒ·×"ëшvRœiI7ËÕ -NšSTùÍ -`Õt·,XåëjŠíC±%(ò…0â !Fä¶Ž(-…‹Ï4“/$⦉KH¯ðÍOójñm:3Âê[‚äÕ4i1í>"Öu>_–U¼ä²¢gUìh²£Án™GPµ£ª8(mÖRÇÛ>P¿¸MÈ#z*Aû¼þf5M 4›b^þ¹,¯“ñíÅÀ8Þ&Œh ×ñE -£p]™<-»øü “xvÅö6Ÿ v–f-zÀކ_/ÇlRxÆ3}tØÙC6r^4x¡r½Ù•)…¯ütß ‚ìj‚iÜ~‰À Ý嘰H¥Z € ‚¥M—婘ΗZ­PaUªî ¨éA.ÙZ××´²š×벺#Yþ¶/¶e‘®œöM‹rÏF•êË¢ñ7¼w ÑäÕ—dùã†ßY„ËmW±à¦yœØ¥«íík-˸NÚ‰ö‡¶70‚e+—MŒÌqÍ BŒdÞ97`f-ÅY—dˆ=ö„õÌ‚8ìLf¿ƒ 0)1 %þwL¶¿Â$à0Éá~{L¢nÜš4ÌÛÌE“{íÞNÏðÀ±gZ‰žôÒö }‹È¢ v$3ÅXÔET ò†ºÓ)«¤8iÉ&ßBl%ã€ÐÌ4ì[GSÏïƒ×U.Ú4øð<!ŒÐhÔZ4½öÝ½Šºªì´Œ´"‹0"A1‰ÝÆ —‘\½)€Q2Axm¾€¸Ö4^æ‘NQÕû»È×Ù狈¹ßWÚ‹0¢sAÏâ!Ÿþ o­lžö a~ð¹#¼y]ÁêuCÐ €^}xG¥½ê†ÊޜѶ˜°x8s'ÉC pQ8€DêÐÐR -”>…é.¿àîsJ‡cA´s a?O¯%$ZQ°®ÂJBÅ£s„DjÑI°0‘ =QƳ,!-C…„!íž7Å2@_–¹>?±¡\@y3v°CØ¿MjϨ[>ÃÔP’ÑÂH„Ô! ü»r¾_Ã;É1:rC-ÅÉ9&28ÈWMMX7Aú_Iòœˆ…–B뛂–…C†uÑbwáÆƒi«„×1Sþ„yvEí³Ÿ‹Äìáp²˜œÐë]Ô¢,æ1Ez\ÀñvÉ,Ц¤•‘0)F'‹ -’æo¾ s¡ xý“ÿe ñ¤×´¢E&¯™ ·Ø*R|ÿ¶Â[¦´r}MëñÓÍü;Ñþù¢]ø\!9o7îÍ›×J¾ßá%•„⦭$u©’@P«¢ Z 0b !˜š"$(€ DS‚¹¡)Á$zÙÇr·ŒÄü*1Òsk4Ôý&ZÀƒc\”xÞDñ ¯ƒB#„xÃÑ€7D"Ç‚“e„„=ƒ˜pfC‹Ñ¼~§©ÞÍèpX\Òšr˜£SÅ}‚JÖ‹£ _õì(–1Çw}êå´&]^ç÷Å3ÅH[4Õ"áVSæû”újîû¤}TuU|ƒú† ¦Å“Õ›åæå."“ÒU4‚ܘ>ªæ´L…‡8ƇƒD  V”m #¢(u+J-™Lí«ULÔ‡)£Ð˜ƒFfgcç´6óFw+Rd´Bª§9P‚HÓשǶ~é Ô2¯ …&šè#;+ͤ1¶³3‡ú>xV£ÞÛ1ùL3eý³‡ÌdÜH÷B›’!Ycj>+¬{ûYÄŠþvI—ˆ°è @ÒLNËR^L8Tº8q²mí˜àNö¯`QÜæýØÈ9Ð 0™É¶Q)@{ÁSp0›Ÿ lVzv¨ôŽÍjç¸nÍH% :Aòóê»MÜWõã7¯šGÂ¥Z×äô -%t+eMHjUÛðˆÈ,.©)·@hŒ:-͘”u‘­yJ³¦ÞoçÅÈg-z?ijU/%‹E”ÊLßq†â â¥õ8FqÍ>¤y0Û ð™±”J BÛUØ¡«€Ø5‰`1qV_RƒqÊÄIZ|H5¤{Ê®lƽ_j‡t½£+5U­w긡0´%Ë´'tL JmLÄøókŒk“8ÚƒnËæ>;¨Uð ^.ƒø¾.w;òÒ$.œì§ˆšœÙ°! ÜeÌýñŒ‰ƒO½¸<{ÿþjØ¡€ó2©@ðR*(ÕÍnP´gŠÔ‚ï݈¿.¾Ý7<—ÿëNH :;ˆTÄX`80ƒ¦Ø¡;ÙÏÇ{©cœi—¢AªÀ‡ fñÿƒgôâ÷m -?®(ÊÛÔF *UuP ¨v*ª:šÜ‚M×kBØ„"tG/Õ~}SD -·A7Z\¾”ÿè=îö‡ -€î]ÑßSB‚· Ø~iUE  ›Øà•4`bKÕ§F‰·©¾yR‡»ÕF…./ñe‰¯ÐÙˆ¶Ó2hS ~¥ˆ(UB)F“Ô˒U“³=Û/63jÜ_”ãLCÉÔ1éÛt]Xº'ÞlÐHš`·Fu÷ËfQl’3ç‡b{†3—Ú YQR?L¬()S͈ú£<ÔƒóÕ~šP8IAÖ7d%‚Z{DŒ¢¸Kœäu¹øš=6[9Ž Â3oûd[qQyð-ýnسò#Rö é^û½+ŠURFÚ)®þ ;!ÕtÆÅ^Î!^ô3p+Ü=+á™2VÐ{2PšÖuö ñ¿È7c=ðËLeÒôÎßcžJ÷C ÈÏŒô -–@„Túàö&I¹;mgSzÈê¬Y…-i›uQb&¬bÏŽÙÓŠiücøÿËÝ0‹‚¡“ö¨ -‹;F8ñM^ T´?F”E2)Ú -%zž—Ó¤Þ&¤U¯”ñpY×£>Y¨(¨ÜÚ?b òóe1¿ÇaFÝjgR¿Õôºç0ß¶|aŠBZ]™7T‹‡rÜ›2! U©óQßmó5ýs†sXé@8 $Ôð$Ùm±å[<¤Éev`fý]Ü$z†¸œ+.£7òÓ0(6Ëby2Ô\ ·¾»ÐTÙŸ1/GÆ«§>­€¢ -¿‡ù‚·Zý‡?»8|“‚>Ñ99þE…´Rg ™ -…ž;â<}ŸqÌú^néöendstream -endobj -1723 0 obj << -/Type /Page -/Contents 1724 0 R -/Resources 1722 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1712 0 R ->> endobj -1725 0 obj << -/D [1723 0 R /XYZ 56.6929 794.5015 null] ->> endobj -486 0 obj << -/D [1723 0 R /XYZ 56.6929 291.4983 null] ->> endobj -1726 0 obj << -/D [1723 0 R /XYZ 56.6929 263.1273 null] ->> endobj 1722 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >> +/Length 2824 +/Filter /FlateDecode +>> +stream +xÚ­ZÝsÛ¸÷_¡>Uîœ|@òäKìÔ7/çºÓéÜÝ-Ñ–Æ©)û<þïÝÅ)QŽ3ÉøAäX,~ØoZŒ8ü‰‘ÉXæ¥Y¯™áÂŒ¦«>º‡±'"Ι¤I“î¬oNÞ\(;òÌg2ÝÜux9Æ£›Ù¯ãŒIv +øøýÏW—ÿu}vjõøæòç«Ó‰4||qùszúx}öéÓÙõéD8#Æïÿ~öùæüš†²ÈãÇË«Dñôs„éõùÅùõùÕûóÓßo~:9¿iÏÒ=¯à +òÇɯ¿óÑ ŽýÓ gÊ;3z‚΄÷r´:ÑF1£•J”åÉ?O~ivFÃÒAügRer@)†4žeJª@‘1°pÎÇ—eSlîòiQãÑ€ì0ࣉ̘°* KoæÀáÅx±[ïrœ—3XW›¦¦Çfž74Ú¤eu±y,6ôü´X.Óâú)QÿØ›E9ÜmN…W+š¶ÊŸ‰|[¡^ÓÅoœË"n¾­å}Ú¼ˆÇéâ¡…bÂij\ÔMQNªràä“vîDæ‘aIµnUÉx+Ë¤Ñæ¬µbN©4³Éð¼JgýÒ&ùßL€4ÏÚ‰­î + @‘ÁMß|6Ûu½¯¯JX¦œÑ#+hŽ2¯ÑXɼsnX_'-ÇI—ePÆž|Jk«ångs•7Óù†3g¼ÿŽB&Ž_¬ÏigûBâm\¤TÌ£ÍàèQ¼%ÁKJʎϤìøDŠ﹤Îa¸ƒ”°)ϲ=ëø"˜^=‡—Ûgú%ÃQ¸w4¼û@ „Ã#nb*f§Ó)>-â²²Š„Ž™ý°?Ù(úÆŒòD1¶u1 f‚>D8f­ ,?m—Íb½4OÎàɿƄ$sÖ¥™u“7Ū(›ÐC+û¢Ú¹ø3_? ÒÄæÆ%¹³=q&¸ÍÿÒa³Ì½£·ÿ½kOîO ­$ôðIH¥{Üþ"À7+¦#;x{#²ïCÿ¬8³2³a§x ¹Š2¿]"VEÕb™¯"©uÄ@E¹o(áVrWÅ)-‡ËÏ4ÒW2\B8 ‚XÃÁ o:3Òª;¢äåž´X'_¾ƒUFÏ1/ÊxË‹2jm5°K†‘Óìˆö š&û(«E• ~^µž&-ªµÞöbzF•œ>Wå1#L#yZvùùQ'x’ ¡ÃN2GÅ ¬«â7ƒASxðIúà´“ÇlàÀ˜q•&S tD_ùàˆÒTD pÜ=Gb@Bó¾×SI§Ú@I¹†ŽG‡ß§ùâTŒƒ»ëòjQ…UUÝA¨¨ê šl­Û÷ÀÓjE¹€¹ËQÂ…•Mòxí >Ԫϋ¡ÐÍû÷½A^>'Û6ý.ç/·{Iwã<´QogkYƵ9gŒ[¹ldcŒúæpÜrœtY†ca=x7«w;Í$æÄB‰ï'dËñ BÂ&¹ð}!å †y›¹8yØîíôsJˆZ‰W›dŶgzè^D µ#(Ƭ*¢jCÒí)¦öIqÒ’u¾øJæá™i`Ù·ºš>Ç«\´jpãy0CxBk §Ö¦éµïñUÔUeÇ‹È+ŠO1Ó‘Ù]ÜpÙUë%#„×úàZÑó<|вÚÞG¹Î>_Æ™Ûuð¦±;†@Ÿáøø7nxkeSp¶Ï4#ȃ¿ Í›V%¬^ÕD °õúâ=”öª-{cFKØF`ÒâáÌ%œ$±ÂEp`©CMK)Vú©»ò‚ÛM)%š ÅÑÎ-„ý<ž–°h¡bU†•@Å£{„dª‰Ó XHÀjÊx–9¤f¨å#¥Ýó¶˜çèÍÃ2ˆã»#Ö”Î)¯‡¶‹üw)ëCítÌg˜J2Zx!;A +(³˜n—ù†Þ WœÑÁ-p08 <ä˺¢Y˜#¥ó•´!eÁˆYh)´¾.hY8dX—ªˆ(]¸ñ `Ú*Íë˜)?bž](¢}öÓ‘ƒ"æ'ôzµhÙÖUÌ’žæH¼ÙKffE½ •‘1)F'‹ +r´˜!ÅûNuÄQ· q×÷Üf”.\çaQóúBÂCe¬Õ±BåéfÿxÿrÑ.|©”œ‹·³[÷öí%ß ïðšjBqÓVŠÇZ‰TM ©ÕQ µZìZÓS¤ÍCHAÑ–`lß–`ÝìÓ¢™Ç DÄ+ Òók4ô'šЩaBR ØÉ(¼‰ð ¯ƒF#…dç=Ùpy\DJ¡PÒo€ GÖ´íëOêÝ ‘v‡Å%­-‡1:UÜ'€ˆT2_| +ÙPñE׎° ÙÑÍ©—ã*µ +Š +’¶pªG­¦ä÷˜úrú{Ô@ʪ,¾BCÓâh g¹y½È¤tU G¦J:šžºÓôÔ¢S|–@j±l˱Ô-–ZìåJ0´-—1UßO…fާ –yI4ñDç0ØYi&±)>VÁµ­ðÞÙgš)ë_<$ß÷{¬{ÁMÉ.‰uŸÖ½JüÔbvi»z°Að€@‹(Á%ä´,eÆ„À®Úň„”okÇw² fÅ]áo¨ 6%Ô´Ýf›ý¿@éÍôlWëkúï:!*¹Õq ʈ¡—mh࡬žöæ¦Þ~ V´&§W(£ëX£(kBZ«Ú®Gœ€Ââ’Š² ¤Æ°ÓÊQ6ã=¨‹lÍ;pšÔÕv3-†zýíô~ÚÔª^JË(•™¾1âxˆ—s¨Ï4 +|ðPoC¢ƒ±… +ŸK¹Nh; avè,àìŠàZL˜ÔæÄ9‹$IZ¼K5¤{Ê.6ÃÞ/µDxï H¸‚ASÕšq§[ +û¶d™v¢ã„9Añ¯MúPò·!Ñ×&I†A4;Ü,ê‡í@•ð¼\~µhòÒös œ:Ù~W¸Ëûã`2;ŸzyuöáÃõ~Îˤà…ì´ýæEËqÒeyø%P;ð\àäw;‡ªçê?C- + ÑAg;TE °TJ³×ûŠÖÿ ¶x–á÷¾ËÈ$ÌâwÌTB÷m?¬+ÊÛÔK Z¥uÐ +(ywZJ;Ü€YÓ×G?^‡J´¡—r»º-"‡îGJŸVƤo2­Jt ÷Û]“€ï}Ñß½€$oF´í:ò*#!}*õ1]…ƒ`köº0±³êS·ÄÛT䉜©€Ãéj£Ò·\—É0;ÈÚÑ|Zmû5×ívuÔ{÷ÇzX܇rY2 rò¨'ÛÙzBýÛËrœi(›:V}—® ë÷$› d +†qkTw¿la“œ9ŸõƒéK¢Î\¶u[Q”Á“(JÊT7¢þ(5át¹…NRÜ€5àšˆ{‰‰ ~@œ=£@î’$ùcµ˜} GÝÃÇa°žyÛgÛÂF™„ÙS³—ð#Rö‹é^Ý,‹eRFÚ)®ëW&»>BHwözÃ8Ÿ³Fˆ×þ ü +w/$> endobj +1723 0 obj << +/D [1721 0 R /XYZ 56.6929 794.5015 null] +>> endobj +482 0 obj << +/D [1721 0 R /XYZ 56.6929 769.5949 null] +>> endobj +1724 0 obj << +/D [1721 0 R /XYZ 56.6929 752.051 null] +>> endobj +486 0 obj << +/D [1721 0 R /XYZ 56.6929 219.3808 null] +>> endobj +1725 0 obj << +/D [1721 0 R /XYZ 56.6929 190.7166 null] +>> endobj +1720 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj +1728 0 obj << +/Length 2810 +/Filter /FlateDecode +>> +stream +xÚµZÝsÛ8Ï_¡·“oÖ,¿DIÛ§n›ô²³›ö²éÌÍìîƒlщ¦²äZr¼¹›ûß (Yrä¤_7‰ Aø”+ÿDDŒ«TqªYÄE,×g<¸…±·gÂËÌ;¡ùPê§›³*R–i‚›Õ@WÂx’ˆà&ÿ=|ýWïoίgsñаÙ<2<üéòê qRz¼~wuqùöÃõ«Y¬Ã›ËwWľ>¿8¿>¿z}>›‹$0_z '&\\þrNÔÛëW¿þúêzöçÍÏgç7ý^†û\áF>ýþ'rØöÏgœ©4‰‚=¼p&ÒTë3)i¥:NyöÛÙ?{…ƒQ7uÊ‘JX”ÈxÂZL90J™QR9~ÚÙíü©wÛ¥Í ça–ç[Û4¸µ@ȈE2UÁ\°X«ÈMù; –F‘›zÛº1™²$‰Ó‰YKãØ '½tü¹ˆS:Å9N±|dÝüÞL¨ÓFž´O~û^\H9ðä\¤‚Içr%˜0†¬½\yÙ¡×S‰Ï +%v lCÏwùfŽÆ4º8i!» õvB¥L +0 Ó|΢N¢pW5»,þà\Úü‡‰uŒa*1ÚO«²µÍ'”+Åe/µ/Ê’Ô/ïìò#’&,VÄjï,õÆn³¶¨ni¼yhZ»¦¡Ív&’°žSX€“!¶á(Faq_ä6¡TføÐݬÛm¶^;µ8VT­‰p»Ê0¶‘ÓÖôtÒ¶Ý0lï»Á;O8s`dý7¿HnWÙ®lýÜ ôÃ4z[Á 9ÂnîìÚ‚â0+‰ãNÊÆÐpv6»å7¼r;äã¡ÉÞ^ ÐãŽ*áû¬(³Ei§Ž)…Môü1Å2Ñãc‚% |h :à,ë-ù§ÙÔUN‡G‡C‘Þ!8€±/ñôâ°-Û}Ñ€¡ðÎÃÂËL¬WP¨Âþ!×}ê²×ûŠ Ö¯ÕüH›Az/…db:½^ü‡ÎL"—š(E*zIô_NÈ£ôú +GGÁǰqU·öÇÙ\K®³W<†@¡3À·Ä‡&nÁ†è…ç5»Šb/ [µåñËÌ©¸õ)RQÞ.wÛ¢}˜ÛBˆOèð AZaJl1Ô¼pñoÛml•ûµëŠž÷Ù¶¨wž¹ÉæS„œ´Õ †„áb‡1¡Òp ÐÀ +РD³‘Mû^Öë5,G…Ÿ±¬«6+*zÉZ,mÖøqaT¢‰ôg…p¨‰ž½(ˆ›†õŠFÁa„› ·bÜ™øeʦ&ª½ËÚñþ(ê(qDcσ!(ÈßßÙŠ˜Z9Qëì^U[×ÄhÖ™Ëà¹D^{çpX›ÝvSS²I’w™_··m`€_Ì òUý²·¼ÃIN§³‹Òž(Z‰çÑG@¹ P¹%P„*@DÙ[«ÃÊî½Hg¶ƒÍ’^²][¯¡‚,}Ü€èÂÏÍ6›²8Xm« £eÌ™æÑ×áYÖYnsF¦¹b|bì½K¬R¸‰ø´Õú˜Ì9ß]-‚'5¦îm—ðõÐ"•±ü¢&ÂèchÆÅ„8ã&R_ÔE ”Ú¿ÀÍË‚Ð¶ÑøíPìe‰èA èì°KDAhúdói +ϰ ð _)Ú‘è_ˆÎšº 󋊰 tcE¿¦7Šºˆ÷v"ís¨…×âJ›_Cl áWW ë3gPˆ<¤÷=tö]φ•Ä8¼cs‹œŠƒÄ0eâ¹°•ØÄví!%YCÚ]ê#áû¥»bØŠòçT Á+z6õÚsºŽná¢2í_Ùzã;hØÀ Bò£†íÃÕå¿0Å¥ÇȆ^|WTU·D@>×ûÉž7½kõ|ÊJnâÑÞ+jaÜzí]½ëV¢9¢[~³-îç\Œ¢bŽ"›š÷eÈï Ž‚¯ˆÂ&ÀUá:>·aìø¨Ï1‚©HŒƒÝ+T2:ı’ÐùUËr—V`'K\ŸRÐŒ:wÁ"ç +¼ÄvµµËÖæXÏh´±- á™"Ã]¬ˆå,€ +(~Ð?ÑMËZ8ÇïᎠ+«k: oEÝ£m%‘ÔÁhá»?T—;J„n¦‡Ä†8]ÿ’Û24/’ÕyÁ¶Ë!¬˜‡&ªXãV³ÊK;ü…ç1þ®Ø{W_ù&§CÇãMû¢ ð°Ì|ëºðÀÒd+ÛÑXŠêRݹy¼â…®î ŠÖ +Z£öxœ 7ª®iöªV‡•§V¢Y‰®‚g÷u‘?[_€TòÉòV©(Öc­æóµÖ¯#ˆŸºÈ*À;xbÔ¸Owùö Å?«—iÿ鉧!ÜûÇ–Ú·˜ùnIÉ©£ÀÏìR-³êr˜êxÒÃ=¹Í¯Q“)Ínã>}8fF<§Ì1\pÀ“®¦8u0wŸ:H°;wy„ÙHéãp=tϽ< +;^Uïýàݺö†v™ºÂò®!Àæ]CbM¶ö2Yø%¼”é6Å»†ƨ°gáe&» \oEn}WàŒ+p'»}¸Çx“€:ôîŠ#é¾¢©õÃçð†ƒ3}8T·Ät-šCsˆ"îèPq~åçeôØd[h|wعÉþla„nZœˆ.…S¢.ÁF_þ‡+þÔw¨¹ÖÂ51O´{¬;ŽX¤Í8Ñ_zPô +`Ý·—Њ/¥ÍdRè Žb.­E½s€ªvëÜBÙ£o¶?Q"¥¡oRÓ_¨½Èü ã>¯Ê©Ï«^ætþÇÏž\ŸX½—y´üЧ"N‡~l¸þ e¤+&>#ѵÏ'âiÀ©Æp¥~Æ'©'¼ÒIõÒûäPFžâ6ò¤½Ô„#ï€qÌÍØŽoô"JáFô¤†R§ýÓKMøg·É³ÖºOƒ÷Ù£’?úÃEîIsz© {†Ž’2e:¼ôµŽê6§!6•1Ÿõ{ˆ€ðM#=ý{€1”{£õiU4ƒ*Oº *=ÒtøÙI “åÈ!=ž¹úã|©4KxWò¨hH0ÆÀaÐ${X{ „o௠Ï:µÓ&-°tð)Œë4U$4 Ý^.pŒ—k¼©aGÁ`SâùP³Û”¥ƒŒµ  Üƒ˜–‡îQC›ßýÂ/j|ÕÐîjBϾÈ5úX¡¡p¤é ÊÀ=‘‡TfÚãnÚ¨ÜÄ ¬º·œ·ƒgä¬fŠ»Û¾,à^NÔ‡7ïIÒ7¤ê\°$Òj\Ÿn^¿Ç«¹îlƒê +<~ _#h¤»%~²ÐXH@;”âÓW¦†ÆêÊ•©„~`@޳ÇkàíШ6ær‚nòÁ/€enªkÅ/éîúä>‡¸ž-Æ+ïÆë¤»lNì~òT§13`V0L…oË.Lã(5i0?ürùÍ©/ þ¤¿‹®Ø`~|ÉN»§pÄP(ЧaDCÕÒßF°Öh£¿?Š ?"©„ÎCR{ü[íúRA¿JxqÀ‘î“ÖË@ +m‰“×ÖË»Ž º¶tIç8¶õbÿÁÊqý×n…¹ð¥Ç |ÁŒ›hç›z‰éþÿØÖ§è©ôœð·ÅÌÿ';4K¹™,ÿ¼Äoþ ‡x×1SI"§ûÅ Kd*b¨ }mÒcÏöÿuÁK Lÿ'#“ÿendstream +endobj +1727 0 obj << +/Type /Page +/Contents 1728 0 R +/Resources 1726 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1711 0 R +>> endobj 1729 0 obj << -/Length 2567 +/D [1727 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1726 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F62 1351 0 R /F63 1354 0 R >> +/XObject << /Im2 1340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1732 0 obj << +/Length 3200 /Filter /FlateDecode >> stream -xÚµY_sÛF÷§ÐÛÑ3§íþ'Ù<¥‰“s§ur®2s3m(‘²9•HE$íúnî»°%J¦lO›Ì„+,Àb°k5‘ðOM'¤Ií$N­pR¹Éb}&'70÷ñL1Ï´gš¹~˜}÷ÁÄ“T¤^ûÉl9•™$j2ËÞýãíçÙÅõùT;yq>u^F?\^½'JJŸwŸ®>\~ürýö<¶ÑìòÓ‘¯/>\\_\½»8ŸªÄ)X¯Y‰.º ÑÇë·?ÿüöúü÷Ùg³Ý^†ûUÒàF¾žýú»œä°íϤ0iâ&÷ðC -•¦z²>³Îgé)«³_Îþ¹8˜ KÇüçL"\¢ãj=æ@— -o´ ,«¶Ø.³Eû‚½– ~]”Ýeå*›¯Š¿ãAJp±· %Tٺșk¨Îë¤çº/W+RÑ5éhoYé¢ÞnÏUͦ®ò²º¡ùæ¡i‹5±äÅ2ëV-Ml³ê¦xã$Žj²½/0~˨dž}eÛ ™“©Ò©0Ò&0R"uN ëûŠÎ–u5ßÓ¦ìpër2ÕZèD§a ÈžÞÙi—o¦›z ò§^Êè?ô fÒPImiä3î ÿû&Ø#í2ýëdh0Vh“Wu[|>µÚGëìfd5þJèhpô54ž3­é–Èú›”zQU»z ú* "nXâ²Þ2±è¶eûp®”Š Álb£·4•My®@ D3—ÿ.ú¹MQ嬻®è{—m˺câ&›Ž9p  AÝ`DXÍ; “F÷ ¬Šm¶B³‘Lû^Ôë5¨#Ž’W,êªÍÊŠ~d-M®Š¬áyåMbiÈG… ¿IÈA&ÏK¢¦Q½¤YpXÐXo€Q ÜŠgÂjVMM£öTì0òFyN¿¡R¦8N~[TD„ÈÊi´Îhr΢ں&B³ÎBâ- ÒÚÛ @ÚtÛMM¹¦M”†ŒõîlÀÊ|TÜ‘%AíÈÁ-nqQiÁìrUŒ€÷ÂX£ž¥}Ê\d¾…£N¢®ªa=ôÎ\UÅ=³ôvï ˆY×Öë¬-5@šóÂl³Y•{›aƒMÖ±Îú/ڌṪ³¼Èá—•F@ò:ïNÀhÖá·¨u·Í‚?ñw[Ób3÷¦Ï÷Çæ*bu¬ÙG÷ØòD -ïcÇ 0,Fœ …ôÎ…úõ¼ øü¼( l` o‡BF v˜ãl¿KÀ@e„Ñq|˜Ncp†e`gø“‚=PâgM]„ñ²"èYDXR¯éÅœ“;;qÌ© £9K …5bŒ- þêª}â Ë#ºN¸¨B#ø ‡K²öÈD¼G%§â ñBYíž [-Ò8a&ʰ†„‡ÄÇÁ†p[ÎY‘BN’ªs°wIߦ^3%à£NMô±‰ÅŸÙzÃm 8A¥3Ҧ—«Ëa~kFȆ~p>èª[@>×÷c[× lÝšç3VKì½¢þ%èkoë®×DrD¯~³-ïåBˆž¶P -kRÓ‚,\W`¸*AÐW4Â& ”].yÏÝâ–û¯„(?p 4Úí#ÙhèüªÅªË - WªˆÊIÍØ¦X”?ÄaC• &s¨·‹¶È± ÑlS´4…ÇŠ„¯]±} R°JÀø^þHx´,ká(7ÜÕD:ÚÐu@ߊ²{_ ÔD³%·ïŒ.êiU}Ï“sHô"ô×0=/¡+LÑ!w a¶ìB`k²5óô Ã’U0—ï7%ûŽ樶eÎ<£ýjÀkQÐjœ5n4Í ºÈ°I0ÚwᎣéÂb©ùÃïðŠƒ+9ª¢@¶–;=D–ptÈŠ8¿äu}6Ùzߢ°˜ÏfèŠ`Õ‰è2‰¸ Š”XÓÔ.Š‘°‚bå•ïû=òÅ‘¼©µÂ5ñ‡è? 5";vÂY˜çoC¬w fÀ³²Á[is™:„£Ø…[+£(;FU·žÃ5T…‘гÅxëݰLºÎæDÞíàQžÚ4Ìš SáuÙ…iìRŸN¦û?•¼:õš<îý[ÈŠ½ð1ÄÞËwÚ¯8…#)^C ðŸ†åbaµÖßF”‚~=öìîÏ¥Ì50ý9”© -endstream +xÚÝZ_sã6ϧð[•™šå_‰zÜv³½t®ÙÞnnnîÚ>(¶kÖ–¼–¼iúé @Y²eïöúp3ÌD  ð#BV3 jæR‘æ:Ÿe¹N*7[l®äì Æ¾¿RL3Dó!Õ·÷Wß¼1Ù,yªÓÙýã`-/¤÷jv¿ü9I…×°‚L¾{{÷æöû¾{uÙäþöíÝõ\;™¼¹ýû µ¾÷êÇ_½»ž+ïTòÝß^ýtóކR^ãÛÛ»×Ô“ÓãÌ¢ïnÞܼ»¹ûîæú×û®nîû½ ÷«¤Á|¼úùW9[¶¸’ÂäÞÍžáE +•çz¶¹²Îg‰=ë«÷Wÿ茆©SúëiæÖ ­`/a«´Èsg§ÙJ0†iªìùµhž„µ¸gŒ—:˜7ͬHµÌ{ój=SJäÎi´oª…ÉT:ËŒ»À¼w¨à@˜ —Z…tJ +g4(Þ^ÏS•Üܘ–”™Îf©÷"WÏ>Δ6Ï Ñ Úa§ „Žon7zöºýÌ[ŠëÎ ‡¥zXÀ)÷Ü ŸaÈû¾,C™OŠuÛÐîR3˜dìpO»ëvEÝ>^+™”»k-“yÛìCcQòÜ!ÃÌ cÓ”çõrb}• ããòuÓU/—…½æÒ8ž!ŽUlÓ\hŸûYWýy¼ 2]ž`˜ÿshCPk}ð0 ð©‡I©õ¶÷0*ø )eòŸ¦.É Ü_+¥’` r×€—ƒC¤SáUÖ!ßbÒ4Y-56åbUÔU»á÷ª¦çv]€)B³kð™%Å¢ºVɺꊮ¤®ßƒ$¨"¼¢áC£-;j¬«MÕñhÃLºÏ.6;fÂæ‘'4Å’¸t«¢Ã½ánè°ª2OT‹ŒMd€ÏÀíKÛ•p±p|{›õºy®ê'žµíª¦æÕŠívý«4ôü½×{Ïù‹N‰Lq©™ôz:Ú0Ñ|Hu =U8RpfçthŽy+éDná´_dÞSMpBG“;áþºüEJ]—hH Yò´nŠ5u­«¶£V0$ŒÞþÄÄËåîZù¤l[šŸ1‰OêbSR«-wŸEš Osi&¿ Û +mY3ÁÝÛûÛ7ÿ¦ö8Oe8€ð6:·:´çUY—À&Ã6Àƒ?²x+ê]4Ûj$UÄ«ìq/“ª¥!Dk¹ü^¼çC$qÇBŠÞè V9ì^Poå’(âü¿¯˜ÓÝû©³@¢/šð\.!@8@zϹdU®·Ü rÀ³¬Û}¯Vì'mC v^•LöF™ eá±çj½¦ÖÇ}µø€ç…¦×¨ZXù‰çÀ¶X¬»¿ÐöÅx;dŸ·á(kX=èU[‡vÒÖ&Ûf×QkS¼P㡤g»-BU‰Ï²ÃVY,Vì!‡‡LK€yfMŒXããut&àà¦ÞŸ?4±Ž¥(kfO¼$Iñ9šT0\©Ë³±>â–áÈÀ’;lz4XMÌ,_>ûu$}¤NÈÍ@ã2Oni¦*B¥¹i—~©"2-ÓҙǕ«–X>UŸJ–­ª©«˜à áâz ìáTòÒr±Þ@-FŸ œû¯iÙŠ9±§TíªeIú4Ê!ô(t¬Ê)d»Ê˜™ôáÀX5P„À)ä8u"%fõ^'ÿZ¡:Œ•“jð¹°$¥5¦çÕŸ‚Jä 3š…Aš¥¦è ®™bk! ™>›à*ƒVÄ;z·Ô°'€Eƒc·òȱ“Ö-lIëtŒâà×T\8NEs¹PÆê/Ã"&ízŒE\œ½´`*5_ãôôqÚ‡s‰oÍ.J[01Z jsO9öõ'_ªö°Á p^p„ìw¤‡r³í8·à£­_À¢5g1 b÷mQP(‰³€^M?¬“Â;—_N?†TçÓž +Eß¿Ícöƒ6ŸwÕ¦œWõI.“œ¿,ÓLˆ1 sp中 eÄxém<1Ц¡Þ@Tôɾ®C†‡Ãë¦~ +AIƒ÷¤V°›ÇxR¿ÐÌMUï»’»IžâL˜Rî6ÕœlœU9ìŽäò8ß•–ÔèYF4hj®àjÔ’µÇË-ªÍ~C/ŸŠõ¾¯¬=³-^«ZiŽ8^F’ÌDflö$ ¨. )RM"©Z®'‘d3¸ÀHwY’žjB”1š´Èðº<’å€&Õ£IѤI +ã9=·Aöæé`/9ºYªG–r¨tpÐ .Õ'QŠÁ¥ŽÀ¥à6 ;øÁ•žÃ–:`ëÿ-“ÂuÜüeh ©ÎC«§:駱}wê¥R¡T®.‹ÒSMÈ2ÂV +Æ’€Á‘0o÷ƒKCöÎwH¼ n¯ð:tUø¾°· +Ô”ë…VÅSS¡Õ›^8‚ÖCd5T r¿¦·2Z ‹çå2¤T ©Î{«IHÙÏgDé©&d»+/ ¤îca22BÊH9òWRü•Tä¯à9á¯`bðW2b‹æ% [׈!a% ^a«„–‚_UG÷mXä¯á³tÉäg«!Õy€õT!‰/wU±žÜ—»—ù+lÇÀ2¨ÏË0Íÿ¨L*rHSǼ_ŸPcF +Úô b³¬áZÆ‚´4¸)Ú.8+£†ó5Ýoá +GK"Às:«Gê`·H¼«‚ÖûÍ×5A¹Nî®V$³Ï,c>„Y&7xÙýí>¶¢°Ð܇ +¶ +z鹋‹‘ÚS ûè‚Ë­{Ž´Ëëyf“¯xµºìž›Ýzy(êåsµìVbª`sëU?ÔF±Éeì륀v„¸"ÑÂ.°â¤µŠ_€&,Ù­`E«3»çÞ¼ j(~I¬ áKKWYo>HMGl¢xÄ•úÌ%[§Âåñ¶6‰ú#¸fp+OÝèRŽ»V* !UuWb¤KðH8ó’kmHrp2âŠ(¢°‡½KÅ÷CìÞFº¶\4õ2èÀÐýNº“Œ0éÖ´<à Ç:C¼È Ö³A­ßèÐx,¥uä±×kJ L¬ö@ƒí ­÷o_qW0Ú ’‰‡½™A)Gª¶Ý‡RJÐMY ?y•ý1{¥Z j´þ`/±JW'HÆÊëkö¼;¬Å³*­ªÐŒ÷öà·õ4$î÷‡u2$Öú‰5‡‡‡¦[ŨÁ~ §ÿ„Óø”sÑÿ|™?Í”W—ÃÁê|8詎]QQe ”ég¸3ÍóQ,ÐF¤bÁˆ{¥Î£[Ñ>ñx°Œ9s¦S¬±o–gd?b +é±¶ÖŽŽ41 +äG(€žÃÁÅïñàÂ@8¸:‘Å~GFÆËp¡9œ™(¸LD°žsÑc à‡¡Pއ‘P0‡gÈwà Ñ«í+”\!uG”3™¾ü‰cxõÀ"`æâç7Ïé±lˆŸç +s(lWÌ/îÇa×Sw(ùkVÀ‰WÇ+êSݰ—8D‰‰’¨ÓæÎüÓ*©Ó‘i9pÜÖXþ§ˆ¥©n; +T±Z²*ËGŸ*ä6‡;q–ŸVtÃ=l÷¼3(Ú˜Òç,>öû¶ÿx®@ì…•ü1o˜ÙÌ)äœ;‘pƒô©ûŒ;P]p'‘jø©4äéÍnSœ^\´ƒ‰Æ\¢§šbœcJ‘f6‹A_®Uî†W|]`(ÇÆ“­°ÅF “žj,± ïÞPOJk¿žŠc&>·1ï9æ À3,0QP¶`d§ŽÃpt.„—y,Pãm‰×›<C](( À4U({T!¿Ÿ†ä ¶èŒ-q§„Ký‰už’,¤ÔGø ùAPÌú474ô\–¡¤P3y—363â'~£z´/£Ð(~`Vôu7ÖÍY{ÁuF«>á ÜÞ„m…ÏYòúî=õp¦@½!µÃ^vƒ } ?{è{ãUšUOcË©=i8 ¿ýBdäªþضX|`ÙÃï3€c¸‡S²„¿øÁo"ß}‡²k• ¦Î‚ŸÛ¦m«‡5“BîÜð8=XGb‡“Á/E½R™øU«bî›æp¯È SÅ—ðy£âozÚ$áz¨²~RS‡'´Úý¿…–Ës?{3NàïÐ&|—ìéõ§wø5Í„ñç~B÷këa +õÉSç/…ëNˆþ_à¦91endstream endobj -1728 0 obj << +1731 0 obj << /Type /Page -/Contents 1729 0 R -/Resources 1727 0 R +/Contents 1732 0 R +/Resources 1730 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1712 0 R ->> endobj -1730 0 obj << -/D [1728 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1727 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F62 1352 0 R /F63 1355 0 R >> -/XObject << /Im2 1341 0 R >> -/ProcSet [ /PDF /Text ] +/Parent 1711 0 R >> endobj 1733 0 obj << -/Length 3302 -/Filter /FlateDecode ->> -stream -xÚÝZQoã6~ϯð[e fIJ”ÈÇm7ÛKqÍövs(îÚ>(¶ kK^ËÞ4ýõ7ÃÒ’-{³×îpRä3œùf8$­&þÔÄä"wÚM -— #•™Ì×Wrò}ß_)¦™¢YŸêÛ»«oÞ¤ÅÄ —ë|r÷Ð›Ë -i­šÜ-~Ir¡ÅfÉwooßÜ|ÿ÷w¯¦E–Üݼ½Î´‘É››¿^Síûw¯~üñÕ»éLY£’ïþòê§»ëwÔ•óßÞܾ¦GÅ™Iß]¿¹~w}ûÝõô·»®®ïâZúëU2Å…|¼úå79YÀ²¸’"uÖLžàC -圞¬¯2“ -“¥ihY]½¿ú[œ°×뇎é/Ò€l"•F½ˆ­ÒÂ9“³•` %ò\eçç¢qæâj1œê`Þܤëj=QJ8c4š7×"-T>)Œ“çdÞ[T°§tÂä™BB%a ‚{Š·ÓY®’;ø¯“sÀœ²ÐH¦„M5rž|œ(!3çR¢éÕýJð ßܬõäu ë™ô–æõ&öKÊu°€S BîP±yîå}_U€¡Â&åªkiuyÚ”)XàžV·Û–M÷0U2©¶S-“Y×î}e^ñØ>ÃÌŸ[6‹‘ù•© Ó7í®~x¾<)¬ÕI°Ç*Îr'´uvÒ³îŸÃ "Ó¸sÀüŸCó‚*Í{T#&‡ŠÓÀ#D•‹↔2ùgÛTî¦J©Ä¨Úv= †éÀ‰4ê„-OÁ¾’eÙQe]Í—eSwkþ®*7«lá«»Ë"y(çõT%«zWî*júË≢þ-ï+]µ£Êª^×;îm™ÉnÉ£Ëu»o˜°}àm¹ .»e¹ÃÅár¢»Fhzž¨ «ÈKÏ+Ýs·«ÖcSò]h}hW«ö©nyÔfW· ÏVn6«gž¥¥ò¨øÈùŒF ðÈ|b¬Óz|»a¢YŸê<"•÷)pÚyÍ1o%!neàî™Gªî}ì(ˆr'Ü_W¿J©› - ©!‚`Q$«ö¾\QÓªîvTó†„Þ›Ÿ˜x±ØN•Mª®£ñ“ؤ)×Õºjû‰P¤Ùð4–FòÆ-OÐU ܾ½»yóª¯CùXy‡€p£]6„ÎÓ²j*`„“~ÂX¼%µÎÛÍ3Õ’*àUFÜË¤î¨ ÑZ-¾†kÙ‰$®¸FHÑùQo–ÃZáõV-ˆ"ŒðûŠ9ݾúmS$ú¼õåp ;„¤{ùŒI–ÕjÃU/”UÓí£Z±´ 5Xy]1µ_»ïe2”…ûžêÕŠj÷õüú oPµ0ó#ñ*€–X®vKþ å‹1×~ë]±\Á”â@¯:3h'eɦÝ.Ÿ©r_QÙmªyEUbÃSì°V•ó%‡È¾“i 0/²4lYC÷:ò pÜÜš°ñ÷M,| @)ª†ÙS‚ -OIR|• W£En\1ÔGX2¸ L¹ÅªEƒ5ÔÈlÀòÕC¹_Òj„ä 4.]ró@0ìT*·Bk“¿T…–ŠiÉçqæº#–õ§Še«j*GxÂþ {ØÙ½WòÒ™&¨ÃÝg ~ÿ5M[3gÂ"¶´€ªm½¨HŸ©2È#º *lD…ÐJ†Ô$ni¦zê€-pL#’£N¤Ä´Þêäç%ª#Í䨬Y!]_ žéyõç yÂŒFá&ÍRÓî •];Æ6ƒm(‰ØPÔÞ1ºå)G˜ÔöLvÒzKÒ:¢ØÇ5f€ -o§¢IR¦_†ELÛõ‹89G'¨ÁPªÜ{¾:ìÐ÷ ¨ü¿Úm¶db´ 4s–rl‹‡uwX ×/8OBú;ÐCµÞì8·`×Ú¯`ц3°¡b×m^ÒVF½:›~œD–ÑÙé|úѧ:Ÿ~D*}]þ> ÙÚ|¶«×Õ¬nNrg${Y¦c€A8™p:㦹‡”÷K›Z? µ)ìŠ6Ù7Ïð°{Õ6~ÓGR=©æífq?ižiäºnö»Š›I–ö?¤Ú®ëÙ¸HAVU L.¹8Î7ÑÙP急Ғ*‘e@ƒ¦êÎFY{8Ø¢^ï×ôñ©\í«áÌÚ2Ûò¹7k&Ó#Ž—‘¤s8_Âò.#©GuIjIõb5Ф¬’ÖË’DªQ†hÒ¢pÊe9 IE4©!š¢ã!Iá~NåÆËÞ>l¥@‘¥"²”A¥C€fp©˜D)—:—‚ã$¬`?^®ü¶Ô[ÿ5hŸAÆñ™#Rè<°ÑùÕîw§!*J9uQŽHt*ÈV9ØIüú’¼ÝïVòv>=â wn…Ï~ÂïÀƒã”§¦,Ï×jBhòµhXøàj÷UJ¶"È2þM(ýÇ©4u"WŸESêœÕù85ЧT@ÞóQ"Õˆ,Ã@eE -IûP˜¤R •J9ˆTR"•T© ‰T0ÐG*°Ec}¤’„­)bˆ{8RI‚—Å*a€å¢€ø5Lòÿ­´ƒ¤[js`}ªó‹T>}¯¶u¹š}ÜWÛçÙïÖŽ•¢>/ À4#ü Jsá A -ð~U~B¥úp%¡ÓN y"¶‹zîä¾ÏKKë²Ûù`•ªþxM'[(ý•Ñ‚Ðo|cý@ ‰w]2Ãf¿¾ç+MP®O€-{€«%Él]‚˜a°§'×xÌ÷íÝ>Ô‚°PÝû»'¬•T鹉¯!µ¥Û+l££5N·Ši•ÓY‘%_ñlMµ{j·èã¾lOõb·½Û¸›: j`«÷·¢Xå l‹R@ÝK©A˜‘haxפµ -F@ãzSvGszXÑìÌîi‰çÄ9OˆòW>ž$Ü -áGG‡XΈ(:y†¥ÏýÍ£]§¶‰Eó¤édäxG.ÏÈ~Ä4τβl bè/<™ZæÇ{æ`~èðæ‡60î|¿%È{Ûûi8ÑÞß$ã'qÈÏ—¦ö#ذ“üu.ôø W(ý® %ÄÀnM[4R糖vÞ4^Ÿaf¯x‰T˜ð|ýŽŠEKü,ßp9ÏvÉüª±V=æ·}‰ÈëY'±Ár<â<6-§‡X3r¥fÁ´Î¤_`Z%u>0-‡Ÿ›¯)îiº÷„»pÛ -²‡» Ã]ÿ 3gªâÈsãSÑa¹ø -C!>">°¹ Y =‡,èsßÅ·¤sŒVPÉ—ÅÀ"+ì‘B΄K“²P—ÃIŸê|8‰Tý§6Ÿí=´ÛuyšþjÓô²‘jDŠa¦"E^dùP zúTÎô^üœã†€•{î'[aâ=µTYà5®MxA‘”Ö}=¶w¥…°. »È1ž`‚‘ É ŒlÔñ#ø‘_+]¸àÄœ›çu -[Mt -J*ü=‡ÊŽîµïÆaç ^FÎØòwJ˜ÜžÄXcy[+|B-¡‡}ÈRBSÄdÉ´T.*0m˜œœÓS³<ĈK|N¡g¢£u¥ -b{6aÕH‹P7C?k/Hезé”!¦~YþùªH^ß¾§¾!¦VŸ `+‡Á–^Óü³yl /r4$¨žúckÒà öBd8‘©ø€²)çXvÿ¾ýiŽ®äñ'#x§>PÊ©ìZǯ‰ÔXr¹i»®¾_1)d`-÷SÁ:£8ÔÂZõRÔ[!U^Ejæ¾nÙi‘TÞýõxÍoB:Mîý!CqPÛøs ÔºýßÒªï¹5ô¢ûg:`§U¹ƒíØ?nJLôŸ¨“ϾJ§|ÑŸ;°ÝA†4[œ§‰[9ôYñ;Óý£ìõe CmóTÞv38dŒ»zêÄŠÌöUÌö§7æcêO!îÚ­è—˜twTÒ;¼–iO«¾õ‡%Ã(¦Ô?Ösº„èÚnúyj `hÑ>u4þ ¾ Ç”ÛÓ’kbdõ`Î"wÙ`õ…E| -³¦p_S3§T”Žß€îïVèárQ5Ã_±”üûžþPahÙ…SÆýó “ ñ.5ñ¹‘§Q*ǯދæ™_¦FàOGv}e÷§xø!UVˆÔÚ3Ç ‰Vfa -WPÈÓ´I -Іý_ãe˜$endstream -endobj -1732 0 obj << -/Type /Page -/Contents 1733 0 R -/Resources 1731 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1712 0 R ->> endobj -1734 0 obj << -/D [1732 0 R /XYZ 56.6929 794.5015 null] +/D [1731 0 R /XYZ 56.6929 794.5015 null] >> endobj 490 0 obj << -/D [1732 0 R /XYZ 56.6929 672.8271 null] +/D [1731 0 R /XYZ 56.6929 651.0585 null] >> endobj -1362 0 obj << -/D [1732 0 R /XYZ 56.6929 648.9121 null] +1361 0 obj << +/D [1731 0 R /XYZ 56.6929 627.8611 null] >> endobj -1731 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F21 930 0 R >> -/XObject << /Im2 1341 0 R >> +1730 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F62 1351 0 R /F63 1354 0 R /F21 930 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj +1736 0 obj << +/Length 3177 +/Filter /FlateDecode +>> +stream +xÚÅ]Û6ò}…ßÎb–Ÿ"õ˜&›Ü×4—nqÀµ}m9+Ô–\KÞíö×ß ‡”E[v$ÀaÕ’Ãá|ÓbÂáOLœa\åzbsÍ f²ÜÞðÉG{{#Î<"͇Xßßß|÷FÙIÎòLf“ûõ`-Ǹsbr¿úuúêŸ/ßßß~˜Í¥áÓŒÍæ&ãÓïïÞ½¦žœ>¯~z÷æîí/^άžÞßýôŽº?ܾ¹ýpûîÕíl.œ0_†.Lxs÷¯[‚Þ~xùã/?Ì~¿ÿáæö¾?Ëð¼‚+<ÈŸ7¿þÎ'+8ö7œ©Ü™É48y.'Ûm3Z©Ø³¹ùùæßý‚ƒQ?uŒF9fœ´# ”rÀ@ÁÖÙÄšœeJ*ÏÀÅól®ŸîgÂMËMÑUåûx>­Ë'l7ÅcÀrÿXîÛÐ’zÚ–Ô_´4‡x=¹Ç1±Æû+ ×+ŽcšåÌPgS?žœU ס]>½(‘Óp18ÊsæŒÎ x’mQ?Ïm2ïGæB°Ü銺}ÒÃJ2Y $ʘ°ÐºÙo‹î™ËiÕÒ·Ø´ B +޼Û5û®\Ñò¿Ä¿eY‡‰?VKßÕ´Í:týgfÌ´ªWÍSKKÕŶ ü„ƒÊ\ûƒzÜU¹.›##§Ï8³ÈÚןÞ2n¹ ±‘½ 36¡ÛÃRëÒŸnxu¾¨L÷S¶Å3©Í¢¤ogÞW«UY‡vøôÙ…Õ‰9ajÑúË@0¬vh«ú#ݨ„H•1e"aµ€êeY¼þ¶+ºr Éδ›3nÀðXn@M>nÍÒ|ˆEÊ(ƬYIJ¶Wõéæ®)ãÂ^ß½ÇÙ>±Z‚ÍPéö^úP­·Å_Õö°¥F}Ø.ðnÖô­êEsðJ ¿›:ÌëéÍT#„–EMÀ"`îgnz¨k¡©—‡=)QÝBLÑ+µ[‚ݲ©X÷Š¢¸™>›CI`Ô-R¡tJGI|DâÚQæ<À]MÊ\^âFÄ0ÇUv¢!ñO¶dƒ–~ Hq»+Ѩ xØáW{©öÀžGÒ‰e½ þ2pb°ÎâUxÛ ˜‹CàJÕûDnÀÅÈžäAƒeêµ´:·<ª—6M±JUv0´,6¶Ï-¨ÐEýÉŒ`ÂäÙuýb]ÖŸ+e|sèÎH+&4w×·ï±FöOÈ1!¡+!ÀkùQƒ°5HKî/ û€À BØ"Bh BˆN*„^…XÌ¡ +!ê"Íbm&SÕù¯ßÔßa4é¾EKüy(Û®Aßò¯eÙ†>Z?±ëBø©!§Q™:€‚Áëd:˜»‡=1i[Ónã[ÌUæ˜Õ&åÒ7‹t L° +4ãªb]¶‘=ÖYÑ6‡ý²<7‘’åR‚ˆëTcYÎÍç‘q*MÀ5ë\àÚªìÊý¶¥Í3ðôPaŒ` ”˜«‰|ÑÈ'ª`4ñl.`w uݽÔÝ¿zO¨q].»ª!AÇ‹g’‘^9zVô›ŽÖ‚ïºì<]z£Ñ&{┣ý7yÈ®\tì.µ²JA8ÜÑ@ ]Ê“d.ðwZ†v8 l3`Ð 0~—=Ù´Ùáá‹÷*ÐkÛé/¯ßSæã/¨/²ÁbŸàg1 »>P'„9ûŠÈÎŽ{ÂäXƒˆë­žÁdUK?ìV :˜µ+ ‡ZJÝtéI¢6zêÑÇG²Ïî[jù “Þúà‡‚g‚áò;òŽ›'ú¢70Š‚$^ÚC`–$‹ç÷x@*—’ì‹”`_fbJH +ä®s],ÜߤÔËMÓÎÇNQ"rhá°v&fÊã?¼¸ðöp’i{ˆk»]Yì©·ªÃ>a­tm…kÿc´R"2fDý00§yš÷š®î™ešËh‹Iüh”©à‚Ë!—JE–˜¬è0³EIU +ÈdO”¥BeÓjMˆw©Pt‚ðùËê7Î%Í\¦ù±h»i +ÈX÷ŠCî,ÍX çšÙ“¼µIŸ`ƒ‚옌1ÄJˆìN3ŒN˜ÿ‹Œ<0t$Ûa¼ fôÀ• aOq$`$zfŸ B”ÍaEÞº‹Q¡ÐÌÈ/åˆ`\fúÔ}F™€ C»“àö©êªúZ‘J[f lö'>ßYBT(m¤¶Ù¬»ºÌDâ<F×á6ìÖiŠ×§s`zPô>ö)vbϦ< beY ÔÔîsêÞÊù2¾¯{ƒ‘±ˬÌ.¯Eó8¬À8#]j©ßåX—>L¢ú»B`²¶Ð~H25eQï\4¾’qŒ¬þi6ÏÄôþËéíkàã ìO{ä‚ïøîn+'¯8Ódx¬¸ò|¸´?W–$‡tåŽt¢Ž"Ñ?74¬ÂWÊ ŠÌ§’&¤ú<eÀÙT>†žUS|ôv Š8äD =¡§ì:Ò>h½Æ^R+Úl>Ù{h¬gçÓzâ]( ²H,g’OÿÀh뀨31Ô¹…Ü âíáEì@&Ʋœ«Éüøóu’ ÙÃÁ9¨¢ÒW˰½Pµªë‘uuÁ’ͳ3±Ì2HyaµáçÁuÄ!$10ŒV«Jú +OK »ñ¯D#irÆ„^¸h‰ÁG;×Wr_ËS»PHúû¬¸êVÖ•ýC¾`”«³T³‹i‘÷ol®®§EC¬Ë—×cQlÒÍ?'5Âãƒ|\¥#"БÞxn£ !/Ñ[‹•ûºð!–Í…B÷ØÆ@¿¤ñ€N>z6Uë_Ìá&¥D›©¾©—Üæ;ÉÁÊW|$¼Äqz»ó,|úŒN§9Pc…õ0.‚ûã˜Øc.‰Px®á¤5(Ó :8b„/ß­÷v^…`•Þ'"FCßEhc.‹u9ž¥´Ía³ +p_Áë],šEY'yF2`{XÐË4Q®Sž b`¢…TlßìBȧ SKR6F|Ö€Äç@‘L„=³X•»²‡]SÇ’FØ*I§>Æ(ý¿¯8ûo‹ü{ +§ð}‹"ľåÓik`кnjûr½§ä˜ü#‘v`æå€b¨_§eÿç€B(o!ÍuŸÔc]ñIcA…ƒ ÉÅp“s·FHI¤Ï¡që’ÐòÒKº%lÞ¯ •Ôœ¬ üÚÆÔÆòh[Þ»%„ÇÝwLˆ>¾Ì†êfZh™º&Oø¸kKyüª+é"Ȫ­>ù%Çå á” 0~¼¯*_sM1hq9“Ä]lH—e(" ë¡ Þ;z•k”ôHç¤$2”ƒ¨i—%´üâß´]´.O„ɹ¡0¹| L- 7aLšt2TþƒLÝÛ°ddBÿ ŒC£Uqœ±¿«ðƒ¾X.³TêfìáSƒ°F)jà|{ðMñ5µK^[ƒ(Œî(¸bVæ±Øð\Ž=X@¼Äù +®ÃŸß¹XJØîŠ®ZT›ª{TÁ.ýnN¦Õèó>ùêßÔp¨-Û*Ç¥ü.(_n#QxN+N)ï|wNúÿ€Çöendstream +endobj +1735 0 obj << +/Type /Page +/Contents 1736 0 R +/Resources 1734 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1711 0 R +>> endobj 1737 0 obj << -/Length 3226 -/Filter /FlateDecode ->> -stream -xÚÅ]sÛ6òÝ¿Bo'ÍD ¾>¦©ÓsçšäR÷á®í%Q6§©Š”]÷×w ЄDÉɤ77™˜ `,û ñ ƒ|âtÆd®&6W™f\O–Û+6¹ƒ±ï®xÀ™G¤ùë›Û«×ï¤äYn„™Ü®k¹Œ9Ç'·«Ÿ§oÿùæãíõ§Ù\h65Ùl® ›~sóþ[êÉéóöÃûw7ßýôéÍ̪éí͇÷ÔýéúÝõ§ë÷o¯gsî4‡ù"¬pf»›]ôݧ7?üðæÓì×Ûﯮoû³ Ï˙ăü~õó¯l²‚cÅ2™;=y„Ëxž‹ÉöJi™i%eìÙ\ýxõï~ÁÁ¨Ÿ:Æ?¥]¦…2“¹T™3°Æ(—YÆ4pmnuž)dÏeÁǸ±Ëݾ¨Ûu¹oçU}|d.mf·“áº'»÷X#Û‹Áö\‰L;™n{_ÎæR¨é¶ø£Ú¶Ô¨ÛE¹'¸YÓ·ªÍ¡^QãϦózúCó¾èZ5‹€¹Ÿ¹é¡®«ú. 4õò°ßϸ›–u·yšqΧ($Rx²€Àv´ÂÑ8Ïr­…§yU®‹Ã·azúPl%U‹s^¿SC¦[ž9©,° -§rF()cÂÚ„(Ì›zI¤-RL³† k9&M˜u|G[²F $ämñD·»²\xØáNìy(= we½ þ2pâ¦x]xí+€sq\©:bÏ5ˆ¾8b`±iÒ5O ÕóqKêñ„ °iŠAM}2´,6¶OmWn³­ ªa™Êcêý`]Пˆ•2¾9t' -¤dÆs—·ï±FöOÈe\@WB€× Åóg ÂFÔ %˜¿4ìƒ -a‹T¡ -!:©xB`0‡*„¨gTˆ4ˆµF¤7ÿ_¿©¿Ã°)µh‰ßeÛµQ è[þ±,ÛЇIï¿Ú‚¤yð±ÚIX”Ã5ׇ¶\e(žŒX…C½c#h°ßtLƒ%Øi–sñ%*|F -a™`O.Jáë¼öX©îHgçu{"ŒÚdÖåæ2=Öɉ ϬeyJq˜³gaÄFFÁrºCΞÍ96HÈ¢ozYÄy^±k0Od/™¿Fs2×`€…ÊS9\ûy Ò—³iAŸ»ê¡¬ ¤e·MWR».¶jË=šE°Ðh¨EŽœ…*ªüŒP ¥2kxô bÌfg¹µfà$û,¯ÜÊO¼B*G;YNÎÙ¡wðGõÞ!(3ßm{.R„æ}h<ù .F|ŒzŸƒÑg@Wï3„ >:«ŽðÈ;`ù)èJ½Ã`K¼"¡wH¨^"Ð%zR—xÊC–ÊÊç2\¬½ºX'(úprÚ< P®V(aØß„oAÃqé@M…KnøDh‡–Âèê(D9¢$=ÓÒÈc!¼ŽQyÄÜÝHÛšvßb.ˬÒ)—á§ÛH~Ña›¶+ÀMƒÂžµ‘ð?“î\>mäë¼ì±†¼ >7‡ý²<5‘"Ë…zˆë*¸¶YÎôç‘q,MÀ5ë\àÚªìÊý¶¥Í3ðx_-ï Œ!äÓbµ"‘o#ùDŒ&~ƒÍ쮡®›Š Û· 5®ËeW5$èxÑàÌA2Ò+GÏŠ~ÓÑZð]—§ @¯âa4ÚdO\˜òlÿuîÅÛc’ƒv©••ÂáŽbèèRž$s§¸Ó2´Ãa›ƒ^ùƒ±ÔžD™6;<|±ñ^Úam;ýéÛÔ³köÝ+ê‹l°Óu³OðMŒA®÷Ô aξ"²Íóž0ù±ðˆ«¸Þê LVµ¤ñÃnªÓ"?jM(uÓ¥'‰Úè©D ½SK-aÂ[üPðL0\~GÞq³ñ„@_ôfFÑCÄ  C{Ìdñü÷HåR}ìËŒO I‚<Àu®‹e˜ó‹j¹iÚùØé JD.À â!¶ÃÎÄìÃ@Ycü§·÷ÞžNB"mqÍb·+‹=õVuØç>¬•®-qí´#6Rr“in¢æ4ó^óOÕÝØL1m1‰í€2\°ÌrÈ¥R‘%&K ú̬CcQz7! “=R>” -i¦Õš)î´ª¥ðùËêÆÍÓüX´Ý4d, Œû É wúȽhöëCmÒ'Ø  ;&bà@ ±"»ã #„:äÿ܆ŽÄc;ŒÔŒø¡*žâH(:ÀHôÌ>„(›Ãм3t£B¡2-¾”#Óƒ¢wwؤ؉=›ò$\à vPf¢ Ò6çŸS“ΗÝx=ŒŒ5™±@õÙµhƒµg¤KÍ#usÜ’3£‡ITWÈ@ LVv¢ M›¤,êý€‹Ú@ ˜€KYýa67|z Åôú„5°¨Ï7Q Ì -W>ƒ›ü>IR¹øXûÓ>sÁw¼¾ÙŠÉ· œi2\ÚŸË$É!œ&w (à9D>Œ"Ÿ› Vî+eEæS‘éŒèý eÀÙT>†žUS|ôvh»ª§é =eבöAƒì5ö’ZÑ`óÉÞCc=ƒ8'˜Ö#ïBaÅ@b9lúþA[Dˆ¡Ê-äNo/úëd2±ÌäLNæÏ…ᯓlÈæ2}Šs~!´Æè^@À®øåȺÇ:cÉææD,”Vîp\G¬BÃh•<¢¤¯ð´”°TŒùgm2.rþE–|´s}%÷Õsyj -Iž·B݊º0ÞüÚ¶ 5ÍÑ!ª9›IÈ£Œ/¤EC¬ —±(6éæŸ“áñA>.Ò‘FèHï<·ë“òý±µHP¹¯ bY3(âà0¸Ç62ø%tòÑг© ¦]¬z,Uæ gƺ/uÇFÆ)ë¢Ú´èz5æg!ÊU4Ú(Ì‘ÛÁwç*s¹ÔãņÃ$i{¿[1xÖM -¸{kùßã&VÔX:?ìÎ9/) TäÂò—¼¤ÁÑàzþV/ Yßæá%‡K_ð’p4@ ÎÿÆ?±°éºæ@VÄajÙ$BáÁ†‘Þ $Lƒòà Œ€H¡¿óJ«ô^1ú.B³Y¬Ì1“RÐÞ7‡Í*ÀeG¼¿w¶l¥$É€íaA/ÕDÉNyÂE&´ŽV’±}³ Aœ -sL%HÝ@ñaRŸ D2öÌB`UîÊ:tvM‹a«„ì»G`àkÎþÛ"ÿÃ)|ߢÑoù„ÚÆ*¶î1§Äƾ\ï)ý‡¦ÿÈG¤˜y>¤jÅ×)Úÿ9¤àép§^xÐè±.x¥±°ÂI†ôb¸É©c -H#¤$Òç0$³2¥å—6tLؼ`A+©:YN¶Ée!Õ¶¬wL;&¡$ï³àól8¢Þ) ÉEêœ<áãÎ l¥evàœH/Xe'¬:~³=&“ÖõuåKÎ)†-\ŠÌ‚¼Ú .ÈP@:5@—ƒ¼wƒ÷~’é””D†r5åLBËOþUÛEûàòD˜œ -“ËÂÔÒpÀ¤ùg'M@Áä½ Köa&ô -94ÚQǹa)û›±?è‹e¤2P7cOŸ -„5JQçÛƒoŠï©]òÞDatGÎdfEË O娓DlòGœ_˜f¡ä:üa‹Å„í®èªEµ©º'@ågÅÏå™\^¿Òyñ‹HĬ®Z?8J‚űK{÷H—7çÌ·‚ ôâîÇɌ̤6|ä}k~¡È‹¿äï Ø›ÄÞ0””Óýï?(‰ÔaÛ¾nŽsBÝ‘©|Œ£‹ðc/ZæcÏ Ò“Åo[R±ÀN߸½y÷êÝů#c±Òb/bR±‡b±×8*öš˜Jà6áÁÒôïs«¦ãõ^“ãO3ž_ÿÀÄ>ºIü=—G3ª§¥MZÝ]nŠƒ”“Šª‘R™Xs@†2Ü$eg…±æRµ‰öò?’ã‘y°Ý è뛾è‹Ðxe‘+ˆ™ó¾^ùb¶Ò 뽸¶¯÷"Ð?k*»’~ÙuæÇyRgø‹ºmb}BñÕ?Ü{þU#Äí&‰qG!4øÑÜF¢ð„–S®Q"ÀÝŽþfŽ-òendstream -endobj -1736 0 obj << -/Type /Page -/Contents 1737 0 R -/Resources 1735 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1712 0 R +/D [1735 0 R /XYZ 85.0394 794.5015 null] >> endobj -1738 0 obj << -/D [1736 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1735 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F62 1352 0 R /F63 1355 0 R >> -/XObject << /Im2 1341 0 R >> +1734 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F62 1351 0 R /F63 1354 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1741 0 obj << -/Length 3298 +1740 0 obj << +/Length 3474 /Filter /FlateDecode >> stream -xÚ¥Z_sÛ6÷§ÐÛÉ3Šÿ.OiâäÜiœã>õú@I´Í‰Dª"eÕ½¹ï~»X€¤$ÊI&íL‚‹ÝÅb÷·»Å„Ãÿbb,³^úIæ53\˜Éb}Á'ðíý…ˆ4³D4Rýtwñã;•M<óVÚÉÝý€—cÜ91¹[þ>µL²KàÀ§o>ܼ»~ÿÛíëËLOï®?Ü\ΤáÓw׿\Ñèýíë_}}{9Έé›½þxwuKŸläñÓõÍ[šñô8ÃôöêÝÕíÕÍ›«Ë?î~¾¸ºëö2ܯà -7òçÅïðɶýógÊ;3Ùà gÂ{9Y_h£˜ÑJ¥™Õŧ‹w _ÃÒQû Τ²rÄ€R è3Þ›If<³Jª`Ày[ÊÜ´~*¶Ûr¹,ªøžÙ4§×M±½n:û»®Ò‚íá—§²ØÓ’yÞ” }œ?Ó³¬«Ý²¬è5G»vb ÌÀdFg°'Ô«ªÛòþyÖÔ»í¢ˆäÃÍXŸç&R7mÞë¢j‰ÿ¾l˸ö±‘6S*cR0ŸÌ#Ÿ°½SaR3žy…ÁÎOgŽ$Á£|¬Ì’ÒóU½øL”…'*‹ºúçòa·ÍÛ²Ž_qfU°c§ëÎU†qñN§\ˆ!7ît< 9¥Ïò¢uxÅaZqÈj–”›Yå™äN}³3=8'Gæ€ —Ìnƒ…n64V‹`hÎŒ’ÉÐ.gVLïà_9=‰Fg™‡˜Xã˜6ìfòçD0®½WD4‡½ö6?^¯åäm ;š 7φœÃ¦ìð¸…ThZMlÆ™v 4ªü©^å;ÂL1J”õSÉ 4Ì«% ŠH³*!¾Â̲."=Ä šÝfƒq¨ÁsâLѶ!Ìð%xS˜¥(" Ëå¶h"§ûKÅ£?ã©CáîÍG -¦¦^\J>ýŒÿms J¸ ¶p¸Î»Éð”¿Ïqx„õ€¡³ú¾Ï­gÒC|dh µTî š²L g+4SΊÞaÅH6ê¨N@ködÍ$g@bÈúDD4¢Às)ˆveÔ¡¿”ŸÇàN¦¾[Á¶R%ê|æ»–ùfNÙDÀªéI,i¼÷ÊEC¨< ½þ–!Và‹˜<`AѰ1˜V0i‡Ò¸]Ûe}a™ƒáœO{û‘ø}¬·QÖ/e®ÝZ8«¸t×ÀÁèÙn¹™AèÍÑö³Œië|·ýSµ@ëd$ÈŸêrù%žàÌZ ýµ<ƒ–ö›´œIEð1rú¾œ>Ò÷eîγÌó”ñšM± ãU6TðX…qd¦õ=ÍÀ¹ê`r€üçúQ¶Ié’HO¦H0ló–Fûrµ"ºP¥À Ø%òå<"Iÿ)ŒÐ¿Ñ»Q dܧåÉi¡T\M?Å ÆiŲ ÂÂhÈõÞg—ôqû3Æí Ž;úÙpÁi Ÿò Y¢XÄÄÊE?Á“®òJx¡>|Y‘ipÒkmèÐæu -üÇzT¥äOy¹Êç«øš Œ_(®éeY´Åv]VÅ­+ (æ‡/Å_ùz³*"Ä`Ùv$á¾^­ê=Ž#eQp\=ôuwÀOÍ…¤™Àø/=¶yõPÐPÉÌ:Zc”yEãÿ½:Lâ\ ÙjÀ$þêD„Áé(b@A"ŽŽâhÁK•ì,¬¤Q‡SL8Óã.Îîâü}8‹z=VµBò…¼p©Ê×ÅrDÀ^ᬊT–(Ã%`ùŠï¡9*GêП#γ4ÿ„ÊZ±h{$Ãß•‡ÿ~ 0‘à¾:3Ù!˜ ‘Åa^Ñ´ˆü/`!SÑ…Ë6xÌpÚÊov \2Í8þS—©ìñwÀv‘#pA8Èe;NÙ Üžú©ª2Ó%‹³Ç =ïzªÎm‚œÅc]7‡ -@,Ì–!ÞatI†­g\úì0hÐXÓŠvƒ‰˜`úHx†V)lYǦ&Ÿ‘c!&Ðþ÷yH0 F;âî_ä­9`]ƒãFÞ¡ÜY¸i^Åu÷ÅýôÏ]±}+¡÷‚Rä. l„8œÊé14 žø¥Ûsxy¬²GþaXî#QÕìC×ã}½[-iµ 0÷P´C®¶_ylHâ¶ì©Fv‰ÞÈM±} -rìäÂôcþ BxÓ,èò‡¼¬vqzzS·`‚2jß—ES’F‘[DT†°ÀA¾jj"ŸÇO´$BaZ^W«(9Å8 Üö+êEÇ¡«ï‚ëL †!a³ï(ï”Òñ(ĹK -™“ÒàÌX˜Ãö´H¬ëMpmâÛ¥m|‰fßUË<ø1L ©FðmS¼ŠÇûX<ò!7 låÀkèhê§rY,SªEÁ<_|Þ‡eJûë Dà¼\•íóÀ'TßÔMSÎWñsSB]Ñu$]9±é„PÒ¢»ShŸI#M‡MLJMEHªL>=7m±Ž×ƒEj¸©Y—£G|Ô™Ü=Æ"7…Q¦§ÿhRÝ›?į¡Ú†jvWÏ‘>‰†qtøTâzJ 0H…ô -•¢z «ÝE¾JÕóS¾Ú¥e}‡/˜Á‰ÊO÷Eä{4Ä8ëƒò$IÇR[[KÅ ‚dÒƒ#R“0Ý­x?bN¥Lv2QÖ<Ê$ÇQY½òøæÇ%Sý…Ÿà½µpRˆEç–n‹Ñ&Xqͬæòд»*âˆR:ch•¢CÐmBº†–­_K¯M(ÁUl«`†"ëü¯r½[Ó˰ÞÇ×u½«Ú1•¥ÅëPJ‰eqŸïVíxeé3=.6Gò£Ñh.£}ÉÊ*–Z3cÕQɈ’*l/Èg‡xB-|ÎÓE›oÛ®WÁNðp¤¤Å¶Üô÷²£>˜QÝeoSþ}ÒQ*p9‘¤ñÒukÇ%Ñ`çn¸:޳!ËÓÛ+%3J½Ž,µùc·Ö:“<œL~° À(´:ØÆ qG?¢äoœð=lŒÃ7â¤MçoRô6'=qGõN¹¡,zľȌ9lÇ•:è]áµK´2yS´i¶O#ðÚa9ŒO±Wv& [´I&c$!º6ÌÆd é€î7ôôSèzFà›ÔÁâÀA)VWÿ@ür"^<·4ß^8 -HÏš.àœKåœ ÆÍôCìqDòŒ4Ôƒ9MB-PQçˆ/Ô|:ê…p¦lš]€vä4î»**žjŽ„.øLŒ~Ììô¢….……Ïðn6{ùæxHuþ渣 -éªÞcá“Â|Ap"<ôeï3ì‘ໄj=Їòéï¢Ã6ª·R%vp±³[o"LÞõèHXŸŒzzE#¥À[zûÅ䀷Uº»‡>(je£Ôe@õ¡$ª YÞæg%Ãdó¢àD4"øèP2üò@0Ó‹Á¡À ¥[‡cñ<¨I‹uMŽÛ´¾À+~ÇÒKÉ^Nhð2zh -*°Ìgæ› )«cØé%Ëœ•G7kHd cìªß—0 ¸Ï~_z°qCu2Ê„¾õúžæ¢1†‹ tig6—`ª&RÕñ`6´qÉwe-ÂïgAŸNFÙŒágP›7ž%=lAIÌÛtÍ £{(¯µƒb¥DPÄÙxp6jønG«"ôÖa2±ï·iðbµ†5=ï!o¬éåíͧ~U¹ úóä§ÀGú¿ˆ‹ÊsÚ5¦ó˜Ûhœæ¶±{ý¶ øý±Ûªp„s9=öy¤ ùÂÆ4ÇLÙÉc IÓEK0‡£}¦á™\ÍMVüí„~ࢲ¥ß3¨i‚2+h¯ŠT4'Poó²‰ýAN7ƒœnS¼Â(Bì°Äµ]‰k)aÑ[ב~MW[¨Ï3}‹ARºE9»çz‡7tб• ú¸]úN.Nç¹cxì4a® Þý³ó磥‡Òö$#²×,S>!@Ýl‘/‹Y‚Üã(y•ð_ºiõZ§p[,vÛ¦|*fsœbNuh¡Åª,ªÑ]Ahœ>¾(¡?Ø=äÙœd SR|áæŽæ…Ÿ—‰åÓ_4Ç3¨ø¹T/IL$'n±´Sv(1V²Ù° ̦Õn=§Â2‹?ýená¥MËú4‹ &݆śÐÁhQWpRU €!„˜·6½}Ž‚—ñ•)¦mwÑþRƒl0›u÷ëìÜßq)Ãôx~çݯ|÷ßxõm»rNŽÌžJJ¡â™<û“à©êÿüƒÛéendstream +xÚ¥ZÝsÛ6÷_¡·Ê3‹o—§4_çNëä÷á¦×Z¢mN$Q)+îÍýï·‹]P¤DÛé$™1Ap¹X,¿ý-(9ð_N¬Ë\Pa’“Y!íd¾:“[xöþL²Ì, ÍúR?]ýøNç“§ÜäꦧËgÂ{9¹Zü>u™ÊÎAƒ˜¾þpùîâýoŸ^çfzuñáò|¦¬˜¾»øå-µÞzõ믯>Ϥ·rúúŸ¯>^½ýDëøéâò õº<¢ôÓÛwo?½½|ýöü«ŸÏÞ^uséÏW +ùóì÷?ÄdÓþùLd:x;ÙÃÈdj²:3VgÖhz–gŸÏþÕ)ì=¯ŽùÏXŸYeÜd¦Mæaüq/Ë,—„r2§•䘗“zy]·ÕÍì©wÛyy*‹x_6Í èV±^h½i«z],—tÿÛ›ôΦ޶,¼¯–¬ø:Z3:Ë­8÷,X«¢q»¦D­ÎOÛš®MÇqùôòÃÕÅ»Sï +ì(nËÓ9=½º«zг“%wMË6›²ØR»Z“Îö®äa–Å}j–Ûûä ¤hØýEÐ.dR)Ãþ\ 8´ñ»Æ¸ÓŠåþª×^óiA·›2Å,® l‡Oî«rO¯\ ú^?еZÏ—»Eµ¾¥ÛbÄ*D³Æ}»/DIºçwÔ¿¯Ú»Š'0îyðFž)‘3¡bGƒ)“‰<¤Á`æ#K)m +éèŒQ=Nåi¹¯-¾ÞGcáw6æõú?B¨Ûݶ@l NìYBÐᣗ™ ÁNœ W`Ã7$ícŽóãIAŒLç`õ£ºè=º¸™Þªš%ëfðÊYåÀ¬&ïo&Ö#÷jâyàè¼ì9Ñ:#£§Efu¿`Â_5=É–Þe2åÄ)k %=ùs›Î„ I¨×Žs=ø vüx±R“75ÌhÒŸ+žõ5ÇI95È60em4D«É‚r!šü¹^"ŠJ;%Ì S•ÙLR“’4J–YVå–zuÉò°9¨Ñì6܈B‡{ʶû oœÃ”·Ïà¦7çZp@ãª÷÷ÂÕë´›šz~®Äô þA@£NbЖ*ü„W9|àhˆ€ãÌÔäûÂz¦Bæ}6¢”Ú?ÍcliÊ÷4é¤NPkvïN¨Œ™‡ÚW}JeXhÄ€Api›ymõЂ_ª/cx´'GJûàŠ@¢“ô BŸ˜Q°4‚²aĪéÊy3¶· »†`¹'{ññ’â¾®Ïé„`6FšoÕ­tËÊ™Ò#«ùË›#{ŸÖîîôò릜Óòj)\–òB¥í´¾¡XWÃ\ÃY Ù®Aˆ±M)Ÿ@^9è";b³½+ZjéE¹HS ‡è-¶"ÿ€kÄB9<*XQŸ‚£DoŒ›ôzg@k¡§ŸË“:ÄŠ0áaùXbÐÃí-gŒOý²)ÉÏú/œnäS½1K”sÎü`Çû žXH†ày50iÑXêC¤™à>%¥àâºNÿ®Þє⾨–Åõ’o“ƒñ íkºé*¦zWBÑÝOʯÅj³,b·pS#-'æ8‹bàš~¬ÃvüöÚèF"¦ÿ¥Ë¶Xß–ÔÔ*wžšÎZm_Rû/‡©Q>¶ƒúj `’xy2„Ån¢'AC-ÅÑ,¨"T‡µ’q×am&ì9à.öîbÿM\‹z5F[!ùBÞN¸´.Våb¬ƒ|éf)®Ea Ü–8B,³à>V}㈠ ‡uÄþè–æÀ\¬L¾G±X´Âsàß ákr›Á,‡yÅÐKk,¹úH..ðX¶Áe† ‚[åÛŠHã“kÆñ”ú\ç{j±ˆ›)! …J`'Ècس¡ w«~jAzf»dñè2CQ%DªOº°‰ãÌï꺡}£Eˆ…Þ*îwè€]P„a¦†ÐUáhÁhl©… Åø^ghÅB®±VŠS6\UBçjŒ-Äšÿ>VÃØ!ÆxÒžÔÎÞì©®!pYw¤;ó7ÍK~ï¦gx˜þ¹+·czO[Ð@ŠŒå¸q qØUÐepNd'>éæozo¹£ ¿èÓ}Z7ûX5@{_ï– z‰Êè»-Û¾Vwx󨑤mqACŒ&?4m¹âãû2ÜTЬªÑ%>ªL®î˜äÏO™÷·ü4²m`³«býÀòihhsÀw ÂïSF"ÒK4Šø²Ýy±Lìù¾XîÒk‡7˜ÁI*L÷w%käÚ1ÇöàxŠFGªmœ#2¨!™tdp$ƒÂBHÛúÈ÷#î”HeòAÊı®yL>‡Vµ|îN¨LNü¤€ìm¤Wfì`7H»)"¨í*&¼)z³¦©F~„£¯ÙºÛ궸~hËÑ"X “9#Ôwwk^Ä£Lžå`5E‹ ÛÄt %Ûá]ºm"×\VAíh¬Š¯Õj·¢›>ßÇÛU½[·c&+‡ç¡ÆvŸLnŠÝ²g–PÔÛ.6Gã³Ó¨¯àÖ¾`±*n“Y§("JbX^PÌöñ mµø¸H'm±m»Z+ÁáK’æÛjs8˜!xYÝö6Õ_'¥†ío.'PºCìÊo:ºUè°ÇN¸:³¾ÊÓÓ+­ðÓ +P½N,•ùcÇÖ*3¦'—¦á¥Ñƒi$ÒìNÞUÓü ›Û^6wi¿B‹ÁµOn]Gn%"¤»uÍò+:ÔB{èo˜ÌÆûÈ4êžÍA­V5OÂóaaèÆÅ®<Ð×aŒàúºM ºO/Ð{ýpôêСPþÇßá$‘jL–ë »}Í‹ù]9Kx{|dWËðÜk0&UÛr¾Û6Õ}9cÌñ:óÒêatÏ—U¹-Í5ÔÖ›ã#ú­F¬³Ç~š§m†¿§I ¢û½Ãwÿlïð›F¨ô´÷d•ûÌxPÂFádrõèW¤SÓÿv]~endstream endobj -1740 0 obj << +1739 0 obj << /Type /Page -/Contents 1741 0 R -/Resources 1739 0 R +/Contents 1740 0 R +/Resources 1738 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1747 0 R -/Annots [ 1744 0 R 1746 0 R ] +/Parent 1746 0 R +/Annots [ 1743 0 R 1745 0 R ] >> endobj -1744 0 obj << +1743 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [442.7768 538.094 511.2325 550.1536] +/Rect [442.7768 504.3406 511.2325 516.4003] /Subtype /Link /A << /S /GoTo /D (query_address) >> >> endobj -1746 0 obj << +1745 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [361.118 266.807 409.8647 278.8666] +/Rect [361.118 235.4757 409.8647 247.5353] /Subtype /Link /A << /S /GoTo /D (configuration_file_elements) >> >> endobj -1742 0 obj << -/D [1740 0 R /XYZ 56.6929 794.5015 null] +1741 0 obj << +/D [1739 0 R /XYZ 56.6929 794.5015 null] >> endobj 494 0 obj << -/D [1740 0 R /XYZ 56.6929 595.1873 null] +/D [1739 0 R /XYZ 56.6929 560.6686 null] >> endobj -1743 0 obj << -/D [1740 0 R /XYZ 56.6929 572.1218 null] +1742 0 obj << +/D [1739 0 R /XYZ 56.6929 538.0585 null] >> endobj 498 0 obj << -/D [1740 0 R /XYZ 56.6929 347.8106 null] +/D [1739 0 R /XYZ 56.6929 315.714 null] >> endobj -1745 0 obj << -/D [1740 0 R /XYZ 56.6929 322.2744 null] +1744 0 obj << +/D [1739 0 R /XYZ 56.6929 290.6331 null] >> endobj -1739 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F62 1352 0 R /F41 1208 0 R >> -/XObject << /Im2 1341 0 R >> +1738 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F62 1351 0 R /F41 1208 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1750 0 obj << -/Length 3299 +1749 0 obj << +/Length 3222 /Filter /FlateDecode >> stream -xÚ¥]sÛÆñ]¿‚o¥fB侦O¶k§Ê8Ž++ÍCš+’"SÙìn3XË&ÂZ9»[ÿ6÷÷7ŸïÞß^/T*æYr½H31{óéo„)èñîçOn~øåöÍunæw7?"ôíûïoßz÷þz!m*á}Å+œyáÃÍÇ÷ýpûæ§ŸÞÜ^ÿ~÷ãÕû»x–áy¥Ðxÿ\ýö»˜­áØ?^‰D6=Á@$²(Ôl{eR¤F뀩¯¾\ý#.8˜õ¯NÉϤ6I•Éf Jëi)‹D¤ µEndbr«¢”•œ’r B)w}¹úÚU¸ÓóJ•&Ežf³á¢/¶ŽT{«ÁÞR‹¤H³b¼ù݃#™oËoÕö°¥A¹mMOp»¡§g“iݶÝ?܇:·tû°Ï:—®¥8n´v›òPóâU‡‡þþƒJI§Ä çCà žpt$8ˆ5Z2]ÂÃ¥FÂõeè¿Ö‰Má’‘uQf D ›Bˆù—ï·®kûsû±ÚV}7±·˜Á|¢²,=ÊQ«b¾iëº}ªš{Úy»ë«¶éh®s=5­J áú°B$Ç_øÅýµ´sàëZÎ^1í -Ö>lýa•’÷(é%ÚÄ5›–_\ÓtÕônß”uýLãå3%%èIJê1y»ûÐûpýes¢íÎ…—€ó¹ëÝ6yaÌl1™‰²Ö^6«!Õy³ŠTÈ:(ô¢ú¶ñ§^ÔíýbÒÄ2™äV—ÙˆT|ŒL,Ë’<Ôˆ‘»‡ -¯±Ð¬ «yÄ-»¶v½ûëõÂdf^õãérµr»Þ_Žš5Oß7tŸa¯×äž‘ÆbÕnwp˪®úçk)%Ê"×Ö«,^9øäÄÊLožy}iRZ&Z¨`t(僽€&EŸH%·`xlèPàuÛ±£a{¨KV©Í¡Y‘œ¼‡àç ìœÕ¥‚—RÆ\Ö¥!Õy]ŠTçNyªFF(s™ƒH5Á©i«í˜‡/Î{ ã…†è±qà¹òi®\=ĬÓà_B¨Ú8{qg‰Él6:MîïgÜé_9ØËué`|ÝÈ‘AÏ|Êøø$-dqY¼‘ê.^®†\€($æ'VÌ}pÌ ùä3ô¶£•L2“cã)w;o-\CUÏsöt;·ªp ´]€»û@«ç]»e*v‡¯µõÚu=#÷eÓ•+-ˆñf2$ã੪ZòtyèÛ-¸…•#ÏO¹y—mûèÖ>‚K‘'F‚TÈæxpÞ—Þ²*È9uŒá¼UÕde áÏCË’B†ÒŒœ xïóÿh¦\–]Õ÷”N˜W"Ðê‚×Tx˜‡¶ë6õU‚î`°/G‘H¥Õe&"Õ#Ç‘cb ¹êˆOfƒÍò¹EmËÕ@;"!íà˜ ysØ.}¼‡ ¯–ðijÑìñ€4ãš~_Ñ‚ Ž-!—¼îWfxÇ™žj{2¡ ˜NÑy -¨Úîj·…µ¼‘üÙ8 À‰ñZP]¸Ñ@å­û®zt‹U]sÝ‹ûL‹$We^d!RMð0&ÉEQŒ™˜JÙåñ’†);L×}Ù¸öÐY5‚ˆê¶ýzØu£$NŽò=ödZ¼‰„²ÔIHzô‰\º‡²F6¬$vÀ¯²ÌàþÐ| ;t'@;íNt‘ØJWr˜²Ox¥“ËÂèI ÖÎߺU E-N¡|ž¹£ix£#¨¤ÉMYí ±¬úá©d(†0±òNÜFÁÈ J!íDJ­18x&Ö(e-Éá#Z ­êvùÜ»VÕ: ïåóDz>„%6„êÜD¦&­/,2–Ȥòžæj9äj*øí˜¯JKŽ÷z(yw4nÄ,y¼v+’kÙù´Å¢€: j%Žc :‘.èXÿÀúÈ¡bXiRÖzÆÚ†J.ƒø¢µ©Î[{¤ò7µÚµs­`]•_Þ.ÍsØþdw²"˜9 ¢™ì5ž'f˜¨Ëß½ûÌȶi\ÌAµ"A~¯ühö€d³ˆŠ„¯2ÇÑø"ÿDj©$µf`ÊZ(ó¤Ð*ÖõS¯}HªË?¤:ñ‘Š,ÅËa½èÚÕW7qû”wTþ9ˆT,Œ½|š@JfÇÎ5íáíÙJ Ö¡¤Yˆòê@Ôf˜÷Ú 8ߘؔ+×Mº4•EZCM¹L*µNŒAU é‰óJË·Íwëš,ɲ;N ÿ´~(cD`¡äuŸœ·8HÀÐÁÍœKÇj툀Æí–+ ¡„[”¿2¥áÊý}KAJcà?ÇY |[ªj?s ¯6n±Wû+扣½âÛ“Í8‘…HÃÇM¥:k°vÄ‹ô¸ pÄ ½”Χ÷ƒŠ -âxfNÚRÙ©/ PVáÚH &¸33t渳IÏd²ÀD&¬ö¿ìX»® [ú>í܆c½øÂå%nÎÅ L…øJ¯=°dÞ!ªæx:Î/hN~’ym=õ]ë: ¶4£¨Mwl²<”]¾}_³/w\e!c\fýz‚›uût¾¦RøA毸æ!ÕyשB'f…Uõt{ô…Î/ï©&iu -³y*ÇP§×Øaÿ¥ˆsœðYp›ç}®8Ÿ‹"ÀmšÐ÷ÌißPþ¤˜ÿåÚ_?â|Nª”‰…NEqT -w­ -yÒýüLq§æë²/ òŠO®þmK 'tÜÆÈ$y‚)Ÿ¨aÊ›¥ÇWc0'~AÊÁã‚+N~y)*ÕÜ}ÛU¡mãATzºW±¤„S^’’š9u¥ÓùÇÛ_ˆ4ÂÞ¾ìÝý3MP[Á„l( ‡ÀŸfÉj $¶Lä¾­ :RsD™ù" >9ÙÐSŒð5wY£ÜR°zW6è¯'[モoäK‘!òØÞ7 §øaàÞgÞ€¢Æw»%jV2®Á¶ñ½€žX<]µ§îî>òVÇ[ñ 2=Rð_p–D/}uÏOÌ'{X;þf2<áŶPždE" -Š©£®6¤ól¨‰ -ªË¥Õbºé‡¦«îê•KŸaÜ»=/ˆþY|#_wù?ôá˜-©$Vùæªçã™jBC#ð>®u¨l²¡©@WnºZ£;Ƨ ‡¯Á,ü«‡ -®ºq]Xªä7ºÃn×îy°m£rØð‰!­è¹¤O–:þàªp©$_ø@¸éÉÏB»¶«úŠê@MÂǥለÔsÒ›!ÔOo xBþÑ-à€ -Gsò5Cê˜Âö¼TKhX%!ÌMC˜’†Áë Š*IÄbUTíêÀe垨–Ñ[ž+Ú»ÀnMù•ï4îJtuøæÙž|ò -sÐ{á^@¸ñ5èÇkmTÿgCª´&QJ¾Ò¦R©‘*d»”"/ «<¸©ž–ÌEq™ƒH5ÁÂiOK¦Axà Zp®N0q³Ð^V»þÁ={¤ôØ f›šÅŠHÍïÞlFA·‡µo\M0ÛPG¯Æˆšb/5Ó'Õ—Äh09Uc½×?)e0¶rä\?#‚¦(v"DÝl„ *ïÉU×<÷Ð>°-›g‚|ÚÏÔÇž–,™ жy³²–ä·&\ÕL)|8½’’ÌžÀ§²âï·0 J èÛ@œ:H[m¢¯Á™¥‹ïíÊŽ".ÀÞ`à ¾×ðO4 -v8ÉÉ4’S2 f†(“ð23U åÙ™OeÕa`žø9€2I!²lú×’ ðJ«v]­È"ï|÷©ìø·7Xž‚ÇëÎÙižC5ŸÉW~&r$ºð+&BW5e -‹Š÷Ù“€2RX}qÿHô’±æ‰±E6â€?c[5,Ј±ÇÁg€ä¯Ûàó)¢dóϤ.U{èêØ6õ-Š‹Çá§öP¯ <D¼aLKÖ1î¦FgSß±ð'ñwi1‘Rr2¥ÁER&ðõ<Õ–ÈÓJýÐ7¼¬[™“ÅÏèUsà´ -cþ†ôh¼K\Byïº!cg~$¥ÓÄLÿX þØüß? :þºÌäPŸûéö,˜|` -OœëSÎSm“Ôª|‚õÿÿ²½)endstream +xÚ¥]sÛ6òÝ¿BoGÏT,¾‚sOIÎ鹓¦=ǽ>ôú@QÍ Eª"Çýõ·‹ R¦ävn2ÀXì÷.Å þñ…ÉR& µÈ •fŒg‹j{ŰöÝ÷8Ë€´c½½¿úö½ÌEZh¡÷›Ñ^&eÆðÅýú×äÝ?ßütsw½Ktz½Ì4KÞÞ~üÍôx÷ãÇ÷·ßý|÷æ:WÉýíiúîæýÍÝÍÇw7×Kn2ï ¿Ã™Þß~¸!è»»7?üðæîú·ûï¯nîã]Æ÷åLâE~¿úõ7¶Xõ¿¿b©,L¶x‚KyQˆÅöJe2Í””a¦¹útõ¯¸áhÕ½:Ç?•™4J/–€Ì„”ó\f)Ë€kË\ñTåFD. >Ç倅\þc¢±ýémᆩQ&_Œ·|qpÄš9YŒNæÌ¤FN¾´Ào™'Ûòk½=liж+»'¸ÛÐ3èCx­·û/s[>#`’Çò‹_îv¶%¨êÚê°ß_s“Øvhž¯9ç (ƒdÙ‘ˆµÝ”‡f ]êkž8Ž|û^(s™*- \oph›z[vM¨“ƒ¸@™…ÇL_(“—XÎy*µ)^ëë‚XžØeõ¹¯ÿ°/+²´È3}ùèˆ5söD°’¥E¦‹éáÄU0¥£haPn»C;ìD OG¦ÇµÛnÿLð6ˆBv›ùÕCoQ|œ:Šõ¬ì€Rìô /¼”è¨Q’%wÂð¥â`•Zƒ[“ ÿ™Q] ×àÀå0Æ’O#Úïlßö•§öªM?s6[Àz*´ÎŽ|”¢H6]ÓtOuû€Cº=Ô]ÛÓZoÚ•0ZšÂ‘àóþæ_$‹è;Pöƒƒ+ ӶKéÏ(é%:Ķ›Î¿¸¦åºì¾-027^=ã%ñZ E–‘åÏJw_Âô>ˆ¿lOÌ0Ü›Ïý`·gÍJsð¸y¡/›Õë¼YE,$zYݸ[/›îa9kbš§¹aÅe2"Ö Ó:Í5LM¹¬QŒ…ôÊ€°Hâܪï;Ø¿_/•VI=L—˪²»Á GíÚ/?´$ϰ‚âuE]Ä14QuÛˆcU7õj®UE¡65\‹©ä=­/MJ‚÷`"rù¿`/ I‘Á'\É! dCÐ  @ë¶÷ŽÆëØCSz•ÚÚŠøä<„޲‰³º”i“ržñ˺4Æ:¯KëÜ-OÕH1¡.S±fH8U#i vMhødÇPŽiøˆŽ*‘&`Ëê‘ O: (D8c½}q™kžFO®C‹û‡w£‹EüW.ör_º˜7R¤Ð3ŸÒ>>Í +^\foÄz…Š—»Qr•qL; K~y´žòÉg8èlG +žj•Sã)w;gˆÀeCyȆèw¶ªq´]7²û@#“¾Ûz,vǯuÍÚöƒŸÜ—m_V>´àŒ3“1z¤Ouã¡•_.C··P¹0ñüÄò.Ûî‹]ÿõÎYž*\ù³Ù—Œ1ÜU÷'™DÙ@øsÐ*†¤¡´gÆùü?ºÖc®Ê¾îÏ{ ®R÷~ÅkŒ°.x€…—yìúa iÓP÷Àè~ ûÒq)R\&"bÍP1q9Ö;P‚LȸEöh<¨ÎƒÚ–‹‘&ö„BÚÀ1Ô£DœZÂïF«Ç Ò +$îûš6uìhrå÷ý Á e¬eò±È„4¡ó«_½Ý5v {9#ù‹q@åÄÁ_‰c¬óXÎ(,”'}ýÅ.«¦â^ÖbY‘æ*Ä‹$D¬¦@¥9+Š)s);? +iœ²Ãr3”­í=a‘UûKRÓuŸ»~’ÄñI¾ç½™oB¡ìtˆÔ²˜ÊoeËÉ0œÈ¿êyòWLúk˜±;Üyw"‹Ô<óNSöO"dZ`µ= ÄÚä­­J(BhsŠˆøàòÔH-Ã=A%-nÊzO«zߊ‡b+çÄMd ×Pr0nfRj‰ÁÁ±F.KN§£ñçºéVσíaW)³ð^ž|)›CØbCSãÉÔ¸1à…™ö™UÞÓ\-‡\M¿óUnÈãYT·ã7άüxm+âkÙ»´/åYuÔJ2›²HtlxôúèCŸҤ¬õœµ3 ”x—­}„uÁÚ–“Tµ;kç 2ùåÃ#ÖÌéÓÒ<‡ãON'û(ôÈÌaÍ`§ð<1s˜‰º ðý»Ÿüd×¶6æ 0Aµ"Aî¬Q§&½ÙDEHêE™cßo*È¿h‘B>2å-äyZH‘¿Ö‘(’b¯î¢ÜGHçÅÈLÖ˾«>ÛÑk–S²‹ÇG¤—çO|–B6f&8fBöe­8ÉçBöŽ0äƒÕ¾Þ ݾ§ ß&päÓk®À%Ôeþ74ì‡uÝ!œå‰*p–†iŸv¹£­]{­Ÿ+K[®êï÷³TÊSïfÛîð€–¬…(éN9E ê1¬;=†9×’Ø”•íg™å¡)Ô–ÛÙtRÊT šy $&Ö©;lßµßÌì«tªuŒ'&Z9©R,Pú}Ÿ¬³¸H˜¡‹«Ä_êµ%w[_;p°Áø”ƒNdB‚ÈÃCGáI3à÷ƒõù \Cº…:?"ûÔ W)lì¾w]Tº¨zÜEÕgÚpè$WþºgMÕŒÒ÷c«\W݆~±q [¸³çA-F •˜f\˜¹`Ï DAlÄ™;MuêCQ‡îØ_y,ûw‡¡ñnÜnp› D‹i…õËu,l×ÝÓùr +Òþ´#¹è•GHç½r@ +˜ +«éùþ ~r)d~ñðˆôòô‰Fg&eyÆ'ÇS{W™qÓ¥ˆmr\p©"øÞ8®» æ\Š€ïÍ„f/Ìœ6{aÊ]“¾\:ÉãœKA‹4XWhOG}P fQœ8’ØÄ×—m"Y—CIÓ)xú’Oбú,Î÷.4$§:°ä²3Ìsuv|5f û¬ÁmH‰wܰò¯ßŠjC‘د»:ôªq¼óú_mnf[Ó+Ê2h$©§J¨%î~& â(ˆxûr°Ï´@½R ,\wCZ%{hØy$ûµ‚ÀH¡’7„Ü R²¡'›nà +í²A¾e`ð¶lÑUÏt]|û^ñ—,ÃÉcO_Ÿâ×€—nÃu»»-a{%ãA´v­køôäÕÈáÕ{Úàþþƒ?ê(דÉà‚kû㪿½ôÙ>?y:½s5Ó%c±]ìå©.ŠLM=µ²é&™̆B¨ b §¤X®B ýÐöõCK rî’‹»÷¢kf_ÉË]þÝ7&J"ŽÕ®£êèx¦ÚÐÅ´O ª•Lè$З[,ŽÑã“ÑÃ^«üê¿r¶¶[•þþ°Ûu{?ØvQ9Lø.ƒô\Ñ'Cí÷FpU¸Õò.ü0ÀHz¶#¸ëúz¨©ø“Ä|Ü+ ‚"Ž;3Äøá-OH?ºPµ¨N>ap³×ÁoÕÑ4ì’ÒÌmK3% ƒ×Á)*qK¡z×*kûD4‹ÞòD!£½3lÛ6”Z¹öâ®D—Ñ„ÝÉw®à0G ß`¾ýx­wêžìl0…àr.^éMŽ±Î‡Óˆ]ÊŽ—Pì\#‹ç¬¸LAÄš!á´‘Å3Hž&4ø Zø4`¢f)¯vã zæˆè°û@L4¥g+NJÿîíft pXûÖ6{êéÕQNÁ´<‰¨®Fƒñ¿tœþáH…±ÕGÎõ3NÐÅN„¨…”â¹êƯ=vOlËö™ —ñ{ìcáN[–ž +ж9³2†ø·¦¹º³ãp{Á9™=Oeí?Ú€ŠD ùÔ 8j} ®¬l|oWöqvÏÐ=p †£Qx׋>FtÊ£’ž Ê$Üž˜º¡Ÿ…̘ñ¾¬{ Ì3¿ +ò8­çÀýO~‚ªª[×Yä½k9•½ÿÁÃ-V¦àñús¿4’YªæñžÊÿûWHÇŸh©j‘s¿àÁºÍ¯QxÛ\žRžI“fFä3¤ÿ~Z†Þendstream endobj -1749 0 obj << +1748 0 obj << /Type /Page -/Contents 1750 0 R -/Resources 1748 0 R +/Contents 1749 0 R +/Resources 1747 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1747 0 R -/Annots [ 1753 0 R ] +/Parent 1746 0 R +/Annots [ 1752 0 R ] >> endobj -1753 0 obj << +1752 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [375.4723 594.4187 432.5882 606.4783] +/Rect [375.4723 564.3095 432.5882 576.3691] /Subtype /Link /A << /S /GoTo /D (journal) >> >> endobj -1751 0 obj << -/D [1749 0 R /XYZ 85.0394 794.5015 null] +1750 0 obj << +/D [1748 0 R /XYZ 85.0394 794.5015 null] >> endobj 502 0 obj << -/D [1749 0 R /XYZ 85.0394 722.9644 null] +/D [1748 0 R /XYZ 85.0394 692.8552 null] >> endobj -1752 0 obj << -/D [1749 0 R /XYZ 85.0394 700.3281 null] +1751 0 obj << +/D [1748 0 R /XYZ 85.0394 670.2188 null] >> endobj 506 0 obj << -/D [1749 0 R /XYZ 85.0394 132.4925 null] +/D [1748 0 R /XYZ 85.0394 102.3833 null] >> endobj -1754 0 obj << -/D [1749 0 R /XYZ 85.0394 107.2061 null] +1753 0 obj << +/D [1748 0 R /XYZ 85.0394 77.0969 null] >> endobj -1748 0 obj << +1747 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1757 0 obj << -/Length 2635 +1756 0 obj << +/Length 2691 /Filter /FlateDecode >> stream -xÚ­YÝsÛ6÷_¡{:y&bðE˜<¹©“sçêܹ¾§¶´IœP¤"Òqtûßo P D)í$“q,‹ðÛ/ˆOüã“4K2#Ì$7*IO'óÍ›¬`ìý÷<³À4‹¹~x¼zýN擘Ld“Çe$K'Lk>y\ü:Í‘\ƒ6}ûáþÝÝûÿ<Ü\çjúx÷áþz&R6}w÷Ï[j½¸ùù盇ë×)Ÿ¾ýÇÍ¿oh(ó2~¸»ÿ‘(†>g„>ܾ»}¸½{{ýûãOW·ý^âýr&q#Ÿ®~ýM°íŸ®X"N'/Ða 7FL6W*•Iª¤ ”êê—«÷£Q7uôü8K„ÌÄÈ - æIjL:ÉS“dRHw€»ivûë™LÍ´¼æÓšš}`ìšë©Åžž¶Ív]¶]9/:»ð E]Û µ'.Û©n:"‘˜jOäÆ¯Ò­½ä­Ý•Í¢œy^Ù¢.ëU»*“à©ÃÖgœ'&M…ÛÇ/[;/—{7 ¯¨M©Õl»$ª%Ë~cH^ž·nèk—8º´óÎË8̧FkwŸqß‹¿û¹Ov]|.A.Ð’`ð$ç<›äuq,“é‰SZú,²rxp©È<^Hf3†’³àßY·¡â6BÇÏpq¾>n§l·QÀ0nƒl·]’ëÁÖù´˜½¦ÉñÁ‘ýäµ ƒ=Ác(ER ç£ÍŸ*”ÐÞ îÓã…Ä5ÉX–ž—EóÈòÍ0c(j´›)¨””ƒÀÛß -\nžˆ\ °®<Ñ©!F H3År 4J¡<>@¾Ç§ð¿˜ž:K Tq•Ë$n/“O8$eà”OÔv;=œ€#¼¾ÛˆÉ ìgoÉËE‚ÝŽ²Q •¡’¥Y’g>©¿o\ú¦§ûk¥‘ï”›me7¶v¥ #ÔôõE4´Ìɽ«Ì$Dô$>Ùo»,HbÁA­=;”Èߥáý3­äeG¨D - •ö:‡Ül°„ýˆƒÜ -•Å•›~㪜áJUh -¬;êUKä'ëb’í§ç¢ƒT)÷¹1[âì+0 Î×MÓZ/¢ Oí\%Ž8¹³t¤a´ÞiIqvÍ>!tŠ.‰âäd$½ÅäÂði‰µëËpA‚ôO0â¢Q -Ï\:Ær}OCó -7Ö…qÏßµ¶Zb]¥úLò8Ð3@Mæ-²;=J%Lù|‡y¿¤wÅGëµ+ê‘uœ -sxš_,(Yš)ˆ^"×QZ»³m;â*™æb"ó,Ñê’Åð-sÝNà,–xŠn ;Ï«ºðUtóõIXçJl©¿Ÿ‚½Ä¯hÈ9dí’™§‰¯Rðpî©Jæ”`y0v­§ua ¿™{ ƒn‹/L®æ‡Î!Ó‚<…Oo 87XšUBT4—ìlƒ¢ýREÛ–«ÚzeüBwXÓ;× 6'3®‡P¹oêYmWþ!Nð å‚“^¡—FrAý ’ˆOE¦¹D\¸¤¿ÜiÛ´%U8à¨dŸ‚2U4fé*’>Ï,°p2ÊÝ‘Àãše;æ(œõJíg€xPy× ’ü˜îµÈXÄ¿nv®²H‰¶.ýŒÄį{±¶&–Ò¯âQ-ã]£{G€‹N§7D?½4ý΀î3K‰eÒX‰Ý·è—‰r8¤Æwe"ï;˜1T Üælžãp'Æï—26ì;]ñàTÄb±ðïWžÛo†<èAXF@«_×%žCœ|.ŸwÇ|ñR‡RhÉÆ¡òO°èãâ)`ëœÀX˜á³ÚwáíÈ~)0wyE^Bña4Ga ž†Y¡ü·iH‘ >í¶ÎÙkýfìLþÆ!¯…z3ù?H0ð¼æÙêH”äZÿ£9³Ñið4™ˆÕE;Â-õ}P¦W8WlñðÎèë_ÄtÓ8‹Ã'€e*jäÀŠ¿k`¸(N‚%^,Ö 0º)Ú4E¤i‚À•Ȩñ8 (‰Ur*Q)•Âf»5 “Êа_æ6<þ':$E½CàP$Q9E%5‡jcPÓ©Š{\Ýcæ”^öáÌÃSÆÈž*[À7¾ê‚äæð Gt›}Å׿~Qi êíîÔü8izÚîS5Záñ¼‰ú°ÿv€È±¼¸‹ÿÜ/^ß!½V 9Áÿj!‡3Ž2‰Ã/‹PÎ0v®ŽË@÷œgPþ@ºoøw)ä@&Ëáæ 2in¾[!äÎ"Á§…þšo¸yÎ{ü¸-erðª˜HGáì(Ö’Æþ75ÿ³~ëæ»T†ÑU}Ûå#ÌR“™¿R~šŽ!ÿéŒM‚kÿæ_}ÀUyÅê™708I(¢AˆLEל«ÓÇ?ÿûp`‹”ÿ?V•ÎÕendstream +xÚ­]sÛ6òÝ¿‚÷tôLÄà‹$8yrS'çÎÕé¹¾§¶´IœP¤"Rv|ûï·‹(P¢”Îä&ãX,»‹ý„xÄàÒ,É +QDy¡’”ñ4šo®X´‚µWÜáÌ<Ò,Äúáñêí™GERd"‹—-0­yô¸ø-Α\¿ÿtÿáîã¿n®s?Þ}º¿ž‰”ÅîþyK£7?ÿ|óp=ã:åñûÜüòxû@K™£ñÃÝý)ès†èÃí‡Û‡Ûû÷·×<þtuû8ÈÊË™DA¾\ýö‹ öOW,‘…N£˜°„…ˆ6W*•Iª¤ôúê׫ ƒU»uJ*ÕI*TͤJ4œ?­ežäœRžI&…´,ø”–=jy^›²©šÕ¬jz³{.ëc¹9œÌ3®£ø Ö"àË"áJò1못žI-â š9¨Y^s/ͼ¯žMýJÀö©kkÓ_óØÀç,‹Ù!šy®Ú}XœóøÍõLñ4î׆6u@ÝìhüÒîë iã¦}vhæë¶"Øõ*Îñ®@Åœ'Eš +Ë6atíÞæ¸7-tÞÚï¢#àÒÎÚ ÍˆÌ˹àë;º5ž§‰Pª=Ÿ½¯#%kž0•q·cS5ûÞt £LæÎðÀ‚>MûBƒMÙ”+Ó…ŒYÑØ(øXô (k÷J¸\ACÃÒ‘"á­d:îÚ-Üo_ÍËÞ,†³{ °\6¸hét <õ¡.í¸mFêÓñÖìªvQÍÏN5žì똙Ċüd~Ýšyµ|µ»Ðý{k‰8j·}…Ôå ‚×¥ÃmZúìÔÑ8ì§7?9w{ŸÌº‹ÝaJN‚Žóì¬` cL]vÿë¼ûX(ÿÚ”»þÉ”ýÿ‡˜,sy™‡k‚‰‘ÿ+™0®³1¨Åô Åòø¥ªk‚Â5ƒâ7þOÛ8äM‰<7e37´Ô—ÝçŽÖð¢,¬ôDp_G°M¹ûŒ–ˆ`¸ÂSŸ“2O$eçA‹ª¬÷Û G›N’§º;ÇËÚ4†ÂL®IɼƒÀ1Æúf‘’pia–å¾îiâwgŒæ?ÞSvmS>Õn+ß[7‚q9x!lˆ–¾œÀ‹òuÊ/~g­•‚#Ežú#È 9±j—ʯÕf¿ÁIF‡ܺ€„¦9œã HZ1)ÎÐÎâ»%!v¦'d ¢¹€èlÝ àd +¸šÂHºk Î;çŠÎpH–fv>ßäëìLº>xb€uÁ=òhcYÎÍO„Låée¬ &ÆžÈ ¯h=æ‚÷D‘ôÐyÙШ÷ˆé_ÚÝg„ µÂ>Îe7!$Ö"wž6­„ÓôÆS}’ݤԖ}›´dB¥ùØ ·âEf ¿èVø=… =X°·o^äÞ¾Ãíhßø%ûÆQ`ß]gßHíW¬}ãíÉ[û†ødê H\A½ÛÔ6áªîvté3¥(¼[ #Ñ•Á`Þ6¿3&Vû]érlAHí¬ó·nË…YÛJèøfÙ›Ý%ä ˜–Œ0o9xøÀÛ“YUî$´ +Ó̦•²·LÉcqðe9Þ4©¨ åv4æ¥vÃEÕÍÛgã«6 Ì©£9^Í–*±çjAX +9w4'uݾxJO£';ÎZ£/¥Î&€ÀíTÊð¸#Á®­å …$[£T×·[ÑICõâëPn +{eïK–gÿV<ñ„—’Šå³A/…ìžkþò#Ä:ô,»ëA\, »‹ýG¦‹o01`MpqÜd9;bã¾ÜैÌáÜ$¸òä°ëvµ²Âôùú½H¡¿>^‘x¢‚Ïdzã”–®J`‡*( y>Ž ¾˜ÍHÎ||gAÞ†‰ÏÛh:n‡ÍÛðuy;e£¼ÆyhÛ¼m‹\gl½+‹Ù›q™*vlÙOŽ Rì‰=‚ZÒ¢H#Uð$Ë@ƿЄ£¿1 yn² ‡ø“-–¥çiÑ>´ÜÐyî ZBm›B‘˜ààìp¹y"r-"•ëDI¥É+H3Å­é@n”B9+øáŸ¼Nè,)òBE@/h¬ñèèK„`QHB +ÆVÖƒ,àíÝFD?¶ Q +åÏBÊV¨läWBB;¯d¤O¤¢bâ¾µœŽ_¯4GnRm¶µÙ˜Æ6ƒÐÐ×=ÑÀ¨8¹y• ¤…ºý¾ë‚2"ƒ–åðó}ÆX‡0“1~9Ê\$@Q Ï]wØf†;fÕøÉØ,`óe_Öø0’rW²!Ì¡à|ݶq$Jú46Xâê“[_GæëWÞ<†Ý•„–Ñ%A,½‰Z€¨wX^<®°ËߺFV Ýc¬Ø|FÒ!W‡ÔXÍ!§¿ÒÒ¼FÁz¿îðûÎÔKì¬ÔPK§zV“9—ìÏ_R ED}kóî<(ðÊÏÆqW6ç€q*¬âi¹ r ¼°€â7WG…íÎtÝD°dš‹Hò<Ѳø+æ-’â¢q[z³€à©mk;δ٫ìç듬ÎÁô¡bÿ¿q7¼ÌçŒC­Mž^!`äRøg4z¦’9WÎ ûÎÁz¿†ß̾ƒÁ´Ã×%ÛïÃäPeÍҜǷ%hÅ.€Íj(jÚK‚ ¦ö6ƒ¤ÝQe×U«Æ8fÜAPüöØüÒ×,Ï £ÃÇØÐHîÛfÖ˜•{„Ü“GºžWŸ\ÒÜ“$àSÙùm¶¶à¯vÚ¶]E.X%”Öo¥v;€<°¼ë †áAnM\d,À_·;ÛÕŒ¨¢K÷þ"±èë_Œi¥r§8«ŽqAѾ!ÀE§ñ Áª—Å À]U)±Eš +ƒÁ}‹á˜ ~ChxW£·æpǘ1pX¯9ŒÃN^ªÖpnyEÅ)O €åbáÞ®¶–œ!Ñc° iB¸—u…z Ïå~GÌ5.oƒ^}˜±ïÜó+ôqãämëÁ˜#á*ÚþÝÈ|-±jyCQBñq<ÑÆ)a–AÿÓ + µQ?l—³·úÝ”NþÆ¡o…š\ý“Î[ž½£‰DJvôßwîÍ~êDZ<-#Bö}Ã΃DKs—ŽéÎ6š<<þÀ„3úº—oZëqØþ/[ßM#vÓø]ÂEŠ  (÷h‚ý¬nÊî3mišà``2é<Ö” +È*KdJ¥ l¿¦ebæëÜø‡ÀÄ ‚`Ϩ¢7\ +(*˨¤á˜M@ôlZV}c§;Û‡=•£}ÐyøãÓ‘Lµ)½Á·®ã‚²føu#¼Í¡Û^¾¨-ó&êüîÔ¨û¹dÚöS·PT¡zÞs¿YäÔ©2Mð×ωnž ÝÒwÿÈzøZåTkO> lÅ4qL¡¸¹:}a‰€:q‚õÿ)æÈ÷endstream endobj -1756 0 obj << +1755 0 obj << /Type /Page -/Contents 1757 0 R -/Resources 1755 0 R +/Contents 1756 0 R +/Resources 1754 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1747 0 R +/Parent 1746 0 R >> endobj -1758 0 obj << -/D [1756 0 R /XYZ 56.6929 794.5015 null] +1757 0 obj << +/D [1755 0 R /XYZ 56.6929 794.5015 null] >> endobj 510 0 obj << -/D [1756 0 R /XYZ 56.6929 439.8265 null] +/D [1755 0 R /XYZ 56.6929 390.3986 null] >> endobj -1759 0 obj << -/D [1756 0 R /XYZ 56.6929 416.0359 null] +1758 0 obj << +/D [1755 0 R /XYZ 56.6929 360.9106 null] >> endobj -1755 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F62 1352 0 R /F41 1208 0 R /F63 1355 0 R >> -/XObject << /Im2 1341 0 R >> +1754 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F62 1351 0 R /F41 1208 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1762 0 obj << -/Length 3018 +1761 0 obj << +/Length 2947 /Filter /FlateDecode >> stream -xÚÅ]oÜ6òÝ¿bßN² -?% -yJS;qÑ:­ãÃ=´}we[ˆVr$m£è¿©¥´ZÛwñá`’Ãáp8œ/-_0øã £c&3µH3kÆõbµ9b‹˜{ÄÎÒ#-C¬.^ŸÊt‘ÅY"’Ååu@ËÄ̾¸\ÿ½ûðö×Ë“‹ã¥Ð,Jâã¥NXôÃÙù4’QóîãùéÙû^¼=NUtyöñœ†/NNO.NÎß/¹ÑÖ GáÀ‚Ó³ŸOzñö—_Þ^ÿyùÓÑÉåp–ð¼œI<È—£ßÿd‹5û§#ËÌèÅ=tX̳L,6GJËX+)ýHuôéè·`0k—ÎÉOKk#Ò ->'@ʼnÒ -ÏÌ“˜Kc,º¼-è„]ÓöUÙõÔûÔç}±)êO tE@—-–ÂÄ™I´¥H¤ŠÚcn¢¢»kêΎȨoh&§î矨ÿe[´nòš\Á2ÚF›kÜl«¾¼«Æ4[ ¬F£«Æ¶ëŽþÁ4»¸è á„uÝ´›²¾¡Ùü?¡À#sgZ {ä®@>3å·)zÜtI)éä“u¾qPW´_‹–àû²ªÜ<°”WÕõhÛ~ÛÖÔï‰ŒŽ€¾_Ùß–ãYÙÝ ôsyM ËcÕë¢/ðäp4êÎìŒFÏ ÏsµEz,® p3RƒP½àÀFkÐT»²meÓ:•Ñ,œ{ÜnP.Køž<+¡dÌx²HY§R[ý¦¹öfAÀEð <ú2ħ÷2±GyùT¬ú²©‰ÿ8Ô”!ÉU,”s´÷0¬'Ù§æd*$²Ä©0´ªÊAL^[+R%œmÖ¯»m¶Õ:ÄËÛ6¯o‚ ´ê^ûRˆ, ÌÏH¯sÔ´”GùÝ¥Òܵ%\Õ+M€JÞÓ|ÙÙ¡4Úvô¦pMýà€õÚ±ÚŽž•/´ÄU³Ê+ëÂuH´uq]P[¯ÜkLPig¶ÙI°Þšû%à«9¯ÜO™(·ï€P° ­ì`›ª 8/ÝTÓºå´Ìá7­3½}Ïv¨þƒ1qCÆ¥X#{,‹þu[8Ò9Q®†ü^¬Ë Ð{>Ç›ãM8.œ±Xt “FWµwE‹&±XS× -ß$Ž–I'»€N^åGn­™ÎðŽzÁ­ IèdÊÎ/µò1^M¿lK‡ë( R# „»X{:k‘U«’à¹è~ û ÷.ŽØ¦ÁâÄ$jðbû6ŽƒçL”òvË»È}'ÁCL±oà$øX´ªÖ˜b窨š{ç—2¸¼ü3žgòzŽpö&ËGe rÝ·O6¤&]$€.„QωDøpcæãå@q’Ü2$ØK¤z·3²¹ÉûÕí“JÅFrñ‚LzŠO1©ÒØÆÇL¸JžÆ2‘Ü ¼^Óí”58Rg›zwceO—§¦‘MãÍöº»bU¢>¯¬Ÿ'Ëkà,Jš±ƒmÅG•ðε@e©cªo¹y˜á}œ‰ì{Z ½nì;K„UÉ=¯+³˜)J$À¦R>åv=þ2\0ãw÷èŽoÂÇ+ö›Å†›K3~—žàcVàuA“¢“t–î ¹# ‚›­HbQ–^…“×Ï2\f³í<ý¾+ªkRÅ€Sz¬2hÉe*l¸'ÁßîªrUö3ì$*V€ú¸ áFÅ™±$žH ×÷>Ïâ2$¹ÿ<¹IãL€X´ƒ6D –½“Å'˜à xŠZ2yȆ@ÊŠÆ“Ž;ÝUStYEà@ßPTV¹Ðc‚5¥Ñz´¨’ŸÑìþ¶\9Ò6‘BàÊ­$½ÑÙ¯¤E\ ÂÕ$âÛùjðŸ"»Lg¸Ì¶Îä!ß&(oßýLe:ÙsA›cc ¸ëzˆö5R€ïÕù>îÖ‡–ƒÌ™£,²ðŽâ2$9ç1ØQ¦w;vk)ÈÕ(ù‚LzŠO1™j4d|Ìä!•­MAÍÙ`öÜ]S[X뇵~8ëgAL&­Bƒ9lW·Åê3]/0ÍTœ0TÆúu“—µ/*ô»ZCrc¨¶ÓB°ù¸ÂW ÜÖ}é"»œº –ŽÀu³­×“@ þG›P€qBv¤cvÁÊ(\áØAäÛÜ!]6ÈòS¬ñµ$– '_5xËB1BÂàç¶·A3.Eû1;»€ -ó‹òU¿Å¬Ar̪ÊMÙ—_ êî, g.±ÃaÇ9u:#ùp>‘礀¸í†µ µàÄÀÏûm®¯çNE—/²iaId” B»i¾NF†EWÅMY×”ERóÑ|HÔæf2:›â„>_Þc›Sãªe!ñ{Ç…·æ¯¨¤ÔSÒçHÏ$¥]7nEg«1N²&ê]Vß“€S/LHúÈö”{ÜùĘ8UL>aqY ÐÚ…–Ë;/`Ì<ÅeHr.‘£'àê´G +“½ ŽàS,Bp­ÒÔŒY<œFh%Œ7†‹öŽæ|!‹òY±½†,`Ûc ›ûðÕê†50°2Ï„C>§f †œÎvBè™w]ySÛd?! ÍN™S-ëõ.ü¥‘‘ Gj5µƒO_1LQ\4BÚ”u¹Ùnæö,a|ó~÷æ°ÝÐldæœÊØÌÎðÖŒq €ë¦‚ìÝR”&…;ßÜUXSBR ±Ð;”6«ê«¢´\["T[ÛPoXeL¸Ù¤†Äöpnë”r ƒ…©ÆŒÐMÑÏÙ›ðäÕ…we7WzÁJò¤”‡åã¡Èüன*Ò¶TU¹Y0k58{aXò.ÀD¶Ÿm]2®óâ[Ox{D ø Â!ìÊmØY/ç.~Ì,3‘¯ëºú§‰x†y¦‰ùk¡hÊq„†š'N¯1¿î©Êj|Ùp‹Ò•™Ù•T=IáHº -a0#‡·u¬öÏœ¢F×)çë 8ÞÝ6÷5W@¢)£Î¡PV!y(o­eôÛ ˜€?QLÀz95NÃ$Uq-u«|@a$͹R«?®Ô©×I€‚ƒÙ¾+è"8UyMwˆS.HÑ阬 4´÷‡zz–¨õ¬zz!”ŸxùÌ\ÄNZ:›JKžñ.áqÒ¸º¦ÇX6ì®Üî>YšAÑSiÚ‹Ðøˆp—ž9afN˜3§™¾e4ˆõ`Ë–Àu9ªccÑ4xÁX^ %öúTñɇÁÀzî¾(&ŒEY¦„Œ3üP:bíõkB9;¥ÖÊWõFÐ -vFÇüÚË'ç]—­ßóºtžtD90䨭±¤7#´¿>ƒ7‡¢"¹UyßÍ›G¶ UùÍxHî†þÞo©jdkžéã¢ö‚YU9:nßwâSùn;'Ø¿rDZ7 &}9wc“Ãí„ð˜Xa«ÿ½àø)8qXpb*8þ¸à9Üs' î‘Kù?iœ<,8ù”àÄ3' Ž?[=C?)áw .V“³ê©œîZòdéò~°m<à ÿjŸ=âF¼þ³jH“3¿ J2ô¹;IB«Œ]^SÇýn [Å@È%Å]SçW視Ϳ–6³Ðû=ü—TÉY#äòê¤oÉÔ%ÂÈÎ%Î…o»K -ÙÚWâ -SiÔ•›²Ê[´E í™Ó#æ¡G K0=©“%ÖÅ]›nÁˆÿ-T©8‹¿9..‚X—QÎp0¤,Hkˆl%WLz9"èCÄ!B‘å_mxƒ”áHWj”ÙŽÆX´8DØ ã×4 ³t K±¡v—yA' g‰‹™gàM`äp÷F¸/ÜôC!h&*aT»À:NS+ Î,¹I C´“ðYŒPA' ŠÉß¡‘r_W2-}¨çx -¿_?ü*¨V:÷Ó6©c5ÿÝ þÝÎßý³·ÝoñÙ1âÀ<–€¡ÌRÏž8ÕS·ßÇí³þoòÒ!endstream +xÚÅ]sÛ6òÝ¿BoGÏD4>Ipò”&NêNë´Žoî¡í-Q6'©TO§ÿýv±R”í;çæ&3ÁX,»‹ý²øŒÁ?>3:f2S³4S±f\Ï›6»…µ'ÜáÌ=Ò<Äúáúäì½LgYœ%"™]¯Z&fÆðÙõò÷èío~½>¿: Í¢$>ë„E?\\¾£™Œ†·/ß_|øçÕ›ÓTE×/iúêüýùÕùåÛóÓ97šÃ~á(Ùðþâçs‚>\½ùå—7W§^ÿtr~Ýß%¼/g/òåä÷?Ùl ×þé„Å23zv,æY&f›¥e¬•”~f}òéä·ž`°j·NɯÇÎbÉ4Ö±\ÄY¦Õô± ”ÁãD.¦iÑ>´èw IíÕ›di¬S•õêbÆyœi-P¿‹SjMµ'¤ßK”°ÅÌb(ŽˆœÅZ +àÜb|<'<º†ÿEt>ÖÐTܲÆc#ž<û2ã1SY& '€íU÷"°g1{WÃ…fÁ<Ýy@Ø^)År‘Æ,Ux¼‰MÆ¥eøú® K%2ÄPjw§®ÞÖëúöÁá…4•‚ó¸G¬·]YW`’©‰Ê–ƪîÜÄf».6EÕK7á0Ýû(‹ÇS ¤Dk¡¶^fhj:K²Ù|oÄ/3Ï¡Mñ4Q{›â.#Ñ g Ìð•ó$æ^=cÌêþé¶nºuÙvôõ©Ë;+½À=]x"‰Sá(©¢æ”›¨h·uÕÚ š¤•œ>ß]~¢ï/»¢y p“?Ðâ¶Ññ0[¯hr³[w%èqp@½³Àb0»¨í¸liãL³««NX«ºÙ”Õ-­æÿ =^¹«på¶@>3å):<¼§RÒÉ«|ã ¶h¾ Á÷åzíÖ¥|½~ /:¶Û5}wDFG@ßïìîÊ᪊ìéúµ¼¢å)ªeÑxsP'ͺ{;ƒ‹‘ÃÁûÜìK낀οÙyÁ…ÖҽŦ>æuãLF³XpîqÛÞ¸,yà{ô …’1ãÉ,aŒ5KѾi­¹uÎé*}â{»gâ€*òò©X8'œøÇ¡Æ I®b¡Ì£ƒPÔc=ÁÈ!5'{4!‘%΄€¡ÅºìÅä­uM¦„«õÒáµwõn½ ñò¦É«Û@@[BµÏ…ÈbÁЇ‡v['Ê£|»µTêmS‚ª^álTòŽÖËÖN¥Ñ®¥7…{ª,—ŽÕ¶pôÈIsÇëz‘¯ ¬ +OÔ!ÑÑŪ ±Z¸=Ö™ 1 ÒL²“¯üXß(!_M™8e¢Ü¾CBÁ¶4µ°o€%ª2à¼tKuã¶Ó6‡_7Îmtö=Û©êÆÄ-9—b‰ì±,ú×]áHçD¹W±rA F/Vez蜉½ŸãÍq.7Nx,ºI£›‚ÆmÑ K´ÁѤ$|“8Z&6y“·¹v´zdºÃ?Zú +´‚.Q`)[¿ÕÊÇx3ý²+®£ÔK$žbýé¤7FV­IBä"ý@ú ó!ŽØlãžHO=å%I¢|²Õ‡ÈC'!w‡,úÐÁIˆ±èU­3Å›b]ß»¸”òòÏxw\É«)$&OYâ(£lA®‡þ ’àÔ¤3­8¦ és² È1Œ1GrŒžâ<$y˜dHð—:Iõþdds“w‹»&){ß‘IOñ)&UÁøÉ#ªäi  ÷¯–¤2ÉÆù¦Îi¬ìH‰àp*šÙÔÞ-àW»-%ÚóÂÆyò¼z%ð­ø¨~$Ø¢@r:™!¸Ç'¸˜ˆ´@{YÛwµšäAÔ•” +ŒƒƒRÉSa×ãÏà q÷€î0ð&¼¼âаYl¸°4w é >hQ,):ÏÁfIõ–€5hvM‰²|T] Nf}¡ò¸ãà²÷0›]ëéwm±^‘É(Ô˜ÒC·‡ž\¦Â¦{‚añm».e7ÁN¢b¨ûnaPHkxÂdêÅϳ§8I>OnÒ8 –í¨h%FgßÉžâL +Œ)ZqÈä1b ô5þ¹bâNºª«‚”…YNt÷5«1Á›Rˆˆè=4ŠÉ¯hvW.i[H!pãv’]ˆèâW²"®$áj”ñíc5ÄO €Ý¦3ÜfGçòo#”7o&€*„ì½`Ìq€j¼h±þ>´H!°¡õa Ü5“dÎt,¥ß!b8ŠóäTÄPàG™ÞŸ|<¬¥ W£äwdÒS|ŠÉTÇ"…P5`ò˜Iªð3'pJ@¬ÆV4Öû!d½ÎûY‹Ik†ðÉŽ‹»bñ™Ô L3' •¡}Ýæeå› +ݾ×”ܘªí­&lýîðwUWºÌ.§ÔbÁÒXÕ»j9Jôˆ£¶ ; â„ì€‡ì ‚•Q¸Ã±ƒÈw¹Cº)lå§XâkI ,nN¾ª.–… c„OHƒ;œ;Þ&͸ýÇDìü(\Á.ÊÝ«ɱª*7eW~-èsïI8s…N;Î飧3ç#ùpNˆ»¶ß[ÓA â¼?æèþjêV¤|‘K"£ZÆMýu4Óoº)n˪¢*B™ÖC¢¶6“ÑÅ'Œù‚ìÇœ×- ‰ß;.¼7E-¥ŽŠ>Gz¢(m и UcœdMÔ¹ª¾#§^˜Pô‘ï(÷¸Ó)‰1qª˜|Âã2ÈÀj!4+ùrgæ)ÎC’S…8=ªïÑ)$X¬LöytŸb’k•¦fÈâñ2B+aœ¸1]´:šŠ…,f\Ègåöª€qnµá>}µ¶a œF†Ü3$áPÏ©IÇ)§ózæm[ÞV¶ØOÈǰ„[æÔ‹ÁÉj¹Oifà‘ZE£ÃàãW K” 6eUnv›©3KGß¼?½>î74¸€© 2tM Ôš1î±°ª×P½[ŠÒ¤rçøW†WØåÔC,Œ¥­êû>Ç¢(-×–õÖ6ôÕï²A&ê±>,QYõX!TŸxùL˜Ó^Z:KKžñ¾àqÒ¼º¢ÇXÖŸ®Üé¾Xš@ÑciÙ‹ÐøŒp_ž9afN˜Ê¿etˆUïˆÀe9èccÓ4xÁØ^ %vö^ñáCï¹ÿ‹bÂXô—eJÈ8ß X;;#”‹÷4Zy àºÞZÁN(Éï½þñü’ UÙø3W¥ð¦Ê#ÇÏ +[zBû+à9x}ü!*’ QÕçðݼ~äØÐ”_§ä~êïѺF¶ç™>.j/˜Å:ÇÀàÛáI|,ß]ëdóWŽHã&Äè[Nilt¹½ë1lõ¿ÿ/'Ž NŒÇÜ#—{®àÄ1Á=¢”ÿ“ÅÉã‚“O N> endobj +1764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.0197 604.364 315.2448 616.4237] +/Subtype /Link +/A << /S /GoTo /D (rrset_ordering) >> >> endobj 1765 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [242.0197 702.9298 315.2448 714.9895] -/Subtype /Link -/A << /S /GoTo /D (rrset_ordering) >> ->> endobj -1766 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [238.0484 622.4676 311.8142 634.5272] +/Rect [238.0484 525.4389 311.8142 537.4985] /Subtype /Link /A << /S /GoTo /D (topology) >> >> endobj -1763 0 obj << -/D [1761 0 R /XYZ 85.0394 794.5015 null] +1762 0 obj << +/D [1760 0 R /XYZ 85.0394 794.5015 null] >> endobj 514 0 obj << -/D [1761 0 R /XYZ 85.0394 769.5949 null] +/D [1760 0 R /XYZ 85.0394 674.157 null] >> endobj -1764 0 obj << -/D [1761 0 R /XYZ 85.0394 751.153 null] +1763 0 obj << +/D [1760 0 R /XYZ 85.0394 651.0501 null] >> endobj -1760 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> +1759 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F62 1351 0 R /F63 1354 0 R /F21 930 0 R /F41 1208 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1769 0 obj << -/Length 2587 +1768 0 obj << +/Length 2656 /Filter /FlateDecode >> stream -xÚÅksÛ¸ñ»'Ÿ¨Î Á›Àå“/g§¾é9­£N§“ËF¢cN)R'Rq|7ýï]¼(ð!;©¯ÓÉ$„€Åbw±o„$þDH$5ÕI¦9˜ˆd½=ÃÉ'X{sF<Ì2-c¨Vg//Y–h¤%•Éê6Â¥VŠ$«ÍûT"Š€§¯ß^_^½ùûÍù"ãéêêíõbIN/¯þráFonÎþùüf±$JôõŸÏÿºº¸qKÒãøáêúG7£ÝçÒ›‹Ë‹›‹ë׋«ŸÎ.V=/1¿3Ãȯgï?àdlÿt†ÓJ$÷ð#¢5M¶g\0$8ca¦:{wö·a´j·ÎÊ`D™¤3ädN€B#É(³l›}W•m·XJŒÓß C‰(Œ'KB‚ZÀßDÕ¬óê®i»WÑïºèZÿû߯, -|zóx9:Ð]­[|yIc/gŒõ×O$"n››¶èܽÝoŠ}YòHè åHsÂ-’Ü5ì‘"ݪ®ÜU…ù%Óý‚¨´X7ö»iHîfcˆî°¯‹[.k·’{ŒyÝÞ{¿Ö¹µmþà&>z4‡¶¸=Tn®kÜwÝÔ¿`L?âóº»Â­zšf™6·~óÝ Òg®dWåkK5g@µ=–s¦†v×ÔmÖÁ°JW°6½Â¢B*ÀoÐî÷pËÆFò#‘ -:ض˻b[Ô;rWì·e×:BŽüç]ÙÔÂò ßžÊ^æ¢í¾ Èœ(À¤¨Î†g/T'wŸHà×Oŵ֠ë×Gà!׆<8ó›f›—õĪ1A’0ñÇ1Þc|‚q†9’R— ã/æ8/¡2=äü:g¸§ˆ+Ã|a\=²;›+ˆ=Lè´nÌWy[±S傤~hì¹4VZl¾ƒåúٰ)ns:~K;ëºXc.èüúŸó®AjØ@#Nyâ4h4´+ú³ìâIÚtL›:A[Ƨ}D{Œ6ù8mV9£ƒ@Þ-™"r˜Ã É ±Ö;BO®ù¼ã/”ò9±EtÝõ§²9pÆ‚ Y4!8o;P“ö_0&>ïÅ0ˆvh«ŠOy冟óêPôNz?CœR€A°§uâ_¦ûÜÊç©ßOœÖˆÀ?‰`%Н±]ÆÊ éZï·+b’pë™ñn\~vŒýf`j)pv r™¯D n”ÑBÊ\|5úóæT¢P–XUs½”G¥'ãR–m6ɃJHœ´»ù‡ ¢a‡M#,8ý­©‹a>Oz6ª qÉN,™çIÛÜ+D)u´Å¯Gvœ¼@®"`0Þ× Y„IWqä5„©o¼>K½Ïäûë¸/Úf`ÜA£(’ñô´Ð#nž' £Ìy• þ”aÇi™ÃQ̺‚TK(W3¯ÖU¹þŸ ÝW`þ”#ps¨7K7ú`§W1.u¯|MèÛ;¦àµ&LÇU¶/‡ïËînTE—eQç«bé}ÆÒV»>˜rtjUšæÝœ•®›í®´%%›6YÁ¶0¡‹ÙÒ»öóöT -a¹.»Ò† -†Çµ.,ÛZ7†í˜»/«ÊMnón}7'–>VâtýO‡÷уþÖÃ>åob¥zž¢uÿØûD,"5b$ŸP:#%é 7)ji¦Àló"PÀsÁæ‹ÚЕc¦e¨¸ói—ÍÞI¹ø’ow• ã£vž¹MHp%V“ÆKÔË ùéàæ}bj ®®Ý×8vtî>.3£¦Ý‡<%4ø…›Îr®ñÕœÆGPΜ}Ïo–°¾ç7j×A1¦ˆpñÚk¶”é:?´Eè·=Ä/×’±-»ÌæU®}fy4£ó“>Ù·ð¼ÌÐÉ`êîrßûË?{TÇœrp;TSPò¶±gØ„P!MKrcÖ<¹û´‡[C­õ@ÆsdÄô }’¬6áf Ó¼ºÏ¼ûýø¤ç}$ÈÙþÖyå3×|Â~®5ömž>vñ'<¹UòìèÉãÖÜ4_æÕŽì“íHÉ´·Ö»]‘[ZŽÅÅà suãË ¸WˆJC¸Álä=A£º‘Ë…Cª²hÑ©—È¡2ÙW=%(²µà'nÅ@Řþ—vŒ\rÿd”A>lØõÊÙ€5 U¸p%\îpÝ„•w%Œå þ‚¤+ø—¦“7À‰3Prp–ˆ -08:ù5!àcµf([^2°/¯¶4ù±Ž’ˆ©€xc¶LÉ*ÓqÊŠ@ù‡ˆ+PgNLÞ¤f´/ª"7îÉü0‘Ú|]bFtŠs}lËAƒ‡c„©Ô½/`‹ÓäÅÇîÅ€0Á!)îK먹nÎÛ4…'̪«´‡ÝθFS]¸›åDz€ ¢Ø×flpĬk'æÙä$R§ yn %¸ÁcÊpã< ˜¹,=f0³íN´Ñ©I¸ Î*lrXG™üèÊm1%À¦3·¾\§?qJçNXF¼R» òÍÚ}-ÃÀ,ÓÇâ „mÁ‰ºøswÓ< ’ ª´Jb zžQó”æò¤Ç]ÆÐÎ…yu›- ŽÁôos¿ͭ²ÑCí¯càìh.¸‰,C4“äÄ+§ƒYF@§) @† -2™e×U“?Ø»†xìÔ3=uàLiMÈàÔwE狌¾ˆ¨Û®ú§þŠ‚Qƒ¹Žs¦,É×nµQV*›¹ ûÏIYoʵ}óOtØÍoÊÖ”)«Áf„NReºV«»PÍöò˜‚1¡!4^¿]ÍuA9 S£wÛ lÁùlŠ 2}1—;¬N5ç¦éaiECúÙã\/ºrÀÁ>?(ëCW´îhfëÍ(oó/åö°Úp‘cnV³@QóôHÄû‡C›’s2Ð3¨²}•'OöY¾ö¿ ÚTgJÑy}öµ D~29µZÿÿ¦¤ÿÂ{ ’endstream +xÚÅ]sÛ¸ñÝ¿‚“'ºsBðIÉ“/g§¾¹sZÅN'—Z¢mÎQ¢"Rqt™þ÷.° RTìÔ×éxl‚àb±»Øo˜E~X¤’h®£TK¢(SÑbuB£;øöö„9˜™š…P?^Ÿ¼¼i¤‰Nx]߸2B³ŒE×ËqB89 4~óîêâòí?æg§©Œ¯/ß]θ¢ñÅå/ç8z;?ûõ׳ùéŒeŠÅoþzö·ëó9~JŽ/¯~Â#Hçççóó«7积>9¿îx ùeTF>|øH£%°ýó %Bg*z€J˜Ö!@Éf”$P¥J“Dpaøï׆‡hÆÑŒÊhÆÑJñàãË Î4`R¢Ï,Ìõ}BI’ø¶®ªú¡\ßákñ%_m*÷í¡¬*Ý•ŸÝÜö”eq‘7õ:¿ñp7Å}þ¹¬·£´~ª^äÑ}Ý´8Ê×Ë~ªÁa½Æç²ÄmmµÇ™E½^Ãk±´|SÏ0ªÓºhêíï èð_šT—«Jã¦\•U¾ÅɶvOKœoõíès¾\"-MƒM½mo¹Æ¯I,‰&_ó¢ÙÔë¦ðËŠuRÆŸv§,.¶eáȼµûÔ«!‡x¤–!´¥¢(ÍÏIˆ,¾Í?NÌd¾ÞãÀ°džŽ¡tÍL/]ûÈS¥IȉùŠœXŒ5>?íæ¥c££b‚Ÿˆ1ÏDwüÇ㇩#-€€Nàèħ¬µÁe·~‡à­¬aÊïÔÂÜç-¾4ùª þ%ž¤YSOé çüL'óâȂѺnqpSàÓhR±$h¬›«¬JsÚ ¥ñW»}¢Hª„ñ!¬’¹¾ާƽ;ï1:“¯ßž6¹šõRš +Ñ9{–&Á‡S@8Ÿ7…“Ä»íD¾gÒ_q0'ÉÉ?ï ëT¼ÚUmÙ¹(§!µ}.Éq6„hwÛµUø\®½ràëæÁžùæ¼Ó*ßãÄC³kŠÛ]…sÖ‚Sí©×¿QÊïvá–Îñ©Ø‘U8‡h‹Y„ú‰SÙTùÂ.nw–Òa€)§ØV?ãu5®ýðP˜`¼Oø ÚíaVùO_Q¢RˆÛ´y[¬ÐÁ–›b»*­É!‹Žÿ¼-­U„åž•0ÎÀº)Q@Ìg$ã:Šý.µnBÀÛO8× ‰Ñø}áàóª©qÔNË-K!”KåeáMñPhB +#™ý0N6O¶Š,à‚7„}ü¸½‹p0ò„~.°yÂpû¼†Ž÷à.ñ\l„–(hÒàm2-4d,Ôc”`3”%uã@\–M'n3pbD¤QÈÊÒTõÛCß‹ ÅàœHª¼5•.0, c8蔌ºiÌÇšWÎé™jª†Âú°¨ò¦Á”7JäÃÌmÔA…cLTƒòq!¤~¶Ä:Œ³¥Ù€8’J9ˆ¬³©›‰¹"sy-ròEó¡ÝoŠ ¶Á³±„{=ñ@®5È‘fÉŸÈµÇø×Zƒº§ò\÷ÀC® ¥÷ç/–õ*/׆MI˜PãÆGTBÝåÊã/¦8׬N9ï£ç÷œpc§o˜Î#Œ·'ö Ð„ÐR/MN¬ Ó5¬Êœ­Ø©‚º{.•Ë`&s‘Ý,X·9Ä·¤™ô^Xcêèìê_Ó®!ÑÒ³A—9â ÍÞI›¢ÛË~Û„Rz•0oÇùý¢a‡E#,4þ£^S)½YUd|ÞR¥D2ÈwBÉæpzžšöšß7¾ÿ‹%šˆ’Ï$–ðLÃzö ®åiV#¸©µû<›®ký5 fXÖ^Ô®ëç:篎´ó oap{/AGÏ' C%ÄÄÔ@]^áÓ8vt†ÌÁÌè…iúG ~óÁ^è_O¶0{(´f×ù›$ìØ%ƒ $M4Æëþþ`‘ïšÂwÝöaó«o­&ipu`y4£³£}¾¤kä9!™¡’ÁÔbW×\/äþê¢Ï)§Ã5ea>o‹p‚M­H"Ù(Ç4¬9"r|4»[C­u@Æq¤Ì÷Ž!IÎe|ÔØÊ«‡|ß ›ÄÇï7bœmqùÆsК>ãÓ}èá8ò@É­#»s‡ù²„˜ÖW°v$¡Õ¸»æ9ØlŠÜÒÒû æº<œ+%Ï!œ`:rž QíÈãÂ&UY4äØí!S’)ŸÔƒ’ Šl­äÑ„; bB‡Kö+F.¹¿¦ätàÚ:݃\ÀÚ@1i2‰¾í*8Q‚{Ýî‚Å×ð—Çת€2¿4Ò&…Çâ!ú1B¥Öa‚±å´—€xy¹âÑO5ð,y¼³±e)ifÚM©Í‰ ‚Àk„KÐeÉLÞ¤f´-ª"7¾É¼˜(mž˜}˜‘…’R÷ÍádÐÝ‘”PžèN…Oa ªñ)§}ëb@¨Iʺº:h®›ý–uᳺjÍn³1~Ñ”8c3ãUN!{(–Þ¯™®àˆÑeúufn>ì5¯Žo y{Cýmð˜Üx¨d.J‡&Ö/ðîD»ë›dËà¬ü"t¿:È¢à¥-WÅ!6•¹Ý»Zy•Âtw˜¼Òº4Ë=x¢!ÃÀ|êSÇ¢‡ÂVx /8sv‡9d<ÓY˜Ïó Ò˜¾Ò 3ß‘#=ê.„$˜ùTÛžFÖ~Oý·†Þ™HÓãÉøtžäò)aZ”€ 1Mü¦ÿÿaOèendstream endobj -1768 0 obj << +1767 0 obj << /Type /Page -/Contents 1769 0 R -/Resources 1767 0 R +/Contents 1768 0 R +/Resources 1766 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1747 0 R -/Annots [ 1771 0 R ] +/Parent 1746 0 R +/Annots [ 1770 0 R ] >> endobj -1771 0 obj << +1770 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [325.3322 626.0361 398.9856 638.0957] +/Rect [325.3322 530.3947 398.9856 542.4544] /Subtype /Link /A << /S /GoTo /D (the_sortlist_statement) >> >> endobj -1770 0 obj << -/D [1768 0 R /XYZ 56.6929 794.5015 null] +1769 0 obj << +/D [1767 0 R /XYZ 56.6929 794.5015 null] >> endobj 518 0 obj << -/D [1768 0 R /XYZ 56.6929 696.6262 null] +/D [1767 0 R /XYZ 56.6929 600.9849 null] >> endobj 1294 0 obj << -/D [1768 0 R /XYZ 56.6929 669.0349 null] +/D [1767 0 R /XYZ 56.6929 573.3935 null] +>> endobj +1771 0 obj << +/D [1767 0 R /XYZ 56.6929 447.7048 null] >> endobj 1772 0 obj << -/D [1768 0 R /XYZ 56.6929 543.3462 null] +/D [1767 0 R /XYZ 56.6929 435.7497 null] >> endobj -1773 0 obj << -/D [1768 0 R /XYZ 56.6929 531.391 null] ->> endobj -522 0 obj << -/D [1768 0 R /XYZ 56.6929 132.8855 null] ->> endobj -1774 0 obj << -/D [1768 0 R /XYZ 56.6929 106.4421 null] ->> endobj -1767 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F53 1303 0 R /F62 1352 0 R /F63 1355 0 R >> -/XObject << /Im2 1341 0 R >> +1766 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R /F62 1351 0 R /F63 1354 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1777 0 obj << -/Length 3335 +1775 0 obj << +/Length 3112 /Filter /FlateDecode >> stream -xÚ½]sä¶íÝ¿bß*Ïœt")Šâ£sçK&¾Öv:ÓIó Ý¥mÍi¥=IkŸóë ¾Vk§s3µ‚ ‚€ËV1ü³U&£Xèd¥tɘÉÕfw¯ ïÇ3F4¡' -ÇT?ܽÿ$ÔJG:åéêî~4WÅYÆVwÛß‚¿øçÝåÍyÈe¤Ñy(Ó8øáêú#b4~>|¾þtõã¯7ç* î®>_#úæòÓåÍåõ‡Ëóe’ÁxN3œðéêçK„~¼¹øå—‹›óßï~:»¼ë÷2Þ/‹…ÝÈ׳ß~W[ØöOgq$t&WÏЈ#¦5_íÎ)"™á1åÙíÙ¿ú G½nè’ü¤È"™qµ @ÎGd1ÀIºRRG©à ðç|g®+a[Iäe[#´©«®9gYP—­ÅÈ {4D´«U‡p}ß®ØQïÇëÛÛË?åe±Í»¢®pŠû¼(nVÓÒ\Ø¢5óÍ£Ùˆ8 î͸¯ðp¦]Q¡•>ˆ d,ÒRr·ŸÝa‡'ä8ƒ¯ˆñÛØÒ¶ÅF¾ß—…Ùb£«ñ»Î áø@Ѐ -C£ -š²ó½å <ÛÝú•ºéÄ¥i[?2¯ÙŠŽ4)Žb J®Xi.Õ²åQ8¦ÂƒgK–㩜 òoaåvêv0[žI%\ë××縉hžL£„11åàî\óÀŠˆËz{ØXÉò$¨L÷\7_°³kò{Ûÿß8æìÏ«-öÕÇæ­AÌÞ4÷u³Ë«yg1šÎ ºZÓ›e&Í0ͤRÌôîHœ3¤Y”2‘€à,¹Ó.‚Cë´ §,ðEí G>aâ•pÈqZ‰6eÇ¡å»&Ô£i GûÀFQõý~-/ß™ Bž³€trzÆi»èwïÐT°5÷ù¡ìäž‹1î7üWä£%`zù8’d<#¸­,QDÁâ,ŽæŸ‡)ƒ 2Lypy$˜TÀ®¸Ü9O¹]|õuÅ¢8ÑZ Õv»¤àï¯v|õ±†=­ÆÛò3‡ã©Ý¾Òé[ÌbËŽx"Щ];ES Ç»}ivp¿;Õµˆ -¿”̤<Ñ -2¹T¬Æ"ý¾SL©!u ‡Œóût(wa;­¹(%^ @† 2êvÚ›õT.Ä+B—hÝKèÜ?´ŽÎ_ÉHe_8ölžjÉY»*… sÂÈíÞl -›£¸»Où€@©Á»Òy7Õ‚€žkÄÑ/Ý¡Ï~•2L…$}z XØy•w£„úóCWï ‘Áä8Tq”q!§.jWµ½¿!Ë~0•i(„„¦½Ý?43º­˜<3|·/U¾+6Ø8ì!Å74Ð^°sÙÛø$ ê*€—*v6d^7£SèéÃñ€ãS8žc¸ %GÀ\@Gܤ<’`´nŽ4¡§z‹‡£Ù,¾þd¾íén‚›ëtRàˆé"³¢'Öë½ÝFN£1¡kGš©œªS¼Ò01óQ©Û±VZÄcýŒ@YW­Í}íy±mÇë ÂxÕ"DÝs½s+ºâdøÅî^Ál„™Šàê{]Žäù —â=dz ¡ÊÇVÇJ/„ô‹Cf‹#™Ût²÷ 4Â(W<°$Þ¸: ÂÛÛ­Šòwð i; %‚^ÌDU,Æ}Þê%&eÊ—Õ@&\—wbØ¢Ó,͹§+Ð¥ð3L^ìÍsÑOØM§š0‹+â×¥Å6rPüÎ;£!rñ\.llijΖÓ÷DEœ©Œ®k±”¼³$Òœùˆöó=O…UV [ߤphÕ¡ïš2á¼|`ï9¶í´V¥ =nHó áÒZy(PBƒÅ8Õ‹É›–ª#8U”8e€ØÓEhlðŽÔs±94ˆ¯ºù¢~:XÉz_qZÐ*+”Å®è‹}ÑxTšÝ”õæ •&¾˜g[œÉˆ÷2:®Ò0£¤ðe—“QÀLô°y¿¡[I¹õQ½ÍAÓ8È)ã(MÞv„k ¤N± cÖP@¸ÖŽó_fÄíç Ä >ÛÈdø~&ŸQ LB1Þ])5)å)qà‹pâë’R 7mî¯=W1ê Û¯fÕê§¼)ꃯDùҔXKµÅnrû¨´p§ŸLM!…TE¼QSæz*ŒdÒaUoÍqŠšBR‰ôuzª&þ¢`‘&zÊ„ äî­ ˜ÉØØE°QD°; @~qP¨5œ5 7ß dªœ9s¸î$]õ0_yÕùé)Þ+ ŠåR%,Ó³[Òù¾¡–÷Z;@ÏE÷8éªÌ3Cþãò?猱 BÌYêøØ8d©šõåN¶X„e*Ò‚«S‰j¯F"¸D‰7ÔhDõŠyª¹yǺ KY[W¯óÑS-02Ù³fϦ| šdßè5ã‘b—Ǻ¤GŒ^›vÚdëðóàÞ u¾‰ûˆÇáLzåª]îõc(,¡j [ #UÊ@퇒>º˜Î¿œ‘ò¹Š³¿\ÿŸ -¦d“‚÷ -¶¤_Ä÷úÅÀÛ'IüÆãÙ˜ê´~õTsýê^öæøùLC*§¯sÐS-°0Ùmš@¢Ã§, ª¥ñU>û¦xBM€ÆÍG|½vVD9V²JK|[€6½CD§EÏ]%ÁC«b®d^µU"†BµLlMäTú”$°Qðát¾ë¹ ®°Ð×Ëè¹ -´GĉœFWv1FEq&íMi":ãÄ›•ƒ<Å>oòÁX›ù‚7N`Ìo{W?á$B3< -øL2xè¶UD¼Ÿ™­ÉoŒ_ÐŒ©põ~’¶ƒ»#PZÅžàiu d¡Þ(©^QwOÕŒÍ=¸ÐÇÐïðèì{ÍÚQwÍË1­G%å™¶ohÙë[è©ö0IÊ5¤"áÓMÜá«(åÖ-6F¿t@„»ñ-àßqÀ€þFá>Ï`jW!+ôÚ<æO… Ñ„Ü) ÿX{ï½=ZŒÀ‡]ø#øóõ`C…æ…¨Šø€£I6ï=zwp 5ã…º~°p?´pŠ p×äU{OoH± ~míRÀ J\Ú œ&.Åò¸ºÖ£¤HoÚWÍC›h”0içVlÁúÐ!οNÏæœ$Z˜ÃvýÒB`19œ  Í;¤†:hËü‰èú78;õv±À` ZNW7­ÏXºÎÕµpYË“˜™¢¨ WjOåv®®ŠAã Úô”ÅcYÃâ¶#v¨¯Æ¯†£Ávÿpâp®*a±><µ™êÍH{}A¼7ȹ|Lá¼SÈÁŸïÑM…öœßá/q<ê©ÀÔíþ2Ç©Fƒ‡²^»¤”¢úM;úd$Ûý -Hà†D=À¬¥uÙ -,Ðv‡5¢,S--OÝ`-e¾ÛŸú}–‘ýQÕ‚“‰ûØâ»»5ü°-Qdü„·²Ï>\+Ï”½RsÎûy³þ'oPÑÂendstream +xÚ½ZKsã6¾ûWèHW…<€<:3žYgOÖönÕV’-Á6k$R#Rö8¿~è_¢ä¤¦jíA n4>ô‹â ÿ|‘©„É<]˜Þ¾þxõéß7ç&î®>_c÷ÍåÇË›Ëë÷—ç1χù‚V82áãÕÏ—ØútsñË/7çÜýtvy×íe¸_ΤÛÈ׳ßþ`‹lû§3–ȧ@•'Z +éèöÌuÂè€1Ýs‘Gûª¬6Ǧ@ï†Ã| ÙÃ$¢xHuB–@ådY·ízʘ –¤©–§9wT3¬Å€5*I…ÑcÞ·¶màhSµOÖ5dTí7÷v‡õ>»¬«UƒmËb‰sDTàˆÛI˜°{‹”Õª\mYW3ɲˆaÿªlŠûµ¥UÝjeuΣG¢ú)v÷T’xðõLÔ)3hs‘‚&Üf®?ßÑpãqÊTâ/çI®”ð´»sžE°«ÍÆV+»J€¾ à7`_Ù‡b¿nñ%ðO‡ü¹L“<ëøkÆfø»ó2и]q†knÊjßÚY»Ž¢Za£ 2lŠoåf¿Á—çb½·§Ä1&¹ÄŠgóòè$e| Ž<'qó±„+ƒ0xù9`%ŠuSc àÑz•Ök`*à ˆ6õ¾j±xJ£¶ÜÐè‡ëÛÛË÷؆ý•+\â¡(×{<¨†ÖÂ7âéð·"´À© ÇÊ0W‚­•±ßàӭ— žA=âݹl·ëÒ†³©ñy_PG¸д …ÒÒ¬òar˜ë^yx„Ä©/ W¢ 3‹jV¬ä˜‘Ò©LŒfê´‘R7R•WTñ-®üNgM@&y~šG5#ÀÈT)€(çr,ÁÝy Ô ÝÞÕ~é4+Ò¨²íK½û‚ƒí®xpã¿3&–8Ž ÆÊj‰s‹ÆbÏÖîêݦ¨–öדÓyÁPgÄ`…¦­{$ÂXe©ÏDYTÍ‹Ýá±L´§°­äwêœè@g‰æÕðX2Ú7…‚Œ0<=Ð(PÎÞ`@JÜ*ñN¹yx󠻦®'ÛPí_ʪ¼‚>Â`Š€«M˜„£%Ái»h6ȦšÎ¦ê <>ïMù_ÑO®„èõshÁÍe© ÆÍ[C)À{抨·Þ mÄæS½ßõ†qz_D’³Tü=Ƀ^UU·ÈÅ~[Z´2&2¤¯â•¤qF£ q sŠê¥\“]¹'kÓ”k8øõ+™’Ýyñ øá©3äíˆSo· SGºA­ÇBðKGM’2 +œt–6ICªã&©£ +š>n‘Rpú©ÈN³ï¨fø-¢"åc(xR:˜x=ô×*Ü5èÆ»—§rù4š303nœŽQ÷^EGhyVeUì^±ÇAs[7e[ÂÕ{¶!‚н!Š¥ðN1“‚ø&›@¦o2r˜ð¬+Ç4SÑ‹µ_°Ë13Øt Ák§\FØâ’Œ<Ìþ½q½›âËbßeá7 +¤_÷–|&ô¶4ƒ,×~Wáû-$; ªÿ|t™ÉÅÕÏ?àÜ{‹+Ž<;š'‰”Y´®›ÖµrÔhƒ½8šƒoìª4ãÈÍMãÕµÝΛ½;0G[Pïõ->½Sq~û®ëþÞ]`;D˜xxå!O$ðpäXêõÞÛé™0e‹Ú\Bdpüž1Hy#?R¸gÊß³²ŠwuÝ6‡ JžHîîØ)ÖÕ o1 ¦Ežò1sò™áèfå}Ž¢2ŠÜHß5ÚÒœ.UƒCGµØÂ +¨ü뾤HGéšfhéz*Û´º¼ùˆk6áZ#É=]B‘‚­™^Âb¹´ÛÃØ·“l¨/¦“L™œ‰˜q5`« d|Hp΀2Õ‹T‹Ä(þW²v™ù"D6Ÿµ3—ƒ& ’8¾Îc°5ÃŒñRq.–9O¸á#ÃÜ)´ÀU¢¸yðâ‰Lc&8P†Ò€)¯¯DÉ.Àø|k1e¬Ety XTÂ.|ê˜ií˜/¾.xÂÒ<—H5hûÝöZðï®6bñ¡†=-†Û ++ÇÃ¥ý¾ôØáÀ3pP˜ÄøÚãÌŒ7Ûµ…̹ë¨ðI5 håçæ&ÑRËÅP¥ßwJ2ƒ%sÁm_¨ù> Å`-Ü à>ÉóLŸ°fÀ^§‰1pø'YGå#¼ò1öyfÙ¾ÆÞúÃÛÁùƒ—7Y&C‡†-PÍÈ1:K×hˆ1G‚Üní²t)Šw}&ÄÆôÆ :½q3]= s}4¢‹}»ï’_ã‚ [!I—]C/ì¼*ÚA> ãž­7Ç`n–d°6²PKðÔÎ}C’ýh+»£^CôO|ÐÊhµfx®^«bS.ñe¿… ßÒDç_§ºwá-wæH*‘d<÷˜ÂÁÝ#]¯›Á)tôñpÂá)®‹!Ü’r#üÏ4`\Ú‘4Hè¨Þ’á`5ªÁp€¢?hÙo[rMàD®Gõ F~Ì©žD¯·nÍÆ4†¼°RZMÕoíâÆCPêšÍ•®ã©~Áƺ®±uoê ‹{÷²¾b=-¶hxŠ;ÏÑoÃ'ws¦–ÑÕŽú)ÈÏ…{(ô +âB©L­A/¥ +Ìaôž¨&Ì‘Ìoù»3Â,_;p$Á~øò¹Açí¹¢þ}»×´›ÐA§f¢*gþpëæd&TÕ Bø¡`Äð&Œ“4o^»:¾o;Û”:áØÁ¡ á­< Nàï¾»e•¤=B_ŸåÁ‹Ï~ˆs_Ÿ„_æ…¥^m±k¨8".s3†®¯3hÍú<¼/Á²P}FÃBŒq]eå"I*ôˆ®Ð#¨x$\ö¨,ÑPx“Þ×”%€Ðp§‹­á…÷¤AŠå~‡ýU;e–N΂„‚ÓÌÍ¥ªÂºÜ”]m¢«*³Ëu½üB•‰/öÅUêè°HÃóD(ª.G£€ ÂréÒþA7 ’õ*õ.Õ,*(áXÛ¢i©¯±x`ÁÀnC¹Åï]ºªŒÐqûù{z›ï($øa¥P N= 8„‡Ê˜ ¢(MaQ¨u‰߯ç·lÜž/µìW“bõs±+ë}(Dùî&ß(‚ÙGЂO?š™r<Á뽑™©ŽsU8FºÒqU¯ìa†ª5ÙRŸ¡£š‘ado +†. á¹§b2>4|ÑAÛŸ? ¼8©Æ®{8kšn¿AÈTùëÞàú“ôÅ#èùº/ª6,Oñ8eP,§y’ò,ŸÚÝÇQ)ïO¼íÐz)Û§ÑPe_°1ä?/ÿ{Î9ìù_È !s_èxW…µã&É¥0ÇòÔF®DœIóŒT'`¨¦0 +†uK™NÀ¬›ÓrtT3‚Œö 9˜ÈÆrôHrŸècÆÅ.Oõš¾ath‚¶G“+ÃOƒ{?ÕÛ&"ßgw€+_ìò?úºB£gìFPÊöròý´ Î|¾àœëÿ`FB6ÙóœÅÉý¾˜óB¾¯Õ |ª)¾Ú×­=üz–C*Ìôi :ªF»…,“1¡‡VŽEá±Ý•ψx¹ù€?úðõUìò¢b˨\á§x§ÏPТӇEÏ]¥ÑKÜ1W:-ŠºÀ*•}ZA +&ôØ™½T‚©ÓÁKC®#ÕÜwoWXèÊeôµ +Ð#YªÆÄ•cÆ©&Εót&¢1Nõò­@±-vÅÆb¬ÍC½^a> endobj -1779 0 obj << +1778 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [315.1789 427.0782 363.5077 439.1379] +/Rect [315.1789 349.0138 363.5077 361.0735] /Subtype /Link /A << /S /GoTo /D (dynamic_update) >> >> endobj -1778 0 obj << -/D [1776 0 R /XYZ 85.0394 794.5015 null] +1776 0 obj << +/D [1774 0 R /XYZ 85.0394 794.5015 null] >> endobj -1775 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F48 1228 0 R /F62 1352 0 R >> -/XObject << /Im2 1341 0 R >> +522 0 obj << +/D [1774 0 R /XYZ 85.0394 769.5949 null] +>> endobj +1777 0 obj << +/D [1774 0 R /XYZ 85.0394 748.9943 null] +>> endobj +1773 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F62 1351 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1782 0 obj << -/Length 3921 +1781 0 obj << +/Length 3955 /Filter /FlateDecode >> stream -xÚ¥ksÛ6ò»…?Ê3‹'s77“¦I››kÚKÜûÒö-B6/©ŠT÷×ß.v‘e·sO„Çb±Xì”×þÉk›&i¡Šë¬0‰Ò^ovWâúæ¾»’ ³@ë1Ô7·W_¿ÕÙu‘©J¯o·#\y"ò\^ßV¿¬ÒD%7€A¬^ÿøþí»ï~þðê&3«Ûw?¾¿Y++Voßýë µ¾ûðê‡^}¸YËÜÊÕëï_ýtûæM¥Œã›wï¿¥‘‚~. ýðæí›oÞ¿~sóÛí?¯ÞÜÆ³ŒÏ+…ƃü~õËo⺂cÿóJ$ºÈíõ#tD"‹B]ﮌՉ5Z‡‘æêãÕ¿#ÂѬ_ºÈ?)¥SµÀ@¥F Ìeb‹Â^g¶HR­´gàðàèL|EÃÌWnK?ý –m5žOÔêë¹ÙñoÀØïݦþUåxíç²9º>A¦åp‰ÉÒ“q‹‹´ÈVÛ®iºÇº½ÇnºªÜ¶<6CO“å~ß<ÝH)W œOŽÎ'µML. À(wu»>À9à k$“WL8"«ŒäZÚ¦w›®­ú¯ö°y’ZkÂå—· ¬*l›j¶gÇZ[›dF`‹L -k•‡ÿUXaˆyÎ}ê¡/—È2i’ c&'‡;ºDTZ$Æä9ƒ[$È_X8w¼òó2ØÉœxìðÌN™H„H3—Jél7êàAÕì É™vÉ$“2òó$KÁ,k­ÇP¤ rÁšD(¤ÏUm¿>Vûu_ÿáæ»ñIžÉâùí#ÔÂþcÆHe“Üj5%à£CQWB±A£¬>»ÃP÷^‰ ÿæÛ÷©õó·?Qãî¸E­ÜºöõÊSïgê–!žwô ̼2wÍlÇÓònK÷åæS¤Œ,ÀÆÕŸ]Eº¼6&QŒõDvÿsSõMíéÎXù±®JÂAR(C-"-[D±8-ÌVÝqèëŠ5ÊöÞъǺihðŽÁúºqíÐ ‡Ù‡a“©†Öƒ|ŽÎ|XjÙá\4úØa£MÚÆ²×Z°ˆ„AÚàð9öaØ÷> Ïø0•Aü“g£ñ9ùŠÆž|b/égâÃp GZ:Ž´q‰·€Ø ™B$ìÃ&`Þ[ù;…8<1>i+öćaä3öaJ˜s†@äÃ<8ù#lŽ}®ÅP:ú°É":=>¡ÅMfâµîó²N€‰¢à Fão[¹=h Ð<µf1¡›„¢1ô‘ o0D9ª_H´’êÏÆ9KÇ8'&×(Î`xÒlê€?²h2éõ,;-érÌQNʉ»1õGxî -¼c×–ÍɼÒCéŒR±¹£¡ œÃÂE‰+føæy0†ºì"i ˜ŠRظ5(ðŽ¢‰c€ÄYe™yžˆµ@ÅÄ1ÙX€ c1À«dÎþ™×p›éóm?üý£k'}èXÑ»3'§!¯d“³ÐäáþšF§Šð/œê/ Ûƒ(J†ÎèÉ!ÔZ?ÏÛõgØN:Rb‚ÏG~:Ñpæ¸}ýÖLŒ¶_.‚ÓÜ—aA ÁßXÓ" ¯8óSi"M:5=õsC¹þÒmH.°}dÇ*ž‚íÈã˜5í9ST"ñp¹Y½­éöoK¿ >P“d§§m¼õ;?¨†\FgÐ~þ¤Y¢CÅæäå‘Ô§}½»ÿD]÷eŠ7 y¹š±$ž¬?è}ì}R -ý{׺CÉÓÛ3؃[,liðU™‡>ëM·Û?¼vœ¡Ó8v¬]ãƒy½zß .Äþ”@¼ñàÝ[f)0¬r8”Gë)PUOBúvébžØÂSÇ[eúÒÝX“…È^¸`´Ö!òÆ06]Y¹j±0fÛƒFP\™É³<ÚnW3‡únçxlÁ\Ù<¸Í'¦ƒßó´;6hòõßñê½; '‚T`£¸-”êOµj–?¸B%ÀÇ ì#S²)™ð;Çò‚Èg® ƒðïPW•·³:[ùÓêÜËüìɆ®YÆà0ù\»Gš¹+{Ϙô^†êvÓ+ -z=Ò…û±dë©úk 0ÝŠp]ã+€MQöj>Æò%¬ÁP'Âd³Êá¥L"²(Adç·*A›âã‹gÉ"žTEÏ’+ŸßÌ"ósù³"Êß…0Ÿià†ŸÒG@—ƒôä5¡©¯ý:ÜöïGwxâgÌ çç$*]$&Oå³4F s"§L4‰I!âS ±eÏUöÞE( -. úIÄD=Tðw0¹;î0L¥yzM„Y¬ ùÂvÚãîÎE‡¨à®³™UöÎW‡rÝæxàœÆ²ÞÂݲuݱ§‘ ¸_âõI¡¡Q¶OÔ¸‡Õ-5‰£¾yJZåDƒ@˜m&ƒ`ý}é±+ÉL¬|üŽFð«ß!d„ÿ7 fHs°´i OþñNæ .‚ùÖßr€’L¯>•%sÙ˜ˆxYl6nïí?X‡œ ÕðbUQÉc¿ç,:Ÿå¿y×Å7X8Q*¢³ÆØ4Bâ ; `böøö›ÃÁš-µ†cëBa–ûü”Àçá‘®þ‹iñýB$/nâÎNÉþ %û{|ÑâòžQâ6Æ/R̞ɥÓwîŒUÈ“-ÓH64ûˆ+jR0B’zð¥ -‰ÊâZ(­Tà—ÌØŽy ¿$é’žà'È94ÛrLòƒ:NñÎCùÉ1¹þ."}}×|^,Œ‡¨Bú¤Ž¡.G©ŠßuëíÓºrMùtþ¸¨[€v<»{„ZØ~r¡2ƒ` réÉþä”3üP)ÀïÀP]rNótüSŽU—áѹ8ÕrŠ”e!„ÕsR>ñs$? “7…á’~ÐxûbZ1&(D Љ•›Ù¼6ŠùEx.ÁHÓrLwú j)¬‚ 3)Dй4t®ãÇ2…¿›5Äbõͱn†uÈsb<èsJòbšãsÙ=Uø!šÈG‚ù ¾šRu¶û\WŽßz©<†­×ì·Ç†«º¼o;0üšœPAoÄãOFèë† ‡ü3@ŽoKápØ#ú=(ä¥0Gì{w¬ºõÐí×¾²®:ô K­’ÔÆÏ4îê¶Z®«,¾D{’tv©0N#– ^ÿêÇ !F/òåûdKÞ`£8çBüáȘáÇ¢4ž®< Ôò¬¢ªvGƒUpúÂËIü"3>ù³Iüf÷}®Å3Œ“% /¿Êž[ 6Bç#BìÃ<»ÿÓ(…’i>üŽr³é+%>äé WP¹ŒeÈP´ècZäHDVôYm·£9޽‹‘ý€×z‰°ê‰J€OyåÝß½_ò`#2 -?‹óg¾œú¡ÅT)§ÆpßtwesIDðC[­—nF\ ü¿?}>ɘÉçêB©"䀄‰ÂSfù¹oäo¤ÏIÿG7ÝIendstream +xÚ¥:Ûnãȱïþ +¿EVܾò˜ìÎl&Hf73Þ¼$y Ä¶Í3©){¼_Ÿª®êIQr XÕÍbWuuÝ›òVÀŸ¼µi’ª¸Í +“X!íívw#náÙO7’qÖi=ÆúÓýÍ÷tv[$EªÒÛû‡ÑZy"ò\ÞÞWÿ\¥‰Jî`±úáçO>þôëçww™YÝüùÓÝZY±úðñ¯ï úéó»¿ýíÝ绵̭\ýðçw¿Ü¿ÿLR^ãO?ýH3ý\Xôóûï?¿ÿôÃû»ßÿåæý}ÜËx¿RhÜÈo7ÿü·¸­`Û¹‰.r{û‘È¢P·»cubÖa¦¹ùró÷¸àè©uI~Ææ‰U&½]k“ä@YÊ2ɤ¤ÌIª•ŽRVrIÊ ¥¼«ÛõÁ=\ÿ´êûŽÄ°+¿-N{ìáðzŽ&çrÓ©LR‘šÛ1sg[ˆX {P£=è4MlžeÓMÜ?¹ÞÁébÕ퇺k{l»v8ÜÉ|Õ541<1ZïÏîp·†³ÿC,ß®Un’•o-eRX«üÒ÷T>× *­W]K¿~QÿéŸêö‘æKúù½kBfõ/aÅ\ývt‡WÆ2«‡°Ü—Ÿß°}*ÛG×¶dB‡1¡!¾¬WeݸŠàáP¶ýƒ;ô äZØÕ¯ýˆ•MóJ„p»¸71Ý‘-ŠÕsÙ]O01Uä$#œá]T48ö®‚“×R®6Çæ:€ùš£÷r9#o^ãKìÊ~€Ã€³àuëgÚ/<ì›ò™ñ¡ù¥«õtk2¨s݃X†îГv6õ04Žà‰>àDGëY¯õá„åÚ„‰v¬i:Õ'MÓ©A™w/4ï·åçª7ü¬£_/ CcDÜw<×V<[~ ³g*7CzBóÁç'ïjà·iôjïüKkú=`¦%­y 9VˆÏA‡k[•˜,³|– Þ:tj¹F1‡0ÇæÑ}Ãia2×mí¿¨4ÂøƒWj9ôà³èíqÀÞA"c9\-h3­ m^ŽƒŽ}ðBàJðRd?y6J¯Å.“X ‚=/\½¤ŸIð‰°ii;ÒÆW¼ïC€t +áà5AóaÊŸ)dá‰Ñ©šžé$xaÞ3^J˜óà…H¼<:"ÇÁ ßeP:¯É;&äszŠ|Zþ®y®BÛåà’çD¹ÌÆß¶r{°àyêÇb57IDc!èó@&0NC9§_Ð(³’ ê¿MpL"c‚ËìzÙDª4ãÈkŠàŽ71C•¦%÷5°ß R.;8ˆi$Â}W5çesrì´è¡ôF­Ø^(ÑQqë%3—c.°"{«E9ƺ "Y ¶‡ÃÆ­Á€w” M¢”Í*ËÌu&"Ö“¸`Ôà&l|‰o’Ü(Ó,¼†aæÏè~øK´fVôî¼a +UÈ ›ì…o øv=/Oõ“CEþÒiû&ø>òc?rqL(—öœ‰+*Q¾¸¹Ü¬>Ôtú¸nK¿uä$Ý鉌÷~çÕPÄè àë;Íú5§(¬¾îë-5ˆqè¾­Cë,/Wé4¢‚Æ“÷»)½/HaüèZw(ù±¥¦n[Îgm- ±*3ãÔg½ív{‡·Žó-àǵk|¯WŸºÁ…¬ŸòÈ7ž|xË,U&ô®a"'ÎÖS¤ªž$óíêÄ<±8ã‰JÃV™¾t6Ö$E!²7Ž­u( ¼s‡›®¬°­¾Ð³‰Îí›I#®ÌdÌY^iÙnW³„únçxî!l‚¥²}rÛ¯Ì+¾—iwl ÑäãßðÛ{w@I­À|в‘T$ –3¡¡ AÍânç°=-ˆ¼ƒŒíÏË"Ôh²bt0ÜùÈ«ïKóÛcSòµÂ¹\ “è“Çð2XûH·¿e"¬.Ƹ=Ñ©:Ú•Š0Aí]>„¾ùòV¥’ØŽ6q(_–¶*(—vêÓ²Ý ¶îtvâJß‹·t+eU° ˜ˆç0•ˆú“Â&yjŠ·˜4VØ —´è»Tžø†ÉÝ _êá‰8ÝЫ¾Ü1äM`ãž]CˆeTÆ=zRF¯!vÖˆ&ÍÓ\ºL[¤oÛ™‘6jB×"ÙGÈ´(ˆâò$Üx=Ró…„Áí(55þ¨¿ÆŽÌ5ègôr …Fý©S¯Z¨0»U¡»;¼U)™ñc}‚DA䳈ˆ7e‡ºª¼ŸÕß„ætã™O.“á0}âï”ü“MÙS×3§¨Su»mŽßq⢠çc3(ÖSõ¤éV„ãEÝ«yˇ°G“ÍZ†"–2‰È¢‘cœŸªkŠW/^$‹ë¤*F¾P\ùúf–™ŸëŸQÿ.¤é*SIŽ¥ËÕ4}Œu9MXÞšoM×áÀý÷èÅçs.•†¬0Oåu6#ÖŸSIšÄ¤vL W–"å;iˆ‚ˆ¾L±\ÇyLÖù––oéE¸™„§ñ¦íq·q1,á4›ùf‚uh×mîÁù>ÿ’Þ²uÝ‘o¶xàEGcþz ê¯<ÂÛ-$Ôxñ@Ú%'v*m3ÔëK^Ifbÿã7t…ßý‰#üß6Ü~˜-šƒ¿Mc’ò?o­¾s(‚×ák=ºå³ô-9%¨É äųüb»u{À—8”Lh†«Šû=×Òù¬ +΃Æ.ÞÃÂŽRCþ•p`ÓØå7PÀÑì‡qï?€hŽ­ Y*ïóSŸ‡{ê"|ÒR‘H<¸i¥Kþ ÇG¼Õâ& ÏžîPâ6·ÆRÌnÊ¥Ó«nîQp\“iäÀþ RÆŠ`Z|‘†‚¦ž|ÇB¢µxÍÕ•:üÒ‚7ÛñBÞÑÁ/©º¤ûø Š`[ΑI¨ã#¦<”_³ë#ò×wͳ»Ð{ò²’ž¦Z}| )ö¿2Xú¨×$G[²Ò7Ø)Õ‘£NŽÙRNж™çÑõ_KBŠx4rϾ?î\ Vòa×¼‘šyª\Ù°IȘ йäP5F±ÙMH»f‰í»6x«tu +÷¤10ÅìÀT0@šŸŸŽGŸÐ7^´šO Þ}¤ôHÓÑëx^H=P| k.x83uxÈ«·Ô'F.3§FHkkÿUOø( ç\zù6×mN†4ž¯Á/¶„±ágM÷rº&¾ä‡JÐâÉÑßá$Þ…y$æî ó\Ïœ_bWÖ-§·3U=¶ä&ª¥oR@® ¥O¢„ +™åŰ|žJ\<)“áj5;9(¼i™Î~ËRÁ¾Í<Ž ´ü^SS©jù#;zƒq¢™63ئÉ}xŸ ¯Ùy¾zþyßÈZÅ‚/Š5—.»ÁEñJH:AT£ûƒÿVÆR˜ôy$c£øÃ9£2/cœÉØd*hžÊÇ2ÆaX íèýãÞ +§6Ýåƒ 7 èý²%Ôz·ï|—Ü#¿.åÆRZˆGj! ›^Ê ÁÍ‹à¿.fªY–¨ ’¼ëŸ¼ž®|ñÊH|©[?¼®+×”¯ç—‹*±˜Æ5Òéœöä,eyÓcâŽ3ðž<~††’sž¥ãï—rìº /ÎÅG-—HYêG€¨Ÿ“òÆhޝ#ùêœÂ(L—ôƒ^Û7ÓŠ1C!?€Aì,ؤÈ̬)ˆõE¸.ÁÓr6wú*¹ôí4~ܦ?·A‰þßßUŸ>:7PÒçù…F´Êr¨!°MLáÖ²ü\Z¤Z`ý?Y@ -endstream endobj -1781 0 obj << +1780 0 obj << /Type /Page -/Contents 1782 0 R -/Resources 1780 0 R +/Contents 1781 0 R +/Resources 1779 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1787 0 R -/Annots [ 1784 0 R 1786 0 R ] +/Parent 1784 0 R +/Annots [ 1783 0 R ] >> endobj -1784 0 obj << +1783 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [324.9335 477.5927 381.8296 489.6523] +/Rect [324.9335 395.6435 381.8296 407.7032] /Subtype /Link /A << /S /GoTo /D (zonefile_format) >> >> endobj -1786 0 obj << +1782 0 obj << +/D [1780 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1779 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F11 1441 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1788 0 obj << +/Length 3064 +/Filter /FlateDecode +>> +stream +xÚ­ZÝsã¶÷_¡·Ê3‹O~4OÎÙwU¦§»Új'm’Z¤-NhR);î_ß],@4E§\†Àb±ö· È|Æà?>‹uÀd¢fQ¢͸žmž.ØìÆ>]p˳pL Ÿë‡õÅŸ?Êh–I(ÂÙúÁ“,Žùlý<ÿð׫¯ë›ÛË…Ðl— ²ùËÕ5Qú|ø²ú¸üôÛ«ËHÍ×Ë/+"ßÞ|¼¹½Y}¸¹\ðXs˜/¬„>.ÿvC­O·WŸ?_Ý^þºþñâfÝùâûË™DG~¿øùW6ËÀí/X “XÏ^ Ãž$böt¡´ ´’ÒQÊ‹»‹¿w½Q3ulý´Œ‹hd…ð3h«pé$¥f×Ûœ<ªŸó}Z–ÔÙ§­%·Û´¥ÖêËzùñ_Ô~Ê›&}Ìê¥ûKÏí„&¯ì„‡zoÇØÿÔ•›SØï¦®Z3½.Ë<#Úý+®+XÏ=ë%xE:ŸÑî&ßi¹øýï_Æ\šâ;é@èˆÛÁˆÐ…©‰9|–N0:Uxxÿà`0êP”í¢¨œ‡{X+ëF^>¥mQW¾‹oma34Øß­ºŒ²dÌç;Z‡ç"ÃE2£õ“åÛæåîáPcV¤Uݴņ{F ¡Ý’¨Ãã–f¤D¯O÷N[ý@´ûÎ7ìÙB†C•/x‚¶s$Z c|kŒ—Ñ|×䇬^´õnQæÏy¹Èê§$ï•¿Î\Š Ô‘Û¼û¢ÊFÖHDˆ¸´LÆ$ЂêÞîœH!<@/w# ’8v\›2m ðHà4Ö ç²ŒÙx—î[j™¥Âaêz+½ç"¡á_˜fMžŸÂ„Žc¨TŒÁIcûÇ5nÇÐÐçÌo¤¢‡wùÆžDž˜C,ôЮ$€=sÞ@JÇuÆŠ·ÒÐ XN6àÊá×,ýXP'ŒâðÌ6WÌ…²\/Ûb³%±DàÛä°YYp‡ÿ™ÓŠ,HeKÚµÎD˜uÊDÁâ@…î,W#r€‹H Ëò}§˜Žâ ~¿CEá<­^‰á±¬ïÓÒDØBj@7É#iÜ!Mþìpkê4³I4OÇl挱ˆckàoýBP9bø}°’2ŒçÂJYD‚F·HRéù}n_&bnØ!Œ÷DßÀæu!=²ÿBáÎÄç †ìpPò+)Íò_UQ==­è›ÿ±+‹MÑRÏÍÓ„9@9u,"ÔA'º¿<HÈyâ õ˜Ô!kl¶]wyzSÅ›à ”1p*¯*  9^ÎY¦…ÏEÐÁÇÌq™uË÷ Ø´xÄL¨iÅ׈æ~´JX9H=ÕTEqgƒé´ŽÚ…"¶·õ¡Ì¨M¡½«1W˜ÙEJ û¡¨3Mƒ4¾Ì*}ÊG’¥ˆD e—ܬ=Á‰¤aÉÇ´Ç¢ÝZ-¯»±¼©t eâj¢õOë18ƒ¦t¿£hTê!5Æ“˜©0Û‹s°¡è²3`ˆL„­Œ ÑÁ5vèñÛºQZö´¤^·eØéŠh›(2óœ»PÖƒÂH†ó»]¾)^10GòÓPADƒ­°z‰F¼Bd‚2F†}(·(g#Í–z(£ "˜üÁUܶ’Æ£Sä§£Pk¬oU2…>×é(ì¸ÐÖ-Ô–îlöŠ. õÙ¤bÇ4¢¸wÆ Þ‰h¦ ã ¦×:r…ØvQÐÞ‹B£(„†ý¸(„¦Yf_æ©(Œ9€C˜Ø­w +CXoöƒ•Œ!Ô×M±–ý3òMÑsõéz + +^Áä»D®)DâÐE^CtLÓæKWkL׈nXCFÙl‹Ê㥔糸١wýѶ’“ õV¬ú@óPÃm–TE&¡ +åPyëL +ÜŸÀñp¨L9Œ²Äž-˜°ÛO©9Ø9ìwµ)f”Eh ÚòJÅ.‰\د©\`ꈪì ª«KIÎȽ Ï"Øñhïf;êð…²p“6-uh]P‹I-rlÚ¤èWÇß¼€m=  5מZl@AuÞàl‰XèÁ'9ˆoß%Èžˆ,¬kTÆ&2`Š °ïÿ‚v*Š©qí|®Óh×qyE6X¸(²·‡è‹iõ׈þ>è1¸µBÍÖ3€fÍ—×ôm¡ƒ;l;¸‹pãÑË+d“Ï´Ò@Jé³¢…Ö'uiŽ0–¦Ž‚1´º[^Û8 +'çÑkøzï$›Mà"ToÏ-âò„^xb· '!Tsw—×ÁÝÍí?onÇ®,pÙLÂ~̓‚OÕ<2ÐI—Ä¿ eQÜÉò&ÂCþm(QE®i ؄ڎÐrq BHq D«BâTÉ 3ØÍ¡5|Є= MØ4x ß”>õFa§##Ø~`Düa—À[G0Rá0 e?,Y¢Óˆ¤ úÙD2s†Øƒ4ª +#WMFž•‘ÓV +‡)ö^!‡F:34s+’îØ–%MÙ¤‡æD™ (#x?´PúX U•;Ãæ$$Ê^’é¼U~rÚÕ¦X$™;kâ®Ç@M±fÒ1ÅFйâ]uÅûHÊQ"P:Q£ 8roU—‰ ¢bô&¬4—ƒ›ð‰ò\€O¾ Cà2îž„{ÂÑèƒðÍÓ®}¥æ¿Ï=ÿÒ®Ì.¤–ó­Ù­Üc/¼Fèå$YÜS%Pqî¾\=­¬°Õ}m ‡§Ì*¨«ò·6+¬{öã»'t̳ý@=+) õÊ{,ñ šÊ¨;îsú2ñQÊzãØ4YŽTW=%¡Ws%^•mû&unk€=&i÷ÎΗU›ï«¼ý“•C0àXHCX‚rmM/ÌC˜àøªËĦÀ›¦Ò+̤êlú¦¦”*e÷8M ˜f—nr;Ö¡=ì+_ýtýåóÕrE=mvuÕÐInIåËŽé¹”PÑ]váÕ²•MMS‹jS²|츑ÅR ,–¼g1Œ“Å@_~}‰dŽ =7h ëxD‘2Çc•g:¸†2ì$ñyYT¿MÉ4o•8¥½äsg±oH½Ý´ûtó›}”누*”ÎV´ÕoUýR½™t:b¬±„„6a+m[ê˜ãß,‡`z2·:ìæÉ\™ÊRøp…=D +ª´¯4Ù+ò?Н•Ø6›‚²lê‰âÙNÄ- ³é`CPRò”®¾le ¶±#âñt÷Ž,‡ªno~+³®¿¤v EXƒo¡Ö ÷ƒhjW7?‚¾uÙü8üÕʨ|tõ»^7‡=©p¿›–EÓö/I]ÝO¨9õ[“€¨Røn5ù{»Ïe.+ô¼bš±ôdÑO;‡w$…G¨¢i­×[µ£¿R÷Ôr,W‹«ëëÛàêö+¾é_tŒ‘:9ãºÇ5áºã:ïú”VÏõ¡Úq×}µ¦ìßì>Oðq[M{ï1vÞ1õ}JåÑõ¡ÎQÏ}> endobj +1791 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 61.5153 116.59 73.5749] +/Rect [84.0431 671.8392 144.9365 683.8988] /Subtype /Link /A << /S /GoTo /D (view_statement_grammar) >> >> endobj -1783 0 obj << -/D [1781 0 R /XYZ 56.6929 794.5015 null] +1789 0 obj << +/D [1787 0 R /XYZ 85.0394 794.5015 null] >> endobj 526 0 obj << -/D [1781 0 R /XYZ 56.6929 131.3071 null] ->> endobj -1785 0 obj << -/D [1781 0 R /XYZ 56.6929 107.529 null] ->> endobj -1780 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F11 1442 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1792 0 obj << -/Length 2818 -/Filter /FlateDecode ->> -stream -xÚ½]oã¸ñ=¿"ou€3ËO‰jŸ²›äêC7»MÒâÐÛ{Ple#¬#û,ysé¯ï ‡”)E–²¸¢’£á|q¾ÈDœrø§Ö0®2}šfš.Ìéò鄟~o?ž3HóëÝÝÉŸ¯Tzš±,‘ÉéÝCDË2n­8½[ý2{ÿ·óOw—7gsiø,ags“ðÙ»ÅõA2Þ¼¾ZüøÏ›ó³TÏî¯ |syuysyýþòl.¬°_z -G6\-þ~I³oÎ?|8¿9ûõî§“Ë»V—X_Á*òÛÉ/¿òÓ¨ýÓ g*³æôœ‰,“§O'Ú(f´R²>¹=ùGK0úê¶ÙÏ(ËŒ•逥2 ÉX¢¤r¬‹Ý·bJev¶Ù6妪iQï—8Kgyj1\0+­L¾^ožç¿í‹Ý‹GŽ9Ë·™Ç]mˆCµih’o·ëâÕ<ƒIí§ÿÙTE ¶˜-ö²ÙÓä¡(Öí¢QÅʃ<§UYç÷ëeòt.0ºJÁrB°Ìéäsü~8›«ÄÎö(„Òš¨ã¤5’Òfv_€Úg™œ9ôt¶Ùü±\õ÷ÝïËu3/«[J©YªD°%øôÇÛ+jÁ¸IÖ·²xö”_ˆéªøÌ¹¬Êê ÁóŠÆâ÷íº\– ­Â>3Û<d¹Îë¡#žËİÔfI×¼``¾VD‡d6í…ç™h@+ÌLLå`*ª…>ËùHÛ:ù7Ë¢®]F@˜sÉ=`‚®SÇ£01œÙ„ëñ(Œ±ŽGa‹…²>nê&øf' eÆ”PãŒÒãŽ)Íd¦{œ)“ä ‚[5ÜF!ÎCBjïD!|£(„‰BÂÔ™9¦y, -­`:MB]  C°7y'‘ÉpΕ…h²FuÃéMÑ{ÍÑÀSœe’«ï< yG!b“y5Á±L»Ñ…žÁ.Ÿ T”åcYE¸Tòb”°ûpž¥N<×2mu×2›}…G­SWP¥Y_Š&ˆô™¿‚0öÕÛTgÞ·`ÃvW>åÎp±ßm7®™Ñ>CзWÚ†$péG×¹ÀGè#ªrAŸ˰ è *¼›ÐAŽ/ûû--Oóêe™× -È.ÈŽ[b‹Ëf%ú%à×Ï ›Ë°„žkG³6m@C5•ÞÀ·¤•¦çãDóÛ_‡ -TOÌ,¼›×ÜÙ©L1®y¯LüO²Áª˜@ˆŽf»ëx¶k±¢&$œ—«×)ZèßÇÙ·Xü»I3©2Ó€Ó¦³ÅM´éç!ÝÙ^º³èzEYå7²4€r®é`avQ]8ÆÖ4@0†®o>ŽBÉSÙ{øÍ.Pv‡.A)ÌP3÷WdµÈüQ#àHÆÅjDpÆÅ»½¼ù×åÍЕŰ$Kº=>ÖóÀ5-k‹øÛ²,’;ÚÞ¤èäo˲É!Ë"É;²?$!„¶I¿¹„OB Iˆ¬@áÔý¾ßån.)[ÃxHM¸ò© §._ØÓ%£Î׌pÑ&#G؇dDøm2Â%%#œ’‘N&’Q/[vÃ2Kz<#iˆ~þ*#¹=ý܃0ê -ÓÐM¦‘”©‘ãRJÎÔÖÎ!C4¿•Yë¶ë5mYæûúH› ´¢{ÖH}¨Ž*:ø°ó„LûKr¦‚¶:.àÎk‚ú‹ wgÍÂõƒ%Öm:”ØTóмë¶y(9Z2m óáäÛ¿·j&T‚¨¼ k)˜ýt¤=—R‡¶mTуÀå:åªÌaâ󓀦-…äœÏÞ…W¼.Ÿ¶Í MÿŒÁ½¡JX®SGïÚ"°P³GwFÏê;µïnUuDqÏÅ“¸ýxNð¼òÄ®oiô…`ãÆ•g°©Ö/xxp\‰tÇU{†9áÓâÁ½”t¹Ñ““’ -Q§Á &ß=ù:û‚FÊ ŽüŠ ëÍ2 ’¡¡Ê’¨ëÊ¢>æþUê@¼†4G3zN2á¥)™-ª¦ØUEó'O‡A à“&&hØÐq:6H°«ã²Ä»¦T*jÍ”neørCEU©öy ¦2õ6_~Ù¡Ùï*ú~ýóÅÇç‹kZÑ×z»©jÚ H-¥cš‡l¥¸5 a›ïšr9:—ý:w7^,ßV¶¤RÓ -»Á„„@= Õ— yÂóÕÊ LÒèŒüD«›«÷´Ê™õ{Üi¾™™RÐÑmNáÅ£­ë m-«åz¿*†Ô"‰•ìI¬DGbøN|ñé[B 炌ԠoXE ¨_ªb…¡ƒ6TIKIÌÖeõuŒ¦{­Ä-Í™˜‰cA6ÛùïÝç˯þY®# œãæÙÓƒÙ¾úZmž«W;YËÃ2#¹‰“”ÊW#œåMƒ ‡Îý`\LOî^‡Ë»w©]o)ãt…+ÌžÔÚ¿Ó¬^Pü^Öx±Ä¹;¤å×ÐQ”ßüF<òÍ6$•¥ˆ)œê3¥­ÕÛ‹D8íÍcU@_·Ë±lù76©·Ì(×àk¨W¢).Å!é{•a*Âቩ¢gýø±1ö;bQù-ë²nº×¤/ïeý—cäPøÇS9þGË]W ìEí -L­Šh¡ÔŸ9ÔÀþ-‰Cë‘@eåÚb½fÛmÅ9ÌuÒeËÙâz~~qqÃÎo>á£þùQÍye;±šGX#š¬iÍǸFš÷Ùk³pÝx«îp+ƒ{屇ù {Œu\÷kR÷Q®Ý_±Ô½ÃVèÿ’ìíú.‡örBÿkDÿ€5­ÿ×Hÿ>Ûaýc¶’áåÛõ7ò‹ÑúGX#ú¬iýǸFú÷Ùë³…VZ{0}» Oü1;B1€GšÖ„e¤~ç°öOWMÎ$Wo×vh dÆ•°F´XÓêqôï³6@ÌV|W;ü¾Õ"sLŸb¬ãvh±&í0Êõ`‡WlíÐaËÙûY|J¦m–&Lk•NØ,±YÀš¶Ù×Èf}¶Ã6‹ÙŠÿ‡ÍLÊ2Ù ›EX#6 XÓ6ãÙ¬ÏvØf1[ËÞ± ,9Îòm6PÓ\N´[1Öˆ Ö´ ƸF6è³¶AÌö‚]¡¾oÓ]rf­œh·b¬ÝÖ´îc\#Ýûl‡uÙZvù=ÚsÉT"&š­kDû€5­ý×Hû>Ûaíc¶Ùwio³ZLtZÒqÝÒ¤êc,š÷y*ó<ÿ.½Ôœ¨¬œãZ{œI¥Gøtî1T9bøî»4V†á?ù H¿þ±áÿ/áÁx:e -"rX¼Z™¥A(Ô&Íú’·ÿtøZôÿÃóîendstream -endobj -1791 0 obj << -/Type /Page -/Contents 1792 0 R -/Resources 1790 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1787 0 R ->> endobj -1793 0 obj << -/D [1791 0 R /XYZ 85.0394 794.5015 null] ->> endobj -530 0 obj << -/D [1791 0 R /XYZ 85.0394 496.0455 null] ->> endobj -1794 0 obj << -/D [1791 0 R /XYZ 85.0394 467.7701 null] +/D [1787 0 R /XYZ 85.0394 740.6547 null] >> endobj 1790 0 obj << +/D [1787 0 R /XYZ 85.0394 717.7278 null] +>> endobj +530 0 obj << +/D [1787 0 R /XYZ 85.0394 401.004 null] +>> endobj +1792 0 obj << +/D [1787 0 R /XYZ 85.0394 372.9762 null] +>> endobj +1786 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F14 956 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1797 0 obj << -/Length 3233 +1796 0 obj << +/Length 2192 /Filter /FlateDecode >> stream -xÚ¥]sÛ6òÝ¿BÓ—£f"” ’¸{J§u§uîßô¡íEQ6ç(R);]ì‚%Êé]&3¸X,‹ý†å"„r¡‘˜È,R J½(vWáâæ~¸’Œ³rH+ë»û«oß«ta„I¢dq¿õhe"Ì2¹¸ßü$"K ß¸}óÿïÞ.Ó8¸¿ùp»\E: Þßü|M£îÞþòËÛ»åJfZßÿøöŸ÷×w4•0ïnnßÄÐÏ¢w×ï¯ï®o¿¿^þqÿÓÕõýpÿ¼2TxOW¿ý.6p쟮B¡L¦Ïð -iL´Ø]ÅZ +å õÕÇ« ½Y»tV~2‘J¢FÑœµ‰Š”àõnß¿À©¤þl›²Ãa䇥̂’à]Ù÷ùºæ¯¼'”þ‘OUùL£º|*k&ÐlÖ65“Ï÷{ÂÚv\Ú1Þ–¦Š:ïts+hð®êpÿ a”3ëc¸ÊJJa´Žì™¥ƒªy,Uo)©$ØÚ5íŽ&Û}_µMGSÕ–€pÊAåsMKÀÍÈ@{0áØh·/‹ê÷0ŒÜÞVŒ´XŒŠÅGW¡î—& -xŸö©<ªÍì‰ ¨æx -ø¨«®gð–~=^áË2ø†Æ/í‘EÞLpécØ€dÖö#åý "ÙÀñ6Ûö@ƒòs¾Û×åßñ4ß¾¥§¨©©ÅV¡HCðx@ffeÅ»¢m“0 ¾ßüƒHLt}5¥‘Y7(“ðQðq\Ê «šú¢c ÎfCXV-pÈ›‡’ÇÞ‰ÝÀ©Ë¼¾tÜ©{l5ãä5áäÔ£ƒÇü‰7£  Ù1À©ÛkÂߌxÜâ:¥câÇ®­J"Ü4Ùò¢¯Š’¾úÇŠ—€©–ù?ÐXñ·Á;ÇÁÚâ³ê" È;=Wý#vyóB£OG`Û1³.í cSú;èó3‘¯ší!ïúÃ2 ŽEî,…û*(,ú Õ‚A“ïJ†U ýéέÙÃEçEÙ¡‰¥*øØœ8ömA:nyΣ./Ö‹*¯g˜x.}þš²ÜXÕ@íÜ…­ÙZ6å¾n_œaZ‰¶ø˜7õ©¾e¡D_Ø´Úœ—äÏ9Ã<·æ¯º$F˜âˆKá, ¡ô_Œg2Æèx>žÁé3ˆh)ØûEZ´.Z<¤§¤Æ¼AG‘HS€^Ød¼]$‘P©LÚ(!Iê·žËÐ 0hEµŠ€o‹ñ,E‚û{ ÎÂ

Ãs?'¤s^¶Ê¤H"ˆ¯ -ÛǺ,ìëB¥w&ìDd²¶Wy°f˜˜ -[Š,…È3áâÝ X…Á¦zª6G›NÀ÷PãËQ¾aLò˜'_Û&h˜Œ×=C%n×*—"¨+x09(âé“ÊqX°¦Ôi•†"Jµ™fÓþ\ߨöCõ^íJJïOnª ¼)p@q:vÕ œÉl¹’!Ùo7› -Û -9ë×Dzè‰Aì‘åÅ#uçE8dAPQ,†UŋԜŠcˆrL' gËçsË®%”tŽv~™ÅÔg.mÏíò^"ˆZiš1Ó·õ.2ÔÐ.UÓ—f‹9¡ [¡¨Úí©¸zâ£ôƒ«î}Ût<¹Ø–\éŠ..’±CìÓù7egQRÚl›4ÙІˆAí0Yð+yH˜CÙz ·‘…£øpEÁ·ag³£!›3§ºÞôã‚GèNÀœiŽb±Û=¶‡~UûÙ>æ¢QÊáþ]GQæ1 “É(ñ‡*ßaP„œ7ÝsÉл;AƒÛ¶/Ý&y?£` DI%(y,JXóC†™7ïÐÀÉ(V˜Ú•X—WÝŽ¢ê°³ÓIב;n^O™.õF½ˆØ¸n)Q÷§}€!azwûÑuéCCýÎÕÿ±± (ãŒBˆoÈ*5žåùª£à–7­mÙ˜ú>8ÿˆ/“Þ§æTïQ€(¨½Wüþ=Ôaù¹(÷ýÉÒ»»®ìyÎ9¸Á¥ØpùåFרWjð!Ö碖•^—uû H;‘ëcOìVOLg¸#{jÒ!“v‹m]´°‡†ByÓ×/K)eÀÍÛÞ«â&0”¹}Uëüx3e"”w°ãOòTº¬¯äŽõ`†‹Ó¢ï8ßsåjÃßÇl´êsGGÓdhˆÇõ+WÛ±kseØ’dÚÜЦ¬Ë‡Üu—3×ìÃ)‹4sIõ‘õîzV!m'2Çû§Oëo¼îóŠQXo¥ÏÕɕ À»Ïé Ç–~MâOªIwà"É´3P™8¤ç1¾Éi|›WÉÕöÐîV—üŽ c‘Äʰ㡾àiX‹D"óMM;GFC.™ùîK=äð;8üÆúûXÙ¾¶•qbÌâx d+$c-¡¶2ËÙ'v»s°18¼Ä¤_t°Jdø -FhìQŒ¶…*ˆˆIé“\f0“§‹ü$ éü$¤j¬Œ€ MЉÿt­×¼Ïg•óCÃo3íú©jÝøÜ³ycÏÜôœ¤ -…‰#õ¢P¤ÂÈB*q–ˆ/QüKwõéX±["èîhc%ŽÚ1»Äßü Eö®’ñ­É‹mðe9ãg©Q+™(!Óñr\Ÿñˆ/F -’|#SIèÞÎbLM­3Šva@pk½µû„C#Î:þ¥;îö¬” ÅM‹doi ‡· À÷U1¾¹ôR6s[‰ÐFFá²-kLl‡­péÒš[nÞ[|­¹7zÙHÈì³ØL™ðêÍ^’DÄa¬^õ"RÄI¨_õ"Xó$ŽŠ ½á®1u- çáÙ·]W­‡žeËg^B :;µîã~ïR•ºÚU'F>è­>¹÷ÉÛaîYïúÅuæ¥Ay§±„æKË?¯X²]õçœ\S%B¥ÓA"t¨“tbÔåtÊKB(Ṵ́•‹¬Š¢/|惘ì3öâ?¿H7“ŒDSÆD°iÂd³Œfò¢Ÿ¤HÚqÇÉɯK .¿\Í>™ûYiª²ÿµÔ:'ù¹L\ü+^Šº*æèdBÃ9ÍÏBC>~Or&Q#3t™& &?ôÓ^œdJÏe]O!´[í\‡ØIë¢pÀYÖË@“ë¼LŠÌÈ“©Í›Pô‘ -~lŸñÿ¦Ä–ÉIlóIûŠ3˜i~¶Þ_;Å”mÐCâhïx\y ¿pµ-U‡š3GÀq -¦µ36odr5—·œ?G%£RÇe‘QAGýJs¦Á&vE¨¡'füý­pdµé‹¢,m ì–ùa§ã ö@—MÍ÷1ù™‘ŸxpÇnö ¨Òÿ -g¦ÏO_ýÇ>ã‹&$X*Ë¢ù†8Yg@„™Â+ÈÂó>ÿUÐ9ëÿ ù«_endstream +xÚ½š]oÛ8†ïó+„¹Y¨Y~ˆ¹{•6N׃´›z¯fæBµåF€-¹–læ×ï¡HJ´,“1 +,‚ÀùŠ/ŸÃOK&†?ñ¥’Ê(“ â˜ðh¹½ÁÑw(ûtCŒfjESWõaqóþže‘D2¥i´X;u „… Ñbõ{œ"Š&PŽ?~~¸ŸúÏãí$KâÅüóÃdJ9ŽïçÿšéÔ§ÇÛß~»}œL‰à$þøÏÛ/‹Ù£.JMæw:Gê •>Îîg³‡³ÉŸ‹_of‹ŽÅå%˜)7¿ÿ‰£`ÿzƒ“‚G/p‘’FÛ›„3ÄÆlÎææëÍ¿» +ÒöÖ±øuš)Kÿ@”¹D)£¬‹2Iœ(g +S °*å?0Ɇ¨ÔGÜêÎL­èÜ”RÇTĥ䧦”#’Q4˜ÞÞÝ=¢ÛÇ/IãÛ‹!O¢‚‡à•Þª‚ð>Ó~h:ïšÒô:xJ‘d"ï¨<ðV„÷™öðCÓqx×”f×ÁcX6$ Á;*¼Uá}¦=üÐtÞ5¥â*øTÀ˜$xWu¾S…སü™é(ü‰)•×Á§2#xGå·ª ¼Ï´‡šŽÃ»¦ _ŸHÄa» À;*¼Uá}¦=üÐtÞ5eä:xÐSÌBðŽÊoUAxŸi?4‡wMI +“^^AO(< À÷"»Ñ=Ž=ùÀqÜqÄo&æíÑPú‰Ñeb+ +û;â¡ã(±ëH`o{33Ø4°²;"³™=Ž=óÀqœÙq¤é|;7‡E1ô]Áy¸(Èíq칎ãÜŽ#EøªYÍ™DIš…¹£ò[UÝgÚ³MÇá]S‚1Ⱘ÷µ7€‚žg¹£òÀª‚ð™öšŽÀ5%„Á€5þíü˜¢,c!~Gåá·ª ¿Ï´çšŽó»¦”säþ¿5 +‰HPBÓ@\Õå(tªP¼¦]ÎLG£pbŠÑÏýÍ¿¤áˆ¥)™ˆ9*OĬ*1Ÿi±¡éxÄ\SòÿˆX’¡ŒÑPÄ•'bVŒ˜Ï´ØÐt4gwM?\d¦4A§i4%‚ež¬Ì¶»ÃëdJ ÿª«¢QÉ$Î÷"âBç7ÅáÛ˜«ü %‡'“ñ\/:µ)ž‹© Z鼺ژêóÝN'áÞº¿µ1ºµ.ZnòÆdÍNÜ•ò_iE1ÒbÞµX‘b@$HróÀØ4ñ¸¬žŠ}yhkbi¼nï©·º°ÞʺjtQ¹Ö™@Ù…²û¸@YUëÌUß<ȵ̓Û<ÈmvŲücj½Û0jaÂÈLa/TÿŸú¹ØïËÕ€Qw£®†c‡.6es0Ùkýé´®Ú¾Óé×ú¨˼:Ñê‹Î@Ǭ>ô5èT~ j†26ëz¯ÅóínSü]Ѽ¿OÈétÊL†ÃTw¢iÌ´ ïTۦǿ _þ¡«8™Ó±:æ*25¨ÒíN¸8NHÜ”Õw}¥1”fµÒªvXBÆ>¯¾&½T}Ò–®t†.ïT÷e½SóT7F“o´&_©q"yü”?3]u6&Ã!ëuÒ¾‘±î´VÝÇx¢Û Ǧ€Q•RÏ+³ÛçËC¹,ôÕá©4·ÀT-ò½¹P“U}VªÏUâ[«7CWe,óƤ^ÊÓNmóêU§~¡Ù¶1ߊ–@+V…ëÀÏ™ôØ.«õ>oû‰ˆËÃ±ë³ ú«Ø«`é =´ QåÛÂä••þ„ª{Ï::_šb‹¿Ö:_·Ø½i ѱ·ç&ÕäË};‘—e¾iÄKᶯ*ŠU;4TõX‡}3³eUì6õ«˜í©æâS^UíšêÎ,ÑW3µêÜÜ’¿ä&ÏYÖÜ».…Š º´GÁÏXò¦—¶„ÂvÄ“ñ—¶@/Ô¥_}Œ×¥ïÃP—IÚ;N«ê7g‚! Rž¹>Í2D³ÔyÓDÆ~/cDªôÁB¯„Ãø@(IÕ«í¾Ö3ëNtîíÎ\B JõjÛ1ÿªŽ‡kµa2¿´›J™Ö´iµ©™òvü¨”Þ§uZõ¶úÔ»2$ôçR»ŠÊùúùÖ-ZÖí§)lwO•0£Z%ÛÓ‡ú 8<µß"˜DÖµÓÉ[uÇÀÒ=ï»n#ª[’ªÿoæͧRf~@ÊnŽprY¡Ë_àú…ÏH—ànøé9O?2ÄÄ¥ßlÀ,C‰€JL£ÚÇø¬å°ÑÀžŽ4ýU„oendstream endobj -1796 0 obj << -/Type /Page -/Contents 1797 0 R -/Resources 1795 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1787 0 R ->> endobj -1798 0 obj << -/D [1796 0 R /XYZ 56.6929 794.5015 null] ->> endobj -534 0 obj << -/D [1796 0 R /XYZ 56.6929 349.7668 null] ->> endobj -1271 0 obj << -/D [1796 0 R /XYZ 56.6929 323.7864 null] ->> endobj 1795 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F62 1352 0 R /F21 930 0 R >> -/XObject << /Im2 1341 0 R >> +/Type /Page +/Contents 1796 0 R +/Resources 1794 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1784 0 R +>> endobj +1797 0 obj << +/D [1795 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1794 0 obj << +/Font << /F37 1018 0 R /F14 956 0 R /F22 953 0 R /F41 1208 0 R /F62 1351 0 R /F21 930 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj +1800 0 obj << +/Length 3381 +/Filter /FlateDecode +>> +stream +xÚ­ZKsÛF¾ëWð¶TUˆ'€9*Žœ(•ØYY©’ ±  H¦}º§gðHykת2=¯ž~~= _1øã«XLµŠŒ +4ãz•î¯Øê ú¾¿ânÌÆÚŒG}ûpõÏ÷2Z™À„"\=lGkÅ‹c¾zÈ~_¿ûáæ—‡ÛûëÐlײõ·w¾#Š¡Ç»Þß}ÿëýÍu¤Öw?ùþöýíýí‡w·×kó…[áÌ„÷w?ÝRëûû›Ÿ¾¹¿þóáǫۇþ,ãór&ñ ]ýþ'[epì¯X M¬W/ðÂnŒXí¯”–VRzJyõéê_ý‚£^;uI~JÇ*\m`°dB-K™LƒÔ6‘â¸ï¥,ø’”ý(”r¾?´§MZWm’¶ó3se!`åñ¯¶ïG-ì/Fûs­Áæ |:äi±=ìcµ~Ù%-¶ôÚsdÉU²Ï‰üR”%Ñ’Ã!OŽÔ.*êmw9Ž×<^çmw¬òŒº>}¼w¥µ}ºÎmí²Ò æ—ºÊ°ÅÕún‹’uÀB æÌy`´ö $Ë)z6x¤?yö Q€±ŠZ¡ü^Ýy õèéš< ^ŸÓpk]6ƒñ¨ófÐÌÀžy“WÉc™¿²…( Sê2ý¨&&¶ó Ž¡wÂÅ-ílå`UϬhbâ¥åM¯(É!<8Z–o“®lé;zBÚwkØÝ.;ŒFoøÜxÔaûQxLw¤Í ô×ÂÖP,¼ÌC?j‰©°8(7S.¾ë+9xPV<Y—”ôîå Í^¾L‘|6’¯ÔÞ€>ÈÑ™+×;ëR¬ëC{ [Ö½¦IEsr³Ø´™ºÙÈ©H}{` 8xËh‹=r ógØ€¿‚¤ +"RÀÕ0ð0à1䯨ú&ËŠ8Jœ}}ÊÓ–Ä“¤»¢zr‹%Ë`y„QH"}Àø#•^'£å¤RëÆ/‡),—ƒèdƒA75 IÁ¶áh¯ÀcH8"†©RÔRdÖõƒkŸÆbÐ:L¼þ"$ô¡ìÀDOƒ‚"r¹c]C1 ˜Æòª¥J3ÐÈœTÍKî¨÷÷5>Ômî7IÚ“ïÀAô[&!ÁÈÝ0ë~Ȱãmthàd+tíót—TE³'½Jqé%A™Û*SO0™ ¸I•M3bU·Ô #*“Ö{±'Åhj|÷á5†0¥æÇçÜe„mWY ½z ªIILY‚fÏ›Ž-guÞÙrgûáÐO9µÉî¡1³{4 X Ôêßÿ`šåŸÓüÐΦÞß7yë6q€#?ÎpzKº›ÚÄ®dClÌE+ˉü˜—õ pÀmG´~ìZêpauæÒØC²–s—F +¹´÷X˜Ü ‡=U6òŠmyºæœ¯mL×ë;·Evˆɱ-Ò®LŽ0náLùwÜâIžsùr‡ÞœÍð_ãÀ^ã(•{ïZðÑ¢Mü:z°èîñ\B}_(AÅŠÊÒv‰[{"R–—ùS‚Bv]/E»£.;hr 2·§²sv ºž$ùÎÚžôO¯6Þ"ù±M +7ÄÙ ²ô¹Øw{z™¨ #}îɸ%’›3É?‘&ÛE’#hï`2ŠaoÛùOóÛø´Ã²›í±ÞoÎÅÎT*ésœu!­‰ äÆÇ¦ª^ZFZÇãð%îüŸÙx¯;4ÉÇx1ÂÈ´;Ò`+$c=¡´2K\L€Ñõv)À*x¡‰Þ °2ˆ±¤a.¢m# +U C&ô Ëô † ® ¤É „4cRTÖ + ñóñÓѲ¤M£åGn!˜ásQw ½ pËžÁÙ“'ß½$$.Y`”_‘…Ô®ã,K:O„Vឤ«¿ºÂ…%¢î;›+±UèS¼Ÿ¨‡üÝ.êå6x³œeîp½,6<”æÊyØu ¢'FèÐ WêW¹º¦ÞöiEû´$ÐZký>t©{=ÿH„„Òt€¸É(CÊ›v=¼]£?¼±¯ÄøÍ"Béµ0ÑVhÃÅW(+ÔÜ` ¤ØeÈ\¶V‚Gøôöx¢Þóᄲ•™21ª7g¼„a ˜’£‡‚†é‹Q„Ðò«ä 6qE„-´8)‡ºi +ª‹àÍžüÍÀ²T…æ–2ôJK>oœd›âË’\# E©Žz‰ÐY NÒ¡‘Óìu³ B(Û zœ¥Ï¬’²/¼ï‹ŠüSò?uÑJ="Ñ„˜ˆ6Le¸}{ü2…HÚsçÀÉo×B~»Û,%îºk 4ˆ"]©÷¥Öë…ŸóÐç¿ô”–Eº´ÞîIå†3à9ÃLH²f‚ +LИ$|6†½ØéVzÉËrJ¡ùœõuˆí´! +eú5]‡—7XIOÃâ&½ëê—Ñ@[„³Ü66$=6$èA¤ùÙFí †Ì¬A÷ÀÑêx˜ylÚaÍÜU‡Ú!Gã Lû[¿ñ&Èäf1¤zÎ͇£‘Q©ãQ‡0rÝÐe¥yeÁFù"Ô( +¡ðü­°e­×ïÒ4Ïm ì§ÓNã6&ÚݸdeÞ4nÓí„Õ‡cßû&Ê;aʦ>¢%¾¶YCMÙƒ2¼TÓ ‹N\òˆjŽ‰Ùš3PûteFÔG7‹"‹”r½›˜R<¼ãT¾â$§IlZÍ#oÎSkÃ÷ÁpÔéàìØŸe¢kÌ«¥5y`¿ò-{]T ½%ôhö yT´®ºý#9;4Ã‚Þ ÇÑyUDÌ“ê»vÒän$šò×l +-s¿‹«þÆ‹¿ì +@ –Œ{Íãܵ<†™îÃÐÍ[º[„“~Ém]BUگ篇k»ý>ñ9ÐçÅúà ¯3× ‰Â5ã2úïÂõÙû^÷ŽZðË÷½ãQçï{ûQ‹8gú% ÌÅíûQ ûOK&‰ø-ž2p·äõ&à¡ö á +_€N +¾òÜÛUÊäÒÆ«½¿h·©¦7w‰L/ÏI_IÍ’®CÈ9\™·‘žzSÏì!„c]ÖóhÔ=ûQ#=§e ¹zÚØ"öJåàÀv‘“~Ô+ëf,UOy!) 3Ü‹ˆþTøBfOWB8ªMèSÀP7*åca3Ž€ü¡#£ºÞt÷§ðüéþWš<“”Ov{*R6†­f ÃüiQÝAÌÔô‚sY°¯l@±à~&d–®µŸ/„qiJ@>Lò5S †ŒÞ§sî¶ÔK°ÓGM†b +MѾè/ê pžåyu•&¨œœ}øöW§ig³ÝY›å`p ³‹6;uÞfûQgª…‰©ê8`‘~ƒ~Ôå@ÁÍt8cÀ“£k/xIöugïm M U53´)ÓUžZJž’îÔàÙ5nA‡“¥Çɲ÷õ?Ü,:=~é û á§XÝADåœÍ>úzî>RSöfZE5–jTÎy0‡ï=Æ-\Ë–‹ßíçWß=~„–µ/jŽîEp«§'¨Ê“[¤ö{%íÀÛB]ÔW¬Ü…oá1_ãwž¹@®ìÍ&’z | +q +ÔñW:¾~.òN`Œ; o™eArÁÉ A¸O|˜8HU8`ûê¾™>´`~¯X_LB>ó¨é¤èoNxøóR؉#ÅbÌ¿CâÏxÈÎ|ˆ4îCä»þƒþ(¥([‚eo~z¤Ës„·†þŽ¸È¬{ðØ£c‘EIU gøÄ⩤k*œ×9o¯±1©Aˆ4ºsƾÏý§Åñ<2 7ÃYúsÒüh¯¿—J®ÓÁB’ƒE‘w°ˆ?>É¢høŽ…ã[€ØÐïKèëEé>^ØO„’ÊÆ(ô×Zþòßt;Ù/{Þ•hâøÇ“Ûìþ!þ¦Ó—¸YÅvÆ,ôÓÀÅ› qFЉõÝ/ÏŠZvG¢„ÔñgE$€éÖâ™÷/h> endobj 1801 0 obj << -/Length 3598 -/Filter /FlateDecode ->> -stream -xÚ­Z[wÛ6~÷¯ÐÙ—ÊçD@€ Øì席Óu7I»Ž»ûÐö)›ŠTEʲ»gÿûÎ` -”(;mb?àB\ƒ¹|3˜pø3.S5IRÅb.âÉbuÆ'·ðíÛ3áÆÌü Y8ê«›³—¯e2IYª#=¹YkÆ“›ü§é׿øáæòú|Å|ªÙù,Ö|úÕÕ»o¨'¥âëïß½¾úöÇë‹óDMo®¾GÝ×—¯/¯/ß}}y>&0?r+œ˜ðúêÍ%Õ¾½¾xûöâúü—›ïÎ.oú³„ç\âA~=ûé>ÉáØßq&SOvÐàL¤i4Y©X²XIé{ª³÷gÿì ¾Ú©cü‹¥a±‰’FbŒqÊ´Œ¤eàfÓݬÙäÅS¢`Š2L(c`‹Ìáéôæ®8ŸI¡§Åò\˜é²XtØN¦Í’ú»»²¥žö®ÙV9õÎݬUY7äë hK9½kvÅ}ö´e½(h¬¦I××@&UËš>užŒ,ÏË®lꬢv AÓz\Ïð`“™?ËL–ÆqdT.²ªz„¡ȯ}mÑÔ]VÖ-µ2*Ú ¥j½]Íbšµ¤(¤ÊÏ<æYSà å*«ýÚY[¸‘e÷q—õmUø]`yñb¸øî®\ÜÙCòáép/’WË,¬ëáÎà¶aQêɤkuÓQe•užÏÖ·‹;Ö/nXÂc¿ñK.›ªjvýz¥[-£¢Ý®VÙæÑí¾tåoÈ ´UÖ¹#¶q¢Jo$ÆX’Ål‘-€€c‘Rf’d/²‡ÊÁxh£™ŒÅ¸ArcfÁ Óêäí©šu6¯ŠÃ­Aú˜NxüäÞý ãÍÃS -° :f°ûÕr„o):ÖŽpÕÇ,Š¥Jz–½p×h•½G¯UØÀc]8:g¨x|/y±Ì¶•“¬û¬Úý´‘[Ö‚¡RGKÝŒ‘+ÔÔ³7ÇLƒ¾?}ÃûAOܰÜð¢*²80+kÐ8ÕÑe§1¨ŠÔO’Ñ:¦c ÒœÃG`JHñ7Jáb6÷VY¡¾+ÑDa”jÕÜûQ]†6$’ty®·¨»MY´xå`wç`.rú`/ÊÌ•o®¤ÉÁ˜¬ºm6ew·zA6å,‘&š 4í£Í Wñ@›Ç¹ztû3‘ð3Á›l»¢¡‹Rçš"ð{¡`:5§öpÎÕ’¾ZƒŸÁüØŽl‰ -¡m¯Áh6y¹ QžV:») -¥?;飻 ´w‹ÅÖz¸ÓÒÊBégÄ5õ„¼úQ–AÙÃ̱·-;6J1 ©$~†€~ÔƒËÑ(Õ$`ài)WÛ5²U³­;ª“… ±›Gª“w©|ìÈaJ{3Xn[·à²Ù¸/~ ¯ Àë/Ü,:=ܶÒéôßwE½ŸbïL©\ åÖSÅÊy-5ͳ.£ZYSéܪòîÈÖIõ°ÝúQ¥«Uåªì¬÷s{†ºEòEÕ9m¿Õí-5Û¶¼/ªG·Hã÷ʺ=mL@BiIÀÂîÈû}1-E‘;®¦W5ugTì錀ÎîŽzW fåÚÚhÝ—ÅΚã(Â-³õº*‰/¸à:Û€Û§3D¤xÐßOÜs5ÂKA8ÈfçY`çó4š>é~¼ÏQb`Q“‘ˆœEúí˜ÙIX*£¬8Ð>Pýšƒ`ÖOíP *„lAçZÄ+jGÏë²êŠï'#ÉÉÚSHƒ€6¥bme ¹/s«Pwx`㼬ÊîÑá߆ʟ9* êpl³uý›wï©âDj ¨¬pà}I[¬hJñ³Ææ‘P¸¾Zd€sÅÛc¸ÜŠA¢I½’Ä«WBK„ÀvgE/éá=Þ³I§ï×Å¢ÄÇ»´ÆH‹®qü"s«Ñÿcûhž{E¢ˆÜ/Mn³ øCÄM3høÂah7«\ ßiàlLÿÅ9a'M¯~¸WT³;R¦Z@Ÿet0·òνvAå¬@="Öà²ÀGJájxÒû/˜RB¤™¤i&éÇĬK F…cë¬_q.i}Å€>©4‹#‘îw&wÕQ,3 2ìÏý‰ô+>G$|MSph"«²íÆB˜¥‘ôÈÄŠµ»¨Qü>ÒÛœ¼¨gNÈáÆgî²FÑ:08aʈd¨PR¡—#s…"n¸“}–´²Âð¡@ûëwo/©jEÊoö]ÇVâ*¡ò3À¤¬*³+ÔUg«‚¶F­*YÁ¬Z&ûIÁÆvnHƒ8ö^tÊv;o»²ÛR¬¨ùô×maƒKÝo©Å4·1†æäQ´;‘ÓcÍIȬNi -˜uR‘t X5õ‘'nsBbΔ"·Áˆ$,‰Óô” GF¯?U é~>»!!4O÷é 26(˜,ˆÍtwWx!¥¶WfÙ@W†]+-UÉ—@ÅÝ V‰½Rž¶©€;É›Ufñš$sn˺;’=†Œˆ¹‘wÕ_IPÖ8N& -L‹6‘údõïWœ…K«¿R€¼ÀØ~ØS꟰(N½úU±?ßÚŒ¢±QFÀÐb1ˆbGµØ>CF¥pñF”¦*ñtP*¢w”ENÂËeFLõÂŽˆpÝÍ–€#;)É^mönÄdØÍî‹Ù…ô‹½N¤ Ök$6’QÄhG¬Í½Áô¹ã_Á1cqnf ¤×9Rn3"¥"G¯"ÒLå¢ìØ£#lA$؇F„ÁÍôMù¡Ø•mñ‚攇s½ñ‚ª³@P³ÐFenŽŠì÷÷>†õ¡G#Èá7Ð($B«&EEàxûÄÈï3)QŸ2 xFÑ$ÚG š0üã+¬'€á×â![Aàè+Ð’ÚÁ–]ðÍŒsñ@ÁÍÊù -í˜c"Špõ1  Ú çŒ†Wÿ;Î šrÛ‹í±®Íü—ñ$·¿Ûí˜;'äCóÞaõááa8`Õ‡ITºõn»©}òsîR¥™KµõŒpÍ&ä|8ƃLÃÜ…=^R·tØ©ø„E;ftŸ<E3©ÔD‚YJ¤Ÿl’ý‚³pÅc‹Œ™‰X?ì$jÆ ÅŒ?#~ÅçˆL †D‰<å60«4„Ws”Žå@‚p³:éqƒƒ‘Òôþp,p!&I”õõ¦X–#G(÷f-shÐ!âyâZQs¹­^y“3&‰b€S½|(ô,1LèTZ(—˜èÓ£³~ÅY¸äˆžÁÀ DûíæãoJÅþŽíe[V€Ö*g|ËÛÚåÜœÆqMuà,ª36C†E˜D¡žècvëŠõÃ0³X̸€+6]ãÂ[ñÞ. -´Uõè>½eéOí•—íÂá¿?JAc^¡ ÿv€,÷Au>xÔ{y}ÇӽƜöÅÕ÷D ¦9锎½¥ü‚÷ÉEU¹N<8ÚCéS¨ƒ>’ÀÜT;fBI¹2Ä$›N”2XÚƒÄyé²2ø=ëºlñ¡}áb#Ü ¦’žZí¼¬ï°MÚ>‡ž$˜<ÆrŒtºÄvJoÀpy>À‚.‡š¹Oùá¨`•#Ãv`&Ž.£Ât¬ŒdÀü–fgn½«\;̇áÚÔL›í†jÍÎÓQt»fóÁõzzë1èê1rì1?&ÀýòØKËc¯]ÞfÛí‘„G c~ryïgsê›Ó9w­Ï¡7n¥v±)×.¾ ß!¸¼{$Þ©ÓSG¨+žnë^”F.Ê%_öùFÐËlÿ -ÎýË÷âa[VÞ¡¼µM\YœfÃ’à£%‚++Í”rÅÞºÉÝ’”Yê™=U³è‡ù[±+Òkw ¨¿è¨îV²I]‹ÆŽYÓo#DÊ™¨XØjàtŒ‰ì˜ƒ¢ öÔXYgk<²zŸ••}§fGå]×­¿|ùrÝlº¬bÙbÅÈâÞ¾\”]fsY‹åêoeþ!E ˆÙ25dÜ…8Õ´ýùÐCšOðC˜ êGo\ôõÃÄ×þqüîå'ΙÖ ö?Z©øë( -ƒ€¹÷¥Ko)Ã|±è€cþWskª6Ò™'ï™t¥bè˜^Û¥eÆe–.©$‡*¤mŠ ;´û(U’É©! `.QÞ1ЊnÇ@je`$pô–ÙÒ½+ËÔç¿á›3ÒhÚÆ„Q“{Œ¿Œ”óJt -ä_y{ç˜dcÈåãÇ~¢²97ÓmU´_ŽÀ§`ì_Ûhï¿T„„½¢®ÿQ&O -Xù'?åÕØ¡»»xöãV:;%gZ˶X]¬©Ü¿í†z‹…­ªèZ×O…5¼X^ì(Ýr$ v2Ù%¬ö‚@ý«m×CRH lO莬ÕqTÛlsàtÙAxübô½i¨<Á1vZ0pT{Ÿ— úwì©Êý/®Ê§å‹Õ“3’X¸Ê—x>›`µŠÂŠ7“ƒw3mÌô½û]8š`¢}…“î]޾[xÕ¿ ùÔõaz¿_nÏ=Ê»Ë$ ²|á¶ÃÌ$tüSàŸØÇîä‡Âû±Ÿpʘáï.G~ Á'ž˜Oþyçþ·¯*aÒ˜hüg’kÑMâ‰B&qHyÿ;ÐcÒÿbTü,endstream -endobj -1800 0 obj << -/Type /Page -/Contents 1801 0 R -/Resources 1799 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1787 0 R -/Annots [ 1804 0 R ] +/D [1799 0 R /XYZ 85.0394 794.5015 null] >> endobj -1804 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [91.7919 217.2504 93.7844 226.8901] -/Subtype/Link/A<> +534 0 obj << +/D [1799 0 R /XYZ 85.0394 637.344 null] >> endobj -1802 0 obj << -/D [1800 0 R /XYZ 85.0394 794.5015 null] +1271 0 obj << +/D [1799 0 R /XYZ 85.0394 611.827 null] >> endobj 538 0 obj << -/D [1800 0 R /XYZ 85.0394 548.0867 null] +/D [1799 0 R /XYZ 85.0394 133.1815 null] >> endobj -1803 0 obj << -/D [1800 0 R /XYZ 85.0394 519.5161 null] +1802 0 obj << +/D [1799 0 R /XYZ 85.0394 105.0145 null] >> endobj -1799 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F11 1442 0 R >> +1798 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1807 0 obj << -/Length 3771 -/Filter /FlateDecode ->> -stream -xÚ¥]sÛ6òÝ¿ÂôMÄ’øÕN”Äî¹s±]Ç»i{”DKS¤*RVœ_û”é¦3ÏàX,ö …çü…çQìÇ™ÊÎ“ÌøQFçËíYp¾†±ŸÎB™3³“fî¬÷gß]éä<ó³XÅç®ÔÒ4<Xýîžò/Cà}¸½¹ºþé×ûùEb¼‡ëÛ›‹™Šïêú_—Üûé~þéÓüþb¦Qè}øçüîáòž‡bÁñþúæ#C2nÞ@zyuyyóáòâ¿?Ÿ]>ôgqÏòçÙïÿ ÎWpìŸÏ_git~„À³LoÏL¤ýÈhm!ÕÙç³_z„Î(-ä_øJÇj‚JM10ÊüX+M ¼­áH*ñºMÁz{ìÆÞ&¯Wï «•W>žL[ì/ÂÔkŽ­\5ÍSËc‡·97U±.»r›w²´¬»b_ç¯; ¦gF–x(eŽÇãE¦<¿ø’owUá×E‡`A]¯‚@À‰YúY):ÖcSUͱ¬×,0"¶hwMÝ )[w¤;ìëbÅ®‘v#S_i…P -Û~weB‡ÃHDê›$Έ8K=(YÞœ›0S>ÈÍWŒg$©ÞÊ~qòaH€€URãDøè£î„Ž· %{QfÓ>è1o3kN‘Í{2÷ìÈ&{Wå`È0¡¡cA‡)ŽÄ§†ÚUË@8XéA¿Ì -/'D➟¸ÔÒ²í|š<–>¡¢'ù),ÔÆÏtªû‹bÿpÿ ý¾ÝîÀõÂýßšZ Qp÷4¡ÜûŠã¢œn2g‡Œ81AJûñ¥’d¼4h‘º^V‡jñ°Ørí'V嶤”Ç·Ånae»åOJã`ζÿÂ0N² ã^rZžGf2Œ-û¶Dw3€þ<m7™©´@†&p¯F|räýU “-gí.ßò'+LYTà”ª°¢*EÚ›W²âäc¶"|‡u_ï­ BFDú»b8YulÞº‘ÀÍ!úÉ^všÉ&¯E6ëWŒÁàgߨß(oå ‚u–ÛÆ&ôý¬uÕ,¬¿e|ö*òøöõÚºy}aííüÄQR=qGâ” œâþ"õ$ ¤&(êeC?(éâØÁ“]¡á€%G¿’±èScÁ¡^ˆÚZ«ÝC½–»öé&íxt_ö@ʰ{û4}ï'…\…oj… ‘D,ø¨Ð‚ d,.Á -±ß¢±/XÅ®ëéðûþ¾-:*qV.{/-ŸfÅòçÿ('éKÅ -­É$xQP’IA -Òö×"Û´2Ì«-g»}¹´#›†ÍO ¼Å ›ÜÃØao©ðY•O“æ4¦h *gˆQL-4n ó-s'ЯNa O¨Ñ?L hžFi$³Öo¡±ûü0UŠ€0Ðûˆf?yŸ&£cqiÂ(ã'IÝÅ[GV™ÄAúGNÀ6-ûl¢NÛ(_›P}ëØæ/Ž­|“¶Ãîa–Æ€6~å$z32Ç&¼ä–öW­–tŸ‡M‰:¼eaèn - &½_næŸ.Ç#{ #à™ÕÔŨ ëø–˜#©W“7ÓFìÔ^¼¬áÒY ý $~dHs`ÛTÏDa(4(ñÄØ‘ Î’ (n¾tt½ãèW¸>ÜS s]ã”·ÀAÕsºÂeþ û·Rv[Õ󺵲É(ù\~ew¥„mÎR¹Ï½‡Íháˆ]J˜£,ic9%ÐñÂŽsÃù»©´}ÿÞr»+–¥¾$ËVfpv6Û”û3•Ü$Àv/;qIÓÖþËdTÅŠ™ŠŒ£ËøåÜ ]ٗ뵘ՊA‹™wz}‘$Ú96Z®}ø ÿìV#&‹ 8Í‚aKÑ·pa˜‹Ú†1÷ S6ÆI™-Å»e°^ž8Œå2‰JöÚ_`à˸ öN%Ч‹rãBÆEw,èî >à Z ¾­¸»ðÄÄM)Sûxñdq–RUxÌŸ9"œžW¥öù:ˆ{O§JSv}Ýr.OœI­»j:«KSÉêÐABð0L·|LS.ÉsLvQ¶˜A0á‹Díø¶•¦¯Š‘l;KLH%ÔŪž•Ð=X¤Fz®œÂ/áà¦2‰ìÈúì±Zž"p 6þ²ë5vÅ RÈßA:È™6üa8"%1a²Iµ•:Û)¼/¸œÝò IÚýîë¬ÜñyhJ9Gfþ#žš‡éPø=b8 ,ªfù$g<ò\ìùTJ*ǰŒNíõÍl~‡™ûÜç.ãý÷ü7u46­Í‰¨ÒÛ ~„ÜÐy°£Õ àýßX¤¢ˆ;|chí0·×wÏF £zB£ôŸãWc=‚)OÃ*:\M‚¼¦lªŠ›þMWŸ¿÷?áá¢ó)–ÛûŸý¯_¥Ã3¥ÜzG'´Ú‚ÐV¨A÷;`Ÿg2÷`>P )¾Œ^£¬êƒɇ;^îÞ]Ez7<}ÿ½¼Ü½z×ÜÁ]ܾkŠ«”5x@[¶¢ð·rð èf¶Eë¬{û îóGÎ9ðIÀ1rz‰ê¨l“h›·ÑÛEÍ-'ö$R¸=8œäI -Û\^>„U5>´ÂÍe&ï*NEÖ E#²¹‚Ù”À¬ˆ8…#Þ‚¨[û6pÛÉ—&’9NP¢R®íRdÈü¤Ç¸ÀŒÒ䞙صNM*0¢˜éiYp`C=öúk`ëDÒjy¨ FU~XB ?Û™´8²F`¾éˆ3# Xf8Ë"yr^ ð…ÛA§23ºG-a2s¥ héf†o®Ô#?ô'Û /MÈÌ8(dÌœ‹BŸrPÀ•ÝT‰|~€‹6ä¸xpqÀ­’g¬mkHp°öЈ‰ âÜ|_öåb-†‚Æ(Wy—'°¦`yØ[cè·oe_9L—6$“e¹ Zæ‡é"y ì…·òøõUÇCÅÑ9¥‘h1öÄÅDV¨>OÿÜ0´ckʼnƒË‹½ü9/«œ4aL^‰ wÜpæÒ&³óÃ"|Y yÖëÅCÑФ'?µpt6+jÜmÆ6YÀë«tà{²ø¤†0B‹µ‘8²ò¬+ºhM VÊŒ²Õ‹QÝÐÆƒÞ™ Y N­åeipÛà´·½K¯ÊZ< È6õƒ0ÑcOsÅ÷úXJ{\m‹mõ*–êUŒó3|¸×™áD %NüpøÅÇÍ>Þ~š_ßL:Ž€"˨¾´H»ó+*ösnz4ôuR™Œ%Šé(ã[.<³W~˜ñÔc¼d›c³©LršŒ½$wEóù殥òa˜8ø´Y/ömQr¹ »C½¿‰J-¿0Á[N#ÃýO- µKŸ —ÅŸ õµÖ¶>tsûqŽYÎå“Suï~Áȶ¥2a#¡ÁŸ½ás†Qȧ8¿ùpûëÍáøFbãZÒyÅéâ;¥Æ€+ñzM<âJ&Œ–âiO³ÿ¬·^èåÜ|°á ÆN—͆¯˜ÚØ_üiAµZÚ ]³›UXUüÙsÞ¤Äùëgq¾¡ðJ…¾Jz‹¿¹ÝÞM°^'~Ÿ*;íX•üáÃÏZ(îI?Ñy“ŠÎó1ßø5¢Ž|ü áÄoƒs˸ÿû—ŠÃÏ8Mâë4UÓ?BT 8žQȈT½¢Üþ¤ñ5éÿö%îendstream -endobj -1806 0 obj << -/Type /Page -/Contents 1807 0 R -/Resources 1805 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1787 0 R ->> endobj -1808 0 obj << -/D [1806 0 R /XYZ 56.6929 794.5015 null] ->> endobj -542 0 obj << -/D [1806 0 R /XYZ 56.6929 511.0366 null] ->> endobj -1809 0 obj << -/D [1806 0 R /XYZ 56.6929 485.4552 null] ->> endobj 1805 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F14 956 0 R /F48 1228 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1812 0 obj << -/Length 2026 +/Length 3447 /Filter /FlateDecode >> stream -xÚµY[oÛ¸~÷¯0çÁ9X±"© Õ¾¬7MÚ,Ú¤ëø' -Ù¦m¡²¤•ä$Înÿû9¤,9jšlpàñ23œùæÂ‘L‡.üèPøÄå‘7 #ø.õ‡óÍÀ®`ïÝ€Ç9mª_§ƒW§<F$ -X0œ.[²q… Ãéâjtü~üiz29r˜ïŽräø;úõìü-®Dø8¾8?={÷ŸÉø(ôFÓ³‹s\žœœžLNÎOŽ*| -üÌHøÃéÙ‡½›Œ?~OŽ®§¿ N¦-m{©Ë•! ®®ÝáÌþmà x —Ð(bÃÍÀó9ñ=ÎíJ:¸üÞlíjÖ>ü|.ˆ/XØ c}ú 8ãÀm%`R꟟óŠü«ÄÙ:Oe¥–`*ÜQ’ár‘§É<‘Ζy‰ƒ4.¨­¤™Ÿ½àh–æó¯ -±ÔVØ}žYIY¼±ú¤q-ëµTˆƒ]´e”.ÄŠ«-*eUäY%­ãÎ0´p‡Rù>ÓŒyQ'yÀ©;š®%zúü¹ø„C#P“ -Ÿò®Ð&Ë -„¥™!‰Mð?š¨¹Mêug¯¶xÕ8ŸƒâIU'Ù -çùÒÐYmnâ2‰g©™qY?$ƒŠ®i·™Æ’3ðÏjŒªí\©Ãù(®pS9ZÞÅ›"•džoˆq<ì ‹)Î7VÁJy$F[­¬çå^e‚Pâ²°‘Å­,6Š3\8û„s#I¹Àõ´ zÛ£K#ãmD·ÇÇ ëEãBÁÑ…‚Ù€BY¤ †­ub2”QBÕu×Ñr/:ç¥ Àê1…Œ‹œ@ƒðy]þ±js¦¸€ƒ¾f¯_#¹sH¦å_;ÇEîý=8œ‘7LQÁÖ‘ï‰ùpA{ÐŽ ØçmÕªî]Cy[&س›Ü1ƒ¬º•¥!Ò=¯Ž0¾8”wsYÔÍr ߃ðÄmÚè¤0Žy$r zÚa èP<âç—o÷A®‹®vÁè‹ûªíÁ²¸w²jEŸŠ§D?\î÷÷ðZ®âÉð+KtD>`Öwes¼®%Àqʨ×{ƒŠ³J–7ÒÜ—M…Åwû2Þl Ãé-NÌ'aÀ1ú¬ AR|‰‹òêUQÊer—ÊìÚÞ :G ¨t®b–¯¶&Jv²ú’—_²§þë>d sQæ7Ð:Éݲ|†ŒŽ¥„J_Õ/’!Ù?¶Añ:ÛEáTɽ¹“²íff¡}Â雸îeê²uÙdë¹i·Y¾‰ëýí‚#(Dœÿe•ÎvN§H蛦sèc:•»ªÓTuÙT!#àêû;„k£ßž“SåÛr.÷–&…§ÀZ¨o‰0"œ©BªK³wX²ýak}oûU‘—u“UjrÝ£Ÿúd]68âQ žÎMÐV5x¨jh[Ÿv‰>[U¯fÐ'G½Â;V²Ü= Ðý5Ú hð2@Cõ>òc æÞ3ÿ5# -ïà,ìõ»nY;Xš ¥£~[í¦¦)Ûmí[½Ña(XdzcÁªçEÄãQЋãÞÂŽ -ûe ô8~èõhmîEðú0ì"͡׫J©Æ£Ï‹GêC·÷lMûÁ¢/ëéþjƒÕ÷ŸûD}yïùäî6’_üÿ-ëÿvÏÝ€…V)ÝòCÍ›ªþ7öNl¤endstream +xÚ­ksã¶ñ»…&_BÏœx$Àg®q.öÕiâ¤wn¿$ù@IÅš"‘²ìvúß»/P DÝ]›ŒÇ`,vûNø 'qâ'¹Ê'iùqÆ“ùú"˜<ÀÜ»‹PÖLí¢©»êëû‹×7:ä~ž¨dr¿tpe~eáä~ñ“—øÊ¿ ÷ö‡»›Ûwu™FÞýíw—SÞÍíw×Ü{÷þêûï¯Þ_NÃ,½·¹úñþú=O%‚ãëÛ»o’sséûë›ë÷×wo¯/¹ÿöâú¾çÅå7 42òëÅO¿“°ýíEàë<‹'{~˜çj²¾ˆbíÇ‘ÖR]|¸ø[Й¥­£ò _éDP©1ƹŸh¥I€Í¦+›ø‚À»í€¿,ðæEÐ+ª¶aÐö2Ì<óO3—%o﮾¿æn³åö›ˆWÏj-Ë%·ÝÊpçg¥¢¢*‹; ª‹µá£â ôÿ +‡éa“s0íuiiÜ f†~ÇŠ¸lw³¶+»]g°nú×Ù¾pWŽLBo±3 ên‰# $äáºèæ+ÓÊš•ìz(ŸL‡¾¾‰BGÜ*‰ý,ÈS IÀcª²íxåðb? +u( ›åá^;Àšúi"+¦~™u»7$ç)Éè;=ô" “þ„Í”„4tæƒ9åCa¡B€Ôuœyû£VµNèÂH|aZ €»$ìȽ`—…«uê•)¸Y4뢬yˆLS[¤0­1ÄA¦Ù›boA®'©ŽýT…ùç£òó,ËÆMqÚcœº(ÉÎÄE Ì$Õ/CÏÜ=0¢â<FLeÖ¦îZòG™w;Âdª3å«$J‡Æ6\Tc‚Êáâ³ä³t0RK]VyíÆÌËŸƒ@¡Ý `_v«­LcØÝ«ºyž›M7]n›õØIz+«‹¨hzÄaÐa«¦EuµµW„ŠJA¯·G°öA‡b«Š·ÏD~J›qØ+<‘bŽô’kˆ”òP0)•i[†“]FZ (—ª3[µ¦ëÊúnN™÷]ùhöek^ñžòx¯u]Ðÿ½²åU…`<˜Èá|eqh¤Å´¶›¦^ÀÙcžï_`QHDq(‘òcDÿ—KQi&ûY€KdÁ«˜k:›Mõòû©·$o ³æ¹Xo*KŸA?J‹I\0n†Ö\†^eüy³–H‘ˆ°`í@Eq±Ÿ²9 uêŸj(žÿ_°<ÐÛ^mOmmj—LUèÇ­Ûï÷¾p‰äƒv$Aðûüü<\pzr ÖV¾ón·­‰cHGf/ÜRÔŽƒƒØ2ƒ‰ÖlŸèŽ /w„Ûl3ð­¹§Þ’Ægü1x±,ÑVŠÅb‹fsä‘C•øy>&QÚÇhô[rpê`<õÇ¡‚>ן‹4’ï8¡0Hœªß@Á÷ úíGI è;._Çqì¦ + +Qz~Ʋù’Fu=„HIÚç ’¨#tõ2¢1$;ijÝH¹9­¡ óþÝdÛ#ü¸pu6Â\á"ïŸnQ/Fø s_‡av–Ï©ßQÉ{„ç3Š3H"“!Ÿ›­Y–Ï#œBÞ§ÃÀ:³Br<Î £Àtý$¦ya–»êõ5cZBý‘÷ÙÌ£y9±°EHØUÿö¬¬Ç8uQŽXY¬  +ÓÃÉt‹1õüä)\œ:ʶ¬ I«Äë–5§-Ös‚à?N¢äȃb2‡57‡ÐM9@Ö`ŽÅƒ (ë—aÝE)X&U +v°JÑRóPÇa¸(0Ö¨OŠ` +è-ûLþÜY‹²KÚcÃ|¯Ùu<˜™3IƼ€Ò†ž$Ø<&p›C¦IÉ”rÒ+÷U€$U(+®ê:H¦˜ Ì›ºã«¨Z$JiGô-ï.ßí2FÿI·˜Ž×azFµˆ3IDÀ’°Å + u³”” ½ÐR5ó~™½¸*ä@ýeÇð™`2Ï$c·G£; ó@ÈDÃÂQÜm±‚ÛQ0þ` OרÙd™¶>eUÌ*™A‚°]uÝæ«×¯7Ͷ+*¿˜¯}ö·¯çeWÐóÕ|¹þs¹øc¨ÁËG±Omž±kÃa.íÒý‡ãø” ë‡ å „PhÓƒÏ>NlﯧpvãÔÝIQhpþ ~¤âO£)Tɹͧ–ÖO®ëÅq´0H¬w;#G=ðâžl\J1ªaXº!Ô:w‹1¬E— Íá[[ÄnÆ}iªÙÏ,¸ëÖ `R{D6,0F9ÑÑZí8 \½kéMç¬â}Ï“`'®ýyÌæB¨Ã@z~ðZE“˜ ”_ù°!Qá¸|9’ز9'E¡ÌÛU¦ýj$Ù9ªœÛI®©Èû77.aoônÜwÇŽ(¿°[ÞŒYààt)b?Óiµ©µkÁ‹Y cÍ-ùº36Që²pT™®87äy±3ð¼(+mfÇ„Ý^ÞHo·’ÂA7‘Ûªé…Ù‰ºþQYüjL”GÖƒ$ÃÖ/ÅÌ(8)¦mÐpó–A4 ð©ÊGc•¯ü³äŒ<(\ ,üÈ+§½˜Sûd ) ©ßB²Éß’,ó>”õÜ­æ±è +Ò[-ÍSveôÏy Ãýß 7åÙûƒÔ¤mùÁ]§©óÀçž>|”Ày‡ Î9&uübNsÑ“ÿèf~À»Vö#t(ìa7ñVàøðP->Õ]6LH`1*{Ës¨íØÜTæ¡ìJˆlu|'ìãÀ½RB|¿ß_æê ÷—Œ¨É%«ôÜW“_x,©¡ ?š«Ÿ|ZJÏkýÉûÐ>®îêÓf%:}Hmån•æ»…ÖyüU +J;Òvœ[ÒùX¤Ú¦¤Ðû„pµó±Hp>Ðhû*íŸÍ>ñlžøQœ$èX*ëƒîÔ~%ýTÑð6 +GJ¦»¦ë½e‚Qî ¿LçòœÛß8g}8aŸÙGq¿©-ãºN€l¬ß¤¼P‡¸ÏÆ0õS)Þ# >óBVŽz6š$F%>%å÷CpÅ[¦•´œ C¯©ò+oWËV€q‘†zÑ3 ƒ'þ¡ôÚ ïW¯Š'ÕrœÍ¾ ;_5åܪ¥;©rõû‡ÇÙ{QÙÈ$ãÎ֌۾̴ȹ÷‘hûöÀb Œ­lùJÊ JUl»r¾Õæwf"ø›š»”HÆVÐÙäJb9´»VÙ Êgî É¡§Œ¬;¼¶…^¨RH±àïuæóGuðíh¶xŒ)Šœ‹„A3{*›]ËÃiø|ÅŸ²fô†að­eå‘ EèÝk|¢%íµøø(;âÜ#âOé±Í<"'ÀÀ ºc¿jøñ1ïŸ!s‘mn­)¶iOîòîóïWnʃÃyšÉmù˜üD*æÇXÈúmöòòa>AD@îå‰[--3QÎÇ1dIÑб߱éØÇŸüê þEZ¿ù7n‡F©¯ñjôçk*Íü($B²“©ÊíáNIÿ/ÓÉ~¿endstream endobj -1811 0 obj << +1804 0 obj << /Type /Page -/Contents 1812 0 R -/Resources 1810 0 R +/Contents 1805 0 R +/Resources 1803 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1787 0 R +/Parent 1784 0 R +/Annots [ 1807 0 R ] >> endobj -1813 0 obj << -/D [1811 0 R /XYZ 85.0394 794.5015 null] +1807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [63.4454 494.9289 65.4379 504.5687] +/Subtype/Link/A<> >> endobj -546 0 obj << -/D [1811 0 R /XYZ 85.0394 314.8075 null] +1806 0 obj << +/D [1804 0 R /XYZ 56.6929 794.5015 null] >> endobj -1814 0 obj << -/D [1811 0 R /XYZ 85.0394 286.8362 null] +1803 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F11 1441 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1810 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1817 0 obj << -/Length 3838 +/Length 3521 /Filter /FlateDecode >> stream -xÚ¥:Ûr㸱ïþ -?ÒU#‚jŸ&»3§’Ùœo.µÙJÑ%3#‘ŠHÙãTO7ºÁ›é±')=hF£ï ¼ð“—&Os¯ü¥õYj„4—ëÃ…¸ÜÁØ’ç¬â¤ÕxÖoo.~ó^ÛKŸú\å—7Û.— -çäåÍæ—$OUzDòýOÞ_ÿøóÇ·W6Kn®úpµRF$ï¯ÿðŽZ?~|ûÇ?¾ýxµ’ÎÈäûß½ýÓÍ»4”3Žß^ø žþžAúñÝûwß}øþÝÕ¯7¿¿xwÓŸe|^)4ä_¿ü*.7pìß_ˆT{g. #R齺<\dF§&Ó:BöŸ.þ¯G8 Kù'Eªt®˜ÉHs¨¬ñi®• üåj• ‘œÛrõ¯syz<6§nulš=ÁËöÍéuóõÅö+)SoŒ㘮_a«¥‘ú|¸-Oߎâ|Ü]YÕ]yº/öÏâZ)z)²ˆ’Dãÿ¿ÃÁß¼Wò²ßi‹û‘z¯³^~¤™€­…mÊ]ñ§v>”uGÝÊ¿ ¡êª«šš E½¡ÆÏm±+y+5b7ì¤@òœNxsWöô “¤Ks'r˜Œs˜€§¸ܘáài#Ú„L6D[ÙRw}WœŠ5°¬j»jÍÀ®¡ÿÛ’þ‹¶mÖ ÙPÿ¡êîx„þNWÒ%å¡é•ÔÅ—2‘  5Êëäz;Yy¤¥HÓZ»/¯dRï`‡p[™Kµñn*ªû±\W¸¶Ü¼AˆIº»Y®UئœŠzWR³Ùòª@SKÓ"ªuƒt"- T‹,ù©Þ?Ò ¥Æ¡i»ÙÎkBÓK¢Ú !Ô.ŽÇ}Uò„W„ÿ;l™ l"å$’´+ÈLCó£°U5ÝùD]Aó½µ|åÈþMºnêí‚t€>[kOM‰ËRêÔ…lö`‹rÿ5)ôh]²—¤P£²rA -­NÖEMf½>Ÿ¨Yð$¦kŽÙ—÷åžço'“SSã5ìΧ‚Õ €Ùó„†ÑWu[ms±p,-M*öLð}U>,éV–ºžyý¡Pb¬'Ù~ýJ;Ÿ:a³©$?¿`tŸ2ÏXÚvŠ,›%åä`–py!£YBØD•ÌÎ §r”Ià\Vjå|§ÆêM«µ®5ÞL¹F6HÙ|*Ç&Ù’¶x¤ÙDC„°©`›Ù9˜f˜7XTÔL—³fæ,­ae÷fÌ‹Ò -£Ív aÁ2fªwZ/_›ËÍiì›o9!$òú™<(F‘‚C]1È0Âz†N”atð ¢à(Héë¥õú¯ï±ê£³™5 k#£t2ãø‡7¡ïOè9æ‡ñÑ:Šè±µ‰Û7ÝwÐÊ¢ù†¡þzµEe¸z)Ë4D,Þ›¯:ÊU?k‹ö®9ï‘JB‹ýCñØRû¡9}FÍÉsŽv<ŸŽ”õäž$÷Ï™s§ÒLkójsžYƒDäÚ¢¡4Y¯D/kœõ~b'ù\ÿ‡›÷çp ¢îpJöèý<Š I™9FH -šêâíA£·Êäòz™‡VI†ÌiŽ·pÖmŠJc£Ú$;ÐÖ—fÂIªoÖðh/yЩÈÿÊdÛ0–òKqÀÐ1ÒX1Ed€îIäkœ«Ê å#ƒr{Þígå½õ©hïbŠ­Ôº9®\r>v<€µøøÐbæÌ Ö·¹P—Éh‹ËMÝ>SWÈzyìƒúP^\'æ°CD/ÇÂ=ÀúDÚ§cêÛAzzìxYCÿ¼‰MÞýðᯠ8[b5ãp8×`ô‚ã%?ANeôô¸èˆ©[t/hÄ´Øø|N·˜~ÉܦBÉìÂì˜9 2ä¾*S½Jâ%­Î›ãª­þ½T’<°hæ1µ 1fÈ™bšb{ÞèçþijmhqÚŽ¾¶%H±VuU  û¸D.Ü„ÎûzW¨+.e·(U}@ÆW 8Cž³¼>†#’£¡Óvz¿“ÜJúéeüùÊC\³¯64¢”–2¡ -F*‚’øù"¯œ ·É·Oþ.Œ£hÎÕq°»«Ìåc²#šHbµ‡ýc bóÏ3® `–éRýᆰfb¸Jí“%Ùž÷c”Ë0`)ªöŽñ21Ü`Kð‚À0nÀŒ-{~ª‹@ðæâ:ìE|ÐÞ‘GhÁÄ‘te}$’´`#{rÆ¡ðFBÿ†`Ûhƒ=Þ—oæFpˆW&–%VuiøÂ"ê^² Ulqh6¶à%R¸½=IÑn‚(Tï¿Í -[ã£9_¾ªßü7Óoá£~KË袿T‡ó:Ñ -Vv/Ûð¶Dë‡ §·JefìËú,†'–û@U -­ÎM•QDeäš#9§æ)b±J‘Š*Å/M E«(Ç*ŠC½Šâ I.‚ã 9–VütAE:UQ8“d¥ ècF¢øUþ£Râ8‹)@Ÿhé÷çºy˜‹Ú·Kô/¦¬d1y\¸~HCµéKÎÏ^xò̧^N‹<Õ™]x!‚¼r¨¬è!Cv=4æ’›Óã’†{h4P²•.Á7-„rKçÃ÷…LÀ»„‹ås£Rc• -H™ õŒ–véi"… -äD=‚Α+É`àu*­\rYmsuˆ•ã+ßš_í&ú÷¯ –CÁåÓ[Žú‘µˆä.Íú¬2Ö¶™-lw ×•ž˜¯“8[<Žü±œA9½Ø"nâÏÒ@4ðq–[½|È0†ÊxHû7,è)Hk±^[+ÐftdÄø’€“i‘ŠÏRAM¬ ¨Ï¸Èýs½:º¦Ù0ü‘àü5@<ã .ýÂ0 -ôaú±èÖw±(ÆG˜Ì¨QÌ/ðŸpb "ÉÔ€Ìç>Kþ†Æ48zO£ØOÌÛGêpêªäA_¨ü¸64‚‹ÅFÁH¢^"®—»çÊ9ü„§|½–ïW€÷vi!¡îWM_ì‚1egq½˜®cO|ÛfV¥ÂõÏ¢!tž*,è…¦Ÿh•=sPç1¿øvmD$ Eoýt?«A³³lâç_‰lª}ÏÿÑ«/n|—ðDåvöÌq[ÎÒÆ³ðe(9>¥#›©•ë¤í h–½6@öÕ!” lŒ¿lüâ†æQõàz}> ñ(ªú¶9m‚N¬„Êi%TL*¡£M&üÇeÓÌ‚)•ä£LXµüö ¦KõŸ5¼À­…›×ŸG{ö]Ê8><Ï.P¬£Iî½}|¦\,ùäPáéi^Yœ¥Ìf©ÊzÅ‹ŠÊ¡›L…ÏůIe¥Q‘_ŸËÇgê Fäj^oÈ íÙ€(Z‚,}5átš ´Â&óo蔀{õ  Òåæ5_Ñ©Ô;ç–¿¡[õWc”á¹ÙùÁ„»<vʲPI•ºášâX:v0ÙsDp-N›æLh›ž˜ 4ü(öaÆóGÐ"_[£ààËGH?2 ôA_ñۉ} ¦~Óc€~óéúÇ7ó[q.Í!³AC«´ _6ÒÐiwI£OãìÕh:ñ{|Ê9N$àS‰v<ª™Ó!užÚ®f„ùÉ‘ý¤¯ïÿs@Ò»<éŠ=Ä€p ÿSXk§e—O-—U"ù #²Á…÷+ø…Ió«-­»¯ï‚¯åƒÆODáN\©…0š¦Ádãg{L(wuÑû:‹é‹~†E þwe]žè3Aìž[bƒ‰uX„L'.C¢„½h…ÆñYgœÔá‰&(ý®rm“·K™Ùô‘.”f«]U]ogGŽæƉù¦3¼ôWåO-øm_ØÕqìö1î‘!°b’>÷±°6ø¢°$È¢ÿrõþxøÊ:ƒÄ9µ¬Ê:|¶Õ‘(dµËžP¿8~Jú¬$ú¢endstream +xÚ½koã6ò{~EPÜçP«©»(pÞ$Û¦ØuÒÄÅúø ØŠ#¬,¹–œlrè¿΢¥»‡n_ÃáÌp^9<ð?<Îâ@(§: +bÆÇËÍ‘8^ÃÚ÷G!ÃL-ÐÔ‡z»8úæJu ™/î<\Y ²,<^¬~œþ0»Zœ_ŸLe,&Ip21y{1?£MÍéåüÝÅ÷?_ÏNÒh²¸¸œÓôõù»óëóùéùÉ4ÌâöKÆðʆwïÏ©÷ýõìÇÙõÉï‹ÎŽŸßP(dä£_Ç+`ûÇ#(ÅÇ0A¨µ<ÞE± +âH);SÝýäz«fë˜üb•q&ÓÊpL€±%• òÂ2dR´Û¦n bóª©ÊåõijžýMÄâúêhBdñ¸+»²^£<àTé*ާ2 DGæ<º%c¼%£IY/«ýªhi2¯©-뮨»²©óªz"ÀªÜ”]±¢õM±¼Ïë²ÝаkfӬʻ'š;›ßPgwff«%¸»fç¯-÷»¶|(ü©?öEÛµÈr†Žci8hŽ*‡ý2‰ÌÁ2‰'Å&/+šÊîi»Í744d Èm•/?V%`%S±šÌ*ÞáH3[+wØ÷ ro5AÒ|oP8_ÖLÍ}Á7à߻ʠ`KÂп㓦|ÈË+›ºÌ8ÙZ³Å ¡7Äi:eñH=»”oЈ!ÔºjnóŠá ¾–åƒtLâ4/× µ¾¨¦[O;¿€8-'»Ð,Htª _ „R`ÿ»“l²¯N‰Q˜(êe³2*²B¶,°i¸`ÉÁÕgc,êÐXpÉ]¢A¶ÝV¥=¡©®#áÍËCÚá(è®t“÷yÇØÛcJË +/|…ojš2ž}"‰èÿd8‚A ÆX|‚%^Änƒˆ}¶0aU»Ë¦îò²F_`Æ××mÑñS‰P9Ÿ}Ëh‰›HgàE<Ñ(Ç€'ÒGi‹ZS”N.:´Ií¾Ý“ïÀÁ-3õÈ`••l·+—vå¾!ó“½lqðXv÷Ôk›MÑÝÖpX•GÍ hÌ"»è©œ"F6µ0ò€ãø‰ÃÞ ‹… A¿A#Ó ‹³„¡ÖŸCófÄècÎG€¶¼D²ÏÒ[æZ¦‘Œ‚4‚*÷ËRC4Ù_°œQjÅkþ‡clG2PQ(?ÇvôlË Ò +ŽÜÃ4KmòÂI83Ú³ Ü5{´.‘M>–õª¥ÉæŽZ4%Ó¡( ;î¦ÀpeÉä§ùìÃùpeä¬ÞaÀqÆÀ$‰Út1*ð>ã°ÜÁÐI½sEÁNéĵ3\à ´§LbïGÓ®Z²mªCaÈ4HöÄØÙ˜fY´¸×E]ìòÎ9·Ã÷Æ= öظù6±cÆÆ1o‹ÒIº,e”-µ|¬t2…®E-™– +È|(ŸÉ]I›·®< Þâ~°q .É‘–´¡‚èyaϹá`öõØeÎàß×ÀÜn‹ei£¯¹Ë–!n÷uŒc639óšl÷´å©âÓ²Ø2übªWyºŒ£>ƒ8ßõšÍjES·O ·Zñ½·v«Ir a£ŒÓþÙ£Bæ; 4 –-EŸÃ±À|Ô6Œù<Œ(Y6FIYÊ&g!Ðq÷‰Ë$G•2¶Šâ7!ä'Z¦0–Y{G^ ä,NbÈ ^»-ºÇ¢¨iƒ'gX²A+EÃ7W~p +¦~J É8?Zœ”Wf“»ü"¡’¡ñÊ,e¡ƒ¸w†«,#ׇ³Êåd2FëïÏêeuè ! XôàV޲ɻ%Çde‹ÉFæê¡õ®žv—£)þS£²Ïb¥%t.,–=—“;’ä†qPÓ™†ìØúì‘Z"ð þ´u»¢©’ÉëSá¥CÎtOvC1aL]MB&eæ'õ¤Ýß®xИÜÍ-C»Û>OË-ÁväɑIþˆ§¦eÃŽ‡…ÛªY~D¯£¬Ã{(vÄbå wÐ^̧³ë+ÌÜgAø‚ÞÒÿ±+$P*:¸*œqvƒƒÃv”<˜xû›dS‡^ ­]¦öâê!â™^¦Ò€·ÿ¼XsÆ< ñ×?MDh¼¦6UÅ™˜þiž>_ö×à1…X.¯Ïn‚çgî$8}ôB›àÐÓa¢í@XÄÏjLI&П:ÿ±gU|HÞ¿ñrÿ•è+G´ß¤Œ¾ýÿ’ŒÞâdIºJÞƒ bûµ +_îÂ̦h½}æÏX œßœQÎ!ÓA4„‘ñ]ØU6oÃY£üКÂAêÅž” Ø!G—ªÃâAÊÑ Úœš-‹ªîðÎ2ãGŸ 1z2+|žqÓ1´þ!¦ÎÈüCÝ’ëð¥íåK’_°ƒ×9Å “¨”k»òŠ<ѹ( Òd'LìZ€C“+¦‰ôÂX°°¡{îÅ*l:.­Ž8±TmÊ[“¥Ád[ìP ÒlŽ­DŸuÄ:âLG”€é˜Ø2¢ÓœéÈÓ) Þ‘â0©ýÛ4ýíêˆ^®¦gü´è%Û O³&èh4‰añÒÇô¤²½¿Ù^Úä"+àã@\%:˜¥5nÚ½!GÅl„›ïÊÜ[ + Q®ò.ªÁÄr¿³ÖàŽoù\æ À¹€ 3š·åŒh™ïÛQ\‚|å¶#̱+;î+ +ÏÉ 'ˆY±Ç>&¶·øMC³™+ö>/™äyYå·”OÄ\;ÂÞã=¥.Ž &ïCž_VLžu{I_5Œ²aÝÖ×Ðé´¨ñ´)9¤/ßÒ¡Àª·NŠ´XÁZ°ú2/­ÄR"’¶|1(ڀ༠:b¸ Ô©õž˜óÛàµ7ΧWeÍ.î6 D˜ª¡ª¾£‡}µ=*·%¶|•pù*à î/QÚØáH%Iƒ0Nbfeþ¯³Ë³‹ùÓI E!ºâ¢9~ßZRrj3:¨M&ÇT¬ék(žZÎe¦"ªó ßTÀͧ4g5šü$uYõéí®¸öq0´y/öm QRÁ »}ÅÆ†Jœ¿g2†—mˆÁ>V/*]Ž”D(¥l…h~y6èSîI¦©¦ÄZtÛÆ„HÝ7pmìA2ÁÙ™ö<Ž8/Ó“ÊŠ˜Ç§g×Ô3/Ÿ–Xh‹Ì~ãIµû¬cpuÅàÿã ¦‰!ÙÐMÒ™®ÿÅÅfÔ/§‚«8‚Þ½®l8L¶yÍWIrн+ñsËþSæö&·ÝKÀ±J?‡=‡Í 4¤ÆäßJQš‹xÑŧ|³­Š‚EÀ+tÅJc®$âL_Pôx²˜B™!Õ¯eêp)‹KÒ{&L. \  |qÜ ¢0 +€SÍ·MÒóenèÙ]yEÑfÒšÌÈ”ÿLâ*¬x˜¤ò:,Ñ‚5n1³U:è`zÚYGŸÔÀ`ÓPÅFš@mB»è¼ÛWŽÒ‘Dz™o»½ÿ4´õÌâ¡ä§ÿ>±-+ã#ÖŒX‡­Ï.êé+‰>äUÉÐmq †}]¦·”mÓš§ÂxZlÊ”"% –² ãyÁÅ3‘c0¦Çt–væ–÷5ÛîÊÕªày¶=èåcnZ)pÓâÀøiÈÌ}ÝZV˜‹Œ…^H+ÒÈEÞuùdŒ|~IƒXÆÖqµùs‰¦²j¨oü¾ÇPA†4’[ „Q»eÓf;j2 tÚyé®e¸Æo‘æ‹›®–¯Dô#:À ghš«u:äËÒòe©zäBà&s™bý‰÷%CQd‘´™¢Íñ˜Ü(Õðàþ¡’¹Ã¬Mp(NªÒm™%CÓêSL©Rÿu3F¼N%ÒÌÝ„y’(“ +TœúJÒzÚ1†9 ƒH»OKú6ƒ[^O’Bÿ¡x` ‰GY#R™/•’xÎ|#ÆNK`æ× +ÊÚ(tìãoÅ™F>?ÓñHµ¼÷6æ¡Âô;¿Ô?U†*2ê3ÞÙ/;±ØS=5{êlÊõ=û¥½ýI¨sûò'm·ez~²…/AïÐÃìR?1ù75ô³ì}u[}õ†º¾ÿYÔ½ÉzòžÝネ¸ÌàÀ´Ñ§+ìnr¸£ÓuWV–å÷MO´ÿÙž°˜oïþ<õ¹ÎSø>­ŠÏ‹ûo‹Å{:3üa,±ùÇ #X¾¹œÜûËÓÙû.oMF9ݬw—ØÐ¦ð!c¿ç6æ5%VÔ‘÷æÇ+|¶TÆŸ¶ÑuÀ™vwÆx^ùUœŠü)ÛÈoØÄ±eéþÅ\ÿsÂ( T–ÉþÇpÃ0–™Ô©% +ÙÉÔ!åî§u/Iÿ™wendstream endobj -1816 0 obj << +1809 0 obj << /Type /Page -/Contents 1817 0 R -/Resources 1815 0 R +/Contents 1810 0 R +/Resources 1808 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1820 0 R -/Annots [ 1819 0 R ] +/Parent 1784 0 R >> endobj -1819 0 obj << +1811 0 obj << +/D [1809 0 R /XYZ 85.0394 794.5015 null] +>> endobj +542 0 obj << +/D [1809 0 R /XYZ 85.0394 769.5949 null] +>> endobj +1812 0 obj << +/D [1809 0 R /XYZ 85.0394 749.6148 null] +>> endobj +1808 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F48 1228 0 R /F41 1208 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1815 0 obj << +/Length 2050 +/Filter /FlateDecode +>> +stream +xÚ½ÉrÛFöίà‘J ÚèhÀ9)¶äQ*–3²rRT.ˆhR(ƒ€Ô’äßç½~  @KòÔD: —·oýºÉ§>üói²0ñTÇŠ>¦óÕÄŸ.aïÄ;¯òv¡~ºœ¼9•z³8áôr±C+b~ñéez5 ™`G@ÁŸ½ût~zöá·‹ã#­f—gŸÎ<ø³Ó³_NhôáâøãÇã‹#GŸ½û÷ñ¯—'´:?¿§•˜>ˆ^œœž\œœ¿;9º¾üyrrÙ벫/÷%*òÇäêÚŸ¦ öÏŸÉ8 +¦w0ñc1]MT Y ¤ìVòÉçÉz‚;»uÔ~ÜgB†bÄ€Š0ˆY(…´,îÓr•dsŸy¹[(t??þx‚Ö‚1CE›Ç9‹ƒ@j™&m2@ Ã@) hL+X¬ìNÀb­ÃéÎ:±ð„àŒk?²ºIÒŸ<>ò”€/¨ÿÜà¡fR ÕáS˜Ã¸±ƒ¿o߸·Oüʯv±¿gÁþÖ8 …ÔT¤&¨òXf@_E{ô—Iš‚™ûdUåfËÄs=!YŒ†$»ÎÙ¯ô­×¹iÜÐÜÕY›Kš&yîEsgj´(kp¡ßD44÷sSµýòŽ}÷b bÎø”UÎ1߈r‡ŒÐô¾ RZí*}þù=a‘Zi·:4ƈE³ëÁºzôŠ&-’•q<ý*bP}0ž>jb#ò ò›SÁ§=öi¾VJöUŒk@À8kL½15šÏmÒš•)ZWÂêdµJj¢8Èm´NÀBí¢¯£&Ȫ/IšÖWoªÚ,²ûÜ×´ñ'娋¤u®â¦\®]”<˜æKY)Jš:ó_YÆ!Wu¹ÉRãe÷‹ú{iÔæµiÚ×Ò(aÒâ»u@\oV^“=Z*Ö«›Î´/ °Jî_M` ~[C¶.úl}%ûÛƒ,_%.£÷ŸFPˆ<*4ÿ«ºxðEPøé·¸~5McöÓ´u_…«Ã;Œ±k£¿ÚN^S®ë¹ÙjšUÊ&@§¡=%t̤ÀB:~2»'ÓV÷«ª¬Û>«pr="6LÒ·=Brz›pWÔ𩨱f"ô_vˆ¾ZTáKèt<*jQ¶ÙâáeÝ£Û³îÐøzƒjÉ@Ã1·d|Þ˜[ÏüŒÉcÎD$ô¨1¡ÕC[º ”Ñ4Í~jº²½+ýNo´/}ÇpTüN<3%ãp¼Z÷DØ.;BhÅGüÜ9gÔÑ×ûa3hÕ¨Kw-Õ{ôõÆ’1¶àê ±ø?m¬—ûkÏXÐq‰QQÖñ¬Á¹W•e¾wÖ½ tñ= N›œ3{$Ö\ LV´Ð‡$ùAZ}G7 ù÷/m™¢ç[¦÷æwßtÁeA+¶KÄÁoM²4Ž•ë¥È/—·¦—g Ä#FŠþn¿õ”–€«–†[Û‘Íç³”dÃn§óÛ¤Næ`²¬i³¹[lKúÞú&MSÎ3 “Òü.koÝ}ê#Í̪l-‚˜QO‹;NH¸ÉÂuWÄrv¶`V„Š2ÝnnŽø¬Xë-°¿ â½ò–¡ ¨Wfž!®Iÿ…+Á¬½5hr),“oihX.–•©!°ŽÔ¼D9Q–$•¾š}*òÚ¢4X•M»ÇyNdúh@RyB㤪òÌ8DîYøMs[S‰râ +1S|lY1ҋÕ=Öaì|ŽöOá’Q,FÂnâÐlt îއeC"ÂFjúfÆø. ž C‰Ïš„¡–³yRРœÏ×5 ·GŠCÈ´eE+¹Ù˜ÜÁ/@@©,ÐËu¸|ƒE\É@éÈgpYJådD-‰ŒœÀ›ÌÜ%—bQ=Ñ +cFÇÝè{2ŠYäë½Ês˜ö…±^ Q箑>A„ 5-[MaaE3ê;å³H/qžPü ûÓ,ˆ¥Í àÕÞ–c±Þ­–´äb8"- ŠJaƒTVyØu4‹ø^wXÚŠ%}ˆ§›ÍÑlY”Û¬UÚ·°`°É š kœl͆p%±ÖT…Ÿ·OGbÌ>’kÒ ™ tÛçÅ´nJ|/¯{@ÝIÝ2½@x2À66æÃC85‹d·Íö•Áf=]ä­ U0{(×4H³†Ê£µ·˜¨lm »Õç]-Ä1–Wü.³½rá¸\;ü›$u ’6AË…1\ë¯=dÖÒ7qTÜÛï2|X‘;B66;ìb]CÜÕc5[*ÇPH)H¡ Úìå¾-wvÅ™‡&ÐL¬»J¼M©ˆ×Î?$ã¨yvPY3B ÎmÞן><Å dŒä^펒ú%µ[øL©>¼Ï%#'(·îXÃ:—šOËÙ*£¼„¥»[c­n'6漏fy9Ç^ ×¶­¸Z¹¡ï Oæõ0À¯’¦Ý⟄ÜÜTÀ¶Äb™ÚNÄ(ÈpÉöшÃ~¡˜» … ±òøáìÑÖMu×cœ¨HáÖoDo·6v˜´’<¦Âëy²1¸$|‡c_•Úµ!§´vå +É´ŽçXU’‘gvwd?˜±ø‚bÃåÁÁ8ÎûŠøé@ ßûGúý¾þŸVØþæ¢àÞE¢ÿÅ`xðiâˆ8¡ì‹¯z"y÷ûÃSÑÿ "gœ +endstream +endobj +1814 0 obj << +/Type /Page +/Contents 1815 0 R +/Resources 1813 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1818 0 R +>> endobj +1816 0 obj << +/D [1814 0 R /XYZ 56.6929 794.5015 null] +>> endobj +546 0 obj << +/D [1814 0 R /XYZ 56.6929 575.8978 null] +>> endobj +1817 0 obj << +/D [1814 0 R /XYZ 56.6929 548.0117 null] +>> endobj +550 0 obj << +/D [1814 0 R /XYZ 56.6929 250.4164 null] +>> endobj +1689 0 obj << +/D [1814 0 R /XYZ 56.6929 219.5654 null] +>> endobj +1813 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1821 0 obj << +/Length 3897 +/Filter /FlateDecode +>> +stream +xÚÅ]sã¶ñÝ¿ÂrçÄâ“§O—ä.u§¹¤wî×$™ -Ñ6{©ˆ”§íï.vÁ/Q'_ûÐñƒ€°X,ö´¼ð'/½M„ÎÌ¥ËLb…´—«í…¸¼‡±¯/$ÏYÆIËá¬/n.~ûV»Ë,ÉR•^ÞÜ pùDx//oÖß/¾üýëïnÞ¼¿Z*+irµ´©X|qýî+‚dôóå·ïÞ^ýç÷¯¯œYÜ\ûŽÀïß¼}óþÍ»/ß\-¥·Ö+ÆpbÁÛë?¾¡Ö×ï_óÍë÷W?ÞüáâÍMw–áy¥ÐxŸ/¾ÿQ\®áظ‰Î¼½|‚ŽHd–©Ëí…±:±FëÙ\|¸øS‡p0–ÎñÏjŸX¯Ü •šc Í’T+Øîóª¹+öp,§Oåfƒ-µ¸-²Û_I¿¨Ëu±æ9EU<Æ»ºiÊÛMŒÓÎ/®ïÜ-áikäP"”(í€Na€~¤¡Šs†ÔJ™@Kó”WˆÍ/r"Owd7Ü­ù÷¡ mÕŶn‹HÏþqzH͇T@@µD.—Êd‰T)ðöϬUa÷²Z1¢jó œÕ(IgõV·Ô€C#YÊtè1߸Yót;f‰t6±Òf|ÞÝ>°|Yþr·ŸaŽuIjµåÉõ®-늰—U¿ QPOLÀž~ï7õm¾aXXÚPçvS¯>2¸vâŒÖ‰LQM‡œÉÒ‡œ~ÖÅ]~Ø´IX"`ªORòˆSoæÏ%ÆkÅ'Ù?Ц=yl›d½L¬69‡t*ظ-öÛ²*Ý…8°§Aæ…\Àùèà* +¨w¸28Áª-«{šN“rž»É œæ³(<>ŠX —VM¤„Ø×jDfÇ\ûµ®‚ä¥c9¶‹;Ò¶-’4ÛÅ}ùXT ¶œƒi†yÛ¼i ŽšéSÖÌ”¥5¬l_ ùcQZa´¾ëi8¾5 h”ö/¾6ŸÚ#iì ­KF긫Çl"º@¬X†¡d~;FX'ÃЉ2 Í’AA†IJ_.­×{‹^E›á=ãrÍÖFˆ÷ uÚ‡¼¥á5§qÞa·«÷<Ú#fQX~hëmÞ– ›g¼#S­Û<h°ïk@‘Pó…黫é¯Tõ§~w¶¡9 $ghwá×/ª"0 ´CÒS"-~±)ƒˆüé¡\=Pspx?WÉ¿á¦S¼éá@~Q¶|Jöèݼ ¡ZÚt¦sŒ~­Ë&§©>Þ4:«L.¯“yhdÈ<…4ë¶nÆF+´Iv ¬/Í„“”[Þ¬æÑNò S’ÿ•‹»š±¿äÛÝX~&­dŠÈcã®'~FUz)”ÛÃýý3[’ŠMËjŸ7E3¶R«z¿¿ò‹Ã®åuÞ²íáãC‹™31X£”~Ú…z#£-.ÖÕœø+“8ÓÉctZú‘ëÔÒõ®Ã"”]'Âb,…m²a8!oÛb»kyYM¿¼‰[¼ùêÝ^ްU½Ý*0zÁñ’€øÕ[=²§2È0¦s#/ýÞ ¢ÎJÁ:ÛÛøŽÁ3ìK]"”4Ÿ´Ò$™ÑQ£èràj€Ê4{ö’”‡Ù©$^Òò°Þ-›ò×bf; )M<¦v!ÆÄ{ŠÑ‚˜·úóWßñ,DZä–p°l’¯Umœ"öoŸçÈ…›Ð©BUåÛb=C§F©ê2¾ZÀ ÆiÿÂ)ÝÇ`DR4tz]/SËl|™¹Ê ®Ù”kQ +Fþ±— V*‚’øe ˆ¼R‚Ü>·$ßÙâaÅE}h°Í4Ø>” †Àìž,äˆ&’Xn ÆCÿˆXÿã†k ˜e2¶"’E"`5¢¿JM¦a $w‡ Á˜…}®Ôx*› Ç2¢¿Á†à9×`Ü€wìù«–À`þ(®Ã^ÄÁíy„æLI.ï×"I36²#gšo¤”!(Ø]´ˆÁoŠWS#ØÇ+#KÈÆò! ?QX„Cí9›PƇfC ŽQ"…ûÐÛÝí6eÑ|ž†Ä:Z‘mþË'õ›óô‰~‹,ê·äƒ!p•ÛÖ:Ñ +Vv/š&¿çɃ Ç·J¤±î¼> ×i=Ë} ªZcÖëýXETFRo FΫiŠØ]¬R¤¢ +’çà¿@*ŠVQU‡:ÅA’\³Š"ciDÃ^E:VQ8“d¥ ècFËJ&!*%޳˜ôHH¿?VõÓTÔ>_¢ÿ{1e%‹ÉãÌõCª­Qç®_$Y¦Ó±—Ó"M´qþX ¯ì++ºÆP€=dDO5)ÝÅV_mÂÞz J¶tÑe#8ð¦Pnîbxß)NU,áS1«Ä:eû’‘¡žÑÐ.M¤Pœ¨GÐÙN8¾Ò‰trÎe5õ!4V!V– ]Q&r +јÆ(¬›Z—#lg9ªg>Ô\ ’úÄtYd† m2[ØW‰ù4‰“ÅÃÈË”#È ³ˆ›ø3w„¥Ì4˜?;V‹óG ƒÏDRÀmÝiQÖbbU‚6£Û0ZšL‹ Ϩ‚ž5±"` Þp‘ú‡j t´u½fø3Á¹Z Œñ÷ŸüÂ0 +ôaú.oW±(ÆGÉæ TÀ‚(æøK8±‘dbAæÓÌ,þŽÆ48zXß fW¬Ê»gêpêŒMÒj?îb„ àb±‘3’¨—ˆ#DÐaÙ|9ǃ?‚ð”ï¢ÓRàýðnÁ.Í$ÔݪÑñɘ²³¸žM×±Š'>o3§á• º¥PaA/8†bR¬_aLfNÔg˜_ü;6"PŠ¢·>ÞÏiÐlcF~~N´KtÖñ¿ió6i‹àÛÈe¢ò`Šjv[LÒÆ “ð¥/9ÓaÀfjå‡:麚c¯ M¹ åã/hT‡í-•Ø%W1®V‡}"¬¬nëCÐ&èÄJ¨WBŨ:ØdÄ\6Îü`‰¤’|”‘pVs¯L—òf"'Ø£µðÓúóÀcqŸFž g ÈWÑ$wÞ>°Úž,ùd_áéh^îXœg¥Ì™D™Nñ¢¢rè&‘eò%%{ØZZùõ±x>Qo°"UÓzƒ´g ¢@“ÎQ0ÅÅ|´;'î>]´ù†bv‡;ˆÏqØ;`öÈ~9%eD.8òn¿3i~›£¥UûÉ]àãFnôPnÖÃÅ:öÇÉÚ²a²§Å´ò¾ÊÛCWm±]éϲ€Áï}Q{Á5u ±ÁÆj,B9&„#G +€>]Â^·Bc·ƒÜ3NBÁ¬G(³>,]¦Ú-^Ïåg㧺P -ïË*o;k;p7/¨3ŽŒ8=ót“>”ëíømW–¸¯âØísÜ/"Cþ`Ýd¶ððzñßáB9#˜HlÜïóírÃÐAÏGç\]–¸Ô¦gl·M„)P&¾ ôú»GC NP(å%Ã䧬ל2NJ‘RN‘ìàµ_f ++ГRù abF/ì0£&&§ê•<1y°Æ&i‡¶ü±ØDù_paoiC»©`£ó"dŒ×ã Iá\®c“Ôúô³®|Ù­ aêBÌ@øXµPeR‹õmòý ªãó”J´ÞÅ;S“÷}•NÞ÷aí‰c) y¥Uö³%N'™‹ÌxÁyÞé®OÔ)~Ô’:?)¬‹6/7Í«h<‹‰y]Íj_Æê›óÏ»â2‰_S}®’:kÎ*©uú¿PR%uDMŸ0 £0^‰òÚ]†Ø ’”31P79\pãÅ@ôœ’¸#’RŸR­F$EBݬs„a– ñQ ? yYÍB)Ý}Ö‚;}¥©ßåÔy»Ûeh#Œó—éÒ$V}¾ÅµÑâ¦'-®}¡Å -´ dzK¼0vš¹¶D‹ë +•Mü´2kÓ}7ÿñ[PC—´·ÆH»!ÃKù´'‘FÃ䲓öÖÙDe݇ g/Y'¢+p¢=¢dÌ‹6ÂÎ>&VJŠ«;|„ÊãË;ÝÛ'ß“yí)« ñðÍ~ž¼ÙîewI™= +x‘&BC¾ñ²GfvŸU†GØOªS&DúIu„ÖtùëáÉÓ9ÝùÖN›t¬Ü„¢fƒw'¢?wü%ŽÑ­„%m +S†Ú¤ù#¸å ƒøÅÊí\ü¢Óp’’žO]Ì£ð鱯~¯@˜ÃœR ›²ázGMãµ;4,ötÀ’âÓ]g%ÏߪMÇ7»-bU ‚iá³±"ýH¡ýuöåfá^SùRý Ûu"€œnZL{µKRi©xüfvµ”“æ-WÍrõWU±áäìC_— ߀sÞ¶1“Š+œKiºÂÌÂvúg¸‰{L+•ßÓŒ²Â!¶°ä°ÝOABç_„BêÄ:ƒÕ ü̇¶ý Ñ=¨j«yú‚Šq÷Y— ´*›|•ÃKCFOS©)¨èO[|)ù‰> ÿf´¿¢gÎ$ÉpþÜ×öÚâ·vs!èîþþ¿ÿ7ãíý‰2¾–z•¹HžÉ¦ºOöIÿ½¨endstream +endobj +1820 0 obj << +/Type /Page +/Contents 1821 0 R +/Resources 1819 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1818 0 R +/Annots [ 1823 0 R 1824 0 R ] +>> endobj +1823 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [87.6538 85.4256 137.7628 97.4853] +/Rect [116.0003 355.3155 166.1092 367.3752] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj -1818 0 obj << -/D [1816 0 R /XYZ 56.6929 794.5015 null] ->> endobj -550 0 obj << -/D [1816 0 R /XYZ 56.6929 693.8729 null] ->> endobj -1690 0 obj << -/D [1816 0 R /XYZ 56.6929 662.0342 null] ->> endobj -1815 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1823 0 obj << -/Length 2987 -/Filter /FlateDecode ->> -stream -xÚÅÉrÛFö®¯àm¨©°§÷%>9Žœ(•8™99®DB*$@ ÍLþ}^÷ëÐ2NÕ”ìõõÛ7ˆÍ(ü±™U„ -'gÆI¢(S³ÕöŒÎnaï»3Ï,Ò¡E÷Ô7˳¼fæˆÓ\Ï–7X–PkÙl¹~?õýË·Ë‹«óWt®ÉùBi:ÿæòÍ·¸âðçÕÏo^_~÷ËÕËs#çËËŸßàòÕÅë‹«‹7¯.ÎÌ*÷y„0qáõå8úîêåO?½¼:ÿ°üáìbÙÒÒ¥—Qá ùxöþ­ìÎ(ΪÙg˜Pœã³í™T‚()DZÙœ½;ûg °³®ŽñO K”åf„œ1P9¢/7Í]u¸½;_HJçÍ]ŽƒÛ}¶Ýf{œT7Ç] À²X&1Zi@Æü=¿¯ã©îãgZÄC«Mv¨ãSÙfS}®q|SÅ'·‡MSì6ñˆ‡ù …Wå9›oîý:›g¸]åmç(vyUçûOi\Ôf ¦%1–91â”âˆÕa¿?gvž—Á˹>ìvÕ¾É×$\¤³§„jƒÌ[Ž3ÄÆx$µÙge}“À‹º:ìWù{ È—;ïdåz®`LOÃ]|Ò# -¨¢6¶Çy`7—j^ïòUqãI•eïW/ß~’¸äñHK:^—ü“«<Y¯‘gu„ÙT¸q¡ÁkëÈtljLö™D.¨œÿ«*s?RGÒÂú碹‹ëw9.á‹Ûª‰¢ˆÁVAKìE”€¼¦ø”ƒ0cs°miÄü5>¨€:„†ôú•>\9„[•k(¦¥•ÕÏù¢½ÕWBç‘ð„ô+¥Ü+! ÅçïŠm±Éö‘,@ †|ôçñ¾I2ƒ•.Yb—,w‚,®$àÅÕ³5Ng3ž@ÏkDÝÌ·¢Šú"À¯9N/ò=þ:o²bãÝA°Ï<Çj/ Öy½Ú»¦¨J\ï5æ´ÀÝzý\#5J>j¤ÊˆÿÁH9 tQžp^„[ˆ‡Ú1b¤ ¡7÷·3\ubB{~ѽ0Œ C¸þýwÞnÿ|Tdš˜JZÁ{( ‚S{ê1DÐ<"$j‚àÂ>Ùû²$€²jÀÁM‹Tsˆ]†?îw©ƒ8.L£‰¦Š?ßãªäqõ¤ÇUOô¸aä}º^cˆ¥Rõ] ’GÁ+n\vЄY !Ð$‡•ž '¼ fhܤ¿°‡Ö  ‚#€«‘ÚI É1ÁÝ)ká@ÆS…,ˆ§ýèO › BÒž\G7râ¥ñº*&,~Ek‰rƒQ8EOˆóŽiÂëB>|SÏÓ7ÅLÏáüQRОÀž©`ü)ö'„¦É3}<äû‡ÍÉQª4'¨¤s#'©3¢­­5 CÖ$´‹Ù¡)žŠÖä÷P*áJǚ‘®50n\ÇüÅÌÕXþ"t ¤˜  È/x¢„ýüh@BM',JGòWBÂ"t"žš5°€ ˜l½äãRUºÐýc×1NKÉ4µ®§ÿĽÿ5êé¦@®š=Õ~Âs­ -øDŽ7•Оn˜'ÄM(@õEH“5EÝ«z±ºËÊ2ßÔülä[t·¾®ŒuWxFv©ò¥¾ÂÓðпƒL˜L›Û¾¦¾ÇE™78ú•*×v¿C“ÿ •§> @ü=n¡˜;ŠáíøŠ¯šZØÇɇhJP*îÄ(‚¡ LÔÀQŠV -úÛ6kVw¿m€ò¸ñgû¢ žö5q@7!äEÀ.ÓÇæÏcÂØsª\+dNŸ)äos¯Meq̱0ìÃà„GT´/ýÉÌÇX‘Ìt ™‘¼‘¦s'â ÑRið¶Ñ3áʪÚne±Êu(GçGJýàíà7xOøÅ\ÄŸ»¾Ç•ú¾†7pœ­·E Hî³EUÄ*{¢MµŒ ÙüÞæ‘•Ùj…yPgóH9΋œÌ6ëUýš¡Ì¶3Qð(Ó]VùiQ6y¹Ž{fÐÀ¤-ò?ŠëMÞÝש¹€“cÇÃÏNí—vAUS­ªM^!ðâÍ¡Áð–{ÉA‡wV¸¾èò·×ô0 -ýj}¿\¾ÅQËhñ·ÓñÅìü2äŒ)Ô}<­îøÓÍ]Öà(öç`äð'0 -~ê]± Ù+̰ð÷£MqýÇvÃÁh¹µm(ɨ/ ÔPýc”Jû=ßð€iHA¸älhÜjd…8ß› .y횀¼ÅÓy`à²er’ÒBîÇ¡ÿËxÐB|„ÒBŠÀëó d)ã<ÉTCSKÌ?ß«»”¡2´4'¶TJp?ÖÍÓ<¨°’S\Ñ8êÔ ¾ŸÈÕ„9h ž·} !c¹R„iäQA¤4ü‹ÛB\tAË•…lÕ¸ãË1V@A'“ŦVZ/1–jÈ€‡yâiª‘Rã~ÒH3°à}QÿŽ ¤ç0úGBêƒ^Ý*°¿>Æ€p*ÉÊzŸ·^aº²Žò<Êê*DBPqÚr­À턎W¨+UtŸ VªãÜE¸¼pX¸ÁßXƒª˜åü­Æs©"í5or¯@ÚÊùòÜñy…ûèÑð¾ÒšªXÕ§u$¢wž‰µRøÜýüP]µ#Ö˜iWè¿—8ù:7Ž@¥c¿X[[ˆ‹.È¡¶2 ¹9¸¨ãËk«âm#dJ[¹4éÈ×_E©ÈHÚmA2Ï;!ú¡ð2f’eL=c:§(jq¿xüêôŒ¥ý³±q×­Šcx‡QÊTb1½L¹k2 œýʹ¡Z@1'5uÑH夑*â TúS"bTM¿6î£ô\Q—.:GÒ9î;™Ó)che 0T R†Û¿Ãð !w<Ä: Σ-ÇÝ,Z¶q/Tb~ÐÍ6°ÕQ”ᣠl¢Â o Ôà¾}³ÉŠø X¾ì§S!oØa3ô3&‹yltÄXSœD£»âö.ýk"ë y¹N^<õPºþæ¤YÒûÕé¦ô˜Ö‚øx(ñõl{»}ÕtÛå©1;u¬Á ¾L>¯Ïú­Zåªûý¸ÄGôËqbÚ"cJ½Z+SÞëð@H|̇€”‰Ý'Îõ›=½h?ÖpæB¥-6œ9‹½Èf€Ä`½ÿŽó%æ> c‹ÙWþú‰³ß‡ð敇íu¾xÜ=ÿbL›ßÏ=.ö¥ !b¿÷wÖé÷Žý7—壟·i+–/þO¯ã¿ÁIC„µ|ü;¹ šXp† )¹Uƒ´*ýKØõÿb€endstream -endobj -1822 0 obj << -/Type /Page -/Contents 1823 0 R -/Resources 1821 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1820 0 R -/Annots [ 1825 0 R ] ->> endobj -1825 0 obj << +1824 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [399.2874 687.9386 467.9594 699.9982] +/Rect [399.2874 246.2214 467.9594 258.281] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1824 0 obj << -/D [1822 0 R /XYZ 85.0394 794.5015 null] +1822 0 obj << +/D [1820 0 R /XYZ 85.0394 794.5015 null] >> endobj 554 0 obj << -/D [1822 0 R /XYZ 85.0394 580.7887 null] +/D [1820 0 R /XYZ 85.0394 145.0925 null] >> endobj -1826 0 obj << -/D [1822 0 R /XYZ 85.0394 553.3134 null] +1825 0 obj << +/D [1820 0 R /XYZ 85.0394 119.6529 null] >> endobj -558 0 obj << -/D [1822 0 R /XYZ 85.0394 453.4945 null] ->> endobj -1827 0 obj << -/D [1822 0 R /XYZ 85.0394 420.245 null] ->> endobj -562 0 obj << -/D [1822 0 R /XYZ 85.0394 160.4691 null] ->> endobj -1828 0 obj << -/D [1822 0 R /XYZ 85.0394 130.029 null] ->> endobj -1821 0 obj << +1819 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1831 0 obj << -/Length 3468 +1828 0 obj << +/Length 3195 /Filter /FlateDecode >> stream -xÚµZÝsã¶÷_¡·Ò3CüBòä\ì«ÓäÒÚNg:—{ DØâE*"eÓéÿÞ]ì‚_¢c7mG\€Àb±Xüöƒ‹~bÅ~¬¥^$:ô£@D‹õö,X<»÷g‚Ç,Ý åpÔ·÷g_]«d¡}Ëxqÿ0à•úAšŠÅ}þÑ‹}韇À{÷Ó‡ë›÷?ß^ž'¡wóÓ‡ó¥Œïúæ‡+¢Þß^þøãåíùR¤‘ðÞýùò¯÷W·ô*fßÞ|øŽz4=^`z{u}u{õáÝÕù§ûïϮ ÷+…ùõìã§`‘ö¿? |¥Óhq„Fà ­åb{FÊB¥\Oyvwö·Žáà­:«?øRÅrFR,„ðuÉ‘#íÇJªNƒR‚V‚ ðÚý¡iM¾ülžÚê]›µfkª–šß™_‚@VE[ÔõdUNÄÏMöhP!°¬œ[°XÊØO`]\î~ãÆˆÁ¡ý0NR‹cFRœ2é¥]Ðàf `x9 hj~÷áîîêÑYöEûL­ý¹H½ºn8û0£‘Eã˜5ë}±29wWÓó†“ñÓ0U‹DI_Êž8½Ü?.ˆ¸U7~9œ@G5Üâ)_ÜêY³ÞA˜ÐOO¤I,£‘4'æÒzM†n(ƒÕVà]:•.Q`*C_:^,;{ƒÁ¾•èôM-«axºãB «À;nLE/Z°K쫲X AÄC½'"£GUWËìÐnjX/k‹'žû[]bìÖû\ÕÇêéÈ[X˜uVUN°OµÆ‚"›òÙn1p[#à©WmVX¹•ˆAZÚÞáqC`MD™¶²'zeÖÙ¡1Ô(Z|FV4âaº¹Dô*Ãm©zžóÙe$wu2Ï­t¨šâd÷Ç£3û©Zãp¼Ùø`¥c{“5Ô³2xJص®+<¿GVUÎy\FÍvžzöFS -!YSvÏ„‹ŒÓ,YýÖž3¶Ïþœ ò6à¥ÀSÑç¼RqƶÍ*¸z¿“±½ßgÛ-ÈxjJ.1K5[ëS ¼ÿiw"Úôĉ6˜ˆŠ8¬Àt0+—öæbGuØ®0Xú=zÈà›9Tùx:î°}|ô}ÿÓ'ç G»# ÿ뛎!¾ÀL»;†ð­ÇðLœ£¨Ã›3púq„S‰7 ňæóÜqâC’"Þè‘c?T‰sßÌx˜‘'º—µI:ÊÈ•N8a9DþðêÁp,²64¡`–öо”pxE‡cÃz]K*‚ û¶jìS>›ÝÄ¥8‡ÂAžì¡…` -Ö5]ªãî~}h;WdöŽôñ@ØNœÝiRï 8>ô$$ÄX,Ø#ouwØí ‚¼Àœ=¢xVÁó%Û‚çãn!ìÏèaFáa`ƒMÐÓóE{‹¸ƒˆcÆCÖõ–ƒ˜m@ÇŒ)h×z8Ζ‚,ܰ4”Æá°zh÷Oõgœ‰ðm¹ÁA:ê eÃ]X¥k -pz¬FwÜé!IB ™ÔeÞs³¢¶•`ÆÖTúIFo®`¥Q8¹Z©êƒ[zeèpUŒ‰ŒŸRe+Œ_–KjzöÑ¿íÝØ¤º«„ •UÏD”uõhöß î%åÔÐéwÐ/GÛeô¸»º="ïï×h…—7? gafÙð‚ë:Ǥ:ŠB¸ÑNZg.˜„p½¨.}€Fùöë`[ö(é‚rÀM?=6©þµVoN84 ÚLÂÁw{"ieC„AŃïªÔ%z|Yo%¤ô6õÑàÞ@­ÜCEä -Z@Mv@«KG±žTÑsÎLE, zTñ›F„s…V» ,™å½„¼ìŒ¬|Ù‘\“}Yùò| (hEBò—¤b’*IÂÊU¾\=#=Éܨ^ö™+ùiÏ%cYþ”Ëðg“tå $Ã`zF`$ -s8ÅWY7mÝ2º´0õœÀ½°Î „‚ý>ô»bç`"$}E••ýDRMûQyÅèþ[ø•q8€ÈübÎ… _ê4~}“±ŒâÉ&»õ|ð$°AÊ*=†£Þg³ÿ‚þf Þ{c‹Ý(F$è:ÄáŸÁgy7-uÖÌʦîm]ƒÿùÍð²ìîKÂ= -åØbºD—\&.ã塇+˜]ê̺Ðû\{m²†Yò~0•ÝeŸHSÑ -;àk³å.iÃ\·¼n‹ß˜M—Ž'6l9ü›BaŸ òÞ‘£dÌîra0RÏ—ç.ð•êj.¯AÄ›aW©z®8p¥–†Z=J[ÈCÊV"bÞ ,Û®šž+~ÃR îÒ¬¡¶j‹Ê"UTÏl]¡×[aheí" ü¿±:V1\t™t¹F>Ý5†nk¸ ><9íûËi‡œ0ÂÝÛ‚%ö[[EN… a•«é ¹¹Ê¼Ýˆ sz±+¹¹) †qûÖäs™¥-í¢ƒ”4hþމ=ÚOü€Šºø¢hfò@ðF¹88L²fÎ?ò“H¹?¥‘sëÀk²Še™w¸Id¾Ùÿh%3Æü·kW°hWáÃîÌõíž;P D~ Ót,d48*öEc”‡z¾>´‡¾šåÀ©Dœh¨‡kPˆ`¥µ7bÄo)U`ËŠ¦–…/ìlð˜ôÍÈr´¶aëð”€"UÖvRÚïŰù×CAêÍ·v0ƒ -ï0Xûõ@ç¾Ì„Él‘„¾TòÍ`!d:w~j·3Ù¾¡FC•÷!œ¦óŒJ!î*lÿi>Š»ê³Icªgá“A9õúRêÚ…à°°J§æCÎM Ìhkë? AÁ”ÄÀ~ØJiÍ~JŠæq¤0"Ÿ«÷éÄ—ˆeðv* \h.Æþ¢a~•5“m1RCGš–ÄÊT: KlÜ¥åüñûÐJ½9KR=. -é&ÁÓÞ$-Fß±ß%ZR5’$êî®véà¶~¢)¢Ï¾OCSŒ3ÞPs¡“$J&À¬’ È@Oâ©8œ0žÔ*º¸>âxžsz #ò«·Ãj†z.ÑTS';¬Ø}¾=ž;ø¯®•Å£î;`ÍWf²¨€íié}M׌iLŸxqUrôv—ÜS°\möÙp–YÔ«†Q\»S£ŸCüž|„Áï +áªq ý4캽æ¼Q Ä$è¯>­©2ªJá'3²£µiš¿|A‡ìƒl`Ð0s°`NQ«×bwüƒF÷%ÌžºaäK“°÷Ñ>: 6?Kœ~ÈÖ^ç)~Gì6È ´GŠÜL»Þ–³uZá•–¦oŒt?dè ¡&_rvokŠ•âtXC‹]Z§…1úóå‚Â.:sès{CMksqê¢þ#:w šY♉½ŸñK’è »¿8½~E#¥NJµŠ@NtãBð q,&øÛY­ÓääkmÑ þ¬P²ÓB.:»çŠd1™ÓÆÈšÉ«äF=¸RL6©ƒ ®gàõ¥rwý—þN§"?œÿ7SÐèÿë¿ÚõÿC tõrþoQp†>¸Uå„B•§ñ‰äî?y§¢ÿ‚Çqendstream +xÚµÛvÛ6òÝ_¡·Ê{,–¸š''qR·Û4k»{Ò‡³û§“0ZE³{h„Ӛ϶'2A$…ð=ÅÉõÉ?:„ƒQ·t’, ¸ˆù%›b`¤ƒXpáøŸWö ß¿ãlÆX £ˆÛ©ál!“ dIÔq™‡À¹0 çM›¶¦iMÖ,²MZ–yÑ W®a ßæe‹Í·ùïaÈKÓšªÄž´\!ð[“®sÚ—(„m¹ ´dÒm{³É;âúIL‰ÉÝœ)jŽ«8Ö¡‚ñù*ÏŠ´>ejž7Ø“UÛí¾4YŠ´ ÆæýQí„¶Âï2Çï¾ÉW8où€=ÍC{ œ®¶¦"ëtai›£@EJäydµUMœ´èíw/Ó,Ë›ƒÁþäØ6åmUoÓžÝÕ--6: L·5y}—×V¨G0ž% ¸”ž­à4Ý”QäüŒE )08ùÛT˜^=LfƒY¿‡Q˜‚öÖ¦ù0Cö¢mÔÎÖèðr2©Àû¦·ÿn–¿(eíÝ*ÃPeE—Ù_Ô+”ð‚ "@0BežY/k#çu¬é`ü\ C® »pÎGv·øudY#œïœ‡D:<=I¹•žXAè|ªù¼Âq´f¸ +w E$û³NxóÁ6ghÒ!ëlü±¬Æ Iò¸dÌdáq+j–|³¬vC”ÇÂÊ„¢F»iOKk±Ð3ÒÊeâ}Ô?Ly( œPT +Ji!Ænð’¢È’ÂN +ålÀIçÀöžÎQáx.ʺuVríù(ÅÆY,tá?Þ')¶~ç\NœZ0È8ÔÏ*iè$‰GJj1"@@E¤/ó)’K³€©„=î\’$°"Š@L”Òßî[ábˆqµ(ÀjÕoü„we`º˜æc’RÄì09ÈÑõ¤-èÿ®Å†K6(ùÎG*v~F™ +´ûê$enk“¡)„>›LÙ/šB‡Ýš°´˜¸˜@i¡éiQT÷Sú“IÒ…ÏøÁõZy åüÍÐFºm«~{Ç!TÎú oO+:Þ)›ئÜ»¼ÞšO¨!wJQº`ÄÅ4Ð5÷ó0 Þ¹)kl|èoÁÝ©DÀs{ùìÛý­G¸`œð·âb ûY–FÈE14E›à3Ë¿ŒÂáÓ‚ôð…ÖM)ƒ ÀéN šházÀNÈžäü9ÙSdJdïÞ) §X ìl*Ž«›Î¯&¶x‘„`yì0w±A<€mÒe½Å|eKc. ³À0ØÀ*‡)³QG«1xèölSCÂÓš;·ˆc$dÛ ºRÆDßÉÐM®Æ8£Yo\Z0kk y¹òFÜ—O†öæ NÒTXEÈòq!eÄ´Å{ÀB»§;*_ìj‰tYídz9ð«ÚZ§åŸ+qEŒ”šÈãÜyF¾@ÙÁØ3ò%ÀÑ*é³)ÊÁÝIh7ë|$öàY7.ôŒ¼ýD쮄 HAÌ-¢ Œ©Zé +‘Œ +‘m½‡À`µø’?LW ß×év›ÖÁÂA¡qŒ)ÜÿvWfSúv`îkçàì´r¿]æõÓðpþ«)yþt<ïÏãuŸOA|þLyÀí/¯öò—2ùÿXæ•qŎȘˆé4P¬¢©"V8_!…®@Í·®¯/Þ ÜäÙ¾6í¶Pu«Öå¼!Í4GÖdµYb²f‹®Gᨇ’J¸€$ãnýÖëWƒê}71\€l\§;ÄkzÝÙ# FêˆuÈ£5G/ݬçh8Âæ$Hʹg©¯DÂóPÇåÏoÁ:~c AÖ]—‹ÃùýÆá= »ý²0 `>@ŠŸ²*é¾ÝT°_JŽºÿU•9"öû})«{çM„/¡ÇÕÒº7|°õM<Þ~½Á¦3„rG©^憶aÜ‹Vž…/xÓZz–ÙÆBÕ4:³K}íûpßiÞx]Ú÷Dªý«sòª¶ýÓm{c‹¶g™»”¤½¿5±jE i^ŠÍ¶>Us§Ñض©þ+â¹-» +ë§yÚŽÑ…®èl'ø›tåéøIbó»´0«Áâ’&‘¯¶%ì‰S÷×}˜’­ +û†‚&¯Ÿ¢…˜öîe¼‘ô^Ó]­`Vê_r(Ù/WÕdªÇ!©Äé”)ê×äƒÎ¹ÛM$s2ã¹Ê”³ÔÐȪšµ«Êåo‰““†ÊV"ÁÊ ­0“õ@HÄ/4Ú +&w%Ý>Kì«<ßú0 KæùW­;§®©:Tà{ôcš€ÍHiæ@òÑ+FVèà ÎÈxÞ¤>fƒœPϯÍÖií"JE#^ÄP€:îÈøî@ørõbæ(Õå +ôT%­I¨\Ò0Úºç4¨^!é¾^þ=@ò~¾ø§bb=æËÕU“·‡Òß³ô;/ï$Án:‚Qá°žòÈ«ã#q@uÉØ ¸Æâ‰w^.4UÂ…$"Ð;x„¹mW›Ü•%X’4ÛtkŒ£Šh9ÿ_`.*/vÛ`ú y$Róƒ:ûxš®í~BF£GPêJ‹µue›­kK²bÜ; ^§à{c‰ ¼£A¼ïß²aÌ•r‡+ÑžóÈÙ û_ þz—f¹§§M—,óûÂ8u±+-®0KkH€Ö#{ÙîkoÈzyµÖn]V¯š¿.ÃK!yæs´ƒI½ßX[Ì=Â×ì +Ÿ1îw~;ŸDZî”Á„D$rÏ‹$Äá¾4€Iz/jŒ¤W=é :Új‡@‘ß¹b€Óõ^v% ãaÚ;n'¨‰!´—ª{쨭}u\·tàçÎä÷¶hOÚï²Uè6D­ ž†äãr=_Vî¥zv ;Ì& K#]¬~`iÌþ_båJ?XÜÛ9> + ¥ –qÏ2îYÆ{–ñ1fSBàeÈLs¬/ZDM¶§F’Å‚<²?§3sd.>ÚS ížÐ‘¾®Ü±ßÉsJòÙßÀtʆy±ìS6A)Û6-AõþмxŒé0/ãó óQcóÁ´X8ÍýŸå©VÁ©íß¡&²˜°ãÏ7ÿëªÿKäÅB)>q[S€„ˆ²\PñåþïYǤÿÎáõendstream endobj -1830 0 obj << +1827 0 obj << /Type /Page -/Contents 1831 0 R -/Resources 1829 0 R +/Contents 1828 0 R +/Resources 1826 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1820 0 R -/Annots [ 1834 0 R ] +/Parent 1818 0 R +/Annots [ 1833 0 R ] >> endobj -1834 0 obj << +1833 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [432.8521 729.0977 481.8988 741.1573] +/Rect [432.8521 306.8241 481.8988 318.8838] /Subtype /Link /A << /S /GoTo /D (DNSSEC) >> >> endobj -1832 0 obj << -/D [1830 0 R /XYZ 56.6929 794.5015 null] +1829 0 obj << +/D [1827 0 R /XYZ 56.6929 794.5015 null] +>> endobj +558 0 obj << +/D [1827 0 R /XYZ 56.6929 732.54 null] +>> endobj +1830 0 obj << +/D [1827 0 R /XYZ 56.6929 702.4262 null] +>> endobj +562 0 obj << +/D [1827 0 R /XYZ 56.6929 460.5115 null] +>> endobj +1831 0 obj << +/D [1827 0 R /XYZ 56.6929 433.207 null] >> endobj 566 0 obj << -/D [1830 0 R /XYZ 56.6929 769.5949 null] +/D [1827 0 R /XYZ 56.6929 355.4965 null] >> endobj -1833 0 obj << -/D [1830 0 R /XYZ 56.6929 748.873 null] +1832 0 obj << +/D [1827 0 R /XYZ 56.6929 325.3826 null] >> endobj 570 0 obj << -/D [1830 0 R /XYZ 56.6929 537.7045 null] +/D [1827 0 R /XYZ 56.6929 121.9834 null] >> endobj -1835 0 obj << -/D [1830 0 R /XYZ 56.6929 505.9624 null] +1834 0 obj << +/D [1827 0 R /XYZ 56.6929 92.0289 null] >> endobj -574 0 obj << -/D [1830 0 R /XYZ 56.6929 424.1332 null] ->> endobj -1468 0 obj << -/D [1830 0 R /XYZ 56.6929 392.2318 null] ->> endobj -1829 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1838 0 obj << -/Length 3726 -/Filter /FlateDecode ->> -stream -xÚ­Zmܶþ~¿â¾uðªâ«(ä““Ø©ƒÆIí -4 ݮ֧X+m—Ú»\Šþ÷Îp†”´ÖùÜ68–¢È!9óÌ+%.sø—Îd¹*õeQêÌäÂ\nöùå{x÷Í…à1ë8h=õåõÅŸ_ªâ²ÌJ+íåõnBËe¹sâòzûÓê«¿<ÿáúÅ›«µ4ùÊfWkcóÕ—¯^M=%ý|õýë—¯¾ùñÍó«B¯®_}ÿšºß¼xùâÍ‹×_½¸Z gÌ—Lá‘ /_ýõµ¾yóü»ïž¿¹úåúÛ‹×é,ÓóŠ\áAþyñÓ/ùåŽýíEž©Ò™Ë{xÈ3Q–òr¡ÊŒV*ö´o/þ–NÞ†©Kü3ÊeÆÉbR.1Д™UR¾<^ ·ê÷Wk%óÕp[ Ô:ôMÇ;{ åV÷·uWßÕG<5ÐÚB™ÚÀŽjWíë-›nA[œ’<êxåV§Î3õ†—óuíãnê…¥ -•Ik -¦±¯ºê}½]¨ü‚¶Ìr#ã‚~¨†z_w/¹¹­7âb=ýî«5oäxöp¹VBgJ{¹"+‘â›—_Á`­VÀv-¹‚P×¾Ö]Õmj긭< ©Z¢\myèM]wôªéš¡©Úæwà_xµëÔ@n„!þPošŸó\Æ!Û—Â3Y»ªº-SÚÑ[ßó›À`ìhö‡ö!œ*ŸŸfßßÞ BUÐe¹ºËB óõ¡£éèwY^ÂæJ¥?S`.+]nypûéú' ò‚ß;`ÖÄJOUçïë£ÿOªéÄ"2^$>ã!N‡:aM╲̴ӑd]`1\þæ~ƒ°Ø ”wxjù¡'ùò\äÏl.óà|£º©|%Ù8€œ*Ã^‚ø«®þm ÖÐì—nQAœzJ;WE¢[í†úÈM^ˆP+°RZM¬ daƒiK‘ SŒt‘ˆ«Å=€Å•i»dŠÂáÁ¤óL短ü­¡]P~iK–œdÓi›  nÄé†?ôݶéÞÜ­~ﻚZ÷MÛRë†{¦g†Žrz0xMëBcD<0 - Q€Ût†ôûƒ©Á™žD+©¹+¶6Ø66Sru×ÚÚ¾{_3vo˜¤^ØÚEX“Kð f&[ÊT?aýGÙõ]‹ö$/hóð:š;„özàu[SWâ¾ Nawäj»² ÇÎ×ÿ<„²b…vOJÀuÛ|X“23¢ŒŽ'?<Ž&c3­Š’?[ g2[ò ›„)»¬¢˜‹â‘•$ø|)FGC86—¯Y4QDÉ ý¥ »åù;ZKϬ³ÈÂ驱Ȁ‘»%”YQ—ˆËŒûf¸†®¢Ÿ»¦¾¿*å*c‹&ÇAt2Ë+œÞ‰ÕÄxbuìê@wUïÜÐS MGd‘3FE‚V$hEx0îg´pÜ_EZ~`Ç*°¯x¬ïÐBÇׯ­Vm‘®ÏbêW'v*»iº%å¹È¬p_à}-@øï·ÁaEÑ*ˆRÉOÜ=W ¿›Û -ôz‹Ø/lœ•óÆbu: ÛÜòBÏy:Š‘ZU÷@{ r$¦MÎ`¼}Ü4TJzF>–¶â©Ÿì$¶njî96ÃŽ`zjUôók:vO!¦?[à´4E&EBåGœÎ~íÚ%nK:VÊ‘ÛÚ*ô±¼ ýàXÚï£kp2+´9“.“tE²‘W²Œx -:Ø üú¾ïhdì9ôÞ77iúâ{ÚÎ -(Þ’e\âXB´úÝlý©é„ 9ó1JãèÆ/ŃìÛÄþX ‡~:JͤõÐV9ýú ÈÖ#O¥Y½ÅðS–ŧ²©HÃ>±8«Å$4¤‘S†fuÀE ˆD|$ïèÜ4{Á÷žãz°Zåbéá¾'K2óäR7U7uõåªþ bá!ú𡽨+ð¦(G§ß?¤(bÛÌ6`“ÈeÓT‰FÆä/ƒ.X: -g ¾çmTûžH•¤¤žc^­L«-Èv¾6¹“ÛþÔnç.¦j﫟Æ>TÜ* ”#ㅠߤ[ñ”Hó¬,Uôt[°TÀEäéG_áÈWº+Ć Òy©£+Ûv€¸nûþCå›m½°º×'ŠзÐáðKWìÙö¸i|i³ÜFƒà[öå%Vtæd©ŸÆ> Šé5ë%ì+Ažµ÷ž2HB?£“TìC¤ŠaÞÈRòÒF5GKp ÖÆZwÛÞeßdýñýR4n²Â¤40£˜²SÆtªLñ¦#!@O JKR0|3=¢‰Ú5RqóÜß(ßÔž©Fê7XœšvàÞ.Iq)P‹„ÓÏCó3ŽüŒÀD1ç'Eõ讫n®\6Ív[sJ” ¯ÇLÝú½5û™ à•I"ˆ$ÓÎv¨o ''æAÆbiLš+rŽëÂæÞÆœŠ«bÇj¿¯ŽËzÜ\Ðñ‰‚eZïBz‰ÜRL¼1s[üÓ¦­¼ÿ…Æÿk±nQ ›Ûõ¦m`'>Ž ?Õv{‘¿ #ÞµÁ.cÿ¿¿xœÎ¶öCÓ…Hó#&&ÄŽ5øJßÜÕk -ßqüCíßõÇw˜ˆáãâV~š°‡,ÓÔ“eÙ/Ÿ˜€Šú.¥ºçsÖ‹ ¦ýŸ#èk°½:·#ìSøºFð¡zö1ˆHÿуýYå4®—‹He&eÝIX~ÁÖjÈ/œ;Ï÷qyŽÿ ÅùðsèïëãîR£bµ«Á耈Qöa(…#c5ÙR5Ù& e!¹æT¹N³}}¼£ìÚrQj6ðë×o©ù*¹_ÈWš.¿›Õ¥4ú¢œËšR\ -!êC=©KÄÈàþ–ã—†« -•Ç@ „jõj˜¿ß¤A©Ü&Å'6©%„<Ûdð@  ¶YQˆˆü~7J'4ÀòKå«2+l>fÒè¾bRfÆ„hü#Œùåh8wîûòS@ÝNGXÃÆÄÛR‚- ‚ ;Øðá°ÁFI+? -6•©BÉKŒuµ1æS\OI. b*;YøX³™Óœüa{LŸØ#ØÃÌ¡ôf›| k¦ib‚µ(œÐxk‰Bàj?k³˜l±4)ÊTÅ$ÀáU.Dô˜3*¯Ôìú -ËF¯n y^¼ÓOˆÙ&½Õ™°eŒþ«Tä›áDãÌœâG+qJrQÛzWZ>I(6)Etbša;˜‰XœºÛ*dŒÀ‰ZÕž³°Pƒ¥w)r‹ÙVI·¤ì«Kòçt–Ž -þ·p)ó}’{€5•ËOr€©ÿ ÷N‘ÉUñ ­çà ÕâÕ„I€lT° +؃«1©òpÛl°†juÌ:ï°þ€÷J+ܾØ×Xmüžé’ׯK^¼”bŽí gxéë¶Þľ8p,²¯­„¡¥ ¡¸$Y…«;¦7»ÈÅ!K‚\ÇÓ-¤JgÙÍz!mpÓ+ƒÂFþÈBªpéXˆUéžú¸BEKL» jöOœÞ®‰Q©”â«xSǃ&˽á­Î´fÂ\•®V(³¢+„mêñqG¿Ëu©ÒeN*ódî¢S)*¢žè6üë›÷]u ®Ÿ¥,°¥©ÎcÆÈÚfQG,*7¤!¾oé¶ëÆÃ›¾èΙŽJ7<^žŸéGºÂM“Çgw¾*YþOdr²ˆ,¯ ›!^ ‡P€/–À™8+ļVø>Dî2×)Çæj¬YçÈ´3“K…z:ÙÖê…dÈ2ŸsÁœ“Ö…%7X„¢ -?Žf6׬æ:9W «¹~¬ì YzauñÄve&”Ü.IÈ ¾| 5˜A£ ãg´g5+4"Þ$ٜܽ 4|HñUÇ-A—všÏa/î2|øãÜYÞËVo\G„Û -"ÂÆŒÓ'èx†»ÈJŠerÉ„5Ë`pŠ(õoæ¸|· º¥±Œˆ÷PØ>+h`èÅÙëQŒ“/?øB4¦ËX(¡@NéòY^Kþ.ÜÀI£¸¡¢z)®U{z``³éÆ ÀÖ6FÛYÁÛ/—áÔÇ_Mmv¢*9QŵK•*µÃqK[1Z—.Ë?aL -Àfp@ØÆ‚§íb샗ôò¸‡CP²Œê­ûp³Š­Ñ’߀.¬Ê4Á|àÈp%J×FA+¡oâ´)øš_„¯+xÀ:9Ø wVí©¦fÃăðžM - çãº%œ>ö¥UVè¤ãŸo‘É%ÃUjÞ–Ž’,5Ý—ä^JP<·–«ç-}]¾‘oÈaÈÎ’ÃlÜVwõŒ=„£òØY<vÃs—»6 -ò[.¸ì§<Ê´@ÊßMøzüha.8¼j§-³V‡˜1´¡ÔÛšo¨€©ö‘êô°Ÿ(1›Óò³3… Ùcß¡*H”Zúj4O¥ÞÿûÕñ^]d`Ðåòç§*·xÓUÄMá \q¾óô1ëÇ[ÿÎ};endstream -endobj -1837 0 obj << -/Type /Page -/Contents 1838 0 R -/Resources 1836 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1820 0 R ->> endobj -1839 0 obj << -/D [1837 0 R /XYZ 85.0394 794.5015 null] ->> endobj -578 0 obj << -/D [1837 0 R /XYZ 85.0394 500.2755 null] ->> endobj -1789 0 obj << -/D [1837 0 R /XYZ 85.0394 475.2167 null] ->> endobj -582 0 obj << -/D [1837 0 R /XYZ 85.0394 345.3976 null] ->> endobj -1840 0 obj << -/D [1837 0 R /XYZ 85.0394 314.7239 null] ->> endobj -1836 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F41 1208 0 R /F48 1228 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1843 0 obj << -/Length 1604 -/Filter /FlateDecode ->> -stream -xÚ­XKsÓH¾ûW¸8ÙUh¢½7§ ˜ÚÖx÷R.EÇ*dIè‘Ä»ðß·G=#Kñ$$@ù ž‡úñu=cѱ ?:v\â,{M“:ãh;2Ç×°övDåCm2ú»^-GGg–7Hà2w¼\÷tùÄô}:^Æ—02 æäõ‡ùÙìíß‹“©gO–³ó©Ásr6ûó¥·‹“óó“ÅÔ ¾C'¯ß|\ž.pÉ•:^Íæop&ÀÇJ§g§‹ÓùëÓéåòýètÙÅÒ—š–äëèâÒÇöû‘I¬ÀwÆ·00 6ÞŽlÇ"ŽmYj&}ýÕ)ì­¶¯jñ£&a–Ë42¦Ð ˆk1«ðŸ©ãL~[Ad¦3 Ë)õ'QVr¾*x”|6MT,p&³5.dùÁÞD>¯“ž½™ÚýåÙ|¸ š-¥Þy^Këõ&¬…äNÂ4UÆ2C½~³wzÛTµô"Ïê0ÉDZƒR8k 1u›$«Qú7ÏøK«$‹8Šy–îPª7rj&³®bZB)Dù¶HR`´ˆù:lÒzo¬"7>ñ¼ë¶…ÏaÂH‡8Tå~XháMH"í%ѵˆi}BAnêgšÙĵ¹§ªÃšo9x‚jÑSªâc4‘Ùk 1E`‚ÆúA1´)5„rnÖцKa¶Ãõ(Mx&w$j±©sØDÔ]‹ŒáûĶ!K2]P„H€ë106@·i@UÄÔlNP8Év¨¨iæX -+‘oV±ß×€%4wunP¨\hÑk…¼À•”ßðçòõ`í nJ]©@¤Qî/wWI, #F(óˆ· kºäóÍÉÇg–5JÂñ¬7-ð~¿0½sfEš}2«í\¤Ç ûÄ(/D •KË#f`‰ºo“–Æ …EÑ’LÌ÷†{nN¡¸p¬<…LÛ¦‰¼*2©€ßi%µÆmèä6ð† =ÂæéIcö‰ 0ã ‚eÙ@D‡ÒàF¡ãRjý mbzû€aÙÛDgŠ¢¦D1iëCgÑ2‰íôÇíA*v*Ãb ÄtTÃj7½ã}…Šlzü.Ü©ê k¹(Ûè®d—’%Ãy3ÿ$çxÝR¯Ð"\l tækMœ î¶ãý\˜à^{P+p­Âv†m{ …÷Z9/³0}ãÿZ¬,‡ø®ã [×ÑnY¶ÜRµÉ›4F¹m•(æ"ŸBPºq”ñú6/¿ôŽ^õ¶¯ØY+åJû€[@û;òqâû±R±â:Ò÷îc™ßˆ"j%‡Úªà¼–þòò&‰ä@Ptà¤Æ+¥tà—8Jµ1Hk¢Š};^=ÝÓPÊE©ÔrrŸ&Q|­Ó¹$K“À 9ÞrS†¥M,ÊíÅqÉ«ŠWCýÃŒmòª¾Ÿ.ºç<PÏ“ÇjHvö]ÁU½T`êXçü:Iï)7”_$¾zq,鬫ÑïúEÖ_¼—ŽøÝ¹0Ä÷|_õímî X²¼îñƒK²\íöé|${EÉo’¼©öÕ MÆÃÜãäÒØC ¾nªgpF5XëÛ=Ndù£~è(eZ—IT+ì~†ôRÈ{uÇ -¼%·Ð7WpþªQE@–äJÕ¥Žì©Ä`ñ}8žC ú1T&zÄÐê1Ú³¨›^ ã6¨ -\·ûKÊ<¸É™„â(ûÔ» ‰£e¸Ý­âð()w õm÷PBZeáV/Ú›ðå1I×ç#vÑq3¿5¾6¼Ü ù]pÕ2h•&Uݱ¥}^êR|¨ÓPåýÛÔÖe˜Uk^þŠZ M‡êpù ¾¢:£È*Ø4T[ø6°ƒ{W¸wU6ª’/!—Ï§Ê hªÉz˜É¤X‰H¤Î"/ën^ ¤¬ß"®ï2-NOÕÓ>Àuå±&ãžApD_ Qõ²c6ó6,³oë0I¿%×Y^r˜£ƒ!ƒ·w?¯Žªƒ?7q–qw£YååJ4ñ'º#Îíë2©w÷<9ª8 SqÞË+üŸv¨A÷Á -ÚøÊ¤ù¼dv­î—?fí¿ôÙ±|Ÿé¿S1.÷>(‘N‰(}ÿÀsõÕëÐõÿ82Z[endstream -endobj -1842 0 obj << -/Type /Page -/Contents 1843 0 R -/Resources 1841 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1820 0 R ->> endobj -1844 0 obj << -/D [1842 0 R /XYZ 56.6929 794.5015 null] ->> endobj -586 0 obj << -/D [1842 0 R /XYZ 56.6929 267.6943 null] ->> endobj -1713 0 obj << -/D [1842 0 R /XYZ 56.6929 239.3021 null] ->> endobj -1841 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1847 0 obj << -/Length 1107 -/Filter /FlateDecode ->> -stream -xÚÍX[Sã6~ϯð#éŒTËwÏ>±4Pvºì6MŸh&#lTË+)Ðô¿Wò%qˆ;¡³;äãèÓ9Gç*d˜ê‡ŒÀ…¦:†:Ð5‘kDóiܪoTýÔÍ}œ ~>·}#„¡gyÆ$i`Ð dLâ듳_O¿NFã!°\óăCàzæÉÇË«_JJXg_®Î//þŸ}çdrùåª$Gç£ñèêl4(p‘ZoU/,8¿ümTÎ.ƧŸ?ŸŽ‡ÓɧÁh²‘¥)/2m-È·ÁõÔ4b%ö§ í0pGõbB†–18® ]ǶkJ:øcðû°ñµXÚ¦?× X~‹ÔP 2:¡oøn=Û² ^gš' MI9’Óì¶œ(‡©–Sm‚¡ëZÍ…s,$áz9HŸcY’ÿ2]S’¥\sü¨æ¨3ÞßlÁ3œvåíò²Õz èS-šÍDN¢»+1·2°,]­Ê…ì%E…C¸(ßÿ)‡ê+Íg8ŽyEË—º~™îl!¬÷+†;(‚.n°8ìH‹Õ gsÓ$!œd©äX1c|–±®0ržƒ>¶õì£*%ÙjÿŠQ÷9£žÑ ÷g4DÐ*RO‹:ŸXF€XR!i$u]AoÁNiLå -¨x@øCšg}]¾L;Û¢ÆUO¦,d,®#\O÷k¢èË(¹ÊÉA%Æøç*Ôr’(tp<ís"ùêX>Ž‚PÁF¥@N"Éxvr,ïfž“Bà… -tq&T”¬iÊ×uV[Gœ`IÖ,I:ðòD8Svª'2}Û›€eÃP¡;hªz¨ö¨?kªvÕ­ÓòU^¥Xˆi]Ä襭°[{)~ ^ÓŠVh¦­ª8Ò¡‹1S5dt7KUÔxµà±öA¿-ÿ_0Už<¶Eþ:ù¿3·‹\€¢×åçÆ÷ß¿BŽîHtîÅ}§ì½š -OСýJAl‹>E@£iu)A³r~h‚)BD”×A«¿`8¬Í »–ù9°¡xV{!ý~íxmŸòlµó‹mQ¡ì(['˜¦k•š'oµA»GNqºÈ›óË%­½©K#õûRtD_jý0})ú¾}©õ#ô¥èè¾Ô:²/m»%²]¨¯vZîtÔSízô ÒözÍQ-KX›Ë!Ëj\Ù¦+ôk¦´´AøœóÍUÓ>ëÿ7ò>×endstream -endobj -1846 0 obj << -/Type /Page -/Contents 1847 0 R -/Resources 1845 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1820 0 R ->> endobj -1848 0 obj << -/D [1846 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1845 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1851 0 obj << -/Length 1084 -/Filter /FlateDecode ->> -stream -xÚíX[Sã6~ϯðcÒ ],Ëš}biزÓeÛ4}J™ŒIЬcg%e!þ{å ‰ ˜$Û}h‡a"ëòéÓ§sŽt„=äþ°Ç"<.|ÈfÞdÞAÞ•kûÐÁeðØ T{½vŽN)÷ ¼á¬‚B†ØNGÝØs¨{òùüôì߃ã÷»Ã³Ïç=@êžžýÚ/JÇŸ>z‡ wO~9þmØMA‰ñþìüç¢F?[@ýÓþ ~Òï] ?vúÃõZªëňf ùÚ] oê–ý±ƒ !ónÜ‚XâÍ;>£ù”>ÖÄ?:¿¯+­ùÐFý0‚„¤A@W  ƒâLÀ€š 8ê¡î<2VjS|Œ©¶EQ-ÆÙÇEñõwñób¨6l+S¸_‹¦SéãaÆ ¹ã‡1Œ‘bâ†I²ÞèI·/rUôr…‹õü¸(½+ C˶‡²ªOçÆõEßu;Ó N¯€Qw²¨N–óK©k4SÛ X%f&5PÓX•(]Ú¶Hx+’UóÃPÊÞ@©†”¤VÍÊ\I3Nõ8Ik&#o±š¨ºÒ$^µ^}1˜Ê8*9I“©y#Y`S`Òè çÃË˵ÕVeÚV6V«äªõúÖbÒ¥žÈOª…_x]©`î|\@J8sHû”å@?åM -ίR¿q¬­!à‰{… R7¨Q†'<Á· J5xNUpH\„ú>T ¢.JrÑH5Š-x“¬´Œ“¿…«¿+W‰ ]ÛßÀõUi Ás´—6çÁ9ä( ^ÜM¦á èS4ê½4lÕüWkòõVžpH9ñ·iÀöóN!õ…x)ž´õƒS}—’ðF¢wi"±‘u繚˜ÆpÝbW¦‘.##Û†·ú™£ åLKs9;\»€àçL¬^íËc?ˆel(Â]7äNê$ùq¬_‡„BóX\aä.WåÍYmf4ó'ÑãBG“82f}wÌQ¬]-Ê×*±ïš´˜©¸Ñš^°AË+gÈiR¹=´R®¦þäZN¾€lMfãµ7‘Nîg‘ŠïÕU’jùìBZ®ùè¨ø=OKÇ<›/b9—‰•Sø#u6vyù’xQ§7àëRêUíæŸ…*iÌxÙÉuåÖÿÐBÉ -¦Û‘ƒÁîºA/XŽŠâå¢Z§‹ÌZÍlo›Ñ·¸ÿgÁ"f©vªn”±òÖÞëèæ5EêDRínP²UÝÏ”6vœu¢Ynÿ¨ž3¶:Í\ÆWsµ‡Ö²ü“Üç§û$•ÿ§GÿRz´ÿž0Ȉ mó7åLÏïê9ù!9SÓc uÞIiÓÓû/¹îýP¸yEõ]š†dýHHå ðú¡)IeÜzÆüñEñ9õ9ˆŸ:endstream -endobj -1850 0 obj << -/Type /Page -/Contents 1851 0 R -/Resources 1849 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1853 0 R ->> endobj -1852 0 obj << -/D [1850 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1849 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1856 0 obj << -/Length 2052 -/Filter /FlateDecode ->> -stream -xÚÍXÝsã6Ï_¡GyfÅ%©ïÉSv›ì¥s›¶Y÷åÒL†¶èX­,¹’¯Ûëÿ~AʫͦÍË‚ ?¤…Çá'¼,f<Ì#/Í#s{óÕ÷aîÙ°2 -¥ÞMÏÞ^…©—³<‘‰7]èÊÏ2áM‹;ÿý¿.~œ^ÞNs?a“ N¸ÿîúæ;âäôyÿÃÍÕõ‡Ÿo/&iäO¯¸!öíåÕåíåÍûËI ²XÀzi5|eÁÕõ¿/‰úp{ññãÅíä~úýÙåt8Ëáyñ ¿ŸÝÝs¯€cÆY˜g±·…g"Ï¥·:‹âÅQ:Nuöéì§AáÁ¬Y:æ¿8ÌXœÉtÄ‘8p Œ%‹„H½4ÎYÊÐxðnÝ´ý$H8÷ËõîitNŸ{<£ˆ(dQ",cIkIdÓé@U}зªîº ºfÓÎ5Mît÷дus¤*ú£©uÐõª/»¾œw' -FÌÔˆC5…êÕLuÖ€®oËúñ¹ÅG6¬Ê:hõ¢ÕÝ2èË•URoV3ݾ\‰úü”ˆ/-éÛÝkíxŠMÕ—ÁJu½[ô\@²‘t ¿ÎÝ4.F{÷‡Z9 ïæ•ê: Ã?ÍÒQµýn=Ä03èlfçÏœEUU³ ~ßèv甿( TÝÃJõóåCè#þ_/ðO§Û'€¼U¡»#ÅwCbáü‘¿cNùs{‰‘½ÐS£ûàÄÞúû—âo'ÞiœåhœÃׯYžÄyÑ´[ÕçÏøÈŠÐàó¦®vÿ]”m×ÃH¼÷Vn¿Ño•ІúhûBWúâÑÔàÿ6óNì<ÿ&:Þ^Iá ìšíˆKRŒ-Xfй5ŽÚí'€¦^麧áwúÎe]â¶ÄQuAÄÏzÔÃ>û懈X‰è`&ìNÿvšNrðóò뤵 Áaâ…"ƒÃÉüEÍCûÎããÞþ93rë«ûÓ:ª,éV« -†#2‡‹ O^°÷Ë,Ëàèn#¹Ð¶rµ<O#–Š<ƒ=PlºDÏæ®x½TU2Ë}Ec×^ž7ëQÍ‚„z§;QD s,¨Ó`XÛ²ªˆšé±TS³ÊF½oè»n'"ó›§²°jÓ/›¶ÄÊøäXu·5UdeÏN p›ð}ûºx!0DžÀMYЍ¿»â«Hs–ñü«€„IÓÄ“YWG@W©'=ÁÒPØð_`LR+kH¨Ì/;â(úßëuUÎÍSü‡ù$V ÕHJ°/ó]òœ¥QY3hm7bm˜²T:k©yƒ×z^¶šE)Ü}³è=X‚´AêÛò&·ÄX5t]ÿH³¦e ›. -fåÂ.p‡1Ê+Ð/Uï(»‰s&ðæPwÇša¯æ½S`°ø›5¤]VÒdâ’m0$q» .Cî´Þ3ÖG ¥k²S¥jb«ªkÆÒ ’0Áµöú‚$nj¾°k‹d6DÊðq¯Œ€ùïvÄ+ôBÁô Eß½9ìåÜÀ£y¿ ,_¹©ð©yËTúqHÓTàK®Âä¡[. pOG†•3+8_ªúQ4 Ú„2eÄöîl78ƒ»ÅμXÂ(Bì‡QlD†»¾#w¦ÎpÎŒ#d!hôB|&Z#[“¬sÚZ›uÁPÆãȇG–qjÑ;®EPda´' -bye™îZxdqz°|ß`Nm1~EBP3”—t˜TDζì—DšŽ¼é§ëDý¦whVÌsÿzaÕ’.ÌðÊjÃsâ×ÄǤ~ñf4ñà\ éÎÄQ] ãÐö%œšY‘-´˜~XØ8fS Cp1l é‡›PUEªìF]FÈĈ‹˜ZdÈ¥µ­j S,gŸ8²65Ø´ -|}¿ -á)ÑöXŸ“ndnÕ­±Ï©—\P_tÍ›T™ÂØ.$cYÏ`Oßfaœ‡k >ºèˆ=@i´h³&!º!^K«r´€ÖP+mÇöå~ Š+€01·N"Må¨Ý–E¿D îß4NÂÕpw_áŠ*Õ£• ¬îÆ=óî*R˜‚F]wÄ2É œå¦¶YV¸™…•]6›lëèý³Ÿ5I­M‡b‡|a‰Å7MOãÀšij¡M`‰CѸß6A­ˆ åßT7œêæK½²Òö*%‡khAaú£”¼"¡ÐןGæVëJ¿Ùß-¡\W@›¶Ë\•Ïì¾æ‚p|÷‰Ëàá`¯ú³Ùƒ,GnIÆâ8“îÖQ>.{Úe]©¹výCÛ{…ä,ŠåÉ3Éf2Ôehî=õW•µ) @)ú ‰¢Ðc ƒG¬$㩌ëß>€,ePe+¾]jÛ_¾Ô -PE{Å#Ú¤`ðHtî°B'0xv¥Ççþuc€Õ‰"ž°¸Û†ˆj‰ÛÛ ŒMþ.³ -¡Ãð ™4úØ8e ÀzÁ! »dóªCÔL/•»ú?™?Žêªf[Yº\Ðw×lì+bc³ß–œMѲՃbéŠ êSÜc¤(máëØN@Éc&sÇŸ÷ö×="|§žQÄÂ4ý³™{Î7¯þk{ÿ¿?\¯áæ'‡§Çñýœ',“yê…1]”üKo¸?ÁØñÿôZ<»endstream -endobj -1855 0 obj << -/Type /Page -/Contents 1856 0 R -/Resources 1854 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1853 0 R ->> endobj -1857 0 obj << -/D [1855 0 R /XYZ 85.0394 794.5015 null] ->> endobj -590 0 obj << -/D [1855 0 R /XYZ 85.0394 385.7919 null] ->> endobj -1858 0 obj << -/D [1855 0 R /XYZ 85.0394 355.678 null] ->> endobj -594 0 obj << -/D [1855 0 R /XYZ 85.0394 355.678 null] ->> endobj -1859 0 obj << -/D [1855 0 R /XYZ 85.0394 331.2666 null] ->> endobj -1860 0 obj << -/D [1855 0 R /XYZ 85.0394 331.2666 null] ->> endobj -1861 0 obj << -/D [1855 0 R /XYZ 85.0394 319.3114 null] ->> endobj -1854 0 obj << +1826 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1864 0 obj << -/Length 3279 +1837 0 obj << +/Length 3765 /Filter /FlateDecode >> stream -xÚ¥ËrÛFò®¯àª2áÁ`0vOŠ-%Nm”]Y¹l’ÃElH€!@ÉÚ¯ß~Í$AW¶l• žžW¿»Ád¦à/™e6¶¥.gyiâL%Ù¬Ú\©Ù3Œ}•ÍÜÍÇTß=^½¿KóY—VÛÙãr´V«¢Hf‹_#ëøVPчŸïï>}ÿËÃÍun¢ÇO?ß_Ïu¦¢»Oÿ¸eèû‡›Ÿ~ºy¸ž'E–D~¸ùçãíYYã»O÷Sò㢷w··÷n¯üñêö1Üe|ßD¥x‘?¯~ý]Ípí¯Tœ–E6{…'e©g›+“¥qfÒÔcÖWŸ¯þÒÔ)þ]Ä™-ÒEg‰1—÷å=ì+ ¶i¬`ôñ¾ó"‰­ÍQ:ÊÄeŠIFBI´ŠKXh–gelS’Túaÿ„¬y§õˆØqn4nD7ÀË4gZ€lôß®­×ô2ÖlšµÛñðÐ1ÒÉØÚ½Ô‡‰ï,£úKUo¦VN f`ÂÝuRDõvÝTn¨e®]¿áYáTó$‰Ë,Ót¼a«§ºŒî?ã³ÉUGÏEσݒ¿n\?Ô;FñuÛ´€u‹ãaýº^û0õÑØè³ðñôlH‚ÇWIäüT­TÔvƒ`ù½\»`ŠlÝnà1<bèˆøxÿùïõƸÑêaÑeí†ýßoëªùM)]Ÿ•-”Ä6Ãûdc#k6Ûu½û»¡éÚxê¦Ä`‹ñwNuU®eÜS͈}_/ƒ»!¦^ƒê´ eA¯hk¦Ì¢e·cÔóz/˰¤Í‰¤§ŽÕàÒÅ4±ÈUšÒŒÑÈ €ú˶¾N¢¶—wRxn\|hÚ¦}–™Œgó@„_4Ç}voS¼i#gIu“ëßIØðlݦöC»ÔT¢^,øü}Oj(¸ Ùï±±[ºÈÅ€q±E\uírÂÖÁäà„ô9MÓèqÕÈúûÞ=ËI…W™k ÎS{ÌiRéìÔ e -³ !’…@[¿2ÇAU|ÞïH©zð iV2gpœµ¡’ý~»ívC?)fÜ»°ì#"Á,"‹PË: à^ÝÛu’$xÙÎúIHeG€ÌûŽc’ÒËpÃεý²Þõ²Ór´~P¬ù”°IÛ´õŽF[t4ÕzOÌA<[¨×8|æÁppIo݆IľZ5kQ‹–1¤D@#~ÕzW5Á8tš«hS;²Š\Ñ<¼?¸ b# úõ¡ÊîѨBsÞÉôªÛ¯ >×´ø!d4¡^›aåéÚùÔADȪtnùVftÕž±,_„ð`8ȼ„÷è4ÃÛ àIóÊìÈ àÀsXp¬4)Ë@·]Ó²ˆÙ4_Ð:¸ñŠö2ânðž8ˆŽðÍ_A—Â1b…¢ËÑÊ«fRÝG -œ*´VYjÉÃ1VG êÇ<|ˆ?¨äG`™f7ÃÌ?L8bT”­\Ï‹i∢ŸÊî•lžÖ]à9“4rë5Kˆ3!gP^–=ãY˜cÊ£3€œFܺ捻ʑ…"D¼o6Ž}½ø_‘|§L…;eêìN_‹ŽªÑ@ŽŽÐI ¢8© -'qLˆ?Ø¢Û8>Eä‡#åÓåÓ ¾[ïÑ¿†Y§sèëòè¹yA‚à¢Ã0‡pA\BÜ#¡áXŠÌPšjOi¾S à x4¢Û«n×`ÒðR{椵Ýqœ·yæLæ3DA·ŽýÀº§f¯ S¶»æER ˜R¯Ýî~Ù÷óét×·6z¸û”IÁ/£°+˜¼ñ ‰ ž§zÀXq|6äÖ°ìœÎÃ÷É¡7í»ÝÖMÄð2!j'Ã)µ² ,…8àø”J|À'$2õ®uk¦–¡g©¤`Rsø÷›'4Dz&k † /l¸™ò1 Ö±ø´23…‰ ›ÚÙ¸žùÆɨl¹K–Ä*ãúì¯.ê§\*¼4”~¥.ìtáUXffJÈš bæÊ/(­MóQùU˜£)€H½§ƒ!ÊÕs¨Â -N°éütžg¼T”“ˆW‚Zvëu÷Êðõ—I3ÁÒ s¶¿aòSúÙeX:ľRÉáJ9?¸ú7~ŸŠò äPZ’®´LLÉ×äQ Šƒ3X-„Pk @pŒôaVK( ²DG¯+òx‡Rb¿ëÉY"%žŸm]å;È䉒TñnÊ‹ý¹¯wrCQõ«Í¡ZQÀ€[¹1?‚<ËP—ž¡@»î€cP…ÓJ5ád³'sªL¡U‡tb-½KØ¥".¬5.0`zÂh’a‚!âÌæ…PMaƒè–ü„ ç’°Á\À„×hZàïÆqÈ"„³àþÏ¢+óüߤvYªDí2,å{Æœs G_ÇÃâÕÀê§,‹ËD{‡*üÃüÄÕׄقÉŒ‘IÈÝ󕵎ê.,¥UVÄF•ÅIiE2;ß0M ÊS™,&ƬêØ:™WsOu’÷ל;Jó!* àéK]ÎER.à9€Fúù(-†8#I¹8W¢^ 62l‰”kB–¾È7è÷°Ö÷Õÿ ücÌÃCÏ(¿Öœ SÂ^mÕT« ý‡¾®=æ1‹ýf‹îîBó†3dÍ“£š_ŸÞ&$[äq•¦c×.*™ ,žžc¦;¡8µ´Í%x¶FÂIçŒXbeYÒá!Y'¹Š3{"kX oõÁeÀ,v,ž⌄ä”nàø ó‚[¦‰óTû§uS1Œ<š´Î{JÊ ¹X´vÈ!È[6” Á8éI\ÇÔ Ð°M× ™dQ©–lPñD¥? :.ªØiiÇŽ_Åß~¥VÑ!6bä3îJXŒÞr¬Y5OÜ[ y­¯ U5¢|:„˜~Ûq[„‰(ôp;y´»_>ß~œdë禭¨­šJ¸€;JÔMÅc‡[KÔüTÔM!7îxØwv5Û~ݺ°‰«H;¦°î -)ZEÛµ#zHƧ9ÞÁûq¼ÓÊ·OS¨wï˜6‰°ã²,Kçy] è輸¨O·hª©c‰Ä„ë¨? -Ráa¨7[ìn¤:¸(Hr[žv)¥Jli5K©·6è¶žk`Ù -6ß±ùO]¡"LHK1Oâ—mÝÂûì%?ï~ÄO7¿<þ0YIÞ:vn' ÄI[šÞ5‰.½5Q¿]¹÷¡„z®ÛŒÝÓ‚3Ÿ*[©ˆ½kGøØµJ €nä–R°3§/4ýÅ -`œXc²~¨ˆ‡™²Åÿ±h˜r©H ¬p“>½ëÒl¦MÞ™3¡n÷êv‹‰`çq®àÎ!ù7¦Œ~ÁSä"QÞ8Ào”­*öŒ‘F¾SùnÎt‘£5IëGé¯_¨D»ØÙômdÄÇRÊ_o&âce£±ã\åüî:ó*8}uà ÈB oÛ©œ øV@#s/ó7-b›þÛVåäøÀžAîb#7±~VÆú  >mËuœ—Y~Ú¥›<vÏ‹¢8¤‰ï}àh¿4‹smŠãû`<žhá§1$Žgl{'½WɇŒõ~ ·Ý’Åcƒ¥c”ÅœH$° v9¾xâ‘Ê}®8( --$ŸÞxXèòЙË)Ÿ%M±Ñ§¥ º©d9Iã ÷þ+<€,7â'xáØ,†”;;VÝ|’lž[‰2 9ó¤:‰Ÿ8Þ\7½-'…—Xp !üúÁ5ú8ÿýņù.|€”0—fX‹Å6IË“êêĘS“$N‘Ê`k¢„‘Î8¢8©2ÒöÃ^ï¸_aø_‡Å„ÎBTåv5ô«cžx"N’¥ï~ŽôÿrËsœG|cn‚¿5jBR&RS¿HÿÂäoþýËáÇA&Ó¢Ð!:~y›IÉ)ÿJ}öëœDÅP–hO5:úÿ_A}ˆendstream +xÚ¥ZKsä¶¾ëWè–QÕ ñIÞ•9ö:‘ä¤Rë=P3”D‹CއÍÊUùïéF7øµ+ojÄ4ñh4úñuƒòXÀOÛ$ÚÅÇ©‹£DÈäxµ9Çwðîû#É}–¡ÓrØë»ë£oÎuzì"g”9¾¾Ìe#a­<¾^X¼ýÛé?®Ï.O–* ,#ß]¼GG·?¿?¿øþ—ËÓ“4^\_üüžÈ—gçg—gïßž,¥M$ŒW<à Î/~<£Ö÷—§?ýtzyòñú‡£³ën/ÃýJ¡q#¿}ø(Ž×°íŽD¤MŽðGDÒ9u¼9Š%±ÖR]ý³›pðÖ“_¢m”X•Î0–Ja#»ô8M\d´Ò^‚N–FˆEÓîŠêŽÚEU´EV.ò'"TûÍM¾û|{8Á·ôøEÑÇ(£ã¥Ò‘C‰,¥Œ\’(¿ö¿Å—ßœ+yÜ‘oaSËŽX¤tÄx**†#0å&«²»|¬5tWmÖæ›¼jéï»üW!n ®ˆ’UkjüÒÀP^P äë)¥±‰ýz×÷yÇÕ@x.Š“úb—Ï'462±ˆ¹s|lX³(‹‡¹Li™HÔîöMûò +‰‰b:î̯ië9 +&u‹wﯮÎÞR»ÉWû]Ñ>á?»ØH»¨ë¶m×.õ;öÝÖÅ-¾ºÍ}¼Zå4 à)Ûû¬a}©àôllãñé~YJ:AÍöW×MNχ|ËGºßÒ³­é¹yòÑîÛz“µÅ*+˧)¥¼8í}½çñEÕæ»G8€N%nIž÷ž§£]7uùˆJ”z›ï²¶Þ¡ˆH‘Û°éH ðPÈýÕ~»­›VE²¸…K CòOÙf[²—ž§gôø£®ò¹øKCAN˦¸«¼1‡Œ»¬êÍ–y/š|Í{ Ç×~'Ý̾Uªœ¹¹ÏB·ÚoEŒ‹vÿX?àÈXó¬Ð Û2[ñZÈ J½¦u‹S¤ª‰±ßá¾XÝS“˜NR—ë~6ß(*æ`F×´ˆÁTãä•vâ"›Äfj‰ÌU½Kßät¸Ú€uNÉÚWÙM‰Üj镟YY"zê=š¶XòÐʪ'j”uu—ï¾EÙ«EÑ1,Í _Ë3Ðã +â[’,þuŽZxzñãpT³­«†\ÕëO"ÕñCëÌ÷ªƒ¨ö¬ú{øS¾Þü?”d (‰u?üù±) þß9ýÊcƒ@íù±ÛžpZå‡à4‚BRÐq +&?92Ö‹[ôJ-îëCŽ{±2…f” #¶ì é_Y4´Sh£šâsNM¥‘‘HµyuÀ¢Óéá~ý2°d¶î9äegxecÇæŠôËó·^Y@´©•c}øU©V®ÖË›'lÃíÈ&±á¯¶¼*xUhy9À3[?f2¢9q¤ÐMšò«l“¯gäJ6äÀ&‚S7¨t| +È 1aážÙbÉè’Ùp`½+îŠ*+û$a¢$j,ï~•‰.Žc&„ƒ’¹Nm?³I£3Ù$Ìî#<ÉÙ`Ë ÝÀQﲪ èÍ¢÷=:Œ¾{l9˜xèŸ!f-.Z"ÖÌʦîmUCüù#çe9Ü/W:«±[$® {p•² +yy Üä(z$dN×p€W«™ ”MAj/6¼,¶Š +ð ¢,Ô>¿Þ B+¯VD)¿±8Á­"\ +™j^IYgÆ@öŠ›²âÓóп5uð@j4"ÜîÓS‹ ~B^z'úÃZJköC,ªÇ`ÄzÆ8žD +}ÙWZ§&„ Í¥ÑH/fñpϯ²f²-öÔ@b¤I°ÄèHh;‰¿w95|>œÖ¯Î’tï—‰Lî- žÞ’d:»»Ø3zHœ‡¦OÌQg».¤ƒ›ú‘†È>û~~Mg TüÜÎ3¦‰¨œ€…Y$'”âi“BNh&µŠ×'Œgá9'×8‰ ¿z½[ãØÍ¥1Žj*ð䀅±Ù‹öD.ÂÁs®Ý?ÈÈ$i@Ž5›ÌdQ Ûs*tú+™RŒÝ¼*z¿K¦ÌW›=äL"` È¢ÎX4ìÅ]Ø9ýéásŒÕJ—Œe H-»ñoTŽy즰ëòü-5!åtm2,äTU¥€Àm•7Í,óö(êAþAÐ0s° N‰1úKØòIa‚pýyaÆy 0IoþщH²úùh3²sÇá_ƒÊÍx¤TFÖ$_g JÄþHqöÛ¼]ÝçÌg¤òîýÕßÏþCíËË&gH§UI Š7>Co+ÂJÆkh&¤…Ðà´Ð`ÜÉ?½!ØEg´ÜúëuÎØ€úGѹC£Ùæ«Â»xžÄÛ§y øh…Á0µ¯6ÑDëg¥Z„"]H±Á©f!è$é5ØK’êŽ\¡ö›.Y‹±Àçñ6ë=W$‹É˜}—tdÍÄFÀ”B¯ÛPŠÉ&uyŠE_+–81ë·sÞ¨V¢Ë¾ÀÌê¢âf]¡Ÿ…ô3j_:™à€dWÌxÑ’@Ël‡oØ’xö‚—kò¼ ÜÌb\Ašš¾#‰D©™¢<. ö±z‹ÕôÜd¾ŠŒ0JÚ c,Õ›±6x×…µDr]Xí +š#×EUІºd%õS¨Dú„9VcÌŠ¯¨¬Ü—NÕØ4ðͺƥpO&ä×8Ó-½mj~SpÐ –gP-†kdQbF…øÆ9Æ72j¡1^_råVêÎK%Bÿ‰¤ÄŠàk 榪[j…øÅjzªR‡ª–]cr…H%ÁËNθ‰ý–ÐØ²/=»Ë€Å‚9ÝSåŸZ®ÔÌ5ƒbõ+ +RZ= j8ovÛúô›¼&LB­ûPó¢œ+À³ìáÊÎð`"¥:†±%yA™bÅâÕÆoñ^ÔÌÝÈ×ÎV5—–+jðRÏta ™¬´ xÐ:eI­›|pÑÖAßÔ 7–†X^ RÛKl§þ~¯yN( Œ’Ò-SÇ®@dJ@󌌜\VÅjtA1¾~ëPdú2¹™¹Bï$¦|Æû÷gG³Ï<¶B‰R=uÉ)T'©q²$…Ö® ‚¬çy¶Âdå…ËW-U”Hg¾.ÛA“‘qé4y'Š…R)ÓñQ¼°’<­d¯äÁÑTN„ãê@dzJf[óõi ›¯xêÛ9¸™H¼ã¯C›>êÁMpt L @&€3ý º+“±²\x\g‚9ša…Ž®ò (7P|UÏãKÑè ɘ`HÐd 8 SGÎ=Ó³0WÓr` (‘À5>­(«YYæse…‰É ýTtSTsÆ!äy²«ýBô5 ÂÿöXQ‡£Õ‰ä8<ôχJ¬Rßg×vÓP2ßPve¸¿ã…Ny8W€}ÊöD©Zæ°crœ&<Þ+4Jº +}C1–XiˆN~[¾ +”]Ѷ~{ð\@M­Œ¿Õû¿ªÁ?$ô7sµƒ$”L怿—tô[UÎI[AJ¯œÔrŒ¯å<1¡–¡…¿¡Áª('™î·±æW=*u¹ OžTÇWßBi®övå:ʶnšâ¦ë‡±ø@ì¬ÑÑ™”ëi®¯§­ø&…KÔÃR[ï:• W*££c;Så$½åØf1WÛû¯-üŸz6JÍÎê¡­=©H‡Ÿ™Ä*Y\!üT.ý\ö ´„ÓxÅš5±@C⌂24»Cè/EGk‡@Üó‚®›WéB½[äŸ ·!†ÓÍR º¬à¬5u}Ð?Ô»‡Eôùu½ë«áÎP5œ®Aøtü,¡|X3Ù† +:ðÊiØ¡ Ÿö„Õf°þxm +'÷ý W1YyÈ> 44\¾®$d<úm kä—ŽTDÎééú +:D‰ÔÙé>ÞÜÊ—¾6Àˆ®J·®PÄeY×:¯çŠfBŸì®§ë-ßÁ^àð¤K€ï±C|i"a‚ÃFå›åþ ¸—QCYåâ/ë>têîÈÉ.ñc‘Ñ·PÄ{—ArzôARËpÁ`^/RŠÒ‰L&ßìùð1ã}¡¯éî¾×åcT4«¨Þݽ¦zŽ˜í:”9rÞ´]­4€R.Mâ›á‡JžÅNˆnX6WboXì‹2Ôg«îGH5ÕéŸÒæ7Œü‰%ˆ òëê¡Ï¾€ƒ´a·+Öë|úÕÚŒ‘ÆÇ}¦‡áãÞ’ãÌÌ Âë¤;‚¾cÕ0­Ös_Šî‹Íÿû×þà8Å«Õ}¾:‘©AûHSȸM§œwÃ>gý)ƒ²Úendstream endobj -1863 0 obj << +1836 0 obj << /Type /Page -/Contents 1864 0 R -/Resources 1862 0 R +/Contents 1837 0 R +/Resources 1835 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1853 0 R +/Parent 1818 0 R >> endobj -1865 0 obj << -/D [1863 0 R /XYZ 56.6929 794.5015 null] +1838 0 obj << +/D [1836 0 R /XYZ 85.0394 794.5015 null] >> endobj -1862 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >> +574 0 obj << +/D [1836 0 R /XYZ 85.0394 712.8662 null] +>> endobj +1467 0 obj << +/D [1836 0 R /XYZ 85.0394 677.9474 null] +>> endobj +1835 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1868 0 obj << -/Length 3218 +1841 0 obj << +/Length 2919 /Filter /FlateDecode >> stream -xÚµZYsã6~÷¯Ð[䪃“$‰gâTÆžxœÚ#É-Q‰THÊŽ÷×o7 x‰šìdËå"4ÐׇFãà3|ë€I£f‘Qf\Ï–» 6{‚¶÷ÜÑ,<Ñ¢MõÍÃÅ×ïd43 E8{X·ÆŠÇ|ö°úyþö»«×÷— ¡Ù< .:dóonn¿¥CŸ·w·ïnÞÿtu©ùÃÍÝ-Uß_¿»¾¿¾}{}¹à±æÐ_¸NtxwóÃ5•Þß_}øpuùëÃ÷×.m}9“¨È?ÿÊf+Pûû HëÙ ü`7FÌvJË@+)}ÍöâÓÅÍ€­VÛuÌ~JÄ ”À2Bòè4[bÁ€­+F<ˆ$ï1]pÎÆe8[„Œš¸q‰â-—pe 5}µ B)¤õÉ&Ëk4Ì×ï„h‡q)Ü‘èa“‚%9ŸgyVgÉ–~TiM…b_1//y’<ß®§„˜¯‹’Z–Û¤rD7·o¨@*`7¯)”‰¹{»}¶MW‹,§ŠUºNÛzÜd š gø=*Œ¿tIˆÖU q¨äü-J—V®/ÈUR±Þ$9•nn]¯ä9¥´~Ù¶FáFäq¢V\Ç^lÑ\‚ÏÚ3ò‹&¹bšaò.ŒBÅå_Ñ÷87 Bëqƒ‡ŒM1! - ôpFئOIù¢È·¯#!„3„Ü4!ÄÂI‹¹ÿ&VT²“ -¾iŽÈß.BÚc ZúÜl%Lêúà³sÏ×eRÕåe‡i³PK¿,nÐ"Ò -Dßt&[ƒ•ñ7œê !Žø”kÖÐvÔÉÍ…µÂÂsì¸æ%±$+ÝGŒõ)u†YB`K|¤¢hÖŽR"æ¥X< ™‚Œ€˧î[ÉKC¿hw°!C´í:¥*!d/FlÜ–HF -Zmƒ$ª¡‘£í®áh(ÇÉ`Ý -ƒ_ZÑú˜ žM-¡6º›YþO¼ Aóý¦A¿H´m9´)ja¢ÙBGsûÖgÍZ‰@† š“qHlLg±Ï®¼#Ó` -ù›Q\ÓJnh‚~UQ™ò,í’W*{ÄK²ÝºßŽ`]l·Å …'¨u­ }lnbƒ -³¹O¿‰Š™çJ‹µ“õ…£ +µhpØ¥+L9kÖbÖ´/‹Ò…%Y)ÅÃhºq¡ä9©\Û.ùÍ­)ø«XûPS¥­h -I€wóˆÊPdÚ›f“VY±QXš€é³ç9)”¿ˆ—­ÐX°k(Ò`B±ó $T`®˜avaÉa~}¸yøÊ ù‘~£8W`…<Áí¦ó›º+å1X•GÂÆ¢Ú$­Äc¡ãÀÜ2w<Ó 1šÖ"‰7aާšm¦ðæéÏ(=÷ó#œÑA³3Æo¨Î 2moJAúwâöꈷÕÞ<ÕÑS‡=$Èém¹´0Óܪö]¼A|“Jtùÿx;jÑG›b¦ÄÚ8¨À»fžD›£?£òpÜ¿»Á -ËÁ´íªs‚ F›Fìï¢ȧÑÖ¢š@›§BŽä¡Å¾ØfË‘ì-`©WÓìªþ]¸I¼?Žº|jvsÝ=/^a~Âc|B𑿦°¿²‚#ývpÎçîøÜ÷!¬è\BÎ×–t -VžþŒjÃqGa;Äá¢)ðôV·I7TgŽ6 +« ŽÄXµ©Nê¡êOÿlð_’r…×Öýƒuvƒíã´ Õˆ$måÓĶZÿŸxÖS¨sÚÄüdlS’áÆÕt”žaCFýḟŸ¹²!t›öCCuNÁhÓ „´ÇÄ*:ÂÕ=ù¬*N‚À.Fu†yC5½{| ù]¤{ìïèV˜ù.MrËú°¥ßÙÞ@ðžOøOžz@ºdtdÚ…0bN~N©ìžà3 ߌ™tg–¸g)P°'Ó(e²ÜdtÛk;'®.@±Ôº’slGNÛD¨Å~mÿöö“;yç,ˆ˜êž…ÞÞ=ܼûרq\Œ÷þ8n—VUò„çÑÌé‡ÒO²Ø]‘bÕ 2+WsØÓ×¾ŠÚÄ^ç2÷Š øTÄžM3÷Å–Žï% ^Iø§¶«=:o²/³]Bg˜ôóË]lJ¼‹Àëd÷< îZz5 j¿Åsm,%ù+n>ºŠÕŠüàm¨Þˤ±'¢Cˆ H»„1­3?³h•?òÀCý8š_9ñв¦’½|ÂÂcÚ“…®ñÉ`Hºt×÷tl‹ÖMy#âª0‘П%­°¥½´-{å`š¯\ 9.ö3PC8ëtŠ1#±&¥YÜ<’±Ãô7OtˆtM­ûŒ&›8ñF²û´aZSDJ«ÞMAs×߉5í낪>Ê[D§#¹'²§ñ›tùû§f5LQeÆfšsC4dÝ=^o`ˆjó¦K@ÈíÜõ*=EðuîRË=§À‡»ºÌèuóÓÛ€I ÚB‚ijÿòaE4Õk^'R¥ÅöKË:ÉçU±£²¢`å^K¸'Xy"ØRŒE ”¡}‘·µ½¤}Y÷uá0PÛ‚Ó`_ä•§ë½Å€šÖ¥ ü"¡§õKQþn_œÆ.¬>N ø×vË¥»7³íXÅ©¨9z¨ÿnþ|ñãÔãË]°K;uêŸ8¡ÐÌF^L€;t,¢Ñÿ ꊹendstream +xÚ­ZYsÛF~ׯ`ùe¡*ž׬Ÿ”DN”Š•¬£ìV­ãrAäÐB™”¢ÝÚÿ¾ÝÓ=8¨¡©Í¦ø€ž===__Ê™€Ÿœ¥Yœef¹IâTÈt¶Øœ‰Ù'ûöLòœ¹Ÿ4ÏúêæìÕÏLl2•ÍnV#^E,ŠBÎn–ï£,Vñ9pÑ×?^¿¹úö—wçyÝ\ýx}>W©ˆÞ\ýpIÔ·ï.Þ¾½xw>—E*£¯¿»øéæò eÌã««ëo¨ÇÐãÓw—o.ß]^}yþáæû³Ë›~/ãýJ¡q#¿½ÿ fKØö÷g"Ö¦Hgб4FÍ6gIªã4ÑÚ÷¬Ï~>û[Ïp4ê^ êOŠXéL¨äLÊØ¤©šh05q¦•î5¨RЊ"º¯ìmñç®ììÆÖ+oWn6å÷ûêM"GÇ"f0!NÓ"wìˆCƼ>ÖåÆâK3ÆE–¦³y/L~¿X—mûæÿÛÍÓ›²[ÜÍë +$iý<÷(—ËmÛnÆÇuÕvÔÿŸ×S>rÄgiÛ®ªË®jê?Æl,ÔÎ.ö»¶º·ó¦^?ÒüGÛ~lv놚Á·ßÔÓlQ–×ÔÇñ‡ìü¿šÚ~lý±¾3*˜ä?ÄðOŠ8É(=²SøÆþ*„ª+˜zÊzIÄ/mùÉòBê84nîl/Í0IšX)ƒ`îáó”“Jâ¬( +žÔŽ%Ë¢ª¥gImó`w«ý[y´²ew.£ýî\‘¥¾fE3½¹gdîYÔÝ•Ìsm»)Wd÷vkw÷vǃuûÐÓôøæúg"~ÛÛÝ#‘Ëj…˯¬“bN–èØÈÜLÏ6…XRy-íÖÖ˪þDM§ux>Ü5D¸mól?Ã$ð`Úè誛nË]W-öërçÙî[KÊzÕìxúf»ví—k·ëŠyÑŽ°Ïvû-3~¨º»fß…~WÞ€F×Ðsw+3n6ûuWÁzÔ"u¶qÏ©ˆuJ®é²\Ü`Ð&=˜4V‰4O£¥Í:(Û›{ ùH!>p Àº§ìA´ÛrÁý„¤ªõš¦ÜòXkmMÔíãdv Šœ®Ä11itÁA/™©ri&¨®ÈÉá.°ð+ŠèÀN& jEcUǓچ 7€í«ŸøeðÎ@Ú–Þœ°î¼áN?ØB,•NXÇìB#¢† 3!4*K ®à1QÅÆY{("Î{Žó1Kî&òiˆr*Ɇ…{×ýDÆÂĹ–ÙŸ(£çxJF£â\‰d*¤‹?LgqŽ>›ôݬ†Ãqâ÷/mÀ^@y&¼ó¤àŃUÓÔ!ˆµ ´Ž…μ¼Á™ € ŠH8¨!1еÔXsSÇXÃŽkØ8‚5´Hû•b-…ÊòfD²ÐÙŸ€5æ8³ a rR™fÃÊ_[9šú…ôO idœ˜©ˆÇ –Ç"ïƒ2y©ÂûÃâ8Ô2qX?j“„ì©€\iŠd‚7LÕS]¡LZGuÓÑní¢B¿n—/¡'M¢Û¦ …©%&r"äqÌgÉg&÷Èœ"j4r<±5ƒ¯ôjiW%DEÚ ÆL|:>I)¿ËÒ8QZMX®]žcÆVe1ŽhEWu?Ö§m†C²‰ÀæŸ9PЇ|B[…è›PÚ GÊ¢VP·v<¥mÖ÷·X=lÆ1^4ugïú­:mABk!ìƒÞd…Üõc\@ͺ÷ü_(ãTîUæ«-UüäL€j¨o¡¢•rRü³qi;¤L}ûÚ$nuð2BÁQèÓ…¦Ì²$Ph[V3,ÆXdtnÉÅ\fuëÊANû¨ŠÄïXèª"9‚.zž%ù q1kÌ|8+(¾z¤5XACß—&N¡ã‚>BºÛ¤EûÌW?@´®ôÅ¡š)éЄ=C-‡½(e‹Ñ*ˆiÍËNoXGF˲+‰ û2® ãøî"')ÃìzOàÖ4Îß.Pìï%Ö·/ÃÂ*€þ®.×H\f`˜ÅÁðpŒWÂ,—ÊxIBÅ¿ R9TÓ¾-kw) ùB{ゎ-_LaƒU€dU¸N²X¦‰·<Ï$¼gq¡• +Ý¡hBuB5!žs-‰êM ç…D,8/ruÚ ¤}úÕËáN'ñçàv[ûÌ'ƒ$Bâv»u6hŒ·F îœÒ€ E è ™Êyœ {AªðF }£°¤yôžÞçù ó>¼.¸³\ï-‘3w‡÷rt‰p8¯Ý›9_¨ú’ÞÄ¿p¼9T»Ã5 ‹•ø“4.# '=8ýÄ}'*º¼¤ÈHÖŠSpN>¸+ïí„5ÜVyî$qÒð»áíÎS µNvp-ö¬x2¾uwOJ8n==8èd‘Ù¨]Æè¨-ç'vië÷5|å‡\ÏÕûðN´ÂJ.QÏ2L!Ÿ$ u!1ÏH&^äïçiŠ×<.®¤QÙßn +ÌÊ–û‡shÀª  §s+~zì*™Œ‡¯®§Ó``¿±Kæ{Ýt¼ºq—&n±zî_¿„Þì]ú‚R@&R†m‚],¸ö°ˆHväm5y> G\]{ÏM{@.%‹f³­Öv9÷'8 — ÞG:í¥xíg‡ëd9Ò>Œfe±†Ïð‹IbB¹"ð%I½;Pžì'j!ÉN‘ÒÔxSª¿×ï3rè.ùð%ŠKrÈ4qU?¸ï˜]-àP —EU›œÚé‚T¢ƒ±KCbK#ý)`×ÕuLÄEýÌÓ’ü¿W–ó@eA]iž~à%&>—ojpÚsD³¥‘µ½·kêÀ<š${ïw|…£¤i¢û“çÙmµdd,}:ÇyzP³»Ô°`á‰wôDÑ‚Ø)¾3âÓKº£¥PYó?2Wà̳"‡0&ôqxsÎ ”¸…èwÀw^ÌsµÇ‘T2dQ3û;äL‹ª Ö¥Š{cò@ÉöìÀv>²ÌÞ­·>×ÎCôÊ}€ ÞeGf߆žiu®ˆà”ˆ“ô9ßÀB[õqÂMâ +7tXʸYßÙ±*¯özœ³ «IRÛ=nÑÚOd¸Ì×=²œCï[.:‹¨™!³úcûükà^v­cQ$éÄOß _øDÿÅøsðSé«W4åÆÙRí]³_/‰æz Iü„âÏ›ZµíšÝçQàxÖgl)b÷{U¼>üä¬ð¡Ðé~Úñ­6vÊ“×îî«7ºæ@È€TžéD. ¥q¨ŠâÕÐò§îI“ã’–¼PƒHéìðœ×\±Ðw<ÄÈŒá…(~ JOi›‹õž>–޾çÛvÊzbÈuáãø¾IrC`4Ö㥅¥‚EXUëæs/W¼¼}ñúäçüÐN`:þK$ð÷Ñùÿ¿ÿŒ2üS'Éc¨ñÕð?“éǰò˜°P(yQ<‘Üÿkå©èÿFó`endstream endobj -1867 0 obj << +1840 0 obj << /Type /Page -/Contents 1868 0 R -/Resources 1866 0 R +/Contents 1841 0 R +/Resources 1839 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1853 0 R -/Annots [ 1870 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R ] +/Parent 1818 0 R >> endobj -1870 0 obj << +1842 0 obj << +/D [1840 0 R /XYZ 56.6929 794.5015 null] +>> endobj +578 0 obj << +/D [1840 0 R /XYZ 56.6929 769.5949 null] +>> endobj +1793 0 obj << +/D [1840 0 R /XYZ 56.6929 752.2115 null] +>> endobj +582 0 obj << +/D [1840 0 R /XYZ 56.6929 622.2614 null] +>> endobj +1843 0 obj << +/D [1840 0 R /XYZ 56.6929 591.5303 null] +>> endobj +1839 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F22 953 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1846 0 obj << +/Length 1240 +/Filter /FlateDecode +>> +stream +xÚµX[SÛ8}ϯðð;#áK|ž(X: í¦Ù'–É8¶ ÚÚ–+) iÓÿ¾’e%vbÀ¡ìd2–déè|wÉ–aŠŸe.4phøáº¦åq>0ñîj`Õs€žš³>L§—Žo„0ôlϘ¤ ¬šA`“äîøâóÏ“ÑøØ®yìÁàzæñ‡ëÛßÕH¨Ÿn/¯¯þŸŸøÃãÉõ§[5<]ŽÆ£Û‹Ñ °×ëíᙗ׎Tëj|~ss>>¹Ÿ|Œ&YšòZ¦#ù6¸»7Dˆýq`B' \c):&´ÂÐ6òÁÐu ;t=’ ¾ þÚ6ÞVK»ôç:tÛïPàÐêR BϱJ?Ϥ Ø -sX.0ZžÏ4ÐG´ˆ²#ÕÿQMw\x®kË‚¡ë*[œžª)7U3Ê2Õˆ3Œ +ÎT§ \5r9%ª3[©'Dš’B·[è%E Læ5”$ +»¦WРµíšS±:S­]ÙÖFc”ÎRmŠâ9exQw¢ ×NÔS+ª%p'·Z/òøLÉ'õf‘æÃ8Å1׺ÛÚ‹¤[-Ö´¢¼ÌŒIþ’Z¿“¢^“‚G¸ÀÅCXdµeÊù,ñîEqŒó¬^÷HØž¼Ê1¶ØG 6-‡²C~ØæÆW%Ҏ„rϺHq¶´%`2;RkÀ¾Õô}°ãÍvãåé¥m›áTn>ôEŒùÊF2cؾHæF…2;|áG¹°,h”çUx­”&w¡å¸ÎŽ¢dkZDyݽ‹³ˆ±û–ÆjWiIÔKcw›Ø$KðmŽèªI"Ü‹M«šf˜ñM´TÏû~˜@»÷Û`­}XN£‚¥ˆ¾3Ûy™k½¨‚%¡R+6#±N ëÖ>jîTÍÒ¹öä;áý!êaˆ¤ŠÓ¶%q9•’Ô˜%¡|3.;õÊGzgwŠÔ§zêšq‡à¥}D-ˆ¿éõuÆþÇtÍeD‹uál +B‘³Z¾¤…˜?½®ƒàgIÑ:õ®›:•I¼çz\pô@1_íô–*ÁQ6/›í))ù¦žô ²Mš²ŽèLßc¡J+r9H ñ±Õ,iwM£åAú—Ì·5ó`.O ^þ®­)+QÜG „.7†”2ÈZ·N1eü )jDÛ'÷Ÿn1ðSJÁ,bo3iµ:¥$ NEzEE¬ãïß¶ö`x^‚_ð-\<ÀŽ<½dÏ3*Œ<4\£˜ç3]>zH$QtÍ8.Oæ¼/’ý,ÇùÛ‘šY~G/k}Þ+E5Á¼5¨Âlr=ÄW[eÑJ{ÅÙ0a’œF¢Ã³¥8n~E«}5=×~Ýݺäc"ƒè£¼L¸6Âu]XžßWT úCÇ­`~«^¹0ô}ÏhŒo3Çk±^—DËw ã¾¤AÅ,¼&MoŸ¦¸á9b÷ÿ‰fhA»ºfv•çUÀıWœ•pÌÞZÙ~‹(ɨŽU¤ ]š–¾SûÞž(qÅ_^jÄA)ÑùíÀàk¢ÈgÄçô5¨®¯â¾!¯ôwyss×øå/ÛÏ*âÂâ½ù(`Ûˆcz0°C_“’âá.óÍ'†}êÿ@z­Kendstream +endobj +1845 0 obj << +/Type /Page +/Contents 1846 0 R +/Resources 1844 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1818 0 R +>> endobj +1847 0 obj << +/D [1845 0 R /XYZ 85.0394 794.5015 null] +>> endobj +586 0 obj << +/D [1845 0 R /XYZ 85.0394 540.8995 null] +>> endobj +1712 0 obj << +/D [1845 0 R /XYZ 85.0394 513.5566 null] +>> endobj +1844 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1850 0 obj << +/Length 1222 +/Filter /FlateDecode +>> +stream +xÚµX]sâ6}çWø1tFª$jò”MIšnvKéSÊ0Ž-'nŒå•Ä&dÙÿ^ù ˜b“ì0dÙ::÷êž{eaé6l:”PÃ¥´¶`>@ƃ~v=ÀÕ; ~ 4ßú0üzeº…Ô!Ž1‰XDž‡Ixwæ@‡]~¾½º¹þ{|1t­³ÉÍçÛ! 6:»ºùcT¶®ÇŸ>]Œ‡{6>»üýâËd4.9Ƈ›ÛßÊZþ®FãÑíåh8|Œ&k[šöbdæ†|ÜM‘j³?4©gÏúAL)1æË6¡m™fÝ“ þü¹l<-†¶ú#HL‡´8Рz:HC¹6…ŽIÌÂwCà t&ã ¯4N€Zf¬ìMó{&Êöyù7ÍMÖóŒ!µmÒ }åßû²,•ÐhÏã &Šçà-ÿå$&J,ßQðè ±eÊ[‚0,P\,Ë®ÌW³ÔŸ³ ü…â L¥dAÕ‘$üy5÷ãTékÅ£¨Ê+¤H²sÉ䌋YÊ[lÄ„#kÛ¤çõõã¼÷•§•kòVaXy{$¾”Óòæ{1´v¨2ñ¿±óÿsGn½¶DÅѲÆ-„¡Ž9›û*xœ%±Teÿ.>.@¿.˜x&>€ xúÎT•ðSÕAøn°‹L+Ÿˆ‹g_„kÑ¿ƒ7*äà‘OàI>í`—œTH ¦8ça1ÿ ÕZ-%QÞ­*±r­ßâµ6H·f2cA‡Ù«ì±±!×Î*Š…T½¬¨p˜[‘úþÖîˆø%àäMP1:|®K¤5Kƒ:Rûȵ€Qó ô‰­õ,“"ر§î)£Tñø÷ý¬\ kÔ‹Õö +æ3bÛ†vÉÎÄ-“´Yªsôz«5Ýäù-Ëît ´§™soäPx.á =œ°‹¬K6ˆC­óºJ°-Þâ õvJùÞ¶¥#@=(m×,K;áY… {É’8ˆ·ã¨ 0°©ÐH—S%~5H×ež†²/‚*¶ÔýwÙâ~µM7j÷L?ë‘:•RœY¼¹*ÅçRh×ÖHеL»ú¥xdC꺎ÑèßëXÒ­ååÙÐÔƒºðßœ&UgŸ*u!Ñß¾UëUë4ª™úûÛ¥öó +ôrkí'¸• +‰N]vy{\º– ±‹œît ® ]ä9Çw[hXZ&uÚ¿$}Þ§†VJí¤Ç…¦K¬C>°ß¦ׄ¦Eéq–Çu°ÕOЦ¸­ë’â©|¥ëyÈSwÝŽ˜ÚŽäL]®M³íM_ÕDo>®ÛœeZ:$<¬OâiœÄ׃–§A*R¹í1¯Ïõö©ÿ8M”„endstream +endobj +1849 0 obj << +/Type /Page +/Contents 1850 0 R +/Resources 1848 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1852 0 R +>> endobj +1851 0 obj << +/D [1849 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1848 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1855 0 obj << +/Length 1017 +/Filter /FlateDecode +>> +stream +xÚÍX]sÚ8}çWøvFŠ>,Ëš<¥Y’Òii˲O,Ã8 OM-Ñ”–ü÷•±16˜‚¡;ÙÉd,_Içž{te]„-dþ°å2ˆ¨°-.lÈfÖxÖ@Ö£é»oàl Ø ÅQoú«;Ê-…C«?-`¹¹.¶ú“Aóöíͧ~»×„¡¦[€9¨ù¦Óý3µˆôqû±{×¹ÿ»wÓâv³ßùØMͽö]»×îÞ¶[» ›ù$C80á®ó¾¶î{7>ÜôZÃþ»F»ŸÇRŒ#šòµ1"kbÂ~×@ +—YÏæA,±f ›QÈlJ7– ñWãsXè]O­ÒQ2—ð +m\# +[p‹3JèZÁA 85g~b9¥zÚŸÉÔ.f2NÛ×éc˜ÄlŒ¡`Œ”@¼ï¿dÍDÇËZxŸG]ˆ2‹E }0ó”ÞLZJ5ŠâQŒñCÆ# "h‡„B‘äM)¨—ë´Û^[DaYÒ…Þ&ÐÁ8ð”¦/?×S+aõržÍxòC}]ÇÔ²!JÇ~ø¸¡|8ä‰ ä£§ý(Q,k(WZÀñ“IL*5üƒzöâp5õü`å?†Q, ï ®WWé³é´Ñ™Í9“¡–X©3©Ô™^ª3ÙÑYéÅïÄó‚ z_2^nPSûdb¶”Í<=~¾Êâz9AɦY‘K`ÉïX _dŽï‹y±=ŠæI"œ4çç^‰È¡¤?áë—|,’é`ÅFÕ­2Z~׫Ø{>¦H)blQ’¨VS?Vº–²ŽŒUiù³^>J!³Í£XçöäeXr!,mµ—“eQGü܆YšVÈËU™pâ3mÌÉŽ~Nªø}‘Y’˜Æ0÷_v`B® ìúÞ; uì…j*càOLJøáÙGY”œf5€JŒæ‹‡<ÞâÔCíšÉŸsTÑ"Ëíjús»`«tÙ¸€”pf ·iz ý±îbPpîXûvIŽeçfaLFͤJ=wx‚oN‘ª³OUpHœõ7=¡ÄPe[ªkœCŽ\gGªùôÀ¡A-­ ¢P.þ­ ˜pàìÙãzToB0Ä95õv)t\‡œ§·M¡íTïã…’à äùÙrÂ>NŠ ´9ž”öÇêÜÃiâiïÁSgPgÖøøRã“Ëk||~ÿjE£É™1xÚQÉø›Iù B/.¨2_…вì'騲¯\{ã½Ò°¬J»>^È^V]MPSµPZu‘`þ3Ÿ_[lïtl©ë’üF‚ÂEt‰àRI¬ï2Ïï7ö©ÿ *¼Fendstream +endobj +1854 0 obj << +/Type /Page +/Contents 1855 0 R +/Resources 1853 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1852 0 R +>> endobj +1856 0 obj << +/D [1854 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1853 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1859 0 obj << +/Length 2959 +/Filter /FlateDecode +>> +stream +xÚ¥]sÛ¸ñÝ¿BôLÄ€ ’“§\ÎN}Óø®Žï¥i&KÅEª"E×éï~¢lú¦×LÆÃÅb±X,öJ2Sð/™å&6UZÍŠ*‹s•ä³ÅæBÍaîýE"4sO4SýpñúZ³*®Ljf÷«¯2Ve™Ìî—Ÿ"§ñ%pPÑ»Ÿo¯oÞÿz÷ö²È¢û›Ÿo/çi®¢ë›¿^1ôþîí‡oï.çI™'Ñ»¿¼ýåþꎧŒðøáæöGÆTüyéÝÕõÕÝÕí»«ËÏ÷?]\݇³ŒÏ›(ù×ŧÏj¶„cÿt¡b]•ùì'U•Î6Y®ã<ÓÚcš‹ G³´tR‰ŠSmÒ fÉH¥ŠVE^ÅF§šøérn”ŠVÝî`wK·ëyüoþÈl½ýb—Ëà¶Ýnx|æÑþÄqÌ€ ÿóÆAY ñ¬\É8 cg‚amÉ&^™€[@à=·nöÏÁ.Ï€ÌÛDû-x,«yÒx ‚¿KP±Ö*ú Ú#ÑP@ìÇ ìYٖѶé»)?œkP-曞AÜ”¾°ëÁ2Üáq¯„€Š~82néVvß ¯øö‡¸ä*,°^íš f9éú+vô ˆ[$gï´H£\3†² +|YÈ…¼AÓ€-×d¸€ç#ÃÊ!\¬mûè–<àð€¥Hd§‹ìÃqêâÈîVǺ}„3dÚ¾Îrí~ó@ºìƒ[;Ã9'øŽE š ñ› èP6Z¢m™ÖN)mëhÝÏ>U ç…ÀkÑm Ê,Iö4g¬Û…'øÛ­Hy¸îÇ-{FSE%Úo™ˆ‹Àº¦ÞÔ“´…X)iÓOVE-0nÀ„y@ãd"'<ÛC½Öh䉊n;Oác¸/€¸áHõ(ìÕý´frU£Â}DÒptmÏ(r^À¬÷­xÙÒϬ„vÝí{­NÉx*!«é™jK7‚öwb±©xbÚ°§-œFûÞ1Âòx8tóL¶a,„Šn8Õ/Ön#ÔRM¥¡î×b”/bvÉk&Ò‘û6ymv³mÜ«Sy á:”#ƒ4oWú(_ʾT œ?y—Ð9H‰à¾Ñ1˜åD5aJ¬‘S_uÔëwÙ6vá|þpRW¤*Îr(­Ï*ž q’ûÀùGuK ËŸà‘H +94¾ ëÊŽe¯K¬Í’Êß%àÎa#µð†5Ÿºl~W5>ФÍ¢Ù“rÏÚ5N?‹`89êªD¢1–&뺳hCFd*WU²ñEc}ºq–¼¢àršjÓ„Õ¨¾ÛHe¼°ÜØbå +å‹nß,|tRÐZT4¡¤W$ºé±® +çB0§£öŒåûE¨nyRÞÌéWxŸ¼¼ø‡˜œxQ9l4é× ÛÜ"fSCDpèàÄkn„üS)âåA#q¸:ÂCAÕ;‰è+Ž8¯§{‚‘k…Þ*¬ük娔 'Îyø‘xPÅŸ ²”à +ÿ´àLQ!Q"ÄOÌ©ßä; Û§ÊNçÊG>ÏuœZÞo”¿LXãk•ÞtÏ—9¦<“Q…Úf^z&ãÌ2~˜> !÷õU0DDò™rΔ«ggú£ì¨ÊU)Ùyeˆò¤*}žÄ9!¶üaR¥4ûe$W¾àt¤|¹¢|Ôw͞߀dÕTS‡±®ˆë¯A2zåÁ4‡pIZBµçRü`…R/öTöá˜r.@шîüyŸiè2'utÍyÞøð?–IE ÃÂUÐ)†ó#BÁ>p@çL9*Ã’í®þ*¥,qÐáì~ãÁ¾Ÿ ÕÌߘèîú]R%%FiW° 8ò$]™1Ï쀱øL¨Œ &`88=OßO®'QqÝÎQˆØî¶v"‡W:†¬í;hßÆÒ…iSù~–.HK~Ž×íZÛ0•¨ÔŒÞÇ©îy:tÕ~³ó‚æùO9£WöÑO9§§¶±—ص3ßÙ!eøSdýp–ź0“¿j«ð«éwÿ†~útûeyúÕç¼y/Ê8+‰Îã 5ŠŠ¬Òg?ñû_Û=ÙHøÿAµpendstream +endobj +1858 0 obj << +/Type /Page +/Contents 1859 0 R +/Resources 1857 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1852 0 R +>> endobj +1860 0 obj << +/D [1858 0 R /XYZ 56.6929 794.5015 null] +>> endobj +590 0 obj << +/D [1858 0 R /XYZ 56.6929 648.8056 null] +>> endobj +1861 0 obj << +/D [1858 0 R /XYZ 56.6929 618.6917 null] +>> endobj +594 0 obj << +/D [1858 0 R /XYZ 56.6929 618.6917 null] +>> endobj +1862 0 obj << +/D [1858 0 R /XYZ 56.6929 594.2803 null] +>> endobj +1863 0 obj << +/D [1858 0 R /XYZ 56.6929 594.2803 null] +>> endobj +1864 0 obj << +/D [1858 0 R /XYZ 56.6929 582.3251 null] +>> endobj +1857 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F21 930 0 R /F22 953 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1867 0 obj << +/Length 3400 +/Filter /FlateDecode +>> +stream +xÚ¥ÙrÛFò]_Á·@U&<Çî“bËŽRk9+˵[›ä$A 0(™ûõÛ×€ Vœµ]ªiôtÏÑÝÓÇ õDÁ=I]¨lM’, +Òn2__©Éô½¿ÒB3õDÓ!Õ÷W¯ßÙd’…YlâÉãr0Vª4Õ“ÇÅÏÁ›n~z¼}¸ž§‚8¼žºXßßÝ¿eLÆÍ›÷ïîÞ~¸¹N¢àñîã=£nßÝ>ÜÞ¿¹½žêÔià72†wwÿ¸eèýÃ͇7׿>þxuûØïe¸_­,n䫟U“lûÇ+Ú,u“øP¡Î23Y_EΆ.²Öcª«OWÿìôë˜ü"“†.Î2I:ƒ\œ—çP0¯€ÆéP9è<žwªµ +•¶ñdêtf‘±½V"=Њ†Ém¥“Äeal ÕÒvyWΧm·›¡ˆ^¿3f¨I Œm +!í H4ŽXaƒÿ6uÁ]e˘¶\—U¾ed×02÷ìÌõ|6x)»•¯µlªªy)ë'Æ_¦¸>X l8Ìœ3´¤y±éʦnÿv=µiæ¹³~è,XäNœ)Y\&ëÏ«jÏßó¦þE)ó´Û^ë4(¯< ¶9Œ¶eÖn•×LÜmóº]ʲØÊ× h,é«YãW„›Gä:o;á¶Ø>Û¿ƒk¼¬Šš)yùnÛÂÆ˜WŽm]Ì‹¶Í·{¦\62R~¼>p슭ì–ß1´Î»ùªhyWùP½>Yx"(ÐV͵¼ÐàûThaÈæåT¯ Þ2ÐjÐ7ƒy½`à©Ú‚Z,xä¶-Z`׌&jgõ’ï…{×Â^<£‰nÉí¢\^R^wì%ò]·j¶%Jâ¹`TYƒ|A^¤B´ÜÎsá"“ùÈìœUbvÎdĆ˜s‰aïs™s7JšàÑ¡u.Ì´‘(âö)ʇd3vjÁ‹¸(&îùÀÆ„š¼ÕéÀ´-ØgF*KŽ¥Æ*;ŸÐê05ÊÉ`rö@R NÕÔS ùˆf•w"±èBÑa»Î˺ƒ?ákn;°IÏÊb¨Yr{ÿ‰[².Ð +KéìÙÖˆ*Ù-³l\€‡>ácZFÁêŠmM‡CkÀÙ±8µU9_1åÝRÎ +F´Eá1{Æ,vë z»ceÑD Í,G­Ó'ðžk6…ÈbS¯Œm½˜ /L°˜1<…µŽŽ •‰½á@„Mᨑ†éÜ€KBˆtäŒf]ëDA¤‹²o ÆP.ŠƒË¶ª¯Âàaê¹É·`u _:íéÁ-CŸ¸e¤ÚͪrÎ0 +iôtÞã˜Öš¡‹ÅÓn­&oY¢\±Ÿ %,BT¤30MÓ +*¤!ψ¨‡·Œ˜•#Àþ`ø%;-"m¸#çOñ·cšlú؈‘CäJ´wüDß@o8Ö¬JX ùj^ʪbh&äâY7M½(z"ŠÀ=ÜŽ.íÝçO·oGÅú©¬ç8°µ.`u­xì~×@?umÔ wËþ‘Qçý$ùœ¬cd]þ;…£‚M•½Ñ&—ó÷q¼<΢[€¼‘i5V_òõ¦¢Hh’ƒä™‡¶t´^œ̧Y€ Ž,K4&RGûQYw]±Þthb¦÷Qi@ŽºA¦Íš²üª›®\î™b~ë©àÖ-¢g‚áY~+æh#ÚEcÌ“¸Fófáö’Ûû˜Sß|~ü!ÛÕmÎÞí$°&õ¾\‚¶ç¾±rš®F_î(¡žŠº€ÃîiÁ›,‚Vë};ÂǾP’Xt#»ÜÊ'ysª1ÚÓ"Áilyõ7&둲@.vª!:§aОåb~?Œ¬s*€Ÿ8EHåAÍö%ß.Fb(‰JãCêEYð 8fA5.‰ÚÆþ¢\ZLx£4€4¿Ñ b{b ŒŒI68J~ý@°C~rb‹z@x,!ã ìõf$<&ª x˜ªœïÝØ09¡ykNa::ºýf,c¹¥P¿ïeùÚ4Œ“Ôgvó\–âéd/1çõ'ãCñfz‘0à³¶Ä„Iæ’“?¾‡qš¦‡,ñ5Œu>Ÿuab¢ôx?ÏG„ +òÆ3±¡‹KTŸE±÷Zå› ÷Èq””ÄœGhb‚YŽô~ƒd¤ 9à{#äSÉ•€˜_a·Ð%>²„é,YJÜ-ÕŒåÊàÎý52€$7éÕO2ðʉñlÚ“ü—íÊJiƒíFâ„tN<©JâÃÆžÁªl…h9ª<kP²ûª…›0ƒNHýbH¯Ø«wT¢"–¥4ÁJ,ŒµÍŽííô0Û(hœâ`#CñQœRQ¨âÍœ`Ý Á¿êºb*eZëZî³9$Ðât¸2Î'ãŒj 쯿²44iŸK=3vš!Bôrî-“ŠØA½ó“-y²}³cà%'·³D T³búpòL¢£“gåËPò?SƒžRâÞ¡ð¢Á°T…ùÉãVB>+Vùsé gæn +• ùf–Wc'Ö¹Sƒ“G•„Êz¹õ* +£$‹Ž F’ýˆo¹¬ˆ4!æ^Qtv°£È¶í8ò s×¹C¥ñÆ›ºÚc‡ N‚ôsI #pA)Üæ¯Æ,i¶£ã‹Þ"·íŽJD¬hÁ½DåuËyë‘2ÂS…Ò®$[A ™uAéÏ`vãÅæ˜S–x¢NÒ%ÁÇö^Hw†IÄ7f&‡t'ÑRõ_R.§:°ØDES“1Ll!«8ÎHB+L3Ï5NÃ$2Þ½S½k Œ/ë²+¹6Õ¬-8üK Ù4‚­I×L(º¦!¤%Õ ÁrÕ«ÁZøfʃIë£/ŸSfÞÿbûÖþz€ÃÅ¥ãÛ®ex·¡òÅe'ˆ¶hOx‡;ÉHFž¢áÎ7t¯ö”‡v?Rkô«ŠcÉÔx"I‚[äfÝ´CR˜s®ßß"±Ó`bÀŠØãþˆ¡Çu ‡óXªIh½âÇoVŒ‘2ÚcMã«G(X«¼¢»ûW ðÍïÔX/bêEÎf½)«b1¥XˆE±ÌwÕèŠØ+ÄlgØ6Œ_O+Vì8Ÿ÷WG÷ÈËW$ò Bw÷•ÓG̵+¶³]Yu¸¸ÊR%æÈŒüÆàD~Ó!?x ²¿Bà×Èö²ß0:‡À®hÄo@©gÓ,žXåBHÖ2BU<ÑԃLj Ñ +-õ.„ƒ´ |+wÔÎHh6AQKîNQÇy[‚žÓÙ‰9ÅNãmð†z›·Ýö²†y·Ü¿˜9ò*Mï6Â'Ê|£àÍǯ¸ëþ– +~úRÁLJ÷BJá¥AûB†®´VPr¢t~Ëg¬æŒÄl½ÙucÖE¶ y[ñeS•sº@ƒšÑçƒåzˆ=ˆEzë£l0íïð÷Œo‹¹'Nûü3ÁüsìæˆWÎ× :3¥ufƒû¿ýøáæî>d4k¡ESI‡“x¸˜AµŒ}´8D°§aªâ É^óhcNäUÉÅŽÀL:ÎR‹ãD¯*òAÈGôÄ´ÏöŸÙt§ÐYW”·Ð‚¸=$ßø­©^·Î[ˆ ‚ÌAúg1d:®_ýŒÇÅÞIÆr*¬OEáßežA­½9õR&Õà¥T:1Îj”%è¸sû4aàaðXÛÓO‡ ä2Žsâ³qéÎ\ötDÆÃYȆ“o‹œ=÷T#ë8J¹ÏFãKüqg=tƒßæZÞúðòý§OéÀã2wü’þ1ùeÀ +ÂÊ]zfJ¢Dey.SÔ†ž·R|`Kܸný¯t”„I¢c)þøÀ@]ÇYï£È;r|–;!$¢öVêŒèw-Ü¿ ´Î÷ pÉ× ø=~g÷¤èVCó.6”›„ü2‹¹Ïiƒ¥Ÿ•–&;äõPŸ;¨ÂÃÌh·¹ÄH ´a%¾6Ä@Ó_JÇØ$Ì”IüPôvVŒåå^¥©ä0 æ¢lA\K?¹Jñ…1ì`·ÆZ0ÕÇâÁûm#õó®/‹NŠ¦ç¼•¾uþ›Ä”a±<Ç7¸ƒ7ʰ^J{5l@å¼hVE[6—ªæÌú,B4GŒÒ¢½,\ú÷Hÿ´xô^Ì©¦%òƒÛ…¯wßÉ?qÇoìÇñ}Ëç^cMp×/€ó„¨ Å—ÌÕÑßKÃ,ËN.-ŽŸÒÑ6g˜P |ηe³“_$´û¶+Ö-÷ôx yD»ÃûCb +XÍ–{¡Îå}ì6ž|³¥gYÿ[*?€§m¸mjØbdµÔ{€ù½Ø¿4rQð§áó‡Oc' +£È¥ƒ;4²GnÚ}ÝÔûõ‰É±-„—~ždéÎp,.ÀŸHø›ºtø]œ8›¦æB€ñNS…{ÌìY|±ièR“Œ,ý‹×Ámendstream +endobj +1866 0 obj << +/Type /Page +/Contents 1867 0 R +/Resources 1865 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1852 0 R +/Annots [ 1869 0 R ] +>> endobj +1869 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [280.2146 599.6322 375.7455 612.3694] +/Rect [280.2146 217.0669 375.7455 229.8041] /Subtype /Link /A << /S /GoTo /D (root_delegation_only) >> >> endobj -1873 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [312.6233 360.3945 381.2953 372.4541] -/Subtype /Link -/A << /S /GoTo /D (access_control) >> +1868 0 obj << +/D [1866 0 R /XYZ 85.0394 794.5015 null] +>> endobj +598 0 obj << +/D [1866 0 R /XYZ 85.0394 167.2075 null] +>> endobj +1870 0 obj << +/D [1866 0 R /XYZ 85.0394 139.8789 null] +>> endobj +1865 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1874 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [310.4119 330.5066 379.0839 342.5662] -/Subtype /Link -/A << /S /GoTo /D (access_control) >> ->> endobj -1875 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [340.2996 300.6187 408.9716 312.6783] -/Subtype /Link -/A << /S /GoTo /D (access_control) >> ->> endobj -1876 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [328.1051 270.7307 396.7771 282.7904] -/Subtype /Link -/A << /S /GoTo /D (access_control) >> +/Length 2803 +/Filter /FlateDecode +>> +stream +xÚµ[[sÛ6~÷¯Ð£<³Bp%ÀG7µ³î´v×Qv›>0s"‰ªHÇõþú= @ˆ (À™j'“~<×7™Ì0ü#3‘¡,§ùLæ LÄlµ½À³/ðìñ˜EZ Q?,/ÞÝ09ËQžÑl¶|ÈR+EfËõïó Qt ðüýýÝÍí‡ß®.%Ÿ/oïï.TàùÍíÏצõááê—_®.D 2ÿÏ«_—׿Qfeüp{÷£éÉÍÇ ¡×7××wï¯/ÿXþtq½t¾ ý%˜iGþ¼øý<[ƒÛ?]`Är%f/ð#’çt¶½à‚!Áë{6/þåžv¯NÆ`DYF'HéTEŽ2FYÀ«]Ý>•ðK‰ù/·KÝàóuù­ÜÔûm¹kÍ“ª1ŸïŸŠºÙ•í?àkÎæ…éýùêμ·?\5¯ÛzUoÌ£U×Sm¹¶’v +ZMǶZ/H.qIà„ÏÿSïì“uÑüX[ +kϪØéØC„ \Úyó¹4 jöåªú„1í´BÇKÕ>™–Ö o¾»ád›ÂŒ•©ä¸ÿhP^ELB jµ)0ÚÀ†Â„ +¤T–Í,G sæ¸JbÀ@Œqï'˜t¿o«z×d"H’ͲL!ÈÙ©äÐbˆ2¹'¹w(mP±ÙÔ/ @õø:VNC„c×îPê‡#D!=žúeyLI×X—ÍêPuÑ0õãDxs‰0åÊfaìĘô +åLq ®vc?LˆJFh*ú•2$eœz9%SéušquÌT{(vÍ#¬¦ÆaXÀº,ªß¡& ð§WÙØ‚s2nèÇHyÞËœfÆ0ËðÜs5ƸŸp:”ûvÆeq‹°hô*eH -Î8N"81ŸQÆõ¨c¦ž÷°H.à ’Š3×îPê}¾A…SRúúÿßroG/Æl£HaNNϨ°nǘûaŽÍ¨=>ár(÷;VoP‘ؽC% ¥ÅÙ[A,*q¶ P¶õ(­Ñdh±¯7ÕjbýÓ>,-ãêjB¿O7#]2߀nGטøæã¥ücµÝo, !GÏfËi¾ÿÖ®Qæ»õ€Q„ùwDçæt˜ú¹çP¬ˆõø„k¡ÜIZÁ&1¤UPyã1v¨”!´(­¸„m+‰isˆ:M+‡ÿlò_ŠÃºÚ} &ü³¸!5a‰G0™A†nýêÙÈ¡‰mŠÈÕéÚÆ1žÓ:|ÂýPî›kÏrØÔ’<ž‡JH‹“g:`‰™tˆŠ°G™œ5õ©SXU榾¨r‡šÐî§£@ûýnó +Q§ù|[;àÊãóÆ|¯¦è¦Äð<ãä±…¦=+»Ó;X@Ž¿•¦mŽÔ Ñ>õÿ[ïJ]1›/Ÿ,¬)[Óò+‹ÕSµ+›þåÂ>©6ÖnS~W¥SUL¸ÑL È;µþx×·A!FsÿXïî~y{óï©9'ýþg[6Mñ¥ÔXÿtÃøÇ°êü3}¦G;³¶=Ï{ó©ÝÔØB{c^·ˆMÕt‡˜º½+¶¶·)ßʃUð lSÍ«Ån$d¨¶…9<€jm­·¾šímj ‰ÀœZ? adpÖ»]ûÍscZÅîÕ4nµëµÉCÓ”yÏ;Õ˜îP4¤…UÙqKà ñ †1 «`‹ÕçèJί¬yõ¡5­maÍû\Žl¹$s0Ç„ ˆÞÿ soNnutK`Þ„¹0˜˜¤âMÖ +ŠÍzk12ÚºOênm{LâT?Ò k ϼ—”^t6Nc} n™ B&(˜]‹çM}4O›*´¦øes=:7Ý[ðÔ¾«í]«»†5_ïš7¨ýkÓóh®„¶æ›ñ»²}©_»‹7eø¥»£¾|+•3`µª;IÝrÊȪý+ S?mu”Ë×½žÎ²,ŸßÔ‡‰qëÅbÐÏÆ÷‰I†#BTäÑ « ³Ä­–]º'V‰Tßîõ…籨6SKB˜s2¨¥§M§öH´_<6›âÛÔöYaR!Î`y?ÅÂzvê’2D9Y~{ÛéÒÅÇR¡ëâ{Ý&Nß8öwvÓIƒµvžÃR¤²‡ /_'+ÍsÄ™äñJ4D®Du¬DÛ¿ÆŠ£VqÅ=hB±ÇÌõ…ñ5Ÿç phÿxÊ(ãêô¡3zºbÜó1v(Óãî†rOm\H°{¦B/aw¨„!¡´èư¤Å$Á±*±uÌ,¼×+ØfN]sp@FÕ÷  õãK¦(óõŸgËz^r\ÉÈ%Ä6Ež§ÑK‹O8Ê};ß`GË%cñà;TÊ@ZœoLèW×jCT„o=ê˜)¨¸å—CÕ†›e=,°ˆëïAú}ÂaDUÆ|ÎI8Ï1ã"8r‘ Ku”a¢ã$ú4Â3á<Œ›pdÌ9]F"5ŽÃx Âó5Zã,>áu(÷;jF2#y<ü•2$ç×Ð81«QÎõ¨ÁÕš©_›¯é˜D<Ë8Ô„ é88+ðȆóL¬SžŒÔÃÎùùƒ­!°rèDôâÍÀNRßL9Ž1ʬW¢Áw¨„¡´8å`9€ K\» QÊõ(­q½kšrµ€¯å«ÎT­/!ƼË` ²á{(÷íüLEÄ“àP CBiQþI‰(TÈ8ý ÓìëAZ]{x]´«ýâP>Êæ)œc»_›Ð¨v +Õû3lm•yúÏCº /Æ,ìÕÜoŧæW +PØá <ˆN¯÷8ú :Ø{p¡¢qw „cYÓ4ëOðÒá0¡þÛ¿ý‡Ç¿2á1uꊖꭶ!Ö(mxÎÃbÿâ"4ý-f Cendstream +endobj +1873 0 obj << +/Type /Page +/Contents 1874 0 R +/Resources 1872 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1852 0 R +/Annots [ 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R ] >> endobj 1877 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [320.3548 240.8428 389.0268 252.9024] +/Rect [284.2769 664.9538 352.9489 677.0134] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj 1878 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [359.1386 210.9549 427.8106 223.0145] +/Rect [282.0654 633.2165 350.7374 645.2761] /Subtype /Link -/A << /S /GoTo /D (dynamic_update_policies) >> +/A << /S /GoTo /D (access_control) >> >> endobj 1879 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [429.9426 181.067 498.6146 193.1266] +/Rect [311.9531 601.4792 380.6251 613.5388] /Subtype /Link /A << /S /GoTo /D (access_control) >> >> endobj -1869 0 obj << -/D [1867 0 R /XYZ 85.0394 794.5015 null] +1880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [299.7586 569.7418 368.4306 581.8015] +/Subtype /Link +/A << /S /GoTo /D (access_control) >> >> endobj -598 0 obj << -/D [1867 0 R /XYZ 85.0394 560.3013 null] +1881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.0084 538.0045 360.6804 550.0642] +/Subtype /Link +/A << /S /GoTo /D (access_control) >> >> endobj -1871 0 obj << -/D [1867 0 R /XYZ 85.0394 535.1807 null] ->> endobj -602 0 obj << -/D [1867 0 R /XYZ 85.0394 416.2201 null] ->> endobj -1872 0 obj << -/D [1867 0 R /XYZ 85.0394 391.5178 null] ->> endobj -1866 0 obj << -/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R >> -/ProcSet [ /PDF /Text ] +1882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.7921 506.2672 399.4641 518.3268] +/Subtype /Link +/A << /S /GoTo /D (dynamic_update_policies) >> >> endobj 1883 0 obj << -/Length 3164 -/Filter /FlateDecode ->> -stream -xÚ­[[oã6~ϯ0úR¨¸â|œv3ÝÛ™n&Å.ÐöA±åD,¹–Ü4ýõ{x“u35EƒA`‰<:òã¹¼Já^q„&z%5C<Å|µÙ_¥«Gèûö -{š$%}ª¯ï¯þñžÊ•FZ±ºßõx)”*…W÷ÛŸÖt Òõ7?¼¿ýöÇ»w×’­ïo?~¸NO×ïoÿ}ãž¾½{÷ý÷ï8^ó¯w?Üßܹ.áy|}û៮E»Ÿ LïnÞßÜÝ|øææú—ûï®nî;[úöâ”C~»úé—tµ³¿»JÕŠ¯^à%EXk²Ú_1Ng”†–òêÓÕ:†½^ûéìøá*ÈÌÒ@…ך¯$×HPBíþYWùuBeºn_9Œƒzý¾>Ëà{Üû^b¤%a Ô|¸Ïš6d}1LÇŠz2ÿñžŒ$`¿ÍwÙ©l]kÑ̈ÒÄ †ô]%TQ¤S à pNìWÅþPæû¼jó­ån~Ò ¢³ü©¨Ú9}0Ìšà#‰±HĈp舒>•ƒ!ž[ÇʈÝ<å›çdÿÇX°ÖHñTÅ¢Á¼¤ ) -º $Ês7~v’ÍÃ6o6ÇâÐuåêÝÜDK”¦ü°õõ‰e ¦"Šjl"á -„²®óø¸rw=k;ús§|¹›³aÆ{bðX%J8¢’, {Gµ È”›CýŒ %–Ç1Ö§ºŒ±ŽêÞ¤BLRüŽjI‘ ·8Þ¸uû >­OÁ[ :ÏxÜüñX´¯SÀÁ²Hy\~ š‘?¤JСo ¸cÄaHvHq)$)VScˆ ô VOùþÄAÂ4>úÕ’"nqÄ’/y¸UqêüÕ’"nqÌ ÐH²×§Š`.P‰§Ã6kóÄùˆçæy: -I¦Ð tT3* @Çb<éð6uÎ’qÉ…¢ô2ê(”†lΓ/=áúÙciІ|%:øÕ‚SnqÈQÁ—.¹¹UrÊHÜVM“oøyÎ_ÍLÕU9Mç,TªÔè¨fôàNhdÊöoãë.Z3)—¡¬¦’]¤×) êÀâúý‚íS¾Ÿ?N‘ä1±I訙r‹ã/…J_Òø‰"èóDF\{|MÚÍ!9æ»cÞÕe uTÖ1dmö5ùdN N)‹ D3‚‡N#Ž™JþtÈ7Åîõ:¡,l¶Rm7¤]ÌþvºþÚµ>xªSc¶B͓٠-µ$M[M Ñc ~Ïú C³÷¯Òõ}Û´çOvuYÖ/S¤'ž1'aOFsìW(”XiXà…_@_¬ÖF{"ݰù…’ûx°=¹Ýå¥D­3ß™¹Ÿ²hZ÷dÇ^žŠ6oÙ&O¶yYì ÿ©\)±˜o1tüœ¦äøŒtÙæU[$n#:è=؇6›}r¢¥wðpž(Û ùÕµ)ë×YµumYõêšÓC“ÿv1î½ÓÒÓ9ûÝË!kìÛŽÁãÉl…5ê¸:¾ûÁÎ ÌÂp_}<êÆ Þdîç%{u®÷‘õØWž%ópÄ„*¥[ìv*ÃçóÀ‹öü$A§a³å‹ãCûÅÜŽ>Än%C¦ù•áGÃñpÖ_^ãuãž«¬-~÷â‹*Ùçûúøê^Ý(l“‡2ƒµu¯ASo2+Á‚Âò˜lÈê<È çöˆ¢Ì`ØÛìÙÒ`BgGë# ¯]àlý{Vžì) ¥g¨˜ŽCݘ „Üu;ךm·…ñíYéÚû…­·Gˆ£çödΈlóCžW®­,ªg»š pR»Vï°ØºÉð½9*´ç‰xý©ÞÏb¬ÉÌáGHz¶= Û”§m€àKÑ>ÁU_õp:G+xv•uq–Á€>¦^CX·Ð»w(SH¥|!îô©.ÇŽÊzÊ&ñ0«  HÀyTl šÛ_ ‚Ž9þˆ}£lºS~rꨈ$40Àg``l“*Ð/Ø:åûÙ9 Ñð&*>æÕ’"nÑ´†Â -ç‹è:EÀå‰ìôäeþ˜Ó“Ù¢(ȼH\zG4?܃§H:”ï»&LÒìÑ<óµÕĶf‡CY¸è)|\îÖúh) '9=¸'>›0&×·;ß›{zà0   ‡È×¼™+ö$TüDã…ñé°0*¯Z0Ã¥NFÖKQ–Þˆ²ñšûˆj7ðS­F™‚YU3ïõŒw¶¿ÞyÁ:Æç¸;žÍ.¨º'£ÜlÀè–úœzÖ6Ã1@*V+¢¢)[Z“}Òÿ`ŠÌ)_£Õ±®Ûd „š}Ç” 4š.É@5£ÇÐ7Œ¹E—¤9AN9‹/ÉÑå%ˆìmŽúø2sþª)"æòELh ™ -x{˜ùT¨Ð.”òõ>Ï*Hèw§ÒÇñk÷QœwÕƒ qM™ûqšÛìÔ§ Ì&à6Ú3»Ög®žðÉT„„íÂf ¡à+eØ^¶Y“¹É ¬ñ²:˺~† ãô®]g¸$c4†€ñpõe;s]'!æ:ËñÕ–4Db¿²e:1Ît:ÿyÛvŸTµk̪æÅ¥;&¿””åü`$Tw%(”3£`o9…Qx©O¥—Ÿ™2ÌëäZªú¸7Yœi -Ãam«][pED”*Á†Å¤Mùö2îSsÀDÉð{TäªôÍøŽ=OjîéøÇdwT3ÂÞleÊ,¾ô]í„}3]Cæy„Ï·>ùWTš'STÂDz~°£ mC  ãùµ EÐYø­ “ôÛ†®R -:Øô(2÷êK'ÓU3`¢\#I wÃÎÞd²«‚8%¢ i®„%÷°QíQÕÝ ª`™{/m»„Ún. òÆ?ÏÉvµõu#gÒI›ZÎ¥ún˜¸ÛøˆK,Ì:’ 9RŸê2.;*›þ±³Ú$¶(§:.=ÍHoÿ€Ó"Cñÿ½ÖÄ&ò -·‹ƒ5³1-®l5OÊuøš×&l™;⦷Êö¹k2HêuÁÃ|Væ3aC[Ö®çç”§¿Ö§#T†ðˆCcJJÏÕκiܾ‚€b㕵G8ZpI¹y] (oÿ÷þ¹G_† wËŠÇÊmzØLP§,b\cÇj‚\J­O›vü3Þ4ÙetîÂkož£ ¦™[‡C^yäÃëÏ„0ŸNöÄA‚kÒ]^ôëÊ·¬ÿµ*sM+f~óÄã -±KKÎYryͤöÔxáP¨OY3j°fÚý!ñÃ9¹q‘b|A‰ŽjF‹¡SH1R£[;Îýx/RmëÍ©9´îUµ¡ð?ßvVf§ëÛˆÛK¤úòÝP‰Èâµ½Qäf¨'²ò¨ïhˆk)Ä„š©ÐA¶©¹Ôl ôO7TX>ŠôvæT·–¾lÜ«›~W µHV6 ±¿>ÎnóÊTn)÷e¡ÂC®6Ö˜ÏC¯Aù%v?È9ÈŠ¥Öà çÒêE0"áHͯOÈEµ¹¼>^ŸÎ?˜ødÁâwüúõš©f7ÙCØÚ -å訒H¶|œ }óÆùÍðÒuºãñ‹×º98fÊâœÃÞGæ¶ý œàÏ{¶¿}©ÿü?`,¨R²8bî1*³“ã”2Úk6]~þöÿTõÿaØ—Úendstream -endobj -1882 0 obj << -/Type /Page -/Contents 1883 0 R -/Resources 1881 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1853 0 R -/Annots [ 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R ] +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [401.5962 474.5299 470.2682 486.5895] +/Subtype /Link +/A << /S /GoTo /D (access_control) >> +>> endobj +1884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.6971 295.6317 326.3691 307.6914] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> >> endobj 1885 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [257.6971 713.6209 326.3691 725.6806] +/Rect [310.7975 263.8944 379.4695 275.954] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1886 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [310.7975 683.3704 379.4695 695.4301] +/Rect [308.6055 232.1571 377.2775 244.2167] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1887 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [308.6055 653.1199 377.2775 665.1795] +/Rect [294.1999 200.4198 362.8719 212.4794] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1888 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [294.1999 622.8694 362.8719 634.929] +/Rect [303.0862 168.6824 371.7582 180.7421] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1889 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [303.0862 592.6189 371.7582 604.6785] +/Rect [332.9347 136.9451 401.6067 149.0047] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1890 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [332.9347 562.3684 401.6067 574.428] +/Rect [386.0748 105.2078 454.7468 117.2674] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1891 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [386.0748 532.1179 454.7468 544.1775] +/Rect [301.97 73.4705 370.642 85.5301] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1892 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [301.97 501.8674 370.642 513.927] -/Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +1875 0 obj << +/D [1873 0 R /XYZ 56.6929 794.5015 null] >> endobj -1893 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [231.137 344.9998 299.809 357.0595] -/Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +602 0 obj << +/D [1873 0 R /XYZ 56.6929 725.3455 null] >> endobj -1894 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [143.8055 284.6583 239.3365 296.4589] -/Subtype /Link -/A << /S /GoTo /D (root_delegation_only) >> +1876 0 obj << +/D [1873 0 R /XYZ 56.6929 697.9265 null] >> endobj -1884 0 obj << -/D [1882 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1881 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F41 1208 0 R >> +1872 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1897 0 obj << -/Length 2840 +1894 0 obj << +/Length 2994 /Filter /FlateDecode >> stream -xÚÅZKsã6¾ûWè(W@ 7gâÉ:µ™d=ÞS’-Ñ63éˆÒ8ίßn4@ñ­IeR›©Aàú¯ ÊbÁáŸXXÍxâÔ"uŠi.ôb½»à‹GûîBÌ*‚VmÔ7w_½KÒ…cÎH³¸{h­e·V,î6?/ßþëê§»ëÛË•Ô|iØåJ¾üææý·ÔãèñöÇ÷ïn¾ûïíÕeª–w7?¾§îÛëw×·×ïß^_®„ÕæË°ÂÄ„w7ÿ¾¦Öw·W?üpu{ùëÝ÷×w-m{OÐß/~þ•/6`ö÷œ%ÎêÅ ¼p&œ“‹Ý…Ò Ó*IbÏöâÃÅš[£~ê˜ÿ”¶LKe+;Á'¼Ì×àµUª8ÓN4N–bÌÉ„>Þe¬~«Žû2Û®êâϼo´0‚).O“ÆÄ7 ¡|Ù’/Œa‰MlGyN^?<…Æ&¯×ûâùPT%uT¨UÏ—2hA)3zÒSˬÒÑ„¢ì[š€ƒ•æ²m)íÔ¸mÙÜÀçm¬J6¯OÖ!1…FõRR3!Ĭç#f^‰þJ¨Ð;p(å@À¸y¢µP3L‹¨¸G‡}VÖùþRØåêPìòÕp#씓FÍkÒ FTéÎBÜðÔvuùr¬›²¨§†ê§é û¬eÊYÙ1zŽ~ÆüáºSLüÓÀÔyvÔE†«Í²ÐÀöjÔ{–…mÔ4 Ôèž›í8 !&µqóš4¨Uº,L$0ÚÑåï±ÐM±°eQŸ… 3„O³P2§ì=Ë€?cþpÝÏg¡rÌ$ÖÌïCƒ:£Èpµyª&ì¶P3,Œ¨éÌQZÅ”Ñf^•5¢K—†Ž)…¤n+óѰmR_. ˜1nšˆ’DjtÇì9"Fü ×ý|"Bõ"ÏmDQc°Ö< Aõ:ÃÂj†…59FY(˜qæŒ* jD—. a4M{ÊüCGrÛ¤~6tL(Pcš„ -œ–êŽÕ³$ ø3ö×ý $ä,éü>DÐ5kÍ’Pƒ wól¦)A(®¬ÅÃë€nB‚f:™Ú€†R;d)’ÒtÄ~®”ïo0\÷ ˆœ"„>ã©¶mûfxÕÀç-¬:yÕ]‚+õ7 y-kͳJ+f„rnÂ4nõ¼Ü5"¸C4©˜µ0Ú‘|ƒþNUü -ûžVóŠšzªÈ:h¿d¡³(y¹É7ø¦—Õžºëç| œ+ÊGzÏèn‹5µÿ¬Êœf¡Í¾«™þ)ß¿p.×ÙI$Ý£ëâ±ÌVè$Œ. f67­ißG_#模D éùíû®ßR×ð:KÒ#@_žò†x{¥VF‹Ñ˶Ê6qÞƒ¨vô¶)êìr•p}.ŒUQD"5ÐÀ‡×“2ÙIi4Œw-ŠÑ€â©••¡s«“¹íLAÛ5Mâ$…B+9Ãáh†Â„š¢3Wõ¶­>ëz˜3“ø©bNzŠïYã!átGþMȆpÖ¶²!wßWrq±ª1op#ÓàJg–u¾‡ £öK±ÝRëcž?‡ñhp†Š¨¼‹ä…b64B8A ]åYà]±~¢ÞufÜÙ›ãî(çéž -f9=ºW§ž2eÊšXLœvf…áµû¢®Sº™±ÉHÁ‚t+{,k\Ó0®ž¤ÞR#ÎÜxÛ¨iÒ5(o)Ãl³Ùçu©§Üä¼ jDî þºÓÑãÇr‹1mõr—g%$¿‡#ÂÆý‡¿k‘ã=øô™C ³¼#rŒžÆçMxݦQ‡Ï‚Ðsó=Ñ^ -ÿ:s:i±EvaKÀéϱ¸ -³Ë°œ„üòõæÞ~ýµ‰óiLÙH¶–íbÝ9–ýŸðR¦ ‡¶ùMo«ªí¶z¡r‚\7ÊZ÷yÌP !ü{ßk,mµWêLiUÜ/:KZ›Ô5œh‚ÏÎHÇEbbæ=N^qìÈ,Ï)l ·¥çÄ×îžò’¤IŒYª65u6U ¾´]†ïÇÉ…-L%§5 È?…)e¶ËÃRG(ÿöþä‡Õ€…I¨÷ЮÔQ$d@–k ņˆ_hU%š³ÛÁªòPM==0Õ½RÓ'l`,½¼¼\:¹dƒCÅE¢øIØí·ô¼/Ôð¤LŒׇˆˆ­¢,˜0ÆLéçOàç ¶«;ÈÀ¡38…E8ò[A¦}ÓQ—0“G²”’h;{$·QÓGrƒêÅ>qeP Â)d“d^ƒ5¢B·Äos*íê@Çqbxç8NLd tŽc‰Ç±¤ã{ shf4‘Ž*ìÀ{6Õ.Ã܈}1< áË;%à -vNØ´›9O™§›]fëØðüN—ÙñðTí TØG! Åõü‹Ï@Ï´gŒÄäI“ 7ê -ÍHbë³iÒ>Ý?ù”€ËWôÄÄ«·Y1½[•HCw«á‰a“IóÛ%ê²ûôš0©Tü¦_æù&¬ê#Aš(Ò´¥5Œ>Áx`ï6_È妅€Ûeó8£kÔÇgÈ;¨…|u=½õ» e ² lÇ õq½í|¡ï³‹WÂñèvlìÁÎ*4î*£G}¼ôÂW_ºxDKî_Ãw“°ÄáŸn ÒnM”çl_¯ŽU¯XÜ -ÊvÉ›²]Æ\ˆ£T¶Kúš²]6ÕšpÝ*Mò‘B@¤¯l -uèò…º …:¼‡B]ÆX€®îöÊilŒ¡±­Š\ î+ò$MÇ+r„{ÂÃsX‘coF3Z¥ËøÔ†r[¡ìH#ïÅ~¡r3¦=Í‘#j]ÔG«t.™4Zÿ%F›D™ÿg‰Ç;sôñ£ÅÊé½çMöy÷i¶Ìû«ÑD3üSÏ‘Úþ’þö_”žþÜV¥,±“ŽÃ ä—F¥ÐB7ø¥F'–i+ÓÕÿ­™õendstream +xÚµZ[Û6~Ÿ_aô¥ æ’/âcÚNºSl“ÝÉ»@ÛÙ–'jdɵäL'¿~¯Ö•jÑA`Š<â¹ð;7jÈ +Ã?²J9‰b+©â˜ðÕîxƒWO°öÝ q4O´éR}ýxó׉\)¤«ÇCg¯á4%«ÇýOëoþùêßw·ÊñZ Û xýõý›o팲?ß¼}óúþ»^ÝJ¶~¼ûÆN?ܽ¾{¸{óÍÝ톤œÀûÔí0óÂëûÝÙÑw¯~øáÕÃí/ßßÜ=]ºúœhE~»ùé¼ÚƒÚßß`”¨”¯žá#¢]oOgIâgÊ›w7ÿ vVÍ«Söc¡}ÞïNù®8¼Ü‚rxݾÏa¨uûrÊíT}°¿AF»^ÛÙ­£º4ùÞŽõÙ’4m}.ª§îÆ0øTWn ½¡†CŠ×žmÓ^_9ÔeY?÷vó ̹!0&œÂ€ Åa0´çÀ,àà,§ ?ä/Ï /I×Zz*×Eã~«6?ŸÌJÞÕhºÎÜbfÊ¢iíÈØžßmÞœ²]¾Ùçeq,Ü«rí¹4ZcFưð3Æôì÷Ȳϫ¶Øh%„Nîžžúå„¢JZ ëÁõ Ì4äW°Vë¬ÚÛ¹¬z±ƒæ²mòß.ÀÆ>)Õß>œ²Æœ±Yè<]ްƒ£Ž‹ã–·ælàœ>6ÚŒ¬®CAQÙßÌþX f¿žÊš¬Î=Ÿºµ0R¢`*ú0j³ÎH½´Ö[0¯qp¶þ˜•Í I’+Tô©nšb[æv©8ØÙl¿/Ú¢®²ÒÎw +[ïÏ`ˆ³Ûí}öÑMoó¼²seQ}0Þ³€“Úκ€ÅÖM~†÷u:1)†¬ßÕÇƬ²Mv<•!žéU÷܃nW^ö‚ÏEû~®BǪíEkdg`l• q£-½]Lo–ôÐ(ß¹¤"¨„#Hx<ót©æ3O 2‘²€C<òaU%ó TŒ{yð“êäÚãü.χ&͛ݹ8]- +auñ•D˜2ï]WùLpU<± ,C©ÀˆI%{*ÚÅóÓÊ:ÊúeÇûZewWµtD"C‘ æ#ÂÕ‚ÕÕ‚ ãÝ´ ³ãJ Ì(‹#¬K5°@eN(/ó§Lk¿©«òe5.JUœ¿'šàßš?—x €ïJèl™dOzÌ×F3›Nea“¨péI¬ß6%rŸ4”&—­éFçqÆäúþàVsG;ŒóM"Œ‡Æ—¼™@,c‚"âš6th稜h^ [Ai^ÏEY:%ÊÆIî«Nø«tP0¸4’…䚹ৃ´ùu1¬ðAÑn|M¿Ãã ¹ÕŽ´p“y#¸ûb{Ö6!ñ ¡Ðai²âJ|B’¿ ô›î clŽ÷ÕRëºÝ, ” +D*dO¢DÕ„ýø0Ü-î–ÇHŠZŽ.UÄ-=•æeúsvÞ;‚¸$*Î8PMpîwqÝUõ[ƒ›$áëcžUPà.¥Ëë;ï²:݃’ ±S™ý±ò›jÕ• Ìä&û3ãôãÜC _ÀùÓQ‚R"‰#2UŽå¹Ë Íq¼‚ˆe]€ då®íâ!+Jë†TDBún˜Z]DQ ®s~1-•ŸÄ#åô¢ D°ø”·mx¥ªídV5϶üÑõ¦º)§M@à8tºý˜°‚鈽žëKéøgº-s2Ù™ª>uU§§¼9Œnµó1‰JŠp*X¿è‡2*ßÏ:“% ı¨t©æ Pu@ÛwèºÍ‡“вöD¬{‘?…BµÏûGÛI×Á9×P‡ž¡ás³ïÝÀ¶˜z¤[LMøTÖ[ck˜ëÃé lF‚Žh"9èÀL„¾ÉË`ŠQ Èì£Ë/§í!' ”p…$ÔA¤Q†¥D„ŠÙlC ±01ðŒÊe›Žj뜴õµ¹kèÕŸ®µwµ¬ÓéÒÒ”™S•¿µ·Wó°„€Æ8](È»TXz*S©þ~0Òlæîƒ$T1qöj‚ÿð>H@¤ë ðß[EMY@ Â°×:D1=cûX=Jí‚F°~lü=’~06׫UvÌí”Sg gZ™«‹5mY?Ù•Ÿ1ǿ֗3´Š0$~ÓÒíjÎ]Oî_€A±sž ¥t¡J(ye?ÒXH@oxÿ¿×ÈAhÇ¿µÊþO•½1e¡ðYxØØÉ°Û€…Uº¾ìÚá V=eœéºDÖNCKçµÓ ¦)Ô N§¼rð‡ÇŸ)e®¶ì¢ˆQŠW>P#ï]n¶ç]¿VåbáiØL_¨8elg6çwV“YÇI  +¨{âŽÓ¥šwœ@ÕsœöxÚ8s݇é;`º D š¢g6ÆT•1‚ûØäBIµ¯wæRÅ×Ýu§Íõ—×kõT_ì¼¾@ÜÏ‘ªyK3î½`ç@±²¥1øq]¤ˆ2&b,͈g?$%ˆRh:L_¹z#õ¾“ÒÎU]éËÆ>Ú³wXZãÔT!æ×¥Ú}^és× ¦¤¿«É6úu¿ª!>ÇÃ\ÙÀ +H¥÷´3® M-ñ•švN0ˆ"ÐÒÓ¡ RÜ`·sÓ}í.Ûú».ߘö»"&‘ÌoÌ]˜NÞ¦¨k¦×‘ob/… âzušRßáMèÃ!0'žÊµÒsÆP®«d êŠ=•Õó÷Cͦ)>… ˆaÊ⪠ú×Pú¥°Ú“á¯Ý¥áÄÆš ØË +ÕDÎÞ„%<ì½YW‹HÇèÔï;{†‡21€‰Ž¨Qû{¢9F{En*À\‚Ê8æºTó˜ Tþ¤LÉsÈ]ž*Žùfê$Õ¾Æâ’ª QzØK!~`™öeù|Ø›Óh †2‚Á4EL¥´§t ƒž~Aýñ¾s”#rÞAæè9ªAÆ»ÅQ-“JˆX@a‡*‚BO5yfžœF!¸%*.I š¥B} ¢¡+ËçùÓhˆÂ œÒ +!Íé+ó®6Q:úõÇûþq2ý©>ñsT ‚Œw‹£„0^hr»TzªùÈQ_Ú S†˜à".J š¥C… U}aþ&vUÊ¡6$BÍQ)Ä¥à=µc@ôô ïûÇE ]:O´ Æh¯( +õÍ=jáËT—j…j>rL¢ ¡Ä‚(jB–> +¡]”r Ìß”’»* £¡þ&%Y„ Œ&yOë(ý‚þã}ÿ¡„#2~žhAŒÑ^q2“Á’v¨" ôTö³շf£Žš‚p<‰ó TŒûà¥F¦èsþ<ˆ»Ê?Àƒ=ù’ÕÕ‚ ãÝâà +Q,¾ôu©"óT×Ò_9³—©1•¨$Î=PM°Þˆ)ŠEŸÿçÄÙU‹kž¢Dáù?÷HÀU8…毫A,˜yú•Çû΢ËM† tqãª%IF»Eá&%¢R,\Ãvˆ"Éêˆ:§ÔÖ›¦ÎÆ`KÀ +8òDcæ}¨¥àS”ô¸žJn¤Ã€5ä )‰@ jk]evˆ"Í‘ÇíúÇ£Z +m¾*ˆ™=-H1ÜkcþÎ#ý§Õüà¿»ýËÁ}ýóv&ôûsîJ©’^(-¸¹$ORÄS*'Dÿ?<‹tendstream endobj -1896 0 obj << +1893 0 obj << /Type /Page -/Contents 1897 0 R -/Resources 1895 0 R +/Contents 1894 0 R +/Resources 1892 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1853 0 R -/Annots [ 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R 1906 0 R ] +/Parent 1852 0 R +/Annots [ 1896 0 R 1897 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R ] +>> endobj +1896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.4835 624.1678 328.1555 636.2275] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> +>> endobj +1897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.152 560.4651 267.6829 572.2657] +/Subtype /Link +/A << /S /GoTo /D (root_delegation_only) >> +>> endobj +1898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.4539 296.9881 426.1073 309.0477] +/Subtype /Link +/A << /S /GoTo /D (server_resource_limits) >> >> endobj 1899 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.4539 736.7854 426.1073 748.845] +/Rect [387.5019 265.057 456.1739 277.1166] /Subtype /Link -/A << /S /GoTo /D (server_resource_limits) >> +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1900 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [387.5019 705.7889 456.1739 717.8486] +/Rect [381.9629 233.1259 450.6349 245.1855] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1901 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.9629 674.7925 450.6349 686.8522] +/Rect [398.5803 201.1948 467.2523 213.2544] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1902 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.5803 643.7961 467.2523 655.8558] +/Rect [393.0412 169.2637 461.7132 181.3234] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1903 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [393.0412 612.7997 461.7132 624.8594] +/Rect [255.0796 137.3326 323.7516 149.3923] /Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/A << /S /GoTo /D (boolean_options) >> >> endobj 1904 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [255.0796 581.8033 323.7516 593.8629] +/Rect [311.5276 105.4015 385.1809 117.4612] /Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +/A << /S /GoTo /D (tuning) >> >> endobj 1905 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [311.5276 550.8069 385.1809 562.8665] -/Subtype /Link -/A << /S /GoTo /D (tuning) >> ->> endobj -1906 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [315.9507 519.8105 384.6227 531.8701] +/Rect [315.9507 73.4705 384.6227 85.5301] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1898 0 obj << -/D [1896 0 R /XYZ 85.0394 794.5015 null] ->> endobj 1895 0 obj << +/D [1893 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1892 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1909 0 obj << -/Length 3202 +1908 0 obj << +/Length 2962 /Filter /FlateDecode >> stream -xÚµ[Ksã6¾ûWè¹j…àIÉi2ñd'•L²ïe“8msW"'"eóë·ñ4AP S™”Ë%üØèFhtSYaø#+Q BQµ*G±Ú.ðêî}wAfãA›1ê››‹/ß°r¥*h±º¹É’KIV7»_Ö¢è$àõëŸÞ½yûÝ¿¯_]–|}óö§w—*ðúÍÛ®lë»ëW?þøêúrC¤ ë×ÿ|õóÍÕµ½U8ß¼}÷­íQöãŒÐë«7W×Wï^_]þvóýÅÕM°el/ÁLòûÅ/¿áÕÌþþ#¦¤X=ÂFD)º:\pÁàŒùžýÅû‹£»æÑÙù#QVЙ ¤t4’ ¡”X•B¡‚Qf&ðæ¾îk°ª$ëã%‘ëzÛ™Ï]o;+Ûk/šv¨mµß?ÙëS_ïlkèÆ2únÿài«CíDÚ]}tð{w»ª¡ÙnúáôÁvüѵ5xƒ•lý¦;úaÖnëèËrÝÜ> ù‡IØ‚”ÔXÔ×Ç3Ž*½Iuó`”Pr]Ù¿Ÿêã“mÞvü+¥üñññRÑ5ª?U‡ûm»ƒî¶Ï>6ý…Zý¡qý­ýüÐ Óµ %Ãê2Ö§i›¡©†Úbv§cúÍ™fó44VpQÄSÌ83z·= :·õ`uÖ7«v÷¥6qê€t¨=¨?ßþìÜíÜH}Ý»¡A˜ß×­mõ5ôEªÛ…©'¸1“ëŰ>Ń텙vøÇJ¼¯ë0)¶±«ûí±ù¨™á§N+51H•S®`ü¬) ƒˆ¢¸{ªi§Ö2K²–Žì°÷Žw+Û¸Ùày»©Öðí³‰:Ü“1UˆSË3ÀcòJL%iή ã’-0n„ÊPΣ¼£à¿mÚ»MÛ«¾1ØYIó*ÔŒã8CöÅX‰¿Æ99â\bÊtkdzÀÒ¾1pQÈÚá<~ÁîT.PI •÷@@-h’JËDhY,o„ÊÏ£¦ÞÒŸÕp:ΰO”êÁ€¬5£HÄ>0Y1VÄš|~öÅöL•À •â<Kޤ*XdqŽ¿`{*÷O0Hˆ’ä½P š¤Òò ÄuòR-0p„Ê0У¦ž>ÖiäÃHrNóÔŒ -‘Û!H*D¬Ãççž·d2| 3ÀI&ðQŒ -‰IdlŽv¿`v*÷å´c°32ŽUÞµ¤I"-K;Q(Ä -¨þ²´£ÎÓ. ôˆÃ±jûÛÚd™›¾;·)ó(”We¹ D@Íh1*Xo->ñÎØ2åÔ”¥È$yX"ÈXIdnŽ{¿`x*÷÷ÊÙ(L ‘÷@@-)’HËS’).%_ Þ•¡žGq׿¡˜Ëø8 zÔŒ"ÓŒ©2VäocŸ3gšõqD ãÙ¬ORF"‹²>ƒ_°=•ûbrL‘ÀTäP ФÒòÄ%*ðR};FeèQzÄj?l^ÿD,BD^‘€šÑ$f G\Q«òyêÜŒAS -İ¢BE¸ŒlÎrÐá¬Oåþ rð!gy7Ô‚"©´,y©ë”…¬o:Ï@Êøk. - -ˆ[\‰¬"”j¿g‘ˆÁn©ò·p>*¥÷à  S6Òs‚ž·>‘úr2HÙJ̲> ¼‰¬<û8Dn ô¡2üó(=⩯7/‚š5TÏ[N™€šÑ&®}ªº"u>ÏF¼`TRsDˆ,2%0öÎÈðl ìð SÊ}99°‡°¼+ I¥eÙÆ UÆRÉ<ÛÆ¨ól ¨ÄQ³EFjĬ4£@òª… kð7n~—Õ¯Z)ó¯Zh5¶béU‹Æ/˜Ê}9çd ›£bùé¨%EiyÎAE ^xÓ2Fe8çQzÄCÓnŽõí±îï7Cs0_ëêï«O³Ý=ŸR¬ïLó%™lÁó&ÔŒ qžT !Ë26ÂЖ(G[݈h«;RŠq’DFŠe(ð *¦r#ŠieξÍ€Q3äýíQ š¤Òò£Tgà ߟQŽy”YÞŸnmºs{ì›]s«/ ªÛíÜ·áJ ¬:5£O\U@d¢ˆ2|”Ûò…<拾3æ` -‘xþ&vɬ´²€"“e* À*N"˳¥…Ã/ÌA*7"¤¶Ö2-.JÈ „Ì;# I¥Y>n -ÁÍq„wÝS Ö3î`ÉÄÀ|Йè¯tÆg4^àXѾ%C­w¨úòòÔq ªQxXeÏXL$˜Ò;·ßWs©–©¯BV¿½ïš­?–Q^Àêzªf_}Øû“Ãd{þ#œàØ×õ™ógÖ7-‚:|á•éu~}”¶ãõÌõÕŸæ²dQòüè43zœ%S$$-ÑðŸ§>KŒ˜fÉP–Df²d¨Øìãc²Y²Ã/ØœÊ=“±Ì a¼dù™¨5RiÙ½æ|¸6Be¸æQfõ†n³kû¾Þ¦LÃò–< fF¸FL‹xøÿÀzƒË `m»öWŒéÝÉ.Üí5Øtc÷ÔV‡fk/¾}÷^7Ę'ÛSíûζNúX•n ÷ÝùH÷vþ}÷h›Õñ©iï¬Äý%Yë¥ßÛKËtýêÁöHâð¨'ï ÏøYÞ€Vï¯^Û6ÐßgsmuWêvÐ'ÿևǡ)ŠS·âÛÖǮúz@Ãþ«™e§Ï¦I¤(‰CAkf ýzîí0øAgv~¬‡fèí3 ½i¹é‚žµý<}ÜUƒqcîÈãn߇?uëödNRê»ÖBóm±òñ¾nksrP_…ÇÁwG;ß^¹x;êûS8vçƒÓ¶;Â$x´ ±Ý9?iE,\ˆè ’”øùЖèó3Ça—£Ø[hn;%P…@þ-¼oŠÔ7” GÓðÿõì++“çüf»?íŒõÔŸ1¥@Ÿ݃)h¹þpì]»LË3ÔkÕOìþ{ê‡XŽ=šú…ë <¦Ø2Áx$è…41“Òu¿½¯w§½W¥Úú£¶faiÄÐECR#ú ××îPp¬²W:éë´ -‚ªœêº“”)L¿¾õøÍø¹o.¦rµ‘ÖePø®nµFr./°§œ(t:sf -P šp ÄaÀ²HGôøt DCJþ©ø%¹£©0éPŸ 9$?µ J*M«¢ÇE–›Iå$\ÜØƒØ4" üåD–qˆ€'Î…¨t9DŒU^î¶‚ÀÖÏ Ïì‰Ä@ZÖn.Ë…½SŸåÚÓèt½ïªmÙh­[6[ïöjðöÛÍ(œ`‡½¥1Y™¹i‚øØæ•^Á`'p/šN'®ðI2´Ü¡qhA|±ؽ2…«9ÌÍçsöp™ÖC=5I!(Â'Þ(Œ©>M<TŒ/óH#e="™xGxx?g=R£I±Yh¡0ŸÄP™ó婟¨ÛlõMj'Ϙ½¬‡ÒÌÞýµµqž»àËÖÝvk2 èjZÛåF‡Të4¸ÜËqå÷¶6çÿ±ëìþÃ\A¥•ñ¤ÁsdÑ)ÍÉ0#ª­šL«þ©ìI„Ù-4—Ö@¡ºÞk0›×”ˆpBÒ}“N-RŽöMæì$…ß7M ’¦9~èo_eØû3ü \F+Ö¨lf×þDthëG{ÃÑZÆ)c=­{IñL‰[£ -±*&kÔóEJ“bé–‚qê]½ƒô“Saß ütsõ•Eݘ$Y£|’¬{mŸtn†›OõàîèWèl¶Þ}­ "ªp«‚\æÓXP¨¶ûºô?1?ÙÙ›:·Ÿ¡Î3-[`¥†:|J‹›çõ¶:í‡(]vd›s#3Ï‘˜\¶¾Õ/:æÊV…h¡ä8÷›ûHÿ°ifÓƒgë_þýÔóË #eRžùî–úü qJiÅU‘Všî‡V©êÿ4ÚÌendstream +xÚÅZÝsÛ6÷_¡Gy&BñM°onbçܹ¦=Ç÷Ôö–(›‰tE)®û×ß. ø%*™ææšé–‹ÝÅo?P3ÿÄÌXfS™Î’T3Ã…™-·|ösï/DYD¡E[ê‡û‹ïnT2KYj¥Ý¯[ºãΉÙýê×¹e’]‚>ûó‡›Û÷ÿ¾»ºLôüþöç— iøüæöŸ×Ô{wõÓOWw— ጘ¿ýÇÕ/÷×w4eƒŽn?¼£‘”šJï®o®ï®?¼½¾üýþÇ‹ëûÆ—¶¿‚+tä‹_糸ýãg*uföœ‰4•³í…6Š­TÙ\|¼øW£°5ë_‹Ÿ6Ž©íl¡4s°þx”K„¡Ä¤Ì*©š(K1å(…Q~><|Ê_ûΦ‚+gm}ƒUƒÌÈ¢²µhjÑIÝ]ô¶„`CØÃ¦@Ͻ։ùþ©¨i¤zÞU{ÉÂ`Qîór•¯ðÉÌ×ÕŽ†ëç|Y¬_‹ò‘ž3jÀ·M±¤þ_U™Ó[è®j^ÿœïŠß8—Ëì¸dµ&éºx,³Æg¶š¥Z9è–#½/ûÃîR¸yŽJ´Úw>~¼~K}Ôám–dG}yʃðþÉÛ½Œ”ÑæÊVñ½µŸ¨¶ô´*êOlÅEŒ! ¦a®Š ”Õž:èàúõhLv4ã]| pyêeeèÀ»ÕÑ]Ë©CÛÅY ™pøLÝü¶¤&ð¥ÐXŒç¢ÞÃÎÕûbY÷×’CÞˆdÚ€FjÄ‚6˜…4ÌiÕµàv‹~w£]öÌJ@ +÷¯ç¾²„¥JF™7¸›Iˆgjçu¾ƒ]£þK±ÙPïSž?‡ùèr¦Šð¼†‚7tBNAƒår¾bùD£Ë,¼ñÖ^¶Ï€;ùD0ǹˆ¡Ò¼¯Ž»O޵÷I&L;k‚cǽY`Žmò‘P@mЦyc•£ e b®ìA­ M»ú$L9Xewm©Ó¸k¤¼[d¤Â"[­vy]çCð)X ánÚŠFjÄŒ^”e‰Ë:vü\n0±™oó¬„ +¸> \ܘð;°„$9<ÐŒ¯AP>´°ó{ˆQk}ñ„Ç l øR#·¿P‹þR ¨óðŽLETÁÐ(:¡À,ŒaÂHÓ­3õSuØà&ë„ m—¸ª¶´í0BK-»ºøœ·‡êjsh‡1òVÇ Ò䥯‘éüЦÊ(œoŸ÷¯Ô njÛÖàC½æ ‚~HBèá!´+³Íæu¬z.«áûxh*y»Ùsþ'õ>| „#•—bÿdêºZÙ>&ÀãæÞ¾ + à¿‚ÿ¢JoŒc‰²©7æEEjæùŸÙöyƒÉ/9Äv£zþa†-«->’8Ûž3+ÍÂlF âëRÌˆá·Ø#¿°'RÉ8:Þ.ƒ: õåûÕƒûþ{!•îÆ”êM,ÙHµw­Ic=•–½\Jà..Úæ7½­ZW›MõBœ‚B7Êzy¬P üs?j,m³@Œ¤t*ìWâ ií ×rB ¶™‘ ß¼¢æô¬Ž¼å!…½á®ôb؃ÚýS^C”©^ö\ú²°Ì!`'-h¤FLè²AàFÂÉ® t +¸r¶de#8`¢s ãL<-ì$È8J-÷0ƒ†N*œÀGVÕ6ÃÒˆc1=`˜¦ÃH8…5l›pIË=eknž-cÇã;™g‡ýSµ+ÐZŸ…0õù¿´›IÏ1˜‰ÈUS`4Ú +݈`ç‹©jîŸ}I@õµÈ?¼y«ÅÌ»¤DZº_  +Psj?Ú²©nJ1©u#•ç« Õ§´1K¤meIkzOîJibÌ<‘ó{¬ Ah›}Ê£xÔ‡g([àAžÙÃH/YýV¦86XÚ%T‡åüÀy’Ï#RcŽÝíÁS¬Bç!HeÔÔ‡‡ˆ-|ô0G#ìŠÇ8‰Š»b]¾ Zq@A–,ê7c]Šï’“2߇҉5±ÃM€ Ds|MmFM‘<á¯[UT +·‡°Ìq _ Q‡¶Y §~&”ò1þçoS6¥˜ZG'x>>rÖ¸= ΙI¤š¦¤õ  +×'¹8í{Z³ëè1žhX @x>xTÛ˜™mG‡ÿÉ—ûèÉÃkø0bS©Ô#§h—eÇãæ9ÛÕ!ªc̉­He—¼¡ì2Bœ%Ê.yLj(»l˜šH» Mò’Bd¯lH: y’.I‡ç@ÒeÌên¯ ™6JÒ q-6®÷l\%É8Gqxh‡lG³0›‘–.â¨8öÈzìÄ^Q¹6½#G0Ôº¤2t.™´Æ|¢­ÒöÿIÏ…Õ,¥-Tž&è½h²/£ÛÇ·åàí!ÝV9hÓm™ˆ!ÝÆÁã‡ÄDt#ÏD·±ç«FG Û8Ï ”&ºíÅŸÂt·Æ'¢¹mCѹ©vqÙ†kK@f±>*‰Îñ‹WÒãÚ2ut2%‘kc7|ßJ¦¹6¾²6m>¯%žhcë‰6ÊÑæéQ¤mOC¯½l—P$z÷Äö Þön4ZM$!LFZ­´g›bUì_> àip+Ð ÓZ$Óf4R#vtnF2 ÇwÇŽyÿCÐ*¯—»âùxVë‘Ò™&Œƒ¢X9OyÓÿ͸«Jux«(û+£˜K`ÃÛžÐäîqF»–ëüׇzÉ÷åÑKüQ®WÂômÒÒ0£Î@! +±c  Í8 >,ðNè3àkIM€/JÅíÂ_[àŒZ”Õjìû°c\%rÚ„FjĆð´b\8Ó5âï!ϵ7p¥·¾ƒÍW VGP§ ãÖŠŽ·S¨‹ògüêý +ÔqË`²Ó;ÐH±d¨mxÂá¯Ý©š^[ê4ð©þnÅŸûFÐg(ûàÀ¤Ôˆ!ôgK•²]K¾=úºþôàŠ%æ4Í\jUÇã)Fù3¾õ~µeÆ$bz©3– µM#6W¥É™¿*hKM 0Jõwlÿúœ+gNk9mA#5bB÷—17`¸`tløöØ‹žôL€h1Qø$ðvÇEÇÙ)ØEù3nõ~9ìà¶Î”æéô4Rç,h›†„: lñ ìZR°‹Rþ‹Ã.+ëu¸\ÖÕa·"Ojf’äŒÔˆÝOÀ)ä[ÏŠo¼¾ô±Ç™JÌÕãŽsw§°åÏ8>Ô{ +{Éh–ÖLï@#uζIè¥8’:ƒ¼–ÐiàE¡{µølÇèžfÚˆFhhEŸìA¢u¬øŸá.øÒç{šI¡ô$ßslk9r†îyñiÇZ¿wšKf¸4“áo„¦­èš5LÉ3˜;ÊLü +ÉàZÙf¿ø’j§ > a¦Lhd6t§™N¥kñmnµ®ôKóTN HЮåí$à‚ô¤ß}_7 »¦ÕTè™IúšÆ±0éS:²ü¾óüí?]=þ]¯†óÞ¹´@&PË( F¡á©f gRY9búqEÞ¯endstream endobj -1908 0 obj << +1907 0 obj << /Type /Page -/Contents 1909 0 R -/Resources 1907 0 R +/Contents 1908 0 R +/Resources 1906 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1927 0 R -/Annots [ 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R 1917 0 R 1918 0 R 1919 0 R 1920 0 R 1921 0 R 1922 0 R 1923 0 R 1924 0 R 1925 0 R 1926 0 R ] +/Parent 1917 0 R +/Annots [ 1910 0 R 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R ] +>> endobj +1910 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.879 245.6678 426.5323 257.7275] +/Subtype /Link +/A << /S /GoTo /D (tuning) >> >> endobj 1911 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.879 689.0814 426.5323 701.141] +/Rect [334.0699 214.9757 407.7232 227.0354] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj 1912 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [334.0699 658.2017 407.7232 670.2613] +/Rect [373.9 184.2837 447.5533 196.3433] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj 1913 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.9 627.3219 447.5533 639.3816] +/Rect [319.6839 153.5916 393.3372 165.6512] /Subtype /Link /A << /S /GoTo /D (tuning) >> >> endobj 1914 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [319.6839 596.4422 393.3372 608.5018] +/Rect [307.1508 122.8995 375.8228 134.9591] /Subtype /Link -/A << /S /GoTo /D (tuning) >> +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1915 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [307.1508 565.5625 375.8228 577.6221] +/Rect [334.8268 92.2074 403.4988 104.267] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1916 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [334.8268 534.6827 403.4988 546.7424] +/Rect [337.0185 61.5153 405.6905 73.5749] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1917 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [337.0185 503.803 405.6905 515.8626] -/Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +1909 0 obj << +/D [1907 0 R /XYZ 56.6929 794.5015 null] >> endobj -1918 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [364.6945 472.9233 433.3665 484.9829] -/Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> ->> endobj -1919 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [374.6372 442.0436 443.3092 454.1032] -/Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +1906 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1920 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [292.0276 411.1638 360.6996 423.2235] -/Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> ->> endobj -1921 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [319.7036 380.2841 388.3756 392.3437] -/Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/Length 3442 +/Filter /FlateDecode +>> +stream +xÚµ[ÝsÛ6÷_¡·Ê3lŸÒÔÉ¥Ó¦½Ä}¹¶ŒD[¼J¤+Rv}ýíbˆ_‚<ÓÜt:åb?~Xì.¾`ð_•°4— ËD1®ëý[ÜÃÚ»+îhVžhÕ§úööêoS½È“<Ùâö®ÇË$̾¸Ýüº|óÏ×?ßÞ|¼^ Å–Yr½R[~ûþÃw4“ÓÏ›Ÿ>¼}ÿî—¯¯µ\Þ¾ÿéM¼y{óñæÃ››ë7ŠÃûÂq8óÂÛ÷?ÜÐèÝÇ×?þøúãõï·ß_ÝÜ]úúr–¢"^ýú;[l@íï¯X’æF-žà%<ÏÅb%Uš(™¦~fwõéê_aoÕ¾:g?©L¢„Ì+ æyvÆÊ,a +¬¶Ò’');Yð9#;"´q±ëVÝ¡¨Û»òpÍÍrÕ6Çú\=fcõ¹áI–g‹Þ9<ÍTÑ“ƒ›,É´N‚|*K²~·uƒMÙ®ÕCW55M4w(ÓH©\'LHû_Vg$Gž'\‚ôjU5[Ázr‚6´v¸_ÐàcOù@×~•´_ŸôD¨ò,ÑcydÆÍ3uA ŠK1á…R$È;\iÎÁÊðf|=ªú<îxlËÕŸMñ¨ÉÐn1aÕŒ4 æ€Ti²¡8„¹Cҥƒ0' öYJ–&¹Îóâú &˜ò}95K2Õwæ,=Õ%A&Ü¢`Ì` %q0ö©Îƒ1PáŽuÓUwÏçà'U’fBÅ·T3ûœ® æËÔ ø21p¢ÆhïL$†§æ|Ø4\p}bqÏÓ_ÐyÊ÷ÅxK ¤27qãªK‚L¸Åñ¾’J› xëQEðæ©&Žš»qUž±9*A ša¹ âŒáf(Ãÿró—­†¸¬xu2§dé@Ùê<ýµ§|_å¸J´P&nÿ@uA)·8êäŒZÉ ¨ëQEPç©pÇ}U¯åÝ¡l·«®Ú—¯Èûâ¯ÙiKÝž§´~rzXA%L\…@5£Ã8]ÊS)†JXØòÜÁØâÄÌE +[*fÄ@°ØEêé/ˆ8å;€ +ã ÆÕX&(H¥y7V º É”[c +7y‡Xè<Â<‘=ÛÝQÊswhö«Mu‡•õºl§YÁtT–@4fXW¨£y_ ”4S”4“C àÊl|ãŒ'’p¯.é4--—±ÒÂÀýA»§P´´päqL¸pˆºzNK ˜ÌDuC ŠK1áE„ð(—¿1Å>4]ðIÑ‘SÐ;S'¬Rs òæJ‰—:n¦Á]e´p¾Øm)ùÔe)ØNež¬¨73œx4¡blwÅã\‚• +ÈsBB¿Þ6Êe#gaw7-Üšnö±¨vÅç›/ºÑ•üߦv£]ùXî°"?{¦¥†‹öÒ½Ñ§ŠœjO…züQ>ƒ­€¦æð<—ç‚Éøöjfÿqvœ3H|™Te¢Æ8;NÁy\G²c‘@Ý(šF³cGAç)ß3yÊôºÅžKªã¦T—Ęp‹ß \'ØËˆƒíDÁš#²‡ïØ5«Mݶåz48¦šAòÛ9M·ÀL¦Ifr>ØûßpÖà°¦¬ÖMýcâþH‡vC³wÍ›çºØWkzøîÃ'(ˆ/Ï4SìÚ†FǶ¤A·­ëÆß?8ÛøvÍ ‹ÃsUßÇÝ5_â±oé‘0M¡vIù04¢åöE‡R!b@ªO7oh À÷Ù[]Ü—û²î (§œ-o·e?, bT·¥'÷øÐ´mU[vˆÙ~=sê^ÛI*f\ +¢§¤í73г,Ë•;€åa_u-½*Ø‘³Ì|.é÷ø°):ë!d]oÕÖ-SÅÑÝq·{¦URlÕV÷µói[Ö`ê=…×Á2ºÎúÔUÛ}€±iÝì÷áÆ#x5 ¹Á¡Þ8g¡ D®Tÿ:•‰ÜÛ5ØÍ];p` &IìtdÇ÷)72ÉX¦"¾‚Bªºƒÿ¿™mWA€`ü”Ú¬wÇÕ^$í`èsóh«¡—Ÿ­Ò‰°#ÓÂzþ±ùϱí†|¸U÷+7À,!Áz$È3p‰ ™B,Ûõ¶Üw^”b½n¬Û7öt!E× ¶–õWn®Úº}Ù€±‚ž0iËi飂¸D¯©‹i'_õègbò˜+jHþZ´÷e☹¬@¦^3cúMó:OC¦:Zóâƒ=!iK•à/4B ¿°û˜kÏ6í˳VP‘i-UÔ +(.DŽʛ&„G ÷¸F ãò­E—‘°Y³äFüq.,¨D(“^ K)‘{¾ë‚Y;³}Ê¡tÇymæR[¸t˜ðÌìÙwM±¡EhQŠÞìé©óúÓ-¤¹‹¾pŸT6³‹6p÷u^à©=±ôë›Ó±Ë|f £§ªÛÒb +t&s…†] —>@rõXÎEJžÀº#odVU|Fæ)Ï^æÍó—xĤê‘áÓy$ ÉzF¡ôÁæØr7éÊSÎO8û çè‚U§ð:zÇÞ =Ôc4wjm/q%\º#–Íz}<аªÝ’ßýîØ¹¤ 7ÔRt‡XR÷»iJÇ«(Ôˆ !b!Ô¿Æ…½û‡ùðÛƒY+Èàâœcª”YbúõõJjÈ·H‹T„ô#]n±ðs HYÓ*šÜç”#Âd1Þ/ä˜YÚÎÍRorÄrNÉq„ᩲH‡Ñç¾Ñ-4c%±ùȶ¨ï}–YUÕlÜõ‹j»ÆírOL6»²mC]E;nËnªçXEUVÎ'YÍðÀ K-Œx§–°Û NÃÆÅÒ4W‰”,bôÖ§X$-èºþƒ&u‡ÇÂÅ3Ü:uVëfãÍbÏ *æ ëm€Ór6mŠ¥²‚gËõ¡Íæ²:á â4W♋a\÷r¥ÔåJ<ó¹’A¢<¸Jò½H|à24#ºÆ‹lmWtN†º|¢.`„‡r '…n˜ X\¹­eÂòl£=P±i5Žrاܠ{ášTÔ úéöæk¢ºµÕRùêgiθf ,>—[Ù?ìlSn¾³ÃŒ–ÚgÈ_ÿê3ÈáŒP.S¤$õ°ˆÇdpêj§8°š/cXÜžºwÅq× J¤€È™rÒ–zŒ ÁEG»[sÇ'OD–›~¾?W¢ #à*“:^£÷©ÎéÊvÒ@Éjuê§ ûAXZCJÝ=PÍl?,Ô!ÖŒ÷ÿ2ëÇZŒÌáø0~¾`"èËøù…'\Ï}³âÓnÄ MÅ ¨.É1á‡dÁy..´ƒúT¨yªSÓ¯Ì]¹‚³ +µãq`I¤&.D š‘BŒò¿ŒA$ˆñe:g”_bµz@ßÌ~+·èÔgà”µ*©ö¡´-†P\R¾Œ‰;þ•,¥§Ѭ<: ·À%í§+/üzWЇ¦—OÍá–†T€Â Åæ­ÚO0(­ÇY¶| -«æèVËC Jº'þ"$¾ïè×âʑ݃jztQ3J–ɹÖÕ¨ûªmÃ÷%Û±wjŠúyP +ºæî°h D¶ã +Å™/¬É0«º?ˆìå0a™û…繯íàZ`Ë}ã+ \Á³P—+0ce¿Nà‘Žz8;šhì§ +|ùÉ6¸p.>Ë¿ÏÒnf‹/‘§Ë×ôb[º÷ÐZø{¸6Ëã®<¹ˆbÚ ²C‰sµlðËÔºBYËÍ+ÂÌSïcДÅÛr¹ôŒÝteûvÁCç7·)ëªts' ´´H= ¤¶Õ;Ìø‰“ qýíxXðÀÔg·¿ÿ^4“lÈÑÚ1Ç2צÏf+±«:‘Ÿ‹åû;Zp½IÝ‹‰ðP«}ùùç±l;Z1ÛâÞ3né×—Â7°Rö=L¤À c¤m†Ù‰Scž‚máÅb®ª½ýôþ;"®9¸³µíÌÂùW£#ã ð<> endobj 1922 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [460.1655 349.4044 533.2211 361.464] +/Rect [393.041 737.4993 461.713 749.559] /Subtype /Link -/A << /S /GoTo /D (tuning) >> +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1923 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [368.9978 318.5246 438.8121 330.5843] +/Rect [402.9837 707.2169 471.6557 719.2766] /Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1924 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [293.1435 275.6898 354.3435 287.7494] +/Rect [320.374 676.9345 389.046 688.9942] /Subtype /Link -/A << /S /GoTo /D (options) >> +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1925 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [329.3035 171.0954 407.7186 183.155] +/Rect [348.05 646.6521 416.722 658.7117] /Subtype /Link -/A << /S /GoTo /D (man.dnssec-keygen) >> +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1926 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [427.0093 171.0954 505.4243 183.155] +/Rect [488.512 616.3697 561.5676 628.4293] +/Subtype /Link +/A << /S /GoTo /D (tuning) >> +>> endobj +1927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.3443 586.0873 467.1586 598.1469] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> +>> endobj +1928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.49 543.8497 382.69 555.9093] +/Subtype /Link +/A << /S /GoTo /D (options) >> +>> endobj +1929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.6499 441.0473 436.0651 453.1069] +/Subtype /Link +/A << /S /GoTo /D (man.dnssec-keygen) >> +>> endobj +1930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [455.3558 441.0473 533.7708 453.1069] /Subtype /Link /A << /S /GoTo /D (man.dnssec-settime) >> >> endobj -1910 0 obj << -/D [1908 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1907 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F55 1311 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1930 0 obj << -/Length 3378 -/Filter /FlateDecode ->> -stream -xÚ­]sã¶ñÝ¿B“—Ê3 ì½Ô¹ø.N_j;Óé$y EZb"u"eÇiûß»‹]€¢ä뤓¹X,û]Èr&à?9ÓÊAÎâ$ô”j¶Üœ‰Ù -Ö>œIÆYX¤Eëëû³7ïƒx–xIäG³ûÇ-í ­åì>ûyþîÛËï¯nϾóÈ;_¨HÌ¿¾¾ù† }Þ}¼yýá§ÛËó8œß_¼!ðíÕû«Û«›wWç ©•„ý>S8²áýõ_¯hôáöò‡.oϽÿîìêÞÉÒ—WŠù|öó¯b–Øß /H´š=ÃDx2IüÙæ,T§Â °òìîìoŽ`oÕlÒ_¨´§ü0š-YI<­eá Z[Ä¡ð¢Hj§e_NiÙb¡–7û²-›´ióÝXd^¤µžõéœî°&Ž÷{ÇËP{Q,äðü»<'µ·kdy³ÜÛ¶¨+ÔÈØH˜$ö„&À”££#éÉPHF.ª± ¿óƒœ´¶[ÍhpÛ“Ø¢¿"ðU’wÙI†^)#Oð£C/¾:­x‡õÔïÀÁÙ‹b‘xqù¯¸Zë„«Y,c$cž_„ðË|ñXï6i{àqø’èÓL8¬ .Ç åÙøc§­ÇM 3â@KOÄê„ã©ØÓI0÷”ã1ú+rP=êxjÌPè'žR¯Àa½ÂÈ!µ“žÅÚÓRD§=¯uÜóž˜UM“/ðo¿Ëm½(*9ñ…ô|ßO³â°&xé‹ï гñòÿIx'%‡ÄÄuB¸ƒ<‘=ú„:üWÄ?¤ûÅ 0LÀ_ g¶ƒÃz‘jÎ GJ^„re€²‘§tB¥²ék/„bB1ÿæ¥J7Å’Døi›¥-[òǺ,–EÞLA€ÛD^)ʾ\Ç„‘©càÓì·Ûz×68Sóö¹&pZB–©Ò¶xÊ °ÉÛu54G1ßÕ.­Úâ\Ϋ–e‘W-c‘£Á`W¬Ö-Ãj:h›ï0y0srÁdoäjúèÀJ†²Hé%J‘v~¯«ü‚°¬+L‰«ýî\êyžôá¥óøCƒ=À„M¬iYÖÏ :}ê*÷=-B›QÓ*›¢˜xÆ!R‹-ÚæeŠ¢ò9fìÚÄ!‹CR4[tÙ§¼|9—R’߀5±"K 2ƒèJb¡Ìîûi 1ù¹[à5/ˆ¥e~Y¦û̈xþ\ï>544&ÅA“nìjúBƒ”q ÐáÍ·$ÅSQïyå)ß5 $ÏЉð‹.éÑ𺥯ñ+F[*Zï2zДÃQh]‚R¼Ëmà_›¢i\ÀG‚ï¾5iõÒW÷²6ßÌåÂ!Re$ÆQQ):¢ç<Ô˜%fÚI!’ä‹ï5áÞ6œó“¨âc-“¡{²¡Ú!H¦óºÒPuËÿáú“8™`,ö­KÄÁ<ÿ-EWoÎé!è‘ –Ò”óÁ[ŠònGMÅÑ2'´4ËX®† ->£ª[v)?ð|?d8ÚTæO)ªc®qÞ­Û_ý…Uæ"Ëé’šª£ lÖ¡«µ¾@‘:ö­7w…Æ‹­0ˆ¶YDsoó\´ËµÉ0«y€¼‡;ëÍfºÞó}(ÚÃ@c*P{‹`¨Â²^¦åÛ Q€žˆÅôÌ]›Ìï £…)±1HS™F³R÷D†‰IjRuÇÚ ‡f*ÄÊóC×áá½—Mð˜8²éÐDP]åà†t7u‡ò#8‘k0àøSþÂh& Â`[¦KËw;É?=t\péø^¨¥†'QS’k$d]oÓ8«m˜fshÊîòd»ö^$ä—HAÀ"ÿ#÷n†1[˜ŽÉ[EËm°a¯þÄ£âSÞùÁÛöu7ã-ÿMhëØÜÔ â¨ëõp†~Ù¾lsšýÜiô뎈]xÕ ®è¹ ŠzÒGQ÷D€½7Tî‰ Â‡ªâ©(óuUJÏ?VKÞšÒ§k±aë:å}Í~¹„èÖ¨¼Ô–”Ý^fÅt€Ö¸ÈÈ6wPsù0ÎvÅêL²æ(T³Úv)!Y2“—Á ªéû¸ß±ShÝ=ÏnW¦'¶ÏÀžîôK‚öªé„+yÝ“€ÏØš̉íM&rí4‰×>u„ºÿ`Ó¡—ø „k‰ÓY÷‰¸õØ­kK€À&ƒ0]Ú\›’qa¯´1rÎ%f…³ÊØF.\yŒ:ûá̾l"{ð1õ¤Øc&&Ÿ:njtXéºÁªSS§Ìf¦Â=‰ã*¶Ö&Ž ‚ê¿u@ØT×.·‹&/§r¢ô_º7ëIZ>´cÊ¢Dm%{>¶—„¹®Ÿó'‚ räúâ*KíÃl'>%3Ê -“€3óF(ºåÙ°O–·7¼xv{¨[ƒQڌȽr)>tb‡T~R{À‚½K¼¿Ëht";[ýŠXñ>§_Pï6õ öçU¾ªÛÂ^dæwBW8zàæûÃÝÝý‹;iû>Cðh‹†ó¦?O™`?èÒõôÁ‘KÓð&5ÿ>ß=ÐSTÝnújYlÓ’¦ô«…êvPË„Ì s½¯ œÚÞ^~ʼn½(q?~Âîþ‚õž—Õ›´¨¾šêé´¢I4xàñÙå-#‡5„Þ0°Ý©SÇ!uÀ‹£Ð"º\#Í-]®á‡©Ð užRèYt”h4Ý‹“ﺨ¦‡Bkʶ5¿¹¹›&—mÓªá7ñöó.úµ›Žm`ÈòTEîó×W[‹ÚÿMe»ï'u e´ŒÜ+ì å*áR(wxiàol©½ËSú˜òpñyŸ–ƒŸœ¤kÕ¼c÷(cý‰¿C€l»?ü7ÝL†pMj}ì|Däi?‰-S¨Š$s®í)íǬÿ¯‡ºoendstream -endobj -1929 0 obj << -/Type /Page -/Contents 1930 0 R -/Resources 1928 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1927 0 R -/Annots [ 1932 0 R 1933 0 R 1934 0 R ] +1931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.0267 278.469 385.6987 290.5287] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> >> endobj 1932 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [317.0267 736.8562 385.6987 748.9158] +/Rect [356.8967 248.1866 430.5501 260.2462] /Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +/A << /S /GoTo /D (tuning) >> >> endobj 1933 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [356.8967 705.9305 430.5501 717.9902] -/Subtype /Link -/A << /S /GoTo /D (tuning) >> ->> endobj -1934 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [432.0945 675.005 500.7665 687.0646] +/Rect [432.0945 217.9042 500.7665 229.9638] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1931 0 obj << -/D [1929 0 R /XYZ 85.0394 794.5015 null] +1921 0 obj << +/D [1919 0 R /XYZ 85.0394 794.5015 null] >> endobj 606 0 obj << -/D [1929 0 R /XYZ 85.0394 658.3825 null] +/D [1919 0 R /XYZ 85.0394 202.79 null] >> endobj -1318 0 obj << -/D [1929 0 R /XYZ 85.0394 632.0762 null] +1317 0 obj << +/D [1919 0 R /XYZ 85.0394 177.4286 null] >> endobj -1928 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R /F48 1228 0 R >> +1918 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj +1936 0 obj << +/Length 3560 +/Filter /FlateDecode +>> +stream +xÚ­ZÝsÛ6÷_áéËÉ3C|‘àõåÜÔIÓ^’»Ä7›¶”DÛ¼P¤"Rq|ÿûíb$(Q¶Ót<2X,‹ß~€â4†?qj’(Édvšf:2±0§ËõI|zï^žî3÷æa¯ï®Nž½Péie‰LN¯®Z6Š­§W«_fI$£3 Ïž¿}óâÕ˼»8KõìêÕÛ7gsiâÙ‹W½¤ÒËw¯__¼;› kÄìù»º|G¯¦ñÝ«7ßSKF#Dß]¾¸|wùæùåÙoW?ž\^õk ×+b… ùxòËoñé +–ýãI©ÌšÓ;¨Ä‘È2yº>ÑFEF+å[ª“÷'ï oÝÐIù‰8’*‘”rJ€&‹%•à»]U´°ª$åÛ3agUÚM±,cY¬°!™•5½èn \5Ðm!T'ÚGHu·Yå]1ß4U¹¼çî!+‰‰R-÷þwSó¬Í¦+›ú*©˜åõꀱdÖÔÕ=5¯‹¼.ë›ë]EõëfË/ò¶+¶Ôi·°½*³Ÿo‹™9‹ÔF66 sBD™1Òñqdi ¶46O_Y¦ŒïÝvÐy]Ô0cA†(i›Î6´ ^àZ33+÷zäT]65îÁÍn›£`¨±ØºánµP¥eÛc;#uÅ^ÒyU5wsZÃó*I2Í{×Ð,‹‚D¨,ì¡•c  C™§éìj’)c# õÚ’¥Ù_©ôúªYñ9_—µÓfhGi¸æ¶¼©6`çkjË©º.Ú6¿)¾Å•é`D³sëXÔ-_­x]-u(yŽºéXŸ¤Š2<½, 'TŸrvŒQõ@A¤u@8½jÛ˜7?¦Í½0ç«u †ƒx(È,‹¬Öâé‚´©ÔÜ{{fgpúi²»ÛryKÅe^SaÁïÚ»²[Þ: €ZÃo¡‘àpd³^ã©ÐB©áÄ«£øú”Å‘N3G +U5˼úvb)@/N2Î"«•2ZˊʤeP¨z^ﶬ¶÷[î;¸é™3V  6ý‚Zo:cOÞ«„Æ; ?]‰æÌÇ&˜F#ð¦Ü_Û@?°Ù…çÕêœÞõÎtéß§ý{ë P³CPhÌ—ksÚ\xÇ&mŸ +)g@‰YaTÙߣþ¸ò8( †Ç™uÙìQ±¶žę̀MLL†ZoTXÑGƒ +¼Sç§A›G¦’ ++z‹qµ;GàA…‰ˆ¡”‡ºn¹™·Eu=…‰"RRø `š–„pÌø.I×è£ÄÒHbxI=o›»â-‚räââz•³• Ö=[Ä'¾}FŽ2QvŸ}ìFJ‰d¬à"¥e×»¶ öpoSE}dc®¦t; UÓJÀºœS§A“݇–œªà‘¬–½,ü¡`wàM³]çDh$ÎiÛudc|\F“\ï½âè-˜ócéÇšBp°À{[Q ­ ²Eî™kq[ŠØ|b90Ÿ<..åÞåì´ýtùO*Ÿ½+…5Ã8Åý<7HÄûÀsÉþ§Ÿ’ɶ·ùp0Ñ‚;vçGO¹Ò¡` …‡Ïþõˆ¬Éòð–ÏýŠÖ ”·{䙯ûekr?©ô‚±KZx8ÊItb^¾N£¼dH‘F¿Û6£XÎêâ¦éJoÈð4Ým³¢2q…¥ß/ß¿Ÿ£~q$íó3P €€°l7å,g‚á¡S$7ŠéÕÑÃV‰ÌÌ~*¶ JE5-µ€¥¯—å#¬¢<ñÙ  ™‹y¿¥æÜÇö6Ä9›FIûØþXìö/èïE«f—õ7S1} ¡h–Œ<’UÞ3rˆ¨bCå£Ó^‡Ô¡_šhß±Ç$b '¦t¤­NÇÀ Ú= ±d'“º(¦Å¿ 4ålmCß¿y?M*-ÛäuË ñ ÆóvBßͦ> +ƒf@yò‚’~–õ®êÊïÊ’)Ñ›Ðî«IÙ‚-’> û€pM)!„;6`NºÜÛòœÎ=œÜåÕÈâ“’ ¡ûõ˜H]Ê5è_ +p½{2•kJAÙçç>læ¨ÝUQ:DBç´’|@Ÿ2_·ÇiY­ÄS O»/}"¯—M‚Œ—ÊÌ^gÖ’(Óý ²øÝÔD*í7yú¼õpÕó"è˜&{ŠÀ99¬IíXñÆv>ô'~>3pžêUsÇoÞÆÈ5Ä™yÅá¢3Ú!©uŽ)b®,Šª©oúxtÏCI:62i/Öޞơ’C¬‰É0cA(zR.p*°´:’²÷;dÛð¯kÞöjø"æ?™ƒ×T6\§‘•qúd¦¦-M Ìüž“x@÷õ {g’ö\§"MÆ'ækg”ÊýbÄy„Þc8#¢ôéÌ=f=eJYOPù€”OÁ=.ú>©5ÎB-ëÙ/>wŶΫ£ëLzwhïÃu†€ö"2*–Oùô@i¥qº÷éÁïåÁ<£ÐQh\ ´¸èGŒIÍûE¹4®ý‡ ZìÅ䄎.¸(¸>‘`û3©¼_~ΗݜX…W¿Å:ÇPó[‰…ÀÅ…ø¦÷µ°Ò§-°By•ò 26ùÉ÷îEÑç.)¶[ÈdLé~!HvCʶîŠÚçOCÓvh $L,;}Ìd€ßÑ[±0NµK0ù" ûðu{‹Z¤bk½ºè?T]å83¨‹Ì"i„zÔŽu抯D˜8a&KøT_x_ê/Ä "T1ódsz8ŽæSþùà7×çcwè@οBƒ„µQ¬¥ùC5(Øš?JƒÈ4‰/ éÙQ *Žb©ô#ƒ»¬Å#æ`J}tÜ;`Å7¶åº¬ +„ +]Ó»F¯œ°›FHL?›ŽÞÑuö.¹ÅkâÔ…1A•OK`/ÀB½<=½¡Z¯šC¦TºŒ¦ûÃâª.Ù‚OÓ}J1•¤ÇVùd†²òÈÅ51aå“¿&K"›%êðû œ ‚á"ß"ž§±õxíÍâS9÷_§ÙþÇxéS¬S8N ’vÆ=]òyÔ‰¾#Á&-¾¼+—˜PŠï°±¨ñ^¿¥QG.qé’WÎ=Jpšq²÷P~)Àt*¿à›5#õÔ÷UÚðµ€ 3|-Ìù¡Áêf©>ü4¡Ùù q³raÝÒe¿¢)Ëø3#fxÅ:º˜ó˜);µDnwü;PkÃÄWÇðca~õ7ÎÃà°QÊZ9ýù²L-¨*¶‘ +1³_`û¡¹WÀúÿ¾”ã÷endstream +endobj +1935 0 obj << +/Type /Page +/Contents 1936 0 R +/Resources 1934 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1917 0 R +>> endobj 1937 0 obj << -/Length 2611 -/Filter /FlateDecode ->> -stream -xÚÍZKsÛ8¾ûWè(m¼ ìÍ;YOmœ¬Ç[{˜%Ñ17’¨i;ž_¿Ýh"%ê‘Ø©šr•`èþúC7(1àð'Æ2ë¥$^3Ã…Lg|ðúÞŸ‰8f\·Gý|{öæJžy+íàö®%Ë1îœÜÎ~Z&Ù$ðáÛ×ï®Þÿûæ|”èáíÕÇëÑX>|wõÏKª½¿9ÿðáüf4ΈáÛœº½¼¡.eü|u}A-žŠ=Bo.ß]Þ\^¿½ý~ûËÙåm³—ö~W¸‘?Î~ûf°í_Î8SÞ™Á˜NY¿±A\2i¤9Œ ›$> úð£!’nðƒuc™/òyºÆü?4Öès!ᘘf«Šúªû´¢Ñyl©¡ØHUFFª‚ -S…ÀP?ÓSƒMHÊ”Š·„G„¾ÒÈD]t§'…2f×É ôd[ÃV0ádM]´”ñª˜çÓç[Ëœ·õ±\V0x §¹ÒÕ*K×Èç w5ŸC{1yÌɽÆBÐ/ºº)8TF'Vt•…H²L(1äï -›MQµØù”O30žR>Ä¡1[¦“9ÍÑèaÛ`%:®6äªP¦TÀ&—3€‰pÃYþ˜6i<÷¨þ 3X}G8Sà(ó*_ÍãrÚ£ö´¯Jt×ÔOyu_ -ت>V6¢/¯¶#«±QrãÎ5äGO¨]¿ƒõæqýùçeÀ†DKï5°Hî xò|#`zr^jIJN…°“ÜjiIåÚÖœÙÍIŠÑ¨ùmÅX£7Šé¦í€>8à_0Á¹Q‡[,ÍÅø…Öœ±(ÊŠZà<º{˜wù‚øù¼xŠü€cª àÚ¾dÏÔ²ÊÖ}˜Š4â4QŸ«#2 7-–ÉFqÌ}¬X®;]ÑNµd·õTÌZ”VTĦ‡´Oå+n÷Ý“ -ɸãîÉØÚ3žSaB˜'ÎY®²i%BÖ¤¨víí! ä É­L÷·^“ϸÑ»prK‚”ái$ã´¬²u^~6ãƒ8eš–Ù~^n3Þk… ? iÖ@¹‰çGRà}•”GîX{SfÛ‰èü°nlRl°÷Ø3$òÈ1DtÞšæ&R$Ù¤H(½I\âÔÅ]ÏlB8Tÿ·ÒyÌ´μŒ·7“¬sãs)-ü…¯W´ÂÓ€Ë#HoÖRøc—è}PQ¼•ñIAÙ@ú¡ƒ1ú(T<ìu *Af€ -ÖŠåü9NÚMèé $‘šùĨ.‹Àj“}49(- ¼P (`’û 2ã+r žkm@ÔaxÒ‘«þ.TÎñˆÅ°ÌG……ÍEbó}ú˜Qm’QäIEHl±í1O©rûöUBfŽƒîð> [âEV÷„~D¼ 3ˆÕŠnøàá.ô z¢ˆâ·|™W9$Ãõ°«OT¦³êeI ù2ÜoÞ…±×½·‚ç7ìüæÓÈËáùæ‹C¨\}²í.íÃÁ^®Òi°xÞI;ê+K=m;88WáåPª’„IoÅ)Ÿ$$¸±bïÇ…Ä2‹¾s:LéÝœ¤^85gÖØöáF³€Rñ‹ók·†>/\·ði,¬GB tÄçGˆHÅðþËáÎGpá!4‘ЭDˆ  BÄB~Þ©‡½ntÞ\-äࢀ Ú›"¹ã¶à°'Û¡é˜Öf l“¾q_Uøy_¦5¿ë,Ü%#bת(Ë|2’|ˆ´Œ-ˆM,ËUA¤¸ J.°G^†•À ¹n9f÷3NqÐqË&/33Š;4Þü<àe ” ؆{¨™qÒ¿cîаy5ÆŠ¤[/³°t ¬ÁýJÚ˪þÖ¡ð§"ð65­ˆÍ0`ÿ4&ä‰Í'ªOž©/]>SCÀ V Á^fS¼<ì#¢ É‚ë«_/š–YõT¬¿P3r;6îykZ¬#¯Šå,æm(ôQÓ€tÖË¿ q³¸öôêç.Ï–³¸XÊê°LI8¯¶°)|ÍòâúüÃ%uÝÜ”YUvßœôHp„Ô_w>Ò³uY;µdû¹[*¨<·¯ÈÝò5¹[X¼ àúyãÚœåêÉ[8Î0Ϋ“w[ð~òÆ­%RëBßâ…ôÝ6Ë_œ¿Ý+P­æÁbh; ÂÅ:Û¿Bã 2_ü›·Í5°¶s²ÿçl`0PQÀñŠÀïÝÎ/òêÇÅQ­¥ÿãÜŸendstream -endobj -1936 0 obj << -/Type /Page -/Contents 1937 0 R -/Resources 1935 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1927 0 R +/D [1935 0 R /XYZ 56.6929 794.5015 null] >> endobj 1938 0 obj << -/D [1936 0 R /XYZ 56.6929 794.5015 null] +/D [1935 0 R /XYZ 56.6929 273.8839 null] >> endobj 1939 0 obj << -/D [1936 0 R /XYZ 56.6929 746.113 null] +/D [1935 0 R /XYZ 56.6929 261.9287 null] >> endobj -1940 0 obj << -/D [1936 0 R /XYZ 56.6929 734.1579 null] ->> endobj -1935 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R /F21 930 0 R /F62 1352 0 R >> -/XObject << /Im2 1341 0 R >> +1934 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1943 0 obj << -/Length 2894 +1942 0 obj << +/Length 2357 /Filter /FlateDecode >> stream -xÚÅZKsÜ6¾ëWÌ‘ªò xñ•=9Š”(IÉÞѤvó:P$¤a… É‘¬üúíFR¢,;>lé@ ÑýÂ׉‡?±JBÆUªWqªYÈE¸Ê뾺ƒ±ïN„ãY{¦õ”ë›íÉW*^¥,d´ÚÞNÖJO±Ú¿gß¿}¿=ßœ®eȃˆ®Ãˆß\^}K””>gï®..¿ûyóö4ÖÁöòÝ‘7çç›ó«³óÓµP:”°€rKüúîꜘ..:?ýcûÃÉùvyz,ÁÊû×ÉoðU§ûá„3•&áê:œ‰4•«úD‡Š…Z)O©N®Oþ=.8µS—Ô¤¹`B†jµ–IÊB¡õËûÒöuM)Æès¾/œ;f:ŒAù!×,Mb1*_‹‰ò…V,Q*\ÅaÊ"%•Õ¾ù0˜®É*ÔÏWRN&Äœ¥R¡ ȸݕýéZÉ$èN“àPì¤AVUíCïfO·‹C8jê&7YmŠ…-”f2 -ýCKæÖt´ü°3ž–—}Ù6Ôkoiøag€£#"L‡@!<-j -ÁÒ–ÇÅ­ ä}îÊ{ÓPó°/²ÁP¥°\nlÔí™©Û†Ùø|‡-ʪÃ4¨A¨¶€6x!JŠ´¼­ëCSæÙP6wDz(‡1 ~&­NmT7ö{“¯çûQà”¿s.A­ëXª lè‹KY=ƒ—õ ®“rí­Q¦ÊáqÁ !„…”Â1Ú ªâÍé:Ñ‚¤Ä=nÛ®Îjãùðû°+ó6% -Nv 8Pbß×À4ΉyüLÿ³Y^ð0‚ðšÀM¦ üWôΪ֥ngXö2Íãú¯CV ¯Åɵ‰;n]§!`9f)@g:D¹äèŒôÅTˆžÅåñGºùœ—ö^ÂþÄÃñüß:6Œ¥và¾ÍwÆâæÛ˜¹ÙDÞl®/¿{Cí«k׸~÷v$Ÿ¹…š‚f#I-óÓ”n›ày†’éÆa£8ðH¨2ØPqŒµ¼:”0`ñÖÛ«_vY¤M ÐüãI“Ô¨ÃQ„ñ¤@vGAΦ8’Ô›¥Èw0|< «@JcÒ쉀DI¦ÀTÍPþ(¸j7æÒp vKÐRIAî©­`Š -$ÖYá§¶D)Leürt<•¸äž»tÛ»ÑÐZI—ŸÝ’€Ž,YÊ)|Üœ¹$wtE º©+ز|çK·²FÈ7Ðí6acõ*4Sr#"Çj²‚¢àˆ˜:…Âá×¶q»_”•9Nõ§°SgQ,Æ©L¸ÉSO ébµ¯Æ× ÞÆIúŸ/V}úsï&À][/äCBŽ\=-ࡲ„y"ȱTAçN¢ "­ÞŒiä¸i©àhP»*L‚[ê×4¾¹8#2ZÚ-R˜>ïÊÓÓUî¶òmÈÙ‘j ÷­o»tp\9wÜ›‰ãj³!c'>½¥{ÆØWépo!c+¡œ/ ­tc‡ÞŒª§kjCT’&ì7Uéë8±Ã—Ž d FVë†2?`LÚ¾Ó›&¸ˆkæm½o{¿€ß¿70ÓBKìâ;(hr»[,œŽ°Ž:¦Îy¡Af£HÜëšnüZÌŠJCkL¸É:±e2¦xÂNzNƒ½Ó—éî- k×ò:OÁLÕa±mͦG WZëå·~ᜨN‹/(ùHî‘à"HßC¦»?–"†’³sWÇdf}¨†r_¹éVWÒé #|§.ÝH(Ü~(ëòoç–óС {·ÙÈi>d÷‹w¿Ïû3üwý NÝÇÂ>“u7Ž™ÔIíÿÜÙ•>ໞÐׯ<-”–LD"^‰ÀlÙgsìîVÔØL!¶ç_O'<‡ØÏ×µo&w -³? êYA#Àx©g2=y÷\¯H¢aHÓb.‰»tfÛª®x~ª*Fþ×x¶î‹ªÐOe -y  -”UÅÈõŠ$ÏWCI\¡¥d2„3+!¶þj²ª,ÿèdS¼ãÓäx±Lp™»Æ¾~zÄñÇ¡¡Ž¹þÕš“ØüôÚç¥Áp'"|Á"ã/8v)%ò‡ÆÇ4%N(%â£)ž–€ît| ŸcŠÍÆ¿xP}hŠ—¦ò~™Žoô~ÿY¿Œ¹ÿ—ÕÊSúýãµÊiÅÓ—@…Á[T_¦É‹Ø- D´¾±ï,0࣠éò10«ÊÞy»4òظ˜‘Qè =ãÓ:oIŸ.KŸ£ºøwkч;fbEáþÝzb^âtà¦Ú‰N|)°ÇçÓþœ­'tG+›ªh¾´¡P‚‘Ps¸dž†6]þ8©ˆ?˜Ù°¯î`í ʰ¡ +R¨7Ä,˜_‡YP"§óÎÐõ’jº~Ç5~ÇuýÓûU¯Qh¸÷³Æ§ƒ + kl¸Xc;N t›Øv:=»¹¾ý¬éÂñoÌ•ÄКz•Ó0‡8‰“k^èvÞ˜:òí©#š¿À JÈ)%ÁSö†kXÝñ>2„k²;‹nÁûô¬në2"ãðÚh{yd4Á(´>5o’^r°Üð¨g¸æcÇñ¿–G]€‹GB%Lrc_Ðghbö3 ¼4Ã×ÿLR.a\JS=]=Ïýœ!€ð!º‰Nü«´ wVÏÓoå&½uC@²oyJ™›wŸ(ã]*yN äažOç”ݤW5´Jý9ú78DðjE¸†Â-ñvI%B‡Â+Q^çiݪ]}¢4ÍUE‚¼ðØ´Ýë^rv~>fgãOÃDΛKÐyõÉv«tâŸ2«U:Í =æw ž;QÔVºŸK¡Yl¬Å¿@>ã“”ŸíEÿ'˜\\,><§ÔâÉûa;=ð“j;LÔµ[{IÉ™VFE`$ N²ôæºPcaˆhÎŒ’ÍkËG¸Ù‚ç†ÿrpñds S¡`Lé$Ó!”Œþˆügÿƒoåýr7Ûà§WK—°¨¨»®¦çQ·k¿.»õèbà +˜É¶\sã'}UãW:å-¡/å:«ó)ØëGªZ•U•O†p A·…Ä(¦Õª¤× ž ¼B´ÄŽØ†™ +@ž—`¸…<µuÊ1§as»góÊódqn´ùÞ÷:4ÊNˆÃµs¤™q29‚í|bÍQ 2¾åBÈbd°Ì Kˆ°u©_d‘•! ÆïÆÐšD+²lèÝþ J%éxÇ åöIò“GªK‹GxÜ`¢"›Ö>£´1¸°•a`ïÂ4@TdõC¹¾#±¿vƒpO«i¹æxU³ðÕÊ9ý¦I!õÇógaîáÅ_‡°ÜÛõ¬˜Q°®C$ž°HáúWá 1=¿>ûpAUãq•ÕÕvËI¯swÒ(u¹cÝiŠ·U‘'I¶ßŽKΙåBÑŽËcÚqϺ–'‡ì¸p?ÅÜÕŽ#y¤²ñØñn×ß±ãÂPÓÉ›ØqñJ;Þ=›¿¹wG0¹¨K vÜáL(öÙýu oÑùêß²l~è£Û®ó•aË^+n8ª8R†a_x¦I²{h ö¡ÕêLý†‘¹«endstream endobj -1942 0 obj << +1941 0 obj << /Type /Page -/Contents 1943 0 R -/Resources 1941 0 R +/Contents 1942 0 R +/Resources 1940 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1927 0 R -/Annots [ 1947 0 R 1948 0 R ] +/Parent 1917 0 R >> endobj -1947 0 obj << +1943 0 obj << +/D [1941 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1940 0 obj << +/Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F53 1303 0 R /F62 1351 0 R >> +/XObject << /Im2 1340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1946 0 obj << +/Length 2887 +/Filter /FlateDecode +>> +stream +xÚÅZKsä6¾ûWôQ®šføÒ+{š8vâlÊ“mwj7¯ƒ,ÑnUôèHj{¼¿~‚TK¶lÏd[S5AüÀ¶Xqø'VaÄ¢T¦«8Õ,ä"\åõ _ÝAßw'Âɬ½Ðz*õÍöä« ¯R–F2Zmo's%Œ'‰Xm‹ß‚ˆ)v +3ðà×Wç§kòàâòG „Ò¡ ξÿÓö|C‘ýæòê[â¤ô9ûpuqùÝÏ›÷§±¶—®ˆ½9¿8ßœ_Ÿþ±ýáä|;ª<Ý–à +õýëä·?øª€Ýýp™J“põ ÎDšÊU}¢CÅB­”çT'×'ÿ'œôÚ¡KfÒ\0!CµZË$e¡Ðúåui ë:RFŠqöœ¯»wå½iˆ<ì‹l0D£VÊõ²­"3uÛ0»Ÿ¯°E]u˜5(Õ@Cœ¢¦ÈËÛº>4ež esG¬‡rØ‘ÐàGÒìD£¹±³ß›|=_ÎMù;çÌºŽ¥ +ʆ¾8•µ3ÙÑÎ9)×Þeaš¡†ŒK)œ ] *Þ®-HK\ã¶íêl ÷‡ß‡]™ï”¨8ùA$@ñÜH¿K©iÝYlbÜ +å–­Ú<«¾^؆ +Y…¡Ûg`¿ç[°WÁµß¬ú‡©À`éNE,H‡,¹|cfôΫ6¤ngXö2Íãú¯CVƒ ¯Åɵ‰+n]§!`9f)@gÚœrÉ1é‹©#‹ËãŽ|óp^Ú{ Û“Çý ~ØÐ7– +Ø€û6ß×C†›/c>æf?{³¹¾üîÑW׎¸þð~dŸ¹‰š‚F#K-óÓ”n™ày†šëÆc~F±ã‘:Ðd° âxÖòêPP€Ä[ï¯~!Øe6Aã;MR·SàGÆÛm%›âÈRï–N¾ƒÙÛqèXZ ¤gw,J2¦j†úGÁU;¸>—&@±›‚¦J‚ rOmST€ ³Î +?´%Na*ã§£í©Ä%÷Ü¥ÛÞõö€ÖJºüì’̰gÉSÎà3àæbÈ%¹c(â¡Û¸‘Šѹ‚-Ëw¾t+ûa„|sÝ*à6V¯B3¥#‰‘c±YA%þâ +K„_ÛÆ­~QVæ8ÔïÂUœE±‡2áO#1¤‹Õ>Rp\ t,ü~§é¿w¾XõêϽwm½K@ 9põ´€‡ÊƉ ÇRƒ;‰‚ЬzgðL£ÄMKGû€ÖUaÜR»¦þÍűWÚMR˜>ïÊÓSUî¶òm(Ø‘k ÷½o›´qœ9wÒ›‰ƒPÏÕfCÆ|z#J÷Œ±¯ ÓáÚBºÀVB¹X@^éú½)UO×p¨ qI[°?ÜT¥¯ã°Çj _Ú2~Ë +*“u7N˜ÌIôîìJŸaЉ]OèkcžÀX"À°°sEöÕœ:»»› Äå×ÓÏ!öóy훃ÉÁ컿d"bB=Ó) ø™Jϰ¾zKðpEs=Ü•3«¢x †þT;xñ7–6ë‹VÐÏ‚!i%Ì«f¥ÞRäÙl¨‰+´”L¦"W[+ÙäÔ@‚‚q²)Ôñr¼S&ÌÝ`_?Ýâø3‡Ð!‹c®ÿ_eæäX~zíìSÒ‹¿ÝeÏÀ ñ¿Ý@õbJ)ü¡ñ§™R&ñÑO‹?÷4:¾‚ÏÑÄfãß <œ>4ÅËÏSu¿ÌÇ×ÿrÿ/v„zŪ@Ù_>^·ª„¯Žâé ŽÂà=Z/ÓäBlq"Zߨèð¯P@ºD Çr²÷]^ÆN2öTL»È'ôö(2Ôì{zlæÕÌ+ŽšXàˬzt”ŽY"yôSÒˆW~ºŒ$ã‰~+ú¹`¡Š\=³ýŸSî">k–µYÃ5)‚uUÞ;¦5uìM‡éŒ8T!ëøÒlĮ̈©¤ó7°J€ãwöÌ¡\ó²·Mi "pŠßœÕöÆ×¾®véÄö]Yg]i_U yè¸qœú!–­s0lEPåŒ6D"TZ:{Ëš‰Ií†Íý¥4âAÕZYpJ“øy"nÌT±Ëhܶӌã'û]{¨Š9)Ê>Ï0}%¦'Áòeñ§9g±Œ0÷D, +…\º6ùêÍtÿ©#pü; PH%‰\Žw5ƒ#üÁç²o¾œ?ûÁ™T‘ôbÝÿžáj,endstream +endobj +1945 0 obj << +/Type /Page +/Contents 1946 0 R +/Resources 1944 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1917 0 R +/Annots [ 1950 0 R 1951 0 R ] +>> endobj +1950 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [341.1654 175.0606 414.8187 187.1202] +/Rect [312.8189 175.0606 386.4723 187.1202] /Subtype /Link /A << /S /GoTo /D (the_sortlist_statement) >> >> endobj -1948 0 obj << +1951 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [434.6742 175.0606 508.3275 187.1202] +/Rect [406.3277 175.0606 479.981 187.1202] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1944 0 obj << -/D [1942 0 R /XYZ 85.0394 794.5015 null] +1947 0 obj << +/D [1945 0 R /XYZ 56.6929 794.5015 null] >> endobj 610 0 obj << -/D [1942 0 R /XYZ 85.0394 385.3709 null] +/D [1945 0 R /XYZ 56.6929 385.3709 null] >> endobj -1945 0 obj << -/D [1942 0 R /XYZ 85.0394 353.2653 null] +1948 0 obj << +/D [1945 0 R /XYZ 56.6929 353.2653 null] >> endobj 614 0 obj << -/D [1942 0 R /XYZ 85.0394 353.2653 null] +/D [1945 0 R /XYZ 56.6929 353.2653 null] >> endobj 1240 0 obj << -/D [1942 0 R /XYZ 85.0394 323.4096 null] +/D [1945 0 R /XYZ 56.6929 323.4096 null] >> endobj 618 0 obj << -/D [1942 0 R /XYZ 85.0394 266.7517 null] ->> endobj -1946 0 obj << -/D [1942 0 R /XYZ 85.0394 244.4404 null] +/D [1945 0 R /XYZ 56.6929 266.7517 null] >> endobj 1949 0 obj << -/D [1942 0 R /XYZ 85.0394 158.1241 null] +/D [1945 0 R /XYZ 56.6929 244.4404 null] >> endobj -1950 0 obj << -/D [1942 0 R /XYZ 85.0394 146.1689 null] +1952 0 obj << +/D [1945 0 R /XYZ 56.6929 158.1241 null] >> endobj -1941 0 obj << +1953 0 obj << +/D [1945 0 R /XYZ 56.6929 146.1689 null] +>> endobj +1944 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1953 0 obj << -/Length 2922 +1956 0 obj << +/Length 2923 /Filter /FlateDecode >> stream -xÚÍZÝsÛ¸÷_¡Gz&Âá`ûäØrâkNq%g¦íÝ=Ðms"‹®HÛqÿúîbA‰’-1©•©“c øÛïDÃÑ3–ÙT¦=—jf¸0½Éíï]û"Žé7ƒúíQï/~9U®—²ÔJÛ»¸j­å÷^ô.¦¿'–)v+ðä_Ÿ‡ƒÃ¾4<9=û”PÚÈäøãÑùÅ`D/lúþlxB=)5ÇŸ‡§g¾ŒŽN.Î>©{48ŒÃãÁ៿ .–[n–à -÷ûïƒßÿä½)|ݯœ©Ô›Þ#øDØþeQÓ‹‡lvŸSw}“ÅÎbšÏëâÎe^Ñ»Œ^Ü-…Oʺœ”3ê¹Ên‹Ù²¡çá[Œ‘°{An¦\ÇŠyUgóINOåµ5íeÙ&Kµqj -Ù‚âuð*í™Iíõ›û䘄‘žËŽ)ÜiitBòŽû:µðpX)/“€M^•÷˜ÄÞiVg 4Ž›ÕÈ«rq‹,DV^S[ˆ**jë§»øînx6Ÿ¾ÄER檼Íëâ6Hð+HLôXÝå“ -“Ìk¡²/æ­T²KÇqŽãnCÇÿ·YÍF„M™r s}éwë¶á™Îßà -ö VU[ä£1`Öiæ×þÀaDúªœÍÊÇb~Õ‡dA“œ¶–ñ¸e;ó‘ÓZû1@ØHaã¨F)Á$ÓhgGÕ_6Yº”t‹F‡;ýÿboÔWïS}-(¦Ý©½Ö&È â ܲ؂ Nnʪ&*›N£òVèßdšœÍé i%gCjƒF½Z£Ê …^j5šI|T’ìv˜xþÂo þ‚Ü<·Â'y5Y—ù´1Æ‘½§ÇD"f»î¶ Ù—ê6›ûþ%›Û?ê´ðœeUÒ“^Á?0·ZHÀóÁF¥Zãš¼=ïíôZûzÝ·®à†xk~Ä63¶Âg¼cÞYÕ´Ê)’ª#@ÌJüíà °]Eã5²Üe°fbéý³E]d³g Ð à›¢Ÿ¹¿ÂWèi¾­¼:.Znþ’+æÓ‚ÖÔE‰Z!h]Æ6h#óì6R7y´­ð(V#âÞjz -N¶½ÀÚî±woqc|]')èÉÛ_PH@ ½*ïçSÄ’§ÉàÛ]¾7<¯³YìjË&Œ.âl’M ¤<¶Êf›é¯¤ŸR #¬Ý-築¸h“OÇ'ïAµ¥çɧr’Ó!F^NãêÀÀè2«rê®òÅC¾Â+Å3À¡køVkûÜ@ˆª¶3aõuoؼÂKÆï0¯ÆfRÍëù'p{F‰äh]«ùšðSϬ¨êho7Q_™àC‘lµÂJÈ] ·¶¿/+ܘ}¢¬9ãÆt„2«%IÛ1$ÑÊAò€yO>–³iµ–]M‹ë¢nìë$_Pf:‘wø7@»Åï·µë}ûB;#,Ðw€«³Þ‘ß8ý6”¬†àm=+†\-Ø}é Zír^LÈÐO~_k=ÁªÃ3„ÖY0.^¯ÁCŠ8z«iÙ¨µ?ð gÈ2 ©:J`Ê!²Žâ×Çg' à<õÉ€¿“ÜWˆd9˜÷RÕ-®žB‚„7Åä†HX✨ɬ€aqF\ ¢ïrR€JLãÄ¢¾ÙMÔ˘9ýQ¢v\lg] “}qNƒo—üG”²™±sZÃvu‡Až 1‚%'p5È€Äò»Y6¡š’Kj°/A€ž–·Y@ è¨=@- T¹rÄ–@ÂÕ£mÌ€n«î`D¥R™ÌÊò+.¨R•Üß½ QB’‡Ðò -ÃÇ|öD#ƒ¶a -Osšƒ2¶ ¡¿º¿¬é9§!,L),\ üHz–ßÊU³sÇ]ªcйÈâ§q41YšÅq°ŸY3"Ú2´SzŸUôŽ~¡±QÐ1Áç…8´Iûë¦ÈmåÿŒˆ.á–ÖÉÂݛ׉âϵK’C©;„[YÆáË¢pÿ6ø'p[¥<×e r0ôN๻¿œ¢¿æOÑ5·ì ¾ˆ‚½šU×ómøêüO9_Y›þvûÔaˆ¸Ú‘´@د Ù«+W©…8Su¤Ø3¡L4DcÌV¥Yã“H£†ˆÔ$7YuCê¶hXˆ]…áÝšËБ…ËYfÉB¤‘…[ Ó[_û6*ûM%öäBðìò€òž»H¢?œöiíxéª Ãu=+/›8÷®¬ -Lú"®ãû»ÜÍb†ÛË¨ŠŸ>ï@´µÕ7Ù*Ë™“^t ê,“6¥3‡gÃÓÏ©ðr3².b -Äñù"¨ÌjƒŒÀŠ¿ -H -:$‚G,€2:j‹3¼ â _â¶¿ô ‡¸ -¼„®#[V”*“ÚðÝgçãÁqð&Ò)œÓ™ØÄ´Õš1ºÍë›2š•ù‚­›£^+UùÊZ-»oÁV-B¡ ŸÑ2½¢p¬¹ÜŬ -o™Yà&Rîºì‘ôLC˜NÌŸ û†‡Amt'X° B“‘T4X©§¡r­:˜c(žŎзŹËïpî»KMí/ÝC~B-Z:1VÇ ªâšåÉš½„Ö£0¥‚Ö`Ó¸p¤ƒ ïZ.ŸÉ…·f…È ‰˜çk’/U3¼˜oç¨ãu1ÞˆÖåþ+=ÐöB&4¥ž`@iZ¼5õ²ÀÓ!©|ry_¿”TTu1‹®/f bT Ôøì–¢9š;CjYó1k%vèJÕŽ¶Å¶ý“÷ê+á³ (¡£´žY°Ã$]ÿ€Ðæl:JÐþPcóM`|ý6Œí:¤o&–&hJ>FóÆ-kj½Cv Ö*å’ŠïàEë+ßpUYjÁ„³9—„üO)ðû!\=„°%9 Ø‚¹\:?)SˆÇÔ[̯ÊpH¢Öà…!AÔ¥PB‡ðÎÆ¡ëæx+º´móÆÏô$7L‰Ž¨P*ÉÜI eê¼~,_ã1z¾x(š›xÙd²:”C 7 H·†šŽï¸öÐÞ÷~3ç½Æþ÷›òŽŠ¶pŠqÕ ‹Á€õñV–rKyͰvL]шEÊD“T>ÚÕÔ½ƒï1kb­¶Eb= -Øm8Ú_÷†²6í’q ã¥p‘ ƒãPòM@®b¡]ÆÌôîy@ Y1]¢¤˜0-ð 4Ž `‘âÔ˜•í -öçÈb-ï¡Áýáf°'£^3ê“ËQ" ¦íó\f\¥¬‰È¿U½¹Þ á?–ñÅR¬ŽDëÛà鑾 ¨ÑˆZº¤[Þ# ý­l–:‚ÔÒÒÔ†Mõ_òË›‰?r.¶³¤Ù׉#æ ¬Ç;ÕL*ºp±yO“÷:Mø÷Þ_Ýž‡ )ï·¤³Ò“-ºl\‹J`üÙÅvÁqÓ²ÖÚû€ÊÜendstream +xÚÍZÝsÛ¸÷_¡Gz&Âá`ûäØrâkNv%g¦íÝ=Ðms"‹®HÛqÿúîbA‰R,1©•©ã™` øÛïDßèyøJuÏ¥š.LorwÀ{7ðîÈcúÍ ~{Ôû˃_N•ë¥,µÒö.¯[kyƽ½ËéïÉñÇ£‹ËÁè°/ O,;ìË“÷gÃêI©9>žž}ø<::t:¹<;R÷hp: †ÇƒÃ¾PÚHX@Å%þu>РӳOƒÃ?/=\.·Üþ,Áî÷ß¿ÿÉ{Søº_8S©7½'xàL¤©ìÝh£˜ÑJ5=³ƒñÁß— ¶Þ†©/Á¤¹`BÕëδÛ•~ïFR*–â>×>Ú1m"¯5ã)_!/e y¡óJ™ž3)³Jªýd–UÕaß*­“£9€•¦I>Ÿ”Ó|Š>¶UÔôâ1›=äÔ]ßf±³˜æóºøƒs™Wô.£÷‹Cᓲ.'åŒz®³»böŒ|èyøcpû 6S.ˆ[żª³ù$§§òšÚŒšö²l“§˜ê¬•½6¯ÃWiψj¯ß Ø'Ë$Œô\v±LÁgI‘”F'¤øßÑa_§n,åeÀÉ«ò!“Ø;Íê tÂq³y].î‡H#ÄÊ àjkQEEmý|ßýÁ ÏæÓ—ØHê\•wy]Üq†ƒI‚«û|Äe²ƒ{-XöŽ•Rvi9ÎqÜmhùÿ6«Ùˆ°)S”®/ãnÝ:|c%·ÌËÔõú6•°ªÚ" ³N3ç¸ð#Ò×ålV>ó›¨?$:å´½ nÙÃÎÃ|ätE£Ö~ 6ì:j´lB1–xTýe“¥KQ·hu8ÿ'ðFõ>õׂbZàÓnõµF0©@8PY`—ÅŒpr[V5QÙtµ·Bÿ%ÓälNoH-8RTêÐu6¨(ôR«ÑP⣒d¹ÃÄ‹~ç[;|’W“Eq•Osù{zL@b¶+o “}én³¹ï_²™±sð£N ßÅ:PW%=iÖüƒ«…@mT«5¶)Á»áóÞµ±×}ì +?àˆ·æGœa3c+~Æ;æU]ø vO‘\dV‚ìoGO€ù*Ç‘E䮂AË [ÔE6ûfÜSt5×ø +ÍוBßEËÍ_RòaÅ|Zк“º(Q!²¬ËØ}bžÝEêé6æÅjDÜ[MOÁ϶XÛ=vàîñ-nŒ¯k%>yûkJ ˆ´×åÃ|ŠXò4|½Ïà‰çu6‹]má„ÑEœM „ô€ÇVálsýu’ôSÃ*ca„µ²i\ +™Š‹fùt|ò”[zž|*'q"õèé4Ž  Ž®²*§î*_<æ‹ ½R|ƒ8t­ßjp¿5"«í\X}Þ¶°ð’qÁ»,¬1†™ÔE {ñ \ŸQ"9Z×k¾&þÔ3+ª:šÜMØWVøP$[ ±rÊ­ýïË7&fŸ0kθ1]1$¦ÌjIòv ɶrB`öÀ“ålZ­%YÓ⦨;É”àVä>ànÐUñ;Ðmm{_èþ„ÏË$ö]è*Á¬w±œ1<úm0Y !Üzv )[°ýÒ´Ü弘”¡Ÿ| ¾z‚e‡gˆ°³`_¼^ÆqŠôVë²;\káΔ5$BRuÕ6ÀœC"d…±ÏN@Äyê“3@~(y¨:Èv0ÿ¥.*`\?‡D ;žn‹É-‘°ÄQ“YÃ⌸á夥˜Æ‰E}»=¤¨— ²ú;cEí¸ØÎ»(ûb/ù¨e3c;ë´fXÔÁ; .Ï[KŽà$ê™å÷³lBÕ%—Ô`b‚ +=-ï²ÐQ€ZV¨†åˆ/•«1RÛ˜ÝVíÁ¸J¥2™•å\P¥*y¸B…$æ5‰ùì™F} Òžæ4…l"BõpUÓsNBp˜Rp¸þ‘ø,¿•«fç¢û,ÔÉ s‘ÅOãhd²84‹ã`?³f ŵeh§ô>«èýBc¥ c‚Î Ñh“ÿ×Mµ!Z=*0"º¤[Z'wHwKn^'‹?×2Ia¤î’ne‡ QºÇüØ­RžŒë2F:§cÐÜ?\ÍŠ Ñ_òçèž[_DÉ^ÍªŠ›y7ü +uþ§œ¯ìM»…ê0E\íÈ Z(ì׋ìÕ«ÔB°©º2Èð™P&š¢1f­Ò¬1J¤QGDj’Û¬º% +µÛŒF4<Ä®ÀÃðnÍkèÈÃå,³ä!ÒÈí¦i¯¯a^–ýf{ u!bVù® @yÏ€_$Ó.ÎÚCj;^ú…jÃvÝÌÊ«&Ú½/«“¿ìøáSˆÄ ¸WQ?µ×7ß*Ë™“^tAê,“6¥ˆgÃÓsÀTx¹ß +Aâøâ3TpÅAN`aH(Á#CµÞ†¯tÛŸú†]ŽÂ ו6+ÈN•Imøð³‹ñà8xé”N.èˆì"ÛjÍÝåõm-KŒÁÜ€Y‹±¯•ª|e°–Ýw`®¡æ†OÈŒhœ^QEÖ\îâV †·Ì-ð)w&Iz¦!Z'nO†‡}ÃÃÐ6º,]PÍÉH*¬ÛÓP¹V)Ì1ÂϲGèÛâáåwxøÝU§ö§î‹#?¡0-ƒ@«ëDUqÍŒòdЂæDë± G)Ð4~éàÇû–Çgòã­Y!þB"æ{ÆšäsÕ /æÛÙ +yS̃G¢u@½ÿJ´½M©'ØPF&€oM½*ð°H*Ÿ\=Ô/åU]Ì¢û‹¶¨[5>û€uiŽUçÎx£ZVÌZ½ºRµ#—mñm¿•å½úKø,ˆ EW)­gL1‰×? €„I›Îô?”Û|ßc¿N s» iœ‰5 +$šÚA½qË"‚Z/ +Á]’µJ½¤â;˜ÑúÌ7\b–Z0álWî%!‘ÄC ‚6ÐDˆ]’Ó.XÌ¥”2…xqL½Åüº g&j _„]úˆ%tïlºn‘·ÂKû6oüŒOrÃ”èŠ ¥’ÌsG¦ô7u“Šod=6 +B‰bFT#ìôD²Þœvã„eÅ:£1’ªYfy/ èèC¯w8¾x:G—мX^eòt`8+Ÿ‚ÎyŠ{Ø}•×óă6x¦ÛAðí3µ´Y˜FçøØ‹3@¡r²Ì:"@5H|g2—:ýä[ŒÜ—mý Ú,R!­éŠ|$«©–d[‡G—#¬ñ*ž xt9ç.Šú¹IéŠ9ð/LýÀñE*v ÚÞë~‡ö ©LsÞå®$«©w$ŸÃñÑ ê|¸£êÕyýT.¾ÄCõ|ñX4wó²Édu@‡(oà xn 6ßq ¢½ñý¦Ï{ ÿ…*å]¥má㪣ëã=-å–Òša™º¢ ŠŽ—‰&©|4!ª)€ßcÖ„Zm Äz°Ûn´?ï 0ž2kÓN)×)R¸È†Áq¨ ù&&ײÐ.Ãfz ÷> …Ô˜îUR©?L˜x*Ç…K±HFqjL +€ÊvÅûOsä±–÷Ðàþp3Ø“Qƒ§°õÉå(‘Ëöˆ©‚.3®RÖDä_‹ªÞ\ï… K‰xÜb)\G¢õmðôDßÔhD-ÝÒ-¯†þVFKAliijæú/ùÆåeÅ9"ÛYÚlËÆëä ÌsØãEk&ݿؼºÉ{Vü{¯“¯®ÔÆ”÷[RZÌd•Jºl\‹ +ab<Œ7^ºfXkïÿcóáendstream endobj -1952 0 obj << +1955 0 obj << /Type /Page -/Contents 1953 0 R -/Resources 1951 0 R +/Contents 1956 0 R +/Resources 1954 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1927 0 R +/Parent 1917 0 R +>> endobj +1957 0 obj << +/D [1955 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1958 0 obj << +/D [1955 0 R /XYZ 85.0394 671.961 null] +>> endobj +1959 0 obj << +/D [1955 0 R /XYZ 85.0394 660.0058 null] >> endobj 1954 0 obj << -/D [1952 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1955 0 obj << -/D [1952 0 R /XYZ 56.6929 671.961 null] ->> endobj -1956 0 obj << -/D [1952 0 R /XYZ 56.6929 660.0058 null] ->> endobj -1951 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1959 0 obj << -/Length 2986 +1962 0 obj << +/Length 2982 /Filter /FlateDecode >> stream -xÚíZÝsã¶÷_¡·P3'_$ÀöÉñÙwNî|®¬´7Mò@I°ÅF"U‘²Ïý뻋%Jч/öMýÐñŒ¹X|ØÅþ°»€èpø3®RÝ1©f1qg4;á;¨{w"B›^Ó¨×nõÃàäû e:)K™t·­±,ãÖŠÎ`üKtöþôzpÞïödÌ£„u{q£.¯Þ'¥ÏÙ§«‹Ëw?÷O»FGƒËOWÄîŸ_œ÷ϯÎλ=¡t,a†øç§«sjtqùá¼ûÛàÇ“óÁjÊíe ®p¾ÿ>ùå7ÞÃê~<áL¥6î<@3‘¦²3;ѱb±VªáLOnNþ¶°Uë»î“æ‚ «NOÄ&vÿïÒopøÝ@ZÅ›lÿ,,Û0}b5SB›•ì¥lÉ^hŬRqÇÄ)K”T^øW7çgªÛÓJÛèçÊ»=¤ò‚¾o¯n ~˜WT¬KúVn´\t…Üô±é0ÎGYíB»IVÕy=!*+P£YÇ8„ô³) -·€ÙHÙÌ!%ýd“ÑgäuF<¹j% Uí÷Ù”øã2ŒRÖD¸/yUo‡óà›3øOYà"âæ9&¢µ6(=ÐÚ€ê÷é[?ή26QFR!þœ -•+B‡ÛrÑ M_?©Þæ4È&òâ'Éýa?[ U9Îoqì[·¨ˆq뫜Qéª+"hLZ.Jñœð ¼‡ VdöæŠåÌ- ?ȹ,ˆ7\ÖDøÝaT4+W«͗uVCûlê· 4q_殨ò{·ëçüÀ —aé·ŠŸ²#VªÅ4éˆPË£Ñ4'{f†Aq1jðÖU£E>t¡c^ìyÿâŒÐ"q̶áB^˜¬¯mdÏ3\0¦;=©X*¸þŠ!©‡:€ gšku ³T'b×ÝTF§ýÓ]#i0! ˜lbB0¿n: ”× Ù²ž”‹7Á}`­ ôÃ$MöcAØî¨‘Ñ ¾"zeb¾pŸåÓl8 Eœ ~—ÚŒšÇ -\ƒ?5ž¨ë–Ÿ§˜µ®|‰¿÷›ûuÍ9K¤é:–päÁ@^ºŸpJj¡‚†µM )l£aâ¡Hñ» ùÔºEߎÐ(ùHä#õÈ*äËT7¯µ ºA¦ß¹©ŠÀžîò׌\ÒÔ_©@¿=Ÿf£¦Óð‘¾W^a˜X™ô­<˜CVÓÚŽÏÛâÛ©^!c“0#¬+&@3¤ª›÷×蜀·¹Æßl=dTöéC`l溰f¾NójBÕñÖ­B¯‰×6Výî¿«ˆ‹X[âïÜb¾È‹ú©F'å+Û"z)M6“}úMýš”1Kb×hR¦Lê„ä4ðùÊ\ˆ&¨Ý—šý -H«’δ‘Û ¯;®àà¤bQûÓX÷Ù4ßÚ"u³ÿ²½CVö ª’Dü¯Ú -@_ð¸“î‰ÔðCéý~Ör…¢ PMnX¹ÏÄ1YVTž/ó²r¸É)‚lpÇ@øê»jW~d¸Ì§uouH†›u²ºvrÂWá¨u쎽!XТ-{z@!X€±*èÎ0Ó¸C ¯J„¶û÷d[Û¯8'”bGS*Â$nB øܨDÀþyï@Lc­Õþ’b­-ù›U˜G…±»wÓrN‰K—´ÆoI4B•aÆuï&<…-[`Z/–6ºôÏ_$½Å‘ÍŽDŽ¿”N5YßTûñvØ -õMØ -u÷Ù"/—a¤ê±Ú™¡­Ý,˜]fÕjƒýÑÛƒÙ,šÚ»Êž7 þø‡LÙº*¼å€=¸{­ôöR›ëÕ8 ãÂè':‚&-{Ï}¡Ö> -Ï/TxjFí"¨¼­]X³ù4åµÏãÚh‘…nzXá–ò×Xh˜¨Ý»Â–Âu¸|㑸‘ýð\ë¢ #»/ü¬ ¿9ËŠÇ];‘æöG¢{¿«ÂÛ3¬ÄÉU“!8j縓Œ|ˆì¡–£&‰^­ý'¡kë—ñÒþ =ÑÇšž-QKÿ(y%=Ü£BQ޽ ®…öÙñ4ƒf€±Ý÷há¡H-½(+b­=2ݤtÀÜÃ3Ðzâ2ŸM¤Š˜ãœ°Vä*z0ø€‰%jâ@잇_áUlUû.X&¡@ƒÌ'?üôš±HÚ?ãÁ&ˆ+þ±Öž§¸ -S†Jìz9Ë;GóO}§»~«¬ „Uû€(®ñ8aV!]-¶ç+ $MÓ¬5÷ÿY¨—lendstream +xÚíZKs㸾ûWè¶TÕ‹ 09y=öŽ÷áqdm2•Ý=Ðl1+‘ŠHÙãüút£A‰ÒH”gÇSñ!å*³ÑxèFèn@ô8ü‰^œ°$•iϤšÅ\Ľñü„÷î¡îûÚ šFƒv«ïF'ß^(ÓKYšÈ¤7ºke·VôF“_£„)Ö‡xôÏ÷WçýŒytqùPBéXFgïN¯GçCªHBÓï.¯Þ'¥ÏÙû«‹ËïžöŽF—﯈=<¿8ž_÷ýpr>ZO¹½,ÁÎ÷ß'¿þÎ{XÝ'œ©ÔƽG(p&ÒTöæ':V,ÖJ5œÙÉÍÉßÖ¶j}×}bÒ\0!cÕƒØÄþ]ú ¿H«Xb“ÝŸž2 dŸXÍ”Ðf-{)[²"fÚšž‰S–(©¼ì¯nÎÏT •¶Ñ/•›ôHå}ß^Ý@ým^Q±.é[¹ñjÙ6r³§¦Ã$gµ í¦YMÔpº>æõ”¨¬@MôŒfiK8›ò±pK˜Q‘ÍRÒO9}ÆnYgÄ“ëVZÕnù͈?)Ã(eM„û˜Wõîx8¾=ƒÿ”."N`ž"ZkƒÒ#­ ¨á¾õÓÂá*ce$â/¨P¹"t¸+—ÍÐôõ“lOƒL"/îq’Ü/v¼²Q“üǾsËŠwþ·Ê9”Dê[ŸÖʃF<'|Ãì`vU‡ À–\±šƒV@`u^Ä»]ÕDø­aT4/×K/VµoŸÍü&îãÂUþàöýœ”r[ú}â§ìˆU^qW MJ"Ôòh<ËIÀž™…aPŒ¼uÕx™ßºÐ1/öÉ{xqFp‹8f»P¡cÃ@®¦×6°/3Z°¦{©X*¸þŒ!©‡êÀ„3͵êÆÄÄ,Õ‰ØàÀu?•Ñéðôç> ‘4xÆ&aFXÙm4q*™ŒÓÔËéz4D¿S¥Ñ)º1:Z”~R# ª†ã«a.²eMTyšytbRÎ3ò±tØÔHU к· ì·npØpºUKïPQ{í/…k_ქ2Ë=¢¢¦ Ó„TôŽ-ØŸÑ59Cù-UZͳÅŒ,”n]ýè\AVJ"< ñx“I°ïÊUì°fŽšHT‡nZ‹~Yݼ¬ùHËljŽœ9±ÖL«”ä2¼öº‘Ñe¸8ž¤42j¾ ðeKÐC!ÈzŒœNx`z@•àHz3B™"—1Ñ9¸—¾ß^à @;xÎfÏÄ:!l—²ZRxÍÊâ kŽaä DX7Þ\~§À]tV59`ÚŠ¶ÿ§­Œªü¾ÈêUs "k’ÕˆWp·å‹UäcH/߃¤¹Ò2o-æ¥d`i“øsÔØô8(s%Å‘8p‹%Âx ûÊD#4 ;°\ÕnPO ÇV÷àKIG·è›xWA÷‰iYÕ‘ä‰!…~½Gä[eè†S#—‡®à€ÖÄ$'½ŽÑ‘RèÓMQÁïAMC„ +hZ.ÿUÛ89°an,Ï»>Ývü /1Ƕ̿L_wk(NErÄ5&V$oŒ±MÓ–1 lƒ¯ŽôŽ%"«±D¤É™4!!`À^;“‡²ÆÁT"Þq0!ö&Ö°@–÷h€µF‰7PV"$  AUç>P„6+œÑž-@Û´ £þÆcÎáŸ8Š×ÕÆ9 Áaã,:6MK/µi¾‚3¤R:>â i©™µ†ðäæý)y€—°¼ü7Î¥÷†ŒØœŸUí]T ßÑ7£&mU„€þ©/„ˆü™»…ðØ&gy'Âw»§í¥¾âSUY¹Š¸@à>²ÔZ÷Íõš±j›±æ6ªû"B… }㊉‰¾.gùø‰è‹% e9¦cZN2¼Õ ‘ö}îó,ÆÛ4#rãB=Ã!¸·‡U×–É+Ž,T"ÀÕ¡tªgŒí Ö,V·³¼šRuF¼M«Ðkê•U¸§o*â"бû½[.–yQ?×ädW’²-¡—Rd3ÙçÙô8¬H³$†0½[‘2eR'$¦‘OR&à=Œ0)í>Ö$à“ÒmÃä¹Y«î3§=½/[ò×5.˜Ñ鑬¾†ÉTˆ4@Š3oØ~ZHR2È$à2~!¹Æ/lÑà×›ŽôÔ +‡ónXpÌn~]÷…L£7!YO +¶hCDW«Å¢\ÖnßåU ŽÇƒ‡ƒl‰æš„C€n‚ÇÊ”åÆ‹òƒŒÑiˆM4t­ ssøXE¹Eø~`Ø©Íq…Ý€Ìðt' ûÓ¹¬îx¬µÖ—ÒÈæ^ýØE=ö1Üì\Ôÿ¹^ÍD˜ÊH…jdÜl_ðrÑ0hSHATL +øšGRI¦eH–¦áN뮜ÍÊG ùAÊß^€47= “´~ »Œg*˜Úmý‚ª}P;ïͯa´*é@»½àºçÒ N@*µ?*õÍò-R7 €Hð/»;dm‘*IÄÿJ¡­ÈóÏ:Éc¦ÄïRò;D\^õ ^­õ~‰7 `ÆÖµù•—:±¾B²MFëcQ’H–Bðê…qöï?¸Î¦YY ÞlâRpµ:Åg=à8–u9.gć¬Tí Ýòš*~¾ÃoÏæ’‰y>€4yWF˜µ!ÃM:Ù\;¡ Ý«pÎ:vÏÞ(hѽµœ(ÀXtg˜_܃ ÎV%BÛÃ[²­ìWœ€J±c™ñ7!ø{.T"`û¼s ¥ JÖj© ¿#~³Žï¨0qnV.(?béRÖøéà Cò/L³܃§°c LæÅÒF—þ±‹¤—7²ÙÈñ·À©¦››iÞŽW¡¾‰W¡î![æå*ŒT=U{Ó²µ›‡³sŠ·YµÞ_Ÿzz0›eS{ò׋†áÿfi+GW…§°﮵Ú^jo½o"a\ýLoBpÃD¢E·;añÐjãMàC¨ðÜB…WeDÑ.‚Ê»Ú5_Ìòq^ûì­–Y¸Ò¦gd¡n)…†‰Ú½_"úa)ÜûÁ·žt9 ³.Ê0²û˜ÁϺð›ó¬xÚ·iÞh!®÷»*¼4ÃJœQ5‚£vg;Í(´‡˜Øh5nRçÕz€Ðº¶~oéßГŒpU¬é•µô`WÒ=*åÄûßZh¯‘=O1hÑ%þщÔÒ‹²"ÖÆÓM&`Ö¡/¢i > endobj +1963 0 obj << +/D [1961 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1964 0 obj << +/D [1961 0 R /XYZ 56.6929 229.6198 null] +>> endobj +1965 0 obj << +/D [1961 0 R /XYZ 56.6929 217.6646 null] >> endobj 1960 0 obj << -/D [1958 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1961 0 obj << -/D [1958 0 R /XYZ 85.0394 229.6198 null] ->> endobj -1962 0 obj << -/D [1958 0 R /XYZ 85.0394 217.6646 null] ->> endobj -1957 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1965 0 obj << -/Length 3016 +1969 0 obj << +/Length 3019 /Filter /FlateDecode >> stream -xÚÍ]sÛ6òÝ¿BôŒÍ¿p÷”8vëNêö÷.sm(’–p¡HU$­¸¿þv± Š’)'×fæ2ž± `±Øo³þÄ,ŠýXK=KtèGˆfùú,˜-¡ïÛ3Ác.Ý Ëñ¨×÷gßܨd¦}Ëxvÿ0¢•úAšŠÙ}ñ‹ûÊ? -÷ïï®Ï/ex7·o*Œ¤wõÝ«Ÿî¯çÔóÐ×·wo£éçêÇ»›Ûož¿:OBïþöÇ;Bϯo®ç×wW×ç¿Ýv}?°<Þ–òûûÙ/¿³v÷ýYà+F³4_h-gë³0R~*å0ÕÙ»³ G½vꤘDàKË 9I9%§Hû±’ÊÊi“m;ÚÔ¯AÌßÐNñß+@êêVÙ0(]ë°%uYŒkŽú¶ç"õʶé-3vQšzI`Q¶ùÖ,ÊÂGaÂŽ.Eâk%SËÞ=ÒQÀͺÌj;G%‘]‘õFÞýý[ eUPôԛñh³æá•Y›ŽMM¿«fÇ} ­zYM˜ùœÚyÆcLæC¹a*¦>X)ÏòU 6§ -vàØ UÝ&…¯£HÚMMi‡¯n,ÁÀË6›ê‰p]è¾[5[Óey,©«ÈºŒ b ðþhê²ýûùe¨×qϪ–I¡$ -B6}wÃá-z^{á&é:>°*W¬ámšÊäÆñþÐl7GŽHTthY™$¡`­Žô¦YUZyYÛšem™¬åD‡{Y±6µi»mÖÁjõ@€:\ˆ Ýª$¦È('7@@—¦Îº²µ¬Iï_+S•SJjAøè©@®[‚¬I €&¿}‹¼#„jÃ_dxmþ(Ý„åw- ƃ3úùƒØm†eØve¦k§è·šv›U¦³jA”õHø½­»r[—“¸)· ÆuV£*)½¶_.˶£y?AeË#ЄZ¼jzër/¸ÛºÍ`„e­(·Ü| ß"{b*¤Çñ”îicò¬¢Æªi;ŒÒ2önynF?ù*«—å”é‘ÃJÍ\¡¼;0Ø ¨»É©0u‹i¶DžM"™}n­›­!^5ù¦‘afFzdØ2uÞÔ-ØpYçO„*ú-ù”$UNhˆè^PÈ$³¡([TY÷d€c³ükx‹Ü¨lÔÂYÕ—]UÍnˆÌC §Åâs²ÏR'¹BŠdÌáI…Pm™w¦©©a-ÇÍ[šiZBäÙvkìv ‘1’WÉ›õ—©ˆ -b·O¼L‡‚uk¦T4ëÌ1Ygktý ‰ß»ÝÃ1ÓeÖê­\d±’£Æï}Yw·×šÈxʯR†›Æ #¶j§éVN',̈…9ÖÅ›»w–]Èíb”Ûy¥|!FÕð%;A€ä…^ù±ëÑ›Jùq³-!Ô6õaÚFqyH\†¾Eh‰“ž´‰o8I€ìî5¥&0(F[g_D½ÎZ±³-;^Áò¥å¾¶Oã9&vMÞTèËbCß_} »®ž^dÒ²1a+³\Ù©±öÀ]›‚ŒQ;þ!7îÈ×v ‡ -jÆgôƒ¦CSÚrûh5 ؆]™Taø „:'´i -ûpñ1[o*kƒ±vBx4Åñ¢ó›+š Uhx11z¼»§ªd¢T•m©aƒW0ÿÀ¥6ÄÙb~×D1…—å »Œ˜mžŽçsÁ°”À<²s‹2K*!NvLÍ& øù„qlåCL;¥@›Õ°À‘2òÖ f4 K“ =²øÁõk­_Òö@©JBU¦¶qXB5RAEÖ/WÔ¼šºw! ¦áЖÀÑB ¶\oQñ²}K;xXmm{º"–±ÍQé Å>åÌDÙ•’ÞŠÅö¨¶Iö71s>÷ ¸åžŒè8Š -ò"TLLrgºÕhtVYýÅÊáìtbeÃ$ âë±*wZ8 -‚-ùÒ(´îO(ÏN ìí¦é[å|^#·:]Göæ¡åت/\P·õÊþ„“ÙÂ@Ýõdcí¤ænöé}›Œ -8=Æ1{;ÆWÆV`ã¡P¥\0êiSòx÷—W L¦ùp4Óî«ý a"#¨oË£‰ëº\7µÉÛ) %ú}=äèEóh#vÑ8ve,C"æ4¾½$s@?4ƒÜÇÕñ†Ÿíp¡ ÐˆyLìð†ÐÙccWP),{TÍA}ÎÖr &ŠËLDÚ† -pÜ‹Ä6÷ö´ÿÁdUêŽ -Ç£xë­•ì¡]#@»-†­ˆdˆÔª­œư4VAÈÁÆÝÞ¹>¹/0_R+?á œ`»Á(û¬]I1d¦©ºÅV=”亣»àq{ÂqŠÌpê2°®ô 9›†Ï+Îp\q†õœ¸qœ~÷û††Nžàb4€êfW•Ų=O§î@'¸ïèÉ]€N¤eù¬˜Ô©+Î¤Ð¾Š…ü<ÓÊÁôçÔ’_ ̹=]Ê ñà >û#?t[| Féïý{ÿíÕ;ÿ‡Û{.(¥Nè@‡EøX ›ð/ ŸGÀ"gòÜ/ýW þÂY`БFAz* „¾°2Ðò•Pn¼ún, áí…XÊà¤HÆË}!™ü/IáËÛ¬€;uIA)`è󒂉$"Ò/'ÂÚo9 ™öåà3Ä—QD+÷a’ ‘P ÀJÁ„åO~[›Ì&3[B ú~á‚^žyø`+ÐK"A$š£ÂcJT Ð*'¾\ÃÇÏ&¾3 -fŸŒÿŸûUÓþË®ÂVšÊé8$¡äµi‘™BuˆàÙq¿R¼ÿVÁfendstream +xÚÍ]sÛ6òÝ¿BôŒÍ#~áî)qìž;­ÓS̵ܻ} HZÂ…"U‘´âüúÛÅ.(J¦œ\›™ËxÆZ,€Åb¿PÌø³4ò¥ÃY¢C? +D4Ë×gÁl }ß sé]ŽG½¾?ûËJfÚ×±Œg÷#Z©¤©˜Ý¿xWõÓýõüüRFûç—Qx¯oïÞFÓÏÕÛ»›Ûï~ž¿:OBïþöí¡ç×7×ó뻫ëóK¡ÂHÅ$þýöîšÝÜþp}þÛý÷g×÷Ëãm‰@!¿¿Ÿýò[0+`wߟ¾Òi4ÛA#ð…Ör¶> #åG¡RS½;ûÇ@pÔk§N‰)R©¥2™“”SrŠ´+©¬œ6Ù¶£ýüDÁü Iÿ½„ ®n• ƒÙµ[P—eÁ¸æá¨o{.R¯l›Þ9c¥©—e›oÍ¢,|&ìèR$¾V2µìÝ#ܬˬ¶sTÙUÙQoäÝßÿ@䯬 +j˜–z3mÖ<¼2kÓ²©éwÕ츯¡UB/« 3ŸS;Ïxì‚É|(7LÅÔ+åY¾*Á`âTÁ´ªÛ¤ðuI»É¢)íáÕ%xÙfS=®kÕw«fkº¬3%uY—D Þ§¦.Û¿_† +p÷1ñ¬j™J¢ dÓw0<Þ¢çµna’®Óá«rÅjÞ¦©LnïÍöpsäˆDE‡–5I +Ö*àHošU¥•—µ­YÖ–9ÀZNt¸§‘kS›¶Ûf¬fQ¨Ã…Ú­Jbú€Œrrtiê¬+[Ëšôþµ2U9¥¤„N +äº%ÈšhøÛ·È;B¨6üE†×æSé&ä(¿ li°0œÑÏ'b·–!`CØ•Y˜®¢CÞhÚmV™ÎªQÖ#á÷¶îÊm]Nà¦Ü‚×Yþ©¤ôÚ~¹,ÛŽäý•-@jyðªé­Ë¼ànëV4ƒ–µ¢Üró~‹ì‰©ÇSº§É³Š«¦í0ËØ»å¹ý䫬^–S¦G+5s…òîÀ`7 î$§ÂÔ-¦Ùx6‰dZô¹µJ@l¶†xÕä›rD†™uê‘`ËÔyS·`Ãe?ªè·äS’T9¡!¢{A!“̆¢lMPeÝ“bŒÍò<¬áA.r£²Q?fU_:tU5»!21œ?ŠÏÉ>>KÈ‹äRa(’1‡D$BµeÞ™¦¦†µP7oi¦i ‘gÛ­±ÛFÆH^%oÖ t\¦"*ˆÝ>ñ2 +ÖM¬™RѬ3Çd­Ñõ'$~ïv? ÇL—Y«·Jp‘ÅJŽ¿÷eÝaÜF\?h"ã)¿JnƒŽØ"|¨¦[9°0#æXoîÞYv!·‹Qnæ•ò…àêëáK(_‚ É !¼òc×£7!•òãf[B¨mêô* âò¸ }ŠÐ'=i94Þp’9ØÝkJM8`PŒ¶Î¾&ˆzµbf[v¼‚åKË}/lŸÆsLìš¼©Ð—Å +†¾¾úv]=½È¤ecÂVf¹²Scí»6£vüCnÜ‘ ®íÔ6ŒÏèM‡¦´åöÑj° ÿº2©Âðu*N hÓö%àâc¶ÞTÖcí„ðhŠãEç7W4ªÐðb*8bô xwOUÉ D©*ÛRï`þKmˆ³Åü®3ˆb< /Ë6v%0Û<Ïç‚a)ydçe– TBœì˜šMð ò ãØÊ‡&˜vJ6«a#eä­Ìh–& zd)ðƒë×Z¿¤;ì(R•„ªLmã°„j¤‚Ь_®¨y5uïBLá-£…@m ¸Þ¢âeû–".vð°Ú&ÚötE,cš£Ò@Š}Ê™‰²+#$½%‹íQ/l“ìobæ|îpË=ÑqäE¨˜˜äÎt«Ñ0謲úŠ”ÃÙéÄʆI@Å×c5:U:6î´p[ò¥QhÝŸPž@ØÛMÓ·.Êù¼Fn tº:ŽìÍC7ʱU_¸ në•ý '+²…ºëÉÆÚIÍÝìÓ+ú69$pzŒc:övŒ¯Œ­ÀÆC¡J¹`ÔÓ¦äñ6î!.¯@˜Lóáh¦Ý3WûAÃD$FPß–G×u¹nj“·S*JôûzÈÑ‹æÑ:Gì¢qìÊX, †DÌi|{Iæ€:~h¹«â !>Ûá>BA¡óþ>˜Øá ¡³ÇÆ8® RXö¨šƒúœ­åM—™ˆ ´ :á"¸‰mîí…iÿƒ)ɪÔŽGñÖ[;*Ù/B»F€v=Z [É©U;[9# Œai¬‚ƒŒ»½s}r_`¾¤W~Æ8ÁvƒPöY»’bÈLSu‹­z(ÉuGwÀãö„ã™áÔe`]ér6 ŸWœá¸â 9ê9qã„9ýî÷ <ÁÅh?ÔÍ®*‹ey‚ÔpjÙ3<ª7(;Lgª#‰á¶&ÅqㆲÈùT°ãyk(Z8RF= J©/×#uqÕ En›-‡û×ãk.¡„&:)­ý0â/¹èRqàDZŒ/ºþØ,ÇÈ(䀿@‹A'öCR—æ.Ušø‘ +ö×há¸Ô*ñÓ(Ò°ywB‘ðöÝ­ýæg¼ôQiàýøþü2Q‰„ú 0PƒÿóúîzþʆI4ZI¨@¢£µÿÜ~Pr`ƒ{3ûšJ"?J"5-!j_†õT¢} m%ô\$¯Þ9-ÑJß°ý•¯0úKë@Žàû÷þWïüo﹤G¦#–Màeq$l"À¿0|cˆGKÿÙ¨¿vä#tä‡Qp"=ÊH¢Æô ˆA¤JB~Ü‹Bx{I!òFpR&ãå¾’Pþ—¼ðõ­V@º¼ 0ôeyA@-š0½ó‚€<CÊåHdÚ—ãÏbFA­ÜGJz[8ô€DúB‚ƒ ÓŸx‹H¡èMcÁÃ/NÅ/Žº…y@.Jw¯:Ü8p°µÏ(C¶x!B%šÂ‰ +WT…žSÜcÊÓæýÄÓ æJ\˼Ù§žQ@¬qBqý•½…“û °©†;4¥÷añôjÀs†·ê35¥!ʺПñ¸l˜KÏô1_¢îù] +ö6çKµÖò!X¾ãÙ”Ö§*)÷Ù«)z×Vöª­3yolÛ”öòFñ³~¬0Þ‚ºhðƒ©GÅÝÇ8ä#%Üà +@ø ×–$3á^€ð~é‚®ÇDš?¸°ËÙ µ“/%BÙhü$ŸtÂEà[cï½°vøôñDhûª!ìÓÞ1#Ê +OHGÐ~WMûíƒP¤4AŰÏßÖ&³ÉÌ–D‚¾`¸ ·g>Ø +ô’H‰‚8„ç(Q5@«œøv ?8šøÒ(˜}6þéwMûo»BˆZi*§Ã +BˆiZ8¦P"xVõ_@=çý¿Hfôendstream endobj -1964 0 obj << -/Type /Page -/Contents 1965 0 R -/Resources 1963 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1973 0 R ->> endobj -1966 0 obj << -/D [1964 0 R /XYZ 56.6929 794.5015 null] ->> endobj -622 0 obj << -/D [1964 0 R /XYZ 56.6929 622.0858 null] ->> endobj -1967 0 obj << -/D [1964 0 R /XYZ 56.6929 597.3835 null] ->> endobj 1968 0 obj << -/D [1964 0 R /XYZ 56.6929 411.8393 null] ->> endobj -1969 0 obj << -/D [1964 0 R /XYZ 56.6929 399.8842 null] +/Type /Page +/Contents 1969 0 R +/Resources 1967 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1966 0 R >> endobj 1970 0 obj << -/D [1964 0 R /XYZ 56.6929 231.7148 null] +/D [1968 0 R /XYZ 85.0394 794.5015 null] +>> endobj +622 0 obj << +/D [1968 0 R /XYZ 85.0394 622.0858 null] >> endobj 1971 0 obj << -/D [1964 0 R /XYZ 56.6929 219.7596 null] ->> endobj -626 0 obj << -/D [1964 0 R /XYZ 56.6929 131.5008 null] +/D [1968 0 R /XYZ 85.0394 597.3835 null] >> endobj 1972 0 obj << -/D [1964 0 R /XYZ 56.6929 107.0349 null] +/D [1968 0 R /XYZ 85.0394 411.8393 null] >> endobj -1963 0 obj << +1973 0 obj << +/D [1968 0 R /XYZ 85.0394 399.8842 null] +>> endobj +1974 0 obj << +/D [1968 0 R /XYZ 85.0394 231.7148 null] +>> endobj +1975 0 obj << +/D [1968 0 R /XYZ 85.0394 219.7596 null] +>> endobj +626 0 obj << +/D [1968 0 R /XYZ 85.0394 131.5008 null] +>> endobj +1976 0 obj << +/D [1968 0 R /XYZ 85.0394 107.0349 null] +>> endobj +1967 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1976 0 obj << -/Length 3209 +1979 0 obj << +/Length 3197 /Filter /FlateDecode >> stream -xÚÍËrãÆñ®¯àÁ¨ÊDæ |“m­C—W»‘•*Wl Q†W«|}º§{@€‚¤Ý¬\¶tÀäu÷2&ZåÝaû5¶m”×+l»† ¹_vži¶µòÕªìʦÎ+ìë¨{ØñLY¯›ý6ÇIèúnŠjÇhڮض|„¢+öÛ²æå÷›"¬ÛHr¸÷\Ê8³VùK\ó;—-}‡—Šûiœiåü‚·¿œÏµ– ¸¤»­ZÌi”:‡¯Œ-<³Ö"Z6uç!šŠ&VEU~(öÔkÖô-¶yY!ÓXÝlÐ6',í®X–¿ ¡ú²æmìøl ŽHŸÝ¾löeÇ;ûÇ¢ÙH V ÷0iTçÛŽ–ÁGƒ±.“ /ÙÒ|ù@Åžº„3G*—òW§æ€6ÛlÞÁ[ïºbl¦SÉÜ4Ú¥jî‹¶›zìú°½ÅÍ•vpßÂϵH¢ÅG³¨»ohšïT-õû—ÅŽß -Á[ Æ¹Œ<Ë{Òâl[ì?Ð.±Œ-7Më9Ú{ v³­Î¥”ÑhÕ #ö8ÂÞésd© ¬§üÄe'vš9¢Ý5õª¬ïð¼™âk8Ñ®ƒÃÔ¾£n~WxÙv(¶ìsj™è6_þ›×5ü (ëâ#ã¨è wø&~ª?4ßßH½ïY—Ð;µ¾j¦x²n›rÑ&ÿ€[ª ˜ø†òÛ¶©]A½m‘×pg‚ùM©”†á¤¼'œ(5˜nꊋeW†MýÅ -ðí©‰âˆj !p´YØß?+À±xMñ+ ›R,lÖ…Ú8O-æ lzI±†åÁâë.7^!úц¾AæÆ€^ölxll݆mII‘ó™^ÈÀ¤fSf"&EƒWØZ†@"KˆÞ·É‰À`m’ž°tÛ6Ë2ï¼)e fƒßd¤½ŠÇ~V\PÓÓ¾ðÃ’ˆ'Ц_]¼½Ûâ3h´‡5"Eµ±,‹GÆ!õ|ãwHHT“£¨B“Þ %/UQ¹¦AÏ4Ì|Ðõ›Â÷¶ñ&2Ižp°Ä=¾"îV÷ úz|Ì›“Œ> 5< -éhì{Òé{tw<"í·àZÖ™ð̃ßò®nެc€ç5ØìÜ+q°$¬5² ˆ`Éc$#¤!Ò:¯‡^õf'fÒŸ¢æU ±ÃO‚l‚q`l×”u7ØjB Ý>sÐÅìåv+>æÛ]U|sêòei,-¤!UŸäó©,¶©LÇ>ßÿ·*œcð~Ož€Ö ÀÅͰbŒjî4·. V½?iä@üÁÁzf3¥K<5™Nñ²Ù¢†Ñàµ-À­ÖJ¯‚?ýÂ)Îç©`–تŽëÌlpœ/» ’R¦Zý!4K¡•%nšh`ûcðÑ2¸‹ˆ§'S(#ÇLí©£>‘<ƒ_—>ò5铨X`ã蓸8?â ú¨!}bôa»¸Ùß=CÁ¾aî€OºÄ¾$r6‰ÓT“{,@ å,§vž©bü—OÓh°û_˜FFÆJKýŒ‰L³žF'bæï"©§‰4Øþµˆt ïÿ Û;aì H‹tœgx”o€P'v*·ÎJ§Öèçó &³/É<¼%çÏch¨” ®Œ{W¾}H]²Ý§ome,Eb‚Ÿz">+0‘³"ø¬ìüœb+“Úl€T½€yÎ)§x z«ÞQÁkÔ|Ã>nF§õkŽZØùÂ(8v‰”c'Ì{˜è¿%G&èÿ®ƒ»Ñhpk—ËÂGÓØÖŠ'è–; –Ðí¨C§È¦b òÄðüX–ý:tâÃcżXö<«Áù”`ì % /æÑ`VMƒK À{ü¹è: -ðÛÍÍOíÄ!ÀÅ#3’Œæ ùkIÔ•ÛbÞ5óŠ:!¥Á¥K8C”xÏ¿¨VÔ¡ð€üsèj5¿-;ž§ñŽ(ž°_¹ã(¥`ÒC‚C]vípçœØ%„é­’àÛ÷[&>oó}éƒRD€Y¦ /Ü»¦Iù7ç`ˆ“b‰A0´–$Ô¼¾nÑ Çd‚! *5VE»Ü—·cÚ4÷Ô¨ÿÐÊ’€—·º-­Âغ9Æ?:ò$„o»iU3™’*ÛeÎR1…–"<ª€»ªšûž%º íÁ³˜[lÇò@×C^ìOåbxµŠ%‚Rz>>¬y}þÛÔE7…a?5RûÙÔÌ´3qjä§èkŽ©þ<}=½jàëÐcJ|Ž3VœØ þNà3$q¦ÄÚ\* Ž™¶3‚ܦŠdðçw`6 ¨’ðp&ªrŸ#×l lšim‚HjZª8×]ÀPw9'g,ñ³çᘀn6aÝ8W‰sÈÑÈoàñyfÉs¹µ}ºšÇTgPo¶(hÖÍÔìfR78†zþê—ïß½½X\…T„¤éÚ¢âû5vK¼öÐâ)Ùï%a›,·†F]d¬Ã‘\bH®cDÓ$rß*zƒ‡~ì1 «$Q³!C|“!;ká(pgò³P†Oó-x!B¾ÄµÊÅ@Êð|åu…Á,%¥äÀÓ˜V)¨%N$Qq³|ZqÎaºfG#>ݯBâH‰`‹”M#¹‡Šr„ $¸G1ÛÔò®O3ñªX燪;Ñ|=KGûj#˜coÝHáõÙ•å ¢¶èža‹žÞ_ö‚§La^“)¦ -²,y‰-„‰“àPRy÷\áTG—9&X•²4©,ÛBh„œµõÔ„Qû-}I¡)ËεJ:e}y}í=þœ‚cÁ5¶£ÒÓ“¬Aæ®8*:1Tt‚ïÂJ£8É‚•ϰÀº¯ÅŸý&Ufà€§Jnä=[x°çC e4ø¿…¢>-Ÿq©J8èÉã±®°&ÅBî‚`_‡h½øšÆk¢æp·9–ôָꖷ*>îªrYz·Ç©V)!u‚Sü|=Iœ-¹Ñb*@‚ðÓ¹4ÄO ó(F0#,jd]fÏ·ùnw´sÌÇ‹÷ÌËÃuÁxt&BùÅeG'û@…jœE½ME„(‰Æ–*l´qæhÒqÕâ=ŽJšsÝ8›²ÊÏÈJ{p°Üp´¢ï£Xúâåôà"”ÁOŠ6'OQÖs¿j¢8ßïò º`¶'³!jí‹R.åZ²K¢÷7×Ô8)„–*]‚BòåU\D‹6l~àä~z´Ooab›¯Š1¦ªgC»mÃÅày8óÈ£jË»š Uüœ”©¹Ö‘…’z¾"ˆªXwçŠöåÝ‹ÉF¤Á¿„QúöeQ@½Û5mÙqUvPÇÉ€‹¡!PËh¹¿®(õ Ì« >9äUÅUÔû}ÙͧÜî¨}¼CË5˜¼b®ï7š¸’†=1ŸŸ.÷ MÕ»ü.`‚ȹ2m_E½#æÅ~íƒo, š~\hLÁîrVÅñ5ppȸ>kÀ†rx -EÝ㟩„ÐdqŽ"u"Ç÷ëo» H™v’‹;­ýX,€Å~¯äLÀ¿œ%iœæ*Ÿe¹‰!“Ùr{&fw0÷Ó™d˜yš¡¾_œýí•Îfyœ§*-Ö\6ÖÊÙbõ.JcŸýëÍõåù\%"zuõ ô¤6‰Š~øûÅÛÅå M¤ úýÕõ4’SóÛëWW?ýóæâ<3ÑâêÍ5 ß\¾º¼¹¼þáòü÷ÅÏg—‹þÈÃkI¡ñ¼ÿ9{÷»˜­àv?Ÿ‰Xç6™ÝLjež«ÙöÌ$:NŒÖa¤:ûõì=ÂÁ¬_:I&)b¥S5A'¥¦è”äqª•ötÚŸK¹Ê}(ê.gL´*ºÃö[ì'QQ¯h°í‚äïû²ÛðL³uÔ+V«²+›º¨ð[GÝÃŽgÊzÝì·NÒ@×P»qÕŽÑ<´Û¶|×¹ý¶¬yùýÆ…u‡$‡{Ï¥Œó$Qþ7üŽeKíðRq¿ ‹s­¬_ðú·ó¹Ö’—t·UKƒÒÇ¡Å+cϬµˆ–MÝyˆ¦¢‰•«Ênÿ@_ÍšZ·-Ê +ù*ÑÑbÃØ€¶õÚÝ9À,Ë÷B¨°CYóN||< +§¤f·/›}Ùñæþ½hvD&’‰UgÂ=LÕÅÖÁéR!øt06ÀeÒá=[šï Èíé“p¦ðNårCCþöÔa[‚-:xî]çVÀi:“ÌP£]ªæÞµÝÔ{ׇí-n®´€ûžy®E]­q4ºû†¦ùN¥ké»\üð[!x Ô€÷ð\ïI‹³­Û ]râ,[nšÖ3#ô÷@íf[=œK)£Ñþ6ªFìq„½;n©¹²ÔÖS~â²Ç[ÍÑîšzUÖwxÞ\ñ5¬‰ˆè×ÁájßÑgqç¼x[”ÜŠaÖõLt[,ÿÍënÊÚ}däßÄOõ‡æû)¢·= áz§–ÀWÍOÖ bS6ÚpK•?ÐPqÛ6Õ¡sôµuE w&˜÷Je4 ' à=¡àD¯ÁtSW ˆè–]6õG(À·§.*‰#ª’ÀIPhaÿ¬Çâ5ů,lJ±°%æ(ŒÐÇyê1O`×KJbX|ÝåÆëD?ÚPdn èe/ ½Û°-I#ér>Ó•2°ªùÀZh°%Âd +î‚WØZ†Ù@"OˆÞ·)ˆÀ`““Ôž°tÛ6˲è¼5} –ƒßd¤ÀŠÇÞ‹D\P×ÓÚ øƒaÉÄh¶¯/^_ŽMñtÚÑ¢ÚX–î‘}Èü_ùRÕô(ªÐ¥wCÉËTT®iÐ3 3|úM¡½m¼•L³€',µ¯ˆ»Õ}‡ZÏ‚€ys’Ñ'¡†G!ßnO:}G¤ý¶\Ëš"žy°-ïêæÈ:xþª³]x%–„µF,yŒdÄ4DZ'çõ0Ы^ìïfÒŸ¢æUa7ÿ|‚k`l×”u7ØgBÝ>g¾À>1ûŒ×ÜÇb»«Üw§._jã4³Ù,Däås|>•ÇI&³±Ï÷ÿ­ +ç<Þ“' upq7¬£š‡;Í›ƒøªÞŸ4r ûYsÆÎ’\?iSOL&S¼l¶¨]48mWà5k%è c#)Îç™`M–œP×äYl™Ï'ùº»!e¦ÕB®,‹AÚiz bÀlà."N­6ž`§ÔÉu´§ŽúLò v~YúÈ—¤OšÄÒ‚>° ÿá ú¨!}bô]»¸Ùß=CÁ¾aîXOÚ4ù„´A—ešT×cùïÿ(r6ƒ©­ç©ÿåÓ$lþ&‘‘êJý [™å=‰N„ŒÞ34ROÓh°ûKÑè×ÿFEÎ +“Ì€$±ÈÆ †G‰•ÙØX4¤O2Ú'O-K‘šàžÈÁ„§êQO•]žS¬`c²t€S}©nhƒ“Œ.ª÷Nð5_°–ÑSý–Cö¸0ôm*ÕØóòn%:­®äpÞupS  ¾ìré|_º&â ²¥À Xy@¶£¢šŠeü!†aÂÎzîá­b^,{–‡ÕàqJ°tðLĬÏÍéó¹à2þ꺎¢:À¶XüÒN\ˆ3r#Éb.ÈOK£®Üºy×Ì+Šâ`„h”W.åÌPêÝ}W­èƒbrÊáS«ùmÙñ8‹wDñ”ýɇ&ŽýHEuÙµÃSð\—›·þI‚Cßo™b̼-ö¥Df—&\oï’¦}¸ßTœD€!N†¥:D¾Ð[Bdè¨{sÓ¢0–ÉC@Uê¬\»Ü—·Ž1mš{êTèIÀË[ݺÁF«0¶nŽAŽ< ¡m7Í¡êa&óPe»,X*0ÐR„GXWUsß³D·¡=xsŠíXèzÈ‹ýiàcy @^­b‰ Tž +k^A͛څS(öS `A¡I‘Ï´5qfäçhkƒ†™þ2m=½jàâÐbJ|‰#VœX p%ðÒ8Wâ UòŸƒáÕÈl¦Hþ~}Ó€ f¢ªðI!ðÉ‚¦™Î&ˆ£¦¥Š“8Ð µ»+8“Ÿ1 xþ h± ëÆÉIœCnF^WÏ‹ÑHž˜Ã“¤Ïï@÷˜›Á ª-é… ºu3»™‡\ Ž¡Ž¿þíÇ7¯/®®Cî!äåZ×NñüšN»%>{hñ”Ü÷R°->–ÛC£ž ±–áH.1$×1ã¡©iÜ·Ç ŠÞࡻʼ¹Ìá¥ìðu†¼¬…µ ¼5àþ"”aÅ“L þ‡Ï³¬²1Ÿò9ßx%a0'I 8°Á4¦Uúˆ3DQœÄœžVœ!F˜®ÙшÏ﫦†ÒØ#íAÓH롆!1 ÖÁQÌ-µ¼ëÓ¼rëâPu'*¯çw4ü¡‚õæÐ4]ŸKYž j]÷ OôÔþºç;åó‚¡0?çéó¼¹ñþ`_9Á±à'£BÓ“|AF®Tœ8ª81Tq‚ïÂêÂä¼ÊgÞHÛ—â€Ï{þK*sp»3¥¿4îñþ,<Øóq2¼ÞœâÏ ŸÏ¹0HÕôßqˆXWX~b ÷@ A°‡‰C´^'ûìÁÁfÃÑV4Š?Žb•‹—Óƒ‹Pô>©Ïœ½5„‰m±rcL•7ºmÃußy8óÈ—jË»š¬÷¬T¤¹¬‘‡êy±"ˆÊ­»aSEûònƒuc#²àYÂ(µ}PïvM[v\€”¾q2àbhÏŠA®ÀvÀŽQ*º +¢’CQU\0½ß—Ý|Ê1ì\í+.ÖZ.·¡ØÂuAª·ø’ò—Iè '쩘¿pB‚ŠŒFäGo0Á6/ïw~ CAæôás}¿ÑÄ•4ì‰Iœøt¹ObªÞÙ·ÄË}l™ôãÇ[b^ü¢}ð¥£éÇ5Å ì.çR,ÿ4!Œísl(‡‡¡Ô>þQJÈÍöÏ¢Žõ6-£èg2üÓ?ª£-(ÿrWñº tWŸs®;ö•èøÍÀ„„ý6Cn1º‡'®€3H®Mr­khüÁ¦kÚ½çðn"û3Q^æ¿{*ŒÆ(ÚÚôO £_,3ÝûŸ™Š­Öf:1Íî'цˆ÷Í››«Ÿ0H-¢±ôê{Òìóu'?ºb/OŒT€weÕ³ÄHMlRC?ÇÕc3 R‘ä™;ë¦y¾þÈ2Øñ¥Èòçz¨èåC¥$&ͦ~ù'fŸ|ºÏýáñ·–Ík;x»±c—A ’Cœ6Äå@aý 2ü"‘Ágÿoƒ%endstream endobj -1975 0 obj << -/Type /Page -/Contents 1976 0 R -/Resources 1974 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1973 0 R ->> endobj -1977 0 obj << -/D [1975 0 R /XYZ 85.0394 794.5015 null] ->> endobj 1978 0 obj << -/D [1975 0 R /XYZ 85.0394 613.3608 null] ->> endobj -1979 0 obj << -/D [1975 0 R /XYZ 85.0394 601.4057 null] ->> endobj -630 0 obj << -/D [1975 0 R /XYZ 85.0394 465.8716 null] +/Type /Page +/Contents 1979 0 R +/Resources 1977 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1966 0 R >> endobj 1980 0 obj << -/D [1975 0 R /XYZ 85.0394 438.5672 null] +/D [1978 0 R /XYZ 56.6929 794.5015 null] >> endobj 1981 0 obj << -/D [1975 0 R /XYZ 85.0394 397.0946 null] +/D [1978 0 R /XYZ 56.6929 613.3608 null] >> endobj 1982 0 obj << -/D [1975 0 R /XYZ 85.0394 385.1395 null] +/D [1978 0 R /XYZ 56.6929 601.4057 null] >> endobj -634 0 obj << -/D [1975 0 R /XYZ 85.0394 216.4249 null] +630 0 obj << +/D [1978 0 R /XYZ 56.6929 465.8716 null] >> endobj 1983 0 obj << -/D [1975 0 R /XYZ 85.0394 186.4354 null] +/D [1978 0 R /XYZ 56.6929 438.5672 null] >> endobj 1984 0 obj << -/D [1975 0 R /XYZ 85.0394 97.1422 null] +/D [1978 0 R /XYZ 56.6929 397.0946 null] >> endobj 1985 0 obj << -/D [1975 0 R /XYZ 85.0394 85.1871 null] +/D [1978 0 R /XYZ 56.6929 385.1395 null] >> endobj -1974 0 obj << +634 0 obj << +/D [1978 0 R /XYZ 56.6929 216.4249 null] +>> endobj +1986 0 obj << +/D [1978 0 R /XYZ 56.6929 186.4354 null] +>> endobj +1987 0 obj << +/D [1978 0 R /XYZ 56.6929 97.1422 null] +>> endobj +1988 0 obj << +/D [1978 0 R /XYZ 56.6929 85.1871 null] +>> endobj +1977 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1988 0 obj << -/Length 2116 +1991 0 obj << +/Length 2117 /Filter /FlateDecode >> stream -xÚµXÝsÛ6×_Á‡{ fJßnn:u9§N,÷µ¾i’Z¢mÎP¤"RqÜ¿þ_)ÓqziÇ3æ -X,v±»¿]€DþH$$’šê(Õ LD´ÞNpts¯'Äó$)ésý´š|ÁÒH#-©ŒV·=Y -a¥H´Ú¼‹%bh -püûÕb6M¨ÀñÅü P„qAãóŸý²š-Ý„ô¬?ͯ܈vŸó«ÅÅüõ¯Ë³iÊãÕüjᆗ³‹Ùr¶8ŸM?¬~žÌVÊ}³fFß“wp´ë~ž`Ä´ÑüÀˆhM£í„ †g,Œ”“·“ÿt{³véØ1QFP*X”0ŽlßgzÊLYcÃÍÕZ~•Ž„"­×G‰b°3œü³²Ü: ²<V E].9E\rÙ¹œÒˆ¤… Æç’"–¥„ÁASn}¾0î°œ ɉa$ óØr\MIâü§ñçLœÒ4’RAl)n¶Ž>Fa®5sL=ÚÚz<;ðý|K£W5XõŒ -‚“¾dk”¤½8†ð.Ø_¥(å0e4^ÝçÎ*Éz¬àD,H°êWËùë¹·~ ’CD,=_YTy3M˜ÆqQ¹o â-‘OŽ?gÛ]X²½Ÿº5SõÞýØíë)ñ§bSTwnh]W­[Þz¡õ—„ƒ–piL£¤s)¨WWå#ð¿§4u”AqìÇ7µûVuë‰|7MºNEXžív¹c„8CIÐÅL®ÛCV:úÐdw¹1òŸslû¸›; ŽŠš|c ÀCÕïsÃKSem7ߢÚë¬ £÷Y(?Ô;¿¢qß}^fmñiJE|"³[[M ŠXºöÆß:h.5¢J«¨ŸMß–  -„–¡GDú6øæ<–’sžôs>ð 魹Π8Œq|´wý{]åô‹ÒS¯Š}¾†“u1èq"d -8”¦“œti—P¥âË Žzïh/Jéø¢Þo­Gaô!kQTE[d¥‰ós“¿Ç˜VÖOvÖ-]^œ»¨ÂQYåyî(7‡›&ÿxÈ«6H»ÉóÊQùç6¯6ùÆÄ,ÄÈõ½Ñj$&]´€Ý ƒÓèLºh›¼¼õtã¾ë2k< ±œïÌž•ç#±ŸPh]Ûï¦c÷\_Ú~{h¼°?R{:½›l›÷tA‘à5îÝ?.<ísÞöZ­ËÃÆƒ)ÖÑõ*¡J%CSzЦºÇ÷݈(Ž´",š/Îßüúj6"I@¥ô(ÉWµI9bL¥AæjõÆDB%”6!˜†Tåü˜ˆøŒX…³üÑ}Þc³6iŠ» -Hòr\ßÛ°cÔAPÌùFœ£€(³›¼tsfƒHf¸ÿÙ]ü ¦y¹1¶2Ö²8kvùÞ%,qKa´’تyûcEãæq{Sû§wîÓ@ˆ6'Ú­{7i£VÔû,Osæ¬=Á6Û·ÏÄçÆÛÊü»LÃDjC'ƒ 4£˜† û—cá}ÓtŽ·›À;åàiAà<†~ ý,$VJ=ƒÄÀ¤'Ñ"1†¤B„C[¸Œ‚ÆÛ#vR†4Á¡Sùa$â C£LãéÛº,ëný9î³¢´M‡ùµ©[h$c Ç©™!z™AO3#¤û°D¼œo«6ûüÏ‘ýìN¤ƒÑoâxŠ¡ÔómêmVTÉñ›CãH9ÑònDaiØt]o·&ÞG0Œ ÅYôaìøˆ†Ðdpç í`ì <j“Û $$ -ñ¦ÚB˜vå‡Ä…«'Ä×j;8Sã=‰ÍÝ}Ó:L ¦ @Á‰ÎìFÂW7‹`nÂ7î›ÙiÐØë¢«7$p6 ƒÜ1ÚHF¿ "\DEÊ"©Êû 0"HLú"G@B¤PU;¶Q‚ ÄK•g@c%¥Œ²gPDxGI•Ä dŒø/ÅÐ/¤ôÅ~!áØ\é žöã)†~cä½òrÌ(C»|Ý ÷cÕ—¡†JÃiHörG3€ Ì}wØv^q;^ÓìÌÚpÓÔå¡ÍÑHpB±Mᾬ œj M"†swBX£ùúú|cû|qvi^oЗgóEòv¶üm¶j·_:8nè§‹OYÙÙþTg<Ô¶G³ÿž]þòf†Î¯.‘SÚ«"‡š Ÿ:DC¤)Ò¿¸ ö¤…¦ño«Gƒ®tPB„€ëW‡7·ÐN?Sd4éúÜ«‘k¸Fä€fJ -Ñ#kó˜8àÉÿSÜÜóææù¥_ΖÐY¸}±4v=dm^ÜŒo!•ïïFÂ…@¬ -ÎÕWQTg~›_°µÍ/øýp¬)fÖ]Y¼zEe!bD/;µa²ðÂw5,1Іe<¿»Z†°ê@óy7A—Ç™ölA|“\ñÄæµI§Ï\C;e{8Ò;ò€lE{?Z4Á‹ŒÒ? iМÂk¸ôBÏ^›jþP4ù ¿TÀû)ÿ³:ãÍÊßåXšBË…Õ0F(pPÊkç'·Š[¯ÏÏp +„ÂQ^{š{deâvÓŸöEÝn7EQã¨øÒõºXÛ˜…ywo¥šˆIŒлWad^—][T·~ÜâwUå­B,[{fíéAIìf Z5î»îÉ=Õ׎ßì[ÏìÆÏ4^€^î6ßYH¯$xMz÷O3O£`èm/ÕªÚ¯=˜B` €J¡ÎR6…¦üM9´!H÷Ã+IŒf"0Z\ž½ùíÕ|‚“‚$ÊøÚ«^O°ä’¡³Às¹|ƒ†Hx +µÍPH a U¥<äa>#–Á–?áçU4ï’¶¼«aÈ^΃w÷.ìG胑@ÿ : +U~ST¸f°ˆd§kðŸ;ůP^Tk««Pa¯ˆóv[ì0` n…ÙnÆb'æíOÛÇÍMãODOoñÓBˆ¶GÒ­ö;\tÑ ;š]–Ç9sÚÇ`—ïºgâóc¬nUñCH¦q"u¡‚³QЩ”pÊCÐý IäÄv½ãÝaGðÎ3A¤Ñ"’ +Te߂ŀÄZëg¸g˜ 8:$ Ƴ”€d¬?× +h½=¡'ÄØVµøûDÄA‹Æ-¬#…õômSU̓ 7‹ÞŽ»¼¬\Óa­›ÎÆ™ÈhrdF&Cf¨AfðãÌé>./gÆÛǺ˿üuâ|§³t²9SÃ&NfD0Î=ݺÙäeÌ8::G.eˆ–÷Ü0Ë¢¬šÍÆÆû†1¢¥Œ>N™M—ŽÒ~A.C ¶…Ë@ÅB¢0¯š#(„e,?,~(±ž0_ ¸ëàló” ~óúûúôp¥ƒ”5î8ªDÄök"À—åˆ;CÎ2ŸžÌåî®íSƒ*#P@Ö¹;Hùêæ üt‹ßÜ-§q ]¹*»©zÃ2ðS2Ê+M*øwA„†JCá¾, U…ÿŒ“!Ë €vM¨q=Ù‹(!PâYMÉTI%™àâQEÔEÔEÁÓ€ jT2&ü—Qè2þb¿HªIÆÙQ<…Â0 rêƒ|P^Yeh[¬á~è±úâ2–P°Fú²„cÊÒwûMßè•·Ó5Í]Àœ7mSí»‚L'[¸ÑJmq˜YàÔ#i’`¸ÀÀš,ÈïÞ½ßXÀ>»<½°2Ƨ‹Ëäíüú_óëi Æó²‘¹¡Ÿ.?çU¯ü©Ìt,+Oæÿ>½øõÍœœ]]Ú‹’Ž%>u +°†HÓlxq!âI9 +Mãÿ­ºÒQ QpÁ:àÍ-´ÓÏT#Íú>÷Åj„ ×L§JõÅÈé<ÅÎÆUöß7|£’gãrv€.ÂíKd1ö}QÀßBjßßM„ ƒXU‚å[LÆt`¹?Áåíò ~?jŠ]Å+‹¯¬DLÈå–ó.,–žù¶-Úh/n§®Lª{Ð|ÞMÐåIa÷çmw¥»žmÀ›”‘¬Oþ¯Ý‚o¤ qÕÔ«bÄÖ>6¥0Í8¢†„/&‡oùš<÷:¨cŸÔ'ÞÒiÿÜôÝ/÷‡W-ë|­ùð%{˜ZözoXÊêǨ:] M” {*û{ùendstream endobj -1987 0 obj << -/Type /Page -/Contents 1988 0 R -/Resources 1986 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1973 0 R ->> endobj -1989 0 obj << -/D [1987 0 R /XYZ 56.6929 794.5015 null] ->> endobj -638 0 obj << -/D [1987 0 R /XYZ 56.6929 617.17 null] ->> endobj 1990 0 obj << -/D [1987 0 R /XYZ 56.6929 591.42 null] ->> endobj -642 0 obj << -/D [1987 0 R /XYZ 56.6929 518.3317 null] ->> endobj -1991 0 obj << -/D [1987 0 R /XYZ 56.6929 489.3118 null] ->> endobj -646 0 obj << -/D [1987 0 R /XYZ 56.6929 437.3327 null] +/Type /Page +/Contents 1991 0 R +/Resources 1989 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1966 0 R >> endobj 1992 0 obj << -/D [1987 0 R /XYZ 56.6929 411.1024 null] +/D [1990 0 R /XYZ 85.0394 794.5015 null] >> endobj -650 0 obj << -/D [1987 0 R /XYZ 56.6929 208.889 null] +638 0 obj << +/D [1990 0 R /XYZ 85.0394 617.17 null] >> endobj 1993 0 obj << -/D [1987 0 R /XYZ 56.6929 179.8493 null] +/D [1990 0 R /XYZ 85.0394 591.42 null] >> endobj -1986 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F21 930 0 R /F11 1442 0 R /F41 1208 0 R /F53 1303 0 R >> -/XObject << /Im2 1341 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1996 0 obj << -/Length 1853 -/Filter /FlateDecode ->> -stream -xÚµX[oã¶~÷¯Š•ŠË«(õ©nâ¤)²ÎÇ-гÝŦ¾$–¼Ûý÷g†CÙr¢øøœm ‘ÃoîCÒ"âð'¢Ì0®rÙ\3Ã…‰¦Ë`íª'OÒ0%m®Ÿ'½w—ÊF9ËS™F“y +c<ËD4™}ŒÏ|˜ ÇýD§¬Ÿ˜”Ç?_.h&§áüvty}õÛxз:ž\ߎhz<¼އ£óa?J *@üûv4$¦Ëë›aÿÓä×Þp²S¹m–à -õ}î}üÄ£X÷k3•g&úœ‰<—Ѳ§bF+ÕÌ,zw½í[«~k—›v< S܈“Ä -ÉòÜèn±”+š¨×ÛÅŒ8ïÍm\U¯7.ÌóÚmh¡X‘[SÕÒUŠ©Ñ2øõìz” W”ì’]´°Àn~»˜¶ÉJ3%„(?€@mâû¾äñu×i\Ö4YV4Vå‚ìz½"ž/ ßÐ$¹ˆ½ àc¶^e`_ËÀ²óÐÅ¢Zù.˜” –PŽ5n‚ -O• MBYƒMBA_ëMÞ¯ëG¢ÖsA½eØ;y,Û”Ôð;\3µªjŠÛÖÍ»ì 3×W<þ\äz~èòºD÷H›ÅóÍzI”O&$0™~ ²LˆåŠz»q}1spD;ØËzѹe©‚´h×ê·•?6PQ²oaßÖœ;бbßPDDZ]ƒI+©ö°‘¦!œs—£^~6™ÜuQnÜ´.?»Vãi!R³\ ºûºª‹¿~ ŒmÑ -ÔiÓ¡<¸g2íz“)ËtÞ”ÛÌÍ‹í¢NêzÑ!9͘Ժ)ªh -ÛšÀ0]/—X'¯À™V Ð'ª -ØÈ¬…ã -(–+™‘y -MæœÊ‰ #}LúJx隯\Æk¢oÐ{žú“ÆÃ hbj{_¹ç­/füÞôE»éÚ³Š&¿”XjHmW3‡íq…uãåMn*¨9 þ;Š.ek)JÓX¬1¥z@±z¹À)´Õ™Jµ¥™ -[Í*Öi~è³}¨¼N¡n¼Ž-aÛ&Á'ö2ùð „Tp¶ìd¶NʤÁK Ñ„àé.µÓØû‹Îû¢òmßßX Ñ5ü«v« -ÚÉÐwDb,„«áh×!pédø·WD“Ÿ‡R^'sª窩ŸVlU‡F²ŒËS‹£»Âš(6…áÅuaåLHc›B[U—F2gYfóv™½€1 rÖè\} -n: Ôo¨ÿ¤ü_*Q÷Ê> endobj -1997 0 obj << -/D [1995 0 R /XYZ 85.0394 794.5015 null] ->> endobj -654 0 obj << -/D [1995 0 R /XYZ 85.0394 655.4043 null] ->> endobj -1998 0 obj << -/D [1995 0 R /XYZ 85.0394 633.1281 null] ->> endobj -658 0 obj << -/D [1995 0 R /XYZ 85.0394 552.1893 null] ->> endobj -1999 0 obj << -/D [1995 0 R /XYZ 85.0394 525.0283 null] ->> endobj -2000 0 obj << -/D [1995 0 R /XYZ 85.0394 90.0274 null] ->> endobj -2001 0 obj << -/D [1995 0 R /XYZ 85.0394 78.0723 null] +642 0 obj << +/D [1990 0 R /XYZ 85.0394 518.3317 null] >> endobj 1994 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F21 930 0 R /F53 1303 0 R /F41 1208 0 R >> -/XObject << /Im2 1341 0 R >> +/D [1990 0 R /XYZ 85.0394 489.3118 null] +>> endobj +646 0 obj << +/D [1990 0 R /XYZ 85.0394 437.3327 null] +>> endobj +1995 0 obj << +/D [1990 0 R /XYZ 85.0394 411.1024 null] +>> endobj +650 0 obj << +/D [1990 0 R /XYZ 85.0394 208.889 null] +>> endobj +1996 0 obj << +/D [1990 0 R /XYZ 85.0394 179.8493 null] +>> endobj +1989 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F62 1351 0 R /F63 1354 0 R /F21 930 0 R /F11 1441 0 R /F41 1208 0 R /F53 1303 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2004 0 obj << -/Length 3601 +1999 0 obj << +/Length 1844 /Filter /FlateDecode >> stream -xÚÝËrÛÈñ®¯àÁUªDì¼€rÓ:’£-GNl¥*¯ ’(ƒ—%Ó_Ÿîé¼Òrì\R<Ì3==ýîòƒŸ¡Æ"žéXùãÁl¹½`³5|{sÁíš¹[4ï¯úõáâ—[©g±‡"œ=¬z°"ŸEŸ=¤½Ð—þ%@`Þ¿ßÝß\ÎEÀ¼Û»·ÐãRÂ{ý×ë¿?ܼ§¡]úëÝý_h&¦æõ»ûÛ»7ÿ|}©•÷p÷ßßÜÞ¼¿¹}sùéá·‹›‡åþµ8“ˆï?±Y -·ûí‚ù2Ž‚Ù ˜ÏãX̶*~ ¤t3ÅŇ‹´{_ÍÖ)2)!ýPr6—Êàü—+cék¦OËV°‚à4,ÚÇ–íºCPóhÂrðÔaµ\¼ÇÅXøq¤g:྿ÈÄ}R®3¤1¬½µZùqàá¸êa“×À—0ò–IIEFmUšŽöªM4OuVÕ~[ÿùHzu“ì›yÝT;»kOm7ÿKÝd;JïÎÚØC~gLìëñDÂqNÈ!jx -,ŠcÏ í¡ÎÒ+Ä9@tc<(Û —ÕYC¦¢–Ãé*½ë¢  s#\‰HZˆö -1)S÷ÙÞj s‘ q%ÙUuÞä™?j¥ò<Þôøc2Ò'AWgsÁ¤/¤Ž¿f»å” ‚ùˆâó‚Æ<‚øTlꊙäÌK³z¹ÏYÝò‘æ«§2ÛÓ\™lÝäj´jÉ#/««ƒé,3úL³ËÊ´©=™íÂ.ZÒª¤ÉRJÜ®Ë#.T^—ëÂiNÿò ]J«Ð^éÕÄ¥#0\ÀZð; XZE²wp×%Ìq;:nUQÓà)o6yI}¼ëó³¹£¬[zNÓœ‡xÀ®©›=Ü„€&tyPW$Ë,5”˜ |劅zÚ)«Ö^Þdû¤1ÓIqÈP¯cé=\ÆÂ«h~mÔ: ízE#¼ßZuhvÔ>Þ±:Ðç2ËRúÞXx 0É.ë6?'Έ“Óœ!ø¢Ì¡&ˆqÄf‘,?×ERoh+Wý­Ô0t”/'€ƒ¨GÜGs¢b/ó×þ0úš‹hŒ©3B68 ¯Ò _StÚSgÈâl“#Q£Ú5yU&EaÇF… ]4WOÈ3{$áá!£:á!&l«4Gãžík"ÈÓ&_n° z»1¾ÉL“j+c“A,WÆxãxeÄ´ÚÒ–vY+ƒT ©µ4>$+R{Lž6ꢟ°Õ‹¤F±Õ‹ü ¼ä^‡g¬{ª‡ ´ ¡‘–æÞ°Õ¿%ìåšù,äNXV“$%{6¢ÈV A\ìA%­‰€ƒòí6Ks0X…=è?·4×&9Иc[(qBSTì<8'Ú—Ò‚¤ž2E\…C* $tuJÆÝ‚Žñ¯ ÷>^!‹>}š€ÃÙa íÎõ ´C2íÝ“Dɾ$Û]‘]M >—­í_”Sj¬¢³,:'êp2#í~3gd¼ÿ­/ã0?!ã\»Â2,·µSX¹Mšå†&H»¼¯Xiž°Ö-Ì8:Ó6¶µó=Å9+·üÿNn{ñ³äÖÑþå ÝŽ“r+C?Rã•[Å|a5ö¸ûö£…)Õ"± jÊ]`Ï«‡ÈÝmL.þ3É‚E:—J$Ä01ñ¶ -v`ZÃ<]©ëÂCݦ(onîoÞ›ºÇÃÍTMBBî--Jsk -KzæÑÆ„ÝÓlö¥ÉJŒgí÷2u!‚5¬AÛ^µ…5 )•X쮯ôDh#õÂö± “46'Š øÒ;Î…ÀªÙៈš´rq}‹H )uåpéW+»£`¦½Çë·×> ’‡^<Óúã0)ÔP»o}9çŒ1ï:Móþ!·¹»Ø­¹Ø”šá“/ಗóZ̃”d.çÔ|þ¨¼ãèhŠ?Ž…8ÛÍDŸz3iSšÞ‰6}´‡P©ˆ~Øî†ëˆŸØ#~N† ¦ÐÉIE> »„)zþ@„«„3æ3Õ>£ì“§)GÌQZº’ @µ™Íˆzy>=N@²Ô•û¹SbÑLzììpµ¨ÞÀ'Ô,ò2Ùûëmø ®G¾}N³ÅRÀ¬À{‰ø“ d0he+Mš¤5¹/›C[ÃÄï­jµ!=~X]ðŽ£m²ÿ ”°sù–pªŸ§E•¤ÝlîJl¨§T7+”P³ÛCÆ„1&öûǬ}†aí"k ×è›P'î=K …CKˆœ¸>/ÌdŽ¤Ã¯©Í¾@ðÀ½%92<­¢va±èG®0ì -åx!‹«ƒ“—±É¸òVÄr`x3]ê¿jß°j”α -ÖÅÅ¿ã"'f&ÂYyX»sá­‰3B¤± ñ7Ú’£Þ˜~eÛÕhKz$ò% ”-iCl«fù¡©€ÒùÒD V `fà®÷ïW†ÊTwM} -ú&Ú7JƒV¯¡ïæ 0N˜G¶Pžz cüO“n.kÐ*âмSØq,$|Á"·‡<‰­PÃOø‡’‰g!L Úö ÐXŵ{ÕEÃjïEv:mŽcB‰h”šT`Ì Œñg«ÆåmöIY¯zy‚iŸè0T¨,Ž­Rƒ®º%‡Ø›Øw*nË“èå Sî4¦:å…¾QÞn‘3ØoÕúøt_SD•tû¶ÚŪªD)㒤̳¯íÀfŠx„9ëtå#ÈN¶'…¥ŠºNa->ÄqÊ{'üsEøÊÙ«‰÷”4ˆþfh È2«k¢ ‡„ ¹zS¨Â©½µ©-‡¶Æ¬µÖæ†Ô#®/¹õÒN¸/„œ£—©¦•—Ž"ma§*Û-›mLggݲ)Å„ðY1ñ”ä2RÒJô:ÉKß=F~H=ôP×E7_cáVòÎ%~Kþ­ÀlŸGóP›¿*I÷'$è”YóTí?Ó`qlìt—¹›¡}ò‚Îc•§E{ËMÞd­«Ÿ§™ya(퉘ÕE¾.m8R>rTÿÝšMø²]WîÙ?±3¹kMSšÀÇÛƒèaühßTaä¾ïªºÎ$dJÀ¸ 7A†"—ký­²þVY í¡v_rÈ:Ò¬ûk‚A©6ô2è·ÿ¹ê#Øö-hV†XÓŸ [R‡ô??œdLÊ€s MÙ&œAÃYÆñ ÛâœSbB¦žI 5ñ5²M>g\:zã$þåè°³÷Yuø˜‰VÏ!‘¥×0¶Ï„¨Úçø/Žese¸ívâ¹ÊêúHÃûYÛ3õžîu†¶8{Q¯1jþ©?õÊÀÇâNü—;Ywzé~»?=+ó' -1— àŸgB‡R³ðêœQÅîÿ13TÆendstream +xÚµXmoã6þî_!N*._$Rì§s'M‘uö·(n»›ŽØr"É»ÝCiËÅç»E ‘ÃgÞ‡¤YDáE™$Rs)’Œ²,šo4z‚µ›ó“T”:Ø÷õ¦ã†’)vè'¬çT€¦A¸âéþTÈH +A ”B¸ öó‹Ùì©«²6ó¶ül:}' B8xJtÊëákÕý仢¨Åd*É‚;¦¬[o\’<ÕÌ3-̲حۤm×=’eNxšÞ=h[‰óífcëä5ø"OEú„U‰RpZE´à9šg Ð¸¦X~–ð:âÇl˜A oLøÒ<Þ"}g½ç¨?iFÁxN,]öÑìó²sÅl¿ë!Ëc3ߺqÑàä—Ò–š¥vÕÂØöXÙºqòfw Ô\ +þ»]¬ËΊ¥X\ (NÛb Æ•–ïEõäs&œ¥*Í…LÎ4 XµhHO¤é±Ï¡>òúq¨m‹°°]“àÓö2w·p p´ìevÊ$à%hŒQ¹Oméûpy_4®í»ë4Z¤Æµ¦j ü}‡…ÛB¸OÆpÛ—ÎÆ_EIyÌRJE8à;±Y¯š-2NrÊÏ-Žþ + Q …áÄõaiÂx¦B¡­‹¦O#®Iž+Ý-³o`2P9:·_Ÿ½u¯)Äêÿo)ÿo•ªá¦C^«·vÜŸ8Q™ÝçpÊ5.·jmkà2žcI­Áù‡ÆÔ¥ñ›\¡ÂˆœÍv爹A€×}¢»Ë’Û\­¿"µ(—–eér¾—n‡;5Æó•ß× K>ú­E…c …SÀÉo¯þ}µŸ«éÿê*xHB0·Â„”xIÊûÌÎXŸÙÑpAúŠô“©¬Nž×U­nLÛ åî$°ôÊOv'_v%Gr´äççmÝzÄÝ#ïxÚÝüÙÔ¿KCެ_˜µy*ìEeßäšy]>žhrLù&ti‹im¿««)M?XgŽ^àC’ö¶cŸ¶÷ÓÛ›[x³I艔ØÛ'Üé»fùÚþg÷±„#ñO&8>Œ§¿§düÇèý‡»ñyPŒ+$/p¸œŒÞûÅ Bû;l×¢pvØ(~.ðÞl¿!ˆ'¼‡“u@Ÿ z¬boXÅþW ~Ò=ìPÇ5Èwføø™ üêÿ_]ÿrÿ0K|qBör¸š]ô¥Õy86vüâH~8Õ(òïhØdœìN HXŽÖ0¾7‡õ¹¥cP?hÿæN~Z$ïó`ÿƳEŠÓ"ÅùO‹<ÙEÐmÐ òµÃ!3ÎßÛ§M÷¡ŸÃã˜Q)E¤ù9r|EÕ¿SÚ:Ò,‡÷>‡§*Íû~¨¤ûGÌwÿ,zø UDä9ïþ¦Ø¹‡ÛŸ14Ððþ°X®gSùêW[F ’¶ŽîÿùZWÎendstream endobj -2003 0 obj << +1998 0 obj << /Type /Page -/Contents 2004 0 R -/Resources 2002 0 R +/Contents 1999 0 R +/Resources 1997 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1973 0 R +/Parent 1966 0 R >> endobj -2005 0 obj << -/D [2003 0 R /XYZ 56.6929 794.5015 null] +2000 0 obj << +/D [1998 0 R /XYZ 56.6929 794.5015 null] >> endobj -662 0 obj << -/D [2003 0 R /XYZ 56.6929 306.3415 null] +654 0 obj << +/D [1998 0 R /XYZ 56.6929 655.4043 null] >> endobj -1788 0 obj << -/D [2003 0 R /XYZ 56.6929 275.1221 null] +2001 0 obj << +/D [1998 0 R /XYZ 56.6929 633.1281 null] +>> endobj +658 0 obj << +/D [1998 0 R /XYZ 56.6929 552.1893 null] >> endobj 2002 0 obj << +/D [1998 0 R /XYZ 56.6929 525.0283 null] +>> endobj +2003 0 obj << +/D [1998 0 R /XYZ 56.6929 90.0274 null] +>> endobj +2004 0 obj << +/D [1998 0 R /XYZ 56.6929 78.0723 null] +>> endobj +1997 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F62 1351 0 R /F63 1354 0 R /F21 930 0 R /F53 1303 0 R /F41 1208 0 R >> +/XObject << /Im2 1340 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2007 0 obj << +/Length 3608 +/Filter /FlateDecode +>> +stream +xÚÝËrÛÈñ®¯àÁU¡ªDì¼€rÓ:²£­]9±•ªT¼>€(¡ \”L}º§{ð  ‡cï%ÅÃ<0ÓÓÓï øÉYB'ff„B†³ÕæDÌnàÛÛÉk~Ñb¸êç듟Þh;K‚$RÑìz=€"Žåì:û8ý÷ó\_¼?]¨PÌ£àtFbþóåÕßh&¡æõ»«7—oÿõþüÔšùõå»+š~ñæâýÅÕë‹Ó…Ô&T@3ˆÿ¼»º Eo.½8ýtýËÉÅu‡òðZRhÄ÷“ŸÄ,ƒÛýr"Äáì"I¢f›ê 4Zû™òäÃÉ?;€ƒ¯n뙌ÒA¤B=[hÄÀxÁ±:Ñö‘cÀ +V>‹ö €Å]¿c j!¥ ’Ð"QEqÇF%l”JZëpfC¨XŒ|Ü¥ÕMŽd†Õj°Ú"ÐÁU×·E\‰âù*­¨³Ì©­+×±ózMí}Mu½Û4=ªEó¦Mwí¢ië-ïÚQÛÏÿÔ´ù„@Gz~éAÝò!¿ ¡vM‹x"í¤Dä”C OEI2w(B»oòì I‰ÝÊ·ãeMÞR§­©•pº £ùyYÒ„»®D$"_ ¦Uæ?{Л}Ã0—ùWRšmÝmq—ÇrŠX©Ù…ß'(€Ôu¶PBJÛä`v[•µP‰ Tqòœ¬ÉO!V•·Í %MK1Ïòfµ+–yÓ±’æëû*ßÑ\•nüäúhÕîTÆó¼©÷®³Êé3Í®j×f|òÛ%/ZѪ´Í³`JâΫ.4ó¦¨nJ¯<Ã냂k,_éÕÄ¥c0_ÀZð»EV—eºópo*˜“<:l–uÙÐà¾ho‹ŠúxׇgKÆÔ†ŠaOÓ\Fx×4ínB@Sº< ¨¿-ÓUž9J,”RA"Ëõ¢¬×WkçE›ïÒÖ)9Lߥå>GÕNôüú4QóšæoœB'¥]¯h„÷A«÷ív +¨âp~¨÷ô¹Ê󌾷 &Ýæýæ‡Ä9âä4gT$ SfßaT‚8b³LWŸ›2mni«4í41ò”¯&€ƒ¨ÇRó´(&™çÁM0LE•*>&™'„ltúWcA¿¦è¢lažØY6é¨QoÛ¢®Ò²ä±S!h× Íõ=òÇÍHxdÇ#ÇLØÔYö=ß5DûÛbu‹]ÐÛ[çžÜ4©¶qfÄríì7Ž×NLë mé–u2¡’ÚjçFò2ãcЬ½¥.šò s½L[ ÁÈo€ä©œ÷x&v *IBÛÙ~åî P-ð[:Á^iE "é…e=IòDËh`#Ê|ÝÄåT’MTl6yV€Á*ùD ÿ‚inLr4¢90Ç ¶2êM1IÊð)‰°Æ`¤Í”)’ÜPaŒ¨0’Ðõc2îôŒÿxæ¸÷ñ YôéÓäÎŽBo‚o^ ZØùg²€(ù—t³-ó³ ”¢0º³ÞʼôVàŸÏôY6e’@ë'n0â@³_2ËU ÖÝH;fy "Ó¢äÆñ\ jš{ÍÎj¿#Ñ®ZšptÈ(5ß‚¯ðpºìm÷%oHyAJM–¯ŠMZÒÀ¹/÷mB徿„Òb›f™³ïtj«"Éa¦ðê‹]Ì´‘ósô-wiQ¦Ë2çÕÎuÐ2R·S]\ÓaGg…bÊ@º„ÃxmÌ&¸ArdU¯®òŒØ¡UòHëUë¢í£GZàÄ‹Q=qb„:ŸiE2¿éíI®ãÇN°¨Ÿ‘—°/“&H›NA7&t\Vwzöï©X èâ»5jÞz¿Ý¯W ÂlÊ4GÕø½*–Ž‹OP£Ì¤?|Êá&1мàWSn=€p?y©W_Ó) †.·GjøàÚÎò$Î/ƒå‰@שÓ#ô¾Çs—‰„QÅ:ùn;ëeMœ‰i{$!û–ò›ljBÉÜeÚÏhÝD?­ªXy¹ü àUuKDI—M]îÛœõMiØ)娮P, Ž|hÛ&wÂÐòÝûË·—WS×Ë+•" S`mEF+¤¬ÂµþdLV(ŸX`!%”j,—Õ±àÇÈV2µšm1ÍÝ%›%lûÔ…>8C Š5‹–Æ÷ôÁ: í»ƒØ†vÆhDSÙÏÀ²¸tاÂå&4›§.€ƒ¹±)‚OYqãp€o)gv)ƒÊ·)lœ¿ ÏKLÈÁ¤sÌzì+¼‡Eµ*÷YÞÑßA¤.E±ádŽç­ÂùªÞlÓ¶XeѺ ×ø{ÂÇ<Ý•…KFa‰Áp33Hkƒ8éŒù«©xJjpC!Çš–x¬L—»ÞTÅWЬC"!´E•>àƒÈG$‘ßgwpÊ)ÓÃÈL‘WžtGD#ÿùx½bXøÎÚB_°øJc&6àMµy¦\JÈHh²mùl¹âÄÛIŸ³J\€pb“/ÚzQw<ã"ü‰„_u“W˜¥8£aÔ'8*½älñ@UºS3*y†‡*R2ƒ—¹çðm¾+Zo¥8Á*ˆ“¼\\_ÿ:Ú—V+^µ;çû2o‚çÓìäËSv]0ƒ‰©8 ;f ÄÀ¡õþaš%À4c´7ÇT¡\L=¹Ü<KyŠì<+ +:‘<ïM¤¼åèGÕçþ q7q`û\uÎX𬉉ŸäÒS*/6š÷»9'éÃoC1‡ù 1—Ö™a9×Qaå&mW·4ÉÀÔü+–œ'lv‡€pîε-·ÿ€áj¶H/Ÿ +¡ÁÆ'(6@åû®wL1ùC)ÂÇ6zŽb*Æ’4)Ê¢ìE$bázYÈ®‘}•ÒÉY_铬ñìûºs% +>AЦ?Š ý«Ýÿö÷}¯xjAʯQn!åðùðÁ3¢ P +"¼…Ž!h"1 –©‰×V°“mótÕlŒŒl—®¼½¸ºxïj ×Sõ y¸ö!hV°n)>IŽûÇÜüK›WÛò÷*ó›Wˆ¦¹W¯‚‰B†ŒÊ-¼ë+½rÔ^r‹3iËùQ Q˜…ƒ)©ù Å hä§´ðùß1AÝ'àÏžJ=žŽ®äYˆÓ o&ú4G0Ó.½œÈ©$Be ú~³¯#~bø9ˆº¢$*5y.ì¦èüCönF.D L÷¤²Kï§Ü±DiéË/•³"ÎŽ9?=T@âÔ— ‡yTÊh¦vö¸2ª—GàSj–E•îÃõœ~JÚ£lŸŸÖ¸p +˜uqøàOñá Flei›v&£ðU»ïê™ø½Sí±±v¤Ç˃áq´IwŸJPj0 î5Æù³u볂ÞǶ»´jÖƒlÁµ÷ô¿*Z–‡N©AWý’ýì §÷½Šs©½¼ ¡ÆŸ&L¯¼ÐwÊÛ/òæûBŸñꂨ’aŸ+ßX¸ª+”2©IÊø˜]ÃNñw2Öìª;|G: 3(J5u^aq˜ò^ÈþÑ"úFåÔÇÊ Dÿ: +-d•7 Ñ +†cBÐ\s[ï©Úiç7®Îq½ÙzkmÝ ©G\q^ ö¯ë0¤p_9^©ÚNN|RŠ´õ„ªrwl明gý²)Å„ðÙõ””:S’%ú&-ªÀ?…ÆAj;öPçe 7¿Á"®–8—Hq¢åsØ>}yÌ}ãþ¶¤ý’ Såí}½ûLƒå¡åé>wC~þ‚Î]]d ƒ¢½ÕmÑæ«_d¹{m¨øD + +Ü겸©¸›@*}T Þ¸MøÊÝÔþ/)ϾuåLí#oöNh ‡ñ#¿¯ÂÈßÖMS,IÈŒ9ãc€Â†\.û[ÃþÖ°¿…vßø/dYÞÿMÁ¡Ô¸?}9ô»ÿ_—‚šØö hVEXÓ;RGô·?œd\Ê€s)MqH ޠᬋa£äÛ„R>+1‘0$€ºøÙ¤Ÿó.=½qÿ~´ßò}Ö=>n¢ÓsHdé¥'JøÉÀÿÑ1²l¾·ÙL<]±®iø0k{ þÓ½ÞÐvç êuF-xìo¾: ð¿¹Ê³g«O/ý pÿ7hãþP¡¦ór-L u"=RH=)ìƒr‡Žƒ+âþ_®÷W*endstream +endobj +2006 0 obj << +/Type /Page +/Contents 2007 0 R +/Resources 2005 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1966 0 R +>> endobj +2008 0 obj << +/D [2006 0 R /XYZ 85.0394 794.5015 null] +>> endobj +662 0 obj << +/D [2006 0 R /XYZ 85.0394 306.3415 null] +>> endobj +1785 0 obj << +/D [2006 0 R /XYZ 85.0394 275.1221 null] +>> endobj +2005 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F14 956 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2008 0 obj << -/Length 2796 +2011 0 obj << +/Length 2797 /Filter /FlateDecode >> stream -xÚÝZÝsÛ6÷_¡{“§ƒ ïžòa÷œ™Ú­íÎÜ\ÛJ‚-N(R);Î_»X€%ZNÍ\&“q-‹Åâ·‹Å1øÇGi1™Å#ÅQÂx2š-OØèê~<áŽgâ™&!×ÛÛ“×çR²(SBnïYiÄÒ”nç¿ßýûÍÏ·g×§‘°±ŠN'‰bã·—ÑçÝÕåùÅ¿^¿9Õñøöâê’È×gçg×g—ïÎN'Y– -h\Û›[läZÞÜ^¼»9ýãöÃÉÙm7€pœIÔþÏ“ßþ`£9Œõà ‹d–&£GøÁ"žeb´<‰%±”žRžÜœüÒ jmÓ!£%2’Tè« >âq$c%zfK2š$Öl0ÒÓ g¬?Ò6o‹¦-f ŽäˆÀúl4i¤t&­gbÅ­‰•/ó¢já¯!jY· UÔwDi¶Ò-½¨îêõhuE y5§šÕú”§ãú¡˜'­1f—¾akÖwùÌW‚ªØ4fíhmM¤{Ó:á3àw=C%ŒGÄy”%‰°#jªe( -`Lo©&çyQæÓr‘~Õ¬ÜÌ=oYsÍêMu -’®@hyK¥GcG>Ü[QÑ×YR"ݰàZ niòª¨îï6%Mµ–ô<å}Ij0ÈÚs‡S§2V5ôÕUóE8 0ÐaÔ飣L`Q2)ðô¬3ÔU×AÞšûz]|öÒµ×Æ »«Ë²~„q:Ùf†ršhÀa³$)-£T}™»òH3Õ÷Ö¿ÕÈ«€î$£ì`¸ v D¹¢oÑ5qÙ¨Ü5Îô6„œ‰Hʘ”J¢8㱇‹jV/;ƒ]›?7¦i›]{I =pžÂ¾NçNä ZËXD"MûZzt6®6Ë©©N)Îhë…~Hðëýå U2ÝølÆW1ùlAæ¸úùÝÕû³=ô$RGB%êˆÖ@¨H¦Õh²øÿGLÆGĤH"³ôLÆ<â)Òö0ùËÆ¬ s’AGƒäA¥;H†J[HJ-;Hb!‰ß-$ñןnDö‡]¼°`a7Çk—Û´O+sŠG³Â7E˜T%É_‘oñ “4‹¤V/A‘«(Õ2µÆ¿Ú´÷õC1ìàëTÞBñ°ÒC¥-cÆ;(b¡h¿Ýˆb&¶PÄ* E,‚b"”…"•SµXÒã;ÊÙ–Žcaˆlsµ -37$S nê²9̧£¡^~r‰¤_çW> y(Ìãi&ÆÏ{Áñ&à ÈGLXHÙKN¤,R,£\í2_ºüêÆ¬ülô7 Ãþ°íêX‘ù öÞzÚz‚eÓoʽñW>‡ b¤¥ -Ó…>HiÛé¶(¸§€&y,|Ç€ŒY{Sñ"ãg™µþëÊ!Ò SåÕÌ|9,ƒ†Ëƒƒè€¢LÕ¦òø»§-Ýœ`©ôø³92Øý¶™ EÐÀ5DO»™r»¨fã“ÛÜQ>w¶l×yÕÜà|4Ó}Çi‹a§’¼„g – Š&×~Müb}-Ó8¨wáPﱊÇ*ñ±+*»„ ±K6v‹?€^@,àò/5·'R J)ˆàS -üµŸRL|0.L†÷ßÍ,Žfðoø©ŒTªþʈ|‹g€ Åœ%‡VŒ´ð§·iºèóþ­;ƒ¸n̈°“¯S{‹üÊ{ä÷§;K¶9v¦(Çš‚¥­¨2±É3~)yÆ*‘‰Ý#SPÝú+N`¼ÍRyý7!±;Ô„Š¹ifëbjüØiý`"ÜÙÞåE»&ôÀ£ƒŠØ_¼IqøzGgôHë@o®è=p€*k^ø¢Â j,¤ÝTàÅÝ'Mü¦pÉu6x· Ê‡¼Ü8>zmcm \vjá{GGÞØ7[ðƒ&d5|$çW14‹]Å@šÑXÔþy—꽇 -ÎË]ÓsÏ6%¬?`v -ùû®y˜È)íQ -ì‹üÁ-'‚¡rs ]Z´ªn‰êÓ@¥håQÚ/»N³Äh z.×BïM{m¤Ð.ða!×!i”øí|IAÖrtH¤îXæn±§˜Ù³UA)’[¯L¯ øgÕ“™’ÛXD ŒUú×Nj>Aœ*É…†V^HèñäÀBNöW¿¶Ü.ܘ‡§Ï­˜’Å‘”÷JÙ0ÈôþÆØ½ËÜ×ý U\endstream +xÚÝZÝoÛ8Ï_á{sÐZå‡DJwOmšì¥À&»I8Üî>È6 •¥Ô’“¦ýÍpH™²§»5pEQ¤¦†Ãápø›áðƒüã£DE*ÙHgq”0žŒfË#6ºƒºŸŽ¸ã™x¦IÈõîæè͙ԣ,Ê”P£›Û@V±4壛ùïcÅÑ1H`ãwçï³ã‰HØøúæXÇã·øßÍùõÍùÉõñ$ËR1>ù÷Û_nN¯ˆK ‰âšŸ\^œÿôÛ•pyAä«Ó³Ó«Ó‹“Óã?o>ÞtÉ™Dí?ýþ'Ía¬ŽX$³4=‹x–‰Ñò(Nd”ÄRzJyt}ôk'0¨µMÆY$¤V|ÄãHÆPš-É@h’x³O8c}³µy[4m1kp„ GÖg£‰H#¥3i8£)n¦Äx™U  Q˺m¨¢¾%J³‘néEu[¯–@«+bÈ«9ÕܯŽy:®йqÒó`Vyé¶fu›Ï|%ˆ¡ŠucVŽÖÖDº3­>~×3TÂøpDœGY’;¢va Zf¢ÉÔø†jÒqþe>-w黨fåzîyËr˜kV¯«ö˜IW ´‹¼¥Ò£±#î­¨è×YR"ݰàZ niòª¨în×%Mµ–ô°ÿš~Ij0ÈÊs‡S§2V5ô;««æ‹4p`> Ã¨ÓGG™ÚêC&žžu†ºê:È[sW¯Š/^:À öÚ8a·uYÖ0N'ÛÌPNí8¬Žçj¤´ŒRõuþÊ#ÍTß]ÿV#¯ú“Œ²½ñ‚Ú1劾E_ÔÄg¢bpØ8Ó›Pº°‚Ö©†a«$Š3Û™8¯fõ²3Ù•ù´6MÛl[L2%*‰Gaߦt'ò­%‡ö1„·žÚ «õrjqªS +5Ú:¢|½¿¸¦j§ ­ÂÐ1à-&Ÿ-È—¿œ\¾?ÝKaL? 9,`’d4Ùýÿ#*ãC¢R$‘ŠYú*cñi;¨üumV…ÙÊ ƒƒr¯ÒP†Z[PJ-;PbA‰¿Pâ×'7$ûaW0,Xà òÊ¥,íÓ½Ùƃ™á»£L @'É_‘oñ“4‹¤V/‘«(Õ2µÖ¿\·wõWƒ1ìàÛtÞ€q¿Ò0†Z[0ÆŒw`Ä2‚ÑþvCŠ™Ø€«,±°Œ‰PŒTj d4PÒã[JÝ–ŽcaˆlS¶ +8$Snê’:L±£¡^~vù¤_îï}2òP˜ÇãLŒŸ÷ƒÃÍÀw”™*°"ö’$)‹Ë(g»È—.Ϻ6«?ýMðGlº:TtÞ«}ç=õE'R*ÊÃmŽ_ù\‚ŠA –*Lú0¥ý§Û«àæšìÁä¡lð#C2fìRÅ ˜„ ­d,³æÿo]9LÚxaª¼š™¯fÐáÁ¹wh†£èASõ ©<ïhw7'`*=þb‡Ž vëm&CQ4°G Ôî«Ü†ªYû$7w”/1ÛU^5· Á@Ìv?r²Ábز$/!ZÂŒe‚Ê•_¿ÄAË7öê½q¨xâXňc•øøŠ•]GØ%k»ßÀ/`Ï0 šÛc ©%Dð‰~í&?&CÁûïæ³øwýTF*UeD¾ÅsЋbÎ’ýÐ3FZ¸³ÜH8]zÿÎG\5fÏiDØÉ·é½Áþ~Å;ì÷4§\;K6¹v¦(ךƒ¥ÝSeb“h$àI Í£ñÏÞ†‚8ÄåÏàZ6ËÖŒY*ÃÓź;sÃ*ô¤[AÂÌuüó¼Í§yûÉI +–>Gm¥;LÂù<+s‡„e¾úH¥?XÂþÿqjZ4ƒ®»BçDïJý-rú±ZøÅ=<¦é¸h‰„G•«¥cF(Ýç+ˆ,ƒKܺÌíîY» ‰tAH±¦§bÑPÕǪ~¬M¤©¡okçÁ@á/ ¾]Xq‚Ž'ñ7/”&x× …Õ6"¾øÏÕÕõé Ñr‡ÞóÎ~àSf*⌿p<Ô¨XÒ9ãu=ûhÜY÷ù›Ë¯^•î•ZîW™zú‡«r¦–q¦»U**Ó>ÖÖÁN!¥ÌчÎGÀö䆇ü÷FΕjÏDèˆ#”‚¹›9¡Ó(N¥„ Si”dľ;aþbN&°K5Ú¼„1ÉùÔF.,ÛSmÆýþ(ÝþËá +|îwV—¥™Qfþr %/lxÂâ½—á(Qœ†Â㢰ÛÆÝõ +6 º]䮟®6_·‹zU´OCôqa*w©È 9uœ72¡“fß%¤“)åØéf/Ò½Þ›³8 Ý"‰’Ø7y2CRéb*u»NèÒq(ÖÍ×Ë{k)•º[e—\!áÆDéÊͽ™H îl<}r­(ÿÚ‚>÷×\yìo2qBwqšd‘’™o1«+ä¼[¯º;tH|†íÝ‘&þ*¬Ó(¶¬[S>Ù¹˜R×ƸŠd¢ú~üPäA'ú®äÙ"¯*SR¥uz—È š N¢ Ï@vLàÄ 9k +i·*hc–67Ã~ìèP­Þ\¤„¬ ™CEw¬µÝt¦y1ϽõZD´ÁÐNu«»®†ž¶„üÏ/—]ºéúÚ?V°2mkùµ`ÜSggAê¸^ÐbWš‡6Ñß½ ÀQØ¥YʈoÞ•D°„º·%Ý-ÿõV=+ŽI_ `ÓIÿ‘ù©‹UKÿô`;,£§Rijî +ÌåÃ0³…Ÿòë×¾øÑüs`h[AîÕ«WÃÃxßõر l2-u–fqXNäåÚñÑ kcà²+ P ß;:òھ゚ûá“9¿Š¡Yì*Ò ˆÆ¢öO¾TïTppîšžy¶)aý³SÈßÇ8pÍÃDNiR`_ä†h9ü•3 ˜cèÒ* UuKTŸ*E+Ò~ Üvší FKÐs¹zoÚk#…vk ¹.СH£ÄGhç{Hz ²¶£ @"u0wsˆ=Å̱ +JÜzezmÀ?«žÌ”ÜÆ"j`ô¨Ò¿¶²PóâTI.4´òBBO#:øs²¿ùæfáÆ<<}nÅ:Áp啲a¥;ªû·š»ºÿˆ^`endstream endobj -2007 0 obj << +2010 0 obj << /Type /Page -/Contents 2008 0 R -/Resources 2006 0 R +/Contents 2011 0 R +/Resources 2009 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1973 0 R -/Annots [ 2013 0 R ] +/Parent 2017 0 R +/Annots [ 2016 0 R ] >> endobj -2013 0 obj << +2016 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [84.0431 269.7901 145.2431 281.1822] +/Rect [55.6967 269.7901 116.8967 281.1822] /Subtype /Link /A << /S /GoTo /D (statschannels) >> >> endobj -2009 0 obj << -/D [2007 0 R /XYZ 85.0394 794.5015 null] +2012 0 obj << +/D [2010 0 R /XYZ 56.6929 794.5015 null] >> endobj 666 0 obj << -/D [2007 0 R /XYZ 85.0394 769.5949 null] +/D [2010 0 R /XYZ 56.6929 769.5949 null] >> endobj -2010 0 obj << -/D [2007 0 R /XYZ 85.0394 748.5408 null] +2013 0 obj << +/D [2010 0 R /XYZ 56.6929 748.5408 null] >> endobj -2011 0 obj << -/D [2007 0 R /XYZ 85.0394 686.2137 null] +2014 0 obj << +/D [2010 0 R /XYZ 56.6929 686.2137 null] >> endobj -2012 0 obj << -/D [2007 0 R /XYZ 85.0394 674.2585 null] +2015 0 obj << +/D [2010 0 R /XYZ 56.6929 674.2585 null] >> endobj 670 0 obj << -/D [2007 0 R /XYZ 85.0394 255.5751 null] +/D [2010 0 R /XYZ 56.6929 255.5751 null] >> endobj -1658 0 obj << -/D [2007 0 R /XYZ 85.0394 232.5802 null] +1657 0 obj << +/D [2010 0 R /XYZ 56.6929 232.5802 null] >> endobj -2006 0 obj << +2009 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2016 0 obj << -/Length 2917 +2020 0 obj << +/Length 2914 /Filter /FlateDecode >> stream -xÚÍ[ÝsÛ6÷_¡Gj&Âá“ îÍíÔÖId¥×¹¦´HÇìH¤JRv}ý-° EÉ’iÙjFã\‹Å‹ý 6 ðÇ*$¡áf $Š25˜ÎOèà|ûpÂ|QSiÔ­õÃää_B 1!“Û¯ˆÐ(bƒIò{I†À?\^™áˆ+\O†Z§ößäòzrùþz82&âÁûO?MÎÇX+ì4DŠoþþãÕÅå‡/cÏàã’Çççãó«÷çÃ?&?œOÚtɨ°ÒÿuòûtÀX:¡D˜H à…f ÌO¤DI!Êìäúäs˰óÕ5Ý -£„‹oA³m¨)CBÁ…Cí+çÚCUÇuVÕÙ´Â÷³å|¥U¯TQ£àn¤fpÝ0FŒRÜöC#¡cT·ó†#FéÓ>Þ˼NËʳái —ÄH&—É]: ÁƒÛb6dÁ¬xÈòoH©ã›YZa¹ZÂÇù<.³ÿùúU§K!X0mºÄ¶wqtœ{K3HX”CÅ}–¤•Õ¥‚‹¢Ä*i<½ÃZXéÉÅ-ëFXíž‚„êŠu fém=/*+³âÍ–ó¿d>}UÄ77®¿ô>‹ëFš ½zœß,®rÏ=c' cÍâÇn•F$ ³°V¾:2©|OØÿrW<4"å Ït}PÜ ªZ›_Õo‹r´ÚqXañtšVUšàgbÿùÇÉäRÖ8Á—é]œçéŒX\#Ô[­Ì¾Ýyô\-§@ûú-»O½$CKƒÙœ–Ùb´M|/§f;®¹o¦Yºw–¢ƒ‡»Ì*ýh'ÊÖŽgU™û˜o°Z¼¥”ÏR¬dØÍ²v]„¦™¯›Óå<Ík/⨪ìföˆ²úT3‹Ë6µ›If;œúIJÀ’*±p“ÖvŒ®Œ -'ñM6ËêG»Øü™à4I2Û8žaͼ¨Ýòƒâ<~Ä"<ñÙYN R2ß=ŽÎ–Pùm7œÿ¹K}…xÛ\ͳ$q¨qÝ.[Nÿl+,ÃxÒÔ}-þ•¯_?݆•EVkV#µQlÔÔ,‘jQ䉳=HFµp/¸ôlÉ©í¨iî¬Ë–QDhW*ñ Ù->ãÅb–M­!­©]³‘B€¥íx@ÖÚÚ+”ÆZö´¼w2ªç-pד…Œh!ÂÒ`Ê#¾È•IA$ø¡5OöªF´vöí(°òŦÅ:«Q3"ðôü¥”«ØÂt0 #ðÜFƒ· IÄØko_Ci¸›J?m ]pɃ34,nYm†Tm´V]¿m46 -^Ról¬ñ„eÓb'@ÂÛF´)I¢PE¡qú×2­ê{ nE Œ?oqé Gž ÝÙ6—Ÿ°ºô¶Æq¨O™¦°°&bÁ˜™GZEÞbØzhg,·+,ç8›¶:(qæº=’ÝÓÕâmØnN—<ät1E$ƒùùéÔ"¡Ö¦+ÜoºÂï4]ü•ÓÕâPÓÕèÏ̓§¢°gº¨&Tz$`ºÎ“¼¢ý“4n§ÅÂæ(Ÿ]]ÛØ‚º ½ƒi3g;1íH{(‹ux“¡,  äó˜J£5 N?ĉEå×!ƒxÜ㫱]æÕr±(ÊÃZKàv+Œ)_ xw(G ¸hdÄ{ :²u“ë˯ÇÙµÞÉŽŒ‡Eòæ@†š(#zœ­ÔØÁ¨€Š7Xhý*cЕõˆuS) -mzU†p.UǼI;³ü>žeÉjŸd¥®EùöôUö-ë%ÎÀ3ØwFuÄØï0â=±ˆ”šðЈÖ.¼ÿd7àtŒ‡Jöµw\›ÍØ`/eîˆzÄæA@‰ëžhA -E“-œ.ë»Ïåã8ý2“Hª`üåámU”™MïÓ•çÞk í>]i¯ Ò²t ø?Óiý,ð!±&3C´æ}!B51Å´]*Æö—„ÕãÓ×ãÙ‘ôˆñ„€6bº/b6’ -Œ~»-š¡‚müå·‹q?œÿ-rd]ÆyuÛì{ì²½àvÄ>^pD¶Q؃­0†H ¡¼ÅéË"‰ë•5äàJ?¼gy<Ϧ>ðu<Þ†¯—üÈC -¬¡aOH!"M¤MHaw -íŽ#Ø\ŸæÕKŒ6òVi^?]G¨#†NÛ -¬'"ZjQ˜¸´¬\æÓØæUýáÀÐX•‹‚¦EG÷Á´#íc -±«1¡êÁ4DE‚µ˜Ú¼”î­„Ïn"ô ‰r¹§‡•P{Îø<šŠ‘G+}a¶°ËUvÐaG¸#†P„„ö; aH¨;¾4‹ÝáÓ4¶ËŽ”‡Â2™ˆÓ}ìEÓb–<Š 9R}‹›k¢™FgaçõÒ¬ö£ù¹ 0!hìãræ,¦¤þ€¾Äø¨ííræÉyõÐ Û½Ý îíBËy£‹{rªŠ‡µbµ¡+ÚÃSŽ ç~‹ñqõñ|<þ8Æ—®!÷¼@ý­³4vgêJ.$´/=”Ã`<&HœøãÇÍ3>O¬ ÿÄïéà–'S܃[휅Q[s ›Õù¡Â{û\4‡üŲZÛG¬Öëu®«ìVú®:½MCÿÉ4ÒAH`i æÚÈo‚ÎÛ”õEaÕç§IU£ó¸uã[Ÿ¦À]}߉pGöã5Ñ<”©ªÍCmïÜD ÄWEìAq «æú*>$âíîÂk¡ï êxÏS¹¤xÉžì+EL¶}œBòZƳ}Lº”`[Š3éíÏÔQÖ¬¹2¢±…R>±…Ûìzáíí–r¡BT±Ü=pÊ`ÅC_ñ;ÄÎlê”PØ$v/Û´Ø©3 ®Ò¦Ï -N¨E»\ÿ.Ë*­÷YŸ\o®O dþ2Íʯªµ±¼¶w_üš$®c²M[Pµ˜yªZŽh•É=·*€ë¥ÏwS"µb›Êd9[%±Ïue²{9Hx%lÄ@!#³½N¼ZÛ:óø6Õø'3’Ù㘥Êhë®ÏÇÖvüza7íO/0" ->â"Îfs¶`Ø‹¼—?;ˆãõÃ,¢$ìÛIb‘£¨Z_pñqü ¬D‹H¨àó²<Àž÷3¸®$>^ËTH éÙfbšA©jíåog9½¼Úö,¼ïãn™Øt·Ì»[øÒð&øê]+[Ò æìߎÔi‹5„xòØÖ&Å<Îò-‚ˈH±ïæZ»“p¼®•q -Y„è3vž0”­Â1wNãîÌÚ ÝñÅCòyOeñY¯S‚xY¡Æˆæ~·*QÓ |.ÒÒÞ¡îj[#È…qÊ'Œ=r†š‰c&)2²½ù›'ž†—Ô=CBºê&Á·õžê-rÞq¹½OoËî86WÁ$Pùý·£‡òÒʞʩh–M‹]Š ÆtOHÈ'ŠËÖuœ-Ý b{N#¸PÁûè-M»[¶÷èM««¶×u:_ g±u -|®´Õ·¹YÖXH²jëüiác1ÜŽ -ÝìÓÝêv·®í›ÝH²àß0µ%'œ-Tîî³-]~òŒ’Ä+ïöŸcØû[î¸l·©¸ .Ï Uá?׋¿Æv)Ù¯ÓY\Už6k.Î?â·›/‹‹Fe‹í#w?‹°WßM»%¥·­9øºçöU†+ Cí'2içË2ƒ©Ã'©—å Ë£a{gÎþiMÚƒ.¾ŽZ¿m¡Hi×€Ð# #)¶ý\Šzw¯^úã¬ÕÏÕ¤&"êÞ†ãk™0$öÊ`2€ê„ÑOi~ÇÕÔëHÿZð½endstream +xÚÍ[Ksã6¾ûWèHU°xÄÞœ±=q*ñÌÈšlj39Ð"=fJ"‘²ãýõÛ@ƒ%S¦e+S*5€FãC£ÌþØ R„ +#ÚH¢(Sƒéü„¾A݇æÛŒêF£v«&'ÿºz`ˆ y8˜Ü¶xE„FL’߃÷?ž~šœ‡#®h’áH…4øáòê )?ï?^]\~ø2>jL.?^!y|~q>>¿z>qè/[|ßë‰íä{^O.ß_ÿ˜ütr>i&О$£ÂJÿ×ÉïÐAsýé„a"5x€”0cø`~"• J +QSf'×'Ÿ†­Z×µ 4%"¢"®;P㬠5eH(¸p¨}å\ûÙUq••U6-ñ÷Ùj¾ÀÒºÍWª¨Ñp7ÒÀfpÃ0FŒRÜŽC#¡cT»,”l8b”>ã}±Ê«tYz6¼%-pá’ɤã2¹K‡#!xp[̆,˜Yþ )U|3KK[fA¹šÏãeö?߸lg«§õxØñ.®Žjbi ‹åEAqŸ%iiA©à¢Xb“4žÞa+lô€äâ‰U-)ÊõÎÎÍÎB]Å6Œ³ô¶š¥ƒYñf«yŽ5Y‰_ß”ñÍ/½Ïâ* ¤—óÀÄ5Îã¹gì¤a¬ž#PüÜ­öÂŒ¤aÓÒ7G&¥ Çñ5wÅC-R^óL7'ÅݤÊÅ5Ðü¶XÎV@?[)žNÓ²L¬†i`!öÕ?N&Ÿ²Á j¦wqž§3bqPl³eöíΣçZ9ÍpÚŸß²ûÔKâ0´4XÍé2[ŒºÄ÷rjæ°ãšûnšµ¡{g):x¸Ë¬ØJ»P¶u<+ ¤xÈ\e¾Åjcjðû+¥|–b#»»nV•"luÍ|Û¤˜®æi^yEYf7³G¬|Ȫ;ìPÎ,.]j7/’Ì8õ‹"”€ý´ÄÂMZÙ9º2*@œÄ7Ù,«íNðCf‚Ó$Élçx†-ó¢r{Šóø ˆòÄok;%HÉüð8;[Bå·Ãpüç.õ ⮵šgIâPãºÙ4¶œþ Ø–X†ù<¤©«-þ¥o_=펥EvkV!µVìT·\""å¢ÈgxŒjá~àÖ³%§>v º»³.³ˆÐ®Uâ²[üÆ‹Å,›Z+B;»a …3ëÝŸ3³¡½Bi¬YO—÷NFõ¼ùm»1CÁ­”+™ðE^L +"C¾éÄ^Õ©–¡…ÕÎñ±V¾X÷Ød5Âù€;„ )×A…iáiA² +CqõÚÛÖPî–Ñ/YM\òà ŠÛR[@*»BR„ƒöÐo›‹†À´–˜gƒŒ',ë;à†À„XwôÐÀ£$‰B9|Æé_«´¬î%8-d0þÜáÉA‡ *Àƒº>—Ÿ°¹ôVÆq(O™¦°°&bÁ˜GZEÞVØvha,·K,ç¸ÛVX>⺵G$»«ÄÛÝ^,y¸ÅbŠHQñó‹%¨ÅAm,V¸ßb…ßi±ø+«Ä¡«Öžƒ +†NEaÏbQM¨ô8Àb'yIû—hÜ,Š͇P:?»º¶uqz ÑzÅv"Ú’öP¶êЦÂWÀ@Èç•RS£ôCœXL~2ˆaÁ%¾ÙU^®‹bYa(‹Pc \m‰qä‹ánOåháÖŒŒxÜLIÈÆ5L®/?¼e×{[2ÇÃj¢Œèq±RC §®á Þ` ÷«Ì@[Ö£ÕK¥H(´éÁS¹T-Cð&ÍÌòûx–%ë#‘µª˧ ¯/³oy\­ÿgoÍêh‘Ρ=tzy© h,ÂûOöTMGÁx¨T`ö®‚ë³ì¥È-QÖ0F4dý=p +E“!œ®ª»ÏËÇqú'ä!‘TÁøË :Û«Xf6¼Oלoù¬¸±ût­¹6,ËÒ ØÿL§Õ³°·¦t´ZÌ Ñš÷…0 +UÇÓt©Ð_FkD_fKÒ£E؈é¾(˜H*0Jøívé° Ädã/¿]ŒûÁüo‘{«eœ—·õéÆ.ûÐ mKìc…V@$…=È +cˆ”¸[”¾,’¸JQQC.\ ôƒ{ö˜Çólê]ÇãmèzÉ:Œ¸ö„"ÒDQ‡ö,О)‚Áõi^¾Ä `'`™æÕ3Àµ„:Zà´­f=Q€ÐŠ(˜NƒÁÄ¥`ËU>mÕ U·(¨{´ôoD[Ò-¢«ªDCAT$Xƒ¨Í@éÞ +øìaA–(çQ{wHE µˆÏc© y´VÎæ;\ç=¶„;ZEß^·# u Á—æ«;|š°ö Ù’òPHBÞqº¥¨{t#É£!Õ·­¹&šitàf^¯Üi?–Ÿë€B€Ú.®fÎRJê/n¡&ÆO‰loW3OΡæbØžÝNðìzÎÓÛ“ÛR¼„ë[Ñ\Š*îe€T7/±.ÆÏÕÇóñøã´ ¸çà•Úw^`ÎÒØÝ•+¸ мôPƒñ˜ q⯷ïî<±*üo²·–ƒSØšLqn¹sFMË lÖ÷‚ +/âíwQ_Þ«r㬰Ül×z±²[åÛêô6ýüçRZHý Y¥=Ö—kC"ÔoÓÓ…RŸŸ¦PµÆã¿B}šî¶µ}'¾-ÙÕ8óPBVªzŒ3µ}DÕ_±‡xÄ¡Ap}ïæáµÀ·&u¬÷¤\RH³dO¶À•"& +[>N!Q]Ƴ}Œ¹”[P[Š3æMgê(v\Q[A)ŸXÁ.‹^ø¤ºÛ&BîAXŠ".wOœ1ØïÐ7ü¦°µ‡ºÿ6eÝ˺Ö=vh •DiÓg +'T‡¢Ùª/—eZí³7¹ÞÞ›@Éü㘵ï]7k"0 yçkß²ø2ýǤKWP±˜yªXŽhUÉ};U  Ç=ŽÒç;§ K,µbÛªd9[±ßMU²ûØHøÄkÄ@#k½F¼Z×Zëø6ÅøçÜ3ÒÙã8£[¸>[»ñë…=–?½ü ˆ(x‡‹8›Ì9ØA€= bŸÑ^þ¼èö$ŽÕÿ²ˆ’°ï̈EÌ¡j¼ÀÅÇñ/° -¡xϗ˃Áëy?ƒêZâcõ­L…2ž%¦9”ªÆRþvöñ—ÓË«¡í°Âï}Ü,Ûn–y7 55o‚?½Ke¢#±`ÎòíH–:ì Ę·6f0)æq–w.#"yÄ¿›Km/±ºTÆ)ä ¢ÏÌtÂP¶ÂÜ=Œ{ûjmÇÉç=UÅg¹NâU‰ú"êwÚ"(ýƒKG,ð»H—ö-t[×jA:ÔÅ©ž0ö2Z&Ž™¤È Èöožx>6÷D éV ¨ë„Þ¶{ªµÈyÇ#õ>­]¶ç±­¶Š0Jå÷SÛ–JÊ;+{릢=XÖ=ºÕ6d„1Ý2Ɖâ²qg+÷ØÞÄ.T0Â>ZËCӜ̈́ÍkxÓhª-ÇU•ÎèSl›¿k]õ}nV’¬ì|F?-|†‡O¡{Þo¿îm¶{;mÙc£! ñ†ž¶ä„³…Ò½`¶¥ËOžQ’xÕíþ§ +û"Ë=æ–Í¡7Á噣áÿFøêêq‘bml7’­Îâ²ô´YýüýënR|ò-j…-ºgîþ¹Á>`7Í”îÚqñußî=f+ Cí2iÖ¿c“ÁvÔMËf“YÞ°y0¶¯à¤›ÒtëµÔúmÛDÂÌ…ÀF$a$E×<ÑAïYÕKÿ¿jýgRµ_¸md"øƒõ´—x¡¾1jžâÿ«n×’þÿœãyendstream endobj -2015 0 obj << -/Type /Page -/Contents 2016 0 R -/Resources 2014 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2022 0 R ->> endobj -2017 0 obj << -/D [2015 0 R /XYZ 56.6929 794.5015 null] ->> endobj -674 0 obj << -/D [2015 0 R /XYZ 56.6929 741.8766 null] ->> endobj -2018 0 obj << -/D [2015 0 R /XYZ 56.6929 717.2979 null] ->> endobj -678 0 obj << -/D [2015 0 R /XYZ 56.6929 609.8545 null] ->> endobj 2019 0 obj << -/D [2015 0 R /XYZ 56.6929 587.5432 null] ->> endobj -2020 0 obj << -/D [2015 0 R /XYZ 56.6929 587.5432 null] +/Type /Page +/Contents 2020 0 R +/Resources 2018 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2017 0 R >> endobj 2021 0 obj << -/D [2015 0 R /XYZ 56.6929 575.5881 null] +/D [2019 0 R /XYZ 85.0394 794.5015 null] >> endobj -2014 0 obj << +674 0 obj << +/D [2019 0 R /XYZ 85.0394 741.8766 null] +>> endobj +2022 0 obj << +/D [2019 0 R /XYZ 85.0394 717.2979 null] +>> endobj +678 0 obj << +/D [2019 0 R /XYZ 85.0394 609.8545 null] +>> endobj +2023 0 obj << +/D [2019 0 R /XYZ 85.0394 587.5432 null] +>> endobj +2024 0 obj << +/D [2019 0 R /XYZ 85.0394 587.5432 null] +>> endobj +2025 0 obj << +/D [2019 0 R /XYZ 85.0394 575.5881 null] +>> endobj +2018 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2025 0 obj << -/Length 2524 +2028 0 obj << +/Length 2516 /Filter /FlateDecode >> stream -xÚÍ›[Sã8€ßùy4Uc­î—}£˜ejº³Õ5—‡˜Æ³‰Žhö×ï9–+äâÒU)"˺}::G:2¬Gáõ¬"T8Ù3NE™ê ''´÷Þý|Âê2qS(K}¸;ùÇ¥0=Gœæºw÷´e µ–õîFDÿuöéî¢sE#MNc¥iôáêúÜç8ÿóñæúòêçßúg§FFwW7×>»qyÑ¿¸þxq;g9Ô—A uÝÛ;¬T×¼½»úx{ú×Ý/'w‹„ƒdT ôßNþø‹öF0Ö_N(ΪÞ3¹=ù¼h0x[U]MJ ¬¸éÅŒsÂ$ßÜ­ï‚B·uÒ)¢%¯z®½XN„rí,pÌ‚HJ³žQŽhÁE5 Ÿg/ç³|:MFÈjð ³$>´*ÛO†óY‘>%§±04ú6OfiRø‡‡|† =?¦ÃGŸW>Ö%‹dö”Ì|z”ߘ ÓªÎ ÃΡ—˜1â”âUwÉ÷aRÔÝ eóÉ}Õˆ`Qþàó’ïiQ¦ÙWÿäÛle„‚­ŒðÞË lM‡Å`Õ×Q©Ÿ éTT¾LëÌA6ò‰áxP¯òžëù§b~_$ÐwVŽ_–{òº?ª -WØAmw)¶ „šß -&š‘cGŽ¿A ˜ÑŽt͸Fó„ˆÊýø« /ó È3ÿ"ù>Ò ÛÄ×ÏiùØÖðújÓ‚-jõŽSpO=Š%zY£UqSmIH$¹ÚgÄr¦ë&ƒïñ®½0*‰ãÕêÁªù´Ló ÈJg¢?©¢E’àƒõ00w”ÃY:+„0)š…«*œ8lˆ@µÁ}>/_Û!$‘––¶†8Ê*‹â_ξö|¢˜‚Eù8¬°ºtWÛÝ -<I2° ÔÙ%‘VmRSj !ÕÕÖP@@T²Vc4Ìg^½ŠižêÌJk諳]AR¾RÑF%áB5s<ÌçY‰ ?.üz!žÒ|^ø0>…×…°\àyÈk†J°ÓBõBû>‹ ƒ$TC“qSàPN@P\fùv' a :G]ã.éx>KºÀ LšQ­"¯oÔÑCUÝO7X4­t­ XnE°j¾\¯ œQb´tu§¥‹%—Tf¡ -à‹«)–`ö—Uß´ª€ï}9Q«æ€*ÀÇF×y™ü†ePÞ´XgÒ=¢C«Fnšó§tÔ¸º ˜×ñ‹»ð™÷ƒáŸUÙ‘5Ì'ÓA™Þ§ãxEOKl‚ÉÚBcÊ;[H,R°v”¸C¢3› Æãº…ÿ™äÿ§?)åY²¶ë¯³ÆAÓ ºðOÅ=?¦Å:o¶T¯Q¤³yùŠ×Oþ^3­°EáÔšºèzßÀ`Ãj7'[‹™c°œŒ~eÌ%.y=çóqåó€Ç¸È}æ@òyiVÖy¥7oJ…Æ*5ððM8é?a–n°²áÀ5@›V1Õj]H…É,/}â>ñ¿Õ~'sAu”ž²¨ª[­´²ÎÌ|±él0\;e:L6ۻЖÊÞ5½ïÞdScƒ½Ó €Ønî”¶àXœ®ÆüåaÖO¾çY²Ëž¬\Qúþ‡•ªT9dŃ×}xÄ;NJÜÏm„Ù -ú¾ÿ@–ŠK퀩ÀK;)+@¿MGƒ2L—Ï;!|iÌkj…·†±1ƒ[AR-II‰…£@I û:áøÉbúF”è^‹dO–œ‡eÉÇ’[bé8Ö*Á‰´’p€#îkºYž¿À‰/zról@±Î€ö¶ò d=ZÝdš8É»L&§Fãž»™Ì50÷0’lGË–Ö°~Ôe„ õñ­ÊXì¨|^0~Ì𤃖EÇé<5ÑÌê€Ý‡ÁèÓ,™%ßÞÐÛÉ¿“á¡ױZÇFçÅÆ9¥Eº°ígóÃ;Ô ´¡ÄÎØ$Ô‘š/‡&ßT©ƒÃr4Ò8g9bpGDV¢°ã$–cih8.7l$š°«„F-Õ~‰`Žó§1£”F¿/6Z¿Ây£L²A6¬3nK8°q­'õcsy5'LÐ&ÝÀ‘ëm:ÜÒÒÂ8ØáúZ ô€«h1¨jÑÚ áÂsjª#eàŽ´_H·/“ûŽ4pZæÑ¹vU­×!#˜£A%Ú.Þ'4âÔÚÃÁÂnTmRµ 6ÂIæ7­pžO^næå“\cNìÓ•lŸWŸ P¥hpKñdÜX“"ÉJ²^ ×1ã3j;Ý…Ïp-š¿Â§wÁ§ß„ÏËeŽ:)¥ê§5˜<Æ|WÙ»”¯¾ìHÒ§5;‚–b Þ1STöîNtQT’P£Ü2Å÷èàŽñŽ™¢€§¬‹¢ä„qjŠëÃf¯ f°}¯îÚ6ƒô;«-   ’$×°uw]´§Uí[oÎöu'PÅ'—”;XÅV²cVD&‰æ¢Ó%3K8£2¸Ïb~À@´c&H9ÑÚvzeØpó&”{öå²ßO¾í¥ƒXg%·u‚ñ -æpÚ4Lt¹e\¥l‰ß>*¸7¿P°#Ö?nà@£l—Cæ–ã}­wÈWoп«½ù‚3?ØïY*º\17Љuf‰ß>ú·?¿@°c^¿°Ó³g:®,‘B.nunçCüd¨“ßï+·8›n$ -l1m%ÚŠzÌ - ›>ëx'Q©‰4N6D7D,ߊsC³eHy(˜»‡Ï~Dì‡iGDõ…Ï~4Î81Véí4fxc£‚š¨hý¤ÈÇOÍTì3óAZ¦a,Ûî„~dÈ‘>æÌ`ŠÀ_,k‚ÎL1Ðj#WceøAˆ­AÖùTu[ ­ë^Ø÷A"Âúð°dªã²’ ŒÖr¿ÙüŒßþ WJëèöòyô¹;0ßúýî{ 0î°wCɸ$\ÓŽJÆ x -Àzo€z€pG«Õw…ªãJ’1î¹úË ß*%©6Q¿¿®¹2ß jq¢-N -Uí¸¡dT'êë—N½Ný^œ¨ÇŠÓZüÞÅm§é  ˼+¾þr~óëÙÕ5~n.UÔ‡çn˜m¥ÝéU’õÊ6¿péø¢ÈBY®kÏ{ÑÇÿØøÏå©RÑÙÕ¿ñ»b+£þn—çXêAmü׬½;Ì@Ôc¥©%~ãÒᨵ%Ô0ï§/oú¿^ÀRŽe¥ˆ—³Y7ÄE¥ÝÙ‚½—ì—¨äÕ†™*¦×}¯N{`wýö˜¤³xøÝtHHPI„p¬'Á¶£n•‡%ÊrÓ dÿ?ýÿendstream +xÚÍ›YsÛ8€ßý+ôHW ±¸}s|Ìxjc'²g*5Ç-Ñ1g%R);Þ_¿ ‚dQ¢d;U¬TE ˆ£ñ¡Ñ 4h2ÂðŒ„DÒP3R†#‰MæGxôÞý|Dª2a](ôK}¸=ú×S#ƒŒ¤rt{ïµ¥ÖšŒn§qt -ààÃåÕ™9©ÀÁÍí±âÁ‰ýïöòæöòôæ84FÓàô—“O·çcWJz]NUýôúêâòç߯U×W.{|~q>>¿:=?þûö×£óÛfþ fVúoGþGSë¯G1£Åè 0"ÆÐÑüˆ †g¬Î™Ý}nôÞ–U» q® ¥ˆpº½[׆n«¤HrÂ^ôJ‚cТT1aÚy Ä›©a”F”0H2ÊÊyø¼|>[f‹E<µt õjm@VáOVË›¨GnÓväö×kÁf´#í×tÛ•À‚"³¿nüe†“9ʳԽˆ¿/fQ’Ú6í매xhk8ýð5ŠH†˜„äôc2K`Äy¸p,B+Òs‡Z…M½51-ËÍ>(AšYu1¾‡ûvC0G°¼iU5[I–[nTð8cû ›;óÉ2Y„%D˜‰”Àz}êl#ÀªEwÙªxiS–ˆPa`µ)d0)­Š{¹ü:r‰±gšò¡_asñn¶»“øšHšA3Œ¯‰´a—šR‚øT7[³‚ J¢à•"[@“lé,_dé´Ê,u°‚¾9Û%tÆ9{¡Á[M'ˆ2Aj ÌVia—еûv©Øß…â1ÉV¹Ëó“;]ðËyþm¸ +Ð%eù&ömV‰°dbÖÞϪK4Ýí$,Cc°©ÁE”ÌV˸ß\ÃäYS*Eà4’2¸/«» «&…¬tÁ–ÛÐ[Ãê‚}Ù­ ”`¤$¯­ËýVé¦äšÒ4ʹœd¦]ì›Vì{WŽUÊ`s@B-tp•ñ¿aXÊÊ›ä]f½éÑ:µräªî1{L¦µ»›ƒ‰=»·ß¼‹&ÿ}ŠÊ²S÷j’ÍQ‘Ü%³°Ëª'…m‚ðÊJÛ”s¸X%#í(íÞ SÌrÍfU ‘û™gµ³OaLÓ¸³ë¯ËÚI(U:wOùÊz›Šò.A(’ÔŠt²*@ñÆñ?Ó +ÛеªŠv{[ªD»AÙÚZH ¥ä sþvÑ‹à)[ÍJ¿¦'çûÒ$ïI“j¤ê9â +Fלxx€¤ÝßôÓ<{†Ó_2qìVZc•íí$êÉ:`ý$NûL'ÅÆc<¢û™ÎœKO¶´M­HA¬‘PLù:ùZ…Ì÷T@'6>n mÖsV¯$ÑÒ£÷!š~ZÆËøÛ[:{ùO’¼˜Ð$D࿇#•»´¸¥Á¸†q*vÃîZµ ø×Q3¨j"ÖZ!fÖ^&Ö&à“¤[G7Ïó» Î7pt¦Á™ ~•ñ­ܸPˆ˜ó¶‡·Élé0¬õÁ a[*¶iZ ‚…0œ¸Í+œí“ûçëUñÈ;Œ‰•,x}½ü…J5ƒYbOɵ-Éã´@ÛÙyb ™žâPÛÈzJg‘ô=¹=ù*zN,5tz`å8碇ž”àñè]¦oR½êê#N;ö-DOº!C0ÖQp„•0ëߢ{Bô¤2DÛMÆIDN¡Xy»Ãg/¦°y/ïݶst{ª=ß—#yWŽT¶Ýô`dМ•W½>9Ô“@—hî+÷°ˆ­`CVC‘¤¬Ï(ÁÜçwÈJ~?O²!ÄI©ûü1–ˆÖñÜ“/ãqüí ´u6Âq;—¯'×€—/5)Âz2, c²†ï<Ÿ/×€µÏžß”Ð=®˜jj/m+¾|…ö]ŒÏ“kÈø`£§1ëqÂTAÚ¨5|‡hßáø<¹†¼xa‹§ûrThÄo.unVûÝP/¾?6.q¶]Gä¶Åxºh+éÕv{ÚÐ> \"® ¯n‰R¾–æ– e‹Òò½Xî0ûÑ" bвƒBfÔ~Ö@‘ÒBî™eÀ+á…ÌX2Çy6{¬§bß(Y˜%F³ë>èG†ñˆ4˜&Ð"«CÍD@y¡øfˆÌ~¢+˜U>uÝ:kÂÀ~ßÃÅûH"z.+ ³QZêv›Ÿí@Ö‘ !epsñ4ýÜo]ÿ޽Eè 7ÜJB9¢÷ÜPªÀa(â!”#”‡#ô„°‚ácXô\IZ¥ 1ÕîÎÛªÇRãñ!ZØqm¾3ÔõD0P •$˜!ê˗¨< ¨|+POÔáÕÚ~ùbvó4Ј&Î1_}9»þxrye?@ç"Ãs?ζÒþüJɾ¾•´ßºô|]¤1ÂTV^ø|lÿ¦ã÷‹c!‚“ËÿØ/5Æû] ÛÚPjÛ¿.±µ÷Çé‰:\ž’Û¯]zœ6übEœÏ¾¸<‡òR/ΗË~ŒM¥ýéy‚½•ž§å "»¾aÇ£^´ûþ%Oû·M\ÁÙÜÿ’Ú'D•@PYŽ˜ûŽZ<ìu3ƒ­nUÌ“ýÿ…kzendstream endobj -2024 0 obj << -/Type /Page -/Contents 2025 0 R -/Resources 2023 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2022 0 R -/Annots [ 2027 0 R ] ->> endobj 2027 0 obj << +/Type /Page +/Contents 2028 0 R +/Resources 2026 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2017 0 R +/Annots [ 2030 0 R ] +>> endobj +2030 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [333.4761 684.0956 413.3061 696.1552] +/Rect [305.1296 684.0956 384.9596 696.1552] /Subtype /Link /A << /S /GoTo /D (clients-per-query) >> >> endobj -2026 0 obj << -/D [2024 0 R /XYZ 85.0394 794.5015 null] +2029 0 obj << +/D [2027 0 R /XYZ 56.6929 794.5015 null] >> endobj 682 0 obj << -/D [2024 0 R /XYZ 85.0394 447.7394 null] ->> endobj -2028 0 obj << -/D [2024 0 R /XYZ 85.0394 422.6188 null] ->> endobj -2029 0 obj << -/D [2024 0 R /XYZ 85.0394 422.6188 null] ->> endobj -2030 0 obj << -/D [2024 0 R /XYZ 85.0394 410.6637 null] ->> endobj -686 0 obj << -/D [2024 0 R /XYZ 85.0394 197.6003 null] +/D [2027 0 R /XYZ 56.6929 447.7394 null] >> endobj 2031 0 obj << -/D [2024 0 R /XYZ 85.0394 172.4796 null] +/D [2027 0 R /XYZ 56.6929 422.6188 null] >> endobj 2032 0 obj << -/D [2024 0 R /XYZ 85.0394 172.4796 null] +/D [2027 0 R /XYZ 56.6929 422.6188 null] >> endobj 2033 0 obj << -/D [2024 0 R /XYZ 85.0394 160.5245 null] +/D [2027 0 R /XYZ 56.6929 410.6637 null] >> endobj -2023 0 obj << +686 0 obj << +/D [2027 0 R /XYZ 56.6929 197.6003 null] +>> endobj +2034 0 obj << +/D [2027 0 R /XYZ 56.6929 172.4796 null] +>> endobj +2035 0 obj << +/D [2027 0 R /XYZ 56.6929 172.4796 null] +>> endobj +2036 0 obj << +/D [2027 0 R /XYZ 56.6929 160.5245 null] +>> endobj +2026 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2037 0 obj << -/Length 3512 +2040 0 obj << +/Length 3516 /Filter /FlateDecode >> stream -xÚÍ\[oÛ8~ϯðÛ*Ø5Ë;EìbN.³ì&mâY`13Š­4Bmɵì¤ý÷{ŽHI´#[ÎØ-‚j‰"Éï|<’6 ð(M´åv`¬$Š25ÏNèà|ûù„ù:úÒ0¬õÓèäÝ¥0K¬æz0zdÅ„Æ1Œ&¿EšHr -hôÓÕõ¹=rE£»Ñ©‘Ñ{ügtu7º:»;Zóèì_ï?Œ.n]-4t%¾ùÙÍõåÕÏ¿Þz7×®øöâòâöâúìâôÑ/'£fá$8ú/'¿ýA˜ë/'”«Á3¼P¬åƒÙ‰T‚()D]2=¹;ùØ ¾VM»@“2¬™¡ˆ‰T*ÞÞ­ë‚B·þ‘1b•Úìu¨1B€D3¢R™FœzÐ1ÌÒšQ–hÁE¥‡›åcº¸X,ŠÅéP*Æ­Å‚Æb -E g¶ç?Y9K–ãG ¥U&º=_Íoû!m[qÃ<Ëy‘—)²Ól²s( F©ûêpí®ÎÿöRÀ_JìúñywÊ"\`XaùèknÈ®Ê6¥Í‹ÅÒ=MŠt£^õŸXA먞6<>?&¾ð9)ÝCúužŽ—nÊ*ŽunÚðÍw‚2V¥º¯¾™H ÷^,º:¯¤[MÒß)åy:ÁWÝsÅ8U§±PÛÆ†^À)¬êü¥Z90‡‰r•Šù2+râ–‰4FYéúš%¾³jÄð›äîC–O²q2¬†=d”K©\× -uk­xp¿‰û'ã -xœYYäYþÉWX.ÓÙ|¹}=†L?lñ|O»¦ 'BÙ»¦"VjÖè”wX¬òq<ê_‰£S‹«-ŽêshWäÞþ"ñÛõZS"©=¸jA¬¥ÎÎý;™Õ E×[=÷"ëZ t“tš~JƯÃ2åq±dÇÄ%)-ïÁRqBÁ¤UÈܦKôž˜wà0>öƒù±u¸¼å"«™9OÅb¶Ê`o˜–Âm˜òn$%…ðœê–÷÷ÝÆ¹Â³ÛÔ«}²òD]uxS,k[äK8NwÀÛüXèBŒkõ;R·ØŠ.8Íã>cÊá+ÙÂ{WŒ?ï(^¡  GÑ»¹ßbžzçDÛà‘b 1þœ.!n_(£›` D¯Ê!«m"àó9”[›É,*>ïr,áàß®cQ†«û˜ BZ½°~5Âú¸·cÃCxS÷ ¬4t!å&‡÷ó.ûr·Ý–Ø k0â7Œ+;±8vã*%‘ÂòMæî«>"®Áˆß°Í…('¶¦'R‚KçÜÿ[%–Éô½K­ûq=¿¾»»8s¨=%Ól„>?ß d0Ä7LP¦!÷æ}¦•Só±k@Þ|> CˆøÆi:Ù‰a0ºcaÈ!)Þ¹ ÿBdÝb†Ò‚lÑçÿiL”f ÂëôÓkP4Ò®¡h|PŠåy•¡?¥®4Ë1£ ªØÃ®·OÁÜCë{’XÆŒP£{¼X¢µkØÏÄî¢qŸA w4;@ QV¿Ê¶ÔM¶AKÚc ¤áÄÐØ¹ª‹o·üFy¾Gvé|dù¸ÚLÑ2¹¯)ÌÝr—Cº\}•O| H®ü¤ ¥{ÄmåÛSa cÜý+ý¹JypR¾¸½ÒEù‹|áËýb>X7[ÁÝR`jí«”ótœa.ˆÃ0êjË]0 éï¢Ý€œT)~Xù‡'ŒLEW¹kç7²Ab0·k©réZbÒàL_λSksI)¸&ñtØi÷9‹äÄÆqÜ}9l$C‘/ù#¸ÑL¶=ãYȺcµþÖ1IMX,åö9*A 7~Ä9Öûæˆá1‹×§Èû§K¨@H×d0AÒxûl-š[hr¼ÙÖûfk5žuØõéÎ:¦ qÒf}ºn­Hætµ‹Ò¬5|+h^­Ðöx4{@b¹2ëd@Šmhm62w¾qˆ¿3[[äÞ†ð(_Íîñè[€™@«†e_êP|y~,ÊÔ}m¡û˜ÔÛcørŸ.ŸÓ4ï²y`Ñdlv€«HlÀÚK¡‡Ü\/qŠìX¤ijáÑîgÃ>F¸4vݶ³ÊtXnˆ_-¯UPÉÉÇÓU “wô&]4DKʶ¯@Ð>ø XöàAâØèÃW`-qŠì²7Œh†Ö¼®¶€ -ê1Ì>ýúbö³l:ÍÊt  ÷s•Ñ¥;L¦­c²–h*͆cJ>#Ó´;ßÄ_ò”æ™÷VPðìëÜ.K'A¡Úèíd„>µÔ$ø—‡“±–8 Ev‘Aä(ahM5!í4uªn'ã¤ïýä)À -Tr°`š”Kp¬FglØ4¯Î™D,¢ò±XM'ø,<(sk|îC ¨œú -IÙ‰¯$¼u;]øÂ, W‰§Øh™Ç×K†"»ð…5¦ahMµÊ•üµk!Ó›ˆ| 4K˜áîB2K“ÜÛWf$šq¾±ÅïÜãÆ¾‚÷Çòqk_±ÐÛW,_·¯ø±±¯øâ²dêÊÝ BìnaàïSºèÐÅæåŠºàÁf`]Œ˜_îÕ‰ÃPäK]pHÀô4•¶9u?øìšMëÆc[*¦¦-m.ÔÞë½Tm Ä_èO5jÔÄÀµKH‹ éÀ´È„Wñ^\Éã&†é @6‚u« ¾/(Àkq¥š{ŒŒÈS¼bB£;–…ùçÕ»«ϪÊe6ö›~gE-ÓEÙ¡<ภë³~×yqøPâð}\‹«Þ’öümí^¾ÎÓ…È]~›§ÕU%ÊëÊéˆM,þèÚñþzþAv]ౘñ°ÀµAÅw¸ÕŒž­+¢V VXÕŠÕ¯«·‰KÙ¡0ñúÒuÛ@ÖmL *î¶.Ô.*ë×HÕ{Iý5ϾvI¦è8„ë 98šób–d¹^åßÝ!”eÄĵW¼<®®u¤Eâd#ƒžüñ²ë Ow«|^-Ël’º—6mæ1o^«‹ŠfÅd5­‚ q¸®Ro®tíTôPL§Å³¿ˆ¥ýE5V¶æMÑœª&,üG×40 qÛè.:Äpˆ¿µ¬­è?»#W¶îç…Ë/ݨ7Úpª¸àü$¯«Ë{ð=™NÝÇv1W­[ouž’lZÏ옾‰Žcûj#ÜI¤A×~­ÿÝ_Ûý:NçÁÕ¡ /Š· -ë;™ßN[>nœ¬gá±{:}¹Óƨ% þ`FÅ÷sbjÄë|Aw«zôˆÍœ†œsÜ|h½µ°k^Ø%pˆd!ˆtæüÛ쾘b¬iytÀ¸ðÁê—Ìbë¶ÃÆ ŠµÛ–‡o·P0ð0ÞöÐg}EÖPa-“;×¥Ùg]Êu¹UÊÍ<íÚ/T`ÐБÓÀËVÆŒÆÌ„”åÃj:m¶%õíÓ¸ñ½®iæE¸+¹ðÌçÓlØu»fì÷Wƒ«QÝ—e‡Ä…³}L´Ä­ŸàT&f«BuFMV‰£²Êà•÷ÿ:Y± -¡Þ¡ü@Rm9žX'Öúµ-A­ß0¢í…(,lïj[òäÂJ ¹°Ræ%Tä¯o•\ÖŽE®£LäÒ0w%{¸¥5aÒ߈üAä:›bv»¿É›”Ød²C%í\åD¾ƒ?e -·cÛ£éVìs¯¤’Ÿ²|ò'Ö{øw÷™?nj#²r‡Â(Ž«±ã®!›¦Gc’.èuûgEž¨±1ˆHÇËW(-@ã-+k¢ã¸'Vc°qócÝ**­Wag^-MÚ’–˜ fåc¯tm[U`q,•ízy«2ˆpâà"P·Â €ùÛ¿?HaïǘAþ‰u¦„¬Ö™"J*!Õ2Ãâ,³æmÜhÛ½7çôå²û -Ì™¬‚§S¹àÞërœ3áâ§:T‚U¨åÝ¡SšX«e»;Õ½!õ¨wº·\@OÖÊþ˜ /ô®äF~_eðÛÝRå0ò}W>ƒ ·ÊôX ˜©üÖÊç^._5ÕÂ-± nì¯2AU¡cyõç—LVršuþ5iòKãB~ü­(‹!eñ)[ýn¡,ío»›²xW ¹9ÓMYÎÌ!þN” ØpàŸ`@ï†kt›–(.;ÿüžz}ê¾ìßþï¤!€Op†¶¾÷«`ÅÃ3 eU§áŒ¾8‹ÁýD<óÕ‚±ÿóÿ?endstream +xÚÍ\moÛ8þž_áo§àÖ,ß)âtó²—Å^Ò&Þ»ûA±•F¨-¹–´ÿþfDJ¢ÙJj7¨%ŠržÎ 9Y6 ðÄŠPaåÀXIej0žÑÁ'øöËó}†u§aØëçÑÑ»sa–XÍõ`tЊ c6MþˆNþýþÃèìúxÈ49*M£Ÿ/.O]‹u?'W—ç¿ü~ýþØÈhtqu隯ÏÎÏ®Ï.OÎŽ‡ÖÆÆË€‚{3ÂA~äÍèâäæø¯Ñ¯Gg£†IF®þËÑÑÁxýõˆac5x„J˜µ|0;’J%…¨[¦G7G‚Á×jhhRÆ€7ƒ¡ˆ‰T*Þ>­›‚´þ‘1b•Úœuh)à +RPšP©L#Î)XIi60Ê-¸¨¤pµ¼Og‹E±8JÅ »X L0˜ƒYlaÑm‡9”SèÏâ¨X”î½zKÇiöNÈ&àJ¤Pƒp©ûñ.¥ TÉaÝá`pJI¨¥ªNiˆ6Æ)õÙéå =O²i?„ØõOª(…˜ƒîË*]|sw@cå ,w ¬ðP(‚vó"¥¬Gt£¨cI“}J)1œÙ +šÿdå,YŽïA%­2Ñõéj~Ýh;ŠæÕ°œy™¢fšMÍ +ãÑ}ê¾0ܸ‹ÓŸžø[‰ÓÃ<^Çœ°ËÂIhŒ4‹’ÉÄ*‘†PQ’OÞ³7vXÞûž´«¶Mjób±tO“"ݘŸWóçvÐ:ªÙ†ÇÇûÄ7>&¥{H¿ÎÓñÒ±¬âuα ßü$HcUú§Ûꛉ”pïÅ¢kòŠº¥Ñ$ý“Rž§|eÑí7׌¬:‰…Ò6–0´ÿN`ÕäOÅÊ1 Ì“ëTÌ—Y‘·I$ 1ºÏJ7×,ñ“U+†ß$w²|’“aµì!£”XJåºì¨ÛiÅûMÜÏ8WàÀã¼ÈÊ"ÏòO¾Ãr™ÎæËí»1Ôôý¶Î³iÚp"”í±iÚ(b¥vPŽø…Å*' Eýûptlq¯ÅQ="p í~|¶§WüV=…Ö”H*EªZk©³q¿%3P3CÑåVϽ¸ºÜ$¦ŸTá—!¬ò°H²Ã! Á‘”–÷ ©8n°o—ët‰^³‚ò\ÅÇ~(?¶ŽÖA·\dµVÎÓÅ]±˜í2Xä›UIXûq”Ø™ê”÷·ÝF¹À±ÇÔû|²òJº,ê ¦XÖ¶µÈ—.Xœî·]ø¡°…Ø"Öê%¤±[p)šÇ}F”Ç„q%[poŠñçç‡çAøØQôiî·˜§Þ%Ñ6`¤>Œ?§KˆÁÊè*O]ó¸˜Í +?ÔÑKÀ§u9ô;ŒR˜Q¹Â`‚Y¾„ºoYé¾$î5èàÚÑ™â‡f•Aç<}tïn©®Õ¥#´ª•Ç+Î4›eË$ðÙþCicËñ"›/!Ù¡\äöS…·sUCB!zœ‰²œpem«]£c¥¢l–«å‹,àÒÙZ¸¢·ê8”Ñ6Æ=ŽCÅ0•Îqü2]¥ç)„γ!£››oå3ÜÇÅØUYêiúûü éÖ2ËŠÏ»J¸ø·êP”–Äè>­Ô1Òê |õ‹ñՇŷ]û›…Bš˜š¸_¥a)7õ÷y^å¹zÛAì5Xñ›EœX»Q•’Haù¦Ö>U}@Tƒ¿Y[ ‘MlMOü£'2–Ρÿ·J"“é{—D÷£zzyssvâ0{H¦Ù$pÿ>ß c°Ä7«œLC–ÍûL*§¸±k0^}ÞAˆñÆi:Ù‰`°ºC!È!ÞyÎþ„d=¢Ai²èóù4&ʳàeúé%i×04>Åö¼ÊÅRךå˜=ÝêaWˆÛ‡ÀÛ~Xý8–1#ÔèŸ6€h-äþÏ3­»T¸Ï†‹;˜ †(«_dUê!ÝBXF’öØi814vêãâÛ5†ú£Qž?#“tž2Å|\—Šh™ÜVIæi¹Ë]V¾Ê'¾$Rþ ’ƒÒ=âÁñõ±001žð•þÞ©Ü9*_Ü©éR÷³<àÓažW7‡½Ý ))µö]Êy:Î0ïÃe Xuu¨.˜…TwÑ2Nªì¿ß­€Ú‡7…LE¹çªAâ0´kiqéFâÒ §OyÀ«,ÆÔ¡J +ѧ´¼ø3ÖØç\3rbã8î¾dÖ‡!ŧÚ#”!`÷‚‰q}¬b ³±Z?u°¨ ‹¥ÜÎ!ì5m”> ‹5Å>+ãK[ã‘÷ó;4.n(‚„ݹ]É1÷ŽÈnC±‡]ÉáÒl°;ë`Â¥Í:»n«H¶tµK£5%jøV£„ÇB€†bŠ Â pº@ÖdÔ†ÖV#sh€Hp +ÀÙÚ÷&„Gùjv‹÷Ú¬5lûRuâËã}Q¦î{h +ÝǤ> ×Ûtù˜¦y—Ƀ&c³\I8— ]Bƒrsp=ÅaH² \C8C±ÖÝp…h÷³aCý³ë¶U® ÃrCäjy-ƒŠN>ž®J–¼óxi7éÒ@C´¤l»Å1 +z$ŽÞßâÔ‡!É‹càYYÖμMÑŒñ€ûôëîgÙtš•é<žÝ +*£sw]L[Çd-ÑTš Ç”|FUÓîÈCšgÞ[Aãÿ­ïh»Lj£·Û:¼" 0§dŸàr[WS†$;l„¯òǦ®vÚ:Õ²€GÇÈô­gž¬ JI¹ôWÃZalÆÖMóê>IÄ"*ï‹Õt‚ÏÒу6·Éç>Ô€Î©ï”øÂÖkýN¾\BÌ6xO¦i|=ÅaH² _ˆ[À¶3W¾äï]4½‰(Á™HfÀfx¦ÌÒ$÷–ð³Bóã|w¥7–+ã/ÞãÖÀb£7°Ø¾n`ñcc`ñ3ÄeÉÔµ»Û‚ØÕYàïCºèÅfùÄYpcÀ¤aˆøõþn­¡8 IvʈáZ¶3oóëÀÀÀÉbÝ|t§BÈN›dì™¶ø\j+ÜzKæ` ùë}× FPLcl`LŒLXh÷¤àNPðf{ +`°n!ÔÕ€c¥*€±°yŒe$4ºñ7W˜^¼»òe†x3U.³±?ì;¶›¹Ýú3èódÓšk°è@':.é«#pG‘Sû½þ_–ûuœÎƒ¡`.Š•ƒu½FæÓ–÷÷èYxÉžNŸž´1aˆT 7˜Tñç¹Y5âe¾ {T½zÀ ކ§!‡Œ\pÛúka×"ŽjÀA“,đΞ›ÝS 7-N7c>ð4Fƒs 'Ùoá‘  öþŒ]înÜbÁÀ%H ®oÉ PYˆ¦Åîi¾ggnÝßWó´ëÌPI³ÜúN7­9c9ó× ey·šN›£AIE]c7Þ× Í< Wx É|>͆]Õ4cÆBu—Ä*É gÏ1ÒÊÕ9#³M­Byí§›j%ªVÿh$¨õëV+†GåÞ§¼¢Vm¹¡X׬õ:-A­?6¢m6¶ÅY0‡×.ìÔhvÊ<…J»ðë[Õ®@l‡Ò®ƒÝLÚ¥w%û”KkÈ‘|ä+i×ÉsÜç-¬œÄ!“2i™=”ù>•)<ŒmŸLä\±OÀ^I&?gùä;v|ø·™¿ujòr‡Ä,+²Ãî"i›¦Od’.諺þ“"Ï÷ÙH¤ãå ¤Àñ–¥Æ5Ñqܰ1ÈÛ¸y]׊Rë•Ø‰—K“½¤%&„Yy_§-‘ÛV™`Jf«(oeQNÔm‘ƒ0_õûJ{?ÆLò;vš²ÚiJˆ(©ˆT ›³|\Ìš·q#n÷ÞÜØ—ËîbŸ3YEPÇ,r!:¼×í.DgÂQu¼ªx Ú»ã%¦4±VËö”ªû`†kQÃÓ}ôrªî.ú/,ã'\É<¿Êä·«t«+ûißUhðâV™>sèî Z_U¡{•ù¢ÑQ-L £%6Äí«ŒPÕèÔ¼ú[K&«¿/Í:ÿt´ ü¥q?þV:‹¡Îâ;êlõ»EgžÛÝ: zM›"šnåŒñÒÙ@öüË ˜ÝpžÓÅeç_ÙÓA¯[}îßô·ÿ—ià\§ñµ+I„°XîCVu1ÎØÓK™˜¨˜›º[°öÿÅÏúgendstream endobj -2036 0 obj << -/Type /Page -/Contents 2037 0 R -/Resources 2035 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2022 0 R ->> endobj -2038 0 obj << -/D [2036 0 R /XYZ 56.6929 794.5015 null] ->> endobj -690 0 obj << -/D [2036 0 R /XYZ 56.6929 328.1878 null] ->> endobj 2039 0 obj << -/D [2036 0 R /XYZ 56.6929 303.0671 null] ->> endobj -2040 0 obj << -/D [2036 0 R /XYZ 56.6929 246.6387 null] +/Type /Page +/Contents 2040 0 R +/Resources 2038 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2017 0 R >> endobj 2041 0 obj << -/D [2036 0 R /XYZ 56.6929 234.6836 null] +/D [2039 0 R /XYZ 85.0394 794.5015 null] >> endobj -2035 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F11 1442 0 R /F39 1151 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2044 0 obj << -/Length 1362 -/Filter /FlateDecode ->> -stream -xÚ½XmoÛ6þî_¡60±|§ ÒÔn] y±]`C׊Ì$Âɵäý÷;Š”,Ù²³,à "¥ç^x÷Ü`ø!A$fšJs$0Aò4ÀÁ|û8 Ö °z¿¼›0h¤%•Áâ¾¥+B8ŠH°X~^~º¸YŒg£ -<”h -‰‡ï§WÜí—×W“éǯ³‹‘âÃÅôúʽž'ãÙøêr< -µŽ(Èó–/;_X!/9_L/ç£ï‹Ïƒñ¢9@û3ëýÁ·ï8XÂY?0b:Á6­ið4à‚!Á«ß¬óÁm£°õµí Ç*X -Œ8!§­: ¬ú%eH[?»FCÂâBÙ,òä/Sºwèr«|m6q™æYù—.S/˜äÛ¬4'äN­ ­`*$i!he³XçÙ²p¬)óž“p8+­rQ¥ÿ”B:EµÆ¼Ušß÷)UˆIRǧ¢~RÈnR¡C -sà°’’íÔ¿NŒGˆAÂJ HŠ×¨¬%N3GˆÒ -z%úÿ$èÌ$ϯ%(ÅŽ Ó† öãZbÒgã>vxJ5÷)_TÈ–b÷%ÏÜ3v$Ï2“”Æ£¿~¸ñ -jgaåeú'Æ@“®OßýtŽ3÷œ^~¹q«ÆU·}2E?˜3 ݧþmlÚtßf_êÛVFauзÿTí‘1m4¤ -aÕí÷G}Ÿa‰"ªU`û”%^SNÖ3IB{T»°ó 1 - Æ0ó§5äü.]¥¥ÏÎ.-se{òpÌ&ò¨Åtê$B‚ÀÒ·?x]û*zÊ!$B",™„ss¤9á•à—¼°í™B%”à]Q¦‰íĔԭ°p_ËÇØãvÆÕ‰CÅÏqºŠïVÆ}„²êqÛž)ÅùžÉ •”îÏcÕÅS«"÷®n×ë|SÕÇI£Ç9£¯0ª½Q€â1ßeSU›NÐYÔ-ôø.¯Z‡H6&¶m0‚‡ŸšU5ÙÞ@?Ã@z[úɆ|îÓP©­Ò`W˼QàÅ×k{¡4«á¦8pèð2…p¹°ˆ¸àý7F -Û¨ÓEРª=Ù-g¿ÌíïCÛD€^œ5Þ z¬·SI$xIUÔ5¿p`\¶ »=µ¸pA´oÛÌ‚íIâmaúè¥)²©¿ÓôP‹^ s™ï‚·*†ñ2_{,Ãê© v]_D˜îŒ]qáuUÝçwK -¡´d\w¹¹‹7Ë4{èsRœÕc9.úNKÔ’¼êÒãiš.OsŽiŒ½À¹ê çjTŹ‹ß'Çl#Ð÷%æçÍ6¨»¶Aeœ¨®a?Ø—­/Ǻ“ÆmZu˃2õc:Kò'›¥jw»5›´î\€§ƒ‰5"„¿TÀ-Ô™`Ö¨*˜ÓÛ£Pbè~XÊóFTÕN(á+‹”îšýoC93?¶¦(ÿa,¹Òpç‘â|,Û¨Ó±lPU,¯×eqLL ’€{ÊY³ ªÇn'š–Àö®á¢Ù ‘Vÿ³Û3ýnQõš– ëÉeÍ&™Ø„Sk…þXß–{rmïÁ›Â‹¬Wqr|Ÿ­Ó—Sû—~O„qP·Ë7ÿCaÿ/û×bÑþT1(Æ4©²1"„º× 5U=¾ÿ 16.Éendstream -endobj -2043 0 obj << -/Type /Page -/Contents 2044 0 R -/Resources 2042 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2022 0 R ->> endobj -2045 0 obj << -/D [2043 0 R /XYZ 85.0394 794.5015 null] ->> endobj -694 0 obj << -/D [2043 0 R /XYZ 85.0394 665.5626 null] ->> endobj -2049 0 obj << -/D [2043 0 R /XYZ 85.0394 637.9713 null] +690 0 obj << +/D [2039 0 R /XYZ 85.0394 328.1878 null] >> endobj 2042 0 obj << -/Font << /F37 1018 0 R /F11 1442 0 R /F21 930 0 R /F22 953 0 R /F67 2048 0 R /F39 1151 0 R >> +/D [2039 0 R /XYZ 85.0394 303.0671 null] +>> endobj +2043 0 obj << +/D [2039 0 R /XYZ 85.0394 246.6387 null] +>> endobj +2044 0 obj << +/D [2039 0 R /XYZ 85.0394 234.6836 null] +>> endobj +2038 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F11 1441 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2052 0 obj << -/Length 69 +2047 0 obj << +/Length 1351 /Filter /FlateDecode >> stream -xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream +xÚ½XmoÛ6þî_¡60±|§ ÚÔi] iê¸À†®™I„9’kÉ1úïw)™rd{Y‡!€MJïŽwϽ8$ÂðG"!‘ÔTGJs$0Qö8ÂÑ=¼{7"· 8D½YŒ^]2i¤%•Ñâ.• œ$$Z,¿Ž%âhðøÍìê­žÄTàñÍb¢øøµýXÌn³‹›I¬uBÇï__/¦s‡’ÁA÷Ä¿øtu9{÷eî|ºrçÓËé|zu1|[|MÝÂK̬õßG_¿áh wý0ˆéDD;Ø`D´¦Ñ㈠†g¬}²ÝŒ>wƒ·ÍÑ!§qL¡‚û0â„×ê4`Ðê—”!míì+ ÖˆÀÄs„5ÞÇÄïã@ˆ@®Êì/S»gÈr«rm6i—E” /r0+·Em6îtV:±&¶€ª˜¤… Îj]ËÊq¥.nÂá®´ Es•á{P +Ñí};õVhy7$T!&Iâñ —„B¤pçÄ2˜ Z5Ä4ˆüϱ‰ñ1HSX ”Hñ‘í‰ãÅ ¢ô?AŒ¢DÿŸüœ›ìé¥ü¤Øñ“bÚñÓ>sTËLþdÜËM©æž¦î|¶Ú.ß™½ôž€NÊóŸ +voÊÂ}§î++‹Âdµñè/o¯½€ÖXXeÿ‰1PO¥«Ò·?ƒÓÂ}Ï.>^»UgªÛ>šªJïÍ ‚î#ÿsdÚós_dÏUm{FauPµÿÝ©Ö"5b +ªhLª_íŸU}ªà6£‘-S–x] +ô8Ùv$ ÕAR­»VI˜@ahråãb~›¯òÚGg—×޹2ì» ³|Vazy’ À¶ÂøFêªW51±„SŽ4'¼9ø±¬lu¦ 5XWÕyf 1%m%¬ÜÛú!õ¸qyâPéSš¯ÒÛ•q/!­LŶdJyºd2%¥ûûXqiOÕª*½©ÛõºÜ4ùqT)Áà~Îè ”j¯Ô; z(wE§Á{Á4Ùf›‚¡!é'zz[6¥Ãö#ë[6Áã÷Ëšœ 7ÆÆ·08½­}ãE>A÷ahÄ6a°«eÙ ðÇ×k“úCyÑÂMu`Ðá(E"DFØpÁ‡çEŠCÔñ$èPM¾Ü-ç¿ÜØÏCÝ„J¤Nkv½a #H&@èžâ…»;ã2¤2ìö¤â¹Ï> 9Û[“¥ÛÊ KS$ìú± d.KãMðZÅ8]–ko€åVû2· Á®Û „éÐNæ\xéwåÆG1$5‚Xë>+wéf™÷CFJ€³¶†¤ÕÐmÁµZ’M;ž ùò8Û˜FлØ¶¨lkQ Û^ÿ~ùŒgÜE˜>­µ h ¯ªÒÛÓêÇ‚}¶ú,l;Ë ËæM‘<ÈNß‹¬|´!jvŸ·f“·E¡‚9Øpܓ͈ÆÏåm€:áÉÕxröùP§² “Ó:[ЀÎЉ¥°MÙPçëǹù¾5UýÉ•†9GŠÓŽ QÇÙ¡G~Z×Õ¡Ö¼DhrZk ÐÚ£$JrÒ×zÆ•]×ʞݞ({06‰„¨—Tݶ*s¨6ë5Á óÍü˜ +e±mßMå¬Wiö|€mcÓ¨ýa?à_µUò§ÿ°ÿŠýu˜$t8RTÙêko”õ!ô9%1¢LÒÛÿâã+Àendstream endobj -2051 0 obj << +2046 0 obj << /Type /Page -/Contents 2052 0 R -/Resources 2050 0 R +/Contents 2047 0 R +/Resources 2045 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2022 0 R +/Parent 2017 0 R >> endobj -2053 0 obj << -/D [2051 0 R /XYZ 56.6929 794.5015 null] +2048 0 obj << +/D [2046 0 R /XYZ 56.6929 794.5015 null] >> endobj -2050 0 obj << -/ProcSet [ /PDF ] +694 0 obj << +/D [2046 0 R /XYZ 56.6929 665.5626 null] >> endobj -2056 0 obj << +2052 0 obj << +/D [2046 0 R /XYZ 56.6929 637.9713 null] +>> endobj +2045 0 obj << +/Font << /F37 1018 0 R /F11 1441 0 R /F21 930 0 R /F22 953 0 R /F67 2051 0 R /F39 1151 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2055 0 obj << /Length 1238 /Filter /FlateDecode >> @@ -9858,33 +9838,33 @@ xÚ•WK Ñ ÑK÷hh‘Y4k¥Ë×ÒIÛα:ü @Ž;¨^v FÖ‘$\¾VºTƒv0õ Í0Û'݃1‚fß®¡Œu`íw@ÖÒ ÀEª¶)×ý@ª ®¿áz44dOFíG!}„‘‡ËªÇU`ªÂü(UÜð™Ú*µv"k)æjˆ‘,O™c‡D3ŒK@âLÂ4wã'ŽF¦b2Á?; L‘‹œ¢Nî‚„åfšî*mKÏ…ÃsaK?ï±èLo²$bÓü˜4ÂÕmE§+Ÿ ,È…¬][ ÷Ùh<è[¥lé¹lZŸX˦õ4m`SUHŸ÷˜¾WŸð:°¢Z›ÎuºÅVTM¯OKç8$3ÙþYúqÌ•Çrnȯb×ÖrjS©^‘°-5º¨ZÙÕîrmëIÈîX;¹MpóÔš±Z™|Q¸£5а‚%°$ ÅÖHÞ>«íÐ7R÷·x€WP¯U]#õ\«âe®Ë¼Êß?<°œe¸é[ÑFÍNM¯v6šë#Þ7N_YÁÕ dÕÏ݈^[¡v;Õ@p¬—½«ªÔƬµLæì…÷ÐG·ÿXæ(5s›¦SJìo•Ý#+;ÙóÓç9œ˜ÿŠG÷s^q3ãQ$ô"g:RnZÈ1~?çhaI†,ɽ»=æìÿ>Êó䌆WÖNanpÓ ¸*m=¦^—UïëH—þL^ª¢N —˜´¶P‡Ý³ìNsǦ¹óVøÔÙå+±?ôésßg©Z|—=*ÿxÂGȬQgÇüìÝêØJoúE“Nß~®¸hÔá•åqì„‹6yÈà$8l¶Æð•ý›jœª[7‰éäÛ ¡F4½oÜNôæÆŸ5hSy?nw«cøûkò!šýÔíKþÝüø4~˜ùÏ-xÁ2osŸnž%8ðàwÛäýšo§0gÈö6 OÕŸçúþ×’¨žendstream endobj -2055 0 obj << +2054 0 obj << /Type /Page -/Contents 2056 0 R -/Resources 2054 0 R +/Contents 2055 0 R +/Resources 2053 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2022 0 R +/Parent 2017 0 R >> endobj -2057 0 obj << -/D [2055 0 R /XYZ 85.0394 794.5015 null] +2056 0 obj << +/D [2054 0 R /XYZ 85.0394 794.5015 null] >> endobj 698 0 obj << -/D [2055 0 R /XYZ 85.0394 769.5949 null] +/D [2054 0 R /XYZ 85.0394 769.5949 null] >> endobj -2058 0 obj << -/D [2055 0 R /XYZ 85.0394 574.0823 null] +2057 0 obj << +/D [2054 0 R /XYZ 85.0394 574.0823 null] >> endobj 702 0 obj << -/D [2055 0 R /XYZ 85.0394 574.0823 null] +/D [2054 0 R /XYZ 85.0394 574.0823 null] >> endobj -2059 0 obj << -/D [2055 0 R /XYZ 85.0394 543.8373 null] +2058 0 obj << +/D [2054 0 R /XYZ 85.0394 543.8373 null] >> endobj -2054 0 obj << +2053 0 obj << /Font << /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2062 0 obj << +2061 0 obj << /Length 3283 /Filter /FlateDecode >> @@ -9902,53 +9882,53 @@ xÚ¥Z `µŠAV£@ßò¯¤["@ó™R;NÀFR—‚/´{ϦÄqJ»r±fNñ7TÐ&7#C0Z,ksú ä´ëðl3ê¼gj;d‚¡3óPTC34s& »êKjøN W+z¼Fꢋ–Q¼þÞ B¼T<±lR\¼^'°N§†ù|ÚÏä9ÇA¸3Ýî©,ÂíÜ…˜iÏ/äÃИ_¨€QðW3W¿Á€ÿòIŽRcvgäüïDì…änR¸…B賩»ŸœÏýÿÒ-'Œendstream endobj -2061 0 obj << +2060 0 obj << /Type /Page -/Contents 2062 0 R -/Resources 2060 0 R +/Contents 2061 0 R +/Resources 2059 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2071 0 R -/Annots [ 2067 0 R ] +/Parent 2070 0 R +/Annots [ 2066 0 R ] >> endobj -2067 0 obj << +2066 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [63.4454 707.8911 452.088 718.0529] /Subtype/Link/A<> >> endobj -2063 0 obj << -/D [2061 0 R /XYZ 56.6929 794.5015 null] +2062 0 obj << +/D [2060 0 R /XYZ 56.6929 794.5015 null] >> endobj 706 0 obj << -/D [2061 0 R /XYZ 56.6929 690.9391 null] +/D [2060 0 R /XYZ 56.6929 690.9391 null] >> endobj -2068 0 obj << -/D [2061 0 R /XYZ 56.6929 656.5891 null] +2067 0 obj << +/D [2060 0 R /XYZ 56.6929 656.5891 null] >> endobj 710 0 obj << -/D [2061 0 R /XYZ 56.6929 517.028 null] +/D [2060 0 R /XYZ 56.6929 517.028 null] >> endobj -2069 0 obj << -/D [2061 0 R /XYZ 56.6929 489.6469 null] +2068 0 obj << +/D [2060 0 R /XYZ 56.6929 489.6469 null] >> endobj 714 0 obj << -/D [2061 0 R /XYZ 56.6929 373.2709 null] +/D [2060 0 R /XYZ 56.6929 373.2709 null] >> endobj -2070 0 obj << -/D [2061 0 R /XYZ 56.6929 344.9674 null] +2069 0 obj << +/D [2060 0 R /XYZ 56.6929 344.9674 null] >> endobj 718 0 obj << -/D [2061 0 R /XYZ 56.6929 184.6919 null] +/D [2060 0 R /XYZ 56.6929 184.6919 null] >> endobj -1721 0 obj << -/D [2061 0 R /XYZ 56.6929 151.8489 null] +1719 0 obj << +/D [2060 0 R /XYZ 56.6929 151.8489 null] >> endobj -2060 0 obj << -/Font << /F37 1018 0 R /F71 2066 0 R /F22 953 0 R /F39 1151 0 R /F11 1442 0 R /F41 1208 0 R /F21 930 0 R /F53 1303 0 R /F48 1228 0 R /F62 1352 0 R /F63 1355 0 R >> -/XObject << /Im2 1341 0 R >> +2059 0 obj << +/Font << /F37 1018 0 R /F71 2065 0 R /F22 953 0 R /F39 1151 0 R /F11 1441 0 R /F41 1208 0 R /F21 930 0 R /F53 1303 0 R /F48 1228 0 R /F62 1351 0 R /F63 1354 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2074 0 obj << +2073 0 obj << /Length 846 /Filter /FlateDecode >> @@ -9959,41 +9939,41 @@ Zm7 ´¿Ì  ^’êÐZDžÔK—òK—Àî̘všør¥Ú âµÃ>èSëï_‡ÇBµ>ö±> ¤B¨à»ÄAó¯ 0p9o8w0ØÎ“Þ…1E¨/¿CÉê釞ìeÎtø¹Ç#þ ¢F/%b^°ä¿^j.ˆ^o¼«ðyÿïWüåû–æ,³Û4§9á\²KRž/ÆÄëÔŸßûçþ7rà_endstream endobj -2073 0 obj << -/Type /Page -/Contents 2074 0 R -/Resources 2072 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2071 0 R ->> endobj -2075 0 obj << -/D [2073 0 R /XYZ 85.0394 794.5015 null] ->> endobj 2072 0 obj << +/Type /Page +/Contents 2073 0 R +/Resources 2071 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2070 0 R +>> endobj +2074 0 obj << +/D [2072 0 R /XYZ 85.0394 794.5015 null] +>> endobj +2071 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2078 0 obj << +2077 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -2077 0 obj << -/Type /Page -/Contents 2078 0 R -/Resources 2076 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2071 0 R ->> endobj -2079 0 obj << -/D [2077 0 R /XYZ 56.6929 794.5015 null] ->> endobj 2076 0 obj << +/Type /Page +/Contents 2077 0 R +/Resources 2075 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2070 0 R +>> endobj +2078 0 obj << +/D [2076 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2075 0 obj << /ProcSet [ /PDF ] >> endobj -2082 0 obj << +2081 0 obj << /Length 1965 /Filter /FlateDecode >> @@ -10007,84 +9987,84 @@ i ¥Ìrcø-мûãËü “¤%œ¡i±Iæ² —â~ÚøÑŸ/¯6³Âv¡ámÒ¥ß;»è½‡CÀê/aïoãã<,EQ^Çsór4 ÝÅpµö;[ÃïVÎy7G)JΑOü©5­¿|hW°hpk·IQ„"é5¶ÏÍŽûª‡]Ù)C™‹_Ú‘Âõ%KÄQXDñ¯oʬ±]ªÜïʽe×SX{üâññ|>‡¼+¾,}w¸ÉÀdñ:Æ›š¥îãºÊǽµÿ¶Uø]5èTíŠË°ç§ð6hÿ˜ÈŸ%×"ö"Û‹ ½H.ƒH"h<H# a(Bä·îæÎ{ÿúhendstream endobj -2081 0 obj << +2080 0 obj << /Type /Page -/Contents 2082 0 R -/Resources 2080 0 R +/Contents 2081 0 R +/Resources 2079 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2071 0 R -/Annots [ 2089 0 R 2090 0 R ] +/Parent 2070 0 R +/Annots [ 2088 0 R 2089 0 R ] >> endobj -2089 0 obj << +2088 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [348.3486 128.9523 463.9152 141.0119] /Subtype/Link/A<> >> endobj -2090 0 obj << +2089 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [147.3629 116.9971 364.5484 129.0567] /Subtype/Link/A<> >> endobj -2083 0 obj << -/D [2081 0 R /XYZ 85.0394 794.5015 null] +2082 0 obj << +/D [2080 0 R /XYZ 85.0394 794.5015 null] >> endobj 722 0 obj << -/D [2081 0 R /XYZ 85.0394 769.5949 null] +/D [2080 0 R /XYZ 85.0394 769.5949 null] >> endobj -2084 0 obj << -/D [2081 0 R /XYZ 85.0394 576.7004 null] +2083 0 obj << +/D [2080 0 R /XYZ 85.0394 576.7004 null] >> endobj 726 0 obj << -/D [2081 0 R /XYZ 85.0394 576.7004 null] +/D [2080 0 R /XYZ 85.0394 576.7004 null] >> endobj -2085 0 obj << -/D [2081 0 R /XYZ 85.0394 548.3785 null] +2084 0 obj << +/D [2080 0 R /XYZ 85.0394 548.3785 null] >> endobj 730 0 obj << -/D [2081 0 R /XYZ 85.0394 548.3785 null] +/D [2080 0 R /XYZ 85.0394 548.3785 null] >> endobj -2086 0 obj << -/D [2081 0 R /XYZ 85.0394 518.5228 null] +2085 0 obj << +/D [2080 0 R /XYZ 85.0394 518.5228 null] >> endobj 734 0 obj << -/D [2081 0 R /XYZ 85.0394 460.6968 null] +/D [2080 0 R /XYZ 85.0394 460.6968 null] >> endobj -2087 0 obj << -/D [2081 0 R /XYZ 85.0394 425.0333 null] +2086 0 obj << +/D [2080 0 R /XYZ 85.0394 425.0333 null] >> endobj 738 0 obj << -/D [2081 0 R /XYZ 85.0394 260.2468 null] +/D [2080 0 R /XYZ 85.0394 260.2468 null] >> endobj -2088 0 obj << -/D [2081 0 R /XYZ 85.0394 224.698 null] +2087 0 obj << +/D [2080 0 R /XYZ 85.0394 224.698 null] >> endobj -2080 0 obj << -/Font << /F21 930 0 R /F22 953 0 R /F11 1442 0 R /F41 1208 0 R >> +2079 0 obj << +/Font << /F21 930 0 R /F22 953 0 R /F11 1441 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2093 0 obj << +2092 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -2092 0 obj << -/Type /Page -/Contents 2093 0 R -/Resources 2091 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2071 0 R ->> endobj -2094 0 obj << -/D [2092 0 R /XYZ 56.6929 794.5015 null] ->> endobj 2091 0 obj << +/Type /Page +/Contents 2092 0 R +/Resources 2090 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2070 0 R +>> endobj +2093 0 obj << +/D [2091 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2090 0 obj << /ProcSet [ /PDF ] >> endobj -2097 0 obj << +2096 0 obj << /Length 2544 /Filter /FlateDecode >> @@ -10098,39 +10078,39 @@ FXЭ D¤<ÐÎÿ—yÇ‘sU@E…ÎqÌ*Š‘×8P”Ì Ë¿/@f4áRÊ}^º¦ÖÒRº#›Úv°/×ˈÖFtÅŒ‚þ[åSr Òéú@Øèªé)ŽL½"Ÿûæ¢@ù<ñpJµÙ>~æÜpËLtGY­Fgá±[A —(-̃ÅÙ¶Ä ˜Þ°)Ëx™AaíF¼¨‚ÕáPâ¥V)§8·º>@ÌÔ4ûôÜÄP‰BÍÞ(dv P&máªëæßFD3zœ`·“¢ÂEàÛ=ÃBj{ †rh®ÔÐq½ ‘®³«zß&Å(uùJ¸8…B×ò5ø?в9Òp#ªf'Ë’•ú&_æ ùM_—¢±J6iðU£ª#E}ïãÏ^5X*‰eÃÏÖJ©>KF\¢P¯SSŒo&Œ>Ï! ·LÝ–è@±¸ˆ¤ægH@Ä9³ZI( Ž:ž()6Sq UŸiQc¢õFêÆ†EiX*×5ÔÏ]OÕ-ãÖXXE p³Í‚¥¢o¹‡šMÔºõÁùˆ4òs®øbðج–×y­P°M”`à· FAˆ½Ž¼m¥uGKÑ–‹;ÕAŸ^–,y§ž%­Þõ½1,ôUUD¼.µæ!u[È8ˆló#_÷'k®ÿ1,°Èq‘<Äa U®ßù³{”ül>Â1¥ƒÏéD}ãX/Í›·ô(òÄ-O¿õÄ7‹›.f2ïeO˜ÅËŒ¶±|ïÛþjÄJ˜±Ò¶ë–BºfÓ„È^'Dö6!2‹Šµ>¹Õª?DZ…Ú™ðì DðFÍ\¥Pà1ª~)‰ÅïšVýØ^ .-㤎Ͱ·ÁqÏGß5p’³:ñLðÊçaAêð0xšnþ5cµN¼‡£*itUV`+c!ž¡z'[´Úzå},ÿdêUi‘دšèœ7³v«êœÈu{d¤ÌcIÀýj~ÅžXfQ‹gR`sdß׳=¥±iˆ%†zߊêÁïªÂ÷UY*»bI뎺,hùAØ7{pä‘Å?õ°–ˆV¸M¯jjK€ü­? % ÊGË _¾(XàëÿšV@%Ÿ£J4ËÝh^ý]žÔ‹f6×níƒ+LÍìS2vDN?š`®…8ä9H3ð`3zø…$ÛVÂïå4ýˆÕÕHƒ®\Büu|-Fc˜¤ë\5¢œs²knTuü×tè«ÊeÁ?Mä' ÁÙX€p†h¨k.æÍâõñkMb q‘ÌB° ƒiû†sk(ß½üdÚÿÃlhßp²ÑoC;àÐn;Õ£ž»¿¨Î…?^Uè&ŠÌ(\¹'HðêÑáC5mWp}cŒ‡XÉ„?)â’éÀ9–ÜI[(‘î¾›¨Â^5ðù©‡m7ïÍlŠR͇蕽M|1x: t´yãizaÁSBïHæ >Ëíé±³Oâ"HÓȃ…×UØNÉø©|hÑçò Å™X]ÖÌ=Î÷¯»"L1œ¬ù‹Oï×WHÎÔšæÝǧá#¾û4á·óhö3¿cYŒ<ôú9¢wEYà6B=ƒ {{Üð'ƒ¿Ÿ÷ñ$¢uendstream endobj -2096 0 obj << +2095 0 obj << /Type /Page -/Contents 2097 0 R -/Resources 2095 0 R +/Contents 2096 0 R +/Resources 2094 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2071 0 R +/Parent 2070 0 R >> endobj -2098 0 obj << -/D [2096 0 R /XYZ 85.0394 794.5015 null] +2097 0 obj << +/D [2095 0 R /XYZ 85.0394 794.5015 null] >> endobj 742 0 obj << -/D [2096 0 R /XYZ 85.0394 769.5949 null] +/D [2095 0 R /XYZ 85.0394 769.5949 null] >> endobj -2099 0 obj << -/D [2096 0 R /XYZ 85.0394 573.5449 null] +2098 0 obj << +/D [2095 0 R /XYZ 85.0394 573.5449 null] >> endobj 746 0 obj << -/D [2096 0 R /XYZ 85.0394 573.5449 null] +/D [2095 0 R /XYZ 85.0394 573.5449 null] >> endobj -2100 0 obj << -/D [2096 0 R /XYZ 85.0394 539.0037 null] +2099 0 obj << +/D [2095 0 R /XYZ 85.0394 539.0037 null] >> endobj 750 0 obj << -/D [2096 0 R /XYZ 85.0394 539.0037 null] +/D [2095 0 R /XYZ 85.0394 539.0037 null] >> endobj -2101 0 obj << -/D [2096 0 R /XYZ 85.0394 510.2426 null] +2100 0 obj << +/D [2095 0 R /XYZ 85.0394 510.2426 null] >> endobj -2095 0 obj << +2094 0 obj << /Font << /F21 930 0 R /F22 953 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2104 0 obj << +2103 0 obj << /Length 2811 /Filter /FlateDecode >> @@ -10150,64 +10130,64 @@ c ]8*?\ÕÂXé[}ãú&?kÚþù+üM\O:‰p-’Ó~å‡1ÎCN("ÛÿùøÓ‰øN”±iÙE˜øô­ƒ–¿ÌìèÇþ»G·c1Üb¾{øÃƒO)Ô1T~ß!¯½<æÏGþã8:âïè[L‡uÊÓH§Ô§¿Lå]ÀĈ90&ºÒK÷ðxj7ˆ†žÄ˜-t|×âÚv ª{ô^Ù¶Ä>±t‹à-Ö‹i¦'¾}¤¥¶Ÿ4žÓÂ>©]¶£÷OtJµùï‘ÊøÙJ„b¤‡7 }Ç÷èUHÇÁ{‘ݰî8u¢º¦Nh{'RíÚ©›Íe³ÎN|Çs#'qå1WG¾Óa²2RÄ)µ·|'r"?ކ<ÇéÜ4†`“6MKÎü=B¿õ…S~–œÃíóÿüõ³ÿ ÌÉ8ö¦?lzQ7ÆÌJ <÷„uûô”÷ÿ“ð4endstream endobj -2103 0 obj << +2102 0 obj << /Type /Page -/Contents 2104 0 R -/Resources 2102 0 R +/Contents 2103 0 R +/Resources 2101 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2112 0 R -/Annots [ 2108 0 R 2109 0 R ] +/Parent 2111 0 R +/Annots [ 2107 0 R 2108 0 R ] >> endobj -2108 0 obj << +2107 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [253.7995 149.3637 417.685 161.4234] /Subtype/Link/A<> >> endobj -2109 0 obj << +2108 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [63.4454 110.455 208.8999 120.6168] /Subtype/Link/A<> >> endobj -2105 0 obj << -/D [2103 0 R /XYZ 56.6929 794.5015 null] +2104 0 obj << +/D [2102 0 R /XYZ 56.6929 794.5015 null] >> endobj 754 0 obj << -/D [2103 0 R /XYZ 56.6929 662.0717 null] +/D [2102 0 R /XYZ 56.6929 662.0717 null] >> endobj -2106 0 obj << -/D [2103 0 R /XYZ 56.6929 624.1661 null] +2105 0 obj << +/D [2102 0 R /XYZ 56.6929 624.1661 null] >> endobj 758 0 obj << -/D [2103 0 R /XYZ 56.6929 624.1661 null] +/D [2102 0 R /XYZ 56.6929 624.1661 null] >> endobj -1515 0 obj << -/D [2103 0 R /XYZ 56.6929 593.0972 null] +1514 0 obj << +/D [2102 0 R /XYZ 56.6929 593.0972 null] >> endobj 762 0 obj << -/D [2103 0 R /XYZ 56.6929 294.2701 null] +/D [2102 0 R /XYZ 56.6929 294.2701 null] >> endobj -2107 0 obj << -/D [2103 0 R /XYZ 56.6929 255.4568 null] +2106 0 obj << +/D [2102 0 R /XYZ 56.6929 255.4568 null] >> endobj 766 0 obj << -/D [2103 0 R /XYZ 56.6929 255.4568 null] +/D [2102 0 R /XYZ 56.6929 255.4568 null] >> endobj 1241 0 obj << -/D [2103 0 R /XYZ 56.6929 226.1045 null] +/D [2102 0 R /XYZ 56.6929 226.1045 null] +>> endobj +2109 0 obj << +/D [2102 0 R /XYZ 56.6929 53.5688 null] >> endobj 2110 0 obj << -/D [2103 0 R /XYZ 56.6929 53.5688 null] +/D [2102 0 R /XYZ 56.6929 53.5688 null] >> endobj -2111 0 obj << -/D [2103 0 R /XYZ 56.6929 53.5688 null] ->> endobj -2102 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F53 1303 0 R /F11 1442 0 R /F41 1208 0 R >> +2101 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F53 1303 0 R /F11 1441 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2115 0 obj << +2114 0 obj << /Length 2826 /Filter /FlateDecode >> @@ -10228,189 +10208,189 @@ Z ·‘÷AŸWÏÙ6}ÍE5#P}m kkôÓÒ9áBŸÔ6"²€ÑÛÇ×H^MÖêD2ì #FEÐ|X|Ö~ѼJyÈ«m^§DRãKá%Jæ./öY®P¯ÙÙC²7Ü…¤jñ î€j“Ûÿò—¾ÖÎaŒh’8Ó(4Ÿ”r¬_Jü LN>D6ߟ¾û#ïbendstream endobj -2114 0 obj << +2113 0 obj << /Type /Page -/Contents 2115 0 R -/Resources 2113 0 R +/Contents 2114 0 R +/Resources 2112 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2112 0 R +/Parent 2111 0 R +>> endobj +2115 0 obj << +/D [2113 0 R /XYZ 85.0394 794.5015 null] >> endobj 2116 0 obj << -/D [2114 0 R /XYZ 85.0394 794.5015 null] +/D [2113 0 R /XYZ 85.0394 752.3015 null] >> endobj 2117 0 obj << -/D [2114 0 R /XYZ 85.0394 752.3015 null] +/D [2113 0 R /XYZ 85.0394 752.3015 null] >> endobj 2118 0 obj << -/D [2114 0 R /XYZ 85.0394 752.3015 null] +/D [2113 0 R /XYZ 85.0394 752.3015 null] >> endobj 2119 0 obj << -/D [2114 0 R /XYZ 85.0394 752.3015 null] +/D [2113 0 R /XYZ 85.0394 746.3107 null] >> endobj 2120 0 obj << -/D [2114 0 R /XYZ 85.0394 746.3107 null] +/D [2113 0 R /XYZ 85.0394 731.5461 null] >> endobj 2121 0 obj << -/D [2114 0 R /XYZ 85.0394 731.5461 null] +/D [2113 0 R /XYZ 85.0394 728.1497 null] >> endobj 2122 0 obj << -/D [2114 0 R /XYZ 85.0394 728.1497 null] +/D [2113 0 R /XYZ 85.0394 713.3851 null] >> endobj 2123 0 obj << -/D [2114 0 R /XYZ 85.0394 713.3851 null] +/D [2113 0 R /XYZ 85.0394 709.9887 null] >> endobj 2124 0 obj << -/D [2114 0 R /XYZ 85.0394 709.9887 null] +/D [2113 0 R /XYZ 85.0394 651.9592 null] +>> endobj +1371 0 obj << +/D [2113 0 R /XYZ 85.0394 651.9592 null] >> endobj 2125 0 obj << -/D [2114 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1372 0 obj << -/D [2114 0 R /XYZ 85.0394 651.9592 null] +/D [2113 0 R /XYZ 85.0394 651.9592 null] >> endobj 2126 0 obj << -/D [2114 0 R /XYZ 85.0394 651.9592 null] +/D [2113 0 R /XYZ 85.0394 648.8377 null] >> endobj 2127 0 obj << -/D [2114 0 R /XYZ 85.0394 648.8377 null] +/D [2113 0 R /XYZ 85.0394 634.0731 null] >> endobj 2128 0 obj << -/D [2114 0 R /XYZ 85.0394 634.0731 null] +/D [2113 0 R /XYZ 85.0394 630.6767 null] >> endobj 2129 0 obj << -/D [2114 0 R /XYZ 85.0394 630.6767 null] +/D [2113 0 R /XYZ 85.0394 615.9121 null] >> endobj 2130 0 obj << -/D [2114 0 R /XYZ 85.0394 615.9121 null] +/D [2113 0 R /XYZ 85.0394 612.5156 null] >> endobj 2131 0 obj << -/D [2114 0 R /XYZ 85.0394 612.5156 null] +/D [2113 0 R /XYZ 85.0394 585.7959 null] >> endobj 2132 0 obj << -/D [2114 0 R /XYZ 85.0394 585.7959 null] +/D [2113 0 R /XYZ 85.0394 582.3994 null] >> endobj 2133 0 obj << -/D [2114 0 R /XYZ 85.0394 582.3994 null] +/D [2113 0 R /XYZ 85.0394 567.6349 null] >> endobj 2134 0 obj << -/D [2114 0 R /XYZ 85.0394 567.6349 null] +/D [2113 0 R /XYZ 85.0394 564.2384 null] >> endobj 2135 0 obj << -/D [2114 0 R /XYZ 85.0394 564.2384 null] +/D [2113 0 R /XYZ 85.0394 549.5337 null] >> endobj 2136 0 obj << -/D [2114 0 R /XYZ 85.0394 549.5337 null] +/D [2113 0 R /XYZ 85.0394 546.0774 null] >> endobj 2137 0 obj << -/D [2114 0 R /XYZ 85.0394 546.0774 null] +/D [2113 0 R /XYZ 85.0394 531.3128 null] >> endobj 2138 0 obj << -/D [2114 0 R /XYZ 85.0394 531.3128 null] +/D [2113 0 R /XYZ 85.0394 527.9163 null] >> endobj 2139 0 obj << -/D [2114 0 R /XYZ 85.0394 527.9163 null] +/D [2113 0 R /XYZ 85.0394 513.1518 null] >> endobj 2140 0 obj << -/D [2114 0 R /XYZ 85.0394 513.1518 null] +/D [2113 0 R /XYZ 85.0394 509.7553 null] >> endobj 2141 0 obj << -/D [2114 0 R /XYZ 85.0394 509.7553 null] +/D [2113 0 R /XYZ 85.0394 483.0356 null] >> endobj 2142 0 obj << -/D [2114 0 R /XYZ 85.0394 483.0356 null] +/D [2113 0 R /XYZ 85.0394 479.6391 null] >> endobj 2143 0 obj << -/D [2114 0 R /XYZ 85.0394 479.6391 null] +/D [2113 0 R /XYZ 85.0394 464.8745 null] >> endobj 2144 0 obj << -/D [2114 0 R /XYZ 85.0394 464.8745 null] +/D [2113 0 R /XYZ 85.0394 461.4781 null] >> endobj 2145 0 obj << -/D [2114 0 R /XYZ 85.0394 461.4781 null] +/D [2113 0 R /XYZ 85.0394 446.7135 null] >> endobj 2146 0 obj << -/D [2114 0 R /XYZ 85.0394 446.7135 null] +/D [2113 0 R /XYZ 85.0394 443.3171 null] >> endobj 2147 0 obj << -/D [2114 0 R /XYZ 85.0394 443.3171 null] +/D [2113 0 R /XYZ 85.0394 428.5525 null] >> endobj 2148 0 obj << -/D [2114 0 R /XYZ 85.0394 428.5525 null] +/D [2113 0 R /XYZ 85.0394 425.156 null] >> endobj 2149 0 obj << -/D [2114 0 R /XYZ 85.0394 425.156 null] +/D [2113 0 R /XYZ 85.0394 355.0758 null] >> endobj 2150 0 obj << -/D [2114 0 R /XYZ 85.0394 355.0758 null] +/D [2113 0 R /XYZ 85.0394 355.0758 null] >> endobj 2151 0 obj << -/D [2114 0 R /XYZ 85.0394 355.0758 null] +/D [2113 0 R /XYZ 85.0394 355.0758 null] >> endobj 2152 0 obj << -/D [2114 0 R /XYZ 85.0394 355.0758 null] +/D [2113 0 R /XYZ 85.0394 352.0499 null] >> endobj 2153 0 obj << -/D [2114 0 R /XYZ 85.0394 352.0499 null] +/D [2113 0 R /XYZ 85.0394 337.3452 null] >> endobj 2154 0 obj << -/D [2114 0 R /XYZ 85.0394 337.3452 null] +/D [2113 0 R /XYZ 85.0394 333.8889 null] >> endobj 2155 0 obj << -/D [2114 0 R /XYZ 85.0394 333.8889 null] +/D [2113 0 R /XYZ 85.0394 309.8192 null] >> endobj 2156 0 obj << -/D [2114 0 R /XYZ 85.0394 309.8192 null] +/D [2113 0 R /XYZ 85.0394 303.7727 null] >> endobj 2157 0 obj << -/D [2114 0 R /XYZ 85.0394 303.7727 null] +/D [2113 0 R /XYZ 85.0394 278.3282 null] >> endobj 2158 0 obj << -/D [2114 0 R /XYZ 85.0394 278.3282 null] +/D [2113 0 R /XYZ 85.0394 273.6565 null] >> endobj 2159 0 obj << -/D [2114 0 R /XYZ 85.0394 273.6565 null] +/D [2113 0 R /XYZ 85.0394 246.9367 null] >> endobj 2160 0 obj << -/D [2114 0 R /XYZ 85.0394 246.9367 null] +/D [2113 0 R /XYZ 85.0394 243.5403 null] >> endobj 2161 0 obj << -/D [2114 0 R /XYZ 85.0394 243.5403 null] +/D [2113 0 R /XYZ 85.0394 173.5556 null] >> endobj 2162 0 obj << -/D [2114 0 R /XYZ 85.0394 173.5556 null] +/D [2113 0 R /XYZ 85.0394 173.5556 null] >> endobj 2163 0 obj << -/D [2114 0 R /XYZ 85.0394 173.5556 null] +/D [2113 0 R /XYZ 85.0394 173.5556 null] >> endobj 2164 0 obj << -/D [2114 0 R /XYZ 85.0394 173.5556 null] +/D [2113 0 R /XYZ 85.0394 170.4341 null] >> endobj 2165 0 obj << -/D [2114 0 R /XYZ 85.0394 170.4341 null] +/D [2113 0 R /XYZ 85.0394 144.9896 null] >> endobj 2166 0 obj << -/D [2114 0 R /XYZ 85.0394 144.9896 null] +/D [2113 0 R /XYZ 85.0394 140.3179 null] >> endobj 2167 0 obj << -/D [2114 0 R /XYZ 85.0394 140.3179 null] +/D [2113 0 R /XYZ 85.0394 113.5982 null] >> endobj 2168 0 obj << -/D [2114 0 R /XYZ 85.0394 113.5982 null] +/D [2113 0 R /XYZ 85.0394 110.2017 null] >> endobj 2169 0 obj << -/D [2114 0 R /XYZ 85.0394 110.2017 null] +/D [2113 0 R /XYZ 85.0394 95.4372 null] >> endobj 2170 0 obj << -/D [2114 0 R /XYZ 85.0394 95.4372 null] +/D [2113 0 R /XYZ 85.0394 92.0407 null] >> endobj -2171 0 obj << -/D [2114 0 R /XYZ 85.0394 92.0407 null] ->> endobj -2113 0 obj << +2112 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2174 0 obj << +2173 0 obj << /Length 2889 /Filter /FlateDecode >> @@ -10430,177 +10410,177 @@ id …º#õ:ÓÊEYi(^ds›´¥«ÝÅÔOï7ÕḭD˜d™7žmôl‘‡ü€ºíÉÿ ãóa ±~ãcðÆÓÊ‚AYé´ŽbË®e•60tµû1˜Ú—YR–™> .Wçñ|¾FñZD—øw¦~TЙìkUUIw9SAèJ6î$Í«z꾅щlÍ£ü~dÃÏu1dwGÛ›VdÊJ# ‰å4i•6uµû‘™ÚËøBm¼DÁ¶Ï9„§L½Î´ç1NîC݇MyúýȺ‡ лéz~ÐÛ–±DÇÊŽ§^I§‚ö;•“~f8ö–…a4LK5eb©TÛtV]á^T¦°Žqn¨bœñ7ƒ´ºsnÔ©b‚å2^Åâêr…tÇÉÐû¼¤é“ÖÓ?±N©áv3¥†f#¥æÒè¢.lå¹x òüßµ·eYšìÕ‹Z¤uö×ÎÚyÍnð i©³xˆ¿OÛ3ùŽ>“þϯíUñÑ08¼2ڮ嗪+ñ„œ|uõ‚ïéwÿq O,endstream endobj -2173 0 obj << +2172 0 obj << /Type /Page -/Contents 2174 0 R -/Resources 2172 0 R +/Contents 2173 0 R +/Resources 2171 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2112 0 R +/Parent 2111 0 R +>> endobj +2174 0 obj << +/D [2172 0 R /XYZ 56.6929 794.5015 null] >> endobj 2175 0 obj << -/D [2173 0 R /XYZ 56.6929 794.5015 null] +/D [2172 0 R /XYZ 56.6929 748.5056 null] >> endobj 2176 0 obj << -/D [2173 0 R /XYZ 56.6929 748.5056 null] +/D [2172 0 R /XYZ 56.6929 748.5056 null] >> endobj 2177 0 obj << -/D [2173 0 R /XYZ 56.6929 748.5056 null] +/D [2172 0 R /XYZ 56.6929 748.5056 null] >> endobj 2178 0 obj << -/D [2173 0 R /XYZ 56.6929 748.5056 null] +/D [2172 0 R /XYZ 56.6929 743.7078 null] >> endobj 2179 0 obj << -/D [2173 0 R /XYZ 56.6929 743.7078 null] +/D [2172 0 R /XYZ 56.6929 719.6381 null] >> endobj 2180 0 obj << -/D [2173 0 R /XYZ 56.6929 719.6381 null] +/D [2172 0 R /XYZ 56.6929 711.8197 null] >> endobj 2181 0 obj << -/D [2173 0 R /XYZ 56.6929 711.8197 null] +/D [2172 0 R /XYZ 56.6929 697.0552 null] >> endobj 2182 0 obj << -/D [2173 0 R /XYZ 56.6929 697.0552 null] +/D [2172 0 R /XYZ 56.6929 691.8868 null] >> endobj 2183 0 obj << -/D [2173 0 R /XYZ 56.6929 691.8868 null] +/D [2172 0 R /XYZ 56.6929 665.1671 null] >> endobj 2184 0 obj << -/D [2173 0 R /XYZ 56.6929 665.1671 null] +/D [2172 0 R /XYZ 56.6929 659.9987 null] >> endobj 2185 0 obj << -/D [2173 0 R /XYZ 56.6929 659.9987 null] +/D [2172 0 R /XYZ 56.6929 635.929 null] >> endobj 2186 0 obj << -/D [2173 0 R /XYZ 56.6929 635.929 null] +/D [2172 0 R /XYZ 56.6929 628.1106 null] >> endobj 2187 0 obj << -/D [2173 0 R /XYZ 56.6929 628.1106 null] +/D [2172 0 R /XYZ 56.6929 601.3909 null] >> endobj 2188 0 obj << -/D [2173 0 R /XYZ 56.6929 601.3909 null] +/D [2172 0 R /XYZ 56.6929 596.2225 null] >> endobj 2189 0 obj << -/D [2173 0 R /XYZ 56.6929 596.2225 null] +/D [2172 0 R /XYZ 56.6929 569.5028 null] >> endobj 2190 0 obj << -/D [2173 0 R /XYZ 56.6929 569.5028 null] +/D [2172 0 R /XYZ 56.6929 564.3344 null] >> endobj 2191 0 obj << -/D [2173 0 R /XYZ 56.6929 564.3344 null] +/D [2172 0 R /XYZ 56.6929 549.6297 null] >> endobj 2192 0 obj << -/D [2173 0 R /XYZ 56.6929 549.6297 null] +/D [2172 0 R /XYZ 56.6929 544.4015 null] >> endobj 2193 0 obj << -/D [2173 0 R /XYZ 56.6929 544.4015 null] +/D [2172 0 R /XYZ 56.6929 529.6968 null] >> endobj 2194 0 obj << -/D [2173 0 R /XYZ 56.6929 529.6968 null] +/D [2172 0 R /XYZ 56.6929 524.4686 null] >> endobj 2195 0 obj << -/D [2173 0 R /XYZ 56.6929 524.4686 null] +/D [2172 0 R /XYZ 56.6929 500.3989 null] >> endobj 2196 0 obj << -/D [2173 0 R /XYZ 56.6929 500.3989 null] +/D [2172 0 R /XYZ 56.6929 492.5805 null] >> endobj 2197 0 obj << -/D [2173 0 R /XYZ 56.6929 492.5805 null] +/D [2172 0 R /XYZ 56.6929 467.136 null] >> endobj 2198 0 obj << -/D [2173 0 R /XYZ 56.6929 467.136 null] +/D [2172 0 R /XYZ 56.6929 460.6924 null] >> endobj 2199 0 obj << -/D [2173 0 R /XYZ 56.6929 460.6924 null] +/D [2172 0 R /XYZ 56.6929 436.6227 null] >> endobj 2200 0 obj << -/D [2173 0 R /XYZ 56.6929 436.6227 null] +/D [2172 0 R /XYZ 56.6929 428.8043 null] >> endobj 2201 0 obj << -/D [2173 0 R /XYZ 56.6929 428.8043 null] +/D [2172 0 R /XYZ 56.6929 414.0996 null] >> endobj 2202 0 obj << -/D [2173 0 R /XYZ 56.6929 414.0996 null] +/D [2172 0 R /XYZ 56.6929 408.8714 null] >> endobj 2203 0 obj << -/D [2173 0 R /XYZ 56.6929 408.8714 null] +/D [2172 0 R /XYZ 56.6929 382.1516 null] >> endobj 2204 0 obj << -/D [2173 0 R /XYZ 56.6929 382.1516 null] +/D [2172 0 R /XYZ 56.6929 376.9833 null] >> endobj 2205 0 obj << -/D [2173 0 R /XYZ 56.6929 376.9833 null] +/D [2172 0 R /XYZ 56.6929 350.2636 null] >> endobj 2206 0 obj << -/D [2173 0 R /XYZ 56.6929 350.2636 null] +/D [2172 0 R /XYZ 56.6929 345.0952 null] >> endobj 2207 0 obj << -/D [2173 0 R /XYZ 56.6929 345.0952 null] +/D [2172 0 R /XYZ 56.6929 321.0255 null] >> endobj 2208 0 obj << -/D [2173 0 R /XYZ 56.6929 321.0255 null] +/D [2172 0 R /XYZ 56.6929 313.2071 null] >> endobj 2209 0 obj << -/D [2173 0 R /XYZ 56.6929 313.2071 null] +/D [2172 0 R /XYZ 56.6929 298.5024 null] >> endobj 2210 0 obj << -/D [2173 0 R /XYZ 56.6929 298.5024 null] +/D [2172 0 R /XYZ 56.6929 293.2742 null] >> endobj 2211 0 obj << -/D [2173 0 R /XYZ 56.6929 293.2742 null] +/D [2172 0 R /XYZ 56.6929 267.8297 null] >> endobj 2212 0 obj << -/D [2173 0 R /XYZ 56.6929 267.8297 null] +/D [2172 0 R /XYZ 56.6929 261.3861 null] >> endobj 2213 0 obj << -/D [2173 0 R /XYZ 56.6929 261.3861 null] +/D [2172 0 R /XYZ 56.6929 199.468 null] >> endobj 2214 0 obj << -/D [2173 0 R /XYZ 56.6929 199.468 null] +/D [2172 0 R /XYZ 56.6929 199.468 null] >> endobj 2215 0 obj << -/D [2173 0 R /XYZ 56.6929 199.468 null] +/D [2172 0 R /XYZ 56.6929 199.468 null] >> endobj 2216 0 obj << -/D [2173 0 R /XYZ 56.6929 199.468 null] +/D [2172 0 R /XYZ 56.6929 191.7053 null] >> endobj 2217 0 obj << -/D [2173 0 R /XYZ 56.6929 191.7053 null] +/D [2172 0 R /XYZ 56.6929 176.9408 null] >> endobj 2218 0 obj << -/D [2173 0 R /XYZ 56.6929 176.9408 null] +/D [2172 0 R /XYZ 56.6929 171.7724 null] >> endobj 2219 0 obj << -/D [2173 0 R /XYZ 56.6929 171.7724 null] +/D [2172 0 R /XYZ 56.6929 157.0677 null] >> endobj 2220 0 obj << -/D [2173 0 R /XYZ 56.6929 157.0677 null] +/D [2172 0 R /XYZ 56.6929 151.8395 null] >> endobj 2221 0 obj << -/D [2173 0 R /XYZ 56.6929 151.8395 null] +/D [2172 0 R /XYZ 56.6929 137.1348 null] >> endobj 2222 0 obj << -/D [2173 0 R /XYZ 56.6929 137.1348 null] +/D [2172 0 R /XYZ 56.6929 131.9066 null] >> endobj 2223 0 obj << -/D [2173 0 R /XYZ 56.6929 131.9066 null] +/D [2172 0 R /XYZ 56.6929 117.2018 null] >> endobj 2224 0 obj << -/D [2173 0 R /XYZ 56.6929 117.2018 null] +/D [2172 0 R /XYZ 56.6929 111.9736 null] >> endobj 2225 0 obj << -/D [2173 0 R /XYZ 56.6929 111.9736 null] +/D [2172 0 R /XYZ 56.6929 97.2091 null] >> endobj 2226 0 obj << -/D [2173 0 R /XYZ 56.6929 97.2091 null] +/D [2172 0 R /XYZ 56.6929 92.0407 null] >> endobj -2227 0 obj << -/D [2173 0 R /XYZ 56.6929 92.0407 null] ->> endobj -2172 0 obj << +2171 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2230 0 obj << +2229 0 obj << /Length 2542 /Filter /FlateDecode >> @@ -10613,171 +10593,171 @@ D} éÿBp7¥Œ+)ƒrì Ümp>Ķn‚sF…‹±#ø4¥ w}vÓT`j¯K‚^ñÒ•‹µ±ŸïÄQ¾¯Ì‡‹è8:4‰8Œmúp€ÂŽq~ƒqq¯–p¾óE®nÒ#ü:O‹íkþáAL ƒº”ÍM);áZÊ ÜQ;¡;Â졂 ï?ŠÛrÇx§Qç#2½†«n ççÁ” #ψˆì°úµÈø¥bQ$}XK °¯ãFÔÅ XVK2nÌ[òP?½è…`¯ˆB?ê— O•ð?åìguöAq ”²NQe(QÍ+–§*€Pk}@¡‘¡>0¥f¤¤t7= ÃŒ\І ±-fd‚­[ë (9º¬ÎÕQ +u¾ºù,Ī('J¹Á§<¸ˆ½Eõ’5UÛ‰ÝJ#,8y95–àyÈìºÜ“—Šü.ë²fÅKz:ÈužÚe´Wõ‚…³+&P²äB fÙYTBšÄ;FB.ÜŽÃ!ð8…&²ä‚WUý"¾›T°—Ó~ÏY)à¼L<,à•ç­ÁJË( ì* s£ÀŠ[dž”CÉJªÓrâp'´¡æ!¶EÏ&¸Öçæt<–U3P÷ç2Ý©OV}“À c2˜÷<óNH ª¬Þ*¥/ŽU–kS»ÆýØCQ|aÔcJ94®¤ºž5pÔ±NhCãCl‹ÆMð…Ô,Û«ÉÂuZggv>èðTc›—¢œ-8¦}õØ ñ§éiÿ&ŠÒ1Ó·@ Šà…ã í„)å BIi"Hàè"ÐCl &¸Î¡®ø¡¨Ýàà¦<ÓâG' ŽÖ â={òF(H|/ˆÍéIÈô“'®ü[Î ÈLíª¯ÝƒïüÂÙ)óWy~„{¹ÿý_ýò£ Šòr,4æ0[ÄV>ýˆzQx)]˜Rv>µTÇ'uNèŽÏ3ìq>{à =}gE7½S.%«‚ó©êÏrjÇtå¬Q„Gõ1þYoÓm»›x1xé„´H!]Ò£ÈÑùp RÀN ä5ƒnŒ°­Q3+ZÄpEdôºP•:¢ þ0yCA»/ÁóêÁЯ%k”"J¼8 õ÷'IQ猣o(À±&B½JSÊA”’ÒLAnv0å‚6¨b[¸2Á—ü˯d[7 H8]œš7Pyç‰%ù‘ró“húÎçâíê›hdxóÁÏyW–Ö¼ßn'6ëzÔ©è3Rt‡:Pò;|wßµão¾)j 1ÈJGá÷æ1ÿC ‡/¡ÜÝ”rP¬¤tÝFŽFÙ mP<ĶPl‚_g…N[ŸÓ¦zæì,ÓŽörbé'’ ÿ vS¥ß_ÅŒd§‚ÁiªÍCbåB "Ý4Bv”P÷I*rôÑ.ÜŽƒ!ð8&²p²CÀixU!Š8oJþßl®aQFe82ò¡\ØïÅÂ^}וWÀ]Ö¬8qKo ØŠ"sè'‚®¸OWw[™7å…=·ºQŸ;O™ñ;O§üg>?ñ²‚ŒÚ:ÒþÿþA–1ŸŒ<Ûf.² ! VÕvG>>ºþéÖù³ÿa¤÷Éendstream endobj -2229 0 obj << +2228 0 obj << /Type /Page -/Contents 2230 0 R -/Resources 2228 0 R +/Contents 2229 0 R +/Resources 2227 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2112 0 R +/Parent 2111 0 R +>> endobj +2230 0 obj << +/D [2228 0 R /XYZ 85.0394 794.5015 null] >> endobj 2231 0 obj << -/D [2229 0 R /XYZ 85.0394 794.5015 null] +/D [2228 0 R /XYZ 85.0394 748.4854 null] >> endobj 2232 0 obj << -/D [2229 0 R /XYZ 85.0394 748.4854 null] +/D [2228 0 R /XYZ 85.0394 748.4854 null] >> endobj 2233 0 obj << -/D [2229 0 R /XYZ 85.0394 748.4854 null] +/D [2228 0 R /XYZ 85.0394 748.4854 null] >> endobj 2234 0 obj << -/D [2229 0 R /XYZ 85.0394 748.4854 null] +/D [2228 0 R /XYZ 85.0394 743.3452 null] >> endobj 2235 0 obj << -/D [2229 0 R /XYZ 85.0394 743.3452 null] +/D [2228 0 R /XYZ 85.0394 728.6405 null] >> endobj 2236 0 obj << -/D [2229 0 R /XYZ 85.0394 728.6405 null] +/D [2228 0 R /XYZ 85.0394 723.1655 null] >> endobj 2237 0 obj << -/D [2229 0 R /XYZ 85.0394 723.1655 null] +/D [2228 0 R /XYZ 85.0394 708.4607 null] >> endobj 2238 0 obj << -/D [2229 0 R /XYZ 85.0394 708.4607 null] +/D [2228 0 R /XYZ 85.0394 702.9857 null] >> endobj 2239 0 obj << -/D [2229 0 R /XYZ 85.0394 702.9857 null] +/D [2228 0 R /XYZ 85.0394 688.2211 null] >> endobj 2240 0 obj << -/D [2229 0 R /XYZ 85.0394 688.2211 null] +/D [2228 0 R /XYZ 85.0394 682.8059 null] >> endobj 2241 0 obj << -/D [2229 0 R /XYZ 85.0394 682.8059 null] +/D [2228 0 R /XYZ 85.0394 668.0414 null] >> endobj 2242 0 obj << -/D [2229 0 R /XYZ 85.0394 668.0414 null] +/D [2228 0 R /XYZ 85.0394 662.6262 null] >> endobj 2243 0 obj << -/D [2229 0 R /XYZ 85.0394 662.6262 null] +/D [2228 0 R /XYZ 85.0394 599.7666 null] >> endobj 2244 0 obj << -/D [2229 0 R /XYZ 85.0394 599.7666 null] +/D [2228 0 R /XYZ 85.0394 599.7666 null] >> endobj 2245 0 obj << -/D [2229 0 R /XYZ 85.0394 599.7666 null] +/D [2228 0 R /XYZ 85.0394 599.7666 null] >> endobj 2246 0 obj << -/D [2229 0 R /XYZ 85.0394 599.7666 null] +/D [2228 0 R /XYZ 85.0394 591.7571 null] >> endobj 2247 0 obj << -/D [2229 0 R /XYZ 85.0394 591.7571 null] +/D [2228 0 R /XYZ 85.0394 565.0374 null] >> endobj 2248 0 obj << -/D [2229 0 R /XYZ 85.0394 565.0374 null] +/D [2228 0 R /XYZ 85.0394 559.6222 null] >> endobj 2249 0 obj << -/D [2229 0 R /XYZ 85.0394 559.6222 null] +/D [2228 0 R /XYZ 85.0394 534.1777 null] >> endobj 2250 0 obj << -/D [2229 0 R /XYZ 85.0394 534.1777 null] +/D [2228 0 R /XYZ 85.0394 527.4872 null] >> endobj 2251 0 obj << -/D [2229 0 R /XYZ 85.0394 527.4872 null] +/D [2228 0 R /XYZ 85.0394 502.0427 null] >> endobj 2252 0 obj << -/D [2229 0 R /XYZ 85.0394 502.0427 null] +/D [2228 0 R /XYZ 85.0394 495.3523 null] >> endobj 2253 0 obj << -/D [2229 0 R /XYZ 85.0394 495.3523 null] +/D [2228 0 R /XYZ 85.0394 420.5376 null] >> endobj 2254 0 obj << -/D [2229 0 R /XYZ 85.0394 420.5376 null] +/D [2228 0 R /XYZ 85.0394 420.5376 null] >> endobj 2255 0 obj << -/D [2229 0 R /XYZ 85.0394 420.5376 null] +/D [2228 0 R /XYZ 85.0394 420.5376 null] >> endobj 2256 0 obj << -/D [2229 0 R /XYZ 85.0394 420.5376 null] +/D [2228 0 R /XYZ 85.0394 412.5281 null] >> endobj 2257 0 obj << -/D [2229 0 R /XYZ 85.0394 412.5281 null] +/D [2228 0 R /XYZ 85.0394 388.4584 null] >> endobj 2258 0 obj << -/D [2229 0 R /XYZ 85.0394 388.4584 null] +/D [2228 0 R /XYZ 85.0394 380.3932 null] >> endobj 2259 0 obj << -/D [2229 0 R /XYZ 85.0394 380.3932 null] +/D [2228 0 R /XYZ 85.0394 365.6884 null] >> endobj 2260 0 obj << -/D [2229 0 R /XYZ 85.0394 365.6884 null] +/D [2228 0 R /XYZ 85.0394 360.2134 null] >> endobj 2261 0 obj << -/D [2229 0 R /XYZ 85.0394 360.2134 null] +/D [2228 0 R /XYZ 85.0394 345.4488 null] >> endobj 2262 0 obj << -/D [2229 0 R /XYZ 85.0394 345.4488 null] +/D [2228 0 R /XYZ 85.0394 340.0336 null] >> endobj 2263 0 obj << -/D [2229 0 R /XYZ 85.0394 340.0336 null] +/D [2228 0 R /XYZ 85.0394 325.269 null] >> endobj 2264 0 obj << -/D [2229 0 R /XYZ 85.0394 325.269 null] +/D [2228 0 R /XYZ 85.0394 319.8539 null] >> endobj 2265 0 obj << -/D [2229 0 R /XYZ 85.0394 319.8539 null] +/D [2228 0 R /XYZ 85.0394 295.7842 null] >> endobj 2266 0 obj << -/D [2229 0 R /XYZ 85.0394 295.7842 null] +/D [2228 0 R /XYZ 85.0394 287.7189 null] >> endobj 2267 0 obj << -/D [2229 0 R /XYZ 85.0394 287.7189 null] +/D [2228 0 R /XYZ 85.0394 272.9543 null] >> endobj 2268 0 obj << -/D [2229 0 R /XYZ 85.0394 272.9543 null] +/D [2228 0 R /XYZ 85.0394 267.5392 null] >> endobj 2269 0 obj << -/D [2229 0 R /XYZ 85.0394 267.5392 null] +/D [2228 0 R /XYZ 85.0394 252.7746 null] >> endobj 2270 0 obj << -/D [2229 0 R /XYZ 85.0394 252.7746 null] +/D [2228 0 R /XYZ 85.0394 247.3594 null] >> endobj 2271 0 obj << -/D [2229 0 R /XYZ 85.0394 247.3594 null] +/D [2228 0 R /XYZ 85.0394 223.2897 null] >> endobj 2272 0 obj << -/D [2229 0 R /XYZ 85.0394 223.2897 null] +/D [2228 0 R /XYZ 85.0394 215.2245 null] >> endobj 2273 0 obj << -/D [2229 0 R /XYZ 85.0394 215.2245 null] +/D [2228 0 R /XYZ 85.0394 149.4956 null] >> endobj 2274 0 obj << -/D [2229 0 R /XYZ 85.0394 149.4956 null] +/D [2228 0 R /XYZ 85.0394 149.4956 null] >> endobj 2275 0 obj << -/D [2229 0 R /XYZ 85.0394 149.4956 null] +/D [2228 0 R /XYZ 85.0394 149.4956 null] >> endobj 2276 0 obj << -/D [2229 0 R /XYZ 85.0394 149.4956 null] +/D [2228 0 R /XYZ 85.0394 144.3554 null] >> endobj 2277 0 obj << -/D [2229 0 R /XYZ 85.0394 144.3554 null] +/D [2228 0 R /XYZ 85.0394 120.2857 null] >> endobj 2278 0 obj << -/D [2229 0 R /XYZ 85.0394 120.2857 null] +/D [2228 0 R /XYZ 85.0394 112.2205 null] >> endobj 2279 0 obj << -/D [2229 0 R /XYZ 85.0394 112.2205 null] +/D [2228 0 R /XYZ 85.0394 97.4559 null] >> endobj 2280 0 obj << -/D [2229 0 R /XYZ 85.0394 97.4559 null] +/D [2228 0 R /XYZ 85.0394 92.0407 null] >> endobj -2281 0 obj << -/D [2229 0 R /XYZ 85.0394 92.0407 null] ->> endobj -2228 0 obj << +2227 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2284 0 obj << +2283 0 obj << /Length 2928 /Filter /FlateDecode >> @@ -10793,123 +10773,123 @@ Z\s ® ,¸è«ª íEšN¡hKÂsÚZ–LµYÃÈ[Þ®©%éƒÞš§»BÖÔo²úõPá óAÖ²û9Ø(ããûÃ÷VSì¡Á ø9-]@ öné>ÃEƒ …ņzrù*!_ƒO/‰`±™€OæŠYQ<‡®HDƒÊ2_Jóú(Ì»ŸêÎr…µo”²ƒÁ á'ÿ9¬LU8U«_ê›}™® Ö²Ú5Gw[98 r³“WÚ8qáxÏ<ZL§=Ð0sÀ1ÿkt?[£ò>!"ô>j _ÝÎä^Š€W´Rå# γÂÛ+æ(ìÒC‰~†~¡³(çÜÁÿ‰àêÒÒPß»"µLË»°‹‘]MucHfµà/ƒ•?eµª89ñ+-$­ÊgÁo´‘h3@â!ËaO›õRý>ç«\Òl³”~h"‡½Õ®6's$Z=â!‘~XRK=uÑKå½P²•é \ /Mvœ@àÓ:ßÞ»‡ÃKÙè­“ZŸr¸^¾QŠ=aç"pñ_pŒŽu—ƒÿû?}¬7 Èq|â§/ \˜šE©º¬ôxéæ‚Þ¯ý¿Ô! Jendstream endobj -2283 0 obj << +2282 0 obj << /Type /Page -/Contents 2284 0 R -/Resources 2282 0 R +/Contents 2283 0 R +/Resources 2281 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2112 0 R +/Parent 2111 0 R +>> endobj +2284 0 obj << +/D [2282 0 R /XYZ 56.6929 794.5015 null] >> endobj 2285 0 obj << -/D [2283 0 R /XYZ 56.6929 794.5015 null] +/D [2282 0 R /XYZ 56.6929 749.0089 null] >> endobj 2286 0 obj << -/D [2283 0 R /XYZ 56.6929 749.0089 null] +/D [2282 0 R /XYZ 56.6929 749.0089 null] >> endobj 2287 0 obj << -/D [2283 0 R /XYZ 56.6929 749.0089 null] +/D [2282 0 R /XYZ 56.6929 749.0089 null] >> endobj 2288 0 obj << -/D [2283 0 R /XYZ 56.6929 749.0089 null] +/D [2282 0 R /XYZ 56.6929 745.2843 null] >> endobj 2289 0 obj << -/D [2283 0 R /XYZ 56.6929 745.2843 null] +/D [2282 0 R /XYZ 56.6929 721.2146 null] >> endobj 2290 0 obj << -/D [2283 0 R /XYZ 56.6929 721.2146 null] +/D [2282 0 R /XYZ 56.6929 714.4694 null] >> endobj 2291 0 obj << -/D [2283 0 R /XYZ 56.6929 714.4694 null] +/D [2282 0 R /XYZ 56.6929 699.7048 null] >> endobj 2292 0 obj << -/D [2283 0 R /XYZ 56.6929 699.7048 null] +/D [2282 0 R /XYZ 56.6929 695.6096 null] >> endobj 2293 0 obj << -/D [2283 0 R /XYZ 56.6929 695.6096 null] +/D [2282 0 R /XYZ 56.6929 680.9049 null] >> endobj 2294 0 obj << -/D [2283 0 R /XYZ 56.6929 680.9049 null] +/D [2282 0 R /XYZ 56.6929 676.7499 null] >> endobj 2295 0 obj << -/D [2283 0 R /XYZ 56.6929 676.7499 null] +/D [2282 0 R /XYZ 56.6929 652.6802 null] >> endobj 2296 0 obj << -/D [2283 0 R /XYZ 56.6929 652.6802 null] +/D [2282 0 R /XYZ 56.6929 645.935 null] >> endobj 2297 0 obj << -/D [2283 0 R /XYZ 56.6929 645.935 null] +/D [2282 0 R /XYZ 56.6929 631.2303 null] >> endobj 2298 0 obj << -/D [2283 0 R /XYZ 56.6929 631.2303 null] +/D [2282 0 R /XYZ 56.6929 627.0752 null] >> endobj 2299 0 obj << -/D [2283 0 R /XYZ 56.6929 627.0752 null] +/D [2282 0 R /XYZ 56.6929 603.0055 null] >> endobj 2300 0 obj << -/D [2283 0 R /XYZ 56.6929 603.0055 null] +/D [2282 0 R /XYZ 56.6929 596.2603 null] >> endobj 2301 0 obj << -/D [2283 0 R /XYZ 56.6929 596.2603 null] +/D [2282 0 R /XYZ 56.6929 572.1906 null] >> endobj 2302 0 obj << -/D [2283 0 R /XYZ 56.6929 572.1906 null] +/D [2282 0 R /XYZ 56.6929 565.4454 null] >> endobj 2303 0 obj << -/D [2283 0 R /XYZ 56.6929 565.4454 null] +/D [2282 0 R /XYZ 56.6929 550.7407 null] >> endobj 2304 0 obj << -/D [2283 0 R /XYZ 56.6929 550.7407 null] +/D [2282 0 R /XYZ 56.6929 546.5857 null] >> endobj 2305 0 obj << -/D [2283 0 R /XYZ 56.6929 546.5857 null] +/D [2282 0 R /XYZ 56.6929 531.8211 null] >> endobj 2306 0 obj << -/D [2283 0 R /XYZ 56.6929 531.8211 null] +/D [2282 0 R /XYZ 56.6929 527.7259 null] >> endobj 2307 0 obj << -/D [2283 0 R /XYZ 56.6929 527.7259 null] +/D [2282 0 R /XYZ 56.6929 501.0062 null] >> endobj 2308 0 obj << -/D [2283 0 R /XYZ 56.6929 501.0062 null] ->> endobj -2309 0 obj << -/D [2283 0 R /XYZ 56.6929 496.911 null] +/D [2282 0 R /XYZ 56.6929 496.911 null] >> endobj 770 0 obj << -/D [2283 0 R /XYZ 56.6929 464.7873 null] +/D [2282 0 R /XYZ 56.6929 464.7873 null] >> endobj -2310 0 obj << -/D [2283 0 R /XYZ 56.6929 439.0859 null] +2309 0 obj << +/D [2282 0 R /XYZ 56.6929 439.0859 null] >> endobj 774 0 obj << -/D [2283 0 R /XYZ 56.6929 352.4521 null] +/D [2282 0 R /XYZ 56.6929 352.4521 null] +>> endobj +2310 0 obj << +/D [2282 0 R /XYZ 56.6929 326.7507 null] >> endobj 2311 0 obj << -/D [2283 0 R /XYZ 56.6929 326.7507 null] +/D [2282 0 R /XYZ 56.6929 290.6891 null] >> endobj 2312 0 obj << -/D [2283 0 R /XYZ 56.6929 290.6891 null] +/D [2282 0 R /XYZ 56.6929 290.6891 null] >> endobj 2313 0 obj << -/D [2283 0 R /XYZ 56.6929 290.6891 null] +/D [2282 0 R /XYZ 56.6929 290.6891 null] >> endobj 2314 0 obj << -/D [2283 0 R /XYZ 56.6929 290.6891 null] ->> endobj -2315 0 obj << -/D [2283 0 R /XYZ 56.6929 290.6891 null] +/D [2282 0 R /XYZ 56.6929 290.6891 null] >> endobj 778 0 obj << -/D [2283 0 R /XYZ 56.6929 241.4457 null] +/D [2282 0 R /XYZ 56.6929 241.4457 null] >> endobj -2316 0 obj << -/D [2283 0 R /XYZ 56.6929 201.7704 null] +2315 0 obj << +/D [2282 0 R /XYZ 56.6929 201.7704 null] >> endobj -2282 0 obj << +2281 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F14 956 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2319 0 obj << +2318 0 obj << /Length 2294 /Filter /FlateDecode >> @@ -10928,45 +10908,45 @@ P# 惒ÊáNšë¥jÚZÓ‡„—8@Ääܘêån zs€{Uêq€»;9Àˆýp2ßh0á–ÂCP˜XÃg‰±ˆ€âLî€×Û Èwƒã´‚ðYÝ26iàÞ.‘ØO|)Úˆ8ñKD˜‰••@Åt"'%M_ñX¨Ù«9÷}WúL¾qŸ#ªWî³§zû>_“:ºÏs±Ó÷9K^"áÐtÀ¼¿TF¹ ‘Ë¥é:$ã˜b¯¦m‹ì›ýpG'ßNìWšèäúÍÖ’žm/zèᢋÛYìÜå´dF+ö‰™Ú¡¾™ 8¢oX/dîpг:áØ8Ò WÐBi:–Ž™ .Ó>÷7ŠCßfœÈ²‰œ#„‰¸§Ú¯ua‡H;B£x“kéƒÞqàõÁûxÁÏD‚…¶êÚ³IÙªJ¹’Ì Exêìc…±dÐż³@©ß•%±3Hqøñ….oÔ~½9»åη¨ks“ÓÛ;‚W%0þ5=ÿ}Ï ÷Âòÿ?]¾}¾‘Ž_§œòÕVx*åW1ùQž %ìoÿ{☻dèŠ(ò¦sˆ€\Sï… qÏ??º/ PG^8qöÿIì»äendstream endobj -2318 0 obj << +2317 0 obj << /Type /Page -/Contents 2319 0 R -/Resources 2317 0 R +/Contents 2318 0 R +/Resources 2316 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2112 0 R +/Parent 2111 0 R >> endobj -2320 0 obj << -/D [2318 0 R /XYZ 85.0394 794.5015 null] +2319 0 obj << +/D [2317 0 R /XYZ 85.0394 794.5015 null] >> endobj 782 0 obj << -/D [2318 0 R /XYZ 85.0394 662.3711 null] +/D [2317 0 R /XYZ 85.0394 662.3711 null] >> endobj -2321 0 obj << -/D [2318 0 R /XYZ 85.0394 634.4781 null] +2320 0 obj << +/D [2317 0 R /XYZ 85.0394 634.4781 null] >> endobj 786 0 obj << -/D [2318 0 R /XYZ 85.0394 566.8617 null] +/D [2317 0 R /XYZ 85.0394 566.8617 null] >> endobj -2322 0 obj << -/D [2318 0 R /XYZ 85.0394 536.3186 null] +2321 0 obj << +/D [2317 0 R /XYZ 85.0394 536.3186 null] >> endobj 790 0 obj << -/D [2318 0 R /XYZ 85.0394 411.7882 null] +/D [2317 0 R /XYZ 85.0394 411.7882 null] >> endobj -2323 0 obj << -/D [2318 0 R /XYZ 85.0394 386.7645 null] +2322 0 obj << +/D [2317 0 R /XYZ 85.0394 386.7645 null] >> endobj 794 0 obj << -/D [2318 0 R /XYZ 85.0394 230.2565 null] +/D [2317 0 R /XYZ 85.0394 230.2565 null] >> endobj -2324 0 obj << -/D [2318 0 R /XYZ 85.0394 203.9874 null] +2323 0 obj << +/D [2317 0 R /XYZ 85.0394 203.9874 null] >> endobj -2317 0 obj << +2316 0 obj << /Font << /F37 1018 0 R /F14 956 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2327 0 obj << +2326 0 obj << /Length 2527 /Filter /FlateDecode >> @@ -10985,47 +10965,47 @@ A! zBΪ H¨ã4¾»(%(à nÀKtÓ‡•Ô¾pÉ õH©lž{/.د{, e0ì>Ùr${ÑÁãÍðÍtÜŠzéÙüDñùîÏ¡9rP#nßÔ“±ÏOè(µ”GµMo£g~ÿÑèþ¾–Ž¥4úøôyyyI´î KyÅK¶˜¦C7c§±¯ë)ÆãØ£‘8hyøíÎ,|¦ïO ðOcŸõ;²2ˆm–h CnÚwš‡i3ÁE HèówUfÿ4ûðU‚ð`¡É×%Ý(í6O!•î‰%[VÏ¥!Ø£Ò``Û.X»+ÛÚÐÝUù‡ž×]DÎïa38îÈË­-Õ6oé+ª&i6‰ ‰yÊÄ_ì E\áê⃣òþR5âѼ«ÃÿïÄŽ/—T•Ñ¥^A†Ð±Ä06B¡„ Î#©ùéì\öÿ=- endstream endobj -2326 0 obj << +2325 0 obj << /Type /Page -/Contents 2327 0 R -/Resources 2325 0 R +/Contents 2326 0 R +/Resources 2324 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2333 0 R -/Annots [ 2330 0 R ] +/Parent 2332 0 R +/Annots [ 2329 0 R ] >> endobj -2330 0 obj << +2329 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [344.9397 501.3201 406.1397 512.7122] /Subtype /Link /A << /S /GoTo /D (trusted-keys) >> >> endobj -2328 0 obj << -/D [2326 0 R /XYZ 56.6929 794.5015 null] +2327 0 obj << +/D [2325 0 R /XYZ 56.6929 794.5015 null] >> endobj 798 0 obj << -/D [2326 0 R /XYZ 56.6929 609.3932 null] +/D [2325 0 R /XYZ 56.6929 609.3932 null] >> endobj -2329 0 obj << -/D [2326 0 R /XYZ 56.6929 583.208 null] +2328 0 obj << +/D [2325 0 R /XYZ 56.6929 583.208 null] >> endobj 802 0 obj << -/D [2326 0 R /XYZ 56.6929 484.1849 null] +/D [2325 0 R /XYZ 56.6929 484.1849 null] >> endobj -2331 0 obj << -/D [2326 0 R /XYZ 56.6929 454.463 null] +2330 0 obj << +/D [2325 0 R /XYZ 56.6929 454.463 null] >> endobj 806 0 obj << -/D [2326 0 R /XYZ 56.6929 405.4622 null] +/D [2325 0 R /XYZ 56.6929 405.4622 null] >> endobj -2332 0 obj << -/D [2326 0 R /XYZ 56.6929 378.8348 null] +2331 0 obj << +/D [2325 0 R /XYZ 56.6929 378.8348 null] >> endobj -2325 0 obj << +2324 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F14 956 0 R /F22 953 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2336 0 obj << +2335 0 obj << /Length 2458 /Filter /FlateDecode >> @@ -11036,39 +11016,39 @@ x ¤px—í¾¾ã bzéQ×Nñˆk¡!µíïÛŒbÓeÑùbq¥‘Gåþ`…¸Þ=·,M‰N(vßEq?rº˜$FŠÔËOÓ)Ð}&¶}Á¦yȪƒjУìéµm ›p¨{:]ÞÜR³¡Ê‘žJ¢)tƒ½ØV;ˆ°‡W,ÖÐBj{]ñ^­ ‡J%ù1.0”ÚÏz©˜ŽÒ.ži{°ƒû÷R#âr+ˆT‰Šü¿Ñ.N9<9fêÔS©ã×´C…ïsM{bMa> endobj -2337 0 obj << -/D [2335 0 R /XYZ 85.0394 794.5015 null] +2336 0 obj << +/D [2334 0 R /XYZ 85.0394 794.5015 null] >> endobj 810 0 obj << -/D [2335 0 R /XYZ 85.0394 650.8348 null] +/D [2334 0 R /XYZ 85.0394 650.8348 null] >> endobj -2338 0 obj << -/D [2335 0 R /XYZ 85.0394 625.7398 null] +2337 0 obj << +/D [2334 0 R /XYZ 85.0394 625.7398 null] >> endobj 814 0 obj << -/D [2335 0 R /XYZ 85.0394 378.0874 null] +/D [2334 0 R /XYZ 85.0394 378.0874 null] >> endobj -2339 0 obj << -/D [2335 0 R /XYZ 85.0394 350.2627 null] +2338 0 obj << +/D [2334 0 R /XYZ 85.0394 350.2627 null] >> endobj 818 0 obj << -/D [2335 0 R /XYZ 85.0394 153.7325 null] +/D [2334 0 R /XYZ 85.0394 153.7325 null] >> endobj -2340 0 obj << -/D [2335 0 R /XYZ 85.0394 128.6375 null] +2339 0 obj << +/D [2334 0 R /XYZ 85.0394 128.6375 null] >> endobj -2334 0 obj << +2333 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2343 0 obj << +2342 0 obj << /Length 2393 /Filter /FlateDecode >> @@ -11081,28 +11061,28 @@ j[ ÔGÏ^¬×›zí¿éú¨ ™"ù<–&qp‰¬¡që?ÖÉW4`Vö·!ŒîÇÊé@5NßfyipY:µLübßý¾pÀÀ3#××ÿ¾`íG˜2Vœþ@rÅ»ÕÎ —„oÍ98ŒÍ již–î•.¡UÔèj”ëй^ÖQ›ENj¾×¡ËÚB-3s½h˜£üG®ù…ßQ‹GC.ý9òÃtRr.Îçwùù9”ªúG ½ÿ«dZgNÂ_/øAËIrǦ>Òó×/_¾°V«ÕKøÇ\ÿé˜Ø¸Á«ûºf{{¦ ã¬âô¼zKÏ z+™Hs_ ÿæ7¾a­®sìÇáê ç}H!Žê┆":Nc …_u=¢]åyÌ¢ùÏ¢”úü)£~ƒ ɇ–õç2˜’JªÈ–ÍÿÚ˜Ùÿט¯Žæò5Ø⣫ßý›çʰõ’«ÀefeÚi…62?Ì}ýÏ£ÚÿÊy}nendstream endobj -2342 0 obj << +2341 0 obj << /Type /Page -/Contents 2343 0 R -/Resources 2341 0 R +/Contents 2342 0 R +/Resources 2340 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2333 0 R +/Parent 2332 0 R >> endobj -2344 0 obj << -/D [2342 0 R /XYZ 56.6929 794.5015 null] +2343 0 obj << +/D [2341 0 R /XYZ 56.6929 794.5015 null] >> endobj 822 0 obj << -/D [2342 0 R /XYZ 56.6929 740.3318 null] +/D [2341 0 R /XYZ 56.6929 740.3318 null] >> endobj -2345 0 obj << -/D [2342 0 R /XYZ 56.6929 714.7319 null] +2344 0 obj << +/D [2341 0 R /XYZ 56.6929 714.7319 null] >> endobj -2341 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F14 956 0 R /F62 1352 0 R /F41 1208 0 R >> -/XObject << /Im2 1341 0 R >> +2340 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F14 956 0 R /F62 1351 0 R /F41 1208 0 R >> +/XObject << /Im2 1340 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2348 0 obj << +2347 0 obj << /Length 1890 /Filter /FlateDecode >> @@ -11117,53 +11097,53 @@ xÚ­ ®UZÒÒi=!ïà üíèëÇLï{$àe0%5;Tµi§St–ðźó?Bj#aÆÁ~dÖî­É%É=ËxA÷~ÊÎ5TüÒÄúq_¦µ½òw&ÙÞœ¸Ø?]œ<LxÙ· òÜ{xÕ<ÒÍ46:„Áw¿_DeLD’<3k *¡1*æ…2&d\Š>¼žËþ/+bHÐendstream endobj -2347 0 obj << +2346 0 obj << /Type /Page -/Contents 2348 0 R -/Resources 2346 0 R +/Contents 2347 0 R +/Resources 2345 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2333 0 R +/Parent 2332 0 R >> endobj -2349 0 obj << -/D [2347 0 R /XYZ 85.0394 794.5015 null] +2348 0 obj << +/D [2346 0 R /XYZ 85.0394 794.5015 null] >> endobj 826 0 obj << -/D [2347 0 R /XYZ 85.0394 741.6375 null] +/D [2346 0 R /XYZ 85.0394 741.6375 null] >> endobj -2350 0 obj << -/D [2347 0 R /XYZ 85.0394 716.9352 null] +2349 0 obj << +/D [2346 0 R /XYZ 85.0394 716.9352 null] >> endobj 830 0 obj << -/D [2347 0 R /XYZ 85.0394 420.5643 null] +/D [2346 0 R /XYZ 85.0394 420.5643 null] >> endobj -2351 0 obj << -/D [2347 0 R /XYZ 85.0394 393.2598 null] +2350 0 obj << +/D [2346 0 R /XYZ 85.0394 393.2598 null] >> endobj -2346 0 obj << +2345 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2354 0 obj << +2353 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -2353 0 obj << -/Type /Page -/Contents 2354 0 R -/Resources 2352 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2333 0 R ->> endobj -2355 0 obj << -/D [2353 0 R /XYZ 56.6929 794.5015 null] ->> endobj 2352 0 obj << +/Type /Page +/Contents 2353 0 R +/Resources 2351 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2332 0 R +>> endobj +2354 0 obj << +/D [2352 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2351 0 obj << /ProcSet [ /PDF ] >> endobj -2358 0 obj << +2357 0 obj << /Length 1945 /Filter /FlateDecode >> @@ -11181,42 +11161,42 @@ c iô¦?ÿûãçOþóšÞn1˜)f3+NAÍï7QUÊñ§êgCí r õ(G§ÀM¡É\3-äY=òaoø‰ëà¤m!.cÖAs/ç˜S¤à¬“içÞ7˜P²nïèK]- Þ}¤/ýÞà[fÌ)Qˆéªhij;Œú«p}ÓXåž\E4z%d˜^§ÙüCIMÒ©s gLü¬o“e±ÄÇùèz“ÀtöJ ­à¹ç@^ÌUìn“Å¥ª(Õ¨*†rHq (-¯ÇòKü]À¯‡ÑdæP½ª—ëµÈ!i˜A²%‹á3œ{":R‡GŒÑúAŠ&í òéãö.&Xzhè¡ §g=42¾ûùÁC#j*u[ø a;xs»icŸì½‡ÁKØù;üø> endobj -2359 0 obj << -/D [2357 0 R /XYZ 85.0394 794.5015 null] +2358 0 obj << +/D [2356 0 R /XYZ 85.0394 794.5015 null] >> endobj 834 0 obj << -/D [2357 0 R /XYZ 85.0394 769.5949 null] +/D [2356 0 R /XYZ 85.0394 769.5949 null] >> endobj -2360 0 obj << -/D [2357 0 R /XYZ 85.0394 573.0107 null] +2359 0 obj << +/D [2356 0 R /XYZ 85.0394 573.0107 null] >> endobj 838 0 obj << -/D [2357 0 R /XYZ 85.0394 573.0107 null] +/D [2356 0 R /XYZ 85.0394 573.0107 null] +>> endobj +2360 0 obj << +/D [2356 0 R /XYZ 85.0394 538.4209 null] >> endobj 2361 0 obj << -/D [2357 0 R /XYZ 85.0394 538.4209 null] +/D [2356 0 R /XYZ 85.0394 504.6118 null] >> endobj 2362 0 obj << -/D [2357 0 R /XYZ 85.0394 504.6118 null] +/D [2356 0 R /XYZ 85.0394 432.7569 null] >> endobj 2363 0 obj << -/D [2357 0 R /XYZ 85.0394 432.7569 null] +/D [2356 0 R /XYZ 85.0394 303.3232 null] >> endobj -2364 0 obj << -/D [2357 0 R /XYZ 85.0394 303.3232 null] ->> endobj -2356 0 obj << +2355 0 obj << /Font << /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2367 0 obj << +2366 0 obj << /Length 3825 /Filter /FlateDecode >> @@ -11238,27 +11218,27 @@ b "BV˜ñI§ë†¾xÀfHÏqàÛw/çï^%cÁ8`–Y(bOud)ú O¨&y¢álD ×Tˆc÷Âà)†Ì‰HÉ´ õ0QÉÓÁù âþ“I‘r5Æ|Äï4K‹0ANEÞóTS_Q-ëÁ'ï Ñþ´ôŸõnx’»¢ÂK2œvE”'0« ‚ÕrœÀ4d‹VM}­°¢Æ¾ÌáK‰ÿù{éã×àÚDÊÚ‰o|b‰amfÊ¡Ÿ~ËÄ_VŸòþ_dúÈnendstream endobj -2366 0 obj << +2365 0 obj << /Type /Page -/Contents 2367 0 R -/Resources 2365 0 R +/Contents 2366 0 R +/Resources 2364 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2371 0 R +/Parent 2370 0 R +>> endobj +2367 0 obj << +/D [2365 0 R /XYZ 56.6929 794.5015 null] >> endobj 2368 0 obj << -/D [2366 0 R /XYZ 56.6929 794.5015 null] +/D [2365 0 R /XYZ 56.6929 752.1413 null] >> endobj 2369 0 obj << -/D [2366 0 R /XYZ 56.6929 752.1413 null] +/D [2365 0 R /XYZ 56.6929 501.191 null] >> endobj -2370 0 obj << -/D [2366 0 R /XYZ 56.6929 501.191 null] ->> endobj -2365 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F53 1303 0 R /F11 1442 0 R >> +2364 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F53 1303 0 R /F11 1441 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2374 0 obj << +2373 0 obj << /Length 3111 /Filter /FlateDecode >> @@ -11278,24 +11258,24 @@ X&dÜ‘Lr ¾U¯ycGôsd*ö6Åe%ÎK“ƒ÷¦€}žb|©iŠqRŽb–ç)æ¬òŽbN´SLO½¡ؘœªevM3Ƀ%ò6>ÜÐ/RÌr],Ÿik@ͪlðD¸â?2€Ã2X0aÒ¥Ç2 ŸX›ú,fa×Ë=äãPõVæšôqóùîîã‡Þr»býØK,ébh p2£·RKOhV¨ÃÁfòÞöœÖîÚv¨vüÖÖ×{C¸Sù:¿ñÞ2¿\ßÝÙ;ò¢ò^F]Þîdû\5éVˆõ*|ãY¥“™v*Ët7½-,ö‰[!wÉ$æŒV'3T;øã Û/‰}½ÿO‹_þOµ'—8À¿Ä™›pñ?ÿÁW÷çlþõM6ñb€¥´´F¡›¤RCÓÝŸ†ÚþoÒë¯>endstream endobj -2373 0 obj << +2372 0 obj << /Type /Page -/Contents 2374 0 R -/Resources 2372 0 R +/Contents 2373 0 R +/Resources 2371 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2371 0 R +/Parent 2370 0 R +>> endobj +2374 0 obj << +/D [2372 0 R /XYZ 85.0394 794.5015 null] >> endobj 2375 0 obj << -/D [2373 0 R /XYZ 85.0394 794.5015 null] +/D [2372 0 R /XYZ 85.0394 679.319 null] >> endobj -2376 0 obj << -/D [2373 0 R /XYZ 85.0394 679.319 null] ->> endobj -2372 0 obj << +2371 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F48 1228 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2379 0 obj << +2378 0 obj << /Length 2837 /Filter /FlateDecode >> @@ -11315,21 +11295,21 @@ arF gÚGXûkŸÌÛGSQ¤Í'цÑpAR$.ĺ€hÝdŽh´XÓ¬Îm±Ïæ¦|—æBÆŸ¤1®lÛ7²´M%Ï<Þ|Eˆ–ëUêŒ\¸x ©6Tä¨ÌÕa}¹]©Ò6Ùº*mÆu¹J‹Ø‚†4~\ÞW ÊòNŸ5»¹ÚFi.Û+ÒnéJ\%ã™;¸¿]84È¡>ñ·¡à][õq"!ÈLV lOnñ÷o[+¬¹ÖórZÒaA`PÈ`»É²à°—r§¢.a5þdv÷6b{†^;”Ù#„1ëÅghA¹:®5H«Ø§ÜÎí[‚ë@†º†Z\¨n\H•!Õj•½ð®e?‡íèÙ[œמ²^ñí·…®»éR  c¯Ûô ¨ÓÑuö©U ÏïoLÃÝEdþÜÆôÍC8M Œù&Ò ÂsKP·ý Ëj"Ÿ>ø‹à˜ªÿF°\—-¸lÖs~‘¯»«íÅlͼ¾ƒK¿øºx)¿ŸË&.Ï~Jsp5Ýp-Y¥†;¸ºjÛmÂÍTçÖŸéËì€^Åt–¥$¶ËÑÆ_,‘ôI:6½ÅvÄó”ï2œCÆÍÔpàQ£Ð6g(Ø£Y5;ó´›)sf‚-¦¡1b: ö˜6}K˜†:4cÅ&¶HVÌ  éVìÍ)OHjŽ}>«CŸ¦þ¶tê ž€Òœ4>¦5qféø™«ÿß8Oð˜th«:9Ýü×í¾9WÓÃE}ç þýjåwÀWý[nhçœëÿþSÞø—C–AÆÌÉ2žHÆSøX8¡”& Ï¥„BÚËþ'ƒþ‡endstream endobj -2378 0 obj << -/Type /Page -/Contents 2379 0 R -/Resources 2377 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2371 0 R ->> endobj -2380 0 obj << -/D [2378 0 R /XYZ 56.6929 794.5015 null] ->> endobj 2377 0 obj << +/Type /Page +/Contents 2378 0 R +/Resources 2376 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2370 0 R +>> endobj +2379 0 obj << +/D [2377 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2376 0 obj << /Font << /F37 1018 0 R /F48 1228 0 R /F22 953 0 R /F21 930 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2383 0 obj << +2382 0 obj << /Length 3255 /Filter /FlateDecode >> @@ -11348,24 +11328,24 @@ b ¹9%:–G˜ý{£XëÓfœ0moµÿÆüŒóþ”­–‚Éç¿„1šr+¥Ïc¬Ouc*` ¯uO&ÍgY’æïɤyÀû¶Z–Ýʇ•Õq‰ÔÜ{»ó…Þ^÷SHjûô4¯B…÷PŸÈ&ãP㠌ր- оzÎñÛâÿû/ï1½¿ýôþÆÎòכϷ7wÆŒ"xyÁir¸ñf^¿¹ý€‹4Jí@±Ý•ææ7sQ³0—@c§…[+£/Ößhê½VÓívÁ6–Scëþv'€‹)…îJ'nHaT ¨ì õ0€ÕM[î:²ÕSla~Q8¡1pÞ¡TS~”-šõñ˜Û2D,¼|F"3>}ßSÀsì]ê|êê” ’&©ß›EÖbT‚,0¸¤®»õ¥À„oÒêâdn~·$íÆ‹q(ì Ž/3'ý"?H_æ 0j- Ž›ÀÅÌøT9JóƒËÃnU$F‡?0] +Ïš¯]ØcDmŽJm½‹ G0á¡pîïò µ„ gæÊ–šÇw ‰$2öA‘å3qJ¬ýFÛ‚ÂCç~¹l¬ºß4a8sò ‰Åª3É"ga9æ•9w[̹b=Ž4Ï &Øö*o–ûbá®ç4ŸNÅQ²š-êÇnÃ4‹íïVLFŽ=sîïOŸ{Ì嬨hZ#óQ+Ò†³Á׿l°q8¿Ãƒ˜·[fÆÚ~¾p}Œ%s÷q·sߘ1¼Y9u½Ú¿ÎzÞåGY–YsŒ³ºi…ûUg8›MÝ•«aÄ–y¨÷oПœËêC&NðGcN#†÷ÿ6íðË;‘Ž÷ù“Þt’pžR/n)åòXt‰WƒñËþ?QªÆÃendstream endobj -2382 0 obj << +2381 0 obj << /Type /Page -/Contents 2383 0 R -/Resources 2381 0 R +/Contents 2382 0 R +/Resources 2380 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2371 0 R +/Parent 2370 0 R +>> endobj +2383 0 obj << +/D [2381 0 R /XYZ 85.0394 794.5015 null] >> endobj 2384 0 obj << -/D [2382 0 R /XYZ 85.0394 794.5015 null] +/D [2381 0 R /XYZ 85.0394 147.4749 null] >> endobj -2385 0 obj << -/D [2382 0 R /XYZ 85.0394 147.4749 null] ->> endobj -2381 0 obj << +2380 0 obj << /Font << /F37 1018 0 R /F48 1228 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R /F21 930 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2388 0 obj << +2387 0 obj << /Length 2054 /Filter /FlateDecode >> @@ -11380,45 +11360,45 @@ q $&;Ä¢n[“¿™í“©wí lÇv4bº7Þç«÷‚«p¨/HXö|ÃÖ•€ :M÷ŽxþåÃôí“AÜyœ³÷³Ý‰ƒØGw 뚆 {W:vGëUÔLé¨7?D€Gs&O!&àþ„¦õUp¿Q©¶7ˆÅÇ®UQ$’Þ1´ùW)c]øÎÂ÷ÿ8^weUvÛŸˆŒmÝ,[È’Wà»Æ D[œ@o¼¿t0eˆ%jø‹…€ÜÜ‘pˆ4ýßÇôrH¼lÞ³÷EU¯Ú»Íóƒ'åC-§ÂËö%Õþð¼Ÿ0 Ž–©x3 P…,‰B…uÑtGåÅékŸß¸^<šÁ‹cĤÔâµÄîM‰ø_gHCwr®_Ëûç›ò6YÙ•§zyt5KÁÑë¶è~¼Øe_¡Y•= í¢™Ž“+è~¹u0–F-Áñp:üA9©¼OŽÿû?èËo^­n"‡qÊ8dðqä•ÂC ¨îÿ˜êþŽâšendstream endobj -2387 0 obj << +2386 0 obj << /Type /Page -/Contents 2388 0 R -/Resources 2386 0 R +/Contents 2387 0 R +/Resources 2385 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2371 0 R +/Parent 2370 0 R +>> endobj +2388 0 obj << +/D [2386 0 R /XYZ 56.6929 794.5015 null] >> endobj 2389 0 obj << -/D [2387 0 R /XYZ 56.6929 794.5015 null] +/D [2386 0 R /XYZ 56.6929 562.0317 null] >> endobj 2390 0 obj << -/D [2387 0 R /XYZ 56.6929 562.0317 null] +/D [2386 0 R /XYZ 56.6929 444.3852 null] >> endobj 2391 0 obj << -/D [2387 0 R /XYZ 56.6929 444.3852 null] +/D [2386 0 R /XYZ 56.6929 354.5963 null] >> endobj 2392 0 obj << -/D [2387 0 R /XYZ 56.6929 354.5963 null] ->> endobj -2393 0 obj << -/D [2387 0 R /XYZ 56.6929 284.7704 null] +/D [2386 0 R /XYZ 56.6929 284.7704 null] >> endobj 842 0 obj << -/D [2387 0 R /XYZ 56.6929 241.0985 null] +/D [2386 0 R /XYZ 56.6929 241.0985 null] +>> endobj +2393 0 obj << +/D [2386 0 R /XYZ 56.6929 206.0104 null] >> endobj 2394 0 obj << -/D [2387 0 R /XYZ 56.6929 206.0104 null] +/D [2386 0 R /XYZ 56.6929 168.371 null] >> endobj 2395 0 obj << -/D [2387 0 R /XYZ 56.6929 168.371 null] +/D [2386 0 R /XYZ 56.6929 95.6233 null] >> endobj -2396 0 obj << -/D [2387 0 R /XYZ 56.6929 95.6233 null] ->> endobj -2386 0 obj << +2385 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F53 1303 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2399 0 obj << +2398 0 obj << /Length 4190 /Filter /FlateDecode >> @@ -11446,24 +11426,24 @@ Dr ¾NQü­ñ—ÿ(·‡-_às¤þ*o‡Q¶ýô`“«¶»€qâ§ÏÍôÔDømÂ_þ™D÷+Ø­ê~1¨êŠ8‚pFz¢ÃR›1éáÇ´ÿ2à Éendstream endobj -2398 0 obj << +2397 0 obj << /Type /Page -/Contents 2399 0 R -/Resources 2397 0 R +/Contents 2398 0 R +/Resources 2396 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2371 0 R +/Parent 2370 0 R +>> endobj +2399 0 obj << +/D [2397 0 R /XYZ 85.0394 794.5015 null] >> endobj 2400 0 obj << -/D [2398 0 R /XYZ 85.0394 794.5015 null] +/D [2397 0 R /XYZ 85.0394 751.6872 null] >> endobj -2401 0 obj << -/D [2398 0 R /XYZ 85.0394 751.6872 null] ->> endobj -2397 0 obj << +2396 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2404 0 obj << +2403 0 obj << /Length 2028 /Filter /FlateDecode >> @@ -11481,48 +11461,48 @@ xÚµ ='ùIœrë¬É! ê¼áø55D$¤m¥=œZÞO–UYœéêLlmû®s… ÆB2,˜?±_Ù€±ï6~¼×vžV[¸pëjúÊÖÃ’î‘6›¤EÉŠZuÖ@E¯½hCÝUÏÐKâ.¹þå×îóþ"&uû ¡8F°¶B)MA¢» û.~)ûˆ/ãendstream endobj -2403 0 obj << +2402 0 obj << /Type /Page -/Contents 2404 0 R -/Resources 2402 0 R +/Contents 2403 0 R +/Resources 2401 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2414 0 R +/Parent 2413 0 R +>> endobj +2404 0 obj << +/D [2402 0 R /XYZ 56.6929 794.5015 null] >> endobj 2405 0 obj << -/D [2403 0 R /XYZ 56.6929 794.5015 null] +/D [2402 0 R /XYZ 56.6929 684.0716 null] >> endobj 2406 0 obj << -/D [2403 0 R /XYZ 56.6929 684.0716 null] +/D [2402 0 R /XYZ 56.6929 572.8605 null] >> endobj 2407 0 obj << -/D [2403 0 R /XYZ 56.6929 572.8605 null] ->> endobj -2408 0 obj << -/D [2403 0 R /XYZ 56.6929 509.4701 null] +/D [2402 0 R /XYZ 56.6929 509.4701 null] >> endobj 846 0 obj << -/D [2403 0 R /XYZ 56.6929 470.2699 null] +/D [2402 0 R /XYZ 56.6929 470.2699 null] +>> endobj +2408 0 obj << +/D [2402 0 R /XYZ 56.6929 433.5878 null] >> endobj 2409 0 obj << -/D [2403 0 R /XYZ 56.6929 433.5878 null] +/D [2402 0 R /XYZ 56.6929 401.47 null] >> endobj 2410 0 obj << -/D [2403 0 R /XYZ 56.6929 401.47 null] +/D [2402 0 R /XYZ 56.6929 335.1577 null] >> endobj 2411 0 obj << -/D [2403 0 R /XYZ 56.6929 335.1577 null] +/D [2402 0 R /XYZ 56.6929 244.1508 null] >> endobj 2412 0 obj << -/D [2403 0 R /XYZ 56.6929 244.1508 null] +/D [2402 0 R /XYZ 56.6929 168.8052 null] >> endobj -2413 0 obj << -/D [2403 0 R /XYZ 56.6929 168.8052 null] ->> endobj -2402 0 obj << +2401 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F39 1151 0 R /F53 1303 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2417 0 obj << +2416 0 obj << /Length 2162 /Filter /FlateDecode >> @@ -11532,36 +11512,36 @@ ycum ipsïö¬Ô*×N§&`¢9°Ã<•HPZ1Cg­üáA•™r ™Kã5»ô#Ý…Ølƒ)"<æ}ªÔþ€€}JÙ}a`©9xã—ljǺùIësz£äE2s¡ëpøJ·Ñ•z™Ì­”!s} C=yx\¥QÙõs ]D¢¾Ê‹A/øÞßÄ7:¬®ê60õÍCWdÐð%ä$ˆ)#k¥F õSx‘aÒǶl‹v¶ØÚPÉÔ:Ýïœ_éÐAvr¼t=âï#ÿCàZÓW¼Õ‘:â-/e¼õ8æ-‚(¾¡*Ô£*½¡P@×}Y+5­ï-‚Bõ¡-U3ôR¦nwww¶©A†\ÎÖ÷ —W×p ÅD_!©€æ0²wÃÅ/ɧ/—‹‘$'Ð|#"¨¼ÑùÑ4$¸Ýå…Ƀ¡ÇA‚åO <#»j;â’h§¿6«ú[{d¯Ñ†æ3_U.Ô_鿢uUmÐ;èpÞ…ŠðPtŽeï/ž{‘}’i±œª(ª'g3¸T›™/HPÙbƇ ßóðE‚ç1#7î³úìür±<Æiѱ%=ÎPw[ ©½-ê(þù]ij?ÌnŸí³é|nÐf”ɦ+Û_ŒµXztæóþE ÿл4Mßåúßh¨Â1kãÂdÌ®rÈ´…EkŽ0%²SSH¤¢§ß²Ÿ©FÈþåo ésâ“Ú¢‘ÿ='u ÊÝ’|¿t늀‹Ø t5‘¶n~§q‚Vòaé÷ÅHç''ØÍ<¸“yúW|Žø¾ûóKÃÞ¥n¶:¶À•…ì?Œym,ƒ†ûCyR€U÷Þîï lc½_Ãê1Šà£^}H¦$Œƒo‹Dçý›×c)mñÔÖÚß•yXšù£êµi¿‡!ë9µò¬ve¦ßº •Û"v—=½åuS£7¤Šåba?I.—Ÿ_/ƒãüÕL Ì¿Ô¹B74×f_÷H§«õœŸ_êMpÛG’mò1dCîj­ì•¨\¹àÿ”–;ˆø´«‹‘@LDaËÖC IÈNÀ^e@¸§f‚ýííôÍèÕíÐÈv•¤·ÍR”!AXØ/ŒãxÌ0 ùqþ{™-’¯7?}¾~öçe£¶¥OKËg¸”o\úP•uµmòÝæ¥¿‚@ ë?]Œ´‰¸Eøÿ…dÿÇ &•2ï7)ÖÙ'&”>tVCèîþ\†bûXendstream endobj -2416 0 obj << +2415 0 obj << /Type /Page -/Contents 2417 0 R -/Resources 2415 0 R +/Contents 2416 0 R +/Resources 2414 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2414 0 R +/Parent 2413 0 R +>> endobj +2417 0 obj << +/D [2415 0 R /XYZ 85.0394 794.5015 null] >> endobj 2418 0 obj << -/D [2416 0 R /XYZ 85.0394 794.5015 null] +/D [2415 0 R /XYZ 85.0394 463.2352 null] >> endobj 2419 0 obj << -/D [2416 0 R /XYZ 85.0394 463.2352 null] +/D [2415 0 R /XYZ 85.0394 318.8302 null] >> endobj 2420 0 obj << -/D [2416 0 R /XYZ 85.0394 318.8302 null] +/D [2415 0 R /XYZ 85.0394 224.0131 null] >> endobj 2421 0 obj << -/D [2416 0 R /XYZ 85.0394 224.0131 null] +/D [2415 0 R /XYZ 85.0394 159.9229 null] >> endobj 2422 0 obj << -/D [2416 0 R /XYZ 85.0394 159.9229 null] +/D [2415 0 R /XYZ 85.0394 83.8775 null] >> endobj -2423 0 obj << -/D [2416 0 R /XYZ 85.0394 83.8775 null] ->> endobj -2415 0 obj << +2414 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2426 0 obj << +2425 0 obj << /Length 2546 /Filter /FlateDecode >> @@ -11575,39 +11555,39 @@ X žÓëùÕü;îîdPXõÛtãª*™uox·=©¢ˆÉÆ¥¹éN„ïvïÛlz§/ËÚ7G®³\ƒ× áP‡ …zÓ㇎âÍüS›ÓN->.â°hÀf<ÔŒ›ñ^ìxû×ÖÌ8²aè³0 Ç#¶…t8`’‰×‹½Îv Gù9œ}~m?™O#uø]tg]fWe’¾Ãßµ¶ˆm.óÄ«ê×ÜÖv×;j—$hÑr[»#ŽjZÇ0|Ķڿ·Ëͼÿ•´È]€þÞgTý­Ògj÷?^ÓN¦¦¿b‘o“_lù2ŸóþZáÚýÄþG¨WÓ8ãáÞ9w+\®`¶2‡|·_lw$Ô®ìÙ’ ÚŠãÜ}€¤óŠFIŒöü¬ÿ:僟¯Hóîÿþ›x÷§¸}ElعX=„Ø ¥µNÙû‡ò¾ìÿ‚Ê¿Áendstream endobj -2425 0 obj << +2424 0 obj << /Type /Page -/Contents 2426 0 R -/Resources 2424 0 R +/Contents 2425 0 R +/Resources 2423 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2414 0 R +/Parent 2413 0 R >> endobj -2427 0 obj << -/D [2425 0 R /XYZ 56.6929 794.5015 null] +2426 0 obj << +/D [2424 0 R /XYZ 56.6929 794.5015 null] >> endobj 850 0 obj << -/D [2425 0 R /XYZ 56.6929 769.5949 null] +/D [2424 0 R /XYZ 56.6929 769.5949 null] +>> endobj +2427 0 obj << +/D [2424 0 R /XYZ 56.6929 744.4739 null] >> endobj 2428 0 obj << -/D [2425 0 R /XYZ 56.6929 744.4739 null] +/D [2424 0 R /XYZ 56.6929 712.5891 null] >> endobj 2429 0 obj << -/D [2425 0 R /XYZ 56.6929 712.5891 null] +/D [2424 0 R /XYZ 56.6929 647.0402 null] >> endobj 2430 0 obj << -/D [2425 0 R /XYZ 56.6929 647.0402 null] +/D [2424 0 R /XYZ 56.6929 551.5126 null] >> endobj 2431 0 obj << -/D [2425 0 R /XYZ 56.6929 551.5126 null] +/D [2424 0 R /XYZ 56.6929 446.5077 null] >> endobj -2432 0 obj << -/D [2425 0 R /XYZ 56.6929 446.5077 null] ->> endobj -2424 0 obj << +2423 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2435 0 obj << +2434 0 obj << /Length 2973 /Filter /FlateDecode >> @@ -11627,24 +11607,24 @@ I Ð߆Œÿ7ˆ~lí8Œg¢ÙçÍEsâÇ1D›9 æD»ìh0'äÔ±5`¶©rI _òÈo#(gøÕ’ºnƒƒ6ˆNŒ7‚FCÆ÷¶gÑI°C4ž<.¢é æ“ çYc'»*+ð®ZS“(ÿm½â[1ÀJ:O©c€ýgíú­·“ÝÇ:4“ƒ#¤83 Û «zþï¿ÏÙý5RƒOH> endobj +2435 0 obj << +/D [2433 0 R /XYZ 85.0394 794.5015 null] >> endobj 2436 0 obj << -/D [2434 0 R /XYZ 85.0394 794.5015 null] +/D [2433 0 R /XYZ 85.0394 287.1527 null] >> endobj -2437 0 obj << -/D [2434 0 R /XYZ 85.0394 287.1527 null] ->> endobj -2433 0 obj << +2432 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2440 0 obj << +2439 0 obj << /Length 2099 /Filter /FlateDecode >> @@ -11658,42 +11638,42 @@ S &!û£Q’„Šƒ²ü£“>ÿ Ùœ„dS•M9/ÿ$vÒíÿ8h7b‚`ûuZE|Q蟇õ\ ÊõÂ<Áâ÷–Nã®w}ÒŒ1Pø0¿íæ¤Í#]ÛÆöžNÚËÍ“ÉuP5´÷ÃK…Ÿ!b¿+€}û÷ È‘Œ»1à¿þ³Óî @’)Eã¿™S ÷= ²Ên†pzøg˜J V‡±ÿÑÉkendstream endobj -2439 0 obj << +2438 0 obj << /Type /Page -/Contents 2440 0 R -/Resources 2438 0 R +/Contents 2439 0 R +/Resources 2437 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2414 0 R +/Parent 2413 0 R +>> endobj +2440 0 obj << +/D [2438 0 R /XYZ 56.6929 794.5015 null] >> endobj 2441 0 obj << -/D [2439 0 R /XYZ 56.6929 794.5015 null] +/D [2438 0 R /XYZ 56.6929 632.7441 null] >> endobj 2442 0 obj << -/D [2439 0 R /XYZ 56.6929 632.7441 null] +/D [2438 0 R /XYZ 56.6929 393.4246 null] >> endobj 2443 0 obj << -/D [2439 0 R /XYZ 56.6929 393.4246 null] ->> endobj -2444 0 obj << -/D [2439 0 R /XYZ 56.6929 322.7553 null] +/D [2438 0 R /XYZ 56.6929 322.7553 null] >> endobj 854 0 obj << -/D [2439 0 R /XYZ 56.6929 278.4974 null] +/D [2438 0 R /XYZ 56.6929 278.4974 null] >> endobj -1446 0 obj << -/D [2439 0 R /XYZ 56.6929 239.5941 null] +1445 0 obj << +/D [2438 0 R /XYZ 56.6929 239.5941 null] +>> endobj +2444 0 obj << +/D [2438 0 R /XYZ 56.6929 205.2551 null] >> endobj 2445 0 obj << -/D [2439 0 R /XYZ 56.6929 205.2551 null] +/D [2438 0 R /XYZ 56.6929 131.664 null] >> endobj -2446 0 obj << -/D [2439 0 R /XYZ 56.6929 131.664 null] ->> endobj -2438 0 obj << +2437 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F14 956 0 R /F39 1151 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2449 0 obj << +2448 0 obj << /Length 3022 /Filter /FlateDecode >> @@ -11714,27 +11694,27 @@ a e‡oËeÙ–x½ªˆ¾bÝ[Úñ'9ÐâX!rí‹ÄDÐï,7C%‘w-Ÿ“ªÕné¹#…bмÓðXŪPŠyÁÈ’ UË·¨þºpnÚ /^r_¾Œí$Ñö¹þ"Û¥}‰Y«CúD޳ˆ²$±UG%¥z‰¡eû´Ù0aÌùë´/žlÏr¤Þî`ÝrHDBxsŒ¡j‘ɱ)ßVy¬Jñ+šl.oZ@½“/×M·GÉPŸñ‘úÖ‹.®üáK(œ—°é| ŠùR’„ß¶oï®ÿu*©5*Á<0ä6lj£Ym~ø {6»íV>[6¾éè<½é#ò"†lÜžv=¤·=D@"®«ñïL€ʧjyÇQvk’X'y~’­阯,ÖNéc·ë%ê‰ÆÙ .|lrô…Ó=> endobj +2449 0 obj << +/D [2447 0 R /XYZ 85.0394 794.5015 null] >> endobj 2450 0 obj << -/D [2448 0 R /XYZ 85.0394 794.5015 null] +/D [2447 0 R /XYZ 85.0394 751.3869 null] >> endobj 2451 0 obj << -/D [2448 0 R /XYZ 85.0394 751.3869 null] +/D [2447 0 R /XYZ 85.0394 624.8718 null] >> endobj -2452 0 obj << -/D [2448 0 R /XYZ 85.0394 624.8718 null] ->> endobj -2447 0 obj << +2446 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2455 0 obj << +2454 0 obj << /Length 3191 /Filter /FlateDecode >> @@ -11755,21 +11735,21 @@ xڥ˒ gÐq©|ý²RGô7 ír%X@<9…îÏÆm_”¾‹œÖy ­ë¯êË¥_=™{ó(+_ïíÿ̰÷œ¿k«| |~2Øgô_ào¤f÷0‹@žöýcø»7¯g>Ú¾y· _Õ$8½{³õ&ýtIÚ—ßbfÿl5¢|â¯ñÿþO×þ¿kQÊT–P%™ÆV•O”埈¢cËbB"Ghÿîÿ“Îendstream endobj -2454 0 obj << -/Type /Page -/Contents 2455 0 R -/Resources 2453 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2457 0 R ->> endobj -2456 0 obj << -/D [2454 0 R /XYZ 56.6929 794.5015 null] ->> endobj 2453 0 obj << +/Type /Page +/Contents 2454 0 R +/Resources 2452 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2456 0 R +>> endobj +2455 0 obj << +/D [2453 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2452 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2460 0 obj << +2459 0 obj << /Length 2936 /Filter /FlateDecode >> @@ -11786,27 +11766,27 @@ d04 ê ;ù'UÑa íìï@]tïc <©óhû1† úáòæò×süRwwyAL>^~yÅ™ßñ4¬ïk%ÜíB'6«¬[Pi Nvï¨}ž ¦ÊN±Ô‹¹š)”åÖ{ç›Å6xÆYJNOÌլô µ-¦çôyÁ>‚q¿ |„eý\°kø¾)ŠâM…ÿ”γPÅ®ÌEÅÃÜU9Æ*ÎÂXˤúm·;ùŸà`µé8¼sñÔ¶…ÍúføÝÑáî9ííú”‹ &†6 <Ø76C¹¦ÚÕ¿%‘ •Œ²ãáS™dK(ßBÐͤNj^ý"ÝËñ"Àd¢ÒãRÕ¾Øþ÷ôú*é‹Åóþª®"{èU{È€u™ÐSe*”é¡×šµ”GtØP–èE;¹5Ó®ÌA+ù2îC6ÂÏ  Ý#Õpw¬«iï ²ýÒèÕ¸¢¿²XÜ7k…˃¦Mt‰úqËni–i^´ëy[³î´ª'ðPü1>K^ÄÞÖóm2…ÏDëìó¦éLÄgÝA;JâŸó ì+rwÿþ«¡í‘¨4”Yv ¨$ÁRB¤e¥p÷Bé]Õ5\O:‹ÓÝÿ×LDòendstream endobj -2459 0 obj << +2458 0 obj << /Type /Page -/Contents 2460 0 R -/Resources 2458 0 R +/Contents 2459 0 R +/Resources 2457 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2457 0 R +/Parent 2456 0 R +>> endobj +2460 0 obj << +/D [2458 0 R /XYZ 85.0394 794.5015 null] >> endobj 2461 0 obj << -/D [2459 0 R /XYZ 85.0394 794.5015 null] +/D [2458 0 R /XYZ 85.0394 658.0977 null] >> endobj 2462 0 obj << -/D [2459 0 R /XYZ 85.0394 658.0977 null] +/D [2458 0 R /XYZ 85.0394 153.2806 null] >> endobj -2463 0 obj << -/D [2459 0 R /XYZ 85.0394 153.2806 null] ->> endobj -2458 0 obj << +2457 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F14 956 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2466 0 obj << +2465 0 obj << /Length 1723 /Filter /FlateDecode >> @@ -11821,45 +11801,45 @@ n ‘•¯éŠI5ÙÛò;óðwZ5Ø ½<ôñÅfçá©$Ѽ ã–éøU¦&¿Ír_³~HÖr\¸xv‘­Œ?_`¯ ­Ý;^>O¯O¯f§—OUò£á>Ä—¥Õ¶£MKmÓJcj¶CÝtt0À:e›èïKS¹-áºáÀ#\»ï’9~¬nOíBj,çÜö½vš¹ ˆ>@§(cõ©¼©bý Qâ°4uKl'«róàz$Ûöm»Ú¶åØ»Ô7¥¶+i“8/:IŸz.̾5àRû…Å“e´õýÿþ³ÿ`%Á6QÄ÷ßho6Êv%ºÊÚIýDôæ“ÏSÙÿ2®Çìendstream endobj -2465 0 obj << +2464 0 obj << /Type /Page -/Contents 2466 0 R -/Resources 2464 0 R +/Contents 2465 0 R +/Resources 2463 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2457 0 R +/Parent 2456 0 R +>> endobj +2466 0 obj << +/D [2464 0 R /XYZ 56.6929 794.5015 null] >> endobj 2467 0 obj << -/D [2465 0 R /XYZ 56.6929 794.5015 null] +/D [2464 0 R /XYZ 56.6929 598.7685 null] >> endobj 2468 0 obj << -/D [2465 0 R /XYZ 56.6929 598.7685 null] +/D [2464 0 R /XYZ 56.6929 432.9509 null] >> endobj 2469 0 obj << -/D [2465 0 R /XYZ 56.6929 432.9509 null] ->> endobj -2470 0 obj << -/D [2465 0 R /XYZ 56.6929 360.8886 null] +/D [2464 0 R /XYZ 56.6929 360.8886 null] >> endobj 858 0 obj << -/D [2465 0 R /XYZ 56.6929 315.6627 null] +/D [2464 0 R /XYZ 56.6929 315.6627 null] +>> endobj +2470 0 obj << +/D [2464 0 R /XYZ 56.6929 279.8921 null] >> endobj 2471 0 obj << -/D [2465 0 R /XYZ 56.6929 279.8921 null] +/D [2464 0 R /XYZ 56.6929 241.5703 null] >> endobj 2472 0 obj << -/D [2465 0 R /XYZ 56.6929 241.5703 null] +/D [2464 0 R /XYZ 56.6929 166.5861 null] >> endobj 2473 0 obj << -/D [2465 0 R /XYZ 56.6929 166.5861 null] +/D [2464 0 R /XYZ 56.6929 97.4887 null] >> endobj -2474 0 obj << -/D [2465 0 R /XYZ 56.6929 97.4887 null] ->> endobj -2464 0 obj << +2463 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F48 1228 0 R /F39 1151 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2477 0 obj << +2476 0 obj << /Length 2079 /Filter /FlateDecode >> @@ -11879,82 +11859,85 @@ Q =õh¡Ñ\éï_| §ˆéìy“¬é¦ø³,¼ÙAS…í¾WeOY)Áð^›QkÛVAWGaì&DU®ëgïUÆJBÓ«½k.FdáÔÕ¶§•»ðѬس´ÚÊÕ/­íZ÷`RmËC¶rjœœZnߤë€BŨ–õÙ&„ĈDßýÌ m…îŽ=ê5˜jÿÍ xRÙ)V=ŸšÏ没ù¶hè 8òåzWÃl–6>0Ât¼O£ 'u8¥³°Õ³Â›Ušï²m Ȧ¨+í„ñÆD¡™Ñ¢C­nbN\&vÛ$÷¡ ®õAÉbooĜޫíðûHë#1¥ÂäíÒ˜šn˜+S\ªžŽËmRltš06z,Õ!Z)8ÞPsQ+{VÌÙ©±À±o›Cý0±øTÀz“$É›Tý¡cOèì|u˰]åghöHÀ]Í:‰PE½ÍÖ±j+‡Ç2œ;¹m¨3DXt0Sz ! §¹NŠx4úr¤"Ñ…œ‰Ø]Þ ¶zVÁVŸ:¯`p¬lFQ&‰žÛ`ŒÍ)Óºìä›Í¯ä1ko¤ªå>m¶Û™c¥›£–Y’¬2ܲ˒e?AÕ†”E{ãQ\¾½Eç~ü€~DýbáiÛq[Uþö#Ç_€‚±8¦þ‹ †á ƱN)8¡åé»Þþ„rêû_·Ïj¤endstream endobj -2476 0 obj << +2475 0 obj << /Type /Page -/Contents 2477 0 R -/Resources 2475 0 R +/Contents 2476 0 R +/Resources 2474 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2457 0 R +/Parent 2456 0 R +>> endobj +2477 0 obj << +/D [2475 0 R /XYZ 85.0394 794.5015 null] >> endobj 2478 0 obj << -/D [2476 0 R /XYZ 85.0394 794.5015 null] +/D [2475 0 R /XYZ 85.0394 752.123 null] >> endobj 2479 0 obj << -/D [2476 0 R /XYZ 85.0394 752.123 null] +/D [2475 0 R /XYZ 85.0394 500.7908 null] >> endobj 2480 0 obj << -/D [2476 0 R /XYZ 85.0394 500.7908 null] ->> endobj -2481 0 obj << -/D [2476 0 R /XYZ 85.0394 437.8079 null] +/D [2475 0 R /XYZ 85.0394 437.8079 null] >> endobj 862 0 obj << -/D [2476 0 R /XYZ 85.0394 398.8908 null] +/D [2475 0 R /XYZ 85.0394 398.8908 null] >> endobj -1447 0 obj << -/D [2476 0 R /XYZ 85.0394 365.8909 null] +1446 0 obj << +/D [2475 0 R /XYZ 85.0394 365.8909 null] +>> endobj +2481 0 obj << +/D [2475 0 R /XYZ 85.0394 330.3396 null] >> endobj 2482 0 obj << -/D [2476 0 R /XYZ 85.0394 330.3396 null] +/D [2475 0 R /XYZ 85.0394 264.4348 null] >> endobj 2483 0 obj << -/D [2476 0 R /XYZ 85.0394 264.4348 null] +/D [2475 0 R /XYZ 85.0394 180.5065 null] >> endobj -2484 0 obj << -/D [2476 0 R /XYZ 85.0394 180.5065 null] ->> endobj -2475 0 obj << +2474 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R /F39 1151 0 R /F41 1208 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2487 0 obj << -/Length 2923 +2486 0 obj << +/Length 2999 /Filter /FlateDecode >> stream -xÚµZÝsÛ6÷_¡™{°<±@ðcú”Önê¶N|'wînÚ>Ð$qB‘ªHÙqþúÛÅ. R¢ä¤7—<\,‹Ý÷´…ð_ŒtÄ™ÌFI:z4[_„£%̽»Ì3qL“.×wßü ’Qd±ŒG‹Ž¬4ÓTŒæ¿¿ ’à -$„ãë÷ÓéÍ÷“éÍÃÃíÝÍÕDd©ã·÷÷7ï¯oÿ}5‘:nà ÃñÝÛ÷¿¾ý…h÷W°½»™^ýñðÓÅ̓׫«»*õçÅo„£9á§‹0PYªGÏð"Ëäh}ièH)G)/¦ÿð;³vé -DHËcH1"È´–=kè,ˆ•TÖîn?¼?>‰!âQ"E #-NìLL“.—ÛxÀ Ž ÷,·ŒU¦:=¿¥cØRv¶ŒÓ Ñßò‡z{%ÒñÌ€³tœWø›Œw›yÞ2­^æà¹œOõv·ôüѼÃsÑ®ˆTÕDY›6A9QCiÊyèŽÿu¥õ–Ô;Ô®Š†ÖÕ›¶¨«7h»©$ -"&prT^5™MÓ¶ÅÚ0÷Ð °tªFïuX÷\”åÕD©h¼È ;Òãç•©ˆ–·­Yƒ -Õ’fÚšèÎ*HˉTše>{!B1¶o’=_4.®Ä­bÅØóá*w¾‰Ò1Í~½vÚéñ£!Šu’™Ñè0§é¢Â#ƒ-øpäS+P&ñ¸2Ï8Ðcrì'S9~´ö†iöW¢÷+êm±,ª¼$2yÈìC ‘m^TfçTi2~p‹ý²!6¯)Ó‹04G§CÚ#SÀ}D@CÛߕ錼¶!©©Z -:èôàÔkk€J’œK;L§_RÇdßÑŸ eZwD$9L[3këíË¡bBFA¨CyV3Ït¬Z×BfA¨ ¬uu›š¶aÃXŸÀ”!èX…,©¨è÷yUÌVìäqà»Z––“ æ­é—}QÌÏx@‚]’(zÅ®3>p\Ö «£@a–¼²¥cزkÛDa’ly³.t»&_²-Ö¦Ù?äÕœæSÑž´‰ÎdQ8=o“.×i›x.k“§!`Š@EIÄÈ,Í“)Ë’ ƒ°p^1Ç4 X•¡ ²0Ó}͆`iwË¥ °øh;m2áIœ½’o»\gL測Én†M–fZ±ÉLZš£79„—N«ô¼jžk@·¾Õ2ÈiZô•ûµ1X}q~—Åf(¤}ؘj:ý…HÇS'd•ã™ÕëMQbªÀ' -ö(æþçï§‚ÈÍn³©·-=-qÌÍ"ß•è4»MÔÍÇY#Ä·60C”RvëÅgï^ÌžHª|mzÃÁ½O. TüëŽã’§Z›@pÌÂ8´žBUQ؃Bõöý;ZÜ)ݬ ¹DÆ`gRõÒ‘ËU¶°I"ŸŽÌ'—h´NÙ˜¹O”.£ÒäàßÝÝõ5Í@AÕ£þøãÝÝtÐäí‚&½ -­ËÝšrZ‚)Žß ¥¿}¾æd|ù÷K—¶™0¹´I^qa¦àCUk¶|¬–Nbx2çÓA¥ó ŸŽ–¿^œ½Ÿ†qƦaðIlëI²j]Z SÍ ×Å‚³ýn¶:¿o1xüE]–õ³Õ]@í€øP*V†¶L©)ÚV,f²OÖ×0yùr *$£ñ庶æ’j|ùìGs?Z¹‘=®^ŽÔÚ× ·áý’þ)›^Ð{¸#›WÁË^L¾e¥~‡|?7¨'UCù)«XÓ@F(›·ô0Ï_kbðò²‚ -ÎFU˜(M¾¡‘Ý ¶Ì·®«vÅBû»[’ß/<±]GÔ³1ÝöMßÁ|î\XÅòìƒÃ -ˆr¥/¤•Ì´ôÓuð›ƒÓs:gtJ!è!êÊ6&¸ß¶²Œv•Á»b!ûÆU¼Ûe0¼<™À¢0„VÙùÖå:À<—M`÷¯&0T÷›za-q˜ÅTÕHÎëç¹ìe1•Ø@÷äÔŸ9Ϥ™k€d[ƒl_ˆÂdN*Cá¹p«kú}d!›ÝcY4+ëÇδßäsmb$³ñÛD>7mC6+íWèÖð¦6·é$H¤Š†:Ftö£qà™•»ù!”<?Sd·{UÝö…í'È¥Ã^f—(O"KAï/³ø•Ò¨ËuYžË"ëí«mÎ9`A¡Ϫç¹ôë+ -ƒ,…¤ßS%÷ÏZ3²p„ÈRÐ}3²z\ÔecDqëkú}d†CöØ Òˆ„ €Ü^ T Hæþd¤àÝHчÔÈw%2„Â'U¯ ¤Ãu%ŽË¢äŸÃ( C!¿&:ˆ¢DŸ×Ïs (x“H¦i_C†IÊvÅÃ$¥„¿&].rfJ™ÃÎÔäîGf ŒõT´@I ’8 ¤.Ò¸Ý(‘G²…Jî’)”ñ} @†Sùré|Ÿ7Ýœé4ÀÌu{h¾:Xy¬Ëø‹è“Iè4ÔçÑ×å:>ÏeÑw;€¾,ˆS ød d–WÏs è×O~I‹ì+ÈàS.FÀÀ] 2ø€âÀ×åâ›@AàÙš=2ò|¹ƒî×Zyâ(s ƒ¼©½lÚÂ]6ŠqÓú¡‡£´uÏWÆ­7™¯ø¿e@HÔ­å+×|]®3èr\]×C± ¿a$_–Á#Ñyõ<×€~ýÐ&`Kú -rmEÍ ¸¶Â–-'¥¯­º\T]Á pëkúµ®€EsSÊ*¾€²"lÅ;ÙV(Ë^†QŒ˺Zš­Ï…Þvô0õqŠcö-.Þ­ó—nH\çná‘ÁIœ›º)ìÍ(¶ Ú4™O ,´é6:§'2(´ã蕪¾ËuyžË"oújU¿Ùš¹™™¦ÁÖ4}ñÚà ä æ=«§cг‡@,½”R}E§€“™uADÝ‘ûdÏ Û4c1䮙ݭ ˜ ë#¾Œ 'ö Ñœ×q¨à{Í×ðl>mÊbVðÆÍnƆ@‡6 d{àï“T±Â¸n;WRèë:Ýr s»ZÛçBÎg?ea Z¿lPXÓCìξ Ù»‰t8¬wMK Í'ÇPW–/ô¼Î[k+«nXÚ‘x–äÌ4ÔD{£a·óÇJWÅÚï/*t¡gpü¥TS{ Z:epf)0 ÅöÂH°ùh/C‹ö²Ù&C'ò¶doŠˆ?0Aò²]ßÌ}TÒ.›~=Z£EðG%˜¢t"úDÏ4Èà¤{'Ñp³²{KºQ{ÊË7C76o+ûËÔnn³W+ö6á¥9™Û”ÒûãW"L‡ëL„q\6ƒ•“Úå6wº£ bbêYÝ<×€r½°"Ò –aÜ׎[ìîÖb=ì`ðjZ.Š9@Îé¹óAVé„._cû¹ßñ$t·x±»Ü„¥G[pÐ}ØÄôE“.*'Pý…Rˆ>øõ¨³”Q oò-}½µäúÍ™­49­ˆÝ§p ®é¶4Úß²†$rZGºE®FIN^­íã+î¾k{BúGz3IfŒuCuÙrÄt&ôaKš0ê¬ä×iôZÙ¾V„U(|l¤k^ühµÿ«}œì{†BÏ·èa×Ѓa|ã®±4–ÚÞOcaAaJp¸À펂4Žj‚ûBøí Ö°8èEDáO!¼q[2à?Ç_Áe?îe㯰ýÀà‡wÍÉæãOäÜÙqÃŽ‡‚S¯ƒm·lÉCÿIæþ[žý-EI ÒTÇ ™èÇN)<¬ˆÒã¸Éõs¬û³<)endstream +xÚµZ_sã6ϧðÌ=D™[«"©¿Ó§m“nÓ6»¹s:w7m›¶5+K®%'›ýô -Ù²²Û›KD ? i1 à_L¢Ø3™M’,ô£@D“ùæ"˜¬ ïÝ…`ž©ešv¹¾{¸øæ•L2?‹emtÛÍüÝEOU,ÀÒ©šL×aÜsQ–WS¥Bo™¦yÏk]-o[½ªõ´5Ñ­U–©Ô«|þB$4„Â3_’Y_èWÂC«1f}8Ê®oª¢Èú0Þt[í"ïQÅ8IÏé:,¨»¨pÉ`‹ÞâŒ@™Ä^¥Ÿ±yä.˜O¦Ò{4ö†nöWFÔ»bUTyIdò,Ù‡@" Ú¼¨ôÖ©ÒÄ{°ƒý²!6§),Ó‰ÐÔG«CÚ#SÀ}D@C›çZ÷FQjKR]~å¡Ów»$’^&;"=åå^7ÔÎIñ4[=/ *h›$É+M«R‡U…ÞvÿX¢Cçn]€•jÁ’çmñä:”Y03+pT^65EOc x’% Ñr©þڱǬýLˆŠÃЗð%‡¨.×ùå¸Lˆú™>²(êp +ÈQf?Éb§çm½{9ÖMÈТ@Ž+縴ë~ØBf~  ®÷Ô›é¶92èCÑÉŠŠžÏëb¾>b'ÌCqQj–v€MÇ7ì‘b1â«iúŠ:\#~°\Æë“TûA–¼2¥e˜²kÜDøA’My³)zû&_±-6º9¼Ð· ý©hÏÚ$J!_I6n“.×y›8.c“§!l +_…IÈà,õ“.Ë?ƒÀ8®˜eP¬Ë@úYE}͆`©÷«•I1øj;o2,y^ûš;L#c&c¯›a{¥Y¤Ø^ºõÉ—@ŽT:ª—c:U¬o° :ø®f¿6+OÎ*‚Uñ„‘i¶ºšÍ~¡RÐDz2îÚòÌëͶ(1Mâ%:sÿó÷³¿ Aäf¿ÝÖ»–^Š–8z™ïKt—™¿&êöã¼â[Ä!¤û©£õr“s,VBª|£{¡ÂÁ 8 +ó?írláÓ©T§³ N°¤²˜f…ýöý;Û©Zl iGF~("ú¯mf‚²³ iÖÆn7ÉçÚ$ÄPfÞÛek6A¦Û„lV·žÓšÜ%~"U8´[îîSŠj^îÇPrüL‘ XÜdTuÛ¶o¬ ›ø˜m¢<‹,e‡¡´EV—ë<²—AÖÛW÷8cÀ‚;Žªç¸ôë+ ü,…¤ßS%ŸD# [ˆ,…Y=.:aÀˆbÇ×ô|dÞÄš½} i‚DB@v.P*$óÙÉ$HÁ·‘&¢ŸÐ¾@nOñWQ"?NÄk(ép Är”üs%A ä—À +²0‰Æõs\ +Ã$”°OëiÈ0IÙ®Ø`˜¤€ðiaÒå"g¦”9LOMî~dÊXOõG”"‰Jj# € +y"[X ¤Á(©ŸBß=áT¾ZYßçM7gZ 0sÝžš¯Vk§2þ"ú Âó#üÎGÑ×å:>ÇeÐw;€¾ÌS ø¤/d–«ç¸ôë'¿Ä‡ŠEödð)# aO|@±àërñ)¨ ðaOMƒ™ y>ÖA÷ÃÖÑ@™KäIÍAëÐö UxMëšްãž.¿KoŽ2_ñË€R)_©ì5tu¸FÐe¹ º®‡bÞß$_–Á#á¸zŽk@¿~h>°%}¹¶’öœV*[[á–-'¥«­º\T]A£°ãkzWÀ ….5å?W@¦€â™ÌV(Ë^–| ϲ®Vzçra†‡=L}EœâX‡ûï6ùK7$nr;ðD€;Ú$ÎmÝæL· Ú5l2Ÿ@Yئû¸Ñ9‡<‘ _$JŽ#¯ËuyŽË oöjU¿Ýé…žë¦Á­i¸âµ‡AÈ%Ì;ª§eг‡ÀXù>ÕWt8™„´;²×%ð¾4›f,†ì³=õ€sa}ħ!ìI|Áã8Tð¹LÄÇð®?mËb^ðÄÍ~Ά@‡6 d{໓i*üXáù[kx$…¾Ža§[®`ÃÜ®7æ=óÙu™DƒÖ/[T Žèˆ!¶ë€Ÿ„\DZ46û¦¥ú„c¨+Ëzßä­±‰‘U7,íD> endobj +2487 0 obj << +/D [2485 0 R /XYZ 56.6929 794.5015 null] >> endobj 2488 0 obj << -/D [2486 0 R /XYZ 56.6929 794.5015 null] +/D [2485 0 R /XYZ 56.6929 752.2571 null] >> endobj 2489 0 obj << -/D [2486 0 R /XYZ 56.6929 751.9327 null] +/D [2485 0 R /XYZ 56.6929 498.0757 null] >> endobj -2490 0 obj << -/D [2486 0 R /XYZ 56.6929 503.6095 null] ->> endobj -2485 0 obj << +2484 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2493 0 obj << +2492 0 obj << /Length 2264 /Filter /FlateDecode >> @@ -11967,45 +11950,45 @@ Q K/îçöâÑw…#ºË3àÑòZÈ3¢q±Äæ=yÍT wOgîîr{ugÍbZjtìG!H\ò—OË‹],ýß?í~ƒúqNý×l†™$‚ÙÝ%Õ„6x_t÷ÓÒ¡ìÿ§ìÕÅendstream endobj -2492 0 obj << +2491 0 obj << /Type /Page -/Contents 2493 0 R -/Resources 2491 0 R +/Contents 2492 0 R +/Resources 2490 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2457 0 R +/Parent 2456 0 R +>> endobj +2493 0 obj << +/D [2491 0 R /XYZ 85.0394 794.5015 null] >> endobj 2494 0 obj << -/D [2492 0 R /XYZ 85.0394 794.5015 null] +/D [2491 0 R /XYZ 85.0394 655.2256 null] >> endobj 2495 0 obj << -/D [2492 0 R /XYZ 85.0394 655.2256 null] +/D [2491 0 R /XYZ 85.0394 487.8207 null] >> endobj 2496 0 obj << -/D [2492 0 R /XYZ 85.0394 487.8207 null] ->> endobj -2497 0 obj << -/D [2492 0 R /XYZ 85.0394 419.4946 null] +/D [2491 0 R /XYZ 85.0394 419.4946 null] >> endobj 866 0 obj << -/D [2492 0 R /XYZ 85.0394 376.8649 null] +/D [2491 0 R /XYZ 85.0394 376.8649 null] +>> endobj +2497 0 obj << +/D [2491 0 R /XYZ 85.0394 338.6766 null] >> endobj 2498 0 obj << -/D [2492 0 R /XYZ 85.0394 338.6766 null] +/D [2491 0 R /XYZ 85.0394 305.0527 null] >> endobj 2499 0 obj << -/D [2492 0 R /XYZ 85.0394 305.0527 null] +/D [2491 0 R /XYZ 85.0394 233.8048 null] >> endobj 2500 0 obj << -/D [2492 0 R /XYZ 85.0394 233.8048 null] +/D [2491 0 R /XYZ 85.0394 108.6677 null] >> endobj -2501 0 obj << -/D [2492 0 R /XYZ 85.0394 108.6677 null] ->> endobj -2491 0 obj << +2490 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F55 1311 0 R /F41 1208 0 R /F39 1151 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2504 0 obj << +2503 0 obj << /Length 3157 /Filter /FlateDecode >> @@ -12027,24 +12010,24 @@ a /Øñ˯ÜÐóί긤»{xk›¦þ’j×y]ŒFZdèò`ø ø2_øÔÉ}jð¶Ùî<˜€°®w)ÂÊ ìß·{k‰À«½šþ¹…ø%ˆ/ˆk8Úõ“V¤~»xWèúïÊî©$+PG?$¢®’²Ò˜>¤Åæ® º/¹+æ»÷T}«}!åÐ~’„Y#ôg^ZksæBÝZó¹™xXswƒ ïçâ{hš™þ/~k‘1%Upø!ÉkýZÑï¶Bõ3ïŽýLO% [7¸¼ÿÝÜÿü¾Ý5ðnŽÕúd熞×3…Û ?ôdþÇ~‡¼ÿŸD$endstream endobj -2503 0 obj << +2502 0 obj << /Type /Page -/Contents 2504 0 R -/Resources 2502 0 R +/Contents 2503 0 R +/Resources 2501 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2507 0 R +/Parent 2506 0 R +>> endobj +2504 0 obj << +/D [2502 0 R /XYZ 56.6929 794.5015 null] >> endobj 2505 0 obj << -/D [2503 0 R /XYZ 56.6929 794.5015 null] +/D [2502 0 R /XYZ 56.6929 752.0497 null] >> endobj -2506 0 obj << -/D [2503 0 R /XYZ 56.6929 752.0497 null] ->> endobj -2502 0 obj << +2501 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R /F41 1208 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2510 0 obj << +2509 0 obj << /Length 3243 /Filter /FlateDecode >> @@ -12059,21 +12042,21 @@ xÚ¥ XÌÐc9;ü4k‡—Hö†xFrÒ‡$ß”MvïCÁ®nÚ¾SÅmHÐS­í©¶hZJ˜Ñ÷¦È¦ UÚa§û! ÷£QQ5ƒ',änLQ=Œ8T§Ø×z¨]G¸%owh˜þ Mƒ?KÞÓï¸)2O—Js˜«êjÊ$¸%\¥f·„»³Áð©þQ ¿ÜþBÀ¯øˆKÝj ÐQ÷*HÜ\W~SÀôû*¿ƒ„Ž úé]9hbG–;s‘œ'3jÜKzaЍ!:ѹêS…lØ­ìΊ©ÁiÝÒiƒ³¾ÿ˜4ìzÛi¾–»î!¹ð¯@½EM]8iL¨°×qñ ±æ/\‡å.Üþ¹aòm9hé¬^Ä[$Õeæ:¬ îF9~Ö ”³7îK Ÿˆ±#à —hßî߈0ŒëÑJÀܹN³óî¸ÑâÄ–¦è)G.ÑÄijéÖßÊœ—gOÚÚP¦ÊçÑ/@Z/¨EW+ŒMrÒ¤âx1ÑÙ€D"G—S¸øóP~Ë6®øÓ2 `ûrU¸“îQ<õ­6Z2`MH½x¸ÅÜ.Û}M–žó ¾Ú„S‡Õ®e“LÙÇÉq È{òÞ5ÖªèBsîŽ Ò§qo!ðoõ˜í³=‡I€1÷ô¿Ë&}ð*Œø]~sœ_n[Âÿ{¦Î')+0Š,³ÒN7ðYîÝ/JÖ·²SoGRÚÐJë³>ÖB>Ý;ÒRêî3¼\ñ;75Ñ9lõHï0.ßv,=ž‚gžÿjµ8’Ï|‡Ò#]ø …‘œÏ¹ ò—èu1þŒÞTˆÒ»Ýfû–ž:9£ú;è*×ZÞ_C¸\µÍTO¤¡†\ežW ä‹î5Ô¿‚ž¢6’¾¿ç*H¤Y>ÜE’p¸€‰¯î;¡Ä²¹BÙÖû#aÑW„ÕЈµ #(tÎvë^f]Õ™<}Šéú@}àäÊeTñ–ÕjsÈû²w;þ j¢˜î^nvì-wûŒ3œûˆ™®@ÅÂ߬ÿû;¹þ‹@‡:Ifú”p±C­Sé™BQI¨êNXᄄ;çýÖà endstream endobj -2509 0 obj << -/Type /Page -/Contents 2510 0 R -/Resources 2508 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2507 0 R ->> endobj -2511 0 obj << -/D [2509 0 R /XYZ 85.0394 794.5015 null] ->> endobj 2508 0 obj << +/Type /Page +/Contents 2509 0 R +/Resources 2507 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2506 0 R +>> endobj +2510 0 obj << +/D [2508 0 R /XYZ 85.0394 794.5015 null] +>> endobj +2507 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F55 1311 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2514 0 obj << +2513 0 obj << /Length 2925 /Filter /FlateDecode >> @@ -12093,21 +12076,21 @@ Ra " zó¹NDÆqÙÈ\¶ÈpÔ§U:¦•½ƒƒ ¡êÆ}•ììL÷m¯¯‰îœ $wJ*¨ê¾K©àæÃ·¥› ÷͉öXì«yTn¯GúB‡·9ÈHŸ¿T°ª‰@›ÜÁL: ¦aj’áÙN^ܸOí;—ÒöÝ”̓MñàRÄÓ0Ñ1ÝvN—a™‡Ðú\.­7¤­qxì ‹ðbä¾PªLn›_^Žm”pDÑ*í•:«f¿«gGA¾÷…ç}‰·ùx|¥š?487!BÐÍ(þ |°¼î÷<Æ:ºBŽ nfGQØ7½Ê7t@¤C'Ð%Ìñôa¯Œ›¾„»»´Žæ/§kÃà†ïøÒiëœ xÏt}7Yzë×pògº0ÃBx¾)€@ÁšM²SJË@i $aeÊWÚÕAÖÌ÷q^% ÷¯ÃÙäx¤›špêGGPëñ—B#–‹îjü«tøéU”„:MÕ¸TǦ ÚlºA5Œ4ÿtihû=Ü@8endstream endobj -2513 0 obj << -/Type /Page -/Contents 2514 0 R -/Resources 2512 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2507 0 R ->> endobj -2515 0 obj << -/D [2513 0 R /XYZ 56.6929 794.5015 null] ->> endobj 2512 0 obj << +/Type /Page +/Contents 2513 0 R +/Resources 2511 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2506 0 R +>> endobj +2514 0 obj << +/D [2512 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2511 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F55 1311 0 R /F41 1208 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2518 0 obj << +2517 0 obj << /Length 1899 /Filter /FlateDecode >> @@ -12122,45 +12105,45 @@ xÚ¥X[ &Ð «MüÌMͪv­É<ÒuÕÞˆ˜«°H•â­§lko>Š2[ï—NÜÍlƒ×µï ¸NŽ{-‘e1x59B ×Huû4o²§ÆÝÊ àýDïâú1ÛZˆ¹=ØÒmZ ò½×;@9|ród:íà¿ìß0%´VIÂýc‚Z ÍœRhSâTu%¼oÄÝÿ$_Éendstream endobj -2517 0 obj << +2516 0 obj << /Type /Page -/Contents 2518 0 R -/Resources 2516 0 R +/Contents 2517 0 R +/Resources 2515 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2507 0 R +/Parent 2506 0 R +>> endobj +2518 0 obj << +/D [2516 0 R /XYZ 85.0394 794.5015 null] >> endobj 2519 0 obj << -/D [2517 0 R /XYZ 85.0394 794.5015 null] +/D [2516 0 R /XYZ 85.0394 672.6222 null] >> endobj 2520 0 obj << -/D [2517 0 R /XYZ 85.0394 672.6222 null] +/D [2516 0 R /XYZ 85.0394 403.8925 null] >> endobj 2521 0 obj << -/D [2517 0 R /XYZ 85.0394 403.8925 null] ->> endobj -2522 0 obj << -/D [2517 0 R /XYZ 85.0394 340.9183 null] +/D [2516 0 R /XYZ 85.0394 340.9183 null] >> endobj 870 0 obj << -/D [2517 0 R /XYZ 85.0394 302.0073 null] +/D [2516 0 R /XYZ 85.0394 302.0073 null] +>> endobj +2522 0 obj << +/D [2516 0 R /XYZ 85.0394 269.01 null] >> endobj 2523 0 obj << -/D [2517 0 R /XYZ 85.0394 269.01 null] +/D [2516 0 R /XYZ 85.0394 233.4614 null] >> endobj 2524 0 obj << -/D [2517 0 R /XYZ 85.0394 233.4614 null] +/D [2516 0 R /XYZ 85.0394 167.5653 null] >> endobj 2525 0 obj << -/D [2517 0 R /XYZ 85.0394 167.5653 null] +/D [2516 0 R /XYZ 85.0394 107.556 null] >> endobj -2526 0 obj << -/D [2517 0 R /XYZ 85.0394 107.556 null] ->> endobj -2516 0 obj << +2515 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F48 1228 0 R /F41 1208 0 R /F39 1151 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2529 0 obj << +2528 0 obj << /Length 2010 /Filter /FlateDecode >> @@ -12170,45 +12153,45 @@ xÚµY ›´B“ƒpªƒ`C“¿mdÞAŸæwƒÀ(œíV£w Ûù(ðS±+s[6÷Ӻ妪®ƒ  sŸÈí¾Ô0­”Z™ö[Å{l:Ψü¸i+ä0MGÐóü¡íUƒ ó›tS£@ç3<Ñ Áƒ½}]½mÁæèÏníj£P,½˜]¬õSu|kĪ{§ê{™¨c7‘D®£]VWÆWÃ8œß‰gÛû—²Ž_vÛ:ôØ@’AçûAq Œ(C!Á¼_Fã¶RÄ·Í»FíÝrõþݥΚ_çÎvgoÞëË‹QÀ¡ë§Boÿf#Õi\CÒVv#íöQÓôÔQ½«†TD† þ4RíÔØ¨„4(ÒJºÑ±îà¹Y.õÇgon®ktò'œñø¼èµj)]ÛíëF û© 9Á±q|uqùZ+ É6Í¡¶! ÃËïäڀLJ·Q¾‹2‡»øö]ïhš0˜@Û>âìýêÇ«w§¸ÈaÃÈ¥‰èÍ#ì[«ó"¯Š²NwÛÎ,G¬aÅF‡öÏ÷Âö*n¾€Jßï)uå궃ë›*Ã8ßTÎ{Á8e•¢axŠí}šÉÆ€n>(õ;Bî7$¦²4Ië¶A¥-“ÛÐ@a@§Z·Ïë¢Èžp ¾yÌ‹û*­ÆÊ€™ØU œÚqqÕ-jç=Êí} Ár··Rôæ bóa‘|´£M;úÔŽþjG_ÚQlާ¬O_˜ÐÞØŽ!΢Êu¡GC`DØuµT«qíЀž°¦jì¥å„b­Æï¿FsÏç#©>¼hù°H]X ¨|[$®V[ ±±ßŸOúý<}Ûÿ¦õ½ýÆþåߨ¿âtÜÓ®Á_ZÀñ§»Ûnu– g]Œo.ŸçluÒÙª~ÌäÓëèæG§>©ot³3d!Ž<ÚÞ~¶Jþ¥¯ÛÑoõž@¾`ÏÄÀ\Pc„ƒ®îu˜ê.UÙìg”ë#µ50ç±·›Èþ1©ûÝ ²˜©S¼³õ¦¾P÷äžuJ­†¾Ð0?;íûþ 6¦ÿendstream endobj -2528 0 obj << +2527 0 obj << /Type /Page -/Contents 2529 0 R -/Resources 2527 0 R +/Contents 2528 0 R +/Resources 2526 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2507 0 R +/Parent 2506 0 R +>> endobj +2529 0 obj << +/D [2527 0 R /XYZ 56.6929 794.5015 null] >> endobj 2530 0 obj << -/D [2528 0 R /XYZ 56.6929 794.5015 null] +/D [2527 0 R /XYZ 56.6929 681.0754 null] >> endobj 2531 0 obj << -/D [2528 0 R /XYZ 56.6929 681.0754 null] +/D [2527 0 R /XYZ 56.6929 404.8182 null] >> endobj 2532 0 obj << -/D [2528 0 R /XYZ 56.6929 404.8182 null] +/D [2527 0 R /XYZ 56.6929 344.3155 null] >> endobj 2533 0 obj << -/D [2528 0 R /XYZ 56.6929 344.3155 null] ->> endobj -2534 0 obj << -/D [2528 0 R /XYZ 56.6929 283.8129 null] +/D [2527 0 R /XYZ 56.6929 283.8129 null] >> endobj 874 0 obj << -/D [2528 0 R /XYZ 56.6929 246.6193 null] +/D [2527 0 R /XYZ 56.6929 246.6193 null] +>> endobj +2534 0 obj << +/D [2527 0 R /XYZ 56.6929 214.3762 null] >> endobj 2535 0 obj << -/D [2528 0 R /XYZ 56.6929 214.3762 null] +/D [2527 0 R /XYZ 56.6929 179.5818 null] >> endobj 2536 0 obj << -/D [2528 0 R /XYZ 56.6929 179.5818 null] +/D [2527 0 R /XYZ 56.6929 116.1573 null] >> endobj -2537 0 obj << -/D [2528 0 R /XYZ 56.6929 116.1573 null] ->> endobj -2527 0 obj << +2526 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F55 1311 0 R /F39 1151 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2540 0 obj << +2539 0 obj << /Length 2741 /Filter /FlateDecode >> @@ -12224,27 +12207,27 @@ M PIʦI0*¡ ø„•¶¬— ˜6.e‰’cÛÂ¥¬³g¾–ß,›€º«¦v|Ý:_OAÅÃñhswÅ×î sU¸žÚ]¾BA,Tb˜ào²Ç¹I$‚Œ ˉ[¤DP ¹÷ÍsÅ ª¼ ÝzÄxÿÑwŽ+T_^ÒƒvõBSÃÆLQäZÖ…¥ÜÐ)뉢;5QtŸä»oL)Û}!JGk€;¢Ã ï•¶Vxž; ƈzw`—°”ÌrÇLäN ÂxW7‘g“ˆî>^éò¶Ù„¶…"š%/üBÊ_HÍæôç®ûX>¼`Zf[ÿ*«ÝV/VÖÄh'½­«Â__ù»?ÿi5¼ûý§U4÷çppôß°˜ˆûPùOåvÈ!—MÓ™èÇ0.Lo”ÆŽ±oºÐŸÁR*¶ÿ5¾ê©endstream endobj -2539 0 obj << +2538 0 obj << /Type /Page -/Contents 2540 0 R -/Resources 2538 0 R +/Contents 2539 0 R +/Resources 2537 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2507 0 R +/Parent 2506 0 R +>> endobj +2540 0 obj << +/D [2538 0 R /XYZ 85.0394 794.5015 null] >> endobj 2541 0 obj << -/D [2539 0 R /XYZ 85.0394 794.5015 null] +/D [2538 0 R /XYZ 85.0394 677.5149 null] >> endobj 2542 0 obj << -/D [2539 0 R /XYZ 85.0394 677.5149 null] +/D [2538 0 R /XYZ 85.0394 533.7824 null] >> endobj -2543 0 obj << -/D [2539 0 R /XYZ 85.0394 533.7824 null] ->> endobj -2538 0 obj << +2537 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F53 1303 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2546 0 obj << +2545 0 obj << /Length 2753 /Filter /FlateDecode >> @@ -12255,24 +12238,24 @@ x ½áû|pMÜåæýRˆèwsÔp à± æþý®á" ÑU¦–w¦á›/ /Øp¡‚ñg7\$éæqÃÅ>Ýpa„‹ãzú%ê:(³ ¸+S¸Ñç J!HÑiUvN‹*3&!†âÐa¿œ‚°å’y°Mš6«ûLnü××o>\^¹»dzŦΤÜ豪?OL°¯ðûÑãÆÇê ¬îéªýuás3I9¢2Šáté e†À<îÇ”uÐÞ'ÁIËS…MŸkœ—çåá’±W¬Ùü’idÉÁ‡o† zˆ‡K^Bå”çÓ&…Cö*ujNʪ´¥u/§™<ŤxLžü ±6ëÍ@&‡cìå›3ꊫ~¤Ï5sTËÕ_ô¹jV®îsÕ±\£Ÿ«‚í?ÄBÆ»ÿ 76#‚ëÚ'YZú’hp¸+0òm^𶝿Eºö9“@K®¢ëy.GÚGX )luæ¼X—놔€îÿvA»jë…ý­š¹ÍåÌeð' ûbå®»2…ü¯µEÑ`¾˜Žè]o\þn&.>VuÞn¶îÖäXï_]¸‚7™–ý¬¡öÉã Ú£Ý‰Ÿl™ž-Áü/ØÑ9™ñiš,'¾Ó´-&³œ±ðѽý·‹â³ËvLÇëmE!Høä`áÛ.¬TÛ$8:+‰«á‹º½‡¼ËºÒÏ7›Ö“àÈ)¥õ¸f´¸B¼ù·‡Vàf—L#KþÛCDZ®ÝiîYÚ Ý¬ÓÎdÌ_šl7œgHšßLÿþêöÃûk÷òKÈ”¢ó7®nÆ›TÁ‹\=¿)Át×çrFÚîê2˜­GAöGî tp'í®î‘ Óà¬vÉmíÙ³Î9pe-ä+!:ßì§4þù1o24õÿBpæO#gˆ;M~ñ÷³÷Ä”šH!¨Ôh{¡Œ‰ˆ±oŒ ò¾cÙÿyÓendstream endobj -2545 0 obj << +2544 0 obj << /Type /Page -/Contents 2546 0 R -/Resources 2544 0 R +/Contents 2545 0 R +/Resources 2543 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2549 0 R +/Parent 2548 0 R +>> endobj +2546 0 obj << +/D [2544 0 R /XYZ 56.6929 794.5015 null] >> endobj 2547 0 obj << -/D [2545 0 R /XYZ 56.6929 794.5015 null] +/D [2544 0 R /XYZ 56.6929 85.6141 null] >> endobj -2548 0 obj << -/D [2545 0 R /XYZ 56.6929 85.6141 null] ->> endobj -2544 0 obj << +2543 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2552 0 obj << +2551 0 obj << /Length 2176 /Filter /FlateDecode >> @@ -12286,45 +12269,45 @@ x cP±Ô•%´t£«~ªÜlÀVæv¨É,¡Õé>SûØ”U•?+ Ê0RÇá’¿gr(‚HÒ6åÆÁC+êž,PÍèAkƳ|#*%ÂILúÃKD9÷‘«‚rnå*‘ÇÌ—&îùX•«¦v£›´^jØí.p(’#Á¥Ã´?¶x&Zf¡ÐBT‚…ó~h¡àµG”k™vµë–ŠAÈF]õ&æ6F¹3ÔÄ,ÍÖeñ¯Ê½iÝ,iŒô]€³À-ˆ)²ï¶¡ˆ½6ܘ‹d|©?YÀ¶éTû›^°íDE:¡ˆÀËñ"]%m%ü˜E¾uÕgÆ Ð_GµŽyo~,}úN«A‚ö¶ÒE±µ•- §®´®\AŸ¹’‚Vã0ú:\àç¹ þ®ŽâopƒÆß!ý:ÜQ0ŒÀ®†¦b”™¨E!Ôn_7&ÁÐÒÖ ³—¶nУºï½ÝdÅdòÉØ¸>D˜>DOØÈDWh¹Él|ª,w^ÛñªÙ諚J÷Μ!#Êݯ­êÔ\þ2é[½¨Ê… Ø0¦{MKm¶ùsZ;Ö§ìµ²T§½VØì«lÚæ/Çî&jEð–„&®ÃÕ3€Ö ÄÊYoYx÷ûÅä!m{ܸÛjè*(±%ëžË½¡Ø•Þ+JvŸ¦ñ—ü­«dëMý:¼úµÛ«2/"¯û¢ ÷´Jíu%ˆ-ŒéÞxö»‘ã1N4ßé(‡”Z̳ì,ÖëD ‹»‹Ý7Ã_GØp2˜œ;X,,šß—k'É‘F #ú²ÝÛÐß¾›0ŸÿÇx Ú÷#HÿrØn[úüÕÛ/p\ß·H6Ú.H0N)m+"’¡êíOY»ºÿ%Ǧendstream endobj -2551 0 obj << +2550 0 obj << /Type /Page -/Contents 2552 0 R -/Resources 2550 0 R +/Contents 2551 0 R +/Resources 2549 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2549 0 R +/Parent 2548 0 R +>> endobj +2552 0 obj << +/D [2550 0 R /XYZ 85.0394 794.5015 null] >> endobj 2553 0 obj << -/D [2551 0 R /XYZ 85.0394 794.5015 null] +/D [2550 0 R /XYZ 85.0394 752.0294 null] >> endobj 2554 0 obj << -/D [2551 0 R /XYZ 85.0394 752.0294 null] ->> endobj -2555 0 obj << -/D [2551 0 R /XYZ 85.0394 688.0859 null] +/D [2550 0 R /XYZ 85.0394 688.0859 null] >> endobj 878 0 obj << -/D [2551 0 R /XYZ 85.0394 648.5014 null] +/D [2550 0 R /XYZ 85.0394 648.5014 null] +>> endobj +2555 0 obj << +/D [2550 0 R /XYZ 85.0394 615.2083 null] >> endobj 2556 0 obj << -/D [2551 0 R /XYZ 85.0394 615.2083 null] +/D [2550 0 R /XYZ 85.0394 579.3639 null] >> endobj 2557 0 obj << -/D [2551 0 R /XYZ 85.0394 579.3639 null] +/D [2550 0 R /XYZ 85.0394 512.4986 null] >> endobj 2558 0 obj << -/D [2551 0 R /XYZ 85.0394 512.4986 null] +/D [2550 0 R /XYZ 85.0394 427.6096 null] >> endobj 2559 0 obj << -/D [2551 0 R /XYZ 85.0394 427.6096 null] +/D [2550 0 R /XYZ 85.0394 321.0146 null] >> endobj -2560 0 obj << -/D [2551 0 R /XYZ 85.0394 321.0146 null] ->> endobj -2550 0 obj << +2549 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F39 1151 0 R /F41 1208 0 R /F53 1303 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2563 0 obj << +2562 0 obj << /Length 2873 /Filter /FlateDecode >> @@ -12344,22 +12327,22 @@ xS ½¥€T”b*šºõ/[L p……V×úŠ«£ž;°>…Sý¥*kœS¾0OýÙe–PP¥ìÂǡʖYÝL™¥Cu¯³äªhLÞa/wXdq åiÂLæWjºÄÁª6mõ׎¦Mù,wâ­ÉûQ jïÈ+wG^·î *°Ú¿aIǼÓü3¦WúÍ(‰…Œ%þn‰Îú3‹˜€øŒÂY"Å|ö³ÖL"Hl²]`¾-©†±Ë1] D{õàƒ³ŒHD@'þX”æÉ¸—mϘ`jͳŠ"‘GF « Ï0 ~ÍŠòtFê—ÅþŸÄ”øÂµƒ'Ù[ìtN]…ö;}~$ÔÜEøX¨÷¦ë õâDa¼<¼æ†äÀurû€%¤·]i:Ê{ð¼kœ£¹-±T·I¨µ€%w¾¡%‚ÑÇ('I· ØÔ8"ª”ñµÒ_ì#÷Š\7B¥ðûî8F'¢¸Kõãë oH^üc›å³!Ñ|ñßôìÿhI%!øê©¼IjY'ž†Géñ‡ hMfdÿþ½¿Ïendstream endobj -2562 0 obj << -/Type /Page -/Contents 2563 0 R -/Resources 2561 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2549 0 R ->> endobj -2564 0 obj << -/D [2562 0 R /XYZ 56.6929 794.5015 null] ->> endobj 2561 0 obj << -/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F55 1311 0 R /F53 1303 0 R /F62 1352 0 R /F63 1355 0 R >> -/XObject << /Im2 1341 0 R /Im3 1500 0 R >> +/Type /Page +/Contents 2562 0 R +/Resources 2560 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2548 0 R +>> endobj +2563 0 obj << +/D [2561 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2560 0 obj << +/Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F55 1311 0 R /F53 1303 0 R /F62 1351 0 R /F63 1354 0 R >> +/XObject << /Im2 1340 0 R /Im3 1499 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2567 0 obj << +2566 0 obj << /Length 2383 /Filter /FlateDecode >> @@ -12379,31 +12362,31 @@ e' àŠ8ïŸÑiÿôDÞ?ùîõ®«‚¢§¶eq¨cgÕˆŽô؇Ÿ>™`3™vÔ(ÑæeqÞO=.Bè7yaG†ýáŸÓž/:ƒcɉ”ãHÁi)*…†RiU—ü†9ÖýßÙ¾ endstream endobj -2566 0 obj << +2565 0 obj << /Type /Page -/Contents 2567 0 R -/Resources 2565 0 R +/Contents 2566 0 R +/Resources 2564 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2549 0 R +/Parent 2548 0 R +>> endobj +2567 0 obj << +/D [2565 0 R /XYZ 85.0394 794.5015 null] >> endobj 2568 0 obj << -/D [2566 0 R /XYZ 85.0394 794.5015 null] +/D [2565 0 R /XYZ 85.0394 388.8031 null] >> endobj 2569 0 obj << -/D [2566 0 R /XYZ 85.0394 388.8031 null] +/D [2565 0 R /XYZ 85.0394 246.2919 null] >> endobj 2570 0 obj << -/D [2566 0 R /XYZ 85.0394 246.2919 null] +/D [2565 0 R /XYZ 85.0394 128.907 null] >> endobj -2571 0 obj << -/D [2566 0 R /XYZ 85.0394 128.907 null] ->> endobj -2565 0 obj << -/Font << /F37 1018 0 R /F22 953 0 R /F62 1352 0 R /F63 1355 0 R /F41 1208 0 R /F21 930 0 R /F55 1311 0 R /F53 1303 0 R /F39 1151 0 R /F48 1228 0 R >> -/XObject << /Im2 1341 0 R /Im3 1500 0 R >> +2564 0 obj << +/Font << /F37 1018 0 R /F22 953 0 R /F62 1351 0 R /F63 1354 0 R /F41 1208 0 R /F21 930 0 R /F55 1311 0 R /F53 1303 0 R /F39 1151 0 R /F48 1228 0 R >> +/XObject << /Im2 1340 0 R /Im3 1499 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2574 0 obj << +2573 0 obj << /Length 1411 /Filter /FlateDecode >> @@ -12413,57 +12396,57 @@ x ±ièâmñUcPºÜ¨‰ËÃÞUoÅH½%dÄŒL‹8¼´VB²Ð ¬Š°,¤p­°-¤òdú\´–‡xM®>†PÕ'ô¹ú¨{YDºž* )™Â=ƒV`ØE¶•’3TÑ’¼±‘ç"î¦Eäv'.-[E·þ°!Œ‹a%çKïÔ:‡ µoÓé|Úó¦5WB¿|õ"ý½›Éùá[W>]€ƒ‹/,u@Þ£Ÿ_{ PÌ¢À–åO¹îÒ˜! O·Ÿ}Ûeî¶Û;ÿå×ixq³½tǵž,WfЗ=´EY´Ç×^¹,Dêi:råÄ]Hÿó øôÞbÄ’„ž·@Ž‘S[£”ã$Âg¦»·ò¹íÿ÷ )íendstream endobj -2573 0 obj << +2572 0 obj << /Type /Page -/Contents 2574 0 R -/Resources 2572 0 R +/Contents 2573 0 R +/Resources 2571 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2549 0 R +/Parent 2548 0 R +>> endobj +2574 0 obj << +/D [2572 0 R /XYZ 56.6929 794.5015 null] >> endobj 2575 0 obj << -/D [2573 0 R /XYZ 56.6929 794.5015 null] +/D [2572 0 R /XYZ 56.6929 751.9132 null] >> endobj 2576 0 obj << -/D [2573 0 R /XYZ 56.6929 751.9132 null] ->> endobj -2577 0 obj << -/D [2573 0 R /XYZ 56.6929 674.8216 null] +/D [2572 0 R /XYZ 56.6929 674.8216 null] >> endobj 882 0 obj << -/D [2573 0 R /XYZ 56.6929 634.4081 null] +/D [2572 0 R /XYZ 56.6929 634.4081 null] +>> endobj +2577 0 obj << +/D [2572 0 R /XYZ 56.6929 597.1931 null] >> endobj 2578 0 obj << -/D [2573 0 R /XYZ 56.6929 597.1931 null] +/D [2572 0 R /XYZ 56.6929 564.5425 null] >> endobj 2579 0 obj << -/D [2573 0 R /XYZ 56.6929 564.5425 null] +/D [2572 0 R /XYZ 56.6929 496.4842 null] >> endobj 2580 0 obj << -/D [2573 0 R /XYZ 56.6929 496.4842 null] +/D [2572 0 R /XYZ 56.6929 434.3126 null] >> endobj 2581 0 obj << -/D [2573 0 R /XYZ 56.6929 434.3126 null] +/D [2572 0 R /XYZ 56.6929 259.4673 null] >> endobj 2582 0 obj << -/D [2573 0 R /XYZ 56.6929 259.4673 null] ->> endobj -2583 0 obj << -/D [2573 0 R /XYZ 56.6929 194.3308 null] +/D [2572 0 R /XYZ 56.6929 194.3308 null] >> endobj 886 0 obj << -/D [2573 0 R /XYZ 56.6929 153.9173 null] +/D [2572 0 R /XYZ 56.6929 153.9173 null] +>> endobj +2583 0 obj << +/D [2572 0 R /XYZ 56.6929 116.8171 null] >> endobj 2584 0 obj << -/D [2573 0 R /XYZ 56.6929 116.8171 null] +/D [2572 0 R /XYZ 56.6929 84.0518 null] >> endobj -2585 0 obj << -/D [2573 0 R /XYZ 56.6929 84.0518 null] ->> endobj -2572 0 obj << +2571 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F39 1151 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2588 0 obj << +2587 0 obj << /Length 3959 /Filter /FlateDecode >> @@ -12483,27 +12466,27 @@ j 6úBƒ1“BƒÄT·ùaÓÑÖiæB.-Ud´RW„ÆÈYËÔØÀç1Æà‚’Ø©Òøõs‚›}lŽ&¨Á‰„Ïk>}™·e¢é`H^«D81V8œ)’fÁ/-ãKP'„HF@ü4ý‚%éðà„(•=ÆEÕ® mÏï8X¨8 ÓLÅS¢.KWvÏ\M6“Ó›dbb:pÞ‚ãŒi•ä\Áš ü€ÛÙR s›ªæCf5„Vó†M™ïi¨+ÿ@¢i ¹¨ óÛüH³Ku_µ•ÍŠ7e§ÔºÝ¡ó•w-†~‚B¿ñK“{œâ§ÀÂ8ö‡ôæJƒ•}ÊšûÌþl 0€„ì+vží,¿±~ÖzJ©N{ŸDÆOº ˆ¶ÒlZÆ|á‹þT§F>+ø“Ãkµ‹ôÚKÛ˜ˆœf&8?¢ûxÓò±ÆŠ8 3­¥ïSô&ÿÖþˆüŽ™Ñ$ñ†@Ïòyh?rl Wõ‹ _KÄTa¶y×~ƒ±˜´r‘ˆáéÚ½X$Â=prÕÂ÷[ È;“¤¿ŸŠ…§¿XPAØÇÔ8LT"¢ùÄ„2êKá}ý‚«´\.IœÎ%T—ÄïØß$¶(Ù`]ši&cB.=‹ø) ëªË£ã4Ê!S5†¬õ-œäÁ< I9z½`°'à–!&ØåPõ؃$X¸h¬Áƒq¤7ÂhW’m§'öÔV‹$T™vÈÿø‚ü;üZ€µýú/ú­Æß®Ê.l•ÝL-”ŸA2ÿ›ŒkqÞJ|&ûjÿ‰£wûêÞ¯Óë2Ñ+yŽ÷&åÀÞPÒŽcÞã°—Ó˜ V`—<ÁNˆâþé M¾}ÖòºEP•§Œlà»39WX[ÀZ—-Ó~J…/ר?²Â·Ý•«êö8<¯Ãؼ6`\©Á`V¤£`×vlm^ Á.¶ÇÁ.Ö* ÷¦f°ëÊû⹂äÅÌËPý½ ^¢s£þ©‚Ruû(G_<¨^â¯"?3“BßÓÿÚ‹dH°ÑX%È‚UüÍé³iÀP,@;;êsÉZœ|C‹ëFØ<< 0“ÒùŒÅÆï£4}”_K“¹hC(÷ž$œ£})…pWÊìªft { ²ˆIFReSþ¡@ÑÃ'E£ëÌß3Pè>jµx¢Ö(Œ‡§f”sig]ù‡ú+˜ù`˜E"b4ë<0–ï«¢(k”« Qðª©ërÕ§W|yãHe4Qar¤¥ÄàZ 1(Y@®z.Ëa#§W$ W÷°qÛj¶?U}â׋‚CWɽÏ÷/÷‡šÊL/!¯o±´xÂ+Æø³µTž°ˆ )’Iz¯ç ±m„<Ìcê7 ¬4Ç:Vsßk-þÇô?:¨nù%°>Rƒ©¬Ìðà æß|Akóûb[úB¡3ȉœØJ/vͦZOØê,r–ÝûØ„%Þšvßf:ÍÌ`óS¥ù÷;|§á­´¹u/•ö—F²ñ5C¬5>%µË C2zFæA˜ŸW“2à…Íð‹Ï'KRfj‡§~7 ¡>x~Mõóÿ÷oª‡ßŽëb“L?—–³_&) ™C щ˜£Þÿúú1îÿ´qãendstream endobj -2587 0 obj << +2586 0 obj << /Type /Page -/Contents 2588 0 R -/Resources 2586 0 R +/Contents 2587 0 R +/Resources 2585 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2549 0 R +/Parent 2548 0 R +>> endobj +2588 0 obj << +/D [2586 0 R /XYZ 85.0394 794.5015 null] >> endobj 2589 0 obj << -/D [2587 0 R /XYZ 85.0394 794.5015 null] +/D [2586 0 R /XYZ 85.0394 749.2922 null] >> endobj 2590 0 obj << -/D [2587 0 R /XYZ 85.0394 749.2922 null] +/D [2586 0 R /XYZ 85.0394 666.7399 null] >> endobj -2591 0 obj << -/D [2587 0 R /XYZ 85.0394 666.7399 null] ->> endobj -2586 0 obj << +2585 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2594 0 obj << +2593 0 obj << /Length 3279 /Filter /FlateDecode >> @@ -12521,24 +12504,24 @@ Uk G”R•ýñF§iwMU3Ì…«]Ÿ>Ú×ôŽ"b.H$µÝ8ÅŽs×®d´‡8Óï;A’±ëêÛÓ¶îêë­/%Ï„Èt”ƒo^†‰ë_¸Ã¯cS*OSR$”üø?!\ÿ~6tdi°ÀåÈ™.3YÔÚ.£ÚáÙÈ‘™¹(‚g:•á$rb#'BØÀÙ<_ªY¬pü«ð+.PfU(¼ÇÁùNý3^–§“Jòû+¨@ku?+ܵvnøê~îGJ¶¼‹Á3fÏ!ð u]6{ÀtÞìŽÉ6†­»£Ú“OLCŠŽÅÅÝÏéîÓcÆp{ƒ‹K¸ýhpw­ÄÁäGoþ§…˜áž[ÛÂÆ_4èZáïªa¯5àw¿pC>~2©N~ß™â\žŒ)½=s,'§ƒ¿¤o«bæH\f¸›'GQ¦ˆÎý³›Òþ‡ÚŒöcï?ÿ÷?Âÿð—`!—ó†”ê 6nX(”]¤òÔoù_æNeÿ“Qcêendstream endobj -2593 0 obj << +2592 0 obj << /Type /Page -/Contents 2594 0 R -/Resources 2592 0 R +/Contents 2593 0 R +/Resources 2591 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2597 0 R +/Parent 2596 0 R +>> endobj +2594 0 obj << +/D [2592 0 R /XYZ 56.6929 794.5015 null] >> endobj 2595 0 obj << -/D [2593 0 R /XYZ 56.6929 794.5015 null] +/D [2592 0 R /XYZ 56.6929 507.1706 null] >> endobj -2596 0 obj << -/D [2593 0 R /XYZ 56.6929 507.1706 null] ->> endobj -2592 0 obj << +2591 0 obj << /Font << /F37 1018 0 R /F22 953 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2600 0 obj << +2599 0 obj << /Length 2967 /Filter /FlateDecode >> @@ -12557,24 +12540,24 @@ _í• ¡ÞÞÞoì-5ËPc?˜ˆn:]h?8òç}.¬Z;§–x0 ëU½Û¬íöúdzx×c/Æq@¡mÑt¶Ï ¡F‚Xñ'"ðH÷ûJfƒ™N¡$䣒Љƒ¬ = Ü5À°£“Ňº+m(Wþˆ$U>Uà9ùýÎeSôB—ÝÄ2-;®}qé§µo¹§É4úŒäc|p7Û ÕÖãÉsK}k—¸»7K£CìáOÆÜÝ•6bemœyÀ¹âÅÂrÕ¿­Õ?Yÿ¶+ÚQÌ ae ­hol6¾7ÀæžØÉÔeVæ½ÊIƒG¼ø¢ëþB¯L–LEW(™ˆóL¡œY"Ƭ+¡‰Òàœ‡¼ÿ•³¥endstream endobj -2599 0 obj << +2598 0 obj << /Type /Page -/Contents 2600 0 R -/Resources 2598 0 R +/Contents 2599 0 R +/Resources 2597 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2597 0 R +/Parent 2596 0 R +>> endobj +2600 0 obj << +/D [2598 0 R /XYZ 85.0394 794.5015 null] >> endobj 2601 0 obj << -/D [2599 0 R /XYZ 85.0394 794.5015 null] +/D [2598 0 R /XYZ 85.0394 107.2827 null] >> endobj -2602 0 obj << -/D [2599 0 R /XYZ 85.0394 107.2827 null] ->> endobj -2598 0 obj << +2597 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F53 1303 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2605 0 obj << +2604 0 obj << /Length 1792 /Filter /FlateDecode >> @@ -12588,39 +12571,39 @@ x JH ä«|êªâ0G»—×¥æÚW¦e;‡ù„†Ìmk£0‰:w̵#¥4„þTÛÝš;Ç6+â(›yf9×E"Ú׃b? ½ìÛà:bߊKïèžØhƒ‘„¾ïlçmuÓ”ä’0`Ü2ˆì q8 u-ÓýKRÈÖ7=‚\F—³Ug ‹”Ž.à ñ’B•ƽ£až£î¨¹öýч›•ç¶r)9ñ\„„ÌãÂ$+Ó3´¿]OÏ&×碃´C!m=pWè\A¹:Æ{™›:¶.[{±Æ= ü öÌti–é Úf›>ØKA lÜ!” ÷¨?j¦=‡´¡Æ!š1/hy¤F ›HÓ=4Ý>#M÷ Ò4ÑBš¸³GÖÍÇP¶óò|6CÐNßÏÿÀu—p|Â8nk³0ÁYòznàR*?ké“y‚ˆ@ø–¡Ç)õ_Qœø|Mq+^Qœ©k_Q;]þgqÞž¸³7Lf"DRÃîßåD[MHšõáÐ8‚xŒúíbø_ ¸SU¾ýx9ï¿#hYã:£Å˜°b€Æñá'¬ÞT’]žDy™ÙIUv™L1m ¢ ¤•ÜD[¼ BnEý𩾔Á¥Ð^ÊôÇ …FØ#)}“ÌͽÆM‰úÝÂŒîf$½êª÷-ã|¾°%Nz·¶ÝJ(­Š¨xû´)‹ûm´Y¥±Íq ªC‰§Nì»Ln³Ùºz’‰WQ~ß©¥–»r÷|q®žz2 !N5çîzµãq<.ê÷Sa”§yW›‚hûlqS§Ÿ½Ç ¨®}7Ĭ ¿Æ#ÇñѸ"/šEf Ä2ÍÒòéÐC,¤ýzÚ“hÈŸ~¤}~„vácRw´UJïœyî~EaŸs÷uÿ¡©Ÿendstream endobj -2604 0 obj << +2603 0 obj << /Type /Page -/Contents 2605 0 R -/Resources 2603 0 R +/Contents 2604 0 R +/Resources 2602 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2597 0 R +/Parent 2596 0 R +>> endobj +2605 0 obj << +/D [2603 0 R /XYZ 56.6929 794.5015 null] >> endobj 2606 0 obj << -/D [2604 0 R /XYZ 56.6929 794.5015 null] +/D [2603 0 R /XYZ 56.6929 462.0323 null] >> endobj 2607 0 obj << -/D [2604 0 R /XYZ 56.6929 462.0323 null] +/D [2603 0 R /XYZ 56.6929 288.682 null] >> endobj 2608 0 obj << -/D [2604 0 R /XYZ 56.6929 288.682 null] ->> endobj -2609 0 obj << -/D [2604 0 R /XYZ 56.6929 209.4795 null] +/D [2603 0 R /XYZ 56.6929 209.4795 null] >> endobj 890 0 obj << -/D [2604 0 R /XYZ 56.6929 155.6441 null] +/D [2603 0 R /XYZ 56.6929 155.6441 null] +>> endobj +2609 0 obj << +/D [2603 0 R /XYZ 56.6929 121.3428 null] >> endobj 2610 0 obj << -/D [2604 0 R /XYZ 56.6929 121.3428 null] +/D [2603 0 R /XYZ 56.6929 84.4903 null] >> endobj -2611 0 obj << -/D [2604 0 R /XYZ 56.6929 84.4903 null] ->> endobj -2603 0 obj << +2602 0 obj << /Font << /F37 1018 0 R /F41 1208 0 R /F22 953 0 R /F21 930 0 R /F48 1228 0 R /F14 956 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2614 0 obj << +2613 0 obj << /Length 3314 /Filter /FlateDecode >> @@ -12645,33 +12628,33 @@ r aÑD¿Ú(Â4çç[qȘEþ.Gmrñ͇ÝS\Ä$O[Á]§y¦†•Ï6i€›³Q“ÜF}‚§}¹¬PãËÕ›©#z¹¯è0Ê!\rÑÒF²R¼1š/.±tå6j+ëøcóK„ÇxüøëÂKʆ•&>ÚÆÇ€K܇ҵĀFeo|—1‡€BÂP—0H—廡2ŠùUóKŸ~„¦oÙöNOMß!ÈCÏ)mžõÙüÂeÛØM °ñ¹¿QQ¯jèÄzžSmdÔ¶ÅõüScsdjúžušífÂÂlâ:„®¨ì‚07©pv°c’(˜ªœ÷)<2ÑxR.4DÄ“åh3§ÑÙd0ºA °])uߌJø°¢coÝÄÅXL×í`SºôË3¸¸PV/Ó¶¤o´B CWÅ}§ñƒ}K†Š„´¥‹ý¶´$Ö':¶G€h³;”0ùð2•ê0…Í¿-¾ k—#Þ|à ã7«]UWோ.lä—rí…Y/ýk‹ú2sR VÊÓ# ¢;\ƒnÔ{€l²¾øòUéÞOͱ›hè§zâvi{;~fSn÷¾3èî’Éö8ipá4O»<ÿ¼ýx{o¿¿Ã}ÇçÿýF&Ú¯"ÅjùRvÉç}¯`ÜíL $NŒGéP>™)kbxßá;óiŒÁÅèÓÆXè‹pð´&g,Õþû`wXX4΋ÂoômÅÈú`ø}.< ó€¨ƒ€àÌ`&ñNܤQ<;×̱¤3Q4W"L¥/…x‚ÀÕ«ðÛ0ûöÏÓ[ O¿;Ä0òjV½Üñ>Sl¶{l]pÅÍ «SÇÀ(žú\ YLV ho'ßü)éð©¬Äî^Χ3A!Y ¤ž)Ü4Óê$R žòþ?†â¾endstream endobj -2613 0 obj << +2612 0 obj << /Type /Page -/Contents 2614 0 R -/Resources 2612 0 R +/Contents 2613 0 R +/Resources 2611 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2597 0 R +/Parent 2596 0 R +>> endobj +2614 0 obj << +/D [2612 0 R /XYZ 85.0394 794.5015 null] >> endobj 2615 0 obj << -/D [2613 0 R /XYZ 85.0394 794.5015 null] +/D [2612 0 R /XYZ 85.0394 749.4437 null] >> endobj 2616 0 obj << -/D [2613 0 R /XYZ 85.0394 749.4437 null] +/D [2612 0 R /XYZ 85.0394 680.7174 null] >> endobj 2617 0 obj << -/D [2613 0 R /XYZ 85.0394 680.7174 null] +/D [2612 0 R /XYZ 85.0394 501.4297 null] >> endobj 2618 0 obj << -/D [2613 0 R /XYZ 85.0394 501.4297 null] +/D [2612 0 R /XYZ 85.0394 100.9714 null] >> endobj -2619 0 obj << -/D [2613 0 R /XYZ 85.0394 100.9714 null] ->> endobj -2612 0 obj << +2611 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2622 0 obj << +2621 0 obj << /Length 2462 /Filter /FlateDecode >> @@ -12682,42 +12665,42 @@ xÚ¥Y_s WBF/57‘Jù GÍnsëãep¨ßì&R"€4P†éùÚ°Áå]êÝ yéŠq3<œ}ÓÒ|â¦^JêÊð&êÊgêº#Ãaæð$Jà8º L!_¡¼¦ëË"|x‹Ç&Þï! ctŒ¿}«ùEáÝv¸¹î "ã°Q¾”`ÊâÏ’FDÑX¿¡j@ ÷¯4@@»ûm„ïoʘš»ÛWKˆÕ̉Á¤ñ òP$öÂC|W½àŠY=ÜÚ ðØ9¾4ÈܤÉ'•Cy–ö$ñï,ÁS£²wáI<…aHÕeüüª .Wd™Äˆæß¨#©?rA9Æ¿L%ž³ùðýÿlÿ§Á,gÊZ™þÛ–Ì5ÞÄLT ­'Œ9R=þ©ìX÷¿òzWqendstream endobj -2621 0 obj << +2620 0 obj << /Type /Page -/Contents 2622 0 R -/Resources 2620 0 R +/Contents 2621 0 R +/Resources 2619 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2597 0 R +/Parent 2596 0 R +>> endobj +2622 0 obj << +/D [2620 0 R /XYZ 56.6929 794.5015 null] >> endobj 2623 0 obj << -/D [2621 0 R /XYZ 56.6929 794.5015 null] +/D [2620 0 R /XYZ 56.6929 713.9465 null] >> endobj 2624 0 obj << -/D [2621 0 R /XYZ 56.6929 713.9465 null] ->> endobj -2625 0 obj << -/D [2621 0 R /XYZ 56.6929 649.6644 null] +/D [2620 0 R /XYZ 56.6929 649.6644 null] >> endobj 894 0 obj << -/D [2621 0 R /XYZ 56.6929 609.8446 null] +/D [2620 0 R /XYZ 56.6929 609.8446 null] +>> endobj +2625 0 obj << +/D [2620 0 R /XYZ 56.6929 576.4481 null] >> endobj 2626 0 obj << -/D [2621 0 R /XYZ 56.6929 576.4481 null] +/D [2620 0 R /XYZ 56.6929 540.5004 null] >> endobj 2627 0 obj << -/D [2621 0 R /XYZ 56.6929 540.5004 null] +/D [2620 0 R /XYZ 56.6929 473.2964 null] >> endobj 2628 0 obj << -/D [2621 0 R /XYZ 56.6929 473.2964 null] +/D [2620 0 R /XYZ 56.6929 411.9792 null] >> endobj -2629 0 obj << -/D [2621 0 R /XYZ 56.6929 411.9792 null] ->> endobj -2620 0 obj << +2619 0 obj << /Font << /F37 1018 0 R /F53 1303 0 R /F22 953 0 R /F21 930 0 R /F39 1151 0 R /F48 1228 0 R /F41 1208 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2632 0 obj << +2631 0 obj << /Length 2068 /Filter /FlateDecode >> @@ -12729,24 +12712,24 @@ m L»¼(P®‡[°UHN$"¶G´y¯Uà¥#ÿL¡¡àšPø1˜0äÂ6”…‰ø¼À{ÙG`¸úgDiz¼Cxvˆ Žã)HW9ÇËÉýû]8iôÞX Ö ~6ÈG¢®{Ä +åE³îÊÚm’fÎWÞ6 {Œ6™ 2T P÷gÎíᬓp·…{¯ m"Gñ·0„ûLTæ–ß9RÕÐùú²  ›cASË¡!rô¼Jó%Pšnì¸OðÐDùÚúÊå·94 ßœ²¨O@O©4ËÛðéó›æ7# ¯› €¾}€þ”BHø~ëÖæój"[ ¬ÛQ²B.°há,‚Öjp¡¼ŸÄÚ#;é |šðñUMì¨$ÑR<\´ÖGõ¤ƒ¿+À*aƒ‰‡jÀ‰q¾+^QnÁ]Q¦x(¢Ë7 …bÀúòŽ•€ pOãÈ=ÅÔèüUEá¯Gñˆ³FçéófKKðlÜ÷¾ùp³S"ÀˆÀüE€VfXß9µÐ„ƒÓGñ€Ü£ð9s¸u@ò­z|QÐxËQå'Núô“ƒÒý«V÷ˆÎÎ!Ä·˜.n;ìòLp#$ké»~spvŠŒƒÒèÄ`ȸWÝÿ’¼Íª ¶Š×þý¥J±M»ëSg>ÎÈzÛú>Á£jWó¡Beé¢FÔ~äÆ(ÑV|ü5ŠÉûtpÕgBŽ%BéŽÇÕœM]4S~…P½Ÿ¶Xý}á±$Ö¨.Õ\±N?tl1t‹qܱöݾv¼u`tÍ–_Á.†hö4ÇÒƒI3~¶øÔ¬‰‰2F?Ü©IK ëûüÉŒa6&Ò½HŽ’=[®kÄi'¡uôø·HœÉ¿ì["7Hšõ¨í'âßP¹©wXd®ÒL¼šÒFþÏo´‡Gj©‰0†O?¿B«N„°¬SÊ9‚ÅúXõþ5÷}Ýÿ>œ´endstream endobj -2631 0 obj << +2630 0 obj << /Type /Page -/Contents 2632 0 R -/Resources 2630 0 R +/Contents 2631 0 R +/Resources 2629 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2597 0 R +/Parent 2596 0 R +>> endobj +2632 0 obj << +/D [2630 0 R /XYZ 85.0394 794.5015 null] >> endobj 2633 0 obj << -/D [2631 0 R /XYZ 85.0394 794.5015 null] +/D [2630 0 R /XYZ 85.0394 627.5418 null] >> endobj -2634 0 obj << -/D [2631 0 R /XYZ 85.0394 627.5418 null] ->> endobj -2630 0 obj << +2629 0 obj << /Font << /F37 1018 0 R /F53 1303 0 R /F22 953 0 R /F41 1208 0 R /F21 930 0 R /F48 1228 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2637 0 obj << +2636 0 obj << /Length 2488 /Filter /FlateDecode >> @@ -12763,48 +12746,48 @@ e ÈHtŒÜ¬eL½MnûRÇÉm’r.·lbèrmRÀ{—l}Ó¤g„½m[’Ê7Œ20IBÕк»D·lºs> À õT`Ô<‚>¨ævÎlA&ª®µÔ€9~öƒìdŸÝKYI´ºdƒ Ô˜Sñ/ê”Ùc :uF†¼fÇHì7…vBõÑhK8º7c½“9é ãâ\äâl¿×‘ÌÍç ÎÐŒ) ¼ä «’ÌYÃ3Ëúv} µ_£ò8ýS \6û:ѱÔì÷*œãﯱÛM-©»¥èÑ¢Ý/ÓuÙðÔkh¬ÞÑöp «þWÜgZhsí=UƵ85ÆÿøîîS5·wiúHC W£¬áDêÃ\ {mÿ?»³· endstream endobj -2636 0 obj << +2635 0 obj << /Type /Page -/Contents 2637 0 R -/Resources 2635 0 R +/Contents 2636 0 R +/Resources 2634 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2647 0 R +/Parent 2646 0 R +>> endobj +2637 0 obj << +/D [2635 0 R /XYZ 56.6929 794.5015 null] >> endobj 2638 0 obj << -/D [2636 0 R /XYZ 56.6929 794.5015 null] +/D [2635 0 R /XYZ 56.6929 752.3759 null] >> endobj 2639 0 obj << -/D [2636 0 R /XYZ 56.6929 752.3759 null] +/D [2635 0 R /XYZ 56.6929 668.0781 null] >> endobj 2640 0 obj << -/D [2636 0 R /XYZ 56.6929 668.0781 null] ->> endobj -2641 0 obj << -/D [2636 0 R /XYZ 56.6929 607.6906 null] +/D [2635 0 R /XYZ 56.6929 607.6906 null] >> endobj 898 0 obj << -/D [2636 0 R /XYZ 56.6929 570.577 null] +/D [2635 0 R /XYZ 56.6929 570.577 null] +>> endobj +2641 0 obj << +/D [2635 0 R /XYZ 56.6929 534.8112 null] >> endobj 2642 0 obj << -/D [2636 0 R /XYZ 56.6929 534.8112 null] +/D [2635 0 R /XYZ 56.6929 503.6098 null] >> endobj 2643 0 obj << -/D [2636 0 R /XYZ 56.6929 503.6098 null] +/D [2635 0 R /XYZ 56.6929 440.3004 null] >> endobj 2644 0 obj << -/D [2636 0 R /XYZ 56.6929 440.3004 null] +/D [2635 0 R /XYZ 56.6929 370.9227 null] >> endobj 2645 0 obj << -/D [2636 0 R /XYZ 56.6929 370.9227 null] +/D [2635 0 R /XYZ 56.6929 274.6697 null] >> endobj -2646 0 obj << -/D [2636 0 R /XYZ 56.6929 274.6697 null] ->> endobj -2635 0 obj << +2634 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F39 1151 0 R /F53 1303 0 R /F55 1311 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2650 0 obj << +2649 0 obj << /Length 2259 /Filter /FlateDecode >> @@ -12819,39 +12802,39 @@ RLmLIņH &u¡×KŽàAÊB}±×‚4מêµÎê5ôZÇzE{­‰b>v­»lìJ~*v9JSAÎÆ.X™=ÝJ<éŠþn;h^k[N™áz¶ÿ´˜eêE¬ÿòú^p(È`_¶ÛHe€-¨Ìš $ðЗî^W!ÀkˆA,ɪ.œrÈϹ'aJ|¬§oêêm–ƒÕ£©ôf/‘0¾Í*üÕØ&ó‰ª W[Á´Â¥â_FÙãz¬¡ƒvKHšL!"<©ßþvóùáÓícäô¾ :õ> endobj +2650 0 obj << +/D [2648 0 R /XYZ 85.0394 794.5015 null] >> endobj 2651 0 obj << -/D [2649 0 R /XYZ 85.0394 794.5015 null] +/D [2648 0 R /XYZ 85.0394 390.6346 null] >> endobj 2652 0 obj << -/D [2649 0 R /XYZ 85.0394 390.6346 null] +/D [2648 0 R /XYZ 85.0394 257.7108 null] >> endobj 2653 0 obj << -/D [2649 0 R /XYZ 85.0394 257.7108 null] ->> endobj -2654 0 obj << -/D [2649 0 R /XYZ 85.0394 193.2733 null] +/D [2648 0 R /XYZ 85.0394 193.2733 null] >> endobj 902 0 obj << -/D [2649 0 R /XYZ 85.0394 153.3455 null] +/D [2648 0 R /XYZ 85.0394 153.3455 null] +>> endobj +2654 0 obj << +/D [2648 0 R /XYZ 85.0394 116.3439 null] >> endobj 2655 0 obj << -/D [2649 0 R /XYZ 85.0394 116.3439 null] +/D [2648 0 R /XYZ 85.0394 83.9066 null] >> endobj -2656 0 obj << -/D [2649 0 R /XYZ 85.0394 83.9066 null] ->> endobj -2648 0 obj << +2647 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F55 1311 0 R /F41 1208 0 R /F48 1228 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2659 0 obj << +2658 0 obj << /Length 3141 /Filter /FlateDecode >> @@ -12870,33 +12853,33 @@ l þ¡BÒúãõÍ;zÓzÁŠ d˜m·Ã‘¦~/c±“M  S¿æõ>}l‚4’>cNv)Cq0üµT4x¯ÆÿùGY‡Ÿé”)¨Ýâð#SÀ c/ .R~ŒÄþç[Dzÿ!ºãendstream endobj -2658 0 obj << +2657 0 obj << /Type /Page -/Contents 2659 0 R -/Resources 2657 0 R +/Contents 2658 0 R +/Resources 2656 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2647 0 R +/Parent 2646 0 R +>> endobj +2659 0 obj << +/D [2657 0 R /XYZ 56.6929 794.5015 null] >> endobj 2660 0 obj << -/D [2658 0 R /XYZ 56.6929 794.5015 null] +/D [2657 0 R /XYZ 56.6929 749.2278 null] >> endobj 2661 0 obj << -/D [2658 0 R /XYZ 56.6929 749.2278 null] +/D [2657 0 R /XYZ 56.6929 677.9694 null] >> endobj 2662 0 obj << -/D [2658 0 R /XYZ 56.6929 677.9694 null] +/D [2657 0 R /XYZ 56.6929 495.229 null] >> endobj 2663 0 obj << -/D [2658 0 R /XYZ 56.6929 495.229 null] +/D [2657 0 R /XYZ 56.6929 83.499 null] >> endobj -2664 0 obj << -/D [2658 0 R /XYZ 56.6929 83.499 null] ->> endobj -2657 0 obj << +2656 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F41 1208 0 R /F53 1303 0 R /F22 953 0 R /F55 1311 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2667 0 obj << +2666 0 obj << /Length 971 /Filter /FlateDecode >> @@ -12904,120 +12887,115 @@ stream xÚ½VMoã6½ûWèhË‘"ÎÚÝz±q\Û Èæ µäD€Ey-9Aúë;IYr”EŠÂIÃÇáðÍã3I€áGÉf* b!Ž vÅ0öyD&ô °‹ºÙŽ~ýÅBJPl÷\a)I°MïÇÓÕj¾œ-þœ„”ãñ š„ãñítùmúÕÆVEÇÓÏó |G"ÒàO×vt9½O¶_Fóm[V·t‚™©éçèþ)ìàË#¦$^à#¢ ŠQÄâc>rmF´ ;£ÍÔ!*8“ˆKpAI@RœÓ\!Á(³d|Ûþ~·68íP‡ƒÆH`eq ]g'Õ– ÍkUgEe?>•º*Ou~.\X5B,Ôå‰bLª&ar Œ'§c¢“"3³ ŒÅˆÑH6°¥‹¿-ŠHÓÕfhêøNilßêS¢«CR»ÅÊ>“4=MˆgU•¹ÚëÒ=ŸvWžæXê4×6ì»n¿ÌšÕe³ŠÍf ìÇM}›W]«¼ºÖ‰€f3è$¢$&C}%°kÊ#xÔ?F˜KÓýNЦçЋê±Öl€³äG…˜ cÀ–Eö2[$sH„ÐÐçq%xŸ–Ù|ói½XmwËvÖ»ÂëWÛSC#I„¯¶m:´–a×u¥®»n†¾cŽ«çÈtêg< "6l¤a¢VF3kNg³5êHÀåÉç—#ôÐW¶DAñ¢Ð?JJXIÍçN‘_7wÏÔûìÝ,–3‹WnZZä:¯€¬Ú”hBëlŸÙé;·‰>'‡ʉ! !|߇»îA½®ÿN#½Ó(ç4™q¤eÑ·õ/¬æ’âÊk` ;µV“¸aŒé¡u]'À¹·’nš4©“ÿÀGìÇä#>ÒMñ¾´¨+J|êG‘ ÙžQ}.~€ÖÞÚ ˆÒˆ8ØÃ@"ÏŽETù_™]vŸ²Ž?\)Z(ÿˆÿô´s¥Α”±7A¯c226R`R´R0¡ÆüP<®ŒÈ ¦Üۀźù]ÝŸtÌv¹f© ü<'ºÎë×~ªc•Ó2ô 2!#¶_¬ùÂ{ôò”ïžœfm_~8Ÿ+³\£ðª§ôª<7Þáìož™®›xy|µ½·› õäFQ@.céÖ¬ºGþ%¯]Mº8?Ùs¾ËÐ{÷0Æ‘¹< ·2ùðírgó¡—ëWW+ ƒS1E|Q†qøG¾.½½Í½­ýoŒ ²*endstream endobj -2666 0 obj << +2665 0 obj << /Type /Page -/Contents 2667 0 R -/Resources 2665 0 R +/Contents 2666 0 R +/Resources 2664 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2647 0 R +/Parent 2646 0 R +>> endobj +2667 0 obj << +/D [2665 0 R /XYZ 85.0394 794.5015 null] >> endobj 2668 0 obj << -/D [2666 0 R /XYZ 85.0394 794.5015 null] ->> endobj -2669 0 obj << -/D [2666 0 R /XYZ 85.0394 751.5568 null] +/D [2665 0 R /XYZ 85.0394 751.5568 null] >> endobj 906 0 obj << -/D [2666 0 R /XYZ 85.0394 708.6012 null] +/D [2665 0 R /XYZ 85.0394 708.6012 null] +>> endobj +2669 0 obj << +/D [2665 0 R /XYZ 85.0394 670.3846 null] >> endobj 2670 0 obj << -/D [2666 0 R /XYZ 85.0394 670.3846 null] +/D [2665 0 R /XYZ 85.0394 636.5029 null] >> endobj 2671 0 obj << -/D [2666 0 R /XYZ 85.0394 636.5029 null] +/D [2665 0 R /XYZ 85.0394 564.786 null] >> endobj 2672 0 obj << -/D [2666 0 R /XYZ 85.0394 564.786 null] +/D [2665 0 R /XYZ 85.0394 498.9559 null] >> endobj 2673 0 obj << -/D [2666 0 R /XYZ 85.0394 498.9559 null] +/D [2665 0 R /XYZ 85.0394 418.2058 null] >> endobj 2674 0 obj << -/D [2666 0 R /XYZ 85.0394 418.2058 null] ->> endobj -2675 0 obj << -/D [2666 0 R /XYZ 85.0394 349.4108 null] +/D [2665 0 R /XYZ 85.0394 349.4108 null] >> endobj 910 0 obj << -/D [2666 0 R /XYZ 85.0394 306.4553 null] +/D [2665 0 R /XYZ 85.0394 306.4553 null] +>> endobj +2675 0 obj << +/D [2665 0 R /XYZ 85.0394 268.1239 null] >> endobj 2676 0 obj << -/D [2666 0 R /XYZ 85.0394 268.1239 null] +/D [2665 0 R /XYZ 85.0394 234.3569 null] >> endobj 2677 0 obj << -/D [2666 0 R /XYZ 85.0394 234.3569 null] +/D [2665 0 R /XYZ 85.0394 162.6401 null] >> endobj 2678 0 obj << -/D [2666 0 R /XYZ 85.0394 162.6401 null] +/D [2665 0 R /XYZ 85.0394 96.81 null] >> endobj -2679 0 obj << -/D [2666 0 R /XYZ 85.0394 96.81 null] ->> endobj -2665 0 obj << +2664 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R /F39 1151 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2682 0 obj << -/Length 2018 +2681 0 obj << +/Length 2017 /Filter /FlateDecode >> stream -xÚ¥XÝ—·ç¯à­pOpý1Ÿd—$´Íf»°÷ôž4³ƒ9e†ú×W²ìa`g7͹‡‡‘eÙ’eé'Ñçðý0bQ*Ó~œ,ä"ìçÛï¯`î}O8™‘µ¥ÞÎ{?¾Sq?ei$£þ|ÙÚ+a[@%ˆôG‰ ÁÝ>Îpv­)QL¶Õì¥ÀŠâ”ñv5°ÚR/V#…ê«âo}­4 ¢àu¥^¨CiÛ0©â8¾T:÷g¶Ú-e¾;΃ÂÐ÷bS>jº,”.éëèeÿ ‚8ü†ÿZR¯øÏKáQå6+̵ÚT°0éëj½P‡Ú¶ÓQM^ª_ºéAÞ_Þ3Çu‘¯‰Ügfa³èEVgî -Öåa³ úÉ-?ֆ¹Ð¾Æ‘JY^TÌÂ"í™M&´tüËìSGFðþHFŒË€€MÁU˜…î.3›®y@f6³]6ðKåãÇù‡OßÖ:5µÞ]“¾Ù©ªõ¶¢ÁMiªr_‡íYxy}„”N£¦*BäPéŠ*­·Y>Â{øzØÙLGóBC²âwx-ÝÆ¥,Ž$áÀ³èz¥ŒÏýU;s±»ŒÐ§ê2ü]ž\bm€Q–üKï«z™qo§w·ÿÂɳ“)wUQ]‡º‚äI"ÕW”¡Ò®PGà“¶P½š~í-l]é×H]xmY8ïCT­U ”ïHy(Î6«b{ Y‰pPé|áÐå~óeÝídvó0½ŸO?ݽmt¡ÿ -!Ë•"—+™’Ë-'¥^7N`ÖâR€ˆÂ䛃­F× YDÄ:s¢‰<V4γCE ÌhöaüšÏ¦ïi‚â)B -¿í -uÔ63¢t°)ÍÊÐõ:3žrÓ‹b¥«Ú‰j³ª×DÛhk ®³ÊM¹KŠÞ r0ù ¦"C ÀnA.Ú_4CDœˆ§¢®Î«euÌíçÝ‚Ðï\\fY~7 u»ÎEK´¸ ßCe³fàÞÊ=¹-¯7' -n‡‹–Æ­ÝêªÊVn£ì~2u‘ƒ\iH./n,¬‰w̪˃QÛŽÚ·;XûäKñ¨](ag‡·w3W.¶»Þ‚B«®bÍž $AšºŠS` ÈÈEp…Ž£µ! -Q -.ò+úÇ…ã»À - _ *|( iw®QÖõ…B;’ßf'"0žµßÕŸ¯ØõÉQ;ê!‰¹ÔqùFéÆã6.®u.šü†ÈãZšt)…LŒ¢0ŽÎµò RH(•±Ãž®Rq… QÂ’ ‘nÁ¶\(kAÔÔë²Òd†ÜØ…`< X«ê²ÉUs^Qÿ)ZÇ¿ðƒs!h÷½ãûÍ*áÖ¢å‰h¶-9·3’ÁÁtø"….>áwù"NTäÛ,HmµÓyc YñCåì:C¼6 ë­kjSZµögméMa ™)¦KrŸˆS˜aí{rµ‚~„ äƒC:tIøye™@7™¸K5ÑíÓ%Üemûb"—垇œV/½†°ÙjM6›TÑ_ë½{d6°†|~o69S+ãÚ`»ä±.زJ_m½<˜ÜuF¸º&9ÔÁðä/ýÕ¯2ü°ã›´ù¿ÿ†<ÿáÄL%‰ì~ÖË8d°8òF¡·E,Ÿÿáþ°|nû?Ï|÷endstream +xÚ¥XÝ—·ç¯à­pOpý5_d—$´Íf»°÷ôž4³ƒ9…Ê %ô¯¯dÙÃÀÎnšs#˲%ËÒO2¢Ïá'úAÈÂD&ý(Ñ,à"ègÛï¯`î}O8™‘µ¥ÞÎ{?¾SQ?aI(Ãþ|ÙÚ+f<ŽE¾ø›¾§ Ф)\ü¶ËÔÑØÌDl“Á¦,V6 €®×iá)7½ÈW¦ª¨)VõšhmmÁuZ¹)w)C1À{A&Î Cdˆôì4á¢ýE3DȉxÊëê¼Za×ÁÜnZŸwÓß ¸¸Ì²ün@š:s튖$hq¾‡ÊfÌÀ½•{r[VoN6Ü}ŒSZ»5U•®ÜFéüTÔyreArY¹p³`aM¼cZ]ŒzwÔ¾ÝÁÚ'_Žyíª@ ;;<¸½›¹r±ÝmÌZuköŒ! ’ÄUœE†.€€+tc +¢¥à"¿¢pœ;¾ \ òð© âÁ‡òh’†pGàe]oP( °#ùmz"ãÙø]ýùòM^Ÿ¼õ±±Ã¡’˜K—_˜#ÝxÔÆEíúWà¢Éoˆ<®MA“.¥‰1CÆÑ¹VžA +Éâ rØÓU*®$ŒY¬célËE޲ôAM½.+CføÈ\Fеª.›\1ç¥5¡2 åpü ?8b€vß;>â¬n-Zžˆ¶a+Ð’spK0#Š_$ÐÊG"ø._D± +=p R[íLÖØ@`BVüP9»Îo‡ÍBÀz뚚ƔV­=ÀYÛFz“ÐQŽÓ%¹O„‚)̰Ž>¾Ú?ÆÎ¿ÂòÁ¡ ºÄü¼²L ÈŒ]Æ%ˆŒ†èöébn2ÔDÛæ˜Èe¹'Â!§ÕKO¢l¶Zñ{ž9…Œ» Åí®¸¤Ý·ëU¬‰I‹˜®¯SÂ&uAS)‰BæÑvÎó͆fP‘ÓêiA’æA'Žm==oL%Þ¥g!iýÝ¥o~ÏÖàÅ rîôúmrqÍØHçnyQ:MÿyÈ›L&XîPæM³¡{Øäµ‡h<}» ßí¡÷ý"xyp²¨>°Ù'Ï&7Óùÿ\Ëûén6½<Œ1Á±¥™}»ƒž5§ÇHãÊ—"ëü¿ ñ¨ E§¦#à­ž:€Aƒ“èïB-¸ðÈиÂcÔf^ Ñ: &ÒŠL¨mCŽÿ®Ë£Ÿr›¸æ¨åL]fåÆa¨ @¹¼zÈËý˜"¢‚‡‹v¶È—±ÓâtL¤T*°×Ž3‹Òæ,±d…—¨v !æû3HCìïnhR +®›õöu¬”Æwƒþ™Z;5í J!÷3•[à¹téH{£/íš Î4ËÌ®N›ãÉÇf“*æk½wÌÖ0ÏïÍ&gª|U¸€.°]rXlie®¶^ŠÌuF¸º&9ÔÁðä/ý߯2ü“°ã›´ù¿ÿ‹<ÿëª#¦âXv¿ëeïÿhgz[Dòù¿î_Ëç¶ÿt²~!endstream endobj -2681 0 obj << +2680 0 obj << /Type /Page -/Contents 2682 0 R -/Resources 2680 0 R +/Contents 2681 0 R +/Resources 2679 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2647 0 R +/Parent 2646 0 R +>> endobj +2682 0 obj << +/D [2680 0 R /XYZ 56.6929 794.5015 null] >> endobj 2683 0 obj << -/D [2681 0 R /XYZ 56.6929 794.5015 null] +/D [2680 0 R /XYZ 56.6929 752.0628 null] >> endobj 2684 0 obj << -/D [2681 0 R /XYZ 56.6929 752.0628 null] +/D [2680 0 R /XYZ 56.6929 603.3016 null] >> endobj 2685 0 obj << -/D [2681 0 R /XYZ 56.6929 603.3016 null] ->> endobj -2686 0 obj << -/D [2681 0 R /XYZ 56.6929 539.7009 null] +/D [2680 0 R /XYZ 56.6929 539.7009 null] >> endobj 914 0 obj << -/D [2681 0 R /XYZ 56.6929 500.3546 null] +/D [2680 0 R /XYZ 56.6929 500.3546 null] +>> endobj +2686 0 obj << +/D [2680 0 R /XYZ 56.6929 463.723 null] >> endobj 2687 0 obj << -/D [2681 0 R /XYZ 56.6929 463.723 null] +/D [2680 0 R /XYZ 56.6929 431.4263 null] >> endobj 2688 0 obj << -/D [2681 0 R /XYZ 56.6929 431.4263 null] +/D [2680 0 R /XYZ 56.6929 364.9038 null] >> endobj 2689 0 obj << -/D [2681 0 R /XYZ 56.6929 364.9038 null] +/D [2680 0 R /XYZ 56.6929 304.268 null] >> endobj 2690 0 obj << -/D [2681 0 R /XYZ 56.6929 304.268 null] +/D [2680 0 R /XYZ 56.6929 107.6861 null] >> endobj -2691 0 obj << -/D [2681 0 R /XYZ 56.6929 107.6861 null] ->> endobj -2680 0 obj << +2679 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F55 1311 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2694 0 obj << +2693 0 obj << /Length 1217 /Filter /FlateDecode >> @@ -13031,64 +13009,64 @@ y Ïã —M¸e²wpmI]Àµ–Ò‘ÎÖ¦ú~€%¿l·‘0ÜÁ2EJåw-7˜Z ¾úJÕ©†«‚ 7·5FàÞ­ñÿz{DˆÿôíyèUõSh€%¸ñð_¿¸NÏJî#&å™fnöLèÆ)<û®7o³·¾ÿê‡ endstream endobj -2693 0 obj << +2692 0 obj << /Type /Page -/Contents 2694 0 R -/Resources 2692 0 R +/Contents 2693 0 R +/Resources 2691 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2647 0 R +/Parent 2646 0 R +>> endobj +2694 0 obj << +/D [2692 0 R /XYZ 85.0394 794.5015 null] >> endobj 2695 0 obj << -/D [2693 0 R /XYZ 85.0394 794.5015 null] +/D [2692 0 R /XYZ 85.0394 752.4085 null] >> endobj 2696 0 obj << -/D [2693 0 R /XYZ 85.0394 752.4085 null] ->> endobj -2697 0 obj << -/D [2693 0 R /XYZ 85.0394 692.3565 null] +/D [2692 0 R /XYZ 85.0394 692.3565 null] >> endobj 918 0 obj << -/D [2693 0 R /XYZ 85.0394 655.476 null] +/D [2692 0 R /XYZ 85.0394 655.476 null] +>> endobj +2697 0 obj << +/D [2692 0 R /XYZ 85.0394 623.3704 null] >> endobj 2698 0 obj << -/D [2693 0 R /XYZ 85.0394 623.3704 null] +/D [2692 0 R /XYZ 85.0394 588.7135 null] >> endobj 2699 0 obj << -/D [2693 0 R /XYZ 85.0394 588.7135 null] +/D [2692 0 R /XYZ 85.0394 525.7396 null] >> endobj 2700 0 obj << -/D [2693 0 R /XYZ 85.0394 525.7396 null] +/D [2692 0 R /XYZ 85.0394 468.6524 null] >> endobj 2701 0 obj << -/D [2693 0 R /XYZ 85.0394 468.6524 null] +/D [2692 0 R /XYZ 85.0394 396.6452 null] >> endobj 2702 0 obj << -/D [2693 0 R /XYZ 85.0394 396.6452 null] +/D [2692 0 R /XYZ 85.0394 211.0639 null] >> endobj 2703 0 obj << -/D [2693 0 R /XYZ 85.0394 211.0639 null] +/D [2692 0 R /XYZ 85.0394 151.0119 null] >> endobj -2704 0 obj << -/D [2693 0 R /XYZ 85.0394 151.0119 null] ->> endobj -2692 0 obj << +2691 0 obj << /Font << /F37 1018 0 R /F21 930 0 R /F39 1151 0 R /F22 953 0 R /F41 1208 0 R /F53 1303 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2034 0 obj +2037 0 obj [922 0 R /Fit] endobj -1880 0 obj +1871 0 obj [922 0 R /Fit] endobj -1579 0 obj +1578 0 obj [922 0 R /Fit] endobj -2705 0 obj << +2704 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj -2065 0 obj << +2064 0 obj << /Length1 1628 /Length2 8040 /Length3 532 @@ -13098,7 +13076,7 @@ endobj stream xÚíte\Ôí¶6Ò ˆtÃÐÝÝÝÝ¡Ä0 00Ì ÝÝÝÝ’‚R"‚´t ÒÈ‹>ïÞûüž³?³?½¿w¾Ìÿ^×Z׺î7¶‡Œ5Ü ¬‡¹rðpr‹ t´P(ÐWç…C­fL9g0ЇÉ]Á¢#°5@ ðòxDDD0rp'/gˆ­+€ù‘ƒ…ý_–ß.+¯ ‘.[€ññà …;9‚a®ÿã@=0àjØ@ `€œ–¶‰Š¦€YIÓ †P€¶›¨C@`˜ ˜`w@ÿ:@p˜5ä÷Õ\8¹d\@€‹y {‚ÀN¿!v€ØÙââòø €¸l0×ǸÂêfý[À£ÝþG“3üÑÃñ{$Ó†»¸º€œ!N®€Ç¬ÚòŠétµºþÎíy„p›GOk8Èí÷•þ`4¨+s¸‚=]粬!.NP ×cîG2'gÈn.˜í¿°œÁ¶@gk(ØÅ呿‘ûwuþuOÀ¹=ÐÉ êõ'þÇëŸ ®.`¨ '&ïcNëcn[ “ë÷¨¨Àlàî¿ìÖnNÿÀÜÁÎ -Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.uY]¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 +Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.9=uc¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 0Üú÷äè¹aÖÃöOÃoäæìüØã?ûÿxýœÿŒ=ì a.ÌÁAb¡ö™9Y® Ä£ò/z{xœ*Þè—ÖÁ»2#×Dj,ïêÃ8›ÇEµyÍî;Ýoª²n öA™ºÓÁß‹(üèX>ã.3v±ms™W`gÅúϨ¯"› rn­êèš—ß¡RŽwð9£_²Ò¹Ð_8=óe4%v>oFÀk(Ù?`LÙ½¼`êú4ð±ûåÃ&9[~ƒ˜;26cLà«|r)Sƒj…×Íl(ßÛ b¬Å7ÎßÊçÏVð™h9Žù,¢I‚°RÊ• e®äß·RÆ%=²ìÙ êt›œ(†Ì%³LÇî)®Ž>1Ù¥‘„µ…^Ñ2¼éˆO£Ý %õ‰>•pjÕr{2–ÂwÍ<–g¬™-j—!3cäáakIè,AŒ$ÁLˆÇÆ‹J¯³nöùU»Ïm›Þ‰D3 @@ -13121,35 +13099,35 @@ $O t‡Í=žÝbóÆÃwî6ß"£“˵?”JËOP2RÐ oQo+†â1)©w†¦ÜèådîI½ÈZ¿VÍ­(e÷åû È"QÔüFØs(úF$'‘qL ®/¶!õÔ ¤HvkÖ‰Œh¼È‰¬ê؉á¶o?Ùa:Šÿ±qêcŒ° gã!_QÇ~ÏWê¡1üaœ¯UÝGmã§Yñmn%ìRãr9÷¬ß0qˆ5†/‚E…(êÚ“†,W‚˜$Ù½ï¶åçLxËÎÔ|ú奕£w†Z|ÂV€ãž÷,éOd ÞyŠGÝ ŽÎ¨Ý3lÍ4©¿Î\×T2Zª½Ag—.7Ù#ÏPæï™v¼eŦQLÞ»±Oþ¼Ô\’ ¬ÿĵJÅñ¾(š3Ç].Å*,MÎ>ÛBx(ÃSÃó|D³uû‚Þ¡ï†{:Ò‘Á¨2G9¡Cê{É•<|?ÒK áéá@F)Ø,êw÷ó?È ¸¢Ëa„Çh%Ù±o^Œñ{‹6™Ý @¥-«ä%Å~jÉwXjz1îi´·î¬%uÕ3^¿±g¸`d+ÎK[ŽDe—„]âò†YèÖýÇ?Ï>£³HjË,èkѸÍhÔ8Š” ™v_Å [ªJÖ®²9m=·âú?\‹k>¼à¬‡¤*³Ñ³ž,Y ê<‹ý¹uÓ Z/ZV$S·é#ƒmNOš¨5M@¿§rãÝ0Hõ7¬&7[àçŽAØñêOõƧÈêÚ5±pE6~d»Ž^.x¨T1¬µ¤$£Í7¿ÿ4òÆêüj§‹G1¬èípoóÌ3³QýÐZ:œNÍÆéç,0½‹ЇZg‹ðâ£à)‹Q©¯³‹X""œÛÆ0ÏÁ¾äBvFA‚)Y9(ÎYÖý…ì¬S…|¸Ôü¾“qbæÇN.LÔX§…_ï‚¿œ%%½¥åŒìé|°D>W²7}C–Í#—ZR¸­$º`bÛGο…a¿9gÝS%\”Á/œîñhC|?s§ Ø…šg¯ÎÙÈ)ª¬m}ÐvÖËk†Ÿ.bÉ&O üõí+uqfº`Îa‡„°£â,I§ã¯½/‘˜÷ÇÝ›Á¤'P6ߢH‚Ú?÷›½šÙ¹˜Žà9¦ŠmHr7:pMRYŸ#£ 'æW¥¿ðKCß|-¡mWÝ躖ná²¶Ë0–«ÞÐ3äÛÙ=j’¸Ë-,n–³e±€¢üb½iÙ;‘˜Hâ°l<)žL.ßÐYÖÿ°Ú·)wL=(‚Œ£± L|)=å'ÀÆ-Å@²öò¾µ<ÃNrä³6îµEôʃ3±d¶kÓ»¬ÿ‹%ôµøü·(kD~ô(¬_yñ‡Í; ¯åä²fùOî{&*‰äyÒ¯9ÛB±T¨d>è.òY[a-³ZyÏ•px9ÝØÜ>穾„»*|,4°ç Žð=Ï añŽ©{ZwLVqžCÅo, H;ç_7Gg[åGx d½DŽ…*~ÂJSÛ/ *ûÎÔF‹µëújQ‹jw Ý]_-Òq;Œ,1t³õ2ߥÆíËòê{:Ö§Ùo$<×ð¬žôôJ©Àëóüλì„b›F=ÍçåcT”u;ÐuË›÷#³»Z1q“ÒYÖgHŠ^fiyv|‰¢,PkŠA±¢FH£s^…EËRôƇnQWEÛt%Ú·y3™{æÈŒõFbKã<%Æ)â"-L+{墒zS'“#é²ÊòZÃ+•÷U­Á׎#Ç©ÃCcæHŸ,êä;÷=íÏô .óYäg:¯jÔn¹¶Æô×êS:c¤¬UºW¹Þ/Ëf¹ŠšcO¥ÛøŒM¯lD‰Á¦9²ú:­ÈùÈßÛ˜ìÑËr6½õx§ç±2ú]úS¹‘ p7O¼,j1îöÐËÚ{ž$ªS7O–xYŽróæs÷â»ì(è˜Ýš‹ÏD‚@§­Y#žC²L%¯íáž›1A•ø©3¾~M+ÖAîDí>¤¶¯cãµã-Nˆ¥”ûÚÔß ÄÖtzâ"¹tãØ'>(˜“”hSðÕœM]ˆÎÛ…0ìŽ ñâSPÓKD³—dOj nÌó®|KHtÞ‘Ñ+㢟S'÷@6„iõ“¨C,÷ág3B½žpÖáΡÄêφÖÑn‰Ü;ɦc“ _7T,Q1çTiHøBÕWL8­¡¾  ,œ²£.±ß u2†)¶=–Oš ¹ÿêÚ´­Ùê², Aq¨¿râ^T!1í¢ëç2)áN\§‹¬‚)æÄËR…Ëbž÷ž6Cb5ü´çêÞ›Ô;ð¶¹mH“üÅL¸^Ȭü¤Ý¸Ê {>«m@Ë›ðzéN‹›´×»ÔÌÃBÿ]¬—š@)õp[jÊâá…6ë¶¡²BSHQø×¨.öØ«N÷Ž`ðG¿§zŽ^n)?ìû±«892ÉÿxÈÌÄ÷Ù%¼­Ø3ÕÎZJðô]\ÿ^¸Äé„SXA㣅¸r}[(â0Ò@¥elöÉmi¶ö­EWÕ9úQѲ´ˆC¶Û¯µAñ=°g>MF{Q’= †*Ëk¨+™×Øõµk¤i@ïħÕW:x<›ó"Í}<=<²šC½Q¤4Æð÷i©UµSöA-ÒiMÛk×qnñÔÆèO“¦R<)D¾€÷/ÇT#î¡ÍM© Æ$ÖžåÔ3³Ð¿Á¢\ç{Uª÷Þ<UW=ˆ$®&<ƒªZ€0óØÒgÒR*¹ÉÒO¦1‘'£ùŽŠj*5wË-·‰ûùT j4ÝióÍu``òh߯µ“K…ݻʔÑk‡‡A›”ôÈÔDôìtk¯ö2ÅÛö÷ú—¨§$ÌöZ¥ï@Î^ùÝêõ^E~§”Üúí¨u4߉<*ôޱ§¸KJßùy/žn•C*}…ÃåLgI£J·8jŽ[“Þ³ ”ØT7%JÈOïä,Á!ØžÈ+ÌÁ¯f—ÉȘs‡h`Úq¢O”1£<ƒ3(©dØOfBOŸ º'"p=Q£B¿âäpJ}ÝØü™ŸZ®¤!p{òëÈa}÷qÑ¥³äƒ£DKXôžòxÇ(žÏÑã ©¨“{ÏçÉšj¿dqX·ã·ŸP¦Üv£ä£Ï€³i¬¾AÕ;³@øyŠ*œoLœOœÕøë…ú¾›ºxOÛÝËc -@YšUʳªø;žBiäMÖð.•\rž;ùU´¾Rø'î…ç)眄š˜ …@ƒi/_ A®ÉéÙêr«0áFx<×Er;¾zÇ´UÏšøSÂö²Ù„.¥mô÷Œhâæ¨É2Ø’ç/{I;õŠjÑm÷¬ -*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€޶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øÏ¸3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlމâXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿ¼oõ³endstream +*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€޶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øÏ¸3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlމâXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿòbõ¼endstream endobj -2066 0 obj << +2065 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 67 /LastChar 85 -/Widths 2706 0 R -/BaseFont /LBYYIR+URWPalladioL-Bold-Slant_167 -/FontDescriptor 2064 0 R +/Widths 2705 0 R +/BaseFont /CSQLXY+URWPalladioL-Bold-Slant_167 +/FontDescriptor 2063 0 R >> endobj -2064 0 obj << +2063 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /LBYYIR+URWPalladioL-Bold-Slant_167 +/FontName /CSQLXY+URWPalladioL-Bold-Slant_167 /ItalicAngle -9 /StemV 123 /XHeight 471 /FontBBox [-152 -301 1000 935] /Flags 4 /CharSet (/C/D/E/H/I/O/R/S/T/U) -/FontFile 2065 0 R +/FontFile 2064 0 R >> endobj -2706 0 obj +2705 0 obj [722 833 611 0 0 833 389 0 0 0 0 0 833 0 0 722 611 667 778 ] endobj -2047 0 obj << +2050 0 obj << /Length1 1630 /Length2 6133 /Length3 532 @@ -13161,151 +13139,159 @@ x Òy¦§aáèha …«pJ핎 HÀÈ(ã ±@Bá0Y $D¤±ÉB¬@¼¼ #Hîìå µµC‚XnxXÙÙ9þ²ürYzý‰ÜD" ¶0Ó̓;Äîì!o(þ×ZiÙ@! u %5‹‚šHƒ¸Þ¡áf鵩@­ 0„dw9þqYÁaÖÐ_¥!¸n¸¤ Âb½ ƒxZAœA gˆ«¸yA [W ò¦H8 -³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø×º(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå`CU9 C=ö}»þöÕ¸Ù¤¶—3ô߉ôTáÖÿ8üb’–†{‚¼9y„¸Aœ|7rx¸…ø@"|>ÿ"ëo"ž¿ÎªHW¨'Ȉ›‹››tóûç÷¯“Éßhä`Vpë_{£…´€Y߬Ú? ¿`+7W×› ÿ~ûo -ÿóü{é!Oˆ`zn%lŸš‘†¬"Ïéé—5úÐÁƒÑâ\\£ý:ß¿Þî—¾(Rf~QÂU;(zÕä5¾í|¹ªÌ¶ÖÛAæÈÜž ÙË£ò¡g}ŸO4ÏôNˆ}-lZŒŸöU/Ê{LeÓP[wm©_ó™iÑÅ=àà;>WìýSVz÷|R†g_«”·¯´ÖÞ"®*ØþÊ”°yzÂÜÕ÷±§»ýðîûUJöìW8Œbî˜øL‘þ.Ù”O uJåÊߪݎË;BbubÁï<_^Ë¿Å`i¢KÙÅy¨yc@–‰Ÿ'\;ø$·®Q;S-”âs/, 9D¦Ô#,9ƦïKv²±SÐúê¿»èçö‰%…÷²õ-âÁ]3ëãÝ“±Ñ][™CæºÊlëŠÑLü‹¦ëÀ¢€5‘ؽrô›ìç3üܰ˜üDÑSjÛðôä)Wï8Ž*öÜŸèž“3@'}~+ÏÝ6‘žˆ•Ø\Žpµ<züuÚ>AbåPóبLbZ÷a3ÒYÍEœVÁ= ¾‹­{·^®2<¿}5aq€©ÿ_5¹Ûðòµ÷>›À¥´ê$C}ÀXй­œÕ÷ji—û­€G‡/§Œdû-!j¹;Ë6#ÔÜŠ.Oé­×ôÎc´¼$z¾I(ñØÇ/ Wj®½"¹ßKÒÿ¾ð{Lš¿ÞH¥hԻí:iÓFRF<g] Û39}—ÞÞF™8|à0­‰å‚Ô"¦¯£G$¼ ºêÆIª˜Ê΃ .–Šô‹µŸE·ÛCqüQmæoi\7yªàmûŠJ…0:næÅÊØê®óÆ XeŒ`Ãé’_ÿî½jâì…”Êr‰ÇO„DŸÓÕ6xÍ·o¯lŠýP¦ÿÎ*5„$8d”#ÙiWtu¿÷¾žG= kŸoHÉ]˜Ÿ:ã3ùN»­g}„™?&ì -b݇a›yKÜ£%t×TcaÖËF˨?B:äÐ 3ÚZP ‚ÌÆŠ} fñφôˆƒTU‡J鉽žj:»«Ï‹ºôN)/ÂÕ äE½¬^gº‹ ^/«k¯&6Ö7%³"”-ήQËòÍ“ ñÆ‘r¾“'#LwDEëЙ}`?—$-`¤¦ÍC5Õ‡ 9æ3ÖXïžÊºUFC:ׇ¸T<íàìe¸z&îÄŠù @Õ!˜- “Ú½¡…´cEҼŸýÍó2¦±h’—Y#ªªÇSÀìjzaT €Õx…^ÉÊ9%î5Fõ¡ƒ…™y ×±ªälš2$g$?˜ß{v€¢è§à,¯ŽÀnD£ÍfGªªSH4‡S"€ÚóôöóãNƒ^œ¤ä½t!¢+ÏøÝ÷n©X#õg«uW ³}ceS÷ö¸ïcZ¦BF%×# èS=ªbÁõËFñÁp%ˆ&ˆ÷Ñ ÿø‡@§{›Â§ F$ -ñÀèHvo»Vüy½¼Òç³³”ÎjÁÕŸ,_Âh^§–p³/â#Ó„HÊÀç„»ûÄŒ[‡¤Ê»B8Ò¬’%PË ™#¹&}Ô7uo(à–îu•úµÒ95ÀŒ¾?ËêcÕ8—ÄñâθÑ,™ê:f”†.‡Ðà¡ÝõÁ41hÀ›3):«;Ícƒ·ú‘¶Þ,èðY½:Nç5u…QEð ‰rŸ–²ÌûŠ!&.ÜYâü×É ú;á$¤`×yme~b©@{•3*¹‡ô÷¤” ¥Åêg`iDÕ˜|)1IŸ\°êjñ˜Î™+ Ä&j‰wé„™–£Á{÷…á«-G3µ«®ô*UÅmÖ­ïè, ï!¦ öOµìl•yóâúŽàäç?MµŽÇ¾Ä팼®sÞÀ±x»åÅ!¼´œ®“X>ÒIÙ»—X,×EAœ;¯è%Š]"N?v6ÁnÁ$W¥0O«W4¸»Æ—NQI…>Äóq†z#ÚQû3]º¹Ñ -·³®pBk¾j0ĵ¹Žjœßç]ZÙŸB dŠÌÓš­U• -ÂIÛ9ä‚·œãƒÂè©õß½n^(Á•Ýh´7C¶¦2„K~V')Ïï±^š}zTÉúÔu?£F-!z_‚¬šÉÉ/U‚og4²Š’.§N™EhôáÍÎËåÔŒL^ѽð¹œfCÛïPI†^ÔLʸðˆ§/çÓö±’¾¿Ÿ\S ³©»ï™ή0‰Ú·˜O%”çp×ù1ÔA?P(åÞ.¤gÔ> -ó¥ªÕl^Œ¨­Ý)e»ò3Pp[´dbõ¬ðVŠÿÒ³Ü4Å+β&VÊBÔ eŒCuOé‚¿# U9fiêCl·\r«ÒzÃÐWü®6êb1~i“EÉ5ÚÒ A¦¹§üÑœNƒÇ=< l””íyIæj%‡¨äÄiñ(<ÈO› õ;Zõ}¾TªL’[î^åÛA€Z…êþHKJühØûñœq/fóÄf¢8³?€æ¢%K]TkcÑøKEÄL1‡•·FÆîšÃºåØ KCÂCkÇxG®ï[v“U¤Dx?B;/³j8Ï,ã)¢ÉÏù٠űZ,wyð#½Ï«ÛŒr>xŒWÖÆú|nòÚ¸ £Á'¼Û#Í5C²&g«=O(½m°’úb6̶˲G„¬8Uc¬ÿ]ºÍ¼¯7A•Â]Êuþ 0œL2ä+¦ŽÀª²m>us¶„*6ºÏ‰l¾Ü]"¶ëÑ‚æNé9´v—ÈäN¼¥{– ñ°iÖÅ«Hºv!Y %Šžî=ó]©8¶á7ÎR8v4¹ïŽÚw²ts`üŽ<ÏJÅûŽç÷­F¨–¸ZçI°~¡0ÿ00+38)XAM&H.ž:lê}èt«ÈÃŽðÑÔ†2OÔé¢S;ö ·¢¿O±N~VRæèІŽ@òÐ`"䉡âÚÞ Ç1gWÍçaÕˆ¬±³òÚ*|“ ML–"1fäV½C«Ç3g{©ybí Z) BVÉ?+¢]ìOdaòÏCxy&&üÎóØáå½NRºu8ì§$¥ýuÆEžÇqU-‘ŒOqv´£ÝZŒ¦Ì@F~êºa3>hŠ j-Š"TB«Þçú XB‹ÑN -‰ÌÙd%JWܽóµÈT¿È$ÿ$H~@²&jM¤Iòüé.‡¿÷ywúÜB½ÐÛŠFög„”p¾áÚÀ7sº‰&RDî(ŠpÅ3¯ƒgƒL«Œ˜–)\°¯b„îeý¡u1ì9ÔaºÔ0•i l]˜dÞÊNºwÚøw T甼T ­31&Óãâå"q è{•tjIõOÙ#u‰Uð¤û/qA©SˆËÕ[7Š·oÑ4Ʀ^žÔ™Q™¦¤îŠ»Lzò9QT1q†}«caK"ªQv[‘,P.£d¡ù:üœFª±î¤R=éY@A -‡¶úL9’00#†ô}à…Ú¬ëè¾>€à)…fbˆû†7sÓ¿×ÄÅ}ä׊³ÒgÍ¿?FІæIP›˜ké÷2è´à2|Ö§™¥£[¶WBMåtè³<èù:28¢Ä;Xf1S§³EŠ&´×å0Ä0d—5ŤÐ4|ylæ©@Är˜léË@È}±}µ\"òSÐd5ŒÓkùp ü3ʇÏÎ -+˜^h€&9I‰òÝ3¥–\—qaâ)&J™NBb0šNí`Ò.'39ë4^€îg(}*v–õ -d ¯òˆ¦:ôw.Œô5%µS¯sý˜?™g:S &«t|EŸ4îsFCÏ­ÉAgd«'geߺÌ÷hÛghj34€ž>æ€\û¶=ñþJYÛQã$ŠØ]¸ˆúÿÜ•~­¡ËØÖåú¥·üD7_ÊkþoùåŸ6=:ëëòsâ²ØÒêÊNraý?{•>Jô^ï(Ï%ZR`“Wû€[s|-ð®öü:Q°ø`qXó d=ýóá ÷‡ïÒ·e¿Qé;)1ÄÚ*Ê7¼Ø¹°ùnéû`îû¥µ.{_æÎ™$ŽÛÕä6–¥³Á»úcË Äþ$úÄüÒGyÆß쳈‚Ñ÷2@~»ÌþH‚D›X®—vÑ ât‡’ÆŸ”|ùfOûcëQ?U?’N|bk¾ Ôt‰ò)MA ‡ç¨´‹›ÇŠ%î *ìN3zöû˜ Íð×90´­~âÜŠOg½`éÆ.æ%kK2œj/zÈ}âí;ZÑ‚tZ•„Œ±z‹D ÓNZV«ÊõBEí -ýL¡T÷Æ{ši®G3È¥ã"y+â3’§[cͽ<å†Q@òæì+}·÷¼Íñ0þ’Dâ%ßéfL¹7®‡SìD nŸe‹ïãF cé¯ÿäφ=jýúÑ…fìÁµAÌ^He±œÆÌ€PP‹@Sò˜ÈÈ5D7Âþ˃¯íãìoÎ64ÒŽY›]l_o%а¤ÒÉSŽšŒæ©óAüŸhöUù»ÐyèvíS¬ÐD=ËOÃxýa“²I;ÊÃÖ‰do“LÈÁd<±~ŒÞg®¨ÙÏØÃîpðzÕ±5õ*¨2Ò1·2BÏ`«ùñG8nå^{bh…Þƒ1K÷©éVZ˜gí"2eF˜ˆA4”ÈTøxzrA¤ÚØ?ß]íÝÇKÚâ>/oA,™ƒÍßš7±2ÖõÒ%Ýá»ÆAüÄjLï¦#˜!elµqÏpj•žaîñæ"¬¹pÈ®¡³‘¾¬p_Û°~ö¬Yã$Ä/‚¬]‹>’7çWœ¶*CüGž§“0#,Ùâ÷4)jÒ-oï-Ž|?Ä-¹ùË&¿IµBžÛh«£ÞE,÷—TÍŒ‰ðÅd+pY´è´[Ñ[óär›¤–Û#.NkúLK õÀz?|ìþ…"Œ²*çÝ#Š;þ /Á¾Õ™uÛfxA…÷±øÊx­ëL1Ê-¢æíYa“êKá°¬†%õ= Ê\\ɨ²*‰)s,›]øŒÆ×!;ypÕãQ4ÎÞ0QÕÓôÍoúyAyuUç˜C”C”êØ‡o+Ê鼡 !‚Wc‡q…›—Á-®ä±s:£¸ùæf4#WßÐz½]!{ׄwETè ìyî¢LF׆‹úa‡õbÍ-dÇ&× Ú -ö”bÇЃ 9µ³+&ì“[8Y)+TïD>ì ¹BÙ˜c¨Eü,„˜Lå÷0±ä+ƒ;n§ør’HN[µ‡ÚöÎ=úôÈôdWÌNP–t«ä¡iÿcƒ¨ðÞ "²`ŒÃ©£ÑÝ{(æ¸ËfÞ.Xçtri¯h¤½8òž¾³pKÇù\ëþǬÐ(oÈùÏœO5†wªÒÝäÊ™ÙÁæ)ÐúÃw¹¿Ýî\d?  å$µ² ?(°¡Âòr>9ð–u é '8°YÒ§hZ³”£ºØƒêÉÔöwl"éWißÈ8¢£_ø7Wlõ°ÙïLE ¼«/£â¼u‘&õ}\GuA+ÅŽö/E`åõy‘ʽJ÷íð­;z£÷ «¸¨oÞù8˨z»jI*Œ»æC®û,²M3noâ§Wïýœû0-5þ6ÚžàMÎînþ÷¨™ìÜrêU¯þq - ‘x£´J60>y®ê$´7An¦“_ƒúµZ³+i5ºÅ‡Á) ¿{iR`FªFý“Sð™ñå»ÿa%€ðeå÷uì†Ò*à§œÅÊÎ9 |ÀÑå|,´­Hƒèn_ÙË%i·˜³¼Ã'µ+c% ü麖‘Ý@;¶zu@ Ëf#[2aPàØÄë üSÑò“ëùIý1›„túÉb¯Mˆ·gÃÞç+kÚ:ÙîSRc;¦ EKZªâ¤ØjU¡ª†z­iRûRž2ã ­¾~æ9 ¶hKI<üORdÑ*ãAŸYëêà“ºñp0Ÿéj<°÷8KgQ»$`¹dÌù4à|ÐÈ¥ñ„î±ÃäÂñœð*S妽.®R³+Õ„„§æ›u4ÝZ‹]Îó‰ú5ýíî9•Ôp"GõAìÛ²¨<èQQïg7 ,kŸœx¡ÊÓ,/0íV*Ò>xì€Ëøó]Â}ã´„I©Óës” Óšð±ßUÛôÖEÉ|5Ÿ®ÐÁÈ Yf†å?åõNöl sÊrO©XfÒP˜í‹ñ~øX‚­üÀ«WŸù‹è½¢§IË!›¨„q;·[ò'@‹9ªŒòÕÂBiÂ}—&Å‹þª7¤Ü<$Qj¥½€“¢A\©ø¶©šö}ùNm¢r•ˆÅ2~/¶^=1mê"’Ø$ìRÎBï"Öha¨H&Û€à;ÖÊ&K<Ëv|oäϬAF‘/ÜŸÈwÕFµ< †ævJ€®\§š¼ïô~ntG·9%¸M¤x½Ä¢«È5ŽÒܶ?¯ÈÎó¸Û™è]_Ä~l÷?Å 7`NKƾ)a;]¥%سï^»œSx5O‘uy·KEîÔßÇ -(Z¢`‘®~VpùEaAzy÷UwJ­s÷Œ?´½‹š|: }ÒH»a‚º¾g)o}³=‹rrµM3v-ï€Ä@ Ùì'pÅXßÒ–× -ÕB¾ª\h~8©$‰¼¼·ý˜7!g;É¥ƒ\®cf>}7›ùâžÐÙZسãÁÖ–Ü^-Už&( -ÖËÓ»ÜIFÙØS­˜õOV_ºhýÐn-® -X{$¢½‰¼û£@–rlZ™âɞˊ1o(­¶¨mèö¡Ðé»÷ÝõäIŒ]Œ_-ô‹ ¸Þû ò'zŸT¶n76Gت–·& úìIĆ‹7ÎÔ‰‰f¾uä3¾õˆ;)EO4,Źk&l‰#õ޾„˜¬Ù¶³ ½höâiF] ‹œx'´ÅfÊb\ñê{Ý?¬¹¶=ê3¤XTÕW©*®§‰\Ee¶©x‘@†Dz:ƒ!¡X¾ÂK ”G½èß>c{BŒÍCŒ±¹0šUÕ¼ƒ¿ªÝ•5xfœéÉU“Nhèòã»Z–$8û훎·òБÞåú¸;ß¾2~%~QÍ÷*|6οÀ.©ó¶H&l]ážçµÐ[èù%¥κƬ!ÙrOxÆ!.B˜“zuW,Ôêr‹9å™ÊT°CHÖ‘_e‘‰ÿð:û5r€û3.ñ4v—W”ò]ª[)ïó–äÙÀ—݈H¾ÌûùSޏ+¹ºfS4çHõ¿ÞzyàÂ*/ç%Šâ׻͠Ï8ôæãmº'7…\ì°Å÷K)8ÐÁ@£bÅî\ç±ÄÝÊ‚×[g“©»5é«ÅÖ¡’'¯ÔíÌ¥ºégˆ<‚â¢Ï8TŠqùœ_U å=¢¦#fœÞ*ª6í¶²*æ›\oi›–•`ûlj[ÛW*ˆ»ºœ2Ž(ËtŒp{ˆ¥6Í]š†}„¯>{?'CÆà§5zíEëÝÚÓÞ&vø¾öŠ ÷dYcØL‰8àÇÉu°à•GËÝšÎñtûëV²­ˆ’eÓëû­&KÅàჃ‘oS*.m•»8ÕîŒWQì3ÊDÌûj OpHY²ï®f>×¼ù‰_ôŸö‘Ƥ‰´»ø|EÀ’=PzêîXDƒ%½+C£ˆ1_ù¶‡=AýYœ:&Aaú;æ¬U¾öÝ*“ÍXJ·=à²ùˆ1¦¬ý<ð»©,|# O'Cƒµë“M]í¼æf°ºÜS4‡AÇ÷Mj€“Ò·ÐökxõÊáž™ËG‡ÞÕéú,óÔ92‚¬ ߸gp0o9)ÁM£«&ChVF=Vv¯ñõ­Åž¡üÜÈT·Žïvä(Ê´ãé¿7jzä­ ¾¹Â6]E³ÚŸÉÞeIGOIùç…&˜+ÊZ Sl© -Í`ƒ©c½G¯Lsé:JθÿÍàÿ þOX9B,\‘p' WÀ^CyÆendstream +³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø×º(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå`ŧJ:ŠÚìÿúvýí«q³Hm/gè¿é©Â­ÿqøÅ$- ÷ysòqƒ8ùnäðp ñDø|þEÖßD<U-®PO777èæ÷Ïï_'“¿ÑÈÁ¬àÖ¿öF i³¾Yµ~ÁVn®®7þýößþçù÷ÒC ž+ÀôÜJ,Ø>5# YEžÓÓ/kô¡ƒ£'ŸFûu¾¼Ý/5|Q¤Ìü¢2„«vPôªÉk|ÛùrU™m­·ƒÌ‘¹=²—GåCÏú>ŸhžéûZ Ø´?í«^”÷þ˜Ê¦¡ ·îÚR¿æ3Ó¢‹{ÀÁw|®Øû§¬þôîùþ¤ 'ξV)o_=h!¬½E\U°ý•)aóô„¹«ïcOwûáÝ÷«”ìÙ¯pÅÜ1ñ™"ý]²)Ÿê”Ê•¿U»—w„ÄêÄ‚‡_)x¾¼–‹ À:7ÒD/–²‹óP'òÆ€,? N¸vðIn+\£š}§Z(Åç^XrˆL©GXrŒMß—ìdc§ õÕwÑÏíK +ïeë[ă»4fÖ)Æ»'c£»¶*2‡Ìu•ÙÖ£™øM×E;k"±{åè!6ÙÏgø¹a1ù‰¢§.Ô¶3àéÉS®Þ?pUì!¸?Ñ='g€$NúüVž;»;l"=+±¹ájy4&ôøë´}‚ÄÊ¡æ °Q™Ä´îÃf¤'²š‹8­‚{@|[÷n½.\ex~ûjÂâSÿ ¾jrþ¶áåkï}6KiÕI†ú€±s=Z9;ªîÕÒ/7ö[;_NÉö[BÔrw–mF¨¹]žÒ[¯éÇhy;Iþô|“Pâ±_®Ô(\{Er¿—¤ÿ}á÷,˜4½‘JÿШw‡5Z!tÒ¦(¤Œ2x<κ¶grú>0.;¼½2qøÀaZ.Ë©EL_GHx5tÕ;’T1•\,ék?‹n·‡âø£ÚÌßÒ¸nòTÀÛö• +atÜÌ‹•±Õ]ç°ÊÁ†Ó%¿2þÝ{ÕÄÙ )•埉>§«#lð6šo;Þ^Ùû¡LÿUjIpÈ(F²Ó®èê~ï}=z8Ö>ß’»0?u>Ægòv[?Îú 3MØĺ??Â6ó–¸GK让ÆÂ¬—–Q„tÈ¡f´µ 8™ûÌ⟠é?;©ª•Ò {=ÕtvWŸuéR^.„«È‹zY½Ît+@½^V×^Ml¬oJfE([œ]£–å›'â#å|'OF˜îˆŠÖ¡3ûÀ~.IZÀH)L›‡jªrÌg¬±Þ=•u«Œ†t®q©,xÚ3À-ØËpõL܉'òA€ªC0[&µ{C iÇŠ¤y)>û›çeLcÑ%/³FTU§€ÙÕô¨5« ð +½’•sJÜkŒ "êC 3ó®cUÉÙ4eHÎH~0+¾÷ìEÑOÁY^€ÝˆF›ÍŽTU§h§D´çéíçǽ8IÉ{éBDWžñ»ïÝR±FêÏVë®fûÆÊ¦îíqßÇ´L…ŒJ®GЧzTÅ‚ë—âƒáJM î;£2þñN÷6…OŒHâÑ ìÞv­øózy¥Ïgg)Õ‚«?Y¾„ѼN-áf_6ÄG¦ ‘”Ï w÷‰·8I•w…p¤Y%K:¡–-@2GrMú 4¨oêÞPÀ-Ýë*õk¥sj€#}–ÕǪq.‰ã!Åp£Y2Õ tÌ( ]¡ÀC»ëƒ;hbЀ16gRtVwšÇ>oõ;#m½YÐá³0zuœÎkê +£Šà> ä>-e™÷CL\¸³Äù¯“7ôwÂI:HÁ®óÚÊüÄRö*gTréïI(J‹ÕÏÀÒˆª1!øRb’>¹`ÕÕâ13W@‰MÔïÒ335,Gƒ÷î Ã'V? 9ZŽfjW]èUªŠÛ¬[ßÑY@ÞCLAíŸjÙÙ*+òæÅõÁÉÏ5~šj}‰Ûy]ç¼cñvË‹ Bxi9]'±|¤“²w/±2X®‹‚8w^+ÐKºDœ~$ìl‚Ý‚I®J5`žV¯ipw/¢6’ +}ˆçã õF´£ögºts£ng]á„Ö|Õ`ˆksÕ8;¾Ï»´²?…&@È™!*¦54[«*/„“¶sÈo?87Æ…ÑS)ê¿{=ܼP‚+»Ñho†lMe$—ü¬NRž3(Þc½4ûô.¨’õ©ë~FZBô¾Y5““_ªßþÎhd%\N+œ2‹ÐèÛ—ˇ)™¼¢{ás9͆·ß¡’ ½¨™”qá 'N_Φíc%}#0~?3¸¦fSwß2œ]aµo1ŸJ(Ïá®óc¨ƒ~ P ʽ]HϨ}æKU«Ù0¼Q[»SÊvåg à¶"hÉþÄêYá­ÿ/¤g¹iŠWœeM¬”…¨AˇêžÒGªrÌ,ÒÔ‡Øn¹äV¥õ†¡¯ø]mÔÅbüÒ&‹’j´¥‚LsNù£97œ{xØ4()Ûó’:ÍÕJ QɉÓ4âQxŸ6êw´êú|©:T™$·Ü½Ê·ƒµ +Õý‘–”øÑ†1öã9ã^Ìæ‰ÍDqfÍEK–º¨ÖÆ¢ñ—Šˆ™b+oŒÝ-.4‡u˱A—†„‡ÖŽñŽ\ß·ì$&ªH=ˆð~„v^f-ÔpžYÆSD“Ÿó=²AŠ5bµXî òàGzŸV·å|ñ¯¬ ôùÜäµqFÿ‚Ox·Fšk†dMÎV{žPzÛ`%õÅl˜m—eYqªÆXÿ»t›y_o‚*…»”ëü`8™dÈWLUeÛ|êæl UltŸÙ|¹»Dl3Ö£=ÍÒshí.‘È/œxK÷,,AãaÓ¬)ŠWtíB²J*=Ý{†!f»Rq„mÃoœ5¤pìhrßµïdé0æÀ&øyž•Š÷Ïï[P-qµÎ“ `ýB!aþa`Wf +pR°‚šL\(hG»µM™ŒüÔuÃf}ÐÔZE¨„V½Ïõ°"„£.™³ÉJ”®<¸{çk‘©‘IþIü€dLÔ2:šH“äùÓ]ïóîô¹…z¡·)ŒìÏ)á|'µoætM¤ˆÜQáŠg^Ï™ +V1-S¸`_3ÄÝËú%6BëbØ r¨Ãt©a*Óغ0ɼ•uï´ñï¨Î)y©@[gbL¦Ç)Ä?ÊDâÐ÷*éԒꟲGê«àI÷_â‚R§—«·>noߢiŒ!L½<©35¢$2MIÝw™ôäs¢¨bâ< ûVÇ–DT£ì¶"Y \FÉ…Cóuø9TcÝI¥zÒ³€‚*lõ™s$a`F éúÀ µ (X×Ñ | |ÁS +5ÌÄ÷ o榯‰‹ûȯg¥Ï.š%~2Œþ  Í“ 60×Ò3îeÐiÁeø¬O3KG·l¯„šÊé:ÐgyÐóud6pD‰+v°Ìb¦N f‹Mh¯Ëaˆ>.`È.kŠI¡iøòØ"ÌSˆå0ÙÒ—ûbûj¹Dä§ Éj§×òáøg”ŸV0½ÐMr’å»fJ-¹.%â.ÂÄSL”2 „Ä`4œÚÁ¤7\N>frÖi¼ÝÏPúTì,9êÈ@^'äMuèï\ ékJj§^ æú12Ït¦„LVéøŠ>iÜ猆ž#Z“ƒÎÈVO8Îʾu™ïѶÏÐÔfh=}̹öm{âý”²¶£ÆI±»põ-þ¹+ýZC—±­ËôKoù‰n¾”×üßòË?mztÖ9ÖåçÄe/°¥Õ•äÂúö*}”6è½ÞQžKþ´¤À&¯ö·æøZà]íùu¢`ñÁâ°æÈzúçÃîߥoË~£ÒwRbˆµU”ox±saóÝÒ÷ÁÜ÷Kk ]ö¾Ì3I·/ªÉm,KgƒwõÇ–ˆýIô‰ù¥òŒ¿Ù=f£ïe€üv™ý‘‰>&6±\/í¢AÄé#$?)ùòÍžöÇÖ£~ª~$øÄ:Ö|¨é!åSš‚@ÏQi7KÜAUØÿœ fôì÷1Ašá¯s`„i[ýĹŸÎzÁÒ]ÌKÖ–d8Õ^ôûÄÛw´:£é´* cõ‰ ¦´¬V•ë…ŠÚ4ú™B©î'Œ÷4Ó\fKÇEòVÄg$O·Æš{yÊ %¢€þäÍÙW8únïy›ãaü%?:‰ÄK¾Ó͘ro\§Ø‰Ü>ÊßÇÆÒ_ÿÉ ž {Ôúõ£ ÍØƒk ‚˜½Êb9™¡ ¦ä1‘-kˆ2n„ý—_ÛÇØßœ7lh¤³6»Ø¾ÞJ aI¥’§5ÍRçƒø?Ñì«òw¡óÐíÚ§X¡‰z–Ÿ†ñúÃ&e“v”3†­ÉÞ&™)ƒÿÈxbý'.¼Ï\ ,P³Ÿ±‡Ý'8þààõªckêUPe¤cne„&žÁVóãpÜ Ê½ö>ÄÐ +½c–$îSÓ5¬´0ÏÚEdÊŒ0ƒh(‘©ðñôä‚Iµ±¾»Ú» :—2´Ä!<|^Þ‚X2›/¾5obÿd¬ë¥KºÃwƒø‰Õ˜ÞMG0C&ÊØjãž;áÔ+=ÃÜãÍEXr#à]Cg "}Yá¾.¶aýìY³ÆIˆ/^Y»}$oί8 lU†ø„=O'aFX²Åï9hRÔ¤[ÞÞ[ù~ˆ[ró—M~“j…<·ÑVG½‹Xî//¨šá‹ÉVà²hÑi·¢·æÉå6I?,·%F\œÖô™–@êõ~ø†Yý E>eUλGwü^‚}« 2ë$¶Íð‚ +ïcñ•ñZ×™b”[DÌÛ³>Â&Õ—ÂaY Kê{@”¹¸’QeUSæX6»ð¯CvòàªÇ£hœ½a¢ª§é›ßôóƒòêªÎ1‡(‡(-Ô±ßV”ÓyCC..& +®Æã +7/ƒ[\ÉcçtFqóÍÍhF4®¾¡õz»Bö¯ ÐØóÜE™Œ® #ôÃëÅš[È +ŽM®Aµì)ÅŽ¡ArjgWLØ;'·p +²RV¨Þ ˆ|Ør…²1ÇP‹øY1™ÊïabÉWw:ÜNñå$‘œ¶jµí{ôé‘éÉ®˜ ,éV;þÈCÓþÇQá½DdÁ'†RG£/º÷ê‚*8VŠí_ŠÀÊëó<"•{•îÛá[w õ(FïVqQß¼óq–Qõ vÕ’Tw͇\÷Yd›fÜÞ>ÄO¯Þû9÷aZjümµ=!À›œÝ>ÜüïQ3Ù¹åÔ«^ ü9â@"ñF/h•>þl`|ò\ÕIh=n‚ÜL'¿õkµf9VÒjt‹ƒS~÷Ò¤&ÀŒTú'§$à3ã!Ê5vÿÃJáËÊïëØ# ¥UÀO+8‹•sø€£ËùXh[‘Ñݾ²—KÒn1gy‡OjWÆJøÓu%,#»vlõꀖÍF¶d À±/þˆ×Aù=¦¢å3&×ó“úc6 éô“Å^›$oφ½ÏWÖ´u²Ý§¤Æ4vLA‹–´TÅI±ÕªBU! õZÓ¤ö¥<1dÆAZ}ý48Ì3r:AmÑ–“xø3ž¤È¢U +ƃ>³ÖÕ;À'uãá`:?Ó+Ôx`ïq–΢vIÀr= +ȘóiÀù ÿK1â Ýc‡É…ã9áU¦ÊM{]\¥fWª OÍ7ëhºµ»œçõkú‡[Ýs*©á(DŽêƒØ·eQyУ¢ÞÏnXÖ>9ñB•§?&X^`Ú­T¤}ðØ—ñ组ûÆi “R§×ç(¦5ác¿3ª¶é­‹’ùj>]¡ƒ‘²Ì ËÊë)&œìÙæ”åžR±Ì¤¡0Ûâýð±[ùW¯>óÑ{EO“–C6Q ãvn·äO0€%rTå«…„Ò„û(.MŠý!UoH!¸yH¢ÔJ{'Eƒ¸RñmS5íûòÚD)ä*‹eü^l½zbÚÔE$±IØ¥œ…ÞE¬ÑÂP7L¶Áw¬•M–x–#ìøÞÈ'žYƒŒ"_¸?‘ïªjy@ Í+ì”]¹N5yßéýÜèŽn rJp›Hñz‰/DW‘k-4¤¹m^‘‡gq·3ÿл¾ˆýØî((ŠyÞ|@n Àœ(–Œ/&|SÂvºJK°gß½v9§ðjŸ:#"ëòn—ŠÜ &¨¿>P´DÁ"]ý6¬àò‹Â‚ôòî«î”Zçï3~h{5?øt@ú¤‘vÃu}ÎRÞúf{åäj›fìZÞ‰²ÙOàŠ'°¾¥-¯ª…|U¹ÐüpRIyyoû1oBÎv’K ¹\ÇÌ|ún6óÅ=¡³µ°gǃ­-¹½Zª/¨lÝ4nlްU-oMôÙ“ˆ o:œ©Í|y„7MT{õ ¯=i3RÇVHA9jQ¾rÁ3ãaÂ3œ´X_¿ÆdhÚ—E/Oö\ìKɬÝOõš_·— &†÷ê$ÀuæbsAƒytN.`.šâb™Ê¥܆€ð6é瘯l¾}êÈg|ëwRŠžhXŠs×L84ØGê} 1Y³mgzÑìÅÓŒ$»9ñNh‹Í”ŸâÕ÷ºXsm{Ôg"'H±¨ª®RU\O¹<Š>ÊlSñ" + ‰ôt.CB±|…—(z?п)|Æö…›‡8csa4«ªy=~U»+jð*Ì8Ó“«&ÐÐåÇw?´,IpöÛ7oå¡#½Ëõqw¾}eüJü¢šïUølœ]Rçm‘LغÂ=Îk¡·ÐóKJ;œuY8:B.²åžðŒC\„0&õê®X¨ÕåsÊ;2•©`‡¬#¿Ê"ÿÿátökä÷g\âiì.¯(å»T·RÞç-ɳ/%º‘|™÷ó§qWru?̦hΑê¼7ôòÀ…U^ÎK:%į v›AŸ7pè1ÌÇÛtOn4 +¹Ø+`‹ï—Rp 36‚FŊݹÎ%:b‰»•¯·0Î&SwjÒ V‹­C%#N^©Û™KuÓÏy,ÅEŸq&¨ãò8¿ªÊ{D LGÌ8½UTmÚ5leUÍ?6¹6ÞÒ6!-+ÁöŽ·¶¯T(wu9eQ–éáö:Jmš»4 û_}ö~N†ŒÁOkôÚ‹Ö»µ§½Mìð}íîɲư™qÀ“ë`Á+–»5ãéö×­d[%˦×÷[M–ŠÁÃ#ߦT\Ú*wqªÝ¯¢Øg”‰˜÷Õžà$²dß]Í|®yó9¾è?)ì#IiwñùŠ€%z :õÔÝ3°ˆKzW†Fc¾òm={‚ú³8uL‚ÂôwÌY«|í»U&›±”n{ÀeóbL=Xûy*áwSYø"FžN†j×'›<ºÚyÍ7Ì4`u¹§h‚Žï›Ô'¥o¡í×ðê•Ã=)2—½«ÓõYæ©9rd…Y¾qÏà`ÞrR‚›FWM†Ð¬Œz¬ì^ãë[‹=Cù¹‘©nßíÈQ”iÇ5ÒoÔôÈ[A}s…mºŠf?´?“½Ë’: Ÿ’òÏ +M0 V”µ@¦ØRšÁSÇ8${^™æÒu”œqÿ›ÀÿüŸ °r„X¸"áN®€ÿþÉy¦endstream endobj -2048 0 obj << +2051 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 66 /LastChar 78 -/Widths 2707 0 R -/BaseFont /ZMEPZW+URWPalladioL-BoldItal -/FontDescriptor 2046 0 R +/Widths 2706 0 R +/BaseFont /HKIUHT+URWPalladioL-BoldItal +/FontDescriptor 2049 0 R >> endobj -2046 0 obj << +2049 0 obj << /Ascent 728 /CapHeight 669 /Descent -256 -/FontName /ZMEPZW+URWPalladioL-BoldItal +/FontName /HKIUHT+URWPalladioL-BoldItal /ItalicAngle -9.9 /StemV 114 /XHeight 469 /FontBBox [-170 -300 1073 935] /Flags 4 /CharSet (/B/D/I/N) -/FontFile 2047 0 R +/FontFile 2050 0 R >> endobj -2707 0 obj +2706 0 obj [667 0 778 0 0 0 0 389 0 0 0 0 778 ] endobj -1441 0 obj << +1440 0 obj << /Length1 771 /Length2 1151 /Length3 532 -/Length 1711 +/Length 1712 /Filter /FlateDecode >> stream -xÚíRiTSבª¡¬2©¤j=,Œy5„„1 ó$1÷†Ü’ÜK/7”AÄJª²,b£KFQQ*¬*u@©%Váp"­"<ÂòY¤jUœzÁººJ¶¿Þzçü9ûÛßÙû;ßÙ4·Caà` %&G¥R ‡ È3›M¡ÑqXN $'`!à^`µV ¸+›/ä­òøÄÒõ8’ª"€G }’Ä" Œ# -9 -¤rBkÈ -¹È0z&©Õ`Ýä °΀ñLbR8! -l€S”šÔ$A•à¿!múÛT&Œg¢€Ç”L: EBªÖVRXáÙ &µü²¦ÖªÕárÍdù)§þ’—kµþw¦I×0¤ãètj üFœ†­fzVBÈÕˆB„¦ªaÀà¬d²W¾Á‘Œ`DC¡P¥\Oá0 -MWBú7¥ƒâùû×N%#äJDêÓaÀþƒ=sþˆI“pDØL6›CÉýö”4­™U`‚¦.Ï Èq\®§CDF<Í -Á:ëHÅ,&Šä@:“ ”N™üW/6`©áŒŒIô À¬ÔÉÙ#Ý›Äþú´€L—ÍXÁ .lÅ^é ø¤Aoc%Bz -Ã:XA1ßÀ>[>Þ{j[mž¸ºë¨-=c¡ñð–Žs[O}˜Ã}>N×ð¦"á~uÜêø1rÌ¡t$ì+¤äõSO‰rLÙ2ÖÖ^G“½ ½rŸlÖÅpbòŒKåímïil¿k^lIoò|ð£ûÓ;™çlë×Üãð«¨#E3koÞxù8/mcg¿ÙîKÈ}¨”’T~zÍ8ú¿wНLÜÁª1sÍ¥ù‰ûž:¿2SÛn÷¤Ý²7 - åR›ëFßsØtr “ÂÙŸ¶Ø[&X-Î^èu-ºÂ¬Þ÷u3Æúµ4‡I™=ØM ºßí‘ä–†ÆH¢F­tRÔ.Pû†ÔP­á†¶øVz¡ÐÒ°¶À)­¡‹ë[ÂIoÚC[—2þ’öë’3Ÿ$=Þ÷ìµÚú@‘ífåz|FŒ§÷~ÿLÏaz›j{õ3“[œ\õÅ]BäÚg·ÊЮù·ÿ@N˘Ä -®ç»Ü8ò™»™K¹'×ì­ø—4ÞóëfÓîD±ÎJwýp êáÏ[ û¹ÉÁ })g"oz^ªk<_ä\W83ÉÔ\½¤y6Ö;0ßÍÏy¡Ï\Q¢%¨vš/ôèŠï«Îæ8ñ&Æzèyá3ôCi”©iä°×¢<Û¡Í Òv2ïG.ÏöþÅæ\X]Š¾Ë»î„éûyËöB‘9Œµ{ÓŽÕ†ÕnÓè æì9*hxȱ©È9ûDÔü²/õaŸ.§·ÓÖ_®{D8G<¯JaâqþgZÛPµÏÎäžùh=Ï'1õUßáuk²wm|ðèæÊEÛ×S„v½ƒjºøÓÒ¼×[F{C´vŽâæŽ3z÷¨ñö÷ýˆ`póÙƒŽZwߨ¯–úµRëÏÿglÕZ×Q™ÍVÇyYLР–*M r±\ -§z˜]MRço%O\QSKºa[0A;ôòDui4+Ïһꤗ±f¬JˆÊ–JN©—[͸=sìq©«å)¾éÀÕP~cÅNÈÿVeDühå„ïî m¾ó呢ΟN¯*¥¯d{Ræ+³ôº®yYÍÝe *t -§?ÊþœûÅ)CÓ&«yx¸$úÆZÕ±íšó•Ðh{ gsŒ@Ç}v$¶³ÀæÝÜ¢ÕTê'¨aiý˜n_}h™¥ÿÈŽ‹YQïšîxD»–‰K_YÇE×uX—'â -šM †ÝªJì?ŒVâe‘Šö[É›WKëï²ÛÎ9¨Ê)éž[Ø2káŽM?ºi§.#^¼J8¹Üåk}J1'¨Çð0¤uM„nÅ‚ìÃûšœÚý™ùù¢²€îë;GTÉ×ÊóB£dÔ‰öê}s8Qù,¿öYøbͬ{\‰ûô›”þàØyqkÒÕÞÏG×îà¿0'±èIÅ 9±ª‡7ϼáIVÄ¡‚jjÝûo.Êÿ üOP¨a9N`9žFù òŒ¢endstream +xÚíRkTSW‘ª¡¬òRIÕzX%2yj   b, ‰¹7ä–ä^z¹¤D|PIU–EltÉST” +«Š@} Ô«0|‘VXŽƒT­Š€¯¹`]]¥?g~ÍšsþœýíïìýïlšG¤Œ!‚°p(† “#ÁR©„Ãä™Í¦ÐhÁ8¬  Q°p°Z§Ü€ÍòVy| + céIUÀ+˜>Iâ‘Æ¥R¡†µd ¥Bd˜ ˆ4°nòFXgÀx& 1)€%6©JaMj’ * ðßÂ.ý]*Æ3HQÀkJ&"! Õ«(¬µÙ &µü7dM/ªÓhÖ*´“å§œúK^¡E4†ß˜6]GÀ8bŒ£Ó©±ð[qRBtÚéY ¡Ð Jšªƒ³’É^ùG2B= E"„R T +M<…Ã(4] éß”Vˆ8J.{ÿþµSÉH‚цt°ÿ`OÅœ?bÒ$у6“ÍæDr¿;%Mk&F•„ ©€Ëó +W(ä‘9A!X`=©˜ÅD1‚¼Hgr€ +Ã)“ÿêÃ, œ‘1‰¾¸€•:9{¤{“Ø_Ÿ„éŒ\ÀàòÈV앾€Ïcçü‰¨Ôá8ŒSãCô.V!¤§0¬‡•ëMLé·õÓ}§·×䊫:ÙÓ3šlm?¿í”Ù9Üëçroü)þè7çmΟ"ÇJF"¾aA*^õ´(Ûb”±¶õ8[Ýèûe³*‡“g\.kký@{pÇ=ëâÁôFï‡?{>»›yÞ¾nÍ}¿’:R8³æÖÍWOrÓ6uôY¾†<‡J(IegÖì…åÿ¼[tuâAV…Y«/ÏOÜÿÌõµ•Úz§;í¶£Y`*“ÚÝ0û¿œÃ¦ëUýδÅÖ¸RÁj™pöBŸëòr3°ùÐßÃÐÜ!ýuö@]0àa~¿[’ŸS+‰]p¬ÂEY³@ãVMµ…ë[×·hЋƒõQù.iõ\ÿbNzã^Úº”ñW´ß–ìœù4éÅ‹ÞçoLÔ–‡J£‡û‰±Þ¾3½¼‡éílªýµ/,ñ +õW÷Q`x¯Ã*S›öïýÙÍcR'¸‘çvóèžV.å¾p\»¯üoÒõÞß6Yö$Šõ6‚øKèÇý•þu©Åt€›œÐ›r6ú–÷åÚ† U!®µ3“,M¡¡UKšfc=Aó=\úÍu%Fõ.ëÅn}Ñõ¹lÞÄø¢ãBŸƒÝ/ý†~*‰±4ŽñY”k?´eAÚ.æƒèåFß_íÎGÔ¦:}kOZ~œ·l͈ڗv¼&¢f»ÖðX0gï1Aý#Ž]yö¹§¢¦Tex¨óŠØôl9½¶áJíc©(òEe +<ÛÒŠâèà‰qc&÷ì'x~‰©¯»ެ;Tmܽéáã[+íØ@:ô÷ ¨éâÏKrßlí Ó98‹›Ú¬è½cæ;?ö!‚-ç9ë<ýã¾YÐB­»ð±UQ ®³*ÚÈÖÄ{ÚöOРæJm­ r¼¤Hõ²º[¤®ßKžº£–ætÓöP‚vøÕɪ9+w°gÕ)bÍX¥•-•œÖ,·™qgæØ“÷Ágøæƒ×Âù å» ÀÛ‘ëG+&üïvMèò\¯Œvürf…T%}“ Û›2_•eÐwÎËjê*]àT®fxm=ó‰ñKîW§M›mæák%‘Ðw¶êöí×]¯†Ëµœ-±=÷ùѸŽ|»÷s +WS©Ÿ¡¦¥ucúýu᥃}Gw^ÊŠù°Àr×Kî^*.ym/¯j·-K<̺4*ëM{.V;~,×ã¥ÑùʶÛÉ[VKëNìvØÁ9¤Î.îš[Ð> endobj -1440 0 obj << +1439 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /KPZHNG+CMMI10 +/FontName /DEQVIE+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/less/greater) -/FontFile 1441 0 R +/FontFile 1440 0 R >> endobj -2709 0 obj +2708 0 obj [778 0 778 ] endobj -2708 0 obj << +2707 0 obj << /Type /Encoding /Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef] >> endobj -1430 0 obj << +1429 0 obj << /Length1 1199 /Length2 2269 /Length3 544 -/Length 3056 +/Length 3057 /Filter /FlateDecode >> stream -xÚíWi<”k2e$²ÄC–ÆŒ²Ò £±S3ÏŒaÌ0‹}‹(N¶²”H–{¥Ý–h1!²†RQ*Z,Y¢SïC§zO¯oï·÷÷>χ羯ÿuý¯ëúß×ýáQ”ÃâÔ͈toЊNc©£‘(CÀŽâïÍfâð´½êû@2Û†…§ ƒ‡+*:RXTpM´`€x…NÃàY£°Å3M€F¢ô µQÐ¥õÝ‘Î0° Š?= À‚,A¥Ð C'°ýA Ç R@â>Ig3 Ó A®° „2(d€pÚ碢ªªöÓ‚600¼C¿#dRÈ4@ ZTzÀJ6ˆÂ¤ ¨pâŠ/–„·$RX+m+ÀPC#€„!’IBÒ@–† -T¬%hA÷_!`ÂWôÃP j,Tc- ýhô`Zøš‰B#®¶Gdh8Ñ(lÐówd‚ÿ´‘A ƒÒD ô0C>+©CÀU½bÆÓˆ‘áô€„§2ÁH - „>ðp&>X 6þïÀ?wp4 R,À$CGò“2ƒ¤o{[<‹A è5ÇëøšCök+6•ºª â›$¤ Ø ¬¨B….Ί2ÂDáý)ÔÐ5â~ut¿]ˆ¿é~…¿±›ÑÈTPGk~3R˜V”ˆ¥°>ßfç»ÜÄÕ -béLÊʇBtп`Ž>‚ d2¡CY…@ñ—¤–4H¡‘ Q<ƒøÃ°Ø ¤ÓêIA±ß÷$ -T"†€ø`?°ó°oÍáúÅ fRÁê/hµè:ÍeËjÓ©\cHîf; ¿2)í‚9ýÌ< ¶ÍǸÚc½íz®„4)Ëd½`?óäF!áx!î݉’o‘—vÙnžÚ„èšFµH¦“ÈÎczw÷¹Šy7Ec‹!\]4zÛ¢û«×ö0)™Š¢*^û×ý*bK±ïíwS£ a½œF Ê7öH6ßž›W~RÞãÎwõí‚pUƒW_ÿms~èÞk8«fÊ[Ê­Lϰ±ã¦æ’Oyié' HgÖþ€aµÎK.ˆä±æª§D.°_½•ˆs=T!ß\Y^ü¾©ôIAÇEôK%™GËMGšø…šxD¡ÕÿúIq«„MK¢y$Fg—Ù’y6R—}þœç9‰Ó2³óa2¦¾ryíV­©­ -ÌëÎQÖ×pÄå÷’GMn«åv?ŸtÝf»YqŽ÷¦NdB@×fÁ¦£ŒmÐ}𻕪„@©-ñ%mã_•ñÖ¶dÝŒ¡KG`‰üDù¶šË§šZsÂf$áîOœtCUñWxò9ÍÇ97Ç¿{ä± þE*ËeÇÛͺÇ3S£Å†7«Ã¬koO «·jøðiUå¹ei4û‚ð ·›e±|zæ/#& õ§öm 9­aÐÆCîo`4Õñzx½;;k|¦󇮕R…SRö Ÿ Ó6ûaíJ¯Ž¦¿:4÷$ õÍ•ÁÜf¯Ð4Õé‰Ãžwßr˜CGƒòjëÛe#0—.n×ÜõÅËUÛõɵ¬bÓ(‰Û¯­¦ïåÞß 6~Ùª²cOqIìñÖ²þymÂßËÂ'9ƒ‡ŸòD%)Ïèrµ+N¥<Ê—x°¾Q×rÁ½Ž¯°ÿþ«³Ÿ@‰×`®ÃÞ<ÕK -öÌÃÏD¹¥DíÁ>ÒQÇaÛ‘~‘PiÍYIÑÌzuc±`µ-Ë]¾ ä%'–qUn¹]”›æ”ÿõüÈ)3n–ÔãùË$Ñ ÿ›ímXÙb²aÆ We÷Qd¸Ë×>ôB÷½fZ£|³ô¨ËòBÚåš­—…ƒáo^ZÕÒ„>žKò,’îÿóO9Û!k},Û^ûz žnª}÷êîY•‰¡á›{Þ =5Ì/’½Ñ‘¾‚ôE@O0*¯.ó¼&çu2ÆüÈïö·õˆÁî$™áe9×£ÞèŽ"´à÷œÒŽb#ì¸Ú_º™9[£ÅýÉ1hÁézó0»‡WÍJ‚sYÚk·dúJr¥ƒjÄí¾ ò*‚½“LùÃÛl꬚DŸ)bíVhßPpM§Q|Ã.æ¹F”ÃÒK³Ù¢å>âÜòØOÁBsîžÄpɸê|š°6ðár·8Œ÷nÌãÛ>;Ó’Æ3P=¾û…BŸWÝ(J÷ÄU%y¼n¾BÇÝ:!}·TÈHâÔ.ŽìëfAÆúÜXŸ½õRo\¤'£6æhb|§Å¦›ïfßõž`Û4”Bñ¿ë^=@Pš—0ÂQÜì¥m`Ý4¸®n~^ch®¨Œoc9-†hµ»®÷Žðïo 0¹·ii¾y"Õ†Ó;T=‹¬¼Œ¼™'rÞD÷éÁ10;KÐăË(ñ±ß¥´?*áÛ¥_Ib :Z‹l¢›ð±]æSe‹O"¹RdyˆAŸyÿ?çg÷úó•ãv\ †™ôûÙa.'22QÇÂNݲt뉯‚ël½ßs›ï<åzÏå7POÍvhýÜÚ^»µçàªsK¹ý”²ðL—1ó³übÊycÓ¸ö3Äp¬Àw厥%þH܉桂uŒ8ƒ!«w_>YަäÆßÊ?Éöîð-„Í‘¼³ªm…ÓlSÉxÅmI'¸û猻ÌŽD«ˆ’-.]Óœ$äç‚qa£žÓw|˜°o‹ÂuSEeìn÷GçøÖ»ìUI.³b¿—@aÆõ˜%‡¶ç¤Lú€“ö› n‡;gÖs6.–$'ÊÅT0ñÓyáÛypLåzLåÄ âéb^'ÌNwœP±Àûl¦î÷Q:ÿ³ëw ñïÜá`qÄ[€ÁÚ¤Õk™å.Y“‘ì:¢Ö;#Ï g<îtÓÛ8·‹×½˜t°B±ñžͪärùÂo}|°=Ÿ›µ¿nË x‹€ä iïCJ{·™]¿™zÕ3ã‰/;ß5»ÑÅÉɪ™E͉ÓE‰÷i8Û*á-Ÿœz8“€š%¿rZŠ?^šè4ÎívG­S'×õ¬tL%¢ÛX_TÙ}ÈÉû“£@ì"ªŒ]óééÃìFZŠÈ1YëÌ$Ù ²VHe)Ðë×N^_ÄJë¸ý¹Ú)-ZQ,aôú“3±"}ÅW>Š~ÍÖüp&ÝI/å 9W±·•ùætJ¿G7>ÿ**¸ü¾¶î„€tôD’‰} Q{G³•w'\°¹PÊ8™à ™ôûÔ»| n&ñθëú¯q»·,nêê½¹ÝïlôŒÿD…C>~Êk²“9ן”_(Æ‹IWÑgDTgeDØæØ_Œï«v_çPêk1¶c¶0Z=ÏÔ„&•1¥]ÈHk.Ð=9¢‹%;^Tð+™¯Þiä¨ü dykúDª)%Ó$~æè?Ñ¡˜Û#qúQÝ™%nǪ/ˆ ŠO<ƒÚ/‰vUâbóîÛ“Uÿb>žÕrÇ1š°J8T)ãóXô±ÞÕrŸÒÕB~ãÍðrö¦íi¥¼W°÷äRxú -ÚÅQÿåÿ?Áÿ -â,º?žág€Lè‡råß þ/uÔ@³endstream +xÚíWWXÛ”(A¤—R‚@ +¨ôê†*!™„@ +½( +GšRA¤È¡«Ø¥ˆ`! +‚TÅ‚¢‚ "xôzÔ{¼¾Ý·ûÝ™‡Ù{ýkýk­¯ý0jÊ¢Ž…éÚ2‹œ `.›HblÓÙÒ¸€RMÍâÐÁ_ºÀ  $q &ÚÄ}\¸€#‰èb5Æëcá5Vï›#“…,(˜@È¢C ²f’¹Á ƒC䆄Ð!²d3¹,2ÈÆT¸Â_g¬˜!‘,ˆÀPnÛ=4µ´´Xp&&&€ä7°Ù¨Ã‹0Î YÎSØ NYö%PI6ˆ³Ü6€ +àpBðL•Â64›Šf€Œ&\¬ ƒbÅ ^&`#—õ³†X n,ó+ ƒÌpFô/!*Ä |i Á¸1 P.è`ýwlBþ°Ñ@`€ÕÅš`0#ȘåÔ®‘!à·l&1(±Ñ!Ì€J¢³ÁXˆ +Âd4›ŒþwàŸ;$P 2ðið‘ü`‡Í õëÞ‘ÄaA€Åâìòû}µ>\ +“AüáîD + Áè´ÕIëWý÷´´d´:8#c@G×XÀáà>M ô~fý®Ç7-¾X $èïZ±?(T&`òµ%XËom…,6<«êËhkÿäwbr 2 ~Œ‘/Ö OüÁýr¼þÿrÈ~ÎaË¥Ó¿(ƒú* k¶˪Ðዳ¬ Dþ(R0DüEÜÏŽà× ñ7ÝÏðWv :8ݯFˆm E€Ä!|orS¾\PÀdCËW1Àý„¹@ä ÈfÇò”Ÿ’Ú0ÈL +Ä D<¢$å»a&sY,X§/'Ç~ÛS!¸DŒÉÈ¡&yÓÞÀú½ §,äÃužÝÑk3t›ûÌUÒG¦ÑùÆÐü­N²A•òúųÆ9…Ö„Û¦u>+Wò%gÊÛ¤…™X6¡W‹K$‰óۧȽBŸÙì„_ûn ª{ +Û&—u@6¯è¥Uä û·ÊÕs^j¦VâÄd¦Tüúïç/BòŠÕ¥µ‚Î/4M¤Þ8ÛÓã\ðˆ>^³560a_žÐÖ+çï~ÐØê-tþÕ¼Dm“¸_ÿÀ5Kaƒø¾d;$§þ¿¼W¥¾¹óŠîb@Uuñ/¤Ô`«ÞŽí®3¨´· Í–ZG$OqŸ¿’MôÜS­ÒZ[Uö¦¥âAqç9M5Ü3uÅ{K-ûZ„ŇšZ¤à5þüAm…§¬C[ò‚e¬µÁf‹EË<´.1ïä ß²Gßç!BÍ• ;lÛ3ÚUÙÝãì.)Koäö›]Ó.èy<é¹Þq­Ú¬à/¢ä„ +€»œ‹˜Š3uÀõ#oÔh‘Cå×%•ßÿ<¤áJ²s¤fŸÙ‡H¦¨Ü®?{¤¥=?jZ¶iï'!‰”I/l­pµ¯Û\¢{kÒë{>›‘Ÿä3ù<6¾Zkx0'#ÞTzd­ÂîòÕ² t&@H¯¶Ð+ÓDnî#%_kU"YÊ>‹™,q7z·}]ÄQŒÉmÚ@«%¬1LÐÇïõ΄Óc=ÖÚªW»¥æ +85å°ãÁ©âü“¬ç{f„d¼<7TÐꙩ55±×÷Æ+{¸kÿ{Xá寥ë3§Ådt7òóÔ÷|iv!·Ìü)VöZ× Û©›·VIŸµ­é\/PVžp0™³düÇiA‡è7JÈ¡ITþÐÞ‡q©Ó†|j“¥é÷Šdï¬l6´™÷n*¸µÏöøPöXKìt¶Ìð“G<ò 2Óh+×¾³ºßuÄqt@2RAwFN*§QÇT:\{]×Rwàêb¹‰¥©W g— N0O¤ÚÒý±·½3’sv"ëC‰~‡w[î¼{ûU#jJ´'UqdIÙs¿?î©«$#ü /Ÿº±l a\û/Ü|±x™`ÚnœèT£e”ÓÝóåáý]—×åÊñeÚ” ÙM*;«ÃýBSÍ…£Ûnʜ.娫vȬ*¾`PŠ*»ä´û± &Îeñ™ÅLéRºevil§¯h‰%¾»7%Z.±®ˆ!¡¼=Û#ƒ¼±ûþµ€MYû©ãÙØÞÀâ‘k/•fùkS}^´žc¯Rˆ¿Q!¾EöÈfžÒK»VQÖÊ‚dÚÑ~¦/1Ö—d­5æjfz½Í¡GxÛ¥ÖÀQÞpÇL¬j±é¨°ç9A#@TA<ÊS[ë§ob×2´¢an3<[Ô$Ýæ¸‡-Dèux®ô h1»¹fq®u"ÃÊ×7\7ƒª9K˜¼R(yÒÌðá®Á10/WÔ̇oKÊý 3™6Õ 7(ž;èÄ7ÏaÞÊ‹ò8”cª¶%{@5êÈU¯Þø!™Z¤hÅ5úí>¿å¦#ž7·`ƒ+‘y.íÛ;.‹õ¾Òro«r¾ƒÕ˜î6eTYH?ijžØqŒòIYå­Ñ¹ø¶<M<Ô:\¼¢™•h2lûºøÓ›'éIW‹sý;K³TÿæÜ:‡f‰LÇ Im}Wê!þYÓîyÀzcŠmLù:î)^*úcq±ŒÄ–Þ£7D؈b„`›êEs5 ‚½÷½ͪBd»Í;7>QUL«´9 )…[¯ÎÜ®^³µ¿¤LÔR}Ѱ +•§ÀÛ“Á³»—GäÜ|\tL±!t@ÚeJÞõã½ +c™G²dÑ£›¬åšéfv”k“R~®þè4ñøgŒ³×¼¯³ˆA™1ßí(ÂcûÕ!¡ýæ½»òßuåƒäpÔ©Ó»®´gë›GÍg|àíuy··%êt µÃO¤$ûâîE—A®ï¤bÖ ›þˈ0~—ëÇï6òV/”§¥('íR5 2xصkLóâ!ÔÔÂ.„“á8¹z^ðÑtÃïO˜Â.Z]Ç“^{#Á²˜W=†³F¯;Á&×[%¶>;ÍsT»oZ…Í) ¹ßåe´zv‘dx:uWµZóM†mùÙªù1ÁƤpg!/»`Ã0§È6¹§ +þ{Ô·­·¸x%ã¼oöUáò@n‘9(eq©›—Ÿ[?ƒ•aJí‘éǸ;ª“lÜœ¿;Œ¡=w[L:X‘â6Îïu]gРÜý¨bL3¦Ç +ÚXZÛ³ÇÍÿƒ«H¶’[ÿááݼ^Vfºä%Lº]NªRM/¢¦è @ޤ­,ådv^ûXç–¯&üäâƒc ’ýeçÞK}ÎÓ}{¡ÐŬ”ˆ8Q½­ûòhz¯°O)ô<.¼ê–¾á„ˆ‰BüDª¸™ónŠ(ÿÆBv»à&¤hk‰<ž2™ì"—úû»×EVü"-2]‰½v—^í×-¬é!èø@ü´­ðDµKéßd{v µ¨Dš/Á:KÓ˜S—›ã˜ï|:©¿Î{…KE ÕØÆ™’xBs3†|ö;ýVŠômÑ‘bÃ㪚ëiÕ bɹ:±Ø-®w"ÖÐIJ&2Ì¡³¤éýÃÁ—2~Ÿ”©{ Çù<\k?¡N©=@ ø é?£8ÕÊKÏyWoHÓú‹ýøqnÛ!"oË„mòѰÅ€ûR÷Î÷úÐúÕÏ—›®EVq×lȬ> endobj -1429 0 obj << +1428 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 -/FontName /NYLICW+NimbusSanL-ReguItal +/FontName /PVSNJN+NimbusSanL-ReguItal /ItalicAngle -12 /StemV 88 /XHeight 523 /FontBBox [-178 -284 1108 953] /Flags 4 /CharSet (/a/c/n) -/FontFile 1430 0 R +/FontFile 1429 0 R >> endobj -2710 0 obj +2709 0 obj [556 0 500 0 0 0 0 0 0 0 0 0 0 556 ] endobj -1354 0 obj << +1353 0 obj << /Length1 1608 /Length2 7939 /Length3 532 @@ -13316,7 +13302,7 @@ stream xÚívgPTݶ-HPPÉ™&çÐÉ™–œƒº–††î&K(HÎQÉH ’sÎ 9#$ˆ€øÐïžsn}ïüº÷üzõvÕ®ÚkιÆs޹VmVF-]^Yª„p@óùž4`ö–Î(]°ƒ¯ÜEXYå‘P0†pP£¡O†P@jÅÄÄXòGw$ÌÆ àÐ×1ääææù—åwÀÒýžÛ(˜€íöà G8ÚCзÿãºP(m XÃàP€¼¦–1HCÀ¡¬¡P†:@‘`8@ËÙ³¨Á¬ (('ÀÀÿZ¬ØïÒP|·X²(€r„ZÁn·Aݬ Ž¿]<G(Ò†BÝ~`(€ 쀾í€9XÁ!¿ ÜÚ­9"·ö·¾[0- ²BÂÑ€Û¬Z -JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿²¬¾±œ÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† +JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿¾Ž²²±÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† uƒZ|™BX‰¼LLIB—Qdt ( Ã?V1ñŸx£+w¿³^õ9’e‡Ð†ŠÚ¥ÍäÊu””7œœ¸äN­Ñ÷ˆ¨/ùŠõ.‹ú…'Ð)á0äPùÝÚ…ke ¸éÛR§ö ]8sô&sß±­|*åŸî#>cÕ¯‡‹úœ‚ œEëÑymeê÷AÆ€>8m„ 1œ4¬jõõr¦XÜâd8„²³¤¿V>M¼çÀ7ÁÜ&N\€*ÄJÒÜOµøï8•^Ýçôáö¼J%qõ‡ ‘®.µ&у;ìXBÒ0ÊÚcVKŸ0-SÛ·ߌG?óí·Eƒòñ(€(§¸Ëš’=´øô•ú+y\J6.æê”‹‚œÞ»ó^eúÞ‚·V„(õb*$Ã=AÁžéÌmEéïa9žoñ€Rý3™ÙÑS×!÷8ÎãÒ9‹ÅÕçÜrƒÅ£‘C™Äù\‹-ÕÕ²k±ò¡øáÃÍ8 @@ -13348,35 +13334,35 @@ QH; ‡á{__bçâ.°ßþºæó}<¯½kb¶Þý9\¥™àpDË\TL[\a·¿«NüÆW¨œµ>¿¥t®tÉQÀRD‚!$Dr£G¢1¸AÌý¾ ¥Y í–.ç#_©ØÉ#¬w¥Å¹ò«|Sþ?Z:è:”—fÆ×’¸ʵhúÏÈ×XaÛfÚœ¯Ú3™B¶“—£Ìü¤‡uቇôä·ÏÔϾʉltãp)’&ÿT+p•°e –íZ­M31I¡ÒÏL«êÈcýªG’«ô"Hx¾çS•ö$Û_Œ*[£n~OYgÚC¢ã® ø LóÃI8GU–¿Bã¡\‚–Ÿˆ{éõ´Sû›7M‹Š–…;ûÛ䃵h¹0GQœ&÷ <‹"œ_ý¼ÈAze‰ÀN2ÿPÜJ"u]©¶ÕLòs.}æQùü‰iõHö5¨ñ‹‚‘öqLðëƒýUj[’ =Á®…1Ñè²YÆHOŠåoq ’„!¿‡RÒ¯¸ð%ê«~u¯ ³¿0Š×·6î;>nE=m½aÔ\{\ÄcïQq”&T/bµ^þü‹}m“¹ò A’ü陈×O/ÍI>c×b%ÒÌ&ìýºªú· ¶mJ;û7žb{ª6eC‰Æô_è<@ÀbW’+Q'‘šäçÚU›‚ݧ/ˆ+ƒË°a*¦Ûåõú/5 JÔ†½ó'lï 0Kf›/Ð^‰ˆÖ½žO¼¡M [If§€ãC `æÔbï1}ÚU*÷i g#™HÓÄ+¸"î2X|F#êLq¶ÀØÙªþr#g <¤þdÑ _IÒõ.˜ê¢Ï\9¾§é-xÚÖ-9?›ìÐv_ wóý}¾éH`…Ñ'>Êß4¬>äŽT‹¬ÌÛúGäµGÔà…$Í ï‚7LI›u`žUJ2ì„΃79ç¯~f´lá­ÊΚìïW 5?|¸':U—.ûrJo ÇÓlÔË5áAÜçxE ³º×ا‰3Ç•ÚTñ#åKþtâ•.iKW@ö/É›ÔÑ÷ ûj&Q ¦Œ²È˜¥t°Èð§Äh-ؤ1íý b?e¾™F Š– ÉXrÙ/&Šjz©¨rAÁM°re.2Òe%ÉÍ£™6"5[¹(H4 :\mdb“™[i:ýP½2“¿Ýä÷ö0JÑ»pÕh¯QšQ¨ý±Qó_»Ã7;mþã«÷Aú^ÁÐ; Ó èvñ¡Õñ¥ã«*’Hóß¹,QëtT½}…ÁbWý€g”ùxÔ$Ó¬GÞ×™®'}¡uÞói õ´’D§ùõ; ¼xðÞԡư~. °öâ%ÅÅ4O”˜»ª¡ Þ»Bï­\ÿÆÈæ  -†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚü3ü)èendstream +†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚüT])øendstream endobj -1355 0 obj << +1354 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 36 /LastChar 121 -/Widths 2711 0 R -/BaseFont /GAUYBT+NimbusSanL-Bold -/FontDescriptor 1353 0 R +/Widths 2710 0 R +/BaseFont /URGGYN+NimbusSanL-Bold +/FontDescriptor 1352 0 R >> endobj -1353 0 obj << +1352 0 obj << /Ascent 722 /CapHeight 722 /Descent -217 -/FontName /GAUYBT+NimbusSanL-Bold +/FontName /URGGYN+NimbusSanL-Bold /ItalicAngle 0 /StemV 141 /XHeight 532 /FontBBox [-173 -307 1003 949] /Flags 4 /CharSet (/dollar/hyphen/semicolon/C/D/E/F/G/I/L/N/O/R/T/U/Y/a/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/w/y) -/FontFile 1354 0 R +/FontFile 1353 0 R >> endobj -2711 0 obj +2710 0 obj [556 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 722 722 667 611 778 0 278 0 0 611 0 722 778 0 0 722 0 611 722 0 0 0 667 0 0 0 0 0 0 0 556 0 556 611 556 333 611 611 278 0 0 278 889 611 611 611 611 389 556 333 611 0 778 0 556 ] endobj -1351 0 obj << +1350 0 obj << /Length1 1166 /Length2 8911 /Length3 544 @@ -13388,7 +13374,7 @@ x U 1Kˆ9Pveá`e(ƒÌÝ\4ÌÀŠ,ê@k7À+Èc†LC£ rµþýJH8Í\A°¤™ë+¯iãP2sp²8ØØß ðp¼®Ù¹þ „8 TAo€*Ðèl¿R’ 7 ØUÃÍÑÑ´Tº@Üœ-€.«×Êþ3+@âèå ²¶qÐk©ë0011ÿ áàçç˜{ýÅ$. k0€öuá´‡8þ‘éUB:¿mùG¬ª•™”%Èõvô6®®ŽllŽVfÀWŒÕÅŠ tecx-T l)qøCÀùÏ$AÎ@‹×¦¼Øþî›âöùØ -¶ü³%K7G6-0ÈÉ ('ù?Á¯ò¿0k +€‡“Ÿt=-lØþH©éåü“äø6[úù8BVfö.@?ðõ‚ìãbæ¸:»ý|þwâßwÈK…+Àhýz ÿR…VÿØ+™¹:ƒ<ì¬ììö?¾ÿ\½¨%lïõ¯pe3 €MVYQ]K—éï½ÿ3J\ò*ÉÂÁÇ `á|Çó:)¯Šü<\Wü§ùð'ªjúŸ:Ùÿ%)¶‚øÿÑΫµätvyMýŸcÌøw}eˆ+È ÿ×è²ó°¿NÍë…㿎Կñÿu°þžCÚÍÞþOWèÿaàÕ€"àGìÍœÿ#ÜÌdïõ_nø{ ðÓÿБs5³Yˆ­íÿiÈEä ´T¹ZØüc\þrÙòÏç¨ +¶ü³%K7G6-0ÈÉ ('ù?Á¯ò¿0k +€‡“Ÿt=-lØþH©éåü“äø6[úù8BVfö.@?ðõ‚ìãbæ¸:»ý|þwâßwÈK…+Àhýz ÿR…VÿØ+™¹:ƒ<ì¬ììö?¾ÿ\½¨%lïõ¯pe3 €MAFKMVšéï½ÿ3J\ò*ÉÂÁÇ `á|Çó:)¯Šü<\Wü§ùð'ªjúŸ:Ùÿ%)¶‚øÿÑΫµätvyMýŸcÌøw}eˆ+È ÿ×è²ó°¿NÍë…㿎Կñÿu°þžCÚÍÞþOWèÿaàÕ€"àGìÍœÿ#ÜÌdïõ_nø{ ðÓÿБs5³Yˆ­íÿiÈEä ´T¹ZØüc\þrÙòÏç¨ qýñ$X8x8þÆiÚ€,ìÀ@—׳ø“‚-ÿ–R l±­®¯SiælùOàÚÂÍÙùÕž?èõÞ¿öV ×@O òÊ"ÄB0Ô¶6´ý¡ZŒØƒe’«Wëî·97rŒ=ô7V˜^e»bîÜÛwŸ³$UÇl„+ `•`¡Ã㉥bø<ìøÅ;X°°Ã°`d#‰NYë„”P/駯Øûˆ¢ R¾Kx Ê^P”ÝéÑKL`i„CpHôœTà‰ÉÊò+TŽøñž‚ÏUdíýÕàçG:%Ùmƒ#RPä»géäõQOï±+:°LûÅÑxæÃe]k/͉õJø:'º8ŸlJÛ¬žªGóy乌טòQK6‡ Ñ+íLvþ˜ð‰Å16(ÎñkX„Éßš†+…¨pœº–QÄ´Ôß^î)RêÔ[W,,¨Þ‘õÉ»ãp%n×)iuGYÖǚπñZ¬Õˆv4¹›îµ:®uľõ­«GZýÖ:„<=Ÿ@‡ª˜yÝ—l:GBÎÚOAs½À:rÁUuiw™ª¨,w‘ʽVç±ÌwZ6ç]ºš½žW߯e ͹„縤h£öÙ8âØYWÑtÔ¸c}ü5æ?°5&Jt”ùËÞ¨—OÉËÛòÁHÌîZ‚pr_‘\OœÅ±„4šß²~òIÝbâí‡y"ûÊ“¬4òŽZ¦¿;‚Àždz™RÑ t[^cíÆ=ðàæ÷Ÿ‘øÜÏ•ä =X}§^ÍóâÓÌ:Ë;}ß %[µ, ýÉЛ>µÞܱ^4AXç%ä#¬wÛ±W:eÅNã¥S¶SÈ“H f÷ÖϦŠKuP ·}.óF!Ö§•"k¯“/ågö«ÉФÁ  ê2³Õ°"Ý ÝkÇÃñJ @@ -13418,105 +13404,105 @@ g~nM"up^ Ðú‡ä9¬PjK¢!zóÙ!ñHaŸ´Þãïÿ¼£êOß,?€úVÐz¾’¢Œ¤ñ¸gTW-Š«XÑèƒðN¨PÊ94X}chAc~‡^ÅûI8Y½-°Ji ¾á.˜<®¯ÇIâšo,¦ÙNì¥#ÊͽÊûÊàùk¤lùnýh2³ÒþÝu<Aíâ$FŒþ¦ÏD!þ:ƒêj%FDõŠ‚QúPÀ„´èÖ#מbG¡³°ï\ùe%mËf›‘g'CÕ䦨 Ñ)Ê$‰‡x`A%*›H«¶#Ì'å;…p‘ûÚ9ß/iÔ¤N…ï#‰yàE×Óz˜8ƒÄÛ¼êpXe€N®Ñ †µ§r%ç˜û7¯¼Çé&ï`Foùª’׬ó›}tW™ë',4Ó‘õÊ™‘8‘À`Z*\-šðú[Ü‚JåÕ®{i!Ux„T û•ˆ¼‘‡ômÙ85û)îÛ¼e¢ý¾KµÔÌ;¨žè{ÜÈ¡¾è{´Ñe¼Žò»~!–±l˜×R¡^n`žTG?ÂŽÎCMž—û[©s¬ ;ZWÀá¤ì`±3iSw-iUÉCW©%Lí®GcM¦ÕãÿªzâÊZ•*¨±…¿ ÚVâ>xj„E‹ŒwêIo³}‚üH—ã Örú ãkÑnT‚e¿S< ¢x K»«- 1…‹54ËÆa«÷-ÕÜ@ÚUóªîÐsL/}8ÀѶ›Ñl¡ò‰ó9È+ß©O¹È¨qD‹£RKˆ7hëÀûÚë,l³Ž[‹x³#‹³ÆÒ4 -¶ÿÚ®½–ZJS•ñ~´õÓp+S!¨yWC6Æjy.Lä“X5­ ^g˜Â£˜ýÿòƒüÿþŸ°°š9»BÌœí}œ.®ç?þ€‡ü¿8sendstream +¶ÿÚ®½–ZJS•ñ~´õÓp+S!¨yWC6Æjy.Lä“X5­ ^g˜Â£˜ýÿòƒüÿþŸ°°š9»BÌœí}œ.®ç?þ€‡ü¿Xendstream endobj -1352 0 obj << +1351 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 2 /LastChar 151 -/Widths 2712 0 R -/BaseFont /HNLRUX+NimbusSanL-Regu -/FontDescriptor 1350 0 R +/Widths 2711 0 R +/BaseFont /KGUQHF+NimbusSanL-Regu +/FontDescriptor 1349 0 R >> endobj -1350 0 obj << +1349 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 -/FontName /HNLRUX+NimbusSanL-Regu +/FontName /KGUQHF+NimbusSanL-Regu /ItalicAngle 0 /StemV 85 /XHeight 523 /FontBBox [-174 -285 1001 953] /Flags 4 /CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/seven/eight/nine/semicolon/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/endash/emdash) -/FontFile 1351 0 R +/FontFile 1350 0 R >> endobj -2712 0 obj +2711 0 obj [500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 333 333 0 0 278 333 278 278 556 556 556 556 0 556 0 556 556 556 0 278 0 0 0 0 0 667 667 722 722 667 611 778 722 278 0 0 556 833 722 778 667 0 722 667 611 722 0 944 0 667 0 0 0 0 0 0 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 556 1000 ] endobj 1310 0 obj << /Length1 1624 /Length2 9769 /Length3 532 -/Length 10632 +/Length 10633 /Filter /FlateDecode >> stream -xÚíveP\í–.î xÒ¸»;ww4t5Æ5¸Á=×àÜÝ‚»k°>äûî™3uîüš9¿nÝ]Õ»ö»žµž¥ïª¦£ÒÐf“A-ÀrPG;§0@ â`áê¢ -uTa{µ©[ØCÏ´3ƒ@e€0°0@ È€-ÜÜ.!!! :€4ÔÉÓbm0êjé3±°°þSòG`áùäÙÒbí þpÛCÀްgŠÿ±¡6 €Ù€V{0@Z]ÃPQMÀ(¯¦ ;‚ö ×çT,*K°£ ˜ `uØÿ}XBA?©¹°?sI¹€'°%äÙ ìa vú±œÀΗçoÄ`í t„=×@-í]Ax–[Aÿ -ÈÉú¬áðŒ=“i@]`.–Î'àÙ«†ŒÜßqÂl€°?¾] Ï0jõ¬ ‚ZºþIé/ì™æ…!Ž.ØöÇ—‚¸8Ù=Ÿ}?“99Cþ -ÃÕâhýÏXÎ`k 3ÈìâòLóÌý§:ÿÌð_²:9Ù{þe ýKë?c€À\ÀöVì\ÜÏ>-aϾ­!ކEÑÑ - -àâü[ruúævþ«@Œf†é9 êhï ­08Ô °g—ÆÿY—Ùÿ}Mþ7´øßÒàK{ÿwÍý×ý—Kü¿½ÏÿJ-çjo¯tx€¿— àyË@*€?{ðgѼsÿ_6@ˆ½çcõ¯Šúà¿#ýCö¯˜" ø\)Gëç–°qq³sþ-†¸ÈA<À ÌÒ`´®Ö_r]GØÙâ~îê_}6âäüLÇbiçø§ü|C`GпÆþܨ¿"çÐЕ1ÒPeùïvë_šÏ3Óñtþ}U(è?xÞ¼z¼Ùø¹lÜ‚A^N€ —ïãñ/®žU0gˆÀ˜“““ ðüþÇ·ÿB#ëh ý™mÐôaÿúŠ¡g°¿¯·ý¹s›œ%+NÄ ›>*à]¹„‘n©w­¸ìà0>¦I‚Ôõ’7¶_„›üë%^ÍœKüÉâWöIñ‘ë¨âx&CêŒm -ä¿àh×ñ€F3>ÒaáÓ®GÀÇíí3IúYbɘ¨•šâÓ,&ÿ$ˆ)66ï7¿ï†%ër¾Ê_îoj_Yüíl§¾v‹w'J‘ñwÛàÎ}¾ÇÁú„l±•÷êµÂœé7ƧøêjܪŸl±Óä½ -™ç -™zçFˆoxDÔŠ -’ÆýŸ ò¸K`º•ü~O3¶Û•Äd2.›ïÈ"oÓª›+sÅ¡9&˜qèLÄä÷,Ä”U´Æ—ÀÃâÂ.©éÔ–ÉâEƒ€"~ j´ xÙ -ÛrɱÐ×_[Ú)±£öô-bݸ= ñÍ —öˆÞXi†šÄʨ}— )Y§(ŽRìº0U²Î<©¨m.[*ÓÖ)EûšÆŽG±W_óâšîÅœ^sÆ•U*âCw-ib|Lñl±œt‚z•ìqz«ç£©•´:lÿ#Xæb¿ÈîmÍ«akÔÊÆ¥is¯Iq8?#33¬YÁ±æ–Ö -U£p¨íùzæ§—÷7§DË\Ô2éª^ €4¹œ¢Ë0i΃@©”NtiôV øÑ-{î- ^ÒßúCŠQRæ—?S„›P·Öh ÷DUÅ•ôm| m«QR¬Û|Œ¾ÄCún§¯yè…Å>p>7ðÝÀoì#O!ÿë˜V©Ã¥ ÉBMb˹ ëgj„“ñ¹ü·]Ìį?y¿ZìtpKqtŸáçí¨84Îd‹Syþ¾¬Ÿtv­´‰ß®U—^òȧò ²®4-íÌ’ÏŸDáYÜ›wöjt¿Âî}Ä{µóÉŸü^9ƒ›‚'¦Ežbõè>ÝL»âï¹8j¯(¸¿Ò10#·ŸÞy¨”¯_Q˜qÊýªRM­¶#_ì<Ð'Þ:^ìö³¾#ý½¨¡&QZz±ÆÓnš7€ÃyF~÷˜{ -0L_ÅÈ™a攣×w¾js¾ƒ¯kc‰ÓoÌòAoÔH”¾•Ým<ìè·WpÔ Ç>£E/óMæ¨ -¢Ãü)Ä‘‹™”!‚¬QMžZVçü£ÅÙ?f t˯f'+jÉ 2& Ÿí¬1~»3Ù]*¦eæPˆÁà -´(®×áú7¾õu³°XDsÎФ-ßæ ‚ä< ]¤UO_CÑ÷ßC}Þ„©Õ7ã«$³$~©T)*üſתŒ?p3Q©}ÇéÉ“h†Ì ?‡'²½KµƒgòëÎA¸t,´ïG—½Æ2ÕqJv¶"ùÄÓ/$zÀ¨Âo>Óxùå„?æe“`µl˜&eo^äkbMšn«Ä6-ý…ù.Ìúo$KÅž =_Í@Ÿq¿úܳ}ïð¾) î†QZ}GN޾Ȁ"Ÿ× k¾Åš{7&H¢ñ©5ÞbTü®ãÔw6”ˆø×g¬F¼×ØNF´b¸ú ¢L¥p1–Eñ‹ -[=@{TÌÏ à¹ä„á£úVBØW -e?«ïÀï9Ìüï†LßÓ;Rñ÷†yá ZEåÍ´% ¢ ÕÚeªÄ&Ù—dwàšÂ#ºŸ1X*Bè$XË5Qt*Ñ"ŽNÙ²”äÞÆx©º…”éÙ)Ÿà7,5Í<²wážÿð€¿($ò/ öý²ÉG¥bà'úîgµÛŸZ†í4µx BuïFrOŸFw´¡3¶¥Ù^t’ú‰¾ex;óÒI )-϶‹mžzSsE#½ºz‚9¦ý°ÁÛ²¯BœÄÔg ™—¯Oõ«7íwR2ãvp…MqÛÕ–@{ì l%lB—7ñ {¥9rAüÚ‚XfBótf*œ\Õ!16¿îv_˜ù‹]ú¬ÊvÅ£ ZÔdïƒÅJ+fJ‹q삈ù‡Vê?µz³ -©^0?J¹Þ%S0F½¹a[A3ª_NáÒŸ5VÿBÏ~5enjž‡½¸Úºê!ÀeêW¬Í0róš°PJ«»OX\•ؼæ“ýˆëoE[×}œÛßõ¤‰XPUòûrx÷ ‚ñ!G÷‡M˜7öÆ_Û)û(Ô—þ6\”¨îZ×íoËÝ–°Ã¹ÑÎès‘X^T¦K˜I£û-ªv;Œ*î‚¡ÁÁ\^ÇÊàY'½v¹ÓeX&³x¿íÞt,®áÀ"¶¿Õ·r O“‹ÿ´Uct–zÛŸÔœ,:k¢³‚d -þm!u‚±Ý.óû<¥X¸L-åÀ£~Næ;9äWh·¤ý/"Ù+‹bˆJú;ò®Ùf—ùMØÅÆ©ƒ’™Š”µÔ›ãÂYO±"X{6´¸8ÑO YÊd–`+…þµQ¦ÞáÍ–éŒÕae±ÁwmÚÉlSäæøFBîÕÛ‘GšR™Áëxù¯Ÿ<ýö‡é/ûR#¶*w ©"/@€P+JcÞ‹¯_¨L$¿mìS ©—áV瘛hòÈüÀÊ[†;{Øå\I±Ú>k¸ŸÍ6ò®LèWhÊÛ§d¨n%ôÛB%ÎK÷7­8äÇ© )ˆ¹S‘£ª/OjÛœSNÕ[7’•ªq®÷ç„ñ'Æ °88<ÉŽê Æóß>q`™“a Î*($}RÚTžPÐio £·f›oa?ÖxXž“`gôß%î;P»®ùܰR>)5Ë5)ÀÚPoX`¢ø`*7…ÛÄ»'´«®5ùÇ+Öúuïno¬ﮟ9`Ó<´»ÐÜëOÌÄpâ’ÞÀæO!&vœÝTéR~býî¤á’ŠWQ|Œ\!EÐ:¸ çB«eV>*EÔOþÂÁs º -µ‚ˆVžÍ¼Jæs=Q‹•]28m*~)„2…ß<òY§ó‘˜ -D츜£/3à¹LÜZ‚(1±»wéµM ÓyKMØjY,XpjuG£äŠ3UMx9½gèOl´zÛ~‰ïß4û/}è´÷tUj»^É0Ô.½¤ÄÍ6fø¨·ÏÇ´ÉöH¯ƒÔ³˜-«Eƒµ™6y]Î(.öˆCŒú› -þbXïýÖî——UçN âô7&#ú³yź)¤µ¤*›= A+Õ/µwªY|§î«Itô^¨œÞýøŠ kc!@Ìâ×Îoé–TÐÂKª¦ÅY&ÉŒåʹÃI -“Z#ω,VÚ(œ”MÕÛ‚apa®šRè™¶¡#ÖqW3¹©aþHï«Û‹P>koQÙYvÓ}y»´7ˆP%¤o&Ê5ëÉFpJX¿šG™sÈè’ºñÑ Ìã‹AøÖzŽcøáC ô5slì‹vRuÆê=|aOLÙ!ePÇyL­Ÿ< ïíïaàŠ)æ¥:K,…_îãþ+t2†:Šu’&½ïë‰ÚxÀCÒÄüTœîS$°#géDèxúl+ÍãÌÍqä]‡çÏsº÷=5¸Ù³˜–ŸÎÕ{À¥pYqBx;µ Dj/YØ—ý–3¿¯&„¬¥d±ìTâ”qÙ+W{|°[TNôƒñ—SÿP¶§Äh™ïE?ÐC–Êt#½l]gvÊoàôžo=‹ê!^~•óà@Dk¥úiÌ–ê" v%¬Sϧ»–Ñì "…t—ÑzgÖÚ6Ý/ŠÀ¤ÊQ'ìp…*YrE[#.˜ð-îqhÌEÃçŸÔ—j$u´!Ú‹¦0 Ò'tõÍÖ™5ý¹Ý­k‰#ªõ¨p]죗mñ2ýنš&ºÓ†òåܨzD¶›ë8¹à·m­W޵´î_Ê[· -Ëc$9h¼ ß~÷¤ÕY,›=–SID!ÇôKu²¼l·»³ëF10Âw ÖV{XÅõn‘¨hÌtñÏ^Ôþ(öG+;¸(:fkŠ ñ…·˜²z$t#³Ï+}åjŒ}×4ýŽSªÅ¸0 ‹–ƒ&œ*åQnÿs 9R̬ëœ?ê(ÂuuuÏ0¯eHr¿i^À&­.`Å:¡Äíy¶*9Âï¼s*q$x°ë®L˜L}ÍÏ3û„ýÆæ—Âo¼–N#Õ¨åc¸ „iÞY·S÷¡#ÕÎt@—aü,ÍÃK‡½îÏKm¡ôl¿Ù¦1…¬VJ_¦s¶s¢*;‘ Y™)ÿÂóÌÄ=%k »¢qëqÓ‡ã~{¢a" Bê'Åbg,®sOG›†nGzÿîæâüR8¹’ð½cÊåëqKS*o¸¿÷**‘ãUïžoy!"¿ýwë%q¢õž'4XËŒ@¦gu6 ÆÛå@ -æ@à§ÃÍ[tW a¦Oc³%r"|”É åoxªn‡8àÅ•Ô6úÞwuÉ^ oG„$®Ðè{9³IÈêÊ£¦9]ÏÛ/FVÊ,‡2§Kv¥mLA†Ü`£ùvÒÞä«ß>ìÌTF”‡OhÏ‹#¬É}D¡j«Ä>ÔwLæEUý•œSm×òm Õ˜_©C=D4É"Û†,QVJ;2IÖ 'ËÆ°jW?EçÆpë«iœŸëÔÊ(ŒlÉ—km?\æ ]«ü+ô»¯òOõRÑÜhImV‚ÜÖvÞžÓJ–¬«i†˜’®ü9~.Åò?AEWðZQ†ú2Šo]’Ë§Ž¦¯F$PEy¸>¦ëD’à€q’_Ï•o[¤KƒægK+Óq¥õ{MÁŸÚyª¡WÎT°ÞW -ÛÚy—ÚnvI]Íd¤L%úk(““¬Àj@bÙñó0µ§ÕŠ)'ýÇŒ³Rf•±åE*Ýç-å®}€)W ùR Wôœj»•ð±Cÿð81fôêôq®úø×'DÎßÃîÓ.©Â¹U´ûÅKmM™úŒÜÒ¹d¬âyd”„è™Y~¿ôÊ@=/jÉR½è¥ö.5SØGäšl‡e‘ÓŒm -ÈOâÙ~Ù'V«™S0‡xÓ™8C‰œ†d£Çýsûž"¯¸±]¸ê´î>œ³æÐ|ñ‡™ -Jünqèèרô§Ty½šƒÊ¿¥I·Aq—õá‹Z%9?)¥§üŠp¢#^lÌáŒðÖ„„I’³ÑÉ!´ðKˆ«åWü–¾UÇCÛ¹†’º‹×®z*®éhíç&îÝÔˆ¦ÒpXNƒéÁc¾ù."”ôÃmPU›AJÒàäÝ -Uf’å¤ ÏÒê(HvÏÆ-nÂíÌìä`Þ0DEâÌ -ð¥ªT Žºù&¡‰àëvHìÅÎø—â—¨|2#‹ÈûjàÍ­~ v ]_¤sË–¸÷£dLý¶‰¬óªl?@7~ÕìÁf/Ôý]ŒéB¾ˆúT-êS“H¾Zª[Ã,›ìÁD#wÛL­øÍ”PÀ68I…ûs—t5\œB¦Ïq G)fŠ…î ÇÂŒ}”ðª4,m¶Ï]ÍŒš£±éŽ@·Ç"4BËý˜ïÎ÷oŸ¿ˆ9uK…é‚V¨‹Q2dY’㇠•oÐXë\\ÁT7ôéL§ æ“Å=„«ßKì»×…ãåÞB^¼ïñ:e:ºûA¾ºÖˆ…Ø×%YäÜ´évJ÷\«æØYûùJV},6>Þšv½øÈÏi÷°6™’^¸OøM–!kÚ^Ù»V·.—< ÉŽ-± 7ºK|áÑ÷„öc5ef/÷K%è¡NÆ$R^ŸS0qÔ7mÇ]®¸JÍbÃZeÝmµº¼Z}”XÍÛ«±-¨ñËýúz/;ø}…]pTH‘Mn–Í8>à¿ò_9þX°|ù/X£õZMÛër×4}ué]ESsüt)Ô¬ÒË-˶x¹ ì÷•â ßMÿ’)‡¡;OGÊØ'ŒîD0÷R—¥û`]mÒ‡âyuªi~6mÕWîÄ/%pòEdÉÛÑj,™”H¨‘…GÆõyYgÛçkê#cË1ÀÁùæ“ÁøbükV~,´3Î&ð©Ñ+Tž˜IJñû²ÏJñüݤѠûÞeƒÒMÐ-¹v6ÖY#ÅŒ‘[Ž˜7)ïyÔgšèo”èT8ýËy‘D‘éooÙàä»[Bpëímˆ܇44[ÍU Ïw†Çg¥7…¬9æ¼ÜKæ-Šu9;ü·(ÃJ<§°JD†„Oò³ È"ùÝýìÇ]Ú!öfo¯+#ß< -ÒÜîªQè]‹*ðåVäIw8¶ñÂi›M‰œÌ¿$a| ÙòȱV¼ó i×6\…¼“Dýð¹¢\ý£¡J©ÔK•¹¡áXl¥ÝöVƒoÓÞ$âbÌegž#ñò¢ïF’pÌ ¯Úè‰Ñ^rÅxñë‹L6ZŽtjE?L-hú^NÐdžÃÈ”>&É}fýÅö¾ ˆO£arû£¦7Ÿñu£H¯Ÿ7÷# &6…š[w%´Ý€£e„×·—*GU@–p>uh,¶é ß8º§H I]’{ø#Ôî[b\Tç³CíýEÊŒúÍÐ[*Wck Æpâ{g&A ôÁeP×4É¢‰¶š(…·ƒÑ†¦‡vöÉÈ%­9†Ÿdeíû¬ÚÉLawË¡yô©g|ò O,Í %\°©øØ©ô©Þ¬jÌo~Ä¡yo©;b”.™#qÂrÝ” H&÷ܰ8^G(l -¥›S+YÊ;Ūìâ?¬_§IÅ>Ø7!ÒÇÏ£ûQ -aÑF"$²¯Ö­|3ß!i#ÌT<ÆK[tô p;w»Ô.Š[° - £M~Ñg<ÇÿšâNÜ~¬Š$’ýg¼þØþDz.“›¹·hån¸¯ÞL¿Ÿ€!Åo›h1í æ|Ѿì,«²éWlãñRÆ´„š—)Ø=¤Ñ^»â»b¼;» -œ\7±?·-ï¿ý÷¥“ MEo,ÖA„&±}â÷ÂE¥§Þ[:Ö¢•P’º‹qݼ¡©Ù¾u¾1b’0W—¦‡WG&Ù¼2ª¡t7· ,Îĸ—Áw¾Î”…uÑÎŽÕý9f8xºH]*ùY=ŤÔ\">_xÞä¾dB²a×/Ë—œ{íÓ›ã¾p‹Ä#åN³Œ„„×ÙZ¿5ð -‹¢T4ƒ %ŠÑÔfj ÂÅ4L7¹ág¿«“qàïÖÈ@¨DDF‰šO`„®vÓ(…dE^€É0Þ±½ß­O{_õÌ¢„Îú‡Rô¤ê quâat¼ÉXe²Ì¾ÎKä£^´¹î¯é,’Ôªy–„ø<œ§c9\`9[B½‹º‰¬ÍDªc£ø,̅ò=åÃÄ3ª"&‚Œ™ž :XKdÓNBl|ÂX y‘|$F¿¼EcL;×Sü¾g*›EHç8’‰¾óűŸôûNYµ]¿FiS_q³;¾‚AiœôÂÑÅúÈÝÃNÞ‹Üwæ¬J¯@Ï“¡–ËG±M· 3% ÍÀ·°XÄ óv¦18+M“wÉâý÷8K‡ó–ŒÀ:ÉÉ/Œ-y$"£âµ°S]{:‘)EÜYíkNÖþý½5c+›éjþ6Ó×”<ãñ ËK¿ROFbñŸüDMòx_ÅΜ8µ¦aëþtt—ÄŠ³Ô¿¨ŸŸá¼Ó©ùybŒ5¶È~™5éÜIo>Øúèo}1”ÜÍA£oBV¢OÒîdÁ¸G&þüÃbZh“¡Š9Ì!ñ‹½ô#_7eµµn…–×ÃW•oøÔaç ÝSKþàj?!ÿ²ªugò«êʘ%Gå›5–×’aèöô ßÅÐYᆋ/ª{Á§É‰˜ö7J†äÌr0ÞW @LÂï’âCð'<+BÎ8~¼ÞKiÈ>ÀI -Ä¢ƒ7Ó*e¿§Ô¥Ä‚¦o‚¶n»éPà:m;Zd%«xc¥Nâ™aÔŸ?¥=€ýZuxçY+¤ó^¡Supã}ÏC£Õ,ô\r”xW)<çK qm’E+Ëç‘‘DÂó_ïŸÃñÆ@V7³îÒ³3›”a¤)dÚ?·Ý‰@xäÄÀc”´Ï0̓ºÏó"óâ½û™µrJóòZ˜JÅ›=2Ónñgkù"áz@éóa⵬å½µ?ÝæöP¤!}•-ҾфýG¨ÈVËs­Rñ²aTRïäËâ‚k\Ãb¿U¶.ÁãgößvQ¼h-aó•âœrfAÞ€ÊUÁèDZ$ù('€»¯LM£/hj¸ÒRöâfòg ¶ËާÝÞ»'ûêºn ³XÍw‡W×6>y~ëF—Æ”§üŽÓúÝ—HÒN•Ûë{Bk}ÒLþo†ô&‰¨¶ßgÎ~Á¼Ù„¨;¥rÁΑ½‚ãi?:±{Êc<ű26ÏÞSˆS¯ÉIy¸z/´Oœ*kYi‰ÙË6lRºQÜqà -8¾÷z³ž“pTÞC»e1—´}FyèAò%Ó¼&Té³ ÌPæsî'éÄÕH]†ÌBøÓõöa"unáQaÝ,«N”:FÝÑû£i'Ñ£1»Ö[¤$ëêj€þFuÙ¡dò–MÏ~Ÿõ½bœ¶¹k½žØMƒGµ*‰ÃG”0õé ™ØÐ€BBVÅBZ_Âë /y LæBÀkˆß–œ2}Â)<ª2{2nUb^=èΗx¨oDÒš6ž_›ÊXÒÙÜêÚÐ×x¢–ÌnM¢É'¦WÍäŽî$ 9Jœ )o¥ÇH—ð“ q\£ÍÃ/Ïîí3Ê&”ß^ßfn%5zÄêrÌV,qZ½ ¥™ÀöKןÝûˆAüV <³kù6~öœáeË8~y¿òWËBnÜõsnˆyý Ž€V9~ ŸŸÇà¤ëçGîYöÚ Í!÷¹¯sµ’)ñ•ïŽñÑ‚™õüZ>Jƒ"É7õdhNÞ¼@ÖèMK¸ãÑ£×½³]M‰kS 6ÅG‘,¢¸œ# ‡šS½À2¿A0à—‡3èý!SêÁ;¬ü¢¦xr{­ôÓ›Ç=\Ô_¢Ê;bêŽÈçp’®¼Ð™åu¤îè &Ê&¹B‰›‡ÇRIˆN 3ØÃb֨ь¼  ë}—ªm­qòq(væm—IÉùhj C¤9¯)I½W=d(‹ó¢‘ìÏÃvê|ñ)K’ÐJòáýSg +6DÄ[Z°!IÖú­çÙÇ+ÐÖÑІJŸdؽsFÔ£üÙubÙQ3*L+õ4í©·ÄI³t¤%‰pcÔMí{XØlùo,WãÆNË™”!6TyÏR»éKGK±è ×¥RLRÑ•ÙÙÃàâF§WG_œÙÎzð–:9Éx §ÙüÐjò´L³™åß‚!«³6{Ü?âú{ÄÉúÌÕ‰&Ž]bÑØ›Ë+jžÅýr¨gt2fÄêÚ+ÏÞ›í–j_€âY^ -ë1£äª .WÁPxjSÞI#Üʪ֊ çtûuiš!Çî½ÝSo·×íÓ8€+zqõSÈ¡,È!ë*T¶CÌ]ˆX­9v]&8S/¤ê`諺aÄcmHê–ELL.&Í·c_ƒ²ÍçˆSÈ<:~¦¹OÅ;E¥5Íq˜ÙŽà¶?ñv— nŽÓŽQ|oyèNÕïo磞YHºÜÈ÷”L¨·½ÛìC$?Màc¡"ÇN7ÎâbLnÙq: -§¬ì:9§ËY×ûM¹6­È"Ù~ÝßïJ™uz¢ƒÏCz ©aÞÉ!âÚª8µs¨•<Ä× Òð쳯†²Å³XcÄ*3å²›Ëj†Gˆ4£j2Æ÷Q@\}’Tyž¸¢i¼á8t‚ê·ý†ó`gh‡M£ïBD¸ëÙ›0Âp^*•-ºkjÚ·Z»æãÜd¨ ÅüîÇ&n»$q‡˜,[ijK„½½­%¡“îe6eS. âú˜ˆfÄ®ý>e¾î–â ¹¶« ŠØ£>;–¢‚/MòI”¡øi1-ƒ -¯‹3ÿ²]inÁàÞËDÒ>{ÓЈ dx—v³©lò9 ‰N‰+¶¦zöÍñÔ#é)ó\M£[s@Z›ÉR'õRÇ}ËAÕNQ¹IuÒ.8þÌÀˆ‚;a?ú“‡ö8ζÜ8ùx ÐxoAy橵"wðõçÆÛƒã)ï¼àì…ŒÞ Ί@ÌcKÚ_Ù¼Z‚{+ˆ•\£\hr‹v·ñjÉæÇ¸((%Õn¹ð· V•BòÃ{9y¦gN°œ fµv*Ûï›s**o™^þ(Ú‘r)`lV3°ð‘öTÇãèή hYmš´0”ÚÊ÷8K¯6ù€›§vóÉy“Æ 7D倷»ò§1 \eÌ}¯ø§5ˆòþ[%fvÄÕ'œbÛ©ö¦&©"ò­ƒõ4ìË*Ã5[Dô`1käý¶Õ•Ï ê`•rM<4{áôUC÷­øwݲðãT5cï¨ûët©„U0í ¶»©kµG#G”Ä~}±yôd¹üÄI!ß©¬ÐGÀEîn‡NOí¬PË$‰šÍµÃ‡WgÞú©é!q@¥{ß®ê7ö$¹UÔî¸ò¡Pšè¾Ð›ÍA©a•bg¿fD(s ¥ùv®gZÙZP€=NÕòä9èÕ&çýw…$H›Àì×Eg—ó¹-}>LÁ•Ó¦4üF¸pâX•*À¢„ƒ0¸LM­+ª[‹Àãco®OóbÖŽÓ% Hé.. Ê X;éôN~'R‘`&‹¤­óH–$Ѹ½¤[*¶–›< ZG„‹m8Blà ‚`•‰ -& ùf¾±<£>W†2<퀔ã*õˆ¦¸ïÞºÑbï)£(]|Ͳ7.ÅBêOo_™íí—I>Ĺ=à[väÍ$ø¸ºBÎk[œ y¸;ª$Ô¶VÔ¶¨ì+Qý †$·fø‰AÙu­õ€•ô퇚|ÄS)¬ß©ãb -ÞëÇáØ(>§"´Ô?"¸ÔvÂj“øÓ‹©OïDkº§«wèKêfhÔu­ÐàÕ–®L~vsÜLðw~ùŽø›f÷ÀGY¯y²™)¿ÓbOú©ogɺeÁ]ñ¡—êÅÇêá0 ·H—c<ØÔrZ :ÁÀ]>Ùã‚!ååÅÈØ¤üð¹‘c›€ù«ð#®QÆÂùOsYŽ\$yÓ&ˆ³±Ò„} ÏK÷ØÈó¢ä(ä&&¶¬SÊŠ¡ÊÛË4öË(d®NÏpT¸ #;®±õæü_>ÿŸàÿ K{0Ðu:Ûaü‘€?endstream +xÚíveP\í–.î xÒ¸Kãîîîh ±&и—!ÜCp ÁÝ-¸»K€àC¾ïž9Sçί™óëÖÝU½k¿ëYëYú®j:* m6I+¨Xêc²s +Ô Žn®ªP'6)¨ƒ•º…ð ðbÐÑI»€A0ÔI ôÁV°%€‹ Ä HC½\ 6¶0£®–> ë?%T^ÿ@ž-]!6Núçw°ÔÙì{¦øjƒÁ˜-` q¤Õ5 ÕäŒòjºy°ØäÐp{NÅ ±;¹‚™ÖP€Ã߀%ÔÉ +ò'5Wög.IWàê ¶„<›=-ÁÎ V€3ØÅâêúü €¸l\@N°çÀ ˆ“¥ƒ›ÕŸžåÖпrv>k8>cÏdPW˜«¥ Äxöª!#÷wœ0[ìoWÈ3 €Z?kZA-Ýþ¤ôöLóŒÂ@'W ì ûãË °‚¸:;€¼ž}?“9»@þ +ÃÍâdóÏX.`‹•ØÕõ™æ™ûOuþ™'à¿drvvðúËú—Öƹ‚¬Ù1€\Ï>-aϾm N†EÑÉ +rþ-·rsþævù«@Œf†é9ÔÉÁ `¶ÆàPƒÂž]ÿg]fÿ÷5ùßÐâKƒÿ-íýß5÷_{ô_.ñÿö>ÿ+µœ›ƒƒÈñyþ^2€ç-¨þìÀŸEóÖ üÙ€!^ÿÕ¿*êƒÿŽôÙ¿bŠ0Ðs9$lž[Âäbçü[ q•ƒx‚­4 0K[€5Èá¹ZÉu¬À.'ðsWÿ*è³'ç¿`:¶K{§?åçý;YýkìÏú+r})E–ÿn·þ¥©ñ<0/g0àÿ¸ÑW…Zýçá”ÔàÃÆ°qñ x8ü@¿ÿÆã_4ÀžUA0ˆ'À˜““x~ÿã÷ÏÓ›¡‘u²„Zý™mÈÉêyÌþSð¶tsqyîî_7ÿ9éœÿx0Øl‰±0 µ±KIO…Ug÷ÈwuûB ktòó+ í)ë‚¥æ÷•¡ìµcBM^3‡ÎÛJÌ;/Ú“À'¹~4Lyø+ô-ü,;A¦…Ø©Gúï}N¿«¬!ñqêílŒhj™Ü£P޵p» ^3Ò¸çÒ^9ãø[&#ú†W ÷¢êóá}ÂþõCÏ`_oû9rç69KV:°;6}tàÛ,rq#ÝRŸHZ1ÙÁa|L“É1ê%lÿHwAø×K<š9—ø“ů*’â£Ö PÅðL†ÔÛÈÁÑ®ãŒg|¥Ã#¦ÝŽ@ÛÛgô7 +²Ä1Ñ+5ŧYLIS4l&lžoþß; KÖå‚ü”ƒ¾ÜßÔ¾±ØÛM#|íëN”&"ãë¶Åû|ƒõ+/Äb+ïÕk…9ÓoÜŒOñÕ¡Ôž¸U?Ùb§É{2Ï2õÎ¥¸„ÕŠ +’ƃž ò¸J`º•|þO3vÛ•Äd2®›oÉ¢nÓª›+sÅ@a9&˜qèLÄä÷,Ä”U´Æ— ÃâÂ.ÉéÔ–ÉâE~ƒÀ">qj´ xÙ +n»r‰±°×_[Ú)±£÷ô-bݹ< ñ‚Ì —öˆ¤¬5ÃLbeԾ˄–¬SG+v]˜*ÙdžÔòó×6—-—i딢} Kcǣث¯yqM÷ŠbÎ@/Ø¥ãÊ:ñ¡»–41>¦x¶XNlu‚zìyz«ç«©•¼:ìð#Dæb¿ÈþMÍ«aÔÊÆ¥isïI18#33¬Y±æ–Ö +U£¨Ýùzæ§—÷7§DË@jþtUo«À4¹œP¢ËpiW΃ É”ÎtiôÖ øï[ö•_¨ M¥iig–ü;`|…WqoÞÙ«Ñý +ûw‘ïÔÎs$~òyç n +œ ˜y‰Ö£wøv{2튽rÔ^Qp}¥c`An?½óT)_¿¢0ã”=úU¥šZmO¾Øy O¼u¼ØâoÉ?|Gú{QCM¼´ôb-¦Ý4n‡óŒüî1÷` +˜¾Š‘3ÃÌ)ÿF¯ïrÕær/Vׯ§ß˜å‹Þ¨ÃŸ(}#"»ÖxØ9Ðo¯à¤}F‹^æ—ÌQL‡ùS#3)CY£š<µ¬ÎåG‹K@Ì@é–ÍN0zÉ2.Ÿí¢1~»3Ù]*ªeæXˆÁÍ +²/®×~ƒß‚ú¹[X,¢¹dÈ hÒ–áσrP­ä<¡]¤UO_ÃÐ÷ßA}¥ÂÕê›ÇñU’Y?ŒTªþâÛkUŸ›¨T‡½åôâN4CfПÓ ÝÞÀ¥ÚÁ³ýuç(T:Ö÷£è !E¦:®#CÉÎV$ŸxéDUøÍK`/¿œ°ãϼLb¢– Ó¤ìÍ‹zÍM¬IÓmئ¥¿0?Ð…Yÿdi£øÁ«¡ç«™UÇgܯ¾÷lŸÀ ;¼oJƒ;á”Öß‘“·/2 ÈçuBšo°æÞŽñ‘h|j`·»ë8õ› #"þõ«ï5¶³­(®¾Q¦R¨Ë¢øÅ… =:ægpÈ\rÂáÐQ}+!ì+…²¿õwÐ÷f¾·C¦ïè¨øzýq­£ófÚ’Q†êí²?ÕNb“J2;pMá=Î ,•F!tâ¬åš(º +•h‘G'‹lYJrïFc¼UÝCËôì•Oð–šfÙ»pÏxÂ_”„ø}Ùä€#€R1ð}÷7ŒÞíO-ÃvžZ¼´BõèFrOŸFw²¥3¶£Å™^t–ü‰¾et;óÒ™¿)-Ï®‹mžzSsE#½ºz‚9¦ý°ÁDz¯BŒÄÔw ™‡·Oõ«íwR2ãvp…mqÛÕ{ì nl%l~BW©ø„½Ò¹Ç`>m,³FÁy:3•GNàp`ehŒmÐ/…»äf¢—¾«²]ñ(ˆ5ÙûV¢¥3¥Å8öÁÄ|C+õŸZ=ÉYU/˜Ž¥Üî’)£¥nØVÐŒê—S€ú³Æê_èÙ ¦±ìç!Á/®¶®zpÙ°ªÄk3ŒÜ½',T@ÒêW%¶ïBxe?âXÓÖuçöw=i"T•ü¾ÞÇý‚`|ÈÑýaæƒ=‡!åg7å­‚úr#Àø@‰Úè¡õq Ùá¶ŒÑ} ;‚ ýèì€>‰åEeº8€™Dà}¿eCÕnçQÅ]B04$è}¬ žuÖk·"w¾ Ïdë·À›ŽÅ5XDãëѰþVŽáerу¶jŒÎRo×㛚“@gCtVŒBÁ7£-¨N0¶ÛexvŸ§‹—©¥tÔAÂÇÉ|'‡ü +í–´ÿE{eQ QIGþÑ5Ûì2¯"  »ØØ uðQ"S‘²–zs\(ë)VkÏ–çýÁSB–2™%ØZ¡?Rm”©wx³e:#tuXYtðm›v2Û¹9¾‘ Gõ6GTŦä@fÈ:^þë'/ÿýaúËß~Ô߈­ äÝB«È Ä!ÔŠÒ˜÷¢!+äêÉoûTCëe8BÔ9æ&š<3?0‡ñ”áÎu¹TR¬¶Ïîg³¼-ü–òæ)™ª[ ý¶P‰óÒCj¢‡€ü8•!Eƒñ#W*rtõåIm›KÊ©zëF²RuNøõþœ`þÄX ¡‡ÙQ½¡Ñxþ›'ì`s2¬ÁY…¤OJ[ƒÊJ:í-¢á¢ô6lóÍÂìÇËsâ쌻äB}j×5ŸVÊ'%g“B¬ õ†&ЦrS¸L|zºêZüb­_÷éöÁ +õéú™6ÍC»±˽þÄL ç)&ÑèjþjbÏÙM•n!é/ÚïA!¡xÍË -‚ÖÁM¸Z/³šðR9ê(¢~ + +™kÐU¨è@´öjæ¡P2Ÿë¹ˆ^¬ì’ÁiSñO!”)üæ™Ï:픘LjÄT lty™ÈeâÒ@1ˆ‰Ý½K¯mJ˜Î[jÂVËbÁ‚S«;%Wœ©jÂËé=Cb£ÕÛöO|'Õ°ô¡ÓÁËM©íz%ÃP»ôV€7Û˜á£Þ>á[ë9Œá‡/Ò×̱±/âØIÕ«÷ð…=1 Hd‡”Áç1µþò,<·¿‡A+¦˜—ê,±þ¹û¯ÐÉê(ÖIšô¾¯'jãIðSqºO‘ÀNœ¥aãè³­437ÇQw^?Ïaè>÷ÔàfCÌbFHx~:°÷¨pYqBx;½ Bj/YØ—ý–3¿¯&Œ¬¥d±ì\âœqÙ+W{r°[TNôƒñ—sÿP¶—øh™ßE?·#ÈS–Êt#½l]gvÎoàô™o=‹î!^~•ó€@Dk ¥úiÌ–ê* v#¬S…ϧ»–Ñì &…t—Ñz…dÖÚ5Ý/ +Ã$ËQ'ìq+YrEZ#/˜ð-îqhÌE"æŸÔ—j$t´!Ú‹¦0Ò'tõÍŽ6™5ý¹Ý­k‰#ªõ¨p]죗mñ2ýنš&ºÓ†òå\¨zDvA›ë8¹à7m­WNµ´_Ë[· +Ëc$8h< ß~÷¤ÕY,›=–S‰G#ÇôKv²¼l·¿³ïF10Âw ÑV{XÅõi¯hÌt È^Ôþ(@/;¸(:fkŠ õ·Ÿ±z&t#³Ï+}6ƾmš~Œ@Š)Õb\ÐEËA“FN•ô,wø9†%jÖuÎ}鶺ºg˜×2$1€ß4¯?«‰’‰öfâCì9ÙÀr‚#Íʱ9^ûÜqI*Ý…8vëðU¦Q¹D:M6å§×‰ ̦“0ÕO›z¾@3™FÅ65"«VñöéJ6—5¬#z—ÑÆ˜êɦp,žZÞï¹ß?¢{ÇA}†¡§å¡2ooünU÷©>,D¬H\œ_sÓBlînKÆ©¸Ìí›ÒÖ wéTÛZêO8Q3d‹ðô^æ +!Êf¿¯ožø˜´¾€ë„·çÙ©ä½ûñֹĉ<òÁ¾»2a2õ5ž{ö [Êö—Âo¼–N#Õèåc¸à„ižY÷S¡#ÕÎt@ Ð0~–æá¥ã^÷ç%„¶°z¶ßlÓ˜‚Ö«Î¥/Ó9Û9Q•É­Í”áyeâž’µ†_Ѹ÷¸ëÃq=È=Ñ0aFD#õ“b±3×yˆ¥À£M‡@·£|~w9¿N®$|ýÎ Aÿú„Èå{øÝý#ôuÚ%UW£Šv£X©)Sÿ‚‘{:PÆš žÛQFIž™å÷Kï ´Ñƒˆ’¡–,Õ‹^z‘÷>¥±¢ +;ãˆÀÉvX9ÍØÖ!¿ü$žÝ—½qbµš9sˆ‰K”ÈyHöýâx@nßSÔ¶°NëîÃ9kÍ—˜©€øïÇŽ~­ +J•׫©1¨|[štwqY¾¨U’ó‘‘Rzɯ%:áÅÆÎmMˆ›$¹mH ¢E\B´X5(¿â·ô­:jÜöÈ5”4øÒ-X¼vÓSqKGk?4ñè¦F45†ÃrLóËw¦¤&˜hƒªÚR²X! NÞ­Pe&YNʳÖǼðŒ#I¸YžU¦ºŠtL’šG®“€cu+Cy²¸(£B»<Øìÿœr-D\ò¡„RêYV»˜‡âVo¡þBsS ¥6¼œÇ’¾Øg7Cž¼1r¤Ùkï:ÈOÖ–èxóË ÿþ„)Úr1òdh^B¸Z°`ªzRLój¼{áV¿á-BÁôÖ¾÷HLÜö«GÕÅÆ®¦^×\Œ D¦ÆÂ<\‘H,ÌÎíô|Õ:[»%Ìíü˜=Óͽ†«jÙeÎÏÇê[ö´)Ÿû'.ê»N»¦Âè>s~cåòÂûˆbQ¸ºÎ÷5–);B¦†çë.T¼ 5°ñ¨iþ±îе;oq ¹ÑqõÐßtvxª ÐÂÀÊ ]¦ùÒÚšIç.·¦ó2 Þ4¦ì°¸á¼µžl?€e¼|ëtÝ(7|[Ù¯QõȱóãÅk¤k¸Ìfƒv5î]h]¦y5\œYNBy›¥NÊ G²¥&tæI¥­:¡Ê9z§7½Í¼ØÛ*ñ'‹ÐÏÍ%Šx/£ì4ŸÓˆÜ!­Ž‚dl¬Ñâ&ÜÎÌNÐ CtÎ,?oªJ•À¨»_š0¾n‡ø^áL@)~ù€Ê'3²È\ѯ>\ê—`GÚõEú1÷lñKp?JÆ(€›È&¯ÊîtãWÍlöB=ÀÕ˜.ô‹ˆoÕ¢>5‰Ä«¥º5̲ùÁL4r÷ýÁÔŠßL lƒ“T¸ï0wùFW#Ä(dúœÖp”bö§Xè¾p,Ì8D ­JÃÐfû<Ǫ̂9›ît{,Â"µ<Žy?à|ÿöù‹¨s§±¤Q¸®ÕÊu1J†,Krü¡ò k«˜ê†>©âÔªùd1Ráê÷ûîuáx¹ 7OàÀÅ»_<ΙN~Á¯n5$¢¡5G A Ö97mºÒ=ת9öG6þ~U† E_‹·¦]/>²ÁsÚ?¬M¦¤î~“%GÈšö§Wö)_€àÉ ö·ÖÞ¼ørÈŒ¤»`{ù¶¦ãÙcŸ“ª…žÇca „(ÿ…Uª| aµÁMfGš_§¾ôX±ÛnG˜¯¿"ù:¿=²ÚVjª §x§ÝÝQû¨`¤N‚%•=_ìÒèÞÐ22Ô/w¾áæzY}Å +tw†W’Ä7îMl(„gì1®úèÁù“€×DÍ| ¶‘Vš&SßTh8ñÂR©/$üi.æ ‡í9þ×úrS+ýhZ©¢I„äíò·J¬eÇvŒcÇ3š3þhý§º4(êtü½ß—w˜¶¯µÑæXou½WH +Œï”fè|OÊáƒ{§7tžrŽ*ìƒc¬ýá‘ ”œ´iëqz8*^¡·ÜÇê>äw Ä“ÁèØp§»Ä÷ô}×Hè0VSfÆÿr¿TœêlL"éý4C•*h;îrÃUúhÞ* èn«ÕåÑê£ÄjÞ^mA_î×çÐ{ÙÁç'øèŠ£BŠlr³lÆñÿUÀÊñÇ"ð€åË/x!­×jÚ®X§»vé«KŸ*ššã§KÁf•^.Y¶ÅËMP¿Ÿ$gÄnú—L9 Ýyê8RÆ>!t¯`‚¹—º,Ýëj“¾Ï«SMó³i«¾êt'~)³"KÞŽ®`cɤxB,<2®ï›¨:»>?Ó€;ŽN©O +ã‹ñ¯ù[ù°ÐÎ8›À§F¯P¹#a&)ÅCì˾+Ågðw“Fƒ{— J7Á·äÚÙXdyŒ3FîEX÷¢>¤<çÑŸiÞ£D§Âé_΋":èˆJsË'ßÝŠ[ï`Ktà1¤¡Ùj®jx¾ó0<> *½)dÍ1çáZ2oQ¬ËÙá»EéVâæ8Í€U"2$|’ç7˜]@Îïæçïg?îÒ~ u0{s]%ø(@s»«F¡_t-¢À›[‘'ÝáÔÆ§m6%\p2ÿ’„ñ5dË3ÇF5êΓØJ»¶á*ô­ê‡ÏåêRN†*5¦’/U憆c±•vÛ[ ¾Mûˆ‰2—yÄË‹¼AJÂ17¼j£'FS8x Œðà×™l:¶éÔ +{}Öac%î­b¦ûºåGåðÄü{`ÛáV<Ô»àz£(:ô¨‘IÇ8ÑZooŒÍÀ!•¤ú”Û|£80J³$&üõV«ãýþZ@ö áŒËò¸^¨¦ÄÀi¸´Ù¹~kk›âý h¯?¦4 }/'x2ÏqdÊ^“ä>³þb{_ÏŠW£ar룦¯?ñu£¯•>^?OîG,\t ++,·î$Zp»G˯7n/UŽª8,á|êÐXtÓ¾qtO‘’º$÷ð!F ¸Ý¯ Ÿ¨Îw‡ÚíýI3j©¡7:UnÆ6ŒÄ÷.LâèƒËaniEm5Ñ +…oßšÚ;$#—´æ~’•uè³n'3…Ýq,‡ñkäÑ7¦žñÊ3"•wº~z3ýþü†¿mß‹j_0ç‹ôegY¹Ù+›Q‘~Å6/e`LK¨y™‚ÝCúÞ{WlW”§`gWxûsÛòþÛïq?š1qÒôWôÆ¢Di’‘Û÷¡þ/\UzZà}¤c-Z %¨»×Àšší[ç#& suipxudÍ+£Jws Bb,ñGŒëp¼çëLYXí,ì8|PÙŸc†ƒ‡a‹Ô¥ŸЃQLJÁ%bù…çMnK&$öý²¼É¹ØØ¾½9 ·HÜ’žè4ËHHx­õ[¯°(JE2˜P¢Mm§Æ @¦aò¸É ¿8‡]Œƒ÷DBí$"2JÔ|#tµ‹˜Fi,$k:ðL†ñŽ5øÝ†H}Ú»âèïd%t6?”ÞOªþ˜#P'ÎBÇ›ŒU&Ëìë¼D>êE›ëþšÎ"A­šgIˆÏÍy:–ËÙê]ÔMdm&rSí Àoda.”í)¿&ž˜Q6`¬°ÈôJÐéÀZº ›vdãÂZÈ‹â%1úå#cÚ¹žâÿ=SÙ,R:ljL䭎äÿwʪíú5JÛúŠ›Ýñ Jã¤N®6GîöòÞä~3oaUzz^ µ@_Å6Ý.Ì”$4¿ÂbawÌۙƬ4Mž%‹w7>ã,.[2üë$' €ÊUÁ·ÈDZ$ùhg€‡ŸLM£ŸÕÔp¥¥þìÅÍäÏl_G–/û½·OÕuÝ њ®m}óü×.!Œ (Où§õ»/‘¤+ ¶×÷×ú¤™¤†ô&‰¨¶ßeÎ~Á¼Ù„¨;§açÈÞ!ñ´Ÿ¿ +žØ?å1žâX›gï)Ä©×ä¤<Ü|Ú'N•µ¬µDd6)Ý)î8pùÞyKmGä$•GôÐnYÌ%mŸQz’|É4¯ Súl3”ùœûI:q5ÊÊ>Cf!âéúû0‘:·ð¨°n–U'Z£îèÝQ«4„“èј]ë R’Mu5@£ºìÐ2y˦g¿€ÏúN1NÛÜ­^Oô¦Á³Z•Äñ£gJ¸út†LlX`!!«b !­áu†7Ž<&sÁï=ÄgGN™>áU™=·*1¯t犉?Ô7"iM› +ͯMe,élnumèk¼NQKf·xO¢É+ªWÍäî,9Jœ )o¥ÇH÷—uZ£³š‡_žÝÛg”M(¿¹¾ÍÜJjôŒ'Ô嘭Xâ´~AK3ퟮ?;»÷ƒø yf×ómüì9ÃË–qüò~寖…\¸ëç\óúA~­rü +,^ŽÁI·Ï\³ì'´Á›C4s_çj%Râ„*ß㣅0ëù·|”¶Š"ßÔ“¡9‘z¬Ñ›–p!Ê­G¯{g·š:צ@mŠ"QDq9!7F:3 ¡ 9z3!i~=‚`À'gÐ/òC¦Ô“gXùEMñåöZ‘ÕOny«þUž‡0D^Ç“Ðtå…Î,ï#u'0QŽÉJÜ<<–JÂûò1ƒ=,ö Pí€ÁÈ›@ºÞ·©Ú6'‡bgÞty’”œ¦1@šóš’„Ñ{ÕC‡²8/Éñ<í¦ÎŸ²$­%Þ=u¶°òbC„}¤’dmÞx}¼²Úú"jµ¡Ò'~ï’ý(vX6GÔL… +ÓJ=M{*ä)qÖ,iI"\ÄuWû>[þË͸±Ór¦eˆ UÞ«Ô~ºÅÒÉRô}ðëÈÒ I&É÷•ÙÙÃàâFçWG_\ØÎzð–:9ɸ §Ù|Ðjò´L³™åß¡«³¶{\?âú¼j¾ðe5Y§6å¿Rƒ‰Œ]ܱpiP7Ôû¨v`ÞwûW‰ÊH:Éïqx÷Sd´ÞVe^PŽÛW'w¤úqÕ”šcÉ +„·‡ÈÏú꟥çf³ÖõÄ›M÷|!v`#=éŒ-wtCì{¶u¥'}ó°˜_¦*›­PtÜaŽw’ëöR\v^ èTª(Õ:¡_ àT·Q¥´æd…ùé’[‡â3®fÝ}öŒ“õ«!L»Ä¢q0—WÔ<‹üåPÏè !ëÕuPž½7Û-Õ¾6°Škdy)¤ÇŒ’«6¸\Cá®My+p+«Z+Œ8œÓíߥi†»÷fO½ÝA·Oã8¢è ì§C-XCÖU¨l‡˜»±ÚpìºNp¦^HÖÁÐWuÉÇÚÔ-‹˜˜\MšoǾg™Ï2¦9zvüLó˜ŠwŽNk<šã0³Ámâé.ا£øÞ4òЪßßÎK=+¼t¹‘ð(‘Pow·Ù‡H~šÀËBEŽnœdLnÙq”<Š ¬ì:9§ËY×ûM¹>­È"Ù~ÝßïF™uz¢ƒÏMz ©aÞÉ!nUZµs¨•<Ä× Òpﳯ†±Å³Ø`Ä*3å²›ËjFD +7£j2Æ÷Q@Ü|“T¹Ÿ€ïi|à8t‚ë‚¶ý †ó`gh‡M£oC…¹êØ›0Âq^*—-zhj:´Ú„¸åãÜd¨ ÅüîÇ&n»$ñ€˜,[ij‹‡¿¹­%¡“îe6±Ê¦\„Àõ5Ɉ]û}b•ùº[FƒLøö½}­@pä¶(õÙ±$|i’o¢ ÅO‹iTx]ü˜ù—íJs Æ0Ïôð\Î ’ö™TC#B>r  aÐ]Úͦ²ÉçÀ$:%`lMõ¬ÔñÔ#é)ó\M£/[s`Z›ÉRõRÇ}ËAÕNQ¹IuÒ.8þÌÀ„‚;á0ú“‡ö8ήÜ8ùx ÈxoAy橵"wðõçÆÛƒã)Ÿ¼ì…Œž Ί GÌcKÚ_Ùàæ©Ý|rÙ$†1È Q9âí®|çnLWsÝ+¾Äi ¦¼ÿV‰™yõ §Ønª½)´Icªˆ|kDÆ`} û²ÊpÍ=DÔy¿muåó‚:˜C¥\ÍA(=EÕÐc+þm7‚,ü8UÍØ[êþ:]*!L{ƒínêZíѨ%±†__l½X.?qRÈw*+´ÃÉ=ìÑé©]jÙ‚%P3°;¼x•qæíaŸ‘Tj°÷í«~cO"[Aí+ +¦‰ì JmJ«»ø7 B™[(Í·s8ÓÊÖ‚pª–'Ï­^mrÞWH‚´ñÏ~]tq=ÛÒçÅX9mJÃo„‹ ŽU©,Š;Š‚¢@ÈÔÔº"º%<ܾæú„1/fÝé8]ÃaAñˆô—bà Šµ“NŸä·Â f²HÚ:dIâýAÛKº¥¢kÙ¹ÉÓ¢uD¸(‘†#ÄÞ `V™ˆ@²À‘_æ[aË3êse(ÃãЕr\¥>Ñô×ÝwZì=e¥‹¯YÆE"XHýéí+³½ã2ɇ8·¼KÃN<™„üWWÈyìŠs!w§C•„Ú6 +Úõ}å#ªD‘äÖ ?1(»­õ¢°’¾ùP“x*‰õ;u\TÁg=ò8Å÷T˜–úG$Pm'¼6‰/½˜Š0qðôN¤¦{ºz‡¾¤n†F]׺ ^méÊäg7ÇÍ_ç—iÖq|Õ‘õš'›™ò;-ö¤Ÿúv6‘lZ<z©^|¬·pr=ƃM-§Õ ƒ <ä೑=_!B­¢½½›”>7r¬s±0¢~~Ä5ÊX8ÿi.Ë‘‹$oÚ1pQ"Vºw(á>`éÙb^”…ÜÄĶ‚uJY1Tyz™Æ~€ ÒÕéŽ +w¢dÇ5v>œÿËãÿü?A`é¹À Ž {ŒÿéG€%endstream endobj 1311 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 35 /LastChar 122 -/Widths 2713 0 R -/BaseFont /PUDZPM+NimbusMonL-BoldObli +/Widths 2712 0 R +/BaseFont /XWBDIH+NimbusMonL-BoldObli /FontDescriptor 1309 0 R >> endobj 1309 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /PUDZPM+NimbusMonL-BoldObli +/FontName /XWBDIH+NimbusMonL-BoldObli /ItalicAngle -12 /StemV 103 /XHeight 439 @@ -13525,7 +13511,7 @@ endobj /CharSet (/numbersign/hyphen/period/slash/A/C/D/I/P/R/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 1310 0 R >> endobj -2713 0 obj +2712 0 obj [600 0 0 0 0 0 0 0 0 0 600 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 600 600 0 0 0 0 600 0 0 0 0 0 0 600 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ] endobj 1302 0 obj << @@ -13541,55 +13527,71 @@ x www4Xp×àNp×à®yœs»ûö¸¯u÷¯7^±kìo͵撹öGC©¦É"nî` ’q°‡°°³² TÀv¦®.ÊöJ, KWUS[0à àF¦¡‘t!`{) $Й¤@f;???2 @ÒÁÑÓliÐkkè2011ÿÓò— ÀÔóß‘·H°¥=€öíÅ dëàh²‡¼Qü·5A Ä °Û‚’ªjåUdô²*ÚY=Èh Ps}kÅ  6Ù»€ÎÛföæà¿Zsa}ãw.Ž 3ð[Èà äøÄ p9Û]\ÞÞ`€¥3Ðò6ˆlofëjþWov ‡¿ rtvxó°{ÃÞÈÔ\ .fÎ`Gà-«š”Ì?ê„X!åv¿Á‹7Os3׿Zú{£yC!@°½ ò€ü•Ë0»8Ú=ßr¿‘9:ƒÿ.ÃÕloùÏ -˜Î K ³¹-ÈÅåæû¯éü³OÀêèèhëùw´Ãß^ÿQâ²µ`EfçxËiyËm ¶GþðײÈÛ[8ØÙþa7wuüwÌ äü÷€èÿÚ†·"€æö¶žsòÈ[JýOeÖÿ=‘ÿ$þ_øEÞÿ™¸ÿªÑúˆÿ§ßó¿R˸ÚÚªíÞà— àí–q(þºgl΀¿î'WÐÿ´Ûzþÿê¨ úG±ÿÆ÷¯°<ø6q{Ë7aXØ9XÙþa»È€=@æj`ˆ™Àhû6³¿íÚöæ g[°=èMÛ¿ÇúÄÆö/˜–ØÌÆþ/¸ÿìÍÿµü7¹þ.þƒ¢¸’¦š,ÓuÃþí©ö¶ -OGàßÒè*;˜ÿÇá/ €7 ;€…ƒ“ÀËËàcg÷ý/2þMÃþϳ2â ö°±²±±ÞþÿýùçéÓ¿ÐHÛ›9˜ÿµ9š ½ùÛ²ý‡á/ØÌÕÙùMã¿¿ÿ·¦ÿýü÷Úƒ@ 3ä_óf‚!ÖÙ™oy£R=]ì0¡Ž¥õZE…Õþü&Ï5¡¬ 㯭žsGŽ/; -Œ»C]ø¶ti ÓRß÷ Ý…X«´m¼L»AŒJÑ2uc¼Ïf•ÖaõyØtv7GÕ5ŒJžáÉÆÛ8ÏîÞ»àRß:¢û™¥×Åãµc6¼Ãþöåè˜6ùàî–®oxp ¿ó®{‡„)7‰FÐ 6:À)—DT_»Â;’iºv—"®;)ˆmq*ó‚?˜1û5_ÝN[ë’ǯ=×ç³"/LIê}Ä£›k¼¶lBñ«¨¯¾-š|oRkÜó&[Þ&±ÝñreéòDQnßô?ª[K79Ð7/Ù/–_!ýmÛÑŸ ·¥Ê“žHÕ]Çy÷A8­\¼ÙŸ.¶h¬æèú†ô“­Bj£­Öè®{ŽúÈ£÷ öÖt=¿ !æ¢DÚ–¶bO„t8&óïû·ù#¿-L.Ii§¼µ\’îžhRºª® xïNŒ¼LÒ V°Î¼0È'È:”n]ó’¢k+ÏQbÙP2ÿ,ˆè鼕8S“š·³ìâ>mLÃÂÇp]_1Œƒ,Žbš¨ðM›zÁí\#¨m-˜$²¶Ó“S”4cW"Ó?£^—ò–aÇ¢;áû±ÝP<Ö‹„¬²Ý2²&‡øÕÒ<³A–dâôÝÞ¡Ÿ¶*Ô1ó—)‘º°ÄÚnÏýå>ð,üöUaƒîùÂ4ÜU/ÎÏ ÅíºÏCÔ½!¼L0ûBkÎÝØŸfRkSGD:,þaX§}îK+žÉ¥÷ÆíÊa5òb=L§A!ô. ;õ“¹žEFìÎ`­;[aß9\²@§å~Ê3ùű óRIáPE‚»PÊ•!¼ö.líblÃ!3¢µÚøœÔªÊì=ý°:5¢Ä§"/pïgúîéãÄÃ7<Ú_ Ĥ(LF•žR.Ø31s[’\(œ‚®¤'¾t;ßw&YÒM’Žª?ºcmbU‹Š¶*´XÞ/‹ÿ2ä±I €¡y—Öë^‚TûþÒAªHAmfŠ É9ï§Û‘a_Ë®ÀÔa÷r;ôzp=§æ¬@[>`S÷µWøªNt°óäËa7&%êìXÕåÒÎ’Ñ{ î›òwß1 $t®L+í÷âQzŸº4ðm_ÈaêBkzK‡H‚Ï©-M_„÷œp:º¤õ4 1°îNŒYIzÍWƒ‰Ûyì ©÷ù3TÃÛu&ÌÀ„†6Ó¦0¥ÇmŒBw‰éÛQ¯èIR´Së‚òj>ËŧÒ—‚øˆQ—Šæ†ßF™bp5S±7ìu޽§±ÔlI*ÖÃ(>Úñ¨$®ßi w­i!œQ4±±¨äÀÌÂ…vU|Ð÷üÇ’Y›¾ wûuNWdtä[KÙm8~=¶iš5¾Íû]SMÖÑj.¾ ˆÁ±üqÉÒõƒÙøyÑ¿Z6k’ÅŸZåzÊIæ ù»:N=•´qo¯õ¹+¥„B™¡dì¡AÙÝÕÏYgOþ†¥tãµN•¶‚.“Ÿ„ŒE¤¥ïmvž÷ç]4Ú}Ò°'~ªRÉfv5cêÙ‰¯Ó‡)ë8jÒès°;C­L‡’~œ‹Ãò%¸ëP"¸ÞUÉì^ª¤6PçÚ'% ðãÔ' Nurp~Q Ø÷}ñƒ:|Š©½lLÇŽH|·—ÜÝþ¶w›æAµù½ ân¹‡T¦:¿ËzÊ( ï!ɯÄú_͆vEÂëÁ|޹Eʯ#«îu€U•ý9å™x¼.­dávÈ!ý:8ò¾€Ù€;pñJ#WT ¢Âª^Ûà'áHðmAFr4”,=gK3M¨Ì(R -ª¦S0†¶5§(ƒç•ÒÃòÙ#ÀÀîœj›Ó=âéÈmoßÐ -¸wÛõeä7ÊüÈ‚Wª¤I„ÜGñaquÂŒ†!q”ŠÂÓúF›ºNÑvw=É€ˆ ø?©þ¤ÝÊCÌõ ýß{?~µCâ¤ÝXœì†q&ç1j;¯ãI¢™Ô§U$´ö2s«Q6·oÛ†±Œ•°ëãä'n¢ªÌ(" iÅ ÚPV Ý£BªÎµqt¸Ö•Ým™Y•d>Ã[¶‰’¿¦ÛV­¸‰õ»ë+WÓP¬Å`,kE}±_Ys™°‘/Îþ’Jre»\áÓZ¸^˜ÐèCcê?SBk@z©É{ %7y44V‚ꪄ֯næíæ¹ßTd&…Ö9ª ¥opøZ^G ƒ¡ëƒDºqÏ’:]¢¾lÅþñKêà†îëÒ 7pR!42eƒI=%yøp¬?ó “yŸåðu]ËÛªˆ¢W¦@)Ñ>4F¢«À‘ºÎôÁö0òzú¬áN RJ‘½ÎwJúì‹ V9ûdõ®DlG"~›§’ö¯·AšnÃŽÍT -ä’Þ›«+;Wœ‹ò,ïV‘äîIº9^Ü¡U½0~˜ðâÝ^ ^ñܤOgn}Â]^¿¡%K(îù˜§½ÉõUÙó˜×òÁîôò#!\ßÄY¾-¯GÑÁ¬]@öõuÉsXú‡° _®l§Oìã¯U40&¢†b¾Ÿ»—è/IRÖ¯}à–ô +Â|úÜ‚îûÓÎPTæŒæÒïy#Eâ݇¡·läl.ö§¥V²!*\æê~ÓP„«D‚Ò”ü×ûS»/æ8?Éôi|nerøóRÜ~PÁEˆYG= Ò¿Ü@ìjpâ¹Á[8ü¿Ú.îþ?øšõ/“š Çͧա æÛ¥ØSXtÇ”ù"QkËy„_ž™rx -îÑâ§Ó/ÆÔ€P +°-¼ÝyתžVý(/}_#™mѱ¦€*¥f~[ópÏ8V†ÉÑ8ï„$gÿ" N:<3Uwñò›ðžÂp6­Ö‚ËI&Rü¬ÜŠÊ“‹pžÓo/8)Ô+~Û Js§\¢­öÊlöí»i{UŸÈ»Ã»4´½ÌM_˜š?Å]FÌ©•A·Ö_\"Óƒ‚’Þ}#FG ïK}g|ÿñÌàë":ŠEù×%ñ’õ.C!+6‹¼R±ˆà!Qê˜_};¼È#Ëö]¿?Ü~d'My*½{·8¿á+ínßû·/ŸuG«ø0¢ß§ÒÍéÌ–àb“'¥ÿî¤ûm>‚ÿ«?‚´Q õÞ([ºÁfMÛÿŠƒ´–?Â…?¬Žžš.Tùô+ª©ãJ¦eUq8jrÜ…Yp?Á ½Y~H…#úò=*Ïqí·Ï™‚T蓦ò¡E‡üA‚⫘Lm=ÏÊ72Ø÷]‹Õ™+eÉ¥½õ¦ ½=¾¼Eó@•3.¹w¹Gãd“•.Å/‹f\OFJ$Qó:ÑâTá…ݨ7BЖ_[E!üóèóªÝŸ$æžË 3D¦¹ã]DØùø#°¢R}’o²ä£K‘„Gâ%þJqI.Ö7Ï_5EÃ%óÅgAÓ^Ö³Þï2üúIk1Ý>Ĥ\V™$ÇÐÓÉL}mþ«Ôì~¹H£ŠêOð0Š1„M6kîwQ}¨ë;™[ŠmsÑ‚Èl…„ -ýò­Ã)8ȉÅ)7è_£Œ·ÆT÷ô壌mMÌœ+¤ -G¦©J¨ç­$î}0ÿx¯R7ë&K.iËP6RÔ.<,ë㺥1~4XÛ¸¥>÷Æ ètž•>¢Â:Ñ#)á>æk[¾»ïÛ'Îåõž¬Ž"¥à P¼Ê!B5ÿi‹ÒÌÒ÷ÀI¯´æ6‰ïíÚK²j?uFéi‰W!Ü’½ NÒ.TEtmúÖF°t޹.†}-¾ü%`úµÙVîC¢p?VúŽÎëÏ-jû-fÃrÅó$î‹Ï„¬\AËÇlä¡NÉWô˜,ñ¡ït5ë§¼À÷3Þµåb쑳¥+•æQ¹¦iÂSý Ý(Ý›Çi'o„ßFýØ ÕLã—$Ušfƒ)ß–J³6öoú«H ©ÝíISO×ûÏM§«ËS¥LLñ~ŸÅZcDòóJTIEsZÏYKÔT&6·)/ÇÃ,±L—,†»‡[Ò»sž£Ž‚gç¹9m˜½FVË",˜Ûx™£Ÿ¢Îúäç/û£ÜîdL3¨JÔ­Tú\±ÿHÉLÈïa…ºfNuöѯ&],rÁEÂÚ1DÚÇŠ -Ÿ`bêTèÖ6çCÅx+Äèô@›þ`ÙvªlÐTw»J·ô+²ùøp4Tâî]” ðâú>êóXÿfßdO¤Ï£\Ï”H:[PC‹Ä²¡-‰­Çó|—ÕÏñÊŸ0ï³iov%§Ž=Æ‘»ñfLu³$ŒX«Dm|BØxz’‘: ÍDï¾T–[&n'îóšZ) ¶L`z˜÷Î(1ܦ—Éc¥œ˜*`ï3Ÿ+F(ò¿gVà/_JcÄh‡ÛÑ|¢Üm:rGæ-Ãì]07‰±?×›­‡¶­0RK4åÀí+—‚`îŽDÕÐLºÎ’ùˆ9>ñ¯ëwe£¯ÓÑ©<Ôº:n;=]7¶cm$Ïjô¨âÉåx¸Õ8>Ãp:'`=2’¬~'¡·:é'î•üc|±#úvN<zê§„ÇHxw+Ì­it2e³¼SjþdÊ]Ràwó£ºö ÔBBBi‡žuexyUw5{GÿÏ«fçH¡ä‘Ë[‹ß›¹ö#±gàe©9H|CaÈ=¨«Ì¨D¥×òjî†æXJ(VrÙúg4€O8%¬i^ÙQ,*æî£%ÅgM¢b%D1dù×M¼ ¾“ëÎWðY)•=¼´`¯¬ ¿ l,TùáèõÅuqC'ïþDï7¼¤O¯·Äštéþ"Ìs¾Á%ÞÌø-".#S„ÚOXõNèWÇl„Ò]8T‹0üPÔ}zZÝ^„ð!¦Jr½fî:5…€c6Z¸ãGvÝ~Õ¦ÉþÍOqøÛÃÂÈ5Bl’÷eÆT5ª–ü€ÜØ­Özä€üÛ W–ÎòÏÎBÝî”}]Äè»vµ}V­&–h Ô0;5#ÙB탟{ˆ>â‚ éñ¯/bú3 13„;6é:®ƒ"|sjü”;“ã´iK—‰Öcˆ­^#kJÚ•üMCG&³ Ú#©Áœ¶}äe-Yò -iÓpn¥ISÖÎ.DŠkÞë‹eªñÔY’ªUÍwUûŠÔÅ+f*Fèuž“}¦ÛŠ„¢d „ë$;Ö ‚öaþr>wr9ÊDÛNý .Þt9J±”¨Ñ¸¯¦,'%PK·¸_OÑB¾h°^ï.ÖdYè1¦S+ïy‹Ô8=Ô®o Yzàƒ+GQKè AÈ>Ó$$½ôÏOòÇW[OV"õ>gç4BÚghFšdzج™}?щZ‹Å?fvÉ è¶&Àߣ®Žp÷ào‹›ºÜH¿B*LÕ5ƒ$O1BœÞ«Y,Þ.8KÖåê ·XèHs÷'(ýB¾}±¡ -{&p–è°ÌO@¤)ˆ -á(ÉÐ'k‚ï¾}ZuqåÙaÕa àuß+•?®Ò ,ç<Ü¢p)Lå¶c§z7ƒÜÇc®{Öß°Uþ­ÝûÁÞ_)Pùîã0Nh_4SÌbÉ- Œ”²:ã%¹îL¯EÑ)ƒªÇ7D.÷{¸>ÈL¾¯“G‰óEZ:|ÇL÷çÓmó’‹XÆ–U®“Ž€ã®$15ó³ºúP€àYqL4·ÉÎö‘Û¬¶o¾ûùp¹ü²Dæ‘§Íþl;Ux­!«l‹ùE‰og‚‹qAµ't­×µÃ u+¿@Ç9ÐìOH’÷ÏU„®‰­¶EÜO3—h¶ö‘LÓ†>ÛÎÁ~!ôñ.N}¾BrÕÇ æ’ƒ»ÖcÕ2WTcs¹¤;¬êK´d✺Ïþ6õ¥o=¡H©[ô ËÂð­›Aö&—ààÓ!ÿ@ôN¤ðàíÜÁ£E>&ð»&¡8Ö’QrÊÊQ\¹ìhV7᫦³ûOG)u¶¾oŸ 3pý¿@¼SÙGî;Uc›µaôLëí\ ô¨èP ÖJ‚G!òÝÔ5£Î(Jµ e¢–±Í´w}Ÿ^Êç -ƒÉ/¡¤èïiÔò;ÌóêôÿLšUïÑ[læQÎaœ¦Ñ>ñ³G÷™=}!C‡áóoΤ…ÃTD^ê~÷Yñ5l{ž³×(᳓* ŠŸÏgé­?»ñ\²Àå'Ç…îñµþ@vǸŒ‡¨óÀ9šæ‚Ã?ŸŸ¾èxŠBœZ÷ö´köö†dqÏ‘"$!ˆ íxðÿ"` £þmÍÓK›ë.¿ôe|ê:Ÿ†›%u@éœo('_ -¸=Äõ¹Â¨ìW|ÝóúõyÆå£¹Œ O<ã–H¦¾kû»TCT•3SQú˜8EŠ9·[Éi{ªðãá²Çäve=§ûïŸ$)e Ù(ïöyï6bU_>`R¨ÿ™2Qt˜çR?=ÝIêbĉ& ¦yÍèZ÷;Ø%U¼å͇⌌àÊ·«6ŠnËLJ˜S2tqŠç+ÚóKÄ0H ûÓ'­½ª~Ï”aLø˜±ºÙ‰l½,£ ;ˆ$ùubq¹ñÝ8cC¨.b /άKÌJáÖR7£¸§ôŵRì`çzËb“³Z'º½$ éëý€Õ÷ÒÞù¡À.(?ü<Óo' ÂX£¹ -½‚ü\Oãl}çÏ rÉ^Ü ëcërhÁÄ{£ x.;9¹ž³¸#ÛO}+ö H‡Gzøå% Æ®¼ð§AjS2kí;<)Ÿ@ZÍÆ»È`n#çPglvçxž–HhÑo°þ¦¯£mÉØŒÄ¢o­»L£ÇQ“0íñÅùuâ#ø2†Nü®{Q[V¯Àj¿¢»þ?ƒNWô¨?ƒt›á%¦qGGö:¼®*x¼ÃÀÌžÙÍÙ^?£õgf‰•çûúpïîLÂTÅ7^\ý?0[ÅÃèQÄè$†À×}ÝŠIÃP±ªÇdYvgä‰e¦w©Þ$àŒ¢_™ ×¹Žéß™†Ø'DÂ9ËŒ?h2ó¸%¹ß̆Ó6UÖ¾—õ„¯m“±(ò¨øÈþ­ÉæD¥«‘÷§½ºwõ¦$MMó:2ž“ú©‘ƒ=‡3Ït]ÆF±°i\Çã“%N¥ŠaÿÝ£ÛEK¼ôÑ×îŒ6y.G­†(®AM†<ï¹Ö~Êyõ.‹ï—²À.õ8'_e#åBâ[7Q:¿žßämø"mƒbìS ƒŽÆZá 4¨YŒ•{t¿Op¡Æ¨à‹!| ‘õj—/™§ÐLve§eŸ(ú]<Žqž(Á¨ð칄…ÏÀßù¨;ïAJGZ0ý7ùˈ¾†[(-®P+Uìp¤ëñ|\—;ïùÝ27r¤v¨x©t¯½ <¢íæVþ–(ù’]”Û­®ÂãBB²ßâ ïE›Üä ?•ïd -ž¥ ̺”k®ÖPú-F3{^.|àƒM],¿Òck&Ïý"§^{9D_o·äË•ÄgDwŸÇ>B_6õ¦F§zJ­ïf¬E§9åGÆŠ(IK6na mü¹¢äßúta\‘±+O|oÛn™ÔĺàÙ_ $üÔ>­Šäkës±7¡{^´2ÐX úñ©ã³¼€¥=Š&I×}µîäØsU5u¨ÿ’àï"VB”—~²rön‰Ã/A“¯>k]苬’)ŽÄìÂèÌ?vYèäF8ìúš®GFܧŠX$ã‡ÔbÐ¥åž_¤M2`c5ã&ÊÌ%R JÇϘáVqóÒä8Q8¬ÉÓ3·Õ"×ya䱈òòÚ9¹2äÈ6†KuÙÔtiA\d±þáf’wÃAé@To^¼¢*¤Ë€™Rö%̃°£üú‰Gë÷'xGJIÀ´‡P9 uÍ„ÒQÆ"òg…L*+cl4— æ…¬9rv*š0–4Û±Œt¦¾‘ÑÝIÕ:š»”IšWYøûè èNg+Qü¼v-Vê~Ã4"å4}/üÇ—’W'ŽÉŸŒrOá¿<·3Ül6¦//¦«Žw ú–ƒNb©«þÄ2Y4·aG^¢11ýÎgœÅÖ¿£’,„0ˆÜËûîÛ·j˜pÔwS±¨W¨¯¹j¼~OÖÒÜÒh¨Ð÷p I•摹È{z^½3q½ ä9ƯLh>íïYæÇ(ì$%É †m]"’)_]VfíÁ[á›Æäæ1‰¿òŒ\³.ô1T•]âGö{ˆ¤V.¸/Sïd`´.òUuÚ‹î©>ŒÇ¥÷S?iI®9Ãq-Ý%áÌKõÞÉê(?:LÛ-·R†ÐAáç6=¥šp•3È)®²º/–}Ì?A\ÓžÎxŠ;­ŽZ›hðJ•ò¡žŠÔœjó\áÊ8ORø±ØÞþÚ‰«£%e -M,b?Sœ†è‚-\ ì‰ûdVwÑIôœúá~Ö7ŽÄkeAø€›ÂG9”¬™C:¶œ<_}9TïrTÒ^%M…íŒC,[E -tÓÎ@½*¯g :_‹»o]Ÿ°’cü‰·ÑcM -}­+^ÂÂí¯e‚³é)À+-[‚fß7 j5$‡=á›®bÖ;tZsa¹rz—xž,ÿ °Â,ZA˰z˜wÃV‰”]AVrÉ|RMc:ù~pŽêˆ°Æ¸œÎõb².<„âÓ?øÕMÌlH~6ŽäÓl: Íx²_$j)ÊWA¼ëhEBuµ²¹ù%Gx —iSÅ Ê—Ž²ÅÄ© 2'BæÈ °ç®¦Q 0h< ´ó’ ÿž·§£Q-önµ‚q¡òS‡!»l˜ìÙŽSö£'ºN–³º,ÇTéW¦“ð¸Ç­gÈ‘²Ëê³ä‰#¡,Gd›äô‰ðýl$HÀûa—>7f»‚Z%ýÙS•²Ú@G÷Ø/RÝŠŠ¤`· ê²8f½ó¨ª»üqÄÎdX Gû¤g¹Ë˜ »„_qvw3ƒ9T ÛáÏúmœ”@n¹aOJ‰ …yu†çêfÙ=Õú{ÝÓFÎLfN‹GäÔi"?þÖ}醊ÛUœ—_š›iN„z²ròÃõ3 -uÎÂüÕÏÍ{1T¨—t+jªNìpC4ç@ÖîÅfÙä:)0ýôðtòuwô›§`âèÃJ_Âåfò²¤p¡Éý@ ë¤åcùC¡î—rj¿ÁRµP“ÜüQ[öºC›¨˜2Jí¹~?„.ìpÞ»ÂVXz%˜©­^ŒºÎµ†×þ'R¹ÊxE˜•ú½Æ#´ÂETíö`…TÆ*‘Æ4d¹ ÆÔÊô;é¯QÍ·ìe¿Éŵ§Ú-Œ™–¾~jͶœÅ`k(vï¯ûa¤æ ‰öឆ…ö*„þlØNÙçfr²ÇŠ1³|/0î4ÑÉÇýžjÈ¿>VùEƒ" OáZ¨zßû,q!¿å]3„*Øœì>ÀŽÅ­ˆ‘{+$v¤fx[VÿÁ§ðaXïòÞòÃݸ´îÖæ#¬OÆ fe­ލ€Ägs·BÌgtíD·°¦1?éBmbvø¶—9¢¯'2S☟—øø/Ð]Å`œÎækâ$:DKØ$žr°[[/o•‡á‡¦„ô¨ÜëÏ~fwHý¥ÈC¸¯É½ßn -ê÷E6K¿­í‹zv $àg¨¡Ñ8qx!]ü`b6#2•›PÖŠ>)ЦšôʈQІ)C(Õƒ}R~­­‡_¯˜>{š·u9;ƃn¡“íó'\ =…i{,Áe“b««=µÅ¹ÛˆÎÝ6ß®ãÑÜ€AŃšlôϺΛv6Úì 5ÕÍRjå8äò¬Úèpõh. ÒÛþ1«,Sd¢Ïì^5 ö¢ ÚOèˆ „iᔚ8Ž¨á§ˆCî¤M¾»ÙIrúdöÿÃß#58ƒ8øìꯦ‘c‡9<œÔ?Xé(õ£ƒÙFkcˆÊU#´gƒ–ŸA>fâÃ穬-mDñ{nÊ¢,B‘dKÝ*ÞFΑt0¸ß28°ê!Û™h—Ÿ"à}8Bò˜á"¥f]™M<"$‡[ÕënwYÅ—ÛuÌ6ÎG¹óê=¦™¨ˆG(fjwfÐÜÄÃú£Ù_Y×Òm¨õPø²—'MWußÛKjÓ\·EE}‚Sy识cÔPÞc U»¿WÎ…{gÎV©)ûðqBÐPègõ‚ »€‘j´µJ¡!ýÌÇO^â®=ÓôÑF~÷H×¥[ñ²Õ É»yè¦<€]¯©RE›x†{r.¸õSz÷N®rÍcOdùñ6“ôíFƒ ZÅ»µp±êLÛll™ÞÔòÓž¾h¾s,ü×Ã"TqÂÝ^–Oãrç,ÙÅŸ¨ÅEò/*f’”Ž€˜›…#ê–úJ8Š\ÐTH6ÄÄëêVäùã§q_(7QÐNàQK¸7VÓ¯¾«v…!YԫΓ²QŠÚ—>÷m‚«“мNØY©ŽJÉèÀê5—I«^ê‘ËT3Ey+fèÏÛ¥ý¯Ô° €H7Û³k ‡9ùÔá?b& =eÖ–›ÆÓG"ÎkM•å­•ø‚ÚXaI\ßmhû]½“T†·8ŸNÀÝKmpæéðí”?Qã·°U[˜Éä”y­¤®|ïöZíµ§&”A¶ùLðÕ(ãðÎ^X&¿*HðÌ·lØgÔõ"‘‡³oÆÿ ×aáTž'zûû¹®^u?%Àtc ¶èÁÁVuA†|£¸ÅÍ×”6>1Å'¨¥Ô2¼oòg ’o›Ê KâúÂTðÝö3r bBWnêPÑÕƒÕZì)dž¡ÌBT«Í´Añ5¾S5£æÌ¦¥ÐTU¢¯:Üê‹°¡À†zBnüm`L ô“š!±ÂH¾¤å–+Ž«I¾†ïSªùqS”Ñ&bFœ °–gVÁYòÌÒb‰‰(ôŽÜÄø¦XãÂ]¿ã>€)­—¨°ÇFÓ<äGFÝ«bºDÂ•Š £nw…|œpg¾0ª“•MPü,‚›E˜ž±Y™ü§Û¢bÎl·×Ø‚³èÏl¨¡~æ!È¥ÔS.šÈåwò©‚h€9ƒÔU¨7w¾¤9“Ü‹”‰ór‘¤òá[ÊKâìÜX¯÷ÓÝn\t“Ó~¿ÔlOöü8Å’ëÝBj”Nf{橆uö{!^æ’™Y«‡w댰1Ù$M­,ÑgZÒƒŒÈ&“É‚FS´Ã§·…¥wlü4w ƒ#F.°Ëc’¼uÔi´íòE¿·Y±uÌÑrÂåäÎ3J2ý9}°ÃÒX¬søwéª0ÜwP1®¤Tv=gvM¢Ç6igU›÷* ¸WŽˆ%Ñú¦ó¡VÆÊ`Â/½Ù#»ÏÃâÒß¾!õÈŽb>"Ä*200œ7¬ÏT} èó fT÷¡·MEfº>³¼5qÖ€m®)½—ú~ètL‘×(æ{ŒùCõá¢^m„çÇ'y؈~ -EªÊqÓëTéCòâ¯yÇõ•+«ûv©FZpÇZòU1ì´‚îâD¨4ùÓ£Bªg9Œ¤ÁÆ{¾Púé™S›vÑ$ ‡¾\ñxllË5çÍiéõ$éTlFÚ—}GÈØf<ü È -ü%ë2bh{açògôCÿ£ÜïW{e1¯éF¾'GŠ)Æa.¨³BG=(”ˆüªCÞÛjHk_×iêPtkºé7ïze›¶ý“tå9¬)U1M¯ž6¾¬ 4*k?¦‘<ꮢ±²àN|×P’.n¹||£ÜU+¶3F”MhÆœ ¡¦9Ÿ?hHû›ç—nr Þ-ä0±Å‡ÝÖà’U·¢PA7ÄÜFwæ°'ŽÁìÓÖ‘–º@çPú)B²àFpéœ=ç(®é…àÎÂL„N·Í-þÄYØÒ.ŽF¹ÏîÀ1­ÇN4.ì—{œH¶/ªB¥0¿N­æ%@»&ZëÑ»BhÙœæ¹áí„WèºÑ$Kí[Êit9œßë;*ø¢FÜíƒPk—×xøOyŒüøŠ¼ÂÛ/¯OwÙóp»B"6àl:ˆ›ŠÕ‚U‘eP -Ç^; áµ³†˜¸ÔÕñXðÞŸÀ»b’¨®k€*G/·O3(|ýhÉ›ÐÅØ%§Yæ6ÈËM‘~OŽ¿Æñÿü ½}»—%Kƒï¦|º9W¼ø+[Xìè¤P˸—úòbhê~ƒÐT¥:J‹ìÛÔM,ŠÔšf4énhØ~Ÿûâè1çäí›}“ïÞ®ì”[/0ûË,¹Ø1¤ù…Ž 4E]MIw1Ÿx}ÿØ€®°ý`”dt.¨«]í»¬çŸ÷^²ÎبH¼â(kæOýGɯ¿Q"g‚ÏŸuú·­Añh{fº{iŒv®Ù¦=ò9Û)ÐÔ•#ùîÒé–KTå+§"»dåXïkø’S.ð„›÷]lÿÃòÿ'ø‚ÀÌt†8ØmÿZFÐGendstream +˜Î K ³¹-ÈÅåæû¯éü³OÀêèèhëùw´Ãß^ÿQâ²µ`EfçxËiyËm ¶GþðײÈÛ[8ØÙþa7wuüwÌ äü÷€èÿÚ†·"€æö¶žsòÈ[JýOeÖÿ=‘ÿ$þ_øEÞÿ™¸ÿªÑúˆÿ§ßó¿R˸ÚÚªíÞà— àí–q(þºgl΀¿î'WÐÿ´Ûzþÿê¨ úG±ÿÆ÷¯°<ø6q{Ë7aXØ9XÙþa»È€=@æj`ˆ™Àhû6³¿íÚöæ g[°=èMÛ¿ÇúÄÆö/˜–ØÌÆþ/¸ÿìÍÿµü7¹þ.þƒ®¢’ÌG ¦ÿê†ýÛSím ZžŽ À¿¥ÑUv0ÿÃ_<ov '/€—— ÀÇÎîû_dü›†ýŸge Äì0`cecc¼ýÿûóÏÓ§¡‘¶7s0ÿks4!@{ó·eûÃ_°™«³ó›ÆÿoMÿûùïµ<@fÈ¿æÌC¬3²3!ßòF¥ zºØaBK뵊 +ª:ý3"6ø+LžkBYÆ^[=çŽ_vw‡ºðmé:Ó@§¤¾ïº ±ViÛx™vƒ>•¢eëÆxŸÍ*­Ãêó°éìnŽªk•<Ó·q:#žÝ1¼w+ À¥¾uD÷3K¯‹ÇkÇlx‡ýíËÑ1mòÁÝ-]ßðà@ç\÷ Sn< ,mt€S.‰¨¾v…w$Ó6tí.E\wRÛâTæ!5,0cök¾º¶Ö%_{®ÏgE^˜’Ôûˆ%F79ÖxmÙ„âWQ5^}[4ùÞ¤Ö¸çM¶¼Lb»ãåÊÒå/ˆ¢Ü0¾éT·–nr¡o^²_,¿BúÛ¶£?%nK•'<(ª»ŽóîƒqZ¹x³?]lÑXÍÑõ# è'Z „ÔF[­Ñ]÷õ‘GïA;ì­éz~BÌE‰´-mÅžépLæß÷oóG~ÿZ ™þ\’ÒNyk¹$Ý=ѤtU]ðÞ'x™¤¬`ya*Ou(ݺæ%E-ÖVž£Ä²¡dþYÑÓy+q¦&5ogÙÅ}Ú˜†/„Ếb3XÅ,4Qá›6õ‚Û¹FPÛZ0Idm§'§(iÆ®D¦F½.å-ÃŽEwÂ÷c»¡x¬ #Xe»edMñ«%¤yf1‚,É8Ä黽C?mU¨cæ/S"5ta‰µÝžûË}(àYøí«ÂÝó…i$¸«^$œ ž4:ŠÛuŸ‡¨{Cx™`ö„Öœ»±?ͤÖ"¦ŽˆtXüðN5úÜ—V<“KïÛ•ÃjäÄz˜NƒBè]8vê#&s<;‹ŒØÁZw¶Â¾s¸>dNË3ü”gò‹c楒¡Š-v¡”+Cx+ì]ØÚÅØ†%BfDkµñ9©U•;Ù{úau kD‰OE^àÞ5ÎôÝÓlj‡ox´¿ˆ!„IQ˜0Œ:+=¥\°gcæ¶$¹P8]IO|év¾ïL²¤›$'U ~t?ÆÚĪmUh1°¼_ÿeÈc“'Bó.%¬×½©öý¥ƒT‘‚ÚÌ’sÞO·#þ–]©Ãî#ävèõ0à2z +N#ÌY¶|À¦ ïk¯ðUè`çÉ—ÃnþLJÔÙ°ªË¥%£÷Ü;6åï¾$bHè\™VÚïÅ£ô,>uiàÛ¾ÃÔ…Öô.–‘ŸÿR[š¾: !ï9áttIëi@b`ݳ’ôš¯·;1òØRïóg¨†·ë6L˜ m¦MaJÛ…>îÓ·£^Ñ“¤h§Öå1Ô|–‹O'¤/ñ£.Í ¿2Åàj¦boØë4{Oc©Ù’T¬‡Q|´ âQy®Î:3Ôœ2¡L° Ù§Ž#÷n¥¤Ý9Moƒ`q°²~ò¯Gµ@¾êú®ŒÉÇe ¶¯D&»æ%ĶvùT +‡Î°çJå~ÙÑϽʵ‚ƒyQ^…ꢧø¼Ñ‘Ì’¬Û‚„ÛQ±´Ebʫ_¢”ªk”ÏϤáÞ Ô¸´¦ÈŽÑ h¿?ÏÊÁöóî›RõÍðð4$H1~Õ=@†ÁßjÓîÊ2½,Ë ISd²2aI:<;‡…]?…Š1N]ˆ)[dÙ™L—DXÿ4ˆ—mA3¦™›Ì|}Ië +Ž®õiŠ{ÉÈÏeÿeâ’‹ñNe ä±)ÃÆÎú%˜MÕºt¾Ó=ÒX óª Úø]UK/H\¿Ó82@6&îZÓB8£hbcQÉ™… íªø ?îùŽ'$³6-|îö뜮ÈèÈ· —²Ûp8üzlÓ4k|›÷»¦š¬¢Õ\|A,ƒcùã’¥ë5² ðó¢µlÖ$‹?1´Êõ”“ÌAòwuœz*iãÞþ"^ês3VJ …2CÉØCƒ²»«Ÿ³Îžü7 K-èÆk*m\&? ‹HKßÛì<ïÏ»h´û¤aOüT¥’ÍìjÆÔ³^§/SÖq0Ô¤Ñç`w†Z ˜%ý8‡å:JpסDp½«’Ù½TIm ÎµOJ@àÇ©Oœêäàü¢°ïûâuøS{Ù˜Ž‘øn/¹»ý#lï;6̓jó{ÄÝr©Lu~—õ”QÞC’_ ˆ;ô¿š7 yÆÐöHîtÃï;µNö˜d| ¸ƒÎRëPaD3¡‚iÓ.k {Ï$ÀÈ)¤¯ˆ®œ {"JLÔÆl,— +ƒ=®›Ê16#ÕÍ}ì Š …׃?øs‹”#_GVÝë«*ûs4Ê3ñx]ZÉÂíCúu:pä}³wàâ•F®¨D…U½¶9ÀO‘àÛ‚Œäh(YzΖfšP™Q¤T!L§` m3jNQÏ…+¥‡å³G€Ý9Õ6§{ÄÓ)‘+ÚÞ¾¡pï"¶ëËÈo”ù‘¯TI“¹âÃâê„ Câ(…1>¦õ66$Œ6u¢íîz’ðR7üI»•‡˜ëú¿÷~ük‡ÄI»±8Ù 7â M"ÎcÔv^Ç“D3©O«HhíeæV£lnß¶ c+a×ÇÉOÜDU™Q8D@ÒŠ´¡¬@»G…Tk7:âèp­+»!Û2³*É|†·l%M·­Zqëw×W®¦¡XŠÁXÖŠúb¾²æ2a"ÿ^œý%$•ä +Êv¹Â§µp½þ0¡Ñ‡ÆÔ?~ ¦:„Ö€ôR“÷Jn<òhh¬ÕU ­_)ÜÌÛÍs¿©ÈL +­sTJßà:ÿ𵼎6C׉tãž%uº"D}ÙŠýã—ÔÁ Ý×¥nà¤Bhd Ê“zJòðáþXæA'ó>Ëá뺖·UE¯L +R¢}hŒDW#uéƒí;aäôôY Â@¥”"=zï”ôÙ¬röÉê…]‰ØŽ6Dü6O%í_o ‚4݆›©È%½7WWv¯8åYÞ­"ÉÝ“$ts¼¸C«zaü0áÅ»½¼â¹IŸ.0ÎÜú„»¼~CK–PÜó1O{“뫲ç1¯åƒÜ!éåGB¸¾‰³:}[ +^¢ƒY»€ìëë’ç°ôa¾\ÙNŸØÇ_«h`LD Å|?w/36Ð'^’¤¬_ûÀ-éV„ùô¹Ý÷§¡¨Ì=Ì¥ßó:6FŠÄ ºCoÙÈÙ\ìO3J­dCT¸ÌÕý¦¡W‰6¥)ù¯÷§v3^Ìq~’éÓøÜÊäðç ¤¸ý :‚‹³Žz¤¹ØÕ àÄsƒ?¶pøµ] Ýý ~ðÿ4=ê_$&5AŽ›O«C1@Í·K±§°èŽ;(óE¢Ö–ó¿<3åðÜ£Å9N§_Œ©/¡ +V`[x!ºó®U=­úQ6_ú<¾F2Û¢cMUJÍü¶ æážp¬ ?’£3pÞ IÎþD@?œtxfªî +âå76á='„álZ­—“L¤øY1¸•'á<§ß^pR¨Wü¶”æN/¸D[í•ÙìÛwÓöþª>‘w‡whh{™›¾05 ~Š»Œ˜S+ƒn­¿¸D¦%½ûÜMS)FŒŽÞ—úÎøþã™Á9ÖEt‹ò¯Kâ%ë]†BVly¥bÁC¢Ô1¿úv"x‘F–í»~¸ý4ÈNšòTz÷nq~ÃW:=:Úݾ÷o_>/ê0ŽVña2D¿O¥›Ó™-ÁÅ&OJÿÝI/öÛ|ÿW1h£ê½Q ¶tƒÍš¶ÿ'i-„ X=5]¨òé-VTSÇ•LʪâpÔä¸9 +=²à~‚z³ +ü +Gôå{Tž âÚoŸ3©Ð'7LåC‹ùƒÅW1™Úzž•od°ï) +2º« 2WÊ’K{ëMz{|y‹æ'$€*g\rïr2ÆÉ&+]Š_͸>žŒ”H¢æu¢Å©Â »Qo„ ,¿¶ŠþBø1æÑæU»?I.Ì=—:fˆ$LsÇ»ˆ°5òñG`E¥ú$ ÞdÉG—" ÄKü•â’\¬ož¿j<І3J;æ‹Ï‚¦½¬?8$f½ß)døô“Öbº}ˆI¹¬2IŽ¡§“™úÚüW©Ùýr‘FÕŸàac›l,ÖÝï¢ûP×w2·Û梑٠+  úå[‡Sp‹S(n +пFo©îéËGÛš˜9WH :L9R•P/Î[IÜû`þñ^¥nÖM–\2Ò–= l¤¨#\xXÖÇuKcüh°¶qK'|î-ŒÐé=+}D…u¢GRÂ}<Ì×¶ }w Þ·OœË!ê=YEJÁA x•C„jþÓ¥™¥ï“^iÍmßÛµ—d3,Ô ~êŒÒÓ¯B¸%{œ ."¤)\¨ŠèÚô­`és] ûZ|ùKÀôk³­Ü‡Dá~&¬ôן[Ôö[̆äŠçIÜŸ Y 8¸‚–ÙÈC’¯è1Y&âCß=èjÖ=Ny90€ïg¼kËÅØ#fK1V*Í£2rMÓ„§úºQº7ÓNÞ¿ú±8ª™Æ/Iª4ÍS¾-•fl2ìßôW‘@R»Û“¦ž®÷Ÿ›NW—§J™˜"âý>‹µÆˆ†e7敨’Šæ´ž³–¨©LlnS^އ%Xb™.Y w·¤wçÁÄԩЭmÎ‡Š ð*$VˆÑé6ýÁ²íTÙ ©î>v•n'0èWdóñáhþ¨ÄÝ»(AàÅõ}Ôç±þ;ɞHŸG¹ž)‘t¶ †‰eC[[çù.« žã•?a6ÞgÓ*ÞìJN{Œ?"wã͘êfI±V ˆÚø„°ñô$#uš‰Þ}©,·LÜNÜç5µRl™Àô0ïQb¸ÿL/“ÇJ91UÀÞg>WŒPäϬÀ^¾”ƈÑ·£ùD¹ÚtäŽÌ[†Ù»`nc®7Z=l[a$¤–hÊÛW.Á܉ª¡™t#œ%ós|â_×ïÊF?^§£Ry¨tuÜvzºnlÇÚHžÕèQÅ“Ëñp«q|†átNÀzd$Yý;OB/nuÒ?NÜ+ùÇøb-Fô'ìœxô>ÔO ‘ðîV:™ZÿÒèdÊfy§ÔüÉ”»¤ÀïæGuí¨…„„Ò=ë8ÊðòªîjöŽþŸWÍΑB#È#=–·¿7síGbÏÀÊ Rsø†Â:{PW™Q‰J®åÕÜ Í5°”P¬<ä²õÏh7 ž +pJXÓ¼²£0XTþÌÝGKŠΚDÅJˆb +Èò¯3šx9|'ׯà³R*{xiÁ^5X~ØX¨òÃÑÿê‹ëâ†$NÞüy‚æk|ëæ-=ÛÑö¶WbÆæ_‚ÆÙWSf/B(“Š•Ù;¾`“öúšï†wªÖ5Z©Ãˈp)íâÜÏ><[ +ÔO’ùr~QQoı±õûKiÌŠŒ)ÑÖm ½Hƒ5Ñ‚EY±ÛN/DÑ ¥ñ$ßÜ5dTókñXXd™ÅU+yëß·“&×¹’¯`ÿ.Èj>ä—D1—J–©)TH‚Ïl#´„“#G„C9”\Œ#ׯå +·Œ“1ŽD-Zü†'˜ñÿ ²oË“X2—õ¡.j.ÇiET²<…¤¤C:£S¢‹Þ ‹‹ª‚žvWA£A|AaŠS¶ws¢éJÃËËÑ`sÛË0úÐeÅžÈß~U¼Ëuûœj2$À ›.$zT XD\út]°¥|ˆ*ÞoxHŸ^o‰5éÒýE˜)æ|ƒK¼™ñ[D\F¦3´Ÿ°êЯŽÙ¥»p¨`ø¡ ©ûô´:º/¼áCL•äz3ÌÜuj +Çl´pÇìºýªM“ý›Ÿâð!¶‡…‘k„Ø$ïËŒ©:jT-ù¹±[­õÈù&¶®,埅ºÝ)ûºˆÑ?víjÿ,ú¬ZM,Ñ4¨avjF²…Ú?÷;|Ä;Òã__Äôg@cfwlÒu\EøæÔø%(w&ÇiÓ–.­Ç[½FÖ”´+ù›†ŽLf5´9Fþ +Rƒ9mûÉ 0ÊZ²ä'Ò¦áÜJ’¦¬ œ]ˆ×¼×ËT㩳$U«šïªö ¨‹WÌTŒÐë<';ûL·' EÉ×Iv¬-2&íÃüå|îär”‰¶úA]¼ èr”*b?(Q£q_5LYNJ 4–nq¿ž¢…&|Ñ`½Þ]¬É²ÐcL§VÞó©qz¨)\ß²ôÀWŽ¢–Ђ|¦IHz韟䯶ž¬Dê}ÎÎi„´ÏÐŒ4É ô°Y…3!û~¢µ,‹Ìì’ÐmM%¾G]áîÁß7u¹‘~…T˜ªkIžb:…8½W³X¼]p–¬ËÕn±Ð‘æî'NP6ú…|ûbCöLà,5!Ña™Ÿ€HS%<ÂQ’ OÖß}û´êâʳêÃÀë¾Wþ*\¥XÎy¸EáR˜ÊmÇNõn¹Ç\÷¬¿a=ªü[»÷ƒ½¿R òÝÇaœÐ¾h¦˜Å’[) duÆKrÝ™^‹¢SToˆ\î÷p}™|_'ç‹´tøŽ™îÎ5§Ûæ%#±Œ-«\'Ç]Ibjæguõ¡Á³â˜hn“í"·Ymß|÷óárùd‰Ì#O›ýÙv$ªðZCVÙó‹ ÞÎ9â‚jOèZ¯k‡AêW~Žs ÙŸ<$ ][mЏŸf&.Ñlí#™¦ }¶ƒýB èã]<"œú|…äªÌ%w­Çªe®¨:ÆærIwXÕ;—hÉÄ9uŸýmêK/:ß*zB‘R·è–…á[7ƒì!M .ÁÁ§CþèHáÁÛ9¸ƒG +Š|LàwMBq¬%£ä”•£¸rÙѬn?,ÂWMg÷ŸŽRê:l}ß>Afàúx§²ÜwªÆ6kÃè™<ÖÛ¹èQÑ¡¬•,Bä»ÿ¨jF;œQ”kÊD-c›iïú>½”Ï“_B?HÑßÓ¨åw˜çÕéÿ™4«Þ£·ØÌ£œÃ8M£}âg.î3{úB†ÃçßœI ‡©ˆ¼Ôýî²âkØö5>}Ññ…8)´îíi×ìí Éâž#E$HB5Úñà!þEÀFýÛš§—6×]~éËøÔu> 7Kê€Ò#8ßPN¾p{ˆës…QÙ ®øºçõëóŒË#:GsžxÆ-‘L}×öv©†¨*-f ¦ £ +ô1qŠs*n·’ÓöTáÇÃeÉ#ìÊz"N÷ß?IRʲQÞíóÞmξ|À¤Pÿ3e¢è0Ï¥~z*º“ÔňMLóšÑµîw°KªxË›ÅÁ•oWmÝ–™”0¦dèâÏW´ç—ˆa‘@ö§OZ{Uý8ž)Øð1cu³ÙzYFvHòëÄâr/â»qƇP]Ä^œY—˜•­¥nF#.pOé‹k¥ØÁÎõ–Å&gµ>N8t{I@Ò×û«ï¥½óC]P~øy¦ßN@„±0Fszù¹žÆÙúΟAå’½¸Ö9ÆÖåЂ‰÷Fð\"vrr=gqG·ŸúV<ì ô>ðËKŒ\yá…OƒÔ¦dÖÚwxS>´šw‘ÁÜFÎ¡ÎØ +ìx†¶€…Pøiõî>»"8–µý$<;"ä +Sà à.C¨êÌæ~-÷fjóL£Ê°°’ÐL ,Š…&F€p(€~E]zsCW _Ùhv{.W~®Ï²éѬL´AÆæ}ÎñPô»xã1Ž}„¾lêMNõ”ZßÿÌX‹NsÊŒQ*’–lÜÂ@ÚøsEÉ¿õé &¸"cWžøÞ¶Ý2¨‰uÁ³¿Hø©}ZÉ×ÖçboB÷¼h1d ±ôãSÇgyK{M’®ûjÝɱçªjêPÿ%ÁßE¬„(/ýdåì݇_‚& ^|ÖºÐY!%/R‰Ù…ј/~ì²ÐÉpØõ5\Œ4¸ N±:IƩšKË=¿H7šdÀÆj2 Ç%L”™K¤”ŽŸ1Ã­âæ¥Éq¢ pX“§gn«E®óÂÈcååµsr3dÈ‘m —격éÒ‚¸ÈbýÃÍ$Ҩ޼xETH—3¥ìK˜aGù5ôÖïOðŽ”’€i¡rêš ¥£ŒEäÏ +™TVÆØi.Ì Ys2þäìT4a,/h¶5béL}#£»“ªu4w)“4¯²ð÷ÐÐÎV¢øyí8Z¬Ôý†iDÊiú^ø%Ž/%¯N“?åžÂyn5f¸ÙlM_^LWïô-ÄRW-ü‰e²hnÃŽ¼DcbúÏ8‹­G%Ya¹—9öÝ·!nÕ0á¨%î¦bQ¯P_sÕxýž¬¥¹¥ÑP¡ïá’*Í#s‘÷ô¼zgâzÈsŒ9^™Ð|Úß³ÌQØIJ’$ ÛºD$S¾º¬ÌÚƒ·Â7ÉÍ%bå1¸f]èc¨*ºÄÿŽì÷I­\p_¦ÞÉÀh]*ä«ê0´!ÜS}-$Jï§~Ò’\s†ãZ$ºK™—ê#¼“ÕQ~t˜¶ Zn¥ ¡ƒÂÏmzJ5á*gS\eu_:,û˜‚¸¦=ñvZµ7Ñà•*åC=©ÿ8Õæ¹Â•qž¤ðc±½ýµ WGKÊšXÄ.~¦8 Ð :[¸Ø÷ɬî&¢“è9õÃý¬o‰×Ê>‚ð7…r(Y#:2‡tl9y¾úr¨Þ婤½Jš +Û‡ +X¶Šè¦zU^Ï„Au¾wߺ>a%Çøo£ÇšúZW0¼„…Û_Ë'fÓS €WZ¶;oÔ:kH{Â7ÿ\Ŭ%vè´æxêJ^Ò!Tl‘ñe‹˜Ñ'‚ý¥Êhm TŒêaœÎu µˆiîiäà¿ ¦×è¬öôÈPKœÁÜvµgœä‚!O’‘4C£b„¹\SsÀHd”§>Pr"VÈ/•Š4%þŽ/ÓÕº—‹âZK{ß .µö€˜4-ê‘3¾˜g/„)KHlHÜ(K@A“b²Çægu‚5Ø_Xõ˜ëáD-vÏrÐÅ#Îoõ~i^Ϧˆì)Ý(w§¶¯W¸Á‡Œ–}ÿ]!AP±ÜŒ¸cÅÿÒæÃŽ¢ ~¾C¹ÕQ«ÁeìyènÉ‘>õ„2m‘~ sù6¯°mË„¡Ã_°L3ivœüj¼ãSB}Ârå.ô.ñLzÊ ¬,7§Dœ×š*Ë[+ñµ±Â’¸¾ÛÐþö»z'© !(n7p>,œ€»—ÚàÌÓáÛ)¢Æoa«¶0“É)óZI]ùÞíµÚkOM(ƒló™à«'PÆá;½°L~Uà™oٰϨ#:êE"gߌÿ®Â©øÛÀ˜è'5Cb…‘|IË-WW)’| ß§Tóã9¦(£MÄŒ8A`-Ϭ‚³ 噥ÅQ蹉ñM±0Æ…»~Ç}SZ/Q`ަyÈŒºWÅt‰„+FÝî +ù8áÎ|aU'+› øY7‹0=c;³2ùO!·EÅœÙn¯±gÑŸ3ØP#BýÌCK©=¦\4‘ËïäSÑs©«Poî|Hs&¹(çå"IåÃ9¶”#–ÄÙ=¸±^ï§»Ý,¸è&%¦ý~3¨ÙžìùqŠ%3$Ö»…Ô(ÌöÌS êì÷B¼Ì%3³VïÖac²IšZY¢Ï´¤+‘M&“¦h‡O9n KïØøiî@GŒ\$`—Ç$yë¨ÓhÛå‹~o³ +b똣å„ËÉg”dúsú`‡ÿ¤±XçðïÒTa¸ï b\I©ìzÎìšDmÒΪ6%&îU@p¯K¢õMyž0Ƨf^`77+ì»vŸË×Ýré„§Å›iyjÆä±­[@äÂHÙÓWö0øJ¦„¾hŸÆµ‰Ó-Õ}æC­4Œ•Á…_z/õýÐ!è˜"¯QÌ÷ó‡êÃE½ÚÏOò°ýŠ$T•ã&¦Ö©Ò‡:å Ä_óŽë+WV÷íR´à޵ä«bØiÝʼnPiò§ F…TÏrIƒŒ÷|¡ôÓ31¦6í¢I}¹âñØØ–kΛÓÒëIÒ©ØŒ´/ûޱ!ÌxøA[(ø/JÖe"ÄÐöÂÎåÏè‡þG¹ß¯öÊ&b^Ó|OŽSŒÃ\Pg…ŽzP(ùU‡¼·ÕÖ¾®ÓÔ¡èÖtÓoÞõÊ6mû'éÊsXSªbš^=3l|YA.hTÖ~L"yÔ]Ec!eÁø®¡$]Ürù"øF¹«VlgŒ(›ÐŒ9BM r>Ðö7Ï/Ýä¼[Èab‹-º­Á%«nE) 2‚nˆ¹îÌaOƒÙ§­="3,uΡôS6„dÁàÒ9{ÎQ\Ó Á'œ…™<n›[ü‰³°¥9\rŸÝ!c$Zh\Ø/÷8‘l'^T…Ja&~Z ÌK€vM´Ö£w…Ð8²9ÍsÃÛ ¯Ðu£I–Ú5¶”Óè*r8¿×w,TðEÿŒ¸Û+¡Ö.¯ñ6ðŸòùñy…·)^^Ÿî²ç,àv…DlÀÙt7«<«"Ë ޽vÂjg 1q©«ã±à½?wÅ$Q]×UŽ^nŸfP:ø6ú?Ð’7¡‹±KN³Ìm—›"ýžãÿùzûv/K–ßMùts®x!ñW¶°ØÑI¡–q/ ôåÅÐÔý¡!+¨"J't”Ù·©šX©5ÍhÒÝаý>÷ÅÑcÎÉÛ7û&ß½]Ù)·^`ö—Yr±cHó# +AhŠºš’îb>ñúþ±]aúÁ(Éè\PW»ÚwYÏ!>ï½d±Q‘xÅ PÖÌŸú’_£DΟ? êôo[-‚âÑöÌt÷Òì\³M{äs¶S ©+GòÝ¥Ó,—©4ÊWNEvÉʱ<Þ×ð$§\à /66ï»Øþ‡?äÿOðÿ™-è q°:Û ÿª…ÐTendstream endobj 1303 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 34 /LastChar 122 -/Widths 2714 0 R -/BaseFont /KALSPG+NimbusMonL-ReguObli +/Widths 2713 0 R +/BaseFont /WKLFYB+NimbusMonL-ReguObli /FontDescriptor 1301 0 R >> endobj 1301 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /KALSPG+NimbusMonL-ReguObli +/FontName /WKLFYB+NimbusMonL-ReguObli /ItalicAngle -12 /StemV 43 /XHeight 426 @@ -13598,7 +13600,7 @@ endobj /CharSet (/quotedbl/numbersign/parenleft/parenright/plus/hyphen/period/slash/four/six/colon/B/C/D/F/I/N/O/R/T/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 1302 0 R >> endobj -2714 0 obj +2713 0 obj [600 600 0 0 0 0 600 600 0 600 0 600 600 600 0 0 0 0 600 0 600 0 0 0 600 0 0 0 0 0 0 0 600 600 600 0 600 0 0 600 0 0 0 0 600 600 0 0 600 0 600 0 0 0 0 0 0 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj 1227 0 obj << @@ -13609,7 +13611,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬µc”¦ÍÒ%\¶»Ì»ªË¶mÛ¶m]¶­.vÙ¶mÛ¶ñõsÎ̼³Î7¿fÞ×ZWFDîØ;2“„P^‰FÀØÎÐDÔÎÖ™†–ž kacèâ$cg+M#hgm økd!!r41p¶°³6p6ᨙ„MŒŒŒ€½‡£…™¹3€\EQ‚ŠŠú¿,ÿ„ =þ§çïN' 3[éßWk;{[ç¿ÿוLLÎæ&S k€œ¼†„¬€\LV fbkâh` w1´¶0H[™Ø:™PLíÖÿ^Œìl-þ)͉ö/–€Ààdobdñw›‰»‘‰ý?.j€½‰£…“Ó߀…ÀÌÑÀÖùoœí¶FÖ.Æÿøk7µû!{G»¿6}Áä휜Œ-ì³Ê ‹þ›§³¹ó?¹,þºv¦#íŒ\þ)é_¾¿0½Î¶NgwçršŒ-œì­ <þæþ fïhñ/.N¶fÿÅ€àhbfàhlmâäôæ/ö?Ýù¯:ÿ[õööÖÿÚm÷¯¨ÿÅÁÂÙÉÄÚ”†ñoN#翹Í,laèþ [S;ý¿íÆ.öÿÓçjâø¯‘ÿ33IÛÙZ{ŒMLaèdíœÿ¦ÿß©Lûß'òƒÄÿ-ÿ·Èûÿ&îjô¿âÿ×óüŸÐ¢.ÖÖ²6àß àï cüsÇüÿb l,¬=þÑÿ¨fòo†ÿ' gƒ¿m°5û+=-ý¿N¢î&ÆòÎFæSë¿=ú—]ÅÖØÄÑÚÂÖ䯖ÿj#€†žþ?|ÊæFV¶ÿ4åß.[ãÿdþWžñ¦S‘•–¡úÏÛô_QòUwVö°ÿKìÔ!cgü¿ÿ` +xÚ¬µc”¦ÍÒ%\¶»Ì»ªË¶mÛ¶m]¶­.vÙ¶mÛ¶ñõsÎ̼³Î7¿fÞ×ZWFDîØ;2“„P^‰FÀØÎÐDÔÎÖ™†–ž kacèâ$cg+M#hgm økd!!r41p¶°³6p6ᨙ„MŒŒŒ€½‡£…™¹3€\EQ‚ŠŠú¿,ÿ„ =þ§çïN' 3[éßWk;{[ç¿ÿוLLÎæ&S k€œ¼†„¬€\LV fbkâh` w1´¶0H[™Ø:™PLíÖÿ^Œìl-þ)͉ö/–€Ààdobdñw›‰»‘‰ý?.j€½‰£…“Ó߀…ÀÌÑÀÖùoœí¶FÖ.Æÿøk7µû!{G»¿6}Áä휜Œ-ì³Ê ‹þ›§³¹ó?¹,þºv¦#íŒ\þ)é_¾¿0½Î¶NgwçršŒ-œì­ <þæþ fïhñ/.N¶fÿÅ€àhbfàhlmâäôæ/ö?Ýù¯:ÿ[õööÖÿÚm÷¯¨ÿÅÁÂÙÉÄÚ”†ñoN#翹Í,laèþ [S;ý¿íÆ.öÿÓçjâø¯‘ÿ33IÛÙZ{ŒMLaèdíœÿ¦ÿß©Lûß'òƒÄÿ-ÿ·Èûÿ&îjô¿âÿ×óüŸÐ¢.ÖÖ²6àß àï cüsÇüÿb l,¬=þÑÿ¨fòo†ÿ' gƒ¿m°5û+=-ý¿N¢î&ÆòÎFæSë¿=ú—]ÅÖØÄÑÚÂÖ䯖ÿj#€†žþ?|ÊæFV¶ÿ4åß.[ãÿdþWžñ¦SSP”§úÏÛô_QòUwVö°ÿKìÔ!cgü¿ÿ` Ú¹¼h˜™4ŒlìVv;ƒÏÿ!Û¿`þk-càìháÐú[2=ÿ ÿß­tþFÄÖÈÎøŸ)Qr6°5þ;XÿËðÛÈÅÑñ¯žÿ:ë þŸë¸‰‰»‰Ìê’W°eZfºs FîЄ°V_èPˆ}I½rQ•]·_Ú¯Ž ýêÚ†)ίVÅ3ûÏIÊÑtk²î“«|\ŸŸ½È›¤ílT‡tº%ðéçjQ^× ÒÛ`š¬ôª‡» @@ -13669,23 +13671,23 @@ Z VÍ]êAy³XH±ÔŒèyÒLåýkoù"-Õ6_XŸs(GÕjØwOÎÃIÕÕ\‘›"NÚGvBÓˆŽ…¤Yô·ØfàÄØ(ßÁx‰!´à‰%žM>¯Z)gþ•ÂEO“< Œáû_’W3ƒëLmJÍvD%Hv~Ð^¢bAXpÐÍ å"UØð;z¯Ãg«Ô«¼L’"¤Ú-Û‚ Ÿ‚xwÒ×~ e]bþL‚¸=V›Ïóð¨-ÁÅû”Cª³;ÓÖoä®Í ¨ÐÒ&CdÊÜÞ<_}9Ížsßú–M©’£ê˜Eä‡S+ø{ðåÅ1Kg¥V£2¾ÒÁ5«È–­eéýê õÏŠ½SÅöÁ…®ÙK¼TùГ®°zc†\wír,Ö™yÆTôfDÇãF^±–ýtÚ|¶«w]’ÂйP 1dEi‰R—Ü@í ëH#É‘º#$ÞJƒµ€u!ê&äË+;YеM§æ.¸TinÖKÄæ“ÉZ1pk£|šYÌ™ÕxŒvâ³àõð1íÀtô^‡)9"ßb°Y¦ÇÐG}²ÿtƒVR=߇V²âߚР?V믱fì+¯†&cuOn”ˆÑcCì%LK”¤ðÁɟֺ娉䟇÷ ªú8çô»0±»A_î¶¡ß›¬ÄQø ¿,:Fp\îŽr|0`Ï!ÛÍéy¾.Nïè^(%×½ñ>Ü0Ø]^ÒC ‘$®Çž5~<ðrpÊÃz>ŠPãuÍx{¿šècAÊûß·™ÍZÆ~œe·9^|Ø™ª´:öÛ9½0 *ÿ}ôõW'¼D>½³}=à -zžûcêÈ^‡õsa`ÔúþçBº&¿¯ÈÀ}Ü–#üÝ×õ,¶…ð€5nXœ`KÃ|Úªup´ëqª£¦Ws•³Fþ»‰ûë»ÕnË·+1§!NqM;Ú¦”+1Åôä@2Z œXÞ%ÉŠû:bj…Ä UC¾·'èÈVõ ”ß½Eð©°ñn7I”ȕ䦑£¼"o~ô$¾ÇííD`i -XãÙS9´½ AÄŠ›˜ì \¿j‹Gq‘ñ YÔ4Ûûª2x"…þ€¦Æ">5IåñOù¼Ðù)þþbZòZj÷Ö›ŒEŒ×©8Œ†–BY‡tç÷]Ü þ×™¢Ë€9£ýd%ut o¥tÃØ_‹Òs¼#Žp9Ä RsˆNóÊ Aα›‘my_êB[öéNU9Wɶ¿~›ê?霨˜–’"¿²¾ê ³/8 ©Ž‡6Ý!Rëú;„9jº‰‹$:·ß³ï{ÇwBí`#Œ…Üä$Õgš³ŽmDÇØ<& P”»¯hpTÒ¢IëWZ²å–[ä§ÏL Øgî{]íCÇ|ÞªLkRíyÌ.ƒ·çý uÑdgÙ'Õ·ôNY•XJ A!O¸0Ëž9v(H§"lðp5IåñOù¼Ðù)þþbZòZj÷Ö›ŒEŒ×©8Œ†–BY‡tç÷]Ü þ×™¢Ë€9£ýd%ut o¥tÃØ_‹Òs¼#Žp9Ä RsˆNóÊ Aα›‘my_êB[öéNU9Wɶ¿~›ê?霨˜–’"¿²¾ê ³/8 ©Ž‡6Ý!Rëú;„9jº‰‹$:·ß³ï{ÇwBí`#Œ…Üä$Õgš³ŽmDÇØ<& P”»¯hpTÒ¢IëWZ²å–[ä§ÏL Øgî{]íCÇ|ÞªLkRíyÌ.ƒ·çý uÑdgÙ'Õ·ôNY•XJ A!O¸0Ëž9v(H§"lðp> endobj 1226 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /TENLLE+NimbusMonL-Bold +/FontName /WQROGH+NimbusMonL-Bold /ItalicAngle 0 /StemV 101 /XHeight 439 @@ -13694,7 +13696,7 @@ endobj /CharSet (/quotedbl/numbersign/quoteright/plus/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/at/A/B/C/D/E/F/G/H/I/K/M/N/O/R/S/T/W/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) /FontFile 1227 0 R >> endobj -2715 0 obj +2714 0 obj [600 600 0 0 0 600 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 0 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 0 0 600 600 600 0 0 600 0 0 600 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj 1207 0 obj << @@ -13706,7 +13708,7 @@ endobj >> stream xÚ¬·ctåßÖ&›£’Û¶mWœT²cÛ¶m§bÛ¶]±*¶­[ÿsºûíqnß/}ß{Œßšxæ3ç3×c“)ªÐ ÛþŠÛÚ8Ñ1Ñ3räÍ­:;ÊÙÚÈÒ)Mlpdd"@C's[QC' 7@h ˜™L\\\pd[;wsS3'¥š² íYþ ütÿŸž¿™Žæ¦6ò¿.@+[;k Ó_ˆÿëD àd˜˜[" -ŠšRòJ y5€Ðè`hPtþien57Ú8©&¶«F¶6Ææÿ´æHÿKÈ`p´™ÿMºíþqÑì€Ö掎¿æŽSC§¿3p²˜ÛY9ÿCà¯ÝÄö_„ìlÿFXÿõýS´utr4r0·sü­ª(*þožNf†NÿÔv4ÿëØšü4¶5rþ§¥ùþÂüõ:šÛ8œ€nNÿÔú ›;ÚYºÿ­ýÌÎÁü_4œÍmLÿ‹-Àhjè`lttü óûŸéüWŸ€ÿ­{C;;+÷eÛþ+êq0wrZ™ÐÃ11ÿ­iäô·¶©¹ Ã?‹"ecb `bü·ÝØÙîú\€ÿå?;Cõ—„¡±­•;ÀhÇ oëô·$€òÿNeúÿ>‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿ𩚙YÚü3z¶»€6ÆÿIþ¯Hÿ¢Î ¡)+¥(AóŸoê¿¢ÿjï¤ên÷—ØÿhEÎÖøþÁ¶uxÒý½tÌ,ö¿9™˜¼ÿÕþÃô_g9C's7€öß–™þÕøÿøý×I÷?`ÄlŒlÿÙ'Cã¿ëõ¿ ÿ¸œþªú¯ÿ·áÿyþ×¢n@#¸Õß¶F‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿ𩚙YÚü3z¶»€6ÆÿIþ¯Hÿ¢Î ¥¦¬®&NóŸoê¿¢ÿjï¤ên÷—ØÿhEÎÖøþÁ¶uxÒý½tÌ,ö¿9™˜¼ÿÕþÃô_g9C's7€öß–™þÕøÿøý×I÷?`ÄlŒlÿÙ'Cã¿ëõ¿ ÿ¸œþªú¯ÿ·áÿyþ×¢n@#¸Õß¶Fö¥©F{1­(zR€—ùøÞ$T}¨›ä4 z%ˆégQžW‹²ÛZìŒê»“JÊzÅïPß§;X`®ž¨üH\ üÐIí|ŒRëc1:QA¾Õžž‘'?=R Ž õÜ@öíãÑäÄÂ’ñ¸@ ’GúÙçà h©Ux†SA¥7!àÝ´_}jt{êå‘‘â’FX˾*šæ¯Ù´Ë¾'A¦· ð&Ê9H¶îWþÀ¼žŸŽäJœæšËýZw&sÄâmŸ 쿵$ œÉ„®'~»¦ìw 󬵮¦~íCÊ]™Qê,©wmÚ'c¤ w®Diµs$óÐY–1¾—f‡ÙÄ&>.jüäë賬9“5ÎÕu¨ÍÄV¤?m=Á8ib/4l¼˜’lºÖ’Ÿ$):Srïð¹ŒtéÇ#/sƒydŠü¡ _•vÏÐX¢ÖÙ"» ú”4Ú]Ô†Üf†·”-FêÕˆFG‚„ùs!kt> @@ -13787,23 +13789,23 @@ i ^hâŒð·¹ œ£“hZ™Í/øÅ_à7œÀ+P¸¸&&êåî$+Nȶp®Ô ~I(–»c¹ÚŸYªÓÅg¶%ø¥p%ö>­’H¾iL¿\ÚõÐß(¦µâ_«8Cƒ—R{‹ ޵rð¦ëØíû‹0Ê{‡˜ÊQê¸2‰«Zœa‰ƒ†*7Äc¹äJî„I›ÏüìÒ]©æÁ 1=Š¡å©òñS€MX¡¥GMøªéþP¢‹:*½ÙOT9†ÜD¨*ÀzÞÃ*Úž“¬ÿ°Ë_hg ‚œ«ê9ŸjˆŠ"J7Þ®(ðhT(ìâ ª¦¼ÜðÊ™§Ä‹V¬áÝq -oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦y$3î3i=+iÿWuÈæÔmâ’<£Ⱥ][±÷QgShSÝ»¤SñºïX±wû@`z>ÍÛòÈëB¶"Æ®.(ñôAàN¥Ã|³w®3¬ín1eqÞ¸XäL%­1;¹MÊ®¦*Åÿ^OìU©‘yo•½§ìRùùÑ© lå™Õº©RéÓåú’ØyšQÝÅêØÌ·XçY2‹†¸Ä¾ŒPñ+«Ö$ßo¼7SæDEÏ–GÙËËGªvË.¼–Õ£ª¾PH^ ÍuòñjzZ+3àÆ´¤Nc<ÃÃe™åGKB.þ/Qü?øŸÜ|Ý]ƒà~.>ÿ,£ßendstream +oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦y$3î3i=+iÿWuÈæÔmâ’<£Ⱥ][±÷QgShSÝ»¤SñºïX±wû@`z>ÍÛòÈëB¶"Æ®.(ñôAàN¥Ã|³w®3¬ín1eqÞ¸XäL%­1;¹MÊ®¦*Åÿ^OìU©‘yo•½§ìRùùÑ© lå™Õº©RéÓåú’ØyšQÝÅêØÌ·XçY2‹†¸Ä¾ŒPñ+«Ö$ßo¼7SæDEÏ–GÙËËGªvË.¼–Õ£ª¾PH^ ÍuòñjzZ+3àÆ´¤Nc<ÃÃe™åGKB.þ/Qü?øŸÜ|Ý]ƒà~.>ÿ©×ßendstream endobj 1208 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 33 /LastChar 125 -/Widths 2716 0 R -/BaseFont /WYLIPG+NimbusMonL-Regu +/Widths 2715 0 R +/BaseFont /IURVUF+NimbusMonL-Regu /FontDescriptor 1206 0 R >> endobj 1206 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /WYLIPG+NimbusMonL-Regu +/FontName /IURVUF+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /XHeight 426 @@ -13812,7 +13814,7 @@ endobj /CharSet (/exclam/quotedbl/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) /FontFile 1207 0 R >> endobj -2716 0 obj +2715 0 obj [600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj 1150 0 obj << @@ -13823,7 +13825,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x& )UuIºÿý^ý—Ÿâ_ýAªîö@ÀÿŸDCÎÎä?ÿ°ˆˆØ¹<X8™ ¬ÌìÝ߃ÇÍÆâýÈø/"–ÿZË‚-ÜÚÌŒÌÌ,€¿ßÿñù¯•5¶3ùgǨ€ mMþn²ÿ4ü;;:þÕö_çþoÓÿ±þ×vÝ€Æë+vƼA–i™é :ÜÜ‘)1í>È‘`ûÒFÕ¢¿»^ß´°]îJƒÚ`ƦžßíîËçöŸ‡Ò´Gc}8ÖT½)Àë|"o +xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x&Ue51ºÿý^ý—Ÿâ_ýAªîö@ÀÿŸDCÎÎä?ÿ°ˆˆØ¹<X8™ ¬ÌìÝ߃ÇÍÆâýÈø/"–ÿZË‚-ÜÚÌŒÌÌ,€¿ßÿñù¯•5¶3ùgǨ€ mMþn²ÿ4ü;;:þÕö_çþoÓÿ±þ×vÝ€Æë+vƼA–i™é :ÜÜ‘)1í>È‘`ûÒFÕ¢¿»^ß´°]îJƒÚ`ƦžßíîËçöŸ‡Ò´Gc}8ÖT½)Àë|"o šþô­¯œtGLz¥ÈéQž7K²;P?8˜Õö¦””õJ>`ˆg:Yánžiü(\ ü°¾<Ù£ø§6Äbw¡5aÔž_|M<}~¢î½…î?$¤Ë‰…§äuBþéçC(øC­B¼ªùÕi{Ju ¡glŸÏÏìC(»ƒ¢ÈbÓËZÁçjð§fÌÁpC@¶VBjä+s^"ò“£œŸpÖj×Ñm¡HNZ¬¹Šù—;Ão{ô«OŠ—©š}¾ŽÈïqM gÀÁõ@‰Î @@ -13897,23 +13899,23 @@ K p÷†ÓºùáXk)iÇÝKqkùÈüÙ²ú´{Ô°!¢1µçsßÚ3‘à æý“B òÐ2t¦£ƒ% ]–Aþu²"ÉÜß2åº.Ó “ñx•s,õ)®k¾óÒ>hœýbyZÃ÷-ý$ËbÇ;¨´²* #Œ6^ÿ´Œ‹Ä*jj¾}5™üÊ­tÿg ›­ûá=)ìGõ™;RVÛÚ½wV*îM\ˆšhßn`ÇPÙºzÇ'I~©VŽ;&븙i—w âc3:™S‹åa¥40ÏZ: Moè¥Ø~ƒÐ#YcÑV„³IF^¸Övú¾&ÕÍBoªzôåÒ½¢šºˆ<è@Õ Ž!ÄVo£Cé·³s~íAãŸ)4°jsY™ÖÑÁ¤¤ÒøÉ‰ cxg4Hc=‰‚­|(—æ3§‘»Ñô¯ðÑqr1¥~tÓ™²süçŸVý;Ë}I†õ„=*š½Â!³ ®8¸²ù ¢Ÿ{J½ÅhJ$‘¹Í2ÕtKcÇZ=P¶)»ûøÔÂwË,û«øƒˆcÌm#ãdxÐu!^ Ú9ûi7ŸÙJcÔŒ]+µ jÆ»Ò_€[hI£YÉì0…òÇ*껪¦úݳj€í¨ž¨ß`Ù?8sGx9g3ÎîèñÙt÷:n:—SúluHx‹œ›ÍÉPo·«ÃJAüÕh€ß¾ÅW'ˆÃô´B ¶q…¡Jˆ`“ý kaæ®´bg>–MO”¶æB8uk—ÄþÙ7)Çê®Ü¿5GVQ(ë¿P­m-FG*åTA¸¡WK2z)· Ž×?3Ì›QOl s¹xŽ5WË–§zGϺß?ÁyËÇDóÛ8Þ6<,óyÊœ³%ɾŠaîjôër¤ôç ³L.¸!åeÖ&A—¯y!qíµ¸`Û®8 &ƒûCá°ˆ×P·KÄMZQƒñˆR“!»V¸x3ËßÀÃ'£l{…x|#”ÄÒ,ò9r&tã|¼ a¥ïéæ3sawÄø² Ã××ÿuåÝ™×Ãùv¦&R®É;Ƴo©5$rÇâ¯%ì»iÕav·4Ë EìØÔ;E6'µ…¹ïh;ž7\oqkÙñ*¯u¾+ÍNcýàÿOÃõÿû‚ÿ -¹ƒ%ÔÕÝÙêjý'óâendstream +¹ƒ%ÔÕÝÙêjýì¿áùendstream endobj 1151 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 2 /LastChar 151 -/Widths 2717 0 R -/BaseFont /FITVGS+URWPalladioL-Ital +/Widths 2716 0 R +/BaseFont /TRUDBK+URWPalladioL-Ital /FontDescriptor 1149 0 R >> endobj 1149 0 obj << /Ascent 722 /CapHeight 693 /Descent -261 -/FontName /FITVGS+URWPalladioL-Ital +/FontName /TRUDBK+URWPalladioL-Ital /ItalicAngle -9.5 /StemV 78 /XHeight 482 @@ -13922,7 +13924,7 @@ endobj /CharSet (/fi/fl/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) /FontFile 1150 0 R >> endobj -2717 0 obj +2716 0 obj [528 545 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 0 0 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 0 0 0 0 0 0 722 611 667 778 611 556 722 778 333 0 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 0 0 0 0 0 0 444 463 407 500 389 278 500 500 278 0 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ] endobj 1017 0 obj << @@ -13938,7 +13940,7 @@ xÚ¬ R)u€”¹½¹³±-@ÉÕÄh ššÛ»˜Ó,œ¶ÿ>LìÍ€ÿ\Í…é/—ˆ Ààâhn üfîajîøÄp4w¶º¸ü}]–ÎÆö ¿=9€ö¦¶®fÿð×náð¯‚þzØýÅþ’)9¸€\LŽ À߬Jâ’ÿ®de ú'· ð/ p°øëiæ`êúÏ•þ…ý¥ù‹‚Œö.¹èŸ\&æ3 ‹£­±çßÜÉÿ*ÃÕhoù_0œÍ-ÍlÍ]\þÒüåþ§;ÿuOÀÿv{cGG[ÏE;üËë?k‚\Ìm-˜XÙþæ4ýÍm ´G`þgTdì-¬,ÿ¶›¹:þæfîü¯Ñü33´‹06s°·õ˜™[ 0+8€þ¦Ðü¿©Ìô?'òÿ€Äÿ#ÿÈûÿOÜÿ®Ñÿöÿÿ}Ÿÿ;µ¤«­­‚±ù¿‚ÿ±cr€–Œýÿáml´õü¿ùÿwOMóù¥‘ÿm…ˆ½å_9y™8xXxÿ ]$æfJ@©ÀÂØöo¯þeW·73w¶Ú›ÿÕô_í0²²°ü7LÍ -hjcÿOó9ÿ ™Û›ý÷úÿÊô¯ê™åU¤eµ5èÿ½Ê¨jûw¾ Y¹¸ÿ¡ôw@jžŽæ€ÿ•NSÞÁì?ÿð‰Š:x¼Y¹¸Œl<ì_@6V/»ïÿ%÷¿ˆXÿë,o rztY˜XXXÿ’þóÉòOîÿ4ôÿ„½©ƒÙ?³£ +hjcÿOó9ÿ ™Û›ý÷úÿÊô¯ê™”eåD%éÿ½Ê¨jûw¾ Y¹¸ÿ¡ôw@jžŽæ€ÿ•NSÞÁì?ÿð‰Š:x¼Y¹¸Œl<ì_@6V/»ïÿ%÷¿ˆXÿë,o rztY˜XXXÿ’þóÉòOîÿ4ôÿ„½©ƒÙ?³£ 2¶7û;nÿiø6uuvþ«ò¿6ÀßëÿÇù_ƒonîanа¾â`Êb‘ ªÃÍ™×èc… u,mT+* ¨qèõψØå­4z« ejšáûh÷\>s|?üFw4Ö‡cKÝ›f~ùЗœ¶¿ý'U'7ýQ³A)ræ¹fŒ÷Õ’Ü”‹ÆÑÞ”²ŠAÉ ÑL'»3ÜÕ#m¹[aŃ#ŠŸizC<¬úQt©Æ7áh,rç"ò k{µß8t¯O/;¥ºˆof±ú%¬”&íxÕ)FáöW“ñ¹äÀ õ HU¡¯DRË…WéÆù£]ëjA°Ò\ù*2̘Hƒc»c.7Û¢9ØÉîá!F†–¡ÍÕgélr¯¸’jU ®NÁÓ SÌTœ±Hi~|ŒÕwÛk¶qš‡~¹6c¶³#Å'X‡óæ…~kÝ|aÌÙjXÕ•lbñm6 ŠEÙ§ß5À:éÒYÁïPýߊj¨·×})“Þ‹¤Ð/¼h2«2ºc#}?è\¨a—îŽÿ’¿ÿ[CìB>+Üâ²Õ4k:àJV¾³/?㉤Ÿ0r$±—gF”·ž9Ë&LJuª¯k^3?×ê:d‚Á„$ì¨wWê]%*²1œ!ü18¯«|ö …s~ÄÉéÑ pcž¼-VÁuM/lTœ³wb?†^¯Zs?[Ü%ÁJ8´™ÝÆÖ.çWÊB#ûc5ÛbM#0Ûë˜Þ*giIK‰¸k‡„ƒe:o«1{rúË$Švß/£Ç´-â¼!Ä’DÅüÖT¦劗ïœý¾úfÓ!Ql£øz¡¶ããŠ-㵡²Áî8}uM#Eë}:ÛÀ£>Éôpå"º¥b¸)ã9« ‡ØRŠÿ>7@ÿyXõCu\.è ŒºÌQé¶™°6\Ç­êÔ’BZTt9äæ®¢%Ès3)#÷¥ûûÓÄ_J£ö •úŒ>kš´"ú(ߵ쬆ÿþ7Ö!ˆAÎv†8¼\L-E©»>æLk9­ûwÙX@è[šIË fó¤ZyuÌLt5åæ B›ñwO)ã—–C¾’âì·Ÿ¾³W°Ïì [š‹ÅC|”IÙj‘Ñåͱ,#7Ùò5D;q0QÑ℺$G›xú4oYµÚ13È@dL¨ÊGü’ðœ;ŒQîÞò—ÕBÕÄ’Üâ)EM_©™ˆúzwÊp^‹”·Þmùn|a„¨=$RWƒúåË®fç±k¨CRÃKxlþŽ,H˜ò3ñý÷V(Íôn:sþ]'-£’¶\ýPkaIÊõ2PŒNã¬?×Èe? ZºÜŽ•'BûÆ$ªÞÇãf׿¼0 4È5Z×ð¸³g»ÊXJ1#$jÓ«5e?2Å%I¦SàÆb­Û«.ò^*Wí4ÜXý"÷Ð*µ£d9àF–$uY»Ï?‹³éìSxïaµY-¢¡€Ñ_{â©b]Ø}*‘¸§lþm-õ Ÿ¸,š=ǦqÔm'}ã’½ÈJ/W–‚ÑqÒkÐÀ xöJzÜRç¾R´I¥-¦n‘û iK¨xH6ušxÖésƒ7)Øë2~v ¬™fAù)KŸyHè„)Ô’D…,Ü/oÝEI[«t5ÉGsÉ»Ì~ÄÞîYL"â¶F,cð`Kñ3]õ³9udÏ£Cs´Ì!¨°>³“ÑÙLÙÓí0g€;ärž5EfªÌw§HD®nVdü/rp2˜©±dš¡Ïù¡ ´ì LcÓÒk„}xãM‡øATᳶǦšC ²ž­P£™5ðHL5È‘>gF¬•Ê9@PºMþåG-*£?ɦ±]¨ß$ ÙÂH<ðïôÕu=l²é‡M'8C÷Ñ6 `…«p•·9 SÐAÜ?ä…C+ÙBý°Ž%«5’k#4f%ã–Eòž`KR C”x£n©2^ çË„MçÈwS†q终y,˜6Ñ4ßÖÙÚÃI+®‘ïÒhâ%ÿô+cDzA` Ï!ø?(²*é0n²G¡¡æÒëQXNŠJ5ûºîŽÚ ñ$hÓäïc¡Ê¢ÑYÉÝ`¸q'uÿЪ/‚Ý´mÑøD“ ¯²v~¹°ùLÊ{BÝŒ¡øÃ6²–íìÑŽ&Í').Ý瘃‹¦#‚¦2̃ëŽâq'rôÛø]éºHô‚åóƒ'Î:­MØ,Cz) m>¸Zk¶Ó]«>ø:,ÙÀ%ÿšÅ) ©‚©%AØy´¼=€¬NX¦ÄvÙù'a-ŠSR¼èó6†o¡( †‹4ZQÒ&Æ“€'x_!Bå4 @@ -13992,23 +13994,23 @@ T êOqÚô¡9U¤ $Ö=6Ððü|Hò‹°s%nS,{¨üˆ&õÊ’—8$²cå’6¿p[Žx7íj£\k@?®ð¶ "Ü<4s=3Ña½BÚ_Z¼–âç0h^×IÓ¡gÀDFÌû"O,v}V%t ïæûüH¦¼¯¸Êi¹ò¢ŒÞf4ðAÖÕð î[ù×%£©!¿Ñôør{&ÿö§õ 'QºµÝ‰’s$ Vº<3ÿiúü`+zв±ƒõ¤âBy¿e5m¨á^[ÄyaS©aŠ€()ÞŸíÆÜ=7w3ÔV³Md& ðÑÈå’½Teöä´þe¢QŽh¬õ äØîαÿ”øg´>»6¹”¼g´(>\PóÔkºßo†‘vÝ8‹¥‡HZR¯±˜(rÔs•Ì7R¶s×»LíªøŠæüz!ÁÈ U[–Õ²69§QŽƒ.[¿’6çÏhüS—Wse®÷±dßbfïyîI‡dÁFbNþ%ÕgÔÆGœ¢,bœrü(šÙÂ%+'‹ Òl£g"îuªrC`Wro¦1€5ÇCÈ…çpû¶šÍÄ]sG¹ÑOnäàrqœìZI=…M}…)äCQÊ~ ê!µŸ¾Dz9·%eÞ!­û©ÆÁ”,Ý,>׿¿âb‰lGûrs RøV0' uV·ƒÔ) É ²;^%!#úㆹå"à÷È“µ‚i4Í p#Öo·¤_Œä%±!¥Óæ`…(`¢ix¸ü={Pìr {[£3þÝɶ*\ÔvµvÈÆe~0{zŠJ"É®Ñc µÄÀ‹í_~ …U¢÷íýwõœÅ6o¸JÚè¨OÊÿ7E®Õ?ÿm]~»úàD¾?œñ޹,à¾$ôƒc2‹™‹ã鏿ߋM|&ìšp{³×Ó\Ì «e •Œ¤·Æý:®s”CrªÞr±[G^…_x[´?ÒØæå'®Öܬž ¥Škv5‰GlŸ뽺>QÄè5ó†…¼~šÒÙŽÝ  ÙvnÂ|*ÑÐaòÝ¥ÉÿÞ^á=tønÚÖ•_ÎïxPðdòùCß•b­RæwWbgÖJ?~årοþC¬[BýädƯ{ñ h§úÍwÓ‰Ï'}2~Ñ]Ø6å°âÙŒ9û ²&ÜÔîNÖñûö¡î±`luî‹)G2O=ßùEßCùä”Õùù[ -¹ÓÏ™wŸ˜sìÇÆâ@•»¯M·åöMXvºóEÿÿu9~Û¤k²¹¶…ê¼ ª?yÉg“º”òÌÜ{ç;OÛ«YŸ$3iÕæ#ÛÏn•8²oväóŽ7¯ã}ËÏëÕýÜá?÷þ¹ësÿ„æÕäÈ©Ù÷pö.Õ`¹fýO©a›K<­ÛNîêè=|ˆuÖïD©â¹µßýÝ^Ú(šDªM?T¹CÂxÝ;)ñ´g¥ÙENÓ/Û¾}õ%×ÊÛJ®Q†…É9©‰E%ù¹‰EÙ\³¢bendstream +¹ÓÏ™wŸ˜sìÇÆâ@•»¯M·åöMXvºóEÿÿu9~Û¤k²¹¶…ê¼ ª?yÉg“º”òÌÜ{ç;OÛ«YŸ$3iÕæ#ÛÏn•8²oväóŽ7¯ã}ËÏëÕýÜá?÷þ¹ësÿ„æÕäÈ©Ù÷pö.Õ`¹fýO©a›K<­ÛNîêè=|ˆuÖïD©â¹µßýÝ^Ú(šDªM?T¹CÂxÝ;)ñ´g¥ÙENÓ/Û¾}õ%×ÊÛJ®Q†…É9©‰E%ù¹‰EÙ\ 6?endstream endobj 1018 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 35 /LastChar 90 -/Widths 2718 0 R -/BaseFont /MRHKYV+URWPalladioL-Roma-Slant_167 +/Widths 2717 0 R +/BaseFont /NQKLBF+URWPalladioL-Roma-Slant_167 /FontDescriptor 1016 0 R >> endobj 1016 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /MRHKYV+URWPalladioL-Roma-Slant_167 +/FontName /NQKLBF+URWPalladioL-Roma-Slant_167 /ItalicAngle -9 /StemV 84 /XHeight 469 @@ -14017,7 +14019,7 @@ endobj /CharSet (/numbersign/parenleft/parenright/comma/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/X/Y/Z) /FontFile 1017 0 R >> endobj -2718 0 obj +2717 0 obj [500 0 0 0 0 333 333 0 0 250 333 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 0 667 667 667 ] endobj 955 0 obj << @@ -14029,28 +14031,29 @@ endobj >> stream xÚíUkTgnõJÀ+Å€€¸ -æ2@ ŠMË© É„’ L P. (‚€`P¡r¨´RZ/ÀËÅÄŠ‚g¹iL@°rÕtÐc—þÜýµggþÌû<Ï÷~Ï<ïwÎgfâéCpb!Á° "@"HœÝ|d$’qffÎ( ‰¸ˆ`$‚ihoNâ¤d;…L£ÚáÌg$< -å†pD€…óg‹";À‰£\&$Ü æc=˜ðA˜\XEœx<À{q…ð†…0 ³ˆ8X\¦†C¸iÑCÀF»e˜%GE¨3X`&?0‹,DÀ‹X0GrG°½`ÌÉÃÔÊæ.bÏâ/¶_JéO<Äçò¢Þ*~¸X£€‚QÁJ©¼lÎ fqÅü•,Cñ¸L'A  ‘lM]&¸B®fyrELÀ†xBx ‡¬•V°ø–Œ|ý½Ý÷zY½ëé q¢Qá0@~¯^ªÁ÷5–Ê•d"™ bBì}÷¸b³½&Ââ -B -Õ€PŠÂa'«¨@ p,XÀÌ1‰(@DØ‹&`#(nq¬ 5@brQ&f.NM´È.T€Œeÿ"S0 …˜0fÿ¶~ /ý=n‹áúÀ2Àf˜ 9K🃣ÓI bìm±A[ÀÎŽûoB¦Eahélbñ¿«Ù\ld0,™¸Þn„éš_“R·÷ü>"i½l«R÷j¶ø×ÅpY±>Ôs^&!¢²ÑåÕ2|˜Bÿ ¦Ã)]ôŠA¦{ÆWÓ¥º¯¦Wøg'P›‰=>ø¨¤téš×Væ£ Y„ïéÂo”†´fôÑÙo·mïÞߦsŽ¥¢>ß47Ø­½ÑÒû¤¥éf»Þ šnÂG <éÜ:YŸc'sâö}W†'^è’n®`;jOC³qìH…ÂÊkÄ©õžJyLŸ5¿Þ#£9@òÔ8Í4Õì¹Ü§B2“góÛ­pMüÝ´±Ì’™¯=´pÍÆôëwdÉ7”¤¬„}MÆ®Fm¬9¯6·Y¹K? !Z¯º4RgÐúøà/Õ`ê•ææò¸PXamžñž§Ñß7ìœ;ˆÏŒ%~Ysúг²™vwƒ¨»ë^¯sÖË"-÷tŠ›øê¬´ŽsbŒ„·éè¾³¯ìQÿƒï¾ö -¬Åez@.¯52[‡_§h™J»ìŒÌ¿ò}ÅX]±VXj±IXz)a,‰Ö ¬¾ÙÙ>PgÉcL2ÒõòB®%Â8r‚}µeËFi½^OíY©¬OÇX³_™­§0‘V‰‚¸ì3Ú³Y™žî^þ_jÄiÉOô|®V÷½¨|VŽœÝ1¶%qÌOÂ8!98a5%÷Ѧ]ê*óO54‚/5:ÚÌj:Uœ]¯b(Üö›tÿ‹º8E)9œè©´sÿ0}?øûä÷‹C ?ÅXMh ·öçÌĸœ,çï ëç}ö7ÝYõ«ˆüù£Ãêã*iŸì2îÂ&Éüßÿ2T6±¾àÚ-Ù5Ñ… Ÿ÷ß*¶¥*Ž=œT^¯º1&n¼é`.%)oS&žÉf”åû]üQíż¢²x\ÝÜÔS?Ÿ4(\‡î)ª?¥Í£ìg.ã•“Ue´Ï}öÿO±O:½øû)Ò›¤îõr‰Q¹½:ujºTKþf«gvûÇ žtÎÊ’N©Y#ÞßBÒíw÷îØÃž»ð›Ä¾uݸŸ")Æ^Ç;¤Égù±ÎÓŸï¶ì~Í)xv\#&U6\LÇ'­ ¸¯Z¥RŸ6 -§Ý—VŽë‹Ò/ü꾫H™š2¹¥`èzSå.ß|F‹OëC»ãf›_%Y¨¾Íªö4]m\Ò·PZз —¨ >"‰¶—¸EèFỉϋ;"<æºÄ¹y‰¹î²+Ñä¬'eH‰¿ÜF§_ÒsYؽŽ6j«m ¼ó×4Çc]ëfîÞƒÓФc®ªU1š}ºw;]ÊGuå u¬Ý­·GC‡œ®i‰ƒymš?/H7‚„Ã~ùš36’“ÜŒÀñîÂíú†ërŒö‘ؼ|xó<þ õáìV¯AÛñ©šSAó_ñ$$æ¼ÉßDU¬ý¥¯U_U_ôtgWŠ_œ«é\»$õŒrjãÎön‰]9'û¾ »žÑ蟓i­N®ˆcu„6Ø ñ‡Ä=±9Þ½RNáÚ Þ¼Jö:äÿðÁý¿ÁÿDìê†P‡Ð0Ü¿$8þyendstream +æ2@ ŠMË%€ +ŠT†dr$“T`E *T.•VJëX`¹¬(xÖˆP›FÁ+W]Aw=véÏÝ_{væÏ¼Ïó|ï÷Ìó~ç|fL_‚  †Ý‘„Aàêá{$ ‘Œ³°pEaHÂGD» L@GGp‘r +h2ꀳ\‘°H”ÏåI+×ÏD€‹Fù,Hx@,Äz° à‹°ø°$’¸€Ï +1à‹a4fq °ù,  sù"iÁCÄA‡%˜- {GEÀ¨3Xa&?0‹lD$ˆØ0GòD°½`ÌÉÃÔòænRÀ.´_LéO<$ä "ß*a˜T£€†QÑr©¼dÎfó¥Âå,C ø,WÐŽH¶¥.|±_³™| ‹p ^Äa{¹,¾E#$:s÷nºÍÛ¹.’Lˆ/’ì‹ ƒò{õb ¾¯±”P¾  ÉdbﻯÀe›í±6_Ä(T{BQ(‡ ¬¢Ñ À±aË0Ç$¢‘`K,šcAq cm‹²0kaj’v‰ ¤`,sø™‚a(Ä‚0ç°í[xièïq{ ‡Ð÷–°BÅHÌ[„ÿŽÈ¢ G€àhýÚÔcÿ&dIQIÏ&ÿ»šÃÇFÃ2˜…ëéBXN‰!¹UIå1»Ïßùá#’ÎËÖ +Mv“MLŸ}Ì—zÎÛŒ+))R]=¡À‡* ¿`9ÒG¯¥{¦}5U¬ñjja™fµ‘Øí‹LH•¯zmc9ÂP„8ÿʘֈ>:ûí–­=S[b[õαÕôCçfºt×[ûœ´6ßèÐsA»ÿà øÈþ'›'jbsolgß¾ïÎ`âÅn©–J޳nð4óȉP*m¼‡]šï©UG Ùsk½ÒdOMSÌ“-ž·ø–ɦScŒ£»¦¿›2š^4ýµ—®Ñ”~½ÿŽ"ñ†Š”·§ÁÔݤõ‘-ïÕÆVOù'\ò€íŠKÃ5Fm!÷ÿR &¿Qko,yQ…æWç˜îzþ}ÝöÙýøôcÄ/«N|VR§Ðíª3õwÜëqÍxY ãÙ®•Jñ^‘×ðNŒ’ðCcví]wö”<Š~ gôÝ×ÞÕ¸t/ÈíµVzóÐÀñëasy§ƒ‰åW^1V–­[m_ŠM õ+ovt‚Ôc釳cŒTƒîµxGŽs¬´nZ/¯5è®>+Wôê™j÷©2£ ”fò +IŸsFw&#-èéíÿ¥Vìá¦ÜÄ@¯ÀçMï‹òg¥ÈÙm£›âGý4IŒ-/Æm&Åc¾º´K%þÉÆ–‘ð¥zg»é|m—²³kÕ %’Ýv“îq_'¯ )‹5™rîæ/c~Ÿø~}aá§hëÁq-äÖÞ¬éØa£“¥¼ç*¯Z§ªRS3bã˜CbwHΕ'¶©V=Åß´ ê8´÷Å4<6óHø¨SKß«L~ÅI7>^¨á¹o¢Ìgt…އfÿ³B9%j1¡~ÊLWõlÞ¶kâcÝËù>ç¶ý¤¡XK[¾«ÞÇz0UµÛŒÏÛé†9Ÿ„þMÆ_ó*œP]¯¸1*­¿éd)'©nSöÇŸÉd”äú]üQãɺ¢¶z\ÙØÐ];—4 žƒî)+?¥Í¡œgncåN%´Ï}÷þK•pNº¼øû)Ò›„®Zµ-2“R?zeòäT±NË›ÍÌ̶A¯ù¬5RµJº·‰¤:îì3Þ¶‹3{á7™cóš1?eB´£ž·Ágý±ÞÓŸï6í|ÍË{v\+:Y1THÇ'¬ ¸¯^¡Öœ6 £ÝW–k R/üê¹£@•œ4±)oðzCù޹Œ&ßæ‡Ç×Í4¾J°R›QÉ4_iZÔ;_\з iòû?"I¶–ö{„Fh¬ñÏ ãëÛÙý³ÒìúœølOÅ•(rÆ“¤È¿ÅN¯ _Ô}YܵŽ2i­®¼ó×ç£k¦ïÞƒSê +ä£îêÑÚ½Fúw;ÜJGô[ækØ;›o8‡ º\Ó‘ Zµž—j  ‡ürÓ´§íÖ% fÙic]ù[ ×d™ì!qø°Æ9üêÙÍÞöc“Y4—¼ÆÃ ¡ò 7ú¼ÙßDQ¬ù¥·ÙP][{ätGg’_Œ»ùl›,ùŒjrýö¶.‰Y^'{¿ »ŸÑê›Uè¬L,‹a·‡ÔÙ¡±¥ÝDz|´zä¼üÕA=9åœôÈÿáƒûƒÿ‰ØÕ ¡D¡¡¸ 6þKendstream endobj 956 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2719 0 R +/Encoding 2718 0 R /FirstChar 13 /LastChar 110 -/Widths 2720 0 R -/BaseFont /VXRNEQ+CMSY10 +/Widths 2719 0 R +/BaseFont /BPEEXB+CMSY10 /FontDescriptor 954 0 R >> endobj 954 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 -/FontName /VXRNEQ+CMSY10 +/FontName /BPEEXB+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 @@ -14059,10 +14062,10 @@ endobj /CharSet (/circlecopyrt/bullet/braceleft/braceright/bar/backslash) /FontFile 955 0 R >> endobj -2720 0 obj +2719 0 obj [1000 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 0 0 278 0 0 0 500 ] endobj -2719 0 obj << +2718 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef 102/braceleft/braceright 104/.notdef 106/bar 107/.notdef 110/backslash 111/.notdef] >> endobj @@ -14074,7 +14077,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶»lW—mÛúú}ïܹ³î̯ùæG®õœˆ8;vÄ>'Öz2“„@^‰FÀØÎÐDÔÎÖ‰†–ž ¢¨&o`mm`la'M£hgcøkf"!r01p²°³6p2ᨙ„MŒŒŒ(€½»ƒ…™¹€ü/õYþ ºÿ§çïNG 3[éßk;{[§¿ÿוLLNæ&S k€œ¼†„¬€\LV fbkâ`` w6´¶0H[™Ø:šPLíÖÿ±ÙÙ[üSš#í_,G€ÀÑÞÄÈâï67#û\Ô{ GÇ¿Ï G€™ƒ­Óß8Ù,l¬ÿ!ð×nj÷/!{»¿6}Áäí,ì³Ê ‹þO's§r;ZüuìLÿFÛ9ÿSÒ¿¾¿0½N¶Ž'7§ršŒ-í­ Üÿæþ fï`ñ/ gG [³ÿb@ p013p0¶6qtü óûŸîüW€ÿ¥z{{k÷wÛýõ?9X89šX›ÒB10þÍiäô7·™…-Ý?GEÂÖÔÀ@ÿvcgûÿô¹˜8üÛ òÎ Å_Æv¶ÖîcS(:Y;§¿)äÿw*Óþ¿ùÿÄÿOþ"ïÿ?qÿ»FÿË%þÿ{Ÿÿ;´¨³µµ¬É¿›ÿ9cÒ€†Œíÿm`caíþŠÿï‘j&ÿAòÿ#ádð·¶få §¥ÿ£…£¨…›‰±¼…“‘9ÀÔÀúoŸþµ«Ø›8X[ØšüÕóßVhèéÿ›OÙÜÂÈÊöŸÆ³ü‡ËÄÖø¿sÿ+Ñ¿ÌédÅ¥dU¨þ÷™úoœü_í”ÝíÿRû¥ÈØÿÏÅ?(‚‚vnOVV #;Óß+ÇÈà`fòþ?düˆá¿Ö2Nn­¿eÓ3ü[üÿøü×Jç¿ÁˆØÙÿsZ”œ lÿ°ÿiøÇmäìàðW×ïüߢÿsýïQ71q31‚ZýcgÄd™–™îT‡ž;<)¬ÕßÇ2l_Ú¨\TàWc×ë›¶ÃQ©ÿQLÛ4ÍùÕî¾tfÿy Iy8Ú‡fMÖ›br•ãMDñ»q“´“ê0€N·6ý\-ÊózQzT“•^õpwRAQ·äwº“Éòú™ÂÈ¥À…øÉÎÇ(µ!µ ¡ ©®ðìœ4ñäù‰lpldx¨÷ì÷6UNìO.PXÒH¿_9Ø|š*"U­ªm{½Zl†>¢kŸ’rNXÁ™ÍÏË#¾#)W–cÜàã™þ_ û4Ã[õ½\Ö“ÚÜ )!³(¡7-æOªS+1mh5›xob7(ß1ncnÛ/Oúj,ØcVâ?4ïvrxü”NO«ùÙzG®^'>=ÔDUµ|ÞïŒRkXA boë ¹ÝÄ?F#Øé€zÝUd´•™U˜€€ë¾lÓèÅ`Ü”ñÜÖ–x½° 2ã 4wH^P „±?2Ö„õYÚγx,:œ,g'+@³ñVÁ¶ùÄç)€v(‰Þ‰žšmŽ6ÌØC +xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶»lW—mÛúú}ïܹ³î̯ùæG®õœˆ8;vÄ>'Öz2“„@^‰FÀØÎÐDÔÎÖ‰†–ž ¢¨&o`mm`la'M£hgcøkf"!r01p²°³6p2ᨙ„MŒŒŒ(€½»ƒ…™¹€ü/õYþ ºÿ§çïNG 3[éßk;{[§¿ÿוLLNæ&S k€œ¼†„¬€\LV fbkâ`` w6´¶0H[™Ø:šPLíÖÿ±ÙÙ[üSš#í_,G€ÀÑÞÄÈâï67#û\Ô{ GÇ¿Ï G€™ƒ­Óß8Ù,l¬ÿ!ð×nj÷/!{»¿6}Áäí,ì³Ê ‹þO's§r;ZüuìLÿFÛ9ÿSÒ¿¾¿0½N¶Ž'7§ršŒ-í­ Üÿæþ fï`ñ/ gG [³ÿb@ p013p0¶6qtü óûŸîüW€ÿ¥z{{k÷wÛýõ?9X89šX›ÒB10þÍiäô7·™…-Ý?GEÂÖÔÀ@ÿvcgûÿô¹˜8üÛ òÎ Å_Æv¶ÖîcS(:Y;§¿)äÿw*Óþ¿ùÿÄÿOþ"ïÿ?qÿ»FÿË%þÿ{Ÿÿ;´¨³µµ¬É¿›ÿ9cÒ€†Œíÿm`caíþŠÿï‘j&ÿAòÿ#ádð·¶få §¥ÿ£…£¨…›‰±¼…“‘9ÀÔÀúoŸþµ«Ø›8X[ØšüÕóßVhèéÿ›OÙÜÂÈÊöŸÆ³ü‡ËÄÖø¿sÿ+Ñ¿Ìé4¤5…dÔ©þ÷™úoœü_í”ÝíÿRû¥ÈØÿÏÅ?(‚‚vnOVV #;Óß+ÇÈà`fòþ?düˆá¿Ö2Nn­¿eÓ3ü[üÿøü×Jç¿ÁˆØÙÿsZ”œ lÿ°ÿiøÇmäìàðW×ïüߢÿsýïQ71q31‚ZýcgÄd™–™îT‡ž;<)¬ÕßÇ2l_Ú¨\TàWc×ë›¶ÃQ©ÿQLÛ4ÍùÕî¾tfÿy Iy8Ú‡fMÖ›br•ãMDñ»q“´“ê0€N·6ý\-ÊózQzT“•^õpwRAQ·äwº“Éòú™ÂÈ¥À…øÉÎÇ(µ!µ ¡ ©®ðìœ4ñäù‰lpldx¨÷ì÷6UNìO.PXÒH¿_9Ø|š*"U­ªm{½Zl†>¢kŸ’rNXÁ™ÍÏË#¾#)W–cÜàã™þ_ û4Ã[õ½\Ö“ÚÜ )!³(¡7-æOªS+1mh5›xob7(ß1ncnÛ/Oúj,ØcVâ?4ïvrxü”NO«ùÙzG®^'>=ÔDUµ|ÞïŒRkXA boë ¹ÝÄ?F#Øé€zÝUd´•™U˜€€ë¾lÓèÅ`Ü”ñÜÖ–x½° 2ã 4wH^P „±?2Ö„õYÚγx,:œ,g'+@³ñVÁ¶ùÄç)€v(‰Þ‰žšmŽ6ÌØC áàUûZ­RR Ž_&½þ’ÞŸfx¯%Ê3® ôEþsÈC®” ô“‘Bå0²TU’?…šÜ¡ˆhÍÒVùòýåm»T úÃ8Z§ä‚Û°ý ³:I?Ôöz"6›Èbœ^%\‰Wl©à:Õ ·įkU*Bœ5÷³2[Q‚j`tgÔÑuÍšàvK0 µ"1Í5Ô.H_Ï,¸¹ú,•û.ûš5¡VI÷úäGª^’±¢ yá×h}×¹­Z  ypÓ‚u=jëé 3\xœa(74nŠïRýƒ&cx£aYKÜ¿‰~ػբÉI·XiêS¨“2ø ú›G²¨†lkÕ›$ñé³øI ñƒ<½*­;:̽¤PœT1]š«ÚowŽ0~,A¸ÕO˜Ó%/‡ìdccÅ÷‹k×{GKÌ‘›j™(+ÔBUÞD# ¡6ª:Mð%¿s¾†I¼;v #wïRUèB&%Ô øªÕ(cÊïZB™ª³/7í¿ '|8¾—}Z£6Ã*DLi´¯kâ'/rn¶èXÐ60µ!~Èaïގا*\Dxc(uè³?^NWù ±CVØñ Áá´ÅÚQ[´¬5üŠvȈ0Kïø^•vµÚ*V¦°cœ (p3“¸µMÖiÒ|#Óƒ}5ãByE¦Ç•yÖÌÞ¢º<^×<;>3ýXÎFM.ê8ÈÆœFß©þsÂ^Î tI¼\nk2NÓRÅ[>Ëooã© Æ,í`ë±19â–±Ú`©@W4·¾º¦á¢Õ>Í-‹Ã>ÑÔP…[\ÊùñÓÄS}™Å˜†`ãÃímš/øŒÇü]GæÜêƒ?å£,J/k¨Ýï´ÛÞæÀá’z„¡¹ul¿‹JF¢‡ßÂöð1’£†°åïxDÑv hÇÚ ¥åã—r¢fY—òU·zifÁUÆz*JfU¤ËÞ ½ ýä|ÿ:Ð(Pk<’¥WÝìo*Á]ö…gP³Šþ,ÚFjî¶%™;ɘ¹á9L9.DœÇǦÝ@sOµhòÚ³BãtÑsÒ~ˆ®›×)-ÉAª×ZØkfbTfðNššöVUÇåøîÆè&ܼ+0™Ž#õ±8håÌñÉð¨}êeía¬N…Iû{ ˜ïÂΟ&vÊÈë:s]>°WŠë‚ W ·1®$&-/~æ.`É.m6$ûŲüIÀ‰Ú¤5utý³ ÊäÇSméWX`  ÍFÛm @¢ñТ¥êf3­™ÔC¿ÁFÕÆ"œØ™»á䦳(5I¸/L½’¡Y²ìñÓQ#”ý†YhŽu}T¤¤¼?¹N/Ö‹c ¿5Ll0¡Ë>‚w¸ìÛl­\pÓ;jC©ür»-JÝW¿¶Ùå mÜ1&Êî­ò4WÃ’Yµ+Äü#-½é"”¥{užo‘ÊëæSýË•@’Ô=õ˜½½Ž3³ÎØ}Vs’:Á ú“æ‘«£»{gˆó#Ñqöúb‚6+7îŸw&ŽXÙÿy¨7ípý„¬ó󋃱wéÍãCN(³¹9ã啦°ìX";¥‡üÌøf­gÜGÀÖ]S—ê£fçù¹”åI|Fys±fèÇøý8AœFæõÛŒ.W¿Hø,ÌFFÙQѹ,PŸåí F"O­rŒ\4nšÑž3"VÂ5°Êpø-f¥šs -ÇГöÞVMýͲ:“®³m›ÓWBÖþü/ùÁÿ ±©¡“‹½­¡“5ÌÿBy@endstream +ÇГöÞVMýͲ:“®³m›ÓWBÖþü/ùÁÿ ±©¡“‹½­¡“5ÌÿuvRendstream endobj 953 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 2 /LastChar 216 -/Widths 2721 0 R -/BaseFont /NGRKNU+URWPalladioL-Roma +/Widths 2720 0 R +/BaseFont /YLZCMX+URWPalladioL-Roma /FontDescriptor 951 0 R >> endobj 951 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /NGRKNU+URWPalladioL-Roma +/FontName /YLZCMX+URWPalladioL-Roma /ItalicAngle 0 /StemV 84 /XHeight 469 @@ -14202,7 +14205,7 @@ endobj /CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/circumflex/quotedblleft/quotedblright/endash/emdash/Oslash) /FontFile 952 0 R >> endobj -2721 0 obj +2720 0 obj [605 608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 840 0 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 0 606 0 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 0 333 0 0 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 500 500 0 500 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 ] endobj 929 0 obj << @@ -14213,7 +14216,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬zcteß³mlÛN:¶“ŽmÛö‰mÛN:¶mÛ¶ŽÙq^ÿþWoÜ÷>½w?ì1öªª5kVÍZkœ3Æ&'VP¦4™Šìœé˜è¹‰T•Ô ml M,2tB¢¿f6rraGSCgK€ˆ¡³)7‘º© ‘ˆ©133 9‘0ÀÞÃÑÒÜ™ˆò/ íYþ !2òøÏßN–ævD_\Mmö¶¦vÎ!þŸ7*›š9[˜™YÚ˜ Ë+hJʉQŠË©‰›Ú™:Ú)¸ÙXÉX›Ú9™R™‰lþmAd °3±ü§4'ú¿X‚ND†DNö¦Æ–·™º›Úÿã¢%²7u´µtrúûNdéDdîhhçü·Î"K;c“üµ›þEÈÞð7Âö¯ï/˜ÀÉÙÉØÑÒÞ™èoV±ãélaèüOn'Ë¿n"€ÙßH€±Ë?%ýË÷æ¯×ÙÐÒΉÈÙÔÝùŸ\F¦D&–Nö6†sÿ³w´ü 'K;óÿb@Kähjnèhbcêäôæ/ö?Ýù¯:‰þ·ê íím<þµð¯¨ÿä`éìdjcFÃÄü7§±óßÜæ–v0 ÿŒŠ¤€ˆ‰ñßì&.öÿás5uüWƒ(ÿ™ª¿$ Mv6D&¦f0 rç¿)‰(ÿßT¦ÿŸù@âÿÿGäýÿ÷¿kô¿âÿßóüß¡Å\llä mMÿµ‰è?î"¢.™ÿ#ØÐÖÒÆãÿþß#ÕMÿãÿ EÒÙðo#íÌÿŠÁHÏøoFK'1KwSKgc "3C›¿]ú—]ÕÎÄÔÑÆÒÎô¯šÿj$#ãó©XX[ÛýÓv¶s™Ú™üwêúq9eMi-šÿóFýWœÂ_åU<ìÿRû÷Jd&ÿ¹øEHàNäEÇÄÆLDÇÂÈô÷ÀýåÃÅÂæóÉø/ ¦ÿZË:;Zºiÿ-ûïΊÿ÷ç¿Vºÿ FÔÎ`òϬ(;Ú™ü¯ÿ4üã6vqtü«ê¿Nüߢÿcý¯A75u75†Y_ó[¥ge8×aæŽL‰hô1Ž„Ø—6ªø×zýÒÃ÷¸* >jCè›f¸¿Ú=–ÛIQõaØüèM5½ÎÇó!¥ê/@Þ¦èä 9dÐ+…ϸPöºY’ÙÓbgT;ÞŸRTÒ+ù€ÀŸédq„ºùCåOêZàFölàkœÖ‡Þ…Ô„RWøû‚"éìÏó¡ñÑ‘áÞ;ðþ#\šœ8hrW0xŠ(‡\~-Õ +xÚ¬zcteß³mlÛN:¶“ŽmÛö‰mÛN:¶mÛ¶ŽÙq^ÿþWoÜ÷>½w?ì1öªª5kVÍZkœ3Æ&'VP¦4™Šìœé˜è¹‰T•Ô ml M,2tB¢¿f6rraGSCgK€ˆ¡³)7‘º© ‘ˆ©133 9‘0ÀÞÃÑÒÜ™ˆò/ íYþ !2òøÏßN–ævD_\Mmö¶¦vÎ!þŸ7*›š9[˜™YÚ˜ Ë+hJʉQŠË©‰›Ú™:Ú)¸ÙXÉX›Ú9™R™‰lþmAd °3±ü§4'ú¿X‚ND†DNö¦Æ–·™º›Úÿã¢%²7u´µtrúûNdéDdîhhçü·Î"K;c“üµ›þEÈÞð7Âö¯ï/˜ÀÉÙÉØÑÒÞ™èoV±ãélaèüOn'Ë¿n"€ÙßH€±Ë?%ýË÷æ¯×ÙÐÒΉÈÙÔÝùŸ\F¦D&–Nö6†sÿ³w´ü 'K;óÿb@Kähjnèhbcêäôæ/ö?Ýù¯:‰þ·ê íím<þµð¯¨ÿä`éìdjcFÃÄü7§±óßÜæ–v0 ÿŒŠ¤€ˆ‰ñßì&.öÿás5uüWƒ(ÿ™ª¿$ Mv6D&¦f0 rç¿)‰(ÿßT¦ÿŸù@âÿÿGäýÿ÷¿kô¿âÿßóüß¡Å\llä mMÿµ‰è?î"¢.™ÿ#ØÐÖÒÆãÿþß#ÕMÿãÿ EÒÙðo#íÌÿŠÁHÏøoFK'1KwSKgc "3C›¿]ú—]ÕÎÄÔÑÆÒÎô¯šÿj$#ãó©XX[ÛýÓv¶s™Ú™üwêúqeMy5IšÿóFýWœÂ_åU<ìÿRû÷Jd&ÿ¹øEHàNäEÇÄÆLDÇÂÈô÷ÀýåÃÅÂæóÉø/ ¦ÿZË:;Zºiÿ-ûïΊÿ÷ç¿Vºÿ FÔÎ`òϬ(;Ú™ü¯ÿ4üã6vqtü«ê¿Nüߢÿcý¯A75u75†Y_ó[¥ge8×aæŽL‰hô1Ž„Ø—6ªø×zýÒÃ÷¸* >jCè›f¸¿Ú=–ÛIQõaØüèM5½ÎÇó!¥ê/@Þ¦èä 9dÐ+…ϸPöºY’ÙÓbgT;ÞŸRTÒ+ù€ÀŸédq„ºùCåOêZàFölàkœÖ‡Þ…Ô„RWøû‚"éìÏó¡ñÑ‘áÞ;ðþ#\šœ8hrW0xŠ(‡\~-Õ Ñª&ðëöÜ(ÞÃÇ‘œåRMyû©i¯MH>c¸¤bq›‹bgÜë㤸>· +Zµ‹¥{ü‹q=v¾ ­™«O¼—«Ñ)X!íÁ/$ä±)$§ÁØ^‘w?í¦‘ù]€§“X.2)§©Êer[¤ .©»¹™ ;þÄýI‰ŽBà A¦¸¯»àÐaÁôÞ®|û³ 5ï8sêÓ†~Ð2V1z¶4l§ÔU=¾´<:¤¯cg°››ì°Dƒ½I¿8ÂNëù³l—y–^›oQŽ¡R]WCÁ¤œh4Ä3LdkÓÊi^Ÿ³û "ŸÍëã-ö .TÞ;”Ïè*Yp§«© ‹ÕÀKÀk" !œÑE¾[OžKA3æTv7‰.ѧü™"Ç S"V™bIÆ@ΖӧêAžAj܃¼DPä1»!òp˜Ñ_;…qÞȰÅŒW E¼k‘‡ìæêA¤(=$dd$p¹pÅå=qdÜ@ÃfçÛ%ƒJÉ—,Jjº—{°à6']ÝçÒýiÔnÌÔp=æˆu˜…îF'vù¥ìJS½£+J…½†íV†q’gâ:Vt×Cyò>½â¶Ä‘ó+µÜýªÜ‘Ü”µDØ[ìÖØÓ"tiÿbU-bqbÉ`¨ÀÞ{œ©P¬pû1î~sl€ÌmÄdPãó{a!Vî'Òa˜º{{^Q‰ÈÏú›¼<²Ka‡ E|:Ò—æ=E¤M•š'Wl~(ب âümù‚£E¿û˜ÈÅœ‰“8ub°†Éðâ%Cä%»xzªÀ¸Èûj§¢.²_×µ'Ô–#m÷—…€GQ3ή‰›ÕyW…­"ªÑiâ.m¦­À³ì†´= Ò1 (g¤Q5Cû{žÒf[óÁÙ¡ä=‚Céª]Éî•.Òf›Þ%tP7–ùz;7d„Ôär&ö½¢Ói‚Rê}bÕ %\غ²c±â @@ -14316,23 +14319,23 @@ V ¥`M/\oõÛþJXSù6”¿ü'ŽOØLaà¨oÍZNõµáø÷P³¬æ#À«-’·^=èCp§“´ñ»wÓ^»±òž,àìÎ-3à rg‡lÖ:G>€Ãs¦Ú£…î:œô0 ëX< Ô€µaËâøB´j[æ“÷)sàØA¯¿7oBÁÞÂÄ”A5d{Fáä;cŽ%eó*]š{+/Å=¾…61/áþàK~H¦)¡”Q"—v¤#f™&¤ŒçÖ'm·÷åS·L+3ÇqµÒ\ë\ÛŽ,Ê ]¶ÁµØ© çÒÚe8 Æ…ß°5²‡rÁè¢îàÅå§Ê^o*K{V#Ló â0Õ€‚²ÞxÂYŒ`ÒzB: [Ênةƒ´3ˆÃõ|ö3Þ+Çu[Kœ³š¸=(i"Ò„gcÚï4&=2õ9°«iŽoÖ$W¤ÜEC¶z™º¨ývЮ¿3-еDŠR ©(½­ë‘±Òl‹-z§4•ΕܸMØí6nÓZóÈa‰Iý¾«@ÜÜhñ›dÇÀ"uñ£ åº~!‰qZö7Ê5=ÏsŒÐ—ã×uÆ6ÙHJÿÒP€SN$ð½½Ðîžjæè<^¥)ÔŸ×Õ—QtÚ¹ý·ãË$ÊÁ·Á„è:ˆíû㛤Põ#xiðÜØà’EuÃN±n—­¤AÕÔOpäöÊ`gWî=ÖˆqIzCQ„+šÆ´'‰ºÚÐZÛa»b’Ýwu›Ç/@ýcuö–H–6ÓÂc]Ũ7$\hwFƪPØ$VÀ{LµHÅYÁÙçÔ\Ðü;vÎñÀüM£1ô>I8wŸ¨¨ Þùâ`(:£ÕÀŘžZ[”ü ÜL¬A2Û[„°’ƒÌñ:‘<¢Lû(•ÔÇÂ=::¶†â’=2Ǩp›j‘ݳ~°ÿÒgöi­’vq«"™ûÓA`5Þûu¤ðÊ ?™Ij’Jø–¾Žq¸„;™®>û%ìDâ&¬TØÕ¯MÆJö*GÍì"Sr³Ãj¥Ìn¸6Ëš”¦ê±q.ø'ªáý"…¤—¼ rË T"s¹~Ɖ&œ”rºmí¯ÆÇh¸Œ©JÙSš“ ‡û$Ëú*Ï[¾'е5ØÌ½Ã¾^¿‚@rG{XÎN3?Ü&Óvj½ìÖfl3O­ˆÐ¥\á" ÝJ)P\°7À«J&zgT‘š|†ñhÝh^r×X&âhŒç]CŠÒ÷ˆÂú%#ÅŸß’ïçUUÒÙ$ïRDäü¾Rk¤zwŒñ­ã—Z UßD„j%‘{7¹’&LoÅLó´T0‰*V^÷N‘³eVB)Êø‡tð_1J¿¡ãx)s0ßñ~±_+ÈLö;¾¡"ltMÚ³½­oIÆtè-Â<'_4À3.—Œò2JÄU½Û•T„¥UþÝ>A)JDyŽ«ë&á¾Ö”±‘= #¾cD6Çž@ü†ìÂà¿x¤èÑÏóDÁ»ÆŽf²4ÓÑHß™y÷\ò^¥±’í«diåúø¾ž†. -Ë—ÌF+uå| ã_ìŽ'¬gk"¸qáD]²S<þ€Õ07=Ó¾û” ³:]T?çÅ&3Ê÷Å”Ù-Ä»Ÿ—Ü^"lÊÀ %Zäß:oΠ§dÎÿ'(ÿüG~Ù™›º¸9Ú›ºØ¢ü6”à»endstream +Ë—ÌF+uå| ã_ìŽ'¬gk"¸qáD]²S<þ€Õ07=Ó¾û” ³:]T?çÅ&3Ê÷Å”Ù-Ä»Ÿ—Ü^"lÊÀ %Zäß:oΠ§dÎÿ'(ÿüG~Ù™›º¸9Ú›ºØ¢üôËàÂendstream endobj 930 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2705 0 R +/Encoding 2704 0 R /FirstChar 2 /LastChar 151 -/Widths 2722 0 R -/BaseFont /NSYDKZ+URWPalladioL-Bold +/Widths 2721 0 R +/BaseFont /SYOPVI+URWPalladioL-Bold /FontDescriptor 928 0 R >> endobj 928 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /NSYDKZ+URWPalladioL-Bold +/FontName /SYOPVI+URWPalladioL-Bold /ItalicAngle 0 /StemV 123 /XHeight 471 @@ -14341,225 +14344,225 @@ endobj /CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/question/at/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/emdash) /FontFile 929 0 R >> endobj -2722 0 obj +2721 0 obj [611 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 889 0 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 0 0 0 444 747 778 667 722 833 611 556 833 833 389 0 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 0 333 0 0 0 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1000 ] endobj 931 0 obj << /Type /Pages /Count 6 -/Parent 2723 0 R +/Parent 2722 0 R /Kids [922 0 R 948 0 R 958 0 R 1013 0 R 1077 0 R 1140 0 R] >> endobj 1216 0 obj << /Type /Pages /Count 6 -/Parent 2723 0 R +/Parent 2722 0 R /Kids [1202 0 R 1218 0 R 1230 0 R 1243 0 R 1254 0 R 1261 0 R] >> endobj 1277 0 obj << /Type /Pages /Count 6 -/Parent 2723 0 R -/Kids [1273 0 R 1279 0 R 1287 0 R 1296 0 R 1306 0 R 1320 0 R] +/Parent 2722 0 R +/Kids [1273 0 R 1279 0 R 1287 0 R 1296 0 R 1306 0 R 1319 0 R] >> endobj -1328 0 obj << +1327 0 obj << +/Type /Pages +/Count 6 +/Parent 2722 0 R +/Kids [1323 0 R 1330 0 R 1337 0 R 1342 0 R 1363 0 R 1373 0 R] +>> endobj +1382 0 obj << +/Type /Pages +/Count 6 +/Parent 2722 0 R +/Kids [1379 0 R 1384 0 R 1389 0 R 1398 0 R 1407 0 R 1414 0 R] +>> endobj +1423 0 obj << +/Type /Pages +/Count 6 +/Parent 2722 0 R +/Kids [1420 0 R 1425 0 R 1435 0 R 1448 0 R 1456 0 R 1469 0 R] +>> endobj +1479 0 obj << /Type /Pages /Count 6 /Parent 2723 0 R -/Kids [1324 0 R 1331 0 R 1338 0 R 1343 0 R 1364 0 R 1374 0 R] +/Kids [1475 0 R 1481 0 R 1487 0 R 1495 0 R 1501 0 R 1507 0 R] >> endobj -1383 0 obj << +1519 0 obj << /Type /Pages /Count 6 /Parent 2723 0 R -/Kids [1380 0 R 1385 0 R 1390 0 R 1399 0 R 1408 0 R 1415 0 R] +/Kids [1516 0 R 1521 0 R 1528 0 R 1532 0 R 1542 0 R 1547 0 R] >> endobj -1424 0 obj << +1561 0 obj << /Type /Pages /Count 6 /Parent 2723 0 R -/Kids [1421 0 R 1426 0 R 1436 0 R 1449 0 R 1457 0 R 1470 0 R] +/Kids [1554 0 R 1563 0 R 1572 0 R 1580 0 R 1591 0 R 1597 0 R] >> endobj -1480 0 obj << +1608 0 obj << +/Type /Pages +/Count 6 +/Parent 2723 0 R +/Kids [1603 0 R 1610 0 R 1614 0 R 1621 0 R 1626 0 R 1636 0 R] +>> endobj +1643 0 obj << +/Type /Pages +/Count 6 +/Parent 2723 0 R +/Kids [1640 0 R 1645 0 R 1649 0 R 1653 0 R 1659 0 R 1664 0 R] +>> endobj +1674 0 obj << +/Type /Pages +/Count 6 +/Parent 2723 0 R +/Kids [1669 0 R 1676 0 R 1681 0 R 1691 0 R 1695 0 R 1699 0 R] +>> endobj +1711 0 obj << /Type /Pages /Count 6 /Parent 2724 0 R -/Kids [1476 0 R 1482 0 R 1488 0 R 1496 0 R 1502 0 R 1508 0 R] +/Kids [1704 0 R 1714 0 R 1721 0 R 1727 0 R 1731 0 R 1735 0 R] >> endobj -1520 0 obj << +1746 0 obj << /Type /Pages /Count 6 /Parent 2724 0 R -/Kids [1517 0 R 1522 0 R 1529 0 R 1533 0 R 1543 0 R 1548 0 R] +/Kids [1739 0 R 1748 0 R 1755 0 R 1760 0 R 1767 0 R 1774 0 R] >> endobj -1562 0 obj << +1784 0 obj << /Type /Pages /Count 6 /Parent 2724 0 R -/Kids [1555 0 R 1564 0 R 1573 0 R 1581 0 R 1592 0 R 1598 0 R] +/Kids [1780 0 R 1787 0 R 1795 0 R 1799 0 R 1804 0 R 1809 0 R] >> endobj -1609 0 obj << +1818 0 obj << /Type /Pages /Count 6 /Parent 2724 0 R -/Kids [1604 0 R 1611 0 R 1615 0 R 1622 0 R 1627 0 R 1637 0 R] +/Kids [1814 0 R 1820 0 R 1827 0 R 1836 0 R 1840 0 R 1845 0 R] >> endobj -1644 0 obj << +1852 0 obj << /Type /Pages /Count 6 /Parent 2724 0 R -/Kids [1641 0 R 1646 0 R 1650 0 R 1654 0 R 1660 0 R 1665 0 R] +/Kids [1849 0 R 1854 0 R 1858 0 R 1866 0 R 1873 0 R 1893 0 R] >> endobj -1675 0 obj << +1917 0 obj << /Type /Pages /Count 6 /Parent 2724 0 R -/Kids [1670 0 R 1677 0 R 1682 0 R 1692 0 R 1696 0 R 1700 0 R] +/Kids [1907 0 R 1919 0 R 1935 0 R 1941 0 R 1945 0 R 1955 0 R] >> endobj -1712 0 obj << +1966 0 obj << /Type /Pages /Count 6 /Parent 2725 0 R -/Kids [1705 0 R 1715 0 R 1723 0 R 1728 0 R 1732 0 R 1736 0 R] +/Kids [1961 0 R 1968 0 R 1978 0 R 1990 0 R 1998 0 R 2006 0 R] >> endobj -1747 0 obj << +2017 0 obj << /Type /Pages /Count 6 /Parent 2725 0 R -/Kids [1740 0 R 1749 0 R 1756 0 R 1761 0 R 1768 0 R 1776 0 R] +/Kids [2010 0 R 2019 0 R 2027 0 R 2039 0 R 2046 0 R 2054 0 R] >> endobj -1787 0 obj << +2070 0 obj << /Type /Pages /Count 6 /Parent 2725 0 R -/Kids [1781 0 R 1791 0 R 1796 0 R 1800 0 R 1806 0 R 1811 0 R] +/Kids [2060 0 R 2072 0 R 2076 0 R 2080 0 R 2091 0 R 2095 0 R] >> endobj -1820 0 obj << +2111 0 obj << /Type /Pages /Count 6 /Parent 2725 0 R -/Kids [1816 0 R 1822 0 R 1830 0 R 1837 0 R 1842 0 R 1846 0 R] +/Kids [2102 0 R 2113 0 R 2172 0 R 2228 0 R 2282 0 R 2317 0 R] >> endobj -1853 0 obj << +2332 0 obj << /Type /Pages /Count 6 /Parent 2725 0 R -/Kids [1850 0 R 1855 0 R 1863 0 R 1867 0 R 1882 0 R 1896 0 R] +/Kids [2325 0 R 2334 0 R 2341 0 R 2346 0 R 2352 0 R 2356 0 R] >> endobj -1927 0 obj << +2370 0 obj << /Type /Pages /Count 6 /Parent 2725 0 R -/Kids [1908 0 R 1929 0 R 1936 0 R 1942 0 R 1952 0 R 1958 0 R] +/Kids [2365 0 R 2372 0 R 2377 0 R 2381 0 R 2386 0 R 2397 0 R] >> endobj -1973 0 obj << +2413 0 obj << /Type /Pages /Count 6 /Parent 2726 0 R -/Kids [1964 0 R 1975 0 R 1987 0 R 1995 0 R 2003 0 R 2007 0 R] +/Kids [2402 0 R 2415 0 R 2424 0 R 2433 0 R 2438 0 R 2447 0 R] >> endobj -2022 0 obj << +2456 0 obj << /Type /Pages /Count 6 /Parent 2726 0 R -/Kids [2015 0 R 2024 0 R 2036 0 R 2043 0 R 2051 0 R 2055 0 R] +/Kids [2453 0 R 2458 0 R 2464 0 R 2475 0 R 2485 0 R 2491 0 R] >> endobj -2071 0 obj << +2506 0 obj << /Type /Pages /Count 6 /Parent 2726 0 R -/Kids [2061 0 R 2073 0 R 2077 0 R 2081 0 R 2092 0 R 2096 0 R] +/Kids [2502 0 R 2508 0 R 2512 0 R 2516 0 R 2527 0 R 2538 0 R] >> endobj -2112 0 obj << +2548 0 obj << /Type /Pages /Count 6 /Parent 2726 0 R -/Kids [2103 0 R 2114 0 R 2173 0 R 2229 0 R 2283 0 R 2318 0 R] +/Kids [2544 0 R 2550 0 R 2561 0 R 2565 0 R 2572 0 R 2586 0 R] >> endobj -2333 0 obj << +2596 0 obj << /Type /Pages /Count 6 /Parent 2726 0 R -/Kids [2326 0 R 2335 0 R 2342 0 R 2347 0 R 2353 0 R 2357 0 R] +/Kids [2592 0 R 2598 0 R 2603 0 R 2612 0 R 2620 0 R 2630 0 R] >> endobj -2371 0 obj << +2646 0 obj << /Type /Pages /Count 6 /Parent 2726 0 R -/Kids [2366 0 R 2373 0 R 2378 0 R 2382 0 R 2387 0 R 2398 0 R] +/Kids [2635 0 R 2648 0 R 2657 0 R 2665 0 R 2680 0 R 2692 0 R] >> endobj -2414 0 obj << +2722 0 obj << /Type /Pages -/Count 6 +/Count 36 /Parent 2727 0 R -/Kids [2403 0 R 2416 0 R 2425 0 R 2434 0 R 2439 0 R 2448 0 R] ->> endobj -2457 0 obj << -/Type /Pages -/Count 6 -/Parent 2727 0 R -/Kids [2454 0 R 2459 0 R 2465 0 R 2476 0 R 2486 0 R 2492 0 R] ->> endobj -2507 0 obj << -/Type /Pages -/Count 6 -/Parent 2727 0 R -/Kids [2503 0 R 2509 0 R 2513 0 R 2517 0 R 2528 0 R 2539 0 R] ->> endobj -2549 0 obj << -/Type /Pages -/Count 6 -/Parent 2727 0 R -/Kids [2545 0 R 2551 0 R 2562 0 R 2566 0 R 2573 0 R 2587 0 R] ->> endobj -2597 0 obj << -/Type /Pages -/Count 6 -/Parent 2727 0 R -/Kids [2593 0 R 2599 0 R 2604 0 R 2613 0 R 2621 0 R 2631 0 R] ->> endobj -2647 0 obj << -/Type /Pages -/Count 6 -/Parent 2727 0 R -/Kids [2636 0 R 2649 0 R 2658 0 R 2666 0 R 2681 0 R 2693 0 R] +/Kids [931 0 R 1216 0 R 1277 0 R 1327 0 R 1382 0 R 1423 0 R] >> endobj 2723 0 obj << /Type /Pages /Count 36 -/Parent 2728 0 R -/Kids [931 0 R 1216 0 R 1277 0 R 1328 0 R 1383 0 R 1424 0 R] +/Parent 2727 0 R +/Kids [1479 0 R 1519 0 R 1561 0 R 1608 0 R 1643 0 R 1674 0 R] >> endobj 2724 0 obj << /Type /Pages /Count 36 -/Parent 2728 0 R -/Kids [1480 0 R 1520 0 R 1562 0 R 1609 0 R 1644 0 R 1675 0 R] +/Parent 2727 0 R +/Kids [1711 0 R 1746 0 R 1784 0 R 1818 0 R 1852 0 R 1917 0 R] >> endobj 2725 0 obj << /Type /Pages /Count 36 -/Parent 2728 0 R -/Kids [1712 0 R 1747 0 R 1787 0 R 1820 0 R 1853 0 R 1927 0 R] +/Parent 2727 0 R +/Kids [1966 0 R 2017 0 R 2070 0 R 2111 0 R 2332 0 R 2370 0 R] >> endobj 2726 0 obj << /Type /Pages /Count 36 -/Parent 2728 0 R -/Kids [1973 0 R 2022 0 R 2071 0 R 2112 0 R 2333 0 R 2371 0 R] +/Parent 2727 0 R +/Kids [2413 0 R 2456 0 R 2506 0 R 2548 0 R 2596 0 R 2646 0 R] >> endobj 2727 0 obj << /Type /Pages -/Count 36 -/Parent 2728 0 R -/Kids [2414 0 R 2457 0 R 2507 0 R 2549 0 R 2597 0 R 2647 0 R] +/Count 180 +/Kids [2722 0 R 2723 0 R 2724 0 R 2725 0 R 2726 0 R] >> endobj 2728 0 obj << -/Type /Pages -/Count 180 -/Kids [2723 0 R 2724 0 R 2725 0 R 2726 0 R 2727 0 R] ->> endobj -2729 0 obj << /Type /Outlines /First 7 0 R /Last 835 0 R @@ -14713,7 +14716,7 @@ endobj 835 0 obj << /Title 836 0 R /A 833 0 R -/Parent 2729 0 R +/Parent 2728 0 R /Prev 743 0 R /First 839 0 R /Last 919 0 R @@ -14879,7 +14882,7 @@ endobj 743 0 obj << /Title 744 0 R /A 741 0 R -/Parent 2729 0 R +/Parent 2728 0 R /Prev 723 0 R /Next 835 0 R /First 747 0 R @@ -14916,7 +14919,7 @@ endobj 723 0 obj << /Title 724 0 R /A 721 0 R -/Parent 2729 0 R +/Parent 2728 0 R /Prev 699 0 R /Next 743 0 R /First 727 0 R @@ -14960,7 +14963,7 @@ endobj 699 0 obj << /Title 700 0 R /A 697 0 R -/Parent 2729 0 R +/Parent 2728 0 R /Prev 355 0 R /Next 723 0 R /First 703 0 R @@ -15575,7 +15578,7 @@ endobj 355 0 obj << /Title 356 0 R /A 353 0 R -/Parent 2729 0 R +/Parent 2728 0 R /Prev 343 0 R /Next 699 0 R /First 359 0 R @@ -15597,7 +15600,7 @@ endobj 343 0 obj << /Title 344 0 R /A 341 0 R -/Parent 2729 0 R +/Parent 2728 0 R /Prev 131 0 R /Next 355 0 R /First 347 0 R @@ -15980,7 +15983,7 @@ endobj 131 0 obj << /Title 132 0 R /A 129 0 R -/Parent 2729 0 R +/Parent 2728 0 R /Prev 91 0 R /Next 343 0 R /First 135 0 R @@ -16054,7 +16057,7 @@ endobj 91 0 obj << /Title 92 0 R /A 89 0 R -/Parent 2729 0 R +/Parent 2728 0 R /Prev 67 0 R /Next 131 0 R /First 95 0 R @@ -16097,7 +16100,7 @@ endobj 67 0 obj << /Title 68 0 R /A 65 0 R -/Parent 2729 0 R +/Parent 2728 0 R /Prev 7 0 R /Next 91 0 R /First 71 0 R @@ -16206,957 +16209,957 @@ endobj 7 0 obj << /Title 8 0 R /A 5 0 R -/Parent 2729 0 R +/Parent 2728 0 R /Next 67 0 R /First 11 0 R /Last 23 0 R /Count -4 >> endobj -2730 0 obj << -/Names [(Access_Control_Lists) 2059 0 R (Bv9ARM.ch01) 1220 0 R (Bv9ARM.ch02) 1264 0 R (Bv9ARM.ch03) 1282 0 R (Bv9ARM.ch04) 1346 0 R (Bv9ARM.ch05) 1525 0 R (Bv9ARM.ch06) 1536 0 R (Bv9ARM.ch07) 2058 0 R (Bv9ARM.ch08) 2084 0 R (Bv9ARM.ch09) 2099 0 R (Bv9ARM.ch10) 2360 0 R (Configuration_File_Grammar) 1559 0 R (DNSSEC) 1412 0 R (Doc-Start) 927 0 R (Setting_TTLs) 1980 0 R (acache) 1271 0 R (access_control) 1710 0 R (acl) 1568 0 R (address_match_lists) 1541 0 R (admin_tools) 1304 0 R (appendix.A) 742 0 R (appendix.B) 834 0 R (bibliography) 2107 0 R (bind9.library) 2316 0 R (boolean_options) 1361 0 R (builtin) 1785 0 R (chapter*.1) 961 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 342 0 R (chapter.6) 354 0 R (chapter.7) 698 0 R (chapter.8) 722 0 R (cite.RFC1033) 2235 0 R (cite.RFC1034) 2120 0 R (cite.RFC1035) 2122 0 R (cite.RFC1101) 2217 0 R (cite.RFC1123) 2219 0 R (cite.RFC1183) 2179 0 R (cite.RFC1464) 2257 0 R (cite.RFC1535) 2165 0 R (cite.RFC1536) 2167 0 R (cite.RFC1537) 2237 0 R (cite.RFC1591) 2221 0 R (cite.RFC1706) 2181 0 R (cite.RFC1712) 2277 0 R (cite.RFC1713) 2259 0 R (cite.RFC1794) 2261 0 R (cite.RFC1876) 2183 0 R (cite.RFC1912) 2239 0 R (cite.RFC1982) 2169 0 R (cite.RFC1995) 2127 0 R (cite.RFC1996) 2129 0 R (cite.RFC2010) 2241 0 R (cite.RFC2052) 2185 0 R (cite.RFC2065) 2289 0 R (cite.RFC2136) 2131 0 R (cite.RFC2137) 2291 0 R (cite.RFC2163) 2187 0 R (cite.RFC2168) 2189 0 R (cite.RFC2181) 2133 0 R (cite.RFC2219) 2243 0 R (cite.RFC2230) 2191 0 R (cite.RFC2240) 2263 0 R (cite.RFC2308) 2135 0 R (cite.RFC2317) 2223 0 R (cite.RFC2345) 2265 0 R (cite.RFC2352) 2267 0 R (cite.RFC2535) 2293 0 R (cite.RFC2536) 2193 0 R (cite.RFC2537) 2195 0 R (cite.RFC2538) 2197 0 R (cite.RFC2539) 2199 0 R (cite.RFC2540) 2201 0 R (cite.RFC2671) 2137 0 R (cite.RFC2672) 2139 0 R (cite.RFC2673) 2279 0 R (cite.RFC2782) 2203 0 R (cite.RFC2825) 2247 0 R (cite.RFC2826) 2225 0 R (cite.RFC2845) 2141 0 R (cite.RFC2874) 2281 0 R (cite.RFC2915) 2205 0 R (cite.RFC2929) 2227 0 R (cite.RFC2930) 2143 0 R (cite.RFC2931) 2145 0 R (cite.RFC3007) 2147 0 R (cite.RFC3008) 2295 0 R (cite.RFC3071) 2269 0 R (cite.RFC3090) 2297 0 R (cite.RFC3110) 2207 0 R (cite.RFC3123) 2209 0 R (cite.RFC3225) 2153 0 R (cite.RFC3258) 2271 0 R (cite.RFC3445) 2299 0 R (cite.RFC3490) 2249 0 R (cite.RFC3491) 2251 0 R (cite.RFC3492) 2253 0 R (cite.RFC3596) 2211 0 R (cite.RFC3597) 2213 0 R (cite.RFC3645) 2149 0 R (cite.RFC3655) 2301 0 R (cite.RFC3658) 2303 0 R (cite.RFC3755) 2305 0 R (cite.RFC3757) 2307 0 R (cite.RFC3833) 2155 0 R (cite.RFC3845) 2309 0 R (cite.RFC3901) 2273 0 R (cite.RFC4033) 2157 0 R (cite.RFC4034) 2159 0 R (cite.RFC4035) 2161 0 R (cite.RFC4074) 2171 0 R (cite.RFC974) 2124 0 R (cite.id2511436) 2314 0 R (clients-per-query) 2034 0 R (configuration_file_elements) 1537 0 R (controls_statement_definition_and_usage) 1329 0 R (diagnostic_tools) 1252 0 R (dnssec.dynamic.zones) 1432 0 R (dynamic_update) 1356 0 R (dynamic_update_policies) 1318 0 R (dynamic_update_security) 1721 0 R (empty) 1794 0 R (historical_dns_information) 2101 0 R (id2466563) 1221 0 R (id2466586) 1222 0 R (id2467270) 1411 0 R (id2467406) 1413 0 R (id2467477) 1223 0 R (id2467486) 1224 0 R (id2467726) 1234 0 R (id2467748) 1235 0 R (id2467782) 1236 0 R (id2467866) 1239 0 R (id2467959) 1232 0 R (id2470264) 1246 0 R (id2470288) 1249 0 R (id2470386) 1250 0 R (id2470407) 1251 0 R (id2470505) 1257 0 R (id2470540) 1258 0 R (id2470567) 1259 0 R (id2470601) 1265 0 R (id2470628) 1266 0 R (id2470709) 1267 0 R (id2470734) 1270 0 R (id2470745) 1276 0 R (id2470777) 1284 0 R (id2470793) 1285 0 R (id2470816) 1290 0 R (id2470833) 1291 0 R (id2471238) 1299 0 R (id2471243) 1300 0 R (id2473326) 1334 0 R (id2473338) 1335 0 R (id2473765) 1371 0 R (id2473851) 1377 0 R (id2474284) 1393 0 R (id2474301) 1394 0 R (id2474340) 1395 0 R (id2474358) 1396 0 R (id2474369) 1397 0 R (id2474405) 1402 0 R (id2474531) 1403 0 R (id2474580) 1405 0 R (id2474594) 1406 0 R (id2475200) 1418 0 R (id2475281) 1419 0 R (id2475706) 1433 0 R (id2475744) 1434 0 R (id2475780) 1439 0 R (id2475862) 1445 0 R (id2475899) 1452 0 R (id2475912) 1453 0 R (id2475945) 1454 0 R (id2476040) 1455 0 R (id2476050) 1460 0 R (id2476059) 1461 0 R (id2476072) 1462 0 R (id2476178) 1463 0 R (id2476187) 1464 0 R (id2476224) 1466 0 R (id2476314) 1473 0 R (id2476484) 1479 0 R (id2476648) 1485 0 R (id2476786) 1486 0 R (id2476891) 1491 0 R (id2476900) 1492 0 R (id2476931) 1493 0 R (id2476986) 1494 0 R (id2477085) 1499 0 R (id2477420) 1505 0 R (id2477466) 1506 0 R (id2477521) 1511 0 R (id2477651) 1513 0 R (id2477672) 1514 0 R (id2477705) 1526 0 R (id2477921) 1538 0 R (id2478882) 1546 0 R (id2478909) 1551 0 R (id2479115) 1552 0 R (id2479130) 1553 0 R (id2479160) 1558 0 R (id2479303) 1560 0 R (id2479837) 1567 0 R (id2479880) 1569 0 R (id2480027) 1571 0 R (id2480455) 1578 0 R (id2480472) 1584 0 R (id2480496) 1585 0 R (id2480519) 1586 0 R (id2480678) 1590 0 R (id2480804) 1595 0 R (id2480856) 1596 0 R (id2481481) 1607 0 R (id2482215) 1618 0 R (id2482345) 1619 0 R (id2482666) 1625 0 R (id2482808) 1630 0 R (id2482872) 1633 0 R (id2482916) 1634 0 R (id2482931) 1635 0 R (id2486190) 1673 0 R (id2488442) 1703 0 R (id2488501) 1709 0 R (id2489121) 1720 0 R (id2490256) 1743 0 R (id2490452) 1745 0 R (id2490806) 1754 0 R (id2491308) 1772 0 R (id2492919) 1803 0 R (id2493178) 1809 0 R (id2494065) 1827 0 R (id2494273) 1833 0 R (id2494320) 1835 0 R (id2494745) 1840 0 R (id2496290) 1858 0 R (id2496297) 1859 0 R (id2496302) 1860 0 R (id2496774) 1871 0 R (id2496875) 1872 0 R (id2499008) 1939 0 R (id2499554) 1945 0 R (id2499572) 1946 0 R (id2499660) 1949 0 R (id2499829) 1955 0 R (id2500999) 1961 0 R (id2501195) 1967 0 R (id2501217) 1968 0 R (id2501579) 1970 0 R (id2501716) 1972 0 R (id2501734) 1978 0 R (id2502206) 1981 0 R (id2502331) 1983 0 R (id2502346) 1984 0 R (id2502458) 1990 0 R (id2502481) 1991 0 R (id2502497) 1992 0 R (id2502694) 1993 0 R (id2502763) 1998 0 R (id2502800) 1999 0 R (id2502875) 2000 0 R (id2503386) 2011 0 R (id2503821) 2019 0 R (id2503827) 2020 0 R (id2505363) 2028 0 R (id2505369) 2029 0 R (id2505814) 2031 0 R (id2505819) 2032 0 R (id2506768) 2039 0 R (id2506800) 2040 0 R (id2507209) 2049 0 R (id2507520) 2068 0 R (id2507601) 2069 0 R (id2507660) 2070 0 R (id2507740) 2085 0 R (id2507746) 2086 0 R (id2507757) 2087 0 R (id2507774) 2088 0 R (id2507973) 2100 0 R (id2508213) 2106 0 R (id2508401) 2111 0 R (id2508403) 2118 0 R (id2508411) 2123 0 R (id2508435) 2119 0 R (id2508458) 2121 0 R (id2508494) 2132 0 R (id2508521) 2134 0 R (id2508547) 2126 0 R (id2508571) 2128 0 R (id2508595) 2130 0 R (id2508650) 2136 0 R (id2508677) 2138 0 R (id2508704) 2140 0 R (id2508765) 2142 0 R (id2508795) 2144 0 R (id2508825) 2146 0 R (id2508852) 2148 0 R (id2508926) 2151 0 R (id2508934) 2152 0 R (id2508961) 2154 0 R (id2508997) 2156 0 R (id2509062) 2158 0 R (id2509127) 2160 0 R (id2509192) 2163 0 R (id2509201) 2164 0 R (id2509226) 2166 0 R (id2509294) 2168 0 R (id2509330) 2170 0 R (id2509438) 2177 0 R (id2509444) 2178 0 R (id2509501) 2180 0 R (id2509539) 2188 0 R (id2509574) 2182 0 R (id2509628) 2184 0 R (id2509667) 2186 0 R (id2509692) 2190 0 R (id2509718) 2192 0 R (id2509745) 2194 0 R (id2509840) 2196 0 R (id2509879) 2198 0 R (id2509909) 2200 0 R (id2509939) 2202 0 R (id2509981) 2204 0 R (id2510014) 2206 0 R (id2510041) 2208 0 R (id2510065) 2210 0 R (id2510122) 2212 0 R (id2510147) 2215 0 R (id2510154) 2216 0 R (id2510180) 2218 0 R (id2510202) 2220 0 R (id2510226) 2222 0 R (id2510272) 2224 0 R (id2510295) 2226 0 R (id2510345) 2233 0 R (id2510353) 2234 0 R (id2510376) 2236 0 R (id2510403) 2238 0 R (id2510429) 2240 0 R (id2510466) 2242 0 R (id2510506) 2245 0 R (id2510512) 2246 0 R (id2510544) 2248 0 R (id2510589) 2250 0 R (id2510625) 2252 0 R (id2510651) 2255 0 R (id2510669) 2256 0 R (id2510692) 2258 0 R (id2510717) 2260 0 R (id2510743) 2262 0 R (id2510766) 2264 0 R (id2510812) 2266 0 R (id2510836) 2268 0 R (id2510862) 2270 0 R (id2510888) 2272 0 R (id2510925) 2275 0 R (id2510932) 2276 0 R (id2510989) 2278 0 R (id2511016) 2280 0 R (id2511052) 2287 0 R (id2511064) 2288 0 R (id2511104) 2290 0 R (id2511130) 2292 0 R (id2511160) 2294 0 R (id2511186) 2296 0 R (id2511212) 2298 0 R (id2511249) 2300 0 R (id2511285) 2302 0 R (id2511312) 2304 0 R (id2511338) 2306 0 R (id2511383) 2308 0 R (id2511425) 2311 0 R (id2511434) 2313 0 R (id2511436) 2315 0 R (id2511524) 2321 0 R (id2511533) 2322 0 R (id2511558) 2323 0 R (id2511589) 2324 0 R (id2511734) 2329 0 R (id2511829) 2331 0 R (id2511837) 2332 0 R (id2511928) 2338 0 R (id2511981) 2339 0 R (id2512045) 2340 0 R (id2512060) 2345 0 R (id2512260) 2350 0 R (id2512392) 2351 0 R (incremental_zone_transfers) 1368 0 R (internet_drafts) 2310 0 R (ipv6addresses) 1515 0 R (journal) 1367 0 R (lwresd) 1527 0 R (man.arpaname) 2670 0 R (man.ddns-confgen) 2655 0 R (man.dig) 2361 0 R (man.dnssec-dsfromkey) 2409 0 R (man.dnssec-keyfromlabel) 2428 0 R (man.dnssec-keygen) 1446 0 R (man.dnssec-revoke) 2471 0 R (man.dnssec-settime) 1447 0 R (man.dnssec-signzone) 2498 0 R (man.genrandom) 2676 0 R (man.host) 2394 0 R (man.isc-hmac-fixup) 2687 0 R (man.named) 2556 0 R (man.named-checkconf) 2523 0 R (man.named-checkzone) 2535 0 R (man.named-journalprint) 2578 0 R (man.nsec3hash) 2698 0 R (man.nsupdate) 2584 0 R (man.rndc) 2610 0 R (man.rndc-confgen) 2642 0 R (man.rndc.conf) 2626 0 R (managed-keys) 1468 0 R (notify) 1347 0 R (options) 1317 0 R (page.1) 926 0 R (page.10) 1308 0 R (page.100) 1954 0 R (page.101) 1960 0 R (page.102) 1966 0 R (page.103) 1977 0 R (page.104) 1989 0 R (page.105) 1997 0 R (page.106) 2005 0 R (page.107) 2009 0 R (page.108) 2017 0 R (page.109) 2026 0 R (page.11) 1322 0 R (page.110) 2038 0 R (page.111) 2045 0 R (page.112) 2053 0 R (page.113) 2057 0 R (page.114) 2063 0 R (page.115) 2075 0 R (page.116) 2079 0 R (page.117) 2083 0 R (page.118) 2094 0 R (page.119) 2098 0 R (page.12) 1326 0 R (page.120) 2105 0 R (page.121) 2116 0 R (page.122) 2175 0 R (page.123) 2231 0 R (page.124) 2285 0 R (page.125) 2320 0 R (page.126) 2328 0 R (page.127) 2337 0 R (page.128) 2344 0 R (page.129) 2349 0 R (page.13) 1333 0 R (page.130) 2355 0 R (page.131) 2359 0 R (page.132) 2368 0 R (page.133) 2375 0 R (page.134) 2380 0 R (page.135) 2384 0 R (page.136) 2389 0 R (page.137) 2400 0 R (page.138) 2405 0 R (page.139) 2418 0 R (page.14) 1340 0 R (page.140) 2427 0 R (page.141) 2436 0 R (page.142) 2441 0 R (page.143) 2450 0 R (page.144) 2456 0 R (page.145) 2461 0 R (page.146) 2467 0 R (page.147) 2478 0 R (page.148) 2488 0 R (page.149) 2494 0 R (page.15) 1345 0 R (page.150) 2505 0 R (page.151) 2511 0 R (page.152) 2515 0 R (page.153) 2519 0 R (page.154) 2530 0 R (page.155) 2541 0 R (page.156) 2547 0 R (page.157) 2553 0 R (page.158) 2564 0 R (page.159) 2568 0 R (page.16) 1366 0 R (page.160) 2575 0 R (page.161) 2589 0 R (page.162) 2595 0 R (page.163) 2601 0 R (page.164) 2606 0 R (page.165) 2615 0 R (page.166) 2623 0 R (page.167) 2633 0 R (page.168) 2638 0 R (page.169) 2651 0 R (page.17) 1376 0 R (page.170) 2660 0 R (page.171) 2668 0 R (page.172) 2683 0 R (page.173) 2695 0 R (page.18) 1382 0 R (page.19) 1387 0 R (page.2) 950 0 R (page.20) 1392 0 R (page.21) 1401 0 R (page.22) 1410 0 R (page.23) 1417 0 R (page.24) 1423 0 R (page.25) 1428 0 R (page.26) 1438 0 R (page.27) 1451 0 R (page.28) 1459 0 R (page.29) 1472 0 R (page.3) 1245 0 R (page.30) 1478 0 R (page.31) 1484 0 R (page.32) 1490 0 R (page.33) 1498 0 R (page.34) 1504 0 R (page.35) 1510 0 R (page.36) 1519 0 R (page.37) 1524 0 R (page.38) 1531 0 R (page.39) 1535 0 R (page.4) 1256 0 R (page.40) 1545 0 R (page.41) 1550 0 R (page.42) 1557 0 R (page.43) 1566 0 R (page.44) 1575 0 R (page.45) 1583 0 R (page.46) 1594 0 R (page.47) 1600 0 R (page.48) 1606 0 R (page.49) 1613 0 R (page.5) 1263 0 R (page.50) 1617 0 R (page.51) 1624 0 R (page.52) 1629 0 R (page.53) 1639 0 R (page.54) 1643 0 R (page.55) 1648 0 R (page.56) 1652 0 R (page.57) 1656 0 R (page.58) 1662 0 R (page.59) 1667 0 R (page.6) 1275 0 R (page.60) 1672 0 R (page.61) 1679 0 R (page.62) 1684 0 R (page.63) 1694 0 R (page.64) 1698 0 R (page.65) 1702 0 R (page.66) 1707 0 R (page.67) 1717 0 R (page.68) 1725 0 R (page.69) 1730 0 R (page.7) 1281 0 R (page.70) 1734 0 R (page.71) 1738 0 R (page.72) 1742 0 R (page.73) 1751 0 R (page.74) 1758 0 R (page.75) 1763 0 R (page.76) 1770 0 R (page.77) 1778 0 R (page.78) 1783 0 R (page.79) 1793 0 R (page.8) 1289 0 R (page.80) 1798 0 R (page.81) 1802 0 R (page.82) 1808 0 R (page.83) 1813 0 R (page.84) 1818 0 R (page.85) 1824 0 R (page.86) 1832 0 R (page.87) 1839 0 R (page.88) 1844 0 R (page.89) 1848 0 R (page.9) 1298 0 R (page.90) 1852 0 R (page.91) 1857 0 R (page.92) 1865 0 R (page.93) 1869 0 R (page.94) 1884 0 R (page.95) 1898 0 R (page.96) 1910 0 R (page.97) 1931 0 R (page.98) 1938 0 R (page.99) 1944 0 R (page.i) 960 0 R (page.ii) 1015 0 R (page.iii) 1079 0 R (page.iv) 1142 0 R (page.v) 1204 0 R (pkcs11) 1474 0 R (proposed_standards) 1372 0 R (query_address) 1726 0 R (rfc5011.support) 1465 0 R (rfcs) 1241 0 R (rndc) 1579 0 R (root_delegation_only) 1880 0 R (rrset_ordering) 1294 0 R (sample_configuration) 1283 0 R (section*.10) 2244 0 R (section*.100) 2576 0 R (section*.101) 2577 0 R (section*.102) 2579 0 R (section*.103) 2580 0 R (section*.104) 2581 0 R (section*.105) 2582 0 R (section*.106) 2583 0 R (section*.107) 2585 0 R (section*.108) 2590 0 R (section*.109) 2591 0 R (section*.11) 2254 0 R (section*.110) 2596 0 R (section*.111) 2602 0 R (section*.112) 2607 0 R (section*.113) 2608 0 R (section*.114) 2609 0 R (section*.115) 2611 0 R (section*.116) 2616 0 R (section*.117) 2617 0 R (section*.118) 2618 0 R (section*.119) 2619 0 R (section*.12) 2274 0 R (section*.120) 2624 0 R (section*.121) 2625 0 R (section*.122) 2627 0 R (section*.123) 2628 0 R (section*.124) 2629 0 R (section*.125) 2634 0 R (section*.126) 2639 0 R (section*.127) 2640 0 R (section*.128) 2641 0 R (section*.129) 2643 0 R (section*.13) 2286 0 R (section*.130) 2644 0 R (section*.131) 2645 0 R (section*.132) 2646 0 R (section*.133) 2652 0 R (section*.134) 2653 0 R (section*.135) 2654 0 R (section*.136) 2656 0 R (section*.137) 2661 0 R (section*.138) 2662 0 R (section*.139) 2663 0 R (section*.14) 2312 0 R (section*.140) 2664 0 R (section*.141) 2669 0 R (section*.142) 2671 0 R (section*.143) 2672 0 R (section*.144) 2673 0 R (section*.145) 2674 0 R (section*.146) 2675 0 R (section*.147) 2677 0 R (section*.148) 2678 0 R (section*.149) 2679 0 R (section*.15) 2362 0 R (section*.150) 2684 0 R (section*.151) 2685 0 R (section*.152) 2686 0 R (section*.153) 2688 0 R (section*.154) 2689 0 R (section*.155) 2690 0 R (section*.156) 2691 0 R (section*.157) 2696 0 R (section*.158) 2697 0 R (section*.159) 2699 0 R (section*.16) 2363 0 R (section*.160) 2700 0 R (section*.161) 2701 0 R (section*.162) 2702 0 R (section*.163) 2703 0 R (section*.164) 2704 0 R (section*.17) 2364 0 R (section*.18) 2369 0 R (section*.19) 2370 0 R (section*.2) 2110 0 R (section*.20) 2376 0 R (section*.21) 2385 0 R (section*.22) 2390 0 R (section*.23) 2391 0 R (section*.24) 2392 0 R (section*.25) 2393 0 R (section*.26) 2395 0 R (section*.27) 2396 0 R (section*.28) 2401 0 R (section*.29) 2406 0 R (section*.3) 2117 0 R (section*.30) 2407 0 R (section*.31) 2408 0 R (section*.32) 2410 0 R (section*.33) 2411 0 R (section*.34) 2412 0 R (section*.35) 2413 0 R (section*.36) 2419 0 R (section*.37) 2420 0 R (section*.38) 2421 0 R (section*.39) 2422 0 R (section*.4) 2125 0 R (section*.40) 2423 0 R (section*.41) 2429 0 R (section*.42) 2430 0 R (section*.43) 2431 0 R (section*.44) 2432 0 R (section*.45) 2437 0 R (section*.46) 2442 0 R (section*.47) 2443 0 R (section*.48) 2444 0 R (section*.49) 2445 0 R (section*.5) 2150 0 R (section*.50) 2446 0 R (section*.51) 2451 0 R (section*.52) 2452 0 R (section*.53) 2462 0 R (section*.54) 2463 0 R (section*.55) 2468 0 R (section*.56) 2469 0 R (section*.57) 2470 0 R (section*.58) 2472 0 R (section*.59) 2473 0 R (section*.6) 2162 0 R (section*.60) 2474 0 R (section*.61) 2479 0 R (section*.62) 2480 0 R (section*.63) 2481 0 R (section*.64) 2482 0 R (section*.65) 2483 0 R (section*.66) 2484 0 R (section*.67) 2489 0 R (section*.68) 2490 0 R (section*.69) 2495 0 R (section*.7) 2176 0 R (section*.70) 2496 0 R (section*.71) 2497 0 R (section*.72) 2499 0 R (section*.73) 2500 0 R (section*.74) 2501 0 R (section*.75) 2506 0 R (section*.76) 2520 0 R (section*.77) 2521 0 R (section*.78) 2522 0 R (section*.79) 2524 0 R (section*.8) 2214 0 R (section*.80) 2525 0 R (section*.81) 2526 0 R (section*.82) 2531 0 R (section*.83) 2532 0 R (section*.84) 2533 0 R (section*.85) 2534 0 R (section*.86) 2536 0 R (section*.87) 2537 0 R (section*.88) 2542 0 R (section*.89) 2543 0 R (section*.9) 2232 0 R (section*.90) 2548 0 R (section*.91) 2554 0 R (section*.92) 2555 0 R (section*.93) 2557 0 R (section*.94) 2558 0 R (section*.95) 2559 0 R (section*.96) 2560 0 R (section*.97) 2569 0 R (section*.98) 2570 0 R (section*.99) 2571 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.10) 274 0 R (section.4.11) 286 0 R (section.4.12) 330 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 346 0 R (section.5.2) 350 0 R (section.6.1) 358 0 R (section.6.2) 386 0 R (section.6.3) 610 0 R (section.6.4) 666 0 R (section.7.1) 702 0 R (section.7.2) 706 0 R (section.7.3) 718 0 R (section.8.1) 726 0 R (section.8.2) 734 0 R (section.8.3) 738 0 R (section.A.1) 746 0 R (section.A.2) 754 0 R (section.A.3) 762 0 R (section.A.4) 778 0 R (section.B.1) 838 0 R (section.B.10) 874 0 R (section.B.11) 878 0 R (section.B.12) 882 0 R (section.B.13) 886 0 R (section.B.14) 890 0 R (section.B.15) 894 0 R (section.B.16) 898 0 R (section.B.17) 902 0 R (section.B.18) 906 0 R (section.B.19) 910 0 R (section.B.2) 842 0 R (section.B.20) 914 0 R (section.B.21) 918 0 R (section.B.3) 846 0 R (section.B.4) 850 0 R (section.B.5) 854 0 R (section.B.6) 858 0 R (section.B.7) 862 0 R (section.B.8) 866 0 R (section.B.9) 870 0 R (server_resource_limits) 1752 0 R (server_statement_definition_and_usage) 1690 0 R (server_statement_grammar) 1814 0 R (statistics) 2010 0 R (statistics_counters) 2018 0 R (statschannels) 1826 0 R (statsfile) 1658 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.10.1) 278 0 R (subsection.4.10.2) 282 0 R (subsection.4.11.1) 290 0 R (subsection.4.11.2) 302 0 R (subsection.4.11.3) 314 0 R (subsection.4.11.4) 318 0 R (subsection.4.11.5) 322 0 R (subsection.4.11.6) 326 0 R (subsection.4.12.1) 334 0 R (subsection.4.12.2) 338 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.10) 258 0 R (subsection.4.9.11) 262 0 R (subsection.4.9.12) 266 0 R (subsection.4.9.13) 270 0 R (subsection.4.9.2) 226 0 R (subsection.4.9.3) 230 0 R (subsection.4.9.4) 234 0 R (subsection.4.9.5) 238 0 R (subsection.4.9.6) 242 0 R (subsection.4.9.7) 246 0 R (subsection.4.9.8) 250 0 R (subsection.4.9.9) 254 0 R (subsection.6.1.1) 362 0 R (subsection.6.1.2) 374 0 R (subsection.6.2.1) 390 0 R (subsection.6.2.10) 426 0 R (subsection.6.2.11) 442 0 R (subsection.6.2.12) 446 0 R (subsection.6.2.13) 450 0 R (subsection.6.2.14) 454 0 R (subsection.6.2.15) 458 0 R (subsection.6.2.16) 462 0 R (subsection.6.2.17) 546 0 R (subsection.6.2.18) 550 0 R (subsection.6.2.19) 554 0 R (subsection.6.2.2) 394 0 R (subsection.6.2.20) 558 0 R (subsection.6.2.21) 562 0 R (subsection.6.2.22) 566 0 R (subsection.6.2.23) 570 0 R (subsection.6.2.24) 574 0 R (subsection.6.2.25) 578 0 R (subsection.6.2.26) 582 0 R (subsection.6.2.27) 586 0 R (subsection.6.2.28) 590 0 R (subsection.6.2.3) 398 0 R (subsection.6.2.4) 402 0 R (subsection.6.2.5) 406 0 R (subsection.6.2.6) 410 0 R (subsection.6.2.7) 414 0 R (subsection.6.2.8) 418 0 R (subsection.6.2.9) 422 0 R (subsection.6.3.1) 614 0 R (subsection.6.3.2) 626 0 R (subsection.6.3.3) 630 0 R (subsection.6.3.4) 634 0 R (subsection.6.3.5) 638 0 R (subsection.6.3.6) 658 0 R (subsection.6.3.7) 662 0 R (subsection.6.4.1) 674 0 R (subsection.7.2.1) 710 0 R (subsection.7.2.2) 714 0 R (subsection.8.1.1) 730 0 R (subsection.A.1.1) 750 0 R (subsection.A.2.1) 758 0 R (subsection.A.3.1) 766 0 R (subsection.A.3.2) 770 0 R (subsection.A.3.3) 774 0 R (subsection.A.4.1) 782 0 R (subsection.A.4.2) 786 0 R (subsection.A.4.3) 790 0 R (subsection.A.4.4) 794 0 R (subsection.A.4.5) 798 0 R (subsection.A.4.6) 802 0 R (subsection.A.4.7) 830 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.11.1.1) 294 0 R (subsubsection.4.11.1.2) 298 0 R (subsubsection.4.11.2.1) 306 0 R (subsubsection.4.11.2.2) 310 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 366 0 R (subsubsection.6.1.1.2) 370 0 R (subsubsection.6.1.2.1) 378 0 R (subsubsection.6.1.2.2) 382 0 R (subsubsection.6.2.10.1) 430 0 R (subsubsection.6.2.10.2) 434 0 R (subsubsection.6.2.10.3) 438 0 R (subsubsection.6.2.16.1) 466 0 R (subsubsection.6.2.16.10) 502 0 R (subsubsection.6.2.16.11) 506 0 R (subsubsection.6.2.16.12) 510 0 R (subsubsection.6.2.16.13) 514 0 R (subsubsection.6.2.16.14) 518 0 R (subsubsection.6.2.16.15) 522 0 R (subsubsection.6.2.16.16) 526 0 R (subsubsection.6.2.16.17) 530 0 R (subsubsection.6.2.16.18) 534 0 R (subsubsection.6.2.16.19) 538 0 R (subsubsection.6.2.16.2) 470 0 R (subsubsection.6.2.16.20) 542 0 R (subsubsection.6.2.16.3) 474 0 R (subsubsection.6.2.16.4) 478 0 R (subsubsection.6.2.16.5) 482 0 R (subsubsection.6.2.16.6) 486 0 R (subsubsection.6.2.16.7) 490 0 R (subsubsection.6.2.16.8) 494 0 R (subsubsection.6.2.16.9) 498 0 R (subsubsection.6.2.28.1) 594 0 R (subsubsection.6.2.28.2) 598 0 R (subsubsection.6.2.28.3) 602 0 R (subsubsection.6.2.28.4) 606 0 R (subsubsection.6.3.1.1) 618 0 R (subsubsection.6.3.1.2) 622 0 R (subsubsection.6.3.5.1) 642 0 R (subsubsection.6.3.5.2) 646 0 R (subsubsection.6.3.5.3) 650 0 R (subsubsection.6.3.5.4) 654 0 R (subsubsection.6.4.0.1) 670 0 R (subsubsection.6.4.1.1) 678 0 R (subsubsection.6.4.1.2) 682 0 R (subsubsection.6.4.1.3) 686 0 R (subsubsection.6.4.1.4) 690 0 R (subsubsection.6.4.1.5) 694 0 R (subsubsection.A.4.6.1) 806 0 R (subsubsection.A.4.6.2) 810 0 R (subsubsection.A.4.6.3) 814 0 R (subsubsection.A.4.6.4) 818 0 R (subsubsection.A.4.6.5) 822 0 R (subsubsection.A.4.6.6) 826 0 R (table.1.1) 1225 0 R (table.1.2) 1233 0 R (table.3.1) 1292 0 R (table.3.2) 1336 0 R (table.6.1) 1539 0 R (table.6.10) 1950 0 R (table.6.11) 1956 0 R (table.6.12) 1962 0 R (table.6.13) 1969 0 R (table.6.14) 1971 0 R (table.6.15) 1979 0 R (table.6.16) 1982 0 R (table.6.17) 1985 0 R (table.6.18) 2001 0 R (table.6.19) 2012 0 R (table.6.2) 1561 0 R (table.6.20) 2021 0 R (table.6.21) 2030 0 R (table.6.22) 2033 0 R (table.6.23) 2041 0 R (table.6.3) 1570 0 R (table.6.4) 1608 0 R (table.6.5) 1620 0 R (table.6.6) 1674 0 R (table.6.7) 1773 0 R (table.6.8) 1861 0 R (table.6.9) 1940 0 R (the_category_phrase) 1602 0 R (the_sortlist_statement) 1764 0 R (topology) 1759 0 R (trusted-keys) 1828 0 R (tsig) 1388 0 R (tuning) 1774 0 R (types_of_resource_records_and_when_to_use_them) 1240 0 R (view_statement_grammar) 1789 0 R (zone_statement_grammar) 1713 0 R (zone_transfers) 1362 0 R (zonefile_format) 1788 0 R] +2729 0 obj << +/Names [(Access_Control_Lists) 2058 0 R (Bv9ARM.ch01) 1220 0 R (Bv9ARM.ch02) 1264 0 R (Bv9ARM.ch03) 1282 0 R (Bv9ARM.ch04) 1345 0 R (Bv9ARM.ch05) 1524 0 R (Bv9ARM.ch06) 1535 0 R (Bv9ARM.ch07) 2057 0 R (Bv9ARM.ch08) 2083 0 R (Bv9ARM.ch09) 2098 0 R (Bv9ARM.ch10) 2359 0 R (Configuration_File_Grammar) 1558 0 R (DNSSEC) 1411 0 R (Doc-Start) 927 0 R (Setting_TTLs) 1983 0 R (acache) 1271 0 R (access_control) 1709 0 R (acl) 1567 0 R (address_match_lists) 1540 0 R (admin_tools) 1304 0 R (appendix.A) 742 0 R (appendix.B) 834 0 R (bibliography) 2106 0 R (bind9.library) 2315 0 R (boolean_options) 1360 0 R (builtin) 1790 0 R (chapter*.1) 961 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 342 0 R (chapter.6) 354 0 R (chapter.7) 698 0 R (chapter.8) 722 0 R (cite.RFC1033) 2234 0 R (cite.RFC1034) 2119 0 R (cite.RFC1035) 2121 0 R (cite.RFC1101) 2216 0 R (cite.RFC1123) 2218 0 R (cite.RFC1183) 2178 0 R (cite.RFC1464) 2256 0 R (cite.RFC1535) 2164 0 R (cite.RFC1536) 2166 0 R (cite.RFC1537) 2236 0 R (cite.RFC1591) 2220 0 R (cite.RFC1706) 2180 0 R (cite.RFC1712) 2276 0 R (cite.RFC1713) 2258 0 R (cite.RFC1794) 2260 0 R (cite.RFC1876) 2182 0 R (cite.RFC1912) 2238 0 R (cite.RFC1982) 2168 0 R (cite.RFC1995) 2126 0 R (cite.RFC1996) 2128 0 R (cite.RFC2010) 2240 0 R (cite.RFC2052) 2184 0 R (cite.RFC2065) 2288 0 R (cite.RFC2136) 2130 0 R (cite.RFC2137) 2290 0 R (cite.RFC2163) 2186 0 R (cite.RFC2168) 2188 0 R (cite.RFC2181) 2132 0 R (cite.RFC2219) 2242 0 R (cite.RFC2230) 2190 0 R (cite.RFC2240) 2262 0 R (cite.RFC2308) 2134 0 R (cite.RFC2317) 2222 0 R (cite.RFC2345) 2264 0 R (cite.RFC2352) 2266 0 R (cite.RFC2535) 2292 0 R (cite.RFC2536) 2192 0 R (cite.RFC2537) 2194 0 R (cite.RFC2538) 2196 0 R (cite.RFC2539) 2198 0 R (cite.RFC2540) 2200 0 R (cite.RFC2671) 2136 0 R (cite.RFC2672) 2138 0 R (cite.RFC2673) 2278 0 R (cite.RFC2782) 2202 0 R (cite.RFC2825) 2246 0 R (cite.RFC2826) 2224 0 R (cite.RFC2845) 2140 0 R (cite.RFC2874) 2280 0 R (cite.RFC2915) 2204 0 R (cite.RFC2929) 2226 0 R (cite.RFC2930) 2142 0 R (cite.RFC2931) 2144 0 R (cite.RFC3007) 2146 0 R (cite.RFC3008) 2294 0 R (cite.RFC3071) 2268 0 R (cite.RFC3090) 2296 0 R (cite.RFC3110) 2206 0 R (cite.RFC3123) 2208 0 R (cite.RFC3225) 2152 0 R (cite.RFC3258) 2270 0 R (cite.RFC3445) 2298 0 R (cite.RFC3490) 2248 0 R (cite.RFC3491) 2250 0 R (cite.RFC3492) 2252 0 R (cite.RFC3596) 2210 0 R (cite.RFC3597) 2212 0 R (cite.RFC3645) 2148 0 R (cite.RFC3655) 2300 0 R (cite.RFC3658) 2302 0 R (cite.RFC3755) 2304 0 R (cite.RFC3757) 2306 0 R (cite.RFC3833) 2154 0 R (cite.RFC3845) 2308 0 R (cite.RFC3901) 2272 0 R (cite.RFC4033) 2156 0 R (cite.RFC4034) 2158 0 R (cite.RFC4035) 2160 0 R (cite.RFC4074) 2170 0 R (cite.RFC974) 2123 0 R (cite.id2511738) 2313 0 R (clients-per-query) 2037 0 R (configuration_file_elements) 1536 0 R (controls_statement_definition_and_usage) 1328 0 R (diagnostic_tools) 1252 0 R (dnssec.dynamic.zones) 1431 0 R (dynamic_update) 1355 0 R (dynamic_update_policies) 1317 0 R (dynamic_update_security) 1719 0 R (empty) 1792 0 R (historical_dns_information) 2100 0 R (id2466563) 1221 0 R (id2466586) 1222 0 R (id2467477) 1223 0 R (id2467486) 1224 0 R (id2467726) 1234 0 R (id2467748) 1235 0 R (id2467782) 1236 0 R (id2467866) 1239 0 R (id2467959) 1232 0 R (id2470264) 1246 0 R (id2470288) 1249 0 R (id2470386) 1250 0 R (id2470407) 1251 0 R (id2470505) 1257 0 R (id2470540) 1258 0 R (id2470567) 1259 0 R (id2470601) 1265 0 R (id2470628) 1266 0 R (id2470709) 1267 0 R (id2470734) 1270 0 R (id2470745) 1276 0 R (id2470777) 1284 0 R (id2470793) 1285 0 R (id2470816) 1290 0 R (id2470833) 1291 0 R (id2471238) 1299 0 R (id2471243) 1300 0 R (id2473320) 1333 0 R (id2473332) 1334 0 R (id2473827) 1370 0 R (id2473845) 1376 0 R (id2474278) 1392 0 R (id2474295) 1393 0 R (id2474333) 1394 0 R (id2474352) 1395 0 R (id2474362) 1396 0 R (id2474398) 1401 0 R (id2474456) 1402 0 R (id2474573) 1404 0 R (id2474587) 1405 0 R (id2474773) 1410 0 R (id2474909) 1412 0 R (id2475057) 1417 0 R (id2475138) 1418 0 R (id2475563) 1432 0 R (id2475601) 1433 0 R (id2475637) 1438 0 R (id2475719) 1444 0 R (id2475756) 1451 0 R (id2475769) 1452 0 R (id2475802) 1453 0 R (id2475897) 1454 0 R (id2475907) 1459 0 R (id2475916) 1460 0 R (id2475929) 1461 0 R (id2476103) 1462 0 R (id2476113) 1463 0 R (id2476149) 1465 0 R (id2476240) 1472 0 R (id2476341) 1478 0 R (id2476505) 1484 0 R (id2476574) 1485 0 R (id2476748) 1490 0 R (id2476757) 1491 0 R (id2476788) 1492 0 R (id2476843) 1493 0 R (id2476942) 1498 0 R (id2477209) 1504 0 R (id2477255) 1505 0 R (id2477378) 1510 0 R (id2477508) 1512 0 R (id2477529) 1513 0 R (id2477562) 1525 0 R (id2477846) 1537 0 R (id2478807) 1545 0 R (id2478835) 1550 0 R (id2479109) 1551 0 R (id2479124) 1552 0 R (id2479154) 1557 0 R (id2479228) 1559 0 R (id2479763) 1566 0 R (id2479805) 1568 0 R (id2479953) 1570 0 R (id2480380) 1577 0 R (id2480397) 1583 0 R (id2480421) 1584 0 R (id2480444) 1585 0 R (id2480603) 1589 0 R (id2480729) 1594 0 R (id2480781) 1595 0 R (id2481475) 1606 0 R (id2482277) 1617 0 R (id2482339) 1618 0 R (id2482728) 1624 0 R (id2482802) 1629 0 R (id2482866) 1632 0 R (id2482909) 1633 0 R (id2482924) 1634 0 R (id2486346) 1672 0 R (id2488461) 1702 0 R (id2488520) 1708 0 R (id2489140) 1724 0 R (id2490281) 1742 0 R (id2490409) 1744 0 R (id2490832) 1753 0 R (id2491334) 1771 0 R (id2493006) 1802 0 R (id2493197) 1812 0 R (id2494220) 1830 0 R (id2494428) 1832 0 R (id2494475) 1834 0 R (id2494901) 1843 0 R (id2496452) 1861 0 R (id2496459) 1862 0 R (id2496465) 1863 0 R (id2497004) 1870 0 R (id2497037) 1876 0 R (id2499124) 1938 0 R (id2499856) 1948 0 R (id2499942) 1949 0 R (id2499962) 1952 0 R (id2500131) 1958 0 R (id2501301) 1964 0 R (id2501497) 1971 0 R (id2501518) 1972 0 R (id2501813) 1974 0 R (id2501949) 1976 0 R (id2501968) 1981 0 R (id2502508) 1984 0 R (id2502770) 1986 0 R (id2502785) 1987 0 R (id2502897) 1993 0 R (id2502919) 1994 0 R (id2502935) 1995 0 R (id2502996) 1996 0 R (id2503065) 2001 0 R (id2503101) 2002 0 R (id2503177) 2003 0 R (id2503756) 2014 0 R (id2504192) 2023 0 R (id2504197) 2024 0 R (id2505596) 2031 0 R (id2505603) 2032 0 R (id2506048) 2034 0 R (id2506053) 2035 0 R (id2507069) 2042 0 R (id2507170) 2043 0 R (id2507648) 2052 0 R (id2507821) 2067 0 R (id2507902) 2068 0 R (id2507962) 2069 0 R (id2508042) 2084 0 R (id2508048) 2085 0 R (id2508059) 2086 0 R (id2508076) 2087 0 R (id2508343) 2099 0 R (id2508515) 2105 0 R (id2508702) 2110 0 R (id2508705) 2117 0 R (id2508713) 2122 0 R (id2508737) 2118 0 R (id2508760) 2120 0 R (id2508796) 2131 0 R (id2508823) 2133 0 R (id2508849) 2125 0 R (id2508873) 2127 0 R (id2508897) 2129 0 R (id2508952) 2135 0 R (id2508979) 2137 0 R (id2509005) 2139 0 R (id2509067) 2141 0 R (id2509097) 2143 0 R (id2509127) 2145 0 R (id2509154) 2147 0 R (id2509228) 2150 0 R (id2509236) 2151 0 R (id2509262) 2153 0 R (id2509299) 2155 0 R (id2509364) 2157 0 R (id2509429) 2159 0 R (id2509494) 2162 0 R (id2509502) 2163 0 R (id2509528) 2165 0 R (id2509596) 2167 0 R (id2509632) 2169 0 R (id2509672) 2176 0 R (id2509677) 2177 0 R (id2509735) 2179 0 R (id2509772) 2187 0 R (id2509808) 2181 0 R (id2509930) 2183 0 R (id2509969) 2185 0 R (id2509994) 2189 0 R (id2510020) 2191 0 R (id2510046) 2193 0 R (id2510073) 2195 0 R (id2510113) 2197 0 R (id2510142) 2199 0 R (id2510172) 2201 0 R (id2510215) 2203 0 R (id2510248) 2205 0 R (id2510275) 2207 0 R (id2510298) 2209 0 R (id2510356) 2211 0 R (id2510380) 2214 0 R (id2510388) 2215 0 R (id2510413) 2217 0 R (id2510436) 2219 0 R (id2510459) 2221 0 R (id2510505) 2223 0 R (id2510529) 2225 0 R (id2510579) 2232 0 R (id2510586) 2233 0 R (id2510610) 2235 0 R (id2510636) 2237 0 R (id2510663) 2239 0 R (id2510699) 2241 0 R (id2510740) 2244 0 R (id2510745) 2245 0 R (id2510777) 2247 0 R (id2510823) 2249 0 R (id2510858) 2251 0 R (id2510885) 2254 0 R (id2510903) 2255 0 R (id2510925) 2257 0 R (id2510951) 2259 0 R (id2510977) 2261 0 R (id2511000) 2263 0 R (id2511046) 2265 0 R (id2511069) 2267 0 R (id2511096) 2269 0 R (id2511122) 2271 0 R (id2511159) 2274 0 R (id2511165) 2275 0 R (id2511223) 2277 0 R (id2511250) 2279 0 R (id2511286) 2286 0 R (id2511298) 2287 0 R (id2511405) 2289 0 R (id2511432) 2291 0 R (id2511462) 2293 0 R (id2511488) 2295 0 R (id2511514) 2297 0 R (id2511550) 2299 0 R (id2511587) 2301 0 R (id2511613) 2303 0 R (id2511640) 2305 0 R (id2511685) 2307 0 R (id2511726) 2310 0 R (id2511736) 2312 0 R (id2511738) 2314 0 R (id2511962) 2320 0 R (id2511972) 2321 0 R (id2511996) 2322 0 R (id2512027) 2323 0 R (id2512104) 2328 0 R (id2512131) 2330 0 R (id2512139) 2331 0 R (id2512230) 2337 0 R (id2512352) 2338 0 R (id2512416) 2339 0 R (id2512430) 2344 0 R (id2512698) 2349 0 R (id2512762) 2350 0 R (incremental_zone_transfers) 1367 0 R (internet_drafts) 2309 0 R (ipv6addresses) 1514 0 R (journal) 1366 0 R (lwresd) 1526 0 R (man.arpaname) 2669 0 R (man.ddns-confgen) 2654 0 R (man.dig) 2360 0 R (man.dnssec-dsfromkey) 2408 0 R (man.dnssec-keyfromlabel) 2427 0 R (man.dnssec-keygen) 1445 0 R (man.dnssec-revoke) 2470 0 R (man.dnssec-settime) 1446 0 R (man.dnssec-signzone) 2497 0 R (man.genrandom) 2675 0 R (man.host) 2393 0 R (man.isc-hmac-fixup) 2686 0 R (man.named) 2555 0 R (man.named-checkconf) 2522 0 R (man.named-checkzone) 2534 0 R (man.named-journalprint) 2577 0 R (man.nsec3hash) 2697 0 R (man.nsupdate) 2583 0 R (man.rndc) 2609 0 R (man.rndc-confgen) 2641 0 R (man.rndc.conf) 2625 0 R (managed-keys) 1467 0 R (notify) 1346 0 R (options) 1316 0 R (page.1) 926 0 R (page.10) 1308 0 R (page.100) 1947 0 R (page.101) 1957 0 R (page.102) 1963 0 R (page.103) 1970 0 R (page.104) 1980 0 R (page.105) 1992 0 R (page.106) 2000 0 R (page.107) 2008 0 R (page.108) 2012 0 R (page.109) 2021 0 R (page.11) 1321 0 R (page.110) 2029 0 R (page.111) 2041 0 R (page.112) 2048 0 R (page.113) 2056 0 R (page.114) 2062 0 R (page.115) 2074 0 R (page.116) 2078 0 R (page.117) 2082 0 R (page.118) 2093 0 R (page.119) 2097 0 R (page.12) 1325 0 R (page.120) 2104 0 R (page.121) 2115 0 R (page.122) 2174 0 R (page.123) 2230 0 R (page.124) 2284 0 R (page.125) 2319 0 R (page.126) 2327 0 R (page.127) 2336 0 R (page.128) 2343 0 R (page.129) 2348 0 R (page.13) 1332 0 R (page.130) 2354 0 R (page.131) 2358 0 R (page.132) 2367 0 R (page.133) 2374 0 R (page.134) 2379 0 R (page.135) 2383 0 R (page.136) 2388 0 R (page.137) 2399 0 R (page.138) 2404 0 R (page.139) 2417 0 R (page.14) 1339 0 R (page.140) 2426 0 R (page.141) 2435 0 R (page.142) 2440 0 R (page.143) 2449 0 R (page.144) 2455 0 R (page.145) 2460 0 R (page.146) 2466 0 R (page.147) 2477 0 R (page.148) 2487 0 R (page.149) 2493 0 R (page.15) 1344 0 R (page.150) 2504 0 R (page.151) 2510 0 R (page.152) 2514 0 R (page.153) 2518 0 R (page.154) 2529 0 R (page.155) 2540 0 R (page.156) 2546 0 R (page.157) 2552 0 R (page.158) 2563 0 R (page.159) 2567 0 R (page.16) 1365 0 R (page.160) 2574 0 R (page.161) 2588 0 R (page.162) 2594 0 R (page.163) 2600 0 R (page.164) 2605 0 R (page.165) 2614 0 R (page.166) 2622 0 R (page.167) 2632 0 R (page.168) 2637 0 R (page.169) 2650 0 R (page.17) 1375 0 R (page.170) 2659 0 R (page.171) 2667 0 R (page.172) 2682 0 R (page.173) 2694 0 R (page.18) 1381 0 R (page.19) 1386 0 R (page.2) 950 0 R (page.20) 1391 0 R (page.21) 1400 0 R (page.22) 1409 0 R (page.23) 1416 0 R (page.24) 1422 0 R (page.25) 1427 0 R (page.26) 1437 0 R (page.27) 1450 0 R (page.28) 1458 0 R (page.29) 1471 0 R (page.3) 1245 0 R (page.30) 1477 0 R (page.31) 1483 0 R (page.32) 1489 0 R (page.33) 1497 0 R (page.34) 1503 0 R (page.35) 1509 0 R (page.36) 1518 0 R (page.37) 1523 0 R (page.38) 1530 0 R (page.39) 1534 0 R (page.4) 1256 0 R (page.40) 1544 0 R (page.41) 1549 0 R (page.42) 1556 0 R (page.43) 1565 0 R (page.44) 1574 0 R (page.45) 1582 0 R (page.46) 1593 0 R (page.47) 1599 0 R (page.48) 1605 0 R (page.49) 1612 0 R (page.5) 1263 0 R (page.50) 1616 0 R (page.51) 1623 0 R (page.52) 1628 0 R (page.53) 1638 0 R (page.54) 1642 0 R (page.55) 1647 0 R (page.56) 1651 0 R (page.57) 1655 0 R (page.58) 1661 0 R (page.59) 1666 0 R (page.6) 1275 0 R (page.60) 1671 0 R (page.61) 1678 0 R (page.62) 1683 0 R (page.63) 1693 0 R (page.64) 1697 0 R (page.65) 1701 0 R (page.66) 1706 0 R (page.67) 1716 0 R (page.68) 1723 0 R (page.69) 1729 0 R (page.7) 1281 0 R (page.70) 1733 0 R (page.71) 1737 0 R (page.72) 1741 0 R (page.73) 1750 0 R (page.74) 1757 0 R (page.75) 1762 0 R (page.76) 1769 0 R (page.77) 1776 0 R (page.78) 1782 0 R (page.79) 1789 0 R (page.8) 1289 0 R (page.80) 1797 0 R (page.81) 1801 0 R (page.82) 1806 0 R (page.83) 1811 0 R (page.84) 1816 0 R (page.85) 1822 0 R (page.86) 1829 0 R (page.87) 1838 0 R (page.88) 1842 0 R (page.89) 1847 0 R (page.9) 1298 0 R (page.90) 1851 0 R (page.91) 1856 0 R (page.92) 1860 0 R (page.93) 1868 0 R (page.94) 1875 0 R (page.95) 1895 0 R (page.96) 1909 0 R (page.97) 1921 0 R (page.98) 1937 0 R (page.99) 1943 0 R (page.i) 960 0 R (page.ii) 1015 0 R (page.iii) 1079 0 R (page.iv) 1142 0 R (page.v) 1204 0 R (pkcs11) 1473 0 R (proposed_standards) 1371 0 R (query_address) 1725 0 R (rfc5011.support) 1464 0 R (rfcs) 1241 0 R (rndc) 1578 0 R (root_delegation_only) 1871 0 R (rrset_ordering) 1294 0 R (sample_configuration) 1283 0 R (section*.10) 2243 0 R (section*.100) 2575 0 R (section*.101) 2576 0 R (section*.102) 2578 0 R (section*.103) 2579 0 R (section*.104) 2580 0 R (section*.105) 2581 0 R (section*.106) 2582 0 R (section*.107) 2584 0 R (section*.108) 2589 0 R (section*.109) 2590 0 R (section*.11) 2253 0 R (section*.110) 2595 0 R (section*.111) 2601 0 R (section*.112) 2606 0 R (section*.113) 2607 0 R (section*.114) 2608 0 R (section*.115) 2610 0 R (section*.116) 2615 0 R (section*.117) 2616 0 R (section*.118) 2617 0 R (section*.119) 2618 0 R (section*.12) 2273 0 R (section*.120) 2623 0 R (section*.121) 2624 0 R (section*.122) 2626 0 R (section*.123) 2627 0 R (section*.124) 2628 0 R (section*.125) 2633 0 R (section*.126) 2638 0 R (section*.127) 2639 0 R (section*.128) 2640 0 R (section*.129) 2642 0 R (section*.13) 2285 0 R (section*.130) 2643 0 R (section*.131) 2644 0 R (section*.132) 2645 0 R (section*.133) 2651 0 R (section*.134) 2652 0 R (section*.135) 2653 0 R (section*.136) 2655 0 R (section*.137) 2660 0 R (section*.138) 2661 0 R (section*.139) 2662 0 R (section*.14) 2311 0 R (section*.140) 2663 0 R (section*.141) 2668 0 R (section*.142) 2670 0 R (section*.143) 2671 0 R (section*.144) 2672 0 R (section*.145) 2673 0 R (section*.146) 2674 0 R (section*.147) 2676 0 R (section*.148) 2677 0 R (section*.149) 2678 0 R (section*.15) 2361 0 R (section*.150) 2683 0 R (section*.151) 2684 0 R (section*.152) 2685 0 R (section*.153) 2687 0 R (section*.154) 2688 0 R (section*.155) 2689 0 R (section*.156) 2690 0 R (section*.157) 2695 0 R (section*.158) 2696 0 R (section*.159) 2698 0 R (section*.16) 2362 0 R (section*.160) 2699 0 R (section*.161) 2700 0 R (section*.162) 2701 0 R (section*.163) 2702 0 R (section*.164) 2703 0 R (section*.17) 2363 0 R (section*.18) 2368 0 R (section*.19) 2369 0 R (section*.2) 2109 0 R (section*.20) 2375 0 R (section*.21) 2384 0 R (section*.22) 2389 0 R (section*.23) 2390 0 R (section*.24) 2391 0 R (section*.25) 2392 0 R (section*.26) 2394 0 R (section*.27) 2395 0 R (section*.28) 2400 0 R (section*.29) 2405 0 R (section*.3) 2116 0 R (section*.30) 2406 0 R (section*.31) 2407 0 R (section*.32) 2409 0 R (section*.33) 2410 0 R (section*.34) 2411 0 R (section*.35) 2412 0 R (section*.36) 2418 0 R (section*.37) 2419 0 R (section*.38) 2420 0 R (section*.39) 2421 0 R (section*.4) 2124 0 R (section*.40) 2422 0 R (section*.41) 2428 0 R (section*.42) 2429 0 R (section*.43) 2430 0 R (section*.44) 2431 0 R (section*.45) 2436 0 R (section*.46) 2441 0 R (section*.47) 2442 0 R (section*.48) 2443 0 R (section*.49) 2444 0 R (section*.5) 2149 0 R (section*.50) 2445 0 R (section*.51) 2450 0 R (section*.52) 2451 0 R (section*.53) 2461 0 R (section*.54) 2462 0 R (section*.55) 2467 0 R (section*.56) 2468 0 R (section*.57) 2469 0 R (section*.58) 2471 0 R (section*.59) 2472 0 R (section*.6) 2161 0 R (section*.60) 2473 0 R (section*.61) 2478 0 R (section*.62) 2479 0 R (section*.63) 2480 0 R (section*.64) 2481 0 R (section*.65) 2482 0 R (section*.66) 2483 0 R (section*.67) 2488 0 R (section*.68) 2489 0 R (section*.69) 2494 0 R (section*.7) 2175 0 R (section*.70) 2495 0 R (section*.71) 2496 0 R (section*.72) 2498 0 R (section*.73) 2499 0 R (section*.74) 2500 0 R (section*.75) 2505 0 R (section*.76) 2519 0 R (section*.77) 2520 0 R (section*.78) 2521 0 R (section*.79) 2523 0 R (section*.8) 2213 0 R (section*.80) 2524 0 R (section*.81) 2525 0 R (section*.82) 2530 0 R (section*.83) 2531 0 R (section*.84) 2532 0 R (section*.85) 2533 0 R (section*.86) 2535 0 R (section*.87) 2536 0 R (section*.88) 2541 0 R (section*.89) 2542 0 R (section*.9) 2231 0 R (section*.90) 2547 0 R (section*.91) 2553 0 R (section*.92) 2554 0 R (section*.93) 2556 0 R (section*.94) 2557 0 R (section*.95) 2558 0 R (section*.96) 2559 0 R (section*.97) 2568 0 R (section*.98) 2569 0 R (section*.99) 2570 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.10) 274 0 R (section.4.11) 286 0 R (section.4.12) 330 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 346 0 R (section.5.2) 350 0 R (section.6.1) 358 0 R (section.6.2) 386 0 R (section.6.3) 610 0 R (section.6.4) 666 0 R (section.7.1) 702 0 R (section.7.2) 706 0 R (section.7.3) 718 0 R (section.8.1) 726 0 R (section.8.2) 734 0 R (section.8.3) 738 0 R (section.A.1) 746 0 R (section.A.2) 754 0 R (section.A.3) 762 0 R (section.A.4) 778 0 R (section.B.1) 838 0 R (section.B.10) 874 0 R (section.B.11) 878 0 R (section.B.12) 882 0 R (section.B.13) 886 0 R (section.B.14) 890 0 R (section.B.15) 894 0 R (section.B.16) 898 0 R (section.B.17) 902 0 R (section.B.18) 906 0 R (section.B.19) 910 0 R (section.B.2) 842 0 R (section.B.20) 914 0 R (section.B.21) 918 0 R (section.B.3) 846 0 R (section.B.4) 850 0 R (section.B.5) 854 0 R (section.B.6) 858 0 R (section.B.7) 862 0 R (section.B.8) 866 0 R (section.B.9) 870 0 R (server_resource_limits) 1751 0 R (server_statement_definition_and_usage) 1689 0 R (server_statement_grammar) 1817 0 R (statistics) 2013 0 R (statistics_counters) 2022 0 R (statschannels) 1825 0 R (statsfile) 1657 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.10.1) 278 0 R (subsection.4.10.2) 282 0 R (subsection.4.11.1) 290 0 R (subsection.4.11.2) 302 0 R (subsection.4.11.3) 314 0 R (subsection.4.11.4) 318 0 R (subsection.4.11.5) 322 0 R (subsection.4.11.6) 326 0 R (subsection.4.12.1) 334 0 R (subsection.4.12.2) 338 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.10) 258 0 R (subsection.4.9.11) 262 0 R (subsection.4.9.12) 266 0 R (subsection.4.9.13) 270 0 R (subsection.4.9.2) 226 0 R (subsection.4.9.3) 230 0 R (subsection.4.9.4) 234 0 R (subsection.4.9.5) 238 0 R (subsection.4.9.6) 242 0 R (subsection.4.9.7) 246 0 R (subsection.4.9.8) 250 0 R (subsection.4.9.9) 254 0 R (subsection.6.1.1) 362 0 R (subsection.6.1.2) 374 0 R (subsection.6.2.1) 390 0 R (subsection.6.2.10) 426 0 R (subsection.6.2.11) 442 0 R (subsection.6.2.12) 446 0 R (subsection.6.2.13) 450 0 R (subsection.6.2.14) 454 0 R (subsection.6.2.15) 458 0 R (subsection.6.2.16) 462 0 R (subsection.6.2.17) 546 0 R (subsection.6.2.18) 550 0 R (subsection.6.2.19) 554 0 R (subsection.6.2.2) 394 0 R (subsection.6.2.20) 558 0 R (subsection.6.2.21) 562 0 R (subsection.6.2.22) 566 0 R (subsection.6.2.23) 570 0 R (subsection.6.2.24) 574 0 R (subsection.6.2.25) 578 0 R (subsection.6.2.26) 582 0 R (subsection.6.2.27) 586 0 R (subsection.6.2.28) 590 0 R (subsection.6.2.3) 398 0 R (subsection.6.2.4) 402 0 R (subsection.6.2.5) 406 0 R (subsection.6.2.6) 410 0 R (subsection.6.2.7) 414 0 R (subsection.6.2.8) 418 0 R (subsection.6.2.9) 422 0 R (subsection.6.3.1) 614 0 R (subsection.6.3.2) 626 0 R (subsection.6.3.3) 630 0 R (subsection.6.3.4) 634 0 R (subsection.6.3.5) 638 0 R (subsection.6.3.6) 658 0 R (subsection.6.3.7) 662 0 R (subsection.6.4.1) 674 0 R (subsection.7.2.1) 710 0 R (subsection.7.2.2) 714 0 R (subsection.8.1.1) 730 0 R (subsection.A.1.1) 750 0 R (subsection.A.2.1) 758 0 R (subsection.A.3.1) 766 0 R (subsection.A.3.2) 770 0 R (subsection.A.3.3) 774 0 R (subsection.A.4.1) 782 0 R (subsection.A.4.2) 786 0 R (subsection.A.4.3) 790 0 R (subsection.A.4.4) 794 0 R (subsection.A.4.5) 798 0 R (subsection.A.4.6) 802 0 R (subsection.A.4.7) 830 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.11.1.1) 294 0 R (subsubsection.4.11.1.2) 298 0 R (subsubsection.4.11.2.1) 306 0 R (subsubsection.4.11.2.2) 310 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 366 0 R (subsubsection.6.1.1.2) 370 0 R (subsubsection.6.1.2.1) 378 0 R (subsubsection.6.1.2.2) 382 0 R (subsubsection.6.2.10.1) 430 0 R (subsubsection.6.2.10.2) 434 0 R (subsubsection.6.2.10.3) 438 0 R (subsubsection.6.2.16.1) 466 0 R (subsubsection.6.2.16.10) 502 0 R (subsubsection.6.2.16.11) 506 0 R (subsubsection.6.2.16.12) 510 0 R (subsubsection.6.2.16.13) 514 0 R (subsubsection.6.2.16.14) 518 0 R (subsubsection.6.2.16.15) 522 0 R (subsubsection.6.2.16.16) 526 0 R (subsubsection.6.2.16.17) 530 0 R (subsubsection.6.2.16.18) 534 0 R (subsubsection.6.2.16.19) 538 0 R (subsubsection.6.2.16.2) 470 0 R (subsubsection.6.2.16.20) 542 0 R (subsubsection.6.2.16.3) 474 0 R (subsubsection.6.2.16.4) 478 0 R (subsubsection.6.2.16.5) 482 0 R (subsubsection.6.2.16.6) 486 0 R (subsubsection.6.2.16.7) 490 0 R (subsubsection.6.2.16.8) 494 0 R (subsubsection.6.2.16.9) 498 0 R (subsubsection.6.2.28.1) 594 0 R (subsubsection.6.2.28.2) 598 0 R (subsubsection.6.2.28.3) 602 0 R (subsubsection.6.2.28.4) 606 0 R (subsubsection.6.3.1.1) 618 0 R (subsubsection.6.3.1.2) 622 0 R (subsubsection.6.3.5.1) 642 0 R (subsubsection.6.3.5.2) 646 0 R (subsubsection.6.3.5.3) 650 0 R (subsubsection.6.3.5.4) 654 0 R (subsubsection.6.4.0.1) 670 0 R (subsubsection.6.4.1.1) 678 0 R (subsubsection.6.4.1.2) 682 0 R (subsubsection.6.4.1.3) 686 0 R (subsubsection.6.4.1.4) 690 0 R (subsubsection.6.4.1.5) 694 0 R (subsubsection.A.4.6.1) 806 0 R (subsubsection.A.4.6.2) 810 0 R (subsubsection.A.4.6.3) 814 0 R (subsubsection.A.4.6.4) 818 0 R (subsubsection.A.4.6.5) 822 0 R (subsubsection.A.4.6.6) 826 0 R (table.1.1) 1225 0 R (table.1.2) 1233 0 R (table.3.1) 1292 0 R (table.3.2) 1335 0 R (table.6.1) 1538 0 R (table.6.10) 1953 0 R (table.6.11) 1959 0 R (table.6.12) 1965 0 R (table.6.13) 1973 0 R (table.6.14) 1975 0 R (table.6.15) 1982 0 R (table.6.16) 1985 0 R (table.6.17) 1988 0 R (table.6.18) 2004 0 R (table.6.19) 2015 0 R (table.6.2) 1560 0 R (table.6.20) 2025 0 R (table.6.21) 2033 0 R (table.6.22) 2036 0 R (table.6.23) 2044 0 R (table.6.3) 1569 0 R (table.6.4) 1607 0 R (table.6.5) 1619 0 R (table.6.6) 1673 0 R (table.6.7) 1772 0 R (table.6.8) 1864 0 R (table.6.9) 1939 0 R (the_category_phrase) 1601 0 R (the_sortlist_statement) 1763 0 R (topology) 1758 0 R (trusted-keys) 1831 0 R (tsig) 1387 0 R (tuning) 1777 0 R (types_of_resource_records_and_when_to_use_them) 1240 0 R (view_statement_grammar) 1793 0 R (zone_statement_grammar) 1712 0 R (zone_transfers) 1361 0 R (zonefile_format) 1785 0 R] /Limits [(Access_Control_Lists) (zonefile_format)] >> endobj +2730 0 obj << +/Kids [2729 0 R] +>> endobj 2731 0 obj << -/Kids [2730 0 R] +/Dests 2730 0 R >> endobj 2732 0 obj << -/Dests 2731 0 R ->> endobj -2733 0 obj << /Type /Catalog -/Pages 2728 0 R -/Outlines 2729 0 R -/Names 2732 0 R +/Pages 2727 0 R +/Outlines 2728 0 R +/Names 2731 0 R /PageMode /UseOutlines /OpenAction 921 0 R >> endobj -2734 0 obj << +2733 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() -/CreationDate (D:20110609034043Z) +/CreationDate (D:20110809015250Z) /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref -0 2735 +0 2734 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000009 00000 n -0000347882 00000 n -0001171649 00000 n +0000347886 00000 n +0001174432 00000 n 0000000054 00000 n 0000000086 00000 n -0000348009 00000 n -0001171577 00000 n +0000348013 00000 n +0001174360 00000 n 0000000133 00000 n 0000000173 00000 n -0000348137 00000 n -0001171491 00000 n +0000348141 00000 n +0001174274 00000 n 0000000221 00000 n 0000000273 00000 n -0000348265 00000 n -0001171405 00000 n +0000348269 00000 n +0001174188 00000 n 0000000321 00000 n 0000000377 00000 n -0000352551 00000 n -0001171295 00000 n +0000352555 00000 n +0001174078 00000 n 0000000425 00000 n 0000000478 00000 n -0000352678 00000 n -0001171221 00000 n +0000352682 00000 n +0001174004 00000 n 0000000531 00000 n 0000000572 00000 n -0000352806 00000 n -0001171134 00000 n +0000352810 00000 n +0001173917 00000 n 0000000625 00000 n 0000000674 00000 n -0000352933 00000 n -0001171047 00000 n +0000352937 00000 n +0001173830 00000 n 0000000727 00000 n 0000000757 00000 n -0000357230 00000 n -0001170923 00000 n +0000357234 00000 n +0001173706 00000 n 0000000810 00000 n 0000000861 00000 n -0000357358 00000 n -0001170849 00000 n +0000357362 00000 n +0001173632 00000 n 0000000919 00000 n 0000000964 00000 n -0000357486 00000 n -0001170762 00000 n +0000357490 00000 n +0001173545 00000 n 0000001022 00000 n 0000001062 00000 n -0000357614 00000 n -0001170688 00000 n +0000357618 00000 n +0001173471 00000 n 0000001120 00000 n 0000001162 00000 n -0000360599 00000 n -0001170564 00000 n +0000360603 00000 n +0001173347 00000 n 0000001215 00000 n 0000001260 00000 n -0000360727 00000 n -0001170503 00000 n +0000360731 00000 n +0001173286 00000 n 0000001318 00000 n 0000001355 00000 n -0000360855 00000 n -0001170429 00000 n +0000360859 00000 n +0001173212 00000 n 0000001408 00000 n 0000001463 00000 n -0000363802 00000 n -0001170304 00000 n +0000363806 00000 n +0001173087 00000 n 0000001509 00000 n 0000001556 00000 n -0000363930 00000 n -0001170230 00000 n +0000363934 00000 n +0001173013 00000 n 0000001604 00000 n 0000001648 00000 n -0000364058 00000 n -0001170143 00000 n +0000364062 00000 n +0001172926 00000 n 0000001696 00000 n 0000001735 00000 n -0000364186 00000 n -0001170056 00000 n +0000364190 00000 n +0001172839 00000 n 0000001783 00000 n 0000001825 00000 n -0000364313 00000 n -0001169969 00000 n +0000364317 00000 n +0001172752 00000 n 0000001873 00000 n 0000001936 00000 n -0000365390 00000 n -0001169895 00000 n +0000365394 00000 n +0001172678 00000 n 0000001984 00000 n 0000002034 00000 n -0000367049 00000 n -0001169767 00000 n +0000367053 00000 n +0001172550 00000 n 0000002080 00000 n 0000002126 00000 n -0000367176 00000 n -0001169654 00000 n +0000367180 00000 n +0001172437 00000 n 0000002174 00000 n 0000002218 00000 n -0000367304 00000 n -0001169578 00000 n +0000367308 00000 n +0001172361 00000 n 0000002271 00000 n 0000002323 00000 n -0000367432 00000 n -0001169501 00000 n +0000367436 00000 n +0001172284 00000 n 0000002377 00000 n 0000002436 00000 n -0000369881 00000 n -0001169410 00000 n +0000369885 00000 n +0001172193 00000 n 0000002485 00000 n 0000002523 00000 n -0000373219 00000 n -0001169293 00000 n +0000373223 00000 n +0001172076 00000 n 0000002572 00000 n 0000002618 00000 n -0000373347 00000 n -0001169175 00000 n +0000373351 00000 n +0001171958 00000 n 0000002672 00000 n 0000002739 00000 n -0000373475 00000 n -0001169096 00000 n +0000373479 00000 n +0001171879 00000 n 0000002798 00000 n 0000002842 00000 n -0000373604 00000 n -0001169017 00000 n +0000373608 00000 n +0001171800 00000 n 0000002901 00000 n 0000002949 00000 n -0000388343 00000 n -0001168938 00000 n +0000388099 00000 n +0001171721 00000 n 0000003003 00000 n 0000003036 00000 n -0000393969 00000 n -0001168805 00000 n +0000393725 00000 n +0001171588 00000 n 0000003083 00000 n 0000003126 00000 n -0000394098 00000 n -0001168726 00000 n +0000393854 00000 n +0001171509 00000 n 0000003175 00000 n 0000003205 00000 n -0000394227 00000 n -0001168594 00000 n +0000393983 00000 n +0001171377 00000 n 0000003254 00000 n 0000003292 00000 n -0000398736 00000 n -0001168529 00000 n +0000398492 00000 n +0001171312 00000 n 0000003346 00000 n 0000003388 00000 n -0000398865 00000 n -0001168436 00000 n +0000398621 00000 n +0001171219 00000 n 0000003437 00000 n 0000003496 00000 n -0000398994 00000 n -0001168304 00000 n +0000398750 00000 n +0001171087 00000 n 0000003545 00000 n 0000003578 00000 n -0000402912 00000 n -0001168239 00000 n +0000402668 00000 n +0001171022 00000 n 0000003632 00000 n 0000003681 00000 n -0000405926 00000 n -0001168107 00000 n +0000405682 00000 n +0001170890 00000 n 0000003730 00000 n 0000003758 00000 n -0000408706 00000 n -0001167989 00000 n +0000408462 00000 n +0001170772 00000 n 0000003812 00000 n 0000003881 00000 n -0000408835 00000 n -0001167910 00000 n +0000408591 00000 n +0001170693 00000 n 0000003940 00000 n 0000003988 00000 n -0000408963 00000 n -0001167831 00000 n +0000408719 00000 n +0001170614 00000 n 0000004047 00000 n 0000004092 00000 n -0000409092 00000 n -0001167738 00000 n +0000408848 00000 n +0001170521 00000 n 0000004146 00000 n 0000004214 00000 n -0000409221 00000 n -0001167645 00000 n +0000408977 00000 n +0001170428 00000 n 0000004268 00000 n 0000004338 00000 n -0000412890 00000 n -0001167552 00000 n +0000412646 00000 n +0001170335 00000 n 0000004392 00000 n 0000004455 00000 n -0000413019 00000 n -0001167459 00000 n +0000412775 00000 n +0001170242 00000 n 0000004509 00000 n 0000004564 00000 n -0000413147 00000 n -0001167380 00000 n +0000412903 00000 n +0001170163 00000 n 0000004618 00000 n 0000004650 00000 n -0000413275 00000 n -0001167287 00000 n +0000413031 00000 n +0001170070 00000 n 0000004699 00000 n 0000004727 00000 n -0000417044 00000 n -0001167194 00000 n +0000416800 00000 n +0001169977 00000 n 0000004776 00000 n 0000004808 00000 n -0000417173 00000 n -0001167062 00000 n +0000416929 00000 n +0001169845 00000 n 0000004857 00000 n 0000004887 00000 n -0000417302 00000 n -0001166983 00000 n +0000417058 00000 n +0001169766 00000 n 0000004941 00000 n 0000004982 00000 n -0000421100 00000 n -0001166890 00000 n +0000420856 00000 n +0001169673 00000 n 0000005036 00000 n 0000005078 00000 n -0000421229 00000 n -0001166811 00000 n +0000420985 00000 n +0001169594 00000 n 0000005132 00000 n 0000005177 00000 n -0000426552 00000 n -0001166678 00000 n +0000426308 00000 n +0001169461 00000 n 0000005226 00000 n 0000005294 00000 n -0000426681 00000 n -0001166599 00000 n +0000426437 00000 n +0001169382 00000 n 0000005348 00000 n 0000005408 00000 n -0000426810 00000 n -0001166506 00000 n +0000426566 00000 n +0001169289 00000 n 0000005462 00000 n 0000005513 00000 n -0000430749 00000 n -0001166413 00000 n +0000430505 00000 n +0001169196 00000 n 0000005567 00000 n 0000005621 00000 n -0000430877 00000 n -0001166320 00000 n +0000430633 00000 n +0001169103 00000 n 0000005675 00000 n 0000005721 00000 n -0000434027 00000 n -0001166227 00000 n +0000433783 00000 n +0001169010 00000 n 0000005775 00000 n 0000005817 00000 n -0000434156 00000 n -0001166134 00000 n +0000433912 00000 n +0001168917 00000 n 0000005871 00000 n 0000005922 00000 n -0000434285 00000 n -0001166041 00000 n +0000434041 00000 n +0001168824 00000 n 0000005976 00000 n 0000006025 00000 n -0000434414 00000 n -0001165948 00000 n +0000434170 00000 n +0001168731 00000 n 0000006079 00000 n 0000006136 00000 n -0000437328 00000 n -0001165855 00000 n +0000437084 00000 n +0001168638 00000 n 0000006190 00000 n 0000006245 00000 n -0000437457 00000 n -0001165762 00000 n +0000437213 00000 n +0001168545 00000 n 0000006300 00000 n 0000006356 00000 n -0000437586 00000 n -0001165669 00000 n +0000437342 00000 n +0001168452 00000 n 0000006411 00000 n 0000006472 00000 n -0000437715 00000 n -0001165576 00000 n +0000437471 00000 n +0001168359 00000 n 0000006527 00000 n 0000006573 00000 n -0000437844 00000 n -0001165497 00000 n +0000437600 00000 n +0001168280 00000 n 0000006628 00000 n 0000006671 00000 n -0000437973 00000 n -0001165365 00000 n +0000437729 00000 n +0001168148 00000 n 0000006721 00000 n 0000006777 00000 n -0000438102 00000 n -0001165286 00000 n +0000437858 00000 n +0001168069 00000 n 0000006832 00000 n 0000006878 00000 n -0000441694 00000 n -0001165207 00000 n +0000441450 00000 n +0001167990 00000 n 0000006933 00000 n 0000006980 00000 n -0000441823 00000 n -0001165075 00000 n +0000441579 00000 n +0001167858 00000 n 0000007030 00000 n 0000007087 00000 n -0000444830 00000 n -0001164957 00000 n +0000444586 00000 n +0001167740 00000 n 0000007142 00000 n 0000007182 00000 n -0000447718 00000 n -0001164878 00000 n +0000447474 00000 n +0001167661 00000 n 0000007242 00000 n 0000007315 00000 n -0000447847 00000 n -0001164799 00000 n +0000447603 00000 n +0001167582 00000 n 0000007375 00000 n 0000007448 00000 n -0000450309 00000 n -0001164667 00000 n +0000450065 00000 n +0001167450 00000 n 0000007503 00000 n 0000007561 00000 n -0000450438 00000 n -0001164588 00000 n +0000450194 00000 n +0001167371 00000 n 0000007621 00000 n 0000007678 00000 n -0000450567 00000 n -0001164509 00000 n +0000450323 00000 n +0001167292 00000 n 0000007738 00000 n 0000007797 00000 n -0000450696 00000 n -0001164416 00000 n +0000450452 00000 n +0001167199 00000 n 0000007852 00000 n 0000007896 00000 n -0000453505 00000 n -0001164323 00000 n +0000453261 00000 n +0001167106 00000 n 0000007951 00000 n 0000007991 00000 n -0000456304 00000 n -0001164230 00000 n +0000456060 00000 n +0001167013 00000 n 0000008046 00000 n 0000008114 00000 n -0000456433 00000 n -0001164151 00000 n +0000456189 00000 n +0001166934 00000 n 0000008169 00000 n 0000008240 00000 n -0000460499 00000 n -0001164033 00000 n +0000460255 00000 n +0001166816 00000 n 0000008290 00000 n 0000008337 00000 n -0000460628 00000 n -0001163954 00000 n +0000460384 00000 n +0001166737 00000 n 0000008392 00000 n 0000008453 00000 n -0000460757 00000 n -0001163875 00000 n +0000460513 00000 n +0001166658 00000 n 0000008508 00000 n 0000008578 00000 n -0000463625 00000 n -0001163742 00000 n +0000463381 00000 n +0001166525 00000 n 0000008625 00000 n 0000008678 00000 n -0000463754 00000 n -0001163663 00000 n +0000463510 00000 n +0001166446 00000 n 0000008727 00000 n 0000008783 00000 n -0000463883 00000 n -0001163584 00000 n +0000463639 00000 n +0001166367 00000 n 0000008832 00000 n 0000008881 00000 n -0000468153 00000 n -0001163451 00000 n +0000467909 00000 n +0001166234 00000 n 0000008928 00000 n 0000008980 00000 n -0000468282 00000 n -0001163333 00000 n +0000468038 00000 n +0001166116 00000 n 0000009029 00000 n 0000009080 00000 n -0000472974 00000 n -0001163215 00000 n +0000472730 00000 n +0001165998 00000 n 0000009134 00000 n 0000009179 00000 n -0000473102 00000 n -0001163136 00000 n +0000472858 00000 n +0001165919 00000 n 0000009238 00000 n 0000009272 00000 n -0000476695 00000 n -0001163057 00000 n +0000476451 00000 n +0001165840 00000 n 0000009331 00000 n 0000009379 00000 n -0000476824 00000 n -0001162939 00000 n +0000476580 00000 n +0001165722 00000 n 0000009433 00000 n 0000009473 00000 n -0000476953 00000 n -0001162860 00000 n +0000476709 00000 n +0001165643 00000 n 0000009532 00000 n 0000009566 00000 n -0000479805 00000 n -0001162781 00000 n +0000479561 00000 n +0001165564 00000 n 0000009625 00000 n 0000009673 00000 n -0000479934 00000 n -0001162648 00000 n +0000479690 00000 n +0001165431 00000 n 0000009722 00000 n 0000009772 00000 n -0000483004 00000 n -0001162569 00000 n +0000482760 00000 n +0001165352 00000 n 0000009826 00000 n 0000009873 00000 n -0000483132 00000 n -0001162476 00000 n +0000482888 00000 n +0001165259 00000 n 0000009927 00000 n 0000009987 00000 n -0000483391 00000 n -0001162383 00000 n +0000483147 00000 n +0001165166 00000 n 0000010041 00000 n 0000010093 00000 n -0000488573 00000 n -0001162290 00000 n +0000488329 00000 n +0001165073 00000 n 0000010147 00000 n 0000010212 00000 n -0000488702 00000 n -0001162197 00000 n +0000488458 00000 n +0001164980 00000 n 0000010266 00000 n 0000010317 00000 n -0000492179 00000 n -0001162104 00000 n +0000491935 00000 n +0001164887 00000 n 0000010371 00000 n 0000010435 00000 n -0000492308 00000 n -0001162011 00000 n +0000492064 00000 n +0001164794 00000 n 0000010489 00000 n 0000010536 00000 n -0000492437 00000 n -0001161918 00000 n +0000492193 00000 n +0001164701 00000 n 0000010590 00000 n 0000010650 00000 n -0000492566 00000 n -0001161825 00000 n +0000492322 00000 n +0001164608 00000 n 0000010704 00000 n 0000010755 00000 n -0000496584 00000 n -0001161693 00000 n +0000496340 00000 n +0001164476 00000 n 0000010810 00000 n 0000010875 00000 n -0000496713 00000 n -0001161614 00000 n +0000496469 00000 n +0001164397 00000 n 0000010935 00000 n 0000010982 00000 n -0000503534 00000 n -0001161521 00000 n +0000503290 00000 n +0001164304 00000 n 0000011042 00000 n 0000011090 00000 n -0000509939 00000 n -0001161442 00000 n +0000509695 00000 n +0001164225 00000 n 0000011150 00000 n 0000011204 00000 n -0000513027 00000 n -0001161349 00000 n +0000512783 00000 n +0001164132 00000 n 0000011259 00000 n 0000011309 00000 n -0000515884 00000 n -0001161256 00000 n +0000515640 00000 n +0001164039 00000 n 0000011364 00000 n 0000011427 00000 n -0000516013 00000 n -0001161163 00000 n +0000515769 00000 n +0001163946 00000 n 0000011482 00000 n 0000011534 00000 n -0000516141 00000 n -0001161070 00000 n +0000515897 00000 n +0001163853 00000 n 0000011589 00000 n 0000011654 00000 n -0000516269 00000 n -0001160977 00000 n +0000516025 00000 n +0001163760 00000 n 0000011709 00000 n 0000011761 00000 n -0000521189 00000 n -0001160844 00000 n +0000520945 00000 n +0001163627 00000 n 0000011816 00000 n 0000011881 00000 n -0000541024 00000 n -0001160765 00000 n +0000540989 00000 n +0001163548 00000 n 0000011941 00000 n 0000011985 00000 n -0000562621 00000 n -0001160672 00000 n +0000562537 00000 n +0001163455 00000 n 0000012045 00000 n 0000012084 00000 n -0000566256 00000 n -0001160579 00000 n +0000566543 00000 n +0001163362 00000 n 0000012144 00000 n 0000012191 00000 n -0000566385 00000 n -0001160486 00000 n +0000566672 00000 n +0001163269 00000 n 0000012251 00000 n 0000012294 00000 n -0000570803 00000 n -0001160393 00000 n +0000574303 00000 n +0001163176 00000 n 0000012354 00000 n 0000012393 00000 n -0000574151 00000 n -0001160300 00000 n +0000574431 00000 n +0001163083 00000 n 0000012453 00000 n 0000012495 00000 n -0000580978 00000 n -0001160207 00000 n +0000581399 00000 n +0001162990 00000 n 0000012555 00000 n 0000012598 00000 n -0000588866 00000 n -0001160114 00000 n +0000589416 00000 n +0001162897 00000 n 0000012658 00000 n 0000012701 00000 n -0000588995 00000 n -0001160021 00000 n +0000589545 00000 n +0001162804 00000 n 0000012761 00000 n 0000012822 00000 n -0000593028 00000 n -0001159928 00000 n +0000593500 00000 n +0001162711 00000 n 0000012883 00000 n 0000012935 00000 n -0000593157 00000 n -0001159835 00000 n +0000593629 00000 n +0001162618 00000 n 0000012996 00000 n 0000013049 00000 n -0000596321 00000 n -0001159742 00000 n +0000596848 00000 n +0001162525 00000 n 0000013110 00000 n 0000013148 00000 n -0000600259 00000 n -0001159649 00000 n +0000600700 00000 n +0001162432 00000 n 0000013209 00000 n 0000013261 00000 n -0000603551 00000 n -0001159556 00000 n +0000604118 00000 n +0001162339 00000 n 0000013322 00000 n 0000013366 00000 n -0000603809 00000 n -0001159463 00000 n +0000608129 00000 n +0001162246 00000 n 0000013427 00000 n 0000013463 00000 n -0000612635 00000 n -0001159370 00000 n +0000616494 00000 n +0001162153 00000 n 0000013524 00000 n 0000013587 00000 n -0000615981 00000 n -0001159277 00000 n +0000616623 00000 n +0001162060 00000 n 0000013648 00000 n 0000013698 00000 n -0000619742 00000 n -0001159184 00000 n +0000623165 00000 n +0001161967 00000 n 0000013759 00000 n 0000013815 00000 n -0000624070 00000 n -0001159091 00000 n +0000623292 00000 n +0001161874 00000 n 0000013876 00000 n 0000013923 00000 n -0000628370 00000 n -0001159012 00000 n +0000631347 00000 n +0001161795 00000 n 0000013984 00000 n 0000014052 00000 n -0000630938 00000 n -0001158919 00000 n +0000633939 00000 n +0001161702 00000 n 0000014107 00000 n 0000014158 00000 n -0000635461 00000 n -0001158826 00000 n +0000634068 00000 n +0001161609 00000 n 0000014213 00000 n 0000014277 00000 n -0000639146 00000 n -0001158733 00000 n +0000638823 00000 n +0001161516 00000 n 0000014332 00000 n 0000014396 00000 n -0000639275 00000 n -0001158640 00000 n +0000642708 00000 n +0001161423 00000 n 0000014451 00000 n 0000014528 00000 n -0000639403 00000 n -0001158547 00000 n +0000642835 00000 n +0001161330 00000 n 0000014583 00000 n 0000014640 00000 n -0000643560 00000 n -0001158454 00000 n +0000642963 00000 n +0001161237 00000 n 0000014695 00000 n 0000014765 00000 n -0000643688 00000 n -0001158361 00000 n +0000643092 00000 n +0001161144 00000 n 0000014820 00000 n 0000014877 00000 n -0000643817 00000 n -0001158268 00000 n +0000647371 00000 n +0001161051 00000 n 0000014932 00000 n 0000015002 00000 n -0000648072 00000 n -0001158175 00000 n +0000650833 00000 n +0001160958 00000 n 0000015057 00000 n 0000015106 00000 n -0000648201 00000 n -0001158082 00000 n +0000650962 00000 n +0001160865 00000 n 0000015161 00000 n 0000015223 00000 n -0000650348 00000 n -0001157989 00000 n +0000652717 00000 n +0001160772 00000 n 0000015278 00000 n 0000015327 00000 n -0000655852 00000 n -0001157871 00000 n +0000659176 00000 n +0001160654 00000 n 0000015382 00000 n 0000015444 00000 n -0000655980 00000 n -0001157792 00000 n +0000659305 00000 n +0001160575 00000 n 0000015504 00000 n 0000015543 00000 n -0000664901 00000 n -0001157699 00000 n +0000663539 00000 n +0001160482 00000 n 0000015603 00000 n 0000015637 00000 n -0000665030 00000 n -0001157606 00000 n +0000669445 00000 n +0001160389 00000 n 0000015697 00000 n 0000015738 00000 n -0000685657 00000 n -0001157527 00000 n +0000685091 00000 n +0001160310 00000 n 0000015798 00000 n 0000015850 00000 n -0000692639 00000 n -0001157395 00000 n +0000695757 00000 n +0001160178 00000 n 0000015899 00000 n 0000015932 00000 n -0000692768 00000 n -0001157277 00000 n +0000695886 00000 n +0001160060 00000 n 0000015986 00000 n 0000016058 00000 n -0000692897 00000 n -0001157198 00000 n +0000696015 00000 n +0001159981 00000 n 0000016117 00000 n 0000016161 00000 n -0000703499 00000 n -0001157119 00000 n +0000706617 00000 n +0001159902 00000 n 0000016220 00000 n 0000016273 00000 n -0000703888 00000 n -0001157026 00000 n +0000707006 00000 n +0001159809 00000 n 0000016327 00000 n 0000016377 00000 n -0000707742 00000 n -0001156933 00000 n +0000710848 00000 n +0001159716 00000 n 0000016431 00000 n 0000016469 00000 n -0000708001 00000 n -0001156840 00000 n +0000711107 00000 n +0001159623 00000 n 0000016523 00000 n 0000016572 00000 n -0000710774 00000 n -0001156708 00000 n +0000713881 00000 n +0001159491 00000 n 0000016626 00000 n 0000016678 00000 n -0000710899 00000 n -0001156629 00000 n +0000714006 00000 n +0001159412 00000 n 0000016737 00000 n 0000016782 00000 n -0000711028 00000 n -0001156536 00000 n +0000714135 00000 n +0001159319 00000 n 0000016841 00000 n 0000016893 00000 n -0000711157 00000 n -0001156443 00000 n +0000714264 00000 n +0001159226 00000 n 0000016952 00000 n 0000017005 00000 n -0000713609 00000 n -0001156364 00000 n +0000716707 00000 n +0001159147 00000 n 0000017064 00000 n 0000017113 00000 n -0000713738 00000 n -0001156271 00000 n +0000716836 00000 n +0001159054 00000 n 0000017167 00000 n 0000017247 00000 n -0000718053 00000 n -0001156192 00000 n +0000721158 00000 n +0001158975 00000 n 0000017301 00000 n 0000017350 00000 n -0000721558 00000 n -0001156074 00000 n +0000724664 00000 n +0001158857 00000 n 0000017399 00000 n 0000017439 00000 n -0000721817 00000 n -0001155995 00000 n +0000724923 00000 n +0001158778 00000 n 0000017498 00000 n 0000017545 00000 n -0000725249 00000 n -0001155877 00000 n +0000728352 00000 n +0001158660 00000 n 0000017599 00000 n 0000017644 00000 n -0000725378 00000 n -0001155798 00000 n +0000728481 00000 n +0001158581 00000 n 0000017703 00000 n 0000017762 00000 n -0000728733 00000 n -0001155705 00000 n +0000731828 00000 n +0001158488 00000 n 0000017821 00000 n 0000017885 00000 n -0000728992 00000 n -0001155612 00000 n +0000732087 00000 n +0001158395 00000 n 0000017944 00000 n 0000018000 00000 n -0000733149 00000 n -0001155519 00000 n +0000736248 00000 n +0001158302 00000 n 0000018059 00000 n 0000018117 00000 n -0000735170 00000 n -0001155440 00000 n +0000738258 00000 n +0001158223 00000 n 0000018176 00000 n 0000018238 00000 n -0000737334 00000 n -0001155307 00000 n +0000740039 00000 n +0001158090 00000 n 0000018285 00000 n 0000018337 00000 n -0000737463 00000 n -0001155228 00000 n +0000740168 00000 n +0001158011 00000 n 0000018386 00000 n 0000018430 00000 n -0000741498 00000 n -0001155096 00000 n +0000744203 00000 n +0001157879 00000 n 0000018479 00000 n 0000018520 00000 n -0000741627 00000 n -0001155017 00000 n +0000744332 00000 n +0001157800 00000 n 0000018574 00000 n 0000018622 00000 n -0000741755 00000 n -0001154938 00000 n +0000744460 00000 n +0001157721 00000 n 0000018676 00000 n 0000018727 00000 n -0000741884 00000 n -0001154859 00000 n +0000744589 00000 n +0001157642 00000 n 0000018776 00000 n 0000018823 00000 n -0000746483 00000 n -0001154726 00000 n +0000749188 00000 n +0001157509 00000 n 0000018870 00000 n 0000018907 00000 n -0000746612 00000 n -0001154608 00000 n +0000749317 00000 n +0001157391 00000 n 0000018956 00000 n 0000018995 00000 n -0000746741 00000 n -0001154543 00000 n +0000749446 00000 n +0001157326 00000 n 0000019049 00000 n 0000019127 00000 n -0000746870 00000 n -0001154450 00000 n +0000749575 00000 n +0001157233 00000 n 0000019176 00000 n 0000019243 00000 n -0000746999 00000 n -0001154371 00000 n +0000749704 00000 n +0001157154 00000 n 0000019292 00000 n 0000019337 00000 n -0000750440 00000 n -0001154238 00000 n +0000753145 00000 n +0001157021 00000 n 0000019385 00000 n 0000019417 00000 n -0000750569 00000 n -0001154120 00000 n +0000753274 00000 n +0001156903 00000 n 0000019466 00000 n 0000019505 00000 n -0000750698 00000 n -0001154055 00000 n +0000753403 00000 n +0001156838 00000 n 0000019559 00000 n 0000019620 00000 n -0000754380 00000 n -0001153923 00000 n +0000757085 00000 n +0001156706 00000 n 0000019669 00000 n 0000019726 00000 n -0000754509 00000 n -0001153858 00000 n +0000757214 00000 n +0001156641 00000 n 0000019780 00000 n 0000019829 00000 n -0000754638 00000 n -0001153726 00000 n +0000757343 00000 n +0001156509 00000 n 0000019878 00000 n 0000019940 00000 n -0000754767 00000 n -0001153647 00000 n +0000757472 00000 n +0001156430 00000 n 0000019994 00000 n 0000020049 00000 n -0000779610 00000 n -0001153554 00000 n +0000782315 00000 n +0001156337 00000 n 0000020103 00000 n 0000020144 00000 n -0000779739 00000 n -0001153475 00000 n +0000782444 00000 n +0001156258 00000 n 0000020198 00000 n 0000020250 00000 n -0000780128 00000 n -0001153357 00000 n +0000782833 00000 n +0001156140 00000 n 0000020299 00000 n 0000020349 00000 n -0000782950 00000 n -0001153278 00000 n +0000785655 00000 n +0001156061 00000 n 0000020403 00000 n 0000020441 00000 n -0000783079 00000 n -0001153185 00000 n +0000785784 00000 n +0001155968 00000 n 0000020495 00000 n 0000020532 00000 n -0000783208 00000 n -0001153092 00000 n +0000785913 00000 n +0001155875 00000 n 0000020586 00000 n 0000020624 00000 n -0000783337 00000 n -0001152999 00000 n +0000786042 00000 n +0001155782 00000 n 0000020678 00000 n 0000020730 00000 n -0000786573 00000 n -0001152906 00000 n +0000789278 00000 n +0001155689 00000 n 0000020784 00000 n 0000020827 00000 n -0000786701 00000 n -0001152774 00000 n +0000789406 00000 n +0001155557 00000 n 0000020881 00000 n 0000020926 00000 n -0000786829 00000 n -0001152695 00000 n +0000789534 00000 n +0001155478 00000 n 0000020985 00000 n 0000021051 00000 n -0000789815 00000 n -0001152602 00000 n +0000792520 00000 n +0001155385 00000 n 0000021110 00000 n 0000021198 00000 n -0000789944 00000 n -0001152509 00000 n +0000792649 00000 n +0001155292 00000 n 0000021257 00000 n 0000021332 00000 n -0000790073 00000 n -0001152416 00000 n +0000792778 00000 n +0001155199 00000 n 0000021391 00000 n 0000021476 00000 n -0000792981 00000 n -0001152323 00000 n +0000795686 00000 n +0001155106 00000 n 0000021535 00000 n 0000021616 00000 n -0000795442 00000 n -0001152244 00000 n +0000798147 00000 n +0001155027 00000 n 0000021675 00000 n 0000021759 00000 n -0000795571 00000 n -0001152165 00000 n +0000798276 00000 n +0001154948 00000 n 0000021813 00000 n 0000021857 00000 n -0000798400 00000 n -0001152045 00000 n +0000801105 00000 n +0001154828 00000 n 0000021905 00000 n 0000021939 00000 n -0000798529 00000 n -0001151966 00000 n +0000801234 00000 n +0001154749 00000 n 0000021988 00000 n 0000022015 00000 n -0000816495 00000 n -0001151873 00000 n +0000819200 00000 n +0001154656 00000 n 0000022064 00000 n 0000022092 00000 n -0000824044 00000 n -0001151780 00000 n +0000826749 00000 n +0001154563 00000 n 0000022141 00000 n 0000022181 00000 n -0000830319 00000 n -0001151687 00000 n +0000833024 00000 n +0001154470 00000 n 0000022230 00000 n 0000022273 00000 n -0000836854 00000 n -0001151594 00000 n +0000839559 00000 n +0001154377 00000 n 0000022322 00000 n 0000022359 00000 n -0000850093 00000 n -0001151501 00000 n +0000852798 00000 n +0001154284 00000 n 0000022408 00000 n 0000022445 00000 n -0000853117 00000 n -0001151408 00000 n +0000855822 00000 n +0001154191 00000 n 0000022494 00000 n 0000022532 00000 n -0000859767 00000 n -0001151315 00000 n +0000862548 00000 n +0001154098 00000 n 0000022581 00000 n 0000022620 00000 n -0000873231 00000 n -0001151222 00000 n +0000876012 00000 n +0001154005 00000 n 0000022669 00000 n 0000022708 00000 n -0000876250 00000 n -0001151129 00000 n +0000879031 00000 n +0001153912 00000 n 0000022758 00000 n 0000022798 00000 n -0000885745 00000 n -0001151036 00000 n +0000888526 00000 n +0001153819 00000 n 0000022848 00000 n 0000022878 00000 n -0000894551 00000 n -0001150943 00000 n +0000897332 00000 n +0001153726 00000 n 0000022928 00000 n 0000022971 00000 n -0000895005 00000 n -0001150850 00000 n +0000897786 00000 n +0001153633 00000 n 0000023021 00000 n 0000023054 00000 n -0000909263 00000 n -0001150757 00000 n +0000912044 00000 n +0001153540 00000 n 0000023104 00000 n 0000023133 00000 n -0000916463 00000 n -0001150664 00000 n +0000919244 00000 n +0001153447 00000 n 0000023183 00000 n 0000023217 00000 n -0000922445 00000 n -0001150571 00000 n +0000925226 00000 n +0001153354 00000 n 0000023267 00000 n 0000023304 00000 n -0000925715 00000 n -0001150478 00000 n +0000928496 00000 n +0001153261 00000 n 0000023354 00000 n 0000023391 00000 n -0000931198 00000 n -0001150385 00000 n +0000933979 00000 n +0001153168 00000 n 0000023441 00000 n 0000023474 00000 n -0000931651 00000 n -0001150292 00000 n +0000934432 00000 n +0001153075 00000 n 0000023524 00000 n 0000023558 00000 n -0000934599 00000 n -0001150199 00000 n +0000937379 00000 n +0001152982 00000 n 0000023608 00000 n 0000023647 00000 n -0000936747 00000 n -0001150120 00000 n +0000939527 00000 n +0001152903 00000 n 0000023697 00000 n 0000023731 00000 n 0000024104 00000 n @@ -17165,10 +17168,10 @@ xref 0000023784 00000 n 0000288901 00000 n 0000288964 00000 n -0001144529 00000 n -0001118444 00000 n -0001144355 00000 n -0001145567 00000 n +0001147312 00000 n +0001121227 00000 n +0001147138 00000 n +0001148350 00000 n 0000025535 00000 n 0000025728 00000 n 0000025808 00000 n @@ -17188,12 +17191,12 @@ xref 0000290270 00000 n 0000289127 00000 n 0000290392 00000 n -0001117208 00000 n -0001090589 00000 n -0001117034 00000 n -0001089904 00000 n -0001087759 00000 n -0001089740 00000 n +0001119991 00000 n +0001093372 00000 n +0001119817 00000 n +0001092687 00000 n +0001090542 00000 n +0001092523 00000 n 0000302181 00000 n 0000293506 00000 n 0000290540 00000 n @@ -17253,9 +17256,9 @@ xref 0000305636 00000 n 0000302266 00000 n 0000315634 00000 n -0001087171 00000 n -0001069750 00000 n -0001086985 00000 n +0001089954 00000 n +0001072533 00000 n +0001089768 00000 n 0000306286 00000 n 0000306450 00000 n 0000306613 00000 n @@ -17313,1672 +17316,1671 @@ xref 0000315142 00000 n 0000315304 00000 n 0000315466 00000 n -0000329835 00000 n -0000319302 00000 n +0000329838 00000 n +0000319303 00000 n 0000315799 00000 n -0000329770 00000 n -0000319970 00000 n -0000320139 00000 n -0000320307 00000 n -0000320471 00000 n -0000320634 00000 n -0000320798 00000 n -0000320962 00000 n -0000321126 00000 n -0000321290 00000 n -0000321459 00000 n -0000321627 00000 n -0000321796 00000 n -0000321965 00000 n -0000322133 00000 n -0000322302 00000 n -0000322471 00000 n -0000322639 00000 n -0000322808 00000 n -0000322978 00000 n -0000323147 00000 n -0000323317 00000 n -0000323487 00000 n -0000323657 00000 n -0000323827 00000 n -0000323997 00000 n -0000324167 00000 n -0000324337 00000 n -0000324507 00000 n -0000324676 00000 n -0000324840 00000 n -0000325003 00000 n -0000325167 00000 n -0000325331 00000 n -0000325495 00000 n -0000325659 00000 n -0000325823 00000 n -0000325986 00000 n -0000326150 00000 n -0000326314 00000 n -0000326477 00000 n -0000326641 00000 n -0000326809 00000 n -0000326978 00000 n -0000327147 00000 n -0000327316 00000 n -0000327473 00000 n -0000327636 00000 n -0000327804 00000 n -0000327971 00000 n -0000328134 00000 n -0000328296 00000 n -0000328459 00000 n -0000328622 00000 n -0000328790 00000 n -0000328958 00000 n -0000329126 00000 n -0000329293 00000 n -0000329454 00000 n -0000329614 00000 n -0000342999 00000 n -0000333429 00000 n -0000329935 00000 n -0000342934 00000 n -0000334061 00000 n -0000334229 00000 n -0000334392 00000 n -0000334560 00000 n -0000334728 00000 n -0000334896 00000 n -0001068859 00000 n -0001047525 00000 n -0001068683 00000 n -0000335064 00000 n -0000335231 00000 n -0000335387 00000 n -0000335545 00000 n -0000335703 00000 n -0000335866 00000 n -0000336029 00000 n -0000336187 00000 n -0000336343 00000 n -0000336501 00000 n -0000336664 00000 n -0000336822 00000 n -0000336980 00000 n -0000337136 00000 n -0000337294 00000 n -0000337457 00000 n -0000337615 00000 n -0000337778 00000 n -0000337935 00000 n -0000338097 00000 n -0000338260 00000 n -0000338423 00000 n -0000338581 00000 n -0000338744 00000 n -0000338907 00000 n -0000339070 00000 n -0000339233 00000 n -0000339396 00000 n -0000339559 00000 n -0000339727 00000 n -0000339895 00000 n -0000340062 00000 n -0000340228 00000 n -0000340395 00000 n -0000340562 00000 n -0000340725 00000 n -0000340882 00000 n -0000341040 00000 n -0000341198 00000 n -0000341356 00000 n -0000341514 00000 n -0000341672 00000 n -0000341830 00000 n -0000341988 00000 n -0000342146 00000 n -0000342304 00000 n -0000342463 00000 n -0000342620 00000 n -0000342777 00000 n -0000345400 00000 n -0000343854 00000 n -0000343113 00000 n -0000345335 00000 n -0000344064 00000 n -0001046557 00000 n -0001026587 00000 n -0001046382 00000 n -0000344223 00000 n -0000344382 00000 n -0000344540 00000 n -0000344699 00000 n -0000344858 00000 n -0000345017 00000 n -0000345176 00000 n -0001145688 00000 n -0000348523 00000 n -0000347756 00000 n -0000345501 00000 n -0000347944 00000 n -0000348072 00000 n -0000348200 00000 n -0000348328 00000 n -0000348393 00000 n -0000348458 00000 n -0001025770 00000 n -0001007305 00000 n -0001025595 00000 n -0000353060 00000 n -0000351919 00000 n -0000348651 00000 n -0000352421 00000 n -0000352486 00000 n -0000352613 00000 n -0000352741 00000 n -0000352869 00000 n -0000352075 00000 n -0000352269 00000 n -0000352995 00000 n -0000692832 00000 n -0000754831 00000 n -0000357742 00000 n -0000356684 00000 n -0000353188 00000 n -0000357165 00000 n -0000357293 00000 n -0000356840 00000 n -0000357003 00000 n -0000357421 00000 n -0000357549 00000 n -0000357677 00000 n -0000373539 00000 n -0000360983 00000 n -0000360408 00000 n -0000357870 00000 n -0000360534 00000 n -0000360662 00000 n -0000360790 00000 n -0000360918 00000 n -0000364441 00000 n -0000363275 00000 n -0000361097 00000 n -0000363737 00000 n -0000363865 00000 n -0000363993 00000 n -0000364121 00000 n -0000364249 00000 n -0000363431 00000 n -0000363584 00000 n -0000364376 00000 n -0000619806 00000 n -0000365518 00000 n -0000365199 00000 n -0000364527 00000 n -0000365325 00000 n -0000365453 00000 n -0001145813 00000 n -0000367561 00000 n -0000366858 00000 n -0000365618 00000 n -0000366984 00000 n -0000367112 00000 n -0000367239 00000 n -0000367367 00000 n -0000367496 00000 n -0000370140 00000 n -0000369510 00000 n -0000367661 00000 n -0000369816 00000 n -0000369945 00000 n -0000370010 00000 n -0000370075 00000 n -0000369657 00000 n -0000603615 00000 n -0000373733 00000 n -0000373028 00000 n -0000370254 00000 n -0000373154 00000 n -0000373283 00000 n -0000373410 00000 n -0001006622 00000 n -0000994560 00000 n -0001006443 00000 n -0000373668 00000 n -0000378400 00000 n -0000377330 00000 n -0000373861 00000 n -0000378335 00000 n -0000993987 00000 n -0000983054 00000 n -0000993808 00000 n -0000377513 00000 n -0000377668 00000 n -0000377839 00000 n -0000378010 00000 n -0000378165 00000 n -0000521253 00000 n -0000685721 00000 n -0000381927 00000 n -0000381736 00000 n -0000378569 00000 n -0000381862 00000 n -0000386399 00000 n -0000386002 00000 n -0000382069 00000 n -0000386334 00000 n -0000386149 00000 n -0001145938 00000 n -0000488637 00000 n -0000388602 00000 n -0000388152 00000 n -0000386555 00000 n -0000388278 00000 n -0000388407 00000 n -0000388472 00000 n -0000388537 00000 n -0000389071 00000 n -0000388880 00000 n -0000388730 00000 n -0000389006 00000 n -0000391766 00000 n -0000394356 00000 n -0000391601 00000 n -0000389113 00000 n -0000393904 00000 n -0000394033 00000 n -0000394162 00000 n -0000393409 00000 n -0000393571 00000 n -0000982148 00000 n -0000972128 00000 n -0000981974 00000 n -0000971564 00000 n -0000962478 00000 n -0000971389 00000 n -0000394291 00000 n -0000393733 00000 n -0000393238 00000 n -0000393296 00000 n -0000393386 00000 n -0000541088 00000 n -0000581042 00000 n -0000399123 00000 n -0000398187 00000 n -0000394527 00000 n -0000398671 00000 n -0000398800 00000 n -0000398929 00000 n -0000398343 00000 n -0000398509 00000 n -0000399058 00000 n -0000758863 00000 n -0000403041 00000 n -0000402532 00000 n -0000399279 00000 n -0000402847 00000 n -0000402976 00000 n -0000402679 00000 n -0000404189 00000 n -0000403998 00000 n -0000403182 00000 n -0000404124 00000 n -0001146063 00000 n -0000406055 00000 n -0000405735 00000 n -0000404290 00000 n -0000405861 00000 n -0000405990 00000 n -0000409350 00000 n -0000408515 00000 n -0000406169 00000 n -0000408641 00000 n -0000408770 00000 n -0000408899 00000 n -0000409027 00000 n -0000409156 00000 n -0000409285 00000 n -0000413404 00000 n -0000412508 00000 n -0000409492 00000 n -0000412825 00000 n -0000412954 00000 n -0000413082 00000 n -0000412655 00000 n -0000413210 00000 n -0000413339 00000 n -0000417431 00000 n -0000416853 00000 n -0000413545 00000 n -0000416979 00000 n -0000417108 00000 n -0000417237 00000 n -0000417366 00000 n -0000421358 00000 n -0000420909 00000 n -0000417573 00000 n -0000421035 00000 n -0000421164 00000 n -0000421293 00000 n -0000423671 00000 n -0000423480 00000 n -0000421486 00000 n -0000423606 00000 n -0001146188 00000 n -0000426939 00000 n -0000426361 00000 n -0000423815 00000 n -0000426487 00000 n -0000962203 00000 n -0000958846 00000 n -0000962024 00000 n -0000426616 00000 n -0000426745 00000 n -0000426874 00000 n -0000431006 00000 n -0000430199 00000 n -0000427110 00000 n -0000430684 00000 n -0000430813 00000 n -0000958491 00000 n -0000956494 00000 n -0000958326 00000 n -0000430355 00000 n -0000430519 00000 n -0000430941 00000 n -0000836918 00000 n -0000853181 00000 n -0000434543 00000 n -0000433836 00000 n -0000431134 00000 n -0000433962 00000 n -0000434091 00000 n -0000434220 00000 n -0000434349 00000 n -0000434478 00000 n -0000438230 00000 n -0000436960 00000 n -0000434657 00000 n -0000437263 00000 n -0000437392 00000 n -0000437521 00000 n -0000437650 00000 n -0000437779 00000 n -0000437908 00000 n -0000438037 00000 n -0000438166 00000 n -0000437107 00000 n -0000643881 00000 n -0000441952 00000 n -0000441503 00000 n -0000438358 00000 n -0000441629 00000 n -0000441758 00000 n -0000441887 00000 n -0000444959 00000 n -0000444639 00000 n -0000442066 00000 n -0000444765 00000 n -0000444894 00000 n -0001146313 00000 n -0000447976 00000 n -0000447527 00000 n -0000445129 00000 n -0000447653 00000 n -0000447782 00000 n -0000447911 00000 n -0000450825 00000 n -0000450118 00000 n -0000448133 00000 n -0000450244 00000 n -0000450373 00000 n -0000450502 00000 n -0000450631 00000 n -0000450760 00000 n -0000453634 00000 n -0000453314 00000 n -0000450939 00000 n -0000453440 00000 n -0000453569 00000 n -0000459347 00000 n -0000456562 00000 n -0000456113 00000 n -0000453748 00000 n -0000456239 00000 n -0000456368 00000 n -0000456497 00000 n -0000460886 00000 n -0000459200 00000 n -0000456690 00000 n -0000460434 00000 n -0000460563 00000 n -0000460273 00000 n -0000460692 00000 n -0000460821 00000 n -0000754573 00000 n -0000461398 00000 n -0000461207 00000 n -0000461057 00000 n -0000461333 00000 n -0001146438 00000 n -0000464012 00000 n -0000463434 00000 n -0000461440 00000 n -0000463560 00000 n -0000463689 00000 n -0000463818 00000 n -0000463947 00000 n -0000464453 00000 n -0000464262 00000 n -0000464112 00000 n -0000464388 00000 n -0000468540 00000 n -0000467774 00000 n -0000464495 00000 n -0000468088 00000 n -0000468217 00000 n -0000468345 00000 n -0000468410 00000 n -0000468475 00000 n -0000467921 00000 n -0000473038 00000 n -0000473230 00000 n -0000472783 00000 n -0000468640 00000 n -0000472909 00000 n -0000473165 00000 n -0000477082 00000 n -0000476504 00000 n -0000473358 00000 n -0000476630 00000 n -0000476759 00000 n -0000476888 00000 n -0000477017 00000 n -0000480192 00000 n -0000479614 00000 n -0000477223 00000 n -0000479740 00000 n -0000479869 00000 n -0000479998 00000 n -0000480063 00000 n -0000480127 00000 n -0001146563 00000 n -0000483517 00000 n -0000482813 00000 n -0000480349 00000 n -0000482939 00000 n -0000483068 00000 n -0000483196 00000 n -0000483261 00000 n -0000483326 00000 n -0000483452 00000 n -0000488830 00000 n -0000488042 00000 n -0000483631 00000 n -0000488508 00000 n -0000488198 00000 n -0000488349 00000 n -0000488766 00000 n -0000937473 00000 n -0000492695 00000 n -0000491424 00000 n -0000488971 00000 n -0000492114 00000 n -0000492243 00000 n -0000492372 00000 n -0000492501 00000 n -0000491589 00000 n -0000491741 00000 n -0000491927 00000 n -0000492630 00000 n -0000496842 00000 n -0000496393 00000 n -0000492823 00000 n -0000496519 00000 n -0000496648 00000 n -0000496777 00000 n -0000500748 00000 n -0000500369 00000 n -0000496970 00000 n -0000500683 00000 n -0000500516 00000 n -0000503598 00000 n -0000503793 00000 n -0000503343 00000 n -0000500862 00000 n -0000503469 00000 n +0000329773 00000 n +0000319971 00000 n +0000320140 00000 n +0000320308 00000 n +0000320472 00000 n +0000320635 00000 n +0000320799 00000 n +0000320963 00000 n +0000321127 00000 n +0000321291 00000 n +0000321460 00000 n +0000321628 00000 n +0000321797 00000 n +0000321966 00000 n +0000322134 00000 n +0000322303 00000 n +0000322472 00000 n +0000322640 00000 n +0000322809 00000 n +0000322979 00000 n +0000323148 00000 n +0000323318 00000 n +0000323488 00000 n +0000323658 00000 n +0000323828 00000 n +0000323998 00000 n +0000324168 00000 n +0000324338 00000 n +0000324508 00000 n +0000324677 00000 n +0000324841 00000 n +0000325004 00000 n +0000325168 00000 n +0000325332 00000 n +0000325496 00000 n +0000325660 00000 n +0000325824 00000 n +0000325987 00000 n +0000326151 00000 n +0000326315 00000 n +0000326478 00000 n +0000326642 00000 n +0000326811 00000 n +0000326980 00000 n +0000327149 00000 n +0000327318 00000 n +0000327476 00000 n +0000327639 00000 n +0000327807 00000 n +0000327974 00000 n +0000328137 00000 n +0000328299 00000 n +0000328462 00000 n +0000328625 00000 n +0000328793 00000 n +0000328961 00000 n +0000329129 00000 n +0000329296 00000 n +0000329457 00000 n +0000329617 00000 n +0000343003 00000 n +0000333433 00000 n +0000329938 00000 n +0000342938 00000 n +0000334065 00000 n +0000334233 00000 n +0000334396 00000 n +0000334564 00000 n +0000334732 00000 n +0000334900 00000 n +0001071642 00000 n +0001050308 00000 n +0001071466 00000 n +0000335068 00000 n +0000335235 00000 n +0000335391 00000 n +0000335549 00000 n +0000335707 00000 n +0000335870 00000 n +0000336033 00000 n +0000336191 00000 n +0000336347 00000 n +0000336505 00000 n +0000336668 00000 n +0000336826 00000 n +0000336984 00000 n +0000337140 00000 n +0000337298 00000 n +0000337461 00000 n +0000337619 00000 n +0000337782 00000 n +0000337939 00000 n +0000338101 00000 n +0000338264 00000 n +0000338427 00000 n +0000338585 00000 n +0000338748 00000 n +0000338911 00000 n +0000339074 00000 n +0000339237 00000 n +0000339400 00000 n +0000339563 00000 n +0000339731 00000 n +0000339899 00000 n +0000340066 00000 n +0000340232 00000 n +0000340399 00000 n +0000340566 00000 n +0000340729 00000 n +0000340886 00000 n +0000341044 00000 n +0000341202 00000 n +0000341360 00000 n +0000341518 00000 n +0000341676 00000 n +0000341834 00000 n +0000341992 00000 n +0000342150 00000 n +0000342308 00000 n +0000342467 00000 n +0000342624 00000 n +0000342781 00000 n +0000345404 00000 n +0000343858 00000 n +0000343117 00000 n +0000345339 00000 n +0000344068 00000 n +0001049340 00000 n +0001029370 00000 n +0001049165 00000 n +0000344227 00000 n +0000344386 00000 n +0000344544 00000 n +0000344703 00000 n +0000344862 00000 n +0000345021 00000 n +0000345180 00000 n +0001148471 00000 n +0000348527 00000 n +0000347760 00000 n +0000345505 00000 n +0000347948 00000 n +0000348076 00000 n +0000348204 00000 n +0000348332 00000 n +0000348397 00000 n +0000348462 00000 n +0001028553 00000 n +0001010088 00000 n +0001028378 00000 n +0000353064 00000 n +0000351923 00000 n +0000348655 00000 n +0000352425 00000 n +0000352490 00000 n +0000352617 00000 n +0000352745 00000 n +0000352873 00000 n +0000352079 00000 n +0000352273 00000 n +0000352999 00000 n +0000695950 00000 n +0000757536 00000 n +0000357746 00000 n +0000356688 00000 n +0000353192 00000 n +0000357169 00000 n +0000357297 00000 n +0000356844 00000 n +0000357007 00000 n +0000357425 00000 n +0000357553 00000 n +0000357681 00000 n +0000373543 00000 n +0000360987 00000 n +0000360412 00000 n +0000357874 00000 n +0000360538 00000 n +0000360666 00000 n +0000360794 00000 n +0000360922 00000 n +0000364445 00000 n +0000363279 00000 n +0000361101 00000 n +0000363741 00000 n +0000363869 00000 n +0000363997 00000 n +0000364125 00000 n +0000364253 00000 n +0000363435 00000 n +0000363588 00000 n +0000364380 00000 n +0000623228 00000 n +0000365522 00000 n +0000365203 00000 n +0000364531 00000 n +0000365329 00000 n +0000365457 00000 n +0001148596 00000 n +0000367565 00000 n +0000366862 00000 n +0000365622 00000 n +0000366988 00000 n +0000367116 00000 n +0000367243 00000 n +0000367371 00000 n +0000367500 00000 n +0000370144 00000 n +0000369514 00000 n +0000367665 00000 n +0000369820 00000 n +0000369949 00000 n +0000370014 00000 n +0000370079 00000 n +0000369661 00000 n +0000604182 00000 n +0000373737 00000 n +0000373032 00000 n +0000370258 00000 n +0000373158 00000 n +0000373287 00000 n +0000373414 00000 n +0001009405 00000 n +0000997343 00000 n +0001009226 00000 n +0000373672 00000 n +0000378344 00000 n +0000377454 00000 n +0000373865 00000 n +0000378279 00000 n +0000996770 00000 n +0000985836 00000 n +0000996591 00000 n +0000377628 00000 n +0000377783 00000 n +0000377953 00000 n +0000378108 00000 n +0000521009 00000 n +0000685153 00000 n +0000381709 00000 n +0000381518 00000 n +0000378513 00000 n +0000381644 00000 n +0000386231 00000 n +0000385833 00000 n +0000381851 00000 n +0000386166 00000 n +0000385980 00000 n +0001148721 00000 n +0000488393 00000 n +0000388358 00000 n +0000387908 00000 n +0000386387 00000 n +0000388034 00000 n +0000388163 00000 n +0000388228 00000 n +0000388293 00000 n +0000388827 00000 n +0000388636 00000 n +0000388486 00000 n +0000388762 00000 n +0000391522 00000 n +0000394112 00000 n +0000391357 00000 n +0000388869 00000 n +0000393660 00000 n +0000393789 00000 n +0000393918 00000 n +0000393165 00000 n +0000393327 00000 n +0000984930 00000 n +0000974910 00000 n +0000984756 00000 n +0000974346 00000 n +0000965260 00000 n +0000974171 00000 n +0000394047 00000 n +0000393489 00000 n +0000392994 00000 n +0000393052 00000 n +0000393142 00000 n +0000541053 00000 n +0000581463 00000 n +0000398879 00000 n +0000397943 00000 n +0000394283 00000 n +0000398427 00000 n +0000398556 00000 n +0000398685 00000 n +0000398099 00000 n +0000398265 00000 n +0000398814 00000 n +0000761568 00000 n +0000402797 00000 n +0000402288 00000 n +0000399035 00000 n +0000402603 00000 n +0000402732 00000 n +0000402435 00000 n +0000403945 00000 n +0000403754 00000 n +0000402938 00000 n +0000403880 00000 n +0001148846 00000 n +0000405811 00000 n +0000405491 00000 n +0000404046 00000 n +0000405617 00000 n +0000405746 00000 n +0000409106 00000 n +0000408271 00000 n +0000405925 00000 n +0000408397 00000 n +0000408526 00000 n +0000408655 00000 n +0000408783 00000 n +0000408912 00000 n +0000409041 00000 n +0000413160 00000 n +0000412264 00000 n +0000409248 00000 n +0000412581 00000 n +0000412710 00000 n +0000412838 00000 n +0000412411 00000 n +0000412966 00000 n +0000413095 00000 n +0000417187 00000 n +0000416609 00000 n +0000413301 00000 n +0000416735 00000 n +0000416864 00000 n +0000416993 00000 n +0000417122 00000 n +0000421114 00000 n +0000420665 00000 n +0000417329 00000 n +0000420791 00000 n +0000420920 00000 n +0000421049 00000 n +0000423427 00000 n +0000423236 00000 n +0000421242 00000 n +0000423362 00000 n +0001148971 00000 n +0000426695 00000 n +0000426117 00000 n +0000423571 00000 n +0000426243 00000 n +0000964985 00000 n +0000961627 00000 n +0000964806 00000 n +0000426372 00000 n +0000426501 00000 n +0000426630 00000 n +0000430762 00000 n +0000429955 00000 n +0000426866 00000 n +0000430440 00000 n +0000430569 00000 n +0000961272 00000 n +0000959274 00000 n +0000961107 00000 n +0000430111 00000 n +0000430275 00000 n +0000430697 00000 n +0000839623 00000 n +0000855886 00000 n +0000434299 00000 n +0000433592 00000 n +0000430890 00000 n +0000433718 00000 n +0000433847 00000 n +0000433976 00000 n +0000434105 00000 n +0000434234 00000 n +0000437986 00000 n +0000436716 00000 n +0000434413 00000 n +0000437019 00000 n +0000437148 00000 n +0000437277 00000 n +0000437406 00000 n +0000437535 00000 n +0000437664 00000 n +0000437793 00000 n +0000437922 00000 n +0000436863 00000 n +0000647435 00000 n +0000441708 00000 n +0000441259 00000 n +0000438114 00000 n +0000441385 00000 n +0000441514 00000 n +0000441643 00000 n +0000444715 00000 n +0000444395 00000 n +0000441822 00000 n +0000444521 00000 n +0000444650 00000 n +0001149096 00000 n +0000447732 00000 n +0000447283 00000 n +0000444885 00000 n +0000447409 00000 n +0000447538 00000 n +0000447667 00000 n +0000450581 00000 n +0000449874 00000 n +0000447889 00000 n +0000450000 00000 n +0000450129 00000 n +0000450258 00000 n +0000450387 00000 n +0000450516 00000 n +0000453390 00000 n +0000453070 00000 n +0000450695 00000 n +0000453196 00000 n +0000453325 00000 n +0000459103 00000 n +0000456318 00000 n +0000455869 00000 n +0000453504 00000 n +0000455995 00000 n +0000456124 00000 n +0000456253 00000 n +0000460642 00000 n +0000458956 00000 n +0000456446 00000 n +0000460190 00000 n +0000460319 00000 n +0000460029 00000 n +0000460448 00000 n +0000460577 00000 n +0000757278 00000 n +0000461154 00000 n +0000460963 00000 n +0000460813 00000 n +0000461089 00000 n +0001149221 00000 n +0000463768 00000 n +0000463190 00000 n +0000461196 00000 n +0000463316 00000 n +0000463445 00000 n +0000463574 00000 n +0000463703 00000 n +0000464209 00000 n +0000464018 00000 n +0000463868 00000 n +0000464144 00000 n +0000468296 00000 n +0000467530 00000 n +0000464251 00000 n +0000467844 00000 n +0000467973 00000 n +0000468101 00000 n +0000468166 00000 n +0000468231 00000 n +0000467677 00000 n +0000472794 00000 n +0000472986 00000 n +0000472539 00000 n +0000468396 00000 n +0000472665 00000 n +0000472921 00000 n +0000476838 00000 n +0000476260 00000 n +0000473114 00000 n +0000476386 00000 n +0000476515 00000 n +0000476644 00000 n +0000476773 00000 n +0000479948 00000 n +0000479370 00000 n +0000476979 00000 n +0000479496 00000 n +0000479625 00000 n +0000479754 00000 n +0000479819 00000 n +0000479883 00000 n +0001149346 00000 n +0000483273 00000 n +0000482569 00000 n +0000480105 00000 n +0000482695 00000 n +0000482824 00000 n +0000482952 00000 n +0000483017 00000 n +0000483082 00000 n +0000483208 00000 n +0000488586 00000 n +0000487798 00000 n +0000483387 00000 n +0000488264 00000 n +0000487954 00000 n +0000488105 00000 n +0000488522 00000 n +0000940253 00000 n +0000492451 00000 n +0000491180 00000 n +0000488727 00000 n +0000491870 00000 n +0000491999 00000 n +0000492128 00000 n +0000492257 00000 n +0000491345 00000 n +0000491497 00000 n +0000491683 00000 n +0000492386 00000 n +0000496598 00000 n +0000496149 00000 n +0000492579 00000 n +0000496275 00000 n +0000496404 00000 n +0000496533 00000 n +0000500504 00000 n +0000500125 00000 n +0000496726 00000 n +0000500439 00000 n +0000500272 00000 n +0000503354 00000 n +0000503549 00000 n +0000503099 00000 n +0000500618 00000 n +0000503225 00000 n +0000503419 00000 n +0000503484 00000 n +0001149471 00000 n +0000506353 00000 n +0000506162 00000 n 0000503663 00000 n -0000503728 00000 n -0001146688 00000 n -0000506597 00000 n -0000506406 00000 n -0000503907 00000 n -0000506532 00000 n -0000510197 00000 n -0000509748 00000 n -0000506711 00000 n -0000509874 00000 n -0000510003 00000 n -0000510068 00000 n -0000510132 00000 n -0000513155 00000 n -0000512836 00000 n -0000510311 00000 n -0000512962 00000 n -0000513090 00000 n -0000516398 00000 n -0000515358 00000 n -0000513269 00000 n -0000515819 00000 n -0000515948 00000 n -0000515514 00000 n -0000515668 00000 n -0000516076 00000 n -0000516204 00000 n -0000516333 00000 n -0000517919 00000 n -0000517728 00000 n -0000516512 00000 n -0000517854 00000 n -0000519479 00000 n -0000519288 00000 n -0000518020 00000 n -0000519414 00000 n -0001146813 00000 n -0000521317 00000 n -0000520998 00000 n -0000519580 00000 n -0000521124 00000 n -0000524735 00000 n -0000524544 00000 n -0000521431 00000 n -0000524670 00000 n -0000529206 00000 n -0000528838 00000 n -0000524863 00000 n -0000529141 00000 n -0000528985 00000 n -0000721881 00000 n -0000533299 00000 n -0000532918 00000 n -0000529348 00000 n -0000533234 00000 n -0000533065 00000 n -0000537534 00000 n -0000537169 00000 n -0000533427 00000 n -0000537469 00000 n -0000537316 00000 n -0000541282 00000 n -0000540833 00000 n -0000537676 00000 n -0000540959 00000 n -0000541153 00000 n -0000541217 00000 n -0001146938 00000 n -0000545583 00000 n -0000545217 00000 n -0000541410 00000 n -0000545518 00000 n -0000545364 00000 n -0000550667 00000 n -0000549534 00000 n -0000545711 00000 n -0000550602 00000 n -0000549717 00000 n -0000549873 00000 n -0000550058 00000 n -0000550232 00000 n -0000550417 00000 n -0000635525 00000 n -0000554943 00000 n -0000554752 00000 n -0000550865 00000 n -0000554878 00000 n -0000558896 00000 n -0000558705 00000 n -0000555057 00000 n -0000558831 00000 n -0000562750 00000 n -0000562430 00000 n -0000559010 00000 n -0000562556 00000 n -0000562685 00000 n -0000566514 00000 n -0000565698 00000 n -0000562864 00000 n -0000566191 00000 n -0000565854 00000 n -0000566320 00000 n -0000566449 00000 n -0000566024 00000 n -0001147063 00000 n -0000650412 00000 n -0000570932 00000 n -0000570241 00000 n -0000566671 00000 n -0000570738 00000 n -0000570397 00000 n -0000570567 00000 n -0000570867 00000 n -0000741948 00000 n -0000574280 00000 n -0000573960 00000 n -0000571060 00000 n -0000574086 00000 n -0000574215 00000 n -0000577233 00000 n -0000577042 00000 n -0000574394 00000 n -0000577168 00000 n -0000581107 00000 n -0000580787 00000 n -0000577404 00000 n -0000580913 00000 n -0000584762 00000 n -0000584571 00000 n -0000581264 00000 n -0000584697 00000 n -0000589124 00000 n -0000588312 00000 n -0000584933 00000 n -0000588801 00000 n -0000588930 00000 n -0000588468 00000 n -0000589059 00000 n -0000588628 00000 n -0001147188 00000 n -0000593286 00000 n -0000592661 00000 n -0000589281 00000 n -0000592963 00000 n -0000593092 00000 n -0000592808 00000 n -0000593221 00000 n -0000596450 00000 n -0000596130 00000 n -0000593414 00000 n -0000596256 00000 n -0000596385 00000 n -0000600387 00000 n -0000599720 00000 n -0000596621 00000 n -0000600194 00000 n -0000600323 00000 n -0000599876 00000 n -0000600038 00000 n -0000603938 00000 n -0000603169 00000 n -0000600501 00000 n -0000603486 00000 n -0000603316 00000 n -0000603680 00000 n -0000603745 00000 n -0000603873 00000 n -0000607913 00000 n -0000607539 00000 n -0000604123 00000 n -0000607848 00000 n -0000607686 00000 n -0000612763 00000 n -0000612086 00000 n -0000608084 00000 n -0000612570 00000 n -0000612242 00000 n -0000612699 00000 n -0000612405 00000 n -0001147313 00000 n -0000718117 00000 n -0000648136 00000 n -0000616110 00000 n -0000615790 00000 n -0000612891 00000 n -0000615916 00000 n -0000616045 00000 n -0000619871 00000 n -0000619551 00000 n -0000616237 00000 n -0000619677 00000 n -0000624199 00000 n -0000623707 00000 n -0000620028 00000 n -0000624005 00000 n -0000624134 00000 n -0000623854 00000 n -0000628499 00000 n -0000628179 00000 n -0000624327 00000 n -0000628305 00000 n -0000628434 00000 n -0000631067 00000 n -0000630747 00000 n -0000628640 00000 n -0000630873 00000 n -0000631002 00000 n -0000635590 00000 n -0000635100 00000 n -0000631181 00000 n -0000635396 00000 n -0000635247 00000 n -0001147438 00000 n -0000639531 00000 n -0000638772 00000 n -0000635704 00000 n -0000639081 00000 n -0000638919 00000 n -0000639210 00000 n -0000639339 00000 n -0000639467 00000 n -0000643946 00000 n -0000643194 00000 n -0000639645 00000 n -0000643495 00000 n -0000643624 00000 n -0000643341 00000 n -0000643752 00000 n -0000648330 00000 n -0000647881 00000 n -0000644074 00000 n -0000648007 00000 n -0000648265 00000 n -0000650477 00000 n -0000650157 00000 n -0000648472 00000 n -0000650283 00000 n -0000651970 00000 n -0000651779 00000 n -0000650591 00000 n -0000651905 00000 n -0000653427 00000 n -0000653236 00000 n -0000652071 00000 n -0000653362 00000 n -0001147563 00000 n -0000656238 00000 n -0000655661 00000 n -0000653528 00000 n -0000655787 00000 n -0000655916 00000 n -0000656043 00000 n -0000656108 00000 n -0000656173 00000 n -0000659903 00000 n -0000659712 00000 n -0000656352 00000 n -0000659838 00000 n -0000665159 00000 n -0000663316 00000 n -0000660017 00000 n -0000664836 00000 n -0000663526 00000 n -0000664965 00000 n -0000665094 00000 n -0000663694 00000 n -0000663856 00000 n -0000664018 00000 n -0000664180 00000 n -0000664342 00000 n -0000664504 00000 n -0000664675 00000 n -0000937440 00000 n -0000670438 00000 n -0000668518 00000 n -0000665273 00000 n -0000670373 00000 n -0000668746 00000 n -0000668909 00000 n -0000669072 00000 n -0000669235 00000 n -0000669397 00000 n -0000669560 00000 n -0000669722 00000 n -0000669885 00000 n -0000670044 00000 n -0000670205 00000 n -0000675059 00000 n -0000673487 00000 n -0000670566 00000 n -0000674994 00000 n -0000673697 00000 n -0000673866 00000 n -0000674028 00000 n -0000674190 00000 n -0000674352 00000 n -0000674514 00000 n -0000674677 00000 n -0000674831 00000 n -0000681361 00000 n -0000678470 00000 n -0000675187 00000 n -0000681296 00000 n -0000678752 00000 n -0000678904 00000 n -0000679058 00000 n -0000679209 00000 n -0000679363 00000 n -0000679525 00000 n -0000679687 00000 n -0000679848 00000 n -0000680010 00000 n -0000680172 00000 n -0000680334 00000 n -0000680496 00000 n -0000680649 00000 n -0000680812 00000 n -0000680967 00000 n -0000681131 00000 n -0001147688 00000 n -0000685786 00000 n -0000684948 00000 n -0000681489 00000 n -0000685592 00000 n -0000685113 00000 n -0000685276 00000 n -0000685430 00000 n -0000688940 00000 n -0000688620 00000 n -0000685928 00000 n -0000688746 00000 n -0000688811 00000 n -0000688875 00000 n -0000693156 00000 n -0000692086 00000 n -0000689111 00000 n -0000692574 00000 n -0000692703 00000 n -0000692961 00000 n -0000692242 00000 n -0000692412 00000 n -0000693026 00000 n -0000693091 00000 n -0000696607 00000 n -0000696287 00000 n -0000693284 00000 n -0000696413 00000 n -0000696478 00000 n -0000696542 00000 n -0000700096 00000 n -0000699775 00000 n -0000696708 00000 n -0000699901 00000 n -0000699966 00000 n -0000700031 00000 n -0000704017 00000 n -0000703308 00000 n -0000700211 00000 n -0000703434 00000 n -0000703563 00000 n -0000703628 00000 n -0000703693 00000 n -0000703758 00000 n -0000703823 00000 n -0000703952 00000 n -0001147813 00000 n -0000708258 00000 n -0000707421 00000 n -0000704131 00000 n -0000707547 00000 n -0000707612 00000 n -0000707677 00000 n -0000707806 00000 n -0000707871 00000 n -0000707936 00000 n -0000708065 00000 n -0000708130 00000 n -0000708194 00000 n -0000711285 00000 n -0000710583 00000 n -0000708386 00000 n -0000710709 00000 n -0000710836 00000 n -0000710963 00000 n -0000711092 00000 n -0000711220 00000 n -0000713995 00000 n -0000713418 00000 n -0000711484 00000 n -0000713544 00000 n -0000713673 00000 n -0000713802 00000 n -0000713867 00000 n -0000713931 00000 n -0000718182 00000 n -0000717862 00000 n -0000714180 00000 n -0000717988 00000 n -0000721946 00000 n -0000721186 00000 n -0000718309 00000 n -0000721493 00000 n -0000721622 00000 n -0000721687 00000 n -0000721752 00000 n -0000721333 00000 n -0000725637 00000 n -0000725058 00000 n -0000722060 00000 n -0000725184 00000 n -0000725313 00000 n -0000725442 00000 n -0000725507 00000 n -0000725572 00000 n -0001147938 00000 n -0000729251 00000 n -0000728356 00000 n -0000725751 00000 n -0000728668 00000 n -0000728503 00000 n -0000728797 00000 n -0000728862 00000 n -0000728927 00000 n -0000729056 00000 n -0000729121 00000 n -0000729186 00000 n -0000937407 00000 n -0000733408 00000 n -0000732958 00000 n -0000729365 00000 n -0000733084 00000 n -0000733213 00000 n -0000733278 00000 n -0000733343 00000 n -0000735299 00000 n -0000734979 00000 n -0000733536 00000 n -0000735105 00000 n -0000956213 00000 n -0000948929 00000 n -0000956033 00000 n -0000735234 00000 n -0000735782 00000 n -0000735591 00000 n -0000735441 00000 n -0000735717 00000 n -0000737592 00000 n -0000737143 00000 n -0000735824 00000 n -0000737269 00000 n -0000737398 00000 n -0000737527 00000 n -0000742013 00000 n -0000741070 00000 n -0000737706 00000 n -0000741433 00000 n -0000948608 00000 n -0000939395 00000 n -0000948422 00000 n -0000741217 00000 n -0000741562 00000 n -0000741690 00000 n -0000741819 00000 n -0001148063 00000 n -0000743372 00000 n -0000743181 00000 n -0000742254 00000 n -0000743307 00000 n -0000743813 00000 n -0000743622 00000 n -0000743472 00000 n -0000743748 00000 n -0000747127 00000 n -0000745901 00000 n -0000743855 00000 n -0000746418 00000 n -0000746547 00000 n -0000746676 00000 n -0000746805 00000 n -0000746934 00000 n -0000747063 00000 n -0000746057 00000 n -0000746229 00000 n -0000747582 00000 n -0000747391 00000 n -0000747241 00000 n -0000747517 00000 n -0000750827 00000 n -0000750249 00000 n -0000747624 00000 n -0000750375 00000 n -0000750504 00000 n -0000750633 00000 n -0000750762 00000 n -0000755024 00000 n -0000753805 00000 n -0000750913 00000 n -0000754315 00000 n -0000754444 00000 n -0000754702 00000 n -0000753961 00000 n -0000754140 00000 n -0000754896 00000 n -0000754960 00000 n -0001148188 00000 n -0000761915 00000 n -0000758087 00000 n -0000755180 00000 n -0000758213 00000 n -0000758278 00000 n -0000758343 00000 n -0000758408 00000 n -0000758473 00000 n -0000758538 00000 n -0000758603 00000 n -0000758668 00000 n -0000758733 00000 n -0000758798 00000 n -0000758928 00000 n -0000758993 00000 n -0000759058 00000 n -0000759123 00000 n -0000759188 00000 n -0000759253 00000 n -0000759318 00000 n -0000759383 00000 n -0000759448 00000 n -0000759513 00000 n -0000759578 00000 n -0000759643 00000 n -0000759708 00000 n -0000759773 00000 n -0000759838 00000 n -0000759903 00000 n -0000759968 00000 n -0000760033 00000 n -0000760098 00000 n -0000760163 00000 n -0000760228 00000 n -0000760293 00000 n -0000760358 00000 n -0000760423 00000 n -0000760487 00000 n -0000760552 00000 n -0000760617 00000 n -0000760682 00000 n -0000760747 00000 n -0000760812 00000 n -0000760877 00000 n -0000760942 00000 n -0000761007 00000 n -0000761072 00000 n -0000761137 00000 n -0000761202 00000 n -0000761267 00000 n -0000761332 00000 n -0000761397 00000 n -0000761462 00000 n -0000761527 00000 n -0000761592 00000 n -0000761657 00000 n -0000761722 00000 n -0000761787 00000 n -0000761851 00000 n -0000768563 00000 n -0000764999 00000 n -0000762029 00000 n -0000765125 00000 n -0000765190 00000 n -0000765255 00000 n -0000765320 00000 n -0000765385 00000 n -0000765450 00000 n -0000765515 00000 n -0000765580 00000 n -0000765645 00000 n -0000765710 00000 n -0000765775 00000 n -0000765840 00000 n -0000765904 00000 n -0000765969 00000 n -0000766034 00000 n -0000766099 00000 n -0000766164 00000 n -0000766229 00000 n -0000766294 00000 n -0000766359 00000 n -0000766424 00000 n -0000766489 00000 n -0000766554 00000 n -0000766619 00000 n -0000766683 00000 n -0000766748 00000 n -0000766813 00000 n -0000766878 00000 n -0000766943 00000 n -0000767008 00000 n -0000767073 00000 n -0000767138 00000 n -0000767203 00000 n -0000767268 00000 n -0000767333 00000 n -0000767398 00000 n -0000767463 00000 n -0000767528 00000 n -0000767593 00000 n -0000767658 00000 n -0000767722 00000 n -0000767786 00000 n -0000767850 00000 n -0000767915 00000 n -0000767980 00000 n -0000768045 00000 n -0000768110 00000 n -0000768175 00000 n -0000768240 00000 n -0000768305 00000 n -0000768370 00000 n -0000768435 00000 n -0000768499 00000 n -0000774738 00000 n -0000771300 00000 n -0000768677 00000 n -0000771426 00000 n -0000771491 00000 n -0000771556 00000 n -0000771621 00000 n -0000771686 00000 n -0000771751 00000 n -0000771816 00000 n -0000771881 00000 n -0000771946 00000 n -0000772011 00000 n -0000772076 00000 n -0000772141 00000 n -0000772206 00000 n -0000772271 00000 n -0000772336 00000 n -0000772401 00000 n -0000772466 00000 n -0000772531 00000 n -0000772596 00000 n -0000772661 00000 n -0000772726 00000 n -0000772791 00000 n -0000772856 00000 n -0000772921 00000 n -0000772986 00000 n -0000773051 00000 n -0000773116 00000 n -0000773181 00000 n -0000773246 00000 n -0000773311 00000 n -0000773376 00000 n -0000773441 00000 n -0000773506 00000 n -0000773571 00000 n -0000773635 00000 n -0000773700 00000 n -0000773765 00000 n -0000773830 00000 n -0000773895 00000 n -0000773960 00000 n -0000774025 00000 n -0000774090 00000 n -0000774155 00000 n -0000774220 00000 n -0000774285 00000 n -0000774350 00000 n -0000774415 00000 n -0000774480 00000 n -0000774545 00000 n -0000774610 00000 n -0000774674 00000 n -0000780257 00000 n -0000777861 00000 n -0000774852 00000 n -0000777987 00000 n -0000778052 00000 n -0000778117 00000 n -0000778182 00000 n -0000778247 00000 n -0000778312 00000 n -0000778377 00000 n -0000778442 00000 n -0000778507 00000 n -0000778572 00000 n -0000778637 00000 n -0000778702 00000 n -0000778767 00000 n -0000778831 00000 n -0000778896 00000 n -0000778961 00000 n -0000779026 00000 n -0000779091 00000 n -0000779156 00000 n -0000779221 00000 n -0000779286 00000 n -0000779351 00000 n -0000779416 00000 n -0000779481 00000 n -0000779546 00000 n -0000779674 00000 n -0000779803 00000 n -0000779868 00000 n -0000779933 00000 n -0000779998 00000 n -0000780063 00000 n -0000780192 00000 n -0000783466 00000 n -0000782759 00000 n -0000780384 00000 n -0000782885 00000 n -0000783014 00000 n -0000783143 00000 n -0000783272 00000 n -0000783401 00000 n -0000786958 00000 n -0000786201 00000 n -0000783593 00000 n -0000786508 00000 n -0000786637 00000 n -0000786348 00000 n -0000786765 00000 n -0000786893 00000 n -0001148313 00000 n -0000790202 00000 n -0000789624 00000 n -0000787085 00000 n -0000789750 00000 n -0000789879 00000 n -0000790008 00000 n -0000790137 00000 n -0000793110 00000 n -0000792790 00000 n -0000790316 00000 n -0000792916 00000 n -0000793045 00000 n -0000795700 00000 n -0000795251 00000 n -0000793280 00000 n -0000795377 00000 n -0000795506 00000 n -0000795635 00000 n -0000796141 00000 n -0000795950 00000 n -0000795800 00000 n -0000796076 00000 n -0000798853 00000 n -0000798209 00000 n -0000796183 00000 n -0000798335 00000 n -0000798464 00000 n -0000798593 00000 n -0000798658 00000 n -0000798723 00000 n -0000798788 00000 n -0000803193 00000 n -0000802873 00000 n -0000798967 00000 n -0000802999 00000 n -0000803064 00000 n -0000803129 00000 n -0001148438 00000 n -0000806796 00000 n -0000806541 00000 n -0000803349 00000 n -0000806667 00000 n -0000806732 00000 n -0000810047 00000 n -0000809856 00000 n -0000806938 00000 n -0000809982 00000 n -0000813767 00000 n -0000813511 00000 n -0000810175 00000 n -0000813637 00000 n -0000813702 00000 n -0000816752 00000 n -0000816044 00000 n -0000813909 00000 n -0000816170 00000 n -0000816235 00000 n -0000816300 00000 n -0000816365 00000 n -0000816430 00000 n -0000816559 00000 n -0000816624 00000 n -0000816688 00000 n -0000821421 00000 n -0000821165 00000 n -0000816894 00000 n -0000821291 00000 n -0000821356 00000 n -0000824431 00000 n -0000823658 00000 n -0000821549 00000 n -0000823784 00000 n -0000823849 00000 n -0000823914 00000 n -0000823979 00000 n -0000824108 00000 n -0000824173 00000 n -0000824236 00000 n -0000824301 00000 n -0000824366 00000 n -0001148563 00000 n -0000827345 00000 n -0000826830 00000 n -0000824587 00000 n -0000826956 00000 n -0000827021 00000 n -0000827086 00000 n -0000827151 00000 n -0000827216 00000 n -0000827281 00000 n -0000830708 00000 n -0000830128 00000 n -0000827501 00000 n -0000830254 00000 n -0000830383 00000 n -0000830448 00000 n -0000830513 00000 n -0000830578 00000 n -0000830643 00000 n -0000834160 00000 n -0000833904 00000 n -0000830850 00000 n -0000834030 00000 n -0000834095 00000 n -0000837112 00000 n -0000836468 00000 n -0000834288 00000 n -0000836594 00000 n -0000836659 00000 n -0000836724 00000 n -0000836789 00000 n -0000836983 00000 n -0000837048 00000 n -0000840705 00000 n -0000840384 00000 n -0000837281 00000 n -0000840510 00000 n -0000840575 00000 n -0000840640 00000 n -0000844296 00000 n -0000844105 00000 n -0000840833 00000 n -0000844231 00000 n -0001148688 00000 n -0000847762 00000 n -0000847441 00000 n -0000844424 00000 n -0000847567 00000 n -0000847632 00000 n -0000847697 00000 n -0000850416 00000 n -0000849707 00000 n -0000847903 00000 n -0000849833 00000 n -0000849898 00000 n -0000849963 00000 n -0000850028 00000 n -0000850157 00000 n -0000850222 00000 n -0000850287 00000 n -0000850352 00000 n -0000853441 00000 n -0000852732 00000 n -0000850572 00000 n -0000852858 00000 n -0000852923 00000 n -0000852987 00000 n -0000853052 00000 n -0000853246 00000 n -0000853311 00000 n -0000853376 00000 n -0000856922 00000 n -0000856601 00000 n -0000853597 00000 n -0000856727 00000 n -0000856792 00000 n -0000856857 00000 n -0000860091 00000 n -0000859381 00000 n -0000857036 00000 n -0000859507 00000 n -0000859572 00000 n -0000859637 00000 n -0000859702 00000 n -0000859831 00000 n -0000859896 00000 n -0000859961 00000 n -0000860026 00000 n -0000863741 00000 n -0000863485 00000 n -0000860247 00000 n -0000863611 00000 n -0000863676 00000 n -0001148813 00000 n -0000867398 00000 n -0000867207 00000 n -0000863883 00000 n -0000867333 00000 n -0000870723 00000 n -0000870532 00000 n -0000867526 00000 n -0000870658 00000 n -0000873552 00000 n -0000872845 00000 n -0000870865 00000 n -0000872971 00000 n -0000873036 00000 n -0000873101 00000 n -0000873166 00000 n -0000873295 00000 n -0000873358 00000 n -0000873423 00000 n -0000873488 00000 n -0000876509 00000 n -0000875799 00000 n -0000873708 00000 n -0000875925 00000 n -0000875990 00000 n -0000876055 00000 n -0000876120 00000 n -0000876185 00000 n -0000876314 00000 n -0000876379 00000 n -0000876444 00000 n -0000879808 00000 n -0000879487 00000 n -0000876665 00000 n -0000879613 00000 n -0000879678 00000 n -0000879743 00000 n -0000883039 00000 n -0000882784 00000 n -0000879950 00000 n -0000882910 00000 n -0000882975 00000 n -0001148938 00000 n -0000886134 00000 n -0000885424 00000 n -0000883167 00000 n -0000885550 00000 n -0000885615 00000 n -0000885680 00000 n -0000885809 00000 n -0000885874 00000 n -0000885939 00000 n -0000886004 00000 n -0000886069 00000 n -0000889435 00000 n -0000889244 00000 n -0000886290 00000 n -0000889370 00000 n -0000892497 00000 n -0000892112 00000 n -0000889648 00000 n -0000892238 00000 n -0000892303 00000 n -0000892368 00000 n -0000892433 00000 n -0000895198 00000 n -0000894230 00000 n -0000892738 00000 n -0000894356 00000 n -0000894421 00000 n -0000894486 00000 n -0000894615 00000 n -0000894680 00000 n -0000894745 00000 n -0000894810 00000 n -0000894875 00000 n -0000894940 00000 n -0000895069 00000 n -0000895134 00000 n -0000899701 00000 n -0000899380 00000 n -0000895340 00000 n -0000899506 00000 n -0000899571 00000 n -0000899636 00000 n -0000903445 00000 n -0000903189 00000 n -0000899829 00000 n -0000903315 00000 n -0000903380 00000 n -0001149063 00000 n -0000906877 00000 n -0000906621 00000 n -0000903573 00000 n -0000906747 00000 n -0000906812 00000 n -0000909456 00000 n -0000908878 00000 n -0000907005 00000 n -0000909004 00000 n -0000909069 00000 n -0000909134 00000 n -0000909198 00000 n -0000909327 00000 n -0000909392 00000 n -0000913457 00000 n -0000913006 00000 n -0000909611 00000 n -0000913132 00000 n -0000913197 00000 n -0000913262 00000 n -0000913327 00000 n -0000913392 00000 n -0000916787 00000 n -0000916142 00000 n -0000913599 00000 n -0000916268 00000 n -0000916333 00000 n -0000916398 00000 n -0000916527 00000 n -0000916592 00000 n -0000916657 00000 n -0000916722 00000 n -0000919348 00000 n -0000919092 00000 n -0000916943 00000 n -0000919218 00000 n -0000919283 00000 n -0000922833 00000 n -0000922059 00000 n -0000919490 00000 n -0000922185 00000 n -0000922250 00000 n -0000922315 00000 n -0000922380 00000 n -0000922508 00000 n -0000922573 00000 n -0000922638 00000 n -0000922703 00000 n -0000922768 00000 n -0001149188 00000 n -0000925908 00000 n -0000925329 00000 n -0000922989 00000 n -0000925455 00000 n -0000925520 00000 n -0000925585 00000 n -0000925650 00000 n -0000925779 00000 n -0000925844 00000 n -0000929734 00000 n -0000929286 00000 n -0000926064 00000 n -0000929412 00000 n -0000929477 00000 n -0000929542 00000 n -0000929607 00000 n -0000929671 00000 n -0000931972 00000 n -0000930942 00000 n -0000929890 00000 n -0000931068 00000 n -0000931133 00000 n -0000931262 00000 n -0000931327 00000 n -0000931392 00000 n -0000931456 00000 n -0000931521 00000 n -0000931586 00000 n -0000931715 00000 n -0000931780 00000 n -0000931845 00000 n -0000931910 00000 n -0000934986 00000 n -0000934213 00000 n -0000932114 00000 n -0000934339 00000 n -0000934404 00000 n -0000934469 00000 n -0000934534 00000 n -0000934663 00000 n -0000934727 00000 n -0000934792 00000 n -0000934857 00000 n -0000934921 00000 n -0000937265 00000 n -0000936426 00000 n -0000935128 00000 n -0000936552 00000 n -0000936617 00000 n -0000936682 00000 n -0000936810 00000 n -0000936875 00000 n -0000936940 00000 n -0000937005 00000 n -0000937070 00000 n -0000937135 00000 n -0000937200 00000 n -0000937506 00000 n -0000948850 00000 n -0000956439 00000 n -0000958738 00000 n -0000958707 00000 n -0000962423 00000 n -0000971863 00000 n -0000982598 00000 n -0000994293 00000 n -0001007010 00000 n -0001026244 00000 n -0001047140 00000 n -0001069288 00000 n -0001087544 00000 n -0001090391 00000 n -0001090161 00000 n -0001117809 00000 n -0001145075 00000 n -0001149313 00000 n -0001149438 00000 n -0001149564 00000 n -0001149690 00000 n -0001149816 00000 n -0001149942 00000 n -0001150043 00000 n -0001171759 00000 n -0001195784 00000 n -0001195825 00000 n -0001195865 00000 n -0001195999 00000 n +0000506288 00000 n +0000509953 00000 n +0000509504 00000 n +0000506467 00000 n +0000509630 00000 n +0000509759 00000 n +0000509824 00000 n +0000509888 00000 n +0000512911 00000 n +0000512592 00000 n +0000510067 00000 n +0000512718 00000 n +0000512846 00000 n +0000516154 00000 n +0000515114 00000 n +0000513025 00000 n +0000515575 00000 n +0000515704 00000 n +0000515270 00000 n +0000515424 00000 n +0000515832 00000 n +0000515960 00000 n +0000516089 00000 n +0000517675 00000 n +0000517484 00000 n +0000516268 00000 n +0000517610 00000 n +0000519235 00000 n +0000519044 00000 n +0000517776 00000 n +0000519170 00000 n +0001149596 00000 n +0000521073 00000 n +0000520754 00000 n +0000519336 00000 n +0000520880 00000 n +0000524491 00000 n +0000524300 00000 n +0000521187 00000 n +0000524426 00000 n +0000528962 00000 n +0000528594 00000 n +0000524619 00000 n +0000528897 00000 n +0000528741 00000 n +0000724987 00000 n +0000533055 00000 n +0000532674 00000 n +0000529104 00000 n +0000532990 00000 n +0000532821 00000 n +0000537386 00000 n +0000537021 00000 n +0000533183 00000 n +0000537321 00000 n +0000537168 00000 n +0000541246 00000 n +0000540798 00000 n +0000537528 00000 n +0000540924 00000 n +0000541118 00000 n +0000541182 00000 n +0001149721 00000 n +0000545142 00000 n +0000544776 00000 n +0000541374 00000 n +0000545077 00000 n +0000544923 00000 n +0000550337 00000 n +0000549203 00000 n +0000545270 00000 n +0000550272 00000 n +0000549386 00000 n +0000549543 00000 n +0000549728 00000 n +0000549902 00000 n +0000550087 00000 n +0000634132 00000 n +0000554615 00000 n +0000554424 00000 n +0000550521 00000 n +0000554550 00000 n +0000558858 00000 n +0000558667 00000 n +0000554743 00000 n +0000558793 00000 n +0000562664 00000 n +0000562346 00000 n +0000558972 00000 n +0000562472 00000 n +0000562601 00000 n +0000566800 00000 n +0000565987 00000 n +0000562778 00000 n +0000566478 00000 n +0000566143 00000 n +0000566607 00000 n +0000566736 00000 n +0000566312 00000 n +0001149846 00000 n +0000652781 00000 n +0000571022 00000 n +0000570460 00000 n +0000566971 00000 n +0000570957 00000 n +0000570616 00000 n +0000570786 00000 n +0000744653 00000 n +0000574560 00000 n +0000574112 00000 n +0000571207 00000 n +0000574238 00000 n +0000574367 00000 n +0000574495 00000 n +0000577756 00000 n +0000577565 00000 n +0000574674 00000 n +0000577691 00000 n +0000581528 00000 n +0000581208 00000 n +0000577927 00000 n +0000581334 00000 n +0000585134 00000 n +0000584943 00000 n +0000581685 00000 n +0000585069 00000 n +0000589673 00000 n +0000588860 00000 n +0000585305 00000 n +0000589351 00000 n +0000589480 00000 n +0000589016 00000 n +0000589608 00000 n +0000589177 00000 n +0001149971 00000 n +0000593757 00000 n +0000593133 00000 n +0000589830 00000 n +0000593435 00000 n +0000593564 00000 n +0000593280 00000 n +0000593693 00000 n +0000596977 00000 n +0000596657 00000 n +0000593885 00000 n +0000596783 00000 n +0000596912 00000 n +0000600828 00000 n +0000600162 00000 n +0000597134 00000 n +0000600635 00000 n +0000600763 00000 n +0000600318 00000 n +0000600479 00000 n +0000604377 00000 n +0000603736 00000 n +0000600999 00000 n +0000604053 00000 n +0000603883 00000 n +0000604247 00000 n +0000604312 00000 n +0000608258 00000 n +0000607755 00000 n +0000604562 00000 n +0000608064 00000 n +0000608193 00000 n +0000607902 00000 n +0000612840 00000 n +0000612465 00000 n +0000608429 00000 n +0000612775 00000 n +0000612612 00000 n +0001150096 00000 n +0000721222 00000 n +0000616751 00000 n +0000616113 00000 n +0000612968 00000 n +0000616429 00000 n +0000616558 00000 n +0000616260 00000 n +0000616686 00000 n +0000650897 00000 n +0000619342 00000 n +0000619151 00000 n +0000616878 00000 n +0000619277 00000 n +0000623421 00000 n +0000622974 00000 n +0000619512 00000 n +0000623100 00000 n +0000623356 00000 n +0000627426 00000 n +0000627063 00000 n +0000623535 00000 n +0000627361 00000 n +0000627210 00000 n +0000631476 00000 n +0000631156 00000 n +0000627554 00000 n +0000631282 00000 n +0000631411 00000 n +0000634197 00000 n +0000633748 00000 n +0000631617 00000 n +0000633874 00000 n +0000634003 00000 n +0001150221 00000 n +0000638952 00000 n +0000638289 00000 n +0000634311 00000 n +0000638758 00000 n +0000638445 00000 n +0000638597 00000 n +0000638887 00000 n +0000643220 00000 n +0000642342 00000 n +0000639066 00000 n +0000642643 00000 n +0000642770 00000 n +0000642899 00000 n +0000643027 00000 n +0000642489 00000 n +0000643156 00000 n +0000647500 00000 n +0000647180 00000 n +0000643334 00000 n +0000647306 00000 n +0000651091 00000 n +0000650642 00000 n +0000647642 00000 n +0000650768 00000 n +0000651026 00000 n +0000652846 00000 n +0000652526 00000 n +0000651205 00000 n +0000652652 00000 n +0000654454 00000 n +0000654263 00000 n +0000652960 00000 n +0000654389 00000 n +0001150346 00000 n +0000655844 00000 n +0000655653 00000 n +0000654555 00000 n +0000655779 00000 n +0000659564 00000 n +0000658985 00000 n +0000655945 00000 n +0000659111 00000 n +0000659240 00000 n +0000659369 00000 n +0000659434 00000 n +0000659499 00000 n +0000663668 00000 n +0000663159 00000 n +0000659678 00000 n +0000663474 00000 n +0000663306 00000 n +0000663603 00000 n +0000940220 00000 n +0000669574 00000 n +0000666666 00000 n +0000663782 00000 n +0000669380 00000 n +0000669509 00000 n +0000666939 00000 n +0000667101 00000 n +0000667263 00000 n +0000667425 00000 n +0000667587 00000 n +0000667749 00000 n +0000667920 00000 n +0000668082 00000 n +0000668245 00000 n +0000668407 00000 n +0000668570 00000 n +0000668733 00000 n +0000668896 00000 n +0000669059 00000 n +0000669222 00000 n +0000674681 00000 n +0000672763 00000 n +0000669688 00000 n +0000674616 00000 n +0000672991 00000 n +0000673154 00000 n +0000673321 00000 n +0000673491 00000 n +0000673652 00000 n +0000673814 00000 n +0000673976 00000 n +0000674138 00000 n +0000674301 00000 n +0000674455 00000 n +0000679212 00000 n +0000677852 00000 n +0000674809 00000 n +0000679147 00000 n +0000678053 00000 n +0000678206 00000 n +0000678360 00000 n +0000678511 00000 n +0000678665 00000 n +0000678827 00000 n +0000678987 00000 n +0001150471 00000 n +0000685218 00000 n +0000682863 00000 n +0000679340 00000 n +0000685026 00000 n +0000683109 00000 n +0000683268 00000 n +0000683430 00000 n +0000683590 00000 n +0000683749 00000 n +0000683902 00000 n +0000684065 00000 n +0000684216 00000 n +0000684381 00000 n +0000684547 00000 n +0000684709 00000 n +0000684863 00000 n +0000689308 00000 n +0000688987 00000 n +0000685346 00000 n +0000689113 00000 n +0000689178 00000 n +0000689243 00000 n +0000692079 00000 n +0000691888 00000 n +0000689450 00000 n +0000692014 00000 n +0000696274 00000 n +0000695205 00000 n +0000692237 00000 n +0000695692 00000 n +0000695821 00000 n +0000696079 00000 n +0000695361 00000 n +0000695531 00000 n +0000696144 00000 n +0000696209 00000 n +0000699726 00000 n +0000699406 00000 n +0000696402 00000 n +0000699532 00000 n +0000699597 00000 n +0000699661 00000 n +0000703211 00000 n +0000702890 00000 n +0000699827 00000 n +0000703016 00000 n +0000703081 00000 n +0000703146 00000 n +0001150596 00000 n +0000707135 00000 n +0000706426 00000 n +0000703326 00000 n +0000706552 00000 n +0000706681 00000 n +0000706746 00000 n +0000706811 00000 n +0000706876 00000 n +0000706941 00000 n +0000707070 00000 n +0000711364 00000 n +0000710527 00000 n +0000707249 00000 n +0000710653 00000 n +0000710718 00000 n +0000710783 00000 n +0000710912 00000 n +0000710977 00000 n +0000711042 00000 n +0000711171 00000 n +0000711236 00000 n +0000711300 00000 n +0000714392 00000 n +0000713690 00000 n +0000711492 00000 n +0000713816 00000 n +0000713943 00000 n +0000714070 00000 n +0000714199 00000 n +0000714327 00000 n +0000717093 00000 n +0000716516 00000 n +0000714591 00000 n +0000716642 00000 n +0000716771 00000 n +0000716900 00000 n +0000716965 00000 n +0000717029 00000 n +0000721287 00000 n +0000720967 00000 n +0000717278 00000 n +0000721093 00000 n +0000725052 00000 n +0000724292 00000 n +0000721414 00000 n +0000724599 00000 n +0000724728 00000 n +0000724793 00000 n +0000724858 00000 n +0000724439 00000 n +0001150721 00000 n +0000728740 00000 n +0000728161 00000 n +0000725166 00000 n +0000728287 00000 n +0000728416 00000 n +0000728545 00000 n +0000728610 00000 n +0000728675 00000 n +0000732346 00000 n +0000731451 00000 n +0000728854 00000 n +0000731763 00000 n +0000731598 00000 n +0000731892 00000 n +0000731957 00000 n +0000732022 00000 n +0000732151 00000 n +0000732216 00000 n +0000732281 00000 n +0000940187 00000 n +0000736507 00000 n +0000736057 00000 n +0000732460 00000 n +0000736183 00000 n +0000736312 00000 n +0000736377 00000 n +0000736442 00000 n +0000738387 00000 n +0000738067 00000 n +0000736635 00000 n +0000738193 00000 n +0000958993 00000 n +0000951709 00000 n +0000958813 00000 n +0000738322 00000 n +0000740297 00000 n +0000739848 00000 n +0000738529 00000 n +0000739974 00000 n +0000740103 00000 n +0000740232 00000 n +0000744718 00000 n +0000743775 00000 n +0000740411 00000 n +0000744138 00000 n +0000951388 00000 n +0000942175 00000 n +0000951202 00000 n +0000743922 00000 n +0000744267 00000 n +0000744395 00000 n +0000744524 00000 n +0001150846 00000 n +0000746077 00000 n +0000745886 00000 n +0000744959 00000 n +0000746012 00000 n +0000746518 00000 n +0000746327 00000 n +0000746177 00000 n +0000746453 00000 n +0000749832 00000 n +0000748606 00000 n +0000746560 00000 n +0000749123 00000 n +0000749252 00000 n +0000749381 00000 n +0000749510 00000 n +0000749639 00000 n +0000749768 00000 n +0000748762 00000 n +0000748934 00000 n +0000750287 00000 n +0000750096 00000 n +0000749946 00000 n +0000750222 00000 n +0000753532 00000 n +0000752954 00000 n +0000750329 00000 n +0000753080 00000 n +0000753209 00000 n +0000753338 00000 n +0000753467 00000 n +0000757729 00000 n +0000756510 00000 n +0000753618 00000 n +0000757020 00000 n +0000757149 00000 n +0000757407 00000 n +0000756666 00000 n +0000756845 00000 n +0000757601 00000 n +0000757665 00000 n +0001150971 00000 n +0000764620 00000 n +0000760792 00000 n +0000757885 00000 n +0000760918 00000 n +0000760983 00000 n +0000761048 00000 n +0000761113 00000 n +0000761178 00000 n +0000761243 00000 n +0000761308 00000 n +0000761373 00000 n +0000761438 00000 n +0000761503 00000 n +0000761633 00000 n +0000761698 00000 n +0000761763 00000 n +0000761828 00000 n +0000761893 00000 n +0000761958 00000 n +0000762023 00000 n +0000762088 00000 n +0000762153 00000 n +0000762218 00000 n +0000762283 00000 n +0000762348 00000 n +0000762413 00000 n +0000762478 00000 n +0000762543 00000 n +0000762608 00000 n +0000762673 00000 n +0000762738 00000 n +0000762803 00000 n +0000762868 00000 n +0000762933 00000 n +0000762998 00000 n +0000763063 00000 n +0000763128 00000 n +0000763192 00000 n +0000763257 00000 n +0000763322 00000 n +0000763387 00000 n +0000763452 00000 n +0000763517 00000 n +0000763582 00000 n +0000763647 00000 n +0000763712 00000 n +0000763777 00000 n +0000763842 00000 n +0000763907 00000 n +0000763972 00000 n +0000764037 00000 n +0000764102 00000 n +0000764167 00000 n +0000764232 00000 n +0000764297 00000 n +0000764362 00000 n +0000764427 00000 n +0000764492 00000 n +0000764556 00000 n +0000771268 00000 n +0000767704 00000 n +0000764734 00000 n +0000767830 00000 n +0000767895 00000 n +0000767960 00000 n +0000768025 00000 n +0000768090 00000 n +0000768155 00000 n +0000768220 00000 n +0000768285 00000 n +0000768350 00000 n +0000768415 00000 n +0000768480 00000 n +0000768545 00000 n +0000768609 00000 n +0000768674 00000 n +0000768739 00000 n +0000768804 00000 n +0000768869 00000 n +0000768934 00000 n +0000768999 00000 n +0000769064 00000 n +0000769129 00000 n +0000769194 00000 n +0000769259 00000 n +0000769324 00000 n +0000769388 00000 n +0000769453 00000 n +0000769518 00000 n +0000769583 00000 n +0000769648 00000 n +0000769713 00000 n +0000769778 00000 n +0000769843 00000 n +0000769908 00000 n +0000769973 00000 n +0000770038 00000 n +0000770103 00000 n +0000770168 00000 n +0000770233 00000 n +0000770298 00000 n +0000770363 00000 n +0000770427 00000 n +0000770491 00000 n +0000770555 00000 n +0000770620 00000 n +0000770685 00000 n +0000770750 00000 n +0000770815 00000 n +0000770880 00000 n +0000770945 00000 n +0000771010 00000 n +0000771075 00000 n +0000771140 00000 n +0000771204 00000 n +0000777443 00000 n +0000774005 00000 n +0000771382 00000 n +0000774131 00000 n +0000774196 00000 n +0000774261 00000 n +0000774326 00000 n +0000774391 00000 n +0000774456 00000 n +0000774521 00000 n +0000774586 00000 n +0000774651 00000 n +0000774716 00000 n +0000774781 00000 n +0000774846 00000 n +0000774911 00000 n +0000774976 00000 n +0000775041 00000 n +0000775106 00000 n +0000775171 00000 n +0000775236 00000 n +0000775301 00000 n +0000775366 00000 n +0000775431 00000 n +0000775496 00000 n +0000775561 00000 n +0000775626 00000 n +0000775691 00000 n +0000775756 00000 n +0000775821 00000 n +0000775886 00000 n +0000775951 00000 n +0000776016 00000 n +0000776081 00000 n +0000776146 00000 n +0000776211 00000 n +0000776276 00000 n +0000776340 00000 n +0000776405 00000 n +0000776470 00000 n +0000776535 00000 n +0000776600 00000 n +0000776665 00000 n +0000776730 00000 n +0000776795 00000 n +0000776860 00000 n +0000776925 00000 n +0000776990 00000 n +0000777055 00000 n +0000777120 00000 n +0000777185 00000 n +0000777250 00000 n +0000777315 00000 n +0000777379 00000 n +0000782962 00000 n +0000780566 00000 n +0000777557 00000 n +0000780692 00000 n +0000780757 00000 n +0000780822 00000 n +0000780887 00000 n +0000780952 00000 n +0000781017 00000 n +0000781082 00000 n +0000781147 00000 n +0000781212 00000 n +0000781277 00000 n +0000781342 00000 n +0000781407 00000 n +0000781472 00000 n +0000781536 00000 n +0000781601 00000 n +0000781666 00000 n +0000781731 00000 n +0000781796 00000 n +0000781861 00000 n +0000781926 00000 n +0000781991 00000 n +0000782056 00000 n +0000782121 00000 n +0000782186 00000 n +0000782251 00000 n +0000782379 00000 n +0000782508 00000 n +0000782573 00000 n +0000782638 00000 n +0000782703 00000 n +0000782768 00000 n +0000782897 00000 n +0000786171 00000 n +0000785464 00000 n +0000783089 00000 n +0000785590 00000 n +0000785719 00000 n +0000785848 00000 n +0000785977 00000 n +0000786106 00000 n +0000789663 00000 n +0000788906 00000 n +0000786298 00000 n +0000789213 00000 n +0000789342 00000 n +0000789053 00000 n +0000789470 00000 n +0000789598 00000 n +0001151096 00000 n +0000792907 00000 n +0000792329 00000 n +0000789790 00000 n +0000792455 00000 n +0000792584 00000 n +0000792713 00000 n +0000792842 00000 n +0000795815 00000 n +0000795495 00000 n +0000793021 00000 n +0000795621 00000 n +0000795750 00000 n +0000798405 00000 n +0000797956 00000 n +0000795985 00000 n +0000798082 00000 n +0000798211 00000 n +0000798340 00000 n +0000798846 00000 n +0000798655 00000 n +0000798505 00000 n +0000798781 00000 n +0000801558 00000 n +0000800914 00000 n +0000798888 00000 n +0000801040 00000 n +0000801169 00000 n +0000801298 00000 n +0000801363 00000 n +0000801428 00000 n +0000801493 00000 n +0000805898 00000 n +0000805578 00000 n +0000801672 00000 n +0000805704 00000 n +0000805769 00000 n +0000805834 00000 n +0001151221 00000 n +0000809501 00000 n +0000809246 00000 n +0000806054 00000 n +0000809372 00000 n +0000809437 00000 n +0000812752 00000 n +0000812561 00000 n +0000809643 00000 n +0000812687 00000 n +0000816472 00000 n +0000816216 00000 n +0000812880 00000 n +0000816342 00000 n +0000816407 00000 n +0000819457 00000 n +0000818749 00000 n +0000816614 00000 n +0000818875 00000 n +0000818940 00000 n +0000819005 00000 n +0000819070 00000 n +0000819135 00000 n +0000819264 00000 n +0000819329 00000 n +0000819393 00000 n +0000824126 00000 n +0000823870 00000 n +0000819599 00000 n +0000823996 00000 n +0000824061 00000 n +0000827136 00000 n +0000826363 00000 n +0000824254 00000 n +0000826489 00000 n +0000826554 00000 n +0000826619 00000 n +0000826684 00000 n +0000826813 00000 n +0000826878 00000 n +0000826941 00000 n +0000827006 00000 n +0000827071 00000 n +0001151346 00000 n +0000830050 00000 n +0000829535 00000 n +0000827292 00000 n +0000829661 00000 n +0000829726 00000 n +0000829791 00000 n +0000829856 00000 n +0000829921 00000 n +0000829986 00000 n +0000833413 00000 n +0000832833 00000 n +0000830206 00000 n +0000832959 00000 n +0000833088 00000 n +0000833153 00000 n +0000833218 00000 n +0000833283 00000 n +0000833348 00000 n +0000836865 00000 n +0000836609 00000 n +0000833555 00000 n +0000836735 00000 n +0000836800 00000 n +0000839817 00000 n +0000839173 00000 n +0000836993 00000 n +0000839299 00000 n +0000839364 00000 n +0000839429 00000 n +0000839494 00000 n +0000839688 00000 n +0000839753 00000 n +0000843410 00000 n +0000843089 00000 n +0000839986 00000 n +0000843215 00000 n +0000843280 00000 n +0000843345 00000 n +0000847001 00000 n +0000846810 00000 n +0000843538 00000 n +0000846936 00000 n +0001151471 00000 n +0000850467 00000 n +0000850146 00000 n +0000847129 00000 n +0000850272 00000 n +0000850337 00000 n +0000850402 00000 n +0000853121 00000 n +0000852412 00000 n +0000850608 00000 n +0000852538 00000 n +0000852603 00000 n +0000852668 00000 n +0000852733 00000 n +0000852862 00000 n +0000852927 00000 n +0000852992 00000 n +0000853057 00000 n +0000856146 00000 n +0000855437 00000 n +0000853277 00000 n +0000855563 00000 n +0000855628 00000 n +0000855692 00000 n +0000855757 00000 n +0000855951 00000 n +0000856016 00000 n +0000856081 00000 n +0000859703 00000 n +0000859382 00000 n +0000856302 00000 n +0000859508 00000 n +0000859573 00000 n +0000859638 00000 n +0000862872 00000 n +0000862162 00000 n +0000859817 00000 n +0000862288 00000 n +0000862353 00000 n +0000862418 00000 n +0000862483 00000 n +0000862612 00000 n +0000862677 00000 n +0000862742 00000 n +0000862807 00000 n +0000866522 00000 n +0000866266 00000 n +0000863028 00000 n +0000866392 00000 n +0000866457 00000 n +0001151596 00000 n +0000870179 00000 n +0000869988 00000 n +0000866664 00000 n +0000870114 00000 n +0000873504 00000 n +0000873313 00000 n +0000870307 00000 n +0000873439 00000 n +0000876333 00000 n +0000875626 00000 n +0000873646 00000 n +0000875752 00000 n +0000875817 00000 n +0000875882 00000 n +0000875947 00000 n +0000876076 00000 n +0000876139 00000 n +0000876204 00000 n +0000876269 00000 n +0000879290 00000 n +0000878580 00000 n +0000876489 00000 n +0000878706 00000 n +0000878771 00000 n +0000878836 00000 n +0000878901 00000 n +0000878966 00000 n +0000879095 00000 n +0000879160 00000 n +0000879225 00000 n +0000882589 00000 n +0000882268 00000 n +0000879446 00000 n +0000882394 00000 n +0000882459 00000 n +0000882524 00000 n +0000885820 00000 n +0000885565 00000 n +0000882731 00000 n +0000885691 00000 n +0000885756 00000 n +0001151721 00000 n +0000888915 00000 n +0000888205 00000 n +0000885948 00000 n +0000888331 00000 n +0000888396 00000 n +0000888461 00000 n +0000888590 00000 n +0000888655 00000 n +0000888720 00000 n +0000888785 00000 n +0000888850 00000 n +0000892216 00000 n +0000892025 00000 n +0000889071 00000 n +0000892151 00000 n +0000895278 00000 n +0000894893 00000 n +0000892429 00000 n +0000895019 00000 n +0000895084 00000 n +0000895149 00000 n +0000895214 00000 n +0000897979 00000 n +0000897011 00000 n +0000895519 00000 n +0000897137 00000 n +0000897202 00000 n +0000897267 00000 n +0000897396 00000 n +0000897461 00000 n +0000897526 00000 n +0000897591 00000 n +0000897656 00000 n +0000897721 00000 n +0000897850 00000 n +0000897915 00000 n +0000902482 00000 n +0000902161 00000 n +0000898121 00000 n +0000902287 00000 n +0000902352 00000 n +0000902417 00000 n +0000906226 00000 n +0000905970 00000 n +0000902610 00000 n +0000906096 00000 n +0000906161 00000 n +0001151846 00000 n +0000909658 00000 n +0000909402 00000 n +0000906354 00000 n +0000909528 00000 n +0000909593 00000 n +0000912237 00000 n +0000911659 00000 n +0000909786 00000 n +0000911785 00000 n +0000911850 00000 n +0000911915 00000 n +0000911979 00000 n +0000912108 00000 n +0000912173 00000 n +0000916238 00000 n +0000915787 00000 n +0000912392 00000 n +0000915913 00000 n +0000915978 00000 n +0000916043 00000 n +0000916108 00000 n +0000916173 00000 n +0000919568 00000 n +0000918923 00000 n +0000916380 00000 n +0000919049 00000 n +0000919114 00000 n +0000919179 00000 n +0000919308 00000 n +0000919373 00000 n +0000919438 00000 n +0000919503 00000 n +0000922129 00000 n +0000921873 00000 n +0000919724 00000 n +0000921999 00000 n +0000922064 00000 n +0000925614 00000 n +0000924840 00000 n +0000922271 00000 n +0000924966 00000 n +0000925031 00000 n +0000925096 00000 n +0000925161 00000 n +0000925289 00000 n +0000925354 00000 n +0000925419 00000 n +0000925484 00000 n +0000925549 00000 n +0001151971 00000 n +0000928689 00000 n +0000928110 00000 n +0000925770 00000 n +0000928236 00000 n +0000928301 00000 n +0000928366 00000 n +0000928431 00000 n +0000928560 00000 n +0000928625 00000 n +0000932515 00000 n +0000932067 00000 n +0000928845 00000 n +0000932193 00000 n +0000932258 00000 n +0000932323 00000 n +0000932388 00000 n +0000932452 00000 n +0000934753 00000 n +0000933723 00000 n +0000932671 00000 n +0000933849 00000 n +0000933914 00000 n +0000934043 00000 n +0000934108 00000 n +0000934173 00000 n +0000934237 00000 n +0000934302 00000 n +0000934367 00000 n +0000934496 00000 n +0000934561 00000 n +0000934626 00000 n +0000934691 00000 n +0000937766 00000 n +0000936993 00000 n +0000934895 00000 n +0000937119 00000 n +0000937184 00000 n +0000937249 00000 n +0000937314 00000 n +0000937443 00000 n +0000937507 00000 n +0000937572 00000 n +0000937637 00000 n +0000937701 00000 n +0000940045 00000 n +0000939206 00000 n +0000937908 00000 n +0000939332 00000 n +0000939397 00000 n +0000939462 00000 n +0000939590 00000 n +0000939655 00000 n +0000939720 00000 n +0000939785 00000 n +0000939850 00000 n +0000939915 00000 n +0000939980 00000 n +0000940286 00000 n +0000951630 00000 n +0000959219 00000 n +0000961519 00000 n +0000961488 00000 n +0000965205 00000 n +0000974645 00000 n +0000985380 00000 n +0000997076 00000 n +0001009793 00000 n +0001029027 00000 n +0001049923 00000 n +0001072071 00000 n +0001090327 00000 n +0001093174 00000 n +0001092944 00000 n +0001120592 00000 n +0001147858 00000 n +0001152096 00000 n +0001152221 00000 n +0001152347 00000 n +0001152473 00000 n +0001152599 00000 n +0001152725 00000 n +0001152826 00000 n +0001174542 00000 n +0001198567 00000 n +0001198608 00000 n +0001198648 00000 n +0001198782 00000 n trailer << -/Size 2735 -/Root 2733 0 R -/Info 2734 0 R -/ID [<1DE9D6805D55864A9314F6997A97E945> <1DE9D6805D55864A9314F6997A97E945>] +/Size 2734 +/Root 2732 0 R +/Info 2733 0 R +/ID [<40EA0AA632AFE640B47E33F25D1F78C4> <40EA0AA632AFE640B47E33F25D1F78C4>] >> startxref -1196257 +1199040 %%EOF diff --git a/doc/arm/man.arpaname.html b/doc/arm/man.arpaname.html index 8f0d98c35f5..2bd3903f35f 100644 --- a/doc/arm/man.arpaname.html +++ b/doc/arm/man.arpaname.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,20 +50,20 @@

arpaname {ipaddress ...}

-

DESCRIPTION

+

DESCRIPTION

arpaname translates IP addresses (IPv4 and IPv6) to the corresponding IN-ADDR.ARPA or IP6.ARPA names.

-

SEE ALSO

+

SEE ALSO

BIND 9 Administrator Reference Manual.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.ddns-confgen.html b/doc/arm/man.ddns-confgen.html index 0155dbf658e..bd20aeaf800 100644 --- a/doc/arm/man.ddns-confgen.html +++ b/doc/arm/man.ddns-confgen.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

ddns-confgen [-a algorithm] [-h] [-k keyname] [-r randomfile] [ -s name | -z zone ] [-q] [name]

-

DESCRIPTION

+

DESCRIPTION

ddns-confgen generates a key for use by nsupdate and named. It simplifies configuration @@ -77,7 +77,7 @@

-

OPTIONS

+

OPTIONS

-a algorithm

@@ -144,7 +144,7 @@

-

SEE ALSO

+

SEE ALSO

nsupdate(1), named.conf(5), named(8), @@ -152,7 +152,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dig.html b/doc/arm/man.dig.html index 73b2b887c24..9e845420ee9 100644 --- a/doc/arm/man.dig.html +++ b/doc/arm/man.dig.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -52,7 +52,7 @@

dig [global-queryopt...] [query...]

-

DESCRIPTION

+

DESCRIPTION

dig (domain information groper) is a flexible tool for interrogating DNS name servers. It performs DNS lookups and @@ -98,7 +98,7 @@

-

SIMPLE USAGE

+

SIMPLE USAGE

A typical invocation of dig looks like:

@@ -144,7 +144,7 @@

-

OPTIONS

+

OPTIONS

The -b option sets the source IP address of the query to address. This must be a valid @@ -248,7 +248,7 @@

-

QUERY OPTIONS

+

QUERY OPTIONS

dig provides a number of query options which affect the way in which lookups are made and the results displayed. Some of @@ -579,7 +579,7 @@

-

MULTIPLE QUERIES

+

MULTIPLE QUERIES

The BIND 9 implementation of dig supports @@ -625,7 +625,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr

-

IDN SUPPORT

+

IDN SUPPORT

If dig has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. @@ -639,14 +639,14 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr

-

FILES

+

FILES

/etc/resolv.conf

${HOME}/.digrc

-

SEE ALSO

+

SEE ALSO

host(1), named(8), dnssec-keygen(8), @@ -654,7 +654,7 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr

-

BUGS

+

BUGS

There are probably too many query options.

diff --git a/doc/arm/man.dnssec-dsfromkey.html b/doc/arm/man.dnssec-dsfromkey.html index 133bfbc6547..7dae2bdb50a 100644 --- a/doc/arm/man.dnssec-dsfromkey.html +++ b/doc/arm/man.dnssec-dsfromkey.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -51,14 +51,14 @@

dnssec-dsfromkey {-s} [-1] [-2] [-a alg] [-K directory] [-l domain] [-s] [-c class] [-f file] [-A] [-v level] {dnsname}

-

DESCRIPTION

+

DESCRIPTION

dnssec-dsfromkey outputs the Delegation Signer (DS) resource record (RR), as defined in RFC 3658 and RFC 4509, for the given key(s).

-

OPTIONS

+

OPTIONS

-1

@@ -119,7 +119,7 @@

-

EXAMPLE

+

EXAMPLE

To build the SHA-256 DS RR from the Kexample.com.+003+26160 @@ -134,7 +134,7 @@

-

FILES

+

FILES

The keyfile can be designed by the key identification Knnnn.+aaa+iiiii or the full file name @@ -148,13 +148,13 @@

-

CAVEAT

+

CAVEAT

A keyfile error can give a "file not found" even if the file exists.

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, @@ -164,7 +164,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-keyfromlabel.html b/doc/arm/man.dnssec-keyfromlabel.html index 670c85a2d3c..428b6c82b66 100644 --- a/doc/arm/man.dnssec-keyfromlabel.html +++ b/doc/arm/man.dnssec-keyfromlabel.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

dnssec-keyfromlabel {-l label} [-3] [-a algorithm] [-A date/offset] [-c class] [-D date/offset] [-E engine] [-f flag] [-G] [-I date/offset] [-k] [-K directory] [-n nametype] [-P date/offset] [-p protocol] [-R date/offset] [-t type] [-v level] [-y] {name}

-

DESCRIPTION

+

DESCRIPTION

dnssec-keyfromlabel gets keys with the given label from a crypto hardware and builds key files for DNSSEC (Secure DNS), as defined in RFC 2535 @@ -63,7 +63,7 @@

-

OPTIONS

+

OPTIONS

-a algorithm
@@ -182,7 +182,7 @@
-

TIMING OPTIONS

+

TIMING OPTIONS

Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '-', it is interpreted as @@ -229,7 +229,7 @@

-

GENERATED KEY FILES

+

GENERATED KEY FILES

When dnssec-keyfromlabel completes successfully, @@ -268,7 +268,7 @@

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, @@ -276,7 +276,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-keygen.html b/doc/arm/man.dnssec-keygen.html index 3d63f8e32d1..acd1ee1168c 100644 --- a/doc/arm/man.dnssec-keygen.html +++ b/doc/arm/man.dnssec-keygen.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

dnssec-keygen [-a algorithm] [-b keysize] [-n nametype] [-3] [-A date/offset] [-C] [-c class] [-D date/offset] [-E engine] [-e] [-f flag] [-G] [-g generator] [-h] [-I date/offset] [-i interval] [-K directory] [-k] [-P date/offset] [-p protocol] [-q] [-R date/offset] [-r randomdev] [-S key] [-s strength] [-t type] [-v level] [-z] {name}

-

DESCRIPTION

+

DESCRIPTION

dnssec-keygen generates keys for DNSSEC (Secure DNS), as defined in RFC 2535 and RFC 4034. It can also generate keys for use with @@ -64,7 +64,7 @@

-

OPTIONS

+

OPTIONS

-a algorithm
@@ -266,7 +266,7 @@
-

TIMING OPTIONS

+

TIMING OPTIONS

Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '-', it is interpreted as @@ -337,7 +337,7 @@

-

GENERATED KEYS

+

GENERATED KEYS

When dnssec-keygen completes successfully, @@ -383,7 +383,7 @@

-

EXAMPLE

+

EXAMPLE

To generate a 768-bit DSA key for the domain example.com, the following command would be @@ -404,7 +404,7 @@

-

SEE ALSO

+

SEE ALSO

dnssec-signzone(8), BIND 9 Administrator Reference Manual, RFC 2539, @@ -413,7 +413,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-revoke.html b/doc/arm/man.dnssec-revoke.html index 1c9ba5a8184..84fd7170b21 100644 --- a/doc/arm/man.dnssec-revoke.html +++ b/doc/arm/man.dnssec-revoke.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

dnssec-revoke [-hr] [-v level] [-K directory] [-E engine] [-f] {keyfile}

-

DESCRIPTION

+

DESCRIPTION

dnssec-revoke reads a DNSSEC key file, sets the REVOKED bit on the key as defined in RFC 5011, and creates a new pair of key files containing the @@ -58,7 +58,7 @@

-

OPTIONS

+

OPTIONS

-h

@@ -91,14 +91,14 @@

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), BIND 9 Administrator Reference Manual, RFC 5011.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-settime.html b/doc/arm/man.dnssec-settime.html index 19e467e2bbf..5f605b7e0f2 100644 --- a/doc/arm/man.dnssec-settime.html +++ b/doc/arm/man.dnssec-settime.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

dnssec-settime [-f] [-K directory] [-P date/offset] [-A date/offset] [-R date/offset] [-I date/offset] [-D date/offset] [-h] [-v level] [-E engine] {keyfile}

-

DESCRIPTION

+

DESCRIPTION

dnssec-settime reads a DNSSEC private key file and sets the key timing metadata as specified by the -P, -A, @@ -75,7 +75,7 @@

-

OPTIONS

+

OPTIONS

-f

@@ -84,7 +84,9 @@ fail when attempting to update a legacy key. With this option, the key will be recreated in the new format, but with the original key data retained. The key's creation date will be - set to the present time. + set to the present time. If no other values are specified, + then the key's publication and activation dates will also + be set to the present time.

-K directory

@@ -106,7 +108,7 @@

-

TIMING OPTIONS

+

TIMING OPTIONS

Dates can be expressed in the format YYYYMMDD or YYYYMMDDHHMMSS. If the argument begins with a '+' or '-', it is interpreted as @@ -185,7 +187,7 @@

-

PRINTING OPTIONS

+

PRINTING OPTIONS

dnssec-settime can also be used to print the timing metadata associated with a key. @@ -211,7 +213,7 @@

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), dnssec-signzone(8), BIND 9 Administrator Reference Manual, @@ -219,7 +221,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.dnssec-signzone.html b/doc/arm/man.dnssec-signzone.html index 05cea6e9c4b..99189ecce77 100644 --- a/doc/arm/man.dnssec-signzone.html +++ b/doc/arm/man.dnssec-signzone.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

dnssec-signzone [-a] [-c class] [-d directory] [-E engine] [-e end-time] [-f output-file] [-g] [-h] [-K directory] [-k key] [-l domain] [-i interval] [-I input-format] [-j jitter] [-N soa-serial-format] [-o origin] [-O output-format] [-p] [-P] [-r randomdev] [-S] [-s start-time] [-T ttl] [-t] [-u] [-v level] [-x] [-z] [-3 salt] [-H iterations] [-A] {zonefile} [key...]

-

DESCRIPTION

+

DESCRIPTION

dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the @@ -61,7 +61,7 @@

-

OPTIONS

+

OPTIONS

-a

@@ -397,7 +397,7 @@

-

EXAMPLE

+

EXAMPLE

The following command signs the example.com zone with the DSA key generated by dnssec-keygen @@ -427,14 +427,14 @@ db.example.com.signed %

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), BIND 9 Administrator Reference Manual, RFC 4033.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.genrandom.html b/doc/arm/man.genrandom.html index c9ecc8e4c23..502ce20ddcc 100644 --- a/doc/arm/man.genrandom.html +++ b/doc/arm/man.genrandom.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

genrandom [-n number] {size} {filename}

-

DESCRIPTION

+

DESCRIPTION

genrandom generates a file or a set of files containing a specified quantity @@ -59,7 +59,7 @@

-

ARGUMENTS

+

ARGUMENTS

-n number

@@ -70,21 +70,21 @@

The size of the file, in kilobytes, to generate.

-
domain
+
filename

The file name into which random data should be written.

-

SEE ALSO

+

SEE ALSO

rand(3), arc4random(3)

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.host.html b/doc/arm/man.host.html index 73223532cc5..2748e5fc63a 100644 --- a/doc/arm/man.host.html +++ b/doc/arm/man.host.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

host [-aCdlnrsTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait] [-m flag] [-4] [-6] {name} [server]

-

DESCRIPTION

+

DESCRIPTION

host is a simple utility for performing DNS lookups. It is normally used to convert names to IP addresses and vice versa. @@ -202,7 +202,7 @@

-

IDN SUPPORT

+

IDN SUPPORT

If host has been built with IDN (internationalized domain name) support, it can accept and display non-ASCII domain names. @@ -216,12 +216,12 @@

-

FILES

+

FILES

/etc/resolv.conf

-

SEE ALSO

+

SEE ALSO

dig(1), named(8).

diff --git a/doc/arm/man.isc-hmac-fixup.html b/doc/arm/man.isc-hmac-fixup.html index bff6e912e4b..82f5ed4b9aa 100644 --- a/doc/arm/man.isc-hmac-fixup.html +++ b/doc/arm/man.isc-hmac-fixup.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

isc-hmac-fixup {algorithm} {secret}

-

DESCRIPTION

+

DESCRIPTION

Versions of BIND 9 up to and including BIND 9.6 had a bug causing HMAC-SHA* TSIG keys which were longer than the digest length of the @@ -76,7 +76,7 @@

-

SECURITY CONSIDERATIONS

+

SECURITY CONSIDERATIONS

Secrets that have been converted by isc-hmac-fixup are shortened, but as this is how the HMAC protocol works in @@ -87,14 +87,14 @@

-

SEE ALSO

+

SEE ALSO

BIND 9 Administrator Reference Manual, RFC 2104.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named-checkconf.html b/doc/arm/man.named-checkconf.html index d6eff94cc2a..59498b08eda 100644 --- a/doc/arm/man.named-checkconf.html +++ b/doc/arm/man.named-checkconf.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

named-checkconf [-h] [-v] [-j] [-t directory] {filename} [-p] [-z]

-

DESCRIPTION

+

DESCRIPTION

named-checkconf checks the syntax, but not the semantics, of a named configuration file. The file is parsed @@ -70,7 +70,7 @@

-

OPTIONS

+

OPTIONS

-h

@@ -109,21 +109,21 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkconf returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkzone(8), BIND 9 Administrator Reference Manual.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named-checkzone.html b/doc/arm/man.named-checkzone.html index e7d9dc17568..b38ed9b8a2e 100644 --- a/doc/arm/man.named-checkzone.html +++ b/doc/arm/man.named-checkzone.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -51,7 +51,7 @@

named-compilezone [-d] [-j] [-q] [-v] [-c class] [-C mode] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-n mode] [-r mode] [-s style] [-t directory] [-w directory] [-D] [-W mode] {-o filename} {zonename} {filename}

-

DESCRIPTION

+

DESCRIPTION

named-checkzone checks the syntax and integrity of a zone file. It performs the same checks as named does when loading a @@ -71,7 +71,7 @@

-

OPTIONS

+

OPTIONS

-d

@@ -265,14 +265,14 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkzone returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkconf(8), RFC 1035, @@ -280,7 +280,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named-journalprint.html b/doc/arm/man.named-journalprint.html index 11d98a116c6..97b1b227d49 100644 --- a/doc/arm/man.named-journalprint.html +++ b/doc/arm/man.named-journalprint.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

named-journalprint {journal}

-

DESCRIPTION

+

DESCRIPTION

named-journalprint prints the contents of a zone journal file in a human-readable @@ -76,7 +76,7 @@

-

SEE ALSO

+

SEE ALSO

named(8), nsupdate(8), @@ -84,7 +84,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.named.html b/doc/arm/man.named.html index ac45d416fe4..3913d11ac73 100644 --- a/doc/arm/man.named.html +++ b/doc/arm/man.named.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

named [-4] [-6] [-c config-file] [-d debug-level] [-E engine-name] [-f] [-g] [-m flag] [-n #cpus] [-p port] [-s] [-S #max-socks] [-t directory] [-u user] [-v] [-V] [-x cache-file]

-

DESCRIPTION

+

DESCRIPTION

named is a Domain Name System (DNS) server, part of the BIND 9 distribution from ISC. For more @@ -65,7 +65,7 @@

-

OPTIONS

+

OPTIONS

-4

@@ -246,7 +246,7 @@

-

SIGNALS

+

SIGNALS

In routine operation, signals should not be used to control the nameserver; rndc should be used @@ -267,7 +267,7 @@

-

CONFIGURATION

+

CONFIGURATION

The named configuration file is too complex to describe in detail here. A complete description is provided @@ -284,7 +284,7 @@

-

FILES

+

FILES

/etc/named.conf

@@ -297,7 +297,7 @@

-

SEE ALSO

+

SEE ALSO

RFC 1033, RFC 1034, RFC 1035, @@ -310,7 +310,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.nsec3hash.html b/doc/arm/man.nsec3hash.html index 9f1fa6cb3ab..23d14c1aeca 100644 --- a/doc/arm/man.nsec3hash.html +++ b/doc/arm/man.nsec3hash.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -48,7 +48,7 @@

nsec3hash {salt} {algorithm} {iterations} {domain}

-

DESCRIPTION

+

DESCRIPTION

nsec3hash generates an NSEC3 hash based on a set of NSEC3 parameters. This can be used to check the validity @@ -56,7 +56,7 @@

-

ARGUMENTS

+

ARGUMENTS

salt

@@ -80,14 +80,14 @@

-

SEE ALSO

+

SEE ALSO

BIND 9 Administrator Reference Manual, RFC 5155.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.nsupdate.html b/doc/arm/man.nsupdate.html index c5d983ae670..0dd9d7c1e6e 100644 --- a/doc/arm/man.nsupdate.html +++ b/doc/arm/man.nsupdate.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

nsupdate [-d] [-D] [[-g] | [-o] | [-l] | [-y [hmac:]keyname:secret] | [-k keyfile]] [-t timeout] [-u udptimeout] [-r udpretries] [-R randomdev] [-v] [filename]

-

DESCRIPTION

+

DESCRIPTION

nsupdate is used to submit Dynamic DNS Update requests as defined in RFC 2136 to a name server. @@ -210,7 +210,7 @@

-

INPUT FORMAT

+

INPUT FORMAT

nsupdate reads input from filename @@ -498,7 +498,7 @@

-

EXAMPLES

+

EXAMPLES

The examples below show how nsupdate @@ -552,7 +552,7 @@

-

FILES

+

FILES

/etc/resolv.conf

@@ -575,7 +575,7 @@

-

SEE ALSO

+

SEE ALSO

RFC 2136, RFC 3007, @@ -590,7 +590,7 @@

-

BUGS

+

BUGS

The TSIG key is redundantly stored in two separate files. This is a consequence of nsupdate using the DST library diff --git a/doc/arm/man.rndc-confgen.html b/doc/arm/man.rndc-confgen.html index f441b938be4..316f9093d7b 100644 --- a/doc/arm/man.rndc-confgen.html +++ b/doc/arm/man.rndc-confgen.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

rndc-confgen [-a] [-b keysize] [-c keyfile] [-h] [-k keyname] [-p port] [-r randomfile] [-s address] [-t chrootdir] [-u user]

-

DESCRIPTION

+

DESCRIPTION

rndc-confgen generates configuration files for rndc. It can be used as a @@ -66,7 +66,7 @@

-

OPTIONS

+

OPTIONS

-a
@@ -173,7 +173,7 @@
-

EXAMPLES

+

EXAMPLES

To allow rndc to be used with no manual configuration, run @@ -190,7 +190,7 @@

-

SEE ALSO

+

SEE ALSO

rndc(8), rndc.conf(5), named(8), @@ -198,7 +198,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.rndc.conf.html b/doc/arm/man.rndc.conf.html index 456ac38e2ca..e4b3939d01b 100644 --- a/doc/arm/man.rndc.conf.html +++ b/doc/arm/man.rndc.conf.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

rndc.conf

-

DESCRIPTION

+

DESCRIPTION

rndc.conf is the configuration file for rndc, the BIND 9 name server control utility. This file has a similar structure and syntax to @@ -135,7 +135,7 @@

-

EXAMPLE

+

EXAMPLE

       options {
         default-server  localhost;
@@ -209,7 +209,7 @@
     

-

NAME SERVER CONFIGURATION

+

NAME SERVER CONFIGURATION

The name server must be configured to accept rndc connections and to recognize the key specified in the rndc.conf @@ -219,7 +219,7 @@

-

SEE ALSO

+

SEE ALSO

rndc(8), rndc-confgen(8), mmencode(1), @@ -227,7 +227,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/arm/man.rndc.html b/doc/arm/man.rndc.html index 58fa67e0720..bb63abba666 100644 --- a/doc/arm/man.rndc.html +++ b/doc/arm/man.rndc.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

rndc [-b source-address] [-c config-file] [-k key-file] [-s server] [-p port] [-V] [-y key_id] {command}

-

DESCRIPTION

+

DESCRIPTION

rndc controls the operation of a name server. It supersedes the ndc utility @@ -79,7 +79,7 @@

-

OPTIONS

+

OPTIONS

-b source-address

@@ -151,7 +151,7 @@

-

LIMITATIONS

+

LIMITATIONS

rndc does not yet support all the commands of the BIND 8 ndc utility. @@ -165,7 +165,7 @@

-

SEE ALSO

+

SEE ALSO

rndc.conf(5), rndc-confgen(8), named(8), @@ -175,7 +175,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/doc/misc/options b/doc/misc/options index 673abf7bb49..e96e6d0114a 100644 --- a/doc/misc/options +++ b/doc/misc/options @@ -113,7 +113,7 @@ options { dnssec-accept-expired ; dnssec-dnskey-kskonly ; dnssec-enable ; - dnssec-lookaside trust-anchor ; + dnssec-lookaside ( trust-anchor | auto ); dnssec-must-be-secure ; dnssec-secure-to-insecure ; dnssec-validation ( yes | no | auto ); @@ -332,7 +332,7 @@ view { dnssec-accept-expired ; dnssec-dnskey-kskonly ; dnssec-enable ; - dnssec-lookaside trust-anchor ; + dnssec-lookaside ( trust-anchor | auto ); dnssec-must-be-secure ; dnssec-secure-to-insecure ; dnssec-validation ( yes | no | auto ); @@ -459,7 +459,7 @@ view { | * ) ]; alt-transfer-source-v6 ( | * ) [ port ( | * ) ]; - auto-dnssec ( allow | maintain | create | off ); + auto-dnssec ( allow | maintain | off ); check-dup-records ( fail | warn | ignore ); check-integrity ; check-mx ( fail | warn | ignore ); @@ -547,7 +547,7 @@ zone { alt-transfer-source ( | * ) [ port ( | * ) ]; alt-transfer-source-v6 ( | * ) [ port ( | * ) ]; - auto-dnssec ( allow | maintain | create | off ); + auto-dnssec ( allow | maintain | off ); check-dup-records ( fail | warn | ignore ); check-integrity ; check-mx ( fail | warn | ignore ); diff --git a/lib/bind9/api b/lib/bind9/api index 78dd0b402a8..26a5fba6966 100644 --- a/lib/bind9/api +++ b/lib/bind9/api @@ -1,3 +1,3 @@ LIBINTERFACE = 80 -LIBREVISION = 1 +LIBREVISION = 3 LIBAGE = 0 diff --git a/lib/bind9/check.c b/lib/bind9/check.c index 6fa9aa9a5ba..6711f28441b 100644 --- a/lib/bind9/check.c +++ b/lib/bind9/check.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: check.c,v 1.125 2011-01-07 23:47:07 tbox Exp $ */ +/* $Id: check.c,v 1.125.14.6 2011-06-17 07:04:31 each Exp $ */ /*! \file */ @@ -1999,7 +1999,7 @@ check_trusted_key(const cfg_obj_t *key, isc_boolean_t managed, const char *keystr, *keynamestr; dns_fixedname_t fkeyname; dns_name_t *keyname; - isc_buffer_t keydatabuf; + isc_buffer_t b; isc_region_t r; isc_result_t result = ISC_R_SUCCESS; isc_result_t tresult; @@ -2009,9 +2009,20 @@ check_trusted_key(const cfg_obj_t *key, isc_boolean_t managed, flags = cfg_obj_asuint32(cfg_tuple_get(key, "flags")); proto = cfg_obj_asuint32(cfg_tuple_get(key, "protocol")); alg = cfg_obj_asuint32(cfg_tuple_get(key, "algorithm")); + + dns_fixedname_init(&fkeyname); keyname = dns_fixedname_name(&fkeyname); keynamestr = cfg_obj_asstring(cfg_tuple_get(key, "name")); + isc_buffer_init(&b, keynamestr, strlen(keynamestr)); + isc_buffer_add(&b, strlen(keynamestr)); + result = dns_name_fromtext(keyname, &b, dns_rootname, 0, NULL); + if (result != ISC_R_SUCCESS) { + cfg_obj_log(key, logctx, ISC_LOG_WARNING, "bad key name: %s\n", + isc_result_totext(result)); + result = ISC_R_FAILURE; + } + if (flags > 0xffff) { cfg_obj_log(key, logctx, ISC_LOG_WARNING, "flags too big: %u\n", flags); @@ -2041,17 +2052,17 @@ check_trusted_key(const cfg_obj_t *key, isc_boolean_t managed, } } - isc_buffer_init(&keydatabuf, keydata, sizeof(keydata)); + isc_buffer_init(&b, keydata, sizeof(keydata)); keystr = cfg_obj_asstring(cfg_tuple_get(key, "key")); - tresult = isc_base64_decodestring(keystr, &keydatabuf); + tresult = isc_base64_decodestring(keystr, &b); if (tresult != ISC_R_SUCCESS) { cfg_obj_log(key, logctx, ISC_LOG_ERROR, "%s", isc_result_totext(tresult)); result = ISC_R_FAILURE; } else { - isc_buffer_usedregion(&keydatabuf, &r); + isc_buffer_usedregion(&b, &r); if ((alg == DST_ALG_RSASHA1 || alg == DST_ALG_RSAMD5) && r.length > 1 && r.base[0] == 1 && r.base[1] == 3) @@ -2075,9 +2086,16 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, isc_symtab_t *symtab = NULL; isc_result_t result = ISC_R_SUCCESS; isc_result_t tresult = ISC_R_SUCCESS; - cfg_aclconfctx_t actx; + cfg_aclconfctx_t *actx = NULL; const cfg_obj_t *obj; + const cfg_obj_t *options = NULL; isc_boolean_t enablednssec, enablevalidation; + const char *valstr = "no"; + + /* + * Get global options block + */ + (void)cfg_map_get(config, "options", &options); /* * Check that all zone statements are syntactically correct and @@ -2088,7 +2106,7 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, if (tresult != ISC_R_SUCCESS) return (ISC_R_NOMEMORY); - cfg_aclconfctx_init(&actx); + cfg_aclconfctx_create(mctx, &actx); if (voptions != NULL) (void)cfg_map_get(voptions, "zone", &zones); @@ -2103,7 +2121,7 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, const cfg_obj_t *zone = cfg_listelt_value(element); tresult = check_zoneconf(zone, voptions, config, symtab, - vclass, &actx, logctx, mctx); + vclass, actx, logctx, mctx); if (tresult != ISC_R_SUCCESS) result = ISC_R_FAILURE; } @@ -2114,8 +2132,6 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, * Check that forwarding is reasonable. */ if (voptions == NULL) { - const cfg_obj_t *options = NULL; - (void)cfg_map_get(config, "options", &options); if (options != NULL) if (check_forward(options, NULL, logctx) != ISC_R_SUCCESS) @@ -2129,8 +2145,6 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, * Check that dual-stack-servers is reasonable. */ if (voptions == NULL) { - const cfg_obj_t *options = NULL; - (void)cfg_map_get(config, "options", &options); if (options != NULL) if (check_dual_stack(options, logctx) != ISC_R_SUCCESS) result = ISC_R_FAILURE; @@ -2191,8 +2205,8 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, obj = NULL; if (voptions != NULL) (void)cfg_map_get(voptions, "dnssec-enable", &obj); - if (obj == NULL) - (void)cfg_map_get(config, "dnssec-enable", &obj); + if (obj == NULL && options != NULL) + (void)cfg_map_get(options, "dnssec-enable", &obj); if (obj == NULL) enablednssec = ISC_TRUE; else @@ -2201,16 +2215,23 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, obj = NULL; if (voptions != NULL) (void)cfg_map_get(voptions, "dnssec-validation", &obj); - if (obj == NULL) - (void)cfg_map_get(config, "dnssec-validation", &obj); - if (obj == NULL) - enablevalidation = ISC_FALSE; /* XXXMPA Change for 9.5. */ - else + if (obj == NULL && options != NULL) + (void)cfg_map_get(options, "dnssec-validation", &obj); + if (obj == NULL) { + enablevalidation = enablednssec; + valstr = "yes"; + } else if (cfg_obj_isboolean(obj)) { enablevalidation = cfg_obj_asboolean(obj); + valstr = enablevalidation ? "yes" : "no"; + } else { + enablevalidation = ISC_TRUE; + valstr = "auto"; + } if (enablevalidation && !enablednssec) cfg_obj_log(obj, logctx, ISC_LOG_WARNING, - "'dnssec-validation yes;' and 'dnssec-enable no;'"); + "'dnssec-validation %s;' and 'dnssec-enable no;'", + valstr); /* * Check trusted-keys and managed-keys. @@ -2266,25 +2287,25 @@ check_viewconf(const cfg_obj_t *config, const cfg_obj_t *voptions, if (tresult != ISC_R_SUCCESS) result = tresult; - tresult = check_viewacls(&actx, voptions, config, logctx, mctx); + tresult = check_viewacls(actx, voptions, config, logctx, mctx); if (tresult != ISC_R_SUCCESS) result = tresult; - tresult = check_recursionacls(&actx, voptions, viewname, + tresult = check_recursionacls(actx, voptions, viewname, config, logctx, mctx); if (tresult != ISC_R_SUCCESS) result = tresult; - tresult = check_filteraaaa(&actx, voptions, viewname, config, + tresult = check_filteraaaa(actx, voptions, viewname, config, logctx, mctx); if (tresult != ISC_R_SUCCESS) result = tresult; - tresult = check_dns64(&actx, voptions, config, logctx, mctx); + tresult = check_dns64(actx, voptions, config, logctx, mctx); if (tresult != ISC_R_SUCCESS) result = tresult; - cfg_aclconfctx_clear(&actx); + cfg_aclconfctx_detach(&actx); return (result); } @@ -2441,7 +2462,7 @@ bind9_check_controls(const cfg_obj_t *config, isc_log_t *logctx, isc_mem_t *mctx) { isc_result_t result = ISC_R_SUCCESS, tresult; - cfg_aclconfctx_t actx; + cfg_aclconfctx_t *actx = NULL; const cfg_listelt_t *element, *element2; const cfg_obj_t *allow; const cfg_obj_t *control; @@ -2462,7 +2483,7 @@ bind9_check_controls(const cfg_obj_t *config, isc_log_t *logctx, (void)cfg_map_get(config, "key", &keylist); - cfg_aclconfctx_init(&actx); + cfg_aclconfctx_create(mctx, &actx); /* * INET: Check allow clause. @@ -2482,7 +2503,7 @@ bind9_check_controls(const cfg_obj_t *config, isc_log_t *logctx, control = cfg_listelt_value(element2); allow = cfg_tuple_get(control, "allow"); tresult = cfg_acl_fromconfig(allow, config, logctx, - &actx, mctx, 0, &acl); + actx, mctx, 0, &acl); if (acl != NULL) dns_acl_detach(&acl); if (tresult != ISC_R_SUCCESS) @@ -2529,7 +2550,7 @@ bind9_check_controls(const cfg_obj_t *config, isc_log_t *logctx, result = tresult; } } - cfg_aclconfctx_clear(&actx); + cfg_aclconfctx_detach(&actx); return (result); } diff --git a/lib/dns/Makefile.in b/lib/dns/Makefile.in index 45c5c2a4174..5bbf793569f 100644 --- a/lib/dns/Makefile.in +++ b/lib/dns/Makefile.in @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.176 2011-01-13 01:59:27 marka Exp $ +# $Id: Makefile.in,v 1.176.8.2 2011-03-10 04:29:17 each Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -97,11 +97,13 @@ DNSSRCS = acache.c acl.c adb.c byaddr.c \ stats.c tcpmsg.c time.c timer.c tkey.c \ tsec.c tsig.c ttl.c validator.c \ version.c view.c xfrin.c zone.c zonekey.c zt.c ${OTHERSRCS} + SRCS = ${DSTSRCS} ${DNSSRCS} -SUBDIRS = include +SUBDIRS = include TARGETS = include/dns/enumtype.h include/dns/enumclass.h \ include/dns/rdatastruct.h timestamp +TESTDIRS = @UNITTESTS@ DEPENDEXTRA = ./gen -F include/dns/rdatastruct.h \ -s ${srcdir} -d >> Makefile ; diff --git a/lib/dns/acl.c b/lib/dns/acl.c index 118e3944882..9880216af4b 100644 --- a/lib/dns/acl.c +++ b/lib/dns/acl.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: acl.c,v 1.53 2009-01-17 23:47:42 tbox Exp $ */ +/* $Id: acl.c,v 1.53.426.2 2011-06-17 23:47:11 tbox Exp $ */ /*! \file */ @@ -99,6 +99,7 @@ static isc_result_t dns_acl_anyornone(isc_mem_t *mctx, isc_boolean_t neg, dns_acl_t **target) { isc_result_t result; dns_acl_t *acl = NULL; + result = dns_acl_create(mctx, 0, &acl); if (result != ISC_R_SUCCESS) return (result); @@ -341,7 +342,6 @@ dns_acl_merge(dns_acl_t *dest, dns_acl_t *source, isc_boolean_t pos) } } - /* * Merge the iptables. Make sure the destination ACL's * node_count value is set correctly afterward. @@ -439,6 +439,7 @@ dns_aclelement_match(const isc_netaddr_t *reqaddr, void dns_acl_attach(dns_acl_t *source, dns_acl_t **target) { REQUIRE(DNS_ACL_VALID(source)); + isc_refcount_increment(&source->refcount, NULL); *target = source; } @@ -446,6 +447,9 @@ dns_acl_attach(dns_acl_t *source, dns_acl_t **target) { static void destroy(dns_acl_t *dacl) { unsigned int i; + + INSIST(!ISC_LINK_LINKED(dacl, nextincache)); + for (i = 0; i < dacl->length; i++) { dns_aclelement_t *de = &dacl->elements[i]; if (de->type == dns_aclelementtype_keyname) { @@ -470,7 +474,9 @@ void dns_acl_detach(dns_acl_t **aclp) { dns_acl_t *acl = *aclp; unsigned int refs; + REQUIRE(DNS_ACL_VALID(acl)); + isc_refcount_decrement(&acl->refcount, &refs); if (refs == 0) destroy(acl); @@ -590,6 +596,7 @@ dns_acl_isinsecure(const dns_acl_t *a) { isc_result_t dns_aclenv_init(isc_mem_t *mctx, dns_aclenv_t *env) { isc_result_t result; + env->localhost = NULL; env->localnets = NULL; result = dns_acl_create(mctx, 0, &env->localhost); diff --git a/lib/dns/adb.c b/lib/dns/adb.c index fcc2dd8ecdb..ba896548638 100644 --- a/lib/dns/adb.c +++ b/lib/dns/adb.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: adb.c,v 1.254 2010-12-21 23:47:08 tbox Exp $ */ +/* $Id: adb.c,v 1.254.14.4 2011-03-13 03:36:47 marka Exp $ */ /*! \file * @@ -910,6 +910,8 @@ import_rdataset(dns_adbname_t *adbname, dns_rdataset_t *rdataset, if (rdataset->trust == dns_trust_glue || rdataset->trust == dns_trust_additional) rdataset->ttl = ADB_CACHE_MINIMUM; + else if (rdataset->trust == dns_trust_ultimate) + rdataset->ttl = 0; else rdataset->ttl = ttlclamp(rdataset->ttl); @@ -2195,7 +2197,6 @@ check_expire_name(dns_adbname_t **namep, isc_stdtime_t now) { static void check_stale_name(dns_adb_t *adb, int bucket, isc_stdtime_t now) { int victims, max_victims; - isc_boolean_t result; dns_adbname_t *victim, *next_victim; isc_boolean_t overmem = isc_mem_isovermem(adb->mctx); int scans = 0; @@ -2217,7 +2218,7 @@ check_stale_name(dns_adb_t *adb, int bucket, isc_stdtime_t now) { INSIST(!NAME_DEAD(victim)); scans++; next_victim = ISC_LIST_PREV(victim, plink); - result = check_expire_name(&victim, now); + (void)check_expire_name(&victim, now); if (victim == NULL) { victims++; goto next; @@ -2762,6 +2763,7 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action, REQUIRE((options & DNS_ADBFIND_ADDRESSMASK) != 0); result = ISC_R_UNEXPECTED; + POST(result); wanted_addresses = (options & DNS_ADBFIND_ADDRESSMASK); wanted_fetches = 0; query_pending = 0; @@ -2813,6 +2815,7 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action, */ bucket = DNS_ADB_INVALIDBUCKET; adbname = find_name_and_lock(adb, name, find->options, &bucket); + INSIST(bucket != DNS_ADB_INVALIDBUCKET); if (adb->name_sd[bucket]) { DP(DEF_LEVEL, "dns_adb_createfind: returning ISC_R_SHUTTINGDOWN"); @@ -3167,6 +3170,7 @@ dns_adb_cancelfind(dns_adbfind_t *find) { } UNLOCK(&adb->namelocks[unlock_bucket]); bucket = DNS_ADB_INVALIDBUCKET; + POST(bucket); cleanup: @@ -3945,6 +3949,7 @@ dns_adb_findaddrinfo(dns_adb_t *adb, isc_sockaddr_t *sa, result = ISC_R_SUCCESS; bucket = DNS_ADB_INVALIDBUCKET; entry = find_entry_and_lock(adb, sa, &bucket, now); + INSIST(bucket != DNS_ADB_INVALIDBUCKET); if (adb->entry_sd[bucket]) { result = ISC_R_SHUTTINGDOWN; goto unlock; diff --git a/lib/dns/api b/lib/dns/api index 9bac0602bdc..d724b616547 100644 --- a/lib/dns/api +++ b/lib/dns/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 82 -LIBREVISION = 3 -LIBAGE = 1 +LIBINTERFACE = 84 +LIBREVISION = 1 +LIBAGE = 3 diff --git a/lib/dns/cache.c b/lib/dns/cache.c index bf93da2d098..eb32c6c8d38 100644 --- a/lib/dns/cache.c +++ b/lib/dns/cache.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: cache.c,v 1.87 2009-11-12 23:43:02 each Exp $ */ +/* $Id: cache.c,v 1.87.262.2 2011-03-03 23:47:09 tbox Exp $ */ /*! \file */ @@ -40,6 +40,8 @@ #include #include +#include "rbtdb.h" + #define CACHE_MAGIC ISC_MAGIC('$', '$', '$', '$') #define VALID_CACHE(cache) ISC_MAGIC_VALID(cache, CACHE_MAGIC) @@ -121,7 +123,8 @@ struct dns_cache { unsigned int magic; isc_mutex_t lock; isc_mutex_t filelock; - isc_mem_t *mctx; + isc_mem_t *mctx; /* Main cache memory */ + isc_mem_t *hmctx; /* Heap memory */ char *name; /* Locked by 'lock'. */ @@ -168,41 +171,54 @@ cache_create_db(dns_cache_t *cache, dns_db_t **db) { } isc_result_t -dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, +dns_cache_create(isc_mem_t *cmctx, isc_taskmgr_t *taskmgr, isc_timermgr_t *timermgr, dns_rdataclass_t rdclass, const char *db_type, unsigned int db_argc, char **db_argv, dns_cache_t **cachep) { - return (dns_cache_create2(mctx, taskmgr, timermgr, rdclass, "", + return (dns_cache_create3(cmctx, cmctx, taskmgr, timermgr, rdclass, "", db_type, db_argc, db_argv, cachep)); } isc_result_t -dns_cache_create2(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, +dns_cache_create2(isc_mem_t *cmctx, isc_taskmgr_t *taskmgr, + isc_timermgr_t *timermgr, dns_rdataclass_t rdclass, + const char *cachename, const char *db_type, + unsigned int db_argc, char **db_argv, dns_cache_t **cachep) +{ + return (dns_cache_create3(cmctx, cmctx, taskmgr, timermgr, rdclass, + cachename, db_type, db_argc, db_argv, + cachep)); +} + +isc_result_t +dns_cache_create3(isc_mem_t *cmctx, isc_mem_t *hmctx, isc_taskmgr_t *taskmgr, isc_timermgr_t *timermgr, dns_rdataclass_t rdclass, const char *cachename, const char *db_type, unsigned int db_argc, char **db_argv, dns_cache_t **cachep) { isc_result_t result; dns_cache_t *cache; - int i; + int i, extra = 0; isc_task_t *dbtask; REQUIRE(cachep != NULL); REQUIRE(*cachep == NULL); - REQUIRE(mctx != NULL); + REQUIRE(cmctx != NULL); + REQUIRE(hmctx != NULL); REQUIRE(cachename != NULL); - cache = isc_mem_get(mctx, sizeof(*cache)); + cache = isc_mem_get(cmctx, sizeof(*cache)); if (cache == NULL) return (ISC_R_NOMEMORY); - cache->mctx = NULL; - isc_mem_attach(mctx, &cache->mctx); + cache->mctx = cache->hmctx = NULL; + isc_mem_attach(cmctx, &cache->mctx); + isc_mem_attach(hmctx, &cache->hmctx); cache->name = NULL; if (cachename != NULL) { - cache->name = isc_mem_strdup(mctx, cachename); + cache->name = isc_mem_strdup(cmctx, cachename); if (cache->name == NULL) { result = ISC_R_NOMEMORY; goto cleanup_mem; @@ -221,26 +237,38 @@ dns_cache_create2(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, cache->live_tasks = 0; cache->rdclass = rdclass; - cache->db_type = isc_mem_strdup(mctx, db_type); + cache->db_type = isc_mem_strdup(cmctx, db_type); if (cache->db_type == NULL) { result = ISC_R_NOMEMORY; goto cleanup_filelock; } - cache->db_argc = db_argc; - if (cache->db_argc == 0) - cache->db_argv = NULL; - else { - cache->db_argv = isc_mem_get(mctx, + /* + * For databases of type "rbt" we pass hmctx to dns_db_create() + * via cache->db_argv, followed by the rest of the arguments in + * db_argv (of which there really shouldn't be any). + */ + if (strcmp(cache->db_type, "rbt") == 0) + extra = 1; + + cache->db_argc = db_argc + extra; + cache->db_argv = NULL; + + if (cache->db_argc != 0) { + cache->db_argv = isc_mem_get(cmctx, cache->db_argc * sizeof(char *)); if (cache->db_argv == NULL) { result = ISC_R_NOMEMORY; goto cleanup_dbtype; } + for (i = 0; i < cache->db_argc; i++) cache->db_argv[i] = NULL; - for (i = 0; i < cache->db_argc; i++) { - cache->db_argv[i] = isc_mem_strdup(mctx, db_argv[i]); + + cache->db_argv[0] = (char *) hmctx; + for (i = extra; i < cache->db_argc; i++) { + cache->db_argv[i] = isc_mem_strdup(cmctx, + db_argv[i - extra]); if (cache->db_argv[i] == NULL) { result = ISC_R_NOMEMORY; goto cleanup_dbargv; @@ -248,6 +276,9 @@ dns_cache_create2(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, } } + /* + * Create the database + */ cache->db = NULL; result = cache_create_db(cache, &cache->db); if (result != ISC_R_SUCCESS) @@ -284,29 +315,28 @@ dns_cache_create2(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, cleanup_db: dns_db_detach(&cache->db); cleanup_dbargv: - for (i = 0; i < cache->db_argc; i++) + for (i = extra; i < cache->db_argc; i++) if (cache->db_argv[i] != NULL) - isc_mem_free(mctx, cache->db_argv[i]); + isc_mem_free(cmctx, cache->db_argv[i]); if (cache->db_argv != NULL) - isc_mem_put(mctx, cache->db_argv, + isc_mem_put(cmctx, cache->db_argv, cache->db_argc * sizeof(char *)); cleanup_dbtype: - isc_mem_free(mctx, cache->db_type); + isc_mem_free(cmctx, cache->db_type); cleanup_filelock: DESTROYLOCK(&cache->filelock); cleanup_lock: DESTROYLOCK(&cache->lock); cleanup_mem: if (cache->name != NULL) - isc_mem_free(mctx, cache->name); - isc_mem_put(mctx, cache, sizeof(*cache)); - isc_mem_detach(&mctx); + isc_mem_free(cmctx, cache->name); + isc_mem_detach(&cache->hmctx); + isc_mem_putanddetach(&cache->mctx, cache, sizeof(*cache)); return (result); } static void cache_free(dns_cache_t *cache) { - isc_mem_t *mctx; int i; REQUIRE(VALID_CACHE(cache)); @@ -337,7 +367,14 @@ cache_free(dns_cache_t *cache) { dns_db_detach(&cache->db); if (cache->db_argv != NULL) { - for (i = 0; i < cache->db_argc; i++) + /* + * We don't free db_argv[0] in "rbt" cache databases + * as it's a pointer to hmctx + */ + int extra = 0; + if (strcmp(cache->db_type, "rbt") == 0) + extra = 1; + for (i = extra; i < cache->db_argc; i++) if (cache->db_argv[i] != NULL) isc_mem_free(cache->mctx, cache->db_argv[i]); isc_mem_put(cache->mctx, cache->db_argv, @@ -352,10 +389,10 @@ cache_free(dns_cache_t *cache) { DESTROYLOCK(&cache->lock); DESTROYLOCK(&cache->filelock); + cache->magic = 0; - mctx = cache->mctx; - isc_mem_put(cache->mctx, cache, sizeof(*cache)); - isc_mem_detach(&mctx); + isc_mem_detach(&cache->hmctx); + isc_mem_putanddetach(&cache->mctx, cache, sizeof(*cache)); } diff --git a/lib/dns/client.c b/lib/dns/client.c index e55ea1f2bc4..77a419e20d6 100644 --- a/lib/dns/client.c +++ b/lib/dns/client.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: client.c,v 1.12 2010-12-03 12:03:22 marka Exp $ */ +/* $Id: client.c,v 1.12.24.2 2011-03-12 04:59:16 tbox Exp $ */ #include @@ -721,7 +721,7 @@ view_find(resctx_t *rctx, dns_db_t **dbp, dns_dbnode_t **nodep, static void client_resfind(resctx_t *rctx, dns_fetchevent_t *event) { isc_mem_t *mctx; - isc_result_t result, tresult; + isc_result_t tresult, result = ISC_R_SUCCESS; isc_result_t vresult = ISC_R_SUCCESS; isc_boolean_t want_restart; isc_boolean_t send_event = ISC_FALSE; @@ -741,7 +741,6 @@ client_resfind(resctx_t *rctx, dns_fetchevent_t *event) { mctx = rctx->view->mctx; - result = ISC_R_SUCCESS; name = dns_fixedname_name(&rctx->name); do { @@ -782,6 +781,7 @@ client_resfind(resctx_t *rctx, dns_fetchevent_t *event) { goto done; } } else { + INSIST(event != NULL); INSIST(event->fetch == rctx->fetch); dns_resolver_destroyfetch(&rctx->fetch); db = event->db; @@ -965,6 +965,7 @@ client_resfind(resctx_t *rctx, dns_fetchevent_t *event) { &rctx->rdataset); if (tresult != ISC_R_SUCCESS) { result = tresult; + POST(result); break; } } @@ -976,6 +977,7 @@ client_resfind(resctx_t *rctx, dns_fetchevent_t *event) { * implementation). */ result = DNS_R_SERVFAIL; /* better code? */ + POST(result); } else { ISC_LIST_APPEND(rctx->namelist, ansname, link); ansname = NULL; @@ -2131,6 +2133,7 @@ receive_soa(isc_task_t *task, isc_event_t *event) { reqev = (dns_requestevent_t *)event; request = reqev->request; result = eresult = reqev->result; + POST(result); uctx = reqev->ev_arg; client = uctx->client; soaquery = uctx->soaquery; @@ -2177,6 +2180,7 @@ receive_soa(isc_task_t *task, isc_event_t *event) { } section = DNS_SECTION_ANSWER; + POST(section); if (rcvmsg->rcode != dns_rcode_noerror && rcvmsg->rcode != dns_rcode_nxdomain) { diff --git a/lib/dns/diff.c b/lib/dns/diff.c index 3dbb5cf6955..a2c99c1c160 100644 --- a/lib/dns/diff.c +++ b/lib/dns/diff.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: diff.c,v 1.23 2009-12-01 00:47:09 each Exp $ */ +/* $Id: diff.c,v 1.23.248.3 2011-03-25 23:53:52 each Exp $ */ /*! \file */ @@ -264,7 +264,6 @@ diff_apply(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver, dns_rdataset_t rds; dns_rdataset_t ardataset; dns_rdataset_t *modified = NULL; - isc_boolean_t offline; op = t->op; type = t->rdata.type; @@ -301,7 +300,6 @@ diff_apply(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver, CHECK(dns_db_findnsec3node(db, name, ISC_TRUE, &node)); - offline = ISC_FALSE; while (t != NULL && dns_name_equal(&t->name, name) && t->op == op && @@ -323,8 +321,6 @@ diff_apply(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver, namebuf, typebuf, classbuf, (unsigned long) t->ttl, (unsigned long) rdl.ttl); - if (t->rdata.flags & DNS_RDATA_OFFLINE) - offline = ISC_TRUE; ISC_LIST_APPEND(rdl.rdata, &t->rdata, link); t = ISC_LIST_NEXT(t, link); } @@ -377,6 +373,15 @@ diff_apply(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver, diff->resign); dns_db_setsigningtime(db, modified, resign); + if (diff->resign == 0 && + (op == DNS_DIFFOP_ADDRESIGN || + op == DNS_DIFFOP_DELRESIGN)) + isc_log_write( + DIFF_COMMON_LOGARGS, + ISC_LOG_WARNING, + "resign requested " + "with 0 resign " + "interval"); } } else if (result == DNS_R_UNCHANGED) { /* @@ -528,7 +533,6 @@ dns_diff_sort(dns_diff_t *diff, dns_diff_compare_func *compare) { v = isc_mem_get(diff->mctx, length * sizeof(dns_difftuple_t *)); if (v == NULL) return (ISC_R_NOMEMORY); - i = 0; for (i = 0; i < length; i++) { p = ISC_LIST_HEAD(diff->tuples); v[i] = p; diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index c07491129e4..486965e4b1d 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dispatch.c,v 1.168.248.1.2.1 2011-06-02 23:47:34 tbox Exp $ */ +/* $Id: dispatch.c,v 1.168.248.4 2011-04-06 10:30:08 marka Exp $ */ /*! \file */ @@ -913,6 +913,12 @@ get_dispsocket(dns_dispatch_t *disp, isc_sockaddr_t *dest, } portentry->refs++; break; + } else if (result == ISC_R_NOPERM) { + char buf[ISC_SOCKADDR_FORMATSIZE]; + isc_sockaddr_format(&localaddr, buf, sizeof(buf)); + dispatch_log(disp, ISC_LOG_WARNING, + "open_socket(%s) -> %s: continuing", + buf, isc_result_totext(result)); } else if (result != ISC_R_ADDRINUSE) break; } @@ -1295,7 +1301,6 @@ udp_recv(isc_event_t *ev_in, dns_dispatch_t *disp, dispsocket_t *dispsock) { * Look at flags. If query, drop it. If response, * look to see where it goes. */ - queue_response = ISC_FALSE; if ((flags & DNS_MESSAGEFLAG_QR) == 0) { /* query */ free_buffer(disp, ev->region.base, ev->region.length); @@ -1554,7 +1559,6 @@ tcp_recv(isc_task_t *task, isc_event_t *ev_in) { * Look at flags. If query, drop it. If response, * look to see where it goes. */ - queue_response = ISC_FALSE; if ((flags & DNS_MESSAGEFLAG_QR) == 0) { /* * Query. @@ -2373,9 +2377,9 @@ qid_allocate(dns_dispatchmgr_t *mgr, unsigned int buckets, qid->sock_table = isc_mem_get(mgr->mctx, buckets * sizeof(dispsocketlist_t)); if (qid->sock_table == NULL) { - isc_mem_put(mgr->mctx, qid, sizeof(*qid)); isc_mem_put(mgr->mctx, qid->qid_table, buckets * sizeof(dns_displist_t)); + isc_mem_put(mgr->mctx, qid, sizeof(*qid)); return (ISC_R_NOMEMORY); } } @@ -2985,7 +2989,6 @@ dns_dispatch_detach(dns_dispatch_t **dispp) { INSIST(disp->refcount > 0); disp->refcount--; - killit = ISC_FALSE; if (disp->refcount == 0) { if (disp->recv_pending > 0) isc_socket_cancel(disp->socket, disp->task[0], @@ -3258,7 +3261,6 @@ dns_dispatch_removeresponse(dns_dispentry_t **resp, disp->requests--; INSIST(disp->refcount > 0); disp->refcount--; - killit = ISC_FALSE; if (disp->refcount == 0) { if (disp->recv_pending > 0) isc_socket_cancel(disp->socket, disp->task[0], diff --git a/lib/dns/dlz.c b/lib/dns/dlz.c index 5a508e9c4bf..e69fc696ccb 100644 --- a/lib/dns/dlz.c +++ b/lib/dns/dlz.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2005, 2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -50,7 +50,7 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dlz.c,v 1.10 2010-12-20 23:47:20 tbox Exp $ */ +/* $Id: dlz.c,v 1.10.14.2 2011-03-12 04:59:16 tbox Exp $ */ /*! \file */ @@ -535,7 +535,6 @@ dns_dlz_writeablezone(dns_view_t *view, const char *zone_name) { isc_buffer_t buffer; dns_fixedname_t fixorigin; dns_name_t *origin; - dns_rdataclass_t zclass; dns_dlzdb_t *dlzdatabase; REQUIRE(DNS_DLZ_VALID(view->dlzdatabase)); @@ -553,8 +552,6 @@ dns_dlz_writeablezone(dns_view_t *view, const char *zone_name) { goto cleanup; origin = dns_fixedname_name(&fixorigin); - zclass = view->rdclass; - /* See if the zone already exists */ result = dns_view_findzone(view, origin, &dupzone); if (result == ISC_R_SUCCESS) { @@ -593,8 +590,6 @@ dns_dlz_writeablezone(dns_view_t *view, const char *zone_name) { */ result = dns_view_addzone(view, zone); - result = ISC_R_SUCCESS; - cleanup: if (zone != NULL) dns_zone_detach(&zone); diff --git a/lib/dns/dns64.c b/lib/dns/dns64.c index 180c0a9bf15..b2b4138f43c 100644 --- a/lib/dns/dns64.c +++ b/lib/dns/dns64.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dns64.c,v 1.6 2010-12-09 04:59:09 marka Exp $ */ +/* $Id: dns64.c,v 1.6.22.2 2011-03-12 04:59:16 tbox Exp $ */ #include @@ -253,6 +253,8 @@ dns_dns64_aaaaok(const dns_dns64_t *dns64, const isc_netaddr_t *reqaddr, */ if (dns64->excluded == NULL) { answer = ISC_TRUE; + if (aaaaok == NULL) + goto done; for (i = 0; i < aaaaoklen; i++) aaaaok[i] = ISC_TRUE; goto done; diff --git a/lib/dns/dnssec.c b/lib/dns/dnssec.c index dc249b73266..6dc42a0f144 100644 --- a/lib/dns/dnssec.c +++ b/lib/dns/dnssec.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -16,7 +16,7 @@ */ /* - * $Id: dnssec.c,v 1.119 2010-01-13 23:48:59 tbox Exp $ + * $Id: dnssec.c,v 1.119.170.4 2011-05-06 21:07:50 each Exp $ */ /*! \file */ @@ -543,9 +543,9 @@ dns_dnssec_verify(dns_name_t *name, dns_rdataset_t *set, dst_key_t *key, } static isc_boolean_t -key_active(dst_key_t *key) { +key_active(dst_key_t *key, isc_stdtime_t now) { isc_result_t result; - isc_stdtime_t now, publish, active, revoke, inactive, delete; + isc_stdtime_t publish, active, revoke, inactive, delete; isc_boolean_t pubset = ISC_FALSE, actset = ISC_FALSE; isc_boolean_t revset = ISC_FALSE, inactset = ISC_FALSE; isc_boolean_t delset = ISC_FALSE; @@ -553,6 +553,7 @@ key_active(dst_key_t *key) { /* Is this an old-style key? */ result = dst_key_getprivateformat(key, &major, &minor); + RUNTIME_CHECK(result == ISC_R_SUCCESS); /* * Smart signing started with key format 1.3; prior to that, all @@ -561,8 +562,6 @@ key_active(dst_key_t *key) { if (major == 1 && minor <= 2) return (ISC_TRUE); - isc_stdtime_get(&now); - result = dst_key_gettime(key, DST_TIME_PUBLISH, &publish); if (result == ISC_R_SUCCESS) pubset = ISC_TRUE; @@ -610,10 +609,13 @@ dns_dnssec_findzonekeys2(dns_db_t *db, dns_dbversion_t *ver, isc_result_t result; dst_key_t *pubkey = NULL; unsigned int count = 0; + isc_stdtime_t now; REQUIRE(nkeys != NULL); REQUIRE(keys != NULL); + isc_stdtime_get(&now); + *nkeys = 0; dns_rdataset_init(&rdataset); RETERR(dns_db_findrdataset(db, node, ver, dns_rdatatype_dnskey, 0, 0, @@ -692,7 +694,7 @@ dns_dnssec_findzonekeys2(dns_db_t *db, dns_dbversion_t *ver, /* * If a key is marked inactive, skip it */ - if (!key_active(keys[count])) { + if (!key_active(keys[count], now)) { dst_key_free(&keys[count]); keys[count] = pubkey; pubkey = NULL; @@ -1016,13 +1018,6 @@ dns_dnssec_selfsigns(dns_rdata_t *rdata, dns_name_t *name, dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset, isc_boolean_t ignoretime, isc_mem_t *mctx) { - dst_key_t *dstkey = NULL; - dns_keytag_t keytag; - dns_rdata_dnskey_t key; - dns_rdata_rrsig_t sig; - dns_rdata_t sigrdata = DNS_RDATA_INIT; - isc_result_t result; - INSIST(rdataset->type == dns_rdatatype_key || rdataset->type == dns_rdatatype_dnskey); if (rdataset->type == dns_rdatatype_key) { @@ -1033,6 +1028,27 @@ dns_dnssec_selfsigns(dns_rdata_t *rdata, dns_name_t *name, INSIST(sigrdataset->covers == dns_rdatatype_dnskey); } + return (dns_dnssec_signs(rdata, name, rdataset, sigrdataset, + ignoretime, mctx)); + +} + +isc_boolean_t +dns_dnssec_signs(dns_rdata_t *rdata, dns_name_t *name, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset, + isc_boolean_t ignoretime, isc_mem_t *mctx) +{ + dst_key_t *dstkey = NULL; + dns_keytag_t keytag; + dns_rdata_dnskey_t key; + dns_rdata_rrsig_t sig; + dns_rdata_t sigrdata = DNS_RDATA_INIT; + isc_result_t result; + + INSIST(sigrdataset->type == dns_rdatatype_rrsig); + if (sigrdataset->covers != rdataset->type) + return (ISC_FALSE); + result = dns_dnssec_keyfromrdata(name, rdata, mctx, &dstkey); if (result != ISC_R_SUCCESS) return (ISC_FALSE); @@ -1095,6 +1111,7 @@ dns_dnsseckey_create(isc_mem_t *mctx, dst_key_t **dstkey, /* Is this an old-style key? */ result = dst_key_getprivateformat(dk->key, &major, &minor); + INSIST(result == ISC_R_SUCCESS); /* Smart signing started with key format 1.3 */ dk->legacy = ISC_TF(major == 1 && minor <= 2); @@ -1673,9 +1690,6 @@ dns_dnssec_updatekeys(dns_dnsseckeylist_t *keys, dns_dnsseckeylist_t *newkeys, /* No match found in keys; add the new key. */ if (key2 == NULL) { - dns_dnsseckey_t *next; - - next = ISC_LIST_NEXT(key1, link); ISC_LIST_UNLINK(*newkeys, key1, link); ISC_LIST_APPEND(*keys, key1, link); diff --git a/lib/dns/dst_api.c b/lib/dns/dst_api.c index 1ece3127661..4a06486fc92 100644 --- a/lib/dns/dst_api.c +++ b/lib/dns/dst_api.c @@ -31,7 +31,7 @@ /* * Principal Author: Brian Wellington - * $Id: dst_api.c,v 1.57 2011-01-11 23:47:13 tbox Exp $ + * $Id: dst_api.c,v 1.57.10.1 2011-03-21 19:53:34 each Exp $ */ /*! \file */ @@ -1778,5 +1778,6 @@ dst__entropy_status(void) { isc_buffer_t * dst_key_tkeytoken(const dst_key_t *key) { + REQUIRE(VALID_KEY(key)); return (key->key_tkeytoken); } diff --git a/lib/dns/dst_openssl.h b/lib/dns/dst_openssl.h index 781085b73a0..0fbb1e423e1 100644 --- a/lib/dns/dst_openssl.h +++ b/lib/dns/dst_openssl.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dst_openssl.h,v 1.9 2009-10-06 04:40:14 tbox Exp $ */ +/* $Id: dst_openssl.h,v 1.9.302.2 2011-03-12 04:59:16 tbox Exp $ */ #ifndef DST_OPENSSL_H #define DST_OPENSSL_H 1 @@ -23,13 +23,28 @@ #include #include +#include +#include +#include +#include +#include + +#if !defined(OPENSSL_NO_ENGINE) && defined(CRYPTO_LOCK_ENGINE) && \ + (OPENSSL_VERSION_NUMBER >= 0x0090707f) +#define USE_ENGINE 1 +#endif + ISC_LANG_BEGINDECLS isc_result_t dst__openssl_toresult(isc_result_t fallback); +#ifdef USE_ENGINE ENGINE * dst__openssl_getengine(const char *engine); +#else +#define dst__openssl_getengine(x) NULL +#endif ISC_LANG_ENDDECLS diff --git a/lib/dns/gssapi_link.c b/lib/dns/gssapi_link.c index e14d0eb9716..c443fcbe240 100644 --- a/lib/dns/gssapi_link.c +++ b/lib/dns/gssapi_link.c @@ -16,7 +16,7 @@ */ /* - * $Id: gssapi_link.c,v 1.16 2011-01-11 23:47:13 tbox Exp $ + * $Id: gssapi_link.c,v 1.16.10.1 2011-03-28 05:36:05 marka Exp $ */ #include @@ -181,7 +181,7 @@ gssapi_sign(dst_context_t *dctx, isc_buffer_t *sig) { * allocated space. */ isc_buffer_putmem(sig, gsig.value, gsig.length); - if (gsig.length != 0) + if (gsig.length != 0U) gss_release_buffer(&minor, &gsig); return (ISC_R_SUCCESS); @@ -293,7 +293,7 @@ gssapi_restore(dst_key_t *key, const char *keystr) { isc_result_t result; len = strlen(keystr); - if ((len % 4) != 0) + if ((len % 4) != 0U) return (ISC_R_BADBASE64); len = (len / 4) * 3; @@ -338,7 +338,7 @@ gssapi_dump(dst_key_t *key, isc_mem_t *mctx, char **buffer, int *length) { major, minor); return (ISC_R_FAILURE); } - if (gssbuffer.length == 0) + if (gssbuffer.length == 0U) return (ISC_R_FAILURE); len = ((gssbuffer.length + 2)/3) * 4; buf = isc_mem_get(mctx, len); diff --git a/lib/dns/gssapictx.c b/lib/dns/gssapictx.c index 707745cc313..24f4b9c8916 100644 --- a/lib/dns/gssapictx.c +++ b/lib/dns/gssapictx.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: gssapictx.c,v 1.26 2011-01-10 03:49:49 marka Exp $ */ +/* $Id: gssapictx.c,v 1.26.12.2 2011-04-07 23:05:01 marka Exp $ */ #include @@ -179,7 +179,7 @@ log_cred(const gss_cred_id_t cred) { } if (gret == GSS_S_COMPLETE) { - if (gbuffer.length != 0) { + if (gbuffer.length != 0U) { gret = gss_release_buffer(&minor, &gbuffer); if (gret != GSS_S_COMPLETE) gss_log(3, "failed gss_release_buffer: %s", @@ -604,7 +604,7 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken, /* * RFC 2744 states the a valid output token has a non-zero length. */ - if (gouttoken.length != 0) { + if (gouttoken.length != 0U) { GBUFFER_TO_REGION(gouttoken, r); RETERR(isc_buffer_copyregion(outtoken, &r)); (void)gss_release_buffer(&minor, &gouttoken); @@ -650,8 +650,6 @@ dst_gssapi_acceptctx(gss_cred_id_t cred, REQUIRE(outtoken != NULL && *outtoken == NULL); - log_cred(cred); - REGION_TO_GBUFFER(*intoken, gintoken); if (*ctxout == NULL) @@ -687,6 +685,8 @@ dst_gssapi_acceptctx(gss_cred_id_t cred, #endif } + log_cred(cred); + gret = gss_accept_sec_context(&minor, &context, cred, &gintoken, GSS_C_NO_CHANNEL_BINDINGS, &gname, NULL, &gouttoken, NULL, NULL, NULL); @@ -719,7 +719,7 @@ dst_gssapi_acceptctx(gss_cred_id_t cred, return (result); } - if (gouttoken.length > 0) { + if (gouttoken.length > 0U) { RETERR(isc_buffer_allocate(mctx, outtoken, gouttoken.length)); GBUFFER_TO_REGION(gouttoken, r); RETERR(isc_buffer_copyregion(*outtoken, &r)); @@ -741,7 +741,7 @@ dst_gssapi_acceptctx(gss_cred_id_t cred, * case, since principal names really should not * contain null characters. */ - if (gnamebuf.length > 0 && + if (gnamebuf.length > 0U && ((char *)gnamebuf.value)[gnamebuf.length - 1] == '\0') gnamebuf.length--; @@ -755,7 +755,7 @@ dst_gssapi_acceptctx(gss_cred_id_t cred, RETERR(dns_name_fromtext(principal, &namebuf, dns_rootname, 0, NULL)); - if (gnamebuf.length != 0) { + if (gnamebuf.length != 0U) { gret = gss_release_buffer(&minor, &gnamebuf); if (gret != GSS_S_COMPLETE) gss_log(3, "failed gss_release_buffer: %s", @@ -836,9 +836,9 @@ gss_error_tostring(isc_uint32_t major, isc_uint32_t minor, snprintf(buf, buflen, "GSSAPI error: Major = %s, Minor = %s.", (char *)msg_major.value, (char *)msg_minor.value); - if (msg_major.length != 0) + if (msg_major.length != 0U) (void)gss_release_buffer(&minor_stat, &msg_major); - if (msg_minor.length != 0) + if (msg_minor.length != 0U) (void)gss_release_buffer(&minor_stat, &msg_minor); return(buf); #else diff --git a/lib/dns/include/dns/Makefile.in b/lib/dns/include/dns/Makefile.in index e13d0848bdd..3382cc99983 100644 --- a/lib/dns/include/dns/Makefile.in +++ b/lib/dns/include/dns/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2007-2009 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1998-2003 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.57 2009-10-08 23:48:10 tbox Exp $ +# $Id: Makefile.in,v 1.57.296.2 2011-02-28 01:20:02 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -29,7 +29,7 @@ HEADERS = acl.h adb.h byaddr.h cache.h callbacks.h cert.h compress.h \ peer.h portlist.h private.h rbt.h rcode.h \ rdata.h rdataclass.h rdatalist.h rdataset.h rdatasetiter.h \ rdataslab.h rdatatype.h request.h resolver.h result.h \ - rootns.h sdb.h sdlz.h secalg.h secproto.h soa.h ssu.h \ + rootns.h rpz.h sdb.h sdlz.h secalg.h secproto.h soa.h ssu.h \ tcpmsg.h time.h tkey.h tsig.h ttl.h types.h \ validator.h version.h view.h xfrin.h zone.h zonekey.h zt.h diff --git a/lib/dns/include/dns/acl.h b/lib/dns/include/dns/acl.h index 04f55773d89..d066507ef9f 100644 --- a/lib/dns/include/dns/acl.h +++ b/lib/dns/include/dns/acl.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: acl.h,v 1.33 2009-01-17 23:47:43 tbox Exp $ */ +/* $Id: acl.h,v 1.33.426.2 2011-06-17 23:47:11 tbox Exp $ */ #ifndef DNS_ACL_H #define DNS_ACL_H 1 @@ -145,9 +145,26 @@ dns_acl_merge(dns_acl_t *dest, dns_acl_t *source, isc_boolean_t pos); void dns_acl_attach(dns_acl_t *source, dns_acl_t **target); +/*%< + * Attach to acl 'source'. + * + * Requires: + *\li 'source' to be a valid acl. + *\li 'target' to be non NULL and '*target' to be NULL. + */ void dns_acl_detach(dns_acl_t **aclp); +/*%< + * Detach the acl. On final detach the acl must not be linked on any + * list. + * + * Requires: + *\li '*aclp' to be a valid acl. + * + * Insists: + *\li '*aclp' is not linked on final detach. + */ isc_boolean_t dns_acl_isinsecure(const dns_acl_t *a); diff --git a/lib/dns/include/dns/cache.h b/lib/dns/include/dns/cache.h index e4ea5f48957..225f3bf9890 100644 --- a/lib/dns/include/dns/cache.h +++ b/lib/dns/include/dns/cache.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: cache.h,v 1.28 2009-01-09 23:47:46 tbox Exp $ */ +/* $Id: cache.h,v 1.28.428.2 2011-03-03 23:47:09 tbox Exp $ */ #ifndef DNS_CACHE_H #define DNS_CACHE_H 1 @@ -61,23 +61,36 @@ ISC_LANG_BEGINDECLS ***/ isc_result_t -dns_cache_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, +dns_cache_create(isc_mem_t *cmctx, isc_taskmgr_t *taskmgr, isc_timermgr_t *timermgr, dns_rdataclass_t rdclass, const char *db_type, unsigned int db_argc, char **db_argv, dns_cache_t **cachep); isc_result_t -dns_cache_create2(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, +dns_cache_create2(isc_mem_t *cmctx, isc_taskmgr_t *taskmgr, + isc_timermgr_t *timermgr, dns_rdataclass_t rdclass, + const char *cachename, const char *db_type, + unsigned int db_argc, char **db_argv, dns_cache_t **cachep); +isc_result_t +dns_cache_create3(isc_mem_t *cmctx, isc_mem_t *hmctx, isc_taskmgr_t *taskmgr, isc_timermgr_t *timermgr, dns_rdataclass_t rdclass, const char *cachename, const char *db_type, unsigned int db_argc, char **db_argv, dns_cache_t **cachep); /*%< - * Create a new DNS cache. dns_cache_create2() will create a named cache. - * dns_cache_create() is a backward compatible version that internally specifies - * an empty name. + * Create a new DNS cache. + * + * dns_cache_create2() will create a named cache. + * + * dns_cache_create3() will create a named cache using two separate memory + * contexts, one for cache data which can be cleaned and a separate one for + * memory allocated for the heap (which can grow without an upper limit and + * has no mechanism for shrinking). + * + * dns_cache_create() is a backward compatible version that internally + * specifies an empty cache name and a single memory context. * * Requires: * - *\li 'mctx' is a valid memory context + *\li 'cmctx' (and 'hmctx' if applicable) is a valid memory context. * *\li 'taskmgr' is a valid task manager and 'timermgr' is a valid timer * manager, or both are NULL. If NULL, no periodic cleaning of the diff --git a/lib/dns/include/dns/db.h b/lib/dns/include/dns/db.h index edb1263ab80..b81362272f9 100644 --- a/lib/dns/include/dns/db.h +++ b/lib/dns/include/dns/db.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: db.h,v 1.104 2011-01-13 04:59:25 tbox Exp $ */ +/* $Id: db.h,v 1.104.8.1 2011-05-19 04:42:51 each Exp $ */ #ifndef DNS_DB_H #define DNS_DB_H 1 @@ -1441,7 +1441,9 @@ dns_db_setsigningtime(dns_db_t *db, dns_rdataset_t *rdataset, * * Requires: * \li 'db' is a valid zone database. - * \li 'rdataset' to be associated with 'db'. + * \li 'rdataset' is or is to be associated with 'db'. + * \li 'rdataset' is not pending removed from the heap via an + * uncommitted call to dns_db_resigned(). * * Returns: * \li #ISC_R_SUCCESS @@ -1472,7 +1474,9 @@ dns_db_resigned(dns_db_t *db, dns_rdataset_t *rdataset, * Mark 'rdataset' as not being available to be returned by * dns_db_getsigningtime(). If the changes associated with 'version' * are committed this will be permanent. If the version is not committed - * this change will be rolled back when the version is closed. + * this change will be rolled back when the version is closed. Until + * 'version' is either committed or rolled back, 'rdataset' can no longer + * be acted upon by dns_db_setsigningtime(). * * Requires: * \li 'db' is a valid zone database. diff --git a/lib/dns/include/dns/dlz.h b/lib/dns/include/dns/dlz.h index e04b1b1adc6..29c292691f7 100644 --- a/lib/dns/include/dns/dlz.h +++ b/lib/dns/include/dns/dlz.h @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2005-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2005-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -50,7 +50,7 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dlz.h,v 1.12 2010-12-20 23:47:21 tbox Exp $ */ +/* $Id: dlz.h,v 1.12.14.2 2011-03-17 23:47:06 tbox Exp $ */ /*! \file dns/dlz.h */ @@ -318,9 +318,9 @@ dns_dlzunregister(dns_dlzimplementation_t **dlzimp); */ -isc_result_t -dns_dlz_writeablezone(dns_view_t *view, const char *zone_name); - +typedef isc_result_t dns_dlz_writeablezone_t(dns_view_t *view, + const char *zone_name); +dns_dlz_writeablezone_t dns_dlz_writeablezone; /*%< * creates a writeable DLZ zone. Must be called from within the * configure() method of a DLZ driver. diff --git a/lib/dns/include/dns/dlz_dlopen.h b/lib/dns/include/dns/dlz_dlopen.h new file mode 100644 index 00000000000..3e87d10cdc1 --- /dev/null +++ b/lib/dns/include/dns/dlz_dlopen.h @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id: dlz_dlopen.h,v 1.2.2.2 2011-03-17 09:41:07 fdupont Exp $ */ + +/*! \file dns/dlz_open.h */ + +#ifndef DLZ_DLOPEN_H +#define DLZ_DLOPEN_H + +#include + +ISC_LANG_BEGINDECLS + +/* + * This header provides a minimal set of defines and typedefs needed + * for the entry points of an external DLZ module for bind9. + */ + +#define DLZ_DLOPEN_VERSION 1 + +/* + * dlz_dlopen_version() is required for all DLZ external drivers. It + * should return DLZ_DLOPEN_VERSION + */ +typedef int dlz_dlopen_version_t (unsigned int *flags); + +/* + * dlz_dlopen_create() is required for all DLZ external drivers. + */ +typedef isc_result_t dlz_dlopen_create_t (const char *dlzname, + unsigned int argc, + char *argv[], + void **dbdata, + ...); + +/* + * dlz_dlopen_destroy() is optional, and will be called when the + * driver is unloaded if supplied + */ +typedef void dlz_dlopen_destroy_t (void *dbdata); + +/* + * dlz_dlopen_findzonedb() is required for all DLZ external drivers + */ +typedef isc_result_t dlz_dlopen_findzonedb_t (void *dbdata, + const char *name); + +/* + * dlz_dlopen_lookup() is required for all DLZ external drivers + */ +typedef isc_result_t dlz_dlopen_lookup_t (const char *zone, + const char *name, + void *dbdata, + dns_sdlzlookup_t *lookup); + +/* + * dlz_dlopen_authority is optional() if dlz_dlopen_lookup() + * supplies authority information for the dns record + */ +typedef isc_result_t dlz_dlopen_authority_t (const char *zone, + void *dbdata, + dns_sdlzlookup_t *lookup); + +/* + * dlz_dlopen_allowzonexfr() is optional, and should be supplied if + * you want to support zone transfers + */ +typedef isc_result_t dlz_dlopen_allowzonexfr_t (void *dbdata, + const char *name, + const char *client); + +/* + * dlz_dlopen_allnodes() is optional, but must be supplied if supply a + * dlz_dlopen_allowzonexfr() function + */ +typedef isc_result_t dlz_dlopen_allnodes_t (const char *zone, + void *dbdata, + dns_sdlzallnodes_t *allnodes); + +/* + * dlz_dlopen_newversion() is optional. It should be supplied if you + * want to support dynamic updates. + */ +typedef isc_result_t dlz_dlopen_newversion_t (const char *zone, + void *dbdata, + void **versionp); + +/* + * dlz_closeversion() is optional, but must be supplied if you supply + * a dlz_newversion() function + */ +typedef void dlz_dlopen_closeversion_t (const char *zone, + isc_boolean_t commit, + void *dbdata, + void **versionp); + +/* + * dlz_dlopen_configure() is optional, but must be supplied if you + * want to support dynamic updates + */ +typedef isc_result_t dlz_dlopen_configure_t (dns_view_t *view, + void *dbdata); + +/* + * dlz_dlopen_ssumatch() is optional, but must be supplied if you want + * to support dynamic updates + */ +typedef isc_boolean_t dlz_dlopen_ssumatch_t (const char *signer, + const char *name, + const char *tcpaddr, + const char *type, + const char *key, + isc_uint32_t keydatalen, + unsigned char *keydata, + void *dbdata); + +/* + * dlz_dlopen_addrdataset() is optional, but must be supplied if you + * want to support dynamic updates + */ +typedef isc_result_t dlz_dlopen_addrdataset_t (const char *name, + const char *rdatastr, + void *dbdata, + void *version); + +/* + * dlz_dlopen_subrdataset() is optional, but must be supplied if you + * want to support dynamic updates + */ +typedef isc_result_t dlz_dlopen_subrdataset_t (const char *name, + const char *rdatastr, + void *dbdata, + void *version); + +/* + * dlz_dlopen_delrdataset() is optional, but must be supplied if you + * want to support dynamic updates + */ +typedef isc_result_t dlz_dlopen_delrdataset_t (const char *name, + const char *type, + void *dbdata, + void *version); + +ISC_LANG_ENDDECLS + +#endif diff --git a/lib/dns/include/dns/dnssec.h b/lib/dns/include/dns/dnssec.h index c6d910b3954..354f880336b 100644 --- a/lib/dns/include/dns/dnssec.h +++ b/lib/dns/include/dns/dnssec.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dnssec.h,v 1.42 2010-01-09 23:48:45 tbox Exp $ */ +/* $Id: dnssec.h,v 1.42.178.2 2011-05-06 23:47:05 tbox Exp $ */ #ifndef DNS_DNSSEC_H #define DNS_DNSSEC_H 1 @@ -220,6 +220,19 @@ dns_dnssec_selfsigns(dns_rdata_t *rdata, dns_name_t *name, isc_boolean_t ignoretime, isc_mem_t *mctx); +isc_boolean_t +dns_dnssec_signs(dns_rdata_t *rdata, dns_name_t *name, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset, + isc_boolean_t ignoretime, isc_mem_t *mctx); +/*%< + * Verify that 'rdataset' is validly signed in 'sigrdataset' by + * the key in 'rdata'. + * + * dns_dnssec_selfsigns() requires that rdataset be a DNSKEY or KEY + * rrset. dns_dnssec_signs() works on any rrset. + */ + + isc_result_t dns_dnsseckey_create(isc_mem_t *mctx, dst_key_t **dstkey, dns_dnsseckey_t **dkp); diff --git a/lib/dns/include/dns/masterdump.h b/lib/dns/include/dns/masterdump.h index 684dd82d53b..e5bfe045cef 100644 --- a/lib/dns/include/dns/masterdump.h +++ b/lib/dns/include/dns/masterdump.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: masterdump.h,v 1.42.596.2 2011-06-02 23:47:35 tbox Exp $ */ +/* $Id: masterdump.h,v 1.42.524.2 2011-05-28 00:27:48 tbox Exp $ */ #ifndef DNS_MASTERDUMP_H #define DNS_MASTERDUMP_H 1 diff --git a/lib/dns/include/dns/rdataset.h b/lib/dns/include/dns/rdataset.h index 7f50c12db21..492a1cecec5 100644 --- a/lib/dns/include/dns/rdataset.h +++ b/lib/dns/include/dns/rdataset.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdataset.h,v 1.69.270.3 2011-06-21 20:15:54 each Exp $ */ +/* $Id: rdataset.h,v 1.69.148.3 2011-06-08 23:02:43 each Exp $ */ #ifndef DNS_RDATASET_H #define DNS_RDATASET_H 1 @@ -653,7 +653,7 @@ dns_rdataset_expire(dns_rdataset_t *rdataset); const char * dns_trust_totext(dns_trust_t trust); -/*%< +/* * Display trust in textual form. */ diff --git a/lib/dns/include/dns/resolver.h b/lib/dns/include/dns/resolver.h index 2db1770a6de..9c93fdfb62e 100644 --- a/lib/dns/include/dns/resolver.h +++ b/lib/dns/include/dns/resolver.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.h,v 1.67.86.1.2.1 2011-06-02 23:47:36 tbox Exp $ */ +/* $Id: resolver.h,v 1.67.86.2 2011-02-28 01:20:02 tbox Exp $ */ #ifndef DNS_RESOLVER_H #define DNS_RESOLVER_H 1 diff --git a/lib/dns/include/dns/sdlz.h b/lib/dns/include/dns/sdlz.h index b917cc078b6..76eff3cad23 100644 --- a/lib/dns/include/dns/sdlz.h +++ b/lib/dns/include/dns/sdlz.h @@ -50,7 +50,7 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdlz.h,v 1.14 2011-01-13 08:50:29 tbox Exp $ */ +/* $Id: sdlz.h,v 1.14.8.2 2011-03-17 23:47:06 tbox Exp $ */ /*! \file dns/sdlz.h */ @@ -317,25 +317,33 @@ dns_sdlzunregister(dns_sdlzimplementation_t **sdlzimp); * function is called. */ -isc_result_t -dns_sdlz_putnamedrr(dns_sdlzallnodes_t *allnodes, const char *name, - const char *type, dns_ttl_t ttl, const char *data); +typedef isc_result_t dns_sdlz_putnamedrr_t(dns_sdlzallnodes_t *allnodes, + const char *name, + const char *type, + dns_ttl_t ttl, + const char *data); +dns_sdlz_putnamedrr_t dns_sdlz_putnamedrr; + /*%< * Add a single resource record to the allnodes structure to be later * parsed into a zone transfer response. */ -isc_result_t -dns_sdlz_putrr(dns_sdlzlookup_t *lookup, const char *type, dns_ttl_t ttl, - const char *data); +typedef isc_result_t dns_sdlz_putrr_t(dns_sdlzlookup_t *lookup, + const char *type, + dns_ttl_t ttl, + const char *data); +dns_sdlz_putrr_t dns_sdlz_putrr; /*%< * Add a single resource record to the lookup structure to be later * parsed into a query response. */ -isc_result_t -dns_sdlz_putsoa(dns_sdlzlookup_t *lookup, const char *mname, const char *rname, - isc_uint32_t serial); +typedef isc_result_t dns_sdlz_putsoa_t(dns_sdlzlookup_t *lookup, + const char *mname, + const char *rname, + isc_uint32_t serial); +dns_sdlz_putsoa_t dns_sdlz_putsoa; /*%< * This function may optionally be called from the 'authority' * callback to simplify construction of the SOA record for 'zone'. It @@ -347,9 +355,11 @@ dns_sdlz_putsoa(dns_sdlzlookup_t *lookup, const char *mname, const char *rname, */ -isc_result_t -dns_sdlz_setdb(dns_dlzdb_t *dlzdatabase, dns_rdataclass_t rdclass, - dns_name_t *name, dns_db_t **dbp); +typedef isc_result_t dns_sdlz_setdb_t(dns_dlzdb_t *dlzdatabase, + dns_rdataclass_t rdclass, + dns_name_t *name, + dns_db_t **dbp); +dns_sdlz_setdb_t dns_sdlz_setdb; /*%< * Create the database pointers for a writeable SDLZ zone */ diff --git a/lib/dns/include/dns/zone.h b/lib/dns/include/dns/zone.h index 67756d92cb6..a8b78dc0faa 100644 --- a/lib/dns/include/dns/zone.h +++ b/lib/dns/include/dns/zone.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zone.h,v 1.182 2010-12-18 01:56:22 each Exp $ */ +/* $Id: zone.h,v 1.182.16.2 2011-07-08 23:47:16 tbox Exp $ */ #ifndef DNS_ZONE_H #define DNS_ZONE_H 1 @@ -1380,7 +1380,8 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, isc_timermgr_t *timermgr, isc_socketmgr_t *socketmgr, dns_zonemgr_t **zmgrp); /*%< - * Create a zone manager. + * Create a zone manager. Note: the zone manager will not be able to + * manage any zones until dns_zonemgr_setsize() has been run. * * Requires: *\li 'mctx' to be a valid memory context. @@ -1389,6 +1390,18 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, *\li 'zmgrp' to point to a NULL pointer. */ +isc_result_t +dns_zonemgr_setsize(dns_zonemgr_t *zmgr, int num_zones); +/*%< + * Set the size of the zone manager task pool. This must be run + * before zmgr can be used for managing zones. Currently, it can only + * be run once; the task pool cannot be resized. + * + * Requires: + *\li zmgr is a valid zone manager. + *\li zmgr->zonetasks has been initialized. + */ + isc_result_t dns_zonemgr_managezone(dns_zonemgr_t *zmgr, dns_zone_t *zone); /*%< diff --git a/lib/dns/include/dst/dst.h b/lib/dns/include/dst/dst.h index 3c999f6876d..eec9b39bdcb 100644 --- a/lib/dns/include/dst/dst.h +++ b/lib/dns/include/dst/dst.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dst.h,v 1.31 2011-01-11 23:47:14 tbox Exp $ */ +/* $Id: dst.h,v 1.31.10.1 2011-03-21 19:53:35 each Exp $ */ #ifndef DST_DST_H #define DST_DST_H 1 @@ -844,6 +844,9 @@ dst_key_tkeytoken(const dst_key_t *key); /*%< * Return the token from the TKEY request, if any. If this key was * not negotiated via TKEY, return NULL. + * + * Requires: + * "key" is a valid key. */ diff --git a/lib/dns/journal.c b/lib/dns/journal.c index a6d630edc4c..27e9bdb66ee 100644 --- a/lib/dns/journal.c +++ b/lib/dns/journal.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: journal.c,v 1.112 2010-11-17 23:47:08 tbox Exp $ */ +/* $Id: journal.c,v 1.112.38.2 2011-03-12 04:59:17 tbox Exp $ */ #include @@ -163,7 +163,7 @@ dns_db_createsoatuple(dns_db_t *db, dns_dbversion_t *ver, isc_mem_t *mctx, dns_rdataset_disassociate(&rdataset); dns_db_detachnode(db, &node); - return (ISC_R_SUCCESS); + return (result); freenode: dns_db_detachnode(db, &node); @@ -2170,6 +2170,7 @@ dns_journal_compact(isc_mem_t *mctx, char *filename, isc_uint32_t serial, CHECK(journal_fsync(new)); indexend = new->header.end.offset; + POST(indexend); } /* diff --git a/lib/dns/master.c b/lib/dns/master.c index e90a74cfd6b..1e9fead687e 100644 --- a/lib/dns/master.c +++ b/lib/dns/master.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: master.c,v 1.178 2009-09-01 00:22:26 jinmei Exp $ */ +/* $Id: master.c,v 1.178.346.2 2011-03-12 04:59:17 tbox Exp $ */ /*! \file */ @@ -1205,9 +1205,10 @@ load_text(dns_loadctx_t *lctx) { goto insist_and_cleanup; } ictx = lctx->inc; - line = isc_lex_getsourceline(lctx->lex); source = isc_lex_getsourcename(lctx->lex); + line = isc_lex_getsourceline(lctx->lex); + POST(line); continue; } /* @@ -1417,8 +1418,9 @@ load_text(dns_loadctx_t *lctx) { goto insist_and_cleanup; } ictx = lctx->inc; - line = isc_lex_getsourceline(lctx->lex); source = isc_lex_getsourcename(lctx->lex); + line = isc_lex_getsourceline(lctx->lex); + POST(line); continue; } @@ -2123,6 +2125,7 @@ load_raw(dns_loadctx_t *lctx) { /* Empty read: currently, we do not use dumptime */ dumptime = isc_buffer_getuint32(&target); + POST(dumptime); lctx->first = ISC_FALSE; } @@ -2295,7 +2298,6 @@ load_raw(dns_loadctx_t *lctx) { isc_buffer_forward(&target, consumed_name); rdcount -= i; - i = 0; goto continue_read; } @@ -2679,7 +2681,6 @@ grow_rdatalist(int new_len, dns_rdatalist_t *old, int old_len, return (NULL); ISC_LIST_INIT(save); - this = ISC_LIST_HEAD(*current); while ((this = ISC_LIST_HEAD(*current)) != NULL) { ISC_LIST_UNLINK(*current, this, link); ISC_LIST_APPEND(save, this, link); @@ -2692,7 +2693,6 @@ grow_rdatalist(int new_len, dns_rdatalist_t *old, int old_len, } ISC_LIST_INIT(save); - this = ISC_LIST_HEAD(*glue); while ((this = ISC_LIST_HEAD(*glue)) != NULL) { ISC_LIST_UNLINK(*glue, this, link); ISC_LIST_APPEND(save, this, link); diff --git a/lib/dns/masterdump.c b/lib/dns/masterdump.c index e2adf9b24dd..c137b108a3a 100644 --- a/lib/dns/masterdump.c +++ b/lib/dns/masterdump.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: masterdump.c,v 1.99.328.3 2011-06-21 20:15:47 each Exp $ */ +/* $Id: masterdump.c,v 1.99.258.7 2011-06-08 23:02:42 each Exp $ */ /*! \file */ @@ -871,9 +871,8 @@ dump_rdatasets_text(isc_mem_t *mctx, dns_name_t *name, for (i = 0; i < n; i++) { dns_rdataset_t *rds = sorted[i]; - if (ctx->style.flags & DNS_STYLEFLAG_TRUST) { + if (ctx->style.flags & DNS_STYLEFLAG_TRUST) fprintf(f, "; %s\n", dns_trust_totext(rds->trust)); - } if (((rds->attributes & DNS_RDATASETATTR_NEGATIVE) != 0) && (ctx->style.flags & DNS_STYLEFLAG_NCACHE) == 0) { /* Omit negative cache entries */ @@ -1047,6 +1046,8 @@ dump_rdatasets_raw(isc_mem_t *mctx, dns_name_t *name, buffer, f); } dns_rdataset_disassociate(&rdataset); + if (result != ISC_R_SUCCESS) + return (result); } if (result == ISC_R_NOMORE) @@ -1356,23 +1357,24 @@ dumptostreaminc(dns_dumpctx_t *dctx) { isc_buffer_region(&buffer, &r); isc_buffer_putuint32(&buffer, dns_masterformat_raw); isc_buffer_putuint32(&buffer, DNS_RAWFORMAT_VERSION); - if (sizeof(now32) != sizeof(dctx->now)) { - /* - * We assume isc_stdtime_t is a 32-bit integer, - * which should be the case on most cases. - * If it turns out to be uncommon, we'll need - * to bump the version number and revise the - * header format. - */ - isc_log_write(dns_lctx, - ISC_LOGCATEGORY_GENERAL, - DNS_LOGMODULE_MASTERDUMP, - ISC_LOG_INFO, - "dumping master file in raw " - "format: stdtime is not 32bits"); - now32 = 0; - } else - now32 = dctx->now; +#if !defined(STDTIME_ON_32BITS) || (STDTIME_ON_32BITS + 0) != 1 + /* + * We assume isc_stdtime_t is a 32-bit integer, + * which should be the case on most cases. + * If it turns out to be uncommon, we'll need + * to bump the version number and revise the + * header format. + */ + isc_log_write(dns_lctx, + ISC_LOGCATEGORY_GENERAL, + DNS_LOGMODULE_MASTERDUMP, + ISC_LOG_INFO, + "dumping master file in raw " + "format: stdtime is not 32bits"); + now32 = 0; +#else + now32 = dctx->now; +#endif isc_buffer_putuint32(&buffer, now32); INSIST(isc_buffer_usedlength(&buffer) <= sizeof(rawheader)); @@ -1742,6 +1744,14 @@ dns_master_dumpnode(isc_mem_t *mctx, dns_db_t *db, dns_dbversion_t *version, result = dns_master_dumpnodetostream(mctx, db, version, node, name, style, f); + if (result != ISC_R_SUCCESS) { + isc_log_write(dns_lctx, ISC_LOGCATEGORY_GENERAL, + DNS_LOGMODULE_MASTERDUMP, ISC_LOG_ERROR, + "dumping master file: %s: dump: %s", filename, + isc_result_totext(result)); + (void)isc_stdio_close(f); + return (ISC_R_UNEXPECTED); + } result = isc_stdio_close(f); if (result != ISC_R_SUCCESS) { diff --git a/lib/dns/message.c b/lib/dns/message.c index b58c1399949..4ca37b7580a 100644 --- a/lib/dns/message.c +++ b/lib/dns/message.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: message.c,v 1.254.186.3 2011-06-21 20:15:47 each Exp $ */ +/* $Id: message.c,v 1.254.114.3 2011-06-08 23:02:42 each Exp $ */ /*! \file */ @@ -1194,7 +1194,6 @@ getsection(isc_buffer_t *source, dns_message_t *msg, dns_decompress_t *dctx, skip_name_search = ISC_FALSE; skip_type_search = ISC_FALSE; - free_name = ISC_FALSE; free_rdataset = ISC_FALSE; name = isc_mempool_get(msg->namepool); @@ -2930,6 +2929,7 @@ dns_message_signer(dns_message_t *msg, dns_name_t *signer) { dns_rdataset_current(msg->tsig, &rdata); result = dns_rdata_tostruct(&rdata, &tsig, NULL); + INSIST(result == ISC_R_SUCCESS); if (msg->tsigstatus != dns_rcode_noerror) result = DNS_R_TSIGVERIFYFAILURE; else if (tsig.error != dns_rcode_noerror) diff --git a/lib/dns/name.c b/lib/dns/name.c index f88f281b618..23835138a78 100644 --- a/lib/dns/name.c +++ b/lib/dns/name.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: name.c,v 1.174 2011-01-13 04:59:25 tbox Exp $ */ +/* $Id: name.c,v 1.174.8.1 2011-03-11 06:47:04 marka Exp $ */ /*! \file */ @@ -1024,12 +1024,13 @@ dns_name_fromtext(dns_name_t *name, isc_buffer_t *source, const dns_name_t *origin, unsigned int options, isc_buffer_t *target) { - unsigned char *ndata, *label; + unsigned char *ndata, *label = NULL; char *tdata; char c; ft_state state; - unsigned int value, count; - unsigned int n1, n2, tlen, nrem, nused, digits, labels, tused; + unsigned int value = 0, count = 0; + unsigned int n1 = 0, n2 = 0; + unsigned int tlen, nrem, nused, digits = 0, labels, tused; isc_boolean_t done; unsigned char *offsets; dns_offsets_t odata; @@ -1062,16 +1063,6 @@ dns_name_fromtext(dns_name_t *name, isc_buffer_t *source, INIT_OFFSETS(name, offsets, odata); offsets[0] = 0; - /* - * Initialize things to make the compiler happy; they're not required. - */ - n1 = 0; - n2 = 0; - label = NULL; - digits = 0; - value = 0; - count = 0; - /* * Make 'name' empty in case of failure. */ @@ -1171,6 +1162,7 @@ dns_name_fromtext(dns_name_t *name, isc_buffer_t *source, return (DNS_R_BADLABELTYPE); } state = ft_escape; + POST(state); /* FALLTHROUGH */ case ft_escape: if (!isdigit(c & 0xff)) { @@ -1236,6 +1228,7 @@ dns_name_fromtext(dns_name_t *name, isc_buffer_t *source, label = origin->ndata; n1 = origin->length; nrem -= n1; + POST(nrem); while (n1 > 0) { n2 = *label++; INSIST(n2 <= 63); /* no bitstring support */ diff --git a/lib/dns/ncache.c b/lib/dns/ncache.c index 420a1180eb2..1ac85e5f906 100644 --- a/lib/dns/ncache.c +++ b/lib/dns/ncache.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ncache.c,v 1.50.124.1.2.3 2011-06-21 20:15:47 each Exp $ */ +/* $Id: ncache.c,v 1.50.124.4 2011-06-08 23:02:42 each Exp $ */ /*! \file */ diff --git a/lib/dns/nsec.c b/lib/dns/nsec.c index 94c5163ecc7..506f5b78d1c 100644 --- a/lib/dns/nsec.c +++ b/lib/dns/nsec.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: nsec.c,v 1.13 2009-01-06 23:47:57 tbox Exp $ */ +/* $Id: nsec.c,v 1.13.428.2 2011-03-12 04:59:17 tbox Exp $ */ /*! \file */ @@ -182,7 +182,7 @@ dns_nsec_build(dns_db_t *db, dns_dbversion_t *version, dns_dbnode_t *node, 0, NULL); if (result == DNS_R_UNCHANGED) result = ISC_R_SUCCESS; - RETERR(result); + failure: if (dns_rdataset_isassociated(&rdataset)) dns_rdataset_disassociate(&rdataset); diff --git a/lib/dns/nsec3.c b/lib/dns/nsec3.c index e75e7440abc..d99f90ecc50 100644 --- a/lib/dns/nsec3.c +++ b/lib/dns/nsec3.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006, 2008-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2006, 2008-2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: nsec3.c,v 1.19.96.1 2011-06-21 20:15:48 each Exp $ */ +/* $Id: nsec3.c,v 1.19.24.3 2011-06-08 23:02:42 each Exp $ */ #include @@ -557,7 +557,7 @@ dns_nsec3_addnsec3(dns_db_t *db, dns_dbversion_t *version, dns_rdata_t rdata = DNS_RDATA_INIT; dns_rdataset_t rdataset; int pass; - isc_boolean_t exists; + isc_boolean_t exists = ISC_FALSE; isc_boolean_t maybe_remove_unsecure = ISC_FALSE; isc_uint8_t flags; isc_buffer_t buffer; diff --git a/lib/dns/openssl_link.c b/lib/dns/openssl_link.c index 8c733f68a0c..49670b1a474 100644 --- a/lib/dns/openssl_link.c +++ b/lib/dns/openssl_link.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -31,7 +31,7 @@ /* * Principal Author: Brian Wellington - * $Id: openssl_link.c,v 1.29 2010-09-15 12:38:36 tbox Exp $ + * $Id: openssl_link.c,v 1.29.54.2 2011-03-12 04:59:17 tbox Exp $ */ #ifdef OPENSSL @@ -50,16 +50,6 @@ #include "dst_internal.h" #include "dst_openssl.h" -#include -#include -#include -#include -#include - -#if defined(CRYPTO_LOCK_ENGINE) && (OPENSSL_VERSION_NUMBER >= 0x0090707f) -#define USE_ENGINE 1 -#endif - #ifdef USE_ENGINE #include #endif @@ -308,19 +298,19 @@ dst__openssl_toresult(isc_result_t fallback) { return (result); } +#if defined(USE_ENGINE) ENGINE * dst__openssl_getengine(const char *engine) { if (engine == NULL) return (NULL); -#if defined(USE_ENGINE) if (e == NULL) return (NULL); if (strcmp(engine, ENGINE_get_id(e)) == 0) return (e); -#endif return (NULL); } +#endif #else /* OPENSSL */ diff --git a/lib/dns/openssldsa_link.c b/lib/dns/openssldsa_link.c index ae88d4c9981..c266a26eeb2 100644 --- a/lib/dns/openssldsa_link.c +++ b/lib/dns/openssldsa_link.c @@ -29,7 +29,7 @@ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: openssldsa_link.c,v 1.20 2011-01-11 23:47:13 tbox Exp $ */ +/* $Id: openssldsa_link.c,v 1.20.10.1 2011-03-11 06:47:04 marka Exp $ */ #ifdef OPENSSL #ifndef USE_EVP @@ -252,7 +252,6 @@ openssldsa_verify(dst_context_t *dctx, const isc_region_t *sig) { dsasig->r = BN_bin2bn(cp, ISC_SHA1_DIGESTLENGTH, NULL); cp += ISC_SHA1_DIGESTLENGTH; dsasig->s = BN_bin2bn(cp, ISC_SHA1_DIGESTLENGTH, NULL); - cp += ISC_SHA1_DIGESTLENGTH; #if 0 pkey = EVP_PKEY_new(); diff --git a/lib/dns/opensslrsa_link.c b/lib/dns/opensslrsa_link.c index fcdc9f06b8d..098529a8277 100644 --- a/lib/dns/opensslrsa_link.c +++ b/lib/dns/opensslrsa_link.c @@ -17,7 +17,7 @@ /* * Principal Author: Brian Wellington - * $Id: opensslrsa_link.c,v 1.39 2011-01-11 23:47:13 tbox Exp $ + * $Id: opensslrsa_link.c,v 1.39.10.2 2011-03-11 02:57:35 marka Exp $ */ #ifdef OPENSSL #include @@ -51,7 +51,9 @@ #if OPENSSL_VERSION_NUMBER > 0x00908000L #include #endif +#ifdef USE_ENGINE #include +#endif /* * We don't use configure for windows so enforce the OpenSSL version @@ -1138,10 +1140,14 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) { isc_result_t ret; int i; RSA *rsa = NULL, *pubrsa = NULL; +#ifdef USE_ENGINE ENGINE *e = NULL; +#endif isc_mem_t *mctx = key->mctx; const char *engine = NULL, *label = NULL; +#if defined(USE_ENGINE) || USE_EVP EVP_PKEY *pkey = NULL; +#endif #if USE_EVP if (pub != NULL && pub->keydata.pkey != NULL) @@ -1175,6 +1181,7 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) { * See if we can fetch it. */ if (label != NULL) { +#ifdef USE_ENGINE if (engine == NULL) DST_RET(DST_R_NOENGINE); e = dst__openssl_getengine(engine); @@ -1209,6 +1216,9 @@ opensslrsa_parse(dst_key_t *key, isc_lex_t *lexer, dst_key_t *pub) { dst__privstruct_free(&priv, mctx); memset(&priv, 0, sizeof(priv)); return (ISC_R_SUCCESS); +#else + DST_RET(DST_R_NOENGINE); +#endif } rsa = RSA_new(); @@ -1303,6 +1313,7 @@ static isc_result_t opensslrsa_fromlabel(dst_key_t *key, const char *engine, const char *label, const char *pin) { +#ifdef USE_ENGINE ENGINE *e = NULL; isc_result_t ret; EVP_PKEY *pkey = NULL; @@ -1366,6 +1377,13 @@ opensslrsa_fromlabel(dst_key_t *key, const char *engine, const char *label, if (pkey != NULL) EVP_PKEY_free(pkey); return (ret); +#else + UNUSED(key); + UNUSED(engine); + UNUSED(label); + UNUSED(pin); + return(DST_R_NOENGINE); +#endif } static dst_func_t opensslrsa_functions = { diff --git a/lib/dns/rbt.c b/lib/dns/rbt.c index 6c14e8e702a..c733e505d15 100644 --- a/lib/dns/rbt.c +++ b/lib/dns/rbt.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbt.c,v 1.146 2009-10-27 04:46:58 marka Exp $ */ +/* $Id: rbt.c,v 1.146.278.2 2011-03-12 04:59:17 tbox Exp $ */ /*! \file */ @@ -718,6 +718,7 @@ dns_rbt_findnode(dns_rbt_t *rbt, dns_name_t *name, dns_name_t *foundname, */ compared = dns_namereln_none; last_compared = NULL; + order = 0; } dns_fixedname_init(&fixedcallbackname); @@ -1084,6 +1085,7 @@ dns_rbt_findnode(dns_rbt_t *rbt, dns_name_t *name, dns_name_t *foundname, ¤t_name, &order, &common_labels); + POST(compared); last_compared = current; @@ -1526,7 +1528,7 @@ rehash(dns_rbt_t *rbt) { oldsize = rbt->hashsize; oldtable = rbt->hashtable; - rbt->hashsize *= 2 + 1; + rbt->hashsize = rbt->hashsize * 2 + 1; rbt->hashtable = isc_mem_get(rbt->mctx, rbt->hashsize * sizeof(dns_rbtnode_t *)); if (rbt->hashtable == NULL) { @@ -1683,6 +1685,7 @@ dns_rbt_addonlevel(dns_rbtnode_t *node, dns_rbtnode_t *current, int order, } child = root; + POST(child); dns_name_init(&add_name, add_offsets); NODENAME(node, &add_name); diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index d4415d8906d..9d66006b471 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.310.8.1.2.1 2011-06-21 20:15:48 each Exp $ */ +/* $Id: rbtdb.c,v 1.310.8.5 2011-06-08 23:02:42 each Exp $ */ /*! \file */ @@ -436,8 +436,12 @@ typedef struct { rbtnodelist_t *deadnodes; /* - * Heaps. Each of these is used for TTL based expiry. + * Heaps. These are used for TTL based expiry in a cache, + * or for zone resigning in a zone DB. hmctx is the memory + * context to use for the heap (which differs from the main + * database memory context in the case of a cache). */ + isc_mem_t * hmctx; isc_heap_t **heaps; /* Locked by tree_lock. */ @@ -955,9 +959,8 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) { if (rbtdb->heaps != NULL) { for (i = 0; i < rbtdb->node_lock_count; i++) isc_heap_destroy(&rbtdb->heaps[i]); - isc_mem_put(rbtdb->common.mctx, rbtdb->heaps, - rbtdb->node_lock_count * - sizeof(isc_heap_t *)); + isc_mem_put(rbtdb->hmctx, rbtdb->heaps, + rbtdb->node_lock_count * sizeof(isc_heap_t *)); } if (rbtdb->rrsetstats != NULL) @@ -979,6 +982,7 @@ free_rbtdb(dns_rbtdb_t *rbtdb, isc_boolean_t log, isc_event_t *event) { rbtdb->common.magic = 0; rbtdb->common.impmagic = 0; ondest = rbtdb->common.ondest; + isc_mem_detach(&rbtdb->hmctx); isc_mem_putanddetach(&rbtdb->common.mctx, rbtdb, sizeof(*rbtdb)); isc_ondestroy_notify(&ondest, rbtdb); } @@ -2691,10 +2695,15 @@ zone_zonecut_callback(dns_rbtnode_t *node, dns_name_t *name, void *arg) { /* * Did we find anything? */ - if (dname_header != NULL) { + if (!IS_CACHE(search->rbtdb) && !IS_STUB(search->rbtdb) && + ns_header != NULL) { /* - * Note that DNAME has precedence over NS if both exist. + * Note that NS has precedence over DNAME if both exist + * in a zone. Otherwise DNAME take precedence over NS. */ + found = ns_header; + search->zonecut_sigrdataset = NULL; + } else if (dname_header != NULL) { found = dname_header; search->zonecut_sigrdataset = sigdname_header; } else if (ns_header != NULL) { @@ -4103,6 +4112,7 @@ zone_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, */ if (search.need_cleanup) { node = search.zonecut; + INSIST(node != NULL); lock = &(search.rbtdb->node_locks[node->locknum].lock); NODE_LOCK(lock, isc_rwlocktype_read); @@ -4404,6 +4414,7 @@ find_deepest_zonecut(rbtdb_search_t *search, dns_rbtnode_t *node, NODE_UNLOCK(lock, locktype); NODE_LOCK(lock, isc_rwlocktype_write); locktype = isc_rwlocktype_write; + POST(locktype); } if (need_headerupdate(found, search->now)) update_header(search->rbtdb, found, @@ -4908,15 +4919,9 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, cname_ok && cnamesig != NULL) { /* - * If we've already got the CNAME RRSIG, - * use it, otherwise change sigtype - * so that we find it. + * If we've already got the + * CNAME RRSIG, use it. */ - if (cnamesig != NULL) - foundsig = cnamesig; - else - sigtype = - RBTDB_RDATATYPE_SIGCNAME; foundsig = cnamesig; } } else if (header->type == sigtype) { @@ -5062,6 +5067,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, NODE_UNLOCK(lock, locktype); NODE_LOCK(lock, isc_rwlocktype_write); locktype = isc_rwlocktype_write; + POST(locktype); } if (update != NULL && need_headerupdate(update, search.now)) update_header(search.rbtdb, update, search.now); @@ -5079,6 +5085,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, */ if (search.need_cleanup) { node = search.zonecut; + INSIST(node != NULL); lock = &(search.rbtdb->node_locks[node->locknum].lock); NODE_LOCK(lock, isc_rwlocktype_read); @@ -5244,6 +5251,7 @@ cache_findzonecut(dns_db_t *db, dns_name_t *name, unsigned int options, NODE_UNLOCK(lock, locktype); NODE_LOCK(lock, isc_rwlocktype_write); locktype = isc_rwlocktype_write; + POST(locktype); } if (need_headerupdate(found, search.now)) update_header(search.rbtdb, found, search.now); @@ -7463,16 +7471,21 @@ dns_rbtdb_create int i; dns_name_t name; isc_boolean_t (*sooner)(void *, void *); + isc_mem_t *hmctx = mctx; /* Keep the compiler happy. */ - UNUSED(argc); - UNUSED(argv); UNUSED(driverarg); rbtdb = isc_mem_get(mctx, sizeof(*rbtdb)); if (rbtdb == NULL) return (ISC_R_NOMEMORY); + /* + * If argv[0] exists, it points to a memory context to use for heap + */ + if (argc != 0) + hmctx = (isc_mem_t *) argv[0]; + memset(rbtdb, '\0', sizeof(*rbtdb)); dns_name_init(&rbtdb->common.origin, NULL); rbtdb->common.attributes = 0; @@ -7537,7 +7550,7 @@ dns_rbtdb_create /* * Create the heaps. */ - rbtdb->heaps = isc_mem_get(mctx, rbtdb->node_lock_count * + rbtdb->heaps = isc_mem_get(hmctx, rbtdb->node_lock_count * sizeof(isc_heap_t *)); if (rbtdb->heaps == NULL) { result = ISC_R_NOMEMORY; @@ -7547,7 +7560,7 @@ dns_rbtdb_create rbtdb->heaps[i] = NULL; sooner = IS_CACHE(rbtdb) ? ttl_sooner : resign_sooner; for (i = 0; i < (int)rbtdb->node_lock_count; i++) { - result = isc_heap_create(mctx, sooner, set_index, 0, + result = isc_heap_create(hmctx, sooner, set_index, 0, &rbtdb->heaps[i]); if (result != ISC_R_SUCCESS) goto cleanup_heaps; @@ -7591,6 +7604,7 @@ dns_rbtdb_create * mctx won't disappear out from under us. */ isc_mem_attach(mctx, &rbtdb->common.mctx); + isc_mem_attach(hmctx, &rbtdb->hmctx); /* * Must be initialized before free_rbtdb() is called. diff --git a/lib/dns/rbtdb.h b/lib/dns/rbtdb.h index f4249af255a..efa3944c5d2 100644 --- a/lib/dns/rbtdb.h +++ b/lib/dns/rbtdb.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.h,v 1.18 2007-06-19 23:47:16 tbox Exp $ */ +/* $Id: rbtdb.h,v 1.18.814.2 2011-03-03 23:47:09 tbox Exp $ */ #ifndef DNS_RBTDB_H #define DNS_RBTDB_H 1 @@ -39,6 +39,19 @@ dns_rbtdb_create(isc_mem_t *mctx, dns_name_t *base, dns_dbtype_t type, dns_rdataclass_t rdclass, unsigned int argc, char *argv[], void *driverarg, dns_db_t **dbp); +/*%< + * Create a new database of type "rbt" (or "rbt64"). Called via + * dns_db_create(); see documentation for that function for more details. + * + * If argv[0] is set, it points to a valid memory context to be used for + * allocation of heap memory. Generally this is used for cache databases + * only. + * + * Requires: + * + * \li argc == 0 or argv[0] is a valid memory context. + */ + ISC_LANG_ENDDECLS #endif /* DNS_RBTDB_H */ diff --git a/lib/dns/rcode.c b/lib/dns/rcode.c index 18fedcdefcd..81a4549ccd9 100644 --- a/lib/dns/rcode.c +++ b/lib/dns/rcode.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rcode.c,v 1.16 2010-12-23 04:07:58 marka Exp $ */ +/* $Id: rcode.c,v 1.16.14.2 2011-02-28 01:20:02 tbox Exp $ */ #include #include @@ -494,6 +494,9 @@ dns_rdataclass_format(dns_rdataclass_t rdclass, isc_result_t result; isc_buffer_t buf; + if (size == 0U) + return; + isc_buffer_init(&buf, array, size); result = dns_rdataclass_totext(rdclass, &buf); /* @@ -505,8 +508,6 @@ dns_rdataclass_format(dns_rdataclass_t rdclass, else result = ISC_R_NOSPACE; } - if (result != ISC_R_SUCCESS) { - snprintf(array, size, ""); - array[size - 1] = '\0'; - } + if (result != ISC_R_SUCCESS) + strlcpy(array, "", size); } diff --git a/lib/dns/rdata.c b/lib/dns/rdata.c index c282b033cfc..063b1f66097 100644 --- a/lib/dns/rdata.c +++ b/lib/dns/rdata.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdata.c,v 1.209 2011-01-13 04:59:25 tbox Exp $ */ +/* $Id: rdata.c,v 1.209.8.2 2011-03-11 06:47:05 marka Exp $ */ /*! \file */ @@ -708,6 +708,7 @@ rdata_totext(dns_rdata_t *rdata, dns_rdata_textctx_t *tctx, if (use_default) { strlcpy(buf, "\\# ", sizeof(buf)); result = str_totext(buf, target); + INSIST(result == ISC_R_SUCCESS); dns_rdata_toregion(rdata, &sr); INSIST(sr.length < 65536); snprintf(buf, sizeof(buf), "%u", sr.length); @@ -963,6 +964,9 @@ dns_rdatatype_format(dns_rdatatype_t rdtype, isc_result_t result; isc_buffer_t buf; + if (size == 0U) + return; + isc_buffer_init(&buf, array, size); result = dns_rdatatype_totext(rdtype, &buf); /* @@ -974,10 +978,8 @@ dns_rdatatype_format(dns_rdatatype_t rdtype, else result = ISC_R_NOSPACE; } - if (result != ISC_R_SUCCESS) { - snprintf(array, size, ""); - array[size - 1] = '\0'; - } + if (result != ISC_R_SUCCESS) + strlcpy(array, "", size); } /* diff --git a/lib/dns/rdatalist.c b/lib/dns/rdatalist.c index d30aff966ad..dcf6b453a6c 100644 --- a/lib/dns/rdatalist.c +++ b/lib/dns/rdatalist.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2008, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2008, 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdatalist.c,v 1.40 2010-11-16 05:38:31 marka Exp $ */ +/* $Id: rdatalist.c,v 1.40.40.2 2011-02-28 01:20:02 tbox Exp $ */ /*! \file */ @@ -54,6 +54,8 @@ static dns_rdatasetmethods_t methods = { void dns_rdatalist_init(dns_rdatalist_t *rdatalist) { + REQUIRE(rdatalist != NULL); + /* * Initialize rdatalist. */ @@ -125,6 +127,8 @@ isc_result_t isc__rdatalist_next(dns_rdataset_t *rdataset) { dns_rdata_t *rdata; + REQUIRE(rdataset != NULL); + rdata = rdataset->private2; if (rdata == NULL) return (ISC_R_NOMORE); @@ -141,6 +145,8 @@ void isc__rdatalist_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) { dns_rdata_t *list_rdata; + REQUIRE(rdataset != NULL); + list_rdata = rdataset->private2; INSIST(list_rdata != NULL); @@ -149,6 +155,10 @@ isc__rdatalist_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) { void isc__rdatalist_clone(dns_rdataset_t *source, dns_rdataset_t *target) { + + REQUIRE(source != NULL); + REQUIRE(target != NULL); + *target = *source; /* @@ -163,6 +173,8 @@ isc__rdatalist_count(dns_rdataset_t *rdataset) { dns_rdata_t *rdata; unsigned int count; + REQUIRE(rdataset != NULL); + rdatalist = rdataset->private1; count = 0; @@ -181,6 +193,8 @@ isc__rdatalist_addnoqname(dns_rdataset_t *rdataset, dns_name_t *name) { dns_rdataset_t *rdset; dns_ttl_t ttl; + REQUIRE(rdataset != NULL); + for (rdset = ISC_LIST_HEAD(name->list); rdset != NULL; rdset = ISC_LIST_NEXT(rdset, link)) @@ -228,7 +242,9 @@ isc__rdatalist_getnoqname(dns_rdataset_t *rdataset, dns_name_t *name, dns_rdataset_t *tnegsig = NULL; dns_name_t *noqname = rdataset->private6; + REQUIRE(rdataset != NULL); REQUIRE((rdataset->attributes & DNS_RDATASETATTR_NOQNAME) != 0); + (void)dns_name_dynamic(noqname); /* Sanity Check. */ for (rdataset = ISC_LIST_HEAD(noqname->list); @@ -268,6 +284,8 @@ isc__rdatalist_addclosest(dns_rdataset_t *rdataset, dns_name_t *name) { dns_rdataset_t *rdset; dns_ttl_t ttl; + REQUIRE(rdataset != NULL); + for (rdset = ISC_LIST_HEAD(name->list); rdset != NULL; rdset = ISC_LIST_NEXT(rdset, link)) @@ -315,7 +333,9 @@ isc__rdatalist_getclosest(dns_rdataset_t *rdataset, dns_name_t *name, dns_rdataset_t *tnegsig = NULL; dns_name_t *closest = rdataset->private7; + REQUIRE(rdataset != NULL); REQUIRE((rdataset->attributes & DNS_RDATASETATTR_CLOSEST) != 0); + (void)dns_name_dynamic(closest); /* Sanity Check. */ for (rdataset = ISC_LIST_HEAD(closest->list); diff --git a/lib/dns/rdataset.c b/lib/dns/rdataset.c index fdd7669b2e8..627f20de1bf 100644 --- a/lib/dns/rdataset.c +++ b/lib/dns/rdataset.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdataset.c,v 1.86.220.3 2011-06-21 20:15:53 each Exp $ */ +/* $Id: rdataset.c,v 1.86.148.4 2011-06-08 23:02:42 each Exp $ */ /*! \file */ @@ -319,7 +319,7 @@ towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name, dns_rdata_t rdata = DNS_RDATA_INIT; isc_region_t r; isc_result_t result; - unsigned int i, count, added, choice; + unsigned int i, count = 0, added, choice; isc_buffer_t savedbuffer, rdlen, rrbuffer; unsigned int headlen; isc_boolean_t question = ISC_FALSE; @@ -339,7 +339,6 @@ towiresorted(dns_rdataset_t *rdataset, const dns_name_t *owner_name, REQUIRE((order == NULL) == (order_arg == NULL)); REQUIRE(cctx != NULL && cctx->mctx != NULL); - count = 0; if ((rdataset->attributes & DNS_RDATASETATTR_QUESTION) != 0) { question = ISC_TRUE; count = 1; diff --git a/lib/dns/rdataslab.c b/lib/dns/rdataslab.c index 932f8de31df..a41f16f7684 100644 --- a/lib/dns/rdataslab.c +++ b/lib/dns/rdataslab.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdataslab.c,v 1.52.148.1.2.1 2011-06-02 23:47:35 tbox Exp $ */ +/* $Id: rdataslab.c,v 1.52.148.2 2011-02-28 01:20:02 tbox Exp $ */ /*! \file */ diff --git a/lib/dns/request.c b/lib/dns/request.c index b5d624824e8..bc378afa61f 100644 --- a/lib/dns/request.c +++ b/lib/dns/request.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: request.c,v 1.87 2010-03-04 23:50:34 tbox Exp $ */ +/* $Id: request.c,v 1.87.148.2 2011-03-12 04:59:17 tbox Exp $ */ /*! \file */ @@ -428,12 +428,10 @@ req_send(dns_request_t *request, isc_task_t *task, isc_sockaddr_t *address) { isc_region_t r; isc_socket_t *socket; isc_result_t result; - unsigned int dispattr; req_log(ISC_LOG_DEBUG(3), "req_send: request %p", request); REQUIRE(VALID_REQUEST(request)); - dispattr = dns_dispatch_getattributes(request->dispatch); socket = req_getsocket(request); isc_buffer_usedregion(request->query, &r); /* diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 6d9ab700f17..717c93214bf 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.c,v 1.428.6.5.2.1 2011-06-21 20:15:53 each Exp $ */ +/* $Id: resolver.c,v 1.428.6.7 2011-06-08 23:02:43 each Exp $ */ /*! \file */ @@ -2545,7 +2545,7 @@ fctx_getaddresses(fetchctx_t *fctx, isc_boolean_t badcache) { isc_result_t result; dns_resolver_t *res; isc_stdtime_t now; - unsigned int stdoptions; + unsigned int stdoptions = 0; isc_sockaddr_t *sa; dns_adbaddrinfo_t *ai; isc_boolean_t all_bad; @@ -2564,7 +2564,6 @@ fctx_getaddresses(fetchctx_t *fctx, isc_boolean_t badcache) { } res = fctx->res; - stdoptions = 0; /* Keep compiler happy. */ /* * Forwarders. @@ -4247,6 +4246,8 @@ validated(isc_task_t *task, isc_event_t *event) { sigrdataset, 0, NULL); dns_db_detachnode(fctx->cache, &nsnode); + if (result != ISC_R_SUCCESS) + continue; } result = dns_message_nextname(fctx->rmessage, DNS_SECTION_AUTHORITY); @@ -4309,6 +4310,7 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo, res = fctx->res; need_validation = ISC_FALSE; + POST(need_validation); secure_domain = ISC_FALSE; have_answer = ISC_FALSE; eresult = ISC_R_SUCCESS; @@ -4776,6 +4778,7 @@ ncache_message(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, res = fctx->res; need_validation = ISC_FALSE; + POST(need_validation); secure_domain = ISC_FALSE; eresult = ISC_R_SUCCESS; name = &fctx->name; @@ -5684,6 +5687,7 @@ answer_response(fetchctx_t *fctx) { chaining = ISC_FALSE; have_answer = ISC_FALSE; want_chaining = ISC_FALSE; + POST(want_chaining); if ((message->flags & DNS_MESSAGEFLAG_AA) != 0) aa = ISC_TRUE; else @@ -5907,6 +5911,7 @@ answer_response(fetchctx_t *fctx) { } found = ISC_TRUE; want_chaining = ISC_TRUE; + POST(want_chaining); aflag = DNS_RDATASETATTR_ANSWER; result = dname_target(fctx, rdataset, qname, name, @@ -5918,6 +5923,7 @@ answer_response(fetchctx_t *fctx) { * try to continue. */ want_chaining = ISC_FALSE; + POST(want_chaining); } else if (result != ISC_R_SUCCESS) return (result); else @@ -6782,6 +6788,7 @@ resquery_response(isc_task_t *task, isc_event_t *event) { unsigned int version; resend = ISC_TRUE; + INSIST(opt != NULL); version = (opt->ttl >> 16) & 0xff; flags = (version << DNS_FETCHOPT_EDNSVERSIONSHIFT) | DNS_FETCHOPT_EDNSVERSIONSET; @@ -8276,10 +8283,8 @@ dns_resolver_addbadcache(dns_resolver_t *resolver, dns_name_t *name, resolver->badcache = isc_mem_get(resolver->mctx, sizeof(*resolver->badcache) * DNS_BADCACHE_SIZE); - if (resolver->badcache == NULL) { - result = ISC_R_NOMEMORY; + if (resolver->badcache == NULL) goto cleanup; - } resolver->badhash = DNS_BADCACHE_SIZE; memset(resolver->badcache, 0, sizeof(*resolver->badcache) * resolver->badhash); @@ -8309,10 +8314,8 @@ dns_resolver_addbadcache(dns_resolver_t *resolver, dns_name_t *name, if (bad == NULL) { isc_buffer_t buffer; bad = isc_mem_get(resolver->mctx, sizeof(*bad) + name->length); - if (bad == NULL) { - result = ISC_R_NOMEMORY; + if (bad == NULL) goto cleanup; - } bad->type = type; bad->hashval = hashval; isc_buffer_init(&buffer, bad + 1, name->length); diff --git a/lib/dns/sdb.c b/lib/dns/sdb.c index d27007d3e6b..f6449911787 100644 --- a/lib/dns/sdb.c +++ b/lib/dns/sdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdb.c,v 1.76 2011-01-13 04:59:25 tbox Exp $ */ +/* $Id: sdb.c,v 1.76.8.1 2011-03-14 13:40:14 fdupont Exp $ */ /*! \file */ @@ -1334,7 +1334,7 @@ dns_sdb_create(isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type, cleanup_origin: dns_name_free(&sdb->common.origin, mctx); cleanup_lock: - isc_mutex_destroy(&sdb->lock); + (void)isc_mutex_destroy(&sdb->lock); cleanup_mctx: isc_mem_put(mctx, sdb, sizeof(dns_sdb_t)); isc_mem_detach(&mctx); diff --git a/lib/dns/sdlz.c b/lib/dns/sdlz.c index e684e1dacca..ba618721637 100644 --- a/lib/dns/sdlz.c +++ b/lib/dns/sdlz.c @@ -50,7 +50,7 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sdlz.c,v 1.31 2011-01-13 06:29:16 marka Exp $ */ +/* $Id: sdlz.c,v 1.31.8.2 2011-03-21 19:53:34 each Exp $ */ /*! \file */ @@ -336,7 +336,7 @@ destroy(dns_sdlz_db_t *sdlz) { sdlz->common.magic = 0; sdlz->common.impmagic = 0; - isc_mutex_destroy(&sdlz->refcnt_lock); + (void)isc_mutex_destroy(&sdlz->refcnt_lock); dns_name_free(&sdlz->common.origin, mctx); @@ -1680,7 +1680,7 @@ dns_sdlzssumatch(dns_name_t *signer, dns_name_t *name, isc_netaddr_t *tcpaddr, char b_addr[ISC_NETADDR_FORMATSIZE]; char b_type[DNS_RDATATYPE_FORMATSIZE]; char b_key[DST_KEY_FORMATSIZE]; - isc_buffer_t *tkey_token; + isc_buffer_t *tkey_token = NULL; isc_region_t token_region; isc_uint32_t token_len = 0; isc_boolean_t ret; @@ -1695,28 +1695,27 @@ dns_sdlzssumatch(dns_name_t *signer, dns_name_t *name, isc_netaddr_t *tcpaddr, * Format the request elements. sdlz operates on strings, not * structures */ - if (signer) + if (signer != NULL) dns_name_format(signer, b_signer, sizeof(b_signer)); else b_signer[0] = 0; dns_name_format(name, b_name, sizeof(b_name)); - if (tcpaddr) + if (tcpaddr != NULL) isc_netaddr_format(tcpaddr, b_addr, sizeof(b_addr)); else b_addr[0] = 0; dns_rdatatype_format(type, b_type, sizeof(b_type)); - if (key) + if (key != NULL) { dst_key_format(key, b_key, sizeof(b_key)); - else + tkey_token = dst_key_tkeytoken(key); + } else b_key[0] = 0; - tkey_token = dst_key_tkeytoken(key); - - if (tkey_token) { + if (tkey_token != NULL) { isc_buffer_region(tkey_token, &token_region); token_len = token_region.length; } @@ -1724,7 +1723,7 @@ dns_sdlzssumatch(dns_name_t *signer, dns_name_t *name, isc_netaddr_t *tcpaddr, MAYBE_LOCK(imp); ret = imp->methods->ssumatch(b_signer, b_name, b_addr, b_type, b_key, token_len, - token_len ? token_region.base : NULL, + token_len != 0 ? token_region.base : NULL, imp->driverarg, dbdata); MAYBE_UNLOCK(imp); return (ret); diff --git a/lib/dns/spnego.c b/lib/dns/spnego.c index 5ad492ce4c2..883242d2c6e 100644 --- a/lib/dns/spnego.c +++ b/lib/dns/spnego.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: spnego.c,v 1.16 2011-01-11 23:47:13 tbox Exp $ */ +/* $Id: spnego.c,v 1.16.10.2 2011-04-04 11:10:57 marka Exp $ */ /*! \file * \brief @@ -377,7 +377,7 @@ cmp_gss_type(gss_buffer_t token, gss_OID oid) unsigned char *p; size_t len; - if (token->length == 0) + if (token->length == 0U) return (GSS_S_DEFECTIVE_TOKEN); p = token->value; @@ -385,7 +385,7 @@ cmp_gss_type(gss_buffer_t token, gss_OID oid) return (GSS_S_DEFECTIVE_TOKEN); len = *p++; if (len & 0x80) { - if ((len & 0x7f) > 4) + if ((len & 0x7f) > 4U) return (GSS_S_DEFECTIVE_TOKEN); p += len & 0x7f; } @@ -531,7 +531,7 @@ send_accept(OM_uint32 * minor_status, *minor_status = ENOMEM; return (GSS_S_FAILURE); } - if (mech_token != NULL && mech_token->length != 0) { + if (mech_token != NULL && mech_token->length != 0U) { resp.responseToken = malloc(sizeof(*resp.responseToken)); if (resp.responseToken == NULL) { free_NegTokenResp(&resp); @@ -675,7 +675,7 @@ gss_accept_sec_context_spnego(OM_uint32 *minor_status, ot = &obuf; } ret = send_accept(&minor_status2, output_token, ot, pref); - if (ot != NULL && ot->length != 0) + if (ot != NULL && ot->length != 0U) gss_release_buffer(&minor_status2, ot); return (ret); @@ -692,7 +692,7 @@ gssapi_verify_mech_header(u_char ** str, int e; u_char *p = *str; - if (total_len < 1) + if (total_len < 1U) return (GSS_S_DEFECTIVE_TOKEN); if (*p++ != 0x60) return (GSS_S_DEFECTIVE_TOKEN); @@ -792,7 +792,7 @@ der_get_int(const unsigned char *p, size_t len, int val = 0; size_t oldlen = len; - if (len > 0) { + if (len > 0U) { val = (signed char)*p++; while (--len) val = val * 256 + *p++; @@ -809,11 +809,11 @@ der_get_length(const unsigned char *p, size_t len, { size_t v; - if (len <= 0) + if (len <= 0U) return (ASN1_OVERRUN); --len; v = *p++; - if (v < 128) { + if (v < 128U) { *val = v; if (size) *size = 1; @@ -822,7 +822,7 @@ der_get_length(const unsigned char *p, size_t len, size_t l; unsigned tmp; - if (v == 0x80) { + if (v == 0x80U) { *val = ASN1_INDEFINITE; if (size) *size = 1; @@ -847,7 +847,7 @@ der_get_octet_string(const unsigned char *p, size_t len, { data->length = len; data->data = malloc(len); - if (data->data == NULL && data->length != 0) + if (data->data == NULL && data->length != 0U) return (ENOMEM); memcpy(data->data, p, len); if (size) @@ -862,23 +862,23 @@ der_get_oid(const unsigned char *p, size_t len, int n; size_t oldlen = len; - if (len < 1) + if (len < 1U) return (ASN1_OVERRUN); data->components = malloc(len * sizeof(*data->components)); - if (data->components == NULL && len != 0) + if (data->components == NULL && len != 0U) return (ENOMEM); data->components[0] = (*p) / 40; data->components[1] = (*p) % 40; --len; ++p; - for (n = 2; len > 0; ++n) { + for (n = 2; len > 0U; ++n) { unsigned u = 0; do { --len; u = u * 128 + (*p++ % 128); - } while (len > 0 && p[-1] & 0x80); + } while (len > 0U && p[-1] & 0x80); data->components[n] = u; } if (p[-1] & 0x80) { @@ -896,7 +896,7 @@ der_get_tag(const unsigned char *p, size_t len, Der_class *class, Der_type *type, int *tag, size_t *size) { - if (len < 1) + if (len < 1U) return (ASN1_OVERRUN); *class = (Der_class) (((*p) >> 6) & 0x03); *type = (Der_type) (((*p) >> 5) & 0x01); @@ -1086,7 +1086,7 @@ len_unsigned(unsigned val) static size_t length_len(size_t len) { - if (len < 128) + if (len < 128U) return (1); else return (len_unsigned(len) + 1); @@ -1108,7 +1108,7 @@ der_put_unsigned(unsigned char *p, size_t len, unsigned val, size_t *size) unsigned char *base = p; if (val) { - while (len > 0 && val) { + while (len > 0U && val) { *p-- = val % 256; val /= 256; --len; @@ -1119,7 +1119,7 @@ der_put_unsigned(unsigned char *p, size_t len, unsigned val, size_t *size) *size = base - p; return (0); } - } else if (len < 1) + } else if (len < 1U) return (ASN1_OVERFLOW); else { *p = 0; @@ -1135,14 +1135,14 @@ der_put_int(unsigned char *p, size_t len, int val, size_t *size) if (val >= 0) { do { - if (len < 1) + if (len < 1U) return (ASN1_OVERFLOW); *p-- = val % 256; len--; val /= 256; } while (val); if (p[1] >= 128) { - if (len < 1) + if (len < 1U) return (ASN1_OVERFLOW); *p-- = 0; len--; @@ -1150,14 +1150,14 @@ der_put_int(unsigned char *p, size_t len, int val, size_t *size) } else { val = ~val; do { - if (len < 1) + if (len < 1U) return (ASN1_OVERFLOW); *p-- = ~(val % 256); len--; val /= 256; } while (val); if (p[1] < 128) { - if (len < 1) + if (len < 1U) return (ASN1_OVERFLOW); *p-- = 0xff; len--; @@ -1170,9 +1170,9 @@ der_put_int(unsigned char *p, size_t len, int val, size_t *size) static int der_put_length(unsigned char *p, size_t len, size_t val, size_t *size) { - if (len < 1) + if (len < 1U) return (ASN1_OVERFLOW); - if (val < 128) { + if (val < 128U) { *p = val; *size = 1; return (0); @@ -1213,20 +1213,20 @@ der_put_oid(unsigned char *p, size_t len, for (n = data->length - 1; n >= 2; --n) { unsigned u = data->components[n]; - if (len < 1) + if (len < 1U) return (ASN1_OVERFLOW); *p-- = u % 128; u /= 128; --len; while (u > 0) { - if (len < 1) + if (len < 1U) return (ASN1_OVERFLOW); *p-- = 128 + u % 128; u /= 128; --len; } } - if (len < 1) + if (len < 1U) return (ASN1_OVERFLOW); *p-- = 40 * data->components[0] + data->components[1]; *size = base - p; @@ -1237,7 +1237,7 @@ static int der_put_tag(unsigned char *p, size_t len, Der_class class, Der_type type, int tag, size_t *size) { - if (len < 1) + if (len < 1U) return (ASN1_OVERFLOW); *p = (class << 6) | (type << 5) | tag; /* XXX */ *size = 1; @@ -1403,7 +1403,7 @@ gssapi_spnego_encapsulate(OM_uint32 * minor_status, } p = gssapi_mech_make_header(output_token->value, len, mech); if (p == NULL) { - if (output_token->length != 0) + if (output_token->length != 0U) gss_release_buffer(minor_status, output_token); return (GSS_S_FAILURE); } @@ -1451,7 +1451,7 @@ gssapi_krb5_get_mech(const u_char *ptr, const u_char *p = ptr; int e; - if (total_len < 1) + if (total_len < 1U) return (-1); if (*p++ != 0x60) return (-1); @@ -1521,7 +1521,7 @@ spnego_initial(OM_uint32 *minor_status, ret = major_status; goto end; } - if (krb5_output_token.length > 0) { + if (krb5_output_token.length > 0U) { token_init.mechToken = malloc(sizeof(*token_init.mechToken)); if (token_init.mechToken == NULL) { *minor_status = ENOMEM; @@ -1588,7 +1588,7 @@ end: token_init.mechToken = NULL; } free_NegTokenInit(&token_init); - if (krb5_output_token.length != 0) + if (krb5_output_token.length != 0U) gss_release_buffer(&minor_status2, &krb5_output_token); if (buf) free(buf); @@ -1758,7 +1758,7 @@ gss_init_sec_context_spnego(OM_uint32 *minor_status, /* Figure out whether we're starting over or processing a reply */ - if (input_token == GSS_C_NO_BUFFER || input_token->length == 0) + if (input_token == GSS_C_NO_BUFFER || input_token->length == 0U) return (spnego_initial(minor_status, initiator_cred_handle, context_handle, diff --git a/lib/dns/ssu_external.c b/lib/dns/ssu_external.c index ac72a1f85da..3cb0d3eceba 100644 --- a/lib/dns/ssu_external.c +++ b/lib/dns/ssu_external.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ssu_external.c,v 1.7 2011-01-13 07:05:57 marka Exp $ */ +/* $Id: ssu_external.c,v 1.7.8.1 2011-03-21 19:53:34 each Exp $ */ /* * This implements external update-policy rules. This allows permission @@ -128,7 +128,7 @@ dns_ssu_external_match(dns_name_t *identity, char b_addr[ISC_NETADDR_FORMATSIZE]; char b_type[DNS_RDATATYPE_FORMATSIZE]; char b_key[DST_KEY_FORMATSIZE]; - isc_buffer_t *tkey_token; + isc_buffer_t *tkey_token = NULL; int fd; const char *sock_path; size_t req_len; @@ -154,33 +154,32 @@ dns_ssu_external_match(dns_name_t *identity, if (fd == -1) return (ISC_FALSE); - tkey_token = dst_key_tkeytoken(key); + if (key != NULL) { + dst_key_format(key, b_key, sizeof(b_key)); + tkey_token = dst_key_tkeytoken(key); + } else + b_key[0] = 0; + + if (tkey_token != NULL) { + isc_buffer_region(tkey_token, &token_region); + token_len = token_region.length; + } /* Format the request elements */ - if (signer) + if (signer != NULL) dns_name_format(signer, b_signer, sizeof(b_signer)); else b_signer[0] = 0; dns_name_format(name, b_name, sizeof(b_name)); - if (tcpaddr) + if (tcpaddr != NULL) isc_netaddr_format(tcpaddr, b_addr, sizeof(b_addr)); else b_addr[0] = 0; dns_rdatatype_format(type, b_type, sizeof(b_type)); - if (key) - dst_key_format(key, b_key, sizeof(b_key)); - else - b_key[0] = 0; - - if (tkey_token) { - isc_buffer_region(tkey_token, &token_region); - token_len = token_region.length; - } - /* Work out how big the request will be */ req_len = sizeof(isc_uint32_t) + /* Format version */ sizeof(isc_uint32_t) + /* Length */ diff --git a/lib/dns/time.c b/lib/dns/time.c index 3f55f193749..a20a93629d5 100644 --- a/lib/dns/time.c +++ b/lib/dns/time.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2009-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: time.c,v 1.35 2010-04-21 23:51:22 tbox Exp $ */ +/* $Id: time.c,v 1.35.132.2 2011-03-09 23:46:55 tbox Exp $ */ /*! \file */ @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -44,13 +45,21 @@ dns_time64_totext(isc_int64_t t, isc_buffer_t *target) { unsigned int l; isc_region_t region; - REQUIRE(t >= 0); - +/* + * Warning. Do NOT use arguments with side effects with these macros. + */ #define is_leap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) #define year_secs(y) ((is_leap(y) ? 366 : 365 ) * 86400) #define month_secs(m,y) ((days[m] + ((m == 1 && is_leap(y)) ? 1 : 0 )) * 86400) tm.tm_year = 70; + while (t < 0) { + if (tm.tm_year == 0) + return (ISC_R_RANGE); + tm.tm_year--; + secs = year_secs(tm.tm_year + 1900); + t += secs; + } while ((secs = year_secs(tm.tm_year + 1900)) <= t) { t -= secs; tm.tm_year++; @@ -98,7 +107,6 @@ isc_result_t dns_time32_totext(isc_uint32_t value, isc_buffer_t *target) { isc_stdtime_t now; isc_int64_t start; - isc_int64_t base; isc_int64_t t; /* @@ -109,12 +117,10 @@ dns_time32_totext(isc_uint32_t value, isc_buffer_t *target) { */ isc_stdtime_get(&now); start = (isc_int64_t) now; - start -= 0x7fffffff; - base = 0; - while ((t = (base + value)) < start) { - base += 0x80000000; - base += 0x80000000; - } + if (isc_serial_gt(value, now)) + t = start + (value - now); + else + t = start - (now - value); return (dns_time64_totext(t, target)); } @@ -145,7 +151,7 @@ dns_time64_fromtext(const char *source, isc_int64_t *target) { &year, &month, &day, &hour, &minute, &second) != 6) return (DNS_R_SYNTAX); - RANGE(1970, 9999, year); + RANGE(0, 9999, year); RANGE(1, 12, month); RANGE(1, days[month - 1] + ((month == 2 && is_leap(year)) ? 1 : 0), day); @@ -154,16 +160,24 @@ dns_time64_fromtext(const char *source, isc_int64_t *target) { RANGE(0, 60, second); /* 60 == leap second. */ /* - * Calculate seconds since epoch. + * Calculate seconds from epoch. + * Note: this uses a idealized calendar. */ value = second + (60 * minute) + (3600 * hour) + ((day - 1) * 86400); for (i = 0; i < (month - 1); i++) value += days[i] * 86400; if (is_leap(year) && month > 2) value += 86400; - for (i = 1970; i < year; i++) { - secs = (is_leap(i) ? 366 : 365) * 86400; - value += secs; + if (year < 1970) { + for (i = 1969; i >= year; i--) { + secs = (is_leap(i) ? 366 : 365) * 86400; + value -= secs; + } + } else { + for (i = 1970; i < year; i++) { + secs = (is_leap(i) ? 366 : 365) * 86400; + value += secs; + } } *target = value; diff --git a/lib/dns/tkey.c b/lib/dns/tkey.c index a861ee3b7aa..887c356d1ea 100644 --- a/lib/dns/tkey.c +++ b/lib/dns/tkey.c @@ -16,7 +16,7 @@ */ /* - * $Id: tkey.c,v 1.100 2011-01-08 23:47:01 tbox Exp $ + * $Id: tkey.c,v 1.100.12.1 2011-03-11 06:47:05 marka Exp $ */ /*! \file */ #include @@ -75,7 +75,9 @@ _dns_tkey_dumpmessage(dns_message_t *msg) { isc_buffer_init(&outbuf, output, sizeof(output)); result = dns_message_totext(msg, &dns_master_style_debug, 0, &outbuf); - /* XXXMLG ignore result */ + if (result != ISC_R_SUCCESS) + fprintf(stderr, "Warning: dns_message_totext returned: %s\n", + dns_result_totext(result)); fprintf(stderr, "%.*s\n", (int)isc_buffer_usedlength(&outbuf), (char *)isc_buffer_base(&outbuf)); } @@ -179,8 +181,10 @@ add_rdata_to_list(dns_message_t *msg, dns_name_t *name, dns_rdata_t *rdata, failure: if (newrdata != NULL) { - if (ISC_LINK_LINKED(newrdata, link)) + if (ISC_LINK_LINKED(newrdata, link)) { + INSIST(newlist != NULL); ISC_LIST_UNLINK(newlist->rdata, newrdata, link); + } dns_message_puttemprdata(msg, &newrdata); } if (newname != NULL) @@ -518,7 +522,7 @@ process_gsstkey(dns_name_t *name, dns_rdata_tkey_t *tkeyin, tkeyout->expire = expire; } else { tkeyout->inception = tsigkey->inception; - tkeyout->expire = tkeyout->expire; + tkeyout->expire = tsigkey->expire; dns_tsigkey_detach(&tsigkey); } diff --git a/lib/dns/tsig.c b/lib/dns/tsig.c index cec5222f2f8..74ef8d424a2 100644 --- a/lib/dns/tsig.c +++ b/lib/dns/tsig.c @@ -16,7 +16,7 @@ */ /* - * $Id: tsig.c,v 1.147 2011-01-11 23:47:13 tbox Exp $ + * $Id: tsig.c,v 1.147.10.1 2011-03-21 19:53:34 each Exp $ */ /*! \file */ #include @@ -619,7 +619,7 @@ restore_key(dns_tsig_keyring_t *ring, isc_stdtime_t now, FILE *fp) { result = dns_tsigkey_createfromkey(name, algorithm, dstkey, ISC_TRUE, creator, inception, expire, ring->mctx, ring, NULL); - if (result != ISC_R_SUCCESS && dstkey != NULL) + if (dstkey != NULL) dst_key_free(&dstkey); return (result); } diff --git a/lib/dns/ttl.c b/lib/dns/ttl.c index 3e41d63b3b2..d31503ec3cb 100644 --- a/lib/dns/ttl.c +++ b/lib/dns/ttl.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ttl.c,v 1.29 2007-06-19 23:47:16 tbox Exp $ */ +/* $Id: ttl.c,v 1.29.814.2 2011-03-12 04:59:18 tbox Exp $ */ /*! \file */ @@ -86,6 +86,7 @@ dns_ttl_totext(isc_uint32_t src, isc_boolean_t verbose, isc_buffer_t *target) { hours = src % 24; src /= 24; days = src % 7; src /= 7; weeks = src; src = 0; + POST(src); x = 0; if (weeks != 0) { diff --git a/lib/dns/validator.c b/lib/dns/validator.c index 6c0d38dc71a..9c532a24541 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.197.40.3 2011-06-21 20:15:54 each Exp $ */ +/* $Id: validator.c,v 1.197.14.7 2011-06-08 23:02:43 each Exp $ */ #include @@ -330,7 +330,6 @@ isdelegation(dns_name_t *name, dns_rdataset_t *rdataset, dns_fixedname_init(&fixed); dns_name_downcase(name, dns_fixedname_name(&fixed), NULL); name = dns_fixedname_name(&fixed); - result = dns_rdataset_first(rdataset); for (result = dns_rdataset_first(rdataset); result == ISC_R_SUCCESS; result = dns_rdataset_next(rdataset)) @@ -514,7 +513,8 @@ dsfetched(isc_task_t *task, isc_event_t *event) { result = validatezonekey(val); if (result != DNS_R_WAIT) validator_done(val, result); - } else if (eresult == DNS_R_NXRRSET || + } else if (eresult == DNS_R_CNAME || + eresult == DNS_R_NXRRSET || eresult == DNS_R_NCACHENXRRSET || eresult == DNS_R_SERVFAIL) /* RFC 1034 parent? */ { @@ -582,12 +582,16 @@ dsfetched2(isc_task_t *task, isc_event_t *event) { LOCK(&val->lock); if (CANCELED(val)) { validator_done(val, ISC_R_CANCELED); - } else if (eresult == DNS_R_NXRRSET || eresult == DNS_R_NCACHENXRRSET) { + } else if (eresult == DNS_R_CNAME || + eresult == DNS_R_NXRRSET || + eresult == DNS_R_NCACHENXRRSET) + { /* * There is no DS. If this is a delegation, we're done. */ tname = dns_fixedname_name(&devent->foundname); - if (isdelegation(tname, &val->frdataset, eresult)) { + if (eresult != DNS_R_CNAME && + isdelegation(tname, &val->frdataset, eresult)) { if (val->mustbesecure) { validator_log(val, ISC_LOG_WARNING, "must be secure failure, no DS" @@ -780,6 +784,60 @@ dsvalidated(isc_task_t *task, isc_event_t *event) { destroy(val); } +/*% + * Callback when the CNAME record has been validated. + * + * Resumes validation of the unsecure zone proof. + */ +static void +cnamevalidated(isc_task_t *task, isc_event_t *event) { + dns_validatorevent_t *devent; + dns_validator_t *val; + isc_boolean_t want_destroy; + isc_result_t result; + isc_result_t eresult; + + UNUSED(task); + INSIST(event->ev_type == DNS_EVENT_VALIDATORDONE); + + devent = (dns_validatorevent_t *)event; + val = devent->ev_arg; + eresult = devent->result; + + isc_event_free(&event); + dns_validator_destroy(&val->subvalidator); + + INSIST(val->event != NULL); + INSIST((val->attributes & VALATTR_INSECURITY) != 0); + + validator_log(val, ISC_LOG_DEBUG(3), "in cnamevalidated"); + LOCK(&val->lock); + if (CANCELED(val)) { + validator_done(val, ISC_R_CANCELED); + } else if (eresult == ISC_R_SUCCESS) { + validator_log(val, ISC_LOG_DEBUG(3), "cname with trust %s", + dns_trust_totext(val->frdataset.trust)); + result = proveunsecure(val, ISC_FALSE, ISC_TRUE); + if (result != DNS_R_WAIT) + validator_done(val, result); + } else { + if (eresult != DNS_R_BROKENCHAIN) { + if (dns_rdataset_isassociated(&val->frdataset)) + dns_rdataset_expire(&val->frdataset); + if (dns_rdataset_isassociated(&val->fsigrdataset)) + dns_rdataset_expire(&val->fsigrdataset); + } + validator_log(val, ISC_LOG_DEBUG(3), + "cnamevalidated: got %s", + isc_result_totext(eresult)); + validator_done(val, DNS_R_BROKENCHAIN); + } + want_destroy = exit_check(val); + UNLOCK(&val->lock); + if (want_destroy) + destroy(val); +} + /*% * Return ISC_R_SUCCESS if we can determine that the name doesn't exist * or we can determine whether there is data or not at the name. @@ -1236,7 +1294,6 @@ authvalidated(isc_task_t *task, isc_event_t *event) { dns_validatorevent_t *devent; dns_validator_t *val; dns_rdataset_t *rdataset; - dns_rdataset_t *sigrdataset; isc_boolean_t want_destroy; isc_result_t result; isc_boolean_t exists, data; @@ -1246,7 +1303,6 @@ authvalidated(isc_task_t *task, isc_event_t *event) { devent = (dns_validatorevent_t *)event; rdataset = devent->rdataset; - sigrdataset = devent->sigrdataset; val = devent->ev_arg; result = devent->result; dns_validator_destroy(&val->subvalidator); @@ -2004,7 +2060,8 @@ validate(dns_validator_t *val, isc_boolean_t resume) { isc_stdtime_get(&now); ttl = ISC_MIN(event->rdataset->ttl, - val->siginfo->timeexpire - now); + ISC_MIN(val->siginfo->originalttl, + val->siginfo->timeexpire - now)); event->rdataset->ttl = ttl; event->sigrdataset->ttl = ttl; } @@ -2454,8 +2511,10 @@ validatezonekey(dns_validator_t *val) { validator_log(val, ISC_LOG_DEBUG(2), "unsigned DS record"); return (DNS_R_NOVALIDSIG); - } else + } else { result = ISC_R_SUCCESS; + POST(result); + } } else if (result == ISC_R_NOTFOUND) { /* * We don't have the DS. Find it. @@ -2466,11 +2525,12 @@ validatezonekey(dns_validator_t *val) { if (result != ISC_R_SUCCESS) return (result); return (DNS_R_WAIT); - } else if (result == DNS_R_NCACHENXDOMAIN || + } else if (result == DNS_R_NCACHENXDOMAIN || result == DNS_R_NCACHENXRRSET || result == DNS_R_EMPTYNAME || result == DNS_R_NXDOMAIN || - result == DNS_R_NXRRSET) + result == DNS_R_NXRRSET || + result == DNS_R_CNAME) { /* * The DS does not exist. @@ -2855,6 +2915,7 @@ findnsec3proofs(dns_validator_t *val) { } if (result != ISC_R_NOMORE) result = ISC_R_SUCCESS; + POST(result); if (dns_name_countlabels(zonename) == 0) return (ISC_R_SUCCESS); @@ -2987,13 +3048,11 @@ validate_authority(dns_validator_t *val, isc_boolean_t resume) { * infinite loop. Avoid that. */ if (val->event->type == dns_rdatatype_dnskey && + rdataset->type == dns_rdatatype_nsec && dns_name_equal(name, val->event->name)) { dns_rdata_t nsec = DNS_RDATA_INIT; - if (rdataset->type != dns_rdatatype_nsec) - continue; - result = dns_rdataset_first(rdataset); if (result != ISC_R_SUCCESS) return (result); @@ -3067,13 +3126,11 @@ validate_ncache(dns_validator_t *val, isc_boolean_t resume) { * infinite loop. Avoid that. */ if (val->event->type == dns_rdatatype_dnskey && + rdataset->type == dns_rdatatype_nsec && dns_name_equal(name, val->event->name)) { dns_rdata_t nsec = DNS_RDATA_INIT; - if (rdataset->type != dns_rdatatype_nsec) - continue; - result = dns_rdataset_first(rdataset); if (result != ISC_R_SUCCESS) return (result); @@ -3744,6 +3801,20 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) return (startfinddlvsep(val, tname)); } continue; + } else if (result == DNS_R_CNAME) { + if (DNS_TRUST_PENDING(val->frdataset.trust) || + DNS_TRUST_ANSWER(val->frdataset.trust)) { + result = create_validator(val, tname, + dns_rdatatype_cname, + &val->frdataset, + NULL, cnamevalidated, + "proveunsecure " + "(cname)"); + if (result != ISC_R_SUCCESS) + goto out; + return (DNS_R_WAIT); + } + continue; } else if (result == ISC_R_SUCCESS) { /* * There is a DS here. Verify that it's secure and @@ -4014,9 +4085,9 @@ dns_validator_create(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type, isc_task_t *task, isc_taskaction_t action, void *arg, dns_validator_t **validatorp) { - isc_result_t result; + isc_result_t result = ISC_R_FAILURE; dns_validator_t *val; - isc_task_t *tclone; + isc_task_t *tclone = NULL; dns_validatorevent_t *event; REQUIRE(name != NULL); @@ -4024,9 +4095,6 @@ dns_validator_create(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type, (rdataset == NULL && sigrdataset == NULL && message != NULL)); REQUIRE(validatorp != NULL && *validatorp == NULL); - tclone = NULL; - result = ISC_R_FAILURE; - val = isc_mem_get(view->mctx, sizeof(*val)); if (val == NULL) return (ISC_R_NOMEMORY); diff --git a/lib/dns/view.c b/lib/dns/view.c index 24f925a010e..034c44eaf9b 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.c,v 1.178 2011-01-13 09:53:04 marka Exp $ */ +/* $Id: view.c,v 1.178.8.1 2011-03-11 06:47:06 marka Exp $ */ /*! \file */ @@ -1160,7 +1160,7 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname, { isc_result_t result; dns_db_t *db; - isc_boolean_t is_cache, use_zone, try_hints, is_staticstub_zone; + isc_boolean_t is_cache, use_zone, try_hints; dns_zone_t *zone; dns_name_t *zfname; dns_rdataset_t zrdataset, zsigrdataset; @@ -1172,7 +1172,6 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname, db = NULL; zone = NULL; use_zone = ISC_FALSE; - is_staticstub_zone = ISC_FALSE; try_hints = ISC_FALSE; zfname = NULL; @@ -1188,11 +1187,8 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname, */ #ifdef BIND9 result = dns_zt_find(view->zonetable, name, 0, NULL, &zone); - if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) { + if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) result = dns_zone_getdb(zone, &db); - if (dns_zone_gettype(zone) == dns_zone_staticstub) - is_staticstub_zone = ISC_TRUE; - } #else result = ISC_R_NOTFOUND; #endif @@ -1391,6 +1387,7 @@ dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name, if (result == DNS_R_PARTIALMATCH) { dns_zone_detach(zp); result = ISC_R_NOTFOUND; + POST(result); } if (zone2 != NULL) { diff --git a/lib/dns/xfrin.c b/lib/dns/xfrin.c index 210bca9f831..f87344b1e5f 100644 --- a/lib/dns/xfrin.c +++ b/lib/dns/xfrin.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: xfrin.c,v 1.166.522.2.2.1 2011-06-02 23:47:35 tbox Exp $ */ +/* $Id: xfrin.c,v 1.166.522.4 2011-03-11 06:47:06 marka Exp $ */ /*! \file */ @@ -1247,7 +1247,7 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) { result = DNS_R_UNEXPECTEDID; if (xfr->reqtype == dns_rdatatype_axfr || xfr->reqtype == dns_rdatatype_soa) - FAIL(result); + goto failure; xfrin_log(xfr, ISC_LOG_DEBUG(3), "got %s, retrying with AXFR", isc_result_totext(result)); try_axfr: @@ -1283,7 +1283,7 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) { if (result != ISC_R_SUCCESS) { xfrin_log(xfr, ISC_LOG_DEBUG(3), "TSIG check failed: %s", isc_result_totext(result)); - FAIL(result); + goto failure; } for (result = dns_message_firstname(msg, DNS_SECTION_ANSWER); diff --git a/lib/dns/zone.c b/lib/dns/zone.c index c727c2e2206..9e05684ee4e 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zone.c,v 1.582.8.7 2011-02-18 23:23:08 each Exp $ */ +/* $Id: zone.c,v 1.582.8.26 2011-08-09 02:34:24 marka Exp $ */ /*! \file */ @@ -109,12 +109,20 @@ #define NSEC3REMOVE(x) (((x) & DNS_NSEC3FLAG_REMOVE) != 0) +/*% + * Key flags + */ +#define REVOKE(x) ((dst_key_flags(x) & DNS_KEYFLAG_REVOKE) != 0) +#define KSK(x) ((dst_key_flags(x) & DNS_KEYFLAG_KSK) != 0) +#define ALG(x) dst_key_alg(x) + /* * Default values. */ #define DNS_DEFAULT_IDLEIN 3600 /*%< 1 hour */ #define DNS_DEFAULT_IDLEOUT 3600 /*%< 1 hour */ #define MAX_XFER_TIME (2*3600) /*%< Documented default is 2 hours */ +#define RESIGN_DELAY 3600 /*%< 1 hour */ #ifndef DNS_MAX_EXPIRE #define DNS_MAX_EXPIRE 14515200 /*%< 24 weeks */ @@ -213,6 +221,7 @@ struct dns_zone { isc_uint32_t expire; isc_uint32_t minimum; isc_stdtime_t key_expiry; + isc_stdtime_t log_key_expired_timer; char *keydirectory; isc_uint32_t maxrefresh; @@ -660,6 +669,8 @@ static isc_result_t delete_nsec(dns_db_t *db, dns_dbversion_t *ver, dns_dbnode_t *node, dns_name_t *name, dns_diff_t *diff); static void zone_rekey(dns_zone_t *zone); +static isc_boolean_t delsig_ok(dns_rdata_rrsig_t *rrsig_ptr, + dst_key_t **keys, unsigned int nkeys); #define ENTER zone_debuglog(zone, me, 1, "enter") @@ -805,6 +816,7 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) { zone->timer = NULL; zone->idlein = DNS_DEFAULT_IDLEIN; zone->idleout = DNS_DEFAULT_IDLEOUT; + zone->log_key_expired_timer = 0; ISC_LIST_INIT(zone->notifies); isc_sockaddr_any(&zone->notifysrc4); isc_sockaddr_any6(&zone->notifysrc6); @@ -1379,6 +1391,7 @@ zone_load(dns_zone_t *zone, unsigned int flags) { isc_time_t now; isc_time_t loadtime, filetime; dns_db_t *db = NULL; + isc_boolean_t rbt; REQUIRE(DNS_ZONE_VALID(zone)); @@ -1394,14 +1407,15 @@ zone_load(dns_zone_t *zone, unsigned int flags) { goto cleanup; } - if (zone->db != NULL && zone->masterfile == NULL) { + + INSIST(zone->db_argc >= 1); + + rbt = strcmp(zone->db_argv[0], "rbt") == 0 || + strcmp(zone->db_argv[0], "rbt64") == 0; + + if (zone->db != NULL && zone->masterfile == NULL && rbt) { /* - * The zone has no master file configured, but it already - * has a database. It could be the built-in - * version.bind. CH zone, a zone with a persistent - * database being reloaded, or maybe a zone that - * used to have a master file but whose configuration - * was changed so that it no longer has one. Do nothing. + * The zone has no master file configured. */ result = ISC_R_SUCCESS; goto cleanup; @@ -1420,7 +1434,6 @@ zone_load(dns_zone_t *zone, unsigned int flags) { goto cleanup; } - /* * Store the current time before the zone is loaded, so that if the * file changes between the time of the load and the time that @@ -1463,21 +1476,20 @@ zone_load(dns_zone_t *zone, unsigned int flags) { } } - INSIST(zone->db_argc >= 1); - /* - * Built in zones don't need to be reloaded. + * Built in zones (with the exception of empty zones) don't need + * to be reloaded. */ if (zone->type == dns_zone_master && strcmp(zone->db_argv[0], "_builtin") == 0 && + (zone->db_argc < 2 || strcmp(zone->db_argv[1], "empty") != 0) && DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED)) { result = ISC_R_SUCCESS; goto cleanup; } if ((zone->type == dns_zone_slave || zone->type == dns_zone_stub) && - (strcmp(zone->db_argv[0], "rbt") == 0 || - strcmp(zone->db_argv[0], "rbt64") == 0)) { + rbt) { if (zone->masterfile == NULL || !isc_file_exists(zone->masterfile)) { if (zone->masterfile != NULL) { @@ -1993,8 +2005,7 @@ zone_check_glue(dns_zone_t *zone, dns_db_t *db, dns_name_t *name, dns_rdataset_disassociate(&aaaa); return (answer); } - } else - tresult = result; + } dns_name_format(owner, ownerbuf, sizeof ownerbuf); dns_name_format(name, namebuf, sizeof namebuf); @@ -2840,16 +2851,15 @@ compute_tag(dns_name_t *name, dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx, } /* - * Add key to the security roots for all views. + * Add key to the security roots. */ static void -trust_key(dns_viewlist_t *viewlist, dns_name_t *keyname, +trust_key(dns_zone_t *zone, dns_name_t *keyname, dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx) { isc_result_t result; dns_rdata_t rdata = DNS_RDATA_INIT; unsigned char data[4096]; isc_buffer_t buffer; - dns_view_t *view; dns_keytable_t *sr = NULL; dst_key_t *dstkey = NULL; @@ -2858,17 +2868,13 @@ trust_key(dns_viewlist_t *viewlist, dns_name_t *keyname, dns_rdata_fromstruct(&rdata, dnskey->common.rdclass, dns_rdatatype_dnskey, dnskey, &buffer); - for (view = ISC_LIST_HEAD(*viewlist); view != NULL; - view = ISC_LIST_NEXT(view, link)) { + result = dns_view_getsecroots(zone->view, &sr); + if (result != ISC_R_SUCCESS) + goto failure; - result = dns_view_getsecroots(view, &sr); - if (result != ISC_R_SUCCESS) - continue; - - CHECK(dns_dnssec_keyfromrdata(keyname, &rdata, mctx, &dstkey)); - CHECK(dns_keytable_add(sr, ISC_TRUE, &dstkey)); - dns_keytable_detach(&sr); - } + CHECK(dns_dnssec_keyfromrdata(keyname, &rdata, mctx, &dstkey)); + CHECK(dns_keytable_add(sr, ISC_TRUE, &dstkey)); + dns_keytable_detach(&sr); failure: if (dstkey != NULL) @@ -2879,37 +2885,16 @@ trust_key(dns_viewlist_t *viewlist, dns_name_t *keyname, } /* - * Remove key from the security roots for all views. - */ -static void -untrust_key(dns_viewlist_t *viewlist, dns_name_t *keyname, isc_mem_t *mctx, - dns_rdata_dnskey_t *dnskey) -{ - dns_view_t *view; - - for (view = ISC_LIST_HEAD(*viewlist); view != NULL; - view = ISC_LIST_NEXT(view, link)) - dns_view_untrust(view, keyname, dnskey, mctx); -} - -/* - * Add a null key to the security roots for all views, so that all queries + * Add a null key to the security roots for so that all queries * to the zone will fail. */ static void -fail_secure(dns_viewlist_t *viewlist, dns_name_t *keyname) { +fail_secure(dns_zone_t *zone, dns_name_t *keyname) { isc_result_t result; - dns_view_t *view; - - for (view = ISC_LIST_HEAD(*viewlist); - view != NULL; - view = ISC_LIST_NEXT(view, link)) { - dns_keytable_t *sr = NULL; - - result = dns_view_getsecroots(view, &sr); - if (result != ISC_R_SUCCESS) - continue; + dns_keytable_t *sr = NULL; + result = dns_view_getsecroots(zone->view, &sr); + if (result == ISC_R_SUCCESS) { dns_keytable_marksecure(sr, keyname); dns_keytable_detach(&sr); } @@ -2917,8 +2902,7 @@ fail_secure(dns_viewlist_t *viewlist, dns_name_t *keyname) { /* * Scan a set of KEYDATA records from the key zone. The ones that are - * valid (i.e., the add holddown timer has expired) become trusted keys for - * all views. + * valid (i.e., the add holddown timer has expired) become trusted keys. */ static void load_secroots(dns_zone_t *zone, dns_name_t *name, dns_rdataset_t *rdataset) { @@ -2927,22 +2911,14 @@ load_secroots(dns_zone_t *zone, dns_name_t *name, dns_rdataset_t *rdataset) { dns_rdata_keydata_t keydata; dns_rdata_dnskey_t dnskey; isc_mem_t *mctx = zone->mctx; - dns_view_t *view = zone->view; - dns_viewlist_t *viewlist = view->viewlist; int trusted = 0, revoked = 0, pending = 0; isc_stdtime_t now; + dns_keytable_t *sr = NULL; isc_stdtime_get(&now); - /* For each view, delete references to this key from secroots. */ - for (view = ISC_LIST_HEAD(*viewlist); view != NULL; - view = ISC_LIST_NEXT(view, link)) { - dns_keytable_t *sr = NULL; - - result = dns_view_getsecroots(view, &sr); - if (result != ISC_R_SUCCESS) - continue; - + result = dns_view_getsecroots(zone->view, &sr); + if (result == ISC_R_SUCCESS) { dns_keytable_delete(sr, name); dns_keytable_detach(&sr); } @@ -2980,7 +2956,7 @@ load_secroots(dns_zone_t *zone, dns_name_t *name, dns_rdataset_t *rdataset) { /* Add to keytables. */ trusted++; - trust_key(viewlist, name, &dnskey, mctx); + trust_key(zone, name, &dnskey, mctx); } if (trusted == 0 && pending != 0) { @@ -2993,7 +2969,7 @@ load_secroots(dns_zone_t *zone, dns_name_t *name, dns_rdataset_t *rdataset) { revoked, pending); dns_zone_log(zone, ISC_LOG_ERROR, "All queries to '%s' will fail", namebuf); - fail_secure(viewlist, name); + fail_secure(zone, name); } } @@ -3167,6 +3143,7 @@ static isc_result_t sync_keyzone(dns_zone_t *zone, dns_db_t *db) { isc_result_t result = ISC_R_SUCCESS; isc_boolean_t changed = ISC_FALSE; + isc_boolean_t commit = ISC_FALSE; dns_rbtnodechain_t chain; dns_fixedname_t fn; dns_name_t foundname, *origin; @@ -3288,12 +3265,12 @@ sync_keyzone(dns_zone_t *zone, dns_db_t *db) { if (changed) { /* Write changes to journal file. */ - result = increment_soa_serial(db, ver, &diff, zone->mctx); - if (result == ISC_R_SUCCESS) - zone_journal(zone, &diff, "sync_keyzone"); + CHECK(increment_soa_serial(db, ver, &diff, zone->mctx)); + CHECK(zone_journal(zone, &diff, "sync_keyzone")); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED); zone_needdump(zone, 30); + commit = ISC_TRUE; } failure: @@ -3302,7 +3279,7 @@ sync_keyzone(dns_zone_t *zone, dns_db_t *db) { if (sr != NULL) dns_keytable_detach(&sr); if (ver != NULL) - dns_db_closeversion(db, &ver, changed); + dns_db_closeversion(db, &ver, commit); dns_diff_clear(&diff); return (result); @@ -3500,7 +3477,8 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, dns_zone_log(zone, ISC_LOG_ERROR, "zone serial (%u/%u) has gone " "backwards", serial, oldserial); - else if (serial == oldserial && !hasinclude) + else if (serial == oldserial && !hasinclude && + strcmp(zone->db_argv[0], "_builtin") != 0) dns_zone_log(zone, ISC_LOG_ERROR, "zone serial (%u) unchanged. " "zone may fail to transfer " @@ -3617,6 +3595,39 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, resume_signingwithkey(zone); resume_addnsec3chain(zone); } + + if (zone->type == dns_zone_master && + zone_isdynamic(zone) && + dns_db_issecure(db)) { + dns_name_t *name; + dns_fixedname_t fixed; + dns_rdataset_t next; + + dns_rdataset_init(&next); + dns_fixedname_init(&fixed); + name = dns_fixedname_name(&fixed); + + result = dns_db_getsigningtime(db, &next, name); + if (result == ISC_R_SUCCESS) { + isc_stdtime_t timenow; + char namebuf[DNS_NAME_FORMATSIZE]; + char typebuf[DNS_RDATATYPE_FORMATSIZE]; + + isc_stdtime_get(&timenow); + dns_name_format(name, namebuf, sizeof(namebuf)); + dns_rdatatype_format(next.covers, + typebuf, sizeof(typebuf)); + dns_zone_log(zone, ISC_LOG_DEBUG(3), + "next resign: %s/%s in %d seconds", + namebuf, typebuf, + next.resign - timenow); + dns_rdataset_disassociate(&next); + } else + dns_zone_log(zone, ISC_LOG_WARNING, + "signed dynamic zone has no " + "resign event scheduled"); + } + zone_settimer(zone, &now); } @@ -4520,6 +4531,7 @@ static void set_key_expiry_warning(dns_zone_t *zone, isc_stdtime_t when, isc_stdtime_t now) { unsigned int delta; + char timebuf[80]; zone->key_expiry = when; if (when <= now) { @@ -4527,22 +4539,59 @@ set_key_expiry_warning(dns_zone_t *zone, isc_stdtime_t when, isc_stdtime_t now) "DNSKEY RRSIG(s) have expired"); isc_time_settoepoch(&zone->keywarntime); } else if (when < now + 7 * 24 * 3600) { + isc_time_t t; + isc_time_set(&t, when, 0); + isc_time_formattimestamp(&t, timebuf, 80); dns_zone_log(zone, ISC_LOG_WARNING, - "DNSKEY RRSIG(s) will expire at %u", - when); /* XXXMPA convert to date. */ + "DNSKEY RRSIG(s) will expire within 7 days: %s", + timebuf); delta = when - now; delta--; /* loop prevention */ delta /= 24 * 3600; /* to whole days */ delta *= 24 * 3600; /* to seconds */ isc_time_set(&zone->keywarntime, when - delta, 0); } else { - dns_zone_log(zone, ISC_LOG_NOTICE, /* XXMPA ISC_LOG_DEBUG(1) */ - "setting keywarntime to %u - 7 days", - when); /* XXXMPA convert to date. */ isc_time_set(&zone->keywarntime, when - 7 * 24 * 3600, 0); + isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80); + dns_zone_log(zone, ISC_LOG_NOTICE, + "setting keywarntime to %s", timebuf); } } +/* + * Helper function to del_sigs(). We don't want to delete RRSIGs that + * have no new key. + */ +static isc_boolean_t +delsig_ok(dns_rdata_rrsig_t *rrsig_ptr, dst_key_t **keys, unsigned int nkeys) { + unsigned int i = 0; + + /* + * It's okay to delete a signature if there is an active ZSK + * with the same algorithm + */ + for (i = 0; i < nkeys; i++) { + if (rrsig_ptr->algorithm == dst_key_alg(keys[i]) && + (dst_key_isprivate(keys[i])) && !KSK(keys[i])) + return (ISC_TRUE); + } + + /* + * Failing that, it is *not* okay to delete a signature + * if the associated public key is still in the DNSKEY RRset + */ + for (i = 0; i < nkeys; i++) { + if ((rrsig_ptr->algorithm == dst_key_alg(keys[i])) && + (rrsig_ptr->keyid == dst_key_id(keys[i]))) + return (ISC_FALSE); + } + + /* + * But if the key is gone, then go ahead. + */ + return (ISC_TRUE); +} + /* * Delete expired RRsigs and any RRsigs we are about to re-sign. * See also update.c:del_keysigs(). @@ -4550,7 +4599,7 @@ set_key_expiry_warning(dns_zone_t *zone, isc_stdtime_t when, isc_stdtime_t now) static isc_result_t del_sigs(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, dns_rdatatype_t type, dns_diff_t *diff, dst_key_t **keys, - unsigned int nkeys, isc_stdtime_t now) + unsigned int nkeys, isc_stdtime_t now, isc_boolean_t incremental) { isc_result_t result; dns_dbnode_t *node = NULL; @@ -4558,7 +4607,7 @@ del_sigs(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, dns_rdata_t rdata = DNS_RDATA_INIT; unsigned int i; dns_rdata_rrsig_t rrsig; - isc_boolean_t found; + isc_boolean_t found, changed; isc_stdtime_t warn = 0, maybe = 0; dns_rdataset_init(&rdataset); @@ -4584,6 +4633,7 @@ del_sigs(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, goto failure; } + changed = ISC_FALSE; for (result = dns_rdataset_first(&rdataset); result == ISC_R_SUCCESS; result = dns_rdataset_next(&rdataset)) { @@ -4592,12 +4642,56 @@ del_sigs(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, RUNTIME_CHECK(result == ISC_R_SUCCESS); if (type != dns_rdatatype_dnskey) { - result = update_one_rr(db, ver, diff, + if (delsig_ok(&rrsig, keys, nkeys)) { + result = update_one_rr(db, ver, diff, DNS_DIFFOP_DELRESIGN, name, rdataset.ttl, &rdata); - dns_rdata_reset(&rdata); - if (result != ISC_R_SUCCESS) - break; + if (incremental) + changed = ISC_TRUE; + dns_rdata_reset(&rdata); + if (result != ISC_R_SUCCESS) + break; + } else { + /* + * At this point, we've got an RRSIG, + * which is signed by an inactive key. + * An administrator needs to provide a new + * key/alg, but until that time, we want to + * keep the old RRSIG. Marking the key as + * offline will prevent us spinning waiting + * for the private part. + */ + if (incremental) { + result = offline(db, ver, diff, name, + rdataset.ttl, &rdata); + changed = ISC_TRUE; + if (result != ISC_R_SUCCESS) + break; + } + + /* + * Log the key id and algorithm of + * the inactive key with no replacement + */ + if (zone->log_key_expired_timer <= now) { + char origin[DNS_NAME_FORMATSIZE]; + char algbuf[DNS_NAME_FORMATSIZE]; + dns_name_format(&zone->origin, origin, + sizeof(origin)); + dns_secalg_format(rrsig.algorithm, + algbuf, + sizeof(algbuf)); + dns_zone_log(zone, ISC_LOG_WARNING, + "Key %s/%s/%d " + "missing or inactive " + "and has no replacement: " + "retaining signatures.", + origin, algbuf, + rrsig.keyid); + zone->log_key_expired_timer = now + + 3600; + } + } continue; } @@ -4641,6 +4735,7 @@ del_sigs(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, break; } } + /* * If there is not a matching DNSKEY then * delete the RRSIG. @@ -4653,6 +4748,10 @@ del_sigs(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, if (result != ISC_R_SUCCESS) break; } + + if (changed && (rdataset.attributes & DNS_RDATASETATTR_RESIGN) != 0) + dns_db_resigned(db, &rdataset, ver); + dns_rdataset_disassociate(&rdataset); if (result == ISC_R_NOMORE) result = ISC_R_SUCCESS; @@ -4702,10 +4801,6 @@ add_sigs(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, goto failure; } -#define REVOKE(x) ((dst_key_flags(x) & DNS_KEYFLAG_REVOKE) != 0) -#define KSK(x) ((dst_key_flags(x) & DNS_KEYFLAG_KSK) != 0) -#define ALG(x) dst_key_alg(x) - for (i = 0; i < nkeys; i++) { isc_boolean_t both = ISC_FALSE; @@ -4844,6 +4939,8 @@ zone_resigninc(dns_zone_t *zone) { while (result == ISC_R_SUCCESS) { resign = rdataset.resign; covers = rdataset.covers; + dns_rdataset_disassociate(&rdataset); + /* * Stop if we hit the SOA as that means we have walked the * entire zone. The SOA record should always be the most @@ -4851,27 +4948,18 @@ zone_resigninc(dns_zone_t *zone) { */ /* XXXMPA increase number of RRsets signed pre call */ if (covers == dns_rdatatype_soa || i++ > zone->signatures || - resign > stop) { - /* - * Ensure that we don't loop resigning the SOA. - */ - if (covers == dns_rdatatype_soa) - dns_db_resigned(db, &rdataset, version); - dns_rdataset_disassociate(&rdataset); + resign > stop) break; - } - - dns_db_resigned(db, &rdataset, version); - dns_rdataset_disassociate(&rdataset); result = del_sigs(zone, db, version, name, covers, &sig_diff, - zone_keys, nkeys, now); + zone_keys, nkeys, now, ISC_TRUE); if (result != ISC_R_SUCCESS) { dns_zone_log(zone, ISC_LOG_ERROR, "zone_resigninc:del_sigs -> %s\n", dns_result_totext(result)); break; } + result = add_sigs(db, version, name, covers, &sig_diff, zone_keys, nkeys, zone->mctx, inception, expire, check_ksk, keyset_kskonly); @@ -4897,7 +4985,7 @@ zone_resigninc(dns_zone_t *zone) { goto failure; result = del_sigs(zone, db, version, &zone->origin, dns_rdatatype_soa, - &sig_diff, zone_keys, nkeys, now); + &sig_diff, zone_keys, nkeys, now, ISC_TRUE); if (result != ISC_R_SUCCESS) { dns_zone_log(zone, ISC_LOG_ERROR, "zone_resigninc:del_sigs -> %s\n", @@ -4905,6 +4993,13 @@ zone_resigninc(dns_zone_t *zone) { goto failure; } + /* + * Did we change anything in the zone? + */ + if (ISC_LIST_EMPTY(sig_diff.tuples)) + goto failure; + + /* Increment SOA serial if we have made changes */ result = increment_soa_serial(db, version, &sig_diff, zone->mctx); if (result != ISC_R_SUCCESS) { dns_zone_log(zone, ISC_LOG_ERROR, @@ -4928,7 +5023,7 @@ zone_resigninc(dns_zone_t *zone) { } /* Write changes to journal file. */ - zone_journal(zone, &sig_diff, "zone_resigninc"); + CHECK(zone_journal(zone, &sig_diff, "zone_resigninc")); /* Everything has succeeded. Commit the changes. */ dns_db_closeversion(db, &version, ISC_TRUE); @@ -5614,7 +5709,7 @@ update_sigs(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *version, tuple = ISC_LIST_HEAD(diff->tuples)) { result = del_sigs(zone, db, version, &tuple->name, tuple->rdata.type, sig_diff, - zone_keys, nkeys, now); + zone_keys, nkeys, now, ISC_FALSE); if (result != ISC_R_SUCCESS) { dns_zone_log(zone, ISC_LOG_ERROR, "update_sigs:del_sigs -> %s\n", @@ -5668,11 +5763,11 @@ zone_nsec3chain(dns_zone_t *zone) { dns_nsec3chainlist_t cleanup; dst_key_t *zone_keys[MAXZONEKEYS]; isc_int32_t signatures; - isc_boolean_t check_ksk, keyset_kskonly, is_ksk; + isc_boolean_t check_ksk, keyset_kskonly; isc_boolean_t delegation; isc_boolean_t first; isc_result_t result; - isc_stdtime_t now, inception, soaexpire, expire, stop; + isc_stdtime_t now, inception, soaexpire, expire; isc_uint32_t jitter; unsigned int i; unsigned int nkeys = 0; @@ -5737,7 +5832,6 @@ zone_nsec3chain(dns_zone_t *zone) { */ isc_random_get(&jitter); expire = soaexpire - jitter % 3600; - stop = now + 5; check_ksk = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_UPDATECHECKKSK); keyset_kskonly = DNS_ZONE_OPTION(zone, DNS_ZONEOPT_DNSKEYKSKONLY); @@ -5783,8 +5877,6 @@ zone_nsec3chain(dns_zone_t *zone) { if (NSEC3REMOVE(nsec3chain->nsec3param.flags)) goto next_addchain; - is_ksk = ISC_FALSE; - delegation = ISC_FALSE; dns_dbiterator_current(nsec3chain->dbiterator, &node, name); if (nsec3chain->delete_nsec) { @@ -6170,6 +6262,12 @@ zone_nsec3chain(dns_zone_t *zone) { result = dns_db_getoriginnode(db, &node); RUNTIME_CHECK(result == ISC_R_SUCCESS); result = dns_db_allrdatasets(db, node, version, 0, &iterator); + if (result != ISC_R_SUCCESS) { + dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:" + "dns_db_allrdatasets -> %s\n", + dns_result_totext(result)); + goto failure; + } for (result = dns_rdatasetiter_first(iterator); result == ISC_R_SUCCESS; result = dns_rdatasetiter_next(iterator)) { @@ -6267,7 +6365,7 @@ zone_nsec3chain(dns_zone_t *zone) { goto done; result = del_sigs(zone, db, version, &zone->origin, dns_rdatatype_soa, - &sig_diff, zone_keys, nkeys, now); + &sig_diff, zone_keys, nkeys, now, ISC_FALSE); if (result != ISC_R_SUCCESS) { dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:" "del_sigs -> %s\n", dns_result_totext(result)); @@ -6292,10 +6390,11 @@ zone_nsec3chain(dns_zone_t *zone) { } /* Write changes to journal file. */ - zone_journal(zone, &sig_diff, "zone_nsec3chain"); + CHECK(zone_journal(zone, &sig_diff, "zone_nsec3chain")); LOCK_ZONE(zone); zone_needdump(zone, DNS_DUMP_DELAY); + DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NEEDNOTIFY); UNLOCK_ZONE(zone); done: @@ -6502,12 +6601,11 @@ zone_sign(dns_zone_t *zone) { isc_boolean_t build_nsec3 = ISC_FALSE; isc_boolean_t first; isc_result_t result; - isc_stdtime_t now, inception, soaexpire, expire, stop; + isc_stdtime_t now, inception, soaexpire, expire; isc_uint32_t jitter; unsigned int i, j; unsigned int nkeys = 0; isc_uint32_t nodes; - isc_boolean_t was_ksk; dns_rdataset_init(&rdataset); dns_fixedname_init(&fixed); @@ -6559,7 +6657,6 @@ zone_sign(dns_zone_t *zone) { */ isc_random_get(&jitter); expire = soaexpire - jitter % 3600; - stop = now + 5; /* * We keep pulling nodes off each iterator in turn until @@ -6604,8 +6701,6 @@ zone_sign(dns_zone_t *zone) { delegation = ISC_FALSE; - was_ksk = ISC_FALSE; - if (first && signing->delete) { /* * Remove the key we are deleting from consideration. @@ -6831,7 +6926,7 @@ zone_sign(dns_zone_t *zone) { commit = ISC_TRUE; result = del_sigs(zone, db, version, &zone->origin, dns_rdatatype_soa, - &sig_diff, zone_keys, nkeys, now); + &sig_diff, zone_keys, nkeys, now, ISC_FALSE); if (result != ISC_R_SUCCESS) { dns_zone_log(zone, ISC_LOG_ERROR, "zone_sign:del_sigs -> %s\n", @@ -6864,9 +6959,7 @@ zone_sign(dns_zone_t *zone) { /* * Write changes to journal file. */ - result = zone_journal(zone, &sig_diff, "zone_sign"); - if (result != ISC_R_SUCCESS) - goto failure; + CHECK(zone_journal(zone, &sig_diff, "zone_sign")); pauseall: /* @@ -7048,6 +7141,7 @@ refresh_time(dns_keyfetch_t *kfetch, isc_boolean_t retry) { dns_rdataset_current(rdset, &sigrr); result = dns_rdata_tostruct(&sigrr, &sig, NULL); + RUNTIME_CHECK(result == ISC_R_SUCCESS); if (!retry) { t = sig.originalttl / 2; @@ -7215,8 +7309,8 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { dns_keytable_t *secroots = NULL; dns_dbversion_t *ver = NULL; dns_diff_t diff; - isc_boolean_t changed = ISC_FALSE; isc_boolean_t alldone = ISC_FALSE; + isc_boolean_t commit = ISC_FALSE; dns_name_t *keyname; dns_rdata_t sigrr = DNS_RDATA_INIT; dns_rdata_t dnskeyrr = DNS_RDATA_INIT; @@ -7232,6 +7326,7 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { isc_stdtime_t now; int pending = 0; isc_boolean_t secure; + isc_boolean_t free_needed; UNUSED(task); INSIST(event != NULL && event->ev_type == DNS_EVENT_FETCHDONE); @@ -7253,15 +7348,20 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { isc_event_free(&event); dns_resolver_destroyfetch(&kfetch->fetch); + LOCK_ZONE(zone); + if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_EXITING) || zone->view == NULL) + goto cleanup; + isc_stdtime_get(&now); dns_name_format(keyname, namebuf, sizeof(namebuf)); result = dns_view_getsecroots(zone->view, &secroots); INSIST(result == ISC_R_SUCCESS); - LOCK_ZONE(zone); - dns_db_newversion(kfetch->db, &ver); dns_diff_init(mctx, &diff); + diff.resign = zone->sigresigninginterval; + + CHECK(dns_db_newversion(kfetch->db, &ver)); zone->refreshkeycount--; alldone = ISC_TF(zone->refreshkeycount == 0); @@ -7276,8 +7376,7 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { "Unable to fetch DNSKEY set " "'%s': %s", namebuf, dns_result_totext(eresult)); CHECK(minimal_update(kfetch, ver, &diff)); - changed = ISC_TRUE; - goto failure; + goto done; } /* No RRSIGs found */ @@ -7286,8 +7385,7 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { "No DNSKEY RRSIGs found for " "'%s': %s", namebuf, dns_result_totext(eresult)); CHECK(minimal_update(kfetch, ver, &diff)); - changed = ISC_TRUE; - goto failure; + goto done; } /* @@ -7415,7 +7513,6 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { CHECK(update_one_rr(kfetch->db, ver, &diff, DNS_DIFFOP_DEL, keyname, 0, &keydatarr)); - changed = ISC_TRUE; } if (!secure || deletekey) @@ -7431,7 +7528,6 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { CHECK(update_one_rr(kfetch->db, ver, &diff, DNS_DIFFOP_ADD, keyname, 0, &keydatarr)); - changed = ISC_TRUE; set_refreshkeytimer(zone, &keydata, now); } @@ -7486,8 +7582,8 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { deletekey = ISC_TRUE; } else if (keydata.removehd == 0) { /* Remove from secroots */ - untrust_key(zone->view->viewlist, - keyname, mctx, &dnskey); + dns_view_untrust(zone->view, keyname, + &dnskey, mctx); /* If initializing, delete now */ if (keydata.addhd == 0) @@ -7555,12 +7651,10 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { } /* Delete old version */ - if (deletekey || !newkey) { + if (deletekey || !newkey) CHECK(update_one_rr(kfetch->db, ver, &diff, DNS_DIFFOP_DEL, keyname, 0, &keydatarr)); - changed = ISC_TRUE; - } if (updatekey) { /* Set refresh timer */ @@ -7575,7 +7669,6 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { CHECK(update_one_rr(kfetch->db, ver, &diff, DNS_DIFFOP_ADD, keyname, 0, &keydatarr)); - changed = ISC_TRUE; } else if (newkey) { /* Convert DNSKEY to KEYDATA */ dns_rdata_tostruct(&dnskeyrr, &dnskey, NULL); @@ -7593,14 +7686,12 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { CHECK(update_one_rr(kfetch->db, ver, &diff, DNS_DIFFOP_ADD, keyname, 0, &keydatarr)); - changed = ISC_TRUE; } if (trustkey) { - /* Trust this key in all views */ + /* Trust this key. */ dns_rdata_tostruct(&dnskeyrr, &dnskey, NULL); - trust_key(zone->view->viewlist, keyname, &dnskey, - mctx); + trust_key(zone, keyname, &dnskey, mctx); } if (!deletekey) @@ -7617,27 +7708,32 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { * the security roots; then all queries to the zone will fail. */ if (pending != 0) - fail_secure(zone->view->viewlist, keyname); + fail_secure(zone, keyname); + + done: + + if (!ISC_LIST_EMPTY(diff.tuples)) { + /* Write changes to journal file. */ + CHECK(increment_soa_serial(kfetch->db, ver, &diff, mctx)); + CHECK(zone_journal(zone, &diff, "keyfetch_done")); + commit = ISC_TRUE; - failure: - if (changed) { DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED); zone_needdump(zone, 30); } - UNLOCK_ZONE(zone); - - /* Write changes to journal file. */ - if (alldone) { - result = increment_soa_serial(kfetch->db, ver, &diff, mctx); - if (result == ISC_R_SUCCESS) - result = zone_journal(zone, &diff, "keyfetch_done"); - } + failure: dns_diff_clear(&diff); - dns_db_closeversion(kfetch->db, &ver, changed); + if (ver != NULL) + dns_db_closeversion(kfetch->db, &ver, commit); + + cleanup: dns_db_detach(&kfetch->db); - dns_zone_detach(&kfetch->zone); + + INSIST(zone->irefs > 0); + zone->irefs--; + kfetch->zone = NULL; if (dns_rdataset_isassociated(&kfetch->keydataset)) dns_rdataset_disassociate(&kfetch->keydataset); @@ -7652,6 +7748,11 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) { if (secroots != NULL) dns_keytable_detach(&secroots); + + free_needed = exit_check(zone); + UNLOCK_ZONE(zone); + if (free_needed) + zone_free(zone); } /* @@ -7676,14 +7777,21 @@ zone_refreshkeys(dns_zone_t *zone) { isc_stdtime_get(&now); + LOCK_ZONE(zone); + if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_EXITING)) { + isc_time_settoepoch(&zone->refreshkeytime); + UNLOCK_ZONE(zone); + return; + } + ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read); dns_db_attach(zone->db, &db); ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_read); - LOCK_ZONE(zone); - dns_db_newversion(db, &ver); dns_diff_init(zone->mctx, &diff); + CHECK(dns_db_newversion(db, &ver)); + DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_REFRESHING); dns_rriterator_init(&rrit, db, ver, 0); @@ -7738,8 +7846,9 @@ zone_refreshkeys(dns_zone_t *zone) { zone->refreshkeycount++; kfetch = isc_mem_get(zone->mctx, sizeof(dns_keyfetch_t)); - kfetch->zone = NULL; - dns_zone_attach(zone, &kfetch->zone); + kfetch->zone = zone; + zone->irefs++; + INSIST(zone->irefs != 0); dns_fixedname_init(&kfetch->name); dns_name_dup(name, zone->mctx, dns_fixedname_name(&kfetch->name)); @@ -7763,17 +7872,20 @@ zone_refreshkeys(dns_zone_t *zone) { } if (!ISC_LIST_EMPTY(diff.tuples)) { CHECK(increment_soa_serial(db, ver, &diff, zone->mctx)); + CHECK(zone_journal(zone, &diff, "sync_keyzone")); commit = ISC_TRUE; - zone_journal(zone, &diff, "sync_keyzone"); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED); zone_needdump(zone, 30); } + failure: UNLOCK_ZONE(zone); - dns_rriterator_destroy(&rrit); dns_diff_clear(&diff); - dns_db_closeversion(db, &ver, commit); + if (ver != NULL) { + dns_rriterator_destroy(&rrit); + dns_db_closeversion(db, &ver, commit); + } dns_db_detach(&db); } @@ -7988,7 +8100,7 @@ dns_zone_refresh(dns_zone_t *zone) { isc_interval_set(&i, isc_random_jitter(zone->retry, zone->retry / 4), 0); result = isc_time_nowplusinterval(&zone->refreshtime, &i); - if (result |= ISC_R_SUCCESS) + if (result != ISC_R_SUCCESS) dns_zone_log(zone, ISC_LOG_WARNING, "isc_time_nowplusinterval() failed: %s", dns_result_totext(result)); @@ -9342,7 +9454,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { goto tcp_transfer; } dns_zone_log(zone, ISC_LOG_DEBUG(1), - "refresh: skipped tcp fallback" + "refresh: skipped tcp fallback " "as master %s (source %s) is " "unreachable (cached)", master, source); @@ -9523,6 +9635,7 @@ refresh_callback(isc_task_t *task, isc_event_t *event) { } else zone_debuglog(zone, me, 1, "serial: new %u, old not loaded", serial); + if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED) || DNS_ZONE_FLAG(zone, DNS_ZONEFLG_FORCEXFER) || isc_serial_gt(serial, oldserial)) { @@ -10066,7 +10179,13 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) { dns_db_settask(stub->db, zone->task); } - dns_db_newversion(stub->db, &stub->version); + result = dns_db_newversion(stub->db, &stub->version); + if (result != ISC_R_SUCCESS) { + dns_zone_log(zone, ISC_LOG_INFO, "refreshing stub: " + "dns_db_newversion() failed: %s", + dns_result_totext(result)); + goto cleanup; + } /* * Update SOA record. @@ -10074,8 +10193,7 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) { result = dns_db_findnode(stub->db, &zone->origin, ISC_TRUE, &node); if (result != ISC_R_SUCCESS) { - dns_zone_log(zone, ISC_LOG_INFO, - "refreshing stub: " + dns_zone_log(zone, ISC_LOG_INFO, "refreshing stub: " "dns_db_findnode() failed: %s", dns_result_totext(result)); goto cleanup; @@ -10097,6 +10215,7 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) { * XXX Optimisation: Create message when zone is setup and reuse. */ result = create_query(zone, dns_rdatatype_ns, &message); + INSIST(result == ISC_R_SUCCESS); INSIST(zone->masterscnt > 0); INSIST(zone->curmaster < zone->masterscnt); @@ -10170,6 +10289,7 @@ ns_query(dns_zone_t *zone, dns_rdataset_t *soardataset, dns_stub_t *stub) { break; default: result = ISC_R_NOTIMPLEMENTED; + POST(result); goto cleanup; } timeout = 15; @@ -12360,16 +12480,10 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, zmgr->transfersin = 10; zmgr->transfersperns = 2; - /* Create the zone task pool. */ - result = isc_taskpool_create(taskmgr, mctx, - 8 /* XXX */, 2, &zmgr->zonetasks); - if (result != ISC_R_SUCCESS) - goto free_rwlock; - /* Create a single task for queueing of SOA queries. */ result = isc_task_create(taskmgr, 1, &zmgr->task); if (result != ISC_R_SUCCESS) - goto free_taskpool; + goto free_rwlock; isc_task_setname(zmgr->task, "zmgr", zmgr); result = isc_ratelimiter_create(mctx, timermgr, zmgr->task, &zmgr->rl); @@ -12403,8 +12517,6 @@ dns_zonemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr, isc_ratelimiter_detach(&zmgr->rl); free_task: isc_task_detach(&zmgr->task); - free_taskpool: - isc_taskpool_destroy(&zmgr->zonetasks); free_rwlock: isc_rwlock_destroy(&zmgr->rwlock); free_mem: @@ -12420,16 +12532,16 @@ dns_zonemgr_managezone(dns_zonemgr_t *zmgr, dns_zone_t *zone) { REQUIRE(DNS_ZONE_VALID(zone)); REQUIRE(DNS_ZONEMGR_VALID(zmgr)); + if (zmgr->zonetasks == NULL) + return (ISC_R_FAILURE); + RWLOCK(&zmgr->rwlock, isc_rwlocktype_write); LOCK_ZONE(zone); REQUIRE(zone->task == NULL); REQUIRE(zone->timer == NULL); REQUIRE(zone->zmgr == NULL); - isc_taskpool_gettask(zmgr->zonetasks, - dns_name_hash(dns_zone_getorigin(zone), - ISC_FALSE), - &zone->task); + isc_taskpool_gettask(zmgr->zonetasks, &zone->task); /* * Set the task name. The tag will arbitrarily point to one @@ -12522,6 +12634,7 @@ dns_zonemgr_detach(dns_zonemgr_t **zmgrp) { if (free_now) zonemgr_free(zmgr); + *zmgrp = NULL; } isc_result_t @@ -12573,6 +12686,35 @@ dns_zonemgr_shutdown(dns_zonemgr_t *zmgr) { isc_taskpool_destroy(&zmgr->zonetasks); } +isc_result_t +dns_zonemgr_setsize(dns_zonemgr_t *zmgr, int num_zones) { + isc_result_t result; + int ntasks = num_zones / 100; + isc_taskpool_t *pool = NULL; + + REQUIRE(DNS_ZONEMGR_VALID(zmgr)); + + /* + * For anything fewer than 1000 zones we use 10 tasks in + * the task pool. More than that, and we'll scale at one + * task per 100 zones. + */ + if (ntasks < 10) + ntasks = 10; + + /* Create or resize the zone task pool. */ + if (zmgr->zonetasks == NULL) + result = isc_taskpool_create(zmgr->taskmgr, zmgr->mctx, + ntasks, 2, &pool); + else + result = isc_taskpool_expand(&zmgr->zonetasks, ntasks, &pool); + + if (result == ISC_R_SUCCESS) + zmgr->zonetasks = pool; + + return (result); +} + static void zonemgr_free(dns_zonemgr_t *zmgr) { isc_mem_t *mctx; @@ -13586,7 +13728,8 @@ rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, */ static isc_result_t add_signing_records(dns_db_t *db, dns_rdatatype_t privatetype, - dns_dbversion_t *ver, dns_diff_t *diff) + dns_dbversion_t *ver, dns_diff_t *diff, + isc_boolean_t sign_all) { dns_difftuple_t *tuple, *newtuple = NULL; dns_rdata_dnskey_t dnskey; @@ -13625,13 +13768,16 @@ add_signing_records(dns_db_t *db, dns_rdatatype_t privatetype, rdata.type = privatetype; rdata.rdclass = tuple->rdata.rdclass; - CHECK(rr_exists(db, ver, name, &rdata, &flag)); - if (flag) - continue; - CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD, - name, 0, &rdata, &newtuple)); - CHECK(do_one_tuple(&newtuple, db, ver, diff)); - INSIST(newtuple == NULL); + if (sign_all || tuple->op == DNS_DIFFOP_DEL) { + CHECK(rr_exists(db, ver, name, &rdata, &flag)); + if (flag) + continue; + CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD, + name, 0, &rdata, &newtuple)); + CHECK(do_one_tuple(&newtuple, db, ver, diff)); + INSIST(newtuple == NULL); + } + /* * Remove any record which says this operation has already * completed. @@ -13692,7 +13838,7 @@ sign_apex(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *ver, if (tuple == NULL) { result = del_sigs(zone, db, ver, &zone->origin, dns_rdatatype_dnskey, sig_diff, - zone_keys, nkeys, now); + zone_keys, nkeys, now, ISC_FALSE); if (result != ISC_R_SUCCESS) { dns_zone_log(zone, ISC_LOG_ERROR, "sign_apex:del_sigs -> %s\n", @@ -13868,6 +14014,7 @@ zone_rekey(dns_zone_t *zone) { dns_dnsseckey_t *key; dns_diff_t diff, sig_diff; isc_boolean_t commit = ISC_FALSE, newactive = ISC_FALSE; + isc_boolean_t newalg = ISC_FALSE; isc_boolean_t fullsign; dns_ttl_t ttl = 3600; const char *dir; @@ -13890,6 +14037,7 @@ zone_rekey(dns_zone_t *zone) { mctx = zone->mctx; dns_diff_init(mctx, &diff); dns_diff_init(mctx, &sig_diff); + sig_diff.resign = zone->sigresigninginterval; CHECK(dns_zone_getdb(zone, &db)); CHECK(dns_db_newversion(db, &ver)); @@ -13944,12 +14092,34 @@ zone_rekey(dns_zone_t *zone) { goto trylater; } - /* See if any pre-existing keys have newly become active */ + /* See if any pre-existing keys have newly become active; + * also, see if any new key is for a new algorithm, as in that + * event, we need to sign the zone fully. (If there's a new + * key, but it's for an already-existing algorithm, then + * the zone signing can be handled incrementally.) + */ for (key = ISC_LIST_HEAD(dnskeys); key != NULL; key = ISC_LIST_NEXT(key, link)) { - if (key->first_sign) { - newactive = ISC_TRUE; + if (!key->first_sign) + continue; + + newactive = ISC_TRUE; + + if (!dns_rdataset_isassociated(&keysigs)) { + newalg = ISC_TRUE; + break; + } + + if (signed_with_alg(&keysigs, dst_key_alg(key->key))) { + /* + * This isn't a new algorithm; clear + * first_sign so we won't sign the + * whole zone with this key later + */ + key->first_sign = ISC_FALSE; + } else { + newalg = ISC_TRUE; break; } } @@ -13958,8 +14128,9 @@ zone_rekey(dns_zone_t *zone) { dnskey_sane(zone, db, ver, &diff)) { CHECK(dns_diff_apply(&diff, db, ver)); CHECK(clean_nsec3param(zone, db, ver, &diff)); - CHECK(add_signing_records(db, zone->privatetype, ver, - &diff)); + CHECK(add_signing_records(db, zone->privatetype, + ver, &diff, + ISC_TF(newalg || fullsign))); CHECK(increment_soa_serial(db, ver, &diff, mctx)); CHECK(add_chains(zone, db, ver, &diff)); CHECK(sign_apex(zone, db, ver, &diff, &sig_diff)); @@ -13973,8 +14144,6 @@ zone_rekey(dns_zone_t *zone) { if (commit) { isc_time_t timenow; dns_difftuple_t *tuple; - isc_boolean_t newkey = ISC_FALSE; - isc_boolean_t newalg = ISC_FALSE; LOCK_ZONE(zone); DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NEEDNOTIFY); @@ -13984,43 +14153,6 @@ zone_rekey(dns_zone_t *zone) { TIME_NOW(&timenow); zone_settimer(zone, &timenow); - /* - * Has a new key become active? If so, is it for - * a new algorithm? - */ - for (tuple = ISC_LIST_HEAD(sig_diff.tuples); - tuple != NULL; - tuple = ISC_LIST_NEXT(tuple, link)) { - dns_rdata_dnskey_t dnskey; - - if (tuple->rdata.type != dns_rdatatype_dnskey) - continue; - - newkey = ISC_TRUE; - if (!dns_rdataset_isassociated(&keysigs)) { - newalg = ISC_TRUE; - break; - } - - result = dns_rdata_tostruct(&tuple->rdata, - &dnskey, NULL); - RUNTIME_CHECK(result == ISC_R_SUCCESS); - if (!signed_with_alg(&keysigs, - dnskey.algorithm)) { - newalg = ISC_TRUE; - break; - } - } - - /* - * If we found a new algorithm, we need to sign the - * zone fully. If there's a new key, but it's for an - * already-existing algorithm, then the zone signing - * can be handled incrementally. - */ - if (newkey && !newalg) - set_resigntime(zone); - /* Remove any signatures from removed keys. */ if (!ISC_LIST_EMPTY(rmkeys)) { for (key = ISC_LIST_HEAD(rmkeys); @@ -14038,7 +14170,6 @@ zone_rekey(dns_zone_t *zone) { } } - if (fullsign) { /* * "rndc sign" was called, so we now sign the zone @@ -14064,30 +14195,19 @@ zone_rekey(dns_zone_t *zone) { /* * We haven't been told to sign fully, but a new * algorithm was added to the DNSKEY. We sign - * the full zone, but only with the newly-added + * the full zone, but only with newly active * keys. */ - for (tuple = ISC_LIST_HEAD(sig_diff.tuples); - tuple != NULL; - tuple = ISC_LIST_NEXT(tuple, link)) { - dns_rdata_dnskey_t dnskey; - dns_secalg_t algorithm; - isc_region_t r; - isc_uint16_t keyid; - - if (tuple->rdata.type != dns_rdatatype_dnskey || - tuple->op == DNS_DIFFOP_DEL) + for (key = ISC_LIST_HEAD(dnskeys); + key != NULL; + key = ISC_LIST_NEXT(key, link)) { + if (!key->first_sign) continue; - result = dns_rdata_tostruct(&tuple->rdata, - &dnskey, NULL); - RUNTIME_CHECK(result == ISC_R_SUCCESS); - dns_rdata_toregion(&tuple->rdata, &r); - algorithm = dnskey.algorithm; - keyid = dst_region_computeid(&r, algorithm); - - result = zone_signwithkey(zone, algorithm, - keyid, ISC_FALSE); + result = zone_signwithkey(zone, + dst_key_alg(key->key), + dst_key_id(key->key), + ISC_FALSE); if (result != ISC_R_SUCCESS) { dns_zone_log(zone, ISC_LOG_ERROR, "zone_signwithkey failed: %s", @@ -14132,51 +14252,59 @@ zone_rekey(dns_zone_t *zone) { dns_result_totext(result)); } } - UNLOCK_ZONE(zone); - } - - isc_stdtime_get(&now); - TIME_NOW(&timenow); - isc_time_settoepoch(&zone->refreshkeytime); - for (key = ISC_LIST_HEAD(dnskeys); - key != NULL; - key = ISC_LIST_NEXT(key, link)) { - isc_stdtime_t then; - isc_time_t timethen; /* - * If we are doing automatic key maintenance and the - * key metadata indicates there is a key change event - * scheduled in the future, set the key refresh timer. + * Schedule the next resigning event */ - if (!DNS_ZONEKEY_OPTION(zone, DNS_ZONEKEY_MAINTAIN)) - break; - - then = now; - result = next_keyevent(key->key, &then); - if (result != ISC_R_SUCCESS) - continue; - - DNS_ZONE_TIME_ADD(&timenow, then - now, &timethen); - LOCK_ZONE(zone); - if (isc_time_isepoch(&zone->refreshkeytime) || - isc_time_compare(&timethen, &zone->refreshkeytime) < 0) { - zone->refreshkeytime = timethen; - zone_settimer(zone, &timenow); - } + set_resigntime(zone); UNLOCK_ZONE(zone); } /* - * If no key event is scheduled, we should still check the key - * repository for updates every so often. (Currently this is - * hard-coded to 12 hours, but it could be configurable.) + * If we are doing automatic key maintenance and the key metadata + * indicates there is a key change event scheduled in the future, + * set the key refresh timer. */ - if (isc_time_isepoch(&zone->refreshkeytime)) - DNS_ZONE_TIME_ADD(&timenow, (3600 * 12), &zone->refreshkeytime); + isc_stdtime_get(&now); + TIME_NOW(&timenow); + isc_time_settoepoch(&zone->refreshkeytime); - isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80); - dns_zone_log(zone, ISC_LOG_INFO, "next key event: %s", timebuf); + /* + * If we're doing key maintenance, set the key refresh timer to + * the next scheduled key event or to one hour in the future, + * whichever is sooner. + */ + if (DNS_ZONEKEY_OPTION(zone, DNS_ZONEKEY_MAINTAIN)) { + isc_time_t timethen; + isc_stdtime_t then; + + LOCK_ZONE(zone); + DNS_ZONE_TIME_ADD(&timenow, HOUR, &timethen); + zone->refreshkeytime = timethen; + UNLOCK_ZONE(zone); + + for (key = ISC_LIST_HEAD(dnskeys); + key != NULL; + key = ISC_LIST_NEXT(key, link)) { + then = now; + result = next_keyevent(key->key, &then); + if (result != ISC_R_SUCCESS) + continue; + + DNS_ZONE_TIME_ADD(&timenow, then - now, &timethen); + LOCK_ZONE(zone); + if (isc_time_compare(&timethen, + &zone->refreshkeytime) < 0) { + zone->refreshkeytime = timethen; + } + UNLOCK_ZONE(zone); + } + + zone_settimer(zone, &timenow); + + isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80); + dns_zone_log(zone, ISC_LOG_INFO, "next key event: %s", timebuf); + } failure: dns_diff_clear(&diff); diff --git a/lib/dns/zt.c b/lib/dns/zt.c index fd6af2884e9..23b3e8338a2 100644 --- a/lib/dns/zt.c +++ b/lib/dns/zt.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zt.c,v 1.47 2007-06-19 23:47:16 tbox Exp $ */ +/* $Id: zt.c,v 1.47.814.3 2011-03-19 23:47:24 tbox Exp $ */ /*! \file */ diff --git a/lib/export/dns/Makefile.in b/lib/export/dns/Makefile.in index 15b0d3f313e..1a2b4d55d43 100644 --- a/lib/export/dns/Makefile.in +++ b/lib/export/dns/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -12,7 +12,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.8 2010-12-23 04:07:59 marka Exp $ +# $Id: Makefile.in,v 1.8.14.2 2011-05-16 23:47:16 tbox Exp $ top_srcdir = @top_srcdir@ srcdir = @top_srcdir@/lib/dns @@ -133,7 +133,7 @@ installdirs: install:: timestamp installdirs ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libdns.@A@ \ - ${DESTDIR}${export_libdir} + ${DESTDIR}${export_libdir}/ clean distclean:: rm -f libdns.@A@ timestamp diff --git a/lib/export/irs/Makefile.in b/lib/export/irs/Makefile.in index aad94009354..8d6b24b293b 100644 --- a/lib/export/irs/Makefile.in +++ b/lib/export/irs/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2009, 2011 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -12,7 +12,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.4 2009-12-05 23:31:40 each Exp $ +# $Id: Makefile.in,v 1.4.244.2 2011-05-16 23:47:16 tbox Exp $ top_srcdir = @top_srcdir@ srcdir = @top_srcdir@/lib/irs @@ -80,7 +80,7 @@ installdirs: install:: timestamp installdirs ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libirs.@A@ \ - ${DESTDIR}${export_libdir} + ${DESTDIR}${export_libdir}/ clean distclean:: rm -f libirs.@A@ libirs.la timestamp diff --git a/lib/export/isccfg/Makefile.in b/lib/export/isccfg/Makefile.in index ed2b2cf56ff..cb22b3720c1 100644 --- a/lib/export/isccfg/Makefile.in +++ b/lib/export/isccfg/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2009, 2011 Internet Systems Consortium, Inc. ("ISC") # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -12,7 +12,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.4 2009-12-05 23:31:41 each Exp $ +# $Id: Makefile.in,v 1.4.244.2 2011-05-16 23:47:17 tbox Exp $ top_srcdir = @top_srcdir@ srcdir = @top_srcdir@/lib/isccfg @@ -77,7 +77,7 @@ installdirs: install:: timestamp installdirs ${LIBTOOL_MODE_INSTALL} ${INSTALL_DATA} libisccfg.@A@ \ - ${DESTDIR}${export_libdir} + ${DESTDIR}${export_libdir}/ clean distclean:: rm -f libisccfg.@A@ timestamp diff --git a/lib/export/samples/nsprobe.c b/lib/export/samples/nsprobe.c index 85c572d0edf..4999b615eaf 100644 --- a/lib/export/samples/nsprobe.c +++ b/lib/export/samples/nsprobe.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2009-2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: nsprobe.c,v 1.7 2010-01-07 23:48:54 tbox Exp $ */ +/* $Id: nsprobe.c,v 1.7.180.3 2011-04-05 06:35:00 marka Exp $ */ #include @@ -787,6 +787,7 @@ resolve_nsaddress(isc_task_t *task, isc_event_t *event) { fprintf(stderr, "resolve_nsaddress: " "mem_get failed"); result = ISC_R_NOMEMORY; + POST(result); goto cleanup; } isc_sockaddr_fromin(&server->address, @@ -923,6 +924,7 @@ resolve_ns(isc_task_t *task, isc_event_t *event) { fprintf(stderr, "resolve_ns: mem_get failed"); result = ISC_R_NOMEMORY; + POST(result); /* * XXX: should we continue with the * available servers anyway? @@ -1097,8 +1099,8 @@ main(int argc, char *argv[]) { if (res->ai_addrlen > sizeof(sa.type)) { fprintf(stderr, - "assumption failure: addrlen is too long: %d\n", - res->ai_addrlen); + "assumption failure: addrlen is too long: %ld\n", + (long)res->ai_addrlen); exit(1); } memcpy(&sa.type.sa, res->ai_addr, res->ai_addrlen); diff --git a/lib/irs/api b/lib/irs/api index 94575eb4ef2..78dd0b402a8 100644 --- a/lib/irs/api +++ b/lib/irs/api @@ -1,3 +1,3 @@ LIBINTERFACE = 80 -LIBREVISION = 0 +LIBREVISION = 1 LIBAGE = 0 diff --git a/lib/irs/getnameinfo.c b/lib/irs/getnameinfo.c index fadd8d8b462..00809d943bf 100644 --- a/lib/irs/getnameinfo.c +++ b/lib/irs/getnameinfo.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: getnameinfo.c,v 1.4 2009-09-02 23:48:02 tbox Exp $ */ +/* $Id: getnameinfo.c,v 1.4.346.2 2011-03-12 04:59:18 tbox Exp $ */ /*! \file */ @@ -149,12 +149,12 @@ getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, { struct afd *afd; struct servent *sp; - unsigned short port; + unsigned short port = 0; #ifdef IRS_PLATFORM_HAVESALEN size_t len; #endif int family, i; - const void *addr; + const void *addr = NULL; char *p; #if 0 unsigned long v4a; @@ -199,8 +199,6 @@ getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, break; default: - port = 0; - addr = NULL; INSIST(0); } proto = (flags & NI_DGRAM) ? "udp" : "tcp"; diff --git a/lib/irs/resconf.c b/lib/irs/resconf.c index af1413b3454..28077bb796d 100644 --- a/lib/irs/resconf.c +++ b/lib/irs/resconf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resconf.c,v 1.3 2009-09-02 23:48:02 tbox Exp $ */ +/* $Id: resconf.c,v 1.3.346.2 2011-03-12 04:59:18 tbox Exp $ */ /*! \file resconf.c */ @@ -517,6 +517,7 @@ irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp) stopchar = getword(fp, word, sizeof(word)); if (stopchar == EOF) { rval = ISC_R_SUCCESS; + POST(rval); break; } diff --git a/lib/isc/Makefile.in b/lib/isc/Makefile.in index d92c0b85448..fa25690d171 100644 --- a/lib/isc/Makefile.in +++ b/lib/isc/Makefile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1998-2003 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.109 2010-06-09 01:43:09 marka Exp $ +# $Id: Makefile.in,v 1.109.108.2 2011-07-08 23:47:16 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -88,6 +88,7 @@ LIBS = @LIBS@ .NO_PARALLEL: SUBDIRS = include unix nls @ISC_THREAD_DIR@ @ISC_ARCH_DIR@ TARGETS = timestamp +TESTDIRS = @UNITTESTS@ @BIND9_MAKE_RULES@ diff --git a/lib/isc/api b/lib/isc/api index b91b130d9f2..ec820d9ea38 100644 --- a/lib/isc/api +++ b/lib/isc/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 81 -LIBREVISION = 2 +LIBINTERFACE = 83 +LIBREVISION = 1 LIBAGE = 0 diff --git a/lib/isc/heap.c b/lib/isc/heap.c index 4dead3f3ca0..eeef7f7b67e 100644 --- a/lib/isc/heap.c +++ b/lib/isc/heap.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1997-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: heap.c,v 1.39 2010-02-04 23:49:13 tbox Exp $ */ +/* $Id: heap.c,v 1.39.150.2 2011-03-03 23:47:09 tbox Exp $ */ /*! \file * Heap implementation of priority queues adapted from the following: @@ -86,8 +86,9 @@ isc_heap_create(isc_mem_t *mctx, isc_heapcompare_t compare, if (heap == NULL) return (ISC_R_NOMEMORY); heap->magic = HEAP_MAGIC; - heap->mctx = mctx; heap->size = 0; + heap->mctx = NULL; + isc_mem_attach(mctx, &heap->mctx); if (size_increment == 0) heap->size_increment = SIZE_INCREMENT; else @@ -114,7 +115,7 @@ isc_heap_destroy(isc_heap_t **heapp) { isc_mem_put(heap->mctx, heap->array, heap->size * sizeof(void *)); heap->magic = 0; - isc_mem_put(heap->mctx, heap, sizeof(*heap)); + isc_mem_putanddetach(&heap->mctx, heap, sizeof(*heap)); *heapp = NULL; } diff --git a/lib/isc/httpd.c b/lib/isc/httpd.c index 81f118e5a9a..4402647008b 100644 --- a/lib/isc/httpd.c +++ b/lib/isc/httpd.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2008, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2006-2008, 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: httpd.c,v 1.20 2010-11-16 05:38:31 marka Exp $ */ +/* $Id: httpd.c,v 1.20.40.3 2011-03-11 06:47:07 marka Exp $ */ /*! \file */ @@ -315,7 +315,7 @@ isc_httpdmgr_create(isc_mem_t *mctx, isc_socket_t *sock, isc_task_t *task, isc_task_detach(&httpd->task); isc_socket_detach(&httpd->sock); isc_mem_detach(&httpd->mctx); - isc_mutex_destroy(&httpd->lock); + (void)isc_mutex_destroy(&httpd->lock); isc_mem_put(mctx, httpd, sizeof(isc_httpdmgr_t)); return (result); } @@ -364,7 +364,7 @@ httpdmgr_destroy(isc_httpdmgr_t *httpdmgr) } UNLOCK(&httpdmgr->lock); - isc_mutex_destroy(&httpdmgr->lock); + (void)isc_mutex_destroy(&httpdmgr->lock); if (httpdmgr->ondestroy != NULL) (httpdmgr->ondestroy)(httpdmgr->cb_arg); @@ -586,6 +586,8 @@ isc_httpd_accept(isc_task_t *task, isc_event_t *ev) r.length = HTTP_RECVLEN - 1; result = isc_socket_recv(httpd->sock, &r, 1, task, isc_httpd_recvdone, httpd); + /* FIXME!!! */ + POST(result); NOTICE("accept queued recv on socket"); requeue: @@ -683,8 +685,9 @@ isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) } r.base = (unsigned char *)httpd->recvbuf + httpd->recvlen; r.length = HTTP_RECVLEN - httpd->recvlen - 1; - result = isc_socket_recv(httpd->sock, &r, 1, task, - isc_httpd_recvdone, httpd); + /* check return code? */ + (void)isc_socket_recv(httpd->sock, &r, 1, task, + isc_httpd_recvdone, httpd); goto out; } else if (result != ISC_R_SUCCESS) { destroy_client(&httpd); @@ -722,14 +725,14 @@ isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) &httpd->mimetype, &httpd->bodybuffer, &httpd->freecb, &httpd->freecb_arg); if (result != ISC_R_SUCCESS) { - result = httpd->mgr->render_500(httpd->url, httpd->querystring, - NULL, - &httpd->retcode, - &httpd->retmsg, - &httpd->mimetype, - &httpd->bodybuffer, - &httpd->freecb, - &httpd->freecb_arg); + result = httpd->mgr->render_500(httpd->url, httpd->querystring, + NULL, &httpd->retcode, + &httpd->retmsg, + &httpd->mimetype, + &httpd->bodybuffer, + &httpd->freecb, + &httpd->freecb_arg); + RUNTIME_CHECK(result == ISC_R_SUCCESS); } isc_httpd_response(httpd); @@ -753,8 +756,9 @@ isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) if (isc_buffer_length(&httpd->bodybuffer) > 0) ISC_LIST_APPEND(httpd->bufflist, &httpd->bodybuffer, link); - result = isc_socket_sendv(httpd->sock, &httpd->bufflist, task, - isc_httpd_senddone, httpd); + /* check return code? */ + (void)isc_socket_sendv(httpd->sock, &httpd->bufflist, task, + isc_httpd_senddone, httpd); out: isc_event_free(&ev); @@ -821,7 +825,7 @@ isc_httpd_response(isc_httpd_t *httpd) needlen += 3 + 1; /* room for response code, always 3 bytes */ needlen += strlen(httpd->retmsg) + 2; /* return msg + CRLF */ - if (isc_buffer_availablelength(&httpd->headerbuffer) < needlen) { + while (isc_buffer_availablelength(&httpd->headerbuffer) < needlen) { result = grow_headerspace(httpd); if (result != ISC_R_SUCCESS) return (result); @@ -846,7 +850,7 @@ isc_httpd_addheader(isc_httpd_t *httpd, const char *name, needlen += 2 + strlen(val); /* : and val */ needlen += 2; /* CRLF */ - if (isc_buffer_availablelength(&httpd->headerbuffer) < needlen) { + while (isc_buffer_availablelength(&httpd->headerbuffer) < needlen) { result = grow_headerspace(httpd); if (result != ISC_R_SUCCESS) return (result); @@ -869,7 +873,7 @@ isc_httpd_endheaders(isc_httpd_t *httpd) { isc_result_t result; - if (isc_buffer_availablelength(&httpd->headerbuffer) < 2) { + while (isc_buffer_availablelength(&httpd->headerbuffer) < 2) { result = grow_headerspace(httpd); if (result != ISC_R_SUCCESS) return (result); @@ -893,7 +897,7 @@ isc_httpd_addheaderuint(isc_httpd_t *httpd, const char *name, int val) { needlen += 2 + strlen(buf); /* : and val */ needlen += 2; /* CRLF */ - if (isc_buffer_availablelength(&httpd->headerbuffer) < needlen) { + while (isc_buffer_availablelength(&httpd->headerbuffer) < needlen) { result = grow_headerspace(httpd); if (result != ISC_R_SUCCESS) return (result); @@ -912,7 +916,6 @@ isc_httpd_senddone(isc_task_t *task, isc_event_t *ev) { isc_httpd_t *httpd = ev->ev_arg; isc_region_t r; - isc_result_t result; isc_socketevent_t *sev = (isc_socketevent_t *)ev; ENTER("senddone"); @@ -963,8 +966,9 @@ isc_httpd_senddone(isc_task_t *task, isc_event_t *ev) r.base = (unsigned char *)httpd->recvbuf; r.length = HTTP_RECVLEN - 1; - result = isc_socket_recv(httpd->sock, &r, 1, task, isc_httpd_recvdone, - httpd); + /* check return code? */ + (void)isc_socket_recv(httpd->sock, &r, 1, task, + isc_httpd_recvdone, httpd); out: isc_event_free(&ev); diff --git a/lib/isc/include/isc/file.h b/lib/isc/include/isc/file.h index be4082540bc..9087990e1e7 100644 --- a/lib/isc/include/isc/file.h +++ b/lib/isc/include/isc/file.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: file.h,v 1.39 2011-01-11 23:47:14 tbox Exp $ */ +/* $Id: file.h,v 1.39.10.2 2011-03-04 23:47:28 tbox Exp $ */ #ifndef ISC_FILE_H #define ISC_FILE_H 1 @@ -185,6 +185,27 @@ isc_file_isabsolute(const char *filename); * \brief Return #ISC_TRUE if the given file name is absolute. */ +isc_result_t +isc_file_isplainfile(const char *name); +/*!< + * \brief Check that the file is a plain file + * + * Returns: + *\li #ISC_R_SUCCESS + * Success. The file is a plain file. + *\li #ISC_R_INVALIDFILE + * The path specified was not usable by the operating system. + *\li #ISC_R_FILENOTFOUND + * The file does not exist. This return code comes from + * errno=ENOENT when stat returns -1. This code is mentioned + * here, because in logconf.c, it is the one rcode that is + * permitted in addition to ISC_R_SUCCESS. This is done since + * the next call in logconf.c is to isc_stdio_open(), which + * will create the file if it can. + *\li #other ISC_R_* errors translated from errno + * These occur when stat returns -1 and an errno. + */ + isc_boolean_t isc_file_iscurrentdir(const char *filename); /*!< diff --git a/lib/isc/include/isc/task.h b/lib/isc/include/isc/task.h index a2a1bbea4d5..b3cdbb62aa7 100644 --- a/lib/isc/include/isc/task.h +++ b/lib/isc/include/isc/task.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: task.h,v 1.69.14.1.2.1 2011-06-02 23:47:36 tbox Exp $ */ +/* $Id: task.h,v 1.69.14.2 2011-02-28 01:20:04 tbox Exp $ */ #ifndef ISC_TASK_H #define ISC_TASK_H 1 diff --git a/lib/isc/include/isc/taskpool.h b/lib/isc/include/isc/taskpool.h index 07aba709832..5825afb05aa 100644 --- a/lib/isc/include/isc/taskpool.h +++ b/lib/isc/include/isc/taskpool.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: taskpool.h,v 1.15 2007-06-19 23:47:18 tbox Exp $ */ +/* $Id: taskpool.h,v 1.15.814.2 2011-07-08 23:47:16 tbox Exp $ */ #ifndef ISC_TASKPOOL_H #define ISC_TASKPOOL_H 1 @@ -83,11 +83,50 @@ isc_taskpool_create(isc_taskmgr_t *tmgr, isc_mem_t *mctx, *\li #ISC_R_UNEXPECTED */ -void -isc_taskpool_gettask(isc_taskpool_t *pool, unsigned int hash, - isc_task_t **targetp); +void +isc_taskpool_gettask(isc_taskpool_t *pool, isc_task_t **targetp); /*%< - * Attach to the task corresponding to the hash value "hash". + * Attach to a task from the pool. Currently the next task is chosen + * from the pool at random. (This may be changed in the future to + * something that guaratees balance.) + */ + +int +isc_taskpool_size(isc_taskpool_t *pool); +/*%< + * Returns the number of tasks in the task pool 'pool'. + */ + +isc_result_t +isc_taskpool_expand(isc_taskpool_t **sourcep, unsigned int size, + isc_taskpool_t **targetp); + +/*%< + * If 'size' is larger than the number of tasks in the pool pointed to by + * 'sourcep', then a new taskpool of size 'size' is allocated, the existing + * tasks from are moved into it, additional tasks are created to bring the + * total number up to 'size', and the resulting pool is attached to + * 'targetp'. + * + * If 'size' is less than or equal to the tasks in pool 'source', then + * 'sourcep' is attached to 'targetp' without any other action being taken. + * + * In either case, 'sourcep' is detached. + * + * Requires: + * + * \li 'sourcep' is not NULL and '*source' is not NULL + * \li 'targetp' is not NULL and '*source' is NULL + * + * Ensures: + * + * \li On success, '*targetp' points to a valid task pool. + * \li On success, '*sourcep' points to NULL. + * + * Returns: + * + * \li #ISC_R_SUCCESS + * \li #ISC_R_NOMEMORY */ void diff --git a/lib/isc/include/isc/util.h b/lib/isc/include/isc/util.h index 11d0044b8a3..6e7da3a53e5 100644 --- a/lib/isc/include/isc/util.h +++ b/lib/isc/include/isc/util.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: util.h,v 1.32 2010-01-11 23:48:37 tbox Exp $ */ +/* $Id: util.h,v 1.32.170.2 2011-03-12 04:59:19 tbox Exp $ */ #ifndef ISC_UTIL_H #define ISC_UTIL_H 1 @@ -48,6 +48,11 @@ */ #define UNUSED(x) (void)(x) +/*% + * The opposite: silent warnings about stored values which are never read. + */ +#define POST(x) (void)(x) + #define ISC_MAX(a, b) ((a) > (b) ? (a) : (b)) #define ISC_MIN(a, b) ((a) < (b) ? (a) : (b)) diff --git a/lib/isc/log.c b/lib/isc/log.c index 7ef66922f19..ee71deb8b1f 100644 --- a/lib/isc/log.c +++ b/lib/isc/log.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: log.c,v 1.99 2009-02-16 02:01:16 marka Exp $ */ +/* $Id: log.c,v 1.99.404.2 2011-03-12 04:59:18 tbox Exp $ */ /*! \file * \author Principal Authors: DCL */ @@ -1342,9 +1342,10 @@ isc_log_open(isc_logchannel_t *channel) { (FILE_MAXSIZE(channel) > 0 && statbuf.st_size >= FILE_MAXSIZE(channel))) roll = regular_file; - } else if (errno == ENOENT) + } else if (errno == ENOENT) { regular_file = ISC_TRUE; - else + POST(regular_file); + } else result = ISC_R_INVALIDFILE; /* diff --git a/lib/isc/netaddr.c b/lib/isc/netaddr.c index 33dddb8d1b5..690141b2ce8 100644 --- a/lib/isc/netaddr.c +++ b/lib/isc/netaddr.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: netaddr.c,v 1.41 2010-11-17 23:47:08 tbox Exp $ */ +/* $Id: netaddr.c,v 1.41.38.3 2011-03-11 06:47:07 marka Exp $ */ /*! \file */ @@ -69,10 +69,10 @@ isc_boolean_t isc_netaddr_eqprefix(const isc_netaddr_t *a, const isc_netaddr_t *b, unsigned int prefixlen) { - const unsigned char *pa, *pb; - unsigned int ipabytes; /* Length of whole IP address in bytes */ - unsigned int nbytes; /* Number of significant whole bytes */ - unsigned int nbits; /* Number of significant leftover bits */ + const unsigned char *pa = NULL, *pb = NULL; + unsigned int ipabytes = 0; /* Length of whole IP address in bytes */ + unsigned int nbytes; /* Number of significant whole bytes */ + unsigned int nbits; /* Number of significant leftover bits */ REQUIRE(a != NULL && b != NULL); @@ -94,8 +94,6 @@ isc_netaddr_eqprefix(const isc_netaddr_t *a, const isc_netaddr_t *b, ipabytes = 16; break; default: - pa = pb = NULL; /* Avoid silly compiler warning. */ - ipabytes = 0; /* Ditto. */ return (ISC_FALSE); } @@ -188,6 +186,9 @@ isc_netaddr_format(const isc_netaddr_t *na, char *array, unsigned int size) { isc_buffer_init(&buf, array, size); result = isc_netaddr_totext(na, &buf); + if (size == 0) + return; + /* * Null terminate. */ @@ -212,7 +213,7 @@ isc_netaddr_format(const isc_netaddr_t *na, char *array, unsigned int size) { isc_result_t isc_netaddr_prefixok(const isc_netaddr_t *na, unsigned int prefixlen) { static const unsigned char zeros[16]; - unsigned int nbits, nbytes, ipbytes; + unsigned int nbits, nbytes, ipbytes = 0; const unsigned char *p; switch (na->family) { @@ -229,7 +230,6 @@ isc_netaddr_prefixok(const isc_netaddr_t *na, unsigned int prefixlen) { return (ISC_R_RANGE); break; default: - ipbytes = 0; return (ISC_R_NOTIMPLEMENTED); } nbytes = prefixlen / 8; @@ -246,7 +246,7 @@ isc_netaddr_prefixok(const isc_netaddr_t *na, unsigned int prefixlen) { isc_result_t isc_netaddr_masktoprefixlen(const isc_netaddr_t *s, unsigned int *lenp) { - unsigned int nbits, nbytes, ipbytes, i; + unsigned int nbits = 0, nbytes = 0, ipbytes = 0, i; const unsigned char *p; switch (s->family) { @@ -259,10 +259,8 @@ isc_netaddr_masktoprefixlen(const isc_netaddr_t *s, unsigned int *lenp) { ipbytes = 16; break; default: - ipbytes = 0; return (ISC_R_NOTIMPLEMENTED); } - nbytes = nbits = 0; for (i = 0; i < ipbytes; i++) { if (p[i] != 0xFF) break; diff --git a/lib/isc/powerpc/include/isc/atomic.h b/lib/isc/powerpc/include/isc/atomic.h index 2e11e398e7a..4404bede57f 100644 --- a/lib/isc/powerpc/include/isc/atomic.h +++ b/lib/isc/powerpc/include/isc/atomic.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2005, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: atomic.h,v 1.8 2009-10-14 23:47:51 tbox Exp $ */ +/* $Id: atomic.h,v 1.8.284.3 2011-03-08 00:52:21 marka Exp $ */ #ifndef ISC_ATOMIC_H #define ISC_ATOMIC_H 1 @@ -110,14 +110,16 @@ isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) { "mr %0, r6\n" "add r6, r6, %2\n" "stwcx. r6, 0, %1\n" - "bne- 1b" + "bne- 1b\n" + "sync" #else "1:" "lwarx 6, 0, %1\n" "mr %0, 6\n" "add 6, 6, %2\n" "stwcx. 6, 0, %1\n" - "bne- 1b" + "bne- 1b\n" + "sync" #endif : "=&r"(orig) : "r"(p), "r"(val) @@ -135,13 +137,15 @@ isc_atomic_store(void *p, isc_int32_t val) { "lwarx r6, 0, %0\n" "lwz r6, %1\n" "stwcx. r6, 0, %0\n" - "bne- 1b" + "bne- 1b\n" + "sync" #else "1:" "lwarx 6, 0, %0\n" "lwz 6, %1\n" "stwcx. 6, 0, %0\n" - "bne- 1b" + "bne- 1b\n" + "sync" #endif : : "r"(p), "m"(val) @@ -163,7 +167,8 @@ isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) { "mr r6, %3\n" "stwcx. r6, 0, %1\n" "bne- 1b\n" - "2:" + "2:\n" + "sync" #else "1:" "lwarx 6, 0, %1\n" @@ -173,7 +178,8 @@ isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) { "mr 6, %3\n" "stwcx. 6, 0, %1\n" "bne- 1b\n" - "2:" + "2:\n" + "sync" #endif : "=&r" (orig) : "r"(p), "r"(cmpval), "r"(val) diff --git a/lib/isc/radix.c b/lib/isc/radix.c index be2e8412e24..641620cfe3d 100644 --- a/lib/isc/radix.c +++ b/lib/isc/radix.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: radix.c,v 1.23 2009-01-18 23:48:14 tbox Exp $ */ +/* $Id: radix.c,v 1.23.426.2 2011-03-12 04:59:18 tbox Exp $ */ /* * This source was adapted from MRT's RCS Ids: @@ -275,7 +275,7 @@ isc_radix_search(isc_radix_tree_t *radix, isc_radix_node_t **target, if (node && node->prefix) stack[cnt++] = node; - while (--cnt >= 0) { + while (cnt-- > 0) { node = stack[cnt]; if (_comp_with_mask(isc_prefix_tochar(node->prefix), diff --git a/lib/isc/rwlock.c b/lib/isc/rwlock.c index fce75169119..5b37f9cab8d 100644 --- a/lib/isc/rwlock.c +++ b/lib/isc/rwlock.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rwlock.c,v 1.46 2009-01-18 23:48:14 tbox Exp $ */ +/* $Id: rwlock.c,v 1.46.426.2 2011-03-12 04:59:18 tbox Exp $ */ /*! \file */ @@ -261,6 +261,7 @@ isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { } cntflag = isc_atomic_xadd(&rwl->cnt_and_flag, READER_INCR); + POST(cntflag); while (1) { if ((rwl->cnt_and_flag & WRITER_ACTIVE) == 0) break; diff --git a/lib/isc/sha1.c b/lib/isc/sha1.c index d72eb9cb606..72e6b0a1247 100644 --- a/lib/isc/sha1.c +++ b/lib/isc/sha1.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sha1.c,v 1.20 2009-02-06 23:47:42 tbox Exp $ */ +/* $Id: sha1.c,v 1.20.408.2 2011-03-12 04:59:18 tbox Exp $ */ /* $NetBSD: sha1.c,v 1.5 2000/01/22 22:19:14 mycroft Exp $ */ /* $OpenBSD: sha1.c,v 1.9 1997/07/23 21:12:32 kstailey Exp $ */ @@ -256,6 +256,8 @@ transform(isc_uint32_t state[5], const unsigned char buffer[64]) { /* Wipe variables */ a = b = c = d = e = 0; + /* Avoid compiler warnings */ + POST(a); POST(b); POST(c); POST(d); POST(e); } diff --git a/lib/isc/sha2.c b/lib/isc/sha2.c index 1dc05a70dab..a5d8afc196e 100644 --- a/lib/isc/sha2.c +++ b/lib/isc/sha2.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2005-2007, 2009, 2011 Internet Systems Consortium, Inc. ("ISC") * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sha2.c,v 1.18 2009-10-22 02:21:31 each Exp $ */ +/* $Id: sha2.c,v 1.18.280.2 2011-03-12 04:59:18 tbox Exp $ */ /* $FreeBSD$ */ /* $KAME: sha2.c,v 1.8 2001/11/08 01:07:52 itojun Exp $ */ @@ -692,6 +692,9 @@ void isc_sha256_transform(isc_sha256_t *context, const isc_uint32_t* data) { /* Clean up */ a = b = c = d = e = f = g = h = T1 = 0; + /* Avoid compiler warnings */ + POST(a); POST(b); POST(c); POST(d); POST(e); POST(f); + POST(g); POST(h); POST(T1); } #else /* ISC_SHA2_UNROLL_TRANSFORM */ @@ -773,6 +776,9 @@ isc_sha256_transform(isc_sha256_t *context, const isc_uint32_t* data) { /* Clean up */ a = b = c = d = e = f = g = h = T1 = T2 = 0; + /* Avoid compiler warnings */ + POST(a); POST(b); POST(c); POST(d); POST(e); POST(f); + POST(g); POST(h); POST(T1); POST(T2); } #endif /* ISC_SHA2_UNROLL_TRANSFORM */ @@ -809,6 +815,8 @@ isc_sha256_update(isc_sha256_t *context, const isc_uint8_t *data, size_t len) { context->bitcount += len << 3; /* Clean up: */ usedspace = freespace = 0; + /* Avoid compiler warnings: */ + POST(usedspace); POST(freespace); return; } } @@ -827,6 +835,8 @@ isc_sha256_update(isc_sha256_t *context, const isc_uint8_t *data, size_t len) { } /* Clean up: */ usedspace = freespace = 0; + /* Avoid compiler warnings: */ + POST(usedspace); POST(freespace); } void @@ -897,6 +907,7 @@ isc_sha256_final(isc_uint8_t digest[], isc_sha256_t *context) { /* Clean up state data: */ memset(context, 0, sizeof(context)); usedspace = 0; + POST(usedspace); } /*** SHA-512: *********************************************************/ @@ -1003,6 +1014,9 @@ void isc_sha512_transform(isc_sha512_t *context, const isc_uint64_t* data) { /* Clean up */ a = b = c = d = e = f = g = h = T1 = 0; + /* Avoid compiler warnings */ + POST(a); POST(b); POST(c); POST(d); POST(e); POST(f); + POST(g); POST(h); POST(T1); } #else /* ISC_SHA2_UNROLL_TRANSFORM */ @@ -1082,6 +1096,9 @@ isc_sha512_transform(isc_sha512_t *context, const isc_uint64_t* data) { /* Clean up */ a = b = c = d = e = f = g = h = T1 = T2 = 0; + /* Avoid compiler warnings */ + POST(a); POST(b); POST(c); POST(d); POST(e); POST(f); + POST(g); POST(h); POST(T1); POST(T2); } #endif /* ISC_SHA2_UNROLL_TRANSFORM */ @@ -1117,6 +1134,8 @@ void isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t le ADDINC128(context->bitcount, len << 3); /* Clean up: */ usedspace = freespace = 0; + /* Avoid compiler warnings: */ + POST(usedspace); POST(freespace); return; } } @@ -1135,6 +1154,8 @@ void isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t le } /* Clean up: */ usedspace = freespace = 0; + /* Avoid compiler warnings: */ + POST(usedspace); POST(freespace); } void isc_sha512_last(isc_sha512_t *context) { diff --git a/lib/isc/sockaddr.c b/lib/isc/sockaddr.c index 9661ee48b7a..fe270664a3f 100644 --- a/lib/isc/sockaddr.c +++ b/lib/isc/sockaddr.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: sockaddr.c,v 1.73 2010-11-17 23:47:09 tbox Exp $ */ +/* $Id: sockaddr.c,v 1.73.38.2 2011-02-28 01:20:03 tbox Exp $ */ /*! \file */ @@ -182,6 +182,9 @@ isc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size) { isc_result_t result; isc_buffer_t buf; + if (size == 0U) + return; + isc_buffer_init(&buf, array, size); result = isc_sockaddr_totext(sa, &buf); if (result != ISC_R_SUCCESS) { diff --git a/lib/isc/string.c b/lib/isc/string.c index 3bcea3a2352..0cad5c70f89 100644 --- a/lib/isc/string.c +++ b/lib/isc/string.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: string.c,v 1.20 2007-06-19 23:47:17 tbox Exp $ */ +/* $Id: string.c,v 1.20.814.2 2011-03-12 04:59:18 tbox Exp $ */ /*! \file */ @@ -165,14 +165,15 @@ isc_string_printf(char *target, size_t size, const char *format, ...) { } void -isc_string_printf_truncate(char *target, size_t size, const char *format, ...) { +isc_string_printf_truncate(char *target, size_t size, const char *format, ...) +{ va_list args; - size_t n; REQUIRE(size > 0U); va_start(args, format); - n = vsnprintf(target, size, format, args); + /* check return code? */ + (void)vsnprintf(target, size, format, args); va_end(args); ENSURE(strlen(target) < size); diff --git a/lib/isc/task.c b/lib/isc/task.c index a9dfd1fcc35..913e707a12a 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: task.c,v 1.115.14.1.2.1 2011-06-02 23:47:36 tbox Exp $ */ +/* $Id: task.c,v 1.115.14.2 2011-02-28 01:20:03 tbox Exp $ */ /*! \file * \author Principal Author: Bob Halley diff --git a/lib/isc/taskpool.c b/lib/isc/taskpool.c index 8efbf287991..afd132b1e7b 100644 --- a/lib/isc/taskpool.c +++ b/lib/isc/taskpool.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,13 +15,14 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: taskpool.c,v 1.18 2007-06-18 23:47:44 tbox Exp $ */ +/* $Id: taskpool.c,v 1.18.814.2 2011-07-08 23:47:16 tbox Exp $ */ /*! \file */ #include #include +#include #include #include @@ -31,28 +32,30 @@ struct isc_taskpool { isc_mem_t * mctx; + isc_taskmgr_t * tmgr; unsigned int ntasks; + unsigned int quantum; isc_task_t ** tasks; }; + /*** *** Functions. ***/ -isc_result_t -isc_taskpool_create(isc_taskmgr_t *tmgr, isc_mem_t *mctx, - unsigned int ntasks, unsigned int quantum, - isc_taskpool_t **poolp) +static isc_result_t +alloc_pool(isc_taskmgr_t *tmgr, isc_mem_t *mctx, unsigned int ntasks, + unsigned int quantum, isc_taskpool_t **poolp) { - unsigned int i; isc_taskpool_t *pool; - isc_result_t result; + unsigned int i; - INSIST(ntasks > 0); pool = isc_mem_get(mctx, sizeof(*pool)); if (pool == NULL) return (ISC_R_NOMEMORY); pool->mctx = mctx; pool->ntasks = ntasks; + pool->quantum = quantum; + pool->tmgr = tmgr; pool->tasks = isc_mem_get(mctx, ntasks * sizeof(isc_task_t *)); if (pool->tasks == NULL) { isc_mem_put(mctx, pool, sizeof(*pool)); @@ -60,6 +63,28 @@ isc_taskpool_create(isc_taskmgr_t *tmgr, isc_mem_t *mctx, } for (i = 0; i < ntasks; i++) pool->tasks[i] = NULL; + + *poolp = pool; + return (ISC_R_SUCCESS); +} + +isc_result_t +isc_taskpool_create(isc_taskmgr_t *tmgr, isc_mem_t *mctx, + unsigned int ntasks, unsigned int quantum, + isc_taskpool_t **poolp) +{ + unsigned int i; + isc_taskpool_t *pool = NULL; + isc_result_t result; + + INSIST(ntasks > 0); + + /* Allocate the pool structure */ + result = alloc_pool(tmgr, mctx, ntasks, quantum, &pool); + if (result != ISC_R_SUCCESS) + return (result); + + /* Create the tasks */ for (i = 0; i < ntasks; i++) { result = isc_task_create(tmgr, quantum, &pool->tasks[i]); if (result != ISC_R_SUCCESS) { @@ -68,14 +93,69 @@ isc_taskpool_create(isc_taskmgr_t *tmgr, isc_mem_t *mctx, } isc_task_setname(pool->tasks[i], "taskpool", NULL); } + *poolp = pool; return (ISC_R_SUCCESS); } -void isc_taskpool_gettask(isc_taskpool_t *pool, unsigned int hash, - isc_task_t **targetp) +void +isc_taskpool_gettask(isc_taskpool_t *pool, isc_task_t **targetp) { + isc_uint32_t i; + isc_random_get(&i); + isc_task_attach(pool->tasks[i % pool->ntasks], targetp); +} + +int +isc_taskpool_size(isc_taskpool_t *pool) { + REQUIRE(pool != NULL); + return (pool->ntasks); +} + +isc_result_t +isc_taskpool_expand(isc_taskpool_t **sourcep, unsigned int size, + isc_taskpool_t **targetp) { - isc_task_attach(pool->tasks[hash % pool->ntasks], targetp); + isc_result_t result; + isc_taskpool_t *pool; + + REQUIRE(sourcep != NULL && *sourcep != NULL); + REQUIRE(targetp != NULL && *targetp == NULL); + + pool = *sourcep; + if (size > pool->ntasks) { + isc_taskpool_t *newpool = NULL; + unsigned int i; + + /* Allocate a new pool structure */ + result = alloc_pool(pool->tmgr, pool->mctx, size, + pool->quantum, &newpool); + if (result != ISC_R_SUCCESS) + return (result); + + /* Copy over the tasks from the old pool */ + for (i = 0; i < pool->ntasks; i++) { + newpool->tasks[i] = pool->tasks[i]; + pool->tasks[i] = NULL; + } + + /* Create new tasks */ + for (i = pool->ntasks; i < size; i++) { + result = isc_task_create(pool->tmgr, pool->quantum, + &newpool->tasks[i]); + if (result != ISC_R_SUCCESS) { + isc_taskpool_destroy(&newpool); + return (result); + } + isc_task_setname(newpool->tasks[i], "taskpool", NULL); + } + + isc_taskpool_destroy(&pool); + pool = newpool; + } + + *sourcep = NULL; + *targetp = pool; + return (ISC_R_SUCCESS); } void diff --git a/lib/isc/timer.c b/lib/isc/timer.c index ab89cddaf8f..71473fb9014 100644 --- a/lib/isc/timer.c +++ b/lib/isc/timer.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: timer.c,v 1.95.302.1.2.1 2011-06-02 23:47:36 tbox Exp $ */ +/* $Id: timer.c,v 1.95.302.3 2011-03-11 06:47:08 marka Exp $ */ /*! \file */ @@ -333,7 +333,9 @@ schedule(isc__timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) { static inline void deschedule(isc__timer_t *timer) { +#ifdef USE_TIMER_THREAD isc_boolean_t need_wakeup = ISC_FALSE; +#endif isc__timermgr_t *manager; /* @@ -342,8 +344,10 @@ deschedule(isc__timer_t *timer) { manager = timer->manager; if (timer->index > 0) { +#ifdef USE_TIMER_THREAD if (timer->index == 1) need_wakeup = ISC_TRUE; +#endif isc_heap_delete(manager->heap, timer->index); timer->index = 0; INSIST(manager->nscheduled > 0); @@ -527,6 +531,7 @@ isc__timer_reset(isc_timer_t *timer0, isc_timertype_t type, REQUIRE(VALID_TIMER(timer)); manager = timer->manager; REQUIRE(VALID_MANAGER(manager)); + if (expires == NULL) expires = isc_time_epoch; if (interval == NULL) @@ -550,8 +555,6 @@ isc__timer_reset(isc_timer_t *timer0, isc_timertype_t type, isc_time_settoepoch(&now); } - manager = timer->manager; - LOCK(&manager->lock); LOCK(&timer->lock); diff --git a/lib/isc/unix/dir.c b/lib/isc/unix/dir.c index 0caf882e0bc..e670f03e50c 100644 --- a/lib/isc/unix/dir.c +++ b/lib/isc/unix/dir.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2009, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dir.c,v 1.29 2009-02-16 23:48:04 tbox Exp $ */ +/* $Id: dir.c,v 1.29.404.2 2011-03-12 04:59:19 tbox Exp $ */ /*! \file * \author Principal Authors: DCL */ @@ -79,7 +79,7 @@ isc_dir_open(isc_dir_t *dir, const char *dirname) { if (dir->dirname < p && *(p - 1) != '/') *p++ = '/'; *p++ = '*'; - *p++ = '\0'; + *p = '\0'; /* * Open stream. diff --git a/lib/isc/unix/file.c b/lib/isc/unix/file.c index 25d856cc6c7..3e4d3e01f4d 100644 --- a/lib/isc/unix/file.c +++ b/lib/isc/unix/file.c @@ -48,7 +48,7 @@ * SUCH DAMAGE. */ -/* $Id: file.c,v 1.57 2011-01-11 23:47:14 tbox Exp $ */ +/* $Id: file.c,v 1.57.10.1 2011-03-04 14:10:13 smann Exp $ */ /*! \file */ @@ -348,6 +348,23 @@ isc_file_exists(const char *pathname) { return (ISC_TF(file_stats(pathname, &stats) == ISC_R_SUCCESS)); } +isc_result_t +isc_file_isplainfile(const char *filename) { + /* + * This function returns success if filename is a plain file. + */ + struct stat filestat; + memset(&filestat,0,sizeof(struct stat)); + + if ((stat(filename, &filestat)) == -1) + return(isc__errno2result(errno)); + + if(! S_ISREG(filestat.st_mode)) + return(ISC_R_INVALIDFILE); + + return(ISC_R_SUCCESS); +} + isc_boolean_t isc_file_isabsolute(const char *filename) { REQUIRE(filename != NULL); diff --git a/lib/isc/unix/include/isc/stdtime.h b/lib/isc/unix/include/isc/stdtime.h index 581e6f77b04..cadb3820ef0 100644 --- a/lib/isc/unix/include/isc/stdtime.h +++ b/lib/isc/unix/include/isc/stdtime.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: stdtime.h,v 1.14 2007-06-19 23:47:19 tbox Exp $ */ +/* $Id: stdtime.h,v 1.14.814.2 2011-03-18 23:47:15 tbox Exp $ */ #ifndef ISC_STDTIME_H #define ISC_STDTIME_H 1 @@ -31,6 +31,10 @@ * about its size. */ typedef isc_uint32_t isc_stdtime_t; + +/* but this flag helps... */ +#define STDTIME_ON_32BITS 1 + /* * isc_stdtime32_t is a 32-bit version of isc_stdtime_t. A variable of this * type should only be used as an opaque integer (e.g.,) to compare two diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index ec7487e856a..c9aa454dd20 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.333.14.2.2.1 2011-06-02 23:47:36 tbox Exp $ */ +/* $Id: socket.c,v 1.333.14.9 2011-07-29 02:19:20 marka Exp $ */ /*! \file */ @@ -764,6 +764,7 @@ FIX_IPV6_RECVPKTINFO(isc__socket_t *sock) if (setsockopt(sock->fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, (void *)&on, sizeof(on)) < 0) { + isc__strerror(errno, strbuf, sizeof(strbuf)); UNEXPECTED_ERROR(__FILE__, __LINE__, "setsockopt(%d, IPV6_RECVPKTINFO) " "%s: %s", sock->fd, @@ -1364,6 +1365,9 @@ build_msghdr_send(isc__socket_t *sock, isc_socketevent_t *dev, #if defined(USE_CMSG) && defined(ISC_PLATFORM_HAVEIN6PKTINFO) if ((sock->type == isc_sockettype_udp) && ((dev->attributes & ISC_SOCKEVENTATTR_PKTINFO) != 0)) { +#if defined(IPV6_USE_MIN_MTU) + int use_min_mtu = 1; /* -1, 0, 1 */ +#endif struct cmsghdr *cmsgp; struct in6_pktinfo *pktinfop; @@ -1382,6 +1386,22 @@ build_msghdr_send(isc__socket_t *sock, isc_socketevent_t *dev, cmsgp->cmsg_len = cmsg_len(sizeof(struct in6_pktinfo)); pktinfop = (struct in6_pktinfo *)CMSG_DATA(cmsgp); memcpy(pktinfop, &dev->pktinfo, sizeof(struct in6_pktinfo)); +#if defined(IPV6_USE_MIN_MTU) + /* + * Set IPV6_USE_MIN_MTU as a per packet option as FreeBSD + * ignores setsockopt(IPV6_USE_MIN_MTU) when IPV6_PKTINFO + * is used. + */ + cmsgp = (struct cmsghdr *)(sock->sendcmsgbuf + + msg->msg_controllen); + msg->msg_controllen += cmsg_space(sizeof(use_min_mtu)); + INSIST(msg->msg_controllen <= sock->sendcmsgbuflen); + + cmsgp->cmsg_level = IPPROTO_IPV6; + cmsgp->cmsg_type = IPV6_USE_MIN_MTU; + cmsgp->cmsg_len = cmsg_len(sizeof(use_min_mtu)); + memcpy(CMSG_DATA(cmsgp), &use_min_mtu, sizeof(use_min_mtu)); +#endif } #endif /* USE_CMSG && ISC_PLATFORM_HAVEIPV6 */ #else /* ISC_NET_BSD44MSGHDR */ @@ -1758,6 +1778,7 @@ doio_recv(isc__socket_t *sock, isc_socketevent_t *dev) { } else { isc_buffer_add(buffer, actual_count); actual_count = 0; + POST(actual_count); break; } buffer = ISC_LIST_NEXT(buffer, link); @@ -1997,9 +2018,10 @@ destroy(isc__socket_t **sockp) { SIGNAL(&manager->shutdown_ok); #endif /* USE_WATCHER_THREAD */ - UNLOCK(&manager->lock); - + /* can't unlock manager as its memory context is still used */ free_socket(sockp); + + UNLOCK(&manager->lock); } static isc_result_t @@ -2036,7 +2058,7 @@ allocate_socket(isc__socketmgr_t *manager, isc_sockettype_t type, */ cmsgbuflen = 0; #if defined(USE_CMSG) && defined(ISC_PLATFORM_HAVEIN6PKTINFO) - cmsgbuflen = cmsg_space(sizeof(struct in6_pktinfo)); + cmsgbuflen += cmsg_space(sizeof(struct in6_pktinfo)); #endif #if defined(USE_CMSG) && defined(SO_TIMESTAMP) cmsgbuflen += cmsg_space(sizeof(struct timeval)); @@ -2050,7 +2072,14 @@ allocate_socket(isc__socketmgr_t *manager, isc_sockettype_t type, cmsgbuflen = 0; #if defined(USE_CMSG) && defined(ISC_PLATFORM_HAVEIN6PKTINFO) - cmsgbuflen = cmsg_space(sizeof(struct in6_pktinfo)); + cmsgbuflen += cmsg_space(sizeof(struct in6_pktinfo)); +#if defined(IPV6_USE_MIN_MTU) + /* + * Provide space for working around FreeBSD's broken IPV6_USE_MIN_MTU + * support. + */ + cmsgbuflen += cmsg_space(sizeof(int)); +#endif #endif sock->sendcmsgbuflen = cmsgbuflen; if (sock->sendcmsgbuflen != 0U) { @@ -2400,10 +2429,18 @@ opensocket(isc__socketmgr_t *manager, isc__socket_t *sock) { #endif /* ISC_PLATFORM_HAVEIN6PKTINFO */ #ifdef IPV6_USE_MIN_MTU /* RFC 3542, not too common yet*/ /* use minimum MTU */ - if (sock->pf == AF_INET6) { - (void)setsockopt(sock->fd, IPPROTO_IPV6, - IPV6_USE_MIN_MTU, - (void *)&on, sizeof(on)); + if (sock->pf == AF_INET6 && + setsockopt(sock->fd, IPPROTO_IPV6, IPV6_USE_MIN_MTU, + (void *)&on, sizeof(on)) < 0) { + isc__strerror(errno, strbuf, sizeof(strbuf)); + UNEXPECTED_ERROR(__FILE__, __LINE__, + "setsockopt(%d, IPV6_USE_MIN_MTU) " + "%s: %s", sock->fd, + isc_msgcat_get(isc_msgcat, + ISC_MSGSET_GENERAL, + ISC_MSG_FAILED, + "failed"), + strbuf); } #endif #if defined(IPV6_MTU) @@ -2422,8 +2459,9 @@ opensocket(isc__socketmgr_t *manager, isc__socket_t *sock) { */ if (sock->pf == AF_INET6) { int action = IPV6_PMTUDISC_DONT; - (void)setsockopt(sock->fd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, - &action, sizeof(action)); + (void)setsockopt(sock->fd, IPPROTO_IPV6, + IPV6_MTU_DISCOVER, &action, + sizeof(action)); } #endif #endif /* ISC_PLATFORM_HAVEIPV6 */ @@ -2755,7 +2793,6 @@ isc__socket_close(isc_socket_t *sock0) { isc__socket_t *sock = (isc__socket_t *)sock0; int fd; isc__socketmgr_t *manager; - isc_sockettype_t type; REQUIRE(VALID_SOCKET(sock)); @@ -2775,7 +2812,6 @@ isc__socket_close(isc_socket_t *sock0) { INSIST(sock->connect_ev == NULL); manager = sock->manager; - type = sock->type; fd = sock->fd; sock->fd = -1; memset(sock->name, 0, sizeof(sock->name)); @@ -4455,9 +4491,8 @@ isc__socket_recvv(isc_socket_t *sock0, isc_bufferlist_t *buflist, INSIST(sock->bound); dev = allocate_socketevent(sock, ISC_SOCKEVENT_RECVDONE, action, arg); - if (dev == NULL) { + if (dev == NULL) return (ISC_R_NOMEMORY); - } /* * UDP sockets are always partial read @@ -4661,9 +4696,8 @@ isc__socket_sendto(isc_socket_t *sock0, isc_region_t *region, INSIST(sock->bound); dev = allocate_socketevent(sock, ISC_SOCKEVENT_SENDDONE, action, arg); - if (dev == NULL) { + if (dev == NULL) return (ISC_R_NOMEMORY); - } dev->region = *region; @@ -4702,9 +4736,8 @@ isc__socket_sendtov(isc_socket_t *sock0, isc_bufferlist_t *buflist, REQUIRE(iocount > 0); dev = allocate_socketevent(sock, ISC_SOCKEVENT_SENDDONE, action, arg); - if (dev == NULL) { + if (dev == NULL) return (ISC_R_NOMEMORY); - } /* * Move each buffer from the passed in list to our internal one. @@ -5121,6 +5154,7 @@ isc__socket_accept(isc_socket_t *sock0, */ isc_task_attach(task, &ntask); if (isc_task_exiting(ntask)) { + free_socket(&nsock); isc_task_detach(&ntask); isc_event_free(ISC_EVENT_PTR(&dev)); UNLOCK(&sock->lock); @@ -5632,7 +5666,7 @@ isc__socket_ipv6only(isc_socket_t *sock0, isc_boolean_t yes) { if (setsockopt(sock->fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&onoff, sizeof(int)) < 0) { char strbuf[ISC_STRERRORSIZE]; - + isc__strerror(errno, strbuf, sizeof(strbuf)); UNEXPECTED_ERROR(__FILE__, __LINE__, "setsockopt(%d, IPV6_V6ONLY) " "%s: %s", sock->fd, diff --git a/lib/isc/unix/stdio.c b/lib/isc/unix/stdio.c index ff3a527b474..9221d2a0ea7 100644 --- a/lib/isc/unix/stdio.c +++ b/lib/isc/unix/stdio.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: stdio.c,v 1.8 2007-06-19 23:47:18 tbox Exp $ */ +/* $Id: stdio.c,v 1.8.814.2 2011-03-05 23:52:09 tbox Exp $ */ #include @@ -23,6 +23,7 @@ #include #include +#include #include "errno2result.h" diff --git a/lib/isc/unix/time.c b/lib/isc/unix/time.c index 1dc05b87a69..8d1d9fa2ec6 100644 --- a/lib/isc/unix/time.c +++ b/lib/isc/unix/time.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: time.c,v 1.56 2008-02-15 23:46:51 tbox Exp $ */ +/* $Id: time.c,v 1.56.608.2 2011-03-12 04:59:19 tbox Exp $ */ /*! \file */ @@ -319,7 +319,7 @@ isc_time_microdiff(const isc_time_t *t1, const isc_time_t *t2) { /* * Convert to microseconds. */ - i3 = (i1 - i2) / NS_PER_US; + i3 /= NS_PER_US; return (i3); } diff --git a/lib/isccc/Makefile.in b/lib/isccc/Makefile.in index 14171724600..de92bd30510 100644 --- a/lib/isccc/Makefile.in +++ b/lib/isccc/Makefile.in @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.12.244.1.2.1 2011-06-02 23:47:37 tbox Exp $ +# $Id: Makefile.in,v 1.12.244.2 2011-02-28 01:20:04 tbox Exp $ srcdir = @srcdir@ VPATH = @srcdir@ diff --git a/lib/isccfg/Makefile.in b/lib/isccfg/Makefile.in index 37b0a26777b..73d8499bb60 100644 --- a/lib/isccfg/Makefile.in +++ b/lib/isccfg/Makefile.in @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: Makefile.in,v 1.21.244.1.2.1 2011-06-02 23:47:37 tbox Exp $ +# $Id: Makefile.in,v 1.21.244.3 2011-03-10 04:29:18 each Exp $ srcdir = @srcdir@ VPATH = @srcdir@ @@ -27,7 +27,7 @@ top_srcdir = @top_srcdir@ CINCLUDES = -I. ${DNS_INCLUDES} ${ISC_INCLUDES} ${ISCCFG_INCLUDES} -CDEFINES = @USE_DLZ@ +CDEFINES = CWARNINGS = ISCLIBS = ../../lib/isc/libisc.@A@ diff --git a/lib/isccfg/aclconf.c b/lib/isccfg/aclconf.c index 44d436a4166..34a54a37ca2 100644 --- a/lib/isccfg/aclconf.c +++ b/lib/isccfg/aclconf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2002 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: aclconf.c,v 1.29 2010-08-13 23:47:03 tbox Exp $ */ +/* $Id: aclconf.c,v 1.29.72.2 2011-06-17 23:47:11 tbox Exp $ */ #include @@ -33,39 +33,70 @@ #define LOOP_MAGIC ISC_MAGIC('L','O','O','P') -void -cfg_aclconfctx_init(cfg_aclconfctx_t *ctx) { - ISC_LIST_INIT(ctx->named_acl_cache); +isc_result_t +cfg_aclconfctx_create(isc_mem_t *mctx, cfg_aclconfctx_t **ret) { + isc_result_t result; + cfg_aclconfctx_t *actx; + + REQUIRE(mctx != NULL); + REQUIRE(ret != NULL && *ret == NULL); + + actx = isc_mem_get(mctx, sizeof(*actx)); + if (actx == NULL) + return (ISC_R_NOMEMORY); + + result = isc_refcount_init(&actx->references, 1); + if (result != ISC_R_SUCCESS) + goto cleanup; + + actx->mctx = NULL; + isc_mem_attach(mctx, &actx->mctx); + ISC_LIST_INIT(actx->named_acl_cache); + + *ret = actx; + return (ISC_R_SUCCESS); + + cleanup: + isc_mem_put(mctx, actx, sizeof(*actx)); + return (result); } void -cfg_aclconfctx_clear(cfg_aclconfctx_t *ctx) { - dns_acl_t *dacl, *next; +cfg_aclconfctx_attach(cfg_aclconfctx_t *src, cfg_aclconfctx_t **dest) { + REQUIRE(src != NULL); + REQUIRE(dest != NULL && *dest == NULL); - for (dacl = ISC_LIST_HEAD(ctx->named_acl_cache); - dacl != NULL; - dacl = next) - { - next = ISC_LIST_NEXT(dacl, nextincache); - dns_acl_detach(&dacl); - } + isc_refcount_increment(&src->references, NULL); + *dest = src; } void -cfg_aclconfctx_clone(cfg_aclconfctx_t *src, cfg_aclconfctx_t *dest) { +cfg_aclconfctx_detach(cfg_aclconfctx_t **actxp) { + cfg_aclconfctx_t *actx; dns_acl_t *dacl, *next; - REQUIRE(src != NULL && dest != NULL); + isc_mem_t *mctx; + unsigned int refs; - cfg_aclconfctx_init(dest); - for (dacl = ISC_LIST_HEAD(src->named_acl_cache); - dacl != NULL; - dacl = next) - { - dns_acl_t *copy; - next = ISC_LIST_NEXT(dacl, nextincache); - dns_acl_attach(dacl, ©); - ISC_LIST_APPEND(dest->named_acl_cache, copy, nextincache); + REQUIRE(actxp != NULL && *actxp != NULL); + + actx = *actxp; + mctx = actx->mctx; + + isc_refcount_decrement(&actx->references, &refs); + if (refs == 0) { + for (dacl = ISC_LIST_HEAD(actx->named_acl_cache); + dacl != NULL; + dacl = next) + { + next = ISC_LIST_NEXT(dacl, nextincache); + ISC_LIST_UNLINK(actx->named_acl_cache, dacl, + nextincache); + dns_acl_detach(&dacl); + } + isc_mem_putanddetach(&actx->mctx, actx, sizeof(*actx)); } + + *actxp = NULL; } /* diff --git a/lib/isccfg/api b/lib/isccfg/api index 7821c32a541..750ed97a514 100644 --- a/lib/isccfg/api +++ b/lib/isccfg/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 81 -LIBREVISION = 1 -LIBAGE = 1 +LIBINTERFACE = 82 +LIBREVISION = 0 +LIBAGE = 0 diff --git a/lib/isccfg/include/isccfg/aclconf.h b/lib/isccfg/include/isccfg/aclconf.h index 49aef03ad6a..2b5ff239afd 100644 --- a/lib/isccfg/include/isccfg/aclconf.h +++ b/lib/isccfg/include/isccfg/aclconf.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2007, 2010 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2007, 2010, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: aclconf.h,v 1.12 2010-08-13 23:47:04 tbox Exp $ */ +/* $Id: aclconf.h,v 1.12.72.2 2011-06-17 23:47:12 tbox Exp $ */ #ifndef ISCCFG_ACLCONF_H #define ISCCFG_ACLCONF_H 1 @@ -28,7 +28,8 @@ typedef struct cfg_aclconfctx { ISC_LIST(dns_acl_t) named_acl_cache; - ISC_LIST(dns_iptable_t) named_iptable_cache; + isc_mem_t *mctx; + isc_refcount_t references; } cfg_aclconfctx_t; /*** @@ -37,22 +38,23 @@ typedef struct cfg_aclconfctx { ISC_LANG_BEGINDECLS -void -cfg_aclconfctx_init(cfg_aclconfctx_t *ctx); +isc_result_t +cfg_aclconfctx_create(isc_mem_t *mctx, cfg_aclconfctx_t **ret); /* - * Initialize an ACL configuration context. + * Creates and initializes an ACL configuration context. */ void -cfg_aclconfctx_clone(cfg_aclconfctx_t *src, cfg_aclconfctx_t *dest); +cfg_aclconfctx_detach(cfg_aclconfctx_t **actxp); /* - * Copy the contents of one ACL configuration context into another. + * Removes a reference to an ACL configuration context; when references + * reaches zero, clears the contents and deallocate the structure. */ void -cfg_aclconfctx_clear(cfg_aclconfctx_t *ctx); +cfg_aclconfctx_attach(cfg_aclconfctx_t *src, cfg_aclconfctx_t **dest); /* - * Clear the contents of an ACL configuration context. + * Attaches a pointer to an existing ACL configuration context. */ isc_result_t diff --git a/lib/isccfg/namedconf.c b/lib/isccfg/namedconf.c index f80d34ba810..46afd168dbb 100644 --- a/lib/isccfg/namedconf.c +++ b/lib/isccfg/namedconf.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: namedconf.c,v 1.131.8.1 2011-02-03 05:50:08 marka Exp $ */ +/* $Id: namedconf.c,v 1.131.8.4 2011-05-23 20:56:11 each Exp $ */ /*! \file */ @@ -542,8 +542,7 @@ static cfg_type_t cfg_type_bracketed_sockaddrlist = { &cfg_rep_list, &cfg_type_sockaddr }; -static const char *autodnssec_enums[] = { "allow", "maintain", "create", - "off", NULL }; +static const char *autodnssec_enums[] = { "allow", "maintain", "off", NULL }; static cfg_type_t cfg_type_autodnssec = { "autodnssec", cfg_parse_enum, cfg_print_ustring, cfg_doc_enum, &cfg_rep_string, &autodnssec_enums @@ -1131,6 +1130,24 @@ static cfg_type_t cfg_type_rpz = { * dnssec-lookaside */ +static void +print_lookaside(cfg_printer_t *pctx, const cfg_obj_t *obj) +{ + const cfg_obj_t *domain = obj->value.tuple[0]; + + if (domain->value.string.length == 4 && + strncmp(domain->value.string.base, "auto", 4) == 0) + cfg_print_cstr(pctx, "auto"); + else + cfg_print_tuple(pctx, obj); +} + +static void +doc_lookaside(cfg_printer_t *pctx, const cfg_type_t *type) { + UNUSED(type); + cfg_print_cstr(pctx, "( trust-anchor | auto )"); +} + static keyword_type_t trustanchor_kw = { "trust-anchor", &cfg_type_astring }; static cfg_type_t cfg_type_optional_trustanchor = { @@ -1145,7 +1162,7 @@ static cfg_tuplefielddef_t lookaside_fields[] = { }; static cfg_type_t cfg_type_lookaside = { - "lookaside", cfg_parse_tuple, cfg_print_tuple, cfg_doc_tuple, + "lookaside", cfg_parse_tuple, print_lookaside, doc_lookaside, &cfg_rep_tuple, lookaside_fields }; @@ -2235,7 +2252,8 @@ static cfg_type_t cfg_type_controls_sockaddr = { * statement, which takes a single key with or without braces and semicolon. */ static isc_result_t -parse_server_key_kludge(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) +parse_server_key_kludge(cfg_parser_t *pctx, const cfg_type_t *type, + cfg_obj_t **ret) { isc_result_t result; isc_boolean_t braces = ISC_FALSE; @@ -2245,7 +2263,7 @@ parse_server_key_kludge(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t ** CHECK(cfg_peektoken(pctx, 0)); if (pctx->token.type == isc_tokentype_special && pctx->token.value.as_char == '{') { - result = cfg_gettoken(pctx, 0); + CHECK(cfg_gettoken(pctx, 0)); braces = ISC_TRUE; } diff --git a/lib/isccfg/parser.c b/lib/isccfg/parser.c index 87ad391a860..f561ab8eda7 100644 --- a/lib/isccfg/parser.c +++ b/lib/isccfg/parser.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: parser.c,v 1.139 2011-01-04 23:47:14 tbox Exp $ */ +/* $Id: parser.c,v 1.139.14.2 2011-03-11 06:47:09 marka Exp $ */ /*! \file */ @@ -1904,6 +1904,7 @@ cfg_doc_netaddr(cfg_printer_t *pctx, const cfg_type_t *type) { cfg_print_chars(pctx, " | ", 3); cfg_print_chars(pctx, "*", 1); n++; + POST(n); } if (*flagp != CFG_ADDR_V4OK && *flagp != CFG_ADDR_V6OK) cfg_print_chars(pctx, " )", 2); @@ -1943,7 +1944,7 @@ cfg_parse_netprefix(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t *obj = NULL; isc_result_t result; isc_netaddr_t netaddr; - unsigned int addrlen, prefixlen; + unsigned int addrlen = 0, prefixlen; UNUSED(type); CHECK(cfg_parse_rawaddr(pctx, CFG_ADDR_V4OK | CFG_ADDR_V4PREFIXOK | @@ -1956,7 +1957,6 @@ cfg_parse_netprefix(cfg_parser_t *pctx, const cfg_type_t *type, addrlen = 128; break; default: - addrlen = 0; INSIST(0); break; } @@ -2006,8 +2006,12 @@ cfg_obj_isnetprefix(const cfg_obj_t *obj) { void cfg_obj_asnetprefix(const cfg_obj_t *obj, isc_netaddr_t *netaddr, - unsigned int *prefixlen) { + unsigned int *prefixlen) +{ REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_netprefix); + REQUIRE(netaddr != NULL); + REQUIRE(prefixlen != NULL); + *netaddr = obj->value.netprefix.address; *prefixlen = obj->value.netprefix.prefixlen; } @@ -2091,6 +2095,7 @@ cfg_doc_sockaddr(cfg_printer_t *pctx, const cfg_type_t *type) { cfg_print_chars(pctx, " | ", 3); cfg_print_chars(pctx, "*", 1); n++; + POST(n); } cfg_print_chars(pctx, " ) ", 3); if (*flagp & CFG_ADDR_WILDOK) { diff --git a/lib/lwres/api b/lib/lwres/api index 94575eb4ef2..78dd0b402a8 100644 --- a/lib/lwres/api +++ b/lib/lwres/api @@ -1,3 +1,3 @@ LIBINTERFACE = 80 -LIBREVISION = 0 +LIBREVISION = 1 LIBAGE = 0 diff --git a/lib/lwres/assert_p.h b/lib/lwres/assert_p.h index c8965b542fd..afe5099c24a 100644 --- a/lib/lwres/assert_p.h +++ b/lib/lwres/assert_p.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: assert_p.h,v 1.14 2007-06-19 23:47:22 tbox Exp $ */ +/* $Id: assert_p.h,v 1.14.814.2 2011-03-12 04:59:19 tbox Exp $ */ #ifndef LWRES_ASSERT_P_H #define LWRES_ASSERT_P_H 1 @@ -28,6 +28,7 @@ #define INSIST(x) assert(x) #define UNUSED(x) ((void)(x)) +#define POST(x) ((void)(x)) #define SPACE_OK(b, s) (LWRES_BUFFER_AVAILABLECOUNT(b) >= (s)) #define SPACE_REMAINING(b, s) (LWRES_BUFFER_REMAINING(b) >= (s)) diff --git a/lib/lwres/herror.c b/lib/lwres/herror.c index babc1f012b5..ec834e62dd0 100644 --- a/lib/lwres/herror.c +++ b/lib/lwres/herror.c @@ -1,5 +1,5 @@ /* - * Portions Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (C) 2004, 2005, 2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (C) 2000, 2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -72,7 +72,7 @@ #if defined(LIBC_SCCS) && !defined(lint) static const char sccsid[] = "@(#)herror.c 8.1 (Berkeley) 6/4/93"; static const char rcsid[] = - "$Id: herror.c,v 1.17 2007-06-19 23:47:22 tbox Exp $"; + "$Id: herror.c,v 1.17.814.2 2011-03-12 04:59:19 tbox Exp $"; #endif /* LIBC_SCCS and not lint */ #include @@ -96,7 +96,7 @@ static const char *h_errlist[] = { "No address associated with name", /*%< 4 NO_ADDRESS */ }; -static int h_nerr = { sizeof(h_errlist) / sizeof(h_errlist[0]) }; +static int h_nerr = sizeof(h_errlist) / sizeof(h_errlist[0]); /*! diff --git a/lib/lwres/lwconfig.c b/lib/lwres/lwconfig.c index 764ff2aaa99..6df09d1a57f 100644 --- a/lib/lwres/lwconfig.c +++ b/lib/lwres/lwconfig.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2008, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: lwconfig.c,v 1.48 2008-12-17 23:47:58 tbox Exp $ */ +/* $Id: lwconfig.c,v 1.48.436.2 2011-03-12 04:59:19 tbox Exp $ */ /*! \file */ @@ -589,6 +589,7 @@ lwres_conf_parse(lwres_context_t *ctx, const char *filename) { stopchar = getword(fp, word, sizeof(word)); if (stopchar == EOF) { rval = LWRES_R_SUCCESS; + POST(rval); break; } diff --git a/lib/lwres/man/lwres.html b/lib/lwres/man/lwres.html index 6cfb7506190..8bc03923c8a 100644 --- a/lib/lwres/man/lwres.html +++ b/lib/lwres/man/lwres.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres — introduction to the lightweight resolver library

@@ -32,7 +32,7 @@
#include <lwres/lwres.h>
-

DESCRIPTION

+

DESCRIPTION

The BIND 9 lightweight resolver library is a simple, name service independent stub resolver library. It provides hostname-to-address @@ -47,7 +47,7 @@

-

OVERVIEW

+

OVERVIEW

The lwresd library implements multiple name service APIs. The standard @@ -101,7 +101,7 @@

-

CLIENT-SIDE LOW-LEVEL API CALL FLOW

+

CLIENT-SIDE LOW-LEVEL API CALL FLOW

When a client program wishes to make an lwres request using the native low-level API, it typically performs the following @@ -149,7 +149,7 @@

-

SERVER-SIDE LOW-LEVEL API CALL FLOW

+

SERVER-SIDE LOW-LEVEL API CALL FLOW

When implementing the server side of the lightweight resolver protocol using the lwres library, a sequence of actions like the @@ -191,7 +191,7 @@

-

SEE ALSO

+

SEE ALSO

lwres_gethostent(3), lwres_getipnode(3), diff --git a/lib/lwres/man/lwres_buffer.html b/lib/lwres/man/lwres_buffer.html index b7e034ff6f7..6d1776f810c 100644 --- a/lib/lwres/man/lwres_buffer.html +++ b/lib/lwres/man/lwres_buffer.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_buffer_init, lwres_buffer_invalidate, lwres_buffer_add, lwres_buffer_subtract, lwres_buffer_clear, lwres_buffer_first, lwres_buffer_forward, lwres_buffer_back, lwres_buffer_getuint8, lwres_buffer_putuint8, lwres_buffer_getuint16, lwres_buffer_putuint16, lwres_buffer_getuint32, lwres_buffer_putuint32, lwres_buffer_putmem, lwres_buffer_getmem — lightweight resolver buffer management

@@ -262,7 +262,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions provide bounds checked access to a region of memory where data is being read or written. diff --git a/lib/lwres/man/lwres_config.html b/lib/lwres/man/lwres_config.html index 8c330a38658..e1d41df6180 100644 --- a/lib/lwres/man/lwres_config.html +++ b/lib/lwres/man/lwres_config.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_conf_init, lwres_conf_clear, lwres_conf_parse, lwres_conf_print, lwres_conf_get — lightweight resolver configuration

@@ -90,7 +90,7 @@ lwres_conf_t *
-

DESCRIPTION

+

DESCRIPTION

lwres_conf_init() creates an empty lwres_conf_t @@ -123,7 +123,7 @@ lwres_conf_t *

-

RETURN VALUES

+

RETURN VALUES

lwres_conf_parse() returns LWRES_R_SUCCESS if it successfully read and parsed @@ -142,13 +142,13 @@ lwres_conf_t *

-

SEE ALSO

+

SEE ALSO

stdio(3), resolver(5).

-

FILES

+

FILES

/etc/resolv.conf

diff --git a/lib/lwres/man/lwres_context.html b/lib/lwres/man/lwres_context.html index 50d5d9f8d01..0f595276b56 100644 --- a/lib/lwres/man/lwres_context.html +++ b/lib/lwres/man/lwres_context.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_context_create, lwres_context_destroy, lwres_context_nextserial, lwres_context_initserial, lwres_context_freemem, lwres_context_allocmem, lwres_context_sendrecv — lightweight resolver context management

@@ -172,7 +172,7 @@ void *
-

DESCRIPTION

+

DESCRIPTION

lwres_context_create() creates a lwres_context_t structure for use in lightweight resolver operations. It holds a socket and other @@ -258,7 +258,7 @@ void *

-

RETURN VALUES

+

RETURN VALUES

lwres_context_create() returns LWRES_R_NOMEMORY if memory for the struct lwres_context could not be allocated, @@ -283,7 +283,7 @@ void *

-

SEE ALSO

+

SEE ALSO

lwres_conf_init(3), malloc(3), diff --git a/lib/lwres/man/lwres_gabn.html b/lib/lwres/man/lwres_gabn.html index 32b5f21bd46..d9e246bead7 100644 --- a/lib/lwres/man/lwres_gabn.html +++ b/lib/lwres/man/lwres_gabn.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_gabnrequest_render, lwres_gabnresponse_render, lwres_gabnrequest_parse, lwres_gabnresponse_parse, lwres_gabnresponse_free, lwres_gabnrequest_free — lightweight resolver getaddrbyname message handling

@@ -178,7 +178,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver name-to-address lookup request and @@ -278,7 +278,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The getaddrbyname opcode functions lwres_gabnrequest_render(), @@ -316,7 +316,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3)

diff --git a/lib/lwres/man/lwres_gai_strerror.html b/lib/lwres/man/lwres_gai_strerror.html index 9ff330b1375..7d494e35d27 100644 --- a/lib/lwres/man/lwres_gai_strerror.html +++ b/lib/lwres/man/lwres_gai_strerror.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_gai_strerror — print suitable error string

@@ -42,7 +42,7 @@ char *
-

DESCRIPTION

+

DESCRIPTION

lwres_gai_strerror() returns an error message corresponding to an error code returned by getaddrinfo(). @@ -110,7 +110,7 @@ char *

-

SEE ALSO

+

SEE ALSO

strerror(3), lwres_getaddrinfo(3), diff --git a/lib/lwres/man/lwres_getaddrinfo.html b/lib/lwres/man/lwres_getaddrinfo.html index d367f51d2ed..ad886df0572 100644 --- a/lib/lwres/man/lwres_getaddrinfo.html +++ b/lib/lwres/man/lwres_getaddrinfo.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getaddrinfo, lwres_freeaddrinfo — socket address structure to host and service name

@@ -89,7 +89,7 @@ struct addrinfo {

-

DESCRIPTION

+

DESCRIPTION

lwres_getaddrinfo() is used to get a list of IP addresses and port numbers for host hostname and service @@ -283,7 +283,7 @@ struct addrinfo {

-

RETURN VALUES

+

RETURN VALUES

lwres_getaddrinfo() returns zero on success or one of the error codes listed in gai_strerror(3) @@ -294,7 +294,7 @@ struct addrinfo {

-

SEE ALSO

+

SEE ALSO

lwres(3), lwres_getaddrinfo(3), diff --git a/lib/lwres/man/lwres_gethostent.html b/lib/lwres/man/lwres_gethostent.html index fdaa062fc90..9e9ec4f3b9f 100644 --- a/lib/lwres/man/lwres_gethostent.html +++ b/lib/lwres/man/lwres_gethostent.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_gethostbyname, lwres_gethostbyname2, lwres_gethostbyaddr, lwres_gethostent, lwres_sethostent, lwres_endhostent, lwres_gethostbyname_r, lwres_gethostbyaddr_r, lwres_gethostent_r, lwres_sethostent_r, lwres_endhostent_r — lightweight resolver get network host entry

@@ -228,7 +228,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions provide hostname-to-address and address-to-hostname lookups by means of the lightweight resolver. @@ -366,7 +366,7 @@ struct hostent {

-

RETURN VALUES

+

RETURN VALUES

The functions lwres_gethostbyname(), @@ -430,7 +430,7 @@ struct hostent {

-

SEE ALSO

+

SEE ALSO

gethostent(3), lwres_getipnode(3), @@ -439,7 +439,7 @@ struct hostent {

-

BUGS

+

BUGS

lwres_gethostbyname(), lwres_gethostbyname2(), lwres_gethostbyaddr() diff --git a/lib/lwres/man/lwres_getipnode.html b/lib/lwres/man/lwres_getipnode.html index 9f54cb6f550..42a33b132d0 100644 --- a/lib/lwres/man/lwres_getipnode.html +++ b/lib/lwres/man/lwres_getipnode.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getipnodebyname, lwres_getipnodebyaddr, lwres_freehostent — lightweight resolver nodename / address translation API

@@ -98,7 +98,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions perform thread safe, protocol independent nodename-to-address and address-to-nodename @@ -217,7 +217,7 @@ struct hostent {

-

RETURN VALUES

+

RETURN VALUES

If an error occurs, lwres_getipnodebyname() @@ -261,7 +261,7 @@ struct hostent {

-

SEE ALSO

+

SEE ALSO

RFC2553, lwres(3), diff --git a/lib/lwres/man/lwres_getnameinfo.html b/lib/lwres/man/lwres_getnameinfo.html index 10485433159..12169102ddf 100644 --- a/lib/lwres/man/lwres_getnameinfo.html +++ b/lib/lwres/man/lwres_getnameinfo.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getnameinfo — lightweight resolver socket address structure to hostname and @@ -82,7 +82,7 @@ int

-

DESCRIPTION

+

DESCRIPTION

This function is equivalent to the getnameinfo(3) function defined in RFC2133. @@ -149,13 +149,13 @@ int

-

RETURN VALUES

+

RETURN VALUES

lwres_getnameinfo() returns 0 on success or a non-zero error code if an error occurs.

-

SEE ALSO

+

SEE ALSO

RFC2133, getservbyport(3), lwres(3), @@ -165,7 +165,7 @@ int

-

BUGS

+

BUGS

RFC2133 fails to define what the nonzero return values of getnameinfo(3) diff --git a/lib/lwres/man/lwres_getrrsetbyname.html b/lib/lwres/man/lwres_getrrsetbyname.html index 3a7fb9ffc31..c96b38270f1 100644 --- a/lib/lwres/man/lwres_getrrsetbyname.html +++ b/lib/lwres/man/lwres_getrrsetbyname.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getrrsetbyname, lwres_freerrset — retrieve DNS records

@@ -102,7 +102,7 @@ struct rrsetinfo {

-

DESCRIPTION

+

DESCRIPTION

lwres_getrrsetbyname() gets a set of resource records associated with a hostname, class, @@ -150,7 +150,7 @@ struct rrsetinfo {

-

RETURN VALUES

+

RETURN VALUES

lwres_getrrsetbyname() returns zero on success, and one of the following error codes if an error occurred: @@ -184,7 +184,7 @@ struct rrsetinfo {

-

SEE ALSO

+

SEE ALSO

lwres(3).

diff --git a/lib/lwres/man/lwres_gnba.html b/lib/lwres/man/lwres_gnba.html index 8c7691ec716..cf4b49f11dc 100644 --- a/lib/lwres/man/lwres_gnba.html +++ b/lib/lwres/man/lwres_gnba.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_gnbarequest_render, lwres_gnbaresponse_render, lwres_gnbarequest_parse, lwres_gnbaresponse_parse, lwres_gnbaresponse_free, lwres_gnbarequest_free — lightweight resolver getnamebyaddress message handling

@@ -183,7 +183,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver address-to-name lookup request and @@ -270,7 +270,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The getnamebyaddr opcode functions lwres_gnbarequest_render(), @@ -308,7 +308,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3).

diff --git a/lib/lwres/man/lwres_hstrerror.html b/lib/lwres/man/lwres_hstrerror.html index df1c425747f..09371ca4e19 100644 --- a/lib/lwres/man/lwres_hstrerror.html +++ b/lib/lwres/man/lwres_hstrerror.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_herror, lwres_hstrerror — lightweight resolver error message generation

@@ -50,7 +50,7 @@ const char *
-

DESCRIPTION

+

DESCRIPTION

lwres_herror() prints the string s on stderr followed by the string generated by @@ -84,7 +84,7 @@ const char *

-

RETURN VALUES

+

RETURN VALUES

The string Unknown resolver error is returned by lwres_hstrerror() @@ -94,7 +94,7 @@ const char *

-

SEE ALSO

+

SEE ALSO

herror(3), lwres_hstrerror(3). diff --git a/lib/lwres/man/lwres_inetntop.html b/lib/lwres/man/lwres_inetntop.html index f0ea41acc62..3863eccb5b1 100644 --- a/lib/lwres/man/lwres_inetntop.html +++ b/lib/lwres/man/lwres_inetntop.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_net_ntop — lightweight resolver IP address presentation

@@ -62,7 +62,7 @@ const char *
-

DESCRIPTION

+

DESCRIPTION

lwres_net_ntop() converts an IP address of protocol family af — IPv4 or IPv6 — at @@ -80,7 +80,7 @@ const char *

-

RETURN VALUES

+

RETURN VALUES

If successful, the function returns dst: a pointer to a string containing the presentation format of the @@ -93,7 +93,7 @@ const char *

-

SEE ALSO

+

SEE ALSO

RFC1884, inet_ntop(3), errno(3). diff --git a/lib/lwres/man/lwres_noop.html b/lib/lwres/man/lwres_noop.html index 8f9d402d8f8..b4b6241f9fe 100644 --- a/lib/lwres/man/lwres_noop.html +++ b/lib/lwres/man/lwres_noop.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_nooprequest_render, lwres_noopresponse_render, lwres_nooprequest_parse, lwres_noopresponse_parse, lwres_noopresponse_free, lwres_nooprequest_free — lightweight resolver no-op message handling

@@ -179,7 +179,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver no-op request and response messages. @@ -270,7 +270,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The no-op opcode functions lwres_nooprequest_render(), @@ -309,7 +309,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3)

diff --git a/lib/lwres/man/lwres_packet.html b/lib/lwres/man/lwres_packet.html index 84eafc13169..a2f11919e8a 100644 --- a/lib/lwres/man/lwres_packet.html +++ b/lib/lwres/man/lwres_packet.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_lwpacket_renderheader, lwres_lwpacket_parseheader — lightweight resolver packet handling functions

@@ -66,7 +66,7 @@ lwres_result_t
-

DESCRIPTION

+

DESCRIPTION

These functions rely on a struct lwres_lwpacket @@ -219,7 +219,7 @@ struct lwres_lwpacket {

-

RETURN VALUES

+

RETURN VALUES

Successful calls to lwres_lwpacket_renderheader() and diff --git a/lib/lwres/man/lwres_resutil.html b/lib/lwres/man/lwres_resutil.html index b4de764af6e..8f7f7b87886 100644 --- a/lib/lwres/man/lwres_resutil.html +++ b/lib/lwres/man/lwres_resutil.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_string_parse, lwres_addr_parse, lwres_getaddrsbyname, lwres_getnamebyaddr — lightweight resolver utility functions

@@ -134,7 +134,7 @@ lwres_result_t
-

DESCRIPTION

+

DESCRIPTION

lwres_string_parse() retrieves a DNS-encoded string starting the current pointer of lightweight resolver buffer b: i.e. @@ -210,7 +210,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

Successful calls to lwres_string_parse() @@ -248,7 +248,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_buffer(3), lwres_gabn(3). diff --git a/lib/lwres/print.c b/lib/lwres/print.c index f461177e38a..d4e15d72cc0 100644 --- a/lib/lwres/print.c +++ b/lib/lwres/print.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007, 2011 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001, 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: print.c,v 1.10 2007-06-19 23:47:22 tbox Exp $ */ +/* $Id: print.c,v 1.10.814.2 2011-03-12 04:59:19 tbox Exp $ */ #include @@ -115,6 +115,7 @@ lwres__print_vsnprintf(char *str, size_t size, const char *format, va_list ap) { width = precision = 0; head = ""; length = pad = zeropad = 0; + POST(length); do { if (*format == '#') { diff --git a/make/rules.in b/make/rules.in index 12c9d5f50ca..692c7e3b9a1 100644 --- a/make/rules.in +++ b/make/rules.in @@ -1,4 +1,4 @@ -# Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") +# Copyright (C) 2004-2009, 2011 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 1998-2003 Internet Software Consortium. # # Permission to use, copy, modify, and/or distribute this software for any @@ -13,7 +13,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: rules.in,v 1.68 2009-09-01 18:40:25 jinmei Exp $ +# $Id: rules.in,v 1.68.346.2 2011-02-28 01:20:04 tbox Exp $ ### ### Common Makefile rules for BIND 9. @@ -50,7 +50,7 @@ top_builddir = @BIND9_TOP_BUILDDIR@ ### Makefile may define: ### TARGETS -all: subdirs ${TARGETS} +all: subdirs ${TARGETS} testdirs ### ### Subdirectories @@ -59,11 +59,12 @@ all: subdirs ${TARGETS} ### SUBDIRS ALL_SUBDIRS = ${SUBDIRS} nulldir +ALL_TESTDIRS = ${TESTDIRS} nulldir # # We use a single-colon rule so that additional dependencies of # subdirectories can be specified after the inclusion of this file. -# The "depend" target is treated the same way. +# The "depend" and "testdirs" targets are treated the same way. # subdirs: @for i in ${ALL_SUBDIRS}; do \ @@ -73,6 +74,17 @@ subdirs: fi; \ done +# +# Tests are built after the targets instead of before +# +testdirs: + @for i in ${ALL_TESTDIRS}; do \ + if [ "$$i" != "nulldir" -a -d $$i ]; then \ + echo "making all in `pwd`/$$i"; \ + (cd $$i; ${MAKE} ${MAKEDEFS} DESTDIR="${DESTDIR}" all) || exit 1; \ + fi; \ + done + install:: all install clean distclean maintainer-clean doc docclean man manclean:: diff --git a/release-notes.css b/release-notes.css new file mode 100644 index 00000000000..3add5055e78 --- /dev/null +++ b/release-notes.css @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2010, 2011 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id: release-notes.css,v 1.1.38.2 2011-08-24 01:53:51 marka Exp $ */ + +body { + background-color: #ffffff; + color: #333333; + font-family: "Helvetica Neue", "ArialMT", "Verdana", "Arial", "Helvetica", sans-serif; + font-size: 14px; + line-height: 18px; + margin: 2em auto; + width: 700px; +} + +.command { + font-family: "Courier New", "Courier", monospace; + font-weight: normal; +} + +.note { + background-color: #ddeedd; + border: 1px solid #aaccaa; + margin: 1em 0 1em 0; + padding: 0.5em 1em 0.5em 1em; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +.screen { + background-color: #ffffee; + border: 1px solid #ddddaa; + padding: 0.25em 1em 0.25em 1em; + margin: 1em 0 1em 0; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +.section.title { + font-size: 150%; + font-weight: bold; +} + +.section.section.title { + font-size: 130%; + font-weight: bold; +} diff --git a/version b/version index 1d9fbd2b07f..ede0ba0511f 100644 --- a/version +++ b/version @@ -1,10 +1,10 @@ -# $Id: version,v 1.53.8.2.2.4 2011-06-21 20:44:01 each Exp $ +# $Id: version,v 1.53.8.9 2011-08-24 02:08:26 marka Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. # MAJORVER=9 MINORVER=8 -PATCHVER=0 -RELEASETYPE=-P -RELEASEVER=4 +PATCHVER=1 +RELEASETYPE= +RELEASEVER= From 4a28185ca651dac3b9efa694040b80ab0eaa0690 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Thu, 1 Sep 2011 06:11:16 +0000 Subject: [PATCH 358/452] Add pkcs11 and unit to the list of things to remove from configure.in Make a line more copy-pastable --- FREEBSD-Upgrade | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/FREEBSD-Upgrade b/FREEBSD-Upgrade index 094a1e7463c..2106309457f 100644 --- a/FREEBSD-Upgrade +++ b/FREEBSD-Upgrade @@ -58,7 +58,8 @@ -e '/contrib\/zone-edit.sh/d;' \ configure.in Makefile.in */Makefile.in - Remove mention of doxygen and related files from configure.in + Remove mention of doxygen, pkcs11, unit and related files from + configure.in Please do not commit this change. You only need this to generate config.h. @@ -90,7 +91,7 @@ Do not commit any other file that was modified or created in steps 6) or 7). -12) cd src/lib/bind/dns && make -DMAINTAINER_MODE generate && rm gen +12) cd ../../lib/bind/dns && make -DMAINTAINER_MODE generate && rm gen 13) Test build the updated files with a clean /usr/obj and empty src.conf From 2c862d88e8d97786659ae8a6bfd87ddb96215287 Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Fri, 2 Sep 2011 13:03:56 +0000 Subject: [PATCH 359/452] Import additional bugfix for reading and extracting makefs-created ISO images with tar. Vendor revision 3648 (merge of 3647): Additional fix to issue 168 because the change of r3642 was not sufficient. - Make sure "CL" entry appear after its "RE" entry which the "CL" entry should be connected with. - Give consideration to the case that the top level "RE" entry has already been exposed outside before its tree. Approved by: re (kib) Obtained from: libarchive (release/2.8, svn rev 3648) MFC after: 3 days --- .../archive_read_support_format_iso9660.c | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/libarchive/archive_read_support_format_iso9660.c b/lib/libarchive/archive_read_support_format_iso9660.c index 3882f85181c..021646112b3 100644 --- a/lib/libarchive/archive_read_support_format_iso9660.c +++ b/lib/libarchive/archive_read_support_format_iso9660.c @@ -1815,8 +1815,11 @@ parse_file_info(struct archive_read *a, struct file_info *parent, file->re_descendant = 1; if (file->cl_offset != 0) { parent->subdirs++; - /* To be appeared before other dirs. */ - file->offset = file->number = file->cl_offset; + /* Overwrite an offset and a number of this "CL" entry + * to appear before other dirs. "+1" to those is to + * make sure to appear after "RE" entry which this + * "CL" entry should be connected with. */ + file->offset = file->number = file->cl_offset + 1; } } @@ -2581,13 +2584,16 @@ next_cache_entry(struct archive_read *a, struct iso9660 *iso9660, continue; } else if (file->re_descendant) { /* - * Do not expose this at this time - * because we have not gotten its full-path - * name yet. + * If the top level "RE" entry of this entry + * is not exposed, we, accordingly, should not + * expose this entry at this time because + * we cannot make its proper full-path name. */ - if (rede_add_entry(file) < 0) - goto fatal_rr; - continue; + if (rede_add_entry(file) == 0) + continue; + /* Otherwise we can expose this entry because + * it seems its top level "RE" has already been + * exposed. */ } } break; From cfc9e655bacc58c2098f47f52302884beb1453c1 Mon Sep 17 00:00:00 2001 From: Sergey Kandaurov Date: Fri, 2 Sep 2011 14:10:42 +0000 Subject: [PATCH 360/452] Cosmetic cleanup: remove #define LIBMEMSTAT used to prevent a nested include of opt_vmpage.h from vm/vm_page.h. opt_vmpage.h was retired before 7.0 together with options PQ_NOOPT. Approved by: re (kib) MFC after: 3 days --- lib/libmemstat/memstat_uma.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/libmemstat/memstat_uma.c b/lib/libmemstat/memstat_uma.c index 58a08cfddbc..35f6dad45a4 100644 --- a/lib/libmemstat/memstat_uma.c +++ b/lib/libmemstat/memstat_uma.c @@ -30,7 +30,6 @@ #include #include -#define LIBMEMSTAT /* Cause vm_page.h not to include opt_vmpage.h */ #include #include From 2e5df98a18f21f1e6631e014413e2f8f0f74034a Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Fri, 2 Sep 2011 16:00:51 +0000 Subject: [PATCH 361/452] Move the logic to parse volume cache commands out into a separate function and use a loop so that multiple cache commands can be strung together on the command line into a single update to the volume's properties. Reviewed by: bz Approved by: re (kib) MFC after: 1 week --- usr.sbin/mfiutil/mfi_volume.c | 262 +++++++++++++++++++--------------- usr.sbin/mfiutil/mfiutil.8 | 16 ++- 2 files changed, 159 insertions(+), 119 deletions(-) diff --git a/usr.sbin/mfiutil/mfi_volume.c b/usr.sbin/mfiutil/mfi_volume.c index 0d9300a71f5..836f0453503 100644 --- a/usr.sbin/mfiutil/mfi_volume.c +++ b/usr.sbin/mfiutil/mfi_volume.c @@ -111,16 +111,16 @@ mfi_ld_set_props(int fd, struct mfi_ld_props *props) } static int -update_cache_policy(int fd, struct mfi_ld_props *props, uint8_t new_policy, - uint8_t mask) +update_cache_policy(int fd, struct mfi_ld_props *old, struct mfi_ld_props *new) { int error; uint8_t changes, policy; - policy = (props->default_cache_policy & ~mask) | new_policy; - if (policy == props->default_cache_policy) + if (old->default_cache_policy == new->default_cache_policy && + old->disk_cache_policy == new->disk_cache_policy) return (0); - changes = policy ^ props->default_cache_policy; + policy = new->default_cache_policy; + changes = policy ^ old->default_cache_policy; if (changes & MR_LD_CACHE_ALLOW_WRITE_CACHE) printf("%s caching of I/O writes\n", policy & MR_LD_CACHE_ALLOW_WRITE_CACHE ? "Enabling" : @@ -142,9 +142,21 @@ update_cache_policy(int fd, struct mfi_ld_props *props, uint8_t new_policy, printf("%s write caching with bad BBU\n", policy & MR_LD_CACHE_WRITE_CACHE_BAD_BBU ? "Enabling" : "Disabling"); + if (old->disk_cache_policy != new->disk_cache_policy) { + switch (new->disk_cache_policy) { + case MR_PD_CACHE_ENABLE: + printf("Enabling write-cache on physical drives\n"); + break; + case MR_PD_CACHE_DISABLE: + printf("Disabling write-cache on physical drives\n"); + break; + case MR_PD_CACHE_UNCHANGED: + printf("Using default write-cache setting on physical drives\n"); + break; + } + } - props->default_cache_policy = policy; - if (mfi_ld_set_props(fd, props) < 0) { + if (mfi_ld_set_props(fd, new) < 0) { error = errno; warn("Failed to set volume properties"); return (error); @@ -152,12 +164,130 @@ update_cache_policy(int fd, struct mfi_ld_props *props, uint8_t new_policy, return (0); } +static void +stage_cache_setting(struct mfi_ld_props *props, uint8_t new_policy, + uint8_t mask) +{ + + props->default_cache_policy &= ~mask; + props->default_cache_policy |= new_policy; +} + +/* + * Parse a single cache directive modifying the passed in policy. + * Returns -1 on a parse error and the number of arguments consumed + * on success. + */ +static int +process_cache_command(int ac, char **av, struct mfi_ld_props *props) +{ + uint8_t policy; + + /* I/O cache settings. */ + if (strcmp(av[0], "all") == 0 || strcmp(av[0], "enable") == 0) { + stage_cache_setting(props, MR_LD_CACHE_ALLOW_READ_CACHE | + MR_LD_CACHE_ALLOW_WRITE_CACHE, + MR_LD_CACHE_ALLOW_READ_CACHE | + MR_LD_CACHE_ALLOW_WRITE_CACHE); + return (1); + } + if (strcmp(av[0], "none") == 0 || strcmp(av[0], "disable") == 0) { + stage_cache_setting(props, 0, MR_LD_CACHE_ALLOW_READ_CACHE | + MR_LD_CACHE_ALLOW_WRITE_CACHE); + return (1); + } + if (strcmp(av[0], "reads") == 0) { + stage_cache_setting(props, MR_LD_CACHE_ALLOW_READ_CACHE, + MR_LD_CACHE_ALLOW_READ_CACHE | + MR_LD_CACHE_ALLOW_WRITE_CACHE); + return (1); + } + if (strcmp(av[0], "writes") == 0) { + stage_cache_setting(props, MR_LD_CACHE_ALLOW_WRITE_CACHE, + MR_LD_CACHE_ALLOW_READ_CACHE | + MR_LD_CACHE_ALLOW_WRITE_CACHE); + return (1); + } + + /* Write cache behavior. */ + if (strcmp(av[0], "write-back") == 0) { + stage_cache_setting(props, MR_LD_CACHE_WRITE_BACK, + MR_LD_CACHE_WRITE_BACK); + return (1); + } + if (strcmp(av[0], "write-through") == 0) { + stage_cache_setting(props, 0, MR_LD_CACHE_WRITE_BACK); + return (1); + } + if (strcmp(av[0], "bad-bbu-write-cache") == 0) { + if (ac < 2) { + warnx("cache: bad BBU setting required"); + return (-1); + } + if (strcmp(av[1], "enable") == 0) + policy = MR_LD_CACHE_WRITE_CACHE_BAD_BBU; + else if (strcmp(av[1], "disable") == 0) + policy = 0; + else { + warnx("cache: invalid bad BBU setting"); + return (-1); + } + stage_cache_setting(props, policy, + MR_LD_CACHE_WRITE_CACHE_BAD_BBU); + return (2); + } + + /* Read cache behavior. */ + if (strcmp(av[0], "read-ahead") == 0) { + if (ac < 2) { + warnx("cache: read-ahead setting required"); + return (-1); + } + if (strcmp(av[1], "none") == 0) + policy = 0; + else if (strcmp(av[1], "always") == 0) + policy = MR_LD_CACHE_READ_AHEAD; + else if (strcmp(av[1], "adaptive") == 0) + policy = MR_LD_CACHE_READ_AHEAD | + MR_LD_CACHE_READ_ADAPTIVE; + else { + warnx("cache: invalid read-ahead setting"); + return (-1); + } + stage_cache_setting(props, policy, MR_LD_CACHE_READ_AHEAD | + MR_LD_CACHE_READ_ADAPTIVE); + return (2); + } + + /* Drive write-cache behavior. */ + if (strcmp(av[0], "write-cache") == 0) { + if (ac < 2) { + warnx("cache: write-cache setting required"); + return (-1); + } + if (strcmp(av[1], "enable") == 0) + props->disk_cache_policy = MR_PD_CACHE_ENABLE; + else if (strcmp(av[1], "disable") == 0) + props->disk_cache_policy = MR_PD_CACHE_DISABLE; + else if (strcmp(av[1], "default") == 0) + props->disk_cache_policy = MR_PD_CACHE_UNCHANGED; + else { + warnx("cache: invalid write-cache setting"); + return (-1); + } + return (2); + } + + warnx("cache: Invalid command"); + return (-1); +} + static int volume_cache(int ac, char **av) { - struct mfi_ld_props props; - int error, fd; - uint8_t target_id, policy; + struct mfi_ld_props props, new; + int error, fd, consumed; + uint8_t target_id; if (ac < 2) { warnx("cache: volume required"); @@ -235,113 +365,19 @@ volume_cache(int ac, char **av) printf("Cache Disabled Due to Dead Battery\n"); error = 0; } else { - if (strcmp(av[2], "all") == 0 || strcmp(av[2], "enable") == 0) - error = update_cache_policy(fd, &props, - MR_LD_CACHE_ALLOW_READ_CACHE | - MR_LD_CACHE_ALLOW_WRITE_CACHE, - MR_LD_CACHE_ALLOW_READ_CACHE | - MR_LD_CACHE_ALLOW_WRITE_CACHE); - else if (strcmp(av[2], "none") == 0 || - strcmp(av[2], "disable") == 0) - error = update_cache_policy(fd, &props, 0, - MR_LD_CACHE_ALLOW_READ_CACHE | - MR_LD_CACHE_ALLOW_WRITE_CACHE); - else if (strcmp(av[2], "reads") == 0) - error = update_cache_policy(fd, &props, - MR_LD_CACHE_ALLOW_READ_CACHE, - MR_LD_CACHE_ALLOW_READ_CACHE | - MR_LD_CACHE_ALLOW_WRITE_CACHE); - else if (strcmp(av[2], "writes") == 0) - error = update_cache_policy(fd, &props, - MR_LD_CACHE_ALLOW_WRITE_CACHE, - MR_LD_CACHE_ALLOW_READ_CACHE | - MR_LD_CACHE_ALLOW_WRITE_CACHE); - else if (strcmp(av[2], "write-back") == 0) - error = update_cache_policy(fd, &props, - MR_LD_CACHE_WRITE_BACK, - MR_LD_CACHE_WRITE_BACK); - else if (strcmp(av[2], "write-through") == 0) - error = update_cache_policy(fd, &props, 0, - MR_LD_CACHE_WRITE_BACK); - else if (strcmp(av[2], "read-ahead") == 0) { - if (ac < 4) { - warnx("cache: read-ahead setting required"); + new = props; + av += 2; + ac -= 2; + while (ac > 0) { + consumed = process_cache_command(ac, av, &new); + if (consumed < 0) { close(fd); return (EINVAL); } - if (strcmp(av[3], "none") == 0) - policy = 0; - else if (strcmp(av[3], "always") == 0) - policy = MR_LD_CACHE_READ_AHEAD; - else if (strcmp(av[3], "adaptive") == 0) - policy = MR_LD_CACHE_READ_AHEAD | - MR_LD_CACHE_READ_ADAPTIVE; - else { - warnx("cache: invalid read-ahead setting"); - close(fd); - return (EINVAL); - } - error = update_cache_policy(fd, &props, policy, - MR_LD_CACHE_READ_AHEAD | - MR_LD_CACHE_READ_ADAPTIVE); - } else if (strcmp(av[2], "bad-bbu-write-cache") == 0) { - if (ac < 4) { - warnx("cache: bad BBU setting required"); - close(fd); - return (EINVAL); - } - if (strcmp(av[3], "enable") == 0) - policy = MR_LD_CACHE_WRITE_CACHE_BAD_BBU; - else if (strcmp(av[3], "disable") == 0) - policy = 0; - else { - warnx("cache: invalid bad BBU setting"); - close(fd); - return (EINVAL); - } - error = update_cache_policy(fd, &props, policy, - MR_LD_CACHE_WRITE_CACHE_BAD_BBU); - } else if (strcmp(av[2], "write-cache") == 0) { - if (ac < 4) { - warnx("cache: write-cache setting required"); - close(fd); - return (EINVAL); - } - if (strcmp(av[3], "enable") == 0) - policy = MR_PD_CACHE_ENABLE; - else if (strcmp(av[3], "disable") == 0) - policy = MR_PD_CACHE_DISABLE; - else if (strcmp(av[3], "default") == 0) - policy = MR_PD_CACHE_UNCHANGED; - else { - warnx("cache: invalid write-cache setting"); - close(fd); - return (EINVAL); - } - error = 0; - if (policy != props.disk_cache_policy) { - switch (policy) { - case MR_PD_CACHE_ENABLE: - printf("Enabling write-cache on physical drives\n"); - break; - case MR_PD_CACHE_DISABLE: - printf("Disabling write-cache on physical drives\n"); - break; - case MR_PD_CACHE_UNCHANGED: - printf("Using default write-cache setting on physical drives\n"); - break; - } - props.disk_cache_policy = policy; - if (mfi_ld_set_props(fd, &props) < 0) { - error = errno; - warn("Failed to set volume properties"); - } - } - } else { - warnx("cache: Invalid command"); - close(fd); - return (EINVAL); + av += consumed; + ac -= consumed; } + error = update_cache_policy(fd, &props, &new); } close(fd); diff --git a/usr.sbin/mfiutil/mfiutil.8 b/usr.sbin/mfiutil/mfiutil.8 index dcd17f5224e..b948b953eae 100644 --- a/usr.sbin/mfiutil/mfiutil.8 +++ b/usr.sbin/mfiutil/mfiutil.8 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 20, 2011 +.Dd September 2, 2011 .Dt MFIUTIL 8 .Os .Sh NAME @@ -103,7 +103,7 @@ .Cm locate Ar drive Brq "on | off" .Nm .Op Fl u Ar unit -.Cm cache Ar volume Op Ar setting Op Ar value +.Cm cache Ar volume Op Ar setting Oo Ar value Oc Op ... .Nm .Op Fl u Ar unit .Cm name Ar volume Ar name @@ -367,19 +367,23 @@ Change the state of the external LED associated with .Pp The logical volume management commands include: .Bl -tag -width indent -.It Cm cache Ar volume Op Ar setting Op Ar value +.It Cm cache Ar volume Op Ar setting Oo Ar value Oc Op ... If no .Ar setting -argument is supplied, then the current cache policy for +arguments are supplied, then the current cache policy for .Ar volume is displayed; otherwise, the cache policy for .Ar volume is modified. -The optional +One or more .Ar setting -argument can be one of the following values: +arguments may be given. +Some settings take an additional +.Ar value +argument as noted below. +The valid settings are: .Bl -tag -width indent .It Cm enable Enable caching for both read and write I/O operations. From 74931812978048f9f50281aec063ffd51a6651d6 Mon Sep 17 00:00:00 2001 From: Marius Strobl Date: Fri, 2 Sep 2011 16:40:18 +0000 Subject: [PATCH 362/452] Fix alignment assumptions. PR: 160289 Approved by: re (kib) MFC after: 3 days --- tools/tools/netrate/netblast/netblast.c | 5 ++--- tools/tools/netrate/netsend/netsend.c | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/tools/tools/netrate/netblast/netblast.c b/tools/tools/netrate/netblast/netblast.c index 3e901266f0e..f932fca08d7 100644 --- a/tools/tools/netrate/netblast/netblast.c +++ b/tools/tools/netrate/netblast/netblast.c @@ -26,6 +26,7 @@ * $FreeBSD$ */ +#include #include #include #include @@ -108,11 +109,9 @@ blast_loop(int s, long duration, u_char *packet, u_int packet_len) * previous send, the error will turn up the current send * operation, causing the current sequence number also to be * skipped. - * - * XXXRW: Note alignment assumption. */ if (packet_len >= 4) { - *((u_int32_t *)packet) = htonl(counter); + be32enc(packet, counter); counter++; } if (send(s, packet, packet_len, 0) < 0) diff --git a/tools/tools/netrate/netsend/netsend.c b/tools/tools/netrate/netsend/netsend.c index 5e41f2d743b..49cd3436d37 100644 --- a/tools/tools/netrate/netsend/netsend.c +++ b/tools/tools/netrate/netsend/netsend.c @@ -26,6 +26,7 @@ * $FreeBSD$ */ +#include #include #include #include @@ -203,11 +204,9 @@ timing_loop(struct _a *a) * skipped. * The counter is incremented only on the initial port number, * so all destinations will see the same set of packets. - * - * XXXRW: Note alignment assumption. */ if (cur_port == a->port && a->packet_len >= 4) { - *((u_int32_t *)a->packet) = htonl(counter); + be32enc(a->packet, counter); counter++; } if (a->port == a->port_max) { /* socket already bound */ From fdc61a888d2388983edf482eb0cbe64e9befa00d Mon Sep 17 00:00:00 2001 From: Xin LI Date: Fri, 2 Sep 2011 17:05:34 +0000 Subject: [PATCH 363/452] Fix the check in dircheck() on namlen. The value of namlen is copied from on-disk d_namlen, which is a 8-bit unsigned integer which can never exceed MAXNAMLEN (255) so the test is always true. Moreover, UFS does not allow d_namelen being zero. Change namlen from u_int to u_int8_t, and replace the unneeded test with a useful test. PR: bin/160339 Submitted by: Eugene Grosbein MFC after: 2 weeks Approved by: re (kib) --- sbin/fsck_ffs/dir.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sbin/fsck_ffs/dir.c b/sbin/fsck_ffs/dir.c index da838b05c36..7815fe6f3f5 100644 --- a/sbin/fsck_ffs/dir.c +++ b/sbin/fsck_ffs/dir.c @@ -210,7 +210,7 @@ dircheck(struct inodesc *idesc, struct direct *dp) size_t size; char *cp; u_char type; - u_int namlen; + u_int8_t namlen; int spaceleft; spaceleft = DIRBLKSIZ - (idesc->id_loc % DIRBLKSIZ); @@ -225,7 +225,7 @@ dircheck(struct inodesc *idesc, struct direct *dp) type = dp->d_type; if (dp->d_reclen < size || idesc->id_filesize < size || - namlen > MAXNAMLEN || + namlen == 0 || type > 15) goto bad; for (cp = dp->d_name, size = 0; size < namlen; size++) From d1f97f76a596d948f6e61cc0dd67c8a96220ec29 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Fri, 2 Sep 2011 17:06:23 +0000 Subject: [PATCH 364/452] Expose more variables from coretemp(4) via sysctl: - tjmax - Tj(max) value from the CPU - delta - current delta reading - resolution - sensor resolution in Celsius - throttle_log - whether a #PROCHOT was asserted since last reset Submitted by: Mark Johnston (mostly) MFC after: 1 month Approved by: re (kib) --- sys/dev/coretemp/coretemp.c | 221 ++++++++++++++++++++++++++---------- 1 file changed, 159 insertions(+), 62 deletions(-) diff --git a/sys/dev/coretemp/coretemp.c b/sys/dev/coretemp/coretemp.c index 92109ad1c4b..cb1cbff3100 100644 --- a/sys/dev/coretemp/coretemp.c +++ b/sys/dev/coretemp/coretemp.c @@ -48,12 +48,21 @@ __FBSDID("$FreeBSD$"); #include #include -#define TZ_ZEROC 2732 +#define TZ_ZEROC 2732 + +#define THERM_STATUS_LOG 0x02 +#define THERM_STATUS 0x01 +#define THERM_STATUS_TEMP_SHIFT 16 +#define THERM_STATUS_TEMP_MASK 0x7f +#define THERM_STATUS_RES_SHIFT 27 +#define THERM_STATUS_RES_MASK 0x0f +#define THERM_STATUS_VALID_SHIFT 31 +#define THERM_STATUS_VALID_MASK 0x01 struct coretemp_softc { device_t sc_dev; int sc_tjmax; - struct sysctl_oid *sc_oid; + unsigned int sc_throttle_log; }; /* @@ -64,8 +73,10 @@ static int coretemp_probe(device_t dev); static int coretemp_attach(device_t dev); static int coretemp_detach(device_t dev); -static int coretemp_get_temp(device_t dev); -static int coretemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS); +static uint64_t coretemp_get_thermal_msr(int cpu); +static void coretemp_clear_thermal_msr(int cpu); +static int coretemp_get_val_sysctl(SYSCTL_HANDLER_ARGS); +static int coretemp_throttle_log_sysctl(SYSCTL_HANDLER_ARGS); static device_method_t coretemp_methods[] = { /* Device interface */ @@ -83,8 +94,16 @@ static driver_t coretemp_driver = { sizeof(struct coretemp_softc), }; +enum therm_info { + CORETEMP_TEMP, + CORETEMP_DELTA, + CORETEMP_RESOLUTION, + CORETEMP_TJMAX, +}; + static devclass_t coretemp_devclass; -DRIVER_MODULE(coretemp, cpu, coretemp_driver, coretemp_devclass, NULL, NULL); +DRIVER_MODULE(coretemp, cpu, coretemp_driver, coretemp_devclass, NULL, + NULL); static void coretemp_identify(driver_t *driver, device_t parent) @@ -135,6 +154,8 @@ coretemp_attach(device_t dev) uint64_t msr; int cpu_model, cpu_stepping; int ret, tjtarget; + struct sysctl_oid *oid; + struct sysctl_ctx_list *ctx; sc->sc_dev = dev; pdev = device_get_parent(dev); @@ -149,7 +170,7 @@ coretemp_attach(device_t dev) */ if (cpu_model < 0xe) return (ENXIO); - + #if 0 /* * XXXrpaulo: I have this CPU model and when it returns from C3 * coretemp continues to function properly. @@ -216,7 +237,7 @@ coretemp_attach(device_t dev) ret = rdmsr_safe(MSR_IA32_TEMPERATURE_TARGET, &msr); if (ret == 0) { tjtarget = (msr >> 16) & 0xff; - + /* * On earlier generation of processors, the value * obtained from IA32_TEMPERATURE_TARGET register is @@ -243,15 +264,35 @@ coretemp_attach(device_t dev) if (bootverbose) device_printf(dev, "Setting TjMax=%d\n", sc->sc_tjmax); + ctx = device_get_sysctl_ctx(dev); + + oid = SYSCTL_ADD_NODE(ctx, + SYSCTL_CHILDREN(device_get_sysctl_tree(pdev)), OID_AUTO, + "coretemp", CTLFLAG_RD, NULL, "Per-CPU thermal information"); + /* - * Add the "temperature" MIB to dev.cpu.N. + * Add the MIBs to dev.cpu.N and dev.cpu.N.coretemp. */ - sc->sc_oid = SYSCTL_ADD_PROC(device_get_sysctl_ctx(pdev), - SYSCTL_CHILDREN(device_get_sysctl_tree(pdev)), - OID_AUTO, "temperature", - CTLTYPE_INT | CTLFLAG_RD, - dev, 0, coretemp_get_temp_sysctl, "IK", + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(device_get_sysctl_tree(pdev)), + OID_AUTO, "temperature", CTLTYPE_INT | CTLFLAG_RD, dev, + CORETEMP_TEMP, coretemp_get_val_sysctl, "IK", "Current temperature"); + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "delta", + CTLTYPE_INT | CTLFLAG_RD, dev, CORETEMP_DELTA, + coretemp_get_val_sysctl, "I", + "Delta between TCC activation and current temperature"); + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "resolution", + CTLTYPE_INT | CTLFLAG_RD, dev, CORETEMP_RESOLUTION, + coretemp_get_val_sysctl, "I", + "Resolution of CPU thermal sensor"); + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "tjmax", + CTLTYPE_INT | CTLFLAG_RD, dev, CORETEMP_TJMAX, + coretemp_get_val_sysctl, "IK", + "TCC activation temperature"); + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "throttle_log", CTLTYPE_INT | CTLFLAG_RW, dev, 0, + coretemp_throttle_log_sysctl, "I", + "Set to 1 if the thermal sensor has tripped"); return (0); } @@ -259,22 +300,13 @@ coretemp_attach(device_t dev) static int coretemp_detach(device_t dev) { - struct coretemp_softc *sc = device_get_softc(dev); - - sysctl_remove_oid(sc->sc_oid, 1, 0); - return (0); } - -static int -coretemp_get_temp(device_t dev) +static uint64_t +coretemp_get_thermal_msr(int cpu) { uint64_t msr; - int temp; - int cpu = device_get_unit(dev); - struct coretemp_softc *sc = device_get_softc(dev); - char stemp[16]; thread_lock(curthread); sched_bind(curthread, cpu); @@ -296,51 +328,116 @@ coretemp_get_temp(device_t dev) sched_unbind(curthread); thread_unlock(curthread); - /* - * Check for Thermal Status and Thermal Status Log. - */ - if ((msr & 0x3) == 0x3) - device_printf(dev, "PROCHOT asserted\n"); + return (msr); +} - /* - * Bit 31 contains "Reading valid" - */ - if (((msr >> 31) & 0x1) == 1) { - /* - * Starting on bit 16 and ending on bit 22. - */ - temp = sc->sc_tjmax - ((msr >> 16) & 0x7f); - } else - temp = -1; +static void +coretemp_clear_thermal_msr(int cpu) +{ + thread_lock(curthread); + sched_bind(curthread, cpu); + thread_unlock(curthread); - /* - * Check for Critical Temperature Status and Critical - * Temperature Log. - * It doesn't really matter if the current temperature is - * invalid because the "Critical Temperature Log" bit will - * tell us if the Critical Temperature has been reached in - * past. It's not directly related to the current temperature. - * - * If we reach a critical level, allow devctl(4) to catch this - * and shutdown the system. - */ - if (((msr >> 4) & 0x3) == 0x3) { - device_printf(dev, "critical temperature detected, " - "suggest system shutdown\n"); - snprintf(stemp, sizeof(stemp), "%d", temp); - devctl_notify("coretemp", "Thermal", stemp, "notify=0xcc"); - } + wrmsr(MSR_THERM_STATUS, 0); - return (temp); + thread_lock(curthread); + sched_unbind(curthread); + thread_unlock(curthread); } static int -coretemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS) +coretemp_get_val_sysctl(SYSCTL_HANDLER_ARGS) { - device_t dev = (device_t) arg1; - int temp; + device_t dev; + uint64_t msr; + int val, tmp; + struct coretemp_softc *sc; + enum therm_info type; + char stemp[16]; - temp = coretemp_get_temp(dev) * 10 + TZ_ZEROC; + dev = (device_t) arg1; + msr = coretemp_get_thermal_msr(device_get_unit(dev)); + sc = device_get_softc(dev); + type = arg2; - return (sysctl_handle_int(oidp, &temp, 0, req)); + if (((msr >> THERM_STATUS_VALID_SHIFT) & THERM_STATUS_VALID_MASK) != 1) { + val = -1; + } else { + switch (type) { + case CORETEMP_TEMP: + tmp = (msr >> THERM_STATUS_TEMP_SHIFT) & + THERM_STATUS_TEMP_MASK; + val = (sc->sc_tjmax - tmp) * 10 + TZ_ZEROC; + break; + case CORETEMP_DELTA: + val = (msr >> THERM_STATUS_TEMP_SHIFT) & + THERM_STATUS_TEMP_MASK; + break; + case CORETEMP_RESOLUTION: + val = (msr >> THERM_STATUS_RES_SHIFT) & + THERM_STATUS_RES_MASK; + break; + case CORETEMP_TJMAX: + val = sc->sc_tjmax * 10 + TZ_ZEROC; + break; + } + } + + if (msr & THERM_STATUS_LOG) { + sc->sc_throttle_log = 1; + + /* + * Check for Critical Temperature Status and Critical + * Temperature Log. It doesn't really matter if the + * current temperature is invalid because the "Critical + * Temperature Log" bit will tell us if the Critical + * Temperature has * been reached in past. It's not + * directly related to the current temperature. + * + * If we reach a critical level, allow devctl(4) + * to catch this and shutdown the system. + */ + if (msr & THERM_STATUS) { + tmp = (msr >> THERM_STATUS_TEMP_SHIFT) & + THERM_STATUS_TEMP_MASK; + tmp = (sc->sc_tjmax - tmp) * 10 + TZ_ZEROC; + device_printf(dev, "critical temperature detected, " + "suggest system shutdown\n"); + snprintf(stemp, sizeof(stemp), "%d", tmp); + devctl_notify("coretemp", "Thermal", stemp, + "notify=0xcc"); + } + } + + return (sysctl_handle_int(oidp, &val, 0, req)); +} + +static int +coretemp_throttle_log_sysctl(SYSCTL_HANDLER_ARGS) +{ + device_t dev; + uint64_t msr; + int error, val; + struct coretemp_softc *sc; + + dev = (device_t) arg1; + msr = coretemp_get_thermal_msr(device_get_unit(dev)); + sc = device_get_softc(dev); + + if (msr & THERM_STATUS_LOG) + sc->sc_throttle_log = 1; + + val = sc->sc_throttle_log; + + error = sysctl_handle_int(oidp, &val, 0, req); + + if (error || !req->newptr) + return (error); + else if (val != 0) + return (EINVAL); + + coretemp_clear_thermal_msr(device_get_unit(dev)); + sc->sc_throttle_log = 0; + + return (0); } From cdd4eea9fca2d4b2edd85e3c29413ab9b0deaa46 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Fri, 2 Sep 2011 17:06:50 +0000 Subject: [PATCH 365/452] Fix a bug in ichwd(4) which prevents it from beig enabled if the new timeout is the same timeout. Submitted by: Dmitrij Tejblum PR: kern/139604 MFC after: 2 weeks Approved by: re (kib) --- sys/dev/ichwd/ichwd.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sys/dev/ichwd/ichwd.c b/sys/dev/ichwd/ichwd.c index a66826e4c6e..5d800c963e8 100644 --- a/sys/dev/ichwd/ichwd.c +++ b/sys/dev/ichwd/ichwd.c @@ -402,11 +402,10 @@ ichwd_event(void *arg, unsigned int cmd, int *error) cmd &= WD_INTERVAL; timeout = ((uint64_t)1 << cmd) / ICHWD_TICK; if (cmd) { - if (timeout != sc->timeout) { - if (!sc->active) - ichwd_tmr_enable(sc); + if (!sc->active) + ichwd_tmr_enable(sc); + if (timeout != sc->timeout) ichwd_tmr_set(sc, timeout); - } ichwd_tmr_reload(sc); *error = 0; } else { From d2e17ce9060fc7cf5f1bdb778ea1517aa0a8c733 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Fri, 2 Sep 2011 17:11:59 +0000 Subject: [PATCH 366/452] Clear the mountprog variable after each mountfs() call so that mountprog options don't leak over into subsequent mounts listed in /etc/fstab. While here, fix a memory leak in debug mode. Reported by: rank1seeker @ gmail Approved by: re (kib) MFC after: 1 week --- sbin/mount/mount.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index 6e8f3b5c63e..3f6d2eabaff 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -589,6 +589,9 @@ mountfs(const char *vfstype, const char *spec, const char *name, int flags, for (i = 1; i < mnt_argv.c; i++) (void)printf(" %s", mnt_argv.a[i]); (void)printf("\n"); + free(optbuf); + free(mountprog); + mountprog = NULL; return (0); } @@ -599,6 +602,8 @@ mountfs(const char *vfstype, const char *spec, const char *name, int flags, } free(optbuf); + free(mountprog); + mountprog = NULL; if (verbose) { if (statfs(name, &sf) < 0) { From e53e8455f02cf9aacb6dc64b0ff1e56dfe40e479 Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Fri, 2 Sep 2011 17:36:01 +0000 Subject: [PATCH 367/452] Add support for alternative break-to-debugger support on the Xen console. This should help debug boot-time hangs experienced in 9.0-BETA. MFC after: 3 weeks Tested by: sbruno Approved by: re (kib) --- sys/dev/xen/console/console.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sys/dev/xen/console/console.c b/sys/dev/xen/console/console.c index d6140828480..5a14623d1c3 100644 --- a/sys/dev/xen/console/console.c +++ b/sys/dev/xen/console/console.c @@ -70,6 +70,10 @@ static int rc, rp; static unsigned int cnsl_evt_reg; static unsigned int wc, wp; /* write_cons, write_prod */ +#ifdef KDB +static int xc_altbrk; +#endif + #define CDEV_MAJOR 12 #define XCUNIT(x) (dev2unit(x)) #define ISTTYOPEN(tp) ((tp) && ((tp)->t_state & TS_ISOPEN)) @@ -268,8 +272,12 @@ xencons_rx(char *buf, unsigned len) #endif ) { tty_lock(tp); - for (i = 0; i < len; i++) + for (i = 0; i < len; i++) { +#ifdef KDB + kdb_alt_break(buf[i], &xc_altbrk); +#endif ttydisc_rint(tp, buf[i], 0); + } ttydisc_rint_done(tp); tty_unlock(tp); } else { From 9b6dd12e5da17c85b9e93f1ed31ec8719e6f40db Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Fri, 2 Sep 2011 17:40:39 +0000 Subject: [PATCH 368/452] Correct several issues in the integration of POSIX shared memory objects and the new setmode and setowner fileops in FreeBSD 9.0: - Add new MAC Framework entry point mac_posixshm_check_create() to allow MAC policies to authorise shared memory use. Provide a stub policy and test policy templates. - Add missing Biba and MLS implementations of mac_posixshm_check_setmode() and mac_posixshm_check_setowner(). - Add 'accmode' argument to mac_posixshm_check_open() -- unlike the mac_posixsem_check_open() entry point it was modeled on, the access mode is required as shared memory access can be read-only as well as writable; this isn't true of POSIX semaphores. - Implement full range of POSIX shared memory entry points for Biba and MLS. Sponsored by: Google Inc. Obtained from: TrustedBSD Project Approved by: re (kib) --- sys/kern/uipc_shm.c | 28 +++-- sys/security/mac/mac_framework.h | 6 +- sys/security/mac/mac_policy.h | 8 +- sys/security/mac/mac_posix_shm.c | 27 +++- sys/security/mac_biba/mac_biba.c | 204 +++++++++++++++++++++++++++++- sys/security/mac_mls/mac_mls.c | 207 ++++++++++++++++++++++++++++++- sys/security/mac_stub/mac_stub.c | 12 +- sys/security/mac_test/mac_test.c | 14 ++- 8 files changed, 478 insertions(+), 28 deletions(-) diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c index 57fd5eb413e..f9fc3ca8bf3 100644 --- a/sys/kern/uipc_shm.c +++ b/sys/kern/uipc_shm.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2006 Robert N. M. Watson + * Copyright (c) 2006, 2011 Robert N. M. Watson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,25 +31,21 @@ * * TODO: * - * (2) Need to export data to a userland tool via a sysctl. Should ipcs(1) + * (1) Need to export data to a userland tool via a sysctl. Should ipcs(1) * and ipcrm(1) be expanded or should new tools to manage both POSIX * kernel semaphores and POSIX shared memory be written? * - * (3) Add support for this file type to fstat(1). + * (2) Add support for this file type to fstat(1). * - * (4) Resource limits? Does this need its own resource limits or are the + * (3) Resource limits? Does this need its own resource limits or are the * existing limits in mmap(2) sufficient? * - * (5) Partial page truncation. vnode_pager_setsize() will zero any parts + * (4) Partial page truncation. vnode_pager_setsize() will zero any parts * of a partially mapped page as a result of ftruncate(2)/truncate(2). * We can do the same (with the same pmap evil), but do we need to * worry about the bits on disk if the page is swapped out or will the * swapper zero the parts of a page that are invalid if the page is * swapped back in for us? - * - * (6) Add MAC support in mac_biba(4) and mac_mls(4). - * - * (7) Add a MAC check_create() hook for creating new named objects. */ #include @@ -551,8 +547,16 @@ shm_open(struct thread *td, struct shm_open_args *uap) if (shmfd == NULL) { /* Object does not yet exist, create it if requested. */ if (uap->flags & O_CREAT) { - shmfd = shm_alloc(td->td_ucred, cmode); - shm_insert(path, fnv, shmfd); +#ifdef MAC + error = mac_posixshm_check_create(td->td_ucred, + path); + if (error == 0) { +#endif + shmfd = shm_alloc(td->td_ucred, cmode); + shm_insert(path, fnv, shmfd); +#ifdef MAC + } +#endif } else { free(path, M_SHMFD); error = ENOENT; @@ -569,7 +573,7 @@ shm_open(struct thread *td, struct shm_open_args *uap) else { #ifdef MAC error = mac_posixshm_check_open(td->td_ucred, - shmfd); + shmfd, FFLAGS(uap->flags & O_ACCMODE)); if (error == 0) #endif error = shm_access(shmfd, td->td_ucred, diff --git a/sys/security/mac/mac_framework.h b/sys/security/mac/mac_framework.h index 011cb864f97..92aedea4ef7 100644 --- a/sys/security/mac/mac_framework.h +++ b/sys/security/mac/mac_framework.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1999-2002, 2007-2009 Robert N. M. Watson + * Copyright (c) 1999-2002, 2007-2011 Robert N. M. Watson * Copyright (c) 2001-2005 Networks Associates Technology, Inc. * Copyright (c) 2005-2006 SPARTA, Inc. * All rights reserved. @@ -238,9 +238,11 @@ void mac_posixsem_create(struct ucred *cred, struct ksem *ks); void mac_posixsem_destroy(struct ksem *); void mac_posixsem_init(struct ksem *); +int mac_posixshm_check_create(struct ucred *cred, const char *path); int mac_posixshm_check_mmap(struct ucred *cred, struct shmfd *shmfd, int prot, int flags); -int mac_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd); +int mac_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd, + accmode_t accmode); int mac_posixshm_check_setmode(struct ucred *cred, struct shmfd *shmfd, mode_t mode); int mac_posixshm_check_setowner(struct ucred *cred, struct shmfd *shmfd, diff --git a/sys/security/mac/mac_policy.h b/sys/security/mac/mac_policy.h index b7ef07b8e0f..090dc405810 100644 --- a/sys/security/mac/mac_policy.h +++ b/sys/security/mac/mac_policy.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1999-2002, 2007-2009 Robert N. M. Watson + * Copyright (c) 1999-2002, 2007-2011 Robert N. M. Watson * Copyright (c) 2001-2005 Networks Associates Technology, Inc. * Copyright (c) 2005-2006 SPARTA, Inc. * Copyright (c) 2008 Apple Inc. @@ -355,11 +355,14 @@ typedef void (*mpo_posixsem_create_t)(struct ucred *cred, typedef void (*mpo_posixsem_destroy_label_t)(struct label *label); typedef void (*mpo_posixsem_init_label_t)(struct label *label); +typedef int (*mpo_posixshm_check_create_t)(struct ucred *cred, + const char *path); typedef int (*mpo_posixshm_check_mmap_t)(struct ucred *cred, struct shmfd *shmfd, struct label *shmlabel, int prot, int flags); typedef int (*mpo_posixshm_check_open_t)(struct ucred *cred, - struct shmfd *shmfd, struct label *shmlabel); + struct shmfd *shmfd, struct label *shmlabel, + accmode_t accmode); typedef int (*mpo_posixshm_check_setmode_t)(struct ucred *cred, struct shmfd *shmfd, struct label *shmlabel, mode_t mode); @@ -812,6 +815,7 @@ struct mac_policy_ops { mpo_posixsem_destroy_label_t mpo_posixsem_destroy_label; mpo_posixsem_init_label_t mpo_posixsem_init_label; + mpo_posixshm_check_create_t mpo_posixshm_check_create; mpo_posixshm_check_mmap_t mpo_posixshm_check_mmap; mpo_posixshm_check_open_t mpo_posixshm_check_open; mpo_posixshm_check_setmode_t mpo_posixshm_check_setmode; diff --git a/sys/security/mac/mac_posix_shm.c b/sys/security/mac/mac_posix_shm.c index 7e1c3f76465..d5d15fc4248 100644 --- a/sys/security/mac/mac_posix_shm.c +++ b/sys/security/mac/mac_posix_shm.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2003-2006 SPARTA, Inc. - * Copyright (c) 2009 Robert N. M. Watson + * Copyright (c) 2009-2011 Robert N. M. Watson * All rights reserved. * * This software was developed for the FreeBSD Project in part by Network @@ -101,6 +101,20 @@ mac_posixshm_create(struct ucred *cred, struct shmfd *shmfd) shmfd->shm_label); } +MAC_CHECK_PROBE_DEFINE2(posixshm_check_create, "struct ucred *", + "const char *"); + +int +mac_posixshm_check_create(struct ucred *cred, const char *path) +{ + int error; + + MAC_POLICY_CHECK_NOSLEEP(posixshm_check_create, cred, path); + MAC_CHECK_PROBE2(posixshm_check_create, error, cred, path); + + return (error); +} + MAC_CHECK_PROBE_DEFINE4(posixshm_check_mmap, "struct ucred *", "struct shmfd *", "int", "int"); @@ -118,17 +132,18 @@ mac_posixshm_check_mmap(struct ucred *cred, struct shmfd *shmfd, int prot, return (error); } -MAC_CHECK_PROBE_DEFINE2(posixshm_check_open, "struct ucred *", - "struct shmfd *"); +MAC_CHECK_PROBE_DEFINE3(posixshm_check_open, "struct ucred *", + "struct shmfd *", "accmode_t accmode"); int -mac_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd) +mac_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd, + accmode_t accmode) { int error; MAC_POLICY_CHECK_NOSLEEP(posixshm_check_open, cred, shmfd, - shmfd->shm_label); - MAC_CHECK_PROBE2(posixshm_check_open, error, cred, shmfd); + shmfd->shm_label, accmode); + MAC_CHECK_PROBE3(posixshm_check_open, error, cred, shmfd, accmode); return (error); } diff --git a/sys/security/mac_biba/mac_biba.c b/sys/security/mac_biba/mac_biba.c index fcede07142f..b7ca4e03044 100644 --- a/sys/security/mac_biba/mac_biba.c +++ b/sys/security/mac_biba/mac_biba.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1999-2002, 2007-2009 Robert N. M. Watson + * Copyright (c) 1999-2002, 2007-2011 Robert N. M. Watson * Copyright (c) 2001-2005 McAfee, Inc. * Copyright (c) 2006 SPARTA, Inc. * All rights reserved. @@ -14,6 +14,9 @@ * This software was enhanced by SPARTA ISSO under SPAWAR contract * N66001-04-C-6019 ("SEFOS"). * + * This software was developed at the University of Cambridge Computer + * Laboratory with support from a grant from Google, Inc. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -1621,6 +1624,42 @@ biba_posixsem_check_openunlink(struct ucred *cred, struct ksem *ks, return (0); } +static int +biba_posixsem_check_setmode(struct ucred *cred, struct ksem *ks, + struct label *kslabel, mode_t mode) +{ + struct mac_biba *subj, *obj; + + if (!biba_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(kslabel); + + if (!biba_dominate_effective(subj, obj)) + return (EACCES); + + return (0); +} + +static int +biba_posixsem_check_setowner(struct ucred *cred, struct ksem *ks, + struct label *kslabel, uid_t uid, gid_t gid) +{ + struct mac_biba *subj, *obj; + + if (!biba_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(kslabel); + + if (!biba_dominate_effective(subj, obj)) + return (EACCES); + + return (0); +} + static int biba_posixsem_check_write(struct ucred *active_cred, struct ucred *file_cred, struct ksem *ks, struct label *kslabel) @@ -1669,6 +1708,156 @@ biba_posixsem_create(struct ucred *cred, struct ksem *ks, biba_copy_effective(source, dest); } +static int +biba_posixshm_check_mmap(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel, int prot, int flags) +{ + struct mac_biba *subj, *obj; + + if (!biba_enabled || !revocation_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) { + if (!biba_dominate_effective(obj, subj)) + return (EACCES); + } + if (((prot & VM_PROT_WRITE) != 0) && ((flags & MAP_SHARED) != 0)) { + if (!biba_dominate_effective(subj, obj)) + return (EACCES); + } + + return (0); +} + +static int +biba_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel, accmode_t accmode) +{ + struct mac_biba *subj, *obj; + + if (!biba_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (accmode & (VREAD | VEXEC | VSTAT_PERMS)) { + if (!biba_dominate_effective(obj, subj)) + return (EACCES); + } + if (accmode & VMODIFY_PERMS) { + if (!biba_dominate_effective(subj, obj)) + return (EACCES); + } + + return (0); +} + +static int +biba_posixshm_check_setmode(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel, mode_t mode) +{ + struct mac_biba *subj, *obj; + + if (!biba_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (!biba_dominate_effective(subj, obj)) + return (EACCES); + + return (0); +} + +static int +biba_posixshm_check_setowner(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel, uid_t uid, gid_t gid) +{ + struct mac_biba *subj, *obj; + + if (!biba_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (!biba_dominate_effective(subj, obj)) + return (EACCES); + + return (0); +} + +static int +biba_posixshm_check_stat(struct ucred *active_cred, struct ucred *file_cred, + struct shmfd *shmfd, struct label *shmlabel) +{ + struct mac_biba *subj, *obj; + + if (!biba_enabled) + return (0); + + subj = SLOT(active_cred->cr_label); + obj = SLOT(shmlabel); + + if (!biba_dominate_effective(obj, subj)) + return (EACCES); + + return (0); +} + +static int +biba_posixshm_check_truncate(struct ucred *active_cred, + struct ucred *file_cred, struct shmfd *shmfd, struct label *shmlabel) +{ + struct mac_biba *subj, *obj; + + if (!biba_enabled) + return (0); + + subj = SLOT(active_cred->cr_label); + obj = SLOT(shmlabel); + + if (!biba_dominate_effective(subj, obj)) + return (EACCES); + + return (0); +} + +static int +biba_posixshm_check_unlink(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel) +{ + struct mac_biba *subj, *obj; + + if (!biba_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (!biba_dominate_effective(subj, obj)) + return (EACCES); + + return (0); +} + +static void +biba_posixshm_create(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel) +{ + struct mac_biba *source, *dest; + + source = SLOT(cred->cr_label); + dest = SLOT(shmlabel); + + biba_copy_effective(source, dest); +} + /* * Some system privileges are allowed regardless of integrity grade; others * are allowed only when running with privilege with respect to the Biba @@ -3455,6 +3644,8 @@ static struct mac_policy_ops mac_biba_ops = .mpo_posixsem_check_getvalue = biba_posixsem_check_rdonly, .mpo_posixsem_check_open = biba_posixsem_check_openunlink, .mpo_posixsem_check_post = biba_posixsem_check_write, + .mpo_posixsem_check_setmode = biba_posixsem_check_setmode, + .mpo_posixsem_check_setowner = biba_posixsem_check_setowner, .mpo_posixsem_check_stat = biba_posixsem_check_rdonly, .mpo_posixsem_check_unlink = biba_posixsem_check_openunlink, .mpo_posixsem_check_wait = biba_posixsem_check_write, @@ -3462,6 +3653,17 @@ static struct mac_policy_ops mac_biba_ops = .mpo_posixsem_destroy_label = biba_destroy_label, .mpo_posixsem_init_label = biba_init_label, + .mpo_posixshm_check_mmap = biba_posixshm_check_mmap, + .mpo_posixshm_check_open = biba_posixshm_check_open, + .mpo_posixshm_check_setmode = biba_posixshm_check_setmode, + .mpo_posixshm_check_setowner = biba_posixshm_check_setowner, + .mpo_posixshm_check_stat = biba_posixshm_check_stat, + .mpo_posixshm_check_truncate = biba_posixshm_check_truncate, + .mpo_posixshm_check_unlink = biba_posixshm_check_unlink, + .mpo_posixshm_create = biba_posixshm_create, + .mpo_posixshm_destroy_label = biba_destroy_label, + .mpo_posixshm_init_label = biba_init_label, + .mpo_priv_check = biba_priv_check, .mpo_proc_check_debug = biba_proc_check_debug, diff --git a/sys/security/mac_mls/mac_mls.c b/sys/security/mac_mls/mac_mls.c index d41799d5a23..b68790d0259 100644 --- a/sys/security/mac_mls/mac_mls.c +++ b/sys/security/mac_mls/mac_mls.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1999-2002, 2007-2009 Robert N. M. Watson + * Copyright (c) 1999-2002, 2007-2011 Robert N. M. Watson * Copyright (c) 2001-2005 McAfee, Inc. * Copyright (c) 2006 SPARTA, Inc. * All rights reserved. @@ -14,6 +14,9 @@ * This software was enhanced by SPARTA ISSO under SPAWAR contract * N66001-04-C-6019 ("SEFOS"). * + * This software was developed at the University of Cambridge Computer + * Laboratory with support from a grant from Google, Inc. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -1531,6 +1534,42 @@ mls_posixsem_check_rdonly(struct ucred *active_cred, struct ucred *file_cred, return (0); } +static int +mls_posixsem_check_setmode(struct ucred *cred, struct ksem *ks, + struct label *shmlabel, mode_t mode) +{ + struct mac_mls *subj, *obj; + + if (!mls_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (!mls_dominate_effective(obj, subj)) + return (EACCES); + + return (0); +} + +static int +mls_posixsem_check_setowner(struct ucred *cred, struct ksem *ks, + struct label *shmlabel, uid_t uid, gid_t gid) +{ + struct mac_mls *subj, *obj; + + if (!mls_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (!mls_dominate_effective(obj, subj)) + return (EACCES); + + return (0); +} + static int mls_posixsem_check_write(struct ucred *active_cred, struct ucred *file_cred, struct ksem *ks, struct label *kslabel) @@ -1561,6 +1600,159 @@ mls_posixsem_create(struct ucred *cred, struct ksem *ks, mls_copy_effective(source, dest); } +static int +mls_posixshm_check_mmap(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel, int prot, int flags) +{ + struct mac_mls *subj, *obj; + + if (!mls_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) { + if (!mls_dominate_effective(subj, obj)) + return (EACCES); + } + if (((prot & VM_PROT_WRITE) != 0) && ((flags & MAP_SHARED) != 0)) { + if (!mls_dominate_effective(obj, subj)) + return (EACCES); + } + + return (0); +} + +static int +mls_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel, accmode_t accmode) +{ + struct mac_mls *subj, *obj; + + if (!mls_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (accmode & (VREAD | VEXEC | VSTAT_PERMS)) { + if (!mls_dominate_effective(subj, obj)) + return (EACCES); + } + if (accmode & VMODIFY_PERMS) { + if (!mls_dominate_effective(obj, subj)) + return (EACCES); + } + + return (0); +} + +static int +mls_posixshm_check_setmode(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel, mode_t mode) +{ + struct mac_mls *subj, *obj; + + if (!mls_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (!mls_dominate_effective(obj, subj)) + return (EACCES); + + return (0); +} + +static int +mls_posixshm_check_setowner(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel, uid_t uid, gid_t gid) +{ + struct mac_mls *subj, *obj; + + if (!mls_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (!mls_dominate_effective(obj, subj)) + return (EACCES); + + return (0); +} + +static int +mls_posixshm_check_stat(struct ucred *active_cred, struct ucred *file_cred, + struct shmfd *shmfd, struct label *shmlabel) +{ + struct mac_mls *subj, *obj; + + if (!mls_enabled) + return (0); + + subj = SLOT(active_cred->cr_label); + obj = SLOT(shmlabel); + + if (!mls_dominate_effective(subj, obj)) + return (EACCES); + + return (0); +} + +static int +mls_posixshm_check_truncate(struct ucred *active_cred, + struct ucred *file_cred, struct shmfd *shmfd, struct label *shmlabel) +{ + struct mac_mls *subj, *obj; + + if (!mls_enabled) + return (0); + + subj = SLOT(active_cred->cr_label); + obj = SLOT(shmlabel); + + if (!mls_dominate_effective(obj, subj)) + return (EACCES); + + return (0); +} + +static int +mls_posixshm_check_unlink(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel) +{ + struct mac_mls *subj, *obj; + + if (!mls_enabled) + return (0); + + subj = SLOT(cred->cr_label); + obj = SLOT(shmlabel); + + if (!mls_dominate_effective(obj, subj)) + return (EACCES); + + return (0); +} + +static void +mls_posixshm_create(struct ucred *cred, struct shmfd *shmfd, + struct label *shmlabel) +{ + struct mac_mls *source, *dest; + + source = SLOT(cred->cr_label); + dest = SLOT(shmlabel); + + mls_copy_effective(source, dest); +} + static int mls_proc_check_debug(struct ucred *cred, struct proc *p) { @@ -3075,6 +3267,8 @@ static struct mac_policy_ops mls_ops = .mpo_posixsem_check_getvalue = mls_posixsem_check_rdonly, .mpo_posixsem_check_open = mls_posixsem_check_openunlink, .mpo_posixsem_check_post = mls_posixsem_check_write, + .mpo_posixsem_check_setmode = mls_posixsem_check_setmode, + .mpo_posixsem_check_setowner = mls_posixsem_check_setowner, .mpo_posixsem_check_stat = mls_posixsem_check_rdonly, .mpo_posixsem_check_unlink = mls_posixsem_check_openunlink, .mpo_posixsem_check_wait = mls_posixsem_check_write, @@ -3082,6 +3276,17 @@ static struct mac_policy_ops mls_ops = .mpo_posixsem_destroy_label = mls_destroy_label, .mpo_posixsem_init_label = mls_init_label, + .mpo_posixshm_check_mmap = mls_posixshm_check_mmap, + .mpo_posixshm_check_open = mls_posixshm_check_open, + .mpo_posixshm_check_setmode = mls_posixshm_check_setmode, + .mpo_posixshm_check_setowner = mls_posixshm_check_setowner, + .mpo_posixshm_check_stat = mls_posixshm_check_stat, + .mpo_posixshm_check_truncate = mls_posixshm_check_truncate, + .mpo_posixshm_check_unlink = mls_posixshm_check_unlink, + .mpo_posixshm_create = mls_posixshm_create, + .mpo_posixshm_destroy_label = mls_destroy_label, + .mpo_posixshm_init_label = mls_init_label, + .mpo_proc_check_debug = mls_proc_check_debug, .mpo_proc_check_sched = mls_proc_check_sched, .mpo_proc_check_signal = mls_proc_check_signal, diff --git a/sys/security/mac_stub/mac_stub.c b/sys/security/mac_stub/mac_stub.c index 361bb1565ba..f1d3e10c4dd 100644 --- a/sys/security/mac_stub/mac_stub.c +++ b/sys/security/mac_stub/mac_stub.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1999-2002, 2007-2009 Robert N. M. Watson + * Copyright (c) 1999-2002, 2007-2011 Robert N. M. Watson * Copyright (c) 2001-2005 McAfee, Inc. * Copyright (c) 2005-2006 SPARTA, Inc. * Copyright (c) 2008 Apple Inc. @@ -733,6 +733,13 @@ stub_posixsem_create(struct ucred *cred, struct ksem *ks, } +static int +stub_posixshm_check_create(struct ucred *cred, const char *path) +{ + + return (0); +} + static int stub_posixshm_check_mmap(struct ucred *cred, struct shmfd *shmfd, struct label *shmlabel, int prot, int flags) @@ -743,7 +750,7 @@ stub_posixshm_check_mmap(struct ucred *cred, struct shmfd *shmfd, static int stub_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd, - struct label *shmlabel) + struct label *shmlabel, accmode_t accmode) { return (0); @@ -1772,6 +1779,7 @@ static struct mac_policy_ops stub_ops = .mpo_posixsem_destroy_label = stub_destroy_label, .mpo_posixsem_init_label = stub_init_label, + .mpo_posixshm_check_create = stub_posixshm_check_create, .mpo_posixshm_check_mmap = stub_posixshm_check_mmap, .mpo_posixshm_check_open = stub_posixshm_check_open, .mpo_posixshm_check_setmode = stub_posixshm_check_setmode, diff --git a/sys/security/mac_test/mac_test.c b/sys/security/mac_test/mac_test.c index 2aa2e38a157..c92c418cd1c 100644 --- a/sys/security/mac_test/mac_test.c +++ b/sys/security/mac_test/mac_test.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1999-2002, 2007-2009 Robert N. M. Watson + * Copyright (c) 1999-2002, 2007-2011 Robert N. M. Watson * Copyright (c) 2001-2005 McAfee, Inc. * Copyright (c) 2006 SPARTA, Inc. * Copyright (c) 2008 Apple Inc. @@ -1390,6 +1390,15 @@ test_posixsem_init_label(struct label *label) COUNTER_INC(posixsem_init_label); } +COUNTER_DECL(posixshm_check_create); +static int +test_posixshm_check_create(struct ucred *cred, const char *path) +{ + + COUNTER_INC(posixshm_check_create); + return (0); +} + COUNTER_DECL(posixshm_check_mmap); static int test_posixshm_check_mmap(struct ucred *cred, struct shmfd *shmfd, @@ -1405,7 +1414,7 @@ test_posixshm_check_mmap(struct ucred *cred, struct shmfd *shmfd, COUNTER_DECL(posixshm_check_open); static int test_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd, - struct label *shmfdlabel) + struct label *shmfdlabel, accmode_t accmode) { LABEL_CHECK(cred->cr_label, MAGIC_CRED); @@ -3102,6 +3111,7 @@ static struct mac_policy_ops test_ops = .mpo_posixsem_destroy_label = test_posixsem_destroy_label, .mpo_posixsem_init_label = test_posixsem_init_label, + .mpo_posixshm_check_create = test_posixshm_check_create, .mpo_posixshm_check_mmap = test_posixshm_check_mmap, .mpo_posixshm_check_open = test_posixshm_check_open, .mpo_posixshm_check_setmode = test_posixshm_check_setmode, From f92578026dc348e822e1ba060b953da0732cf16e Mon Sep 17 00:00:00 2001 From: "Ralf S. Engelschall" Date: Fri, 2 Sep 2011 18:13:46 +0000 Subject: [PATCH 369/452] Fix a little typo and get rid of a cryptic description by aligning the text to the remaining description. Approved by: re --- share/man/man3/queue.3 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/share/man/man3/queue.3 b/share/man/man3/queue.3 index 007ca5c629b..76f9464d99c 100644 --- a/share/man/man3/queue.3 +++ b/share/man/man3/queue.3 @@ -193,7 +193,7 @@ O(1) removal of an entry from the head of the list. .It Forward traversal through the list. .It -Swawpping the contents of two lists. +Swapping the contents of two lists. .El .Pp Singly-linked lists are the simplest of the four data structures @@ -227,7 +227,7 @@ Code size is about 15% greater and operations run about 20% slower than singly-linked lists. .El .Pp -Singly-linked tailqs are ideal for applications with large datasets and +Singly-linked tail queues are ideal for applications with large datasets and few or no removals, or for implementing a FIFO queue. .Pp From ea96972a8b741ad1a0eac93131182fe48f599550 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Fri, 2 Sep 2011 18:37:48 +0000 Subject: [PATCH 370/452] Remove an incorrect apostrophe. PR: 160267 Submitted by: Warren Block Approved by: re (kib) MFC after: 1 week --- share/man/man4/wlan.4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/man/man4/wlan.4 b/share/man/man4/wlan.4 index b685f34d572..4a2d1e78e81 100644 --- a/share/man/man4/wlan.4 +++ b/share/man/man4/wlan.4 @@ -121,7 +121,7 @@ Note that an interface's type cannot be changed once it is created. .Pp .Nm defines several mechanisms by which plugin modules may -be used to extend its' functionality. +be used to extend its functionality. Cryptographic support such as WEP, TKIP, and AES-CCMP are implemented as standalone modules (if not statically configured into a system) that register with From d46dc4ad74dc2e7b94f0b852b40c8a511549381c Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Fri, 2 Sep 2011 18:50:44 +0000 Subject: [PATCH 371/452] This patch adds automatic detection of USB mass storage devices which does not support the no synchronize cache SCSI command. The __FreeBSD_version version macro has been bumped and external kernel modules needs to be recompiled after this patch. Approved by: re (kib) MFC after: 1 week PR: usb/160299 --- sys/dev/usb/quirk/usb_quirk.c | 25 ++-------- sys/dev/usb/storage/umass.c | 6 --- sys/dev/usb/usb_device.c | 34 ++++++++++++- sys/dev/usb/usb_device.h | 1 + sys/dev/usb/usb_dynamic.c | 14 +++++- sys/dev/usb/usb_dynamic.h | 1 + sys/dev/usb/usb_freebsd.h | 2 + sys/dev/usb/usb_msctest.c | 93 +++++++++++++++++++++++++++++++++-- sys/dev/usb/usb_msctest.h | 2 + sys/dev/usb/usbdi.h | 3 ++ sys/sys/param.h | 2 +- 11 files changed, 149 insertions(+), 34 deletions(-) diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c index e54b9084c2e..d1bd0ee1270 100644 --- a/sys/dev/usb/quirk/usb_quirk.c +++ b/sys/dev/usb/quirk/usb_quirk.c @@ -148,12 +148,10 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { UQ_MSC_FORCE_PROTO_SCSI), USB_QUIRK(AIPTEK, POCKETCAM3M, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI), - USB_QUIRK(AIPTEK2, SUNPLUS_TECH, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(ALCOR, SDCR_6335, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(ALCOR, SDCR_6362, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_SYNC_CACHE), - USB_QUIRK(ALCOR, AU6390, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(ALCOR, UMCR_9361, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN), USB_QUIRK(ALCOR, TRANSCEND, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN, @@ -173,14 +171,12 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { USB_QUIRK(CENTURY, EX35QUAT, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE), - USB_QUIRK(CENTURY, EX35SW4_SB4, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(CYPRESS, XX6830XX, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(DESKNOTE, UCR_61S2B, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI), USB_QUIRK(DMI, CFSM_RW, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN), - USB_QUIRK(DMI, DISK, 0x000, 0xffff, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(EPSON, STYLUS_875DC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), USB_QUIRK(EPSON, STYLUS_895, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, @@ -188,7 +184,6 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { USB_QUIRK(FEIYA, 5IN1, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI), USB_QUIRK(FREECOM, DVD, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), - USB_QUIRK(FREECOM, HDD, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(FUJIPHOTO, MASS0100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I, UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(GENESYS, GL641USB2IDE, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, @@ -232,7 +227,6 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { USB_QUIRK(IOMEGA, ZIP100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_TEST_UNIT_READY), /* XXX ZIP drives can also use ATAPI */ - USB_QUIRK(JMICRON, JM20336, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(JMICRON, JM20337, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_SYNC_CACHE), @@ -279,8 +273,6 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { UQ_MSC_FORCE_PROTO_ATAPI), USB_QUIRK(MYSON, HEDEN, 0x0000, 0xffff, UQ_MSC_IGNORE_RESIDUE, UQ_MSC_NO_SYNC_CACHE), - USB_QUIRK(MYSON, HEDEN_8813, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), - USB_QUIRK(MYSON, STARREADER, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(NEODIO, ND3260, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ), USB_QUIRK(NETAC, CF_CARD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, @@ -317,7 +309,6 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { USB_QUIRK(PANASONIC, KXLCB35AN, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI), USB_QUIRK(PANASONIC, LS120CAM, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_UFI), - USB_QUIRK(PHILIPS, SPE3030CC, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(PLEXTOR, 40_12_40U, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_TEST_UNIT_READY), USB_QUIRK(PNY, ATTACHE2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, @@ -328,7 +319,6 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { USB_QUIRK_VP(USB_VENDOR_SAMSUNG_TECHWIN, USB_PRODUCT_SAMSUNG_TECHWIN_DIGIMAX_410, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), - USB_QUIRK(SAMSUNG, YP_U4, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), USB_QUIRK(SANDISK, SDDR05A, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_READ_CAP_OFFBY1, UQ_MSC_NO_GETMAXLUN), @@ -448,12 +438,6 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { UQ_MSC_FORCE_PROTO_ATAPI), USB_QUIRK(MEIZU, M6_SL, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY, UQ_MSC_NO_SYNC_CACHE), - USB_QUIRK(ACTIONS, MP4, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, - UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_SYNC_CACHE), - USB_QUIRK(ASUS, GMSC, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), - USB_QUIRK(CHIPSBANK, USBMEMSTICK, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), - USB_QUIRK(CHIPSBANK, USBMEMSTICK1, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), - USB_QUIRK(NEWLINK, USB2IDEBRIDGE, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), /* Non-standard USB MIDI devices */ USB_QUIRK(ROLAND, UM1, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS), @@ -567,9 +551,9 @@ usb_test_quirk_by_info(const struct usbd_lookup_info *info, uint16_t quirk) uint16_t x; uint16_t y; - if (quirk == UQ_NONE) { - return (0); - } + if (quirk == UQ_NONE) + goto done; + mtx_lock(&usb_quirk_mtx); for (x = 0; x != USB_DEV_QUIRKS_MAX; x++) { @@ -603,7 +587,8 @@ usb_test_quirk_by_info(const struct usbd_lookup_info *info, uint16_t quirk) break; } mtx_unlock(&usb_quirk_mtx); - return (0); +done: + return (usb_test_quirk_w(info, quirk)); } static struct usb_quirk_entry * diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c index 9292c842bcb..41e98d50c85 100644 --- a/sys/dev/usb/storage/umass.c +++ b/sys/dev/usb/storage/umass.c @@ -1025,12 +1025,6 @@ umass_attach(device_t dev) sc->cam_scsi_sense.opcode = REQUEST_SENSE; sc->cam_scsi_test_unit_ready.opcode = TEST_UNIT_READY; - /* - * some devices need a delay after that the configuration value is - * set to function properly: - */ - usb_pause_mtx(NULL, hz); - /* register the SIM */ err = umass_cam_attach_sim(sc); if (err) { diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c index 34f62656a04..3be9ba967d0 100644 --- a/sys/dev/usb/usb_device.c +++ b/sys/dev/usb/usb_device.c @@ -1239,7 +1239,9 @@ static void usb_init_attach_arg(struct usb_device *udev, struct usb_attach_arg *uaa) { - bzero(uaa, sizeof(*uaa)); + uint8_t x; + + memset(uaa, 0, sizeof(*uaa)); uaa->device = udev; uaa->usb_mode = udev->flags.usb_mode; @@ -1254,6 +1256,9 @@ usb_init_attach_arg(struct usb_device *udev, uaa->info.bDeviceProtocol = udev->ddesc.bDeviceProtocol; uaa->info.bConfigIndex = udev->curr_config_index; uaa->info.bConfigNum = udev->curr_config_no; + + for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) + uaa->info.autoQuirk[x] = udev->autoQuirk[x]; } /*------------------------------------------------------------------------* @@ -1850,6 +1855,20 @@ repeat_set_config: } } } + if (set_config_failed == 0 && config_index == 0 && + usb_test_quirk(&uaa, UQ_MSC_NO_SYNC_CACHE) == 0) { + + /* + * Try to figure out if there are any MSC quirks we + * should apply automatically: + */ + err = usb_msc_auto_quirk(udev, 0); + + if (err != 0) { + set_config_failed = 1; + goto repeat_set_config; + } + } config_done: DPRINTF("new dev (addr %d), udev=%p, parent_hub=%p\n", @@ -2698,3 +2717,16 @@ usbd_set_pnpinfo(struct usb_device *udev, uint8_t iface_index, const char *pnpin return (0); /* success */ } +usb_error_t +usbd_add_dynamic_quirk(struct usb_device *udev, uint16_t quirk) +{ + uint8_t x; + + for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) { + if (udev->autoQuirk[x] == 0) { + udev->autoQuirk[x] = quirk; + return (0); /* success */ + } + } + return (USB_ERR_NOMEM); +} diff --git a/sys/dev/usb/usb_device.h b/sys/dev/usb/usb_device.h index fe8bf8b8342..bde20b0790e 100644 --- a/sys/dev/usb/usb_device.h +++ b/sys/dev/usb/usb_device.h @@ -149,6 +149,7 @@ struct usb_device { uint16_t power; /* mA the device uses */ uint16_t langid; /* language for strings */ + uint16_t autoQuirk[USB_MAX_AUTO_QUIRK]; /* dynamic quirks */ uint8_t address; /* device addess */ uint8_t device_index; /* device index in "bus->devices" */ diff --git a/sys/dev/usb/usb_dynamic.c b/sys/dev/usb/usb_dynamic.c index 1358b30cd0e..765ee4fadb2 100644 --- a/sys/dev/usb/usb_dynamic.c +++ b/sys/dev/usb/usb_dynamic.c @@ -50,12 +50,12 @@ #include #include #include +#include /* function prototypes */ static usb_handle_req_t usb_temp_get_desc_w; static usb_temp_setup_by_index_t usb_temp_setup_by_index_w; static usb_temp_unsetup_t usb_temp_unsetup_w; -static usb_test_quirk_t usb_test_quirk_w; static usb_quirk_ioctl_t usb_quirk_ioctl_w; /* global variables */ @@ -72,9 +72,19 @@ usb_temp_setup_by_index_w(struct usb_device *udev, uint16_t index) return (USB_ERR_INVAL); } -static uint8_t +uint8_t usb_test_quirk_w(const struct usbd_lookup_info *info, uint16_t quirk) { + uint8_t x; + + if (quirk == UQ_NONE) + return (0); /* no match */ + + for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) { + if (info->autoQuirk[x] == quirk) + return (1); /* match */ + } + return (0); /* no match */ } diff --git a/sys/dev/usb/usb_dynamic.h b/sys/dev/usb/usb_dynamic.h index 568494204c1..f1b2149e309 100644 --- a/sys/dev/usb/usb_dynamic.h +++ b/sys/dev/usb/usb_dynamic.h @@ -57,5 +57,6 @@ extern devclass_t usb_devclass_ptr; void usb_temp_unload(void *); void usb_quirk_unload(void *); void usb_bus_unload(void *); +usb_test_quirk_t usb_test_quirk_w; #endif /* _USB_DYNAMIC_H_ */ diff --git a/sys/dev/usb/usb_freebsd.h b/sys/dev/usb/usb_freebsd.h index ae69cdb8926..349e13e8477 100644 --- a/sys/dev/usb/usb_freebsd.h +++ b/sys/dev/usb/usb_freebsd.h @@ -68,6 +68,8 @@ #define USB_EP0_BUFSIZE 1024 /* bytes */ #define USB_CS_RESET_LIMIT 20 /* failures = 20 * 50 ms = 1sec */ +#define USB_MAX_AUTO_QUIRK 4 /* maximum number of dynamic quirks */ + typedef uint32_t usb_timeout_t; /* milliseconds */ typedef uint32_t usb_frlength_t; /* bytes */ typedef uint32_t usb_frcount_t; /* units */ diff --git a/sys/dev/usb/usb_msctest.c b/sys/dev/usb/usb_msctest.c index 0b6024b3d76..061c3d33e96 100644 --- a/sys/dev/usb/usb_msctest.c +++ b/sys/dev/usb/usb_msctest.c @@ -96,6 +96,8 @@ static uint8_t scsi_huawei_eject[] = { 0x11, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static uint8_t scsi_tct_eject[] = { 0x06, 0xf5, 0x04, 0x02, 0x52, 0x70 }; +static uint8_t scsi_sync_cache[] = { 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }; #define BULK_SIZE 64 /* dummy */ #define ERR_CSW_FAILED -1 @@ -163,7 +165,7 @@ static void bbb_done(struct bbb_transfer *, int); static void bbb_transfer_start(struct bbb_transfer *, uint8_t); static void bbb_data_clear_stall_callback(struct usb_xfer *, uint8_t, uint8_t); -static uint8_t bbb_command_start(struct bbb_transfer *, uint8_t, uint8_t, +static int bbb_command_start(struct bbb_transfer *, uint8_t, uint8_t, void *, size_t, void *, size_t, usb_timeout_t); static struct bbb_transfer *bbb_attach(struct usb_device *, uint8_t); static void bbb_detach(struct bbb_transfer *); @@ -454,7 +456,7 @@ bbb_status_callback(struct usb_xfer *xfer, usb_error_t error) * 0: Success * Else: Failure *------------------------------------------------------------------------*/ -static uint8_t +static int bbb_command_start(struct bbb_transfer *sc, uint8_t dir, uint8_t lun, void *data_ptr, size_t data_len, void *cmd_ptr, size_t cmd_len, usb_timeout_t data_timeout) @@ -566,9 +568,10 @@ int usb_iface_is_cdrom(struct usb_device *udev, uint8_t iface_index) { struct bbb_transfer *sc; - usb_error_t err; - uint8_t timeout, is_cdrom; + uint8_t timeout; + uint8_t is_cdrom; uint8_t sid_type; + int err; sc = bbb_attach(udev, iface_index); if (sc == NULL) @@ -594,6 +597,88 @@ usb_iface_is_cdrom(struct usb_device *udev, uint8_t iface_index) return (is_cdrom); } +usb_error_t +usb_msc_auto_quirk(struct usb_device *udev, uint8_t iface_index) +{ + struct bbb_transfer *sc; + uint8_t timeout; + uint8_t is_no_direct; + uint8_t sid_type; + int err; + + sc = bbb_attach(udev, iface_index); + if (sc == NULL) + return (0); + + /* + * Some devices need a delay after that the configuration + * value is set to function properly: + */ + usb_pause_mtx(NULL, hz); + + is_no_direct = 1; + for (timeout = 4; timeout; timeout--) { + err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, + SCSI_INQ_LEN, &scsi_inquiry, sizeof(scsi_inquiry), + USB_MS_HZ); + + if (err == 0 && sc->actlen > 0) { + sid_type = sc->buffer[0] & 0x1F; + if (sid_type == 0x00) + is_no_direct = 0; + break; + } else if (err != ERR_CSW_FAILED) + break; /* non retryable error */ + usb_pause_mtx(NULL, hz); + } + + if (is_no_direct) { + DPRINTF("Device is not direct access.\n"); + goto done; + } + + err = bbb_command_start(sc, DIR_IN, 0, NULL, 0, + &scsi_test_unit_ready, sizeof(scsi_test_unit_ready), + USB_MS_HZ); + + if (err != 0) { + + if (err != ERR_CSW_FAILED) + goto error; + } + + err = bbb_command_start(sc, DIR_IN, 0, NULL, 0, + &scsi_sync_cache, sizeof(scsi_sync_cache), + USB_MS_HZ); + + if (err != 0) { + + if (err != ERR_CSW_FAILED) + goto error; + + DPRINTF("Device doesn't handle synchronize cache\n"); + + usbd_add_dynamic_quirk(udev, UQ_MSC_NO_SYNC_CACHE); + } + +done: + bbb_detach(sc); + return (0); + +error: + bbb_detach(sc); + + DPRINTF("Device did not respond, enabling all quirks\n"); + + usbd_add_dynamic_quirk(udev, UQ_MSC_NO_SYNC_CACHE); + usbd_add_dynamic_quirk(udev, UQ_MSC_NO_TEST_UNIT_READY); + + /* Need to re-enumerate the device */ + usbd_req_re_enumerate(udev, NULL); + + return (USB_ERR_STALLED); +} + usb_error_t usb_msc_eject(struct usb_device *udev, uint8_t iface_index, int method) { diff --git a/sys/dev/usb/usb_msctest.h b/sys/dev/usb/usb_msctest.h index 807d5f5d5d5..e4a717feb31 100644 --- a/sys/dev/usb/usb_msctest.h +++ b/sys/dev/usb/usb_msctest.h @@ -40,5 +40,7 @@ int usb_iface_is_cdrom(struct usb_device *udev, uint8_t iface_index); usb_error_t usb_msc_eject(struct usb_device *udev, uint8_t iface_index, int method); +usb_error_t usb_msc_auto_quirk(struct usb_device *udev, + uint8_t iface_index); #endif /* _USB_MSCTEST_H_ */ diff --git a/sys/dev/usb/usbdi.h b/sys/dev/usb/usbdi.h index 8cdbc2d0dcf..6f899227ce6 100644 --- a/sys/dev/usb/usbdi.h +++ b/sys/dev/usb/usbdi.h @@ -353,6 +353,7 @@ struct usbd_lookup_info { uint16_t idVendor; uint16_t idProduct; uint16_t bcdDevice; + uint16_t autoQuirk[USB_MAX_AUTO_QUIRK]; uint8_t bDeviceClass; uint8_t bDeviceSubClass; uint8_t bDeviceProtocol; @@ -475,6 +476,8 @@ void device_set_usb_desc(device_t dev); void usb_pause_mtx(struct mtx *mtx, int _ticks); usb_error_t usbd_set_pnpinfo(struct usb_device *udev, uint8_t iface_index, const char *pnpinfo); +usb_error_t usbd_add_dynamic_quirk(struct usb_device *udev, + uint16_t quirk); const struct usb_device_id *usbd_lookup_id_by_info( const struct usb_device_id *id, usb_size_t sizeof_id, diff --git a/sys/sys/param.h b/sys/sys/param.h index 44005ae6c0c..41b9ff34561 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -58,7 +58,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 900042 /* Master, propagated to newvers */ +#define __FreeBSD_version 900043 /* Master, propagated to newvers */ #ifdef _KERNEL #define P_OSREL_SIGSEGV 700004 From df523242326155f030cce2171522aae4feecfe4f Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Fri, 2 Sep 2011 18:52:28 +0000 Subject: [PATCH 372/452] Wording, grammar and markup cleanup. PR: 159948 Submitted by: Ben Kaduk Approved by: re (kib) --- share/man/man4/ata.4 | 64 ++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/share/man/man4/ata.4 b/share/man/man4/ata.4 index df023693aa8..633d1ed59f6 100644 --- a/share/man/man4/ata.4 +++ b/share/man/man4/ata.4 @@ -74,47 +74,56 @@ atasis_load="YES" atavia_load="YES" .Ed .Pp -First line is common hardware independent code. -Next three lines are generic bus-specific drivers. -ataahci is AHCI driver. -The rest are vendor-specific PCI drivers. -ATA_CAM option should always remain in kernel configuration to make -the driver work as CAM(4) subsystem module. +The first line is for the common hardware independent code, and is a +prerequisite for the other modules. +The next three lines are generic bus-specific drivers. +Of the rest, ataahci is the AHCI driver. +The others are vendor-specific PCI drivers. +The +.Dv ATA_CAM +option should always remain in the kernel configuration, to make +the driver work as a +.Xr CAM 4 +subsystem module. .Pp The following tunables are settable from the .Xr loader 8 : .Bl -ohang .It Va hw.ata.ata_dma_check_80pin -set to 0 to disable the 80pin cable check (default is 1, check the cable) +set to 0 to disable the 80pin cable check (the default is 1, check the cable) .It Va hint.atapci.X.msi -set to 1 to allow Message Signalled Interrupts (MSI) to be used by +set to 1 to allow Message Signalled Interrupts (MSI) to be used by the specified PCI ATA controller, if supported. .It Va hint.ata.X.devX.mode -limits initial ATA mode for specified device on specified channel. +limits the initial ATA mode for the specified device on specified the channel. .It Va hint.ata.X.mode -limits initial ATA mode for every device on specified channel. +limits the initial ATA mode for every device on the specified channel. .It Va hint.ata.X.pm_level -controls SATA interface Power Management for specified channel, -allowing to save some power by the cost of additional command latency. +controls SATA interface Power Management for the specified channel, +allowing some power savings at the cost of additional command latency. Possible values: .Bl -tag -compact .It 0 -interface Power Management is disabled, default value. +Interface Power Management is disabled. +This is the default value. .It 1 -device is allowed to initiate PM state change, host is passive. +The device is allowed to initiate a PM state change; the host is passive. .It 2 -host initiates PARTIAL PM state transition every time port becomes idle. +The host initiates a PARTIAL PM state transition every time a port becomes idle. .It 3 host initiates SLUMBER PM state transition every time port becomes idle. .El -Modes 2 and 3 are supported only for AHCI. +Modes 2 and 3 are only supported for AHCI. .El .Sh DESCRIPTION The .Nm -driver provides the CAM(4) subsystem access to ATA (IDE) and SATA ports +driver gives the +.Xr CAM 4 +subsystem access to the ATA (IDE) and SATA ports of many generic controllers. -Depending on controller, each PATA port or each one or two SATA ports are +Depending on the controller, each PATA (IDE) +port or each one or two SATA ports are represented to CAM as a separate bus with one or two targets. Most of the bus-management details are handled by the ATA/SATA-specific transport of CAM. @@ -126,22 +135,23 @@ ATAPI devices are handled by the SCSI protocol peripheral drivers .Xr sa 4 , etc. .Pp -Driver supports ATA and for the most of controllers ATAPI devices. +This driver supports ATA, and for the most of controllers, ATAPI devices. Command queuing and SATA port multipliers are not supported. -Device hot-plug and SATA interface power management supported only on +Device hot-plug and SATA interface power management is supported only on some controllers. .Pp The .Nm driver can change the transfer mode when the system is up and running. -See -.Xr camcontrol 8 -negotiate subcommand. +See the +.Cm negotiate +subcommand of +.Xr camcontrol 8 . .Pp The .Nm driver sets the maximum transfer mode supported by the hardware as default. -However the +However, the .Nm driver sometimes warns: .Dq Sy "DMA limited to UDMA33, non-ATA66 cable or device". @@ -247,10 +257,12 @@ The .Nm driver first appeared in .Fx 4.0 . -Turned into CAM(4) interface module in +It was turned into a +.Xr CAM 4 +interface module in .Fx 9.0 . .Sh AUTHORS .An Alexander Motin .Aq mav@FreeBSD.org , .An S\(/oren Schmidt -.Aq sos@FreeBSD.org . +.Aq sos@FreeBSD.org From 871ffe942def6dba2ac7310fb481615b97c3849c Mon Sep 17 00:00:00 2001 From: Jaakko Heinonen Date: Fri, 2 Sep 2011 19:29:37 +0000 Subject: [PATCH 373/452] Restore behavior of the autoboot_delay="-1" boot menu setting to the pre-r222417 state. The behavior was essentially reversed in r222417 which can cause confusion. PR: 159775 Submitted by: Devin Teske Approved by: re (kib) --- sys/boot/forth/menu.4th | 7 ++++--- sys/boot/forth/menu.4th.8 | 10 +++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sys/boot/forth/menu.4th b/sys/boot/forth/menu.4th index 110ec1c9253..fbb6c16b5c0 100644 --- a/sys/boot/forth/menu.4th +++ b/sys/boot/forth/menu.4th @@ -742,11 +742,12 @@ create init_text8 255 allot else -rot 2drop - \ disable timeout if less than zero + \ boot immediately if less than zero dup 0< if drop - 0 menu_timeout_enabled ! - 0 ( assigned to menu_timeout below ) + menu-create + 0 25 at-xy + 0 boot then then then diff --git a/sys/boot/forth/menu.4th.8 b/sys/boot/forth/menu.4th.8 index 45388f54185..55cbfd1e109 100644 --- a/sys/boot/forth/menu.4th.8 +++ b/sys/boot/forth/menu.4th.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 18, 2011 +.Dd Aug 29, 2011 .Dt MENU.4TH 8 .Os .Sh NAME @@ -96,11 +96,15 @@ will wait before executing by default) unless a key is pressed. If set to .Dq Li NO -(case-insensitive) or -.Dq Li -1 , +(case-insensitive) .Ic menu-display will wait for user input and never execute .Ic menu_timeout_command . +If set to +.Dq Li -1 , +.Ic menu-display +will boot immediately, preventing both interruption of the autoboot process and +escaping to the loader prompt. Default is .Dq Li 10 . See From bd2369f62e1e4faf1abe84d9cbae26bd42b78969 Mon Sep 17 00:00:00 2001 From: Stanislav Sedov Date: Fri, 2 Sep 2011 20:35:22 +0000 Subject: [PATCH 374/452] - Fix NULL pointer dereference when a packet of uneven size is being transmitted. Approved by: re (kib) MFC after: 3 days --- sys/dev/smc/if_smc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sys/dev/smc/if_smc.c b/sys/dev/smc/if_smc.c index 22f8bab9e82..4aa0396fbe8 100644 --- a/sys/dev/smc/if_smc.c +++ b/sys/dev/smc/if_smc.c @@ -538,6 +538,7 @@ smc_task_tx(void *context, int pending) struct smc_softc *sc; struct mbuf *m, *m0; u_int packet, len; + int last_len; uint8_t *data; (void)pending; @@ -590,16 +591,18 @@ smc_task_tx(void *context, int pending) * Push the data out to the device. */ data = NULL; + last_len = 0; for (; m != NULL; m = m->m_next) { data = mtod(m, uint8_t *); smc_write_multi_2(sc, DATA0, (uint16_t *)data, m->m_len / 2); + last_len = m->m_len; } /* * Push out the control byte and and the odd byte if needed. */ if ((len & 1) != 0 && data != NULL) - smc_write_2(sc, DATA0, (CTRL_ODD << 8) | data[m->m_len - 1]); + smc_write_2(sc, DATA0, (CTRL_ODD << 8) | data[last_len - 1]); else smc_write_2(sc, DATA0, 0); From 322c8d9e25b53243616d35f8fccd322ee26a129b Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Sat, 3 Sep 2011 00:28:53 +0000 Subject: [PATCH 375/452] Fix the NFS servers so that they can do a Lookup of "..", which requires that ni_strictrelative be set to 0, post-r224810. Tested by: swills (earlier version), geo dot liaskos at gmail.com Approved by: re (kib) --- sys/fs/nfsserver/nfs_nfsdport.c | 1 + sys/nfsserver/nfs_serv.c | 1 + 2 files changed, 2 insertions(+) diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index 82f05d0947c..42ace8204f2 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -282,6 +282,7 @@ nfsvno_namei(struct nfsrv_descript *nd, struct nameidata *ndp, *retdirp = NULL; cnp->cn_nameptr = cnp->cn_pnbuf; + ndp->ni_strictrelative = 0; /* * Extract and set starting directory. */ diff --git a/sys/nfsserver/nfs_serv.c b/sys/nfsserver/nfs_serv.c index 1b9dd987bab..fd3a1b553e1 100644 --- a/sys/nfsserver/nfs_serv.c +++ b/sys/nfsserver/nfs_serv.c @@ -157,6 +157,7 @@ ndclear(struct nameidata *nd) nd->ni_vp = NULL; nd->ni_dvp = NULL; nd->ni_startdir = NULL; + nd->ni_strictrelative = 0; } /* From 1d449f95f29a1b01342ee6c733f8dcac9f4dce3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dag-Erling=20Sm=C3=B8rgrav?= Date: Sat, 3 Sep 2011 03:12:33 +0000 Subject: [PATCH 376/452] Forgot this nit in r221107. Approved by: re (kib) --- sbin/fsck_ffs/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sbin/fsck_ffs/main.c b/sbin/fsck_ffs/main.c index e26494d5057..37258f73ed0 100644 --- a/sbin/fsck_ffs/main.c +++ b/sbin/fsck_ffs/main.c @@ -636,7 +636,7 @@ static void usage(void) { (void) fprintf(stderr, - "usage: %s [-BEFprfny] [-b block] [-c level] [-m mode] " + "usage: %s [-BEFfnpry] [-b block] [-c level] [-m mode] " "filesystem ...\n", getprogname()); exit(1); From 2419d7f93bbf0abcfc2a2aab17dff394bef49fce Mon Sep 17 00:00:00 2001 From: Edward Tomasz Napierala Date: Sat, 3 Sep 2011 08:08:24 +0000 Subject: [PATCH 377/452] Fix panic that happens when fork(2) fails due to a limit other than the rctl one - for example, it happens when someone reaches maximum number of processes in the system. Approved by: re (kib) --- sys/kern/kern_racct.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/sys/kern/kern_racct.c b/sys/kern/kern_racct.c index 401ce1dce9d..b12b7c776ab 100644 --- a/sys/kern/kern_racct.c +++ b/sys/kern/kern_racct.c @@ -605,6 +605,7 @@ out: void racct_proc_exit(struct proc *p) { + int i; uint64_t runtime; PROC_LOCK(p); @@ -618,14 +619,18 @@ racct_proc_exit(struct proc *p) if (runtime < p->p_prev_runtime) runtime = p->p_prev_runtime; #endif - racct_set(p, RACCT_CPU, runtime); + mtx_lock(&racct_lock); + racct_set_locked(p, RACCT_CPU, runtime); - /* - * XXX: Free this some other way. - */ - racct_set(p, RACCT_NPTS, 0); - racct_set(p, RACCT_NTHR, 0); - racct_set(p, RACCT_RSS, 0); + for (i = 0; i <= RACCT_MAX; i++) { + if (p->p_racct->r_resources[i] == 0) + continue; + if (!RACCT_IS_RECLAIMABLE(i)) + continue; + racct_set_locked(p, i, 0); + } + + mtx_unlock(&racct_lock); PROC_UNLOCK(p); #ifdef RCTL From cce0f33cda82c82c95dfc658f12d53f0fe9db6df Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sat, 3 Sep 2011 11:41:00 +0000 Subject: [PATCH 378/452] When libexec/rtld-elf/rtld.c is compiled with clang, the r_debug_state() function (a hook necessary for gdb support), is inlined, but since the function contains no code, no calls to it are generated. When gdb is debugging a dynamically linked program, this causes backtraces to be corrupted. Fix it by marking the function __noinline, and inserting an empty asm statement, that pretends to clobber memory. This forces the compiler to emit calls to r_debug_state() throughout rtld.c. Approved by: re (kib) --- libexec/rtld-elf/rtld.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 0f5aabae734..874f4bc61ff 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -144,7 +144,7 @@ static void ld_utrace_log(int, void *, void *, size_t, int, const char *); static void rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info); -void r_debug_state(struct r_debug *, struct link_map *); +void r_debug_state(struct r_debug *, struct link_map *) __noinline; /* * Data declarations. @@ -2782,6 +2782,14 @@ linkmap_delete(Obj_Entry *obj) void r_debug_state(struct r_debug* rd, struct link_map *m) { + /* + * The following is a hack to force the compiler to emit calls to + * this function, even when optimizing. If the function is empty, + * the compiler is not obliged to emit any code for calls to it, + * even when marked __noinline. However, gdb depends on those + * calls being made. + */ + __asm __volatile("" : : : "memory"); } /* From c18b2beaa11c8ac8f5c334e41723dac138de997e Mon Sep 17 00:00:00 2001 From: Gavin Atkinson Date: Sat, 3 Sep 2011 12:59:05 +0000 Subject: [PATCH 379/452] Add my doc mentor/mentee relationships. Approved by: re (kib), bcr, jkois (mentors) --- share/misc/committers-doc.dot | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/share/misc/committers-doc.dot b/share/misc/committers-doc.dot index f83a3715fee..3754bb74e0a 100644 --- a/share/misc/committers-doc.dot +++ b/share/misc/committers-doc.dot @@ -57,6 +57,7 @@ danger [label="Daniel Gerzo\ndanger@FreeBSD.org\n2006/08/20"] delphij [label="Xin Li\ndelphij@FreeBSD.org\n2004/09/14"] gabor [label="Gabor Kovesdan\ngabor@FreeBSD.org\n2007/02/02"] ganbold [label="Ganbold Tsagaankhuu\nganbold@FreeBSD.org\n2008/02/26"] +gavin [label="Gavin Atkinson\ngavin@FreeBSD.org\n2011/07/18"] gjb [label="Glen Barber\ngjb@FreeBSD.org\n2010/09/01"] hrs [label="Hiroki Sato\nhrs@FreeBSD.org\n2000/07/06"] jkois [label="Johann Kois\njkois@FreeBSD.org\n2004/11/11"] @@ -83,6 +84,8 @@ trhodes [label="Tom Rhodes\ntrhodes@FreeBSD.org\n2002/03/25"] # Group together all the mentees for a particular mentor. # Keep the list sorted by mentor login. +bcr -> gavin + blackend -> ale brueffer -> joel @@ -110,6 +113,7 @@ jim -> trhodes jkois -> miwi jkois -> bcr +jkois -> gavin jkois -> gjb keramida -> blackend From cff08ec0f441d031ee9cf24b78911eef48ebda08 Mon Sep 17 00:00:00 2001 From: Edward Tomasz Napierala Date: Sun, 4 Sep 2011 05:04:34 +0000 Subject: [PATCH 380/452] Since r224036 the cputime and wallclock are supposed to be in seconds, not microseconds. Make it so. Approved by: re (kib) --- sys/kern/kern_rctl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/kern/kern_rctl.c b/sys/kern/kern_rctl.c index a939758bc18..bf445f6fb94 100644 --- a/sys/kern/kern_rctl.c +++ b/sys/kern/kern_rctl.c @@ -908,7 +908,7 @@ rctl_string_to_rule(char *rulestr, struct rctl_rule **rulep) if (error != 0) goto out; if (RACCT_IS_IN_MILLIONS(rule->rr_resource)) - rule->rr_amount *= 1000; + rule->rr_amount *= 1000000; } if (perstr == NULL || perstr[0] == '\0') @@ -1223,7 +1223,7 @@ rctl_racct_to_sbuf(struct racct *racct, int sloppy) continue; amount = racct->r_resources[i]; if (RACCT_IS_IN_MILLIONS(i)) - amount /= 1000; + amount /= 1000000; sbuf_printf(sb, "%s=%jd,", rctl_resource_name(i), amount); } sbuf_setpos(sb, sbuf_len(sb) - 1); From 9f39e22e6d0674532d1c99dae5bd62a47cf5407e Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Sun, 4 Sep 2011 13:07:02 +0000 Subject: [PATCH 381/452] Interrupts are disabled/enabled when entering and exiting the KDB context. While this is generally good, it brings along a serie of problems, like clocks going off sync and in presence of SW_WATCHDOG, watchdogs firing without a good reason (missed hardclock wdog ticks update). Fix the latter by kicking the watchdog just before to re-enable the interrupts. Also, while here, not rely on users to stop the watchdog manually when entering DDB but do that when entering KDB context. Sponsored by: Sandvine Incorporated Reviewed by: emaste, rstone Approved by: re (kib) MFC after: 1 week --- sys/kern/subr_kdb.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sys/kern/subr_kdb.c b/sys/kern/subr_kdb.c index 76b37a9ce7c..2ee7dc674df 100644 --- a/sys/kern/subr_kdb.c +++ b/sys/kern/subr_kdb.c @@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$"); #include "opt_kdb.h" #include "opt_stack.h" +#include "opt_watchdog.h" #include #include @@ -41,6 +42,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include #include @@ -587,6 +591,9 @@ kdb_trap(int type, int code, struct trapframe *tf) cpuset_t other_cpus; #endif struct kdb_dbbe *be; +#ifdef SW_WATCHDOG + u_int wdoglvt; +#endif register_t intr; int handled; @@ -600,6 +607,10 @@ kdb_trap(int type, int code, struct trapframe *tf) intr = intr_disable(); +#ifdef SW_WATCHDOG + wdoglvt = wdog_kern_last_timeout(); + wdog_kern_pat(WD_TO_NEVER); +#endif #ifdef SMP other_cpus = all_cpus; CPU_CLR(PCPU_GET(cpuid), &other_cpus); @@ -631,6 +642,9 @@ kdb_trap(int type, int code, struct trapframe *tf) #ifdef SMP restart_cpus(stopped_cpus); #endif +#ifdef SW_WATCHDOG + wdog_kern_pat(wdoglvt); +#endif intr_restore(intr); From 0fe082e7d5153690bd648e874e5060618a2589a1 Mon Sep 17 00:00:00 2001 From: Andrew Thompson Date: Sun, 4 Sep 2011 22:06:32 +0000 Subject: [PATCH 382/452] On the first loop for generating a bridge MAC address use the local hostid, this gives a good chance of keeping the same address over reboots. This is intended to help IPV6 and similar which generate their addresses from the mac. PR: kern/160300 Submitted by: mdodd Approved by: re (kib) --- sys/net/if_bridge.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/sys/net/if_bridge.c b/sys/net/if_bridge.c index a4bf2b2a13b..c251653841f 100644 --- a/sys/net/if_bridge.c +++ b/sys/net/if_bridge.c @@ -85,6 +85,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include /* for net/if.h */ #include @@ -560,7 +561,8 @@ bridge_clone_create(struct if_clone *ifc, int unit, caddr_t params) { struct bridge_softc *sc, *sc2; struct ifnet *bifp, *ifp; - int retry; + int fb, retry; + unsigned long hostid; sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO); ifp = sc->sc_ifp = if_alloc(IFT_ETHER); @@ -593,17 +595,30 @@ bridge_clone_create(struct if_clone *ifc, int unit, caddr_t params) IFQ_SET_READY(&ifp->if_snd); /* - * Generate a random ethernet address with a locally administered - * address. + * Generate an ethernet address with a locally administered address. * * Since we are using random ethernet addresses for the bridge, it is * possible that we might have address collisions, so make sure that * this hardware address isn't already in use on another bridge. + * The first try uses the hostid and falls back to arc4rand(). */ + fb = 0; + getcredhostid(curthread->td_ucred, &hostid); for (retry = 1; retry != 0;) { - arc4rand(sc->sc_defaddr, ETHER_ADDR_LEN, 1); - sc->sc_defaddr[0] &= ~1; /* clear multicast bit */ - sc->sc_defaddr[0] |= 2; /* set the LAA bit */ + if (fb || hostid == 0) { + arc4rand(sc->sc_defaddr, ETHER_ADDR_LEN, 1); + sc->sc_defaddr[0] &= ~1;/* clear multicast bit */ + sc->sc_defaddr[0] |= 2; /* set the LAA bit */ + } else { + sc->sc_defaddr[0] = 0x2; + sc->sc_defaddr[1] = (hostid >> 24) & 0xff; + sc->sc_defaddr[2] = (hostid >> 16) & 0xff; + sc->sc_defaddr[3] = (hostid >> 8 ) & 0xff; + sc->sc_defaddr[4] = hostid & 0xff; + sc->sc_defaddr[5] = ifp->if_dunit & 0xff; + } + + fb = 1; retry = 0; mtx_lock(&bridge_list_mtx); LIST_FOREACH(sc2, &bridge_list, sc_list) { From cd4c8d64ff5f2013d37fb0d08a2ca41ce50f6938 Mon Sep 17 00:00:00 2001 From: "Jayachandran C." Date: Mon, 5 Sep 2011 10:45:29 +0000 Subject: [PATCH 383/452] MIPS XLP platform code update. * Update the hardware access register definitions and functions to bring them in line with other Netlogic software. * Update the platform bus to use PCI even for on-chip devices. Add a dummy PCI driver to ignore on-chip devices which do not need driver. * Provide memory and IRQ resource allocation code for on-chip devices which cannot get it from PCI config. * add support for on-chip PCI and USB interfaces. * update conf files, enable pci and retain old MAXCPU until we can support >32 cpus. Approved by: re(kib), jmallett --- sys/mips/conf/XLP | 3 +- sys/mips/conf/XLP64 | 5 +- sys/mips/conf/XLPN32 | 3 +- sys/mips/nlm/board.c | 3 +- sys/mips/nlm/board.h | 3 +- sys/mips/nlm/bus_space_rmi.c | 8 +- sys/mips/nlm/bus_space_rmi_pci.c | 768 ++++++++++++++++++ sys/mips/nlm/clock.h | 3 +- sys/mips/nlm/cms.c | 166 ++-- sys/mips/nlm/files.xlp | 11 +- sys/mips/nlm/hal/bridge.h | 271 +++--- sys/mips/nlm/hal/cop0.h | 280 ------- sys/mips/nlm/hal/cop2.h | 236 +++--- sys/mips/nlm/hal/cpucontrol.h | 192 ++++- sys/mips/nlm/hal/fmn.c | 340 ++++---- sys/mips/nlm/hal/fmn.h | 233 +++--- sys/mips/nlm/hal/haldefs.h | 437 ++++++++++ sys/mips/nlm/hal/iomap.h | 241 ++---- sys/mips/nlm/hal/mips-extns.h | 246 ++++-- sys/mips/nlm/hal/mmio.h | 338 -------- sys/mips/nlm/hal/mmu.h | 147 ++-- sys/mips/nlm/hal/pcibus.h | 89 ++ sys/mips/nlm/hal/pic.h | 657 +++++++-------- sys/mips/nlm/hal/sys.h | 168 ++-- sys/mips/nlm/hal/uart.h | 166 ++-- sys/mips/nlm/hal/usb.h | 59 ++ sys/mips/nlm/intern_dev.c | 86 ++ sys/mips/nlm/interrupt.h | 3 +- sys/mips/nlm/intr_machdep.c | 4 +- sys/mips/nlm/iodi.c | 233 ------ sys/mips/nlm/mpreset.S | 9 +- sys/mips/nlm/msgring.h | 5 +- sys/mips/nlm/uart_bus_xlp_iodi.c | 6 +- .../{uart_cpu_mips_xlp.c => uart_cpu_xlp.c} | 34 +- sys/mips/nlm/uart_pci_xlp.c | 85 ++ sys/mips/nlm/usb_init.c | 92 +++ sys/mips/nlm/xlp.h | 114 ++- sys/mips/nlm/xlp_machdep.c | 59 +- sys/mips/nlm/xlp_pci.c | 666 +++++++++++++++ 39 files changed, 3954 insertions(+), 2515 deletions(-) create mode 100644 sys/mips/nlm/bus_space_rmi_pci.c delete mode 100644 sys/mips/nlm/hal/cop0.h create mode 100644 sys/mips/nlm/hal/haldefs.h delete mode 100644 sys/mips/nlm/hal/mmio.h create mode 100644 sys/mips/nlm/hal/pcibus.h create mode 100644 sys/mips/nlm/hal/usb.h create mode 100644 sys/mips/nlm/intern_dev.c delete mode 100644 sys/mips/nlm/iodi.c rename sys/mips/nlm/{uart_cpu_mips_xlp.c => uart_cpu_xlp.c} (74%) create mode 100644 sys/mips/nlm/uart_pci_xlp.c create mode 100644 sys/mips/nlm/usb_init.c create mode 100644 sys/mips/nlm/xlp_pci.c diff --git a/sys/mips/conf/XLP b/sys/mips/conf/XLP index 48d8df35f26..ff40239a304 100644 --- a/sys/mips/conf/XLP +++ b/sys/mips/conf/XLP @@ -36,7 +36,7 @@ options SCHED_ULE # ULE scheduler options SMP options PREEMPTION # Enable kernel thread preemption #options FULL_PREEMPTION # Enable kernel thread preemption -options MAXCPU=128 # XLP can probe 128 CPUs +#options MAXCPU=128 # XLP can probe 128 CPUs options INET # InterNETworking options INET6 # IPv6 communications protocols options FFS # Berkeley Fast Filesystem @@ -89,6 +89,7 @@ device bpf # UART device uart +device pci # Network device ether diff --git a/sys/mips/conf/XLP64 b/sys/mips/conf/XLP64 index d70098e88cc..1d4b575f3a4 100644 --- a/sys/mips/conf/XLP64 +++ b/sys/mips/conf/XLP64 @@ -21,7 +21,7 @@ machine mips mips64eb ident XLP64 options ISA_MIPS64 -makeoptions ARCH_FLAGS="-march=mips64 -mabi=64" +makeoptions ARCH_FLAGS="-march=mips64r2 -mabi=64" makeoptions KERNLOADADDR=0xffffffff80100000 include "../nlm/std.xlp" @@ -38,7 +38,7 @@ options SCHED_ULE # ULE scheduler options SMP options PREEMPTION # Enable kernel thread preemption #options FULL_PREEMPTION # Enable kernel thread preemption -options MAXCPU=128 # XLP can probe 128 CPUs +#options MAXCPU=128 # XLP can probe 128 CPUs options INET # InterNETworking options INET6 # IPv6 communications protocols options FFS # Berkeley Fast Filesystem @@ -91,6 +91,7 @@ device bpf # UART device uart +device pci # Network device ether diff --git a/sys/mips/conf/XLPN32 b/sys/mips/conf/XLPN32 index 81cd17f5fec..02119a85435 100644 --- a/sys/mips/conf/XLPN32 +++ b/sys/mips/conf/XLPN32 @@ -37,7 +37,7 @@ options SCHED_ULE # ULE scheduler options SMP options PREEMPTION # Enable kernel thread preemption #options FULL_PREEMPTION # Enable kernel thread preemption -options MAXCPU=128 # XLP can probe 128 CPUs +#options MAXCPU=128 # XLP can probe 128 CPUs options INET # InterNETworking options INET6 # IPv6 communications protocols options FFS # Berkeley Fast Filesystem @@ -90,6 +90,7 @@ device bpf # UART device uart +device pci # Network device ether diff --git a/sys/mips/nlm/board.c b/sys/mips/nlm/board.c index d75059e21ca..5fd771d8d2c 100644 --- a/sys/mips/nlm/board.c +++ b/sys/mips/nlm/board.c @@ -29,7 +29,6 @@ #include __FBSDID("$FreeBSD$"); - #include #include #include @@ -38,7 +37,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include #include diff --git a/sys/mips/nlm/board.h b/sys/mips/nlm/board.h index 742ebbab2a4..5a0c868c510 100644 --- a/sys/mips/nlm/board.h +++ b/sys/mips/nlm/board.h @@ -25,8 +25,9 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ #ifndef __NLM_BOARD_H__ #define __NLM_BOARD_H__ diff --git a/sys/mips/nlm/bus_space_rmi.c b/sys/mips/nlm/bus_space_rmi.c index 8653cdfaaf4..6bb3fff7f8f 100644 --- a/sys/mips/nlm/bus_space_rmi.c +++ b/sys/mips/nlm/bus_space_rmi.c @@ -401,14 +401,14 @@ static u_int8_t rmi_bus_space_read_1(void *tag, bus_space_handle_t handle, bus_size_t offset) { - return (u_int8_t) (*(volatile u_int32_t *)(handle + offset)); + return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); } static u_int16_t rmi_bus_space_read_2(void *tag, bus_space_handle_t handle, bus_size_t offset) { - return (u_int16_t)(*(volatile u_int32_t *)(handle + offset)); + return (u_int16_t)(*(volatile u_int16_t *)(handle + offset)); } static u_int32_t @@ -453,14 +453,14 @@ static void rmi_bus_space_write_1(void *tag, bus_space_handle_t handle, bus_size_t offset, u_int8_t value) { - *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value; + *(volatile u_int8_t *)(handle + offset) = value; } static void rmi_bus_space_write_2(void *tag, bus_space_handle_t handle, bus_size_t offset, u_int16_t value) { - *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value; + *(volatile u_int16_t *)(handle + offset) = value; } static void diff --git a/sys/mips/nlm/bus_space_rmi_pci.c b/sys/mips/nlm/bus_space_rmi_pci.c new file mode 100644 index 00000000000..8e757ef0207 --- /dev/null +++ b/sys/mips/nlm/bus_space_rmi_pci.c @@ -0,0 +1,768 @@ +/*- + * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * NETLOGIC_BSD */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +static int +rmi_pci_bus_space_map(void *t, bus_addr_t addr, + bus_size_t size, int flags, + bus_space_handle_t * bshp); + +static void +rmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh, + bus_size_t size); + +static int +rmi_pci_bus_space_subregion(void *t, + bus_space_handle_t bsh, + bus_size_t offset, bus_size_t size, + bus_space_handle_t * nbshp); + +static u_int8_t +rmi_pci_bus_space_read_1(void *t, + bus_space_handle_t handle, + bus_size_t offset); + +static u_int16_t +rmi_pci_bus_space_read_2(void *t, + bus_space_handle_t handle, + bus_size_t offset); + +static u_int32_t +rmi_pci_bus_space_read_4(void *t, + bus_space_handle_t handle, + bus_size_t offset); + +static void +rmi_pci_bus_space_read_multi_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_multi_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_multi_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_region_1(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int8_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_region_4(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int32_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int8_t value); + +static void +rmi_pci_bus_space_write_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int16_t value); + +static void +rmi_pci_bus_space_write_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int32_t value); + +static void +rmi_pci_bus_space_write_multi_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int8_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_multi_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_multi_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int32_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, + const u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_region_4(void *t, + bus_space_handle_t bsh, + bus_size_t offset, + const u_int32_t * addr, + size_t count); + + +static void +rmi_pci_bus_space_set_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int16_t value, + size_t count); +static void +rmi_pci_bus_space_set_region_4(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int32_t value, + size_t count); + +static void +rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, + bus_size_t offset __unused, bus_size_t len __unused, int flags); + +static void +rmi_pci_bus_space_copy_region_2(void *t, + bus_space_handle_t bsh1, + bus_size_t off1, + bus_space_handle_t bsh2, + bus_size_t off2, size_t count); + +u_int8_t +rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, + bus_size_t offset); + +static u_int16_t +rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset); + +static u_int32_t +rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset); +static void +rmi_pci_bus_space_read_multi_stream_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_multi_stream_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_multi_stream_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, + size_t count); + +void +rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int8_t value); +static void +rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value); + +static void +rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value); + +static void +rmi_pci_bus_space_write_multi_stream_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int8_t * addr, + size_t count); +static void +rmi_pci_bus_space_write_multi_stream_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_multi_stream_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int32_t * addr, + size_t count); + +#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__) + +static struct bus_space local_rmi_pci_bus_space = { + /* cookie */ + (void *)0, + + /* mapping/unmapping */ + rmi_pci_bus_space_map, + rmi_pci_bus_space_unmap, + rmi_pci_bus_space_subregion, + + /* allocation/deallocation */ + NULL, + NULL, + + /* barrier */ + rmi_pci_bus_space_barrier, + + /* read (single) */ + rmi_pci_bus_space_read_1, + rmi_pci_bus_space_read_2, + rmi_pci_bus_space_read_4, + NULL, + + /* read multiple */ + rmi_pci_bus_space_read_multi_1, + rmi_pci_bus_space_read_multi_2, + rmi_pci_bus_space_read_multi_4, + NULL, + + /* read region */ + rmi_pci_bus_space_read_region_1, + rmi_pci_bus_space_read_region_2, + rmi_pci_bus_space_read_region_4, + NULL, + + /* write (single) */ + rmi_pci_bus_space_write_1, + rmi_pci_bus_space_write_2, + rmi_pci_bus_space_write_4, + NULL, + + /* write multiple */ + rmi_pci_bus_space_write_multi_1, + rmi_pci_bus_space_write_multi_2, + rmi_pci_bus_space_write_multi_4, + NULL, + + /* write region */ + NULL, + rmi_pci_bus_space_write_region_2, + rmi_pci_bus_space_write_region_4, + NULL, + + /* set multiple */ + NULL, + NULL, + NULL, + NULL, + + /* set region */ + NULL, + rmi_pci_bus_space_set_region_2, + rmi_pci_bus_space_set_region_4, + NULL, + + /* copy */ + NULL, + rmi_pci_bus_space_copy_region_2, + NULL, + NULL, + + /* read (single) stream */ + rmi_pci_bus_space_read_stream_1, + rmi_pci_bus_space_read_stream_2, + rmi_pci_bus_space_read_stream_4, + NULL, + + /* read multiple stream */ + rmi_pci_bus_space_read_multi_stream_1, + rmi_pci_bus_space_read_multi_stream_2, + rmi_pci_bus_space_read_multi_stream_4, + NULL, + + /* read region stream */ + rmi_pci_bus_space_read_region_1, + rmi_pci_bus_space_read_region_2, + rmi_pci_bus_space_read_region_4, + NULL, + + /* write (single) stream */ + rmi_pci_bus_space_write_stream_1, + rmi_pci_bus_space_write_stream_2, + rmi_pci_bus_space_write_stream_4, + NULL, + + /* write multiple stream */ + rmi_pci_bus_space_write_multi_stream_1, + rmi_pci_bus_space_write_multi_stream_2, + rmi_pci_bus_space_write_multi_stream_4, + NULL, + + /* write region stream */ + NULL, + rmi_pci_bus_space_write_region_2, + rmi_pci_bus_space_write_region_4, + NULL, +}; + +/* generic bus_space tag */ +bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space; + +/* + * Map a region of device bus space into CPU virtual address space. + */ +static int +rmi_pci_bus_space_map(void *t __unused, bus_addr_t addr, + bus_size_t size __unused, int flags __unused, + bus_space_handle_t * bshp) +{ + *bshp = addr; + return (0); +} + +/* + * Unmap a region of device bus space. + */ +static void +rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, + bus_size_t size __unused) +{ +} + +/* + * Get a new handle for a subregion of an already-mapped area of bus space. + */ + +static int +rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, + bus_size_t offset, bus_size_t size __unused, + bus_space_handle_t * nbshp) +{ + *nbshp = bsh + offset; + return (0); +} + +/* + * Read a 1, 2, 4, or 8 byte quantity from bus space + * described by tag/handle/offset. + */ + +static u_int8_t +rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle, + bus_size_t offset) +{ + return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); +} + +static u_int16_t +rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle, + bus_size_t offset) +{ + u_int16_t value; + + value = *(volatile u_int16_t *)(handle + offset); + return bswap16(value); +} + +static u_int32_t +rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle, + bus_size_t offset) +{ + uint32_t value; + + value = *(volatile u_int32_t *)(handle + offset); + return bswap32(value); +} + +/* + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle/offset and copy into buffer provided. + */ +static void +rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, size_t count) +{ + while (count--) { + *addr = *(volatile u_int8_t *)(handle + offset); + addr++; + } +} + +static void +rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, size_t count) +{ + + while (count--) { + *addr = *(volatile u_int16_t *)(handle + offset); + *addr = bswap16(*addr); + addr++; + } +} + +static void +rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, size_t count) +{ + + while (count--) { + *addr = *(volatile u_int32_t *)(handle + offset); + *addr = bswap32(*addr); + addr++; + } +} + +/* + * Write the 1, 2, 4, or 8 byte value `value' to bus space + * described by tag/handle/offset. + */ + +static void +rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int8_t value) +{ + mips_sync(); + *(volatile u_int8_t *)(handle + offset) = value; +} + +static void +rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value) +{ + mips_sync(); + *(volatile u_int16_t *)(handle + offset) = bswap16(value); +} + + +static void +rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value) +{ + mips_sync(); + *(volatile u_int32_t *)(handle + offset) = bswap32(value); +} + +/* + * Write `count' 1, 2, 4, or 8 byte quantities from the buffer + * provided to bus space described by tag/handle/offset. + */ + + +static void +rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int8_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int8_t *)(handle + offset)) = *addr; + addr++; + } +} + +static void +rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int16_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr); + addr++; + } +} + +static void +rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int32_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr); + addr++; + } +} + +/* + * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described + * by tag/handle starting at `offset'. + */ + +static void +rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int16_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + for (; count != 0; count--, addr += 2) + (*(volatile u_int16_t *)(addr)) = value; +} + +static void +rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int32_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + for (; count != 0; count--, addr += 4) + (*(volatile u_int32_t *)(addr)) = value; +} + + +/* + * Copy `count' 1, 2, 4, or 8 byte values from bus space starting + * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. + */ +static void +rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, + bus_size_t off1, bus_space_handle_t bsh2, + bus_size_t off2, size_t count) +{ + TODO(); +} + +/* + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle/offset and copy into buffer provided. + */ + +u_int8_t +rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + + return *((volatile u_int8_t *)(handle + offset)); +} + + +static u_int16_t +rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + return *(volatile u_int16_t *)(handle + offset); +} + + +static u_int32_t +rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + return (*(volatile u_int32_t *)(handle + offset)); +} + + +static void +rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, size_t count) +{ + while (count--) { + *addr = (*(volatile u_int8_t *)(handle + offset)); + addr++; + } +} + +static void +rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, size_t count) +{ + while (count--) { + *addr = (*(volatile u_int16_t *)(handle + offset)); + addr++; + } +} + +static void +rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, size_t count) +{ + while (count--) { + *addr = (*(volatile u_int32_t *)(handle + offset)); + addr++; + } +} + + + +/* + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle and starting at `offset' and copy into + * buffer provided. + */ +void +rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int8_t * addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + *addr++ = (*(volatile u_int8_t *)(baddr)); + baddr += 1; + } +} + +void +rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int16_t * addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + *addr++ = (*(volatile u_int16_t *)(baddr)); + baddr += 2; + } +} + +void +rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int32_t * addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + *addr++ = (*(volatile u_int32_t *)(baddr)); + baddr += 4; + } +} + + +void +rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int8_t value) +{ + mips_sync(); + *(volatile u_int8_t *)(handle + offset) = value; +} + +static void +rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value) +{ + mips_sync(); + *(volatile u_int16_t *)(handle + offset) = value; +} + + +static void +rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value) +{ + mips_sync(); + *(volatile u_int32_t *)(handle + offset) = value; +} + + +static void +rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int8_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int8_t *)(handle + offset)) = *addr; + addr++; + } +} + +static void +rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int16_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int16_t *)(handle + offset)) = *addr; + addr++; + } +} + +static void +rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int32_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int32_t *)(handle + offset)) = *addr; + addr++; + } +} + +void +rmi_pci_bus_space_write_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, + const u_int16_t * addr, + size_t count) +{ + bus_addr_t baddr = (bus_addr_t) bsh + offset; + + while (count--) { + (*(volatile u_int16_t *)(baddr)) = *addr; + addr++; + baddr += 2; + } +} + +void +rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, const u_int32_t * addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + (*(volatile u_int32_t *)(baddr)) = *addr; + addr++; + baddr += 4; + } +} + +static void +rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, + bus_size_t offset __unused, bus_size_t len __unused, int flags) +{ + +} diff --git a/sys/mips/nlm/clock.h b/sys/mips/nlm/clock.h index 2135dbf5ee0..7a2be070045 100644 --- a/sys/mips/nlm/clock.h +++ b/sys/mips/nlm/clock.h @@ -25,8 +25,9 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ #ifndef _RMI_CLOCK_H_ #define _RMI_CLOCK_H_ diff --git a/sys/mips/nlm/cms.c b/sys/mips/nlm/cms.c index fb03d8030f0..043d5884e07 100644 --- a/sys/mips/nlm/cms.c +++ b/sys/mips/nlm/cms.c @@ -56,9 +56,8 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include -#include #include #include #include @@ -108,7 +107,7 @@ xlp_msgring_config(void) int i; /* TODO: Add other nodes */ - xlp_cms_base = nlm_regbase_cms(0); + xlp_cms_base = nlm_get_cms_regbase(0); mtx_init(&msgmap_lock, "msgring", NULL, MTX_SPIN); if (xlp_threads_per_core < xlp_msg_threads_per_core) @@ -147,62 +146,58 @@ xlp_msgring_iodi_config(void) void nlm_cms_credit_setup(int credit) { - int src, qid, i; + int src, qid, i; #if 0 - /* there are a total of 18 src stations on XLP. */ + /* there are a total of 18 src stations on XLP. */ printf("Setting up CMS credits!\n"); - for(src=0; src<18; src++) { - for(qid=0; qid<1024; qid++) { - nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); - } - } + for (src=0; src<18; src++) { + for(qid=0; qid<1024; qid++) { + nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); + } + } #endif printf("Setting up CMS credits!\n"); /* CPU Credits */ - for(i = 1; i < 8; i++) { + for (i = 1; i < 8; i++) { src = (i << 4); - for(qid = 0; qid < 1024; qid++) { - nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); - } - } + for (qid = 0; qid < 1024; qid++) + nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); + } /* PCIE Credits */ - for(i = 0; i < 4; i++) { + for(i = 0; i < 4; i++) { src = (256 + (i * 2)); - for(qid = 0; qid < 1024; qid++) { - nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); - } - } + for(qid = 0; qid < 1024; qid++) + nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); + } /* DTE Credits */ src = 264; - for(qid = 0; qid < 1024; qid++) { - nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); - } + for (qid = 0; qid < 1024; qid++) + nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); /* RSA Credits */ src = 272; - for(qid = 0; qid < 1024; qid++) { - nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); - } + for (qid = 0; qid < 1024; qid++) + nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); + /* Crypto Credits */ src = 281; - for(qid = 0; qid < 1024; qid++) { - nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); - } + for (qid = 0; qid < 1024; qid++) + nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); + /* CMP Credits */ src = 298; - for(qid = 0; qid < 1024; qid++) { - nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); - } + for (qid = 0; qid < 1024; qid++) + nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); + /* POE Credits */ src = 384; - for(qid = 0; qid < 1024; qid++) { - nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); - } + for(qid = 0; qid < 1024; qid++) + nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); + /* NAE Credits */ src = 476; - for(qid = 0; qid < 1024; qid++) { - nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); - } + for(qid = 0; qid < 1024; qid++) + nlm_cms_setup_credits(xlp_cms_base, qid, src, credit); } void @@ -210,7 +205,7 @@ xlp_msgring_cpu_init(uint32_t cpuid) { int queue,i; - queue = XLP_CMS_CPU_PUSHQ(0, ((cpuid >> 2) & 0x7), (cpuid & 0x3), 0); + queue = CMS_CPU_PUSHQ(0, ((cpuid >> 2) & 0x7), (cpuid & 0x3), 0); /* temp allocate 4 segments to each output queue */ nlm_cms_alloc_onchip_q(xlp_cms_base, queue, 4); /* Enable high watermark and non empty interrupt */ @@ -247,9 +242,9 @@ xlp_handle_msg_vc(int vc, int max_msgs) uint32_t mflags, status; for (i = 0; i < max_msgs; i++) { - mflags = nlm_fmn_saveflags(); + mflags = nlm_save_flags_cop2(); status = nlm_fmn_msgrcv(vc, &srcid, &size, &code, &msg); - nlm_fmn_restoreflags(mflags); + nlm_restore_flags(mflags); if (status != 0) /* If there is no msg or error */ break; if (srcid < 0 && srcid >= 1024) { @@ -273,27 +268,27 @@ xlp_handle_msg_vc(int vc, int max_msgs) static int msgring_process_fast_intr(void *arg) { - struct msgring_thread *mthd; - struct thread *td; - int cpu; + struct msgring_thread *mthd; + struct thread *td; + int cpu; cpu = nlm_cpuid(); - mthd = &msgring_threads[cpu]; - td = mthd->thread; + mthd = &msgring_threads[cpu]; + td = mthd->thread; - /* clear pending interrupts */ - nlm_write_c0_eirr(1ULL << IRQ_MSGRING); + /* clear pending interrupts */ + nlm_write_c0_eirr(1ULL << IRQ_MSGRING); - /* wake up the target thread */ - mthd->needed = 1; - thread_lock(td); - if (TD_AWAITING_INTR(td)) { - TD_CLR_IWAIT(td); - sched_add(td, SRQ_INTR); - } + /* wake up the target thread */ + mthd->needed = 1; + thread_lock(td); + if (TD_AWAITING_INTR(td)) { + TD_CLR_IWAIT(td); + sched_add(td, SRQ_INTR); + } - thread_unlock(td); - return (FILTER_HANDLED); + thread_unlock(td); + return (FILTER_HANDLED); } u_int fmn_msgcount[32][4]; @@ -302,31 +297,31 @@ u_int fmn_loops[32]; static void msgring_process(void * arg) { - volatile struct msgring_thread *mthd; - struct thread *td; - uint32_t mflags; + volatile struct msgring_thread *mthd; + struct thread *td; + uint32_t mflags; int hwtid, vc, handled, nmsgs; hwtid = (intptr_t)arg; - mthd = &msgring_threads[hwtid]; - td = mthd->thread; - KASSERT(curthread == td, - ("%s:msg_ithread and proc linkage out of sync", __func__)); + mthd = &msgring_threads[hwtid]; + td = mthd->thread; + KASSERT(curthread == td, + ("%s:msg_ithread and proc linkage out of sync", __func__)); - /* First bind this thread to the right CPU */ - thread_lock(td); - sched_bind(td, xlp_hwtid_to_cpuid[hwtid]); - thread_unlock(td); + /* First bind this thread to the right CPU */ + thread_lock(td); + sched_bind(td, xlp_hwtid_to_cpuid[hwtid]); + thread_unlock(td); if (hwtid != nlm_cpuid()) printf("Misscheduled hwtid %d != cpuid %d\n", hwtid, nlm_cpuid()); - mflags = nlm_fmn_saveflags(); - nlm_fmn_cpu_init(IRQ_MSGRING, 0, 0, 0, 0, 0); - nlm_fmn_restoreflags(mflags); + mflags = nlm_save_flags_cop2(); + nlm_fmn_cpu_init(IRQ_MSGRING, 0, 0, 0, 0, 0); + nlm_restore_flags(mflags); - /* start processing messages */ - for( ; ; ) { - /*atomic_store_rel_int(&mthd->needed, 0);*/ + /* start processing messages */ + for( ; ; ) { + /*atomic_store_rel_int(&mthd->needed, 0);*/ /* enable cop2 access */ do { @@ -338,22 +333,22 @@ msgring_process(void * arg) } } while (handled); - /* sleep */ + /* sleep */ #if 0 - thread_lock(td); - if (mthd->needed) { - thread_unlock(td); - continue; - } - sched_class(td, PRI_ITHD); - TD_SET_IWAIT(td); - mi_switch(SW_VOL, NULL); - thread_unlock(td); + thread_lock(td); + if (mthd->needed) { + thread_unlock(td); + continue; + } + sched_class(td, PRI_ITHD); + TD_SET_IWAIT(td); + mi_switch(SW_VOL, NULL); + thread_unlock(td); #else pause("wmsg", 1); #endif fmn_loops[hwtid]++; - } + } } static void @@ -396,7 +391,6 @@ register_msgring_handler(int startb, int endb, msgring_handler action, msgmap[i].arg = arg; } mtx_unlock_spin(&msgmap_lock); - return (0); } diff --git a/sys/mips/nlm/files.xlp b/sys/mips/nlm/files.xlp index ac138454896..f9b2b719d3a 100644 --- a/sys/mips/nlm/files.xlp +++ b/sys/mips/nlm/files.xlp @@ -3,10 +3,13 @@ mips/nlm/hal/fmn.c standard mips/nlm/xlp_machdep.c standard mips/nlm/intr_machdep.c standard mips/nlm/tick.c standard -mips/nlm/iodi.c standard mips/nlm/board.c standard mips/nlm/cms.c standard -mips/nlm/bus_space_rmi.c standard +mips/nlm/bus_space_rmi.c standard +mips/nlm/bus_space_rmi_pci.c standard mips/nlm/mpreset.S standard -mips/nlm/uart_bus_xlp_iodi.c optional uart -mips/nlm/uart_cpu_mips_xlp.c optional uart +mips/nlm/xlp_pci.c optional pci +mips/nlm/intern_dev.c optional pci +mips/nlm/uart_pci_xlp.c optional uart +mips/nlm/uart_cpu_xlp.c optional uart +mips/nlm/usb_init.c optional usb diff --git a/sys/mips/nlm/hal/bridge.h b/sys/mips/nlm/hal/bridge.h index d91ccd64886..543c3659421 100644 --- a/sys/mips/nlm/hal/bridge.h +++ b/sys/mips/nlm/hal/bridge.h @@ -25,11 +25,12 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ -#ifndef __NLM_BRIDGE_H__ -#define __NLM_BRIDGE_H__ +#ifndef __NLM_HAL_BRIDGE_H__ +#define __NLM_HAL_BRIDGE_H__ /** * @file_name mio.h @@ -37,141 +38,147 @@ * @brief Basic definitions of XLP memory and io subsystem */ -/* BRIDGE specific registers */ -#define XLP_BRIDGE_MODE_REG 0x40 -#define XLP_BRIDGE_PCI_CFG_BASE_REG 0x41 -#define XLP_BRIDGE_PCI_CFG_LIMIT_REG 0x42 -#define XLP_BRIDGE_PCIE_CFG_BASE_REG 0x43 -#define XLP_BRIDGE_PCIE_CFG_LIMIT_REG 0x44 -#define XLP_BRIDGE_BUSNUM_BAR0_REG 0x45 -#define XLP_BRIDGE_BUSNUM_BAR1_REG 0x46 -#define XLP_BRIDGE_BUSNUM_BAR2_REG 0x47 -#define XLP_BRIDGE_BUSNUM_BAR3_REG 0x48 -#define XLP_BRIDGE_BUSNUM_BAR4_REG 0x49 -#define XLP_BRIDGE_BUSNUM_BAR5_REG 0x4a -#define XLP_BRIDGE_BUSNUM_BAR6_REG 0x4b -#define XLP_BRIDGE_FLASH_BAR0_REG 0x4c -#define XLP_BRIDGE_FLASH_BAR1_REG 0x4d -#define XLP_BRIDGE_FLASH_BAR2_REG 0x4e -#define XLP_BRIDGE_FLASH_BAR3_REG 0x4f -#define XLP_BRIDGE_FLASH_LIMIT0_REG 0x50 -#define XLP_BRIDGE_FLASH_LIMIT1_REG 0x51 -#define XLP_BRIDGE_FLASH_LIMIT2_REG 0x52 -#define XLP_BRIDGE_FLASH_LIMIT3_REG 0x53 +/* + * BRIDGE specific registers + * + * These registers start after the PCIe header, which has 0x40 + * standard entries + */ +#define BRIDGE_MODE 0x00 +#define BRIDGE_PCI_CFG_BASE 0x01 +#define BRIDGE_PCI_CFG_LIMIT 0x02 +#define BRIDGE_PCIE_CFG_BASE 0x03 +#define BRIDGE_PCIE_CFG_LIMIT 0x04 +#define BRIDGE_BUSNUM_BAR0 0x05 +#define BRIDGE_BUSNUM_BAR1 0x06 +#define BRIDGE_BUSNUM_BAR2 0x07 +#define BRIDGE_BUSNUM_BAR3 0x08 +#define BRIDGE_BUSNUM_BAR4 0x09 +#define BRIDGE_BUSNUM_BAR5 0x0a +#define BRIDGE_BUSNUM_BAR6 0x0b +#define BRIDGE_FLASH_BAR0 0x0c +#define BRIDGE_FLASH_BAR1 0x0d +#define BRIDGE_FLASH_BAR2 0x0e +#define BRIDGE_FLASH_BAR3 0x0f +#define BRIDGE_FLASH_LIMIT0 0x10 +#define BRIDGE_FLASH_LIMIT1 0x11 +#define BRIDGE_FLASH_LIMIT2 0x12 +#define BRIDGE_FLASH_LIMIT3 0x13 -#define XLP_BRIDGE_DRAM_BAR_REG(i) (0x54 + (i)) -#define XLP_BRIDGE_DRAM_BAR0_REG 0x54 -#define XLP_BRIDGE_DRAM_BAR1_REG 0x55 -#define XLP_BRIDGE_DRAM_BAR2_REG 0x56 -#define XLP_BRIDGE_DRAM_BAR3_REG 0x57 -#define XLP_BRIDGE_DRAM_BAR4_REG 0x58 -#define XLP_BRIDGE_DRAM_BAR5_REG 0x59 -#define XLP_BRIDGE_DRAM_BAR6_REG 0x5a -#define XLP_BRIDGE_DRAM_BAR7_REG 0x5b +#define BRIDGE_DRAM_BAR(i) (0x14 + (i)) +#define BRIDGE_DRAM_BAR0 0x14 +#define BRIDGE_DRAM_BAR1 0x15 +#define BRIDGE_DRAM_BAR2 0x16 +#define BRIDGE_DRAM_BAR3 0x17 +#define BRIDGE_DRAM_BAR4 0x18 +#define BRIDGE_DRAM_BAR5 0x19 +#define BRIDGE_DRAM_BAR6 0x1a +#define BRIDGE_DRAM_BAR7 0x1b -#define XLP_BRIDGE_DRAM_LIMIT_REG(i) (0x5c + (i)) -#define XLP_BRIDGE_DRAM_LIMIT0_REG 0x5c -#define XLP_BRIDGE_DRAM_LIMIT1_REG 0x5d -#define XLP_BRIDGE_DRAM_LIMIT2_REG 0x5e -#define XLP_BRIDGE_DRAM_LIMIT3_REG 0x5f -#define XLP_BRIDGE_DRAM_LIMIT4_REG 0x60 -#define XLP_BRIDGE_DRAM_LIMIT5_REG 0x61 -#define XLP_BRIDGE_DRAM_LIMIT6_REG 0x62 -#define XLP_BRIDGE_DRAM_LIMIT7_REG 0x63 +#define BRIDGE_DRAM_LIMIT(i) (0x1c + (i)) +#define BRIDGE_DRAM_LIMIT0 0x1c +#define BRIDGE_DRAM_LIMIT1 0x1d +#define BRIDGE_DRAM_LIMIT2 0x1e +#define BRIDGE_DRAM_LIMIT3 0x1f +#define BRIDGE_DRAM_LIMIT4 0x20 +#define BRIDGE_DRAM_LIMIT5 0x21 +#define BRIDGE_DRAM_LIMIT6 0x22 +#define BRIDGE_DRAM_LIMIT7 0x23 -#define XLP_BRIDGE_DRAM_NODE_TRANSLN0_REG 0x64 -#define XLP_BRIDGE_DRAM_NODE_TRANSLN1_REG 0x65 -#define XLP_BRIDGE_DRAM_NODE_TRANSLN2_REG 0x66 -#define XLP_BRIDGE_DRAM_NODE_TRANSLN3_REG 0x67 -#define XLP_BRIDGE_DRAM_NODE_TRANSLN4_REG 0x68 -#define XLP_BRIDGE_DRAM_NODE_TRANSLN5_REG 0x69 -#define XLP_BRIDGE_DRAM_NODE_TRANSLN6_REG 0x6a -#define XLP_BRIDGE_DRAM_NODE_TRANSLN7_REG 0x6b -#define XLP_BRIDGE_DRAM_CHNL_TRANSLN0_REG 0x6c -#define XLP_BRIDGE_DRAM_CHNL_TRANSLN1_REG 0x6d -#define XLP_BRIDGE_DRAM_CHNL_TRANSLN2_REG 0x6e -#define XLP_BRIDGE_DRAM_CHNL_TRANSLN3_REG 0x6f -#define XLP_BRIDGE_DRAM_CHNL_TRANSLN4_REG 0x70 -#define XLP_BRIDGE_DRAM_CHNL_TRANSLN5_REG 0x71 -#define XLP_BRIDGE_DRAM_CHNL_TRANSLN6_REG 0x72 -#define XLP_BRIDGE_DRAM_CHNL_TRANSLN7_REG 0x73 -#define XLP_BRIDGE_PCIEMEM_BASE0_REG 0x74 -#define XLP_BRIDGE_PCIEMEM_BASE1_REG 0x75 -#define XLP_BRIDGE_PCIEMEM_BASE2_REG 0x76 -#define XLP_BRIDGE_PCIEMEM_BASE3_REG 0x77 -#define XLP_BRIDGE_PCIEMEM_LIMIT0_REG 0x78 -#define XLP_BRIDGE_PCIEMEM_LIMIT1_REG 0x79 -#define XLP_BRIDGE_PCIEMEM_LIMIT2_REG 0x7a -#define XLP_BRIDGE_PCIEMEM_LIMIT3_REG 0x7b -#define XLP_BRIDGE_PCIEIO_BASE0_REG 0x7c -#define XLP_BRIDGE_PCIEIO_BASE1_REG 0x7d -#define XLP_BRIDGE_PCIEIO_BASE2_REG 0x7e -#define XLP_BRIDGE_PCIEIO_BASE3_REG 0x7f -#define XLP_BRIDGE_PCIEIO_LIMIT0_REG 0x80 -#define XLP_BRIDGE_PCIEIO_LIMIT1_REG 0x81 -#define XLP_BRIDGE_PCIEIO_LIMIT2_REG 0x82 -#define XLP_BRIDGE_PCIEIO_LIMIT3_REG 0x83 -#define XLP_BRIDGE_PCIEMEM_BASE4_REG 0x84 -#define XLP_BRIDGE_PCIEMEM_BASE5_REG 0x85 -#define XLP_BRIDGE_PCIEMEM_BASE6_REG 0x86 -#define XLP_BRIDGE_PCIEMEM_LIMIT4_REG 0x87 -#define XLP_BRIDGE_PCIEMEM_LIMIT5_REG 0x88 -#define XLP_BRIDGE_PCIEMEM_LIMIT6_REG 0x89 -#define XLP_BRIDGE_PCIEIO_BASE4_REG 0x8a -#define XLP_BRIDGE_PCIEIO_BASE5_REG 0x8b -#define XLP_BRIDGE_PCIEIO_BASE6_REG 0x8c -#define XLP_BRIDGE_PCIEIO_LIMIT4_REG 0x8d -#define XLP_BRIDGE_PCIEIO_LIMIT5_REG 0x8e -#define XLP_BRIDGE_PCIEIO_LIMIT6_REG 0x8f -#define XLP_BRIDGE_NBU_EVENT_CNT_CTL_REG 0x90 -#define XLP_BRIDGE_EVNTCTR1_LOW_REG 0x91 -#define XLP_BRIDGE_EVNTCTR1_HI_REG 0x92 -#define XLP_BRIDGE_EVNT_CNT_CTL2_REG 0x93 -#define XLP_BRIDGE_EVNTCTR2_LOW_REG 0x94 -#define XLP_BRIDGE_EVNTCTR2_HI_REG 0x95 -#define XLP_BRIDGE_TRACEBUF_MATCH_REG0 0x96 -#define XLP_BRIDGE_TRACEBUF_MATCH_REG1 0x97 -#define XLP_BRIDGE_TRACEBUF_MATCH_LOW_REG 0x98 -#define XLP_BRIDGE_TRACEBUF_MATCH_HI_REG 0x99 -#define XLP_BRIDGE_TRACEBUF_CTRL_REG 0x9a -#define XLP_BRIDGE_TRACEBUF_INIT_REG 0x9b -#define XLP_BRIDGE_TRACEBUF_ACCESS_REG 0x9c -#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG0 0x9d -#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG1 0x9d -#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG2 0x9f -#define XLP_BRIDGE_TRACEBUF_READ_DATA_REG3 0xa0 -#define XLP_BRIDGE_TRACEBUF_STATUS_REG 0xa1 -#define XLP_BRIDGE_ADDRESS_ERROR0_REG 0xa2 -#define XLP_BRIDGE_ADDRESS_ERROR1_REG 0xa3 -#define XLP_BRIDGE_ADDRESS_ERROR2_REG 0xa4 -#define XLP_BRIDGE_TAG_ECC_ADDR_ERROR0_REG 0xa5 -#define XLP_BRIDGE_TAG_ECC_ADDR_ERROR1_REG 0xa6 -#define XLP_BRIDGE_TAG_ECC_ADDR_ERROR2_REG 0xa7 -#define XLP_BRIDGE_LINE_FLUSH_REG0 0xa8 -#define XLP_BRIDGE_LINE_FLUSH_REG1 0xa9 -#define XLP_BRIDGE_NODE_ID_REG 0xaa -#define XLP_BRIDGE_ERROR_INTERRUPT_EN_REG 0xab -#define XLP_BRIDGE_PCIE0_WEIGHT_REG 0x300 -#define XLP_BRIDGE_PCIE1_WEIGHT_REG 0x301 -#define XLP_BRIDGE_PCIE2_WEIGHT_REG 0x302 -#define XLP_BRIDGE_PCIE3_WEIGHT_REG 0x303 -#define XLP_BRIDGE_USB_WEIGHT_REG 0x304 -#define XLP_BRIDGE_NET_WEIGHT_REG 0x305 -#define XLP_BRIDGE_POE_WEIGHT_REG 0x306 -#define XLP_BRIDGE_CMS_WEIGHT_REG 0x307 -#define XLP_BRIDGE_DMAENG_WEIGHT_REG 0x308 -#define XLP_BRIDGE_SEC_WEIGHT_REG 0x309 -#define XLP_BRIDGE_COMP_WEIGHT_REG 0x30a -#define XLP_BRIDGE_GIO_WEIGHT_REG 0x30b -#define XLP_BRIDGE_FLASH_WEIGHT_REG 0x30c +#define BRIDGE_DRAM_NODE_TRANSLN0 0x24 +#define BRIDGE_DRAM_NODE_TRANSLN1 0x25 +#define BRIDGE_DRAM_NODE_TRANSLN2 0x26 +#define BRIDGE_DRAM_NODE_TRANSLN3 0x27 +#define BRIDGE_DRAM_NODE_TRANSLN4 0x28 +#define BRIDGE_DRAM_NODE_TRANSLN5 0x29 +#define BRIDGE_DRAM_NODE_TRANSLN6 0x2a +#define BRIDGE_DRAM_NODE_TRANSLN7 0x2b +#define BRIDGE_DRAM_CHNL_TRANSLN0 0x2c +#define BRIDGE_DRAM_CHNL_TRANSLN1 0x2d +#define BRIDGE_DRAM_CHNL_TRANSLN2 0x2e +#define BRIDGE_DRAM_CHNL_TRANSLN3 0x2f +#define BRIDGE_DRAM_CHNL_TRANSLN4 0x30 +#define BRIDGE_DRAM_CHNL_TRANSLN5 0x31 +#define BRIDGE_DRAM_CHNL_TRANSLN6 0x32 +#define BRIDGE_DRAM_CHNL_TRANSLN7 0x33 +#define BRIDGE_PCIEMEM_BASE0 0x34 +#define BRIDGE_PCIEMEM_BASE1 0x35 +#define BRIDGE_PCIEMEM_BASE2 0x36 +#define BRIDGE_PCIEMEM_BASE3 0x37 +#define BRIDGE_PCIEMEM_LIMIT0 0x38 +#define BRIDGE_PCIEMEM_LIMIT1 0x39 +#define BRIDGE_PCIEMEM_LIMIT2 0x3a +#define BRIDGE_PCIEMEM_LIMIT3 0x3b +#define BRIDGE_PCIEIO_BASE0 0x3c +#define BRIDGE_PCIEIO_BASE1 0x3d +#define BRIDGE_PCIEIO_BASE2 0x3e +#define BRIDGE_PCIEIO_BASE3 0x3f +#define BRIDGE_PCIEIO_LIMIT0 0x40 +#define BRIDGE_PCIEIO_LIMIT1 0x41 +#define BRIDGE_PCIEIO_LIMIT2 0x42 +#define BRIDGE_PCIEIO_LIMIT3 0x43 +#define BRIDGE_PCIEMEM_BASE4 0x44 +#define BRIDGE_PCIEMEM_BASE5 0x45 +#define BRIDGE_PCIEMEM_BASE6 0x46 +#define BRIDGE_PCIEMEM_LIMIT4 0x47 +#define BRIDGE_PCIEMEM_LIMIT5 0x48 +#define BRIDGE_PCIEMEM_LIMIT6 0x49 +#define BRIDGE_PCIEIO_BASE4 0x4a +#define BRIDGE_PCIEIO_BASE5 0x4b +#define BRIDGE_PCIEIO_BASE6 0x4c +#define BRIDGE_PCIEIO_LIMIT4 0x4d +#define BRIDGE_PCIEIO_LIMIT5 0x4e +#define BRIDGE_PCIEIO_LIMIT6 0x4f +#define BRIDGE_NBU_EVENT_CNT_CTL 0x50 +#define BRIDGE_EVNTCTR1_LOW 0x51 +#define BRIDGE_EVNTCTR1_HI 0x52 +#define BRIDGE_EVNT_CNT_CTL2 0x53 +#define BRIDGE_EVNTCTR2_LOW 0x54 +#define BRIDGE_EVNTCTR2_HI 0x55 +#define BRIDGE_TRACEBUF_MATCH0 0x56 +#define BRIDGE_TRACEBUF_MATCH1 0x57 +#define BRIDGE_TRACEBUF_MATCH_LOW 0x58 +#define BRIDGE_TRACEBUF_MATCH_HI 0x59 +#define BRIDGE_TRACEBUF_CTRL 0x5a +#define BRIDGE_TRACEBUF_INIT 0x5b +#define BRIDGE_TRACEBUF_ACCESS 0x5c +#define BRIDGE_TRACEBUF_READ_DATA0 0x5d +#define BRIDGE_TRACEBUF_READ_DATA1 0x5d +#define BRIDGE_TRACEBUF_READ_DATA2 0x5f +#define BRIDGE_TRACEBUF_READ_DATA3 0x60 +#define BRIDGE_TRACEBUF_STATUS 0x61 +#define BRIDGE_ADDRESS_ERROR0 0x62 +#define BRIDGE_ADDRESS_ERROR1 0x63 +#define BRIDGE_ADDRESS_ERROR2 0x64 +#define BRIDGE_TAG_ECC_ADDR_ERROR0 0x65 +#define BRIDGE_TAG_ECC_ADDR_ERROR1 0x66 +#define BRIDGE_TAG_ECC_ADDR_ERROR2 0x67 +#define BRIDGE_LINE_FLUSH0 0x68 +#define BRIDGE_LINE_FLUSH1 0x69 +#define BRIDGE_NODE_ID 0x6a +#define BRIDGE_ERROR_INTERRUPT_EN 0x6b +#define BRIDGE_PCIE0_WEIGHT 0x2c0 +#define BRIDGE_PCIE1_WEIGHT 0x2c1 +#define BRIDGE_PCIE2_WEIGHT 0x2c2 +#define BRIDGE_PCIE3_WEIGHT 0x2c3 +#define BRIDGE_USB_WEIGHT 0x2c4 +#define BRIDGE_NET_WEIGHT 0x2c5 +#define BRIDGE_POE_WEIGHT 0x2c6 +#define BRIDGE_CMS_WEIGHT 0x2c7 +#define BRIDGE_DMAENG_WEIGHT 0x2c8 +#define BRIDGE_SEC_WEIGHT 0x2c9 +#define BRIDGE_COMP_WEIGHT 0x2ca +#define BRIDGE_GIO_WEIGHT 0x2cb +#define BRIDGE_FLASH_WEIGHT 0x2cc #if !defined(LOCORE) && !defined(__ASSEMBLY__) -#define nlm_rdreg_bridge(b, r) nlm_read_reg_kseg(b, r) -#define nlm_wreg_bridge(b, r, v) nlm_write_reg_kseg(b, r, v) -#define nlm_pcibase_bridge(node) nlm_pcicfg_base(XLP_IO_BRIDGE_OFFSET(node)) -#define nlm_regbase_bridge(node) nlm_pcibase_bridge(node) +#define nlm_read_bridge_reg(b, r) nlm_read_reg(b, r) +#define nlm_write_bridge_reg(b, r, v) nlm_write_reg(b, r, v) +#define nlm_get_bridge_pcibase(node) \ + nlm_pcicfg_base(XLP_IO_BRIDGE_OFFSET(node)) +#define nlm_get_bridge_regbase(node) \ + (nlm_get_bridge_pcibase(node) + XLP_IO_PCI_HDRSZ) #endif - #endif diff --git a/sys/mips/nlm/hal/cop0.h b/sys/mips/nlm/hal/cop0.h deleted file mode 100644 index 18ecc97dfe9..00000000000 --- a/sys/mips/nlm/hal/cop0.h +++ /dev/null @@ -1,280 +0,0 @@ -/*- - * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - * NETLOGIC_BSD */ - -#ifndef __NLM_COP0_H__ -#define __NLM_COP0_H__ - -#define NLM_C0_INDEX 0 -#define NLM_C0_RANDOM 1 -#define NLM_C0_ENTRYLO0 2 -#define NLM_C0_ENTRYLO1 3 -#define NLM_C0_CONTEXT 4 -#define NLM_C0_USERLOCAL 4 -#define NLM_C0_PAGEMASK 5 -#define NLM_C0_WIRED 6 -#define NLM_C0_BADVADDR 8 -#define NLM_C0_COUNT 9 -#define NLM_C0_EIRR 9 -#define NLM_C0_EIMR 9 -#define NLM_C0_ENTRYHI 10 -#define NLM_C0_COMPARE 11 -#define NLM_C0_STATUS 12 -#define NLM_C0_INTCTL 12 -#define NLM_C0_SRSCTL 12 -#define NLM_C0_CAUSE 13 -#define NLM_C0_EPC 14 -#define NLM_C0_PRID 15 -#define NLM_C0_EBASE 15 -#define NLM_C0_CONFIG 16 -#define NLM_C0_CONFIG0 16 -#define NLM_C0_CONFIG1 16 -#define NLM_C0_CONFIG2 16 -#define NLM_C0_CONFIG3 16 -#define NLM_C0_CONFIG4 16 -#define NLM_C0_CONFIG5 16 -#define NLM_C0_CONFIG6 16 -#define NLM_C0_CONFIG7 16 -#define NLM_C0_WATCHLO 18 -#define NLM_C0_WATCHHI 19 -#define NLM_C0_XCONTEXT 20 -#define NLM_C0_SCRATCH 22 -#define NLM_C0_SCRATCH0 22 -#define NLM_C0_SCRATCH1 22 -#define NLM_C0_SCRATCH2 22 -#define NLM_C0_SCRATCH3 22 -#define NLM_C0_SCRATCH4 22 -#define NLM_C0_SCRATCH5 22 -#define NLM_C0_SCRATCH6 22 -#define NLM_C0_SCRATCH7 22 -#define NLM_C0_DEBUG 23 -#define NLM_C0_DEPC 24 -#define NLM_C0_PERFCNT 25 -#define NLM_C0_PERFCNT0 25 -#define NLM_C0_PERFCNT1 25 -#define NLM_C0_TAGLO 28 -#define NLM_C0_DATALO 28 -#define NLM_C0_TAGHI 29 -#define NLM_C0_DATAHI 29 -#define NLM_C0_ERROREPC 30 -#define NLM_C0_DESAVE 31 - -/* cop0 status bits */ -#define NLM_STATUS_CP0_EN (1<<28) -#define NLM_STATUS_CP1_EN (1<<29) -#define NLM_STATUS_CP2_EN (1<<30) -#define NLM_STATUS_KX_EN (1<<7) -#define NLM_STATUS_UX_EN (1<<5) - -#ifndef LOCORE - -#define nlm_memory_barrier() \ - __asm__ __volatile__( \ - ".set push\n\t" \ - ".set noreorder\n\t" \ - " sync\n\t" \ - ".set pop" \ - ::: "memory") - -#define NLM_DEFINE_ACCESSORS32(name, reg, sel) \ -static __inline__ uint32_t nlm_read_c0_##name(void) \ -{ \ - uint32_t __rv; \ - __asm__ __volatile__ ( \ - ".set push\n" \ - ".set noreorder\n" \ - ".set mips64\n" \ - "mfc0 %0, $%1, %2\n" \ - ".set pop\n" \ - : "=r" (__rv) \ - : "i" (reg), "i" (sel) \ - ); \ - return __rv; \ -} \ - \ -static __inline__ void nlm_write_c0_##name(uint32_t val) \ -{ \ - __asm__ __volatile__( \ - ".set push\n" \ - ".set noreorder\n" \ - ".set mips64\n" \ - "mtc0 %0, $%1, %2\n" \ - ".set pop\n" \ - :: "r" (val), "i" (reg), "i" (sel) \ - ); \ -} struct __hack - -/* struct __hack above swallows a semicolon - otherwise the macro - * usage below cannot have the terminating semicolon */ -#if (__mips == 64) -#define NLM_DEFINE_ACCESSORS64(name, reg, sel) \ -static __inline__ uint64_t nlm_read_c0_##name(void) \ -{ \ - uint64_t __rv; \ - __asm__ __volatile__ ( \ - ".set push\n" \ - ".set noreorder\n" \ - ".set mips64\n" \ - "dmfc0 %0,$%1,%2\n" \ - ".set pop\n" \ - : "=r" (__rv) \ - : "i" (reg), "i" (sel) ); \ - return __rv; \ -} \ - \ -static __inline__ void nlm_write_c0_##name(uint64_t val) \ -{ \ - __asm__ __volatile__ ( \ - ".set push\n" \ - ".set noreorder\n" \ - ".set mips64\n" \ - "dmtc0 %0,$%1,%2\n" \ - ".set pop\n" \ - :: "r" (val), "i" (reg), "i" (sel) ); \ -} struct __hack - -#else - -#define NLM_DEFINE_ACCESSORS64(name, reg, sel) \ -static __inline__ uint64_t nlm_read_c0_##name(void) \ -{ \ - uint32_t __high, __low; \ - __asm__ __volatile__ ( \ - ".set push\n" \ - ".set noreorder\n" \ - ".set mips64\n" \ - "dmfc0 $8, $%2, %3\n" \ - "dsra32 %0, $8, 0\n" \ - "sll %1, $8, 0\n" \ - ".set pop\n" \ - : "=r"(__high), "=r"(__low) \ - : "i"(reg), "i"(sel) \ - : "$8" ); \ - \ - return (((uint64_t)__high << 32) | __low); \ -} \ - \ -static __inline__ void nlm_write_c0_##name(uint64_t val) \ -{ \ - uint32_t __high = val >> 32; \ - uint32_t __low = val & 0xffffffff; \ - __asm__ __volatile__ ( \ - ".set push\n" \ - ".set noreorder\n" \ - ".set mips64\n" \ - "dsll32 $8, %1, 0\n" \ - "dsll32 $9, %0, 0\n" \ - "dsrl32 $8, $8, 0\n" \ - "or $8, $8, $9\n" \ - "dmtc0 $8, $%2, %3\n" \ - ".set pop\n" \ - :: "r"(__high), "r"(__low), "i"(reg), "i"(sel) \ - : "$8", "$9"); \ -} struct __hack - -#endif - -NLM_DEFINE_ACCESSORS32(index, 0, 0); -NLM_DEFINE_ACCESSORS32(random, 1, 0); -NLM_DEFINE_ACCESSORS64(entrylo0, 2, 0); -NLM_DEFINE_ACCESSORS64(entrylo1, 3, 0); -NLM_DEFINE_ACCESSORS64(context, 4, 0); -NLM_DEFINE_ACCESSORS64(userlocal, 4, 0); -NLM_DEFINE_ACCESSORS32(pagemask, 5, 0); -NLM_DEFINE_ACCESSORS32(wired, 6, 0); -NLM_DEFINE_ACCESSORS64(badvaddr, 8, 0); -NLM_DEFINE_ACCESSORS32(count, 9, 0); -NLM_DEFINE_ACCESSORS64(eirr, 9, 6); -NLM_DEFINE_ACCESSORS64(eimr, 9, 7); -NLM_DEFINE_ACCESSORS64(entryhi, 10, 0); -NLM_DEFINE_ACCESSORS32(compare, 11, 0); -NLM_DEFINE_ACCESSORS32(status, 12, 0); -NLM_DEFINE_ACCESSORS32(intctl, 12, 1); -NLM_DEFINE_ACCESSORS32(srsctl, 12, 2); -NLM_DEFINE_ACCESSORS32(cause, 13, 0); -NLM_DEFINE_ACCESSORS64(epc, 14, 0); -NLM_DEFINE_ACCESSORS32(prid, 15, 0); -NLM_DEFINE_ACCESSORS32(ebase, 15, 1); -NLM_DEFINE_ACCESSORS32(config0, 16, 0); -NLM_DEFINE_ACCESSORS32(config1, 16, 1); -NLM_DEFINE_ACCESSORS32(config2, 16, 2); -NLM_DEFINE_ACCESSORS32(config3, 16, 3); -NLM_DEFINE_ACCESSORS32(config6, 16, 6); -NLM_DEFINE_ACCESSORS32(config7, 16, 7); -NLM_DEFINE_ACCESSORS64(watchlo0, 18, 0); -NLM_DEFINE_ACCESSORS32(watchhi0, 19, 0); -NLM_DEFINE_ACCESSORS64(xcontext, 20, 0); -NLM_DEFINE_ACCESSORS64(scratch0, 22, 0); -NLM_DEFINE_ACCESSORS64(scratch1, 22, 1); -NLM_DEFINE_ACCESSORS64(scratch2, 22, 2); -NLM_DEFINE_ACCESSORS64(scratch3, 22, 3); -NLM_DEFINE_ACCESSORS64(scratch4, 22, 4); -NLM_DEFINE_ACCESSORS64(scratch5, 22, 5); -NLM_DEFINE_ACCESSORS64(scratch6, 22, 6); -NLM_DEFINE_ACCESSORS64(scratch7, 22, 7); -NLM_DEFINE_ACCESSORS32(debug, 23, 0); -NLM_DEFINE_ACCESSORS32(depc, 24, 0); -NLM_DEFINE_ACCESSORS32(perfctrl0, 25, 0); -NLM_DEFINE_ACCESSORS64(perfcntr0, 25, 1); -NLM_DEFINE_ACCESSORS32(perfctrl1, 25, 2); -NLM_DEFINE_ACCESSORS64(perfcntr1, 25, 3); -NLM_DEFINE_ACCESSORS32(perfctrl2, 25, 4); -NLM_DEFINE_ACCESSORS64(perfcntr2, 25, 5); -NLM_DEFINE_ACCESSORS32(perfctrl3, 25, 6); -NLM_DEFINE_ACCESSORS64(perfcntr3, 25, 7); -NLM_DEFINE_ACCESSORS64(taglo0, 28, 0); -NLM_DEFINE_ACCESSORS64(taglo2, 28, 2); -NLM_DEFINE_ACCESSORS64(taghi0, 29, 0); -NLM_DEFINE_ACCESSORS64(taghi2, 29, 2); -NLM_DEFINE_ACCESSORS64(errorepc, 30, 0); -NLM_DEFINE_ACCESSORS64(desave, 31, 0); - -static __inline__ int nlm_nodeid(void) -{ - return (nlm_read_c0_ebase() >> 5) & 0x3; -} - -static __inline__ int nlm_cpuid(void) -{ - return nlm_read_c0_ebase() & 0x1f; -} - -static __inline__ int nlm_threadid(void) -{ - return nlm_read_c0_ebase() & 0x3; -} - -static __inline__ int nlm_coreid(void) -{ - return (nlm_read_c0_ebase() >> 2) & 0x7; -} - -#endif - -#endif diff --git a/sys/mips/nlm/hal/cop2.h b/sys/mips/nlm/hal/cop2.h index 062cd9df44a..6b79d3fd68f 100644 --- a/sys/mips/nlm/hal/cop2.h +++ b/sys/mips/nlm/hal/cop2.h @@ -25,27 +25,28 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ -#ifndef __NLM_COP2_H__ -#define __NLM_COP2_H__ +#ifndef __NLM_HAL_COP2_H__ +#define __NLM_HAL_COP2_H__ -#define XLP_COP2_TX_BUF_REG 0 -#define XLP_COP2_RX_BUF_REG 1 -#define XLP_COP2_TXMSGSTATUS_REG 2 -#define XLP_COP2_RXMSGSTATUS_REG 3 -#define XLP_COP2_MSGSTATUS1_REG 4 -#define XLP_COP2_MSGCONFIG_REG 5 -#define XLP_COP2_MSGCONFIG1_REG 6 +#define COP2_TX_BUF 0 +#define COP2_RX_BUF 1 +#define COP2_TXMSGSTATUS 2 +#define COP2_RXMSGSTATUS 3 +#define COP2_MSGSTATUS1 4 +#define COP2_MSGCONFIG 5 +#define COP2_MSGCONFIG1 6 -#define CROSSTHR_POPQ_EN 0x01 -#define VC0_POPQ_EN 0x02 -#define VC1_POPQ_EN 0x04 -#define VC2_POPQ_EN 0x08 -#define VC3_POPQ_EN 0x10 -#define ALL_VC_POPQ_EN 0x1E -#define ALL_VC_CT_POPQ_EN 0x1F +#define CROSSTHR_POPQ_EN 0x01 +#define VC0_POPQ_EN 0x02 +#define VC1_POPQ_EN 0x04 +#define VC2_POPQ_EN 0x08 +#define VC3_POPQ_EN 0x10 +#define ALL_VC_POPQ_EN 0x1E +#define ALL_VC_CT_POPQ_EN 0x1F struct nlm_fmn_msg { uint64_t msg[4]; @@ -62,8 +63,7 @@ static inline uint32_t nlm_read_c2_##name(void) \ "mfc2 %0, $%1, %2\n" \ ".set pop\n" \ : "=r" (__rv) \ - : "i" (reg), "i" (sel) \ - ); \ + : "i" (reg), "i" (sel)); \ return __rv; \ } \ \ @@ -75,8 +75,7 @@ static inline void nlm_write_c2_##name(uint32_t val) \ ".set mips64\n" \ "mtc2 %0, $%1, %2\n" \ ".set pop\n" \ - :: "r" (val), "i" (reg), "i" (sel) \ - ); \ + : : "r" (val), "i" (reg), "i" (sel)); \ } struct __hack #if (__mips == 64) @@ -91,7 +90,7 @@ static inline uint64_t nlm_read_c2_##name(void) \ "dmfc2 %0, $%1, %2\n" \ ".set pop\n" \ : "=r" (__rv) \ - : "i" (reg), "i" (sel) ); \ + : "i" (reg), "i" (sel)); \ return __rv; \ } \ \ @@ -103,7 +102,7 @@ static inline void nlm_write_c2_##name(uint64_t val) \ ".set mips64\n" \ "dmtc2 %0, $%1, %2\n" \ ".set pop\n" \ - :: "r" (val), "i" (reg), "i" (sel) ); \ + : : "r" (val), "i" (reg), "i" (sel)); \ } struct __hack #else @@ -122,15 +121,15 @@ static inline uint64_t nlm_read_c2_##name(void) \ ".set pop\n" \ : "=r"(__high), "=r"(__low) \ : "i"(reg), "i"(sel) \ - : "$8" ); \ + : "$8"); \ \ - return (((uint64_t)__high << 32) | __low); \ + return ((uint64_t)__high << 32) | __low; \ } \ \ static inline void nlm_write_c2_##name(uint64_t val) \ { \ - uint32_t __high = val >> 32; \ - uint32_t __low = val & 0xffffffff; \ + uint32_t __high = val >> 32; \ + uint32_t __low = val & 0xffffffff; \ __asm__ __volatile__ ( \ ".set push\n" \ ".set noreorder\n" \ @@ -141,113 +140,100 @@ static inline void nlm_write_c2_##name(uint64_t val) \ "or $8, $8, $9\n" \ "dmtc2 $8, $%2, %3\n" \ ".set pop\n" \ - :: "r"(__high), "r"(__low), "i"(reg), "i"(sel) \ - :"$8", "$9"); \ + : : "r"(__high), "r"(__low), "i"(reg), "i"(sel) \ + : "$8", "$9"); \ } struct __hack #endif -NLM_DEFINE_COP2_ACCESSORS64(txbuf0, XLP_COP2_TX_BUF_REG, 0); -NLM_DEFINE_COP2_ACCESSORS64(txbuf1, XLP_COP2_TX_BUF_REG, 1); -NLM_DEFINE_COP2_ACCESSORS64(txbuf2, XLP_COP2_TX_BUF_REG, 2); -NLM_DEFINE_COP2_ACCESSORS64(txbuf3, XLP_COP2_TX_BUF_REG, 3); +NLM_DEFINE_COP2_ACCESSORS64(txbuf0, COP2_TX_BUF, 0); +NLM_DEFINE_COP2_ACCESSORS64(txbuf1, COP2_TX_BUF, 1); +NLM_DEFINE_COP2_ACCESSORS64(txbuf2, COP2_TX_BUF, 2); +NLM_DEFINE_COP2_ACCESSORS64(txbuf3, COP2_TX_BUF, 3); -NLM_DEFINE_COP2_ACCESSORS64(rxbuf0, XLP_COP2_RX_BUF_REG, 0); -NLM_DEFINE_COP2_ACCESSORS64(rxbuf1, XLP_COP2_RX_BUF_REG, 1); -NLM_DEFINE_COP2_ACCESSORS64(rxbuf2, XLP_COP2_RX_BUF_REG, 2); -NLM_DEFINE_COP2_ACCESSORS64(rxbuf3, XLP_COP2_RX_BUF_REG, 3); +NLM_DEFINE_COP2_ACCESSORS64(rxbuf0, COP2_RX_BUF, 0); +NLM_DEFINE_COP2_ACCESSORS64(rxbuf1, COP2_RX_BUF, 1); +NLM_DEFINE_COP2_ACCESSORS64(rxbuf2, COP2_RX_BUF, 2); +NLM_DEFINE_COP2_ACCESSORS64(rxbuf3, COP2_RX_BUF, 3); -NLM_DEFINE_COP2_ACCESSORS32(txmsgstatus, XLP_COP2_TXMSGSTATUS_REG, 0); -NLM_DEFINE_COP2_ACCESSORS32(rxmsgstatus, XLP_COP2_RXMSGSTATUS_REG, 0); -NLM_DEFINE_COP2_ACCESSORS32(msgstatus1, XLP_COP2_MSGSTATUS1_REG, 0); -NLM_DEFINE_COP2_ACCESSORS32(msgconfig, XLP_COP2_MSGCONFIG_REG, 0); -NLM_DEFINE_COP2_ACCESSORS32(msgconfig1, XLP_COP2_MSGCONFIG1_REG, 0); +NLM_DEFINE_COP2_ACCESSORS32(txmsgstatus, COP2_TXMSGSTATUS, 0); +NLM_DEFINE_COP2_ACCESSORS32(rxmsgstatus, COP2_RXMSGSTATUS, 0); +NLM_DEFINE_COP2_ACCESSORS32(msgstatus1, COP2_MSGSTATUS1, 0); +NLM_DEFINE_COP2_ACCESSORS32(msgconfig, COP2_MSGCONFIG, 0); +NLM_DEFINE_COP2_ACCESSORS32(msgconfig1, COP2_MSGCONFIG1, 0); /* successful completion returns 1, else 0 */ -static __inline__ int nlm_msgsend(int val) +static inline int +nlm_msgsend(int val) { int result; __asm__ volatile ( - ".set push \n" - ".set noreorder \n" - ".set mips64 \n" - "move $8, %1 \n" - "sync \n" - "/* msgsnds $9, $8 */ \n" - ".word 0x4a084801 \n" - "move %0, $9 \n" - ".set pop \n" + ".set push\n" + ".set noreorder\n" + ".set mips64\n" + "move $8, %1\n" + "sync\n" + "/* msgsnds $9, $8 */\n" + ".word 0x4a084801\n" + "move %0, $9\n" + ".set pop\n" : "=r" (result) : "r" (val) - : "$8", "$9" - ); + : "$8", "$9"); return result; } -static __inline__ int nlm_msgld(int vc) +static inline int +nlm_msgld(int vc) { int val; __asm__ volatile ( - ".set push \n" - ".set noreorder \n" - ".set mips64 \n" - "move $8, %1 \n" - "/* msgld $9, $8 */ \n" - ".word 0x4a084802 \n" - "move %0, $9 \n" - ".set pop \n" + ".set push\n" + ".set noreorder\n" + ".set mips64\n" + "move $8, %1\n" + "/* msgld $9, $8 */\n" + ".word 0x4a084802\n" + "move %0, $9\n" + ".set pop\n" : "=r" (val) : "r" (vc) - : "$8", "$9" - ); + : "$8", "$9"); return val; } -static __inline__ void nlm_msgwait(int vc) +static inline void +nlm_msgwait(int vc) { __asm__ volatile ( - ".set push \n" - ".set noreorder \n" - ".set mips64 \n" - "move $8, %0 \n" - "/* msgwait $8 */ \n" - ".word 0x4a080003 \n" - ".set pop \n" - :: "r" (vc) - : "$8" - ); + ".set push\n" + ".set noreorder\n" + ".set mips64\n" + "move $8, %0\n" + "/* msgwait $8 */\n" + ".word 0x4a080003\n" + ".set pop\n" + : : "r" (vc) + : "$8"); } -/* TODO this is not needed in n32 and n64 */ -static __inline uint32_t -nlm_fmn_saveflags(void) -{ - uint32_t sr = mips_rd_status(); - - mips_wr_status((sr & ~MIPS_SR_INT_IE) | MIPS_SR_COP_2_BIT); - return (sr); -} - -static __inline void -nlm_fmn_restoreflags(uint32_t sr) -{ - - mips_wr_status(sr); -} - -static __inline__ int nlm_fmn_msgsend(int dstid, int size, int swcode, - struct nlm_fmn_msg *m) +static inline int +nlm_fmn_msgsend(int dstid, int size, int swcode, struct nlm_fmn_msg *m) { uint32_t flags, status; int rv; size -= 1; - flags = nlm_fmn_saveflags(); - switch(size) { - case 3: nlm_write_c2_txbuf3(m->msg[3]); - case 2: nlm_write_c2_txbuf2(m->msg[2]); - case 1: nlm_write_c2_txbuf1(m->msg[1]); - case 0: nlm_write_c2_txbuf0(m->msg[0]); + flags = nlm_save_flags_cop2(); + switch (size) { + case 3: + nlm_write_c2_txbuf3(m->msg[3]); + case 2: + nlm_write_c2_txbuf2(m->msg[2]); + case 1: + nlm_write_c2_txbuf1(m->msg[1]); + case 0: + nlm_write_c2_txbuf0(m->msg[0]); } dstid |= ((swcode << 24) | (size << 16)); @@ -255,19 +241,19 @@ static __inline__ int nlm_fmn_msgsend(int dstid, int size, int swcode, rv = !status; if (rv != 0) rv = nlm_read_c2_txmsgstatus(); - nlm_fmn_restoreflags(flags); + nlm_restore_flags(flags); - return (rv); + return rv; } -static __inline__ int nlm_fmn_msgrcv(int vc, int *srcid, int *size, int *code, - struct nlm_fmn_msg *m) +static inline int +nlm_fmn_msgrcv(int vc, int *srcid, int *size, int *code, struct nlm_fmn_msg *m) { uint32_t status; uint32_t msg_status, flags; int tmp_sz, rv; - flags = nlm_fmn_saveflags(); + flags = nlm_save_flags_cop2(); status = nlm_msgld(vc); /* will return 0, if error */ rv = !status; if (rv == 0) { @@ -276,38 +262,24 @@ static __inline__ int nlm_fmn_msgrcv(int vc, int *srcid, int *size, int *code, *code = (msg_status >> 18) & 0xff; *srcid = (msg_status >> 4) & 0xfff; tmp_sz = *size - 1; - switch(tmp_sz) { - case 3: m->msg[3] = nlm_read_c2_rxbuf3(); - case 2: m->msg[2] = nlm_read_c2_rxbuf2(); - case 1: m->msg[1] = nlm_read_c2_rxbuf1(); - case 0: m->msg[0] = nlm_read_c2_rxbuf0(); + switch (tmp_sz) { + case 3: + m->msg[3] = nlm_read_c2_rxbuf3(); + case 2: + m->msg[2] = nlm_read_c2_rxbuf2(); + case 1: + m->msg[1] = nlm_read_c2_rxbuf1(); + case 0: + m->msg[0] = nlm_read_c2_rxbuf0(); } } - nlm_fmn_restoreflags(flags); + nlm_restore_flags(flags); return rv; } -/** - * nlm_fmn_cpu_init() initializes the per-h/w thread cop2 w.r.t the following - * configuration parameters. It needs to be individually setup on each - * hardware thread. - * - * int_vec - interrupt vector getting placed into msgconfig reg - * ctpe - cross thread message pop enable. When set to 1, the thread (h/w cpu) - * associated where this cop2 register is setup, can pop messages - * intended for any other thread in the same core. - * v0pe - VC0 pop message request mode enable. When set to 1, the thread - * can send pop requests to vc0. - * v1pe - VC1 pop message request mode enable. When set to 1, the thread - * can send pop requests to vc1. - * v2pe - VC2 pop message request mode enable. When set to 1, the thread - * can send pop requests to vc2. - * v3pe - VC3 pop message request mode enable. When set to 1, the thread - * can send pop requests to vc3. - */ -static __inline__ void nlm_fmn_cpu_init(int int_vec, int ctpe, int v0pe, - int v1pe, int v2pe, int v3pe) +static inline void +nlm_fmn_cpu_init(int int_vec, int ctpe, int v0pe, int v1pe, int v2pe, int v3pe) { uint32_t val = nlm_read_c2_msgconfig(); diff --git a/sys/mips/nlm/hal/cpucontrol.h b/sys/mips/nlm/hal/cpucontrol.h index 0bc0f5be7bb..715cd535f5d 100644 --- a/sys/mips/nlm/hal/cpucontrol.h +++ b/sys/mips/nlm/hal/cpucontrol.h @@ -25,46 +25,168 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ -#ifndef __NLM_CPUCONTROL_H__ -#define __NLM_CPUCONTROL_H__ +#ifndef __NLM_HAL_CPUCONTROL_H__ +#define __NLM_HAL_CPUCONTROL_H__ -#define XLP_CPU_BLOCKID_IFU 0 -#define XLP_CPU_BLOCKID_ICU 1 +#define CPU_BLOCKID_IFU 0 +#define CPU_BLOCKID_ICU 1 +#define CPU_BLOCKID_IEU 2 +#define CPU_BLOCKID_LSU 3 +#define CPU_BLOCKID_MMU 4 +#define CPU_BLOCKID_PRF 5 +#define CPU_BLOCKID_SCH 7 +#define CPU_BLOCKID_SCU 8 +#define CPU_BLOCKID_FPU 9 +#define CPU_BLOCKID_MAP 10 -#define XLP_CPU_BLOCKID_IEU 2 -#define XLP_CPU_BLOCKID_LSU 3 -#define XLP_LSU_DEFEATURE 0x304 -#define XLP_LSU_CERRLOG_REGID 0x09 - -#define XLP_CPU_BLOCKID_MMU 4 -#define XLP_CPU_BLOCKID_PRF 5 - -#define XLP_CPU_BLOCKID_SCH 7 -#define XLP_SCHED_DEFEATURE 0x700 - -#define XLP_CPU_BLOCKID_SCU 8 -#define XLP_CPU_BLOCKID_FPU 9 - -#define XLP_CPU_BLOCKID_MAP 10 +#define LSU_DEFEATURE 0x304 +#define LSU_CERRLOG_REGID 0x09 +#define SCHED_DEFEATURE 0x700 /* Offsets of interest from the 'MAP' Block */ -#define XLP_BLKID_MAP_THREADMODE 0x00 -#define XLP_BLKID_MAP_EXT_EBASE_ENABLE 0x04 -#define XLP_BLKID_MAP_CCDI_CONFIG 0x08 -#define XLP_BLKID_MAP_THRD0_CCDI_STATUS 0x0c -#define XLP_BLKID_MAP_THRD1_CCDI_STATUS 0x10 -#define XLP_BLKID_MAP_THRD2_CCDI_STATUS 0x14 -#define XLP_BLKID_MAP_THRD3_CCDI_STATUS 0x18 -#define XLP_BLKID_MAP_THRD0_DEBUG_MODE 0x1c -#define XLP_BLKID_MAP_THRD1_DEBUG_MODE 0x20 -#define XLP_BLKID_MAP_THRD2_DEBUG_MODE 0x24 -#define XLP_BLKID_MAP_THRD3_DEBUG_MODE 0x28 -#define XLP_BLKID_MAP_MISC_STATE 0x60 -#define XLP_BLKID_MAP_DEBUG_READ_CTL 0x64 -#define XLP_BLKID_MAP_DEBUG_READ_REG0 0x68 -#define XLP_BLKID_MAP_DEBUG_READ_REG1 0x6c +#define MAP_THREADMODE 0x00 +#define MAP_EXT_EBASE_ENABLE 0x04 +#define MAP_CCDI_CONFIG 0x08 +#define MAP_THRD0_CCDI_STATUS 0x0c +#define MAP_THRD1_CCDI_STATUS 0x10 +#define MAP_THRD2_CCDI_STATUS 0x14 +#define MAP_THRD3_CCDI_STATUS 0x18 +#define MAP_THRD0_DEBUG_MODE 0x1c +#define MAP_THRD1_DEBUG_MODE 0x20 +#define MAP_THRD2_DEBUG_MODE 0x24 +#define MAP_THRD3_DEBUG_MODE 0x28 +#define MAP_MISC_STATE 0x60 +#define MAP_DEBUG_READ_CTL 0x64 +#define MAP_DEBUG_READ_REG0 0x68 +#define MAP_DEBUG_READ_REG1 0x6c +#define MMU_SETUP 0x400 +#define MMU_LFSRSEED 0x401 +#define MMU_HPW_NUM_PAGE_LVL 0x410 +#define MMU_PGWKR_PGDBASE 0x411 +#define MMU_PGWKR_PGDSHFT 0x412 +#define MMU_PGWKR_PGDMASK 0x413 +#define MMU_PGWKR_PUDSHFT 0x414 +#define MMU_PGWKR_PUDMASK 0x415 +#define MMU_PGWKR_PMDSHFT 0x416 +#define MMU_PGWKR_PMDMASK 0x417 +#define MMU_PGWKR_PTESHFT 0x418 +#define MMU_PGWKR_PTEMASK 0x419 + + +#if !defined(LOCORE) && !defined(__ASSEMBLY__) +#if defined(__mips_n64) || defined(__mips_n32) +static __inline uint64_t +nlm_mfcr(uint32_t reg) +{ + uint64_t res; + + __asm__ __volatile__( + ".set push\n\t" + ".set noreorder\n\t" + "move $9, %1\n\t" + ".word 0x71280018\n\t" /* mfcr $8, $9 */ + "move %0, $8\n\t" + ".set pop\n" + : "=r" (res) : "r"(reg) + : "$8", "$9" + ); + return (res); +} + +static __inline void +nlm_mtcr(uint32_t reg, uint64_t value) +{ + __asm__ __volatile__( + ".set push\n\t" + ".set noreorder\n\t" + "move $8, %0\n" + "move $9, %1\n" + ".word 0x71280019\n" /* mtcr $8, $9 */ + ".set pop\n" + : + : "r" (value), "r" (reg) + : "$8", "$9" + ); +} + +#else /* !(defined(__mips_n64) || defined(__mips_n32)) */ + +static __inline__ uint64_t +nlm_mfcr(uint32_t reg) +{ + uint32_t hi, lo; + + __asm__ __volatile__ ( + ".set push\n" + ".set mips64\n" + "move $8, %2\n" + ".word 0x71090018\n" + "nop \n" + "dsra32 %0, $9, 0\n" + "sll %1, $9, 0\n" + ".set pop\n" + : "=r"(hi), "=r"(lo) + : "r"(reg) : "$8", "$9"); + + return (((uint64_t)hi) << 32) | lo; +} + +static __inline__ void +nlm_mtcr(uint32_t reg, uint64_t val) +{ + uint32_t hi, lo; + + hi = val >> 32; + lo = val & 0xffffffff; + + __asm__ __volatile__ ( + ".set push\n" + ".set mips64\n" + "move $9, %0\n" + "dsll32 $9, %1, 0\n" + "dsll32 $8, %0, 0\n" + "dsrl32 $9, $9, 0\n" + "or $9, $9, $8\n" + "move $8, %2\n" + ".word 0x71090019\n" + "nop \n" + ".set pop\n" + : :"r"(hi), "r"(lo), "r"(reg) + : "$8", "$9"); +} +#endif /* (defined(__mips_n64) || defined(__mips_n32)) */ + +/* hashindex_en = 1 to enable hash mode, hashindex_en=0 to disable + * global_mode = 1 to enable global mode, global_mode=0 to disable + * clk_gating = 0 to enable clock gating, clk_gating=1 to disable + */ +static __inline__ void nlm_mmu_setup(int hashindex_en, int global_mode, + int clk_gating) +{ + uint32_t mmusetup = 0; + + mmusetup |= (hashindex_en << 13); + mmusetup |= (clk_gating << 3); + mmusetup |= (global_mode << 0); + nlm_mtcr(MMU_SETUP, mmusetup); +} + +static __inline__ void nlm_mmu_lfsr_seed (int thr0_seed, int thr1_seed, + int thr2_seed, int thr3_seed) +{ + uint32_t seed = nlm_mfcr(MMU_LFSRSEED); + + seed |= ((thr3_seed & 0x7f) << 23); + seed |= ((thr2_seed & 0x7f) << 16); + seed |= ((thr1_seed & 0x7f) << 7); + seed |= ((thr0_seed & 0x7f) << 0); + nlm_mtcr(MMU_LFSRSEED, seed); +} + +#endif /* __ASSEMBLY__ */ #endif /* __NLM_CPUCONTROL_H__ */ diff --git a/sys/mips/nlm/hal/fmn.c b/sys/mips/nlm/hal/fmn.c index fd4f7c80a7d..e58a2a55903 100644 --- a/sys/mips/nlm/hal/fmn.c +++ b/sys/mips/nlm/hal/fmn.c @@ -25,20 +25,19 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD$ * NETLOGIC_BSD */ #include __FBSDID("$FreeBSD$"); - #include -#include -#include -#include -#include #include -uint32_t bad_xlp_num_nodes = 4; +#include +#include +#include +#include +#include + /* XLP can take upto 16K of FMN messages per hardware queue, as spill. * But, configuring all 16K causes the total spill memory to required * to blow upto 192MB for single chip configuration, and 768MB in four @@ -68,27 +67,7 @@ uint64_t nlm_cms_spill_total_messages = 1 * 1024; * For all 4 nodes, there are 18*4 = 72 FMN stations */ uint32_t nlm_cms_total_stations = 18 * 4 /*xlp_num_nodes*/; -uint32_t cms_onchip_seg_availability[XLP_CMS_ON_CHIP_PER_QUEUE_SPACE]; - -int nlm_cms_verify_credit_config (int spill_en, int tot_credit) -{ - /* Note: In XLP there seem to be no mechanism to read back - * the credit count that has been programmed into a sid / did pair; - * since we have only one register 0x2000 to read. - * Hence it looks like all credit mgmt/verification needs to - * be done by software. Software could keep track of total credits - * getting programmed and verify it from this function. - */ - - if (spill_en) { - /* TODO */ - } - - if (tot_credit > (XLP_CMS_ON_CHIP_MESG_SPACE*bad_xlp_num_nodes)) - return 1; /* credits overflowed - should not happen */ - - return 0; -} +uint32_t cms_onchip_seg_availability[CMS_ON_CHIP_PER_QUEUE_SPACE]; /** * Takes inputs as node, queue_size and maximum number of queues. @@ -163,7 +142,7 @@ void nlm_cms_setup_credits(uint64_t base, int destid, int srcid, int credit) uint32_t val; val = ((credit << 24) | (destid << 12) | (srcid << 0)); - nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CREDIT_CFG_REG, val); + nlm_write_cms_reg(base, CMS_OUTPUTQ_CREDIT_CFG, val); } @@ -182,93 +161,93 @@ int nlm_cms_config_onchip_queue (uint64_t base, uint64_t spill_base, #if 0 /* configure credits for src cpu0, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_CPU0_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_CPU0_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src cpu1, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_CPU1_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_CPU1_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src cpu2, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_CPU2_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_CPU2_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src cpu3, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_CPU3_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_CPU3_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src cpu4, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_CPU4_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_CPU4_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src cpu5, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_CPU5_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_CPU5_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src cpu6, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_CPU6_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_CPU6_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src cpu7, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_CPU7_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_CPU7_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src pcie0, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE0_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_PCIE0_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src pcie1, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE1_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_PCIE1_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src pcie2, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE2_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_PCIE2_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src pcie3, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_PCIE3_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_PCIE3_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src dte, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_DTE_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_DTE_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src rsa_ecc, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_RSA_ECC_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_RSA_ECC_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src crypto, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_CRYPTO_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_CRYPTO_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src cmp, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_CMP_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_CMP_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src poe, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_POE_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_POE_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); /* configure credits for src nae, on this queue */ - nlm_cms_setup_credits(base, qid, XLP_CMS_NAE_SRC_STID, - XLP_CMS_DEFAULT_CREDIT(nlm_cms_total_stations, + nlm_cms_setup_credits(base, qid, CMS_NAE_SRC_STID, + CMS_DEFAULT_CREDIT(nlm_cms_total_stations, nlm_cms_spill_total_messages)); #endif @@ -289,20 +268,20 @@ int nlm_cms_alloc_spill_q(uint64_t base, int qid, uint64_t spill_base, uint64_t queue_config; uint32_t spill_start; - if(nsegs > XLP_CMS_MAX_SPILL_SEGMENTS_PER_QUEUE) { + if(nsegs > CMS_MAX_SPILL_SEGMENTS_PER_QUEUE) { return 1; } - queue_config = nlm_rdreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid))); + queue_config = nlm_read_cms_reg(base,(CMS_OUTPUTQ_CONFIG(qid))); spill_start = ((spill_base >> 12) & 0x3F); /* Spill configuration */ - queue_config = (((uint64_t)XLP_CMS_SPILL_ENA << 62) | + queue_config = (((uint64_t)CMS_SPILL_ENA << 62) | (((spill_base >> 18) & 0x3FFFFF) << 27) | (spill_start + nsegs - 1) << 21 | (spill_start << 15)); - nlm_wreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid)),queue_config); + nlm_write_cms_reg(base,(CMS_OUTPUTQ_CONFIG(qid)),queue_config); return 0; } @@ -320,8 +299,8 @@ int nlm_cms_alloc_onchip_q(uint64_t base, int qid, int nsegs) int onchipbase, start, last; uint8_t i; - if( ((curr_end + nsegs) > XLP_CMS_MAX_ONCHIP_SEGMENTS) || - (nsegs > XLP_CMS_ON_CHIP_PER_QUEUE_SPACE) ) { + if( ((curr_end + nsegs) > CMS_MAX_ONCHIP_SEGMENTS) || + (nsegs > CMS_ON_CHIP_PER_QUEUE_SPACE) ) { /* Invalid configuration */ return 1; } @@ -347,15 +326,15 @@ int nlm_cms_alloc_onchip_q(uint64_t base, int qid, int nsegs) cms_onchip_seg_availability[onchipbase] |= (1 << i); } - queue_config = nlm_rdreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid))); + queue_config = nlm_read_cms_reg(base,(CMS_OUTPUTQ_CONFIG(qid))); /* On chip configuration */ - queue_config = (((uint64_t)XLP_CMS_QUEUE_ENA << 63) | + queue_config = (((uint64_t)CMS_QUEUE_ENA << 63) | ((onchipbase & 0x1f) << 10) | ((last & 0x1f) << 5) | (start & 0x1f)); - nlm_wreg_cms(base,(XLP_CMS_OUTPUTQ_CONFIG_REG(qid)),queue_config); + nlm_write_cms_reg(base,(CMS_OUTPUTQ_CONFIG(qid)),queue_config); return 0; } @@ -367,85 +346,86 @@ void nlm_cms_default_setup(int node, uint64_t spill_base, int spill_en, int queue; uint64_t base; - base = nlm_regbase_cms(node); + base = nlm_get_cms_regbase(node); for(j=0; j<1024; j++) { - printf("Qid:0x%04d Val:0x%016jx\n",j, (uintmax_t)nlm_cms_get_onchip_queue (base, j)); + printf("Qid:0x%04d Val:0x%016jx\n",j, + (uintmax_t)nlm_cms_get_onchip_queue (base, j)); } /* Enable all cpu push queues */ for (j=0; j> 59) & 0x1); } @@ -668,77 +648,77 @@ int nlm_cms_outputq_intr_check(uint64_t base, int qid) void nlm_cms_outputq_clr_intr(uint64_t base, int qid) { uint64_t val; - val = nlm_rdreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid)); + val = nlm_read_cms_reg(base, CMS_OUTPUTQ_CONFIG(qid)); val |= (1ULL<<59); - nlm_wreg_cms(base, XLP_CMS_OUTPUTQ_CONFIG_REG(qid), val); + nlm_write_cms_reg(base, CMS_OUTPUTQ_CONFIG(qid), val); } void nlm_cms_illegal_dst_error_intr(uint64_t base, int en) { uint64_t val; - val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG); + val = nlm_read_cms_reg(base, CMS_MSG_CONFIG); val |= (en<<8); - nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val); + nlm_write_cms_reg(base, CMS_MSG_CONFIG, val); } void nlm_cms_timeout_error_intr(uint64_t base, int en) { uint64_t val; - val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG); + val = nlm_read_cms_reg(base, CMS_MSG_CONFIG); val |= (en<<7); - nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val); + nlm_write_cms_reg(base, CMS_MSG_CONFIG, val); } void nlm_cms_biu_error_resp_intr(uint64_t base, int en) { uint64_t val; - val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG); + val = nlm_read_cms_reg(base, CMS_MSG_CONFIG); val |= (en<<6); - nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val); + nlm_write_cms_reg(base, CMS_MSG_CONFIG, val); } void nlm_cms_spill_uncorrectable_ecc_error_intr(uint64_t base, int en) { uint64_t val; - val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG); + val = nlm_read_cms_reg(base, CMS_MSG_CONFIG); val |= (en<<5) | (en<<3); - nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val); + nlm_write_cms_reg(base, CMS_MSG_CONFIG, val); } void nlm_cms_spill_correctable_ecc_error_intr(uint64_t base, int en) { uint64_t val; - val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG); + val = nlm_read_cms_reg(base, CMS_MSG_CONFIG); val |= (en<<4) | (en<<2); - nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val); + nlm_write_cms_reg(base, CMS_MSG_CONFIG, val); } void nlm_cms_outputq_uncorrectable_ecc_error_intr(uint64_t base, int en) { uint64_t val; - val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG); + val = nlm_read_cms_reg(base, CMS_MSG_CONFIG); val |= (en<<1); - nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val); + nlm_write_cms_reg(base, CMS_MSG_CONFIG, val); } void nlm_cms_outputq_correctable_ecc_error_intr(uint64_t base, int en) { uint64_t val; - val = nlm_rdreg_cms(base, XLP_CMS_MSG_CONFIG_REG); + val = nlm_read_cms_reg(base, CMS_MSG_CONFIG); val |= (en<<0); - nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val); + nlm_write_cms_reg(base, CMS_MSG_CONFIG, val); } uint64_t nlm_cms_network_error_status(uint64_t base) { - return nlm_rdreg_cms(base, XLP_CMS_MSG_ERR_REG); + return nlm_read_cms_reg(base, CMS_MSG_ERR); } int nlm_cms_get_net_error_code(uint64_t err) @@ -770,20 +750,20 @@ void nlm_cms_trace_setup(uint64_t base, int en, uint64_t trace_base, { uint64_t val; - nlm_wreg_cms(base, XLP_CMS_TRACE_BASE_ADDR_REG, trace_base); - nlm_wreg_cms(base, XLP_CMS_TRACE_LIMIT_ADDR_REG, trace_limit); + nlm_write_cms_reg(base, CMS_TRACE_BASE_ADDR, trace_base); + nlm_write_cms_reg(base, CMS_TRACE_LIMIT_ADDR, trace_limit); - val = nlm_rdreg_cms(base, XLP_CMS_TRACE_CONFIG_REG); + val = nlm_read_cms_reg(base, CMS_TRACE_CONFIG); val |= (((uint64_t)match_dstid_en << 39) | ((dst_id & 0xfff) << 24) | (match_srcid_en << 23) | ((src_id & 0xfff) << 8) | (wrap << 1) | (en << 0)); - nlm_wreg_cms(base, XLP_CMS_MSG_CONFIG_REG, val); + nlm_write_cms_reg(base, CMS_MSG_CONFIG, val); } void nlm_cms_endian_byte_swap (uint64_t base, int en) { - nlm_wreg_cms(base, XLP_CMS_MSG_ENDIAN_SWAP_REG, en); + nlm_write_cms_reg(base, CMS_MSG_ENDIAN_SWAP, en); } diff --git a/sys/mips/nlm/hal/fmn.h b/sys/mips/nlm/hal/fmn.h index 75fc7740316..88ba113ec47 100644 --- a/sys/mips/nlm/hal/fmn.h +++ b/sys/mips/nlm/hal/fmn.h @@ -25,8 +25,9 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ #ifndef __NLM_FMNV2_H__ #define __NLM_FMNV2_H__ @@ -38,156 +39,156 @@ */ /* FMN configuration registers */ -#define XLP_CMS_OUTPUTQ_CONFIG_REG(i) ((i)*2) -#define XLP_CMS_MAX_OUTPUTQ 1024 -#define XLP_CMS_OUTPUTQ_CREDIT_CFG_REG (0x2000/4) -#define XLP_CMS_MSG_CONFIG_REG (0x2008/4) -#define XLP_CMS_MSG_ERR_REG (0x2010/4) -#define XLP_CMS_TRACE_CONFIG_REG (0x2018/4) -#define XLP_CMS_TRACE_BASE_ADDR_REG (0x2020/4) -#define XLP_CMS_TRACE_LIMIT_ADDR_REG (0x2028/4) -#define XLP_CMS_TRACE_CURRENT_ADDR_REG (0x2030/4) -#define XLP_CMS_MSG_ENDIAN_SWAP_REG (0x2038/4) +#define CMS_OUTPUTQ_CONFIG(i) ((i)*2) +#define CMS_MAX_OUTPUTQ 1024 +#define CMS_OUTPUTQ_CREDIT_CFG (0x2000/4) +#define CMS_MSG_CONFIG (0x2008/4) +#define CMS_MSG_ERR (0x2010/4) +#define CMS_TRACE_CONFIG (0x2018/4) +#define CMS_TRACE_BASE_ADDR (0x2020/4) +#define CMS_TRACE_LIMIT_ADDR (0x2028/4) +#define CMS_TRACE_CURRENT_ADDR (0x2030/4) +#define CMS_MSG_ENDIAN_SWAP (0x2038/4) -#define XLP_CMS_CPU_PUSHQ(node, core, thread, vc) \ +#define CMS_CPU_PUSHQ(node, core, thread, vc) \ (((node)<<10) | ((core)<<4) | ((thread)<<2) | ((vc)<<0)) -#define XLP_CMS_POPQ(node, queue) (((node)<<10) | (queue)) -#define XLP_CMS_IO_PUSHQ(node, queue) (((node)<<10) | (queue)) +#define CMS_POPQ(node, queue) (((node)<<10) | (queue)) +#define CMS_IO_PUSHQ(node, queue) (((node)<<10) | (queue)) -#define XLP_CMS_POPQ_QID(i) (128+(i)) -#define XLP_CMS_POPQ_MAXQID 255 -#define XLP_CMS_PCIE0_QID(i) (256+(i)) -#define XLP_CMS_PCIE0_MAXQID 257 -#define XLP_CMS_PCIE1_QID(i) (258+(i)) -#define XLP_CMS_PCIE1_MAXQID 259 -#define XLP_CMS_PCIE2_QID(i) (260+(i)) -#define XLP_CMS_PCIE2_MAXQID 261 -#define XLP_CMS_PCIE3_QID(i) (262+(i)) -#define XLP_CMS_PCIE3_MAXQID 263 -#define XLP_CMS_DTE_QID(i) (264+(i)) -#define XLP_CMS_DTE_MAXQID 267 -#define XLP_CMS_RSA_ECC_QID(i) (272+(i)) -#define XLP_CMS_RSA_ECC_MAXQID 280 -#define XLP_CMS_CRYPTO_QID(i) (281+(i)) -#define XLP_CMS_CRYPTO_MAXQID 296 +#define CMS_POPQ_QID(i) (128+(i)) +#define CMS_POPQ_MAXQID 255 +#define CMS_PCIE0_QID(i) (256+(i)) +#define CMS_PCIE0_MAXQID 257 +#define CMS_PCIE1_QID(i) (258+(i)) +#define CMS_PCIE1_MAXQID 259 +#define CMS_PCIE2_QID(i) (260+(i)) +#define CMS_PCIE2_MAXQID 261 +#define CMS_PCIE3_QID(i) (262+(i)) +#define CMS_PCIE3_MAXQID 263 +#define CMS_DTE_QID(i) (264+(i)) +#define CMS_DTE_MAXQID 267 +#define CMS_RSA_ECC_QID(i) (272+(i)) +#define CMS_RSA_ECC_MAXQID 280 +#define CMS_CRYPTO_QID(i) (281+(i)) +#define CMS_CRYPTO_MAXQID 296 /* TODO PCI header register 0x3C says CMP starts at 297(0x129) VERIFY */ -#define XLP_CMS_CMP_QID(i) (298+(i)) -#define XLP_CMS_CMP_MAXQID 305 -#define XLP_CMS_POE_QID(i) (384+(i)) -#define XLP_CMS_POE_MAXQID 391 -#define XLP_CMS_NAE_QID(i) (476+(i)) -#define XLP_CMS_NAE_MAXQID 1023 +#define CMS_CMP_QID(i) (298+(i)) +#define CMS_CMP_MAXQID 305 +#define CMS_POE_QID(i) (384+(i)) +#define CMS_POE_MAXQID 391 +#define CMS_NAE_QID(i) (476+(i)) +#define CMS_NAE_MAXQID 1023 -#define XLP_CMS_NAE_TX_VC_BASE 476 -#define XLP_CMS_NAE_TX_VC_LIMIT 999 -#define XLP_CMS_NAE_RX_VC_BASE 1000 -#define XLP_CMS_NAE_RX_VC_LIMIT 1019 +#define CMS_NAE_TX_VC_BASE 476 +#define CMS_NAE_TX_VC_LIMIT 999 +#define CMS_NAE_RX_VC_BASE 1000 +#define CMS_NAE_RX_VC_LIMIT 1019 -#define XLP_MAX_CMS_QUEUES 1024 +#define MAX_CMS_QUEUES 1024 /* FMN Level Interrupt Type */ -#define XLP_CMS_LVL_INTR_DISABLE 0 -#define XLP_CMS_LVL_LOW_WATERMARK 1 -#define XLP_CMS_LVL_HI_WATERMARK 2 +#define CMS_LVL_INTR_DISABLE 0 +#define CMS_LVL_LOW_WATERMARK 1 +#define CMS_LVL_HI_WATERMARK 2 /* FMN Level interrupt trigger values */ -#define XLP_CMS_QUEUE_NON_EMPTY 0 -#define XLP_CMS_QUEUE_QUARTER_FULL 1 -#define XLP_CMS_QUEUE_HALF_FULL 2 -#define XLP_CMS_QUEUE_THREE_QUARTER_FULL 3 -#define XLP_CMS_QUEUE_FULL 4 +#define CMS_QUEUE_NON_EMPTY 0 +#define CMS_QUEUE_QUARTER_FULL 1 +#define CMS_QUEUE_HALF_FULL 2 +#define CMS_QUEUE_THREE_QUARTER_FULL 3 +#define CMS_QUEUE_FULL 4 /* FMN Timer Interrupt Type */ -#define XLP_CMS_TIMER_INTR_DISABLE 0 -#define XLP_CMS_TIMER_CONSUMER 1 -#define XLP_CMS_TIMER_PRODUCER 1 +#define CMS_TIMER_INTR_DISABLE 0 +#define CMS_TIMER_CONSUMER 1 +#define CMS_TIMER_PRODUCER 1 /* FMN timer interrupt trigger values */ -#define XLP_CMS_TWO_POW_EIGHT_CYCLES 0 -#define XLP_CMS_TWO_POW_TEN_CYCLES 1 -#define XLP_CMS_TWO_POW_TWELVE_CYCLES 2 -#define XLP_CMS_TWO_POW_FOURTEEN_CYCLES 3 -#define XLP_CMS_TWO_POW_SIXTEEN_CYCLES 4 -#define XLP_CMS_TWO_POW_EIGHTTEEN_CYCLES 5 -#define XLP_CMS_TWO_POW_TWENTY_CYCLES 6 -#define XLP_CMS_TWO_POW_TWENTYTWO_CYCLES 7 +#define CMS_TWO_POW_EIGHT_CYCLES 0 +#define CMS_TWO_POW_TEN_CYCLES 1 +#define CMS_TWO_POW_TWELVE_CYCLES 2 +#define CMS_TWO_POW_FOURTEEN_CYCLES 3 +#define CMS_TWO_POW_SIXTEEN_CYCLES 4 +#define CMS_TWO_POW_EIGHTTEEN_CYCLES 5 +#define CMS_TWO_POW_TWENTY_CYCLES 6 +#define CMS_TWO_POW_TWENTYTWO_CYCLES 7 -#define XLP_CMS_QUEUE_ENA 1ULL -#define XLP_CMS_QUEUE_DIS 0 -#define XLP_CMS_SPILL_ENA 1ULL -#define XLP_CMS_SPILL_DIS 0 +#define CMS_QUEUE_ENA 1ULL +#define CMS_QUEUE_DIS 0 +#define CMS_SPILL_ENA 1ULL +#define CMS_SPILL_DIS 0 -#define XLP_CMS_MAX_VCPU_VC 4 +#define CMS_MAX_VCPU_VC 4 /* Each XLP chip can hold upto 32K messages on the chip itself */ -#define XLP_CMS_ON_CHIP_MESG_SPACE (32*1024) -#define XLP_CMS_ON_CHIP_PER_QUEUE_SPACE \ - ((XLP_CMS_ON_CHIP_MESG_SPACE)/(XLP_MAX_CMS_QUEUES)) -#define XLP_CMS_MAX_ONCHIP_SEGMENTS 1024 -#define XLP_CMS_MAX_SPILL_SEGMENTS_PER_QUEUE 64 +#define CMS_ON_CHIP_MESG_SPACE (32*1024) +#define CMS_ON_CHIP_PER_QUEUE_SPACE \ + ((CMS_ON_CHIP_MESG_SPACE)/(MAX_CMS_QUEUES)) +#define CMS_MAX_ONCHIP_SEGMENTS 1024 +#define CMS_MAX_SPILL_SEGMENTS_PER_QUEUE 64 /* FMN Network error */ -#define XLP_CMS_ILLEGAL_DST_ERROR 0x100 -#define XLP_CMS_BIU_TIMEOUT_ERROR 0x080 -#define XLP_CMS_BIU_ERROR 0x040 -#define XLP_CMS_SPILL_FILL_UNCORRECT_ECC_ERROR 0x020 -#define XLP_CMS_SPILL_FILL_CORRECT_ECC_ERROR 0x010 -#define XLP_CMS_SPILL_UNCORRECT_ECC_ERROR 0x008 -#define XLP_CMS_SPILL_CORRECT_ECC_ERROR 0x004 -#define XLP_CMS_OUTPUTQ_UNCORRECT_ECC_ERROR 0x002 -#define XLP_CMS_OUTPUTQ_CORRECT_ECC_ERROR 0x001 +#define CMS_ILLEGAL_DST_ERROR 0x100 +#define CMS_BIU_TIMEOUT_ERROR 0x080 +#define CMS_BIU_ERROR 0x040 +#define CMS_SPILL_FILL_UNCORRECT_ECC_ERROR 0x020 +#define CMS_SPILL_FILL_CORRECT_ECC_ERROR 0x010 +#define CMS_SPILL_UNCORRECT_ECC_ERROR 0x008 +#define CMS_SPILL_CORRECT_ECC_ERROR 0x004 +#define CMS_OUTPUTQ_UNCORRECT_ECC_ERROR 0x002 +#define CMS_OUTPUTQ_CORRECT_ECC_ERROR 0x001 /* worst case, a single entry message consists of a 4 byte header * and an 8-byte entry = 12 bytes in total */ -#define XLP_CMS_SINGLE_ENTRY_MSG_SIZE 12 +#define CMS_SINGLE_ENTRY_MSG_SIZE 12 /* total spill memory needed for one FMN queue */ -#define XLP_CMS_PER_QUEUE_SPILL_MEM(spilltotmsgs) \ - ((spilltotmsgs) * (XLP_CMS_SINGLE_ENTRY_MSG_SIZE)) +#define CMS_PER_QUEUE_SPILL_MEM(spilltotmsgs) \ + ((spilltotmsgs) * (CMS_SINGLE_ENTRY_MSG_SIZE)) /* total spill memory needed */ -#define XLP_CMS_TOTAL_SPILL_MEM(spilltotmsgs) \ - ((XLP_CMS_PER_QUEUE_SPILL_MEM(spilltotmsgs)) * \ - (XLP_MAX_CMS_QUEUES)) +#define CMS_TOTAL_SPILL_MEM(spilltotmsgs) \ + ((CMS_PER_QUEUE_SPILL_MEM(spilltotmsgs)) * \ + (MAX_CMS_QUEUES)) /* total number of FMN messages possible in a queue */ -#define XLP_CMS_TOTAL_QUEUE_SIZE(spilltotmsgs) \ - ((spilltotmsgs) + (XLP_CMS_ON_CHIP_PER_QUEUE_SPACE)) +#define CMS_TOTAL_QUEUE_SIZE(spilltotmsgs) \ + ((spilltotmsgs) + (CMS_ON_CHIP_PER_QUEUE_SPACE)) /* FMN Src station id's */ -#define XLP_CMS_CPU0_SRC_STID (0 << 4) -#define XLP_CMS_CPU1_SRC_STID (1 << 4) -#define XLP_CMS_CPU2_SRC_STID (2 << 4) -#define XLP_CMS_CPU3_SRC_STID (3 << 4) -#define XLP_CMS_CPU4_SRC_STID (4 << 4) -#define XLP_CMS_CPU5_SRC_STID (5 << 4) -#define XLP_CMS_CPU6_SRC_STID (6 << 4) -#define XLP_CMS_CPU7_SRC_STID (7 << 4) -#define XLP_CMS_PCIE0_SRC_STID 256 -#define XLP_CMS_PCIE1_SRC_STID 258 -#define XLP_CMS_PCIE2_SRC_STID 260 -#define XLP_CMS_PCIE3_SRC_STID 262 -#define XLP_CMS_DTE_SRC_STID 264 -#define XLP_CMS_RSA_ECC_SRC_STID 272 -#define XLP_CMS_CRYPTO_SRC_STID 281 -#define XLP_CMS_CMP_SRC_STID 298 -#define XLP_CMS_POE_SRC_STID 384 -#define XLP_CMS_NAE_SRC_STID 476 +#define CMS_CPU0_SRC_STID (0 << 4) +#define CMS_CPU1_SRC_STID (1 << 4) +#define CMS_CPU2_SRC_STID (2 << 4) +#define CMS_CPU3_SRC_STID (3 << 4) +#define CMS_CPU4_SRC_STID (4 << 4) +#define CMS_CPU5_SRC_STID (5 << 4) +#define CMS_CPU6_SRC_STID (6 << 4) +#define CMS_CPU7_SRC_STID (7 << 4) +#define CMS_PCIE0_SRC_STID 256 +#define CMS_PCIE1_SRC_STID 258 +#define CMS_PCIE2_SRC_STID 260 +#define CMS_PCIE3_SRC_STID 262 +#define CMS_DTE_SRC_STID 264 +#define CMS_RSA_ECC_SRC_STID 272 +#define CMS_CRYPTO_SRC_STID 281 +#define CMS_CMP_SRC_STID 298 +#define CMS_POE_SRC_STID 384 +#define CMS_NAE_SRC_STID 476 #if 0 -#define XLP_CMS_DEFAULT_CREDIT(cmstotstns,spilltotmsgs) \ - ((XLP_CMS_TOTAL_QUEUE_SIZE(spilltotmsgs)) / \ +#define CMS_DEFAULT_CREDIT(cmstotstns,spilltotmsgs) \ + ((CMS_TOTAL_QUEUE_SIZE(spilltotmsgs)) / \ (cmstotstns)) #endif -#define XLP_CMS_DEFAULT_CREDIT(cmstotstns,spilltotmsgs) 8 +#define CMS_DEFAULT_CREDIT(cmstotstns,spilltotmsgs) 8 /* POPQ related defines */ -#define XLP_CMS_POPQID_START 128 -#define XLP_CMS_POPQID_END 255 +#define CMS_POPQID_START 128 +#define CMS_POPQID_END 255 -#define XLP_CMS_INT_RCVD 0x800000000000000ULL +#define CMS_INT_RCVD 0x800000000000000ULL -#define nlm_rdreg_cms(b, r) nlm_read_reg64_xkseg(b,r) -#define nlm_wreg_cms(b, r, v) nlm_write_reg64_xkseg(b,r,v) -#define nlm_pcibase_cms(node) nlm_pcicfg_base(XLP_IO_CMS_OFFSET(node)) -#define nlm_regbase_cms(node) nlm_pcibar0_base_xkphys(nlm_pcibase_cms(node)) +#define nlm_read_cms_reg(b, r) nlm_read_reg64_xkphys(b,r) +#define nlm_write_cms_reg(b, r, v) nlm_write_reg64_xkphys(b,r,v) +#define nlm_get_cms_pcibase(node) nlm_pcicfg_base(XLP_IO_CMS_OFFSET(node)) +#define nlm_get_cms_regbase(node) nlm_xkphys_map_pcibar0(nlm_get_cms_pcibase(node)) enum fmn_swcode { FMN_SWCODE_CPU0=1, @@ -237,7 +238,7 @@ enum fmn_swcode { extern uint64_t nlm_cms_spill_total_messages; extern uint32_t nlm_cms_total_stations; -extern uint32_t cms_onchip_seg_availability[XLP_CMS_ON_CHIP_PER_QUEUE_SPACE]; +extern uint32_t cms_onchip_seg_availability[CMS_ON_CHIP_PER_QUEUE_SPACE]; extern uint64_t cms_base_addr(int node); extern int nlm_cms_verify_credit_config (int spill_en, int tot_credit); diff --git a/sys/mips/nlm/hal/haldefs.h b/sys/mips/nlm/hal/haldefs.h new file mode 100644 index 00000000000..a8e13420dfc --- /dev/null +++ b/sys/mips/nlm/hal/haldefs.h @@ -0,0 +1,437 @@ +/*- + * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * NETLOGIC_BSD + * $FreeBSD$ + */ + +#ifndef __NLM_HAL_MMIO_H__ +#define __NLM_HAL_MMIO_H__ + +/* + * This file contains platform specific memory mapped IO implementation + * and will provide a way to read 32/64 bit memory mapped registers in + * all ABIs + */ + +/* + * For o32 compilation, we have to disable interrupts and enable KX bit to + * access 64 bit addresses or data. + * + * We need to disable interrupts because we save just the lower 32 bits of + * registers in interrupt handling. So if we get hit by an interrupt while + * using the upper 32 bits of a register, we lose. + */ +static inline uint32_t nlm_save_flags_kx(void) +{ + uint32_t sr = mips_rd_status(); + + mips_wr_status((sr & ~MIPS_SR_INT_IE) | MIPS_SR_KX); + return (sr); +} + +static inline uint32_t nlm_save_flags_cop2(void) +{ + uint32_t sr = mips_rd_status(); + + mips_wr_status((sr & ~MIPS_SR_INT_IE) | MIPS_SR_COP_2_BIT); + return (sr); +} + +static inline void nlm_restore_flags(uint32_t sr) +{ + mips_wr_status(sr); +} + +static inline uint32_t +nlm_load_word(uint64_t addr) +{ + volatile uint32_t *p = (volatile uint32_t *)(long)addr; + + return *p; +} + +static inline void +nlm_store_word(uint64_t addr, uint32_t val) +{ + volatile uint32_t *p = (volatile uint32_t *)(long)addr; + + *p = val; +} + +#if defined(__mips_n64) || defined(__mips_n32) +static inline uint64_t +nlm_load_dword(volatile uint64_t addr) +{ + volatile uint64_t *p = (volatile uint64_t *)(long)addr; + + return *p; +} + +static inline void +nlm_store_dword(volatile uint64_t addr, uint64_t val) +{ + volatile uint64_t *p = (volatile uint64_t *)(long)addr; + + *p = val; +} + +#else /* o32 */ +static inline uint64_t +nlm_load_dword(uint64_t addr) +{ + volatile uint64_t *p = (volatile uint64_t *)(long)addr; + uint32_t valhi, vallo, sr; + + sr = nlm_save_flags_kx(); + __asm__ __volatile__( + ".set push\n\t" + ".set mips64\n\t" + "ld $8, 0(%2)\n\t" + "dsra32 %0, $8, 0\n\t" + "sll %1, $8, 0\n\t" + ".set pop\n" + : "=r"(valhi), "=r"(vallo) + : "r"(p) + : "$8"); + nlm_restore_flags(sr); + + return ((uint64_t)valhi << 32) | vallo; +} + +static inline void +nlm_store_dword(uint64_t addr, uint64_t val) +{ + volatile uint64_t *p = (volatile uint64_t *)(long)addr; + uint32_t valhi, vallo, sr; + + valhi = val >> 32; + vallo = val & 0xffffffff; + + sr = nlm_save_flags_kx(); + __asm__ __volatile__( + ".set push\n\t" + ".set mips64\n\t" + "dsll32 $8, %1, 0\n\t" + "dsll32 $9, %2, 0\n\t" /* get rid of the */ + "dsrl32 $9, $9, 0\n\t" /* sign extend */ + "or $9, $9, $8\n\t" + "sd $9, 0(%0)\n\t" + ".set pop\n" + : : "r"(p), "r"(valhi), "r"(vallo) + : "$8", "$9", "memory"); + nlm_restore_flags(sr); +} +#endif + +#if defined(__mips_n64) +static inline uint64_t +nlm_load_word_daddr(uint64_t addr) +{ + volatile uint32_t *p = (volatile uint32_t *)(long)addr; + + return *p; +} + +static inline void +nlm_store_word_daddr(uint64_t addr, uint32_t val) +{ + volatile uint32_t *p = (volatile uint32_t *)(long)addr; + + *p = val; +} + +static inline uint64_t +nlm_load_dword_daddr(uint64_t addr) +{ + volatile uint64_t *p = (volatile uint64_t *)(long)addr; + + return *p; +} + +static inline void +nlm_store_dword_daddr(uint64_t addr, uint64_t val) +{ + volatile uint64_t *p = (volatile uint64_t *)(long)addr; + + *p = val; +} + +#elif defined(__mips_n32) + +static inline uint64_t +nlm_load_word_daddr(uint64_t addr) +{ + uint32_t val; + + __asm__ __volatile__( + ".set push\n\t" + ".set mips64\n\t" + "lw %0, 0(%1)\n\t" + ".set pop\n" + : "=r"(val) + : "r"(addr)); + + return val; +} + +static inline void +nlm_store_word_daddr(uint64_t addr, uint32_t val) +{ + __asm__ __volatile__( + ".set push\n\t" + ".set mips64\n\t" + "sw %0, 0(%1)\n\t" + ".set pop\n" + : : "r"(val), "r"(addr) + : "memory"); +} + +static inline uint64_t +nlm_load_dword_daddr(uint64_t addr) +{ + uint64_t val; + + __asm__ __volatile__( + ".set push\n\t" + ".set mips64\n\t" + "ld %0, 0(%1)\n\t" + ".set pop\n" + : "=r"(val) + : "r"(addr)); + return val; +} + +static inline void +nlm_store_dword_daddr(uint64_t addr, uint64_t val) +{ + __asm__ __volatile__( + ".set push\n\t" + ".set mips64\n\t" + "sd %0, 0(%1)\n\t" + ".set pop\n" + : : "r"(val), "r"(addr) + : "memory"); +} + +#else /* o32 */ +static inline uint64_t +nlm_load_word_daddr(uint64_t addr) +{ + uint32_t val, addrhi, addrlo, sr; + + addrhi = addr >> 32; + addrlo = addr & 0xffffffff; + + sr = nlm_save_flags_kx(); + __asm__ __volatile__( + ".set push\n\t" + ".set mips64\n\t" + "dsll32 $8, %1, 0\n\t" + "dsll32 $9, %2, 0\n\t" + "dsrl32 $9, $9, 0\n\t" + "or $9, $9, $8\n\t" + "lw %0, 0($9)\n\t" + ".set pop\n" + : "=r"(val) + : "r"(addrhi), "r"(addrlo) + : "$8", "$9"); + nlm_restore_flags(sr); + + return val; + +} + +static inline void +nlm_store_word_daddr(uint64_t addr, uint32_t val) +{ + uint32_t addrhi, addrlo, sr; + + addrhi = addr >> 32; + addrlo = addr & 0xffffffff; + + sr = nlm_save_flags_kx(); + __asm__ __volatile__( + ".set push\n\t" + ".set mips64\n\t" + "dsll32 $8, %1, 0\n\t" + "dsll32 $9, %2, 0\n\t" + "dsrl32 $9, $9, 0\n\t" + "or $9, $9, $8\n\t" + "sw %0, 0($9)\n\t" + ".set pop\n" + : : "r"(val), "r"(addrhi), "r"(addrlo) + : "$8", "$9", "memory"); + nlm_restore_flags(sr); +} + +static inline uint64_t +nlm_load_dword_daddr(uint64_t addr) +{ + uint32_t addrh, addrl, sr; + uint32_t valh, vall; + + addrh = addr >> 32; + addrl = addr & 0xffffffff; + + sr = nlm_save_flags_kx(); + __asm__ __volatile__( + ".set push\n\t" + ".set mips64\n\t" + "dsll32 $8, %2, 0\n\t" + "dsll32 $9, %3, 0\n\t" + "dsrl32 $9, $9, 0\n\t" + "or $9, $9, $8\n\t" + "ld $8, 0($9)\n\t" + "dsra32 %0, $8, 0\n\t" + "sll %1, $8, 0\n\t" + ".set pop\n" + : "=r"(valh), "=r"(vall) + : "r"(addrh), "r"(addrl) + : "$8", "$9"); + nlm_restore_flags(sr); + + return ((uint64_t)valh << 32) | vall; +} + +static inline void +nlm_store_dword_daddr(uint64_t addr, uint64_t val) +{ + uint32_t addrh, addrl, sr; + uint32_t valh, vall; + + addrh = addr >> 32; + addrl = addr & 0xffffffff; + valh = val >> 32; + vall = val & 0xffffffff; + + sr = nlm_save_flags_kx(); + __asm__ __volatile__( + ".set push\n\t" + ".set mips64\n\t" + "dsll32 $8, %2, 0\n\t" + "dsll32 $9, %3, 0\n\t" + "dsrl32 $9, $9, 0\n\t" + "or $9, $9, $8\n\t" + "dsll32 $8, %0, 0\n\t" + "dsll32 $10, %1, 0\n\t" + "dsrl32 $10, $10, 0\n\t" + "or $8, $8, $10\n\t" + "sd $8, 0($9)\n\t" + ".set pop\n" + : : "r"(valh), "r"(vall), "r"(addrh), "r"(addrl) + : "$8", "$9", "memory"); + nlm_restore_flags(sr); +} +#endif /* __mips_n64 */ + +static inline uint32_t +nlm_read_reg(uint64_t base, uint32_t reg) +{ + volatile uint32_t *addr = (volatile uint32_t *)(long)base + reg; + + return *addr; +} + +static inline void +nlm_write_reg(uint64_t base, uint32_t reg, uint32_t val) +{ + volatile uint32_t *addr = (volatile uint32_t *)(long)base + reg; + + *addr = val; +} + +static inline uint64_t +nlm_read_reg64(uint64_t base, uint32_t reg) +{ + uint64_t addr = base + (reg >> 1) * sizeof(uint64_t); + + return nlm_load_dword(addr); +} + +static inline void +nlm_write_reg64(uint64_t base, uint32_t reg, uint64_t val) +{ + uint64_t addr = base + (reg >> 1) * sizeof(uint64_t); + + return nlm_store_dword(addr, val); +} + +/* + * Routines to store 32/64 bit values to 64 bit addresses, + * used when going thru XKPHYS to access registers + */ +static inline uint32_t +nlm_read_reg_xkphys(uint64_t base, uint32_t reg) +{ + uint64_t addr = base + reg * sizeof(uint32_t); + + return nlm_load_word_daddr(addr); +} + +static inline void +nlm_write_reg_xkphys(uint64_t base, uint32_t reg, uint32_t val) +{ + uint64_t addr = base + reg * sizeof(uint32_t); + return nlm_store_word_daddr(addr, val); +} + +static inline uint64_t +nlm_read_reg64_xkphys(uint64_t base, uint32_t reg) +{ + uint64_t addr = base + (reg >> 1) * sizeof(uint64_t); + + return nlm_load_dword_daddr(addr); +} + +static inline void +nlm_write_reg64_xkphys(uint64_t base, uint32_t reg, uint64_t val) +{ + uint64_t addr = base + (reg >> 1) * sizeof(uint64_t); + + return nlm_store_dword_daddr(addr, val); +} + +/* Location where IO base is mapped */ +extern uint64_t xlp_io_base; + +static inline uint64_t +nlm_pcicfg_base(uint32_t devoffset) +{ + return xlp_io_base + devoffset; +} + +static inline uint64_t +nlm_xkphys_map_pcibar0(uint64_t pcibase) +{ + uint64_t paddr; + + paddr = nlm_read_reg(pcibase, 0x4) & ~0xfu; + return (uint64_t)0x9000000000000000 | paddr; +} + +#endif diff --git a/sys/mips/nlm/hal/iomap.h b/sys/mips/nlm/hal/iomap.h index e11dcdde0fb..9f4a52c0a51 100644 --- a/sys/mips/nlm/hal/iomap.h +++ b/sys/mips/nlm/hal/iomap.h @@ -25,82 +25,75 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ - -#ifndef __NLM_IOMAP_H__ -#define __NLM_IOMAP_H__ - -/** -* @file_name xlpiomap.h -* @author Netlogic Microsystems -* @brief Basic definitions Netlogic XLP IO BASEs -*/ - -/* ---------------------------------- - * XLP RESET Physical Address Map - * ---------------------------------- - * PCI ECFG : 0x18000000 - 0x1bffffff - * PCI CFG : 0x1c000000 - 0x1cffffff - * FLASH : 0x1fc00000 - 0x1fffffff - * ---------------------------------- */ +#ifndef __NLM_HAL_IOMAP_H__ +#define __NLM_HAL_IOMAP_H__ + #define XLP_DEFAULT_IO_BASE 0x18000000 -#define XLP_DEFAULT_IO_BASE_KSEG1 0xb8000000 -#define XLP_IO_SIZE (64 << 20) /* Size of the ECFG Space */ +#define NMI_BASE 0xbfc00000 +#define XLP_IO_CLK 133333333 + +#define XLP_PCIE_CFG_SIZE 0x1000 /* 4K */ +#define XLP_PCIE_DEV_BLK_SIZE (8 * XLP_PCIE_CFG_SIZE) +#define XLP_PCIE_BUS_BLK_SIZE (256 * XLP_PCIE_DEV_BLK_SIZE) +#define XLP_IO_SIZE (64 << 20) /* ECFG space size */ #define XLP_IO_PCI_HDRSZ 0x100 #define XLP_IO_DEV(node, dev) ((dev) + (node) * 8) #define XLP_HDR_OFFSET(node, bus, dev, fn) (((bus) << 20) | \ ((XLP_IO_DEV(node, dev)) << 15) | ((fn) << 12)) -#define XLP_IO_BRIDGE_OFFSET(node) XLP_HDR_OFFSET(node,0,0,0) +#define XLP_IO_BRIDGE_OFFSET(node) XLP_HDR_OFFSET(node, 0, 0, 0) /* coherent inter chip */ -#define XLP_IO_CIC0_OFFSET(node) XLP_HDR_OFFSET(node,0,0,1) -#define XLP_IO_CIC1_OFFSET(node) XLP_HDR_OFFSET(node,0,0,2) -#define XLP_IO_CIC2_OFFSET(node) XLP_HDR_OFFSET(node,0,0,3) -#define XLP_IO_PIC_OFFSET(node) XLP_HDR_OFFSET(node,0,0,4) +#define XLP_IO_CIC0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 0, 1) +#define XLP_IO_CIC1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 0, 2) +#define XLP_IO_CIC2_OFFSET(node) XLP_HDR_OFFSET(node, 0, 0, 3) +#define XLP_IO_PIC_OFFSET(node) XLP_HDR_OFFSET(node, 0, 0, 4) -#define XLP_IO_PCIE_OFFSET(node,i) XLP_HDR_OFFSET(node,0,1,i) -#define XLP_IO_PCIE0_OFFSET(node) XLP_HDR_OFFSET(node,0,1,0) -#define XLP_IO_PCIE1_OFFSET(node) XLP_HDR_OFFSET(node,0,1,1) -#define XLP_IO_PCIE2_OFFSET(node) XLP_HDR_OFFSET(node,0,1,2) -#define XLP_IO_PCIE3_OFFSET(node) XLP_HDR_OFFSET(node,0,1,3) +#define XLP_IO_PCIE_OFFSET(node, i) XLP_HDR_OFFSET(node, 0, 1, i) +#define XLP_IO_PCIE0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 1, 0) +#define XLP_IO_PCIE1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 1, 1) +#define XLP_IO_PCIE2_OFFSET(node) XLP_HDR_OFFSET(node, 0, 1, 2) +#define XLP_IO_PCIE3_OFFSET(node) XLP_HDR_OFFSET(node, 0, 1, 3) -#define XLP_IO_USB_OFFSET(node, i) XLP_HDR_OFFSET(node,0,2,i) -#define XLP_IO_USB_EHCI0_OFFSET(node) XLP_HDR_OFFSET(node,0,2,0) -#define XLP_IO_USB_OHCI0_OFFSET(node) XLP_HDR_OFFSET(node,0,2,1) -#define XLP_IO_USB_OHCI1_OFFSET(node) XLP_HDR_OFFSET(node,0,2,2) -#define XLP_IO_USB_EHCI1_OFFSET(node) XLP_HDR_OFFSET(node,0,2,3) -#define XLP_IO_USB_OHCI2_OFFSET(node) XLP_HDR_OFFSET(node,0,2,4) -#define XLP_IO_USB_OHCI3_OFFSET(node) XLP_HDR_OFFSET(node,0,2,5) +#define XLP_IO_USB_OFFSET(node, i) XLP_HDR_OFFSET(node, 0, 2, i) +#define XLP_IO_USB_EHCI0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 0) +#define XLP_IO_USB_OHCI0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 1) +#define XLP_IO_USB_OHCI1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 2) +#define XLP_IO_USB_EHCI1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 3) +#define XLP_IO_USB_OHCI2_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 4) +#define XLP_IO_USB_OHCI3_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 5) -#define XLP_IO_NAE_OFFSET(node) XLP_HDR_OFFSET(node,0,3,0) -#define XLP_IO_POE_OFFSET(node) XLP_HDR_OFFSET(node,0,3,1) +#define XLP_IO_NAE_OFFSET(node) XLP_HDR_OFFSET(node, 0, 3, 0) +#define XLP_IO_POE_OFFSET(node) XLP_HDR_OFFSET(node, 0, 3, 1) -#define XLP_IO_CMS_OFFSET(node) XLP_HDR_OFFSET(node,0,4,0) +#define XLP_IO_CMS_OFFSET(node) XLP_HDR_OFFSET(node, 0, 4, 0) -#define XLP_IO_DMA_OFFSET(node) XLP_HDR_OFFSET(node,0,5,1) -#define XLP_IO_SEC_OFFSET(node) XLP_HDR_OFFSET(node,0,5,2) -#define XLP_IO_CMP_OFFSET(node) XLP_HDR_OFFSET(node,0,5,3) +#define XLP_IO_DMA_OFFSET(node) XLP_HDR_OFFSET(node, 0, 5, 1) +#define XLP_IO_SEC_OFFSET(node) XLP_HDR_OFFSET(node, 0, 5, 2) +#define XLP_IO_CMP_OFFSET(node) XLP_HDR_OFFSET(node, 0, 5, 3) -#define XLP_IO_UART_OFFSET(node, i) XLP_HDR_OFFSET(node,0,6,i) -#define XLP_IO_UART0_OFFSET(node) XLP_HDR_OFFSET(node,0,6,0) -#define XLP_IO_UART1_OFFSET(node) XLP_HDR_OFFSET(node,0,6,1) -#define XLP_IO_I2C_OFFSET(node, i) XLP_HDR_OFFSET(node,0,6,2+i) -#define XLP_IO_I2C0_OFFSET(node) XLP_HDR_OFFSET(node,0,6,2) -#define XLP_IO_I2C1_OFFSET(node) XLP_HDR_OFFSET(node,0,6,3) -#define XLP_IO_GPIO_OFFSET(node) XLP_HDR_OFFSET(node,0,6,4) +#define XLP_IO_UART_OFFSET(node, i) XLP_HDR_OFFSET(node, 0, 6, i) +#define XLP_IO_UART0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 0) +#define XLP_IO_UART1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 1) +#define XLP_IO_I2C_OFFSET(node, i) XLP_HDR_OFFSET(node, 0, 6, 2 + i) +#define XLP_IO_I2C0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 2) +#define XLP_IO_I2C1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 3) +#define XLP_IO_GPIO_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 4) /* system management */ -#define XLP_IO_SYS_OFFSET(node) XLP_HDR_OFFSET(node,0,6,5) -#define XLP_IO_JTAG_OFFSET(node) XLP_HDR_OFFSET(node,0,6,6) +#define XLP_IO_SYS_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 5) +#define XLP_IO_JTAG_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 6) -#define XLP_IO_NOR_OFFSET(node) XLP_HDR_OFFSET(node,0,7,0) -#define XLP_IO_NAND_OFFSET(node) XLP_HDR_OFFSET(node,0,7,1) -#define XLP_IO_SPI_OFFSET(node) XLP_HDR_OFFSET(node,0,7,2) +#define XLP_IO_NOR_OFFSET(node) XLP_HDR_OFFSET(node, 0, 7, 0) +#define XLP_IO_NAND_OFFSET(node) XLP_HDR_OFFSET(node, 0, 7, 1) +#define XLP_IO_SPI_OFFSET(node) XLP_HDR_OFFSET(node, 0, 7, 2) /* SD flash */ -#define XLP_IO_SD_OFFSET(node) XLP_HDR_OFFSET(node,0,7,3) -#define XLP_IO_MMC_OFFSET(node, slot) ((XLP_IO_SD_OFFSET(node))+(slot*0x100)+XLP_IO_PCI_HDRSZ) +#define XLP_IO_SD_OFFSET(node) XLP_HDR_OFFSET(node, 0, 7, 3) +#define XLP_IO_MMC_OFFSET(node, slot) \ + ((XLP_IO_SD_OFFSET(node))+(slot*0x100)+XLP_IO_PCI_HDRSZ) + /* PCI config header register id's */ #define XLP_PCI_CFGREG0 0x00 #define XLP_PCI_CFGREG1 0x01 @@ -125,113 +118,35 @@ #define XLP_PCI_UCODEINFO_REG 0x3e #define XLP_PCI_SBB_WT_REG 0x3f +/* PCI IDs for SoC device */ +#define PCI_VENDOR_NETLOGIC 0x184e + +#define PCI_DEVICE_ID_NLM_ROOT 0x1001 +#define PCI_DEVICE_ID_NLM_ICI 0x1002 +#define PCI_DEVICE_ID_NLM_PIC 0x1003 +#define PCI_DEVICE_ID_NLM_PCIE 0x1004 +#define PCI_DEVICE_ID_NLM_EHCI 0x1007 +#define PCI_DEVICE_ID_NLM_ILK 0x1008 +#define PCI_DEVICE_ID_NLM_NAE 0x1009 +#define PCI_DEVICE_ID_NLM_POE 0x100A +#define PCI_DEVICE_ID_NLM_FMN 0x100B +#define PCI_DEVICE_ID_NLM_RAID 0x100D +#define PCI_DEVICE_ID_NLM_SAE 0x100D +#define PCI_DEVICE_ID_NLM_RSA 0x100E +#define PCI_DEVICE_ID_NLM_CMP 0x100F +#define PCI_DEVICE_ID_NLM_UART 0x1010 +#define PCI_DEVICE_ID_NLM_I2C 0x1011 +#define PCI_DEVICE_ID_NLM_NOR 0x1015 +#define PCI_DEVICE_ID_NLM_NAND 0x1016 +#define PCI_DEVICE_ID_NLM_MMC 0x1018 + #if !defined(LOCORE) && !defined(__ASSEMBLY__) -#ifndef __NLM_NLMIO_H__ -#error iomap.h needs mmio.h to be included -#endif +#define nlm_read_pci_reg(b, r) nlm_read_reg(b, r) +#define nlm_write_pci_reg(b, r, v) nlm_write_reg(b, r, v) -static __inline__ uint32_t -nlm_read_reg_kseg(uint64_t base, uint32_t reg) -{ - volatile uint32_t *addr = (volatile uint32_t *)(intptr_t)base + reg; +extern uint64_t xlp_sys_base; +extern uint64_t xlp_pic_base; +#endif /* !LOCORE or !__ASSEMBLY */ - return (*addr); -} - -static __inline__ void -nlm_write_reg_kseg(uint64_t base, uint32_t reg, uint32_t val) -{ - volatile uint32_t *addr = (volatile uint32_t *)(intptr_t)base + reg; - - *addr = val; -} - -static __inline__ uint64_t -nlm_read_reg64_kseg(uint64_t base, uint32_t reg) -{ - volatile uint64_t *addr = (volatile uint64_t *)(intptr_t)base + (reg >> 1); - - return (nlm_load_dword(addr)); -} - -static __inline__ void -nlm_write_reg64_kseg(uint64_t base, uint32_t reg, uint64_t val) -{ - volatile uint64_t *addr = (volatile uint64_t *)(intptr_t)base + (reg >> 1); - - return (nlm_store_dword(addr, val)); -} - -/* - * Routines to store 32/64 bit values to 64 bit addresses, - * used when going thru XKPHYS to access registers - */ -static __inline__ uint32_t -nlm_read_reg_xkseg(uint64_t base, uint32_t reg) -{ - uint64_t addr = base + reg * sizeof(uint32_t); - - return (nlm_load_word_daddr(addr)); -} - -static __inline__ void -nlm_write_reg_xkseg(uint64_t base, uint32_t reg, uint32_t val) -{ - uint64_t addr = base + reg * sizeof(uint32_t); - - return (nlm_store_word_daddr(addr, val)); -} - -static __inline__ uint64_t -nlm_read_reg64_xkseg(uint64_t base, uint32_t reg) -{ - uint64_t addr = base + (reg >> 1) * sizeof(uint64_t); - - return (nlm_load_dword_daddr(addr)); -} - -static __inline__ void -nlm_write_reg64_xkseg(uint64_t base, uint32_t reg, uint64_t val) -{ - uint64_t addr = base + (reg >> 1) * sizeof(uint64_t); - - return (nlm_store_dword_daddr(addr, val)); -} - -/* Location where IO base is mapped */ -extern uint64_t nlm_pcicfg_baseaddr; - -static __inline__ uint64_t -nlm_pcicfg_base(uint32_t devoffset) -{ - return (nlm_pcicfg_baseaddr + devoffset); -} - -static __inline__ uint64_t -nlm_pcibar0_base_xkphys(uint64_t pcibase) -{ - uint64_t paddr; - - paddr = nlm_read_reg_kseg(pcibase, XLP_PCI_CFGREG4) & ~0xfu; - return (0x9000000000000000 | paddr); -} -#define nlm_pci_rdreg(b, r) nlm_read_reg_kseg(b, r) -#define nlm_pci_wreg(b, r, v) nlm_write_reg_kseg(b, r, v) - -#endif /* !LOCORE && !__ASSEMBLY__*/ - - -/* COMPAT stuff - TODO remove */ -#define bit_set(p, m) ((p) |= (m)) -#define bit_clear(p, m) ((p) &= ~(m)) -#define bit_get(p,m) ((p) & (m)) -#define BIT(x) (0x01 << (x)) - -#define XLP_MAX_NODES 4 -#define XLP_MAX_CORES 8 -#define XLP_MAX_THREADS 4 -#define XLP_CACHELINE_SIZE 64 -#define XLP_NUM_NODES 1 /* we support only one now */ - -#endif +#endif /* __NLM_HAL_IOMAP_H__ */ diff --git a/sys/mips/nlm/hal/mips-extns.h b/sys/mips/nlm/hal/mips-extns.h index 7851b1b1863..839aa7313b0 100644 --- a/sys/mips/nlm/hal/mips-extns.h +++ b/sys/mips/nlm/hal/mips-extns.h @@ -25,8 +25,9 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ #ifndef __NLM_MIPS_EXTNS_H__ #define __NLM_MIPS_EXTNS_H__ @@ -91,91 +92,6 @@ static __inline__ uint64_t nlm_swapd(int32_t *loc, uint64_t val) } #endif -#if defined(__mips_n64) || defined(__mips_n32) -static __inline uint64_t -nlm_mfcr(uint32_t reg) -{ - uint64_t res; - - __asm__ __volatile__( - ".set push\n\t" - ".set noreorder\n\t" - "move $9, %1\n\t" - ".word 0x71280018\n\t" /* mfcr $8, $9 */ - "move %0, $8\n\t" - ".set pop\n" - : "=r" (res) : "r"(reg) - : "$8", "$9" - ); - return (res); -} - -static __inline void -nlm_mtcr(uint32_t reg, uint64_t value) -{ - __asm__ __volatile__( - ".set push\n\t" - ".set noreorder\n\t" - "move $8, %0\n" - "move $9, %1\n" - ".word 0x71280019\n" /* mtcr $8, $9 */ - ".set pop\n" - : - : "r" (value), "r" (reg) - : "$8", "$9" - ); -} - -#else /* !(defined(__mips_n64) || defined(__mips_n32)) */ - -static __inline__ uint64_t -nlm_mfcr(uint32_t reg) -{ - uint64_t hi; - uint64_t lo; - - __asm__ __volatile__ ( - ".set push\n" - ".set mips64\n" - "move $8, %2\n" - ".word 0x71090018\n" - "nop \n" - "dsra32 %0, $9, 0\n" - "sll %1, $9, 0\n" - ".set pop\n" - : "=r"(hi), "=r"(lo) - : "r"(reg) : "$8", "$9"); - - return (((uint64_t)hi) << 32) | lo; -} - -static __inline__ void -nlm_mtcr(uint32_t reg, uint64_t val) -{ - uint32_t hi, lo; - hi = val >> 32; - lo = val & 0xffffffff; - - __asm__ __volatile__ ( - ".set push\n" - ".set mips64\n" - "move $9, %0\n" - "dsll32 $9, %1, 0\n" - "dsll32 $8, %0, 0\n" - "dsrl32 $9, $9, 0\n" - "or $9, $9, $8\n" - "move $8, %2\n" - ".word 0x71090019\n" - "nop \n" - ".set pop\n" - ::"r"(hi), "r"(lo), "r"(reg) - : "$8", "$9"); -} -#endif /* (defined(__mips_n64) || defined(__mips_n32)) */ - -/* dcrc2 */ -/* XLP additional instructions */ - /* * Atomic increment a unsigned int */ @@ -196,5 +112,163 @@ nlm_ldaddwu(unsigned int value, unsigned int *addr) return (value); } +/* + * 32 bit read write for c0 + */ +#define read_c0_register32(reg, sel) \ +({ \ + uint32_t __rv; \ + __asm__ __volatile__( \ + ".set push\n\t" \ + ".set mips32\n\t" \ + "mfc0 %0, $%1, %2\n\t" \ + ".set pop\n" \ + : "=r" (__rv) : "i" (reg), "i" (sel) ); \ + __rv; \ + }) + +#define write_c0_register32(reg, sel, value) \ + __asm__ __volatile__( \ + ".set push\n\t" \ + ".set mips32\n\t" \ + "mtc0 %0, $%1, %2\n\t" \ + ".set pop\n" \ + : : "r" (value), "i" (reg), "i" (sel) ); + +#if defined(__mips_n64) || defined(__mips_n32) +/* + * On 64 bit compilation, the operations are simple + */ +#define read_c0_register64(reg, sel) \ +({ \ + uint64_t __rv; \ + __asm__ __volatile__( \ + ".set push\n\t" \ + ".set mips64\n\t" \ + "dmfc0 %0, $%1, %2\n\t" \ + ".set pop\n" \ + : "=r" (__rv) : "i" (reg), "i" (sel) ); \ + __rv; \ + }) + +#define write_c0_register64(reg, sel, value) \ + __asm__ __volatile__( \ + ".set push\n\t" \ + ".set mips64\n\t" \ + "dmtc0 %0, $%1, %2\n\t" \ + ".set pop\n" \ + : : "r" (value), "i" (reg), "i" (sel) ); +#else /* ! (defined(__mips_n64) || defined(__mips_n32)) */ + +/* + * 32 bit compilation, 64 bit values has to split + */ +#define read_c0_register64(reg, sel) \ +({ \ + uint32_t __high, __low; \ + __asm__ __volatile__( \ + ".set push\n\t" \ + ".set noreorder\n\t" \ + ".set mips64\n\t" \ + "dmfc0 $8, $%2, %3\n\t" \ + "dsra32 %0, $8, 0\n\t" \ + "sll %1, $8, 0\n\t" \ + ".set pop\n" \ + : "=r"(__high), "=r"(__low): "i"(reg), "i"(sel) \ + : "$8"); \ + ((uint64_t)__high << 32) | __low; \ +}) + +#define write_c0_register64(reg, sel, value) \ +do { \ + uint32_t __high = value >> 32; \ + uint32_t __low = value & 0xffffffff; \ + __asm__ __volatile__( \ + ".set push\n\t" \ + ".set noreorder\n\t" \ + ".set mips64\n\t" \ + "dsll32 $8, %1, 0\n\t" \ + "dsll32 $9, %0, 0\n\t" \ + "dsrl32 $8, $8, 0\n\t" \ + "or $8, $8, $9\n\t" \ + "dmtc0 $8, $%2, %3\n\t" \ + ".set pop" \ + :: "r"(__high), "r"(__low), "i"(reg), "i"(sel) \ + :"$8", "$9"); \ +} while(0) + #endif +/* functions to write to and read from the extended + * cp0 registers. + * EIRR : Extended Interrupt Request Register + * cp0 register 9 sel 6 + * bits 0...7 are same as cause register 8...15 + * EIMR : Extended Interrupt Mask Register + * cp0 register 9 sel 7 + * bits 0...7 are same as status register 8...15 + */ +static __inline uint64_t +nlm_read_c0_eirr(void) +{ + + return (read_c0_register64(9, 6)); +} + +static __inline void +nlm_write_c0_eirr(uint64_t val) +{ + + write_c0_register64(9, 6, val); +} + +static __inline uint64_t +nlm_read_c0_eimr(void) +{ + + return (read_c0_register64(9, 7)); +} + +static __inline void +nlm_write_c0_eimr(uint64_t val) +{ + + write_c0_register64(9, 7, val); +} + +static __inline__ uint32_t +nlm_read_c0_ebase(void) +{ + + return (read_c0_register32(15, 1)); +} + +static __inline__ int +nlm_nodeid(void) +{ + return (nlm_read_c0_ebase() >> 5) & 0x3; +} + +static __inline__ int +nlm_cpuid(void) +{ + return nlm_read_c0_ebase() & 0x1f; +} + +static __inline__ int +nlm_threadid(void) +{ + return nlm_read_c0_ebase() & 0x3; +} + +static __inline__ int +nlm_coreid(void) +{ + return (nlm_read_c0_ebase() >> 2) & 0x7; +} +#endif + +#define XLP_MAX_NODES 4 +#define XLP_MAX_CORES 8 +#define XLP_MAX_THREADS 4 + #endif diff --git a/sys/mips/nlm/hal/mmio.h b/sys/mips/nlm/hal/mmio.h deleted file mode 100644 index a19a8673e9e..00000000000 --- a/sys/mips/nlm/hal/mmio.h +++ /dev/null @@ -1,338 +0,0 @@ -/*- - * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - * NETLOGIC_BSD */ - -#ifndef __NLM_NLMIO_H__ -#define __NLM_NLMIO_H__ - -#if !defined(__mips_n32) && !defined(__mips_n64) -/* - * For o32 compilation, we have to disable interrupts and enable KX bit to - * access 64 bit addresses or data. - * - * We need to disable interrupts because we save just the lower 32 bits of - * registers in interrupt handling. So if we get hit by an interrupt while - * using the upper 32 bits of a register, we lose. - */ -static __inline__ uint32_t nlm_enable_kx(void) -{ - uint32_t sr; - - __asm__ __volatile__( - "mfc0 %0, $12 \n\t" /* read status reg */ - "move $8, %0 \n\t" - "ori $8, $8, 0x81 \n\t" /* set KX, and IE */ - "xori $8, $8, 0x1 \n\t" /* flip IE */ - "mtc0 $8, $12 \n\t" /* update status reg */ - : "=r"(sr) - : : "$8"); - - return (sr); -} - -static __inline__ void nlm_restore_kx(uint32_t sr) -{ - __asm__ __volatile__("mtc0 %0, $12" : : "r"(sr)); -} -#endif - -static __inline__ uint32_t -nlm_load_word(volatile uint32_t *addr) -{ - return (*addr); -} - -static __inline__ void -nlm_store_word(volatile uint32_t *addr, uint32_t val) -{ - *addr = val; -} - -#if defined(__mips_n64) || defined(__mips_n32) -static __inline__ uint64_t -nlm_load_dword(volatile uint64_t *addr) -{ - return (*addr); -} - -static __inline__ void -nlm_store_dword(volatile uint64_t *addr, uint64_t val) -{ - *addr = val; -} - -#else /* o32 */ -static __inline__ uint64_t -nlm_load_dword(volatile uint64_t *addr) -{ - uint32_t valhi, vallo, sr; - - sr = nlm_enable_kx(); - __asm__ __volatile__( - ".set push \n\t" - ".set mips64 \n\t" - "ld $8, 0(%2) \n\t" - "dsra32 %0, $8, 0 \n\t" - "sll %1, $8, 0 \n\t" - ".set pop \n" - : "=r"(valhi), "=r"(vallo) - : "r"(addr) - : "$8" ); - nlm_restore_kx(sr); - - return (((uint64_t)valhi << 32) | vallo); -} - -static __inline__ void -nlm_store_dword(volatile uint64_t *addr, uint64_t val) -{ - uint32_t valhi, vallo, sr; - - valhi = val >> 32; - vallo = val & 0xffffffff; - - sr = nlm_enable_kx(); - __asm__ __volatile__( - ".set push \n\t" - ".set mips64 \n\t" - "dsll32 $8, %1, 0 \n\t" - "dsll32 $9, %2, 0 \n\t" /* get rid of the */ - "dsrl32 $9, $9, 0 \n\t" /* sign extend */ - "or $9, $9, $8 \n\t" - "sd $9, 0(%0) \n\t" - ".set pop \n" - : : "r"(addr), "r"(valhi), "r"(vallo) - : "$8", "$9", "memory"); - nlm_restore_kx(sr); -} -#endif - -#if defined(__mips_n64) -static __inline__ uint64_t -nlm_load_word_daddr(uint64_t addr) -{ - volatile uint32_t *p = (volatile uint32_t *)(intptr_t)addr; - - return (*p); -} - -static __inline__ void -nlm_store_word_daddr(uint64_t addr, uint32_t val) -{ - volatile uint32_t *p = (volatile uint32_t *)(intptr_t)addr; - - *p = val; -} - -static __inline__ uint64_t -nlm_load_dword_daddr(uint64_t addr) -{ - volatile uint64_t *p = (volatile uint64_t *)(intptr_t)addr; - - return (*p); -} - -static __inline__ void -nlm_store_dword_daddr(uint64_t addr, uint64_t val) -{ - volatile uint64_t *p = (volatile uint64_t *)(intptr_t)addr; - - *p = val; -} - -#elif defined(__mips_n32) - -static __inline__ uint64_t -nlm_load_word_daddr(uint64_t addr) -{ - uint32_t val; - - __asm__ __volatile__( - ".set push \n\t" - ".set mips64 \n\t" - "lw %0, 0(%1) \n\t" - ".set pop \n" - : "=r"(val) - : "r"(addr)); - - return (val); -} - -static __inline__ void -nlm_store_word_daddr(uint64_t addr, uint32_t val) -{ - __asm__ __volatile__( - ".set push \n\t" - ".set mips64 \n\t" - "sw %0, 0(%1) \n\t" - ".set pop \n" - : : "r"(val), "r"(addr) - : "memory"); -} - -static __inline__ uint64_t -nlm_load_dword_daddr(uint64_t addr) -{ - uint64_t val; - - __asm__ __volatile__( - ".set push \n\t" - ".set mips64 \n\t" - "ld %0, 0(%1) \n\t" - ".set pop \n" - : "=r"(val) - : "r"(addr)); - return (val); -} - -static __inline__ void -nlm_store_dword_daddr(uint64_t addr, uint64_t val) -{ - __asm__ __volatile__( - ".set push \n\t" - ".set mips64 \n\t" - "sd %0, 0(%1) \n\t" - ".set pop \n" - : : "r"(val), "r"(addr) - : "memory"); -} - -#else /* o32 */ -static __inline__ uint64_t -nlm_load_word_daddr(uint64_t addr) -{ - uint32_t val, addrhi, addrlo, sr; - - addrhi = addr >> 32; - addrlo = addr & 0xffffffff; - - sr = nlm_enable_kx(); - __asm__ __volatile__( - ".set push \n\t" - ".set mips64 \n\t" - "dsll32 $8, %1, 0 \n\t" - "dsll32 $9, %2, 0 \n\t" /* get rid of the */ - "dsrl32 $9, $9, 0 \n\t" /* sign extend */ - "or $9, $9, $8 \n\t" - "lw %0, 0($9) \n\t" - ".set pop \n" - : "=r"(val) - : "r"(addrhi), "r"(addrlo) - : "$8", "$9"); - nlm_restore_kx(sr); - - return (val); - -} - -static __inline__ void -nlm_store_word_daddr(uint64_t addr, uint32_t val) -{ - uint32_t addrhi, addrlo, sr; - - addrhi = addr >> 32; - addrlo = addr & 0xffffffff; - - sr = nlm_enable_kx(); - __asm__ __volatile__( - ".set push \n\t" - ".set mips64 \n\t" - "dsll32 $8, %1, 0 \n\t" - "dsll32 $9, %2, 0 \n\t" /* get rid of the */ - "dsrl32 $9, $9, 0 \n\t" /* sign extend */ - "or $9, $9, $8 \n\t" - "sw %0, 0($9) \n\t" - ".set pop \n" - :: "r"(val), "r"(addrhi), "r"(addrlo) - : "$8", "$9", "memory"); - nlm_restore_kx(sr); -} - -static __inline__ uint64_t -nlm_load_dword_daddr(uint64_t addr) -{ - uint32_t addrh, addrl, sr; - uint32_t valh, vall; - - addrh = addr >> 32; - addrl = addr & 0xffffffff; - - sr = nlm_enable_kx(); - __asm__ __volatile__( - ".set push \n\t" - ".set mips64 \n\t" - "dsll32 $8, %2, 0 \n\t" - "dsll32 $9, %3, 0 \n\t" /* get rid of the */ - "dsrl32 $9, $9, 0 \n\t" /* sign extend */ - "or $9, $9, $8 \n\t" - "ld $8, 0($9) \n\t" - "dsra32 %0, $8, 0 \n\t" - "sll %1, $8, 0 \n\t" - ".set pop \n" - : "=r"(valh), "=r"(vall) - : "r"(addrh), "r"(addrl) - : "$8", "$9"); - nlm_restore_kx(sr); - - return (((uint64_t)valh << 32) | vall); -} - -static __inline__ void -nlm_store_dword_daddr(uint64_t addr, uint64_t val) -{ - uint32_t addrh, addrl, sr; - uint32_t valh, vall; - - addrh = addr >> 32; - addrl = addr & 0xffffffff; - valh = val >> 32; - vall = val & 0xffffffff; - - sr = nlm_enable_kx(); - __asm__ __volatile__( - ".set push \n\t" - ".set mips64 \n\t" - "dsll32 $8, %2, 0 \n\t" - "dsll32 $9, %3, 0 \n\t" /* get rid of the */ - "dsrl32 $9, $9, 0 \n\t" /* sign extend */ - "or $9, $9, $8 \n\t" - "dsll32 $8, %0, 0 \n\t" - "dsll32 $10, %1, 0 \n\t" /* get rid of the */ - "dsrl32 $10, $10, 0 \n\t" /* sign extend */ - "or $8, $8, $10 \n\t" - "sd $8, 0($9) \n\t" - ".set pop \n" - : : "r"(valh), "r"(vall), "r"(addrh), "r"(addrl) - : "$8", "$9", "memory"); - nlm_restore_kx(sr); -} - -#endif /* __mips_n64 */ - -#endif diff --git a/sys/mips/nlm/hal/mmu.h b/sys/mips/nlm/hal/mmu.h index a6207275319..ebb4b5d6703 100644 --- a/sys/mips/nlm/hal/mmu.h +++ b/sys/mips/nlm/hal/mmu.h @@ -25,44 +25,66 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ #ifndef __XLP_MMU_H__ #define __XLP_MMU_H__ -#include #include -#define XLP_MMU_SETUP_REG 0x400 -#define XLP_MMU_LFSRSEED_REG 0x401 -#define XLP_MMU_HPW_NUM_PAGE_LVL_REG 0x410 -#define XLP_MMU_PGWKR_PGDBASE_REG 0x411 -#define XLP_MMU_PGWKR_PGDSHFT_REG 0x412 -#define XLP_MMU_PGWKR_PGDMASK_REG 0x413 -#define XLP_MMU_PGWKR_PUDSHFT_REG 0x414 -#define XLP_MMU_PGWKR_PUDMASK_REG 0x415 -#define XLP_MMU_PGWKR_PMDSHFT_REG 0x416 -#define XLP_MMU_PGWKR_PMDMASK_REG 0x417 -#define XLP_MMU_PGWKR_PTESHFT_REG 0x418 -#define XLP_MMU_PGWKR_PTEMASK_REG 0x419 +static __inline__ uint32_t +nlm_read_c0_config6(void) +{ + uint32_t rv; -typedef struct hw_pagewalker { - int pgd_present; - int pud_present; - int pmd_present; - int pte_present; - uint64_t pgd_baseaddr; - uint32_t pgd_shift; - uint32_t pgd_mask; - uint32_t pud_shift; - uint32_t pud_mask; - uint32_t pmd_shift; - uint32_t pmd_mask; - uint32_t pte_shift; - uint32_t pte_mask; -} nlm_pagewalker; + __asm__ __volatile__ ( + ".set push\n" + ".set mips64\n" + "mfc0 %0, $16, 6\n" + ".set pop\n" + : "=r" (rv)); + return rv; +} + +static __inline__ void +nlm_write_c0_config6(uint32_t value) +{ + __asm__ __volatile__ ( + ".set push\n" + ".set mips64\n" + "mtc0 %0, $16, 6\n" + ".set pop\n" + : : "r" (value)); +} + +static __inline__ uint32_t +nlm_read_c0_config7(void) +{ + uint32_t rv; + + __asm__ __volatile__ ( + ".set push\n" + ".set mips64\n" + "mfc0 %0, $16, 7\n" + ".set pop\n" + : "=r" (rv)); + + return rv; +} + +static __inline__ void +nlm_write_c0_config7(uint32_t value) +{ + __asm__ __volatile__ ( + ".set push\n" + ".set mips64\n" + "mtc0 %0, $16, 7\n" + ".set pop\n" + : : "r" (value)); +} /** * On power on reset, XLP comes up with 64 TLBs. * Large-variable-tlb's (ELVT) and extended TLB is disabled. @@ -101,7 +123,7 @@ static __inline__ void nlm_large_variable_tlb_en (int en) /* en = 1 to enable * en = 0 to disable */ -static __inline__ void nlm_pagewalker_en (int en) +static __inline__ void nlm_pagewalker_en(int en) { unsigned int val; @@ -114,7 +136,7 @@ static __inline__ void nlm_pagewalker_en (int en) /* en = 1 to enable * en = 0 to disable */ -static __inline__ void nlm_extended_tlb_en (int en) +static __inline__ void nlm_extended_tlb_en(int en) { unsigned int val; @@ -135,70 +157,9 @@ static __inline__ int nlm_get_num_vtlbs(void) return (((nlm_read_c0_config6() >> 6) & 0x3ff) + 1); } -static __inline__ void nlm_setup_extended_pagemask (int mask) +static __inline__ void nlm_setup_extended_pagemask(int mask) { nlm_write_c0_config7(mask); } -/* hashindex_en = 1 to enable hash mode, hashindex_en=0 to disable - * global_mode = 1 to enable global mode, global_mode=0 to disable - * clk_gating = 0 to enable clock gating, clk_gating=1 to disable - */ -static __inline__ void nlm_mmu_setup(int hashindex_en, int global_mode, - int clk_gating) -{ - /*uint32_t mmusetup = nlm_mfcr(XLP_MMU_SETUP_REG);*/ - - uint32_t mmusetup = 0; - mmusetup |= (hashindex_en << 13); - mmusetup |= (clk_gating << 3); - mmusetup |= (global_mode << 0); - nlm_mtcr(XLP_MMU_SETUP_REG, mmusetup); -} - -static __inline__ void nlm_mmu_lfsr_seed (int thr0_seed, int thr1_seed, - int thr2_seed, int thr3_seed) -{ - uint32_t seed = nlm_mfcr(XLP_MMU_LFSRSEED_REG); - seed |= ((thr3_seed & 0x7f) << 23); - seed |= ((thr2_seed & 0x7f) << 16); - seed |= ((thr1_seed & 0x7f) << 7); - seed |= ((thr0_seed & 0x7f) << 0); - nlm_mtcr(XLP_MMU_LFSRSEED_REG, seed); -} - -static __inline__ void nlm_pagewalker_setup (nlm_pagewalker *walker) -{ - uint64_t val; - - if (!walker->pgd_present) - return; - - val = nlm_mfcr(XLP_MMU_HPW_NUM_PAGE_LVL_REG); - - if (walker->pgd_present) - val |= (1 << 3); - - if (walker->pud_present) - val |= (1 << 2); - - if (walker->pmd_present) - val |= (1 << 1); - - if (walker->pte_present) - val |= (1 << 0); - - nlm_mtcr(XLP_MMU_HPW_NUM_PAGE_LVL_REG, val); - - nlm_mtcr(XLP_MMU_PGWKR_PGDBASE_REG, walker->pgd_baseaddr); - nlm_mtcr(XLP_MMU_PGWKR_PGDSHFT_REG, walker->pgd_shift); - nlm_mtcr(XLP_MMU_PGWKR_PGDMASK_REG, walker->pgd_mask); - nlm_mtcr(XLP_MMU_PGWKR_PUDSHFT_REG, walker->pud_shift); - nlm_mtcr(XLP_MMU_PGWKR_PUDMASK_REG, walker->pud_mask); - nlm_mtcr(XLP_MMU_PGWKR_PMDSHFT_REG, walker->pmd_shift); - nlm_mtcr(XLP_MMU_PGWKR_PMDMASK_REG, walker->pmd_mask); - nlm_mtcr(XLP_MMU_PGWKR_PTESHFT_REG, walker->pte_shift); - nlm_mtcr(XLP_MMU_PGWKR_PTEMASK_REG, walker->pte_mask); -} - #endif diff --git a/sys/mips/nlm/hal/pcibus.h b/sys/mips/nlm/hal/pcibus.h new file mode 100644 index 00000000000..6275ff19faa --- /dev/null +++ b/sys/mips/nlm/hal/pcibus.h @@ -0,0 +1,89 @@ +/*- + * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * NETLOGIC_BSD + * $FreeBSD$ + */ + +#ifndef __XLP_PCIBUS_H__ +#define __XLP_PCIBUS_H__ + +#define MSI_MIPS_ADDR_BASE 0xfee00000 +/* MSI support */ +#define MSI_MIPS_ADDR_DEST 0x000ff000 +#define MSI_MIPS_ADDR_RH 0x00000008 +#define MSI_MIPS_ADDR_RH_OFF 0x00000000 +#define MSI_MIPS_ADDR_RH_ON 0x00000008 +#define MSI_MIPS_ADDR_DM 0x00000004 +#define MSI_MIPS_ADDR_DM_PHYSICAL 0x00000000 +#define MSI_MIPS_ADDR_DM_LOGICAL 0x00000004 + +/* Fields in data for Intel MSI messages. */ +#define MSI_MIPS_DATA_TRGRMOD 0x00008000 /* Trigger mode */ +#define MSI_MIPS_DATA_TRGREDG 0x00000000 /* edge */ +#define MSI_MIPS_DATA_TRGRLVL 0x00008000 /* level */ + +#define MSI_MIPS_DATA_LEVEL 0x00004000 /* Polarity. */ +#define MSI_MIPS_DATA_DEASSERT 0x00000000 +#define MSI_MIPS_DATA_ASSERT 0x00004000 + +#define MSI_MIPS_DATA_DELMOD 0x00000700 /* Delivery Mode */ +#define MSI_MIPS_DATA_DELFIXED 0x00000000 /* fixed */ +#define MSI_MIPS_DATA_DELLOPRI 0x00000100 /* lowest priority */ + +#define MSI_MIPS_DATA_INTVEC 0x000000ff + +/* + * Build Intel MSI message and data values from a source. AMD64 systems + * seem to be compatible, so we use the same function for both. + */ +#define MIPS_MSI_ADDR(cpu) \ + (MSI_MIPS_ADDR_BASE | (cpu) << 12 | \ + MSI_MIPS_ADDR_RH_OFF | MSI_MIPS_ADDR_DM_PHYSICAL) + +#define MIPS_MSI_DATA(irq) \ + (MSI_MIPS_DATA_TRGRLVL | MSI_MIPS_DATA_DELFIXED | \ + MSI_MIPS_DATA_ASSERT | (irq)) + +#define PCIE_BRIDGE_CMD 0x1 +#define PCIE_BRIDGE_MSI_CAP 0x14 +#define PCIE_BRIDGE_MSI_ADDRL 0x15 +#define PCIE_BRIDGE_MSI_ADDRH 0x16 +#define PCIE_BRIDGE_MSI_DATA 0x17 + +/* XLP Global PCIE configuration space registers */ +#define PCIE_MSI_STATUS 0x25A +#define PCIE_MSI_EN 0x25B +#define PCIE_INT_EN0 0x261 + +/* PCIE_MSI_EN */ +#define PCIE_MSI_VECTOR_INT_EN 0xFFFFFFFF + +/* PCIE_INT_EN0 */ +#define PCIE_MSI_INT_EN (1 << 9) + +#endif /* __XLP_PCIBUS_H__ */ diff --git a/sys/mips/nlm/hal/pic.h b/sys/mips/nlm/hal/pic.h index 842a367babf..efc676e069c 100644 --- a/sys/mips/nlm/hal/pic.h +++ b/sys/mips/nlm/hal/pic.h @@ -25,403 +25,356 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ -#ifndef __XLP_PIC_H__ -#define __XLP_PIC_H__ +#ifndef _NLM_HAL_PIC_H +#define _NLM_HAL_PIC_H /* PIC Specific registers */ -#define XLP_PIC_CTRL_REG 0x40 -#define XLP_PIC_BYTESWAP_REG 0x42 -#define XLP_PIC_STATUS_REG 0x44 -#define XLP_PIC_INTR_TIMEOUT 0x46 -#define XLP_PIC_ICI0_INTR_TIMEOUT 0x48 -#define XLP_PIC_ICI1_INTR_TIMEOUT 0x4a -#define XLP_PIC_ICI2_INTR_TIMEOUT 0x4c -#define XLP_PIC_IPI_CTRL_REG 0x4e -#define XLP_PIC_INT_ACK_REG 0x50 -#define XLP_PIC_INT_PENDING0_REG 0x52 -#define XLP_PIC_INT_PENDING1_REG 0x54 -#define XLP_PIC_INT_PENDING2_REG 0x56 - -#define XLP_PIC_WDOG0_MAXVAL_REG 0x58 -#define XLP_PIC_WDOG0_COUNT_REG 0x5a -#define XLP_PIC_WDOG0_ENABLE0_REG 0x5c -#define XLP_PIC_WDOG0_ENABLE1_REG 0x5e -#define XLP_PIC_WDOG0_BEATCMD_REG 0x60 -#define XLP_PIC_WDOG0_BEAT0_REG 0x62 -#define XLP_PIC_WDOG0_BEAT1_REG 0x64 - -#define XLP_PIC_WDOG1_MAXVAL_REG 0x66 -#define XLP_PIC_WDOG1_COUNT_REG 0x68 -#define XLP_PIC_WDOG1_ENABLE0_REG 0x6a -#define XLP_PIC_WDOG1_ENABLE1_REG 0x6c -#define XLP_PIC_WDOG1_BEATCMD_REG 0x6e -#define XLP_PIC_WDOG1_BEAT0_REG 0x70 -#define XLP_PIC_WDOG1_BEAT1_REG 0x72 - -#define XLP_PIC_WDOG_MAXVAL_REG(i) (XLP_PIC_WDOG0_MAXVAL_REG + ((i) ? 7 : 0)) -#define XLP_PIC_WDOG_COUNT_REG(i) (XLP_PIC_WDOG0_COUNT_REG + ((i) ? 7 : 0)) -#define XLP_PIC_WDOG_ENABLE0_REG(i) (XLP_PIC_WDOG0_ENABLE0_REG + ((i) ? 7 : 0)) -#define XLP_PIC_WDOG_ENABLE1_REG(i) (XLP_PIC_WDOG0_ENABLE1_REG + ((i) ? 7 : 0)) -#define XLP_PIC_WDOG_BEATCMD_REG(i) (XLP_PIC_WDOG0_BEATCMD_REG + ((i) ? 7 : 0)) -#define XLP_PIC_WDOG_BEAT0_REG(i) (XLP_PIC_WDOG0_BEAT0_REG + ((i) ? 7 : 0)) -#define XLP_PIC_WDOG_BEAT1_REG(i) (XLP_PIC_WDOG0_BEAT1_REG + ((i) ? 7 : 0)) - -#define XLP_PIC_SYSTIMER0_MAXVAL_REG 0x74 -#define XLP_PIC_SYSTIMER1_MAXVAL_REG 0x76 -#define XLP_PIC_SYSTIMER2_MAXVAL_REG 0x78 -#define XLP_PIC_SYSTIMER3_MAXVAL_REG 0x7a -#define XLP_PIC_SYSTIMER4_MAXVAL_REG 0x7c -#define XLP_PIC_SYSTIMER5_MAXVAL_REG 0x7e -#define XLP_PIC_SYSTIMER6_MAXVAL_REG 0x80 -#define XLP_PIC_SYSTIMER7_MAXVAL_REG 0x82 -#define XLP_PIC_SYSTIMER_MAXVAL_REG(i) (XLP_PIC_SYSTIMER0_MAXVAL_REG + ((i)*2)) - -#define XLP_PIC_SYSTIMER0_COUNT_REG 0x84 -#define XLP_PIC_SYSTIMER1_COUNT_REG 0x86 -#define XLP_PIC_SYSTIMER2_COUNT_REG 0x88 -#define XLP_PIC_SYSTIMER3_COUNT_REG 0x8a -#define XLP_PIC_SYSTIMER4_COUNT_REG 0x8c -#define XLP_PIC_SYSTIMER5_COUNT_REG 0x8e -#define XLP_PIC_SYSTIMER6_COUNT_REG 0x90 -#define XLP_PIC_SYSTIMER7_COUNT_REG 0x92 -#define XLP_PIC_SYSTIMER_COUNT_REG(i) (XLP_PIC_SYSTIMER0_COUNT_REG + ((i)*2)) - -#define XLP_PIC_ITE0_N0_N1_REG 0x94 -#define XLP_PIC_ITE1_N0_N1_REG 0x98 -#define XLP_PIC_ITE2_N0_N1_REG 0x9c -#define XLP_PIC_ITE3_N0_N1_REG 0xa0 -#define XLP_PIC_ITE4_N0_N1_REG 0xa4 -#define XLP_PIC_ITE5_N0_N1_REG 0xa8 -#define XLP_PIC_ITE6_N0_N1_REG 0xac -#define XLP_PIC_ITE7_N0_N1_REG 0xb0 -#define XLP_PIC_ITE_N0_N1_REG(i) (XLP_PIC_ITE0_N0_N1_REG + ((i)*4)) - -#define XLP_PIC_ITE0_N2_N3_REG 0x96 -#define XLP_PIC_ITE1_N2_N3_REG 0x9a -#define XLP_PIC_ITE2_N2_N3_REG 0x9e -#define XLP_PIC_ITE3_N2_N3_REG 0xa2 -#define XLP_PIC_ITE4_N2_N3_REG 0xa6 -#define XLP_PIC_ITE5_N2_N3_REG 0xaa -#define XLP_PIC_ITE6_N2_N3_REG 0xae -#define XLP_PIC_ITE7_N2_N3_REG 0xb2 -#define XLP_PIC_ITE_N2_N3_REG(i) (XLP_PIC_ITE0_N2_N3_REG + ((i)*4)) - -#define XLP_PIC_IRT0_REG 0xb4 -#define XLP_PIC_IRT_REG(i) (XLP_PIC_IRT0_REG + ((i)*2)) - -/* PIC IRT indices */ - -#define XLP_PIC_IRT_WD0_INDEX 0 -#define XLP_PIC_IRT_WD1_INDEX 1 -#define XLP_PIC_IRT_WD_NMI0_INDEX 2 -#define XLP_PIC_IRT_WD_NMI1_INDEX 3 -#define XLP_PIC_IRT_TIMER0_INDEX 4 -#define XLP_PIC_IRT_TIMER1_INDEX 5 -#define XLP_PIC_IRT_TIMER2_INDEX 6 -#define XLP_PIC_IRT_TIMER3_INDEX 7 -#define XLP_PIC_IRT_TIMER4_INDEX 8 -#define XLP_PIC_IRT_TIMER5_INDEX 9 -#define XLP_PIC_IRT_TIMER6_INDEX 10 -#define XLP_PIC_IRT_TIMER7_INDEX 11 -#define XLP_PIC_IRT_TIMER_INDEX(i) (XLP_PIC_IRT_TIMER0_INDEX + (i)) - -#define XLP_PIC_IRT_MSGQ0_INDEX 12 -#define XLP_PIC_IRT_MSGQ_INDEX(i) (XLP_PIC_IRT_MSGQ0_INDEX + (i)) -/* 12 to 43 */ -#define XLP_PIC_IRT_MSG0_INDEX 44 -#define XLP_PIC_IRT_MSG1_INDEX 45 - -#define XLP_PIC_IRT_PCIE_MSIX0_INDEX 46 -#define XLP_PIC_IRT_PCIE_MSIX_INDEX(i) (XLP_PIC_IRT_PCIE_MSIX0_INDEX + (i)) -/* 46 to 77 */ -#define XLP_PIC_IRT_PCIE_LINK0_INDEX 78 -#define XLP_PIC_IRT_PCIE_LINK1_INDEX 79 -#define XLP_PIC_IRT_PCIE_LINK2_INDEX 80 -#define XLP_PIC_IRT_PCIE_LINK3_INDEX 81 -#define XLP_PIC_IRT_PCIE_LINK_INDEX(i) (XLP_PIC_IRT_PCIE_LINK0_INDEX + (i)) -/* 78 to 81 */ -#define XLP_PIC_IRT_NA0_INDEX 82 -#define XLP_PIC_IRT_NA_INDEX(i) (XLP_PIC_IRT_NA0_INDEX + (i)) -/* 82 to 113 */ -#define XLP_PIC_IRT_POE_INDEX 114 -#define XLP_PIC_IRT_USB0_INDEX 115 -#define XLP_PIC_IRT_EHCI0_INDEX 115 -#define XLP_PIC_IRT_EHCI1_INDEX 118 -#define XLP_PIC_IRT_USB_INDEX(i) (XLP_PIC_IRT_USB0_INDEX + (i)) -/* 115 to 120 */ -#define XLP_PIC_IRT_GDX_INDEX 121 -#define XLP_PIC_IRT_SEC_INDEX 122 -#define XLP_PIC_IRT_RSA_INDEX 123 -#define XLP_PIC_IRT_COMP0_INDEX 124 -#define XLP_PIC_IRT_COMP_INDEX(i) (XLP_PIC_IRT_COMP0_INDEX + (i)) -/* 124 to 127 */ -#define XLP_PIC_IRT_GBU_INDEX 128 -/* coherent inter chip */ -#define XLP_PIC_IRT_CIC0_INDEX 129 -#define XLP_PIC_IRT_CIC1_INDEX 130 -#define XLP_PIC_IRT_CIC2_INDEX 131 -#define XLP_PIC_IRT_CAM_INDEX 132 -#define XLP_PIC_IRT_UART0_INDEX 133 -#define XLP_PIC_IRT_UART1_INDEX 134 -#define XLP_PIC_IRT_I2C0_INDEX 135 -#define XLP_PIC_IRT_I2C1_INDEX 136 -#define XLP_PIC_IRT_SYS0_INDEX 137 -#define XLP_PIC_IRT_SYS1_INDEX 138 -#define XLP_PIC_IRT_JTAG_INDEX 139 -#define XLP_PIC_IRT_PIC_INDEX 140 -#define XLP_PIC_IRT_NBU_INDEX 141 -#define XLP_PIC_IRT_TCU_INDEX 142 -/* global coherency */ -#define XLP_PIC_IRT_GCU_INDEX 143 -#define XLP_PIC_IRT_DMC0_INDEX 144 -#define XLP_PIC_IRT_DMC1_INDEX 145 -#define XLP_PIC_IRT_GPIO0_INDEX 146 -#define XLP_PIC_IRT_GPIO_INDEX(i) (XLP_PIC_IRT_GPIO0_INDEX + (i)) -/* 146 to 149 */ -#define XLP_PIC_IRT_NOR_INDEX 150 -#define XLP_PIC_IRT_NAND_INDEX 151 -#define XLP_PIC_IRT_SPI_INDEX 152 -#define XLP_PIC_IRT_MMC_INDEX 153 +#define PIC_CTRL 0x00 /* PIC control register defines */ -#define XLP_PIC_ITV_OFFSET 32 /* interrupt timeout value */ -#define XLP_PIC_ICI_OFFSET 19 /* ICI interrupt timeout enable */ -#define XLP_PIC_ITE_OFFSET 18 /* interrupt timeout enable */ -#define XLP_PIC_STE_OFFSET 10 /* system timer interrupt enable */ -#define XLP_PIC_WWR1_OFFSET 8 /* watchdog timer 1 wraparound count for reset */ -#define XLP_PIC_WWR0_OFFSET 6 /* watchdog timer 0 wraparound count for reset */ -#define XLP_PIC_WWN1_OFFSET 4 /* watchdog timer 1 wraparound count for NMI */ -#define XLP_PIC_WWN0_OFFSET 2 /* watchdog timer 0 wraparound count for NMI */ -#define XLP_PIC_WTE_OFFSET 0 /* watchdog timer enable */ +#define PIC_CTRL_ITV 32 /* interrupt timeout value */ +#define PIC_CTRL_ICI 19 /* ICI interrupt timeout enable */ +#define PIC_CTRL_ITE 18 /* interrupt timeout enable */ +#define PIC_CTRL_STE 10 /* system timer interrupt enable */ +#define PIC_CTRL_WWR1 8 /* watchdog 1 wraparound count for reset */ +#define PIC_CTRL_WWR0 6 /* watchdog 0 wraparound count for reset */ +#define PIC_CTRL_WWN1 4 /* watchdog 1 wraparound count for NMI */ +#define PIC_CTRL_WWN0 2 /* watchdog 0 wraparound count for NMI */ +#define PIC_CTRL_WTE 0 /* watchdog timer enable */ /* PIC Status register defines */ -#define XLP_PIC_ICI_STATUS_OFFSET 33 /* ICI interrupt timeout interrupt status */ -#define XLP_PIC_ITE_STATUS_OFFSET 32 /* interrupt timeout interrupt status */ -#define XLP_PIC_STS_STATUS_OFFSET 4 /* System timer interrupt status */ -#define XLP_PIC_WNS_STATUS_OFFSET 2 /* NMI interrupt status for watchdog timers */ -#define XLP_PIC_WIS_STATUS_OFFSET 0 /* Interrupt status for watchdog timers */ +#define PIC_ICI_STATUS 33 /* ICI interrupt timeout status */ +#define PIC_ITE_STATUS 32 /* interrupt timeout status */ +#define PIC_STS_STATUS 4 /* System timer interrupt status */ +#define PIC_WNS_STATUS 2 /* NMI status for watchdog timers */ +#define PIC_WIS_STATUS 0 /* Interrupt status for watchdog timers */ /* PIC IPI control register offsets */ -#define XLP_PIC_IPICTRL_NMI_OFFSET 32 -#define XLP_PIC_IPICTRL_RIV_OFFSET 20 /* received interrupt vector */ -#define XLP_PIC_IPICTRL_IDB_OFFSET 16 /* interrupt destination base */ -#define XLP_PIC_IPICTRL_DTE_OFFSET 16 /* interrupt destination thread enables */ +#define PIC_IPICTRL_NMI 32 +#define PIC_IPICTRL_RIV 20 /* received interrupt vector */ +#define PIC_IPICTRL_IDB 16 /* interrupt destination base */ +#define PIC_IPICTRL_DTE 0 /* interrupt destination thread enables */ /* PIC IRT register offsets */ -#define XLP_PIC_IRT_ENABLE_OFFSET 31 -#define XLP_PIC_IRT_NMI_OFFSET 29 -#define XLP_PIC_IRT_SCH_OFFSET 28 /* Scheduling scheme */ -#define XLP_PIC_IRT_RVEC_OFFSET 20 /* Interrupt receive vectors */ -#define XLP_PIC_IRT_DT_OFFSET 19 /* Destination type */ -#define XLP_PIC_IRT_DB_OFFSET 16 /* Destination base */ -#define XLP_PIC_IRT_DTE_OFFSET 0 /* Destination thread enables */ +#define PIC_IRT_ENABLE 31 +#define PIC_IRT_NMI 29 +#define PIC_IRT_SCH 28 /* Scheduling scheme */ +#define PIC_IRT_RVEC 20 /* Interrupt receive vectors */ +#define PIC_IRT_DT 19 /* Destination type */ +#define PIC_IRT_DB 16 /* Destination base */ +#define PIC_IRT_DTE 0 /* Destination thread enables */ -#define XLP_PIC_MAX_IRQ 64 -#define XLP_PIC_MAX_IRT 160 -#define XLP_PIC_TIMER_FREQ 133000000 +#define PIC_BYTESWAP 0x02 +#define PIC_STATUS 0x04 +#define PIC_INTR_TIMEOUT 0x06 +#define PIC_ICI0_INTR_TIMEOUT 0x08 +#define PIC_ICI1_INTR_TIMEOUT 0x0a +#define PIC_ICI2_INTR_TIMEOUT 0x0c +#define PIC_IPI_CTL 0x0e +#define PIC_INT_ACK 0x10 +#define PIC_INT_PENDING0 0x12 +#define PIC_INT_PENDING1 0x14 +#define PIC_INT_PENDING2 0x16 + +#define PIC_WDOG0_MAXVAL 0x18 +#define PIC_WDOG0_COUNT 0x1a +#define PIC_WDOG0_ENABLE0 0x1c +#define PIC_WDOG0_ENABLE1 0x1e +#define PIC_WDOG0_BEATCMD 0x20 +#define PIC_WDOG0_BEAT0 0x22 +#define PIC_WDOG0_BEAT1 0x24 + +#define PIC_WDOG1_MAXVAL 0x26 +#define PIC_WDOG1_COUNT 0x28 +#define PIC_WDOG1_ENABLE0 0x2a +#define PIC_WDOG1_ENABLE1 0x2c +#define PIC_WDOG1_BEATCMD 0x2e +#define PIC_WDOG1_BEAT0 0x30 +#define PIC_WDOG1_BEAT1 0x32 + +#define PIC_WDOG_MAXVAL(i) (PIC_WDOG0_MAXVAL + ((i) ? 7 : 0)) +#define PIC_WDOG_COUNT(i) (PIC_WDOG0_COUNT + ((i) ? 7 : 0)) +#define PIC_WDOG_ENABLE0(i) (PIC_WDOG0_ENABLE0 + ((i) ? 7 : 0)) +#define PIC_WDOG_ENABLE1(i) (PIC_WDOG0_ENABLE1 + ((i) ? 7 : 0)) +#define PIC_WDOG_BEATCMD(i) (PIC_WDOG0_BEATCMD + ((i) ? 7 : 0)) +#define PIC_WDOG_BEAT0(i) (PIC_WDOG0_BEAT0 + ((i) ? 7 : 0)) +#define PIC_WDOG_BEAT1(i) (PIC_WDOG0_BEAT1 + ((i) ? 7 : 0)) + +#define PIC_TIMER0_MAXVAL 0x34 +#define PIC_TIMER1_MAXVAL 0x36 +#define PIC_TIMER2_MAXVAL 0x38 +#define PIC_TIMER3_MAXVAL 0x3a +#define PIC_TIMER4_MAXVAL 0x3c +#define PIC_TIMER5_MAXVAL 0x3e +#define PIC_TIMER6_MAXVAL 0x40 +#define PIC_TIMER7_MAXVAL 0x42 +#define PIC_TIMER_MAXVAL(i) (PIC_TIMER0_MAXVAL + ((i) * 2)) + +#define PIC_TIMER0_COUNT 0x44 +#define PIC_TIMER1_COUNT 0x46 +#define PIC_TIMER2_COUNT 0x48 +#define PIC_TIMER3_COUNT 0x4a +#define PIC_TIMER4_COUNT 0x4c +#define PIC_TIMER5_COUNT 0x4e +#define PIC_TIMER6_COUNT 0x50 +#define PIC_TIMER7_COUNT 0x52 +#define PIC_TIMER_COUNT(i) (PIC_TIMER0_COUNT + ((i) * 2)) + +#define PIC_ITE0_N0_N1 0x54 +#define PIC_ITE1_N0_N1 0x58 +#define PIC_ITE2_N0_N1 0x5c +#define PIC_ITE3_N0_N1 0x60 +#define PIC_ITE4_N0_N1 0x64 +#define PIC_ITE5_N0_N1 0x68 +#define PIC_ITE6_N0_N1 0x6c +#define PIC_ITE7_N0_N1 0x70 +#define PIC_ITE_N0_N1(i) (PIC_ITE0_N0_N1 + ((i) * 4)) + +#define PIC_ITE0_N2_N3 0x56 +#define PIC_ITE1_N2_N3 0x5a +#define PIC_ITE2_N2_N3 0x5e +#define PIC_ITE3_N2_N3 0x62 +#define PIC_ITE4_N2_N3 0x66 +#define PIC_ITE5_N2_N3 0x6a +#define PIC_ITE6_N2_N3 0x6e +#define PIC_ITE7_N2_N3 0x72 +#define PIC_ITE_N2_N3(i) (PIC_ITE0_N2_N3 + ((i) * 4)) + +#define PIC_IRT0 0x74 +#define PIC_IRT(i) (PIC_IRT0 + ((i) * 2)) + +#define TIMER_CYCLES_MAXVAL 0xffffffffffffffffULL + +/* + * IRT Map + */ +#define PIC_NUM_IRTS 160 + +#define PIC_IRT_WD_0_INDEX 0 +#define PIC_IRT_WD_1_INDEX 1 +#define PIC_IRT_WD_NMI_0_INDEX 2 +#define PIC_IRT_WD_NMI_1_INDEX 3 +#define PIC_IRT_TIMER_0_INDEX 4 +#define PIC_IRT_TIMER_1_INDEX 5 +#define PIC_IRT_TIMER_2_INDEX 6 +#define PIC_IRT_TIMER_3_INDEX 7 +#define PIC_IRT_TIMER_4_INDEX 8 +#define PIC_IRT_TIMER_5_INDEX 9 +#define PIC_IRT_TIMER_6_INDEX 10 +#define PIC_IRT_TIMER_7_INDEX 11 +#define PIC_IRT_CLOCK_INDEX PIC_IRT_TIMER_7_INDEX +#define PIC_IRT_TIMER_INDEX(num) ((num) + PIC_IRT_TIMER_0_INDEX) + + +/* 11 and 12 */ +#define PIC_NUM_MSG_Q_IRTS 32 +#define PIC_IRT_MSG_Q0_INDEX 12 +#define PIC_IRT_MSG_Q_INDEX(qid) ((qid) + PIC_IRT_MSG_Q0_INDEX) +/* 12 to 43 */ +#define PIC_IRT_MSG_0_INDEX 44 +#define PIC_IRT_MSG_1_INDEX 45 +/* 44 and 45 */ +#define PIC_NUM_PCIE_MSIX_IRTS 32 +#define PIC_IRT_PCIE_MSIX_0_INDEX 46 +#define PIC_IRT_PCIE_MSIX_INDEX(num) ((num) + PIC_IRT_PCIE_MSIX_0_INDEX) +/* 46 to 77 */ +#define PIC_NUM_PCIE_LINK_IRTS 4 +#define PIC_IRT_PCIE_LINK_0_INDEX 78 +#define PIC_IRT_PCIE_LINK_1_INDEX 79 +#define PIC_IRT_PCIE_LINK_2_INDEX 80 +#define PIC_IRT_PCIE_LINK_3_INDEX 81 +#define PIC_IRT_PCIE_LINK_INDEX(num) ((num) + PIC_IRT_PCIE_LINK_0_INDEX) +/* 78 to 81 */ +#define PIC_NUM_NA_IRTS 32 +/* 82 to 113 */ +#define PIC_IRT_NA_0_INDEX 82 +#define PIC_IRT_NA_INDEX(num) ((num) + PIC_IRT_NA_0_INDEX) +#define PIC_IRT_POE_INDEX 114 + +#define PIC_NUM_USB_IRTS 6 +#define PIC_IRT_USB_0_INDEX 115 +#define PIC_IRT_EHCI_0_INDEX 115 +#define PIC_IRT_EHCI_1_INDEX 118 +#define PIC_IRT_USB_INDEX(num) ((num) + PIC_IRT_USB_0_INDEX) +/* 115 to 120 */ +#define PIC_IRT_GDX_INDEX 121 +#define PIC_IRT_SEC_INDEX 122 +#define PIC_IRT_RSA_INDEX 123 + +#define PIC_NUM_COMP_IRTS 4 +#define PIC_IRT_COMP_0_INDEX 124 +#define PIC_IRT_COMP_INDEX(num) ((num) + PIC_IRT_COMP_0_INDEX) +/* 124 to 127 */ +#define PIC_IRT_GBU_INDEX 128 +#define PIC_IRT_ICC_0_INDEX 129 /* ICC - Inter Chip Coherency */ +#define PIC_IRT_ICC_1_INDEX 130 +#define PIC_IRT_ICC_2_INDEX 131 +#define PIC_IRT_CAM_INDEX 132 +#define PIC_IRT_UART_0_INDEX 133 +#define PIC_IRT_UART_1_INDEX 134 +#define PIC_IRT_I2C_0_INDEX 135 +#define PIC_IRT_I2C_1_INDEX 136 +#define PIC_IRT_SYS_0_INDEX 137 +#define PIC_IRT_SYS_1_INDEX 138 +#define PIC_IRT_JTAG_INDEX 139 +#define PIC_IRT_PIC_INDEX 140 +#define PIC_IRT_NBU_INDEX 141 +#define PIC_IRT_TCU_INDEX 142 +#define PIC_IRT_GCU_INDEX 143 /* GBC - Global Coherency */ +#define PIC_IRT_DMC_0_INDEX 144 +#define PIC_IRT_DMC_1_INDEX 145 + +#define PIC_NUM_GPIO_IRTS 4 +#define PIC_IRT_GPIO_0_INDEX 146 +#define PIC_IRT_GPIO_INDEX(num) ((num) + PIC_IRT_GPIO_0_INDEX) + +/* 146 to 149 */ +#define PIC_IRT_NOR_INDEX 150 +#define PIC_IRT_NAND_INDEX 151 +#define PIC_IRT_SPI_INDEX 152 +#define PIC_IRT_MMC_INDEX 153 + +#define PIC_CLOCK_TIMER 7 +#define PIC_IRQ_BASE 8 #if !defined(LOCORE) && !defined(__ASSEMBLY__) -#define nlm_rdreg_pic(b, r) nlm_read_reg64_kseg(b,r) -#define nlm_wreg_pic(b, r, v) nlm_write_reg64_kseg(b,r,v) -#define nlm_pcibase_pic(node) nlm_pcicfg_base(XLP_IO_PIC_OFFSET(node)) -#define nlm_regbase_pic(node) nlm_pcibase_pic(node) +#define PIC_IRT_FIRST_IRQ (PIC_IRQ_BASE) +#define PIC_IRT_LAST_IRQ 63 +#define PIC_IRQ_IS_IRT(irq) ((irq) >= PIC_IRT_FIRST_IRQ) + +/* + * Misc + */ +#define PIC_IRT_VALID 1 +#define PIC_LOCAL_SCHEDULING 1 +#define PIC_GLOBAL_SCHEDULING 0 + +#define nlm_read_pic_reg(b, r) nlm_read_reg64(b, r) +#define nlm_write_pic_reg(b, r, v) nlm_write_reg64(b, r, v) +#define nlm_get_pic_pcibase(node) nlm_pcicfg_base(XLP_IO_PIC_OFFSET(node)) +#define nlm_get_pic_regbase(node) (nlm_get_pic_pcibase(node) + XLP_IO_PCI_HDRSZ) /* IRT and h/w interrupt routines */ -static __inline__ int -nlm_pic_get_numirts(uint64_t pcibase) -{ - return (nlm_pci_rdreg(pcibase, XLP_PCI_IRTINFO_REG) >> 16); -} - -static __inline__ int -nlm_pic_get_startirt(uint64_t base) -{ - return (nlm_pci_rdreg(base, XLP_PCI_IRTINFO_REG) & 0xff); -} - - -static __inline__ int +static inline int nlm_pic_read_irt(uint64_t base, int irt_index) { - return nlm_rdreg_pic(base, XLP_PIC_IRT_REG(irt_index)); + return nlm_read_pic_reg(base, PIC_IRT(irt_index)); } -/* IRT's can be written into in two modes - * ITE mode - Here the destination of the interrupt is one of the - * eight interrupt-thread-enable groups, allowing the interrupt - * to be distributed to any thread on any node - * ID mode - In ID mode, the IRT has the DB and DTE fields. - * DB[18:17] hold the node select and DB[16], if set to 0 selects - * cpu-cores 0-3, and if set to 1 selects cpu-cores 4-7. - * The DTE[15:0] field is a thread mask, allowing the PIC to broadcast - * the interrupt to 1-16 threads selectable from that mask - */ - -static __inline__ void -nlm_pic_write_irt_raw(uint64_t base, int irt_index, int en, int nmi, int sch, - int vec, int dt, int db, int dte) +static inline void +nlm_pic_send_ipi(uint64_t base, int cpu, int vec, int nmi) { - uint64_t val = - (((en & 0x1) << XLP_PIC_IRT_ENABLE_OFFSET) | - ((nmi & 0x1) << XLP_PIC_IRT_NMI_OFFSET) | - ((sch & 0x1) << XLP_PIC_IRT_SCH_OFFSET) | - ((vec & 0x3f) << XLP_PIC_IRT_RVEC_OFFSET) | - ((dt & 0x1 ) << XLP_PIC_IRT_DT_OFFSET) | - ((db & 0x7) << XLP_PIC_IRT_DB_OFFSET) | - (dte & 0xffff)); - nlm_wreg_pic(base, XLP_PIC_IRT_REG(irt_index), val); + uint64_t ipi; + int node, ncpu; + + node = cpu / 32; + ncpu = cpu & 0x1f; + ipi = ((uint64_t)nmi << 31) | (vec << 20) | (node << 17) | + (1 << (cpu & 0xf)); + if (ncpu > 15) + ipi |= 0x10000; /* Setting bit 16 to select cpus 16-31 */ + + nlm_write_pic_reg(base, PIC_IPI_CTL, ipi); } -/* write IRT in ID mode */ -static __inline__ void -nlm_pic_write_irt_id(uint64_t base, int irt_index, int en, int nmi, int vec, - int node, int cpugroup, uint32_t cpu_mask) +static inline uint64_t +nlm_pic_read_control(uint64_t base) { - nlm_pic_write_irt_raw(base, irt_index, en, nmi, 1, vec, 1, - (node << 1) | cpugroup , cpu_mask); + return nlm_read_pic_reg(base, PIC_CTRL); } -/* write IRT in ITE mode */ -static __inline__ void -nlm_pic_write_ite(uint64_t base, int ite, uint32_t node0_thrmask, - uint32_t node1_thrmask, uint32_t node2_thrmask, uint32_t node3_thrmask) +static inline void +nlm_pic_write_control(uint64_t base, uint64_t control) { - uint64_t tm10 = ((uint64_t)node1_thrmask << 32) | node0_thrmask; - uint64_t tm32 = ((uint64_t)node1_thrmask << 32) | node0_thrmask; - - /* Enable the ITE register for all nodes */ - nlm_wreg_pic(base, XLP_PIC_ITE_N0_N1_REG(ite), tm10); - nlm_wreg_pic(base, XLP_PIC_ITE_N2_N3_REG(ite), tm32); + nlm_write_pic_reg(base, PIC_CTRL, control); } -static __inline__ void -nlm_pic_write_irt_ite(uint64_t base, int irt_index, int ite, int en, int nmi, - int sch, int vec) +static inline void +nlm_pic_update_control(uint64_t base, uint64_t control) { - nlm_pic_write_irt_raw(base, irt_index, en, nmi, sch, vec, 0, ite, 0); + uint64_t val; + + val = nlm_read_pic_reg(base, PIC_CTRL); + nlm_write_pic_reg(base, PIC_CTRL, control | val); } -/* Goto PIC on that node, and ack the interrupt */ -static __inline__ void nlm_pic_ack(uint64_t src_base, int irt) +static inline void +nlm_pic_ack(uint64_t base, int irt_num) { - nlm_wreg_pic(src_base, XLP_PIC_INT_ACK_REG, irt); - /* ack in the status registers for watchdog and system timers */ - if (irt < 12) - nlm_wreg_pic(src_base, XLP_PIC_STATUS_REG, (1 << irt)); + nlm_write_pic_reg(base, PIC_INT_ACK, irt_num); + + /* Ack the Status register for Watchdog & System timers */ + if (irt_num < 12) + nlm_write_pic_reg(base, PIC_STATUS, (1 << irt_num)); } -/* IPI routines */ - -static __inline__ void -nlm_pic_send_ipi(uint64_t local_base, int target_node, int vcpu, int vec, int nmi) +static inline void +nlm_set_irt_to_cpu(uint64_t base, int irt, int cpu) { - uint64_t ipi = - (((uint64_t)nmi << XLP_PIC_IPICTRL_NMI_OFFSET) | - (vec << XLP_PIC_IPICTRL_RIV_OFFSET) | - (target_node << 17) | - (1 << (vcpu & 0xf))); - if (vcpu > 15) - ipi |= 0x10000; /* set bit 16 to select cpus 16-31 */ + uint64_t val; - nlm_wreg_pic(local_base, XLP_PIC_IPI_CTRL_REG, ipi); + val = nlm_read_pic_reg(base, PIC_IRT(irt)); + val |= cpu & 0xf; + if (cpu > 15) + val |= 1 << 16; + nlm_write_pic_reg(base, PIC_IRT(irt), val); } -/* System Timer routines -- broadcasts systemtimer to 16 vcpus defined in cpu_mask */ - -static __inline__ void -nlm_pic_set_systimer(uint64_t base, int timer, uint64_t value, int irq, int node, - int cpugroup, uint32_t cpumask) +static inline void +nlm_pic_write_irt(uint64_t base, int irt_num, int en, int nmi, + int sch, int vec, int dt, int db, int dte) { - uint64_t pic_ctrl = nlm_rdreg_pic(base, XLP_PIC_CTRL_REG); + uint64_t val; + + val = (((uint64_t)en & 0x1) << 31) | ((nmi & 0x1) << 29) | + ((sch & 0x1) << 28) | ((vec & 0x3f) << 20) | + ((dt & 0x1) << 19) | ((db & 0x7) << 16) | + (dte & 0xffff); + + nlm_write_pic_reg(base, PIC_IRT(irt_num), val); +} + +static inline void +nlm_pic_write_irt_direct(uint64_t base, int irt_num, int en, int nmi, + int sch, int vec, int cpu) +{ + nlm_pic_write_irt(base, irt_num, en, nmi, sch, vec, 1, + (cpu >> 4), /* thread group */ + 1 << (cpu & 0xf)); /* thread mask */ +} + +static inline uint64_t +nlm_pic_read_timer(uint64_t base, int timer) +{ + return nlm_read_pic_reg(base, PIC_TIMER_COUNT(timer)); +} + +static inline void +nlm_pic_write_timer(uint64_t base, int timer, uint64_t value) +{ + nlm_write_pic_reg(base, PIC_TIMER_COUNT(timer), value); +} + +static inline void +nlm_pic_set_timer(uint64_t base, int timer, uint64_t value, int irq, int cpu) +{ + uint64_t pic_ctrl = nlm_read_pic_reg(base, PIC_CTRL); int en; - en = (cpumask != 0); - nlm_wreg_pic(base, XLP_PIC_SYSTIMER_MAXVAL_REG(timer), value); - nlm_pic_write_irt_id(base, XLP_PIC_IRT_TIMER_INDEX(timer), - en, 0, irq, node, cpugroup, cpumask); + en = (irq > 0); + nlm_write_pic_reg(base, PIC_TIMER_MAXVAL(timer), value); + nlm_pic_write_irt_direct(base, PIC_IRT_TIMER_INDEX(timer), + en, 0, 0, irq, cpu); /* enable the timer */ - pic_ctrl |= (1 << (XLP_PIC_STE_OFFSET+timer)); - nlm_wreg_pic(base, XLP_PIC_CTRL_REG, pic_ctrl); + pic_ctrl |= (1 << (PIC_CTRL_STE + timer)); + nlm_write_pic_reg(base, PIC_CTRL, pic_ctrl); } -static __inline__ uint64_t -nlm_pic_read_systimer(uint64_t base, int timer) -{ - return nlm_rdreg_pic(base, XLP_PIC_SYSTIMER_COUNT_REG(timer)); -} - -/* Watchdog timer routines */ - -/* node - XLP node - * timer - watchdog timer. valid values are 0 and 1 - * wrap_around_count - defines the number of times the watchdog timer can wrap-around - * after which the reset / NMI gets generated to the threads defined in thread-enable-masks. - * value - the vatchdog timer max value, upto which the timer will count down - */ - -static __inline__ void -nlm_pic_set_wdogtimer(uint64_t base, int timer, int wrap_around_count, int nmi, - uint32_t node0_thrmask, uint32_t node1_thrmask, - uint32_t node2_thrmask, uint32_t node3_thrmask, uint64_t value) -{ - uint64_t pic_ctrl = nlm_rdreg_pic(base, XLP_PIC_CTRL_REG); - uint64_t mask0, mask1; - - if (timer > 1 || wrap_around_count > 3) - return; - - /* enable watchdog timer interrupt */ - pic_ctrl |= (((1 << timer) & 0xf)); - - if (timer) { - if (nmi) - pic_ctrl |= (wrap_around_count << XLP_PIC_WWN1_OFFSET); - else - pic_ctrl |= (wrap_around_count << XLP_PIC_WWN0_OFFSET); - } else { - if (nmi) - pic_ctrl |= (wrap_around_count << XLP_PIC_WWR1_OFFSET); - else - pic_ctrl |= (wrap_around_count << XLP_PIC_WWR0_OFFSET); - } - - mask0 = ((unsigned long long)node1_thrmask << 32) | node0_thrmask; - mask1 = ((unsigned long long)node3_thrmask << 32) | node2_thrmask; - - nlm_wreg_pic(base, XLP_PIC_WDOG_MAXVAL_REG(timer), value); - - nlm_wreg_pic(base, XLP_PIC_WDOG_ENABLE0_REG(timer), mask0); - nlm_wreg_pic(base, XLP_PIC_WDOG_ENABLE1_REG(timer), mask1); - - nlm_wreg_pic(base, XLP_PIC_CTRL_REG, pic_ctrl); -} - -/* watchdog's need to be "stroked" by heartbeats from vcpus. - * On XLP, the heartbeat bit for a specific cpu thread on a specific - * node is set according to the following formula: - * 32N + 4C + T - * where N = node, C=cpu-core number, T=thread number - * - * src_node = source node of watchdog timer interrupts. These interrupts - * get generated from the PIC on src_node. - * timer = watchdog timer 0 or 1 - * node = node for which the hearbeat is being done - * cpu = cpu-core for which the hearbeat is being done - * thread = h/w thread for which the hearbeat is being done - */ -static __inline__ void -nlm_pic_set_wdog_heartbeat(uint64_t base, int timer, int node, int cpu, - int thread) -{ - int val = 32 * node + 4 * cpu + thread; - - nlm_wreg_pic(base, XLP_PIC_WDOG_BEATCMD_REG(timer), val); -} - -#endif /* !LOCORE && !__ASSEMBLY__ */ -#endif +#endif /* __ASSEMBLY__ */ +#endif /* _NLM_HAL_PIC_H */ diff --git a/sys/mips/nlm/hal/sys.h b/sys/mips/nlm/hal/sys.h index 89e4c52d15b..89b27fd7bdf 100644 --- a/sys/mips/nlm/hal/sys.h +++ b/sys/mips/nlm/hal/sys.h @@ -25,101 +25,101 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ -#ifndef __NLM_SYS_H__ -#define __NLM_SYS_H__ +#ifndef __NLM_HAL_SYS_H__ +#define __NLM_HAL_SYS_H__ /** * @file_name sys.h * @author Netlogic Microsystems * @brief HAL for System configuration registers */ -#define XLP_SYS_CHIP_RESET_REG 0x40 -#define XLP_SYS_POWER_ON_RESET_REG 0x41 -#define XLP_SYS_EFUSE_DEVICE_CFG_STATUS0_REG 0x42 -#define XLP_SYS_EFUSE_DEVICE_CFG_STATUS1_REG 0x43 -#define XLP_SYS_EFUSE_DEVICE_CFG_STATUS2_REG 0x44 -#define XLP_SYS_EFUSE_DEVICE_CFG3_REG 0x45 -#define XLP_SYS_EFUSE_DEVICE_CFG4_REG 0x46 -#define XLP_SYS_EFUSE_DEVICE_CFG5_REG 0x47 -#define XLP_SYS_EFUSE_DEVICE_CFG6_REG 0x48 -#define XLP_SYS_EFUSE_DEVICE_CFG7_REG 0x49 -#define XLP_SYS_PLL_CTRL_REG 0x4a -#define XLP_SYS_CPU_RESET_REG 0x4b -#define XLP_SYS_CPU_NONCOHERENT_MODE_REG 0x4d -#define XLP_SYS_CORE_DFS_DIS_CTRL_REG 0x4e -#define XLP_SYS_CORE_DFS_RST_CTRL_REG 0x4f -#define XLP_SYS_CORE_DFS_BYP_CTRL_REG 0x50 -#define XLP_SYS_CORE_DFS_PHA_CTRL_REG 0x51 -#define XLP_SYS_CORE_DFS_DIV_INC_CTRL_REG 0x52 -#define XLP_SYS_CORE_DFS_DIV_DEC_CTRL_REG 0x53 -#define XLP_SYS_CORE_DFS_DIV_VALUE_REG 0x54 -#define XLP_SYS_RESET_REG 0x55 -#define XLP_SYS_DFS_DIS_CTRL_REG 0x56 -#define XLP_SYS_DFS_RST_CTRL_REG 0x57 -#define XLP_SYS_DFS_BYP_CTRL_REG 0x58 -#define XLP_SYS_DFS_DIV_INC_CTRL_REG 0x59 -#define XLP_SYS_DFS_DIV_DEC_CTRL_REG 0x5a -#define XLP_SYS_DFS_DIV_VALUE0_REG 0x5b -#define XLP_SYS_DFS_DIV_VALUE1_REG 0x5c -#define XLP_SYS_SENSE_AMP_DLY_REG 0x5d -#define XLP_SYS_SOC_SENSE_AMP_DLY_REG 0x5e -#define XLP_SYS_CTRL0_REG 0x5f -#define XLP_SYS_CTRL1_REG 0x60 -#define XLP_SYS_TIMEOUT_BS1_REG 0x61 -#define XLP_SYS_BYTE_SWAP_REG 0x62 -#define XLP_SYS_VRM_VID_REG 0x63 -#define XLP_SYS_PWR_RAM_CMD_REG 0x64 -#define XLP_SYS_PWR_RAM_ADDR_REG 0x65 -#define XLP_SYS_PWR_RAM_DATA0_REG 0x66 -#define XLP_SYS_PWR_RAM_DATA1_REG 0x67 -#define XLP_SYS_PWR_RAM_DATA2_REG 0x68 -#define XLP_SYS_PWR_UCODE_REG 0x69 -#define XLP_SYS_CPU0_PWR_STATUS_REG 0x6a -#define XLP_SYS_CPU1_PWR_STATUS_REG 0x6b -#define XLP_SYS_CPU2_PWR_STATUS_REG 0x6c -#define XLP_SYS_CPU3_PWR_STATUS_REG 0x6d -#define XLP_SYS_CPU4_PWR_STATUS_REG 0x6e -#define XLP_SYS_CPU5_PWR_STATUS_REG 0x6f -#define XLP_SYS_CPU6_PWR_STATUS_REG 0x70 -#define XLP_SYS_CPU7_PWR_STATUS_REG 0x71 -#define XLP_SYS_STATUS_REG 0x72 -#define XLP_SYS_INT_POL_REG 0x73 -#define XLP_SYS_INT_TYPE_REG 0x74 -#define XLP_SYS_INT_STATUS_REG 0x75 -#define XLP_SYS_INT_MASK0_REG 0x76 -#define XLP_SYS_INT_MASK1_REG 0x77 -#define XLP_SYS_UCO_S_ECC_REG 0x78 -#define XLP_SYS_UCO_M_ECC_REG 0x79 -#define XLP_SYS_UCO_ADDR_REG 0x7a -#define XLP_SYS_UCO_INSTR_REG 0x7b -#define XLP_SYS_MEM_BIST0_REG 0x7c -#define XLP_SYS_MEM_BIST1_REG 0x7d -#define XLP_SYS_MEM_BIST2_REG 0x7e -#define XLP_SYS_MEM_BIST3_REG 0x7f -#define XLP_SYS_MEM_BIST4_REG 0x80 -#define XLP_SYS_MEM_BIST5_REG 0x81 -#define XLP_SYS_MEM_BIST6_REG 0x82 -#define XLP_SYS_MEM_BIST7_REG 0x83 -#define XLP_SYS_MEM_BIST8_REG 0x84 -#define XLP_SYS_MEM_BIST9_REG 0x85 -#define XLP_SYS_MEM_BIST10_REG 0x86 -#define XLP_SYS_MEM_BIST11_REG 0x87 -#define XLP_SYS_MEM_BIST12_REG 0x88 -#define XLP_SYS_SCRTCH0_REG 0x89 -#define XLP_SYS_SCRTCH1_REG 0x8a -#define XLP_SYS_SCRTCH2_REG 0x8b -#define XLP_SYS_SCRTCH3_REG 0x8c +#define SYS_CHIP_RESET 0x00 +#define SYS_POWER_ON_RESET_CFG 0x01 +#define SYS_EFUSE_DEVICE_CFG_STATUS0 0x02 +#define SYS_EFUSE_DEVICE_CFG_STATUS1 0x03 +#define SYS_EFUSE_DEVICE_CFG_STATUS2 0x04 +#define SYS_EFUSE_DEVICE_CFG3 0x05 +#define SYS_EFUSE_DEVICE_CFG4 0x06 +#define SYS_EFUSE_DEVICE_CFG5 0x07 +#define SYS_EFUSE_DEVICE_CFG6 0x08 +#define SYS_EFUSE_DEVICE_CFG7 0x09 +#define SYS_PLL_CTRL 0x0a +#define SYS_CPU_RESET 0x0b +#define SYS_CPU_NONCOHERENT_MODE 0x0d +#define SYS_CORE_DFS_DIS_CTRL 0x0e +#define SYS_CORE_DFS_RST_CTRL 0x0f +#define SYS_CORE_DFS_BYP_CTRL 0x10 +#define SYS_CORE_DFS_PHA_CTRL 0x11 +#define SYS_CORE_DFS_DIV_INC_CTRL 0x12 +#define SYS_CORE_DFS_DIV_DEC_CTRL 0x13 +#define SYS_CORE_DFS_DIV_VALUE 0x14 +#define SYS_RESET 0x15 +#define SYS_DFS_DIS_CTRL 0x16 +#define SYS_DFS_RST_CTRL 0x17 +#define SYS_DFS_BYP_CTRL 0x18 +#define SYS_DFS_DIV_INC_CTRL 0x19 +#define SYS_DFS_DIV_DEC_CTRL 0x1a +#define SYS_DFS_DIV_VALUE0 0x1b +#define SYS_DFS_DIV_VALUE1 0x1c +#define SYS_SENSE_AMP_DLY 0x1d +#define SYS_SOC_SENSE_AMP_DLY 0x1e +#define SYS_CTRL0 0x1f +#define SYS_CTRL1 0x20 +#define SYS_TIMEOUT_BS1 0x21 +#define SYS_BYTE_SWAP 0x22 +#define SYS_VRM_VID 0x23 +#define SYS_PWR_RAM_CMD 0x24 +#define SYS_PWR_RAM_ADDR 0x25 +#define SYS_PWR_RAM_DATA0 0x26 +#define SYS_PWR_RAM_DATA1 0x27 +#define SYS_PWR_RAM_DATA2 0x28 +#define SYS_PWR_UCODE 0x29 +#define SYS_CPU0_PWR_STATUS 0x2a +#define SYS_CPU1_PWR_STATUS 0x2b +#define SYS_CPU2_PWR_STATUS 0x2c +#define SYS_CPU3_PWR_STATUS 0x2d +#define SYS_CPU4_PWR_STATUS 0x2e +#define SYS_CPU5_PWR_STATUS 0x2f +#define SYS_CPU6_PWR_STATUS 0x30 +#define SYS_CPU7_PWR_STATUS 0x31 +#define SYS_STATUS 0x32 +#define SYS_INT_POL 0x33 +#define SYS_INT_TYPE 0x34 +#define SYS_INT_STATUS 0x35 +#define SYS_INT_MASK0 0x36 +#define SYS_INT_MASK1 0x37 +#define SYS_UCO_S_ECC 0x38 +#define SYS_UCO_M_ECC 0x39 +#define SYS_UCO_ADDR 0x3a +#define SYS_UCO_INSTR 0x3b +#define SYS_MEM_BIST0 0x3c +#define SYS_MEM_BIST1 0x3d +#define SYS_MEM_BIST2 0x3e +#define SYS_MEM_BIST3 0x3f +#define SYS_MEM_BIST4 0x40 +#define SYS_MEM_BIST5 0x41 +#define SYS_MEM_BIST6 0x42 +#define SYS_MEM_BIST7 0x43 +#define SYS_MEM_BIST8 0x44 +#define SYS_MEM_BIST9 0x45 +#define SYS_MEM_BIST10 0x46 +#define SYS_MEM_BIST11 0x47 +#define SYS_MEM_BIST12 0x48 +#define SYS_SCRTCH0 0x49 +#define SYS_SCRTCH1 0x4a +#define SYS_SCRTCH2 0x4b +#define SYS_SCRTCH3 0x4c #if !defined(LOCORE) && !defined(__ASSEMBLY__) -#define nlm_rdreg_sys(b, r) nlm_read_reg_kseg(b,r) -#define nlm_wreg_sys(b, r, v) nlm_write_reg_kseg(b,r,v) -#define nlm_pcibase_sys(node) nlm_pcicfg_base(XLP_IO_SYS_OFFSET(node)) -#define nlm_regbase_sys(node) nlm_pcibase_sys(node) +#define nlm_read_sys_reg(b, r) nlm_read_reg(b, r) +#define nlm_write_sys_reg(b, r, v) nlm_write_reg(b, r, v) +#define nlm_get_sys_pcibase(node) nlm_pcicfg_base(XLP_IO_SYS_OFFSET(node)) +#define nlm_get_sys_regbase(node) (nlm_get_sys_pcibase(node) + XLP_IO_PCI_HDRSZ) #endif - #endif diff --git a/sys/mips/nlm/hal/uart.h b/sys/mips/nlm/hal/uart.h index 9eebb49ba67..ce11c849428 100644 --- a/sys/mips/nlm/hal/uart.h +++ b/sys/mips/nlm/hal/uart.h @@ -25,127 +25,121 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ -#ifndef __XLP_UART_H__ -#define __XLP_UART_H__ +#ifndef __XLP_HAL_UART_H__ +#define __XLP_HAL_UART_H__ /* UART Specific registers */ -#define XLP_UART_RX_DATA_REG 0x40 -#define XLP_UART_TX_DATA_REG 0x40 +#define UART_RX_DATA 0x00 +#define UART_TX_DATA 0x00 -#define XLP_UART_INT_EN_REG 0x41 -#define XLP_UART_INT_ID_REG 0x42 -#define XLP_UART_FIFO_CTL_REG 0x42 -#define XLP_UART_LINE_CTL_REG 0x43 -#define XLP_UART_MODEM_CTL_REG 0x44 -#define XLP_UART_LINE_STS_REG 0x45 -#define XLP_UART_MODEM_STS_REG 0x46 +#define UART_INT_EN 0x01 +#define UART_INT_ID 0x02 +#define UART_FIFO_CTL 0x02 +#define UART_LINE_CTL 0x03 +#define UART_MODEM_CTL 0x04 +#define UART_LINE_STS 0x05 +#define UART_MODEM_STS 0x06 -#define XLP_UART_DIVISOR0_REG 0x40 -#define XLP_UART_DIVISOR1_REG 0x41 +#define UART_DIVISOR0 0x00 +#define UART_DIVISOR1 0x01 -#define XLP_UART_BASE_BAUD (133000000/16) -#define XLP_UART_BAUD_DIVISOR(baud) (XLP_UART_BASE_BAUD / baud) +#define BASE_BAUD (XLP_IO_CLK/16) +#define BAUD_DIVISOR(baud) (BASE_BAUD / baud) /* LCR mask values */ -#define LCR_5BITS 0x00 -#define LCR_6BITS 0x01 -#define LCR_7BITS 0x02 -#define LCR_8BITS 0x03 -#define LCR_STOPB 0x04 -#define LCR_PENAB 0x08 -#define LCR_PODD 0x00 -#define LCR_PEVEN 0x10 -#define LCR_PONE 0x20 -#define LCR_PZERO 0x30 -#define LCR_SBREAK 0x40 -#define LCR_EFR_ENABLE 0xbf -#define LCR_DLAB 0x80 +#define LCR_5BITS 0x00 +#define LCR_6BITS 0x01 +#define LCR_7BITS 0x02 +#define LCR_8BITS 0x03 +#define LCR_STOPB 0x04 +#define LCR_PENAB 0x08 +#define LCR_PODD 0x00 +#define LCR_PEVEN 0x10 +#define LCR_PONE 0x20 +#define LCR_PZERO 0x30 +#define LCR_SBREAK 0x40 +#define LCR_EFR_ENABLE 0xbf +#define LCR_DLAB 0x80 /* MCR mask values */ -#define MCR_DTR 0x01 -#define MCR_RTS 0x02 -#define MCR_DRS 0x04 -#define MCR_IE 0x08 -#define MCR_LOOPBACK 0x10 +#define MCR_DTR 0x01 +#define MCR_RTS 0x02 +#define MCR_DRS 0x04 +#define MCR_IE 0x08 +#define MCR_LOOPBACK 0x10 /* FCR mask values */ -#define FCR_RCV_RST 0x02 -#define FCR_XMT_RST 0x04 -#define FCR_RX_LOW 0x00 -#define FCR_RX_MEDL 0x40 -#define FCR_RX_MEDH 0x80 -#define FCR_RX_HIGH 0xc0 +#define FCR_RCV_RST 0x02 +#define FCR_XMT_RST 0x04 +#define FCR_RX_LOW 0x00 +#define FCR_RX_MEDL 0x40 +#define FCR_RX_MEDH 0x80 +#define FCR_RX_HIGH 0xc0 /* IER mask values */ -#define IER_ERXRDY 0x1 -#define IER_ETXRDY 0x2 -#define IER_ERLS 0x4 -#define IER_EMSC 0x8 - -/* uart IRQ info */ -#define XLP_NODE0_UART0_IRQ 17 -#define XLP_NODE1_UART0_IRQ 18 -#define XLP_NODE2_UART0_IRQ 19 -#define XLP_NODE3_UART0_IRQ 20 -#define XLP_NODE0_UART1_IRQ 21 -#define XLP_NODE1_UART1_IRQ 22 -#define XLP_NODE2_UART1_IRQ 23 -#define XLP_NODE3_UART1_IRQ 24 +#define IER_ERXRDY 0x1 +#define IER_ETXRDY 0x2 +#define IER_ERLS 0x4 +#define IER_EMSC 0x8 #if !defined(LOCORE) && !defined(__ASSEMBLY__) -#define nlm_rdreg_uart(b, r) nlm_read_reg_kseg(b,r) -#define nlm_wreg_uart(b, r, v) nlm_write_reg_kseg(b,r,v) -#define nlm_pcibase_uart(node, inst) nlm_pcicfg_base(XLP_IO_UART_OFFSET(node, inst)) -#define nlm_regbase_uart(node, inst) nlm_pcibase_uart(node, inst) +#define nlm_read_uart_reg(b, r) nlm_read_reg(b, r) +#define nlm_write_uart_reg(b, r, v) nlm_write_reg(b, r, v) +#define nlm_get_uart_pcibase(node, inst) \ + nlm_pcicfg_base(XLP_IO_UART_OFFSET(node, inst)) +#define nlm_get_uart_regbase(node, inst) \ + (nlm_get_uart_pcibase(node, inst) + XLP_IO_PCI_HDRSZ) -static __inline__ void +static inline void nlm_uart_set_baudrate(uint64_t base, int baud) { uint32_t lcr; - lcr = nlm_rdreg_uart(base, XLP_UART_LINE_CTL_REG); + lcr = nlm_read_uart_reg(base, UART_LINE_CTL); /* enable divisor register, and write baud values */ - nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, lcr | (1 << 7)); - nlm_wreg_uart(base, XLP_UART_DIVISOR0_REG, - (XLP_UART_BAUD_DIVISOR(baud) & 0xff)); - nlm_wreg_uart(base, XLP_UART_DIVISOR1_REG, - ((XLP_UART_BAUD_DIVISOR(baud) >> 8) & 0xff)); + nlm_write_uart_reg(base, UART_LINE_CTL, lcr | (1 << 7)); + nlm_write_uart_reg(base, UART_DIVISOR0, + (BAUD_DIVISOR(baud) & 0xff)); + nlm_write_uart_reg(base, UART_DIVISOR1, + ((BAUD_DIVISOR(baud) >> 8) & 0xff)); /* restore default lcr */ - nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, lcr); + nlm_write_uart_reg(base, UART_LINE_CTL, lcr); } -static __inline__ void -nlm_outbyte (uint64_t base, char c) +static inline void +nlm_uart_outbyte(uint64_t base, char c) { uint32_t lsr; for (;;) { - lsr = nlm_rdreg_uart(base, XLP_UART_LINE_STS_REG); - if (lsr & 0x20) break; + lsr = nlm_read_uart_reg(base, UART_LINE_STS); + if (lsr & 0x20) + break; } - nlm_wreg_uart(base, XLP_UART_TX_DATA_REG, (int)c); + nlm_write_uart_reg(base, UART_TX_DATA, (int)c); } -static __inline__ char -nlm_inbyte (uint64_t base) +static inline char +nlm_uart_inbyte(uint64_t base) { int data, lsr; - for(;;) { - lsr = nlm_rdreg_uart(base, XLP_UART_LINE_STS_REG); - if (lsr & 0x80) { /* parity/frame/break-error - push a zero */ + for (;;) { + lsr = nlm_read_uart_reg(base, UART_LINE_STS); + if (lsr & 0x80) { /* parity/frame/break-error - push a zero */ data = 0; break; } - if (lsr & 0x01) { /* Rx data */ - data = nlm_rdreg_uart(base, XLP_UART_RX_DATA_REG); + if (lsr & 0x01) { /* Rx data */ + data = nlm_read_uart_reg(base, UART_RX_DATA); break; } } @@ -153,9 +147,9 @@ nlm_inbyte (uint64_t base) return (char)data; } -static __inline__ int +static inline int nlm_uart_init(uint64_t base, int baud, int databits, int stopbits, - int parity, int int_en, int loopback) + int parity, int int_en, int loopback) { uint32_t lcr; @@ -175,22 +169,20 @@ nlm_uart_init(uint64_t base, int baud, int databits, int stopbits, lcr |= parity << 3; /* setup default lcr */ - nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, lcr); + nlm_write_uart_reg(base, UART_LINE_CTL, lcr); /* Reset the FIFOs */ - nlm_wreg_uart(base, XLP_UART_LINE_CTL_REG, FCR_RCV_RST | FCR_XMT_RST); + nlm_write_uart_reg(base, UART_LINE_CTL, FCR_RCV_RST | FCR_XMT_RST); nlm_uart_set_baudrate(base, baud); if (loopback) - nlm_wreg_uart(base, XLP_UART_MODEM_CTL_REG, 0x1f); + nlm_write_uart_reg(base, UART_MODEM_CTL, 0x1f); if (int_en) - nlm_wreg_uart(base, XLP_UART_INT_EN_REG, IER_ERXRDY | IER_ETXRDY); + nlm_write_uart_reg(base, UART_INT_EN, IER_ERXRDY | IER_ETXRDY); return 0; } - #endif /* !LOCORE && !__ASSEMBLY__ */ -#endif /* __XLP_UART_H__ */ - +#endif /* __XLP_HAL_UART_H__ */ diff --git a/sys/mips/nlm/hal/usb.h b/sys/mips/nlm/hal/usb.h new file mode 100644 index 00000000000..ba8515a9646 --- /dev/null +++ b/sys/mips/nlm/hal/usb.h @@ -0,0 +1,59 @@ +/*- + * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * NETLOGIC_BSD + * $FreeBSD$ + */ + +#ifndef __NLM_USB_H__ +#define __NLM_USB_H__ + +#define USB_CTL_0 0x01 +#define USB_PHY_0 0x0A +#define USB_PHY_RESET 0x01 +#define USB_PHY_PORT_RESET_0 0x10 +#define USB_PHY_PORT_RESET_1 0x20 +#define USB_CONTROLLER_RESET 0x01 +#define USB_INT_STATUS 0x0E +#define USB_INT_EN 0x0F +#define USB_PHY_INTERRUPT_EN 0x01 +#define USB_OHCI_INTERRUPT_EN 0x02 +#define USB_OHCI_INTERRUPT1_EN 0x04 +#define USB_OHCI_INTERRUPT2_EN 0x08 +#define USB_CTRL_INTERRUPT_EN 0x10 + + +#if !defined(LOCORE) && !defined(__ASSEMBLY__) + +#define nlm_read_usb_reg(b, r) nlm_read_reg(b,r) +#define nlm_write_usb_reg(b, r, v) nlm_write_reg(b,r,v) +#define nlm_get_usb_pcibase(node, inst) nlm_pcicfg_base(XLP_IO_USB_OFFSET(node, inst)) +#define nlm_get_usb_hcd_base(node, inst) nlm_xkphys_map_pcibar0(nlm_get_usb_pcibase(node, inst)) +#define nlm_get_usb_regbase(node, inst) (nlm_get_usb_pcibase(node, inst) + XLP_IO_PCI_HDRSZ) + +#endif +#endif diff --git a/sys/mips/nlm/intern_dev.c b/sys/mips/nlm/intern_dev.c new file mode 100644 index 00000000000..ec237e41df6 --- /dev/null +++ b/sys/mips/nlm/intern_dev.c @@ -0,0 +1,86 @@ +/*- + * Copyright (c) 2011 Netlogic Microsystems Inc. + * + * (based on pci/ignore_pci.c) + * Copyright (c) 2000 Michael Smith + * Copyright (c) 2000 BSDi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * 'Ignore' driver - eats devices that show up errnoeously on PCI + * but shouldn't ever be listed or handled by a driver. + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +static int nlm_soc_pci_probe(device_t dev); + +static device_method_t nlm_soc_pci_methods[] = { + DEVMETHOD(device_probe, nlm_soc_pci_probe), + DEVMETHOD(device_attach, bus_generic_attach), + { 0, 0 } +}; + +static driver_t nlm_soc_pci_driver = { + "nlm_soc_pci", + nlm_soc_pci_methods, + 0, +}; + +static devclass_t nlm_soc_pci_devclass; +DRIVER_MODULE(nlm_soc_pci, pci, nlm_soc_pci_driver, nlm_soc_pci_devclass, 0, 0); + +static int +nlm_soc_pci_probe(device_t dev) +{ + if (pci_get_vendor(dev) != PCI_VENDOR_NETLOGIC) + return(ENXIO); + + /* Ignore SoC internal devices */ + switch (pci_get_device(dev)) { + case PCI_DEVICE_ID_NLM_ICI: + case PCI_DEVICE_ID_NLM_PIC: + case PCI_DEVICE_ID_NLM_FMN: + device_set_desc(dev, "Netlogic Internal"); + device_quiet(dev); + return(-10000); + + default: + return(ENXIO); + } +} diff --git a/sys/mips/nlm/interrupt.h b/sys/mips/nlm/interrupt.h index 41904ebd13d..342f1d3f0e0 100644 --- a/sys/mips/nlm/interrupt.h +++ b/sys/mips/nlm/interrupt.h @@ -25,8 +25,9 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ #ifndef _RMI_INTERRUPT_H_ #define _RMI_INTERRUPT_H_ diff --git a/sys/mips/nlm/intr_machdep.c b/sys/mips/nlm/intr_machdep.c index 48623564436..782043e2366 100644 --- a/sys/mips/nlm/intr_machdep.c +++ b/sys/mips/nlm/intr_machdep.c @@ -46,9 +46,9 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include -#include +#include #include #include #include diff --git a/sys/mips/nlm/iodi.c b/sys/mips/nlm/iodi.c deleted file mode 100644 index 3b372bb916b..00000000000 --- a/sys/mips/nlm/iodi.c +++ /dev/null @@ -1,233 +0,0 @@ -/*- - * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - * - * NETLOGIC_BSD */ - -#include -__FBSDID("$FreeBSD$"); - -#define __RMAN_RESOURCE_VISIBLE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -extern void iodi_activateirqs(void); - -extern bus_space_tag_t uart_bus_space_mem; - -static struct resource *iodi_alloc_resource(device_t, device_t, int, int *, - u_long, u_long, u_long, u_int); - -static int iodi_activate_resource(device_t, device_t, int, int, - struct resource *); -struct iodi_softc *iodi_softc; /* There can be only one. */ - -static int -iodi_setup_intr(device_t dev, device_t child, - struct resource *ires, int flags, driver_filter_t *filt, - driver_intr_t *intr, void *arg, void **cookiep) -{ - const char *name = device_get_name(child); - int unit = device_get_unit(child); - - if (strcmp(name, "uart") == 0) { - /* Note: in xlp, all pic interrupts are level triggered */ - nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_UART0_INDEX, 1, 0, - xlp_irt_to_irq(XLP_PIC_IRT_UART0_INDEX), 0, 0, 0x1); - - cpu_establish_hardintr("uart", filt, intr, arg, - xlp_irt_to_irq(XLP_PIC_IRT_UART0_INDEX), flags, cookiep); - } else if (strcmp(name, "ehci") == 0) { - if (unit == 0) { - nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_EHCI0_INDEX, 1, 0, - xlp_irt_to_irq(XLP_PIC_IRT_EHCI0_INDEX), 0, 0, 0x1); - - cpu_establish_hardintr("ehci0", filt, intr, arg, - xlp_irt_to_irq(XLP_PIC_IRT_EHCI0_INDEX), flags, cookiep); - } else if (unit == 1) { - nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_EHCI1_INDEX, 1, 0, - xlp_irt_to_irq(XLP_PIC_IRT_EHCI1_INDEX), 0, 0, 0x1); - - cpu_establish_hardintr("ehci1", filt, intr, arg, - xlp_irt_to_irq(XLP_PIC_IRT_EHCI1_INDEX), flags, cookiep); - - } - } else if (strcmp(name, "xlp_sdhci") == 0) { - nlm_pic_write_irt_id(xlp_pic_base, XLP_PIC_IRT_MMC_INDEX, 1, 0, - xlp_irt_to_irq(XLP_PIC_IRT_MMC_INDEX), 0, 0, 0x1); - - cpu_establish_hardintr("xlp_sdhci", filt, intr, arg, - xlp_irt_to_irq(XLP_PIC_IRT_MMC_INDEX), flags, cookiep); - - } - - return (0); -} - -static struct resource * -iodi_alloc_resource(device_t bus, device_t child, int type, int *rid, - u_long start, u_long end, u_long count, u_int flags) -{ - struct resource *res = malloc(sizeof(*res), M_DEVBUF, M_WAITOK); - const char *name = device_get_name(child); - int unit; - - switch (type) { - case SYS_RES_IRQ: - device_printf(bus, "IRQ resource - for %s %lx-%lx\n", - device_get_nameunit(child), start, end); - break; - - case SYS_RES_IOPORT: - device_printf(bus, "IOPORT resource - for %s %lx-%lx\n", - device_get_nameunit(child), start, end); - break; - - case SYS_RES_MEMORY: - device_printf(bus, "MEMORY resource - for %s %lx-%lx\n", - device_get_nameunit(child), start, end); - break; - } - - unit = device_get_unit(child); - if (strcmp(name, "uart") == 0) { - if (unit == 0) { - res->r_bushandle = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ; - } else if ( unit == 1) { - res->r_bushandle = nlm_regbase_uart(0, 1) + XLP_IO_PCI_HDRSZ; - } else - printf("%s: Unknown uart unit\n", __FUNCTION__); - - res->r_bustag = uart_bus_space_mem; - } - - return (res); -} - -static int -iodi_activate_resource(device_t bus, device_t child, int type, int rid, - struct resource *r) -{ - return (0); -} -/* prototypes */ -static int iodi_probe(device_t); -static int iodi_attach(device_t); -static void iodi_identify(driver_t *, device_t); - -int -iodi_probe(device_t dev) -{ - return 0; -} - -void -iodi_identify(driver_t *driver, device_t parent) -{ - - BUS_ADD_CHILD(parent, 0, "iodi", 0); -} - - -int -iodi_attach(device_t dev) -{ - device_t tmpd; - char desc[32]; - int i; - - device_printf(dev, "IODI - Initialize message ring.\n"); - xlp_msgring_iodi_config(); - - /* - * Attach each devices - */ - device_add_child(dev, "uart", 0); - device_add_child(dev, "xlp_i2c", 0); - device_add_child(dev, "xlp_i2c", 1); - device_add_child(dev, "ehci", 0); - device_add_child(dev, "ehci", 1); - device_add_child(dev, "xlp_sdhci", 0); - - for (i=0; i < XLP_NUM_NODES; i++) { - tmpd = device_add_child(dev, "xlpnae", i); - device_set_ivars(tmpd, &xlp_board_info.nodes[i].nae_ivars); - snprintf(desc, sizeof(desc), "XLP NAE %d", i); - device_set_desc_copy(tmpd, desc); - } - - bus_generic_probe(dev); - bus_generic_attach(dev); - return 0; -} - -static device_method_t iodi_methods[] = { - DEVMETHOD(device_probe, iodi_probe), - DEVMETHOD(device_attach, iodi_attach), - DEVMETHOD(device_identify, iodi_identify), - DEVMETHOD(bus_alloc_resource, iodi_alloc_resource), - DEVMETHOD(bus_activate_resource, iodi_activate_resource), - DEVMETHOD(bus_add_child, bus_generic_add_child), - DEVMETHOD(bus_setup_intr, iodi_setup_intr), - {0, 0}, -}; - -static driver_t iodi_driver = { - "iodi", - iodi_methods, - 1 /* no softc */ -}; -static devclass_t iodi_devclass; - -DRIVER_MODULE(iodi, nexus, iodi_driver, iodi_devclass, 0, 0); diff --git a/sys/mips/nlm/mpreset.S b/sys/mips/nlm/mpreset.S index c56bd9f053d..95b2440b10e 100644 --- a/sys/mips/nlm/mpreset.S +++ b/sys/mips/nlm/mpreset.S @@ -25,8 +25,9 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ #include #include @@ -35,6 +36,8 @@ #include #include +#define SYS_REG_KSEG1(node, reg) (0xa0000000 + XLP_DEFAULT_IO_BASE + \ + XLP_IO_SYS_OFFSET(node) + XLP_IO_PCI_HDRSZ + (reg) * 4) #include "assym.s" .text @@ -59,7 +62,7 @@ VECTOR(XLPResetEntry, unknown) nor t0, t0, zero /* mask with core id bit clear */ /* clear CPU non-coherent bit */ - li t2, XLP_DEFAULT_IO_BASE_KSEG1 + XLP_IO_SYS_OFFSET(0) + XLP_SYS_CPU_NONCOHERENT_MODE_REG * 4 + li t2, SYS_REG_KSEG1(0, SYS_CPU_NONCOHERENT_MODE) lw t1, 0(t2) and t1, t1, t0 sw t1, 0(t2) @@ -109,7 +112,7 @@ LEAF(xlp_enable_threads) sd gp, 80(sp) sd ra, 88(sp) /* Use register number to work in o32 and n32 */ - li $9, ((XLP_CPU_BLOCKID_MAP << 8) | XLP_BLKID_MAP_THREADMODE) + li $9, ((CPU_BLOCKID_MAP << 8) | MAP_THREADMODE) move $8, a0 sync .word 0x71280019 /* mtcr t0, t1*/ diff --git a/sys/mips/nlm/msgring.h b/sys/mips/nlm/msgring.h index b951569cf38..e57a0fe2165 100644 --- a/sys/mips/nlm/msgring.h +++ b/sys/mips/nlm/msgring.h @@ -25,10 +25,10 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ -/** FIXME **/ extern uint32_t xlp_msg_thread_mask; typedef void (*msgring_handler)(int, int, int, int, struct nlm_fmn_msg *, void *); int register_msgring_handler(int startb, int endb, msgring_handler action, @@ -41,4 +41,3 @@ void xlp_cpu_msgring_handler(int bucket, int size, int code, int stid, void nlm_cms_credit_setup(int credit); void xlp_msgring_iodi_config(void); - diff --git a/sys/mips/nlm/uart_bus_xlp_iodi.c b/sys/mips/nlm/uart_bus_xlp_iodi.c index 236900abf38..ca68d68f647 100644 --- a/sys/mips/nlm/uart_bus_xlp_iodi.c +++ b/sys/mips/nlm/uart_bus_xlp_iodi.c @@ -42,7 +42,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include @@ -78,9 +78,9 @@ uart_iodi_probe(device_t dev) sc->sc_class = &uart_ns8250_class; bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas)); sc->sc_sysdev->bas.bst = rmi_bus_space; - sc->sc_sysdev->bas.bsh = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ; + sc->sc_sysdev->bas.bsh = nlm_get_uart_regbase(0, 0); sc->sc_bas.bst = rmi_bus_space; - sc->sc_bas.bsh = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ; + sc->sc_bas.bsh = nlm_get_uart_regbase(0, 0); /* regshft = 2, rclk = 66000000, rid = 0, chan = 0 */ return (uart_bus_probe(dev, 2, 133000000, 0, 0)); } diff --git a/sys/mips/nlm/uart_cpu_mips_xlp.c b/sys/mips/nlm/uart_cpu_xlp.c similarity index 74% rename from sys/mips/nlm/uart_cpu_mips_xlp.c rename to sys/mips/nlm/uart_cpu_xlp.c index 07bdd6adbc0..0e476d58c06 100644 --- a/sys/mips/nlm/uart_cpu_mips_xlp.c +++ b/sys/mips/nlm/uart_cpu_xlp.c @@ -53,27 +53,51 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include bus_space_tag_t uart_bus_space_io; bus_space_tag_t uart_bus_space_mem; +/* + * need a special bus space for this, because the Netlogic SoC + * UART allows only 32 bit access to its registers + */ +static struct bus_space nlm_uart_bussp; + +static u_int8_t +nlm_uart_bussp_read_1(void *tag, bus_space_handle_t handle, + bus_size_t offset) +{ + return (u_int8_t)(*(volatile u_int32_t *)(handle + offset)); +} + +static void +nlm_uart_bussp_write_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int8_t value) +{ + *(volatile u_int32_t *)(handle + offset) = value; +} + int uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) { return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); } - int uart_cpu_getdev(int devtype, struct uart_devinfo *di) { + /* Create custom bus space */ + memcpy(&nlm_uart_bussp, rmi_bus_space, sizeof(nlm_uart_bussp)); + nlm_uart_bussp.bs_r_1 = nlm_uart_bussp_read_1; + nlm_uart_bussp.bs_w_1 = nlm_uart_bussp_write_1; + di->ops = uart_getops(&uart_ns8250_class); di->bas.chan = 0; - di->bas.bst = rmi_bus_space; - di->bas.bsh = nlm_regbase_uart(0, 0) + XLP_IO_PCI_HDRSZ; + di->bas.bst = &nlm_uart_bussp; + di->bas.bsh = nlm_get_uart_regbase(0, 0); di->bas.regshft = 2; /* divisor = rclk / (baudrate * 16); */ @@ -84,6 +108,6 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) di->parity = UART_PARITY_NONE; uart_bus_space_io = NULL; - uart_bus_space_mem = rmi_bus_space; + uart_bus_space_mem = &nlm_uart_bussp; return (0); } diff --git a/sys/mips/nlm/uart_pci_xlp.c b/sys/mips/nlm/uart_pci_xlp.c new file mode 100644 index 00000000000..16c795c1582 --- /dev/null +++ b/sys/mips/nlm/uart_pci_xlp.c @@ -0,0 +1,85 @@ +/*- + * Copyright (c) 2011 Netlogic Microsystems Inc. + * + * (based on dev/uart/uart_bus_pci.c) + * Copyright (c) 2006 Marcel Moolenaar + * Copyright (c) 2001 M. Warner Losh + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +static int uart_soc_probe(device_t dev); + +static device_method_t uart_soc_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, uart_soc_probe), + DEVMETHOD(device_attach, uart_bus_attach), + DEVMETHOD(device_detach, uart_bus_detach), + { 0, 0 } +}; + +static driver_t uart_soc_driver = { + uart_driver_name, + uart_soc_methods, + sizeof(struct uart_softc), +}; + +static int +uart_soc_probe(device_t dev) +{ + struct uart_softc *sc; + uint64_t ubase; + + if (pci_get_vendor(dev) != PCI_VENDOR_NETLOGIC || + pci_get_device(dev) != PCI_DEVICE_ID_NLM_UART) + return (ENXIO); + + ubase = nlm_get_uart_regbase(0, 0); + sc = device_get_softc(dev); + sc->sc_class = &uart_ns8250_class; + device_set_desc(dev, "Netlogic SoC UART"); + return (uart_bus_probe(dev, 2, 133000000, 0, 0)); +} + +DRIVER_MODULE(uart_soc, pci, uart_soc_driver, uart_devclass, 0, 0); diff --git a/sys/mips/nlm/usb_init.c b/sys/mips/nlm/usb_init.c new file mode 100644 index 00000000000..32a6165c60d --- /dev/null +++ b/sys/mips/nlm/usb_init.c @@ -0,0 +1,92 @@ +/*- + * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * NETLOGIC_BSD */ + +#include +__FBSDID("$FreeBSD$"); +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + + +static void +nlm_usb_intr_en(int node, int port) +{ + uint32_t val; + uint64_t port_addr; + + port_addr = nlm_get_usb_regbase(node, port); + val = nlm_read_usb_reg(port_addr, USB_INT_EN); + val = USB_CTRL_INTERRUPT_EN | USB_OHCI_INTERRUPT_EN | + USB_OHCI_INTERRUPT1_EN | USB_CTRL_INTERRUPT_EN | + USB_OHCI_INTERRUPT_EN | USB_OHCI_INTERRUPT2_EN; + nlm_write_usb_reg(port_addr, USB_INT_EN, val); +} + +static void +nlm_usb_hw_reset(int node, int port) +{ + uint64_t port_addr; + uint32_t val; + + /* reset USB phy */ + port_addr = nlm_get_usb_regbase(node, port); + val = nlm_read_usb_reg(port_addr, USB_PHY_0); + val &= ~(USB_PHY_RESET | USB_PHY_PORT_RESET_0 | USB_PHY_PORT_RESET_1); + nlm_write_usb_reg(port_addr, USB_PHY_0, val); + + DELAY(100); + val = nlm_read_usb_reg(port_addr, USB_CTL_0); + val &= ~(USB_CONTROLLER_RESET); + val |= 0x4; + nlm_write_usb_reg(port_addr, USB_CTL_0, val); +} + +static void +nlm_usb_init(void) +{ + /* XXX: should be checking if these are in Device mode here */ + printf("Initialize USB Interface\n"); + nlm_usb_hw_reset(0, 0); + nlm_usb_hw_reset(0, 3); + + /* Enable PHY interrupts */ + nlm_usb_intr_en(0, 0); + nlm_usb_intr_en(0, 3); +} + +SYSINIT(nlm_usb_init, SI_SUB_CPU, SI_ORDER_MIDDLE, + nlm_usb_init, NULL); diff --git a/sys/mips/nlm/xlp.h b/sys/mips/nlm/xlp.h index 5c79aaf992d..b4008919593 100644 --- a/sys/mips/nlm/xlp.h +++ b/sys/mips/nlm/xlp.h @@ -25,25 +25,25 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * + * NETLOGIC_BSD * $FreeBSD$ - * NETLOGIC_BSD */ + */ #ifndef __NLM_XLP_H__ #define __NLM_XLP_H__ #include -#define XLP_PIC_IRT_UART0_IRQ 9 -#define XLP_PIC_IRT_UART1_IRQ 10 +#define PIC_UART_0_IRQ 9 +#define PIC_UART_1_IRQ 10 -#define XLP_PIC_IRT_PCIE0_IRQ 11 -#define XLP_PIC_IRT_PCIE1_IRQ 12 -#define XLP_PIC_IRT_PCIE2_IRQ 13 -#define XLP_PIC_IRT_PCIE3_IRQ 14 - -#define XLP_PIC_IRT_EHCI0_IRQ 39 -#define XLP_PIC_IRT_EHCI1_IRQ 42 -#define XLP_PIC_IRT_MMC_IRQ 43 +#define PIC_PCIE_0_IRQ 11 +#define PIC_PCIE_1_IRQ 12 +#define PIC_PCIE_2_IRQ 13 +#define PIC_PCIE_3_IRQ 14 +#define PIC_EHCI_0_IRQ 39 +#define PIC_EHCI_1_IRQ 42 +#define PIC_MMC_IRQ 43 #ifndef LOCORE /* @@ -59,30 +59,28 @@ extern int xlp_hwtid_to_cpuid[]; extern void xlp_enable_threads(int code); #endif -extern uint64_t xlp_pic_base; /* TODO just for node 0 now */ - static __inline__ int xlp_irt_to_irq(int irt) { switch (irt) { - case XLP_PIC_IRT_MMC_INDEX : - return XLP_PIC_IRT_MMC_IRQ; - case XLP_PIC_IRT_EHCI0_INDEX : - return XLP_PIC_IRT_EHCI0_IRQ; - case XLP_PIC_IRT_EHCI1_INDEX : - return XLP_PIC_IRT_EHCI1_IRQ; - case XLP_PIC_IRT_UART0_INDEX : - return XLP_PIC_IRT_UART0_IRQ; - case XLP_PIC_IRT_UART1_INDEX : - return XLP_PIC_IRT_UART1_IRQ; - case XLP_PIC_IRT_PCIE_LINK0_INDEX : - return XLP_PIC_IRT_PCIE0_IRQ; - case XLP_PIC_IRT_PCIE_LINK1_INDEX : - return XLP_PIC_IRT_PCIE1_IRQ; - case XLP_PIC_IRT_PCIE_LINK2_INDEX : - return XLP_PIC_IRT_PCIE2_IRQ; - case XLP_PIC_IRT_PCIE_LINK3_INDEX : - return XLP_PIC_IRT_PCIE3_IRQ; + case PIC_IRT_MMC_INDEX : + return PIC_MMC_IRQ; + case PIC_IRT_EHCI_0_INDEX : + return PIC_EHCI_0_IRQ; + case PIC_IRT_EHCI_1_INDEX : + return PIC_EHCI_1_IRQ; + case PIC_IRT_UART_0_INDEX : + return PIC_UART_0_IRQ; + case PIC_IRT_UART_1_INDEX : + return PIC_UART_1_IRQ; + case PIC_IRT_PCIE_LINK_0_INDEX : + return PIC_PCIE_0_IRQ; + case PIC_IRT_PCIE_LINK_1_INDEX : + return PIC_PCIE_1_IRQ; + case PIC_IRT_PCIE_LINK_2_INDEX : + return PIC_PCIE_2_IRQ; + case PIC_IRT_PCIE_LINK_3_INDEX : + return PIC_PCIE_3_IRQ; default: panic("Bad IRT %d\n", irt); } } @@ -91,24 +89,24 @@ static __inline__ int xlp_irq_to_irt(int irq) { switch (irq) { - case XLP_PIC_IRT_MMC_IRQ : - return XLP_PIC_IRT_MMC_INDEX; - case XLP_PIC_IRT_EHCI0_IRQ : - return XLP_PIC_IRT_EHCI0_INDEX; - case XLP_PIC_IRT_EHCI1_IRQ : - return XLP_PIC_IRT_EHCI1_INDEX; - case XLP_PIC_IRT_UART0_IRQ : - return XLP_PIC_IRT_UART0_INDEX; - case XLP_PIC_IRT_UART1_IRQ : - return XLP_PIC_IRT_UART1_INDEX; - case XLP_PIC_IRT_PCIE0_IRQ : - return XLP_PIC_IRT_PCIE_LINK0_INDEX; - case XLP_PIC_IRT_PCIE1_IRQ : - return XLP_PIC_IRT_PCIE_LINK1_INDEX; - case XLP_PIC_IRT_PCIE2_IRQ : - return XLP_PIC_IRT_PCIE_LINK2_INDEX; - case XLP_PIC_IRT_PCIE3_IRQ : - return XLP_PIC_IRT_PCIE_LINK3_INDEX; + case PIC_MMC_IRQ : + return PIC_IRT_MMC_INDEX; + case PIC_EHCI_0_IRQ : + return PIC_IRT_EHCI_0_INDEX; + case PIC_EHCI_1_IRQ : + return PIC_IRT_EHCI_1_INDEX; + case PIC_UART_0_IRQ : + return PIC_IRT_UART_0_INDEX; + case PIC_UART_1_IRQ : + return PIC_IRT_UART_1_INDEX; + case PIC_PCIE_0_IRQ : + return PIC_IRT_PCIE_LINK_0_INDEX; + case PIC_PCIE_1_IRQ : + return PIC_IRT_PCIE_LINK_1_INDEX; + case PIC_PCIE_2_IRQ : + return PIC_IRT_PCIE_LINK_2_INDEX; + case PIC_PCIE_3_IRQ : + return PIC_IRT_PCIE_LINK_3_INDEX; default: panic("Bad IRQ %d\n", irq); } } @@ -117,15 +115,15 @@ static __inline__ int xlp_irq_is_picintr(int irq) { switch (irq) { - case XLP_PIC_IRT_MMC_IRQ : return 1; - case XLP_PIC_IRT_EHCI0_IRQ : return 1; - case XLP_PIC_IRT_EHCI1_IRQ : return 1; - case XLP_PIC_IRT_UART0_IRQ : return 1; - case XLP_PIC_IRT_UART1_IRQ : return 1; - case XLP_PIC_IRT_PCIE0_IRQ : return 1; - case XLP_PIC_IRT_PCIE1_IRQ : return 1; - case XLP_PIC_IRT_PCIE2_IRQ : return 1; - case XLP_PIC_IRT_PCIE3_IRQ : return 1; + case PIC_MMC_IRQ : return 1; + case PIC_EHCI_0_IRQ : return 1; + case PIC_EHCI_1_IRQ : return 1; + case PIC_UART_0_IRQ : return 1; + case PIC_UART_1_IRQ : return 1; + case PIC_PCIE_0_IRQ : return 1; + case PIC_PCIE_1_IRQ : return 1; + case PIC_PCIE_2_IRQ : return 1; + case PIC_PCIE_3_IRQ : return 1; default: return 0; } } diff --git a/sys/mips/nlm/xlp_machdep.c b/sys/mips/nlm/xlp_machdep.c index 6b4bde4c730..30430fad53c 100644 --- a/sys/mips/nlm/xlp_machdep.c +++ b/sys/mips/nlm/xlp_machdep.c @@ -71,9 +71,8 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include -#include #include #include #include @@ -93,7 +92,7 @@ int xlp_argc; char **xlp_argv, **xlp_envp; uint64_t xlp_cpu_frequency; -uint64_t nlm_pcicfg_baseaddr = MIPS_PHYS_TO_KSEG1(XLP_DEFAULT_IO_BASE); +uint64_t xlp_io_base = MIPS_PHYS_TO_KSEG1(XLP_DEFAULT_IO_BASE); int xlp_ncores; int xlp_threads_per_core; @@ -112,7 +111,7 @@ xlp_setup_core(void) { uint64_t reg; - reg = nlm_mfcr(XLP_LSU_DEFEATURE); + reg = nlm_mfcr(LSU_DEFEATURE); /* Enable Unaligned and L2HPE */ reg |= (1 << 30) | (1 << 23); /* @@ -123,12 +122,12 @@ xlp_setup_core(void) reg |= (1ull << 31); /* Clear S1RCM - A0 errata */ reg &= ~0xeull; - nlm_mtcr(XLP_LSU_DEFEATURE, reg); + nlm_mtcr(LSU_DEFEATURE, reg); - reg = nlm_mfcr(XLP_SCHED_DEFEATURE); + reg = nlm_mfcr(SCHED_DEFEATURE); /* Experimental: Disable BRU accepting ALU ops - A0 errata */ reg |= (1 << 24); - nlm_mtcr(XLP_SCHED_DEFEATURE, reg); + nlm_mtcr(SCHED_DEFEATURE, reg); } static void @@ -281,8 +280,9 @@ mips_init(void) unsigned int platform_get_timecount(struct timecounter *tc __unused) { + uint64_t count = nlm_pic_read_timer(xlp_pic_base, PIC_CLOCK_TIMER); - return ((unsigned int)~nlm_pic_read_systimer(xlp_pic_base, 7)); + return (unsigned int)~count; } static void @@ -292,21 +292,21 @@ xlp_pic_init(void) platform_get_timecount, /* get_timecount */ 0, /* no poll_pps */ ~0U, /* counter_mask */ - XLP_PIC_TIMER_FREQ, /* frequency */ + XLP_IO_CLK, /* frequency */ "XLRPIC", /* name */ 2000, /* quality (adjusted in code) */ }; int i; - xlp_pic_base = nlm_regbase_pic(0); /* TOOD: Add other nodes */ + xlp_pic_base = nlm_get_pic_regbase(0); /* TOOD: Add other nodes */ printf("Initializing PIC...@%jx\n", (uintmax_t)xlp_pic_base); /* Bind all PIC irqs to cpu 0 */ - for(i = 0; i < XLP_PIC_MAX_IRT; i++) { - nlm_pic_write_irt_raw(xlp_pic_base, i, 0, 0, 1, 0, + for(i = 0; i < PIC_NUM_IRTS; i++) { + nlm_pic_write_irt(xlp_pic_base, i, 0, 0, 1, 0, 1, 0, 0x1); } - nlm_pic_set_systimer(xlp_pic_base, 7, ~0ULL, 0, 0, 0, 0); + nlm_pic_set_timer(xlp_pic_base, PIC_CLOCK_TIMER, ~0ULL, 0, 0); platform_timecounter = &pic_timecounter; } @@ -322,15 +322,15 @@ xlp_pic_init(void) static void xlp_mem_init(void) { - uint64_t bridgebase = nlm_regbase_bridge(0); /* TOOD: Add other nodes */ + uint64_t bridgebase = nlm_get_bridge_regbase(0); /* TOOD: Add other nodes */ vm_size_t physsz = 0; uint64_t base, lim, val; int i, j; for (i = 0, j = 0; i < 8; i++) { - val = nlm_rdreg_bridge(bridgebase, XLP_BRIDGE_DRAM_BAR_REG(i)); + val = nlm_read_bridge_reg(bridgebase, BRIDGE_DRAM_BAR(i)); base = ((val >> 12) & 0xfffff) << 20; - val = nlm_rdreg_bridge(bridgebase, XLP_BRIDGE_DRAM_LIMIT_REG(i)); + val = nlm_read_bridge_reg(bridgebase, BRIDGE_DRAM_LIMIT(i)); lim = ((val >> 12) & 0xfffff) << 20; /* BAR not enabled */ @@ -396,17 +396,22 @@ xlp_mem_init(void) /* setup final entry with 0 */ phys_avail[j] = phys_avail[j + 1] = 0; + + /* copy phys_avail to dump_avail */ + for(i = 0; i <= j + 1; i++) + dump_avail[i] = phys_avail[i]; + realmem = physmem = btoc(physsz); } static uint32_t xlp_get_cpu_frequency(void) { - uint64_t sysbase = nlm_regbase_sys(0); + uint64_t sysbase = nlm_get_sys_regbase(0); unsigned int pll_divf, pll_divr, dfs_div, num, denom; uint32_t val; - val = nlm_rdreg_sys(sysbase, XLP_SYS_POWER_ON_RESET_REG); + val = nlm_read_sys_reg(sysbase, SYS_POWER_ON_RESET_CFG); pll_divf = (val >> 10) & 0x7f; pll_divr = (val >> 8) & 0x3; dfs_div = (val >> 17) & 0x3; @@ -520,9 +525,9 @@ platform_trap_enter(void) void platform_reset(void) { - uint64_t sysbase = nlm_regbase_sys(0); + uint64_t sysbase = nlm_get_sys_regbase(0); - nlm_wreg_sys(sysbase, XLP_SYS_CHIP_RESET_REG, 1); + nlm_write_sys_reg(sysbase, SYS_CHIP_RESET, 1); for(;;) __asm __volatile("wait"); } @@ -544,7 +549,7 @@ int platform_start_ap(int cpuid) { uint32_t coremask, val; - uint64_t sysbase = nlm_regbase_sys(0); + uint64_t sysbase = nlm_get_sys_regbase(0); int hwtid = xlp_cpuid_to_hwtid[cpuid]; int core, thr; @@ -555,21 +560,21 @@ platform_start_ap(int cpuid) coremask = 1u << core; /* Enable core clock */ - val = nlm_rdreg_sys(sysbase, XLP_SYS_CORE_DFS_DIS_CTRL_REG); + val = nlm_read_sys_reg(sysbase, SYS_CORE_DFS_DIS_CTRL); val &= ~coremask; - nlm_wreg_sys(sysbase, XLP_SYS_CORE_DFS_DIS_CTRL_REG, val); + nlm_write_sys_reg(sysbase, SYS_CORE_DFS_DIS_CTRL, val); /* Remove CPU Reset */ - val = nlm_rdreg_sys(sysbase, XLP_SYS_CPU_RESET_REG); + val = nlm_read_sys_reg(sysbase, SYS_CPU_RESET); val &= ~coremask & 0xff; - nlm_wreg_sys(sysbase, XLP_SYS_CPU_RESET_REG, val); + nlm_write_sys_reg(sysbase, SYS_CPU_RESET, val); if (bootverbose) printf("Waking up core %d ...", core); /* Poll for CPU to mark itself coherent */ do { - val = nlm_rdreg_sys(sysbase, XLP_SYS_CPU_NONCOHERENT_MODE_REG); + val = nlm_read_sys_reg(sysbase, SYS_CPU_NONCOHERENT_MODE); } while ((val & coremask) != 0); if (bootverbose) printf("Done\n"); @@ -628,7 +633,7 @@ void platform_ipi_send(int cpuid) { - nlm_pic_send_ipi(xlp_pic_base, 0, xlp_cpuid_to_hwtid[cpuid], + nlm_pic_send_ipi(xlp_pic_base, xlp_cpuid_to_hwtid[cpuid], platform_ipi_intrnum(), 0); } diff --git a/sys/mips/nlm/xlp_pci.c b/sys/mips/nlm/xlp_pci.c new file mode 100644 index 00000000000..09e214ebab9 --- /dev/null +++ b/sys/mips/nlm/xlp_pci.c @@ -0,0 +1,666 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of RMI Corporation, nor the names of its contributors, + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * NETLOGIC_BSD */ +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pcib_if.h" + +struct xlp_pcib_softc { + bus_dma_tag_t sc_pci_dmat; /* PCI DMA tag pointer */ +}; + +static devclass_t pcib_devclass; +static struct rman irq_rman, port_rman, mem_rman, emul_rman; + +static void +xlp_pci_init_resources(void) +{ + + irq_rman.rm_start = 0; + irq_rman.rm_end = 255; + irq_rman.rm_type = RMAN_ARRAY; + irq_rman.rm_descr = "PCI Mapped Interrupts"; + if (rman_init(&irq_rman) + || rman_manage_region(&irq_rman, 0, 255)) + panic("pci_init_resources irq_rman"); + + port_rman.rm_start = 0; + port_rman.rm_end = ~0ul; + port_rman.rm_type = RMAN_ARRAY; + port_rman.rm_descr = "I/O ports"; + if (rman_init(&port_rman) + || rman_manage_region(&port_rman, 0x14000000UL, 0x15ffffffUL)) + panic("pci_init_resources port_rman"); + + mem_rman.rm_start = 0; + mem_rman.rm_end = ~0ul; + mem_rman.rm_type = RMAN_ARRAY; + mem_rman.rm_descr = "I/O memory"; + if (rman_init(&mem_rman) + || rman_manage_region(&mem_rman, 0xd0000000ULL, 0xdfffffffULL)) + panic("pci_init_resources mem_rman"); + + emul_rman.rm_start = 0; + emul_rman.rm_end = ~0ul; + emul_rman.rm_type = RMAN_ARRAY; + emul_rman.rm_descr = "Emulated MEMIO"; + if (rman_init(&emul_rman) + || rman_manage_region(&emul_rman, 0x18000000ULL, 0x18ffffffULL)) + panic("pci_init_resources emul_rman"); + +} + +static int +xlp_pcib_probe(device_t dev) +{ + + device_set_desc(dev, "XLP PCI bus"); + + xlp_pci_init_resources(); + return (0); +} + +static int +xlp_pcib_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) +{ + + switch (which) { + case PCIB_IVAR_DOMAIN: + *result = 0; + return (0); + case PCIB_IVAR_BUS: + *result = 0; + return (0); + } + return (ENOENT); +} + +static int +xlp_pcib_write_ivar(device_t dev, device_t child, int which, uintptr_t result) +{ + switch (which) { + case PCIB_IVAR_DOMAIN: + return (EINVAL); + case PCIB_IVAR_BUS: + return (EINVAL); + } + return (ENOENT); +} + +static int +xlp_pcib_maxslots(device_t dev) +{ + + return (PCI_SLOTMAX); +} + +static u_int32_t +xlp_pcib_read_config(device_t dev, u_int b, u_int s, u_int f, + u_int reg, int width) +{ + uint32_t data = 0; + uint64_t cfgaddr; + int regindex = reg/sizeof(uint32_t); + + cfgaddr = nlm_pcicfg_base(XLP_HDR_OFFSET(0, b, s, f)); + if ((width == 2) && (reg & 1)) + return 0xFFFFFFFF; + else if ((width == 4) && (reg & 3)) + return 0xFFFFFFFF; + + data = nlm_read_pci_reg(cfgaddr, regindex); + + /* + * Fix up read data in some SoC devices + * to emulate complete PCIe header + */ + if (b == 0) { + int dev = s % 8; + + /* Fake intpin on config read for UART/I2C, USB, SD/Flash */ + if (regindex == 0xf && + (dev == 6 || dev == 2 || dev == 7)) + data |= 0x1 << 8; /* Fake int pin */ + } + + if (width == 1) + return ((data >> ((reg & 3) << 3)) & 0xff); + else if (width == 2) + return ((data >> ((reg & 3) << 3)) & 0xffff); + else + return (data); +} + +static void +xlp_pcib_write_config(device_t dev, u_int b, u_int s, u_int f, + u_int reg, u_int32_t val, int width) +{ + uint64_t cfgaddr; + uint32_t data = 0; + int regindex = reg / sizeof(uint32_t); + + cfgaddr = nlm_pcicfg_base(XLP_HDR_OFFSET(0, b, s, f)); + if ((width == 2) && (reg & 1)) + return; + else if ((width == 4) && (reg & 3)) + return; + + if (width == 1) { + data = nlm_read_pci_reg(cfgaddr, regindex); + data = (data & ~(0xff << ((reg & 3) << 3))) | + (val << ((reg & 3) << 3)); + } else if (width == 2) { + data = nlm_read_pci_reg(cfgaddr, regindex); + data = (data & ~(0xffff << ((reg & 3) << 3))) | + (val << ((reg & 3) << 3)); + } else { + data = val; + } + + nlm_write_pci_reg(cfgaddr, regindex, data); + + return; +} + +static int +xlp_pcib_attach(device_t dev) +{ + struct xlp_pcib_softc *sc; + sc = device_get_softc(dev); + + device_add_child(dev, "pci", 0); + bus_generic_attach(dev); + + return (0); +} + +static void +xlp_pcib_identify(driver_t * driver, device_t parent) +{ + + BUS_ADD_CHILD(parent, 0, "pcib", 0); +} + +/* + * XLS PCIe can have upto 4 links, and each link has its on IRQ + * Find the link on which the device is on + */ +static int +xlp_pcie_link(device_t pcib, device_t dev) +{ + device_t parent, tmp; + + /* find the lane on which the slot is connected to */ + printf("xlp_pcie_link : bus %s dev %s\n", device_get_nameunit(pcib), + device_get_nameunit(dev)); + tmp = dev; + while (1) { + parent = device_get_parent(tmp); + if (parent == NULL || parent == pcib) { + device_printf(dev, "Cannot find parent bus\n"); + return (-1); + } + if (strcmp(device_get_nameunit(parent), "pci0") == 0) + break; + tmp = parent; + } + return (pci_get_function(tmp)); +} + +/* + * Find the IRQ for the link, each link has a different interrupt + * at the XLP pic + */ +static int +xlp_pcie_link_irt(int link) +{ + + if( (link < 0) || (link > 3)) + return (-1); + + return PIC_IRT_PCIE_LINK_INDEX(link); +} + +static int +xlp_alloc_msi(device_t pcib, device_t dev, int count, int maxcount, int *irqs) +{ + int i, link; + + /* + * Each link has 32 MSIs that can be allocated, but for now + * we only support one device per link. + * msi_alloc() equivalent is needed when we start supporting + * bridges on the PCIe link. + */ + link = xlp_pcie_link(pcib, dev); + if (link == -1) + return (ENXIO); + + /* + * encode the irq so that we know it is a MSI interrupt when we + * setup interrupts + */ + for (i = 0; i < count; i++) + irqs[i] = 64 + link * 32 + i; + + return (0); +} + +static int +xlp_release_msi(device_t pcib, device_t dev, int count, int *irqs) +{ + device_printf(dev, "%s: msi release %d\n", device_get_nameunit(pcib), + count); + return (0); +} + +static int +xlp_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr, + uint32_t *data) +{ + int msi, irt; + + if (irq >= 64) { + msi = irq - 64; + *addr = MIPS_MSI_ADDR(0); + + irt = xlp_pcie_link_irt(msi/32); + if (irt != -1) + *data = MIPS_MSI_DATA(xlp_irt_to_irq(irt)); + return (0); + } else { + device_printf(dev, "%s: map_msi for irq %d - ignored", + device_get_nameunit(pcib), irq); + return (ENXIO); + } +} + +static void +bridge_pcie_ack(int irq) +{ + uint32_t node,reg; + uint64_t base; + + node = nlm_nodeid(); + reg = PCIE_MSI_STATUS; + + switch(irq) { + case PIC_PCIE_0_IRQ: + base = nlm_pcicfg_base(XLP_IO_PCIE0_OFFSET(node)); + break; + case PIC_PCIE_1_IRQ: + base = nlm_pcicfg_base(XLP_IO_PCIE1_OFFSET(node)); + break; + case PIC_PCIE_2_IRQ: + base = nlm_pcicfg_base(XLP_IO_PCIE2_OFFSET(node)); + break; + case PIC_PCIE_3_IRQ: + base = nlm_pcicfg_base(XLP_IO_PCIE3_OFFSET(node)); + break; + default: + return; + } + + nlm_write_pci_reg(base, reg, 0xFFFFFFFF); + + return; +} + +static int +mips_platform_pci_setup_intr(device_t dev, device_t child, + struct resource *irq, int flags, driver_filter_t *filt, + driver_intr_t *intr, void *arg, void **cookiep) +{ + int error = 0; + int xlpirq; + int node,base,val,link; + void *extra_ack; + + error = rman_activate_resource(irq); + if (error) + return error; + if (rman_get_start(irq) != rman_get_end(irq)) { + device_printf(dev, "Interrupt allocation %lu != %lu\n", + rman_get_start(irq), rman_get_end(irq)); + return (EINVAL); + } + xlpirq = rman_get_start(irq); + device_printf(dev, "setup intr %d\n", xlpirq); + + if (strcmp(device_get_name(dev), "pcib") != 0) { + device_printf(dev, "ret 0 on dev\n"); + return (0); + } + + /* + * temporary hack for MSI, we support just one device per + * link, and assign the link interrupt to the device interrupt + */ + if (xlpirq >= 64) { + xlpirq -= 64; + if (xlpirq % 32 != 0) + return (0); + + node = nlm_nodeid(); + link = (xlpirq / 32); + base = nlm_pcicfg_base(XLP_IO_PCIE_OFFSET(node,link)); + + /* MSI Interrupt Vector enable at bridge's configuration */ + nlm_write_pci_reg(base, PCIE_MSI_EN, PCIE_MSI_VECTOR_INT_EN); + + val = nlm_read_pci_reg(base, PCIE_INT_EN0); + /* MSI Interrupt enable at bridge's configuration */ + nlm_write_pci_reg(base, PCIE_INT_EN0, + (val | PCIE_MSI_INT_EN)); + + /* legacy interrupt disable at bridge */ + val = nlm_read_pci_reg(base, PCIE_BRIDGE_CMD); + nlm_write_pci_reg(base, PCIE_BRIDGE_CMD, + (val | PCIM_CMD_INTxDIS)); + + /* MSI address update at bridge */ + val = nlm_read_pci_reg(base, PCIE_BRIDGE_MSI_ADDRL); + nlm_write_pci_reg(base, PCIE_BRIDGE_MSI_ADDRL, + (val | MSI_MIPS_ADDR_BASE)); + + val = nlm_read_pci_reg(base, PCIE_BRIDGE_MSI_CAP); + /* MSI capability enable at bridge */ + nlm_write_pci_reg(base, PCIE_BRIDGE_MSI_CAP, + (val | + (PCIM_MSICTRL_MSI_ENABLE << 16) | + (PCIM_MSICTRL_MMC_32 << 16))); + + xlpirq = xlp_pcie_link_irt(xlpirq / 32); + if (xlpirq == -1) + return (EINVAL); + xlpirq = xlp_irt_to_irq(xlpirq); + } + /* Set all irqs to CPU 0 for now */ + nlm_pic_write_irt_direct(xlp_pic_base, xlp_irq_to_irt(xlpirq), 1, 0, + PIC_LOCAL_SCHEDULING, xlpirq, 0); + extra_ack = NULL; + if (xlpirq >= PIC_PCIE_0_IRQ && + xlpirq <= PIC_PCIE_3_IRQ) + extra_ack = bridge_pcie_ack; + xlp_establish_intr(device_get_name(child), filt, + intr, arg, xlpirq, flags, cookiep, extra_ack); + + return (0); +} + +static int +mips_platform_pci_teardown_intr(device_t dev, device_t child, + struct resource *irq, void *cookie) +{ + if (strcmp(device_get_name(child), "pci") == 0) { + /* if needed reprogram the pic to clear pcix related entry */ + device_printf(dev, "teardown intr\n"); + } + return (bus_generic_teardown_intr(dev, child, irq, cookie)); +} + +static void +assign_soc_resource(device_t child, int type, u_long *startp, u_long *endp, + u_long *countp, struct rman **rm, bus_space_tag_t *bst, vm_offset_t *va) +{ + int devid = pci_get_device(child); + int inst = pci_get_function(child); + int node = pci_get_slot(child) / 8; + + *rm = NULL; + *va = 0; + *bst = 0; + switch (devid) { + case PCI_DEVICE_ID_NLM_UART: + switch (type) { + case SYS_RES_IRQ: + *startp = *endp = PIC_UART_0_IRQ + inst; + *countp = 1; + break; + case SYS_RES_MEMORY: + *va = nlm_get_uart_regbase(node, inst); + *startp = MIPS_KSEG1_TO_PHYS(va); + *countp = 0x100; + *rm = &emul_rman; + *bst = uart_bus_space_mem; + break; + }; + break; + + case PCI_DEVICE_ID_NLM_EHCI: + if (type == SYS_RES_IRQ) { + if (inst == 0) + *startp = *endp = PIC_EHCI_0_IRQ; + else if (inst == 3) + *startp = *endp = PIC_EHCI_1_IRQ; + else + device_printf(child, "bad instance %d\n", inst); + + *countp = 1; + } + break; + } + + /* default to rmi_bus_space for SoC resources */ + if (type == SYS_RES_MEMORY && *bst == 0) + *bst = rmi_bus_space; +} + +static struct resource * +xlp_pci_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct rman *rm = NULL; + struct resource *rv; + vm_offset_t va = 0; + int needactivate = flags & RF_ACTIVE; + bus_space_tag_t bst = 0; + + /* + * For SoC PCI devices, we have to assign resources correctly + * since the IRQ and MEM resources depend on the block. + * If the address is not from BAR0, then we use emul_rman + */ + if (pci_get_bus(child) == 0 && + pci_get_vendor(child) == PCI_VENDOR_NETLOGIC) + assign_soc_resource(child, type, &start, &end, + &count, &rm, &bst, &va); + if (rm == NULL) { + switch (type) { + case SYS_RES_IRQ: + rm = &irq_rman; + break; + + case SYS_RES_IOPORT: + rm = &port_rman; + break; + + case SYS_RES_MEMORY: + rm = &mem_rman; + break; + + default: + return (0); + } + } + + rv = rman_reserve_resource(rm, start, end, count, flags, child); + if (rv == 0) + return (0); + + rman_set_rid(rv, *rid); + + if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) { + if (va == 0) + va = (vm_offset_t)pmap_mapdev(start, count); + if (bst == 0) + bst = rmi_pci_bus_space; + + rman_set_bushandle(rv, va); + rman_set_virtual(rv, (void *)va); + rman_set_bustag(rv, bst); + } + + if (needactivate) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); + } + } + + return (rv); +} + +static int +xlp_pci_release_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + + return (rman_release_resource(r)); +} + +static bus_dma_tag_t +xlp_pci_get_dma_tag(device_t bus, device_t child) +{ + struct xlp_pcib_softc *sc; + + sc = device_get_softc(bus); + return (sc->sc_pci_dmat); +} + +static int +xlp_pci_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + + return (rman_activate_resource(r)); +} + +static int +xlp_pci_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + + return (rman_deactivate_resource(r)); +} + +static int +mips_pci_route_interrupt(device_t bus, device_t dev, int pin) +{ + int irt, link; + + /* + * Validate requested pin number. + */ + device_printf(bus, "route %s %d", device_get_nameunit(dev), pin); + if ((pin < 1) || (pin > 4)) + return (255); + + link = xlp_pcie_link(bus, dev); + irt = xlp_pcie_link_irt(link); + if (irt != -1) + return (xlp_irt_to_irq(irt)); + + return (255); +} + +static device_method_t xlp_pcib_methods[] = { + /* Device interface */ + DEVMETHOD(device_identify, xlp_pcib_identify), + DEVMETHOD(device_probe, xlp_pcib_probe), + DEVMETHOD(device_attach, xlp_pcib_attach), + + /* Bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + DEVMETHOD(bus_read_ivar, xlp_pcib_read_ivar), + DEVMETHOD(bus_write_ivar, xlp_pcib_write_ivar), + DEVMETHOD(bus_alloc_resource, xlp_pci_alloc_resource), + DEVMETHOD(bus_release_resource, xlp_pci_release_resource), + DEVMETHOD(bus_get_dma_tag, xlp_pci_get_dma_tag), + DEVMETHOD(bus_activate_resource, xlp_pci_activate_resource), + DEVMETHOD(bus_deactivate_resource, xlp_pci_deactivate_resource), + DEVMETHOD(bus_setup_intr, mips_platform_pci_setup_intr), + DEVMETHOD(bus_teardown_intr, mips_platform_pci_teardown_intr), + + /* pcib interface */ + DEVMETHOD(pcib_maxslots, xlp_pcib_maxslots), + DEVMETHOD(pcib_read_config, xlp_pcib_read_config), + DEVMETHOD(pcib_write_config, xlp_pcib_write_config), + DEVMETHOD(pcib_route_interrupt, mips_pci_route_interrupt), + + DEVMETHOD(pcib_alloc_msi, xlp_alloc_msi), + DEVMETHOD(pcib_release_msi, xlp_release_msi), + DEVMETHOD(pcib_map_msi, xlp_map_msi), + + {0, 0} +}; + +static driver_t xlp_pcib_driver = { + "pcib", + xlp_pcib_methods, + sizeof(struct xlp_pcib_softc), +}; + +DRIVER_MODULE(pcib, nexus, xlp_pcib_driver, pcib_devclass, 0, 0); From d334432fd38d563a4852001531638e191387dc9c Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Mon, 5 Sep 2011 14:37:59 +0000 Subject: [PATCH 384/452] Some USB mass storage devices requires that the sense information is retrieved after a failed SCSI command to continue normal operation. Else this sense information is retrived at the next SCSI command. Approved by: re (kib) Reported by: Alex Kozlov MFC after: 1 week PR: usb/160299 --- sys/dev/usb/usb_msctest.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/sys/dev/usb/usb_msctest.c b/sys/dev/usb/usb_msctest.c index 061c3d33e96..9447a93bd8f 100644 --- a/sys/dev/usb/usb_msctest.c +++ b/sys/dev/usb/usb_msctest.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ /*- - * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. + * Copyright (c) 2008,2011 Hans Petter Selasky. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -83,7 +83,10 @@ enum { DIR_NONE, }; +#define SCSI_MAX_LEN 0x100 #define SCSI_INQ_LEN 0x24 +#define SCSI_SENSE_LEN 0xFF + static uint8_t scsi_test_unit_ready[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static uint8_t scsi_inquiry[] = { 0x12, 0x00, 0x00, 0x00, SCSI_INQ_LEN, 0x00 }; static uint8_t scsi_rezero_init[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -98,6 +101,8 @@ static uint8_t scsi_huawei_eject[] = { 0x11, 0x06, 0x00, 0x00, 0x00, 0x00, static uint8_t scsi_tct_eject[] = { 0x06, 0xf5, 0x04, 0x02, 0x52, 0x70 }; static uint8_t scsi_sync_cache[] = { 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +static uint8_t scsi_request_sense[] = { 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; #define BULK_SIZE 64 /* dummy */ #define ERR_CSW_FAILED -1 @@ -151,7 +156,7 @@ struct bbb_transfer { uint8_t status_try; int error; - uint8_t buffer[256]; + uint8_t buffer[SCSI_MAX_LEN] __aligned(4); }; static usb_callback_t bbb_command_callback; @@ -661,6 +666,32 @@ usb_msc_auto_quirk(struct usb_device *udev, uint8_t iface_index) usbd_add_dynamic_quirk(udev, UQ_MSC_NO_SYNC_CACHE); } + /* clear sense status of any failed commands on the device */ + + err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, + SCSI_INQ_LEN, &scsi_inquiry, sizeof(scsi_inquiry), + USB_MS_HZ); + + DPRINTF("Inquiry = %d\n", err); + + if (err != 0) { + + if (err != ERR_CSW_FAILED) + goto error; + } + + err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, + SCSI_SENSE_LEN, &scsi_request_sense, + sizeof(scsi_request_sense), USB_MS_HZ); + + DPRINTF("Request sense = %d\n", err); + + if (err != 0) { + + if (err != ERR_CSW_FAILED) + goto error; + } + done: bbb_detach(sc); return (0); From 62e3af52257a08c21993c702f662609f3f151a2a Mon Sep 17 00:00:00 2001 From: Qing Li Date: Mon, 5 Sep 2011 17:54:19 +0000 Subject: [PATCH 385/452] The maximum read size of incoming packets is done in 1024-byte increments. The current code was rounding down the maximum frame size instead of routing up, resulting in a read size of 1024 bytes, in the non-jumbo frame case, and splitting the packets across multiple mbufs. Consequently the above problem exposed another issue, which is when packets were splitted across multiple mbufs, and all of the mbufs in the chain have the M_PKTHDR flag set. Submitted by: original patch by Ray Ruvinskiy at BlueCoat dot com Reviewed by: jfv, kmacy, rwatson Approved by: re (rwatson) MFC after: 5 days --- sys/dev/ixgbe/ixgbe.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c index a382a5356c4..9a709afcc01 100644 --- a/sys/dev/ixgbe/ixgbe.c +++ b/sys/dev/ixgbe/ixgbe.c @@ -3849,6 +3849,8 @@ fail: **********************************************************************/ #define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2 +#define BSIZEPKT_ROUNDUP ((1<rx_mbuf_sz >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; + bufsz = (adapter->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; for (int i = 0; i < adapter->num_queues; i++, rxr++) { u64 rdba = rxr->rxdma.dma_paddr; @@ -4300,9 +4302,10 @@ ixgbe_rxeof(struct ix_queue *que, int count) sendmp = rbuf->fmp; rbuf->m_pack = rbuf->fmp = NULL; - if (sendmp != NULL) /* secondary frag */ + if (sendmp != NULL) { /* secondary frag */ + mp->m_flags &= ~M_PKTHDR; sendmp->m_pkthdr.len += mp->m_len; - else { + } else { /* first desc of a non-ps chain */ sendmp = mp; sendmp->m_flags |= M_PKTHDR; From 5dc9d76584d00f8b174f4c88ec9433f140401c8a Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Tue, 6 Sep 2011 08:15:55 +0000 Subject: [PATCH 386/452] Fix precedence warning when compiling kernel with clang. Approved by: re (kib) Submitted by: dim MFC after: 1 week --- sys/dev/sound/usb/uaudio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c index 565022c228b..955b4c5c3e9 100644 --- a/sys/dev/sound/usb/uaudio.c +++ b/sys/dev/sound/usb/uaudio.c @@ -927,8 +927,8 @@ uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev, continue; } if (asf1d->bLength < (sizeof(*asf1d) + - (asf1d->bSamFreqType == 0) ? 6 : - (asf1d->bSamFreqType * 3))) { + ((asf1d->bSamFreqType == 0) ? 6 : + (asf1d->bSamFreqType * 3)))) { DPRINTFN(11, "'asf1d' descriptor is too short\n"); asf1d = NULL; continue; From 18a646aa798f0b6c464dbf63703bd5928e627a94 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 6 Sep 2011 10:17:02 +0000 Subject: [PATCH 387/452] Fix for the obsolete libraries list after the 9.0 bump. Partially noted by: pluknet Approved by: re (bz) --- ObsoleteFiles.inc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 1b3af12cfa3..327727e2b59 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -39,19 +39,21 @@ # done # 20110828: library version bump for 9.0 +OLD_LIBS+=lib/libcam.so.5 +OLD_LIBS+=lib/libpcap.so.7 OLD_LIBS+=lib/libufs.so.5 OLD_LIBS+=usr/lib/libbsnmp.so.5 OLD_LIBS+=usr/lib/libdwarf.so.2 OLD_LIBS+=usr/lib/libopie.so.6 -OLD_LIBS+=usr/lib/libpcap.so.7 OLD_LIBS+=usr/lib/librtld_db.so.1 OLD_LIBS+=usr/lib/libtacplus.so.4 .if ${TARGET_ARCH} == "amd64" +OLD_LIBS+=usr/lib32/libcam.so.5 +OLD_LIBS+=usr/lib32/libpcap.so.7 OLD_LIBS+=usr/lib32/libufs.so.5 OLD_LIBS+=usr/lib32/libbsnmp.so.5 OLD_LIBS+=usr/lib32/libdwarf.so.2 OLD_LIBS+=usr/lib32/libopie.so.6 -OLD_LIBS+=usr/lib32/libpcap.so.7 OLD_LIBS+=usr/lib32/librtld_db.so.1 OLD_LIBS+=usr/lib32/libtacplus.so.4 .endif From bf6619ba8853f7fa9f0f137e4dcb2ba4f48f19cf Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 6 Sep 2011 10:19:01 +0000 Subject: [PATCH 388/452] dd -t switch for mdmfs to enable TRIM on the configured filesystem. While there, fix minor style issues. Submitted by: Alex Kozlov MFC after: 1 week Approved by: re (bz) --- sbin/mdmfs/mdmfs.8 | 11 +++++++++-- sbin/mdmfs/mdmfs.c | 11 +++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/sbin/mdmfs/mdmfs.8 b/sbin/mdmfs/mdmfs.8 index ef8e596420d..f2db7da5edf 100644 --- a/sbin/mdmfs/mdmfs.8 +++ b/sbin/mdmfs/mdmfs.8 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 15, 2007 +.Dd September 4, 2011 .Dt MDMFS 8 .Os .Sh NAME @@ -36,7 +36,7 @@ driver .Sh SYNOPSIS .Nm -.Op Fl DLlMNPSUX +.Op Fl DLlMNPStUX .Op Fl a Ar maxcontig .Op Fl b Ar block-size .Op Fl c Ar blocks-per-cylinder-group @@ -224,6 +224,13 @@ and the optional .Xr malloc 9 backed disks .Pq Dv MD_MALLOC . +.It Fl t +Turn on the TRIM enable flag for +.Xr newfs 8 . +The +.Xr md 4 +device supports the BIO_DELETE command, enabling the TRIM on created +filesystem allows return of freed memory to the system pool. .It Fl U Enable soft-updates on the file system. This is the default, and is accepted only diff --git a/sbin/mdmfs/mdmfs.c b/sbin/mdmfs/mdmfs.c index bdd880b2854..ef45040ce64 100644 --- a/sbin/mdmfs/mdmfs.c +++ b/sbin/mdmfs/mdmfs.c @@ -127,7 +127,7 @@ main(int argc, char **argv) } while ((ch = getopt(argc, argv, - "a:b:Cc:Dd:E:e:F:f:hi:LlMm:NnO:o:Pp:Ss:t:Uv:w:X")) != -1) + "a:b:Cc:Dd:E:e:F:f:hi:LlMm:NnO:o:Pp:Ss:tUv:w:X")) != -1) switch (ch) { case 'a': argappend(&newfs_arg, "-a %s", optarg); @@ -212,6 +212,9 @@ main(int argc, char **argv) case 's': argappend(&mdconfig_arg, "-s %s", optarg); break; + case 't': + argappend(&newfs_arg, "-t"); + break; case 'U': softdep = true; break; @@ -282,7 +285,7 @@ argappend(char **dstp, const char *fmt, ...) { char *old, *new; va_list ap; - + old = *dstp; assert(old != NULL); @@ -417,7 +420,7 @@ do_mdconfig_detach(void) rv = run(NULL, "%s -d -u %s%d", path_mdconfig, mdname, unit); if (rv && debug) /* This is allowed to fail. */ warnx("mdconfig (detach) exited with error code %d (ignored)", - rv); + rv); } /* @@ -656,7 +659,7 @@ usage(void) { fprintf(stderr, -"usage: %s [-DLlMNnPSUX] [-a maxcontig] [-b block-size]\n" +"usage: %s [-DLlMNnPStUX] [-a maxcontig] [-b block-size]\n" "\t[-c blocks-per-cylinder-group][-d max-extent-size] [-E path-mdconfig]\n" "\t[-e maxbpg] [-F file] [-f frag-size] [-i bytes] [-m percent-free]\n" "\t[-O optimization] [-o mount-options]\n" From b236731716168a130e176bbd18d4790a6d3940d6 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 6 Sep 2011 10:21:33 +0000 Subject: [PATCH 389/452] Do not use the function pointers for the internal operation of rtld_printf() functions. The _rtld_error() function might be called early during the rtld bootstrap, in which case function pointers are not yet functional on ia64 due to required relocations not yet performed. Reported, reviewed and tested by: marcel Approved by: re (bz) --- libexec/rtld-elf/rtld_printf.c | 47 +++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/libexec/rtld-elf/rtld_printf.c b/libexec/rtld-elf/rtld_printf.c index a5ab130cb98..b9aadc3587b 100644 --- a/libexec/rtld-elf/rtld_printf.c +++ b/libexec/rtld-elf/rtld_printf.c @@ -46,7 +46,11 @@ #define MAXNBUF (sizeof(intmax_t) * NBBY + 1) +#define PRINT_METHOD_SNPRINTF 1 +#define PRINT_METHOD_WRITE 2 + struct snprintf_arg { + int method; char *str; char *buf; size_t remain; @@ -54,16 +58,6 @@ struct snprintf_arg { int fd; }; -static void -snprintf_func(int ch, struct snprintf_arg *const info) -{ - - if (info->remain >= 2) { - *info->str++ = ch; - info->remain--; - } -} - static void printf_out(struct snprintf_arg *info) { @@ -76,14 +70,24 @@ printf_out(struct snprintf_arg *info) } static void -printf_func(int ch, struct snprintf_arg *const info) +snprintf_func(int ch, struct snprintf_arg *const info) { - if (info->remain > 0) { - *info->str++ = ch; - info->remain--; - } else - printf_out(info); + switch (info->method) { + case PRINT_METHOD_SNPRINTF: + if (info->remain >= 2) { + *info->str++ = ch; + info->remain--; + } + break; + case PRINT_METHOD_WRITE: + if (info->remain > 0) { + *info->str++ = ch; + info->remain--; + } else + printf_out(info); + break; + } } static char const hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz"; @@ -113,10 +117,9 @@ ksprintn(char *nbuf, uintmax_t num, int base, int *lenp, int upper) } static int -kvprintf(char const *fmt, void (*func)(int c, struct snprintf_arg *const arg), - struct snprintf_arg *arg, int radix, va_list ap) +kvprintf(char const *fmt, struct snprintf_arg *arg, int radix, va_list ap) { -#define PCHAR(c) func((c), arg) +#define PCHAR(c) snprintf_func((c), arg) char nbuf[MAXNBUF]; const char *p, *percent, *q; u_char *up; @@ -429,10 +432,11 @@ rtld_vsnprintf(char *buf, size_t bufsize, const char *fmt, va_list ap) struct snprintf_arg info; int retval; + info.method = PRINT_METHOD_SNPRINTF; info.buf = info.str = buf; info.buf_total = info.remain = bufsize; info.fd = -1; - retval = kvprintf(fmt, snprintf_func, &info, 10, ap); + retval = kvprintf(fmt, &info, 10, ap); if (info.remain >= 1) *info.str++ = '\0'; return (retval); @@ -445,10 +449,11 @@ rtld_vfdprintf(int fd, const char *fmt, va_list ap) struct snprintf_arg info; int retval; + info.method = PRINT_METHOD_WRITE; info.buf = info.str = buf; info.buf_total = info.remain = sizeof(buf); info.fd = fd; - retval = kvprintf(fmt, printf_func, &info, 10, ap); + retval = kvprintf(fmt, &info, 10, ap); printf_out(&info); return (retval); } From 3407fefef61ca8c99d3815700ad3fe066bd67d59 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 6 Sep 2011 10:30:11 +0000 Subject: [PATCH 390/452] Split the vm_page flags PG_WRITEABLE and PG_REFERENCED into atomic flags field. Updates to the atomic flags are performed using the atomic ops on the containing word, do not require any vm lock to be held, and are non-blocking. The vm_page_aflag_set(9) and vm_page_aflag_clear(9) functions are provided to modify afalgs. Document the changes to flags field to only require the page lock. Introduce vm_page_reference(9) function to provide a stable KPI and KBI for filesystems like tmpfs and zfs which need to mark a page as referenced. Reviewed by: alc, attilio Tested by: marius, flo (sparc64); andreast (powerpc, powerpc64) Approved by: re (bz) --- sys/amd64/amd64/pmap.c | 46 ++++---- sys/arm/arm/pmap.c | 32 ++--- .../opensolaris/uts/common/fs/zfs/zfs_vnops.c | 3 +- sys/fs/tmpfs/tmpfs_vnops.c | 9 +- sys/i386/i386/pmap.c | 46 ++++---- sys/i386/xen/pmap.c | 40 +++---- sys/ia64/ia64/pmap.c | 32 ++--- sys/mips/mips/pmap.c | 44 +++---- sys/powerpc/aim/mmu_oea.c | 26 ++--- sys/powerpc/aim/mmu_oea64.c | 26 ++--- sys/powerpc/booke/pmap.c | 30 ++--- sys/powerpc/powerpc/mmu_if.m | 2 +- sys/sparc64/sparc64/pmap.c | 32 ++--- sys/vm/swap_pager.c | 2 +- sys/vm/vm_fault.c | 4 +- sys/vm/vm_mmap.c | 8 +- sys/vm/vm_object.c | 4 +- sys/vm/vm_page.c | 109 ++++++++++-------- sys/vm/vm_page.h | 40 ++++--- sys/vm/vm_pageout.c | 28 +++-- sys/vm/vnode_pager.c | 2 +- 21 files changed, 289 insertions(+), 276 deletions(-) diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index e6ab1a197ff..43df8ee15ba 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -2123,7 +2123,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) KASSERT((tpte & PG_W) == 0, ("pmap_collect: wired pte %#lx", tpte)); if (tpte & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); free = NULL; @@ -2137,7 +2137,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) } if (TAILQ_EMPTY(&m->md.pv_list) && TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } } @@ -2391,7 +2391,7 @@ pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) if (TAILQ_EMPTY(&m->md.pv_list)) { pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); if (TAILQ_EMPTY(&pvh->pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } } @@ -2615,10 +2615,10 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); if (oldpde & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); if (TAILQ_EMPTY(&m->md.pv_list) && TAILQ_EMPTY(&pvh->pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } } if (pmap == kernel_pmap) { @@ -2659,7 +2659,7 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); if (oldpte & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); pmap_remove_entry(pmap, m, va); } return (pmap_unuse_pt(pmap, va, ptepde, free)); @@ -2872,7 +2872,7 @@ pmap_remove_all(vm_page_t m) if (tpte & PG_W) pmap->pm_stats.wired_count--; if (tpte & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); /* * Update the vm_page_t clean and reference bits. @@ -2885,7 +2885,7 @@ pmap_remove_all(vm_page_t m) free_pv_entry(pmap, pv); PMAP_UNLOCK(pmap); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); pmap_free_zero_pages(free); } @@ -3301,7 +3301,7 @@ validate: if ((prot & VM_PROT_WRITE) != 0) { newpte |= PG_RW; if ((newpte & PG_MANAGED) != 0) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } if ((prot & VM_PROT_EXECUTE) == 0) newpte |= pg_nx; @@ -3325,7 +3325,7 @@ validate: origpte = pte_load_store(pte, newpte); if (origpte & PG_A) { if (origpte & PG_MANAGED) - vm_page_flag_set(om, PG_REFERENCED); + vm_page_aflag_set(om, PGA_REFERENCED); if (opa != VM_PAGE_TO_PHYS(m) || ((origpte & PG_NX) == 0 && (newpte & PG_NX))) invlva = TRUE; @@ -3339,7 +3339,7 @@ validate: if ((origpte & PG_MANAGED) != 0 && TAILQ_EMPTY(&om->md.pv_list) && TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list)) - vm_page_flag_clear(om, PG_WRITEABLE); + vm_page_aflag_clear(om, PGA_WRITEABLE); if (invlva) pmap_invalidate_page(pmap, va); } else @@ -4147,7 +4147,7 @@ pmap_remove_pages(pmap_t pmap) if (TAILQ_EMPTY(&pvh->pv_list)) { for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++) if (TAILQ_EMPTY(&mt->md.pv_list)) - vm_page_flag_clear(mt, PG_WRITEABLE); + vm_page_aflag_clear(mt, PGA_WRITEABLE); } mpte = pmap_lookup_pt_page(pmap, pv->pv_va); if (mpte != NULL) { @@ -4165,7 +4165,7 @@ pmap_remove_pages(pmap_t pmap) if (TAILQ_EMPTY(&m->md.pv_list)) { pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); if (TAILQ_EMPTY(&pvh->pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } } pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free); @@ -4203,13 +4203,13 @@ pmap_is_modified(vm_page_t m) ("pmap_is_modified: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be - * concurrently set while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be + * concurrently set while the object is locked. Thus, if PGA_WRITEABLE * is clear, no PTEs can have PG_M set. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return (FALSE); vm_page_lock_queues(); rv = pmap_is_modified_pvh(&m->md) || @@ -4332,13 +4332,13 @@ pmap_remove_write(vm_page_t m) ("pmap_remove_write: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by - * another thread while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PGA_WRITEABLE * is clear, no page table entries need updating. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); @@ -4370,7 +4370,7 @@ retry: } PMAP_UNLOCK(pmap); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } @@ -4478,11 +4478,11 @@ pmap_clear_modify(vm_page_t m) ("pmap_clear_modify: page %p is busy", m)); /* - * If the page is not PG_WRITEABLE, then no PTEs can have PG_M set. + * If the page is not PGA_WRITEABLE, then no PTEs can have PG_M set. * If the object containing the page is locked and the page is not - * VPO_BUSY, then PG_WRITEABLE cannot be concurrently set. + * VPO_BUSY, then PGA_WRITEABLE cannot be concurrently set. */ - if ((m->flags & PG_WRITEABLE) == 0) + if ((m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c index 38733c9613e..28835ec9362 100644 --- a/sys/arm/arm/pmap.c +++ b/sys/arm/arm/pmap.c @@ -1402,7 +1402,7 @@ pmap_fix_cache(struct vm_page *pg, pmap_t pm, vm_offset_t va) if ((kwritable == 0) && (writable == 0)) { pg->md.pvh_attrs &= ~PVF_MOD; - vm_page_flag_clear(pg, PG_WRITEABLE); + vm_page_aflag_clear(pg, PGA_WRITEABLE); return; } } @@ -1568,7 +1568,7 @@ pmap_clearbit(struct vm_page *pg, u_int maskbits) } if (maskbits & PVF_WRITE) - vm_page_flag_clear(pg, PG_WRITEABLE); + vm_page_aflag_clear(pg, PGA_WRITEABLE); vm_page_unlock_queues(); return (count); } @@ -1630,7 +1630,7 @@ pmap_enter_pv(struct vm_page *pg, struct pv_entry *pve, pmap_t pm, pg->md.pvh_attrs |= flags & (PVF_REF | PVF_MOD); if (pve->pv_flags & PVF_WIRED) ++pm->pm_stats.wired_count; - vm_page_flag_set(pg, PG_REFERENCED); + vm_page_aflag_set(pg, PGA_REFERENCED); } /* @@ -1699,7 +1699,7 @@ pmap_nuke_pv(struct vm_page *pg, pmap_t pm, struct pv_entry *pve) if (TAILQ_FIRST(&pg->md.pv_list) == NULL) pg->md.pvh_attrs &= ~PVF_REF; else - vm_page_flag_set(pg, PG_REFERENCED); + vm_page_aflag_set(pg, PGA_REFERENCED); if ((pve->pv_flags & PVF_NC) && ((pm == pmap_kernel()) || (pve->pv_flags & PVF_WRITE) || !(pve->pv_flags & PVF_MWC))) pmap_fix_cache(pg, pm, 0); @@ -1709,7 +1709,7 @@ pmap_nuke_pv(struct vm_page *pg, pmap_t pm, struct pv_entry *pve) break; if (!pve) { pg->md.pvh_attrs &= ~PVF_MOD; - vm_page_flag_clear(pg, PG_WRITEABLE); + vm_page_aflag_clear(pg, PGA_WRITEABLE); } } pv = TAILQ_FIRST(&pg->md.pv_list); @@ -1724,7 +1724,7 @@ pmap_nuke_pv(struct vm_page *pg, pmap_t pm, struct pv_entry *pve) --pm->pm_stats.wired_count; pg->md.pvh_attrs &= ~PVF_REF; pg->md.pvh_attrs &= ~PVF_MOD; - vm_page_flag_clear(pg, PG_WRITEABLE); + vm_page_aflag_clear(pg, PGA_WRITEABLE); pmap_free_pv_entry(pv); } } @@ -2695,7 +2695,7 @@ pmap_remove_pages(pmap_t pmap) npv = TAILQ_NEXT(pv, pv_plist); pmap_nuke_pv(m, pmap, pv); if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); pmap_free_pv_entry(pv); pmap_free_l2_bucket(pmap, l2b, 1); } @@ -3172,7 +3172,7 @@ pmap_remove_all(vm_page_t m) else pmap_tlb_flushD(curpm); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } @@ -3406,7 +3406,7 @@ do_l2b_alloc: vm_page_dirty(m); } if (m && opte) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); } else { /* * Need to do page referenced emulation. @@ -3418,7 +3418,7 @@ do_l2b_alloc: npte |= L2_S_PROT_W; if (m != NULL && (m->oflags & VPO_UNMANAGED) == 0) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } npte |= pte_l2_s_cache_mode; if (m && m == opg) { @@ -4505,11 +4505,11 @@ pmap_clear_modify(vm_page_t m) ("pmap_clear_modify: page %p is busy", m)); /* - * If the page is not PG_WRITEABLE, then no mappings can be modified. + * If the page is not PGA_WRITEABLE, then no mappings can be modified. * If the object containing the page is locked and the page is not - * VPO_BUSY, then PG_WRITEABLE cannot be concurrently set. + * VPO_BUSY, then PGA_WRITEABLE cannot be concurrently set. */ - if ((m->flags & PG_WRITEABLE) == 0) + if ((m->aflags & PGA_WRITEABLE) == 0) return; if (m->md.pvh_attrs & PVF_MOD) pmap_clearbit(m, PVF_MOD); @@ -4558,13 +4558,13 @@ pmap_remove_write(vm_page_t m) ("pmap_remove_write: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by - * another thread while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PGA_WRITEABLE * is clear, no page table entries need updating. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) != 0 || - (m->flags & PG_WRITEABLE) != 0) + (m->aflags & PGA_WRITEABLE) != 0) pmap_clearbit(m, PVF_WRITE); } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index 14b68238627..8d8ddfcb22d 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -331,8 +331,7 @@ page_lookup(vnode_t *vp, int64_t start, int64_t off, int64_t nbytes) * sleeping so that the page daemon is less * likely to reclaim it. */ - vm_page_lock_queues(); - vm_page_flag_set(pp, PG_REFERENCED); + vm_page_reference(pp); vm_page_sleep(pp, "zfsmwb"); continue; } diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c index 0568e93cd41..74aba047edc 100644 --- a/sys/fs/tmpfs/tmpfs_vnops.c +++ b/sys/fs/tmpfs/tmpfs_vnops.c @@ -518,8 +518,7 @@ lookupvpg: * Reference the page before unlocking and sleeping so * that the page daemon is less likely to reclaim it. */ - vm_page_lock_queues(); - vm_page_flag_set(m, PG_REFERENCED); + vm_page_reference(m); vm_page_sleep(m, "tmfsmr"); goto lookupvpg; } @@ -538,8 +537,7 @@ lookupvpg: * Reference the page before unlocking and sleeping so * that the page daemon is less likely to reclaim it. */ - vm_page_lock_queues(); - vm_page_flag_set(m, PG_REFERENCED); + vm_page_reference(m); vm_page_sleep(m, "tmfsmr"); goto lookupvpg; } @@ -650,8 +648,7 @@ lookupvpg: * Reference the page before unlocking and sleeping so * that the page daemon is less likely to reclaim it. */ - vm_page_lock_queues(); - vm_page_flag_set(vpg, PG_REFERENCED); + vm_page_reference(vpg); vm_page_sleep(vpg, "tmfsmw"); goto lookupvpg; } diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index e6b86699000..db5f99566f7 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -2207,7 +2207,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) KASSERT((tpte & PG_W) == 0, ("pmap_collect: wired pte %#jx", (uintmax_t)tpte)); if (tpte & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); free = NULL; @@ -2221,7 +2221,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) } if (TAILQ_EMPTY(&m->md.pv_list) && TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } sched_unpin(); } @@ -2461,7 +2461,7 @@ pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) if (TAILQ_EMPTY(&m->md.pv_list)) { pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); if (TAILQ_EMPTY(&pvh->pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } } @@ -2714,10 +2714,10 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); if (oldpde & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); if (TAILQ_EMPTY(&m->md.pv_list) && TAILQ_EMPTY(&pvh->pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } } if (pmap == kernel_pmap) { @@ -2763,7 +2763,7 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, vm_page_t *free) if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); if (oldpte & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); pmap_remove_entry(pmap, m, va); } return (pmap_unuse_pt(pmap, va, free)); @@ -2953,7 +2953,7 @@ pmap_remove_all(vm_page_t m) if (tpte & PG_W) pmap->pm_stats.wired_count--; if (tpte & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); /* * Update the vm_page_t clean and reference bits. @@ -2966,7 +2966,7 @@ pmap_remove_all(vm_page_t m) free_pv_entry(pmap, pv); PMAP_UNLOCK(pmap); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); sched_unpin(); vm_page_unlock_queues(); pmap_free_zero_pages(free); @@ -3413,7 +3413,7 @@ validate: if ((prot & VM_PROT_WRITE) != 0) { newpte |= PG_RW; if ((newpte & PG_MANAGED) != 0) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } #ifdef PAE if ((prot & VM_PROT_EXECUTE) == 0) @@ -3439,7 +3439,7 @@ validate: origpte = pte_load_store(pte, newpte); if (origpte & PG_A) { if (origpte & PG_MANAGED) - vm_page_flag_set(om, PG_REFERENCED); + vm_page_aflag_set(om, PGA_REFERENCED); if (opa != VM_PAGE_TO_PHYS(m)) invlva = TRUE; #ifdef PAE @@ -3457,7 +3457,7 @@ validate: if ((origpte & PG_MANAGED) != 0 && TAILQ_EMPTY(&om->md.pv_list) && TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list)) - vm_page_flag_clear(om, PG_WRITEABLE); + vm_page_aflag_clear(om, PGA_WRITEABLE); if (invlva) pmap_invalidate_page(pmap, va); } else @@ -4287,7 +4287,7 @@ pmap_remove_pages(pmap_t pmap) if (TAILQ_EMPTY(&pvh->pv_list)) { for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++) if (TAILQ_EMPTY(&mt->md.pv_list)) - vm_page_flag_clear(mt, PG_WRITEABLE); + vm_page_aflag_clear(mt, PGA_WRITEABLE); } mpte = pmap_lookup_pt_page(pmap, pv->pv_va); if (mpte != NULL) { @@ -4305,7 +4305,7 @@ pmap_remove_pages(pmap_t pmap) if (TAILQ_EMPTY(&m->md.pv_list)) { pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); if (TAILQ_EMPTY(&pvh->pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } pmap_unuse_pt(pmap, pv->pv_va, &free); } @@ -4345,13 +4345,13 @@ pmap_is_modified(vm_page_t m) ("pmap_is_modified: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be - * concurrently set while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be + * concurrently set while the object is locked. Thus, if PGA_WRITEABLE * is clear, no PTEs can have PG_M set. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return (FALSE); vm_page_lock_queues(); rv = pmap_is_modified_pvh(&m->md) || @@ -4478,13 +4478,13 @@ pmap_remove_write(vm_page_t m) ("pmap_remove_write: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by - * another thread while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PGA_WRITEABLE * is clear, no page table entries need updating. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); sched_pin(); @@ -4522,7 +4522,7 @@ retry: } PMAP_UNLOCK(pmap); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); sched_unpin(); vm_page_unlock_queues(); } @@ -4633,11 +4633,11 @@ pmap_clear_modify(vm_page_t m) ("pmap_clear_modify: page %p is busy", m)); /* - * If the page is not PG_WRITEABLE, then no PTEs can have PG_M set. + * If the page is not PGA_WRITEABLE, then no PTEs can have PG_M set. * If the object containing the page is locked and the page is not - * VPO_BUSY, then PG_WRITEABLE cannot be concurrently set. + * VPO_BUSY, then PGA_WRITEABLE cannot be concurrently set. */ - if ((m->flags & PG_WRITEABLE) == 0) + if ((m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); sched_pin(); diff --git a/sys/i386/xen/pmap.c b/sys/i386/xen/pmap.c index ece1b6c8f9d..b19f75c61b8 100644 --- a/sys/i386/xen/pmap.c +++ b/sys/i386/xen/pmap.c @@ -2037,7 +2037,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) KASSERT((tpte & PG_W) == 0, ("pmap_collect: wired pte %#jx", (uintmax_t)tpte)); if (tpte & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); free = NULL; @@ -2050,7 +2050,7 @@ pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) PMAP_UNLOCK(pmap); } if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } sched_unpin(); } @@ -2222,7 +2222,7 @@ pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) mtx_assert(&vm_page_queue_mtx, MA_OWNED); pmap_pvh_free(&m->md, pmap, va); if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } /* @@ -2274,7 +2274,7 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, vm_page_t *free) if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); if (oldpte & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); pmap_remove_entry(pmap, m, va); } return (pmap_unuse_pt(pmap, va, free)); @@ -2446,7 +2446,7 @@ pmap_remove_all(vm_page_t m) if (tpte & PG_W) pmap->pm_stats.wired_count--; if (tpte & PG_A) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); /* * Update the vm_page_t clean and reference bits. @@ -2459,7 +2459,7 @@ pmap_remove_all(vm_page_t m) free_pv_entry(pmap, pv); PMAP_UNLOCK(pmap); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); PT_UPDATES_FLUSH(); if (*PMAP1) PT_SET_MA(PADDR1, 0); @@ -2739,7 +2739,7 @@ validate: if ((prot & VM_PROT_WRITE) != 0) { newpte |= PG_RW; if ((newpte & PG_MANAGED) != 0) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } #ifdef PAE if ((prot & VM_PROT_EXECUTE) == 0) @@ -2764,7 +2764,7 @@ validate: PT_SET_VA(pte, newpte | PG_A, FALSE); if (origpte & PG_A) { if (origpte & PG_MANAGED) - vm_page_flag_set(om, PG_REFERENCED); + vm_page_aflag_set(om, PGA_REFERENCED); if (opa != VM_PAGE_TO_PHYS(m)) invlva = TRUE; #ifdef PAE @@ -2781,7 +2781,7 @@ validate: } if ((origpte & PG_MANAGED) != 0 && TAILQ_EMPTY(&om->md.pv_list)) - vm_page_flag_clear(om, PG_WRITEABLE); + vm_page_aflag_clear(om, PGA_WRITEABLE); if (invlva) pmap_invalidate_page(pmap, va); } else{ @@ -3549,7 +3549,7 @@ pmap_remove_pages(pmap_t pmap) TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); pmap_unuse_pt(pmap, pv->pv_va, &free); @@ -3604,13 +3604,13 @@ pmap_is_modified(vm_page_t m) rv = FALSE; /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be - * concurrently set while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be + * concurrently set while the object is locked. Thus, if PGA_WRITEABLE * is clear, no PTEs can have PG_M set. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return (rv); vm_page_lock_queues(); sched_pin(); @@ -3735,13 +3735,13 @@ pmap_remove_write(vm_page_t m) ("pmap_remove_write: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by - * another thread while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PGA_WRITEABLE * is clear, no page table entries need updating. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); sched_pin(); @@ -3769,7 +3769,7 @@ retry: } PMAP_UNLOCK(pmap); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); PT_UPDATES_FLUSH(); if (*PMAP1) PT_SET_MA(PADDR1, 0); @@ -3846,11 +3846,11 @@ pmap_clear_modify(vm_page_t m) ("pmap_clear_modify: page %p is busy", m)); /* - * If the page is not PG_WRITEABLE, then no PTEs can have PG_M set. + * If the page is not PGA_WRITEABLE, then no PTEs can have PG_M set. * If the object containing the page is locked and the page is not - * VPO_BUSY, then PG_WRITEABLE cannot be concurrently set. + * VPO_BUSY, then PGA_WRITEABLE cannot be concurrently set. */ - if ((m->flags & PG_WRITEABLE) == 0) + if ((m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); sched_pin(); diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index f9f60607a04..37116f5af19 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -804,7 +804,7 @@ retry: pmap_invalidate_page(va); pmap_switch(oldpmap); if (pmap_accessed(pte)) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); if (pmap_dirty(pte)) vm_page_dirty(m); pmap_free_pte(pte, va); @@ -819,7 +819,7 @@ retry: free_pv_entry(pv); } if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } if (allocated_pv == NULL) { if (vpq == &vm_page_queues[PQ_INACTIVE]) { @@ -972,7 +972,7 @@ pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va, pv_entry_t pv) TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); m->md.pv_list_count--; if (TAILQ_FIRST(&m->md.pv_list) == NULL) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist); free_pv_entry(pv); @@ -1198,7 +1198,7 @@ pmap_remove_pte(pmap_t pmap, struct ia64_lpte *pte, vm_offset_t va, if (pmap_dirty(pte)) vm_page_dirty(m); if (pmap_accessed(pte)) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); error = pmap_remove_entry(pmap, m, va, pv); } @@ -1460,7 +1460,7 @@ pmap_remove_all(vm_page_t m) pmap_switch(oldpmap); PMAP_UNLOCK(pmap); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } @@ -1647,7 +1647,7 @@ validate: ia64_sync_icache(va, PAGE_SIZE); if ((prot & VM_PROT_WRITE) != 0 && managed) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); vm_page_unlock_queues(); pmap_switch(oldpmap); PMAP_UNLOCK(pmap); @@ -2048,13 +2048,13 @@ pmap_is_modified(vm_page_t m) rv = FALSE; /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be - * concurrently set while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be + * concurrently set while the object is locked. Thus, if PGA_WRITEABLE * is clear, no PTEs can be dirty. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return (rv); vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { @@ -2139,11 +2139,11 @@ pmap_clear_modify(vm_page_t m) ("pmap_clear_modify: page %p is busy", m)); /* - * If the page is not PG_WRITEABLE, then no PTEs can be modified. + * If the page is not PGA_WRITEABLE, then no PTEs can be modified. * If the object containing the page is locked and the page is not - * VPO_BUSY, then PG_WRITEABLE cannot be concurrently set. + * VPO_BUSY, then PGA_WRITEABLE cannot be concurrently set. */ - if ((m->flags & PG_WRITEABLE) == 0) + if ((m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { @@ -2206,13 +2206,13 @@ pmap_remove_write(vm_page_t m) ("pmap_remove_write: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by - * another thread while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PGA_WRITEABLE * is clear, no page table entries need updating. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { @@ -2235,7 +2235,7 @@ pmap_remove_write(vm_page_t m) pmap_switch(oldpmap); PMAP_UNLOCK(pmap); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c index e6dcd770010..7da76be6236 100644 --- a/sys/mips/mips/pmap.c +++ b/sys/mips/mips/pmap.c @@ -1432,7 +1432,7 @@ retry: KASSERT(!pte_test(&oldpte, PTE_W), ("wired pte for unwired page")); if (m->md.pv_flags & PV_TABLE_REF) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); if (pte_test(&oldpte, PTE_D)) vm_page_dirty(m); pmap_invalidate_page(pmap, va); @@ -1448,7 +1448,7 @@ retry: free_pv_entry(pv); } if (TAILQ_EMPTY(&m->md.pv_list)) { - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); m->md.pv_flags &= ~(PV_TABLE_REF | PV_TABLE_MOD); } } @@ -1527,7 +1527,7 @@ pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) mtx_assert(&vm_page_queue_mtx, MA_OWNED); pmap_pvh_free(&m->md, pmap, va); if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } /* @@ -1589,7 +1589,7 @@ pmap_remove_pte(struct pmap *pmap, pt_entry_t *ptq, vm_offset_t va) vm_page_dirty(m); } if (m->md.pv_flags & PV_TABLE_REF) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); m->md.pv_flags &= ~(PV_TABLE_REF | PV_TABLE_MOD); pmap_remove_entry(pmap, m, va); @@ -1713,7 +1713,7 @@ pmap_remove_all(vm_page_t m) vm_page_lock_queues(); if (m->md.pv_flags & PV_TABLE_REF) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { PMAP_LOCK(pv->pv_pmap); @@ -1757,7 +1757,7 @@ pmap_remove_all(vm_page_t m) free_pv_entry(pv); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); m->md.pv_flags &= ~(PV_TABLE_REF | PV_TABLE_MOD); vm_page_unlock_queues(); } @@ -2004,7 +2004,7 @@ validate: *pte = newpte; if (page_is_managed(opa) && (opa != pa)) { if (om->md.pv_flags & PV_TABLE_REF) - vm_page_flag_set(om, PG_REFERENCED); + vm_page_aflag_set(om, PGA_REFERENCED); om->md.pv_flags &= ~(PV_TABLE_REF | PV_TABLE_MOD); } @@ -2017,7 +2017,7 @@ validate: } if (page_is_managed(opa) && TAILQ_EMPTY(&om->md.pv_list)) - vm_page_flag_clear(om, PG_WRITEABLE); + vm_page_aflag_clear(om, PGA_WRITEABLE); } else { *pte = newpte; } @@ -2535,7 +2535,7 @@ pmap_remove_pages(pmap_t pmap) m->md.pv_list_count--; TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); if (TAILQ_FIRST(&m->md.pv_list) == NULL) { - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem); free_pv_entry(pv); @@ -2615,7 +2615,7 @@ pmap_changebit(vm_page_t m, int bit, boolean_t setem) PMAP_UNLOCK(pv->pv_pmap); } if (!setem && bit == PTE_D) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); } /* @@ -2662,13 +2662,13 @@ pmap_remove_write(vm_page_t m) ("pmap_remove_write: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by - * another thread while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PGA_WRITEABLE * is clear, no page table entries need updating. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return; /* @@ -2685,7 +2685,7 @@ pmap_remove_write(vm_page_t m) pmap_protect(pv->pv_pmap, va, va + PAGE_SIZE, VM_PROT_READ | VM_PROT_EXECUTE); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } @@ -2724,13 +2724,13 @@ pmap_is_modified(vm_page_t m) ("pmap_is_modified: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be - * concurrently set while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be + * concurrently set while the object is locked. Thus, if PGA_WRITEABLE * is clear, no PTEs can have PTE_D set. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return (FALSE); vm_page_lock_queues(); if (m->md.pv_flags & PV_TABLE_MOD) @@ -2781,11 +2781,11 @@ pmap_clear_modify(vm_page_t m) ("pmap_clear_modify: page %p is busy", m)); /* - * If the page is not PG_WRITEABLE, then no PTEs can have PTE_D set. + * If the page is not PGA_WRITEABLE, then no PTEs can have PTE_D set. * If the object containing the page is locked and the page is not - * VPO_BUSY, then PG_WRITEABLE cannot be concurrently set. + * VPO_BUSY, then PGA_WRITEABLE cannot be concurrently set. */ - if ((m->flags & PG_WRITEABLE) == 0) + if ((m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); if (m->md.pv_flags & PV_TABLE_MOD) { @@ -2929,7 +2929,7 @@ retry: * determine if the address is MINCORE_REFERENCED. */ m = PHYS_TO_VM_PAGE(pa); - if ((m->flags & PG_REFERENCED) != 0) + if ((m->aflags & PGA_REFERENCED) != 0) val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER; } if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) != @@ -3185,7 +3185,7 @@ init_pte_prot(vm_offset_t va, vm_page_t m, vm_prot_t prot) rw = PTE_V | PTE_D | PTE_C_CACHE; else rw = PTE_V | PTE_C_CACHE; - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } else /* Needn't emulate a modified bit for unmanaged pages. */ rw = PTE_V | PTE_D | PTE_C_CACHE; diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c index 331dbe94866..57c35bf9add 100644 --- a/sys/powerpc/aim/mmu_oea.c +++ b/sys/powerpc/aim/mmu_oea.c @@ -1102,7 +1102,7 @@ moea_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, pte_lo |= PTE_BW; if (pmap_bootstrapped && (m->oflags & VPO_UNMANAGED) == 0) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } else pte_lo |= PTE_BR; @@ -1255,13 +1255,13 @@ moea_is_modified(mmu_t mmu, vm_page_t m) ("moea_is_modified: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be - * concurrently set while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be + * concurrently set while the object is locked. Thus, if PGA_WRITEABLE * is clear, no PTEs can have PTE_CHG set. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return (FALSE); return (moea_query_bit(m, PTE_CHG)); } @@ -1299,11 +1299,11 @@ moea_clear_modify(mmu_t mmu, vm_page_t m) ("moea_clear_modify: page %p is busy", m)); /* - * If the page is not PG_WRITEABLE, then no PTEs can have PTE_CHG + * If the page is not PGA_WRITEABLE, then no PTEs can have PTE_CHG * set. If the object containing the page is locked and the page is - * not VPO_BUSY, then PG_WRITEABLE cannot be concurrently set. + * not VPO_BUSY, then PGA_WRITEABLE cannot be concurrently set. */ - if ((m->flags & PG_WRITEABLE) == 0) + if ((m->aflags & PGA_WRITEABLE) == 0) return; moea_clear_bit(m, PTE_CHG); } @@ -1323,13 +1323,13 @@ moea_remove_write(mmu_t mmu, vm_page_t m) ("moea_remove_write: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by - * another thread while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PGA_WRITEABLE * is clear, no page table entries need updating. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); lo = moea_attr_fetch(m); @@ -1356,7 +1356,7 @@ moea_remove_write(mmu_t mmu, vm_page_t m) moea_attr_clear(m, PTE_CHG); vm_page_dirty(m); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } @@ -1794,11 +1794,11 @@ moea_remove_all(mmu_t mmu, vm_page_t m) moea_pvo_remove(pvo, -1); PMAP_UNLOCK(pmap); } - if ((m->flags & PG_WRITEABLE) && moea_is_modified(mmu, m)) { + if ((m->aflags & PGA_WRITEABLE) && moea_is_modified(mmu, m)) { moea_attr_clear(m, PTE_CHG); vm_page_dirty(m); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c index 0a10ce8c61c..75004622753 100644 --- a/sys/powerpc/aim/mmu_oea64.c +++ b/sys/powerpc/aim/mmu_oea64.c @@ -1239,7 +1239,7 @@ moea64_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, pte_lo |= LPTE_BW; if (pmap_bootstrapped && (m->oflags & VPO_UNMANAGED) == 0) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } else pte_lo |= LPTE_BR; @@ -1484,13 +1484,13 @@ moea64_is_modified(mmu_t mmu, vm_page_t m) ("moea64_is_modified: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be - * concurrently set while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be + * concurrently set while the object is locked. Thus, if PGA_WRITEABLE * is clear, no PTEs can have LPTE_CHG set. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return (FALSE); return (moea64_query_bit(mmu, m, LPTE_CHG)); } @@ -1528,11 +1528,11 @@ moea64_clear_modify(mmu_t mmu, vm_page_t m) ("moea64_clear_modify: page %p is busy", m)); /* - * If the page is not PG_WRITEABLE, then no PTEs can have LPTE_CHG + * If the page is not PGA_WRITEABLE, then no PTEs can have LPTE_CHG * set. If the object containing the page is locked and the page is - * not VPO_BUSY, then PG_WRITEABLE cannot be concurrently set. + * not VPO_BUSY, then PGA_WRITEABLE cannot be concurrently set. */ - if ((m->flags & PG_WRITEABLE) == 0) + if ((m->aflags & PGA_WRITEABLE) == 0) return; moea64_clear_bit(mmu, m, LPTE_CHG); } @@ -1552,13 +1552,13 @@ moea64_remove_write(mmu_t mmu, vm_page_t m) ("moea64_remove_write: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by - * another thread while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PGA_WRITEABLE * is clear, no page table entries need updating. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); lo = moea64_attr_fetch(m); @@ -1588,7 +1588,7 @@ moea64_remove_write(mmu_t mmu, vm_page_t m) moea64_attr_clear(m, LPTE_CHG); vm_page_dirty(m); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } @@ -2064,11 +2064,11 @@ moea64_remove_all(mmu_t mmu, vm_page_t m) moea64_pvo_remove(mmu, pvo); PMAP_UNLOCK(pmap); } - if ((m->flags & PG_WRITEABLE) && moea64_is_modified(mmu, m)) { + if ((m->aflags & PGA_WRITEABLE) && moea64_is_modified(mmu, m)) { moea64_attr_clear(m, LPTE_CHG); vm_page_dirty(m); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c index 26261a6b6fc..4d1043a2eea 100644 --- a/sys/powerpc/booke/pmap.c +++ b/sys/powerpc/booke/pmap.c @@ -771,7 +771,7 @@ pv_remove(pmap_t pmap, vm_offset_t va, vm_page_t m) /* remove from pv_list */ TAILQ_REMOVE(&m->md.pv_list, pve, pv_link); if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); /* free pv entry struct */ pv_free(pve); @@ -820,7 +820,7 @@ pte_remove(mmu_t mmu, pmap_t pmap, vm_offset_t va, uint8_t flags) vm_page_dirty(m); if (PTE_ISREFERENCED(pte)) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); pv_remove(pmap, va, m); } @@ -1600,7 +1600,7 @@ mmu_booke_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, flags |= PTE_UW; if ((flags & PTE_MANAGED) != 0) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } else { /* Handle modified pages, sense modify status. */ @@ -1667,7 +1667,7 @@ mmu_booke_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, flags |= PTE_UW; if ((m->oflags & VPO_UNMANAGED) == 0) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } if (prot & VM_PROT_EXECUTE) { @@ -1804,7 +1804,7 @@ mmu_booke_remove_all(mmu_t mmu, vm_page_t m) pte_remove(mmu, pv->pv_pmap, pv->pv_va, hold_flag); PMAP_UNLOCK(pv->pv_pmap); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } @@ -1957,13 +1957,13 @@ mmu_booke_remove_write(mmu_t mmu, vm_page_t m) ("mmu_booke_remove_write: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by - * another thread while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PGA_WRITEABLE * is clear, no page table entries need updating. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { @@ -1988,7 +1988,7 @@ mmu_booke_remove_write(mmu_t mmu, vm_page_t m) } PMAP_UNLOCK(pv->pv_pmap); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } @@ -2172,13 +2172,13 @@ mmu_booke_is_modified(mmu_t mmu, vm_page_t m) rv = FALSE; /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be - * concurrently set while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be + * concurrently set while the object is locked. Thus, if PGA_WRITEABLE * is clear, no PTEs can be modified. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return (rv); vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { @@ -2253,11 +2253,11 @@ mmu_booke_clear_modify(mmu_t mmu, vm_page_t m) ("mmu_booke_clear_modify: page %p is busy", m)); /* - * If the page is not PG_WRITEABLE, then no PTEs can be modified. + * If the page is not PG_AWRITEABLE, then no PTEs can be modified. * If the object containing the page is locked and the page is not - * VPO_BUSY, then PG_WRITEABLE cannot be concurrently set. + * VPO_BUSY, then PG_AWRITEABLE cannot be concurrently set. */ - if ((m->flags & PG_WRITEABLE) == 0) + if ((m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { diff --git a/sys/powerpc/powerpc/mmu_if.m b/sys/powerpc/powerpc/mmu_if.m index 6f606225392..9d5b656cbac 100644 --- a/sys/powerpc/powerpc/mmu_if.m +++ b/sys/powerpc/powerpc/mmu_if.m @@ -584,7 +584,7 @@ METHOD void remove { /** * @brief Traverse the reverse-map list off the given physical page and - * remove all mappings. Clear the PG_WRITEABLE attribute from the page. + * remove all mappings. Clear the PGA_WRITEABLE attribute from the page. * * @param _pg physical page */ diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c index 0792c4bcf40..209be106747 100644 --- a/sys/sparc64/sparc64/pmap.c +++ b/sys/sparc64/sparc64/pmap.c @@ -1340,9 +1340,9 @@ pmap_remove_tte(struct pmap *pm, struct pmap *pm2, struct tte *tp, if ((data & TD_W) != 0) vm_page_dirty(m); if ((data & TD_REF) != 0) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); if (TAILQ_EMPTY(&m->md.tte_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); pm->pm_stats.resident_count--; } pmap_cache_remove(m, va); @@ -1403,7 +1403,7 @@ pmap_remove_all(vm_page_t m) if ((tp->tte_data & TD_WIRED) != 0) pm->pm_stats.wired_count--; if ((tp->tte_data & TD_REF) != 0) - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); if ((tp->tte_data & TD_W) != 0) vm_page_dirty(m); tp->tte_data &= ~TD_V; @@ -1414,7 +1414,7 @@ pmap_remove_all(vm_page_t m) TTE_ZERO(tp); PMAP_UNLOCK(pm); } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } @@ -1560,7 +1560,7 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, if (wired) tp->tte_data |= TD_W; if ((m->oflags & VPO_UNMANAGED) == 0) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } else if ((data & TD_W) != 0) vm_page_dirty(m); @@ -1601,7 +1601,7 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, if ((prot & VM_PROT_WRITE) != 0) { data |= TD_SW; if ((m->oflags & VPO_UNMANAGED) == 0) - vm_page_flag_set(m, PG_WRITEABLE); + vm_page_aflag_set(m, PGA_WRITEABLE); } if (prot & VM_PROT_EXECUTE) { data |= TD_EXEC; @@ -2066,13 +2066,13 @@ pmap_is_modified(vm_page_t m) rv = FALSE; /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be - * concurrently set while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be + * concurrently set while the object is locked. Thus, if PGA_WRITEABLE * is clear, no TTEs can have TD_W set. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return (rv); vm_page_lock_queues(); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { @@ -2143,11 +2143,11 @@ pmap_clear_modify(vm_page_t m) ("pmap_clear_modify: page %p is busy", m)); /* - * If the page is not PG_WRITEABLE, then no TTEs can have TD_W set. + * If the page is not PGA_WRITEABLE, then no TTEs can have TD_W set. * If the object containing the page is locked and the page is not - * VPO_BUSY, then PG_WRITEABLE cannot be concurrently set. + * VPO_BUSY, then PGA_WRITEABLE cannot be concurrently set. */ - if ((m->flags & PG_WRITEABLE) == 0) + if ((m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { @@ -2189,13 +2189,13 @@ pmap_remove_write(vm_page_t m) ("pmap_remove_write: page %p is not managed", m)); /* - * If the page is not VPO_BUSY, then PG_WRITEABLE cannot be set by - * another thread while the object is locked. Thus, if PG_WRITEABLE + * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by + * another thread while the object is locked. Thus, if PGA_WRITEABLE * is clear, no page table entries need updating. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); if ((m->oflags & VPO_BUSY) == 0 && - (m->flags & PG_WRITEABLE) == 0) + (m->aflags & PGA_WRITEABLE) == 0) return; vm_page_lock_queues(); TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { @@ -2207,7 +2207,7 @@ pmap_remove_write(vm_page_t m) tlb_page_demap(TTE_GET_PMAP(tp), TTE_GET_VA(tp)); } } - vm_page_flag_clear(m, PG_WRITEABLE); + vm_page_aflag_clear(m, PGA_WRITEABLE); vm_page_unlock_queues(); } diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index f491adca7a8..d7da4f91912 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -1593,7 +1593,7 @@ swp_pager_async_iodone(struct buf *bp) * status, then finish the I/O ( which decrements the * busy count and possibly wakes waiter's up ). */ - KASSERT((m->flags & PG_WRITEABLE) == 0, + KASSERT((m->aflags & PGA_WRITEABLE) == 0, ("swp_pager_async_iodone: page %p is not write" " protected", m)); vm_page_undirty(m); diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index eeb10a46174..1b8ac2fef17 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -345,9 +345,7 @@ RetryFault:; * sleeping so that the page daemon is less * likely to reclaim it. */ - vm_page_lock_queues(); - vm_page_flag_set(fs.m, PG_REFERENCED); - vm_page_unlock_queues(); + vm_page_aflag_set(fs.m, PGA_REFERENCED); vm_page_unlock(fs.m); if (fs.object != fs.first_object) { if (!VM_OBJECT_TRYLOCK( diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index a46d6b5ccf6..ce899e9078c 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -901,16 +901,16 @@ RestartScan: if (m->dirty != 0) mincoreinfo |= MINCORE_MODIFIED_OTHER; /* - * The first test for PG_REFERENCED is an + * The first test for PGA_REFERENCED is an * optimization. The second test is * required because a concurrent pmap * operation could clear the last reference - * and set PG_REFERENCED before the call to + * and set PGA_REFERENCED before the call to * pmap_is_referenced(). */ - if ((m->flags & PG_REFERENCED) != 0 || + if ((m->aflags & PGA_REFERENCED) != 0 || pmap_is_referenced(m) || - (m->flags & PG_REFERENCED) != 0) + (m->aflags & PGA_REFERENCED) != 0) mincoreinfo |= MINCORE_REFERENCED_OTHER; } if (object != NULL) diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 602d99e93ad..3de793b84ea 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -1098,9 +1098,7 @@ shadowlookup: * sleeping so that the page daemon is less * likely to reclaim it. */ - vm_page_lock_queues(); - vm_page_flag_set(m, PG_REFERENCED); - vm_page_unlock_queues(); + vm_page_aflag_set(m, PGA_REFERENCED); } vm_page_unlock(m); if (object != tobject) diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 6d558925d9a..341c2383abe 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -67,30 +67,9 @@ * page queue (vm_page_queue[]), regardless of other mutexes or the * busy state of a page. * - * - a hash chain mutex is required when associating or disassociating - * a page from the VM PAGE CACHE hash table (vm_page_buckets), - * regardless of other mutexes or the busy state of a page. + * - The object mutex is held when inserting or removing + * pages from an object (vm_page_insert() or vm_page_remove()). * - * - either a hash chain mutex OR a busied page is required in order - * to modify the page flags. A hash chain mutex must be obtained in - * order to busy a page. A page's flags cannot be modified by a - * hash chain mutex if the page is marked busy. - * - * - The object memq mutex is held when inserting or removing - * pages from an object (vm_page_insert() or vm_page_remove()). This - * is different from the object's main mutex. - * - * Generally speaking, you have to be aware of side effects when running - * vm_page ops. A vm_page_lookup() will return with the hash chain - * locked, whether it was able to lookup the page or not. vm_page_free(), - * vm_page_cache(), vm_page_activate(), and a number of other routines - * will release the hash chain mutex for you. Intermediate manipulation - * routines such as vm_page_flag_set() expect the hash chain to be held - * on entry and the hash chain will remain held on return. - * - * pageq scanning can only occur with the pageq in question locked. - * We have a known bottleneck with the active queue, but the cache - * and free queues are actually arrays already. */ /* @@ -473,33 +452,68 @@ vm_page_startup(vm_offset_t vaddr) return (vaddr); } -void -vm_page_flag_set(vm_page_t m, unsigned short bits) -{ - mtx_assert(&vm_page_queue_mtx, MA_OWNED); +CTASSERT(offsetof(struct vm_page, aflags) % sizeof(uint32_t) == 0); + +void +vm_page_aflag_set(vm_page_t m, uint8_t bits) +{ + uint32_t *addr, val; + /* - * The PG_WRITEABLE flag can only be set if the page is managed and + * The PGA_WRITEABLE flag can only be set if the page is managed and * VPO_BUSY. Currently, this flag is only set by pmap_enter(). */ - KASSERT((bits & PG_WRITEABLE) == 0 || + KASSERT((bits & PGA_WRITEABLE) == 0 || (m->oflags & (VPO_UNMANAGED | VPO_BUSY)) == VPO_BUSY, - ("PG_WRITEABLE and !VPO_BUSY")); - m->flags |= bits; + ("PGA_WRITEABLE and !VPO_BUSY")); + + /* + * We want to use atomic updates for m->aflags, which is a + * byte wide. Not all architectures provide atomic operations + * on the single-byte destination. Punt and access the whole + * 4-byte word with an atomic update. Parallel non-atomic + * updates to the fields included in the update by proximity + * are handled properly by atomics. + */ + addr = (void *)&m->aflags; + MPASS(((uintptr_t)addr & (sizeof(uint32_t) - 1)) == 0); + val = bits; +#if BYTE_ORDER == BIG_ENDIAN + val <<= 24; +#endif + atomic_set_32(addr, val); } void -vm_page_flag_clear(vm_page_t m, unsigned short bits) +vm_page_aflag_clear(vm_page_t m, uint8_t bits) { + uint32_t *addr, val; - mtx_assert(&vm_page_queue_mtx, MA_OWNED); /* - * The PG_REFERENCED flag can only be cleared if the object + * The PGA_REFERENCED flag can only be cleared if the object * containing the page is locked. */ - KASSERT((bits & PG_REFERENCED) == 0 || VM_OBJECT_LOCKED(m->object), - ("PG_REFERENCED and !VM_OBJECT_LOCKED")); - m->flags &= ~bits; + KASSERT((bits & PGA_REFERENCED) == 0 || VM_OBJECT_LOCKED(m->object), + ("PGA_REFERENCED and !VM_OBJECT_LOCKED")); + + /* + * See the comment in vm_page_aflag_set(). + */ + addr = (void *)&m->aflags; + MPASS(((uintptr_t)addr & (sizeof(uint32_t) - 1)) == 0); + val = bits; +#if BYTE_ORDER == BIG_ENDIAN + val <<= 24; +#endif + atomic_clear_32(addr, val); +} + +void +vm_page_reference(vm_page_t m) +{ + + vm_page_aflag_set(m, PGA_REFERENCED); } void @@ -874,7 +888,7 @@ vm_page_insert(vm_page_t m, vm_object_t object, vm_pindex_t pindex) * Since we are inserting a new and possibly dirty page, * update the object's OBJ_MIGHTBEDIRTY flag. */ - if (m->flags & PG_WRITEABLE) + if (m->aflags & PGA_WRITEABLE) vm_object_set_writeable_dirty(object); } @@ -1390,6 +1404,7 @@ vm_page_alloc(vm_object_t object, vm_pindex_t pindex, int req) } m->flags = flags; mtx_unlock(&vm_page_queue_free_mtx); + m->aflags = 0; if (object == NULL || object->type == OBJT_PHYS) m->oflags = VPO_UNMANAGED; else @@ -1480,6 +1495,7 @@ vm_page_alloc_init(vm_page_t m) vm_page_zero_count--; /* Don't clear the PG_ZERO flag; we'll need it later. */ m->flags &= PG_ZERO; + m->aflags = 0; m->oflags = VPO_UNMANAGED; /* Unmanaged pages don't use "act_count". */ return (drop); @@ -1880,7 +1896,7 @@ vm_page_unwire(vm_page_t m, int activate) if (activate) vm_page_enqueue(PQ_ACTIVE, m); else { - vm_page_flag_clear(m, PG_WINATCFLS); + m->flags &= ~PG_WINATCFLS; vm_page_enqueue(PQ_INACTIVE, m); } vm_page_unlock_queues(); @@ -1923,7 +1939,7 @@ _vm_page_deactivate(vm_page_t m, int athead) return; if (m->wire_count == 0 && (m->oflags & VPO_UNMANAGED) == 0) { vm_page_lock_queues(); - vm_page_flag_clear(m, PG_WINATCFLS); + m->flags &= ~PG_WINATCFLS; if (queue != PQ_NONE) vm_page_queue_remove(queue, m); if (athead) @@ -2156,15 +2172,13 @@ vm_page_dontneed(vm_page_t m) * * Perform the pmap_clear_reference() first. Otherwise, a concurrent * pmap operation, such as pmap_remove(), could clear a reference in - * the pmap and set PG_REFERENCED on the page before the + * the pmap and set PGA_REFERENCED on the page before the * pmap_clear_reference() had completed. Consequently, the page would * appear referenced based upon an old reference that occurred before * this function ran. */ pmap_clear_reference(m); - vm_page_lock_queues(); - vm_page_flag_clear(m, PG_REFERENCED); - vm_page_unlock_queues(); + vm_page_aflag_clear(m, PGA_REFERENCED); if (m->dirty == 0 && pmap_is_modified(m)) vm_page_dirty(m); @@ -2213,8 +2227,7 @@ retrylookup: * sleeping so that the page daemon is less * likely to reclaim it. */ - vm_page_lock_queues(); - vm_page_flag_set(m, PG_REFERENCED); + vm_page_aflag_set(m, PGA_REFERENCED); vm_page_sleep(m, "pgrbwt"); goto retrylookup; } else { @@ -2329,11 +2342,11 @@ vm_page_clear_dirty_mask(vm_page_t m, int pagebits) /* * If the object is locked and the page is neither VPO_BUSY nor - * PG_WRITEABLE, then the page's dirty field cannot possibly be + * PGA_WRITEABLE, then the page's dirty field cannot possibly be * set by a concurrent pmap operation. */ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED); - if ((m->oflags & VPO_BUSY) == 0 && (m->flags & PG_WRITEABLE) == 0) + if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) m->dirty &= ~pagebits; else { #if defined(__amd64__) || defined(__i386__) || defined(__ia64__) diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h index 1dda1e29e0c..5431d7986a0 100644 --- a/sys/vm/vm_page.h +++ b/sys/vm/vm_page.h @@ -125,12 +125,13 @@ struct vm_page { struct md_page md; /* machine dependant stuff */ uint8_t queue; /* page queue index (P,Q) */ int8_t segind; - u_short flags; /* see below */ + short hold_count; /* page hold count (P) */ uint8_t order; /* index of the buddy queue */ uint8_t pool; u_short cow; /* page cow mapping count (P) */ u_int wire_count; /* wired down maps refs (P) */ - short hold_count; /* page hold count (P) */ + uint8_t aflags; /* access is atomic */ + uint8_t flags; /* see below, often immutable after alloc */ u_short oflags; /* page flags (O) */ u_char act_count; /* page usage count (O) */ u_char busy; /* page busy count (O) */ @@ -225,21 +226,29 @@ extern struct vpglocks pa_lock[]; /* * These are the flags defined for vm_page. * - * PG_REFERENCED may be cleared only if the object containing the page is + * aflags are updated by atomic accesses. Use the vm_page_aflag_set() + * and vm_page_aflag_clear() functions to set and clear the flags. + * + * PGA_REFERENCED may be cleared only if the object containing the page is * locked. * - * PG_WRITEABLE is set exclusively on managed pages by pmap_enter(). When it + * PGA_WRITEABLE is set exclusively on managed pages by pmap_enter(). When it * does so, the page must be VPO_BUSY. */ -#define PG_CACHED 0x0001 /* page is cached */ -#define PG_FREE 0x0002 /* page is free */ -#define PG_WINATCFLS 0x0004 /* flush dirty page on inactive q */ -#define PG_FICTITIOUS 0x0008 /* physical page doesn't exist (O) */ -#define PG_WRITEABLE 0x0010 /* page is mapped writeable */ -#define PG_ZERO 0x0040 /* page is zeroed */ -#define PG_REFERENCED 0x0080 /* page has been referenced */ -#define PG_MARKER 0x1000 /* special queue marker page */ -#define PG_SLAB 0x2000 /* object pointer is actually a slab */ +#define PGA_WRITEABLE 0x01 /* page may be mapped writeable */ +#define PGA_REFERENCED 0x02 /* page has been referenced */ + +/* + * Page flags. If changed at any other time than page allocation or + * freeing, the modification must be protected by the vm_page lock. + */ +#define PG_CACHED 0x01 /* page is cached */ +#define PG_FREE 0x02 /* page is free */ +#define PG_FICTITIOUS 0x04 /* physical page doesn't exist (O) */ +#define PG_ZERO 0x08 /* page is zeroed */ +#define PG_MARKER 0x10 /* special queue marker page */ +#define PG_SLAB 0x20 /* object pointer is actually a slab */ +#define PG_WINATCFLS 0x40 /* flush dirty page on inactive q */ /* * Misc constants. @@ -341,8 +350,8 @@ extern struct vpglocks vm_page_queue_lock; #define VM_ALLOC_COUNT_SHIFT 16 #define VM_ALLOC_COUNT(count) ((count) << VM_ALLOC_COUNT_SHIFT) -void vm_page_flag_set(vm_page_t m, unsigned short bits); -void vm_page_flag_clear(vm_page_t m, unsigned short bits); +void vm_page_aflag_set(vm_page_t m, uint8_t bits); +void vm_page_aflag_clear(vm_page_t m, uint8_t bits); void vm_page_busy(vm_page_t m); void vm_page_flash(vm_page_t m); void vm_page_io_start(vm_page_t m); @@ -377,6 +386,7 @@ vm_page_t vm_page_next(vm_page_t m); int vm_page_pa_tryrelock(pmap_t, vm_paddr_t, vm_paddr_t *); vm_page_t vm_page_prev(vm_page_t m); void vm_page_putfake(vm_page_t m); +void vm_page_reference(vm_page_t m); void vm_page_remove (vm_page_t); void vm_page_rename (vm_page_t, vm_object_t, vm_pindex_t); void vm_page_requeue(vm_page_t m); diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index e9c9927ad2c..5dd450e1bb3 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -497,7 +497,7 @@ vm_pageout_flush(vm_page_t *mc, int count, int flags, int mreq, int *prunlen) vm_page_t mt = mc[i]; KASSERT(pageout_status[i] == VM_PAGER_PEND || - (mt->flags & PG_WRITEABLE) == 0, + (mt->aflags & PGA_WRITEABLE) == 0, ("vm_pageout_flush: page %p is not write protected", mt)); switch (pageout_status[i]) { case VM_PAGER_OK: @@ -597,12 +597,10 @@ vm_pageout_object_deactivate_pages(pmap_t pmap, vm_object_t first_object, continue; } actcount = pmap_ts_referenced(p); - if ((p->flags & PG_REFERENCED) != 0) { + if ((p->aflags & PGA_REFERENCED) != 0) { if (actcount == 0) actcount = 1; - vm_page_lock_queues(); - vm_page_flag_clear(p, PG_REFERENCED); - vm_page_unlock_queues(); + vm_page_aflag_clear(p, PGA_REFERENCED); } if (p->queue != PQ_ACTIVE && actcount != 0) { vm_page_activate(p); @@ -846,7 +844,7 @@ rescan0: * references. */ if (object->ref_count == 0) { - vm_page_flag_clear(m, PG_REFERENCED); + vm_page_aflag_clear(m, PGA_REFERENCED); KASSERT(!pmap_page_is_mapped(m), ("vm_pageout_scan: page %p is mapped", m)); @@ -859,7 +857,7 @@ rescan0: * level VM system not knowing anything about existing * references. */ - } else if (((m->flags & PG_REFERENCED) == 0) && + } else if (((m->aflags & PGA_REFERENCED) == 0) && (actcount = pmap_ts_referenced(m))) { vm_page_activate(m); vm_page_unlock(m); @@ -874,8 +872,8 @@ rescan0: * "activation count" higher than normal so that we will less * likely place pages back onto the inactive queue again. */ - if ((m->flags & PG_REFERENCED) != 0) { - vm_page_flag_clear(m, PG_REFERENCED); + if ((m->aflags & PGA_REFERENCED) != 0) { + vm_page_aflag_clear(m, PGA_REFERENCED); actcount = pmap_ts_referenced(m); vm_page_activate(m); vm_page_unlock(m); @@ -891,7 +889,7 @@ rescan0: * be updated. */ if (m->dirty != VM_PAGE_BITS_ALL && - (m->flags & PG_WRITEABLE) != 0) { + (m->aflags & PGA_WRITEABLE) != 0) { /* * Avoid a race condition: Unless write access is * removed from the page, another processor could @@ -938,7 +936,7 @@ rescan0: * before being freed. This significantly extends * the thrash point for a heavily loaded machine. */ - vm_page_flag_set(m, PG_WINATCFLS); + m->flags |= PG_WINATCFLS; vm_page_requeue(m); } else if (maxlaunder > 0) { /* @@ -1178,7 +1176,7 @@ unlock_and_continue: */ actcount = 0; if (object->ref_count != 0) { - if (m->flags & PG_REFERENCED) { + if (m->aflags & PGA_REFERENCED) { actcount += 1; } actcount += pmap_ts_referenced(m); @@ -1192,7 +1190,7 @@ unlock_and_continue: /* * Since we have "tested" this bit, we need to clear it now. */ - vm_page_flag_clear(m, PG_REFERENCED); + vm_page_aflag_clear(m, PGA_REFERENCED); /* * Only if an object is currently being used, do we use the @@ -1435,8 +1433,8 @@ vm_pageout_page_stats() } actcount = 0; - if (m->flags & PG_REFERENCED) { - vm_page_flag_clear(m, PG_REFERENCED); + if (m->aflags & PGA_REFERENCED) { + vm_page_aflag_clear(m, PGA_REFERENCED); actcount += 1; } diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 23ade6352ac..cb652f7e186 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -1132,7 +1132,7 @@ vnode_pager_generic_putpages(struct vnode *vp, vm_page_t *ma, int bytecount, m = ma[ncount - 1]; KASSERT(m->busy > 0, ("vnode_pager_generic_putpages: page %p is not busy", m)); - KASSERT((m->flags & PG_WRITEABLE) == 0, + KASSERT((m->aflags & PGA_WRITEABLE) == 0, ("vnode_pager_generic_putpages: page %p is not read-only", m)); vm_page_clear_dirty(m, pgoff, PAGE_SIZE - pgoff); From 43fae19e34625d2868a1628b6bae1e4f95a5b8de Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 6 Sep 2011 10:40:21 +0000 Subject: [PATCH 391/452] Document vm_page_aflag_set(9), vm_page_aflag_clear(9) and vm_page_reference(9). Retire vm_page_flag_set() and vm_page_flag_clear() functions. Reviewed by: alc Approved by: re (bz) --- ObsoleteFiles.inc | 4 ++ share/man/man9/Makefile | 7 ++- .../man9/{vm_page_flag.9 => vm_page_aflag.9} | 59 +++++++++++++++---- 3 files changed, 57 insertions(+), 13 deletions(-) rename share/man/man9/{vm_page_flag.9 => vm_page_aflag.9} (59%) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 327727e2b59..5ba7cea8911 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -38,6 +38,10 @@ # xargs -n1 | sort | uniq -d; # done +# 20110831: atomic page flags operations +OLD_FILES+=usr/share/man/man9/vm_page_flag.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_flag_clear.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_flag_set.9.gz # 20110828: library version bump for 9.0 OLD_LIBS+=lib/libcam.so.5 OLD_LIBS+=lib/libpcap.so.7 diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index 8fb3305a8ab..b24be5656a6 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -320,7 +320,7 @@ MAN= accept_filter.9 \ vm_page_cache.9 \ vm_page_deactivate.9 \ vm_page_dontneed.9 \ - vm_page_flag.9 \ + vm_page_aflag.9 \ vm_page_free.9 \ vm_page_grab.9 \ vm_page_hold.9 \ @@ -1372,8 +1372,9 @@ MLINKS+=vm_page_bits.9 vm_page_clear_dirty.9 \ vm_page_bits.9 vm_page_test_dirty.9 \ vm_page_bits.9 vm_page_undirty.9 \ vm_page_bits.9 vm_page_zero_invalid.9 -MLINKS+=vm_page_flag.9 vm_page_flag_clear.9 \ - vm_page_flag.9 vm_page_flag_set.9 +MLINKS+=vm_page_aflag.9 vm_page_aflag_clear.9 \ + vm_page_aflag.9 vm_page_aflag_set.9 \ + vm_page_aflag.9 vm_page_reference.9 MLINKS+=vm_page_free.9 vm_page_free_toq.9 \ vm_page_free.9 vm_page_free_zero.9 \ vm_page_free.9 vm_page_try_to_free.9 diff --git a/share/man/man9/vm_page_flag.9 b/share/man/man9/vm_page_aflag.9 similarity index 59% rename from share/man/man9/vm_page_flag.9 rename to share/man/man9/vm_page_aflag.9 index 5a1d75fbd47..8ef5d8703c9 100644 --- a/share/man/man9/vm_page_flag.9 +++ b/share/man/man9/vm_page_aflag.9 @@ -26,36 +26,75 @@ .\" .\" $FreeBSD$ .\" -.Dd July 14, 2001 +.Dd August 31, 2011 .Dt VM_PAGE_FLAG 9 .Os .Sh NAME -.Nm vm_page_flag_clear , vm_page_flag_set -.Nd "change page flags" +.Nm vm_page_aflag_clear , vm_page_aflag_set , vm_page_reference +.Nd "change page atomic flags" .Sh SYNOPSIS .In sys/param.h .In vm/vm.h .In vm/vm_page.h .Ft void -.Fn vm_page_flag_clear "vm_page_t m" "unsigned short bits" +.Fn vm_page_aflag_clear "vm_page_t m" "uint8_t bits" .Ft void -.Fn vm_page_flag_set "vm_page_t m" "unsigned short bits" +.Fn vm_page_aflag_set "vm_page_t m" "uint8_t bits" +.Ft void +.Fn vm_page_reference "vm_page_t m" .Sh DESCRIPTION The -.Fn vm_page_flag_clear -atomically clears the specified bits on the page's flags. +.Fn vm_page_aflag_clear +atomically clears the specified bits on the page's +.Va aflags . .Pp The -.Fn vm_page_flag_set -atomically sets the specified bits on the page's flags. +.Fn vm_page_aflag_set +atomically sets the specified bits on the page's +.Va aflags . +.Pp +The +.Fn vm_page_reference m +call is the same as +.Bd -literal -offset indent +vm_page_aflag_set(m, PGA_REFERENCED); +.Ed +.Lp +and is the recommended way to mark the page as referenced from +third-party kernel modules. +.Pp +These functions neither block nor require any locks to be held +around the calls for correctness. .Pp The functions arguments are: .Bl -tag -width ".Fa bits" .It Fa m -The page whose flags are updated. +The page whose +.Va aflags +are updated. .It Fa bits The bits that are set or cleared on the page's flags. .El +.Pp +The following +.Va aflags +can be set or cleared: +.Bl -tag -width ".Fa PGA_REFERENCED" +.It Fa PGA_REFERENCED +The bit may be set to indicate that the page has been recently accessed. +For instance, +.Xr pmap 9 +sets this bit to reflect the accessed attribute of the page mapping +typically updated by processor's memory management unit on the page access. +.It Fa PGA_WRITEABLE +A writeable mapping for the page may exist. +.El +.Pp +Both +.Dv PGA_REFERENCED +and +.Dv PGA_WRITEABLE +bits are only valid for the managed pages. .Sh AUTHORS This manual page was written by .An Chad David Aq davidc@acns.ab.ca . From d497ffcab4ff6a0b51ff2798472f9c3b5e5c4bd7 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 6 Sep 2011 10:49:05 +0000 Subject: [PATCH 392/452] Fix the addac serial load register write for AR5416. Obtained from: Linux, Atheros Approved by: re (kib) --- sys/dev/ath/ath_hal/ar5416/ar5416.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416.ini b/sys/dev/ath/ath_hal/ar5416/ar5416.ini index a1d39f9f434..7f8c7934c0d 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416.ini +++ b/sys/dev/ath/ath_hal/ar5416/ar5416.ini @@ -687,7 +687,7 @@ static const uint32_t ar5416Addac[][2] = { {0x0000989c, 0x00000000 }, {0x0000989c, 0x00000000 }, {0x0000989c, 0x00000000 }, - {0x000098cc, 0x00000000 }, + {0x000098c4, 0x00000000 }, }; /* hand-crafted from code that does explicit register writes */ From aacc74998a27fc4b6f8555b71b8143a32495fa1c Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 6 Sep 2011 10:54:56 +0000 Subject: [PATCH 393/452] Fix 5ghz calibration logic when using AR9280 w/ fast clock. When the fast clock (44mhz) is enabled for 5ghz HT20, the dual ADCs aren't enabled. Trying to do the ADC calibrations here would result in calibration never completing; this resulted in IQ calibration never running and thus performance issues in 11a/11n HT20 mode. Leave it enabled for non-fastclock (40mhz) 11a mode and HT40 modes. This has been fixed in discussion with Felix Fietkau (nbd) and discussions with the Atheros baseband team. Linux ath9k now has a similar fix. Approved by: re (kib) --- sys/dev/ath/ath_hal/ar5416/ar5416_cal.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c b/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c index e0ebda1748f..d51417f4992 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_cal.c @@ -72,16 +72,17 @@ ar5416IsCalSupp(struct ath_hal *ah, const struct ieee80211_channel *chan, return !IEEE80211_IS_CHAN_B(chan); case ADC_GAIN_CAL: case ADC_DC_CAL: - /* Run ADC Gain Cal for either 5ghz any or 2ghz HT40 */ /* - * Merlin (AR9280) doesn't ever complete ADC calibrations - * in 5ghz non-HT40 mode (ie, HT20, 11a). For now, disable - * it for Merlin only until further information is - * available. + * Run ADC Gain Cal for either 5ghz any or 2ghz HT40. + * + * Don't run ADC calibrations for 5ghz fast clock mode + * in HT20 - only one ADC is used. */ - if (! AR_SREV_MERLIN(ah)) - if (IEEE80211_IS_CHAN_5GHZ(chan)) - return AH_TRUE; + if (IEEE80211_IS_CHAN_HT20(chan) && + (IS_5GHZ_FAST_CLOCK_EN(ah, chan))) + return AH_FALSE; + if (IEEE80211_IS_CHAN_5GHZ(chan)) + return AH_TRUE; if (IEEE80211_IS_CHAN_HT40(chan)) return AH_TRUE; return AH_FALSE; From 3044751e35e26d1dc99316eefcbf43c85d296633 Mon Sep 17 00:00:00 2001 From: Edward Tomasz Napierala Date: Tue, 6 Sep 2011 17:22:40 +0000 Subject: [PATCH 394/452] Work around a kernel panic triggered by forkbomb with an rctl rule such as j:name:maxproc:sigkill=100. Proper fix - deferring psignal to a taskqueue - is somewhat complicated and thus will happen after 9.0. Approved by: re (kib) --- sys/kern/kern_rctl.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sys/kern/kern_rctl.c b/sys/kern/kern_rctl.c index bf445f6fb94..a8a463fd90f 100644 --- a/sys/kern/kern_rctl.c +++ b/sys/kern/kern_rctl.c @@ -362,6 +362,17 @@ rctl_enforce(struct proc *p, int resource, uint64_t amount) ("rctl_enforce: unknown action %d", rule->rr_action)); + /* + * We're supposed to send a signal, but the process + * is not fully initialized yet, probably because we + * got called from fork1(). For now just deny the + * allocation instead. + */ + if (p->p_state != PRS_NORMAL) { + should_deny = 1; + continue; + } + /* * We're using the fact that RCTL_ACTION_SIG* values * are equal to their counterparts from sys/signal.h. From dc079616cd4e63e5c8212fe99fb566411ba77135 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Wed, 7 Sep 2011 00:43:28 +0000 Subject: [PATCH 395/452] Shorten a variable access some using a cached value rather than casting the input argument again, making the code more readable. Reviewed by: jhb MFC after: 2 weeks Approved by: re (kib) --- sys/dev/mfi/mfi.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sys/dev/mfi/mfi.c b/sys/dev/mfi/mfi.c index f9bfffe8786..470362d5baa 100644 --- a/sys/dev/mfi/mfi.c +++ b/sys/dev/mfi/mfi.c @@ -2132,8 +2132,7 @@ mfi_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td if (ioc->mfi_sense_len) { /* get user-space sense ptr then copy out sense */ - bcopy(&((struct mfi_ioc_packet*)arg) - ->mfi_frame.raw[ioc->mfi_sense_off], + bcopy(&ioc->mfi_frame.raw[ioc->mfi_sense_off], &sense_ptr.sense_ptr_data[0], sizeof(sense_ptr.sense_ptr_data)); #ifdef __amd64__ From 5b046b47ec1229879125ec0222a0e12854447921 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Wed, 7 Sep 2011 00:45:15 +0000 Subject: [PATCH 396/452] Fix two problems: 1) if no default gateway is given the route command will fail and the script will abort with an error leading to an endless loop unless configuration is cancelled or changed. [1] 2) In the IPv6 case add -inet6 to not alter the legacy IP default route. Reported by: Oleg Ginzburg (olevole olevole.ru) [1] Tested by: Oleg Ginzburg (olevole olevole.ru) [1] Approved by: re (kib) --- usr.sbin/bsdinstall/scripts/netconfig_ipv4 | 6 ++++-- usr.sbin/bsdinstall/scripts/netconfig_ipv6 | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/usr.sbin/bsdinstall/scripts/netconfig_ipv4 b/usr.sbin/bsdinstall/scripts/netconfig_ipv4 index 6b479ad043f..ec359d70763 100755 --- a/usr.sbin/bsdinstall/scripts/netconfig_ipv4 +++ b/usr.sbin/bsdinstall/scripts/netconfig_ipv4 @@ -79,7 +79,9 @@ echo $INTERFACE $IF_CONFIG | if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then . $BSDINSTALL_TMPETC/._rc.conf.net ifconfig $INTERFACE `eval echo \\\$ifconfig_$INTERFACE` - route delete -inet default - route add -inet default $defaultrouter + if [ -n "${defaultrouter}" ]; then + route delete -inet default + route add -inet default $defaultrouter + fi fi diff --git a/usr.sbin/bsdinstall/scripts/netconfig_ipv6 b/usr.sbin/bsdinstall/scripts/netconfig_ipv6 index 8bff816f792..dc0d69f09dc 100755 --- a/usr.sbin/bsdinstall/scripts/netconfig_ipv6 +++ b/usr.sbin/bsdinstall/scripts/netconfig_ipv6 @@ -142,7 +142,9 @@ BEGIN { if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then . $BSDINSTALL_TMPETC/._rc.conf.net ifconfig ${INTERFACE} `eval echo \\\$ifconfig_${INTERFACE}_ipv6` - route delete default - route add default ${ipv6_defaultrouter} + if [ -n "${ipv6_defaultrouter}" ]; then + route delete -inet6 default + route add -inet6 default ${ipv6_defaultrouter} + fi fi From 092b5f7c3f12aa6494d723174f8f12c41ebe05d5 Mon Sep 17 00:00:00 2001 From: "Bjoern A. Zeeb" Date: Wed, 7 Sep 2011 00:48:58 +0000 Subject: [PATCH 397/452] Correct a typo. Submitted by: gcooper Reviewed by: nwhitehorn Approved by: re (kib) --- usr.sbin/bsdinstall/scripts/netconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.sbin/bsdinstall/scripts/netconfig b/usr.sbin/bsdinstall/scripts/netconfig index b78e33023ca..e0f390c2787 100755 --- a/usr.sbin/bsdinstall/scripts/netconfig +++ b/usr.sbin/bsdinstall/scripts/netconfig @@ -165,7 +165,7 @@ fi exec 3>&1 RESOLV=$(echo "${RESOLV}" | xargs dialog --backtitle 'FreeBSD Installer' \ --title 'Network Configuration' \ - --mixedform 'Resovler Configuration' 0 0 0 \ + --mixedform 'Resolver Configuration' 0 0 0 \ 2>&1 1>&3) if [ $? -eq $DIALOG_CANCEL ]; then exec $0; fi exec 3>&- From c62055f6dee33397bfff65d22543276b2f864b44 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 7 Sep 2011 03:00:58 +0000 Subject: [PATCH 398/452] Add a definition for ASYNC_CAUSE_CLR. It's not used yet, but the reference driver does clear the async interrupts after each service. I'll tinker with this in a future commit. Obtained from: Atheros Approved by: re (kib) --- sys/dev/ath/ath_hal/ar5416/ar5416reg.h | 1 + 1 file changed, 1 insertion(+) diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416reg.h b/sys/dev/ath/ath_hal/ar5416/ar5416reg.h index 6d1c272eb71..c18c26f90fa 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416reg.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416reg.h @@ -40,6 +40,7 @@ #define AR_INTR_ASYNC_MASK 0x4030 /* asynchronous interrupt mask */ #define AR_INTR_SYNC_MASK 0x4034 /* synchronous interrupt mask */ #define AR_INTR_ASYNC_CAUSE 0x4038 /* check pending interrupts */ +#define AR_INTR_ASYNC_CAUSE_CLR 0x4038 /* clear pending interrupts */ #define AR_INTR_ASYNC_ENABLE 0x403c /* enable interrupts */ #define AR5416_PCIE_SERDES 0x4040 #define AR5416_PCIE_SERDES2 0x4044 From ba1b20699096e0aca38d7e8f5408cfe5fcc4fe5c Mon Sep 17 00:00:00 2001 From: Edward Tomasz Napierala Date: Wed, 7 Sep 2011 07:52:45 +0000 Subject: [PATCH 399/452] Fix whitespace. Submitted by: amdmi3 Approved by: re (rwatson) --- sys/kern/kern_rctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/kern/kern_rctl.c b/sys/kern/kern_rctl.c index a8a463fd90f..d60cae44205 100644 --- a/sys/kern/kern_rctl.c +++ b/sys/kern/kern_rctl.c @@ -368,7 +368,7 @@ rctl_enforce(struct proc *p, int resource, uint64_t amount) * got called from fork1(). For now just deny the * allocation instead. */ - if (p->p_state != PRS_NORMAL) { + if (p->p_state != PRS_NORMAL) { should_deny = 1; continue; } From a3f4b4527c0a83be7d111b11656e06fadee29971 Mon Sep 17 00:00:00 2001 From: Pyun YongHyeon Date: Wed, 7 Sep 2011 16:57:43 +0000 Subject: [PATCH 400/452] vge(4) hardwares poll media status and generates an interrupt whenever the link state is changed. Using software based polling for media status tracking is known to cause MII access failure under certain conditions once link is established so vge(4) used to rely on link status change interrupt. However DEVICE_POLLING completely disables generation of all kind of interrupts on vge(4) such that this resulted in not detecting link state change event. This means vge(4) does not correctly detect established/lost link with DEVICE_POLLING. Losing the interrupt made vge(4) not to send any packets to peer since vge(4) does not try to send any packets when there is no established link. Work around the issue by generating link state change interrupt with DEVICE_POLLING. PR: kern/160442 Approved by: re (kib) --- sys/dev/vge/if_vge.c | 18 +++++++++++------- sys/dev/vge/if_vgereg.h | 2 ++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/sys/dev/vge/if_vge.c b/sys/dev/vge/if_vge.c index d9a58cce5b8..95297021960 100644 --- a/sys/dev/vge/if_vge.c +++ b/sys/dev/vge/if_vge.c @@ -1752,6 +1752,10 @@ vge_intr(void *arg) #ifdef DEVICE_POLLING if (ifp->if_capenable & IFCAP_POLLING) { + status = CSR_READ_4(sc, VGE_ISR); + CSR_WRITE_4(sc, VGE_ISR, status); + if (status != 0xFFFFFFFF && (status & VGE_ISR_LINKSTS) != 0) + vge_link_statchg(sc); VGE_UNLOCK(sc); return; } @@ -2109,11 +2113,10 @@ vge_init_locked(struct vge_softc *sc) #ifdef DEVICE_POLLING /* - * Disable interrupts if we are polling. + * Disable interrupts except link state change if we are polling. */ if (ifp->if_capenable & IFCAP_POLLING) { - CSR_WRITE_4(sc, VGE_IMR, 0); - CSR_WRITE_1(sc, VGE_CRC3, VGE_CR3_INT_GMSK); + CSR_WRITE_4(sc, VGE_IMR, VGE_INTRS_POLLING); } else /* otherwise ... */ #endif { @@ -2121,9 +2124,9 @@ vge_init_locked(struct vge_softc *sc) * Enable interrupts. */ CSR_WRITE_4(sc, VGE_IMR, VGE_INTRS); - CSR_WRITE_4(sc, VGE_ISR, 0xFFFFFFFF); - CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK); } + CSR_WRITE_4(sc, VGE_ISR, 0xFFFFFFFF); + CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK); sc->vge_flags &= ~VGE_FLAG_LINK; mii_mediachg(mii); @@ -2280,8 +2283,9 @@ vge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) return (error); VGE_LOCK(sc); /* Disable interrupts */ - CSR_WRITE_4(sc, VGE_IMR, 0); - CSR_WRITE_1(sc, VGE_CRC3, VGE_CR3_INT_GMSK); + CSR_WRITE_4(sc, VGE_IMR, VGE_INTRS_POLLING); + CSR_WRITE_4(sc, VGE_ISR, 0xFFFFFFFF); + CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK); ifp->if_capenable |= IFCAP_POLLING; VGE_UNLOCK(sc); } else { diff --git a/sys/dev/vge/if_vgereg.h b/sys/dev/vge/if_vgereg.h index 77cd61eb6ba..c8b3f1bb459 100644 --- a/sys/dev/vge/if_vgereg.h +++ b/sys/dev/vge/if_vgereg.h @@ -302,6 +302,8 @@ VGE_ISR_LINKSTS|VGE_ISR_RXNODESC| \ VGE_ISR_RXDMA_STALL|VGE_ISR_TXDMA_STALL) +#define VGE_INTRS_POLLING (VGE_ISR_PHYINT|VGE_ISR_LINKSTS) + /* Interrupt mask register */ #define VGE_IMR_RXOK_HIPRIO 0x00000001 /* hi prio RX int */ From fc4de9b7fcbfc6729ca663011d583374eda15751 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Thu, 8 Sep 2011 01:23:05 +0000 Subject: [PATCH 401/452] Update the TSF and next-TBTT methods to work for the AR5416 and later NICs. This is another commit in a series of TDMA support fixes for the 11n NICs. * Move ath_hal_getnexttbtt() into the HAL; write methods for it. This returns a timer value in TSF, rather than TU. * Move ath_hal_getcca() and ath_hal_setcca() into the HAL too, where they likely now belong. * Create a new HAL capability: HAL_CAP_LONG_RXDESC_TSF. The pre-11n NICs write 15 bit TSF snapshots into the RX descriptor; the AR5416 and later write 32 bit TSF snapshots into the RX descriptor. * Use the new capability to choose between 15 and 31 bit TSF adjustment functions in ath_extend_tsf(). * Write ar5416GetTsf64() and ar5416SetTsf64() methods. ar5416GetTsf64() tries to compensate for TSF changes at the 32 bit boundary. According to yin, this fixes the TDMA beaconing on 11n chipsets and TDMA stations can now associate/talk, but there are still issues with traffic stability which need to be investigated. The ath_hal_extendtsf() function is also used in RX packet timestamping; this may improve adhoc mode on the 11n chipsets. It also will affect the timestamps seen in radiotap frames. Submitted by: Kang Yin Su Approved by: re (kib) --- sys/dev/ath/ath_hal/ah.c | 36 ++++++++ sys/dev/ath/ath_hal/ah.h | 18 ++++ sys/dev/ath/ath_hal/ah_internal.h | 3 +- sys/dev/ath/ath_hal/ar5210/ar5210.h | 1 + sys/dev/ath/ath_hal/ar5210/ar5210_attach.c | 1 + sys/dev/ath/ath_hal/ar5210/ar5210_beacon.c | 11 +++ sys/dev/ath/ath_hal/ar5211/ar5211.h | 1 + sys/dev/ath/ath_hal/ar5211/ar5211_attach.c | 1 + sys/dev/ath/ath_hal/ar5211/ar5211_beacon.c | 11 +++ sys/dev/ath/ath_hal/ar5212/ar5212.h | 1 + sys/dev/ath/ath_hal/ar5212/ar5212_attach.c | 1 + sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c | 11 +++ sys/dev/ath/ath_hal/ar5416/ar5416.h | 3 + sys/dev/ath/ath_hal/ar5416/ar5416_attach.c | 4 + sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c | 9 ++ sys/dev/ath/ath_hal/ar5416/ar5416_misc.c | 35 ++++++++ sys/dev/ath/ath_hal/ar5416/ar5416_reset.c | 13 ++- sys/dev/ath/if_ath.c | 95 +++++++++++----------- sys/dev/ath/if_athvar.h | 7 +- 19 files changed, 207 insertions(+), 55 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah.c b/sys/dev/ath/ath_hal/ah.c index 2739f97305a..4055079dc71 100644 --- a/sys/dev/ath/ath_hal/ah.c +++ b/sys/dev/ath/ath_hal/ah.c @@ -657,6 +657,8 @@ ath_hal_getcapability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type, } case HAL_CAP_RXDESC_SELFLINK: /* hardware supports self-linked final RX descriptors correctly */ return pCap->halHasRxSelfLinkedTail ? HAL_OK : HAL_ENOTSUPP; + case HAL_CAP_LONG_RXDESC_TSF: /* 32 bit TSF in RX descriptor? */ + return pCap->halHasLongRxDescTsf ? HAL_OK : HAL_ENOTSUPP; default: return HAL_EINVAL; } @@ -1222,3 +1224,37 @@ ath_ee_interpolate(uint16_t target, uint16_t srcLeft, uint16_t srcRight, } return rv; } + +/* + * Adjust the TSF. + */ +void +ath_hal_adjusttsf(struct ath_hal *ah, int32_t tsfdelta) +{ + /* XXX handle wrap/overflow */ + OS_REG_WRITE(ah, AR_TSF_L32, OS_REG_READ(ah, AR_TSF_L32) + tsfdelta); +} + +/* + * Enable or disable CCA. + */ +void +ath_hal_setcca(struct ath_hal *ah, int ena) +{ + /* + * NB: fill me in; this is not provided by default because disabling + * CCA in most locales violates regulatory. + */ +} + +/* + * Get CCA setting. + */ +int +ath_hal_getcca(struct ath_hal *ah) +{ + u_int32_t diag; + if (ath_hal_getcapability(ah, HAL_CAP_DIAG, 0, &diag) != HAL_OK) + return 1; + return ((diag & 0x500000) == 0); +} diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h index 05ac87d9f43..f4254c14fa8 100644 --- a/sys/dev/ath/ath_hal/ah.h +++ b/sys/dev/ath/ath_hal/ah.h @@ -148,6 +148,7 @@ typedef enum { HAL_CAP_BSSIDMATCH = 238, /* hardware has disable bssid match */ HAL_CAP_STREAMS = 239, /* how many 802.11n spatial streams are available */ HAL_CAP_RXDESC_SELFLINK = 242, /* support a self-linked tail RX descriptor */ + HAL_CAP_LONG_RXDESC_TSF = 243, /* hardware supports 32bit TSF in RX descriptor */ } HAL_CAPABILITY_TYPE; /* @@ -996,6 +997,7 @@ struct ath_hal { void __ahdecl(*ah_setStationBeaconTimers)(struct ath_hal*, const HAL_BEACON_STATE *); void __ahdecl(*ah_resetStationBeaconTimers)(struct ath_hal*); + uint64_t __ahdecl(*ah_getNextTBTT)(struct ath_hal *); /* 802.11n Functions */ HAL_BOOL __ahdecl(*ah_chainTxDesc)(struct ath_hal *, @@ -1138,4 +1140,20 @@ extern uint32_t __ahdecl ath_computedur_ht(uint32_t frameLen, uint16_t rate, extern uint16_t __ahdecl ath_hal_computetxtime(struct ath_hal *, const HAL_RATE_TABLE *rates, uint32_t frameLen, uint16_t rateix, HAL_BOOL shortPreamble); + +/* + * Adjust the TSF. + */ +extern void __ahdecl ath_hal_adjusttsf(struct ath_hal *ah, int32_t tsfdelta); + +/* + * Enable or disable CCA. + */ +void __ahdecl ath_hal_setcca(struct ath_hal *ah, int ena); + +/* + * Get CCA setting. + */ +int __ahdecl ath_hal_getcca(struct ath_hal *ah); + #endif /* _ATH_AH_H_ */ diff --git a/sys/dev/ath/ath_hal/ah_internal.h b/sys/dev/ath/ath_hal/ah_internal.h index 28c88413f12..79184bd2365 100644 --- a/sys/dev/ath/ath_hal/ah_internal.h +++ b/sys/dev/ath/ath_hal/ah_internal.h @@ -208,7 +208,8 @@ typedef struct { halBssidMatchSupport : 1, hal4kbSplitTransSupport : 1, halHasRxSelfLinkedTail : 1, - halSupportsFastClock5GHz : 1; /* Hardware supports 5ghz fast clock; check eeprom/channel before using */ + halSupportsFastClock5GHz : 1, /* Hardware supports 5ghz fast clock; check eeprom/channel before using */ + halHasLongRxDescTsf : 1; uint32_t halWirelessModes; uint16_t halTotalQueues; uint16_t halKeyCacheSize; diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210.h b/sys/dev/ath/ath_hal/ar5210/ar5210.h index a8776726a3b..24718531566 100644 --- a/sys/dev/ath/ath_hal/ar5210/ar5210.h +++ b/sys/dev/ath/ath_hal/ar5210/ar5210.h @@ -268,6 +268,7 @@ extern void ar5210BeaconInit(struct ath_hal *, uint32_t, uint32_t); extern void ar5210SetStaBeaconTimers(struct ath_hal *, const HAL_BEACON_STATE *); extern void ar5210ResetStaBeaconTimers(struct ath_hal *); +extern uint64_t ar5210GetNextTBTT(struct ath_hal *); extern HAL_BOOL ar5210IsInterruptPending(struct ath_hal *); extern HAL_BOOL ar5210GetPendingInterrupts(struct ath_hal *, HAL_INT *); diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c b/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c index 41d957a614c..79c305511e6 100644 --- a/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c +++ b/sys/dev/ath/ath_hal/ar5210/ar5210_attach.c @@ -148,6 +148,7 @@ static const struct ath_hal_private ar5210hal = {{ .ah_beaconInit = ar5210BeaconInit, .ah_setStationBeaconTimers = ar5210SetStaBeaconTimers, .ah_resetStationBeaconTimers = ar5210ResetStaBeaconTimers, + .ah_getNextTBTT = ar5210GetNextTBTT, /* Interrupt Functions */ .ah_isInterruptPending = ar5210IsInterruptPending, diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210_beacon.c b/sys/dev/ath/ath_hal/ar5210/ar5210_beacon.c index a613c9ca7d1..e12b039723e 100644 --- a/sys/dev/ath/ath_hal/ar5210/ar5210_beacon.c +++ b/sys/dev/ath/ath_hal/ar5210/ar5210_beacon.c @@ -26,6 +26,17 @@ #include "ar5210/ar5210reg.h" #include "ar5210/ar5210desc.h" +/* + * Return the hardware NextTBTT in TSF + */ +uint64_t +ar5210GetNextTBTT(struct ath_hal *ah) +{ +#define TU_TO_TSF(_tu) (((uint64_t)(_tu)) << 10) + return TU_TO_TSF(OS_REG_READ(ah, AR_TIMER0)); +#undef TU_TO_TSF +} + /* * Initialize all of the hardware registers used to send beacons. */ diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211.h b/sys/dev/ath/ath_hal/ar5211/ar5211.h index 0057ba425f9..51acd38862c 100644 --- a/sys/dev/ath/ath_hal/ar5211/ar5211.h +++ b/sys/dev/ath/ath_hal/ar5211/ar5211.h @@ -296,6 +296,7 @@ extern void ar5211BeaconInit(struct ath_hal *, uint32_t, uint32_t); extern void ar5211SetStaBeaconTimers(struct ath_hal *, const HAL_BEACON_STATE *); extern void ar5211ResetStaBeaconTimers(struct ath_hal *); +extern uint64_t ar5211GetNextTBTT(struct ath_hal *); extern HAL_BOOL ar5211IsInterruptPending(struct ath_hal *); extern HAL_BOOL ar5211GetPendingInterrupts(struct ath_hal *, HAL_INT *); diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c b/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c index 14daa0bffed..a0c42b2bf7c 100644 --- a/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c +++ b/sys/dev/ath/ath_hal/ar5211/ar5211_attach.c @@ -148,6 +148,7 @@ static const struct ath_hal_private ar5211hal = {{ .ah_beaconInit = ar5211BeaconInit, .ah_setStationBeaconTimers = ar5211SetStaBeaconTimers, .ah_resetStationBeaconTimers = ar5211ResetStaBeaconTimers, + .ah_getNextTBTT = ar5211GetNextTBTT, /* Interrupt Functions */ .ah_isInterruptPending = ar5211IsInterruptPending, diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211_beacon.c b/sys/dev/ath/ath_hal/ar5211/ar5211_beacon.c index 31e9c5df8a9..b2775d0376f 100644 --- a/sys/dev/ath/ath_hal/ar5211/ar5211_beacon.c +++ b/sys/dev/ath/ath_hal/ar5211/ar5211_beacon.c @@ -29,6 +29,17 @@ * Routines used to initialize and generated beacons for the AR5211/AR5311. */ +/* + * Return the hardware NextTBTT in TSF + */ +uint64_t +ar5211GetNextTBTT(struct ath_hal *ah) +{ +#define TU_TO_TSF(_tu) (((uint64_t)(_tu)) << 10) + return TU_TO_TSF(OS_REG_READ(ah, AR_TIMER0)); +#undef TU_TO_TSF +} + /* * Initialize all of the hardware registers used to send beacons. */ diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212.h b/sys/dev/ath/ath_hal/ar5212/ar5212.h index b93ab11bb91..40e718e4673 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212.h +++ b/sys/dev/ath/ath_hal/ar5212/ar5212.h @@ -430,6 +430,7 @@ extern void ar5212BeaconInit(struct ath_hal *ah, extern void ar5212ResetStaBeaconTimers(struct ath_hal *ah); extern void ar5212SetStaBeaconTimers(struct ath_hal *ah, const HAL_BEACON_STATE *); +extern uint64_t ar5212GetNextTBTT(struct ath_hal *); extern HAL_BOOL ar5212IsInterruptPending(struct ath_hal *ah); extern HAL_BOOL ar5212GetPendingInterrupts(struct ath_hal *ah, HAL_INT *); diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c index fe48b2eb1ad..eaceaba766e 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c @@ -151,6 +151,7 @@ static const struct ath_hal_private ar5212hal = {{ .ah_beaconInit = ar5212BeaconInit, .ah_setStationBeaconTimers = ar5212SetStaBeaconTimers, .ah_resetStationBeaconTimers = ar5212ResetStaBeaconTimers, + .ah_getNextTBTT = ar5212GetNextTBTT, /* Interrupt Functions */ .ah_isInterruptPending = ar5212IsInterruptPending, diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c b/sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c index bf0b38a56db..1b4b342bc4a 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_beacon.c @@ -25,6 +25,17 @@ #include "ar5212/ar5212reg.h" #include "ar5212/ar5212desc.h" +/* + * Return the hardware NextTBTT in TSF + */ +uint64_t +ar5212GetNextTBTT(struct ath_hal *ah) +{ +#define TU_TO_TSF(_tu) (((uint64_t)(_tu)) << 10) + return TU_TO_TSF(OS_REG_READ(ah, AR_TIMER0)); +#undef TU_TO_TSF +} + /* * Initialize all of the hardware registers used to * send beacons. Note that for station operation the diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416.h b/sys/dev/ath/ath_hal/ar5416/ar5416.h index 522338240fb..a0f5deead8b 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416.h @@ -169,6 +169,7 @@ extern void ar5416BeaconInit(struct ath_hal *ah, extern void ar5416ResetStaBeaconTimers(struct ath_hal *ah); extern void ar5416SetStaBeaconTimers(struct ath_hal *ah, const HAL_BEACON_STATE *); +extern uint64_t ar5416GetNextTBTT(struct ath_hal *); extern HAL_BOOL ar5416EepromRead(struct ath_hal *, u_int off, uint16_t *data); extern HAL_BOOL ar5416EepromWrite(struct ath_hal *, u_int off, uint16_t data); @@ -186,6 +187,8 @@ extern void ar5416GpioSetIntr(struct ath_hal *ah, u_int, uint32_t ilevel); extern u_int ar5416GetWirelessModes(struct ath_hal *ah); extern void ar5416SetLedState(struct ath_hal *ah, HAL_LED_STATE state); +extern uint64_t ar5416GetTsf64(struct ath_hal *ah); +extern void ar5416SetTsf64(struct ath_hal *ah, uint64_t tsf64); extern void ar5416ResetTsf(struct ath_hal *ah); extern HAL_BOOL ar5416SetAntennaSwitch(struct ath_hal *, HAL_ANT_SETTING); extern HAL_BOOL ar5416SetDecompMask(struct ath_hal *, uint16_t, int); diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c index 647d9d84da9..12589f28fff 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c @@ -136,6 +136,7 @@ ar5416InitState(struct ath_hal_5416 *ahp5416, uint16_t devid, HAL_SOFTC sc, ah->ah_gpioGet = ar5416GpioGet; ah->ah_gpioSet = ar5416GpioSet; ah->ah_gpioSetIntr = ar5416GpioSetIntr; + ah->ah_getTsf64 = ar5416GetTsf64; ah->ah_resetTsf = ar5416ResetTsf; ah->ah_getRfGain = ar5416GetRfgain; ah->ah_setAntennaSwitch = ar5416SetAntennaSwitch; @@ -160,6 +161,7 @@ ar5416InitState(struct ath_hal_5416 *ahp5416, uint16_t devid, HAL_SOFTC sc, ah->ah_beaconInit = ar5416BeaconInit; ah->ah_setStationBeaconTimers = ar5416SetStaBeaconTimers; ah->ah_resetStationBeaconTimers = ar5416ResetStaBeaconTimers; + ah->ah_getNextTBTT = ar5416GetNextTBTT; /* 802.11n Functions */ ah->ah_chainTxDesc = ar5416ChainTxDesc; @@ -888,6 +890,8 @@ ar5416FillCapabilityInfo(struct ath_hal *ah) pCap->halGTTSupport = AH_TRUE; pCap->halCSTSupport = AH_TRUE; pCap->halEnhancedDfsSupport = AH_FALSE; + /* Hardware supports 32 bit TSF values in the RX descriptor */ + pCap->halHasLongRxDescTsf = AH_TRUE; if (ath_hal_eepromGetFlag(ah, AR_EEP_RFKILL) && ath_hal_eepromGet(ah, AR_EEP_RFSILENT, &ahpriv->ah_rfsilent) == HAL_OK) { diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c b/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c index 8a36cf557df..8b61e14658a 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c @@ -28,6 +28,15 @@ #define TU_TO_USEC(_tu) ((_tu) << 10) #define ONE_EIGHTH_TU_TO_USEC(_tu8) ((_tu8) << 7) +/* + * Return the hardware NextTBTT in TSF + */ +uint64_t +ar5416GetNextTBTT(struct ath_hal *ah) +{ + return OS_REG_READ(ah, AR_NEXT_TBTT); +} + /* * Initialize all of the hardware registers used to * send beacons. Note that for station operation the diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c index a0952f86696..7e61c84930d 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c @@ -92,6 +92,41 @@ ar5416SetLedState(struct ath_hal *ah, HAL_LED_STATE state) OS_REG_WRITE(ah, AR_MAC_LED, bits); } +/* + * Get the current hardware tsf for stamlme + */ +uint64_t +ar5416GetTsf64(struct ath_hal *ah) +{ + uint32_t low1, low2, u32; + + /* sync multi-word read */ + low1 = OS_REG_READ(ah, AR_TSF_L32); + u32 = OS_REG_READ(ah, AR_TSF_U32); + low2 = OS_REG_READ(ah, AR_TSF_L32); + if (low2 < low1) { /* roll over */ + /* + * If we are not preempted this will work. If we are + * then we re-reading AR_TSF_U32 does no good as the + * low bits will be meaningless. Likewise reading + * L32, U32, U32, then comparing the last two reads + * to check for rollover doesn't help if preempted--so + * we take this approach as it costs one less PCI read + * which can be noticeable when doing things like + * timestamping packets in monitor mode. + */ + u32++; + } + return (((uint64_t) u32) << 32) | ((uint64_t) low2); +} + +void +ar5416SetTsf64(struct ath_hal *ah, uint64_t tsf64) +{ + OS_REG_WRITE(ah, AR_TSF_L32, tsf64 & 0xffffffff); + OS_REG_WRITE(ah, AR_TSF_U32, (tsf64 >> 32) & 0xffffffff); +} + /* * Reset the current hardware tsf for stamlme. */ diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c b/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c index c21692eca33..112d9669540 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c @@ -147,7 +147,7 @@ ar5416Reset(struct ath_hal *ah, HAL_OPMODE opmode, /* For chips on which the RTC reset is done, save TSF before it gets cleared */ if (AR_SREV_HOWL(ah) || (AR_SREV_MERLIN(ah) && ath_hal_eepromGetFlag(ah, AR_EEP_OL_PWRCTRL))) - tsf = ar5212GetTsf64(ah); + tsf = ar5416GetTsf64(ah); /* Mark PHY as inactive; marked active in ar5416InitBB() */ ar5416MarkPhyInactive(ah); @@ -159,7 +159,7 @@ ar5416Reset(struct ath_hal *ah, HAL_OPMODE opmode, /* Restore TSF */ if (tsf) - ar5212SetTsf64(ah, tsf); + ar5416SetTsf64(ah, tsf); OS_MARK(ah, AH_MARK_RESET_LINE, __LINE__); if (AR_SREV_MERLIN_10_OR_LATER(ah)) @@ -192,9 +192,9 @@ ar5416Reset(struct ath_hal *ah, HAL_OPMODE opmode, * value after the initvals have been applied, with an offset * based on measured time difference */ - if (AR_SREV_HOWL(ah) && (ar5212GetTsf64(ah) < tsf)) { + if (AR_SREV_HOWL(ah) && (ar5416GetTsf64(ah) < tsf)) { tsf += 1500; - ar5212SetTsf64(ah, tsf); + ar5416SetTsf64(ah, tsf); } HALDEBUG(ah, HAL_DEBUG_RESET, ">>>2 %s: AR_PHY_DAG_CTRLCCK=0x%x\n", @@ -364,8 +364,7 @@ ar5416Reset(struct ath_hal *ah, HAL_OPMODE opmode, OS_REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 2000); OS_REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_LAST, 300); OS_REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_FIRST, 750); -#endif - +#endif ar5416InitBB(ah, chan); /* Setup compression registers */ @@ -503,7 +502,7 @@ ar5416ChannelChange(struct ath_hal *ah, const structu ieee80211_channel *chan) chan->ic_state &= ~IEEE80211_CHANSTATE_CWINT; ichan->channel_time = 0; - ichan->tsf_last = ar5212GetTsf64(ah); + ichan->tsf_last = ar5416GetTsf64(ah); ar5212TxEnable(ah, AH_TRUE); return AH_TRUE; } diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index a717323ca2d..af612748f8c 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -214,24 +214,6 @@ static void ath_tdma_update(struct ieee80211_node *ni, static void ath_tdma_beacon_send(struct ath_softc *sc, struct ieee80211vap *vap); -static __inline void -ath_hal_setcca(struct ath_hal *ah, int ena) -{ - /* - * NB: fill me in; this is not provided by default because disabling - * CCA in most locales violates regulatory. - */ -} - -static __inline int -ath_hal_getcca(struct ath_hal *ah) -{ - u_int32_t diag; - if (ath_hal_getcapability(ah, HAL_CAP_DIAG, 0, &diag) != HAL_OK) - return 1; - return ((diag & 0x500000) == 0); -} - #define TDMA_EP_MULTIPLIER (1<<10) /* pow2 to optimize out * and / */ #define TDMA_LPF_LEN 6 #define TDMA_DUMMY_MARKER 0x127 @@ -613,6 +595,7 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) sc->sc_hasbmatch = ath_hal_hasbssidmatch(ah); sc->sc_hastsfadd = ath_hal_hastsfadjust(ah); sc->sc_rxslink = ath_hal_self_linked_final_rxdesc(ah); + sc->sc_rxtsf32 = ath_hal_has_long_rxdesc_tsf(ah); if (ath_hal_hasfastframes(ah)) ic->ic_caps |= IEEE80211_C_FF; wmodes = ath_hal_getwirelessmodes(ah); @@ -3294,13 +3277,48 @@ ath_rxbuf_init(struct ath_softc *sc, struct ath_buf *bf) * a full 64-bit TSF using the specified TSF. */ static __inline u_int64_t -ath_extend_tsf(u_int32_t rstamp, u_int64_t tsf) +ath_extend_tsf15(u_int32_t rstamp, u_int64_t tsf) { if ((tsf & 0x7fff) < rstamp) tsf -= 0x8000; + return ((tsf &~ 0x7fff) | rstamp); } +/* + * Extend 32-bit time stamp from rx descriptor to + * a full 64-bit TSF using the specified TSF. + */ +static __inline u_int64_t +ath_extend_tsf32(u_int32_t rstamp, u_int64_t tsf) +{ + u_int32_t tsf_low = tsf & 0xffffffff; + u_int64_t tsf64 = (tsf & ~0xffffffffULL) | rstamp; + + if (rstamp > tsf_low && (rstamp - tsf_low > 0x10000000)) + tsf64 -= 0x100000000ULL; + + if (rstamp < tsf_low && (tsf_low - rstamp > 0x10000000)) + tsf64 += 0x100000000ULL; + + return tsf64; +} + +/* + * Extend the TSF from the RX descriptor to a full 64 bit TSF. + * Earlier hardware versions only wrote the low 15 bits of the + * TSF into the RX descriptor; later versions (AR5416 and up) + * include the 32 bit TSF value. + */ +static __inline u_int64_t +ath_extend_tsf(struct ath_softc *sc, u_int32_t rstamp, u_int64_t tsf) +{ + if (sc->sc_rxtsf32) + return ath_extend_tsf32(rstamp, tsf); + else + return ath_extend_tsf15(rstamp, tsf); +} + /* * Intercept management frames to collect beacon rssi data * and to do ibss merges. @@ -3334,7 +3352,7 @@ ath_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, if (vap->iv_opmode == IEEE80211_M_IBSS && vap->iv_state == IEEE80211_S_RUN) { uint32_t rstamp = sc->sc_lastrs->rs_tstamp; - uint64_t tsf = ath_extend_tsf(rstamp, + uint64_t tsf = ath_extend_tsf(sc, rstamp, ath_hal_gettsf64(sc->sc_ah)); /* * Handle ibss merge as needed; check the tsf on the @@ -3406,7 +3424,7 @@ ath_rx_tap(struct ifnet *ifp, struct mbuf *m, sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_SHORTGI; } #endif - sc->sc_rx_th.wr_tsf = htole64(ath_extend_tsf(rs->rs_tstamp, tsf)); + sc->sc_rx_th.wr_tsf = htole64(ath_extend_tsf(sc, rs->rs_tstamp, tsf)); if (rs->rs_status & HAL_RXERR_CRC) sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_BADFCS; /* XXX propagate other error flags from descriptor */ @@ -5460,20 +5478,6 @@ ath_announce(struct ath_softc *sc) } #ifdef IEEE80211_SUPPORT_TDMA -static __inline uint32_t -ath_hal_getnexttbtt(struct ath_hal *ah) -{ -#define AR_TIMER0 0x8028 - return OS_REG_READ(ah, AR_TIMER0); -} - -static __inline void -ath_hal_adjusttsf(struct ath_hal *ah, int32_t tsfdelta) -{ - /* XXX handle wrap/overflow */ - OS_REG_WRITE(ah, AR_TSF_L32, OS_REG_READ(ah, AR_TSF_L32) + tsfdelta); -} - static void ath_tdma_settimers(struct ath_softc *sc, u_int32_t nexttbtt, u_int32_t bintval) { @@ -5629,8 +5633,8 @@ ath_tdma_update(struct ieee80211_node *ni, struct ath_softc *sc = ic->ic_ifp->if_softc; struct ath_hal *ah = sc->sc_ah; const HAL_RATE_TABLE *rt = sc->sc_currates; - u_int64_t tsf, rstamp, nextslot; - u_int32_t txtime, nextslottu, timer0; + u_int64_t tsf, rstamp, nextslot, nexttbtt; + u_int32_t txtime, nextslottu; int32_t tudelta, tsfdelta; const struct ath_rx_status *rs; int rix; @@ -5661,7 +5665,7 @@ ath_tdma_update(struct ieee80211_node *ni, /* extend rx timestamp to 64 bits */ rs = sc->sc_lastrs; tsf = ath_hal_gettsf64(ah); - rstamp = ath_extend_tsf(rs->rs_tstamp, tsf); + rstamp = ath_extend_tsf(sc, rs->rs_tstamp, tsf); /* * The rx timestamp is set by the hardware on completing * reception (at the point where the rx descriptor is DMA'd @@ -5677,15 +5681,15 @@ ath_tdma_update(struct ieee80211_node *ni, nextslottu = TSF_TO_TU(nextslot>>32, nextslot) & HAL_BEACON_PERIOD; /* - * TIMER0 is the h/w's idea of NextTBTT (in TU's). Convert - * to usecs and calculate the difference between what the + * Retrieve the hardware NextTBTT in usecs + * and calculate the difference between what the * other station thinks and what we have programmed. This * lets us figure how to adjust our timers to match. The * adjustments are done by pulling the TSF forward and possibly * rewriting the beacon timers. */ - timer0 = ath_hal_getnexttbtt(ah); - tsfdelta = (int32_t)((nextslot % TU_TO_TSF(HAL_BEACON_PERIOD+1)) - TU_TO_TSF(timer0)); + nexttbtt = ath_hal_getnexttbtt(ah); + tsfdelta = (int32_t)((nextslot % TU_TO_TSF(HAL_BEACON_PERIOD + 1)) - nexttbtt); DPRINTF(sc, ATH_DEBUG_TDMA_TIMER, "tsfdelta %d avg +%d/-%d\n", tsfdelta, @@ -5705,7 +5709,7 @@ ath_tdma_update(struct ieee80211_node *ni, TDMA_SAMPLE(sc->sc_avgtsfdeltap, 0); TDMA_SAMPLE(sc->sc_avgtsfdeltam, 0); } - tudelta = nextslottu - timer0; + tudelta = nextslottu - TSF_TO_TU(nexttbtt >> 32, nexttbtt); /* * Copy sender's timetstamp into tdma ie so they can @@ -5724,10 +5728,9 @@ ath_tdma_update(struct ieee80211_node *ni, &ni->ni_tstamp.data, 8); #if 0 DPRINTF(sc, ATH_DEBUG_TDMA_TIMER, - "tsf %llu nextslot %llu (%d, %d) nextslottu %u timer0 %u (%d)\n", + "tsf %llu nextslot %llu (%d, %d) nextslottu %u nexttbtt %llu (%d)\n", (unsigned long long) tsf, (unsigned long long) nextslot, - (int)(nextslot - tsf), tsfdelta, - nextslottu, timer0, tudelta); + (int)(nextslot - tsf), tsfdelta, nextslottu, nexttbtt, tudelta); #endif /* * Adjust the beacon timers only when pulling them forward diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index 5baa4ebd940..5c468e7f764 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -255,7 +255,8 @@ struct ath_softc { sc_setcca : 1,/* set/clr CCA with TDMA */ sc_resetcal : 1,/* reset cal state next trip */ sc_rxslink : 1,/* do self-linked final descriptor */ - sc_kickpcu : 1;/* kick PCU RX on next RX proc */ + sc_kickpcu : 1,/* kick PCU RX on next RX proc */ + sc_rxtsf32 : 1;/* RX dec TSF is 32 bits */ uint32_t sc_eerd; /* regdomain from EEPROM */ uint32_t sc_eecc; /* country code from EEPROM */ /* rate tables */ @@ -482,6 +483,8 @@ void ath_intr(void *); ((*(_ah)->ah_setBeaconTimers)((_ah), (_bt))) #define ath_hal_beacontimers(_ah, _bs) \ ((*(_ah)->ah_setStationBeaconTimers)((_ah), (_bs))) +#define ath_hal_getnexttbtt(_ah) \ + ((*(_ah)->ah_getNextTBTT)((_ah))) #define ath_hal_setassocid(_ah, _bss, _associd) \ ((*(_ah)->ah_writeAssocid)((_ah), (_bss), (_associd))) #define ath_hal_phydisable(_ah) \ @@ -657,6 +660,8 @@ void ath_intr(void *); (ath_hal_getcapability(_ah, HAL_CAP_RXDESC_SELFLINK, 0, NULL) == HAL_OK) #define ath_hal_gtxto_supported(_ah) \ (ath_hal_getcapability(_ah, HAL_CAP_GTXTO, 0, NULL) == HAL_OK) +#define ath_hal_has_long_rxdesc_tsf(_ah) \ + (ath_hal_getcapability(_ah, HAL_CAP_LONG_RXDESC_TSF, 0, NULL) == HAL_OK) #define ath_hal_setuprxdesc(_ah, _ds, _size, _intreq) \ ((*(_ah)->ah_setupRxDesc)((_ah), (_ds), (_size), (_intreq))) From 6a0a87741b7f0a9dadaa6229c06eac3a535f6c6c Mon Sep 17 00:00:00 2001 From: "Andrey V. Elsukov" Date: Thu, 8 Sep 2011 04:14:16 +0000 Subject: [PATCH 402/452] Don't use the whole free space when resizing partition to a larger size on a disk with non zero stripesize (e.g. disks with 4k sector size)[1]. Also do not use automatic alignment when size is exactly specified, but an alignment is not. Use automatic alignment only for case when user omits both "-s" and "-a" options. Reported by: Mikael Fridh [1] Approved by: re (kib) MFC after: 1 week --- sbin/geom/class/part/geom_part.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sbin/geom/class/part/geom_part.c b/sbin/geom/class/part/geom_part.c index a4569119e53..8db07737171 100644 --- a/sbin/geom/class/part/geom_part.c +++ b/sbin/geom/class/part/geom_part.c @@ -308,7 +308,7 @@ gpart_autofill_resize(struct gctl_req *req) off_t last, size, start, new_size; off_t lba, new_lba, alignment, offset; const char *s; - int error, idx; + int error, idx, has_alignment; idx = (int)gctl_get_intmax(req, GPART_PARAM_INDEX); if (idx < 1) @@ -334,8 +334,9 @@ gpart_autofill_resize(struct gctl_req *req) errx(EXIT_FAILURE, "Provider for geom %s not found.", s); s = gctl_get_ascii(req, "alignment"); + has_alignment = (*s == '*') ? 0 : 1; alignment = 1; - if (*s != '*') { + if (has_alignment) { error = g_parse_lba(s, pp->lg_sectorsize, &alignment); if (error) errc(EXIT_FAILURE, error, "Invalid alignment param"); @@ -358,7 +359,7 @@ gpart_autofill_resize(struct gctl_req *req) if (error) errc(EXIT_FAILURE, error, "Invalid size param"); /* no autofill necessary. */ - if (alignment == 1) + if (has_alignment == 0) goto done; } @@ -380,7 +381,8 @@ gpart_autofill_resize(struct gctl_req *req) lba = (off_t)strtoimax(s, NULL, 0); size = lba - start + 1; - if (new_size > 0 && new_size <= size) { + pp = find_provider(gp, lba + 1); + if (new_size > 0 && (new_size <= size || pp == NULL)) { /* The start offset may be not aligned, so we align the end * offset and then calculate the size. */ @@ -388,8 +390,6 @@ gpart_autofill_resize(struct gctl_req *req) alignment) - start - offset; goto done; } - - pp = find_provider(gp, lba + 1); if (pp == NULL) { new_size = ALIGNDOWN(last + offset + 1, alignment) - start - offset; From dfdd3320563293af72effba0ea2826a1a934106e Mon Sep 17 00:00:00 2001 From: Xin LI Date: Thu, 8 Sep 2011 09:33:49 +0000 Subject: [PATCH 403/452] Fix SSL memory handlig for (EC)DH cipher suites, in particular for multi-threaded use of ECDH. Security: CVE-2011-3210 Reviewed by: stas Obtained from: OpenSSL CVS Approved by: re (kib) --- crypto/openssl/ssl/s3_lib.c | 6 ++++++ crypto/openssl/ssl/s3_srvr.c | 22 +++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/crypto/openssl/ssl/s3_lib.c b/crypto/openssl/ssl/s3_lib.c index 8fa4ab02c36..e6091ef8166 100644 --- a/crypto/openssl/ssl/s3_lib.c +++ b/crypto/openssl/ssl/s3_lib.c @@ -1722,11 +1722,17 @@ void ssl3_clear(SSL *s) } #ifndef OPENSSL_NO_DH if (s->s3->tmp.dh != NULL) + { DH_free(s->s3->tmp.dh); + s->s3->tmp.dh = NULL; + } #endif #ifndef OPENSSL_NO_ECDH if (s->s3->tmp.ecdh != NULL) + { EC_KEY_free(s->s3->tmp.ecdh); + s->s3->tmp.ecdh = NULL; + } #endif rp = s->s3->rbuf.buf; diff --git a/crypto/openssl/ssl/s3_srvr.c b/crypto/openssl/ssl/s3_srvr.c index e2d570f80f0..b9f4292af65 100644 --- a/crypto/openssl/ssl/s3_srvr.c +++ b/crypto/openssl/ssl/s3_srvr.c @@ -710,15 +710,20 @@ int ssl3_check_client_hello(SSL *s) if (s->s3->tmp.message_type == SSL3_MT_CLIENT_HELLO) { /* Throw away what we have done so far in the current handshake, - * which will now be aborted. (A full SSL_clear would be too much.) - * I hope that tmp.dh is the only thing that may need to be cleared - * when a handshake is not completed ... */ + * which will now be aborted. (A full SSL_clear would be too much.) */ #ifndef OPENSSL_NO_DH if (s->s3->tmp.dh != NULL) { DH_free(s->s3->tmp.dh); s->s3->tmp.dh = NULL; } +#endif +#ifndef OPENSSL_NO_ECDH + if (s->s3->tmp.ecdh != NULL) + { + EC_KEY_free(s->s3->tmp.ecdh); + s->s3->tmp.ecdh = NULL; + } #endif return 2; } @@ -1329,7 +1334,6 @@ int ssl3_send_server_key_exchange(SSL *s) if (s->s3->tmp.dh != NULL) { - DH_free(dh); SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); goto err; } @@ -1390,7 +1394,6 @@ int ssl3_send_server_key_exchange(SSL *s) if (s->s3->tmp.ecdh != NULL) { - EC_KEY_free(s->s3->tmp.ecdh); SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR); goto err; } @@ -1401,12 +1404,11 @@ int ssl3_send_server_key_exchange(SSL *s) SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB); goto err; } - if (!EC_KEY_up_ref(ecdhp)) + if ((ecdh = EC_KEY_dup(ecdhp)) == NULL) { SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB); goto err; } - ecdh = ecdhp; s->s3->tmp.ecdh=ecdh; if ((EC_KEY_get0_public_key(ecdh) == NULL) || @@ -2262,6 +2264,12 @@ int ssl3_get_client_key_exchange(SSL *s) /* Get encoded point length */ i = *p; p += 1; + if (n != 1 + i) + { + SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, + ERR_R_EC_LIB); + goto err; + } if (EC_POINT_oct2point(group, clnt_ecpoint, p, i, bn_ctx) == 0) { From fa2b39a18d45ad2d45db156454ad916b20a5ab15 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Thu, 8 Sep 2011 12:56:26 +0000 Subject: [PATCH 404/452] Improve the informations reported in case of busy buffers during the shutdown: - Axe out the SHOW_BUSYBUFS option and uses a tunable for selectively enable/disable it, which is defaulted for not printing anything (0 value) but can be changed for printing (1 value) and be verbose (2 value) - Improves the informations outputed: right now, there is no track of the actual struct buf object or vnode which are referenced by the shutdown process, but it is printed the related struct bufobj object which is not really helpful - Add more verbosity about the state of the struct buf lock and the vnode informations, with the latter to be activated separately by the sysctl Sponsored by: Sandvine Incorporated Reviewed by: emaste, kib Approved by: re (ksmith) MFC after: 10 days --- sys/conf/NOTES | 1 - sys/conf/options | 1 - sys/kern/kern_shutdown.c | 28 ++++++++++++++++++++-------- sys/kern/vfs_bio.c | 2 +- sys/sys/buf.h | 6 ++++++ 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 59f02c812a1..fd76593362c 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -2929,7 +2929,6 @@ options SCSI_NCR_MYADDR=7 options SC_DEBUG_LEVEL=5 # Syscons debug level options SC_RENDER_DEBUG # syscons rendering debugging -options SHOW_BUSYBUFS # List buffers that prevent root unmount options VFS_BIO_DEBUG # VFS buffer I/O debugging options KSTACK_MAX_PAGES=32 # Maximum pages to give the kernel stack diff --git a/sys/conf/options b/sys/conf/options index b36a644b9e5..a7f12124d9c 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -156,7 +156,6 @@ QUOTA SCHED_4BSD opt_sched.h SCHED_STATS opt_sched.h SCHED_ULE opt_sched.h -SHOW_BUSYBUFS SLEEPQUEUE_PROFILING SLHCI_DEBUG opt_slhci.h SPX_HACK diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c index 7621b151d9b..6a8a597637e 100644 --- a/sys/kern/kern_shutdown.c +++ b/sys/kern/kern_shutdown.c @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include "opt_ddb.h" #include "opt_kdb.h" #include "opt_panic.h" -#include "opt_show_busybufs.h" #include "opt_sched.h" #include "opt_watchdog.h" @@ -66,6 +65,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #ifdef SW_WATCHDOG #include #endif @@ -123,6 +123,14 @@ TUNABLE_INT("kern.sync_on_panic", &sync_on_panic); SYSCTL_NODE(_kern, OID_AUTO, shutdown, CTLFLAG_RW, 0, "Shutdown environment"); +#ifndef DIAGNOSTIC +static int show_busybufs; +#else +static int show_busybufs = 1; +#endif +SYSCTL_INT(_kern_shutdown, OID_AUTO, show_busybufs, CTLFLAG_RW, + &show_busybufs, 0, ""); + /* * Variable panicstr contains argument to first call to panic; used as flag * to indicate that the kernel has already called panic. @@ -389,13 +397,17 @@ kern_reboot(int howto) } #endif nbusy++; -#if defined(SHOW_BUSYBUFS) || defined(DIAGNOSTIC) - printf( - "%d: bufobj:%p, flags:%0x, blkno:%ld, lblkno:%ld\n", - nbusy, bp->b_bufobj, - bp->b_flags, (long)bp->b_blkno, - (long)bp->b_lblkno); -#endif + if (show_busybufs > 0) { + printf( + "%d: buf:%p, vnode:%p, flags:%0x, blkno:%jd, lblkno:%jd, buflock:", + nbusy, bp, bp->b_vp, bp->b_flags, + (intmax_t)bp->b_blkno, + (intmax_t)bp->b_lblkno); + BUF_LOCKPRINTINFO(bp); + if (show_busybufs > 1) + vn_printf(bp->b_vp, + "vnode content: "); + } } } if (nbusy) { diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index a6ad81e9e03..7b5b0154c6b 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -4020,7 +4020,7 @@ DB_SHOW_COMMAND(buffer, db_show_buffer) db_printf("\n"); } db_printf(" "); - lockmgr_printinfo(&bp->b_lock); + BUF_LOCKPRINTINFO(bp); } DB_SHOW_COMMAND(lockedbufs, lockedbufs) diff --git a/sys/sys/buf.h b/sys/sys/buf.h index f57d6edb7e4..972b05379fa 100644 --- a/sys/sys/buf.h +++ b/sys/sys/buf.h @@ -310,6 +310,12 @@ extern const char *buf_wmesg; /* Default buffer lock message */ #define BUF_LOCKFREE(bp) \ lockdestroy(&(bp)->b_lock) +/* + * Print informations on a buffer lock. + */ +#define BUF_LOCKPRINTINFO(bp) \ + lockmgr_printinfo(&(bp)->b_lock) + /* * Buffer lock assertions. */ From 41449512772268bee3095c480d84867bb4862639 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Thu, 8 Sep 2011 23:46:07 +0000 Subject: [PATCH 405/452] Sync pf.os with OpenBSD: - Update OpenBSD fingerprints through OpenBSD 4.9 - Fix typos. Obtained from: OpenBSD MFC after: 2 weeks Approved by: re (kib) --- etc/pf.os | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/etc/pf.os b/etc/pf.os index b282c9437d7..00873a78960 100644 --- a/etc/pf.os +++ b/etc/pf.os @@ -1,5 +1,5 @@ # $FreeBSD$ -# $OpenBSD: pf.os,v 1.21 2006/07/28 21:51:12 david Exp $ +# $OpenBSD: pf.os,v 1.25 2010/10/18 15:55:27 deraadt Exp $ # passive OS fingerprinting # ------------------------- # @@ -299,13 +299,16 @@ S22:64:1:52:M*,N,N,S,N,W0: Linux:2.2:ts:Linux 2.2 w/o timestamps # ----------------- OpenBSD ----------------- 16384:64:0:60:M*,N,W0,N,N,T: OpenBSD:2.6::NetBSD 1.3 (or OpenBSD 2.6) -16384:64:1:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.0-4.0::OpenBSD 3.0-4.0 -16384:64:0:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.0-4.0:no-df:OpenBSD 3.0-4.0 (scrub no-df) +16384:64:1:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.0-4.8::OpenBSD 3.0-4.8 +16384:64:0:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.0-4.8:no-df:OpenBSD 3.0-4.8 (scrub no-df) 57344:64:1:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.3-4.0::OpenBSD 3.3-4.0 57344:64:0:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.3-4.0:no-df:OpenBSD 3.3-4.0 (scrub no-df) 65535:64:1:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.0-4.0:opera:OpenBSD 3.0-4.0 (Opera) +16384:64:1:64:M*,N,N,S,N,W3,N,N,T: OpenBSD:4.9::OpenBSD 4.9 +16384:64:0:64:M*,N,N,S,N,W3,N,N,T: OpenBSD:4.9:no-df:OpenBSD 4.9 (scrub no-df) + # ----------------- Solaris ----------------- S17:64:1:64:N,W3,N,N,T0,N,N,S,M*: Solaris:8:RFC1323:Solaris 8 RFC1323 @@ -362,7 +365,7 @@ S34:64:1:52:M*,N,W0,N,N,S: Solaris:10:beta:Solaris 10 (beta) # ----------------- Windows ----------------- # Windows TCP/IP stack is a mess. For most recent XP, 2000 and -# even 98, the pathlevel, not the actual OS version, is more +# even 98, the patchlevel, not the actual OS version, is more # relevant to the signature. They share the same code, so it would # seem. Luckily for us, almost all Windows 9x boxes have an # awkward MSS of 536, which I use to tell one from another From e4f820b3c68c857180a9781e0cea7098d0b96415 Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Fri, 9 Sep 2011 13:52:37 +0000 Subject: [PATCH 406/452] Improve implementation of the Nagle algorithm for SCTP: Don't delay the final fragment of a fragmented user message. Approved by: re MFC after: 4 weeks --- sys/netinet/sctp_output.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index 81c9e70d62c..d91f8986311 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -9821,19 +9821,22 @@ sctp_chunk_output(struct sctp_inpcb *inp, unsigned int burst_cnt = 0; struct timeval now; int now_filled = 0; - int nagle_on = 0; + int nagle_on; int frag_point = sctp_get_frag_point(stcb, &stcb->asoc); int un_sent = 0; int fr_done; unsigned int tot_frs = 0; asoc = &stcb->asoc; + /* The Nagle algorithm is only applied when handling a send call. */ if (from_where == SCTP_OUTPUT_FROM_USR_SEND) { if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NODELAY)) { nagle_on = 0; } else { nagle_on = 1; } + } else { + nagle_on = 0; } SCTP_TCB_LOCK_ASSERT(stcb); @@ -10007,15 +10010,18 @@ sctp_chunk_output(struct sctp_inpcb *inp, } } if (nagle_on) { - /*- - * When nagle is on, we look at how much is un_sent, then - * if its smaller than an MTU and we have data in - * flight we stop. + /* + * When the Nagle algorithm is used, look at how + * much is unsent, then if its smaller than an MTU + * and we have data in flight we stop, except if we + * are handling a fragmented user message. */ un_sent = ((stcb->asoc.total_output_queue_size - stcb->asoc.total_flight) + (stcb->asoc.stream_queue_cnt * sizeof(struct sctp_data_chunk))); if ((un_sent < (int)(stcb->asoc.smallest_mtu - SCTP_MIN_OVERHEAD)) && - (stcb->asoc.total_flight > 0)) { + (stcb->asoc.total_flight > 0) && + ((stcb->asoc.locked_on_sending == NULL) || + sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXPLICIT_EOR))) { break; } } From c9c00408c5b92e533795805f0e405da88e864de1 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Sat, 10 Sep 2011 09:40:00 +0000 Subject: [PATCH 407/452] Add ftp4.se.freebsd.org to the IPv4 and IPv6 mirror lists. PR: 157210, 157211 Submitted by: Niclas Zeising Approved by: re (kib) --- usr.sbin/bsdinstall/scripts/mirrorselect | 1 + usr.sbin/pc-sysinstall/backend/functions-ftp.sh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/usr.sbin/bsdinstall/scripts/mirrorselect b/usr.sbin/bsdinstall/scripts/mirrorselect index 51c5a4bf5aa..437f50d86e1 100755 --- a/usr.sbin/bsdinstall/scripts/mirrorselect +++ b/usr.sbin/bsdinstall/scripts/mirrorselect @@ -45,6 +45,7 @@ MIRROR=`dialog --backtitle "FreeBSD Installer" \ ftp://ftp3.ie.freebsd.org "IPv6 Ireland"\ ftp://ftp.il.freebsd.org "IPv6 Israel"\ ftp://ftp2.jp.freebsd.org "IPv6 Japan"\ + ftp://ftp4.se.freebsd.org "IPv6 Sweden"\ ftp://ftp4.us.freebsd.org "IPv6 USA"\ ftp://ftp2.tr.freebsd.org "IPv6 Turkey"\ ftp://ftp1.freebsd.org "Primary"\ diff --git a/usr.sbin/pc-sysinstall/backend/functions-ftp.sh b/usr.sbin/pc-sysinstall/backend/functions-ftp.sh index 6116fce823a..e974f3181e0 100755 --- a/usr.sbin/pc-sysinstall/backend/functions-ftp.sh +++ b/usr.sbin/pc-sysinstall/backend/functions-ftp.sh @@ -40,6 +40,7 @@ IPv6 Main Site: ftp.freebsd.org|\ IPv6 Ireland: ftp3.ie.freebsd.org|\ IPv6 Israel: ftp.il.freebsd.org|\ IPv6 Japan: ftp2.jp.freebsd.org|\ +IPv6 Sweden: ftp4.se.freebsd.org|\ IPv6 USA: ftp4.us.freebsd.org|\ IPv6 Turkey: ftp2.tr.freebsd.org" @@ -212,6 +213,7 @@ SWEDEN_FTP_SERVERS="\ Sweden: ftp.se.freebsd.org|\ Sweden #2: ftp2.se.freebsd.org|\ Sweden #3: ftp3.se.freebsd.org|\ +Sweden #4: ftp4.se.freebsd.org|\ Sweden #5: ftp5.se.freebsd.org" SWITZERLAND_FTP_SERVERS="\ From 3f37fb622c4ae762ec2c451eabe33ea58ef36692 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Sat, 10 Sep 2011 15:55:36 +0000 Subject: [PATCH 408/452] Refactor auto-quirk solution so that we break as few external drivers as possible. PR: usb/160299 Approved by: re (kib) Suggested by: rwatson MFC after: 0 days --- sys/dev/usb/quirk/usb_quirk.c | 2 +- sys/dev/usb/usb_device.c | 22 ++++++++++++++++------ sys/dev/usb/usb_dynamic.c | 14 ++------------ sys/dev/usb/usb_dynamic.h | 1 - sys/dev/usb/usbdi.h | 1 - sys/sys/param.h | 2 +- 6 files changed, 20 insertions(+), 22 deletions(-) diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c index d1bd0ee1270..d3093f7ec1f 100644 --- a/sys/dev/usb/quirk/usb_quirk.c +++ b/sys/dev/usb/quirk/usb_quirk.c @@ -588,7 +588,7 @@ usb_test_quirk_by_info(const struct usbd_lookup_info *info, uint16_t quirk) } mtx_unlock(&usb_quirk_mtx); done: - return (usb_test_quirk_w(info, quirk)); + return (0); /* no quirk match */ } static struct usb_quirk_entry * diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c index 3be9ba967d0..7e0de330ed7 100644 --- a/sys/dev/usb/usb_device.c +++ b/sys/dev/usb/usb_device.c @@ -1239,8 +1239,6 @@ static void usb_init_attach_arg(struct usb_device *udev, struct usb_attach_arg *uaa) { - uint8_t x; - memset(uaa, 0, sizeof(*uaa)); uaa->device = udev; @@ -1256,9 +1254,6 @@ usb_init_attach_arg(struct usb_device *udev, uaa->info.bDeviceProtocol = udev->ddesc.bDeviceProtocol; uaa->info.bConfigIndex = udev->curr_config_index; uaa->info.bConfigNum = udev->curr_config_no; - - for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) - uaa->info.autoQuirk[x] = udev->autoQuirk[x]; } /*------------------------------------------------------------------------* @@ -2389,8 +2384,22 @@ uint8_t usb_test_quirk(const struct usb_attach_arg *uaa, uint16_t quirk) { uint8_t found; + uint8_t x; + + if (quirk == UQ_NONE) + return (0); + + /* search the automatic per device quirks first */ + + for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) { + if (uaa->device->autoQuirk[x] == quirk) + return (1); + } + + /* search global quirk table, if any */ found = (usb_test_quirk_p) (&uaa->info, quirk); + return (found); } @@ -2723,7 +2732,8 @@ usbd_add_dynamic_quirk(struct usb_device *udev, uint16_t quirk) uint8_t x; for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) { - if (udev->autoQuirk[x] == 0) { + if (udev->autoQuirk[x] == 0 || + udev->autoQuirk[x] == quirk) { udev->autoQuirk[x] = quirk; return (0); /* success */ } diff --git a/sys/dev/usb/usb_dynamic.c b/sys/dev/usb/usb_dynamic.c index 765ee4fadb2..1358b30cd0e 100644 --- a/sys/dev/usb/usb_dynamic.c +++ b/sys/dev/usb/usb_dynamic.c @@ -50,12 +50,12 @@ #include #include #include -#include /* function prototypes */ static usb_handle_req_t usb_temp_get_desc_w; static usb_temp_setup_by_index_t usb_temp_setup_by_index_w; static usb_temp_unsetup_t usb_temp_unsetup_w; +static usb_test_quirk_t usb_test_quirk_w; static usb_quirk_ioctl_t usb_quirk_ioctl_w; /* global variables */ @@ -72,19 +72,9 @@ usb_temp_setup_by_index_w(struct usb_device *udev, uint16_t index) return (USB_ERR_INVAL); } -uint8_t +static uint8_t usb_test_quirk_w(const struct usbd_lookup_info *info, uint16_t quirk) { - uint8_t x; - - if (quirk == UQ_NONE) - return (0); /* no match */ - - for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) { - if (info->autoQuirk[x] == quirk) - return (1); /* match */ - } - return (0); /* no match */ } diff --git a/sys/dev/usb/usb_dynamic.h b/sys/dev/usb/usb_dynamic.h index f1b2149e309..568494204c1 100644 --- a/sys/dev/usb/usb_dynamic.h +++ b/sys/dev/usb/usb_dynamic.h @@ -57,6 +57,5 @@ extern devclass_t usb_devclass_ptr; void usb_temp_unload(void *); void usb_quirk_unload(void *); void usb_bus_unload(void *); -usb_test_quirk_t usb_test_quirk_w; #endif /* _USB_DYNAMIC_H_ */ diff --git a/sys/dev/usb/usbdi.h b/sys/dev/usb/usbdi.h index 6f899227ce6..6446720e861 100644 --- a/sys/dev/usb/usbdi.h +++ b/sys/dev/usb/usbdi.h @@ -353,7 +353,6 @@ struct usbd_lookup_info { uint16_t idVendor; uint16_t idProduct; uint16_t bcdDevice; - uint16_t autoQuirk[USB_MAX_AUTO_QUIRK]; uint8_t bDeviceClass; uint8_t bDeviceSubClass; uint8_t bDeviceProtocol; diff --git a/sys/sys/param.h b/sys/sys/param.h index 41b9ff34561..0db0223e366 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -58,7 +58,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 900043 /* Master, propagated to newvers */ +#define __FreeBSD_version 900044 /* Master, propagated to newvers */ #ifdef _KERNEL #define P_OSREL_SIGSEGV 700004 From 637b8c6d881a99edd178203161fda260bc054d0d Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sun, 11 Sep 2011 09:43:13 +0000 Subject: [PATCH 409/452] Fix the order of parameters passed to the HT frame duration calculation. Approved by: re (kib) --- sys/dev/ath/ath_rate/sample/sample.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sys/dev/ath/ath_rate/sample/sample.h b/sys/dev/ath/ath_rate/sample/sample.h index d61868d9427..b39e0be7164 100644 --- a/sys/dev/ath/ath_rate/sample/sample.h +++ b/sys/dev/ath/ath_rate/sample/sample.h @@ -199,8 +199,8 @@ static unsigned calc_usecs_unicast_packet(struct ath_softc *sc, ctsduration += rt->info[cix].spAckDuration; /* XXX assumes short preamble */ - /* XXX assumes HT/20; the node info isn't yet available here */ - ctsduration += ath_hal_pkt_txtime(sc->sc_ah, rt, length, rix, 0, is_ht40); + ctsduration += ath_hal_pkt_txtime(sc->sc_ah, rt, length, rix, + is_ht40, 0); if (cts) /* SIFS + ACK */ ctsduration += rt->info[cix].spAckDuration; @@ -210,8 +210,9 @@ static unsigned calc_usecs_unicast_packet(struct ath_softc *sc, tt += t_difs; /* XXX assumes short preamble */ - /* XXX assumes HT/20; the node info isn't yet available here */ - tt += (long_retries+1)*ath_hal_pkt_txtime(sc->sc_ah, rt, length, rix, 0, is_ht40); + tt += (long_retries+1)*ath_hal_pkt_txtime(sc->sc_ah, rt, length, rix, + is_ht40, 0); + tt += (long_retries+1)*(t_sifs + rt->info[rix].spAckDuration); for (x = 0; x <= short_retries + long_retries; x++) { From 26ccf4f10f9288c19ebe345b0dee7396d6b12ee2 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sun, 11 Sep 2011 16:05:09 +0000 Subject: [PATCH 410/452] Inline the syscallenter() and syscallret(). This reduces the time measured by the syscall entry speed microbenchmarks by ~10% on amd64. Submitted by: jhb Approved by: re (bz) MFC after: 2 weeks --- sys/amd64/amd64/trap.c | 2 + sys/amd64/ia32/ia32_syscall.c | 2 + sys/i386/i386/trap.c | 2 + sys/ia64/ia32/ia32_trap.c | 2 + sys/ia64/ia64/trap.c | 2 + sys/kern/subr_syscall.c | 213 ++++++++++++++++++++++++++++++++++ sys/kern/subr_trap.c | 162 -------------------------- sys/powerpc/aim/trap.c | 2 + sys/powerpc/booke/trap.c | 2 + sys/sparc64/sparc64/trap.c | 2 + sys/sys/proc.h | 3 - 11 files changed, 229 insertions(+), 165 deletions(-) create mode 100644 sys/kern/subr_syscall.c diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index 4e5f8b8aa9f..a36a6be13ce 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -883,6 +883,8 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa) return (error); } +#include "../../kern/subr_syscall.c" + /* * syscall - system call request C handler * diff --git a/sys/amd64/ia32/ia32_syscall.c b/sys/amd64/ia32/ia32_syscall.c index 0b46dae7a5e..d79272a01dc 100644 --- a/sys/amd64/ia32/ia32_syscall.c +++ b/sys/amd64/ia32/ia32_syscall.c @@ -163,6 +163,8 @@ ia32_fetch_syscall_args(struct thread *td, struct syscall_args *sa) return (error); } +#include "../../kern/subr_syscall.c" + void ia32_syscall(struct trapframe *frame) { diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c index 5a8016c9c69..dddecaa807f 100644 --- a/sys/i386/i386/trap.c +++ b/sys/i386/i386/trap.c @@ -1054,6 +1054,8 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa) return (error); } +#include "../../kern/subr_syscall.c" + /* * syscall - system call request C handler * diff --git a/sys/ia64/ia32/ia32_trap.c b/sys/ia64/ia32/ia32_trap.c index 57f47916956..6755358189a 100644 --- a/sys/ia64/ia32/ia32_trap.c +++ b/sys/ia64/ia32/ia32_trap.c @@ -144,6 +144,8 @@ ia32_fetch_syscall_args(struct thread *td, struct syscall_args *sa) return (error); } +#include "../../kern/subr_syscall.c" + static void ia32_syscall(struct trapframe *tf) { diff --git a/sys/ia64/ia64/trap.c b/sys/ia64/ia64/trap.c index 4b84f769340..d587b05868f 100644 --- a/sys/ia64/ia64/trap.c +++ b/sys/ia64/ia64/trap.c @@ -929,6 +929,8 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa) return (0); } +#include "../../kern/subr_syscall.c" + /* * Process a system call. * diff --git a/sys/kern/subr_syscall.c b/sys/kern/subr_syscall.c new file mode 100644 index 00000000000..cb0d9295ed2 --- /dev/null +++ b/sys/kern/subr_syscall.c @@ -0,0 +1,213 @@ +/*- + * Copyright (C) 1994, David Greenman + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * Copyright (C) 2010 Konstantin Belousov + * + * This code is derived from software contributed to Berkeley by + * the University of Utah, and William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 + */ + +#include "opt_capsicum.h" +#include "opt_ktrace.h" +#include "opt_kdtrace.h" + +__FBSDID("$FreeBSD$"); + +#include +#include +#ifdef KTRACE +#include +#include +#endif +#include + +static inline int +syscallenter(struct thread *td, struct syscall_args *sa) +{ + struct proc *p; + int error, traced; + + PCPU_INC(cnt.v_syscall); + p = td->td_proc; + + td->td_pticks = 0; + if (td->td_ucred != p->p_ucred) + cred_update_thread(td); + if (p->p_flag & P_TRACED) { + traced = 1; + PROC_LOCK(p); + td->td_dbgflags &= ~TDB_USERWR; + td->td_dbgflags |= TDB_SCE; + PROC_UNLOCK(p); + } else + traced = 0; + error = (p->p_sysent->sv_fetch_syscall_args)(td, sa); +#ifdef KTRACE + if (KTRPOINT(td, KTR_SYSCALL)) + ktrsyscall(sa->code, sa->narg, sa->args); +#endif + + CTR6(KTR_SYSC, +"syscall: td=%p pid %d %s (%#lx, %#lx, %#lx)", + td, td->td_proc->p_pid, syscallname(p, sa->code), + sa->args[0], sa->args[1], sa->args[2]); + + if (error == 0) { + STOPEVENT(p, S_SCE, sa->narg); + PTRACESTOP_SC(p, td, S_PT_SCE); + if (td->td_dbgflags & TDB_USERWR) { + /* + * Reread syscall number and arguments if + * debugger modified registers or memory. + */ + error = (p->p_sysent->sv_fetch_syscall_args)(td, sa); +#ifdef KTRACE + if (KTRPOINT(td, KTR_SYSCALL)) + ktrsyscall(sa->code, sa->narg, sa->args); +#endif + if (error != 0) + goto retval; + } + +#ifdef CAPABILITY_MODE + /* + * In capability mode, we only allow access to system calls + * flagged with SYF_CAPENABLED. + */ + if (IN_CAPABILITY_MODE(td) && + !(sa->callp->sy_flags & SYF_CAPENABLED)) { + error = ECAPMODE; + goto retval; + } +#endif + + error = syscall_thread_enter(td, sa->callp); + if (error != 0) + goto retval; + +#ifdef KDTRACE_HOOKS + /* + * If the systrace module has registered it's probe + * callback and if there is a probe active for the + * syscall 'entry', process the probe. + */ + if (systrace_probe_func != NULL && sa->callp->sy_entry != 0) + (*systrace_probe_func)(sa->callp->sy_entry, sa->code, + sa->callp, sa->args, 0); +#endif + + AUDIT_SYSCALL_ENTER(sa->code, td); + error = (sa->callp->sy_call)(td, sa->args); + AUDIT_SYSCALL_EXIT(error, td); + + /* Save the latest error return value. */ + td->td_errno = error; + +#ifdef KDTRACE_HOOKS + /* + * If the systrace module has registered it's probe + * callback and if there is a probe active for the + * syscall 'return', process the probe. + */ + if (systrace_probe_func != NULL && sa->callp->sy_return != 0) + (*systrace_probe_func)(sa->callp->sy_return, sa->code, + sa->callp, NULL, (error) ? -1 : td->td_retval[0]); +#endif + syscall_thread_exit(td, sa->callp); + CTR4(KTR_SYSC, "syscall: p=%p error=%d return %#lx %#lx", + p, error, td->td_retval[0], td->td_retval[1]); + } + retval: + if (traced) { + PROC_LOCK(p); + td->td_dbgflags &= ~TDB_SCE; + PROC_UNLOCK(p); + } + (p->p_sysent->sv_set_syscall_retval)(td, error); + return (error); +} + +static inline void +syscallret(struct thread *td, int error, struct syscall_args *sa __unused) +{ + struct proc *p; + int traced; + + p = td->td_proc; + + /* + * Check for misbehavior. + */ + WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", + syscallname(p, sa->code)); + KASSERT(td->td_critnest == 0, + ("System call %s returning in a critical section", + syscallname(p, sa->code))); + KASSERT(td->td_locks == 0, + ("System call %s returning with %d locks held", + syscallname(p, sa->code), td->td_locks)); + + /* + * Handle reschedule and other end-of-syscall issues + */ + userret(td, td->td_frame); + + CTR4(KTR_SYSC, "syscall %s exit thread %p pid %d proc %s", + syscallname(p, sa->code), td, td->td_proc->p_pid, td->td_name); + +#ifdef KTRACE + if (KTRPOINT(td, KTR_SYSRET)) + ktrsysret(sa->code, error, td->td_retval[0]); +#endif + + if (p->p_flag & P_TRACED) { + traced = 1; + PROC_LOCK(p); + td->td_dbgflags |= TDB_SCX; + PROC_UNLOCK(p); + } else + traced = 0; + /* + * This works because errno is findable through the + * register set. If we ever support an emulation where this + * is not the case, this code will need to be revisited. + */ + STOPEVENT(p, S_SCX, sa->code); + PTRACESTOP_SC(p, td, S_PT_SCX); + if (traced || (td->td_dbgflags & (TDB_EXEC | TDB_FORK)) != 0) { + PROC_LOCK(p); + td->td_dbgflags &= ~(TDB_SCX | TDB_EXEC | TDB_FORK); + PROC_UNLOCK(p); + } +} diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c index 3527ed1fbed..42adf80f04f 100644 --- a/sys/kern/subr_trap.c +++ b/sys/kern/subr_trap.c @@ -252,7 +252,6 @@ ast(struct trapframe *framep) mtx_assert(&Giant, MA_NOTOWNED); } -#ifdef HAVE_SYSCALL_ARGS_DEF const char * syscallname(struct proc *p, u_int code) { @@ -264,164 +263,3 @@ syscallname(struct proc *p, u_int code) return (unknown); return (sv->sv_syscallnames[code]); } - -int -syscallenter(struct thread *td, struct syscall_args *sa) -{ - struct proc *p; - int error, traced; - - PCPU_INC(cnt.v_syscall); - p = td->td_proc; - - td->td_pticks = 0; - if (td->td_ucred != p->p_ucred) - cred_update_thread(td); - if (p->p_flag & P_TRACED) { - traced = 1; - PROC_LOCK(p); - td->td_dbgflags &= ~TDB_USERWR; - td->td_dbgflags |= TDB_SCE; - PROC_UNLOCK(p); - } else - traced = 0; - error = (p->p_sysent->sv_fetch_syscall_args)(td, sa); -#ifdef KTRACE - if (KTRPOINT(td, KTR_SYSCALL)) - ktrsyscall(sa->code, sa->narg, sa->args); -#endif - - CTR6(KTR_SYSC, -"syscall: td=%p pid %d %s (%#lx, %#lx, %#lx)", - td, td->td_proc->p_pid, syscallname(p, sa->code), - sa->args[0], sa->args[1], sa->args[2]); - - if (error == 0) { - STOPEVENT(p, S_SCE, sa->narg); - PTRACESTOP_SC(p, td, S_PT_SCE); - if (td->td_dbgflags & TDB_USERWR) { - /* - * Reread syscall number and arguments if - * debugger modified registers or memory. - */ - error = (p->p_sysent->sv_fetch_syscall_args)(td, sa); -#ifdef KTRACE - if (KTRPOINT(td, KTR_SYSCALL)) - ktrsyscall(sa->code, sa->narg, sa->args); -#endif - if (error != 0) - goto retval; - } - -#ifdef CAPABILITY_MODE - /* - * In capability mode, we only allow access to system calls - * flagged with SYF_CAPENABLED. - */ - if (IN_CAPABILITY_MODE(td) && - !(sa->callp->sy_flags & SYF_CAPENABLED)) { - error = ECAPMODE; - goto retval; - } -#endif - - error = syscall_thread_enter(td, sa->callp); - if (error != 0) - goto retval; - -#ifdef KDTRACE_HOOKS - /* - * If the systrace module has registered it's probe - * callback and if there is a probe active for the - * syscall 'entry', process the probe. - */ - if (systrace_probe_func != NULL && sa->callp->sy_entry != 0) - (*systrace_probe_func)(sa->callp->sy_entry, sa->code, - sa->callp, sa->args, 0); -#endif - - AUDIT_SYSCALL_ENTER(sa->code, td); - error = (sa->callp->sy_call)(td, sa->args); - AUDIT_SYSCALL_EXIT(error, td); - - /* Save the latest error return value. */ - td->td_errno = error; - -#ifdef KDTRACE_HOOKS - /* - * If the systrace module has registered it's probe - * callback and if there is a probe active for the - * syscall 'return', process the probe. - */ - if (systrace_probe_func != NULL && sa->callp->sy_return != 0) - (*systrace_probe_func)(sa->callp->sy_return, sa->code, - sa->callp, NULL, (error) ? -1 : td->td_retval[0]); -#endif - syscall_thread_exit(td, sa->callp); - CTR4(KTR_SYSC, "syscall: p=%p error=%d return %#lx %#lx", - p, error, td->td_retval[0], td->td_retval[1]); - } - retval: - if (traced) { - PROC_LOCK(p); - td->td_dbgflags &= ~TDB_SCE; - PROC_UNLOCK(p); - } - (p->p_sysent->sv_set_syscall_retval)(td, error); - return (error); -} - -void -syscallret(struct thread *td, int error, struct syscall_args *sa __unused) -{ - struct proc *p; - int traced; - - p = td->td_proc; - - /* - * Check for misbehavior. - */ - WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", - syscallname(p, sa->code)); - KASSERT(td->td_critnest == 0, - ("System call %s returning in a critical section", - syscallname(p, sa->code))); - KASSERT(td->td_locks == 0, - ("System call %s returning with %d locks held", - syscallname(p, sa->code), td->td_locks)); - - /* - * Handle reschedule and other end-of-syscall issues - */ - userret(td, td->td_frame); - - CTR4(KTR_SYSC, "syscall %s exit thread %p pid %d proc %s", - syscallname(p, sa->code), td, td->td_proc->p_pid, td->td_name); - -#ifdef KTRACE - if (KTRPOINT(td, KTR_SYSRET)) - ktrsysret(sa->code, error, td->td_retval[0]); -#endif - - if (p->p_flag & P_TRACED) { - traced = 1; - PROC_LOCK(p); - td->td_dbgflags |= TDB_SCX; - PROC_UNLOCK(p); - } else - traced = 0; - /* - * This works because errno is findable through the - * register set. If we ever support an emulation where this - * is not the case, this code will need to be revisited. - */ - STOPEVENT(p, S_SCX, sa->code); - PTRACESTOP_SC(p, td, S_PT_SCX); - if (traced || (td->td_dbgflags & (TDB_EXEC | TDB_FORK)) != 0) { - PROC_LOCK(p); - td->td_dbgflags &= ~(TDB_SCX | TDB_EXEC | TDB_FORK); - PROC_UNLOCK(p); - } -} -#endif /* HAVE_SYSCALL_ARGS_DEF */ diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/aim/trap.c index 51dee0eabdb..93feb515728 100644 --- a/sys/powerpc/aim/trap.c +++ b/sys/powerpc/aim/trap.c @@ -445,6 +445,8 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa) return (error); } +#include "../../kern/subr_syscall.c" + void syscall(struct trapframe *frame) { diff --git a/sys/powerpc/booke/trap.c b/sys/powerpc/booke/trap.c index fc506bd361c..091fce08f1f 100644 --- a/sys/powerpc/booke/trap.c +++ b/sys/powerpc/booke/trap.c @@ -375,6 +375,8 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa) return (error); } +#include "../../kern/subr_syscall.c" + void syscall(struct trapframe *frame) { diff --git a/sys/sparc64/sparc64/trap.c b/sys/sparc64/sparc64/trap.c index db05f06ba92..7037e462ad0 100644 --- a/sys/sparc64/sparc64/trap.c +++ b/sys/sparc64/sparc64/trap.c @@ -606,6 +606,8 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa) return (error); } +#include "../../kern/subr_syscall.c" + /* * Syscall handler * The arguments to the syscall are passed in the out registers by the caller, diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 67adbe5b589..fb9791303dd 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -873,9 +873,6 @@ void cpu_switch(struct thread *, struct thread *, struct mtx *); void cpu_throw(struct thread *, struct thread *) __dead2; void unsleep(struct thread *); void userret(struct thread *, struct trapframe *); -struct syscall_args; -int syscallenter(struct thread *, struct syscall_args *); -void syscallret(struct thread *, int, struct syscall_args *); void cpu_exit(struct thread *); void exit1(struct thread *, int) __dead2; From 8bd1142b52c7c992c7b9776906783ab46b50fadc Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sun, 11 Sep 2011 16:08:10 +0000 Subject: [PATCH 411/452] Perform amd64-specific microoptimizations for native syscall entry sequence. The effect is ~1% on the microbenchmark. In particular, do not restore registers which are preserved by the C calling sequence. Align the jump target. Avoid unneeded memory accesses by calculating some data in syscall entry trampoline. Reviewed by: jhb Approved by: re (bz) MFC after: 2 weeks --- sys/amd64/amd64/exception.S | 14 ++++++-------- sys/amd64/amd64/genassym.c | 1 + sys/amd64/amd64/trap.c | 17 ++++++----------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index c537a4f45c8..b5b84eda5af 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -380,8 +380,11 @@ IDTVEC(fast_syscall) movl $TF_HASSEGS,TF_FLAGS(%rsp) cld FAKE_MCOUNT(TF_RIP(%rsp)) - movq %rsp,%rdi - call syscall + movq PCPU(CURTHREAD),%rdi + movq %rsp,TD_FRAME(%rdi) + movl TF_RFLAGS(%rsp),%esi + andl $PSL_T,%esi + call amd64_syscall 1: movq PCPU(CURPCB),%rax /* Disable interrupts before testing PCB_FULL_IRET. */ cli @@ -396,17 +399,12 @@ IDTVEC(fast_syscall) call ast jmp 1b 2: /* Restore preserved registers. */ + .align 16 MEXITCOUNT movq TF_RDI(%rsp),%rdi /* bonus; preserve arg 1 */ movq TF_RSI(%rsp),%rsi /* bonus: preserve arg 2 */ movq TF_RDX(%rsp),%rdx /* return value 2 */ movq TF_RAX(%rsp),%rax /* return value 1 */ - movq TF_RBX(%rsp),%rbx /* C preserved */ - movq TF_RBP(%rsp),%rbp /* C preserved */ - movq TF_R12(%rsp),%r12 /* C preserved */ - movq TF_R13(%rsp),%r13 /* C preserved */ - movq TF_R14(%rsp),%r14 /* C preserved */ - movq TF_R15(%rsp),%r15 /* C preserved */ movq TF_RFLAGS(%rsp),%r11 /* original %rflags */ movq TF_RIP(%rsp),%rcx /* original %rip */ movq TF_RSP(%rsp),%r9 /* user stack pointer */ diff --git a/sys/amd64/amd64/genassym.c b/sys/amd64/amd64/genassym.c index 1c9abd5ab1b..d133223ffb2 100644 --- a/sys/amd64/amd64/genassym.c +++ b/sys/amd64/amd64/genassym.c @@ -87,6 +87,7 @@ ASSYM(TD_PCB, offsetof(struct thread, td_pcb)); ASSYM(TD_PFLAGS, offsetof(struct thread, td_pflags)); ASSYM(TD_PROC, offsetof(struct thread, td_proc)); ASSYM(TD_TID, offsetof(struct thread, td_tid)); +ASSYM(TD_FRAME, offsetof(struct thread, td_frame)); ASSYM(TDF_ASTPENDING, TDF_ASTPENDING); ASSYM(TDF_NEEDRESCHED, TDF_NEEDRESCHED); diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index a36a6be13ce..bd75209f43c 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -885,41 +885,36 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa) #include "../../kern/subr_syscall.c" +void amd64_syscall(struct thread *td, int traced); /* * syscall - system call request C handler * * A system call is essentially treated as a trap. */ void -syscall(struct trapframe *frame) +amd64_syscall(struct thread *td, int traced) { - struct thread *td; struct syscall_args sa; - register_t orig_tf_rflags; int error; ksiginfo_t ksi; #ifdef DIAGNOSTIC - if (ISPL(frame->tf_cs) != SEL_UPL) { + if (ISPL(td->td_frame->tf_cs) != SEL_UPL) { panic("syscall"); /* NOT REACHED */ } #endif - orig_tf_rflags = frame->tf_rflags; - td = curthread; - td->td_frame = frame; - error = syscallenter(td, &sa); /* * Traced syscall. */ - if (orig_tf_rflags & PSL_T) { - frame->tf_rflags &= ~PSL_T; + if (__predict_false(traced)) { + td->td_frame->tf_rflags &= ~PSL_T; ksiginfo_init_trap(&ksi); ksi.ksi_signo = SIGTRAP; ksi.ksi_code = TRAP_TRACE; - ksi.ksi_addr = (void *)frame->tf_rip; + ksi.ksi_addr = (void *)td->td_frame->tf_rip; trapsignal(td, &ksi); } From b48f7c4c8d3c6f1db44bd243d47e7d7068406b8d Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Sun, 11 Sep 2011 17:39:51 +0000 Subject: [PATCH 412/452] Fix a zyd(4) comment typo that was copy+pasted into most kernel config files. PR: 160276 Submitted by: MATSUMIYA Ryo Approved by: re (kib) MFC after: 1 week --- sys/amd64/conf/GENERIC | 2 +- sys/arm/conf/HL200 | 2 +- sys/arm/conf/HL201 | 2 +- sys/arm/conf/KB920X | 2 +- sys/arm/conf/QILA9G20 | 2 +- sys/arm/conf/SAM9G20EK | 2 +- sys/i386/conf/GENERIC | 2 +- sys/mips/conf/OCTEON1 | 2 +- sys/pc98/conf/GENERIC | 2 +- sys/sparc64/conf/GENERIC | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC index 2d7b60502c1..db87d0b34d4 100644 --- a/sys/amd64/conf/GENERIC +++ b/sys/amd64/conf/GENERIC @@ -326,7 +326,7 @@ device uath # Atheros AR5523 wireless NICs device upgt # Conexant/Intersil PrismGT wireless NICs. device ural # Ralink Technology RT2500USB wireless NICs device urtw # Realtek RTL8187B/L wireless NICs -device zyd # ZyDAS zb1211/zb1211b wireless NICs +device zyd # ZyDAS zd1211/zd1211b wireless NICs # FireWire support device firewire # FireWire bus code diff --git a/sys/arm/conf/HL200 b/sys/arm/conf/HL200 index e42974d1333..ffd306ab0ba 100644 --- a/sys/arm/conf/HL200 +++ b/sys/arm/conf/HL200 @@ -126,7 +126,7 @@ device udav # Davicom DM9601E USB device rum # Ralink Technology RT2501USB wireless NICs device uath # Atheros AR5523 wireless NICs device ural # Ralink Technology RT2500USB wireless NICs -device zyd # ZyDAS zb1211/zb1211b wireless NICs +device zyd # ZyDAS zd1211/zd1211b wireless NICs # SCSI peripherals device scbus # SCSI bus (required for SCSI) device da # Direct Access (disks) diff --git a/sys/arm/conf/HL201 b/sys/arm/conf/HL201 index af4266c86c6..157ac21a3ca 100644 --- a/sys/arm/conf/HL201 +++ b/sys/arm/conf/HL201 @@ -117,7 +117,7 @@ device udav # Davicom DM9601E USB #device rum # Ralink Technology RT2501USB wireless NICs #device uath # Atheros AR5523 wireless NICs #device ural # Ralink Technology RT2500USB wireless NICs -#device zyd # ZyDAS zb1211/zb1211b wireless NICs +#device zyd # ZyDAS zd1211/zd1211b wireless NICs # SCSI peripherals device scbus # SCSI bus (required for SCSI) device da # Direct Access (disks) diff --git a/sys/arm/conf/KB920X b/sys/arm/conf/KB920X index e9aa36ef75c..524e3870538 100644 --- a/sys/arm/conf/KB920X +++ b/sys/arm/conf/KB920X @@ -126,7 +126,7 @@ device udav # Davicom DM9601E USB device rum # Ralink Technology RT2501USB wireless NICs device uath # Atheros AR5523 wireless NICs device ural # Ralink Technology RT2500USB wireless NICs -device zyd # ZyDAS zb1211/zb1211b wireless NICs +device zyd # ZyDAS zd1211/zd1211b wireless NICs # SCSI peripherals device scbus # SCSI bus (required for SCSI) device da # Direct Access (disks) diff --git a/sys/arm/conf/QILA9G20 b/sys/arm/conf/QILA9G20 index a99b7f470b9..6318a574df0 100644 --- a/sys/arm/conf/QILA9G20 +++ b/sys/arm/conf/QILA9G20 @@ -142,7 +142,7 @@ device udav # Davicom DM9601E USB #device rum # Ralink Technology RT2501USB wireless NICs #device uath # Atheros AR5523 wireless NICs #device ural # Ralink Technology RT2500USB wireless NICs -#device zyd # ZyDAS zb1211/zb1211b wireless NICs +#device zyd # ZyDAS zd1211/zd1211b wireless NICs # Wireless NIC cards #device wlan # 802.11 support diff --git a/sys/arm/conf/SAM9G20EK b/sys/arm/conf/SAM9G20EK index a9d0f967753..e304e9d84b4 100644 --- a/sys/arm/conf/SAM9G20EK +++ b/sys/arm/conf/SAM9G20EK @@ -142,7 +142,7 @@ device udav # Davicom DM9601E USB #device rum # Ralink Technology RT2501USB wireless NICs #device uath # Atheros AR5523 wireless NICs #device ural # Ralink Technology RT2500USB wireless NICs -#device zyd # ZyDAS zb1211/zb1211b wireless NICs +#device zyd # ZyDAS zd1211/zd1211b wireless NICs # Wireless NIC cards #device wlan # 802.11 support diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC index 131982b389e..69e8d9b0429 100644 --- a/sys/i386/conf/GENERIC +++ b/sys/i386/conf/GENERIC @@ -339,7 +339,7 @@ device uath # Atheros AR5523 wireless NICs device upgt # Conexant/Intersil PrismGT wireless NICs. device ural # Ralink Technology RT2500USB wireless NICs device urtw # Realtek RTL8187B/L wireless NICs -device zyd # ZyDAS zb1211/zb1211b wireless NICs +device zyd # ZyDAS zd1211/zd1211b wireless NICs # FireWire support device firewire # FireWire bus code diff --git a/sys/mips/conf/OCTEON1 b/sys/mips/conf/OCTEON1 index 2a0abcf4224..60b2b01f77e 100644 --- a/sys/mips/conf/OCTEON1 +++ b/sys/mips/conf/OCTEON1 @@ -295,4 +295,4 @@ device udav # Davicom DM9601E USB device rum # Ralink Technology RT2501USB wireless NICs device uath # Atheros AR5523 wireless NICs device ural # Ralink Technology RT2500USB wireless NICs -device zyd # ZyDAS zb1211/zb1211b wireless NICs +device zyd # ZyDAS zd1211/zd1211b wireless NICs diff --git a/sys/pc98/conf/GENERIC b/sys/pc98/conf/GENERIC index 0995dfc9ff5..df52ac10477 100644 --- a/sys/pc98/conf/GENERIC +++ b/sys/pc98/conf/GENERIC @@ -276,7 +276,7 @@ device bpf # Berkeley packet filter #device rum # Ralink Technology RT2501USB wireless NICs #device uath # Atheros AR5523 wireless NICs #device ural # Ralink Technology RT2500USB wireless NICs -#device zyd # ZyDAS zb1211/zb1211b wireless NICs +#device zyd # ZyDAS zd1211/zd1211b wireless NICs # FireWire support #device firewire # FireWire bus code diff --git a/sys/sparc64/conf/GENERIC b/sys/sparc64/conf/GENERIC index fdafe697cf1..fed0272734b 100644 --- a/sys/sparc64/conf/GENERIC +++ b/sys/sparc64/conf/GENERIC @@ -257,7 +257,7 @@ device udav # Davicom DM9601E USB device rum # Ralink Technology RT2501USB wireless NICs device uath # Atheros AR5523 wireless NICs device ural # Ralink Technology RT2500USB wireless NICs -device zyd # ZyDAS zb1211/zb1211b wireless NICs +device zyd # ZyDAS zd1211/zd1211b wireless NICs # FireWire support device firewire # FireWire bus code From e4505da6156ae9dbf969d8a9b516cd6d07812fbe Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sun, 11 Sep 2011 18:00:46 +0000 Subject: [PATCH 413/452] The jump target shall be after the padding, not into it. Reported by: alc Approved by: re (bz) MFC after: 2 weeks --- sys/amd64/amd64/exception.S | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index b5b84eda5af..9f0c69a09c9 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -398,8 +398,9 @@ IDTVEC(fast_syscall) movq %rsp, %rdi call ast jmp 1b -2: /* Restore preserved registers. */ + .align 16 +2: /* Restore preserved registers. */ MEXITCOUNT movq TF_RDI(%rsp),%rdi /* bonus; preserve arg 1 */ movq TF_RSI(%rsp),%rsi /* bonus: preserve arg 2 */ From 7a2aafc3554bb036ae82c7ea4e8bae554dc519c7 Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Mon, 12 Sep 2011 08:38:21 +0000 Subject: [PATCH 414/452] dsp_ioctl: fix type of variable used to store ioctl request PR: kern/156433 Submitted by: Grigori Goronzy Reviewed by: hselasky Approved by: re (kib) MFC after: 1 week --- sys/dev/sound/pcm/dsp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c index 1d52cbe3c7d..2cfc1701d35 100644 --- a/sys/dev/sound/pcm/dsp.c +++ b/sys/dev/sound/pcm/dsp.c @@ -1062,7 +1062,8 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, { struct pcm_channel *chn, *rdch, *wrch; struct snddev_info *d; - int *arg_i, ret, tmp, xcmd; + u_long xcmd; + int *arg_i, ret, tmp; d = dsp_get_info(i_dev); if (!DSP_REGISTERED(d, i_dev)) From ca0856d3d189d8eef6da37e30942d9db507cf00d Mon Sep 17 00:00:00 2001 From: Ed Schouten Date: Mon, 12 Sep 2011 10:07:21 +0000 Subject: [PATCH 415/452] Fix error return codes for ioctls on init/lock state devices. In revision 223722 we introduced support for driver ioctls on init/lock state devices. Unfortunately the call to ttydevsw_cioctl() clobbers the value of the error variable, meaning that in many cases ioctl() will now return ENOTTY, even though the ioctl() was processed properly. Reported by: Boris Samorodov Patch by: jilles@ Approved by: re@ (kib@) --- sys/kern/tty.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/kern/tty.c b/sys/kern/tty.c index ce49f972b2f..b5fcba91b4a 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -766,7 +766,7 @@ ttyil_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread *td) { struct tty *tp = dev->si_drv1; - int error = 0; + int error; tty_lock(tp); if (tty_gone(tp)) { @@ -777,6 +777,7 @@ ttyil_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, error = ttydevsw_cioctl(tp, dev2unit(dev), cmd, data, td); if (error != ENOIOCTL) goto done; + error = 0; switch (cmd) { case TIOCGETA: From 91907fbbda0ab5f7395d91f35d48c76e0bc4dc7b Mon Sep 17 00:00:00 2001 From: Sergey Kandaurov Date: Mon, 12 Sep 2011 14:32:35 +0000 Subject: [PATCH 416/452] Add missing lib32 parts for the previous changes: removal of Objective-C support and libpkg; libsbuf version bump Approved by: re (kib) --- ObsoleteFiles.inc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 5ba7cea8911..9c27766fcdd 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -84,8 +84,17 @@ OLD_FILES+=usr/lib/libpkg.a OLD_FILES+=usr/lib/libpkg.so OLD_LIBS+=usr/lib/libpkg.so.0 OLD_FILES+=usr/lib/libpkg_p.a +.if ${TARGET_ARCH} == "amd64" +OLD_FILES+=usr/lib32/libpkg.a +OLD_FILES+=usr/lib32/libpkg.so +OLD_LIBS+=usr/lib32/libpkg.so.0 +OLD_FILES+=usr/lib32/libpkg_p.a +.endif # 20110517: libsbuf version bump OLD_LIBS+=lib/libsbuf.so.5 +.if ${TARGET_ARCH} == "amd64" +OLD_LIBS+=usr/lib32/libsbuf.so.5 +.endif # 20110502: new clang import which bumps version from 2.9 to 3.0 OLD_FILES+=usr/include/clang/2.9/emmintrin.h OLD_FILES+=usr/include/clang/2.9/mm_malloc.h @@ -114,6 +123,12 @@ OLD_FILES+=usr/lib/libobjc_p.a OLD_FILES+=usr/libexec/cc1obj OLD_LIBS+=usr/lib/libobjc.so.4 OLD_DIRS+=usr/include/objc +.if ${TARGET_ARCH} == "amd64" +OLD_FILES+=usr/lib32/libobjc.a +OLD_FILES+=usr/lib32/libobjc.so +OLD_FILES+=usr/lib32/libobjc_p.a +OLD_LIBS+=usr/lib32/libobjc.so.4 +.endif # 20110331: firmware.img created at build time OLD_FILES+=usr/share/examples/kld/firmware/fwimage/firmware.img # 20110224: sticky.8 -> sticky.7 From 06c9ee053d10612a3452d396aec23852f4306d6b Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Mon, 12 Sep 2011 15:21:52 +0000 Subject: [PATCH 417/452] Partially revert 222753: If a CardBus card stores its CIS in a BAR, delete the BAR after parsing the CIS. This forces the resource range to be reallocated if the BAR is reused by the device. Submitted by: deischen Reviewed by: imp Approved by: re (kib) --- sys/dev/cardbus/cardbus_cis.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sys/dev/cardbus/cardbus_cis.c b/sys/dev/cardbus/cardbus_cis.c index ca1ef4b6ed7..5d7704a53f5 100644 --- a/sys/dev/cardbus/cardbus_cis.c +++ b/sys/dev/cardbus/cardbus_cis.c @@ -441,6 +441,7 @@ cardbus_read_tuple_finish(device_t cbdev, device_t child, int rid, { if (res != CIS_CONFIG_SPACE) { bus_release_resource(child, SYS_RES_MEMORY, rid, res); + bus_delete_resource(child, SYS_RES_MEMORY, rid); } } From 58379067a35f78ece909f11c0afc6d36ec2dd101 Mon Sep 17 00:00:00 2001 From: Attilio Rao Date: Mon, 12 Sep 2011 20:39:31 +0000 Subject: [PATCH 418/452] dump_write() returns ENXIO if the dump is trying to be written outside of the device boundry. While this is generally ok, the problem is that all the consumers handle similar cases (and expect to catch) ENOSPC for this (for a reference look at minidumpsys() and dumpsys() constructions). That ends up in consumers not recognizing the issue and amd64 failing to retry if the number of pages grows up during minidump. Fix this by returning ENOSPC in dump_write() and while here add some more diagnostic on involved values. Sponsored by: Sandvine Incorporated In collabouration with: emaste Approved by: re (kib) MFC after: 10 days --- sys/kern/kern_shutdown.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c index 6a8a597637e..c1e3dda4fb1 100644 --- a/sys/kern/kern_shutdown.c +++ b/sys/kern/kern_shutdown.c @@ -705,8 +705,11 @@ dump_write(struct dumperinfo *di, void *virtual, vm_offset_t physical, if (length != 0 && (offset < di->mediaoffset || offset - di->mediaoffset + length > di->mediasize)) { - printf("Attempt to write outside dump device boundaries.\n"); - return (ENXIO); + printf("Attempt to write outside dump device boundaries.\n" + "offset(%jd), mediaoffset(%jd), length(%ju), mediasize(%jd).\n", + (intmax_t)offset, (intmax_t)di->mediaoffset, + (uintmax_t)length, (intmax_t)di->mediasize); + return (ENOSPC); } return (di->dumper(di->priv, virtual, physical, offset, length)); } From 2304f22dd9a246bec81b1c1a3f639c97c7edb040 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Mon, 12 Sep 2011 20:57:22 +0000 Subject: [PATCH 419/452] Connect the vxge(4) module to the i386/amd64 build. Catcher of stupid errors: kib Approved by: re (kib) --- sys/modules/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sys/modules/Makefile b/sys/modules/Makefile index ab27a319070..eec84d3589f 100644 --- a/sys/modules/Makefile +++ b/sys/modules/Makefile @@ -319,6 +319,7 @@ SUBDIR= ${_3dfx} \ vr \ vte \ vx \ + ${_vxge} \ wb \ ${_wi} \ wlan \ @@ -472,6 +473,7 @@ _sppp= sppp _stg= stg _streams= streams _svr4= svr4 +_vxge= vxge _wi= wi _xe= xe .if ${MK_ZFS} != "no" || defined(ALL_MODULES) @@ -625,6 +627,7 @@ _sppp= sppp _tpm= tpm _twa= twa _vesa= vesa +_vxge= vxge _x86bios= x86bios _wi= wi _wpi= wpi From 5bb3652f05028d5a171ed79fa3c40afb1ee09037 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Mon, 12 Sep 2011 21:09:56 +0000 Subject: [PATCH 420/452] Allow the ipfw.ko module built with a kernel to honor any IPFIREWALL_* options defined in the kernel config. This more closely matches the behavior of other modules which inherit configuration settings from the kernel configuration during a kernel + modules build. Reviewed by: luigi Approved by: re (kib) MFC after: 1 week --- sys/modules/ipfw/Makefile | 2 +- sys/netinet/ipfw/ip_fw2.c | 2 +- sys/netinet/ipfw/ip_fw_dynamic.c | 2 +- sys/netinet/ipfw/ip_fw_log.c | 2 +- sys/netinet/ipfw/ip_fw_pfil.c | 2 +- sys/netinet/ipfw/ip_fw_sockopt.c | 2 +- sys/netinet/ipfw/ip_fw_table.c | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sys/modules/ipfw/Makefile b/sys/modules/ipfw/Makefile index 81ce838085d..ec9b3cc49c1 100644 --- a/sys/modules/ipfw/Makefile +++ b/sys/modules/ipfw/Makefile @@ -8,7 +8,7 @@ KMOD= ipfw SRCS= ip_fw2.c ip_fw_pfil.c SRCS+= ip_fw_dynamic.c ip_fw_log.c SRCS+= ip_fw_sockopt.c ip_fw_table.c -SRCS+= opt_inet6.h opt_ipsec.h +SRCS+= opt_inet6.h opt_ipfw.h opt_ipsec.h CFLAGS+= -DIPFIREWALL CFLAGS+= -I${.CURDIR}/../../contrib/pf diff --git a/sys/netinet/ipfw/ip_fw2.c b/sys/netinet/ipfw/ip_fw2.c index c3123dfa11b..619ce6b91e5 100644 --- a/sys/netinet/ipfw/ip_fw2.c +++ b/sys/netinet/ipfw/ip_fw2.c @@ -30,8 +30,8 @@ __FBSDID("$FreeBSD$"); * The FreeBSD IP packet firewall, main file */ -#if !defined(KLD_MODULE) #include "opt_ipfw.h" +#if !defined(KLD_MODULE) #include "opt_ipdivert.h" #include "opt_ipdn.h" #include "opt_inet.h" diff --git a/sys/netinet/ipfw/ip_fw_dynamic.c b/sys/netinet/ipfw/ip_fw_dynamic.c index 0bc4cc112ce..d1eec89eed4 100644 --- a/sys/netinet/ipfw/ip_fw_dynamic.c +++ b/sys/netinet/ipfw/ip_fw_dynamic.c @@ -33,8 +33,8 @@ __FBSDID("$FreeBSD$"); * Dynamic rule support for ipfw */ -#if !defined(KLD_MODULE) #include "opt_ipfw.h" +#if !defined(KLD_MODULE) #include "opt_ipdivert.h" #include "opt_ipdn.h" #include "opt_inet.h" diff --git a/sys/netinet/ipfw/ip_fw_log.c b/sys/netinet/ipfw/ip_fw_log.c index 64548135c28..2f6e8b61fee 100644 --- a/sys/netinet/ipfw/ip_fw_log.c +++ b/sys/netinet/ipfw/ip_fw_log.c @@ -30,8 +30,8 @@ __FBSDID("$FreeBSD$"); * Logging support for ipfw */ -#if !defined(KLD_MODULE) #include "opt_ipfw.h" +#if !defined(KLD_MODULE) #include "opt_ipdivert.h" #include "opt_ipdn.h" #include "opt_inet.h" diff --git a/sys/netinet/ipfw/ip_fw_pfil.c b/sys/netinet/ipfw/ip_fw_pfil.c index 2aaa8457ea7..c470b1f2092 100644 --- a/sys/netinet/ipfw/ip_fw_pfil.c +++ b/sys/netinet/ipfw/ip_fw_pfil.c @@ -27,8 +27,8 @@ #include __FBSDID("$FreeBSD$"); -#if !defined(KLD_MODULE) #include "opt_ipfw.h" +#if !defined(KLD_MODULE) #include "opt_ipdn.h" #include "opt_inet.h" #ifndef INET diff --git a/sys/netinet/ipfw/ip_fw_sockopt.c b/sys/netinet/ipfw/ip_fw_sockopt.c index 375b9c506e4..610570ba9a7 100644 --- a/sys/netinet/ipfw/ip_fw_sockopt.c +++ b/sys/netinet/ipfw/ip_fw_sockopt.c @@ -33,8 +33,8 @@ __FBSDID("$FreeBSD$"); * the upper half of the ipfw code. */ -#if !defined(KLD_MODULE) #include "opt_ipfw.h" +#if !defined(KLD_MODULE) #include "opt_ipdivert.h" #include "opt_ipdn.h" #include "opt_inet.h" diff --git a/sys/netinet/ipfw/ip_fw_table.c b/sys/netinet/ipfw/ip_fw_table.c index 517622f0217..f72401765a1 100644 --- a/sys/netinet/ipfw/ip_fw_table.c +++ b/sys/netinet/ipfw/ip_fw_table.c @@ -39,8 +39,8 @@ __FBSDID("$FreeBSD$"); * from userland, because operations are typically fast. */ -#if !defined(KLD_MODULE) #include "opt_ipfw.h" +#if !defined(KLD_MODULE) #include "opt_ipdivert.h" #include "opt_ipdn.h" #include "opt_inet.h" From aed378729e4abe96b4bac2142115263b9db1c350 Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Mon, 12 Sep 2011 23:52:55 +0000 Subject: [PATCH 421/452] - Fix a bug that can lead to displaying an incorrect value. (r224210) - Fix an abnormal termination caused by twice of "rtadvctl disable". (r224303) - Use poll() to wait for the control message socket instead of a spin loop. (r224304) - s/cmsg_/cm_/ to avoid conflict with CMSG_* symbols for struct cmsghdr. (r224619) - Ignore an interface that never sent RAs for graceful shut-down. (r224620) - Refine log messages. (r225148) - Fix SIGSEGV when receiving RAs that contain RDNSS and/or DNSSL options. (r225149) Approved by: re (kib) --- usr.sbin/rtadvctl/rtadvctl.c | 19 ++- usr.sbin/rtadvd/control.c | 78 +++++++++---- usr.sbin/rtadvd/control.h | 12 +- usr.sbin/rtadvd/control_client.c | 10 +- usr.sbin/rtadvd/control_client.h | 2 +- usr.sbin/rtadvd/control_server.c | 108 +++++++++-------- usr.sbin/rtadvd/control_server.h | 6 +- usr.sbin/rtadvd/rtadvd.c | 193 ++++++++++++++++--------------- 8 files changed, 240 insertions(+), 188 deletions(-) diff --git a/usr.sbin/rtadvctl/rtadvctl.c b/usr.sbin/rtadvctl/rtadvctl.c index 26bf11dc86f..adc87b59345 100644 --- a/usr.sbin/rtadvctl/rtadvctl.c +++ b/usr.sbin/rtadvctl/rtadvctl.c @@ -260,13 +260,13 @@ action_plgeneric(int action, char *plstr, char *buf) *q++ = '\0'; cp.cp_val = q; } - cm->cm_len += cmsg_pl2bin(msg, &cp); + cm->cm_len += cm_pl2bin(msg, &cp); mysyslog(LOG_DEBUG, "<%s> key=%s, val_len=%d, ifname=%s", __func__,cp.cp_key, cp.cp_val_len, cp.cp_ifname); } - return (cmsg_handler_client(s->si_fd, CM_STATE_MSG_DISPATCH, buf)); + return (cm_handler_client(s->si_fd, CM_STATE_MSG_DISPATCH, buf)); } static int @@ -285,7 +285,7 @@ action_propget(char *argv, struct ctrl_msg_pl *cp) if (error || cm->cm_len <= sizeof(*cm)) return (1); - cmsg_bin2pl(msg, cp); + cm_bin2pl(msg, cp); mysyslog(LOG_DEBUG, "<%s> type=%d, len=%d", __func__, cm->cm_type, cm->cm_len); mysyslog(LOG_DEBUG, "<%s> key=%s, val_len=%d, ifname=%s", @@ -571,9 +571,9 @@ action_show(int argc, char **argv) printf("\n"); - printf("\tMinAdvInterval/MaxAdvInterval: %s/%s\n", - sec2str(rai->rai_mininterval, ssbuf), - sec2str(rai->rai_maxinterval, ssbuf)); + printf("\tMinAdvInterval/MaxAdvInterval: "); + printf("%s/", sec2str(rai->rai_mininterval, ssbuf)); + printf("%s\n", sec2str(rai->rai_maxinterval, ssbuf)); if (rai->rai_linkmtu) printf("\tAdvLinkMTU: %d", rai->rai_linkmtu); else @@ -593,11 +593,10 @@ action_show(int argc, char **argv) printf("Preference: %s\n", rtpref_str[(rai->rai_rtpref >> 3) & 0xff]); - printf("\t" - "ReachableTime: %s, " - "RetransTimer: %s, " + printf("\tReachableTime: %s, ", + sec2str(rai->rai_reachabletime, ssbuf)); + printf("RetransTimer: %s, " "CurHopLimit: %d\n", - sec2str(rai->rai_reachabletime, ssbuf), sec2str(rai->rai_retranstimer, ssbuf), rai->rai_hoplimit); printf("\tAdvIfPrefixes: %s\n", diff --git a/usr.sbin/rtadvd/control.c b/usr.sbin/rtadvd/control.c index 709fae398ad..5e4a68b5bbb 100644 --- a/usr.sbin/rtadvd/control.c +++ b/usr.sbin/rtadvd/control.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -53,12 +54,16 @@ #include "pathnames.h" #include "control.h" +#define CM_RECV_TIMEOUT 30 + int -cmsg_recv(int fd, char *buf) +cm_recv(int fd, char *buf) { int n; struct ctrl_msg_hdr *cm; char *msg; + struct pollfd pfds[1]; + int i; syslog(LOG_DEBUG, "<%s> enter, fd=%d", __func__, fd); @@ -66,35 +71,52 @@ cmsg_recv(int fd, char *buf) cm = (struct ctrl_msg_hdr *)buf; msg = (char *)buf + sizeof(*cm); + pfds[0].fd = fd; + pfds[0].events = POLLIN; + for (;;) { - n = read(fd, cm, sizeof(*cm)); - if (n < 0 && errno == EAGAIN) { - syslog(LOG_DEBUG, - "<%s> waiting...", __func__); + i = poll(pfds, sizeof(pfds)/sizeof(pfds[0]), + CM_RECV_TIMEOUT); + + if (i == 0) + continue; + + if (i < 0) { + syslog(LOG_ERR, "<%s> poll error: %s", + __func__, strerror(errno)); continue; } - break; + + if (pfds[0].revents & POLLIN) { + n = read(fd, cm, sizeof(*cm)); + if (n < 0 && errno == EAGAIN) { + syslog(LOG_DEBUG, + "<%s> waiting...", __func__); + continue; + } + break; + } } if (n != sizeof(*cm)) { syslog(LOG_WARNING, "<%s> received a too small message.", __func__); - goto cmsg_recv_err; + goto cm_recv_err; } if (cm->cm_len > CM_MSG_MAXLEN) { syslog(LOG_WARNING, "<%s> received a too large message.", __func__); - goto cmsg_recv_err; + goto cm_recv_err; } if (cm->cm_version != CM_VERSION) { syslog(LOG_WARNING, "<%s> version mismatch", __func__); - goto cmsg_recv_err; + goto cm_recv_err; } if (cm->cm_type >= CM_TYPE_MAX) { syslog(LOG_WARNING, "<%s> invalid msg type.", __func__); - goto cmsg_recv_err; + goto cm_recv_err; } syslog(LOG_DEBUG, @@ -109,31 +131,45 @@ cmsg_recv(int fd, char *buf) msglen); for (;;) { - n = read(fd, msg, msglen); - if (n < 0 && errno == EAGAIN) { - syslog(LOG_DEBUG, - "<%s> waiting...", __func__); + i = poll(pfds, sizeof(pfds)/sizeof(pfds[0]), + CM_RECV_TIMEOUT); + + if (i == 0) continue; + + if (i < 0) { + syslog(LOG_ERR, "<%s> poll error: %s", + __func__, strerror(errno)); + continue; + } + + if (pfds[0].revents & POLLIN) { + n = read(fd, msg, msglen); + if (n < 0 && errno == EAGAIN) { + syslog(LOG_DEBUG, + "<%s> waiting...", __func__); + continue; + } } break; } if (n != msglen) { syslog(LOG_WARNING, "<%s> payload size mismatch.", __func__); - goto cmsg_recv_err; + goto cm_recv_err; } buf[CM_MSG_MAXLEN - 1] = '\0'; } return (0); -cmsg_recv_err: +cm_recv_err: close(fd); return (-1); } int -cmsg_send(int fd, char *buf) +cm_send(int fd, char *buf) { struct iovec iov[2]; int iovcnt; @@ -304,7 +340,7 @@ csock_open_err: } struct ctrl_msg_pl * -cmsg_bin2pl(char *str, struct ctrl_msg_pl *cp) +cm_bin2pl(char *str, struct ctrl_msg_pl *cp) { size_t len; size_t *lenp; @@ -364,7 +400,7 @@ cmsg_bin2pl(char *str, struct ctrl_msg_pl *cp) } size_t -cmsg_pl2bin(char *str, struct ctrl_msg_pl *cp) +cm_pl2bin(char *str, struct ctrl_msg_pl *cp) { size_t len; size_t *lenp; @@ -427,7 +463,7 @@ cmsg_pl2bin(char *str, struct ctrl_msg_pl *cp) } size_t -cmsg_str2bin(char *bin, void *str, size_t len) +cm_str2bin(char *bin, void *str, size_t len) { struct ctrl_msg_hdr *cm; @@ -445,7 +481,7 @@ cmsg_str2bin(char *bin, void *str, size_t len) } void * -cmsg_bin2str(char *bin, void *str, size_t len) +cm_bin2str(char *bin, void *str, size_t len) { syslog(LOG_DEBUG, "<%s> enter", __func__); diff --git a/usr.sbin/rtadvd/control.h b/usr.sbin/rtadvd/control.h index a7de2ce6ab6..216830266b2 100644 --- a/usr.sbin/rtadvd/control.h +++ b/usr.sbin/rtadvd/control.h @@ -65,10 +65,10 @@ int csock_open(struct sockinfo *, mode_t); int csock_close(struct sockinfo *); int csock_listen(struct sockinfo *); int csock_accept(struct sockinfo *); -int cmsg_send(int, char *); -int cmsg_recv(int, char *); +int cm_send(int, char *); +int cm_recv(int, char *); -size_t cmsg_pl2bin(char *, struct ctrl_msg_pl *); -struct ctrl_msg_pl *cmsg_bin2pl(char *, struct ctrl_msg_pl *); -size_t cmsg_str2bin(char *, void *, size_t); -void *cmsg_bin2str(char *, void *, size_t); +size_t cm_pl2bin(char *, struct ctrl_msg_pl *); +struct ctrl_msg_pl *cm_bin2pl(char *, struct ctrl_msg_pl *); +size_t cm_str2bin(char *, void *, size_t); +void *cm_bin2str(char *, void *, size_t); diff --git a/usr.sbin/rtadvd/control_client.c b/usr.sbin/rtadvd/control_client.c index a78bcc92fab..33efe376872 100644 --- a/usr.sbin/rtadvd/control_client.c +++ b/usr.sbin/rtadvd/control_client.c @@ -55,7 +55,7 @@ #include "control_client.h" int -cmsg_handler_client(int fd, int state, char *buf_orig) +cm_handler_client(int fd, int state, char *buf_orig) { char buf[CM_MSG_MAXLEN]; struct ctrl_msg_hdr *cm; @@ -91,17 +91,17 @@ cmsg_handler_client(int fd, int state, char *buf_orig) break; case CM_STATE_MSG_DISPATCH: cm->cm_version = CM_VERSION; - error = cmsg_send(fd, buf); + error = cm_send(fd, buf); if (error) syslog(LOG_WARNING, - "<%s> cmsg_send()", __func__); + "<%s> cm_send()", __func__); state = CM_STATE_ACK_WAIT; break; case CM_STATE_ACK_WAIT: - error = cmsg_recv(fd, buf); + error = cm_recv(fd, buf); if (error) { syslog(LOG_ERR, - "<%s> cmsg_recv()", __func__); + "<%s> cm_recv()", __func__); close(fd); return (-1); } diff --git a/usr.sbin/rtadvd/control_client.h b/usr.sbin/rtadvd/control_client.h index 89a7d803158..2f50f171ad1 100644 --- a/usr.sbin/rtadvd/control_client.h +++ b/usr.sbin/rtadvd/control_client.h @@ -27,4 +27,4 @@ * */ -int cmsg_handler_client(int, int, char *); +int cm_handler_client(int, int, char *); diff --git a/usr.sbin/rtadvd/control_server.c b/usr.sbin/rtadvd/control_server.c index 7d2ddc510b4..76ca54109bc 100644 --- a/usr.sbin/rtadvd/control_server.c +++ b/usr.sbin/rtadvd/control_server.c @@ -51,6 +51,7 @@ #include "pathnames.h" #include "rtadvd.h" #include "if.h" +#include "config.h" #include "control.h" #include "control_server.h" #include "timer.h" @@ -68,28 +69,28 @@ int is_do_reload(void) { return (do_reload); } int is_do_shutdown(void) { return (do_shutdown); } char *reload_ifname(void) { return (do_reload_ifname); } -#define DEF_PL_HANDLER(key) { #key, cmsg_getprop_##key } +#define DEF_PL_HANDLER(key) { #key, cm_getprop_##key } -static int cmsg_getprop_echo(struct ctrl_msg_pl *); -static int cmsg_getprop_version(struct ctrl_msg_pl *); -static int cmsg_getprop_ifilist(struct ctrl_msg_pl *); -static int cmsg_getprop_ifi(struct ctrl_msg_pl *); -static int cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *); -static int cmsg_getprop_rai(struct ctrl_msg_pl *); -static int cmsg_getprop_pfx(struct ctrl_msg_pl *); -static int cmsg_getprop_rdnss(struct ctrl_msg_pl *); -static int cmsg_getprop_dnssl(struct ctrl_msg_pl *); -static int cmsg_getprop_rti(struct ctrl_msg_pl *); +static int cm_getprop_echo(struct ctrl_msg_pl *); +static int cm_getprop_version(struct ctrl_msg_pl *); +static int cm_getprop_ifilist(struct ctrl_msg_pl *); +static int cm_getprop_ifi(struct ctrl_msg_pl *); +static int cm_getprop_ifi_ra_timer(struct ctrl_msg_pl *); +static int cm_getprop_rai(struct ctrl_msg_pl *); +static int cm_getprop_pfx(struct ctrl_msg_pl *); +static int cm_getprop_rdnss(struct ctrl_msg_pl *); +static int cm_getprop_dnssl(struct ctrl_msg_pl *); +static int cm_getprop_rti(struct ctrl_msg_pl *); -static int cmsg_setprop_reload(struct ctrl_msg_pl *); -static int cmsg_setprop_enable(struct ctrl_msg_pl *); -static int cmsg_setprop_disable(struct ctrl_msg_pl *); +static int cm_setprop_reload(struct ctrl_msg_pl *); +static int cm_setprop_enable(struct ctrl_msg_pl *); +static int cm_setprop_disable(struct ctrl_msg_pl *); static struct dispatch_table { const char *dt_comm; int (*dt_act)(struct ctrl_msg_pl *cp); } getprop_dtable[] = { - { "", cmsg_getprop_echo }, + { "", cm_getprop_echo }, DEF_PL_HANDLER(echo), DEF_PL_HANDLER(version), DEF_PL_HANDLER(ifilist), @@ -103,7 +104,7 @@ static struct dispatch_table { }; static int -cmsg_getprop_echo(struct ctrl_msg_pl *cp) +cm_getprop_echo(struct ctrl_msg_pl *cp) { syslog(LOG_DEBUG, "<%s> enter", __func__); @@ -114,7 +115,7 @@ cmsg_getprop_echo(struct ctrl_msg_pl *cp) } static int -cmsg_getprop_version(struct ctrl_msg_pl *cp) +cm_getprop_version(struct ctrl_msg_pl *cp) { syslog(LOG_DEBUG, "<%s> enter", __func__); @@ -125,7 +126,7 @@ cmsg_getprop_version(struct ctrl_msg_pl *cp) } static int -cmsg_getprop_ifilist(struct ctrl_msg_pl *cp) +cm_getprop_ifilist(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; char *p; @@ -159,7 +160,7 @@ cmsg_getprop_ifilist(struct ctrl_msg_pl *cp) } static int -cmsg_getprop_ifi(struct ctrl_msg_pl *cp) +cm_getprop_ifi(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; char *p; @@ -180,7 +181,7 @@ cmsg_getprop_ifi(struct ctrl_msg_pl *cp) p = malloc(sizeof(*ifi)); if (p == NULL) exit(1); - len = cmsg_str2bin(p, ifi, sizeof(*ifi)); + len = cm_str2bin(p, ifi, sizeof(*ifi)); syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); @@ -194,7 +195,7 @@ cmsg_getprop_ifi(struct ctrl_msg_pl *cp) } static int -cmsg_getprop_rai(struct ctrl_msg_pl *cp) +cm_getprop_rai(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; struct rainfo *rai; @@ -221,7 +222,7 @@ cmsg_getprop_rai(struct ctrl_msg_pl *cp) p = malloc(sizeof(*rai)); if (p == NULL) exit(1); - len = cmsg_str2bin(p, rai, sizeof(*rai)); + len = cm_str2bin(p, rai, sizeof(*rai)); syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); @@ -235,7 +236,7 @@ cmsg_getprop_rai(struct ctrl_msg_pl *cp) } static int -cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *cp) +cm_getprop_ifi_ra_timer(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; struct rainfo *rai; @@ -267,7 +268,7 @@ cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *cp) p = malloc(sizeof(*rtimer)); if (p == NULL) exit(1); - len = cmsg_str2bin(p, rtimer, sizeof(*rtimer)); + len = cm_str2bin(p, rtimer, sizeof(*rtimer)); syslog(LOG_DEBUG, "<%s> len = %zu", __func__, len); @@ -281,7 +282,7 @@ cmsg_getprop_ifi_ra_timer(struct ctrl_msg_pl *cp) } static int -cmsg_getprop_rti(struct ctrl_msg_pl *cp) +cm_getprop_rti(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; struct rainfo *rai; @@ -330,7 +331,7 @@ cmsg_getprop_rti(struct ctrl_msg_pl *cp) } static int -cmsg_getprop_pfx(struct ctrl_msg_pl *cp) +cm_getprop_pfx(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; struct rainfo *rai; @@ -379,7 +380,7 @@ cmsg_getprop_pfx(struct ctrl_msg_pl *cp) } static int -cmsg_getprop_rdnss(struct ctrl_msg_pl *cp) +cm_getprop_rdnss(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; struct rainfo *rai; @@ -448,7 +449,7 @@ cmsg_getprop_rdnss(struct ctrl_msg_pl *cp) } static int -cmsg_getprop_dnssl(struct ctrl_msg_pl *cp) +cm_getprop_dnssl(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; struct rainfo *rai; @@ -516,7 +517,7 @@ cmsg_getprop_dnssl(struct ctrl_msg_pl *cp) } int -cmsg_getprop(struct ctrl_msg_pl *cp) +cm_getprop(struct ctrl_msg_pl *cp) { size_t i; @@ -535,7 +536,7 @@ cmsg_getprop(struct ctrl_msg_pl *cp) } int -cmsg_setprop(struct ctrl_msg_pl *cp) +cm_setprop(struct ctrl_msg_pl *cp) { syslog(LOG_DEBUG, "<%s> enter", __func__); @@ -543,13 +544,13 @@ cmsg_setprop(struct ctrl_msg_pl *cp) return (1); if (strncmp(cp->cp_key, "reload", sizeof("reload")) == 0) - cmsg_setprop_reload(cp); + cm_setprop_reload(cp); else if (strncmp(cp->cp_key, "shutdown", sizeof("shutdown")) == 0) set_do_shutdown(0); else if (strncmp(cp->cp_key, "enable", sizeof("enable")) == 0) - cmsg_setprop_enable(cp); + cm_setprop_enable(cp); else if (strncmp(cp->cp_key, "disable", sizeof("disable")) == 0) - cmsg_setprop_disable(cp); + cm_setprop_disable(cp); else if (strncmp(cp->cp_key, "echo", 8) == 0) ; /* do nothing */ else @@ -559,7 +560,7 @@ cmsg_setprop(struct ctrl_msg_pl *cp) } static int -cmsg_setprop_reload(struct ctrl_msg_pl *cp) +cm_setprop_reload(struct ctrl_msg_pl *cp) { syslog(LOG_DEBUG, "<%s> enter", __func__); @@ -571,7 +572,7 @@ cmsg_setprop_reload(struct ctrl_msg_pl *cp) } static int -cmsg_setprop_enable(struct ctrl_msg_pl *cp) +cm_setprop_enable(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; @@ -595,7 +596,7 @@ cmsg_setprop_enable(struct ctrl_msg_pl *cp) } static int -cmsg_setprop_disable(struct ctrl_msg_pl *cp) +cm_setprop_disable(struct ctrl_msg_pl *cp) { struct ifinfo *ifi; @@ -611,13 +612,22 @@ cmsg_setprop_disable(struct ctrl_msg_pl *cp) return (1); } - ifi->ifi_persist = 0; + if (ifi->ifi_persist == 1) { + ifi->ifi_persist = 0; + rm_ifinfo(ifi); + + /* MC leaving needed here */ + sock_mc_leave(&sock, ifi->ifi_ifindex); + + set_do_reload_ifname(ifi->ifi_ifname); + set_do_reload(0); + } return (0); } int -cmsg_handler_server(int fd) +cm_handler_server(int fd) { int state; char *msg; @@ -644,17 +654,17 @@ cmsg_handler_server(int fd) break; case CM_STATE_MSG_DISPATCH: cm->cm_version = CM_VERSION; - error = cmsg_send(fd, buf); + error = cm_send(fd, buf); if (error) syslog(LOG_WARNING, - "<%s> cmsg_send()", __func__); + "<%s> cm_send()", __func__); state = CM_STATE_EOM; break; case CM_STATE_ACK_WAIT: - error = cmsg_recv(fd, buf); + error = cm_recv(fd, buf); if (error) { syslog(LOG_ERR, - "<%s> cmsg_recv()", __func__); + "<%s> cm_recv()", __func__); close(fd); return (-1); } @@ -676,11 +686,11 @@ cmsg_handler_server(int fd) state = CM_STATE_EOM; break; case CM_STATE_MSG_RECV: - error = cmsg_recv(fd, buf); + error = cm_recv(fd, buf); if (error) { syslog(LOG_ERR, - "<%s> cmsg_recv()", __func__); + "<%s> cm_recv()", __func__); close(fd); return (-1); } @@ -699,22 +709,22 @@ cmsg_handler_server(int fd) cm->cm_len = sizeof(*cm); break; case CM_TYPE_REQ_GET_PROP: - cmsg_bin2pl(msg, &cp); - error = cmsg_getprop(&cp); + cm_bin2pl(msg, &cp); + error = cm_getprop(&cp); if (error) { cm->cm_type = CM_TYPE_ERR; cm->cm_len = sizeof(*cm); } else { cm->cm_type = CM_TYPE_ACK; cm->cm_len = sizeof(*cm); - cm->cm_len += cmsg_pl2bin(msg, &cp); + cm->cm_len += cm_pl2bin(msg, &cp); } if (cp.cp_val != NULL) free(cp.cp_val); break; case CM_TYPE_REQ_SET_PROP: - cmsg_bin2pl(msg, &cp); - error = cmsg_setprop(&cp); + cm_bin2pl(msg, &cp); + error = cm_setprop(&cp); if (error) { cm->cm_type = CM_TYPE_ERR; cm->cm_len = sizeof(*cm); diff --git a/usr.sbin/rtadvd/control_server.h b/usr.sbin/rtadvd/control_server.h index 2aab0cd1113..76fe9cd0d8d 100644 --- a/usr.sbin/rtadvd/control_server.h +++ b/usr.sbin/rtadvd/control_server.h @@ -27,10 +27,10 @@ * */ -int cmsg_getprop(struct ctrl_msg_pl *); -int cmsg_setprop(struct ctrl_msg_pl *); +int cm_getprop(struct ctrl_msg_pl *); +int cm_setprop(struct ctrl_msg_pl *); -int cmsg_handler_server(int); +int cm_handler_server(int); void set_do_reload(int); void set_do_reload_ifname(char *); diff --git a/usr.sbin/rtadvd/rtadvd.c b/usr.sbin/rtadvd/rtadvd.c index 2d94b067031..43e0e71ccfd 100644 --- a/usr.sbin/rtadvd/rtadvd.c +++ b/usr.sbin/rtadvd/rtadvd.c @@ -189,7 +189,7 @@ main(int argc, char *argv[]) dflag++; break; case 'D': - dflag += 2; + dflag += 3; break; case 'f': fflag = 1; @@ -227,10 +227,12 @@ main(int argc, char *argv[]) openlog("rtadvd", logopt, LOG_DAEMON); /* set log level */ - if (dflag > 1) + if (dflag > 2) (void)setlogmask(LOG_UPTO(LOG_DEBUG)); - else if (dflag > 0) + else if (dflag > 1) (void)setlogmask(LOG_UPTO(LOG_INFO)); + else if (dflag > 0) + (void)setlogmask(LOG_UPTO(LOG_NOTICE)); else (void)setlogmask(LOG_UPTO(LOG_ERR)); @@ -251,8 +253,8 @@ main(int argc, char *argv[]) errx(1, "%s already running, pid: %d", getprogname(), otherpid); syslog(LOG_ERR, - "<%s> failed to open the pid log file, run anyway.", - __func__); + "failed to open the pid file %s, run anyway.", + pidfilename); } if (!fflag) daemon(1, 0); @@ -265,7 +267,8 @@ main(int argc, char *argv[]) csock_open(&ctrlsock, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); if (ctrlsock.si_fd == -1) { - syslog(LOG_ERR, "<%s> cannot open control socket", __func__); + syslog(LOG_ERR, "cannot open control socket: %s", + strerror(errno)); exit(1); } @@ -289,7 +292,8 @@ main(int argc, char *argv[]) error = csock_listen(&ctrlsock); if (error) { - syslog(LOG_ERR, "<%s> listen failed", __func__); + syslog(LOG_ERR, "cannot listen control socket: %s", + strerror(errno)); exit(1); } @@ -332,10 +336,11 @@ main(int argc, char *argv[]) if ((i = poll(set, sizeof(set)/sizeof(set[0]), timeout ? (timeout->tv_sec * 1000 + timeout->tv_usec / 1000) : INFTIM)) < 0) { - /* EINTR would occur upon SIGUSR1 for status dump */ + + /* EINTR would occur if a signal was delivered */ if (errno != EINTR) - syslog(LOG_ERR, "<%s> select: %s", - __func__, strerror(errno)); + syslog(LOG_ERR, "poll() failed: %s", + strerror(errno)); continue; } if (i == 0) /* timeout */ @@ -351,9 +356,11 @@ main(int argc, char *argv[]) fd = csock_accept(&ctrlsock); if (fd == -1) - syslog(LOG_ERR, "<%s> accept", __func__); + syslog(LOG_ERR, + "cannot accept() control socket: %s", + strerror(errno)); else { - cmsg_handler_server(fd); + cm_handler_server(fd); close(fd); } } @@ -371,14 +378,14 @@ rtadvd_shutdown(void) if (wait_shutdown) { syslog(LOG_INFO, - "waiting expiration of the all RA timers\n"); + "waiting expiration of the all RA timers."); TAILQ_FOREACH(ifi, &ifilist, ifi_next) { if (ifi->ifi_ra_timer != NULL) break; } if (ifi == NULL) { - syslog(LOG_INFO, "gracefully terminated.\n"); + syslog(LOG_NOTICE, "gracefully terminated."); exit(0); } @@ -386,7 +393,7 @@ rtadvd_shutdown(void) return; } - syslog(LOG_DEBUG, "<%s> cease to be an advertising router\n", + syslog(LOG_DEBUG, "<%s> cease to be an advertising router", __func__); wait_shutdown = 1; @@ -405,6 +412,18 @@ rtadvd_shutdown(void) continue; if (ifi->ifi_ra_timer == NULL) continue; + if (ifi->ifi_ra_lastsent.tv_sec == 0 && + ifi->ifi_ra_lastsent.tv_usec == 0 && + ifi->ifi_ra_timer != NULL) { + /* + * When RA configured but never sent, + * ignore the IF immediately. + */ + rtadvd_remove_timer(ifi->ifi_ra_timer); + ifi->ifi_ra_timer = NULL; + ifi->ifi_state = IFI_STATE_UNCONFIGURED; + continue; + } ifi->ifi_state = IFI_STATE_TRANSITIVE; @@ -419,8 +438,7 @@ rtadvd_shutdown(void) rtadvd_set_timer(&ifi->ifi_ra_timer->rat_tm, ifi->ifi_ra_timer); } - syslog(LOG_INFO, - "<%s> final RA transmission started.\n", __func__); + syslog(LOG_NOTICE, "final RA transmission started."); pidfile_remove(pfh); csock_close(&ctrlsock); @@ -506,20 +524,20 @@ rtmsg_input(struct sockinfo *s) continue; } - syslog(LOG_INFO, "<%s>: if_announcemsg (idx=%d:%d)", + syslog(LOG_DEBUG, "<%s>: if_announcemsg (idx=%d:%d)", __func__, ifan->ifan_index, ifan->ifan_what); switch (ifan->ifan_what) { case IFAN_ARRIVAL: - syslog(LOG_INFO, - "<%s>: interface added (idx=%d)", - __func__, ifan->ifan_index); + syslog(LOG_NOTICE, + "interface added (idx=%d)", + ifan->ifan_index); update_ifinfo(&ifilist, ifan->ifan_index); loadconfig_index(ifan->ifan_index); break; case IFAN_DEPARTURE: - syslog(LOG_INFO, - "<%s>: interface removed (idx=%d)", - __func__, ifan->ifan_index); + syslog(LOG_NOTICE, + "interface removed (idx=%d)", + ifan->ifan_index); rm_ifinfo_index(ifan->ifan_index); /* Clear ifi_ifindex */ @@ -645,16 +663,16 @@ rtmsg_input(struct sockinfo *s) /* check if an interface flag is changed */ if ((oldifflags & IFF_UP) && /* UP to DOWN */ !(ifi->ifi_flags & IFF_UP)) { - syslog(LOG_INFO, - "<%s> interface %s becomes down. stop timer.", - __func__, ifi->ifi_ifname); + syslog(LOG_NOTICE, + "ifi_ifname); rtadvd_remove_timer(ifi->ifi_ra_timer); ifi->ifi_ra_timer = NULL; } else if (!(oldifflags & IFF_UP) && /* DOWN to UP */ (ifi->ifi_flags & IFF_UP)) { - syslog(LOG_INFO, - "<%s> interface %s becomes up. restart timer.", - __func__, ifi->ifi_ifname); + syslog(LOG_NOTICE, + "interface %s becomes up. restart timer.", + ifi->ifi_ifname); ifi->ifi_state = IFI_STATE_TRANSITIVE; ifi->ifi_burstcount = @@ -728,15 +746,11 @@ rtadvd_input(struct sockinfo *s) hlimp = (int *)CMSG_DATA(cm); } if (ifindex == 0) { - syslog(LOG_ERR, - "<%s> failed to get receiving interface", - __func__); + syslog(LOG_ERR, "failed to get receiving interface"); return; } if (hlimp == NULL) { - syslog(LOG_ERR, - "<%s> failed to get receiving hop limit", - __func__); + syslog(LOG_ERR, "failed to get receiving hop limit"); return; } @@ -756,8 +770,7 @@ rtadvd_input(struct sockinfo *s) #ifdef OLDRAWSOCKET if ((size_t)i < sizeof(struct ip6_hdr) + sizeof(struct icmp6_hdr)) { syslog(LOG_ERR, - "<%s> packet size(%d) is too short", - __func__, i); + "packet size(%d) is too short", i); return; } @@ -765,9 +778,7 @@ rtadvd_input(struct sockinfo *s) icp = (struct icmp6_hdr *)(ip + 1); /* XXX: ext. hdr? */ #else if ((size_t)i < sizeof(struct icmp6_hdr)) { - syslog(LOG_ERR, - "<%s> packet size(%zd) is too short", - __func__, i); + syslog(LOG_ERR, "packet size(%zd) is too short", i); return; } @@ -783,9 +794,9 @@ rtadvd_input(struct sockinfo *s) */ if (*hlimp != 255) { syslog(LOG_NOTICE, - "<%s> RS with invalid hop limit(%d) " + "RS with invalid hop limit(%d) " "received from %s on %s", - __func__, *hlimp, + *hlimp, inet_ntop(AF_INET6, &rcvfrom.sin6_addr, ntopbuf, sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); @@ -793,9 +804,9 @@ rtadvd_input(struct sockinfo *s) } if (icp->icmp6_code) { syslog(LOG_NOTICE, - "<%s> RS with invalid ICMP6 code(%d) " + "RS with invalid ICMP6 code(%d) " "received from %s on %s", - __func__, icp->icmp6_code, + icp->icmp6_code, inet_ntop(AF_INET6, &rcvfrom.sin6_addr, ntopbuf, sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); @@ -803,9 +814,8 @@ rtadvd_input(struct sockinfo *s) } if ((size_t)i < sizeof(struct nd_router_solicit)) { syslog(LOG_NOTICE, - "<%s> RS from %s on %s does not have enough " + "RS from %s on %s does not have enough " "length (len = %zd)", - __func__, inet_ntop(AF_INET6, &rcvfrom.sin6_addr, ntopbuf, sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf), i); @@ -820,18 +830,18 @@ rtadvd_input(struct sockinfo *s) */ if (!IN6_IS_ADDR_LINKLOCAL(&rcvfrom.sin6_addr)) { syslog(LOG_NOTICE, - "<%s> RA witn non-linklocal source address " + "RA witn non-linklocal source address " "received from %s on %s", - __func__, inet_ntop(AF_INET6, &rcvfrom.sin6_addr, + inet_ntop(AF_INET6, &rcvfrom.sin6_addr, ntopbuf, sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } if (*hlimp != 255) { syslog(LOG_NOTICE, - "<%s> RA with invalid hop limit(%d) " + "RA with invalid hop limit(%d) " "received from %s on %s", - __func__, *hlimp, + *hlimp, inet_ntop(AF_INET6, &rcvfrom.sin6_addr, ntopbuf, sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); @@ -839,9 +849,9 @@ rtadvd_input(struct sockinfo *s) } if (icp->icmp6_code) { syslog(LOG_NOTICE, - "<%s> RA with invalid ICMP6 code(%d) " + "RA with invalid ICMP6 code(%d) " "received from %s on %s", - __func__, icp->icmp6_code, + icp->icmp6_code, inet_ntop(AF_INET6, &rcvfrom.sin6_addr, ntopbuf, sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); @@ -849,9 +859,8 @@ rtadvd_input(struct sockinfo *s) } if ((size_t)i < sizeof(struct nd_router_advert)) { syslog(LOG_NOTICE, - "<%s> RA from %s on %s does not have enough " + "RA from %s on %s does not have enough " "length (len = %zd)", - __func__, inet_ntop(AF_INET6, &rcvfrom.sin6_addr, ntopbuf, sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf), i); @@ -861,9 +870,8 @@ rtadvd_input(struct sockinfo *s) break; case ICMP6_ROUTER_RENUMBERING: if (mcastif == NULL) { - syslog(LOG_ERR, "<%s> received a router renumbering " - "message, but not allowed to be accepted", - __func__); + syslog(LOG_ERR, "received a router renumbering " + "message, but not allowed to be accepted"); break; } rr_input(i, (struct icmp6_router_renum *)icp, pi, &rcvfrom, @@ -876,8 +884,7 @@ rtadvd_input(struct sockinfo *s) * could receive message after opening the socket and * before setting ICMP6 type filter(see sock_open()). */ - syslog(LOG_ERR, "<%s> invalid icmp type(%d)", - __func__, icp->icmp6_type); + syslog(LOG_ERR, "invalid icmp type(%d)", icp->icmp6_type); return; } @@ -903,6 +910,7 @@ rs_input(int len, struct nd_router_solicit *rs, /* ND option check */ memset(&ndopts, 0, sizeof(ndopts)); + TAILQ_INIT(&ndopts.opt_list); if (nd6_options((struct nd_opt_hdr *)(rs + 1), len - sizeof(struct nd_router_solicit), &ndopts, NDOPT_FLAG_SRCLINKADDR)) { @@ -1030,7 +1038,7 @@ check_accept_rtadv(int idx) break; } if (ifi == NULL) { - syslog(LOG_ERR, + syslog(LOG_DEBUG, "<%s> if (idx=%d) not found. Why?", __func__, idx); return (0); @@ -1048,9 +1056,7 @@ check_accept_rtadv(int idx) * RA_SEND: ip6.forwarding */ if (update_ifinfo_nd_flags(ifi) != 0) { - syslog(LOG_ERR, - "<%s> nd6 flags failed (idx=%d)", - __func__, idx); + syslog(LOG_ERR, "cannot get nd6 flags (idx=%d)", idx); return (0); } @@ -1078,6 +1084,7 @@ ra_input(int len, struct nd_router_advert *nra, /* ND option check */ memset(&ndopts, 0, sizeof(ndopts)); + TAILQ_INIT(&ndopts.opt_list); error = nd6_options((struct nd_opt_hdr *)(nra + 1), len - sizeof(struct nd_router_advert), &ndopts, NDOPT_FLAG_SRCLINKADDR | NDOPT_FLAG_PREFIXINFO | NDOPT_FLAG_MTU | @@ -1108,16 +1115,16 @@ ra_input(int len, struct nd_router_advert *nra, } rai = ifi->ifi_rainfo; ifi->ifi_rainput++; - syslog(LOG_DEBUG, "<%s> ifi->ifi_rainput = %" PRIu64 "\n", __func__, + syslog(LOG_DEBUG, "<%s> ifi->ifi_rainput = %" PRIu64, __func__, ifi->ifi_rainput); /* Cur Hop Limit value */ if (nra->nd_ra_curhoplimit && rai->rai_hoplimit && nra->nd_ra_curhoplimit != rai->rai_hoplimit) { - syslog(LOG_INFO, - "<%s> CurHopLimit inconsistent on %s:" + syslog(LOG_NOTICE, + "CurHopLimit inconsistent on %s:" " %d from %s, %d from us", - __func__, ifi->ifi_ifname, nra->nd_ra_curhoplimit, + ifi->ifi_ifname, nra->nd_ra_curhoplimit, inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf, sizeof(ntopbuf)), rai->rai_hoplimit); inconsistent++; @@ -1125,10 +1132,10 @@ ra_input(int len, struct nd_router_advert *nra, /* M flag */ if ((nra->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED) != rai->rai_managedflg) { - syslog(LOG_INFO, - "<%s> M flag inconsistent on %s:" + syslog(LOG_NOTICE, + "M flag inconsistent on %s:" " %s from %s, %s from us", - __func__, ifi->ifi_ifname, on_off[!rai->rai_managedflg], + ifi->ifi_ifname, on_off[!rai->rai_managedflg], inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf, sizeof(ntopbuf)), on_off[rai->rai_managedflg]); inconsistent++; @@ -1136,10 +1143,10 @@ ra_input(int len, struct nd_router_advert *nra, /* O flag */ if ((nra->nd_ra_flags_reserved & ND_RA_FLAG_OTHER) != rai->rai_otherflg) { - syslog(LOG_INFO, - "<%s> O flag inconsistent on %s:" + syslog(LOG_NOTICE, + "O flag inconsistent on %s:" " %s from %s, %s from us", - __func__, ifi->ifi_ifname, on_off[!rai->rai_otherflg], + ifi->ifi_ifname, on_off[!rai->rai_otherflg], inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf, sizeof(ntopbuf)), on_off[rai->rai_otherflg]); inconsistent++; @@ -1148,10 +1155,10 @@ ra_input(int len, struct nd_router_advert *nra, reachabletime = ntohl(nra->nd_ra_reachable); if (reachabletime && rai->rai_reachabletime && reachabletime != rai->rai_reachabletime) { - syslog(LOG_INFO, - "<%s> ReachableTime inconsistent on %s:" + syslog(LOG_NOTICE, + "ReachableTime inconsistent on %s:" " %d from %s, %d from us", - __func__, ifi->ifi_ifname, reachabletime, + ifi->ifi_ifname, reachabletime, inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf, sizeof(ntopbuf)), rai->rai_reachabletime); inconsistent++; @@ -1160,10 +1167,10 @@ ra_input(int len, struct nd_router_advert *nra, retranstimer = ntohl(nra->nd_ra_retransmit); if (retranstimer && rai->rai_retranstimer && retranstimer != rai->rai_retranstimer) { - syslog(LOG_INFO, - "<%s> RetranceTimer inconsistent on %s:" + syslog(LOG_NOTICE, + "RetranceTimer inconsistent on %s:" " %d from %s, %d from us", - __func__, ifi->ifi_ifname, retranstimer, + ifi->ifi_ifname, retranstimer, inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf, sizeof(ntopbuf)), rai->rai_retranstimer); inconsistent++; @@ -1172,10 +1179,10 @@ ra_input(int len, struct nd_router_advert *nra, if (ndopts.opt_mtu) { mtu = ntohl(ndopts.opt_mtu->nd_opt_mtu_mtu); if (mtu && rai->rai_linkmtu && mtu != rai->rai_linkmtu) { - syslog(LOG_INFO, - "<%s> MTU option value inconsistent on %s:" + syslog(LOG_NOTICE, + "MTU option value inconsistent on %s:" " %d from %s, %d from us", - __func__, ifi->ifi_ifname, mtu, + ifi->ifi_ifname, mtu, inet_ntop(AF_INET6, &from->sin6_addr, ntopbuf, sizeof(ntopbuf)), rai->rai_linkmtu); inconsistent++; @@ -1684,18 +1691,18 @@ ra_output(struct ifinfo *ifi) ifi->ifi_ifname); if (rai->rai_lifetime != 0) { - if (check_accept_rtadv(ifi->ifi_ifindex)) { - syslog(LOG_INFO, - "<%s> non-zero lifetime RA " - "on RA receiving interface %s." - " Ignored.", __func__, ifi->ifi_ifname); + if (getinet6sysctl(IPV6CTL_FORWARDING) == 0) { + syslog(LOG_ERR, + "non-zero lifetime RA " + "but net.inet6.ip6.forwarding=0. " + "Ignored."); return; } - if (getinet6sysctl(IPV6CTL_FORWARDING) == 0) { - syslog(LOG_INFO, - "<%s> non-zero lifetime RA " - "but net.inet6.ip6.forwarding=0. " - "Ignored.", __func__); + if (check_accept_rtadv(ifi->ifi_ifindex)) { + syslog(LOG_ERR, + "non-zero lifetime RA " + "on RA receiving interface %s." + " Ignored.", ifi->ifi_ifname); return; } } From 489e04d0da8760aa2f798361de7b73b6a735a1b4 Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Mon, 12 Sep 2011 23:55:23 +0000 Subject: [PATCH 422/452] - Add ":origin" label to the interface id for resolvconf(8). (r223149) - Add -u option to enable adding :[RA-source-address] to the interface id. (r223149) - s/INET6_ADDRSTRLEN/sizeof(ntopbuf)/ (r223149) - Fix a bug that can prevent -D from being overridden by -d. (r223149) - /-P pidfile/-p pidfile/ for consistency with rtadvd(8). (r223149) - Fix -F flag handling to support receiving RAs even when ip6.forwarding=1. (r225150) Approved by: re (kib) --- usr.sbin/rtsold/rtsol.c | 133 ++++++++++++++++++++++++++++----------- usr.sbin/rtsold/rtsold.8 | 28 ++++++--- usr.sbin/rtsold/rtsold.c | 49 +++++++++++++-- usr.sbin/rtsold/rtsold.h | 6 +- 4 files changed, 164 insertions(+), 52 deletions(-) diff --git a/usr.sbin/rtsold/rtsol.c b/usr.sbin/rtsold/rtsol.c index 13845f3231d..850e5d9c5dd 100644 --- a/usr.sbin/rtsold/rtsol.c +++ b/usr.sbin/rtsold/rtsol.c @@ -73,6 +73,7 @@ static struct sockaddr_in6 from; static int rcvcmsglen; int rssock; +static char rsid[IFNAMSIZ + 1 + sizeof(DNSINFO_ORIGIN_LABEL) + 1 + NI_MAXHOST]; struct ifinfo_head_t ifinfo_head = TAILQ_HEAD_INITIALIZER(ifinfo_head); @@ -82,14 +83,18 @@ static const struct sockaddr_in6 sin6_allrouters = { .sin6_addr = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT, }; -static void call_script(const int, const char *const *, void *); +static void call_script(const int, const char *const *, + struct script_msg_head_t *); static size_t dname_labeldec(char *, size_t, const char *); static int safefile(const char *); static struct ra_opt *find_raopt(struct rainfo *, int, void *, size_t); +static int ra_opt_rdnss_dispatch(struct ifinfo *, struct rainfo *, + struct script_msg_head_t *, struct script_msg_head_t *); +static char *make_rsid(const char *, const char *, struct rainfo *); #define _ARGS_OTHER otherconf_script, ifi->ifname -#define _ARGS_RESADD resolvconf_script, "-a", ifi->ifname -#define _ARGS_RESDEL resolvconf_script, "-d", ifi->ifname +#define _ARGS_RESADD resolvconf_script, "-a", rsid +#define _ARGS_RESDEL resolvconf_script, "-d", rsid #define CALL_SCRIPT(name, sm_head) \ do { \ @@ -306,7 +311,7 @@ rtsol_input(int s) warnmsg(LOG_ERR, __func__, "invalid icmp type(%d) from %s on %s", icp->icmp6_type, inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, - INET6_ADDRSTRLEN), + sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } @@ -315,7 +320,7 @@ rtsol_input(int s) warnmsg(LOG_INFO, __func__, "invalid icmp code(%d) from %s on %s", icp->icmp6_code, inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, - INET6_ADDRSTRLEN), + sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } @@ -325,7 +330,7 @@ rtsol_input(int s) "invalid RA with hop limit(%d) from %s on %s", *hlimp, inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, - INET6_ADDRSTRLEN), + sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } @@ -334,7 +339,7 @@ rtsol_input(int s) warnmsg(LOG_INFO, __func__, "invalid RA with non link-local source from %s on %s", inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, - INET6_ADDRSTRLEN), + sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } @@ -345,14 +350,14 @@ rtsol_input(int s) warnmsg(LOG_INFO, __func__, "received RA from %s on an unexpected IF(%s)", inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, - INET6_ADDRSTRLEN), + sizeof(ntopbuf)), if_indextoname(pi->ipi6_ifindex, ifnamebuf)); return; } warnmsg(LOG_DEBUG, __func__, "received RA from %s on %s, state is %d", - inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, INET6_ADDRSTRLEN), + inet_ntop(AF_INET6, &from.sin6_addr, ntopbuf, sizeof(ntopbuf)), ifi->ifname, ifi->state); nd_ra = (struct nd_router_advert *)icp; @@ -378,6 +383,8 @@ rtsol_input(int s) ELM_MALLOC(rai, exit(1)); rai->rai_ifinfo = ifi; TAILQ_INIT(&rai->rai_ra_opt); + rai->rai_saddr.sin6_family = AF_INET6; + rai->rai_saddr.sin6_len = sizeof(rai->rai_saddr); memcpy(&rai->rai_saddr.sin6_addr, &from.sin6_addr, sizeof(rai->rai_saddr.sin6_addr)); newent_rai = 1; @@ -406,19 +413,19 @@ rtsol_input(int s) "too short RDNSS option" "in RA from %s was ignored.", inet_ntop(AF_INET6, &from.sin6_addr, - ntopbuf, INET6_ADDRSTRLEN)); + ntopbuf, sizeof(ntopbuf))); break; } addr = (struct in6_addr *)(raoptp + sizeof(*rdnss)); while ((char *)addr < (char *)RA_OPT_NEXT_HDR(raoptp)) { if (inet_ntop(AF_INET6, addr, ntopbuf, - INET6_ADDRSTRLEN) == NULL) { + sizeof(ntopbuf)) == NULL) { warnmsg(LOG_INFO, __func__, "an invalid address in RDNSS option" " in RA from %s was ignored.", inet_ntop(AF_INET6, &from.sin6_addr, - ntopbuf, INET6_ADDRSTRLEN)); + ntopbuf, sizeof(ntopbuf))); addr++; continue; } @@ -482,7 +489,7 @@ rtsol_input(int s) "too short DNSSL option" "in RA from %s was ignored.", inet_ntop(AF_INET6, &from.sin6_addr, - ntopbuf, INET6_ADDRSTRLEN)); + ntopbuf, sizeof(ntopbuf))); break; } @@ -568,10 +575,11 @@ ra_opt_handler(struct ifinfo *ifi) struct rainfo *rai; struct script_msg *smp1, *smp2, *smp3; struct timeval now; - TAILQ_HEAD(, script_msg) sm_rdnss_head = - TAILQ_HEAD_INITIALIZER(sm_rdnss_head); - TAILQ_HEAD(, script_msg) sm_dnssl_head = - TAILQ_HEAD_INITIALIZER(sm_dnssl_head); + struct script_msg_head_t sm_rdnss_head = + TAILQ_HEAD_INITIALIZER(sm_rdnss_head); + struct script_msg_head_t sm_dnssl_head = + TAILQ_HEAD_INITIALIZER(sm_dnssl_head); + int dcount, dlen; dcount = 0; @@ -658,17 +666,69 @@ free2: free1: free(smp1); } + /* Call the script for each information source. */ + if (uflag) + ra_opt_rdnss_dispatch(ifi, rai, &sm_rdnss_head, + &sm_dnssl_head); } - /* Add \n for DNSSL list. */ - if (!TAILQ_EMPTY(&sm_dnssl_head)) { - ELM_MALLOC(smp1, goto ra_opt_handler_freeit); - smp1->sm_msg = resstr_nl; - TAILQ_INSERT_TAIL(&sm_dnssl_head, smp1, sm_next); - } - TAILQ_CONCAT(&sm_rdnss_head, &sm_dnssl_head, sm_next); + /* Call the script for each interface. */ + if (!uflag) + ra_opt_rdnss_dispatch(ifi, NULL, &sm_rdnss_head, + &sm_dnssl_head); + return (0); +} - if (!TAILQ_EMPTY(&sm_rdnss_head)) - CALL_SCRIPT(RESADD, &sm_rdnss_head); +char * +make_rsid(const char *ifname, const char *origin, struct rainfo *rai) +{ + char hbuf[NI_MAXHOST]; + + if (rai == NULL) + sprintf(rsid, "%s:%s", ifname, origin); + else { + if (!IN6_IS_ADDR_LINKLOCAL(&rai->rai_saddr.sin6_addr)) + return (NULL); + if (getnameinfo((struct sockaddr *)&rai->rai_saddr, + rai->rai_saddr.sin6_len, hbuf, sizeof(hbuf), NULL, 0, + NI_NUMERICHOST) != 0) + return (NULL); + sprintf(rsid, "%s:%s:[%s]", ifname, origin, hbuf); + } + warnmsg(LOG_DEBUG, __func__, "rsid = [%s]", rsid); + return (rsid); +} + +int +ra_opt_rdnss_dispatch(struct ifinfo *ifi, + struct rainfo *rai, + struct script_msg_head_t *sm_rdnss_head, + struct script_msg_head_t *sm_dnssl_head) +{ + const char *r; + struct script_msg *smp1; + int error; + + error = 0; + /* Add \n for DNSSL list. */ + if (!TAILQ_EMPTY(sm_dnssl_head)) { + ELM_MALLOC(smp1, goto ra_opt_rdnss_freeit); + smp1->sm_msg = resstr_nl; + TAILQ_INSERT_TAIL(sm_dnssl_head, smp1, sm_next); + } + TAILQ_CONCAT(sm_rdnss_head, sm_dnssl_head, sm_next); + + if (rai != NULL && uflag) + r = make_rsid(ifi->ifname, DNSINFO_ORIGIN_LABEL, rai); + else + r = make_rsid(ifi->ifname, DNSINFO_ORIGIN_LABEL, NULL); + if (r == NULL) { + warnmsg(LOG_ERR, __func__, "make_rsid() failed. " + "Script was not invoked."); + error = 1; + goto ra_opt_rdnss_freeit; + } + if (!TAILQ_EMPTY(sm_rdnss_head)) + CALL_SCRIPT(RESADD, sm_rdnss_head); else if (ifi->ifi_rdnss == IFI_DNSOPT_STATE_RECEIVED || ifi->ifi_dnssl == IFI_DNSOPT_STATE_RECEIVED) { CALL_SCRIPT(RESDEL, NULL); @@ -676,21 +736,21 @@ free1: ifi->ifi_dnssl = IFI_DNSOPT_STATE_NOINFO; } -ra_opt_handler_freeit: +ra_opt_rdnss_freeit: /* Clear script message queue. */ - if (!TAILQ_EMPTY(&sm_rdnss_head)) { - while ((smp1 = TAILQ_FIRST(&sm_rdnss_head)) != NULL) { - TAILQ_REMOVE(&sm_rdnss_head, smp1, sm_next); + if (!TAILQ_EMPTY(sm_rdnss_head)) { + while ((smp1 = TAILQ_FIRST(sm_rdnss_head)) != NULL) { + TAILQ_REMOVE(sm_rdnss_head, smp1, sm_next); free(smp1); } } - if (!TAILQ_EMPTY(&sm_dnssl_head)) { - while ((smp1 = TAILQ_FIRST(&sm_dnssl_head)) != NULL) { - TAILQ_REMOVE(&sm_dnssl_head, smp1, sm_next); + if (!TAILQ_EMPTY(sm_dnssl_head)) { + while ((smp1 = TAILQ_FIRST(sm_dnssl_head)) != NULL) { + TAILQ_REMOVE(sm_dnssl_head, smp1, sm_next); free(smp1); } } - return (0); + return (error); } static struct ra_opt * @@ -709,19 +769,18 @@ find_raopt(struct rainfo *rai, int type, void *msg, size_t len) } static void -call_script(const int argc, const char *const argv[], void *head) +call_script(const int argc, const char *const argv[], + struct script_msg_head_t *sm_head) { const char *scriptpath; int fd[2]; int error; pid_t pid, wpid; - TAILQ_HEAD(, script_msg) *sm_head; if ((scriptpath = argv[0]) == NULL) return; fd[0] = fd[1] = -1; - sm_head = head; if (sm_head != NULL && !TAILQ_EMPTY(sm_head)) { error = pipe(fd); if (error) { diff --git a/usr.sbin/rtsold/rtsold.8 b/usr.sbin/rtsold/rtsold.8 index 8eb25390299..97b60003aea 100644 --- a/usr.sbin/rtsold/rtsold.8 +++ b/usr.sbin/rtsold/rtsold.8 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 28, 2011 +.Dd June 14, 2011 .Dt RTSOLD 8 .Os .\" @@ -39,24 +39,24 @@ .\" .Sh SYNOPSIS .Nm -.Op Fl dDfFm1 +.Op Fl dDfFmu1 .Op Fl O Ar script-name -.Op Fl P Ar pidfile +.Op Fl p Ar pidfile .Op Fl R Ar script-name .Ar interface ... .Nm -.Op Fl dDfFm1 +.Op Fl dDfFmu1 .Op Fl O Ar script-name -.Op Fl P Ar pidfile +.Op Fl p Ar pidfile .Op Fl R Ar script-name .Fl a .Nm rtsol -.Op Fl dD +.Op Fl dDu .Op Fl O Ar script-name .Op Fl R Ar script-name .Ar interface ... .Nm rtsol -.Op Fl dD +.Op Fl dDu .Op Fl O Ar script-name .Op Fl R Ar script-name .Fl a @@ -227,7 +227,7 @@ configuration. must be the absolute path from root to the script file, be a regular file, and be created by the same owner who runs .Nm . -.It Fl P Ar pidfile +.It Fl p Ar pidfile Writes the process ID of .Nm to @@ -245,6 +245,18 @@ standard input of this script. The .Xr resolvconf 8 script is used by default. +.It Fl u +Specifies whether adding the source address of Router Advertisement +messages to the interface name in an argument of the RDNSS and DNSSL +script. +.Pp +If +.Fl u +is specified, the interface name in the script argument will be +.Ql ifname:slaac:[RA-source-address] . +.Pp +If not, it will be +.Ql ifname:slaac . .El .Sh FILES .Bl -tag -width /var/run/rtsold.dump -compact diff --git a/usr.sbin/rtsold/rtsold.c b/usr.sbin/rtsold/rtsold.c index 94046a1af23..7df0ec6d05f 100644 --- a/usr.sbin/rtsold/rtsold.c +++ b/usr.sbin/rtsold/rtsold.c @@ -75,6 +75,7 @@ static int fflag = 0; int Fflag = 0; /* force setting sysctl parameters */ int aflag = 0; int dflag = 0; +int uflag = 0; const char *otherconf_script; const char *resolvconf_script = "/sbin/resolvconf"; @@ -129,10 +130,10 @@ main(int argc, char **argv) #ifndef SMALL /* rtsold */ - opts = "adDfFm1O:P:R:"; + opts = "adDfFm1O:p:R:u"; #else /* rtsol */ - opts = "adDFO:P:R:"; + opts = "adDFO:R:u"; fflag = 1; once = 1; #endif @@ -144,10 +145,10 @@ main(int argc, char **argv) aflag = 1; break; case 'd': - dflag = 1; + dflag += 1; break; case 'D': - dflag = 2; + dflag += 2; break; case 'f': fflag = 1; @@ -164,12 +165,15 @@ main(int argc, char **argv) case 'O': otherconf_script = optarg; break; - case 'P': + case 'p': pidfilename = optarg; break; case 'R': resolvconf_script = optarg; break; + case 'u': + uflag = 1; + break; default: usage(); exit(1); @@ -184,8 +188,13 @@ main(int argc, char **argv) } /* set log level */ - if (dflag == 0) + if (dflag > 1) + log_upto = LOG_DEBUG; + else if (dflag > 0) + log_upto = LOG_INFO; + else log_upto = LOG_NOTICE; + if (!fflag) { char *ident; @@ -216,6 +225,7 @@ main(int argc, char **argv) srandom((u_long)time(NULL)); #endif +#if (__FreeBSD_version < 900000) if (Fflag) { setinet6sysctl(IPV6CTL_FORWARDING, 0); } else { @@ -223,6 +233,7 @@ main(int argc, char **argv) if (getinet6sysctl(IPV6CTL_FORWARDING)) warnx("kernel is configured as a router, not a host"); } +#endif #ifndef SMALL /* initialization to dump internal status to a file */ @@ -402,6 +413,32 @@ ifconfig(char *ifname) return (-1); } + if (Fflag) { + struct in6_ndireq nd; + int s; + + if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { + warnmsg(LOG_ERR, __func__, "socket() failed."); + return (-1); + } + memset(&nd, 0, sizeof(nd)); + strlcpy(nd.ifname, ifname, sizeof(nd.ifname)); + if (ioctl(s, SIOCGIFINFO_IN6, (caddr_t)&nd) < 0) { + warnmsg(LOG_ERR, __func__, + "cannot get accept_rtadv flag"); + close(s); + return (-1); + } + nd.ndi.flags |= ND6_IFF_ACCEPT_RTADV; + if (ioctl(s, SIOCSIFINFO_IN6, (caddr_t)&nd) < 0) { + warnmsg(LOG_ERR, __func__, + "cannot set accept_rtadv flag"); + close(s); + return (-1); + } + close(s); + } + if ((ifi = malloc(sizeof(*ifi))) == NULL) { warnmsg(LOG_ERR, __func__, "memory allocation failed"); free(sdl); diff --git a/usr.sbin/rtsold/rtsold.h b/usr.sbin/rtsold/rtsold.h index 0aa9b4f0115..3ab010f1914 100644 --- a/usr.sbin/rtsold/rtsold.h +++ b/usr.sbin/rtsold/rtsold.h @@ -37,6 +37,8 @@ struct script_msg { char *sm_msg; }; +TAILQ_HEAD(script_msg_head_t, script_msg); + struct ra_opt { TAILQ_ENTRY(ra_opt) rao_next; @@ -60,7 +62,7 @@ struct ifinfo { TAILQ_ENTRY(ifinfo) ifi_next; /* pointer to the next interface */ struct sockaddr_dl *sdl; /* link-layer address */ - char ifname[IF_NAMESIZE]; /* interface name */ + char ifname[IFNAMSIZ]; /* interface name */ u_int32_t linkid; /* link ID of this interface */ int active; /* interface status */ int probeinterval; /* interval of probe timer (if necessary) */ @@ -96,6 +98,7 @@ struct ifinfo { /* Interface list */ extern TAILQ_HEAD(ifinfo_head_t, ifinfo) ifinfo_head; +#define DNSINFO_ORIGIN_LABEL "slaac" /* * RFC 3542 API deprecates IPV6_PKTINFO in favor of * IPV6_RECVPKTINFO @@ -126,6 +129,7 @@ extern struct timeval tm_max; extern int dflag; extern int aflag; extern int Fflag; +extern int uflag; extern const char *otherconf_script; extern const char *resolvconf_script; extern int ifconfig(char *); From 049087a0f37650cc9829f6709f3108829ded2177 Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Tue, 13 Sep 2011 00:06:11 +0000 Subject: [PATCH 423/452] Add $ipv6_cpe_wanif to enable functionality required for IPv6 CPE (r225485). When setting an interface name to it, the following configurations will be enabled: 1. "no_radr" is set to all IPv6 interfaces automatically. 2. "-no_radr accept_rtadv" will be set only for $ipv6_cpe_wanif. This is done just before evaluating $ifconfig_IF_ipv6 in the rc.d scripts (this means you can manually supersede this configuration if necessary). 3. The node will add RA-sending routers to the default router list even if net.inet6.ip6.forwarding=1. This mode is added to conform to RFC 6204 (a router which connects the end-user network to a service provider network). To enable packet forwarding, you still need to set ipv6_gateway_enable=YES. Note that accepting router entries into the default router list when packet forwarding capability and a routing daemon are enabled can result in messing up the routing table. To minimize such unexpected behaviors, "no_radr" is set on all interfaces but $ipv6_cpe_wanif. Approved by: re (bz) --- etc/defaults/rc.conf | 3 +++ etc/network.subr | 6 ++++++ etc/rc.d/netoptions | 13 +++++++++++++ sys/netinet6/in6.h | 4 +++- sys/netinet6/in6_proto.c | 5 +++++ sys/netinet6/ip6_var.h | 3 +++ sys/netinet6/nd6_rtr.c | 10 ++++++---- 7 files changed, 39 insertions(+), 5 deletions(-) diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf index d467eaac6c1..d959f20ca72 100644 --- a/etc/defaults/rc.conf +++ b/etc/defaults/rc.conf @@ -468,6 +468,9 @@ ipv6_static_routes="" # Set to static route list (or leave empty). # route toward loopback interface. #ipv6_route_xxx="fec0:0000:0000:0006:: -prefixlen 64 ::1" ipv6_gateway_enable="NO" # Set to YES if this host will be a gateway. +ipv6_cpe_wanif="NO" # Set to the upstram interface name if this + # node will work as a router to forward IPv6 + # packets not explicitly addressed to itself. ipv6_privacy="NO" # Use privacy address on RA-receiving IFs # (RFC 4193) diff --git a/etc/network.subr b/etc/network.subr index 44a58925c70..ae3db56adb3 100644 --- a/etc/network.subr +++ b/etc/network.subr @@ -113,6 +113,12 @@ ifconfig_up() ;; esac + case $ipv6_cpe_wanif in + $1) + _ipv6_opts="${_ipv6_opts} -no_radr accept_rtadv" + ;; + esac + if [ -n "${_ipv6_opts}" ]; then ifconfig $1 inet6 ${_ipv6_opts} fi diff --git a/etc/rc.d/netoptions b/etc/rc.d/netoptions index 09ed6ef1c57..1547ade471e 100755 --- a/etc/rc.d/netoptions +++ b/etc/rc.d/netoptions @@ -106,6 +106,19 @@ netoptions_inet6() ${SYSCTL} net.inet6.ip6.use_tempaddr=1 >/dev/null ${SYSCTL} net.inet6.ip6.prefer_tempaddr=1 >/dev/null fi + + case $ipv6_cpe_wanif in + ""|[Nn][Oo]|[Nn][Oo][Nn][Ee]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) + ${SYSCTL} net.inet6.ip6.no_radr=0 >/dev/null + ${SYSCTL} net.inet6.ip6.rfc6204w3=0 >/dev/null + ;; + *) + netoptions_init + echo -n " IPv6 CPE WANIF=${ipv6_cpe_wanif}" + ${SYSCTL} net.inet6.ip6.no_radr=1 >/dev/null + ${SYSCTL} net.inet6.ip6.rfc6204w3=1 >/dev/null + ;; + esac } load_rc_config $name diff --git a/sys/netinet6/in6.h b/sys/netinet6/in6.h index 5b552c9158d..1040d90e94a 100644 --- a/sys/netinet6/in6.h +++ b/sys/netinet6/in6.h @@ -614,7 +614,9 @@ struct ip6_mtuinfo { #define IPV6CTL_NO_RADR 48 /* No defroute from RA */ #define IPV6CTL_NORBIT_RAIF 49 /* Disable R-bit in NA on RA * receiving IF. */ -#define IPV6CTL_MAXID 50 +#define IPV6CTL_RFC6204W3 50 /* Accept defroute even when forwarding + enabled */ +#define IPV6CTL_MAXID 51 #endif /* __BSD_VISIBLE */ /* diff --git a/sys/netinet6/in6_proto.c b/sys/netinet6/in6_proto.c index e03e6405d5f..254ec88523b 100644 --- a/sys/netinet6/in6_proto.c +++ b/sys/netinet6/in6_proto.c @@ -399,6 +399,7 @@ VNET_DEFINE(int, ip6_defmcasthlim) = IPV6_DEFAULT_MULTICAST_HOPS; VNET_DEFINE(int, ip6_accept_rtadv) = 0; VNET_DEFINE(int, ip6_no_radr) = 0; VNET_DEFINE(int, ip6_norbit_raif) = 0; +VNET_DEFINE(int, ip6_rfc6204w3) = 0; VNET_DEFINE(int, ip6_maxfragpackets); /* initialized in frag6.c:frag6_init() */ VNET_DEFINE(int, ip6_maxfrags); /* initialized in frag6.c:frag6_init() */ VNET_DEFINE(int, ip6_log_interval) = 5; @@ -536,6 +537,10 @@ SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_NORBIT_RAIF, norbit_raif, CTLFLAG_RW, &VNET_NAME(ip6_norbit_raif), 0, "Always set 0 to R flag in ICMPv6 NA messages when accepting RA" " on the interface."); +SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_RFC6204W3, rfc6204w3, + CTLFLAG_RW, &VNET_NAME(ip6_rfc6204w3), 0, + "Accept the default router list from ICMPv6 RA messages even " + "when packet forwarding enabled."); SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_KEEPFAITH, keepfaith, CTLFLAG_RW, &VNET_NAME(ip6_keepfaith), 0, ""); SYSCTL_VNET_INT(_net_inet6_ip6, IPV6CTL_LOG_INTERVAL, log_interval, diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h index dbfba9a0b9e..c9d35e0b03d 100644 --- a/sys/netinet6/ip6_var.h +++ b/sys/netinet6/ip6_var.h @@ -319,6 +319,8 @@ VNET_DECLARE(int, ip6_accept_rtadv); /* Acts as a host not a router */ VNET_DECLARE(int, ip6_no_radr); /* No defroute from RA */ VNET_DECLARE(int, ip6_norbit_raif); /* Disable R-bit in NA on RA * receiving IF. */ +VNET_DECLARE(int, ip6_rfc6204w3); /* Accept defroute from RA even when + forwarding enabled */ VNET_DECLARE(int, ip6_keepfaith); /* Firewall Aided Internet Translator */ VNET_DECLARE(int, ip6_log_interval); VNET_DECLARE(time_t, ip6_log_time); @@ -332,6 +334,7 @@ VNET_DECLARE(int, ip6_dad_count); /* DupAddrDetectionTransmits */ #define V_ip6_accept_rtadv VNET(ip6_accept_rtadv) #define V_ip6_no_radr VNET(ip6_no_radr) #define V_ip6_norbit_raif VNET(ip6_norbit_raif) +#define V_ip6_rfc6204w3 VNET(ip6_rfc6204w3) #define V_ip6_keepfaith VNET(ip6_keepfaith) #define V_ip6_log_interval VNET(ip6_log_interval) #define V_ip6_log_time VNET(ip6_log_time) diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c index e791e2e3a7b..5352dd5a2f6 100644 --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -269,11 +269,13 @@ nd6_ra_input(struct mbuf *m, int off, int icmp6len) dr0.rtaddr = saddr6; dr0.flags = nd_ra->nd_ra_flags_reserved; /* - * Effectively-disable the route in the RA packet - * when ND6_IFF_NO_RADR on the receiving interface or - * ip6.forwarding=1. + * Effectively-disable routes from RA messages when + * ND6_IFF_NO_RADR enabled on the receiving interface or + * (ip6.forwarding == 1 && ip6.rfc6204w3 != 1). */ - if (ndi->flags & ND6_IFF_NO_RADR || V_ip6_forwarding) + if (ndi->flags & ND6_IFF_NO_RADR) + dr0.rtlifetime = 0; + else if (V_ip6_forwarding && !V_ip6_rfc6204w3) dr0.rtlifetime = 0; else dr0.rtlifetime = ntohs(nd_ra->nd_ra_router_lifetime); From d4358e709f011e81c52fe142c8a35d569a5ac2db Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Tue, 13 Sep 2011 00:09:47 +0000 Subject: [PATCH 424/452] - Add an warning when ifconfig_IF_ipv6 has no inet6 keyword in front of an IPv6 address. (r225489) - Use eval for ${ifconfig_args} to fix an issue fixed in r223506. (r225489) Approved by: re (bz) --- etc/network.subr | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/etc/network.subr b/etc/network.subr index ae3db56adb3..8e9036d9a5b 100644 --- a/etc/network.subr +++ b/etc/network.subr @@ -126,8 +126,16 @@ ifconfig_up() # ifconfig_IF_ipv6 ifconfig_args=`ifconfig_getargs $1 ipv6` if [ -n "${ifconfig_args}" ]; then + # backward compatibility: inet6 keyword + case "${ifconfig_args}" in + :*|[0-9a-fA-F]*:*) + warn "\$ifconfig_$1_ipv6 needs " \ + "\"inet6\" keyword for an IPv6 address." + ifconfig_args="inet6 ${ifconfig_args}" + ;; + esac ifconfig $1 inet6 -ifdisabled - ifconfig $1 ${ifconfig_args} + eval ifconfig $1 ${ifconfig_args} _cfg=0 fi @@ -137,7 +145,7 @@ ifconfig_up() warn "\$ipv6_ifconfig_$1 is obsolete." \ " Use ifconfig_$1_ipv6 instead." ifconfig $1 inet6 -ifdisabled - ifconfig $1 inet6 ${ifconfig_args} + eval ifconfig $1 inet6 ${ifconfig_args} _cfg=0 fi fi From 093c93c350a0e9ff9f551e3ed38a5f02d3096a76 Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Tue, 13 Sep 2011 02:41:09 +0000 Subject: [PATCH 425/452] Import of openresolv 3.4.4. Obtained from: http://roy.marples.name/projects/openresolv Approved by: re (kib) --- Makefile | 2 +- configure | 2 +- dnsmasq.in | 35 ++++++++++++++++---------- libc.in | 24 +++++++++--------- named.in | 37 ++++++++++++++++----------- pdnsd.in | 40 +++++++++++++++++++----------- resolvconf.8.in | 22 ++++++++--------- resolvconf.conf.5.in | 6 ++--- resolvconf.in | 59 +++++++++++++++++++++++++++++++++++++------- unbound.in | 25 +++++++++++++------ 10 files changed, 166 insertions(+), 86 deletions(-) diff --git a/Makefile b/Makefile index e4e3498ac9f..3ab015fc28b 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ include config.mk NAME= openresolv -VERSION= 3.4.1 +VERSION= 3.4.4 PKG= ${NAME}-${VERSION} INSTALL?= install diff --git a/configure b/configure index 39bdddb6541..13b68e67418 100644 --- a/configure +++ b/configure @@ -9,7 +9,7 @@ TARGET= RESTARTCMD= RCDIR= -for x; do +for x do opt=${x%%=*} var=${x#*=} case "$opt" in diff --git a/dnsmasq.in b/dnsmasq.in index 16788662830..9c7fdeef967 100644 --- a/dnsmasq.in +++ b/dnsmasq.in @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 2007-2009 Roy Marples +# Copyright (c) 2007-2011 Roy Marples # All rights reserved # dnsmasq subscriber for resolvconf @@ -30,12 +30,14 @@ . "@SYSCONFDIR@/resolvconf.conf" || exit 1 [ -z "$dnsmasq_conf" -a -z "$dnsmasq_resolv" ] && exit 0 [ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" +NL=" +" : ${dnsmasq_pid:=/var/run/dnsmasq.pid} [ -s "$dnsmasq_pid" ] || dnsmasq_pid=/var/run/dnsmasq/dnsmasq.pid : ${dnsmasq_service:=dnsmasq} : ${dnsmasq_restart:=@RESTARTCMD ${dnsmasq_service}@} -newconf="# Generated by resolvconf\n" +newconf="# Generated by resolvconf$NL" newresolv="$newconf" # Using dbus means that we never have to restart the daemon @@ -56,14 +58,14 @@ if [ -s "$dbus_pid" -a -s "$dnsmasq_pid" ]; then kill -0 $(cat "$dnsmasq_pid") 2>/dev/null then dbus=true - newconf="$newconf\n# Domain specific servers will" - newconf="$newconf be sent over dbus\nenable-dbus\n" + newconf="$newconf$NL# Domain specific servers will" + newconf="$newconf be sent over dbus${NL}enable-dbus$NL" fi fi fi for n in $NAMESERVERS; do - newresolv="${newresolv}nameserver $n\n" + newresolv="${newresolv}nameserver $n$NL" done dbusdest= @@ -75,41 +77,48 @@ for d in $DOMAINS; do SIFS=${IFS-y} OIFS=$IFS IFS=. set -- ${ns%%,*} - num="0x$(printf "%02x" $1 $2 $3 $4)" + num="0x$(printf %02x $1 $2 $3 $4)" if [ "$SIFS" = yi ]; then unset IFS else IFS=$OIFS fi - dbusdest="$dbusdest uint32:$(printf "%u" $num)" + dbusdest="$dbusdest uint32:$(printf %u $num)" dbusdest="$dbusdest string:$dn" else - newconf="${newconf}server=/$dn/${ns%%,*}\n" + newconf="${newconf}server=/$dn/${ns%%,*}$NL" fi [ "$ns" = "${ns#*,}" ] && break ns="${ns#*,}" done done +# Try to ensure that config dirs exist +if type config_mkdirs >/dev/null 2>&1; then + config_mkdirs "$dnsmasq_conf" "$dnsmasq_resolv" +else + @PREFIX@/sbin/resolvconf -D "$dnsmasq_conf" "$dnsmasq_resolv" +fi + changed=false if [ -n "$dnsmasq_conf" ]; then if [ ! -f "$dnsmasq_conf" ] || \ - [ "$(cat "$dnsmasq_conf")" != "$(printf "$newconf")" ] + [ "$(cat "$dnsmasq_conf")" != "$(printf %s "$newconf")" ] then changed=true - printf "$newconf" >"$dnsmasq_conf" + printf %s "$newconf" >"$dnsmasq_conf" fi fi if [ -n "$dnsmasq_resolv" ]; then if [ -f "$dnsmasq_resolv" ]; then - if [ "$(cat "$dnsmasq_resolv")" != "$(printf "$newresolv")" ] + if [ "$(cat "$dnsmasq_resolv")" != "$(printf %s "$newresolv")" ] then changed=true - printf "$newresolv" >"$dnsmasq_resolv" + printf %s "$newresolv" >"$dnsmasq_resolv" fi else # dnsmasq polls this file so no need to set changed=true - printf "$newresolv" >"$dnsmasq_resolv" + printf %s "$newresolv" >"$dnsmasq_resolv" fi fi diff --git a/libc.in b/libc.in index 4ceb0d2d038..4c797e9067a 100644 --- a/libc.in +++ b/libc.in @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 2007-2009 Roy Marples +# Copyright (c) 2007-2011 Roy Marples # All rights reserved # libc subscriber for resolvconf @@ -30,6 +30,8 @@ SYSCONFDIR=@SYSCONFDIR@ LIBEXECDIR=@LIBEXECDIR@ VARDIR=@VARDIR@ IFACEDIR="$VARDIR/interfaces" +NL=" +" # sed may not be available, and this is faster on small files key_get_value() @@ -109,7 +111,7 @@ case "${resolv_conf_passthrough:-NO}" in fi done [ -z "$newest" ] && exit 0 - newconf="$(cat "$newest")\n" + newconf="$(cat "$newest")$NL" ;; *) [ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" @@ -118,13 +120,13 @@ case "${resolv_conf_passthrough:-NO}" in newns="$(uniqify $name_servers $NS $name_servers_append)" # Hold our new resolv.conf in a variable to save on temporary files - newconf="# Generated by resolvconf\n" + newconf="# Generated by resolvconf$NL" if [ -n "$resolv_conf_head" ]; then - newconf="$newconf$resolv_conf_head\n" + newconf="$newconf$resolv_conf_head$NL" fi - [ -n "$newsearch" ] && newconf="${newconf}search $newsearch\n" + [ -n "$newsearch" ] && newconf="${newconf}search $newsearch$NL" for n in $newns; do - newconf="${newconf}nameserver $n\n" + newconf="${newconf}nameserver $n$NL" done # Now get any configured options @@ -135,22 +137,22 @@ case "${resolv_conf_passthrough:-NO}" in for opt in $(uniqify $opts); do newconf="${newconf} $opt" done - newconf="$newconf\n" + newconf="$newconf$NL" fi if [ -n "$resolv_conf_tail" ]; then - newconf="$newconf$resolv_conf_tail\n" + newconf="$newconf$resolv_conf_tail$NL" fi ;; esac # Check if the file has actually changed or not if [ -e "$resolv_conf" ]; then - [ "$(cat "$resolv_conf")" = "$(printf "$newconf")" ] && exit 0 + [ "$(cat "$resolv_conf")" = "$(printf %s "$newconf")" ] && exit 0 fi # Create our resolv.conf now -(umask 022; printf "$newconf" >"$resolv_conf") +(umask 022; printf %s "$newconf" >"$resolv_conf") eval $libc_restart retval=0 @@ -160,7 +162,7 @@ for script in "$LIBEXECDIR"/libc.d/*; do if [ -x "$script" ]; then "$script" "$@" else - (. "$script" "$@") + (. "$script") fi retval=$(($retval + $?)) fi diff --git a/named.in b/named.in index 64489612850..a89deb2693b 100644 --- a/named.in +++ b/named.in @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 2007-2009 Roy Marples +# Copyright (c) 2007-2011 Roy Marples # All rights reserved # named subscriber for resolvconf @@ -30,6 +30,8 @@ . "@SYSCONFDIR@/resolvconf.conf" || exit 1 [ -z "$named_zones" -a -z "$named_options" ] && exit 0 [ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" +NL=" +" # Platform specific kludges if [ -z "$named_service" -a -z "$named_restart" -a \ @@ -42,49 +44,56 @@ then fi : ${named_service:=named} : ${named_restart:=@RESTARTCMD ${named_service}@} -newoptions="# Generated by resolvconf\n" +newoptions="# Generated by resolvconf$NL" newzones="$newoptions" forward= for n in $NAMESERVERS; do case "$forward" in - *"\n\t$n;"*);; - *) forward="$forward\n\t$n;";; + *"$NL $n;"*);; + *) forward="$forward$NL $n;";; esac done if [ -n "$forward" ]; then - newoptions="${newoptions}forward first;\nforwarders {$forward\n};\n" + newoptions="${newoptions}forward first;${NL}forwarders {$forward${NL}};$NL" fi for d in $DOMAINS; do - newzones="${newzones}zone \"${d%%:*}\" {\n" - newzones="$newzones\ttype forward;\n" - newzones="$newzones\tforward first;\n\tforwarders {\n" + newzones="${newzones}zone \"${d%%:*}\" {$NL" + newzones="$newzones type forward;$NL" + newzones="$newzones forward first;$NL forwarders {$NL" ns="${d#*:}" while [ -n "$ns" ]; do - newzones="$newzones\t\t${ns%%,*};\n" + newzones="$newzones ${ns%%,*};$NL" [ "$ns" = "${ns#*,}" ] && break ns="${ns#*,}" done - newzones="$newzones\t};\n};\n" + newzones="$newzones };$NL};$NL" done +# Try to ensure that config dirs exist +if type config_mkdirs >/dev/null 2>&1; then + config_mkdirs "$named_options" "$named_zones" +else + @PREFIX@/sbin/resolvconf -D "$named_options" "$named_zones" +fi + # No point in changing files or reloading bind if the end result has not # changed changed=false if [ -n "$named_options" ]; then if [ ! -f "$named_options" ] || \ - [ "$(cat "$named_options")" != "$(printf "$newoptions")" ] + [ "$(cat "$named_options")" != "$(printf %s "$newoptions")" ] then - printf "$newoptions" >"$named_options" + printf %s "$newoptions" >"$named_options" changed=true fi fi if [ -n "$named_zones" ]; then if [ ! -f "$named_zones" ] || \ - [ "$(cat "$named_zones")" != "$(printf "$newzones")" ] + [ "$(cat "$named_zones")" != "$(printf %s "$newzones")" ] then - printf "$newzones" >"$named_zones" + printf %s "$newzones" >"$named_zones" changed=true fi fi diff --git a/pdnsd.in b/pdnsd.in index ff3b9b23ab5..8be0f9a0d00 100644 --- a/pdnsd.in +++ b/pdnsd.in @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 2010 Roy Marples +# Copyright (c) 2010-2011 Roy Marples # All rights reserved # pdnsd subscriber for resolvconf @@ -30,6 +30,8 @@ . "@SYSCONFDIR@/resolvconf.conf" || exit 1 [ -z "$pdnsd_conf" -a -z "$pdnsd_resolv" ] && exit 0 [ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" +NL=" +" : ${pdnsd_restart:=pdnsd-ctl config $pdnsd_conf} signature="# Generated by resolvconf" @@ -83,21 +85,29 @@ change_file() newresolv="# Generated by resolvconf\n" changed=false +# Try to ensure that config dirs exist +if type config_mkdirs >/dev/null 2>&1; then + config_mkdirs "$pdnsd_resolv" "$pdnsd_conf" +else + @PREFIX@/sbin/resolvconf -D "$pdnsd_resolv" "$pdnsd_conf" +fi + if [ -n "$pdnsd_resolv" ]; then for n in $NAMESERVERS; do newresolv="${newresolv}nameserver $n\n" done fi -if [ -n "$pdnsd_conf" ]; then +# Only modify the configuration if it exists and we can write to it +if [ -w "$pdnsd_conf" ]; then cf="$pdnsd_conf.new" newconf= if [ -z "$pdnsd_resolv" ]; then - newconf="${newconf}server {\n" - newconf="${newconf}\tlabel=resolvconf;\n" + newconf="${newconf}server {$NL" + newconf="${newconf} label=resolvconf;$NL" if [ -n "$NAMESERVERS" ]; then - newconf="${newconf}\tip=" + newconf="${newconf} ip=" first=true for n in $NAMESERVERS; do if $first; then @@ -107,16 +117,16 @@ if [ -n "$pdnsd_conf" ]; then fi newconf="$newconf$n" done - newconf="${newconf};\n" + newconf="${newconf};$NL" fi - newconf="${newconf}}\n" + newconf="${newconf}}$NL" fi for d in $DOMAINS; do - newconf="${newconf}server {\n" - newconf="${newconf}\tinclude=.${d%%:*}.;\n" - newconf="${newconf}\tpolicy=excluded;\n" - newconf="${newconf}\tip=" + newconf="${newconf}server {$NL" + newconf="${newconf} include=.${d%%:*}.;$NL" + newconf="${newconf} policy=excluded;$NL" + newconf="${newconf} ip=" ns="${d#*:}" while [ -n "$ns" ]; do newconf="${newconf}${ns%%,*}" @@ -124,14 +134,14 @@ if [ -n "$pdnsd_conf" ]; then ns="${ns#*,}" newconf="${newconf}," done - newconf="${newconf};\n}\n" + newconf="${newconf};$NL}$NL" done rm -f "$cf" remove_markers "$signature" "$signature_end" "$pdnsd_conf" > "$cf" if [ -n "$newconf" ]; then echo "$signature" >> "$cf" - printf "$newconf" >> "$cf" + printf %s "$newconf" >> "$cf" echo "$signature_end" >> "$cf" fi if change_file "$pdnsd_conf" "$cf"; then @@ -141,10 +151,10 @@ fi if [ -n "$pdnsd_resolv" ]; then if [ ! -f "$pdnsd_resolv" ] || \ - [ "$(cat "$pdnsd_resolv")" != "$(printf "$newresolv")" ] + [ "$(cat "$pdnsd_resolv")" != "$(printf %s "$newresolv")" ] then changed=true - printf "$newresolv" >"$pdnsd_resolv" + printf %s "$newresolv" >"$pdnsd_resolv" fi fi diff --git a/resolvconf.8.in b/resolvconf.8.in index 4e6f59a0449..fff07014bfe 100644 --- a/resolvconf.8.in +++ b/resolvconf.8.in @@ -1,4 +1,4 @@ -.\" Copyright (c) 2007-2009 Roy Marples +.\" Copyright (c) 2007-2011 Roy Marples .\" All rights reserved .\" .\" Redistribution and use in source and binary forms, with or without @@ -22,7 +22,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd December 3, 2009 +.Dd May 13, 2011 .Dt RESOLVCONF 8 SMM .Os .Sh NAME @@ -218,7 +218,16 @@ This implementation of .Nm is called openresolv and is fully command line compatible with Debian's resolvconf, as written by Thomas Hood. +.Sh SEE ALSO +.Xr resolv.conf 5 , +.Xr resolvconf.conf 5 , +.Xr resolver 3 , +.Xr stdin 3 +.Sh AUTHORS +.An Roy Marples Aq roy@marples.name .Sh BUGS +Please report them to http://roy.marples.name/projects/openresolv +.Pp .Nm does not validate any of the files given to it. .Pp @@ -229,12 +238,3 @@ will generate. You should consult .Xr resolvconf.conf 5 for instructions on how to configure your resolver. -.Sh SEE ALSO -.Xr resolv.conf 5 , -.Xr resolvconf.conf 5 , -.Xr resolver 3 , -.Xr stdin 3 -.Sh AUTHORS -.An Roy Marples Aq roy@marples.name -.Sh BUGS -Please report them to http://roy.marples.name/projects/openresolv diff --git a/resolvconf.conf.5.in b/resolvconf.conf.5.in index 9a47a1caed6..0abbfb13c99 100644 --- a/resolvconf.conf.5.in +++ b/resolvconf.conf.5.in @@ -1,4 +1,4 @@ -.\" Copyright (c) 2009-2010 Roy Marples +.\" Copyright (c) 2009-2011 Roy Marples .\" All rights reserved .\" .\" Redistribution and use in source and binary forms, with or without @@ -22,7 +22,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd October 29, 2010 +.Dd April 21, 2011 .Dt RESOLVCONF.CONF 5 SMM .Os .Sh NAME @@ -43,7 +43,7 @@ Listed below are the standard .Nm variables that may be set. .Pp -After updaing this file, you may wish to run +After updating this file, you may wish to run .Nm resolvconf -u to apply the new configuration. .Sh RESOLVCONF OPTIONS diff --git a/resolvconf.in b/resolvconf.in index c3a1aa33169..e24a90b9cb6 100644 --- a/resolvconf.in +++ b/resolvconf.in @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 2007-2009 Roy Marples +# Copyright (c) 2007-2011 Roy Marples # All rights reserved # Redistribution and use in source and binary forms, with or without @@ -187,6 +187,41 @@ uniqify() echo "${result# *}" } +dirname() +{ + local dir= OIFS="$IFS" + local IFS=/ + set -- $@ + IFS="$OIFS" + if [ -n "$1" ]; then + printf %s . + else + shift + fi + while [ -n "$2" ]; do + printf "/%s" "$1" + shift + done + printf "\n" +} + +config_mkdirs() +{ + local e=0 f d + for f; do + [ -n "$f" ] || continue + d="$(dirname "$f")" + if [ ! -d "$d" ]; then + if type install >/dev/null 2>&1; then + install -d "$d" || e=$? + else + mkdir "$d" || e=$? + fi + fi + done + return $e +} + list_resolv() { [ -d "$IFACEDIR" ] || return 0 @@ -197,7 +232,7 @@ list_resolv() # If we have an interface ordering list, then use that. # It works by just using pathname expansion in the interface directory. if [ -n "$1" ]; then - list="$@" + list="$*" $force || report=true else cd "$IFACEDIR" @@ -230,7 +265,7 @@ list_resolv() fi if [ "$cmd" = i -o "$cmd" = "-i" ]; then - printf "$i " + printf %s "$i " else echo_resolv "$i" fi @@ -274,7 +309,7 @@ make_vars() } force=false -while getopts a:d:fhIilm:puv OPT; do +while getopts a:Dd:fhIilm:puv OPT; do case "$OPT" in f) force=true;; h) usage;; @@ -285,7 +320,7 @@ while getopts a:d:fhIilm:puv OPT; do esac done shift $(($OPTIND - 1)) -args="$iface${iface:+ }$@" +args="$iface${iface:+ }$*" # -I inits the state dir if [ "$cmd" = I ]; then @@ -295,6 +330,12 @@ if [ "$cmd" = I ]; then exit $? fi +# -D ensures that the listed config file base dirs exist +if [ "$cmd" = D ]; then + config_mkdirs "$@" + exit $? +fi + # -l lists our resolv files, optionally for a specific interface if [ "$cmd" = l -o "$cmd" = i ]; then list_resolv "$cmd" "$args" @@ -368,17 +409,17 @@ fi if [ "$cmd" = a ]; then # Read resolv.conf from stdin - resolv="$(cat)\n" + resolv="$(cat)" # If what we are given matches what we have, then do nothing if [ -e "$IFACEDIR/$iface" ]; then - if [ "$(printf "$resolv")" = \ + if [ "$(echo "$resolv")" = \ "$(cat "$IFACEDIR/$iface")" ] then exit 0 fi rm "$IFACEDIR/$iface" fi - printf "$resolv" >"$IFACEDIR/$iface" || exit $? + echo "$resolv" >"$IFACEDIR/$iface" || exit $? [ ! -d "$METRICDIR" ] && mkdir "$METRICDIR" rm -f "$METRICDIR/"*" $iface" if [ -n "$IF_METRIC" ]; then @@ -413,7 +454,7 @@ for script in "$LIBEXECDIR"/*; do if [ -x "$script" ]; then "$script" "$cmd" "$iface" else - (. "$script" "$cmd" "$iface") + (set -- "$cmd" "$iface"; . "$script") fi retval=$(($retval + $?)) fi diff --git a/unbound.in b/unbound.in index b5fb7ecf534..4ee0da72026 100644 --- a/unbound.in +++ b/unbound.in @@ -1,5 +1,5 @@ #!/bin/sh -# Copyright (c) 2009 Roy Marples +# Copyright (c) 2009-2011 Roy Marples # All rights reserved # unbound subscriber for resolvconf @@ -30,34 +30,43 @@ . "@SYSCONFDIR@/resolvconf.conf" || exit 1 [ -z "$unbound_conf" ] && exit 0 [ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)" +NL=" +" : ${unbound_pid:=/var/run/unbound.pid} : ${unbound_service:=unbound} : ${unbound_restart:=@RESTARTCMD ${unbound_service}@} -newconf="# Generated by resolvconf\n" +newconf="# Generated by resolvconf$NL" for d in $DOMAINS; do dn="${d%%:*}" ns="${d#*:}" - newconf="${newconf}\nforward-zone:\n\tname: \"$dn\"\n" + newconf="$newconf${NL}forward-zone:$NL name: \"$dn\"$NL" while [ -n "$ns" ]; do - newconf="${newconf}\tforward-addr: ${ns%%,*}\n" + newconf="$newconf forward-addr: ${ns%%,*}$NL" [ "$ns" = "${ns#*,}" ] && break ns="${ns#*,}" done done if [ -n "$NAMESERVERS" ]; then - newconf="${newconf}\nforward-zone:\n\tname: \".\"\n" + newconf="$newconf${NL}forward-zone:$NL name: \".\"$NL" for n in $NAMESERVERS; do - newconf="${newconf}\tforward-addr: $n\n" + newconf="$newconf forward-addr: $n$NL" done fi +# Try to ensure that config dirs exist +if type config_mkdirs >/dev/null 2>&1; then + config_mkdirs "$unbound_conf" +else + @PREFIX@/sbin/resolvconf -D "$unbound_conf" +fi + if [ ! -f "$unbound_conf" ] || \ - [ "$(cat "$unbound_conf")" != "$(printf "$newconf")" ] + [ "$(cat "$unbound_conf")" != "$(printf %s "$newconf")" ] then - printf "$newconf" >"$unbound_conf" + printf %s "$newconf" >"$unbound_conf" # If we can't sent a HUP then force a restart if [ -s "$unbound_pid" ]; then if ! kill -HUP $(cat "$unbound_pid") 2>/dev/null; then From 8274d570e84717d5ed726a14919e286222037c4f Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Tue, 13 Sep 2011 05:52:34 +0000 Subject: [PATCH 426/452] Fix cpio on ARM. PR: bin/160430 Submitted by: Ian Lepore Approved by: re (Kostik Belousov) MFC after: 7 days --- lib/libarchive/archive_read_support_format_cpio.c | 6 +++--- lib/libarchive/archive_write_set_format_cpio.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/libarchive/archive_read_support_format_cpio.c b/lib/libarchive/archive_read_support_format_cpio.c index 7e52fbe1b81..24f3d35b30e 100644 --- a/lib/libarchive/archive_read_support_format_cpio.c +++ b/lib/libarchive/archive_read_support_format_cpio.c @@ -54,7 +54,7 @@ struct cpio_bin_header { unsigned char c_mtime[4]; unsigned char c_namesize[2]; unsigned char c_filesize[4]; -}; +} __packed; struct cpio_odc_header { char c_magic[6]; @@ -68,7 +68,7 @@ struct cpio_odc_header { char c_mtime[11]; char c_namesize[6]; char c_filesize[11]; -}; +} __packed; struct cpio_newc_header { char c_magic[6]; @@ -85,7 +85,7 @@ struct cpio_newc_header { char c_rdevminor[8]; char c_namesize[8]; char c_crc[8]; -}; +} __packed; struct links_entry { struct links_entry *next; diff --git a/lib/libarchive/archive_write_set_format_cpio.c b/lib/libarchive/archive_write_set_format_cpio.c index a0bccc508d0..798646a0d3b 100644 --- a/lib/libarchive/archive_write_set_format_cpio.c +++ b/lib/libarchive/archive_write_set_format_cpio.c @@ -74,7 +74,7 @@ struct cpio_header { char c_mtime[11]; char c_namesize[6]; char c_filesize[11]; -}; +} __packed; /* * Set output format to 'cpio' format. From 940acbaba34d37de8a30abe8c9d9195253b05d19 Mon Sep 17 00:00:00 2001 From: Sergey Kandaurov Date: Tue, 13 Sep 2011 13:56:18 +0000 Subject: [PATCH 427/452] Update ObsoleteFiles.inc: - liblwres shared library version bumped with bind98 import - named.reload removed in favor of rc.d Approved by: re (kib) No objection: dougb --- ObsoleteFiles.inc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 9c27766fcdd..80168f48d45 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -61,6 +61,11 @@ OLD_LIBS+=usr/lib32/libopie.so.6 OLD_LIBS+=usr/lib32/librtld_db.so.1 OLD_LIBS+=usr/lib32/libtacplus.so.4 .endif +# 20110718: no longer useful in the age of rc.d +OLD_FILES+=usr/sbin/named.reconfig +OLD_FILES+=usr/sbin/named.reload +# 20110716: bind 9.8.0 import +OLD_LIBS+=usr/lib/liblwres.so.50 # 20110709: vm_map_clean.9 -> vm_map_sync.9 OLD_FILES+=usr/share/man/man9/vm_map_clean.9.gz # 20110709: Catch up with removal of these functions. From b13391ced2bb2eb50c7463e05b9c2d4cf489e41c Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Tue, 13 Sep 2011 14:01:35 +0000 Subject: [PATCH 428/452] zfstest: cleanup the code, improve functionality and diagnostics The utility is not connected to the build, so it should be safe to update it. To do: move the utility to tools/. Some code is provided by Peter Jeremy Tested by: Sebastian Chmielewski , Peter Jeremy (earlier versions) Approved by: re (kib) MFC after: 4 days --- sys/boot/zfs/zfstest.c | 56 ++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/sys/boot/zfs/zfstest.c b/sys/boot/zfs/zfstest.c index 303ef5f08ef..3e32da57781 100644 --- a/sys/boot/zfs/zfstest.c +++ b/sys/boot/zfs/zfstest.c @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -37,14 +38,14 @@ #include #include #include -#include +#include #define NBBY 8 void pager_output(const char *line) { - printf("%s", line); + fprintf(stderr, "%s", line); } #include "zfsimpl.c" @@ -55,8 +56,8 @@ vdev_read(vdev_t *vdev, void *priv, off_t off, void *buf, size_t bytes) int fd = *(int *) priv; if (pread(fd, buf, bytes, off) != bytes) - return -1; - return 0; + return (-1); + return (0); } static int @@ -69,10 +70,10 @@ zfs_read(spa_t *spa, dnode_phys_t *dn, void *buf, size_t size, off_t off) n = size; if (off + n > zp->zp_size) n = zp->zp_size - off; - + rc = dnode_read(spa, dn, off, buf, n); if (rc) - return (rc); + return (-rc); return (n); } @@ -80,22 +81,24 @@ zfs_read(spa_t *spa, dnode_phys_t *dn, void *buf, size_t size, off_t off) int main(int argc, char** argv) { - int i, n, off; - int fd[99]; - spa_t *spa; - dnode_phys_t dn; char buf[512]; + int fd[100]; + struct stat sb; + dnode_phys_t dn; + spa_t *spa; + int i, n, off; zfs_init(); if (argc == 1) { static char *av[] = { - "zfstest", "/dev/da0p2", "/dev/da1p2", "/dev/da2p2", + "zfstest", "COPYRIGHT", + "/dev/da0p2", "/dev/da1p2", "/dev/da2p2", NULL, }; - argc = 4; + argc = 5; argv = av; } - for (i = 1; i < argc; i++) { + for (i = 2; i < argc; i++) { fd[i] = open(argv[i], O_RDONLY); if (fd[i] < 0) continue; @@ -105,16 +108,37 @@ main(int argc, char** argv) spa_all_status(); spa = STAILQ_FIRST(&zfs_pools); - if (!spa || zfs_mount_pool(spa)) + if (spa == NULL) { + fprintf(stderr, "no pools\n"); exit(1); + } - if (zfs_lookup(spa, "zfs.c", &dn)) + if (zfs_mount_pool(spa)) { + fprintf(stderr, "can't mount pool\n"); exit(1); + } + + if (zfs_lookup(spa, argv[1], &dn)) { + fprintf(stderr, "can't lookup\n"); + exit(1); + } + + if (zfs_dnode_stat(spa, &dn, &sb)) { + fprintf(stderr, "can't stat\n"); + exit(1); + } + off = 0; do { n = zfs_read(spa, &dn, buf, 512, off); + if (n < 0) { + fprintf(stderr, "zfs_read failed\n"); + exit(1); + } write(1, buf, n); off += n; - } while (n == 512); + } while (off < sb.st_size); + + return (0); } From 918314631b0bf333b930f1b1602189c4207b30da Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Tue, 13 Sep 2011 14:03:55 +0000 Subject: [PATCH 429/452] gpt/zfs boot blocks: reduce optimizing CFLAGS to -O1 gpt and zfs boot blocks are not nearly as size-constrained as boot2 from which they inherited their current optimization and anti-optimization options. As such the current options do not provide any benefit, but make debugging of the code much harder. Also, it has been demonstrated that combination of -mrtd and -fno-unit-at-a-time may result in mis-compilation of the boot code with the current base gcc. Additionally, intermediate assembly file filtering is removed for zfsboot. The new boot blocks are all compile- and boot- tested using qemu. gptzfsboot is tested with real hardware. Reported by: Peter Jeremy [miscompilation] Discussed with: bde, jhb Tested by: Sebastian Chmielewski [gptzfsboot] Approved by: re (kib) MFC after: 3 weeks --- sys/boot/i386/gptboot/Makefile | 7 +------ sys/boot/i386/gptzfsboot/Makefile | 7 +------ sys/boot/i386/zfsboot/Makefile | 19 ++----------------- 3 files changed, 4 insertions(+), 29 deletions(-) diff --git a/sys/boot/i386/gptboot/Makefile b/sys/boot/i386/gptboot/Makefile index 5642220a340..48a6d590c8c 100644 --- a/sys/boot/i386/gptboot/Makefile +++ b/sys/boot/i386/gptboot/Makefile @@ -20,12 +20,7 @@ GPTBOOT_UFS?= UFS1_AND_UFS2 #GPTBOOT_UFS?= UFS1_ONLY CFLAGS= -DBOOTPROG=\"gptboot\" \ - -Os \ - -fno-guess-branch-probability \ - -fomit-frame-pointer \ - -fno-unit-at-a-time \ - -mno-align-long-strings \ - -mrtd \ + -O1 \ -DGPT \ -D${GPTBOOT_UFS} \ -DSIOPRT=${BOOT_COMCONSOLE_PORT} \ diff --git a/sys/boot/i386/gptzfsboot/Makefile b/sys/boot/i386/gptzfsboot/Makefile index f0ee578ce38..2067162a8cd 100644 --- a/sys/boot/i386/gptzfsboot/Makefile +++ b/sys/boot/i386/gptzfsboot/Makefile @@ -17,12 +17,7 @@ ORG1= 0x7c00 ORG2= 0x0 CFLAGS= -DBOOTPROG=\"gptzfsboot\" \ - -Os \ - -fno-guess-branch-probability \ - -fomit-frame-pointer \ - -fno-unit-at-a-time \ - -mno-align-long-strings \ - -mrtd \ + -O1 \ -DGPT -DBOOT2 \ -DSIOPRT=${BOOT_COMCONSOLE_PORT} \ -DSIOFMT=${B2SIOFMT} \ diff --git a/sys/boot/i386/zfsboot/Makefile b/sys/boot/i386/zfsboot/Makefile index 8caff2790a6..024fa258583 100644 --- a/sys/boot/i386/zfsboot/Makefile +++ b/sys/boot/i386/zfsboot/Makefile @@ -15,12 +15,7 @@ ORG1= 0x7c00 ORG2= 0x2000 CFLAGS= -DBOOTPROG=\"zfsboot\" \ - -Os \ - -fno-guess-branch-probability \ - -fomit-frame-pointer \ - -fno-unit-at-a-time \ - -mno-align-long-strings \ - -mrtd \ + -O1 \ -DBOOT2 \ -DSIOPRT=${BOOT_COMCONSOLE_PORT} \ -DSIOFMT=${B2SIOFMT} \ @@ -85,20 +80,10 @@ zfsboot.bin: zfsboot.out zfsboot.out: ${BTXCRT} zfsboot.o sio.o drv.o cons.o util.o ${LD} ${LDFLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC} ${LIBSTAND} -zfsboot.o: zfsboot.s -.if ${CC:T:Mclang} == "clang" - ${CC} ${ACFLAGS} -c zfsboot.s -.endif - SRCS= zfsboot.c -zfsboot.s: zfsboot.c ${.CURDIR}/../../zfs/zfsimpl.c - ${CC} ${CFLAGS} -S -o zfsboot.s.tmp ${.CURDIR}/zfsboot.c - sed -e '/align/d' -e '/nop/d' < zfsboot.s.tmp > zfsboot.s - rm -f zfsboot.s.tmp - .if ${MACHINE_CPUARCH} == "amd64" -beforedepend zfsboot.s: machine +beforedepend zfsboot.o: machine CLEANFILES+= machine machine: ln -sf ${.CURDIR}/../../../i386/include machine From c3e00850b465855146c62ee37b78707b55ed9136 Mon Sep 17 00:00:00 2001 From: Andriy Gapon Date: Tue, 13 Sep 2011 14:07:05 +0000 Subject: [PATCH 430/452] zfs boot subroutines: correctly specify type of an integer literal Found by adding more warning flags to zfs boot blocks build. Approved by: re (kib) MFC after: 1 week --- sys/cddl/boot/zfs/zfssubr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/cddl/boot/zfs/zfssubr.c b/sys/cddl/boot/zfs/zfssubr.c index 5022292b995..e76c2738939 100644 --- a/sys/cddl/boot/zfs/zfssubr.c +++ b/sys/cddl/boot/zfs/zfssubr.c @@ -328,7 +328,7 @@ typedef struct raidz_map { (mask) = (x) & 0x8080808080808080ULL; \ (mask) = ((mask) << 1) - ((mask) >> 7); \ (x) = (((x) << 1) & 0xfefefefefefefefeULL) ^ \ - ((mask) & 0x1d1d1d1d1d1d1d1d); \ + ((mask) & 0x1d1d1d1d1d1d1d1dULL); \ } #define VDEV_RAIDZ_64MUL_4(x, mask) \ From 61b6cf3661dc10dcd4896a476ca36178c48349f3 Mon Sep 17 00:00:00 2001 From: David Christensen Date: Tue, 13 Sep 2011 15:49:28 +0000 Subject: [PATCH 431/452] - Fix compiler warning in ADD_64() macro. Approved by: re Obtained from: dimitry@andic.com MFC after: One week --- sys/dev/bxe/if_bxe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/bxe/if_bxe.c b/sys/dev/bxe/if_bxe.c index e7534f4bb48..930a4f03d50 100644 --- a/sys/dev/bxe/if_bxe.c +++ b/sys/dev/bxe/if_bxe.c @@ -7188,7 +7188,7 @@ bxe_attn_int(struct bxe_softc* sc) /* sum[hi:lo] += add[hi:lo] */ #define ADD_64(s_hi, a_hi, s_lo, a_lo) do { \ s_lo += a_lo; \ - s_hi += a_hi + (s_lo < a_lo) ? 1 : 0; \ + s_hi += a_hi + ((s_lo < a_lo) ? 1 : 0); \ } while (0) /* Subtraction = minuend -= subtrahend */ From 31f301d021da952c89a15bc7193978f6bf73a049 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Tue, 13 Sep 2011 15:57:29 +0000 Subject: [PATCH 432/452] Improve the sleep_delay sysctl description by specifying which unit the number is in. PR: 159975 Submitted by: gcooper Approved by: re (kib) MFC after: 1 week --- sys/dev/acpica/acpi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c index 9352be9c337..1d0cc2388cd 100644 --- a/sys/dev/acpica/acpi.c +++ b/sys/dev/acpica/acpi.c @@ -574,7 +574,7 @@ acpi_attach(device_t dev) &sc->acpi_suspend_sx, 0, acpi_sleep_state_sysctl, "A", ""); SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree), OID_AUTO, "sleep_delay", CTLFLAG_RW, &sc->acpi_sleep_delay, 0, - "sleep delay"); + "sleep delay in seconds"); SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree), OID_AUTO, "s4bios", CTLFLAG_RW, &sc->acpi_s4bios, 0, "S4BIOS mode"); SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree), From e50e74d8aa3ad6ced00d692a25936c9e3ca2bc2d Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 13 Sep 2011 20:16:11 +0000 Subject: [PATCH 433/452] Do not try to change the mode or ownership of the root of the mountpoint when newly established mdmfs mount is readonly. PR: bin/128427 Tested and reviewed by: jchandra MFC after: 1 week Approved by: re (bz) --- sbin/mdmfs/mdmfs.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/sbin/mdmfs/mdmfs.c b/sbin/mdmfs/mdmfs.c index ef45040ce64..e0932652be1 100644 --- a/sbin/mdmfs/mdmfs.c +++ b/sbin/mdmfs/mdmfs.c @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -60,6 +61,7 @@ struct mtpt_info { bool mi_have_gid; mode_t mi_mode; bool mi_have_mode; + bool mi_forced_pw; }; static bool debug; /* Emit debugging information? */ @@ -204,6 +206,7 @@ main(int argc, char **argv) usage(); mi.mi_mode = getmode(set, S_IRWXU | S_IRWXG | S_IRWXO); mi.mi_have_mode = true; + mi.mi_forced_pw = true; free(set); break; case 'S': @@ -223,6 +226,7 @@ main(int argc, char **argv) break; case 'w': extract_ugid(optarg, &mi); + mi.mi_forced_pw = true; break; case 'X': debug = true; @@ -443,6 +447,29 @@ do_mount(const char *args, const char *mtpoint) static void do_mtptsetup(const char *mtpoint, struct mtpt_info *mip) { + struct statfs sfs; + + if (!mip->mi_have_mode && !mip->mi_have_uid && !mip->mi_have_gid) + return; + + if (!norun) { + if (statfs(mtpoint, &sfs) == -1) { + warn("statfs: %s", mtpoint); + return; + } + if ((sfs.f_flags & MNT_RDONLY) != 0) { + if (mip->mi_forced_pw) { + warnx( + "Not changing mode/owner of %s since it is read-only", + mtpoint); + } else { + debugprintf( + "Not changing mode/owner of %s since it is read-only", + mtpoint); + } + return; + } + } if (mip->mi_have_mode) { debugprintf("changing mode of %s to %o.", mtpoint, From 51ad0033d6c5632f251e74baf490194cfc47cd62 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Tue, 13 Sep 2011 20:33:27 +0000 Subject: [PATCH 434/452] Fix csup to allow case insensitive server names in the auth file, just as advertised in the manpage. PR: 158652 Submitted by: stephen Approved by: re (kib) MFC after: 1 week --- usr.bin/csup/auth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.bin/csup/auth.c b/usr.bin/csup/auth.c index 7a84aca1843..d690f9b47e8 100644 --- a/usr.bin/csup/auth.c +++ b/usr.bin/csup/auth.c @@ -192,7 +192,7 @@ auth_lookuprecord(char *server, struct srvrecord *auth) goto close; } /* Skip the rest of this line, it isn't what we are looking for. */ - if (strcmp(auth->server, server) != 0) + if (strcasecmp(auth->server, server) != 0) continue; error = auth_parsetoken(&line, auth->client, sizeof(auth->client)); From 43fb93b0da7cfe3421e02e74fc81814732da93ed Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Tue, 13 Sep 2011 20:35:34 +0000 Subject: [PATCH 435/452] Fix typos in error messages. Found by: kib Approved by: re (kib) MFC after: 1 week --- usr.bin/csup/auth.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/usr.bin/csup/auth.c b/usr.bin/csup/auth.c index d690f9b47e8..f24cd00668a 100644 --- a/usr.bin/csup/auth.c +++ b/usr.bin/csup/auth.c @@ -188,7 +188,7 @@ auth_lookuprecord(char *server, struct srvrecord *auth) error = auth_parsetoken(&line, auth->server, sizeof(auth->server)); if (error != STATUS_SUCCESS) { - lprintf(-1, "%s:%d Missng client name\n", authfile, linenum); + lprintf(-1, "%s:%d Missing client name\n", authfile, linenum); goto close; } /* Skip the rest of this line, it isn't what we are looking for. */ @@ -197,13 +197,13 @@ auth_lookuprecord(char *server, struct srvrecord *auth) error = auth_parsetoken(&line, auth->client, sizeof(auth->client)); if (error != STATUS_SUCCESS) { - lprintf(-1, "%s:%d Missng password\n", authfile, linenum); + lprintf(-1, "%s:%d Missing password\n", authfile, linenum); goto close; } error = auth_parsetoken(&line, auth->password, sizeof(auth->password)); if (error != STATUS_SUCCESS) { - lprintf(-1, "%s:%d Missng comment\n", authfile, linenum); + lprintf(-1, "%s:%d Missing comment\n", authfile, linenum); goto close; } stream_close(s); From 4d30adc494c6c42b2a3315e160da2382a4d9b26f Mon Sep 17 00:00:00 2001 From: Rick Macklem Date: Tue, 13 Sep 2011 21:01:26 +0000 Subject: [PATCH 436/452] Modify vfs_register() to use a hash calculation on vfc_name to set vfc_typenum, so that vfc_typenum doesn't change when file systems are loaded in different orders. This keeps NFS file handles from changing, for file systems that use vfc_typenum in their fsid. This change is controlled via a loader.conf variable called vfs.typenumhash, since vfc_typenum will change once when this is enabled. It defaults to 1 for 9.0, but will default to 0 when MFC'd to stable/8. Tested by: hrs Reviewed by: jhb, pjd (earlier version) Approved by: re (kib) MFC after: 1 month --- UPDATING | 12 ++++++++++++ sys/kern/vfs_init.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/UPDATING b/UPDATING index f5c6f4de7ad..dd351316650 100644 --- a/UPDATING +++ b/UPDATING @@ -22,6 +22,18 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW: machines to maximize performance. (To disable malloc debugging, run ln -s aj /etc/malloc.conf.) +20110913: + This commit modifies vfs_register() so that it uses a hash + calculation to set vfc_typenum, which is enabled by default. + The first time a system is booted after this change, the + vfc_typenum values will change for all file systems. The + main effect of this is a change to the NFS server file handles + for file systems that use vfc_typenum in their fsid, such as ZFS. + It will, however, prevent vfc_typenum from changing when file + systems are loaded in a different order for subsequent reboots. + To disable this, you can set vfs.typenumhash=0 in /boot/loader.conf + until you are ready to remount all NFS clients after a reboot. + 20110828: Bump the shared library version numbers for libraries that do not use symbol versioning, have changed the ABI compared diff --git a/sys/kern/vfs_init.c b/sys/kern/vfs_init.c index 4367b8c8096..0165b38c3cd 100644 --- a/sys/kern/vfs_init.c +++ b/sys/kern/vfs_init.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -64,6 +65,18 @@ int maxvfsconf = VFS_GENERIC + 1; */ struct vfsconfhead vfsconf = TAILQ_HEAD_INITIALIZER(vfsconf); +/* + * Loader.conf variable vfs.typenumhash enables setting vfc_typenum using a hash + * calculation on vfc_name, so that it doesn't change when file systems are + * loaded in a different order. This will avoid the NFS server file handles from + * changing for file systems that use vfc_typenum in their fsid. + */ +static int vfs_typenumhash = 1; +TUNABLE_INT("vfs.typenumhash", &vfs_typenumhash); +SYSCTL_INT(_vfs, OID_AUTO, typenumhash, CTLFLAG_RDTUN, &vfs_typenumhash, 0, + "Set vfc_typenum using a hash calculation on vfc_name, so that it does not" + "change when file systems are loaded in a different order."); + /* * A Zen vnode attribute structure. * @@ -138,6 +151,9 @@ vfs_register(struct vfsconf *vfc) struct sysctl_oid *oidp; struct vfsops *vfsops; static int once; + struct vfsconf *tvfc; + uint32_t hashval; + int secondpass; if (!once) { vattr_null(&va_null); @@ -152,7 +168,34 @@ vfs_register(struct vfsconf *vfc) if (vfs_byname(vfc->vfc_name) != NULL) return EEXIST; - vfc->vfc_typenum = maxvfsconf++; + if (vfs_typenumhash != 0) { + /* + * Calculate a hash on vfc_name to use for vfc_typenum. Unless + * all of 1<->255 are assigned, it is limited to 8bits since + * that is what ZFS uses from vfc_typenum and is also the + * preferred range for vfs_getnewfsid(). + */ + hashval = fnv_32_str(vfc->vfc_name, FNV1_32_INIT); + hashval &= 0xff; + secondpass = 0; + do { + /* Look for and fix any collision. */ + TAILQ_FOREACH(tvfc, &vfsconf, vfc_list) { + if (hashval == tvfc->vfc_typenum) { + if (hashval == 255 && secondpass == 0) { + hashval = 1; + secondpass = 1; + } else + hashval++; + break; + } + } + } while (tvfc != NULL); + vfc->vfc_typenum = hashval; + if (vfc->vfc_typenum >= maxvfsconf) + maxvfsconf = vfc->vfc_typenum + 1; + } else + vfc->vfc_typenum = maxvfsconf++; TAILQ_INSERT_TAIL(&vfsconf, vfc, vfc_list); /* From d3dbe2d0e3b5e74966973df42f5917d1cc650598 Mon Sep 17 00:00:00 2001 From: Gavin Atkinson Date: Tue, 13 Sep 2011 21:15:23 +0000 Subject: [PATCH 437/452] Include descriptions for keymaps missing from INDEX.keymaps. This fixes the five keymaps referred to only by filename on the keymap selection screen of bsdinstall. Approved by: re (kib) MFC after: 1 week --- share/syscons/keymaps/INDEX.keymaps | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/share/syscons/keymaps/INDEX.keymaps b/share/syscons/keymaps/INDEX.keymaps index 73e24cfceb9..95681f49507 100644 --- a/share/syscons/keymaps/INDEX.keymaps +++ b/share/syscons/keymaps/INDEX.keymaps @@ -117,6 +117,8 @@ danish.cp865.kbd:fr:Danois Code page 865 danish.cp865.kbd:pt:Dinamarquês Codepage 865 danish.cp865.kbd:es:Danés Codepage 865 +dutch.iso.acc.kbd:en:Dutch ISO keymap (accent keys) + eee_nordic.kbd:en:Nordic layout on Asus eeePC eee_nordic.kbd:fr:Norvégien phonétique sur Asus eeePC @@ -368,6 +370,14 @@ ru.koi8-r.shift.kbd:pt:Russo koi8-r (shift) ru.koi8-r.shift.kbd:es:Ruso koi8-r (shift) ru.koi8-r.shift.kbd:uk:òÏÓ¦ÊÓØËÁ koi8-r (shift) +ru.koi8-r.win.kbd:en:Russian koi8-r (winkeys) +ru.koi8-r.win.kbd:de:Russisch koi8-r (winkeys) +ru.koi8-r.win.kbd:ru:òÕÓÓËÉÊ koi8-r (winkeys) +ru.koi8-r.win.kbd:fr:Russe koi8-r (winkeys) +ru.koi8-r.win.kbd:pt:Russo koi8-r (winkeys) +ru.koi8-r.win.kbd:es:Ruso koi8-r (winkeys) +ru.koi8-r.win.kbd:uk:òÏÓ¦ÊÓØËÁ koi8-r (winkeys) + spanish.iso.kbd:en:Spanish ISO-8859-1 spanish.iso.kbd:de:Spanisch ISO-8859-1 spanish.iso.kbd:fr:Espagnol ISO-8859-1 @@ -456,12 +466,16 @@ uk.iso.kbd:fr:Royaume Uni ISO-8859-1 uk.iso.kbd:pt:Reino Unido ISO-8859-1 uk.iso.kbd:es:Británico ISO-8859-1 +uk.iso-ctrl.kbd:en:United Kingdom ISO-8859-1 (Caps Lock acts as Left Ctrl) + uk.cp850.kbd:en:United Kingdom Codepage 850 uk.cp850.kbd:de:Vereinigtes Königreich Codeseite 850 uk.cp850.kbd:fr:Royaume Uni Code page 850 uk.cp850.kbd:pt:Reino Unido Codepage 850 uk.cp850.kbd:es:Británico Codepage 850 +uk.cp850-ctrl.kbd:en:United Kingdom Codepage 850 (Caps Lock acts as Left Ctrl) + uk.dvorak.kbd:en:United Kingdom Dvorak uk.dvorak.kbd:de:Vereinigtes K\xf6nigreich Dvorak uk.dvorak.kbd:fr:Royaume Uni Dvorak @@ -510,6 +524,8 @@ us.emacs.kbd:fr: us.emacs.kbd:pt:Estados Unidos da América emacs us.emacs.kbd:es:Estadounidense optimizado para Emacs +us.pc-ctrl.kbd:en:United States of America ISO-8859-1 (Caps Lock acts as Left Ctrl) + us.unix.kbd:en:United States of America Traditional Unix Workstation us.unix.kbd:de:US-amerikanisch traditionelles Unix Layout us.unix.kbd:fr:États Unis d'Amérique unix From a4de89de11d9fee3b49e6cdc161fe7a7eb3779ff Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Tue, 13 Sep 2011 21:39:26 +0000 Subject: [PATCH 438/452] Allow WPA PSKs up to 63 characters, the max length according to wpa_supplicant.conf(5). Up to now, the PSK was truncated to 15 characters (the length of the input field). PR: 159559 Submitted by: Gavin Chappell Approved by: re (kib) --- usr.sbin/bsdinstall/scripts/wlanconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr.sbin/bsdinstall/scripts/wlanconfig b/usr.sbin/bsdinstall/scripts/wlanconfig index c62312a354d..68942797312 100755 --- a/usr.sbin/bsdinstall/scripts/wlanconfig +++ b/usr.sbin/bsdinstall/scripts/wlanconfig @@ -92,7 +92,7 @@ if echo $ENCRYPTION | grep -q 'PSK'; then PASS=`dialog --insecure --backtitle "FreeBSD Installer" \ --title "WPA Setup" --mixedform "" 0 0 0 \ "SSID" 1 0 "$NETWORK" 1 12 0 0 2 \ - "Password" 2 0 "" 2 12 15 0 1 \ + "Password" 2 0 "" 2 12 15 63 1 \ 2>&1 1>&3` \ || exec $0 $@ exec 3>&- From 58bdb69150897de50ebbec5d9f959e92b5e54121 Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Wed, 14 Sep 2011 08:15:21 +0000 Subject: [PATCH 439/452] Fix the handling of the flowlabel and DSCP value in the SCTP_PEER_ADDR_PARAMS socket option. Honor the net.inet6.ip6.auto_flowlabel sysctl setting. Approved by: re (bz) MFC after: 1 month. --- sys/netinet/sctp_output.c | 82 +++++++++++++++++++++++++------------- sys/netinet/sctp_pcb.c | 14 +++++++ sys/netinet/sctp_pcb.h | 4 ++ sys/netinet/sctp_structs.h | 4 ++ sys/netinet/sctp_usrreq.c | 76 ++++++++++++++++++++++------------- sys/netinet/sctputil.c | 21 +++++----- 6 files changed, 137 insertions(+), 64 deletions(-) diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index d91f8986311..c35dcac872b 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -3904,6 +3904,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, uint32_t vrf_id; sctp_route_t *ro = NULL; struct udphdr *udp = NULL; + uint8_t tos_value; #if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) struct socket *so = NULL; @@ -3925,13 +3926,20 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, if ((auth != NULL) && (stcb != NULL)) { sctp_fill_hmac_digest_m(m, auth_offset, auth, stcb, auth_keyid); } + if (net) { + tos_value = net->dscp; + } else if (stcb) { + tos_value = stcb->asoc.default_dscp; + } else { + tos_value = inp->sctp_ep.default_dscp; + } + switch (to->sa_family) { #ifdef INET case AF_INET: { struct ip *ip = NULL; sctp_route_t iproute; - uint8_t tos_value; int len; len = sizeof(struct ip) + sizeof(struct sctphdr); @@ -3966,11 +3974,18 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, ip = mtod(m, struct ip *); ip->ip_v = IPVERSION; ip->ip_hl = (sizeof(struct ip) >> 2); - if (net) { - tos_value = net->dscp; - } else { + if (tos_value == 0) { + /* + * This means especially, that it is not set + * at the SCTP layer. So use the value from + * the IP layer. + */ tos_value = inp->ip_inp.inp.inp_ip_tos; } + tos_value &= 0xfc; + if (ecn_ok) { + tos_value |= sctp_get_ect(stcb, chk); + } if ((nofragment_flag) && (port == 0)) { ip->ip_off = IP_DF; } else @@ -3981,10 +3996,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, ip->ip_ttl = inp->ip_inp.inp.inp_ip_ttl; ip->ip_len = packet_length; - ip->ip_tos = tos_value & 0xfc; - if (ecn_ok) { - ip->ip_tos |= sctp_get_ect(stcb, chk); - } + ip->ip_tos = tos_value; if (port) { ip->ip_p = IPPROTO_UDP; } else { @@ -4189,13 +4201,10 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, #ifdef INET6 case AF_INET6: { - uint32_t flowlabel; + uint32_t flowlabel, flowinfo; struct ip6_hdr *ip6h; struct route_in6 ip6route; struct ifnet *ifp; - u_char flowTop; - uint16_t flowBottom; - u_char tosBottom, tosTop; struct sockaddr_in6 *sin6, tmp, *lsa6, lsa6_tmp; int prev_scope = 0; struct sockaddr_in6 lsa6_storage; @@ -4203,12 +4212,22 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, u_short prev_port = 0; int len; - if (net != NULL) { + if (net) { flowlabel = net->flowlabel; + } else if (stcb) { + flowlabel = stcb->asoc.default_flowlabel; } else { - flowlabel = ((struct in6pcb *)inp)->in6p_flowinfo; + flowlabel = inp->sctp_ep.default_flowlabel; } - + if (flowlabel == 0) { + /* + * This means especially, that it is not set + * at the SCTP layer. So use the value from + * the IP layer. + */ + flowlabel = ntohl(((struct in6pcb *)inp)->in6p_flowinfo); + } + flowlabel &= 0x000fffff; len = sizeof(struct ip6_hdr) + sizeof(struct sctphdr); if (port) { len += sizeof(struct udphdr); @@ -4240,13 +4259,6 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, packet_length = sctp_calculate_len(m); ip6h = mtod(m, struct ip6_hdr *); - /* - * We assume here that inp_flow is in host byte - * order within the TCB! - */ - flowBottom = flowlabel & 0x0000ffff; - flowTop = ((flowlabel & 0x000f0000) >> 16); - tosTop = (((flowlabel & 0xf0) >> 4) | IPV6_VERSION); /* protect *sin6 from overwrite */ sin6 = (struct sockaddr_in6 *)to; tmp = *sin6; @@ -4264,12 +4276,28 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, } else { ro = (sctp_route_t *) & net->ro; } - tosBottom = (((struct in6pcb *)inp)->in6p_flowinfo & 0x0c); - if (ecn_ok) { - tosBottom |= sctp_get_ect(stcb, chk); + /* + * We assume here that inp_flow is in host byte + * order within the TCB! + */ + if (tos_value == 0) { + /* + * This means especially, that it is not set + * at the SCTP layer. So use the value from + * the IP layer. + */ + tos_value = (ntohl(((struct in6pcb *)inp)->in6p_flowinfo) >> 20) & 0xff; } - tosBottom <<= 4; - ip6h->ip6_flow = htonl(((tosTop << 24) | ((tosBottom | flowTop) << 16) | flowBottom)); + tos_value &= 0xfc; + if (ecn_ok) { + tos_value |= sctp_get_ect(stcb, chk); + } + flowinfo = 0x06; + flowinfo <<= 8; + flowinfo |= tos_value; + flowinfo <<= 20; + flowinfo |= flowlabel; + ip6h->ip6_flow = htonl(flowinfo); if (port) { ip6h->ip6_nxt = IPPROTO_UDP; } else { diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c index 912e34870a3..e3973160d84 100644 --- a/sys/netinet/sctp_pcb.c +++ b/sys/netinet/sctp_pcb.c @@ -49,6 +49,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef INET6 +#include +#endif #include #include #include @@ -2503,6 +2506,11 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id) /* setup socket pointers */ inp->sctp_socket = so; inp->ip_inp.inp.inp_socket = so; +#ifdef INET6 + if (MODULE_GLOBAL(ip6_auto_flowlabel)) { + inp->ip_inp.inp.inp_flags |= IN6P_AUTOFLOWLABEL; + } +#endif inp->sctp_associd_counter = 1; inp->partial_delivery_point = SCTP_SB_LIMIT_RCV(so) >> SCTP_PARTIAL_DELIVERY_SHIFT; inp->sctp_frag_point = SCTP_DEFAULT_MAXSEGMENT; @@ -2668,6 +2676,10 @@ sctp_inpcb_alloc(struct socket *so, uint32_t vrf_id) */ m->local_hmacs = sctp_default_supported_hmaclist(); m->local_auth_chunks = sctp_alloc_chunklist(); + m->default_dscp = 0; +#ifdef INET6 + m->default_flowlabel = 0; +#endif sctp_auth_set_default_chunks(m->local_auth_chunks); LIST_INIT(&m->shared_keys); /* add default NULL key as key id 0 */ @@ -4015,7 +4027,9 @@ sctp_add_remote_addr(struct sctp_tcb *stcb, struct sockaddr *newaddr, net->port = 0; } net->dscp = stcb->asoc.default_dscp; +#ifdef INET6 net->flowlabel = stcb->asoc.default_flowlabel; +#endif if (sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_DONOT_HEARTBEAT)) { net->dest_state |= SCTP_ADDR_NOHB; } else { diff --git a/sys/netinet/sctp_pcb.h b/sys/netinet/sctp_pcb.h index a7f5580e26e..e39055ca075 100644 --- a/sys/netinet/sctp_pcb.h +++ b/sys/netinet/sctp_pcb.h @@ -322,6 +322,10 @@ struct sctp_pcb { uint32_t store_at; uint32_t max_burst; uint32_t fr_max_burst; +#ifdef INET6 + uint32_t default_flowlabel; +#endif + uint8_t default_dscp; char current_secret_number; char last_secret_number; }; diff --git a/sys/netinet/sctp_structs.h b/sys/netinet/sctp_structs.h index 362f9cbf991..c7dee695657 100644 --- a/sys/netinet/sctp_structs.h +++ b/sys/netinet/sctp_structs.h @@ -321,7 +321,9 @@ struct sctp_nets { uint32_t fast_recovery_tsn; uint32_t heartbeat_random1; uint32_t heartbeat_random2; +#ifdef INET6 uint32_t flowlabel; +#endif uint8_t dscp; struct timeval start_time; /* time when this net was created */ @@ -987,7 +989,9 @@ struct sctp_association { uint32_t sb_send_resv; /* amount reserved on a send */ uint32_t my_rwnd_control_len; /* shadow of sb_mbcnt used for rwnd * control */ +#ifdef INET6 uint32_t default_flowlabel; +#endif uint32_t pr_sctp_cnt; int ctrl_queue_cnt; /* could be removed REM - NO IT CAN'T!! RRS */ /* diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index 0e52909b7b9..d52df50cb97 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -2428,15 +2428,14 @@ flags_out: } else { paddrp->spp_flags |= SPP_PMTUD_DISABLE; } -#ifdef INET - if (net->ro._l_addr.sin.sin_family == AF_INET) { - paddrp->spp_dscp = net->dscp; + if (net->dscp & 0x01) { + paddrp->spp_dscp = net->dscp >> 2; paddrp->spp_flags |= SPP_DSCP; } -#endif #ifdef INET6 - if (net->ro._l_addr.sin6.sin6_family == AF_INET6) { - paddrp->spp_ipv6_flowlabel = net->flowlabel; + if ((net->ro._l_addr.sa.sa_family == AF_INET6) && + (net->flowlabel & 0x80000000)) { + paddrp->spp_ipv6_flowlabel = net->flowlabel & 0x000fffff; paddrp->spp_flags |= SPP_IPV6_FLOWLABEL; } #endif @@ -2449,13 +2448,15 @@ flags_out: paddrp->spp_pathmaxrxt = stcb->asoc.def_net_failure; paddrp->spp_pathmtu = sctp_get_frag_point(stcb, &stcb->asoc); -#ifdef INET - paddrp->spp_dscp = stcb->asoc.default_dscp & 0x000000fc; - paddrp->spp_flags |= SPP_DSCP; -#endif + if (stcb->asoc.default_dscp & 0x01) { + paddrp->spp_dscp = stcb->asoc.default_dscp >> 2; + paddrp->spp_flags |= SPP_DSCP; + } #ifdef INET6 - paddrp->spp_ipv6_flowlabel = stcb->asoc.default_flowlabel; - paddrp->spp_flags |= SPP_IPV6_FLOWLABEL; + if (stcb->asoc.default_flowlabel & 0x80000000) { + paddrp->spp_ipv6_flowlabel = stcb->asoc.default_flowlabel & 0x000fffff; + paddrp->spp_flags |= SPP_IPV6_FLOWLABEL; + } #endif /* default settings should be these */ if (sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_DONOT_HEARTBEAT)) { @@ -2485,13 +2486,14 @@ flags_out: paddrp->spp_hbinterval = TICKS_TO_MSEC(inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_HEARTBEAT]); paddrp->spp_assoc_id = SCTP_FUTURE_ASSOC; /* get inp's default */ -#ifdef INET - paddrp->spp_dscp = inp->ip_inp.inp.inp_ip_tos; - paddrp->spp_flags |= SPP_DSCP; -#endif + if (inp->sctp_ep.default_dscp & 0x01) { + paddrp->spp_dscp = inp->sctp_ep.default_dscp >> 2; + paddrp->spp_flags |= SPP_DSCP; + } #ifdef INET6 - if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { - paddrp->spp_ipv6_flowlabel = ((struct in6pcb *)inp)->in6p_flowinfo; + if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && + (inp->sctp_ep.default_flowlabel & 0x80000000)) { + paddrp->spp_ipv6_flowlabel = inp->sctp_ep.default_flowlabel & 0x000fffff; paddrp->spp_flags |= SPP_IPV6_FLOWLABEL; } #endif @@ -4683,17 +4685,15 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } net->failure_threshold = paddrp->spp_pathmaxrxt; } -#ifdef INET if (paddrp->spp_flags & SPP_DSCP) { - if (net->ro._l_addr.sin.sin_family == AF_INET) { - net->dscp = paddrp->spp_dscp & 0xfc; - } + net->dscp = paddrp->spp_dscp << 2; + net->dscp |= 0x01; } -#endif #ifdef INET6 if (paddrp->spp_flags & SPP_IPV6_FLOWLABEL) { - if (net->ro._l_addr.sin6.sin6_family == AF_INET6) { + if (net->ro._l_addr.sa.sa_family == AF_INET6) { net->flowlabel = paddrp->spp_ipv6_flowlabel & 0x000fffff; + net->flowlabel |= 0x80000000; } } #endif @@ -4784,16 +4784,24 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } if (paddrp->spp_flags & SPP_DSCP) { TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - net->dscp = paddrp->spp_dscp & 0x000000fc; + net->dscp = paddrp->spp_dscp << 2; + net->dscp |= 0x01; } - stcb->asoc.default_dscp = paddrp->spp_dscp & 0x000000fc; + stcb->asoc.default_dscp = paddrp->spp_dscp << 2; + stcb->asoc.default_dscp |= 0x01; } +#ifdef INET6 if (paddrp->spp_flags & SPP_IPV6_FLOWLABEL) { TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - net->flowlabel = paddrp->spp_ipv6_flowlabel; + if (net->ro._l_addr.sa.sa_family == AF_INET6) { + net->flowlabel = paddrp->spp_ipv6_flowlabel & 0x000fffff; + net->flowlabel |= 0x80000000; + } } - stcb->asoc.default_flowlabel = paddrp->spp_ipv6_flowlabel; + stcb->asoc.default_flowlabel = paddrp->spp_ipv6_flowlabel & 0x000fffff; + stcb->asoc.default_flowlabel |= 0x80000000; } +#endif } SCTP_TCB_UNLOCK(stcb); } else { @@ -4827,6 +4835,18 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, } else if (paddrp->spp_flags & SPP_HB_DISABLE) { sctp_feature_on(inp, SCTP_PCB_FLAGS_DONOT_HEARTBEAT); } + if (paddrp->spp_flags & SPP_DSCP) { + inp->sctp_ep.default_dscp = paddrp->spp_dscp << 2; + inp->sctp_ep.default_dscp |= 0x01; + } +#ifdef INET6 + if (paddrp->spp_flags & SPP_IPV6_FLOWLABEL) { + if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { + inp->sctp_ep.default_flowlabel = paddrp->spp_ipv6_flowlabel & 0x000fffff; + inp->sctp_ep.default_flowlabel |= 0x80000000; + } + } +#endif SCTP_INP_WUNLOCK(inp); } else { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index b7336765b97..b13f4267942 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -923,16 +923,19 @@ sctp_init_asoc(struct sctp_inpcb *m, struct sctp_tcb *stcb, asoc->sctp_cmt_pf = (uint8_t) 0; asoc->sctp_frag_point = m->sctp_frag_point; asoc->sctp_features = m->sctp_features; -#ifdef INET - asoc->default_dscp = m->ip_inp.inp.inp_ip_tos; -#else - asoc->default_dscp = 0; -#endif - + asoc->default_dscp = m->sctp_ep.default_dscp; #ifdef INET6 - asoc->default_flowlabel = ((struct in6pcb *)m)->in6p_flowinfo; -#else - asoc->default_flowlabel = 0; + if (m->sctp_ep.default_flowlabel) { + asoc->default_flowlabel = m->sctp_ep.default_flowlabel; + } else { + if (m->ip_inp.inp.inp_flags & IN6P_AUTOFLOWLABEL) { + asoc->default_flowlabel = sctp_select_initial_TSN(&m->sctp_ep); + asoc->default_flowlabel &= 0x000fffff; + asoc->default_flowlabel |= 0x80000000; + } else { + asoc->default_flowlabel = 0; + } + } #endif asoc->sb_send_resv = 0; if (override_tag) { From 7cd72d8565e42860b4b8027bf3f747043c02c014 Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Wed, 14 Sep 2011 15:16:53 +0000 Subject: [PATCH 440/452] Reduce USB memory usage during enumeration. We are allocating some kilobytes of extra memory during USB device enumeration. This does not change alot under FreeBSD, but makes sense for various embedded operating systems using the FreeBSD USB stack, which have less memory resources available. Approved by: re (kib) MFC after: 1 week --- sys/dev/usb/usb_msctest.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sys/dev/usb/usb_msctest.c b/sys/dev/usb/usb_msctest.c index 9447a93bd8f..0355653fbd0 100644 --- a/sys/dev/usb/usb_msctest.c +++ b/sys/dev/usb/usb_msctest.c @@ -182,6 +182,7 @@ static const struct usb_config bbb_config[ST_MAX] = { .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, .bufsize = sizeof(struct bbb_cbw), + .flags = {.ext_buffer = 1,}, .callback = &bbb_command_callback, .timeout = 4 * USB_MS_HZ, /* 4 seconds */ }, @@ -191,7 +192,7 @@ static const struct usb_config bbb_config[ST_MAX] = { .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, .bufsize = BULK_SIZE, - .flags = {.proxy_buffer = 1,.short_xfer_ok = 1,}, + .flags = {.ext_buffer = 1,.proxy_buffer = 1,.short_xfer_ok = 1,}, .callback = &bbb_data_read_callback, .timeout = 4 * USB_MS_HZ, /* 4 seconds */ }, @@ -210,7 +211,7 @@ static const struct usb_config bbb_config[ST_MAX] = { .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, .bufsize = BULK_SIZE, - .flags = {.proxy_buffer = 1,}, + .flags = {.ext_buffer = 1,.proxy_buffer = 1,}, .callback = &bbb_data_write_callback, .timeout = 4 * USB_MS_HZ, /* 4 seconds */ }, @@ -229,7 +230,7 @@ static const struct usb_config bbb_config[ST_MAX] = { .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, .bufsize = sizeof(struct bbb_csw), - .flags = {.short_xfer_ok = 1,}, + .flags = {.ext_buffer = 1,.short_xfer_ok = 1,}, .callback = &bbb_status_callback, .timeout = 1 * USB_MS_HZ, /* 1 second */ }, From c55b70cef6c7c9a8f78b31ecde82a286e9eb0446 Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Wed, 14 Sep 2011 19:10:13 +0000 Subject: [PATCH 441/452] Ensure that 1-to-1 style SCTP sockets can only be connected once. Allow implicit setup also for 1-to-1 style sockets as described in the latest version of the socket API ID. Approved by: re MFC after: 1 month --- sys/netinet/sctp_output.c | 29 ++++++++++++----------------- sys/netinet/sctp_pcb.c | 10 ++++++++++ sys/netinet/sctp_usrreq.c | 14 +++++--------- sys/netinet/sctputil.c | 38 +++++--------------------------------- 4 files changed, 32 insertions(+), 59 deletions(-) diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index c35dcac872b..88d0e24fd3b 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -12628,14 +12628,10 @@ sctp_lower_sosend(struct socket *so, (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { SCTP_INP_RLOCK(inp); stcb = LIST_FIRST(&inp->sctp_asoc_list); - if (stcb == NULL) { - SCTP_INP_RUNLOCK(inp); - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOTCONN); - error = ENOTCONN; - goto out_unlocked; + if (stcb) { + SCTP_TCB_LOCK(stcb); + hold_tcblock = 1; } - SCTP_TCB_LOCK(stcb); - hold_tcblock = 1; SCTP_INP_RUNLOCK(inp); } else if (sinfo_assoc_id) { stcb = sctp_findassociation_ep_asocid(inp, sinfo_assoc_id, 0); @@ -12700,21 +12696,12 @@ sctp_lower_sosend(struct socket *so, } } if (stcb == NULL) { - if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || - (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOTCONN); - error = ENOTCONN; - goto out_unlocked; - } if (addr == NULL) { SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOENT); error = ENOENT; goto out_unlocked; } else { - /* - * UDP style, we must go ahead and start the INIT - * process - */ + /* We must go ahead and start the INIT process */ uint32_t vrf_id; if ((sinfo_flags & SCTP_ABORT) || @@ -12741,6 +12728,14 @@ sctp_lower_sosend(struct socket *so, /* Error is setup for us in the call */ goto out_unlocked; } + if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { + stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; + /* + * Set the connected flag so we can queue + * data + */ + soisconnecting(so); + } hold_tcblock = 1; if (create_lock_applied) { SCTP_ASOC_CREATE_UNLOCK(inp); diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c index e3973160d84..e5581e183fe 100644 --- a/sys/netinet/sctp_pcb.c +++ b/sys/netinet/sctp_pcb.c @@ -4291,6 +4291,16 @@ sctp_aloc_assoc(struct sctp_inpcb *inp, struct sockaddr *firstaddr, *error = EINVAL; return (NULL); } + if ((inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + (inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE)) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_WAS_CONNECTED) || + (inp->sctp_flags & SCTP_PCB_FLAGS_WAS_ABORTED)) { + SCTP_INP_RUNLOCK(inp); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); + *error = EINVAL; + return (NULL); + } + } SCTPDBG(SCTP_DEBUG_PCB3, "Allocate an association for peer:"); #ifdef SCTP_DEBUG if (firstaddr) { diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index d52df50cb97..cd69a4509a4 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -1541,6 +1541,11 @@ sctp_do_connect_x(struct socket *so, struct sctp_inpcb *inp, void *optval, /* Gak! no memory */ goto out_now; } + if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { + stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; + /* Set the connected flag so we can queue data */ + soisconnecting(so); + } SCTP_SET_STATE(&stcb->asoc, SCTP_STATE_COOKIE_WAIT); /* move to second address */ switch (sa->sa_family) { @@ -5772,15 +5777,6 @@ sctp_connect(struct socket *so, struct sockaddr *addr, struct thread *p) if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; /* Set the connected flag so we can queue data */ - SOCKBUF_LOCK(&so->so_rcv); - so->so_rcv.sb_state &= ~SBS_CANTRCVMORE; - SOCKBUF_UNLOCK(&so->so_rcv); - SOCKBUF_LOCK(&so->so_snd); - so->so_snd.sb_state &= ~SBS_CANTSENDMORE; - SOCKBUF_UNLOCK(&so->so_snd); - SOCK_LOCK(so); - so->so_state &= ~SS_ISDISCONNECTING; - SOCK_UNLOCK(so); soisconnecting(so); } SCTP_SET_STATE(&stcb->asoc, SCTP_STATE_COOKIE_WAIT); diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index b13f4267942..54b635c8199 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -3622,10 +3622,14 @@ sctp_abort_notification(struct sctp_tcb *stcb, int error, int so_locked #endif ) { - if (stcb == NULL) { return; } + if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || + ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && + (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_CONNECTED))) { + stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_WAS_ABORTED; + } if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) || (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET)) { @@ -3633,11 +3637,6 @@ sctp_abort_notification(struct sctp_tcb *stcb, int error, int so_locked } /* Tell them we lost the asoc */ sctp_report_all_outbound(stcb, 1, so_locked); - if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || - ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && - (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_CONNECTED))) { - stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_WAS_ABORTED; - } sctp_ulp_notify(SCTP_NOTIFY_ASSOC_ABORTED, stcb, error, NULL, so_locked); } @@ -5098,17 +5097,6 @@ restart_nosblocks: */ SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ECONNRESET); error = ECONNRESET; - /* - * You get this once if you are - * active open side - */ - if (!(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { - /* - * Remove flag if on the - * active open side - */ - inp->sctp_flags &= ~SCTP_PCB_FLAGS_WAS_ABORTED; - } } so->so_state &= ~(SS_ISCONNECTING | SS_ISDISCONNECTING | @@ -5118,8 +5106,6 @@ restart_nosblocks: if ((inp->sctp_flags & SCTP_PCB_FLAGS_WAS_CONNECTED) == 0) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ENOTCONN); error = ENOTCONN; - } else { - inp->sctp_flags &= ~SCTP_PCB_FLAGS_WAS_CONNECTED; } } goto out; @@ -5152,18 +5138,6 @@ restart_nosblocks: */ SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ECONNRESET); error = ECONNRESET; - /* - * You get this once if you - * are active open side - */ - if (!(inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { - /* - * Remove flag if on - * the active open - * side - */ - inp->sctp_flags &= ~SCTP_PCB_FLAGS_WAS_ABORTED; - } } so->so_state &= ~(SS_ISCONNECTING | SS_ISDISCONNECTING | @@ -5173,8 +5147,6 @@ restart_nosblocks: if ((inp->sctp_flags & SCTP_PCB_FLAGS_WAS_CONNECTED) == 0) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ENOTCONN); error = ENOTCONN; - } else { - inp->sctp_flags &= ~SCTP_PCB_FLAGS_WAS_CONNECTED; } } goto out; From 3ea459713b5bc96e9ad7a16fa6106534525d1017 Mon Sep 17 00:00:00 2001 From: Christian Brueffer Date: Wed, 14 Sep 2011 20:13:10 +0000 Subject: [PATCH 442/452] Minor spelling, wording and punctuation fixes in comments. PR: 155984 Submitted by: gcooper Approved by: re (kib) MFC after: 1 week --- etc/network.subr | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/etc/network.subr b/etc/network.subr index 8e9036d9a5b..579c7018635 100644 --- a/etc/network.subr +++ b/etc/network.subr @@ -32,7 +32,7 @@ # ifn_start ifn # Bring up and configure an interface. If some configuration is -# applied print the interface configuration. +# applied, print the interface configuration. # ifn_start() { @@ -53,7 +53,7 @@ ifn_start() } # ifn_stop ifn -# Shutdown and de-configure an interface. If action is taken +# Shutdown and de-configure an interface. If action is taken, # print the interface name. # ifn_stop() @@ -227,8 +227,8 @@ get_if_var() } # _ifconfig_getargs if [af] -# Echos the arguments for the supplied interface to stdout. -# returns 1 if empty. In general, ifconfig_getargs should be used +# Prints the arguments for the supplied interface to stdout. +# Returns 1 if empty. In general, ifconfig_getargs should be used # outside this file. _ifconfig_getargs() { @@ -272,7 +272,7 @@ ifconfig_getargs() } # autoif -# Returns 0 if the interface should be automaticly configured at +# Returns 0 if the interface should be automatically configured at # boot time and 1 otherwise. autoif() { @@ -449,7 +449,7 @@ ipv6if() # ipv6_autoconfif if # Returns 0 if the interface should be configured for IPv6 with -# Stateless Address Configuration, 1 otherwise. +# Stateless Address Configuration; 1 otherwise. ipv6_autoconfif() { local _if _tmpargs _arg From d2849f27bc03b66f81f31aa571c8db997bad8fcb Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Thu, 15 Sep 2011 08:42:06 +0000 Subject: [PATCH 443/452] Ensure that ta_pending doesn't overflow u_short by capping its value at USHRT_MAX. If it overflows before the taskqueue can run, the task will be re-added to the taskqueue and cause a loop in the task list. Reported by: Arnaud Lacombe Submitted by: Ryan Stone Reviewed by: jhb Approved by: re (kib) MFC after: 1 day --- share/man/man9/taskqueue.9 | 2 +- sys/kern/subr_taskqueue.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/share/man/man9/taskqueue.9 b/share/man/man9/taskqueue.9 index f45a149e189..40d64af3963 100644 --- a/share/man/man9/taskqueue.9 +++ b/share/man/man9/taskqueue.9 @@ -133,7 +133,7 @@ If the task's .Va ta_pending field is non-zero, then it is simply incremented to reflect the number of times the task -was enqueued. +was enqueued, up to a cap of USHRT_MAX. Otherwise, the task is added to the list before the first task which has a lower .Va ta_priority diff --git a/sys/kern/subr_taskqueue.c b/sys/kern/subr_taskqueue.c index 4c458990155..31ea52d1d87 100644 --- a/sys/kern/subr_taskqueue.c +++ b/sys/kern/subr_taskqueue.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -173,7 +174,8 @@ taskqueue_enqueue_locked(struct taskqueue *queue, struct task *task) * Count multiple enqueues. */ if (task->ta_pending) { - task->ta_pending++; + if (task->ta_pending < USHRT_MAX) + task->ta_pending++; return (0); } From 92776dfd5a96fdaeefd7a216e271392d6fda909b Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Thu, 15 Sep 2011 08:49:54 +0000 Subject: [PATCH 444/452] Make sure that SCTP rejects broadcast, multicast and wildcard addresses as remote addresses. Approved by: re MFC after: 1 month. --- sys/netinet/sctp_asconf.c | 20 ++++++++++++++------ sys/netinet/sctp_output.c | 6 +++--- sys/netinet/sctp_pcb.c | 10 +++++++--- sys/netinet/sctp_usrreq.c | 2 +- sys/netinet/sctputil.c | 26 ++++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/sys/netinet/sctp_asconf.c b/sys/netinet/sctp_asconf.c index 69f9cf19567..46d160c7bc7 100644 --- a/sys/netinet/sctp_asconf.c +++ b/sys/netinet/sctp_asconf.c @@ -207,6 +207,7 @@ sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, uint16_t param_type, param_length, aparam_length; struct sockaddr *sa; int zero_address = 0; + int bad_address = 0; #ifdef INET struct sockaddr_in *sin; @@ -239,6 +240,10 @@ sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, sin->sin_len = sizeof(struct sockaddr_in); sin->sin_port = stcb->rport; sin->sin_addr.s_addr = v4addr->addr; + if ((sin->sin_addr.s_addr == INADDR_BROADCAST) || + IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { + bad_address = 1;; + } if (sin->sin_addr.s_addr == INADDR_ANY) zero_address = 1; SCTPDBG(SCTP_DEBUG_ASCONF1, "process_asconf_add_ip: adding "); @@ -259,6 +264,9 @@ sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, sin6->sin6_port = stcb->rport; memcpy((caddr_t)&sin6->sin6_addr, v6addr->addr, sizeof(struct in6_addr)); + if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) { + bad_address = 1; + } if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) zero_address = 1; SCTPDBG(SCTP_DEBUG_ASCONF1, "process_asconf_add_ip: adding "); @@ -266,12 +274,8 @@ sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, break; #endif default: - /* - * XXX: Is this the correct error cause? Maybe - * SCTP_CAUSE_INVALID_PARAM is a better choice. - */ m_reply = sctp_asconf_error_response(aph->correlation_id, - SCTP_CAUSE_UNRESOLVABLE_ADDR, (uint8_t *) aph, + SCTP_CAUSE_INVALID_PARAM, (uint8_t *) aph, aparam_length); return m_reply; } /* end switch */ @@ -285,7 +289,11 @@ sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, SCTPDBG_ADDR(SCTP_DEBUG_ASCONF1, sa); } /* add the address */ - if (sctp_add_remote_addr(stcb, sa, &net, SCTP_DONOT_SETSCOPE, + if (bad_address) { + m_reply = sctp_asconf_error_response(aph->correlation_id, + SCTP_CAUSE_INVALID_PARAM, (uint8_t *) aph, + aparam_length); + } else if (sctp_add_remote_addr(stcb, sa, &net, SCTP_DONOT_SETSCOPE, SCTP_ADDR_DYNAMIC_ADDED) != 0) { SCTPDBG(SCTP_DEBUG_ASCONF1, "process_asconf_add_ip: error adding address\n"); diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index 88d0e24fd3b..7fd5d4d22af 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -3541,7 +3541,7 @@ sctp_process_cmsgs_for_init(struct sctp_tcb *stcb, struct mbuf *control, int *er (sin.sin_addr.s_addr == INADDR_BROADCAST) || IN_MULTICAST(ntohl(sin.sin_addr.s_addr))) { *error = EINVAL; - return (-1); + return (1); } if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin, NULL, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { @@ -3564,7 +3564,7 @@ sctp_process_cmsgs_for_init(struct sctp_tcb *stcb, struct mbuf *control, int *er if (IN6_IS_ADDR_UNSPECIFIED(&sin6.sin6_addr) || IN6_IS_ADDR_MULTICAST(&sin6.sin6_addr)) { *error = EINVAL; - return (-1); + return (1); } #ifdef INET if (IN6_IS_ADDR_V4MAPPED(&sin6.sin6_addr)) { @@ -3573,7 +3573,7 @@ sctp_process_cmsgs_for_init(struct sctp_tcb *stcb, struct mbuf *control, int *er (sin.sin_addr.s_addr == INADDR_BROADCAST) || IN_MULTICAST(ntohl(sin.sin_addr.s_addr))) { *error = EINVAL; - return (-1); + return (1); } if (sctp_add_remote_addr(stcb, (struct sockaddr *)&sin, NULL, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c index e5581e183fe..b0f28807544 100644 --- a/sys/netinet/sctp_pcb.c +++ b/sys/netinet/sctp_pcb.c @@ -4332,7 +4332,10 @@ sctp_aloc_assoc(struct sctp_inpcb *inp, struct sockaddr *firstaddr, struct sockaddr_in *sin; sin = (struct sockaddr_in *)firstaddr; - if ((sin->sin_port == 0) || (sin->sin_addr.s_addr == 0)) { + if ((ntohs(sin->sin_port) == 0) || + (sin->sin_addr.s_addr == INADDR_ANY) || + (sin->sin_addr.s_addr == INADDR_BROADCAST) || + IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { /* Invalid address */ SCTP_INP_RUNLOCK(inp); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); @@ -4349,8 +4352,9 @@ sctp_aloc_assoc(struct sctp_inpcb *inp, struct sockaddr *firstaddr, struct sockaddr_in6 *sin6; sin6 = (struct sockaddr_in6 *)firstaddr; - if ((sin6->sin6_port == 0) || - (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))) { + if ((ntohs(sin6->sin6_port) == 0) || + IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) || + IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) { /* Invalid address */ SCTP_INP_RUNLOCK(inp); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index cd69a4509a4..82a8cba37fc 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -560,7 +560,7 @@ sctp_bind(struct socket *so, struct sockaddr *addr, struct thread *p) struct sctp_inpcb *inp = NULL; int error; -#ifdef INET6 +#ifdef INET if (addr && addr->sa_family != AF_INET) { /* must be a v4 address! */ SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index 54b635c8199..62fa0d1f232 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -6080,6 +6080,15 @@ sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, struct sockaddr *sa; size_t incr = 0; +#ifdef INET + struct sockaddr_in *sin; + +#endif +#ifdef INET6 + struct sockaddr_in6 *sin6; + +#endif + sa = addr; inp = stcb->sctp_ep; *error = 0; @@ -6088,6 +6097,15 @@ sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, #ifdef INET case AF_INET: incr = sizeof(struct sockaddr_in); + sin = (struct sockaddr_in *)sa; + if ((sin->sin_addr.s_addr == INADDR_ANY) || + (sin->sin_addr.s_addr == INADDR_BROADCAST) || + IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { + SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, EINVAL); + (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_USRREQ + SCTP_LOC_7); + *error = EINVAL; + goto out_now; + } if (sctp_add_remote_addr(stcb, sa, NULL, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { /* assoc gone no un-lock */ SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOBUFS); @@ -6101,6 +6119,14 @@ sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, #ifdef INET6 case AF_INET6: incr = sizeof(struct sockaddr_in6); + sin6 = (struct sockaddr_in6 *)sa; + if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) || + IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) { + SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, EINVAL); + (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_USRREQ + SCTP_LOC_8); + *error = EINVAL; + goto out_now; + } if (sctp_add_remote_addr(stcb, sa, NULL, SCTP_DONOT_SETSCOPE, SCTP_ADDR_IS_CONFIRMED)) { /* assoc gone no un-lock */ SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOBUFS); From 073d48133f98b1cfd34a6a5daf81ff1626930196 Mon Sep 17 00:00:00 2001 From: Doug Barton Date: Thu, 15 Sep 2011 09:22:49 +0000 Subject: [PATCH 445/452] Correct the RFC number for the description of IPv6 privacy addressing Reviewed by: bz Approved by: re (kib) --- etc/defaults/rc.conf | 2 +- share/man/man5/rc.conf.5 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf index d959f20ca72..6946eea0319 100644 --- a/etc/defaults/rc.conf +++ b/etc/defaults/rc.conf @@ -472,7 +472,7 @@ ipv6_cpe_wanif="NO" # Set to the upstram interface name if this # node will work as a router to forward IPv6 # packets not explicitly addressed to itself. ipv6_privacy="NO" # Use privacy address on RA-receiving IFs - # (RFC 4193) + # (RFC 4941) route6d_enable="NO" # Set to YES to enable an IPv6 routing daemon. route6d_program="/usr/sbin/route6d" # Name of IPv6 routing daemon. diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5 index d7d52c186ca..009ba3353e7 100644 --- a/share/man/man5/rc.conf.5 +++ b/share/man/man5/rc.conf.5 @@ -1337,7 +1337,7 @@ Default is If the variable is .Dq Li YES privacy addresses will be generated for each IPv6 -interface as described in RFC 4193. +interface as described in RFC 4941. .It Va ipv6_network_interfaces .Pq Vt str This is the IPv6 equivalent of From 7a1c55c3807157e40e10fe442367265acd63e14c Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Thu, 15 Sep 2011 09:53:04 +0000 Subject: [PATCH 446/452] Microoptimize the return path for the fast syscalls on amd64. Arrange the code to have the fall-through path to follow the likely target. Do not use intermediate register to reload user %rsp. Proposed by: alc Reviewed by: alc, jhb Approved by: re (bz) MFC after: 2 weeks --- sys/amd64/amd64/exception.S | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 9f0c69a09c9..89ad638c7e3 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -393,14 +393,8 @@ IDTVEC(fast_syscall) /* Check for and handle AST's on return to userland. */ movq PCPU(CURTHREAD),%rax testl $TDF_ASTPENDING | TDF_NEEDRESCHED,TD_FLAGS(%rax) - je 2f - sti - movq %rsp, %rdi - call ast - jmp 1b - - .align 16 -2: /* Restore preserved registers. */ + jne 2f + /* Restore preserved registers. */ MEXITCOUNT movq TF_RDI(%rsp),%rdi /* bonus; preserve arg 1 */ movq TF_RSI(%rsp),%rsi /* bonus: preserve arg 2 */ @@ -408,10 +402,16 @@ IDTVEC(fast_syscall) movq TF_RAX(%rsp),%rax /* return value 1 */ movq TF_RFLAGS(%rsp),%r11 /* original %rflags */ movq TF_RIP(%rsp),%rcx /* original %rip */ - movq TF_RSP(%rsp),%r9 /* user stack pointer */ - movq %r9,%rsp /* original %rsp */ + movq TF_RSP(%rsp),%rsp /* user stack pointer */ swapgs sysretq + +2: /* AST scheduled. */ + sti + movq %rsp,%rdi + call ast + jmp 1b + 3: /* Requested full context restore, use doreti for that. */ MEXITCOUNT jmp doreti From 20aee906b466e9ddb187ddc9c0fcc43cef9d0276 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Thu, 15 Sep 2011 09:54:07 +0000 Subject: [PATCH 447/452] Put amd64_syscall() prototype in md_var.h. Requested by: jhb Reviewed by: alc, jhb Approved by: re (bz) MFC after: 2 weeks --- sys/amd64/amd64/trap.c | 1 - sys/amd64/include/md_var.h | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index bd75209f43c..16f151fce3e 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -885,7 +885,6 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa) #include "../../kern/subr_syscall.c" -void amd64_syscall(struct thread *td, int traced); /* * syscall - system call request C handler * diff --git a/sys/amd64/include/md_var.h b/sys/amd64/include/md_var.h index 88f3e1dbaed..479c84e85f1 100644 --- a/sys/amd64/include/md_var.h +++ b/sys/amd64/include/md_var.h @@ -75,6 +75,7 @@ struct fpreg; struct dbreg; struct dumperinfo; +void amd64_syscall(struct thread *td, int traced); void busdma_swi(void); void cpu_setregs(void); void doreti_iret(void) __asm(__STRING(doreti_iret)); From f785588713928420f4f232ae6d8e070f71df9af2 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Thu, 15 Sep 2011 11:50:09 +0000 Subject: [PATCH 448/452] Use the proper dynamic tls block to calculate the tls variable address in case tls data generation was updated. PR: misc/160721 Submitted by: "Thinker K.F. Li" Tested by: flo Approved by: re (bz) MFC after: 1 week --- libexec/rtld-elf/rtld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 874f4bc61ff..65eadb5b7a5 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -3370,7 +3370,7 @@ tls_get_addr_common(Elf_Addr** dtvp, int index, size_t offset) newdtv[1] = tls_max_index; free(dtv); lock_release(rtld_bind_lock, &lockstate); - *dtvp = newdtv; + dtv = *dtvp = newdtv; } /* Dynamically allocate module TLS if necessary */ From f772f9fe4344885f32ae56713353c065fc3e2f5d Mon Sep 17 00:00:00 2001 From: Lawrence Stewart Date: Thu, 15 Sep 2011 12:15:36 +0000 Subject: [PATCH 449/452] Rename the cc.4 and cc.9 modular congestion control related man pages to mod_cc.4 and mod_cc.9 respectively to avoid any possible confusion with the cc.1 gcc man page. Update references to these man pages where required. Requested by: Grenville Armitage Approved by: re (kib) MFC after: 3 days --- ObsoleteFiles.inc | 3 +++ share/man/man4/Makefile | 2 +- share/man/man4/cc_chd.4 | 8 ++++---- share/man/man4/cc_cubic.4 | 6 +++--- share/man/man4/cc_hd.4 | 8 ++++---- share/man/man4/cc_htcp.4 | 6 +++--- share/man/man4/cc_newreno.4 | 6 +++--- share/man/man4/cc_vegas.4 | 8 ++++---- share/man/man4/h_ertt.4 | 2 +- share/man/man4/{cc.4 => mod_cc.4} | 8 ++++---- share/man/man4/tcp.4 | 8 ++++---- share/man/man9/Makefile | 2 +- share/man/man9/{cc.9 => mod_cc.9} | 10 +++++----- 13 files changed, 40 insertions(+), 37 deletions(-) rename share/man/man4/{cc.4 => mod_cc.4} (98%) rename share/man/man9/{cc.9 => mod_cc.9} (99%) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 80168f48d45..b0670f38fe5 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -38,6 +38,9 @@ # xargs -n1 | sort | uniq -d; # done +# 20110915: rename congestion control manpages +OLD_FILES+=usr/share/man/man4/cc.4.gz +OLD_FILES+=usr/share/man/man9/cc.9.gz # 20110831: atomic page flags operations OLD_FILES+=usr/share/man/man9/vm_page_flag.9.gz OLD_FILES+=usr/share/man/man9/vm_page_flag_clear.9.gz diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index 2548b1ae497..091eb285def 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -71,7 +71,6 @@ MAN= aac.4 \ cardbus.4 \ carp.4 \ cas.4 \ - cc.4 \ cc_chd.4 \ cc_cubic.4 \ cc_hd.4 \ @@ -233,6 +232,7 @@ MAN= aac.4 \ mmc.4 \ mmcsd.4 \ mn.4 \ + mod_cc.4 \ mos.4 \ mouse.4 \ mps.4 \ diff --git a/share/man/man4/cc_chd.4 b/share/man/man4/cc_chd.4 index 9a1f7628004..39cdef3b601 100644 --- a/share/man/man4/cc_chd.4 +++ b/share/man/man4/cc_chd.4 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 15, 2011 +.Dd September 15, 2011 .Dt CC_CHD 4 .Os .Sh NAME @@ -86,16 +86,16 @@ is used. Default is 1. .El .Sh SEE ALSO -.Xr cc 4 , .Xr cc_cubic 4 , .Xr cc_hd 4 , .Xr cc_htcp 4 , .Xr cc_newreno 4 , .Xr cc_vegas 4 , .Xr h_ertt 4 , +.Xr mod_cc 4 , .Xr tcp 4 , -.Xr cc 9 , -.Xr khelp 9 +.Xr khelp 9 , +.Xr mod_cc 9 .Rs .%A "D. A. Hayes" .%A "G. Armitage" diff --git a/share/man/man4/cc_cubic.4 b/share/man/man4/cc_cubic.4 index be5684cf809..771f2643b9b 100644 --- a/share/man/man4/cc_cubic.4 +++ b/share/man/man4/cc_cubic.4 @@ -30,7 +30,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 15, 2011 +.Dd September 15, 2011 .Dt CC_CUBIC 4 .Os .Sh NAME @@ -62,14 +62,14 @@ section below. .Sh MIB Variables There are currently no tunable MIB variables. .Sh SEE ALSO -.Xr cc 4 , .Xr cc_chd 4 , .Xr cc_hd 4 , .Xr cc_htcp 4 , .Xr cc_newreno 4 , .Xr cc_vegas 4 , +.Xr mod_cc 4 , .Xr tcp 4 , -.Xr cc 9 +.Xr mod_cc 9 .Rs .%A "Sangtae Ha" .%A "Injong Rhee" diff --git a/share/man/man4/cc_hd.4 b/share/man/man4/cc_hd.4 index 5c4c2deb92a..d0acb34c05e 100644 --- a/share/man/man4/cc_hd.4 +++ b/share/man/man4/cc_hd.4 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 15, 2011 +.Dd September 15, 2011 .Dt CC_HD 4 .Os .Sh NAME @@ -69,16 +69,16 @@ Minimum queuing delay threshold (qmin) in ticks. Default is 5. .El .Sh SEE ALSO -.Xr cc 4 , .Xr cc_chd 4 , .Xr cc_cubic 4 , .Xr cc_htcp 4 , .Xr cc_newreno 4 , .Xr cc_vegas 4 , .Xr h_ertt 4 , +.Xr mod_cc 4 , .Xr tcp 4 , -.Xr cc 9 , -.Xr khelp 9 +.Xr khelp 9 , +.Xr mod_cc 9 .Rs .%A "L. Budzisz" .%A "R. Stanojevic" diff --git a/share/man/man4/cc_htcp.4 b/share/man/man4/cc_htcp.4 index 6e916b95077..45d00186c87 100644 --- a/share/man/man4/cc_htcp.4 +++ b/share/man/man4/cc_htcp.4 @@ -30,7 +30,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 15, 2011 +.Dd September 15, 2011 .Dt CC_HTCP 4 .Os .Sh NAME @@ -69,14 +69,14 @@ window increase during congestion avoidance mode invariant with respect to RTT. Default is 0 (disabled). .El .Sh SEE ALSO -.Xr cc 4 , .Xr cc_chd 4 , .Xr cc_cubic 4 , .Xr cc_hd 4 , .Xr cc_newreno 4 , .Xr cc_vegas 4 , +.Xr mod_cc 4 , .Xr tcp 4 , -.Xr cc 9 +.Xr mod_cc 9 .Rs .%A "D. Leith" .%A "R. Shorten" diff --git a/share/man/man4/cc_newreno.4 b/share/man/man4/cc_newreno.4 index c09b3622105..fe4c3db306b 100644 --- a/share/man/man4/cc_newreno.4 +++ b/share/man/man4/cc_newreno.4 @@ -30,7 +30,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 15, 2011 +.Dd September 15, 2011 .Dt CC_NEWRENO 4 .Os .Sh NAME @@ -42,14 +42,14 @@ Details about the algorithm can be found in RFC5681. .Sh MIB Variables There are currently no tunable MIB variables. .Sh SEE ALSO -.Xr cc 4 , .Xr cc_chd 4 , .Xr cc_cubic 4 , .Xr cc_hd 4 , .Xr cc_htcp 4 , .Xr cc_vegas 4 , +.Xr mod_cc 4 , .Xr tcp 4 , -.Xr cc 9 +.Xr mod_cc 9 .Sh ACKNOWLEDGEMENTS Development and testing of this software were made possible in part by grants from the FreeBSD Foundation and Cisco University Research Program Fund at diff --git a/share/man/man4/cc_vegas.4 b/share/man/man4/cc_vegas.4 index ce55723c534..13a3fe06e02 100644 --- a/share/man/man4/cc_vegas.4 +++ b/share/man/man4/cc_vegas.4 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 15, 2011 +.Dd September 15, 2011 .Dt CC_VEGAS 4 .Os .Sh NAME @@ -94,16 +94,16 @@ When setting beta, the value must satisfy: 0 < alpha < beta. Default is 3. .El .Sh SEE ALSO -.Xr cc 4 , .Xr cc_chd 4 , .Xr cc_cubic 4 , .Xr cc_hd 4 , .Xr cc_htcp 4 , .Xr cc_newreno 4 , .Xr h_ertt 4 , +.Xr mod_cc 4 , .Xr tcp 4 , -.Xr cc 9 , -.Xr khelp 9 +.Xr khelp 9 , +.Xr mod_cc 9 .Rs .%A "L. S. Brakmo" .%A "L. L. Peterson" diff --git a/share/man/man4/h_ertt.4 b/share/man/man4/h_ertt.4 index b04efaa2a9f..70ed36d7f7e 100644 --- a/share/man/man4/h_ertt.4 +++ b/share/man/man4/h_ertt.4 @@ -108,10 +108,10 @@ consumers to unset the flag if they wish to use it as a notification method for new measurements. .El .Sh SEE ALSO -.Xr cc 4 , .Xr cc_chd 4 , .Xr cc_hd 4 , .Xr cc_vegas 4 , +.Xr mod_cc 4 , .Xr hhook 9 , .Xr khelp 9 .Sh ACKNOWLEDGEMENTS diff --git a/share/man/man4/cc.4 b/share/man/man4/mod_cc.4 similarity index 98% rename from share/man/man4/cc.4 rename to share/man/man4/mod_cc.4 index c518f456452..204537faa36 100644 --- a/share/man/man4/cc.4 +++ b/share/man/man4/mod_cc.4 @@ -30,11 +30,11 @@ .\" .\" $FreeBSD$ .\" -.Dd February 15, 2011 -.Dt CC 4 +.Dd September 15, 2011 +.Dt MOD_CC 4 .Os .Sh NAME -.Nm cc +.Nm mod_cc .Nd Modular congestion control .Sh DESCRIPTION The modular congestion control framework allows the TCP implementation to @@ -82,7 +82,7 @@ MIB variable. .Xr cc_newreno 4 , .Xr cc_vegas 4 , .Xr tcp 4 , -.Xr cc 9 +.Xr mod_cc 9 .Sh ACKNOWLEDGEMENTS Development and testing of this software were made possible in part by grants from the FreeBSD Foundation and Cisco University Research Program Fund at diff --git a/share/man/man4/tcp.4 b/share/man/man4/tcp.4 index 725dc4f3503..213e94a4e7f 100644 --- a/share/man/man4/tcp.4 +++ b/share/man/man4/tcp.4 @@ -38,7 +38,7 @@ .\" From: @(#)tcp.4 8.1 (Berkeley) 6/5/93 .\" $FreeBSD$ .\" -.Dd February 15, 2011 +.Dd September 15, 2011 .Dt TCP 4 .Os .Sh NAME @@ -144,7 +144,7 @@ bandwidth-controlled window space. Select or query the congestion control algorithm that TCP will use for the connection. See -.Xr cc 4 +.Xr mod_cc 4 for details. .It Dv TCP_NODELAY Under most circumstances, @@ -249,7 +249,7 @@ The default congestion control algorithm for is .Xr cc_newreno 4 . Other congestion control algorithms can be made available using the -.Xr cc 4 +.Xr mod_cc 4 framework. .Ss MIB Variables The @@ -510,10 +510,10 @@ address. .Xr socket 2 , .Xr sysctl 3 , .Xr blackhole 4 , -.Xr cc 4 , .Xr inet 4 , .Xr intro 4 , .Xr ip 4 , +.Xr mod_cc 4 , .Xr syncache 4 , .Xr setkey 8 .Rs diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index b24be5656a6..7d34c318c8f 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -43,7 +43,6 @@ MAN= accept_filter.9 \ BUS_SETUP_INTR.9 \ bus_space.9 \ byteorder.9 \ - cc.9 \ cd.9 \ condvar.9 \ config_intrhook.9 \ @@ -169,6 +168,7 @@ MAN= accept_filter.9 \ microtime.9 \ microuptime.9 \ mi_switch.9 \ + mod_cc.9 \ module.9 \ MODULE_DEPEND.9 \ MODULE_VERSION.9 \ diff --git a/share/man/man9/cc.9 b/share/man/man9/mod_cc.9 similarity index 99% rename from share/man/man9/cc.9 rename to share/man/man9/mod_cc.9 index 6a3798445a6..75e2db039b5 100644 --- a/share/man/man9/cc.9 +++ b/share/man/man9/mod_cc.9 @@ -31,11 +31,11 @@ .\" .\" $FreeBSD$ .\" -.Dd February 15, 2011 -.Dt CC 9 +.Dd September 15, 2011 +.Dt MOD_CC 9 .Os .Sh NAME -.Nm cc , +.Nm mod_cc , .Nm DECLARE_CC_MODULE , .Nm CC_VAR .Nd Modular Congestion Control @@ -53,7 +53,7 @@ loadable kernel modules via the facility. Transport protocols can select from the list of available algorithms on a connection-by-connection basis, or use the system default (see -.Xr cc 4 +.Xr mod_cc 4 for more details). .Pp .Nm @@ -290,13 +290,13 @@ by the value of the congestion window. Algorithms should use the abscence of this flag being set to avoid accumulating a large difference between the congestion window and send window. .Sh SEE ALSO -.Xr cc 4 , .Xr cc_chd 4 , .Xr cc_cubic 4 , .Xr cc_hd 4 , .Xr cc_htcp 4 , .Xr cc_newreno 4 , .Xr cc_vegas 4 , +.Xr mod_cc 4 , .Xr tcp 4 .Sh ACKNOWLEDGEMENTS Development and testing of this software were made possible in part by grants From 3657c405e325e3ef26801998975fe2af97cc2ef3 Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Thu, 15 Sep 2011 12:20:52 +0000 Subject: [PATCH 450/452] Fix a typo introduced in http://svn.freebsd.org/changeset/base/225571 Reported by Ilya A. Arkhipov. Approved by: re MFC after: 1 month. --- sys/netinet/sctp_asconf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/netinet/sctp_asconf.c b/sys/netinet/sctp_asconf.c index 46d160c7bc7..b4985aa66ae 100644 --- a/sys/netinet/sctp_asconf.c +++ b/sys/netinet/sctp_asconf.c @@ -242,7 +242,7 @@ sctp_process_asconf_add_ip(struct mbuf *m, struct sctp_asconf_paramhdr *aph, sin->sin_addr.s_addr = v4addr->addr; if ((sin->sin_addr.s_addr == INADDR_BROADCAST) || IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) { - bad_address = 1;; + bad_address = 1; } if (sin->sin_addr.s_addr == INADDR_ANY) zero_address = 1; From f2a66f8e17f4ca355bf278ecc9055fc2d3d2b04b Mon Sep 17 00:00:00 2001 From: "Andrey V. Elsukov" Date: Thu, 15 Sep 2011 12:28:17 +0000 Subject: [PATCH 451/452] Add IPv6 support to the ng_ipfw(4) [1]. Also add ifdefs to be able build it with and without INET/INET6 support. Submitted by: Alexander V. Chernikov [1] Tested by: Alexander V. Chernikov [1] Approved by: re (bz) MFC after: 2 weeks --- sys/modules/netgraph/ipfw/Makefile | 16 ++++++++- sys/netgraph/ng_ipfw.c | 54 +++++++++++++++++++++++------- 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/sys/modules/netgraph/ipfw/Makefile b/sys/modules/netgraph/ipfw/Makefile index b40abcfbf57..cc3f0f24e2a 100644 --- a/sys/modules/netgraph/ipfw/Makefile +++ b/sys/modules/netgraph/ipfw/Makefile @@ -1,6 +1,20 @@ # $FreeBSD$ +.include + KMOD= ng_ipfw -SRCS= ng_ipfw.c +SRCS= ng_ipfw.c opt_inet.h opt_inet6.h + +.if !defined(KERNBUILDDIR) + +.if ${MK_INET_SUPPORT} != "no" +opt_inet.h: + echo "#define INET 1" > ${.TARGET} +.endif +.if ${MK_INET6_SUPPORT} != "no" +opt_inet6.h: + echo "#define INET6 1" > ${.TARGET} +.endif +.endif .include diff --git a/sys/netgraph/ng_ipfw.c b/sys/netgraph/ng_ipfw.c index 68bd89c09e8..4f1bc0ee94d 100644 --- a/sys/netgraph/ng_ipfw.c +++ b/sys/netgraph/ng_ipfw.c @@ -26,6 +26,9 @@ * $FreeBSD$ */ +#include "opt_inet.h" +#include "opt_inet6.h" + #include #include #include @@ -47,6 +50,8 @@ #include #include #include +#include +#include #include #include @@ -224,6 +229,7 @@ ng_ipfw_rcvdata(hook_p hook, item_p item) struct m_tag *tag; struct ipfw_rule_ref *r; struct mbuf *m; + struct ip *ip; NGI_GET_M(item, m); NG_FREE_ITEM(item); @@ -234,23 +240,47 @@ ng_ipfw_rcvdata(hook_p hook, item_p item) return (EINVAL); /* XXX: find smth better */ }; + if (m->m_len < sizeof(struct ip) && + (m = m_pullup(m, sizeof(struct ip))) == NULL) + return (EINVAL); + + ip = mtod(m, struct ip *); + r = (struct ipfw_rule_ref *)(tag + 1); if (r->info & IPFW_INFO_IN) { - ip_input(m); + switch (ip->ip_v) { +#ifdef INET + case IPVERSION: + ip_input(m); + break; +#endif +#ifdef INET6 + case IPV6_VERSION >> 4: + ip6_input(m); + break; +#endif + default: + NG_FREE_M(m); + return (EINVAL); + } return (0); } else { - struct ip *ip; - - if (m->m_len < sizeof(struct ip) && - (m = m_pullup(m, sizeof(struct ip))) == NULL) + switch (ip->ip_v) { +#ifdef INET + case IPVERSION: + SET_HOST_IPLEN(ip); + return (ip_output(m, NULL, NULL, IP_FORWARDING, + NULL, NULL)); +#endif +#ifdef INET6 + case IPV6_VERSION >> 4: + return (ip6_output(m, NULL, NULL, 0, NULL, + NULL, NULL)); +#endif + default: return (EINVAL); - - ip = mtod(m, struct ip *); - - SET_HOST_IPLEN(ip); - - return ip_output(m, NULL, NULL, IP_FORWARDING, NULL, NULL); - } + } + } } static int From 3fb4fa3574e36c997c2cdcaa6f6e39a37e89f572 Mon Sep 17 00:00:00 2001 From: Jaakko Heinonen Date: Thu, 15 Sep 2011 13:32:43 +0000 Subject: [PATCH 452/452] Expose "log" in the default devfs rules. /etc/rc.d/jail creates /dev/log as a symbolic link. PR: conf/160711 Submitted by: Jase Thew Approved by: re (kib) MFC after: 1 week --- etc/defaults/devfs.rules | 1 + 1 file changed, 1 insertion(+) diff --git a/etc/defaults/devfs.rules b/etc/defaults/devfs.rules index a3e30b776b1..8fa6496df04 100644 --- a/etc/defaults/devfs.rules +++ b/etc/defaults/devfs.rules @@ -26,6 +26,7 @@ add hide # Requires: devfsrules_hide_all # [devfsrules_unhide_basic=2] +add path log unhide add path null unhide add path zero unhide add path crypto unhide